Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
bidsify_plugin.py 4.61 KiB
import os
import shutil
import logging

from definitions import checkSeries

logger = logging.getLogger(__name__)

# global variables
rawfolder = ""
bidsfolder = ""
dry_run = False

participants_table = None
rec_path = ""
countSeries = {}


def InitEP(source: str, destination: str, dry: bool) -> int:
    global rawfolder
    global bidsfolder
    global dry_run

    rawfolder = source
    bidsfolder = destination
    dry_run = dry


def SessionEP(scan):
    global series
    global sid
    sub = scan.subject
    ses = scan.session
    path = os.path.join(rawfolder,
                        sub, ses,
                        "MRI")
    series = sorted(os.listdir(path))
    series = [s.split("-",1)[1] for s in series]
    sid = -1
    checkSeries(path, sub, ses, False)
    # copytng behevioral data
    aux_input = os.path.join(rawfolder, sub, ses, "aux")
    if ses in ("ses-LCL", "ses-HCL"):
        if not os.path.isdir(aux_input):
            logger.error("Session {}/{} do not contain aux folder"
                         .format(sub, ses))
            raise FileNotFoundError("folder {} not found"
                                    .format(aux_input))
        beh = os.path.join(bidsfolder, sub, ses, "beh")
        if not dry_run:
            os.makedirs(beh, exist_ok=True)
        for old, new in (("FCsepNBack.tsv", "task-rest_events.tsv"),
                         ("FCsepNBack.json", "task-rest_events.json"),
                         ("VAS.tsv", "task-rest_beh.tsv"),
                         ("VAS.json", "task-rest_beh.json")):
            source = "{}/{}".format(aux_input, old)
            dest = "{}/{}_{}_{}".format(beh, sub, ses, new)
            if not os.path.isfile(source):
                if dry_run:
                    logger.error("{}/{}: File {} not found"
                                 .format(sub, ses, source))
                else:
                    logger.critical("{}/{}: File {} not found"
                                    .format(sub, ses, source))
                    raise FileNotFoundError(source)
            if os.path.isfile(dest):
                logger.warning("{}/{}: File {} already exists"
                               .format(sub, ses, dest))
            if not dry_run:
                shutil.copy2(source, dest)


series = list()
sid = -1
Intended = ""


def SequenceEP(recording):
    global series
    global sid
    global Intended
    Intended = ""
    sid += 1
    recid = series[sid] 
    if recid != recording.recId():
        logger.warning("{}: Id mismatch folder {}"
                       .format(recording.recIdentity(False),
                               recid))
    if recid == "cmrr_mbep2d_bold_mb2_invertpe":
        mod = series[sid + 1]
        if mod.endswith("cmrr_mbep2d_bold_mb2_task_fat"):
            Intended = "nBack"
        elif mod.endswith("cmrr_mbep2d_bold_mb2_task_nfat"):
            Intended = "nBack"
        elif mod.endswith("cmrr_mbep2d_bold_mb2_rest"):
            Intended = "rest"
        else:
            Intended = "invalid"
            logger.warning("{}: Unknown session {}"
                           .format(recording.recIdentity(),
                                   mod))
    elif recid == "gre_field_mapping":
        if recording.sesId() in ("ses-HCL", "ses-LCL"):
            Intended = "HCL/LCL"
        elif recording.sesId() == "ses-STROOP":
            Intended = "STROOP"
        else:
            logger.warning("{}: Unknown session {}"
                           .format(recording.recIdentity(),
                                   recording.sesId()))
            Intended = "invalid"
    elif recid == "al_mtflash3d_sensArray":
        det = series[sid + 2]
        if det.endswith("al_mtflash3d_PDw"):
            Intended = "PDw"
        elif det.endswith("al_mtflash3d_T1w"):
            Intended = "T1w"
            recording.setAttribute("Intended", "T1w")
        elif det.endswith("al_mtflash3d_MTw"):
            Intended = "MTw"
        else:
            logger.warning("{}: Unable determine modality"
                           .format(recording.recIdentity()))
            Intended = "invalid"
    elif recid == "al_mtflash3d_sensBody":
        det = series[sid + 1]
        if det.endswith("al_mtflash3d_PDw"):
            Intended = "PDw"
        elif det.endswith("al_mtflash3d_T1w"):
            Intended = "T1w"
        elif det.endswith("al_mtflash3d_MTw"):
            Intended = "MTw"
        else:
            logger.warning("{}: Unable determine modality"
                           .format(recording.recIdentity()))
            Intended = "invalid"


def RecordingEP(recording):
    if Intended != "":
        recording.setAttribute("SeriesDescription", Intended)