Esempio n. 1
0
def dcm_to_nifti(dicom_dir, nifti_dir, split=True, tool_used='dcm2niix'):
    for patient in os.listdir(dicom_dir):

        path_dicom = os.path.join(dicom_dir, patient)
        path_nifti = os.path.join(nifti_dir, patient)
        # make subfolder for each patient
        if not os.path.exists(path_nifti):
            os.makedirs(path_nifti)
        if split == False:
            if tool_used == 'dcm2niix':
                converter = Dcm2niix()
                converter.inputs.source_dir = path_dicom
                converter.inputs.compression = 5
                converter.inputs.merge_imgs = True
                converter.inputs.out_filename = '%d'
                converter.inputs.output_dir = path_nifti
                converter.run()
            elif tool_used == 'dcm2nii':
                converter = Dcm2nii()
                converter.inputs.source_dir = path_dicom
                converter.inputs.gzip_output = True
                converter.inputs.output_dir = path_nifti
                converter.run()
            else:
                raise Warning("tool used does not exist, please enter dcm2nii or dcm2niix")

        else:
            for s in os.listdir(path_dicom):
                if tool_used == 'dcm2niix':
                    converter = Dcm2niix()
                    converter.inputs.source_dir = path_dicom + '/' + s
                    converter.inputs.compression = 5
                    converter.inputs.merge_imgs = True
                    converter.inputs.out_filename = 'x_%d'
                    converter.inputs.output_dir = path_nifti
                    converter.run()
                elif tool_used == 'dcm2nii':
                    converter = Dcm2nii()
                    converter.inputs.source_dir = path_dicom + '/' + s
                    converter.inputs.gzip_output = True
                    converter.inputs.output_dir = path_nifti
                    converter.run()
                else:
                    raise Warning("tool used does not exist, please enter dcm2nii or dcm2niix")


#dcm_to_nifti(dicom_split_dir, nifti_dir, True, 'dcm2nii')
#dcm_to_nifti(dicom_split_dir, nifti_dir, True, 'dcm2niix')
Esempio n. 2
0
    def process_data_folder(self, analysis, options):
        # since the conversion takes a while, change cursor to hourglass
        QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)

        if analysis == 'Dcm2nii':
            process = Dcm2niix()
        else:
            process = []

        for opt, value in options.items():
            process.inputs.__setattr__(opt, value)

        if not os.path.isdir(os.path.join(self.baseDir,
                                          analysis.capitalize())):
            os.mkdir(os.path.join(self.baseDir, analysis.capitalize()))

        process.inputs.source_dir = self.baseDir
        process.inputs.output_dir = os.path.join(self.baseDir,
                                                 analysis.capitalize())

        try:
            out = process.run()
        except RuntimeError as err:
            self.logFile += str(err)
        else:
            self.logFile += out.runtime.stdout

        # update GUI
        self.scanDirectory(self.baseDir)
        self.updateGUI(0)
        self.updateFileNavigator(['.nii'])

        QApplication.restoreOverrideCursor()
        self.postProcessDisplayUpdate()
Esempio n. 3
0
def test_dcm2niix_dwi(tmpdir):
    tmpdir.chdir()
    try:
        datadir = fetch_data(tmpdir.strpath, 'Siemens_Sag_DTI_20160825_145811')
    except IncompleteResultsError as exc:
        pytest.skip("Failed to fetch test data: %s" % str(exc))

    def assert_dwi(eg, bids):
        "Some assertions we will make"
        assert eg.outputs.converted_files
        assert eg.outputs.bvals
        assert eg.outputs.bvecs
        outputs = [y for x, y in eg.outputs.get().items()]
        if bids:
            # ensure all outputs are of equal lengths
            assert len(set(map(len, outputs))) == 1
        else:
            assert not eg.outputs.bids

    dcm = Dcm2niix()
    dcm.inputs.source_dir = datadir
    dcm.inputs.out_filename = '%u%z'
    assert_dwi(dcm.run(), True)

    # now run specifying output directory and removing BIDS option
    outdir = tmpdir.mkdir('conversion').strpath
    dcm.inputs.output_dir = outdir
    dcm.inputs.bids_format = False
    assert_dwi(dcm.run(), False)
Esempio n. 4
0
def run_dcm2niix(bids_name, bids_modality, bvecs_from_scanner_file, mapping_file, nii_file, nii_output_dir,
                 out_filename, par_file, public_output, task):
    '''
    Converts one par/rec pair to nii.gz.
    Adds scan duration and dcm2niix & docker container version to bids file.
    '''

    abs_par_file = os.path.abspath(par_file)
    abs_rec_file = os.path.splitext(abs_par_file)[0] + ".rec"

    assert os.path.exists(abs_rec_file), "REC file does not exist %s" % abs_rec_file

    # run converter
    converter = Dcm2niix()
    converter.inputs.source_names = [abs_par_file]
    converter.inputs.bids_format = True
    converter.inputs.compress = 'i'
    converter.inputs.has_private = True
    converter.inputs.out_filename = out_filename
    converter.inputs.output_dir = nii_output_dir
    print("XXXXXXX running dcm2niix command")
    print(converter.cmdline)
    converter_results = converter.run()
    bids_file = converter_results.outputs.bids

    # add additional information to json
    ## scan duration
    add_additional_bids_parameters_from_par(abs_par_file, bids_file, {"scan_duration": "ScanDurationSec",
                                                                      "technique": "PulseSequenceType",
                                                                      "protocol_name": "PulseSequenceDetails"})

    add_flip_angle_from_par(abs_par_file, bids_file)
    add_total_readout_time_from_par(abs_par_file, bids_file)

    ## lhab_pipelines
    add_info_to_json(bids_file, {"LhabPipelinesVersion": lhab_pipelines.__version__})

    ## task
    if task:
        add_info_to_json(bids_file, {"TaskName": task})

    ## time
    add_info_to_json(bids_file, {"ConversionTimestamp": str(dt.datetime.now())})

    if not public_output:
        # write par 2 nii mapping file only for private use
        with open(mapping_file, "a") as fi:
            fi.write("%s %s\n" % (abs_par_file, nii_file))
    else:
        # remove info file generated by dcm2niix
        os.remove(os.path.join(nii_output_dir, out_filename + '.txt'))

    # rotate bvecs and add angulation to json for dwi
    if (bids_name == "dwi") & (bids_modality != "fmap"):
        dwi_treat_bvecs(abs_par_file, bids_file, bvecs_from_scanner_file, nii_output_dir, par_file)
        # remove _dwi_ADC.nii.gz file created by dcm2niix
        adc_file = glob(os.path.join(nii_output_dir, "*_dwi_ADC.nii.gz"))[0]
        os.remove(adc_file)

    return bids_file, converter_results
Esempio n. 5
0
def zip2nii(zipfname, outdir):

    with tempfile.TemporaryDirectory() as tmpdir:
        with tempfile.TemporaryDirectory() as outtmpdir:
            shutil.copy(zipfname, tmpdir)
            _, fname = os.path.split(zipfname)
            fname = os.path.join(tmpdir, fname)

            zip_ref = zipfile.ZipFile(fname, 'r')
            zip_ref.extractall(tmpdir)
            zip_ref.close()
            os.remove(fname)

            converter = Dcm2niix()
            converter.inputs.source_dir = tmpdir
            converter.inputs.compression = 5
            converter.inputs.output_dir = outtmpdir
            converter.inputs.out_filename = '%p_%t_%s'
            print(converter.cmdline)
            #'dcm2niix -b y -z y -5 -x n -t n -m n -o ds005 -s n -v n tmpdir'
            converter.run()
            dirlist = glob.glob(outtmpdir + '/' + '*.gz')
            for file_name in dirlist:
                if (os.path.isfile(file_name)):
                    shutil.copy(file_name, outdir)
Esempio n. 6
0
def nipype_convert(item_dicoms, prefix, with_prov, bids, tmpdir):
    """ """
    import nipype
    if with_prov:
        from nipype import config
        config.enable_provenance()
    from nipype import Node
    from nipype.interfaces.dcm2nii import Dcm2niix

    item_dicoms = list(map(op.abspath, item_dicoms))  # absolute paths

    dicom_dir = op.dirname(item_dicoms[0]) if item_dicoms else None

    convertnode = Node(Dcm2niix(), name='convert')
    convertnode.base_dir = tmpdir
    convertnode.inputs.source_dir = dicom_dir
    convertnode.inputs.out_filename = op.basename(op.dirname(prefix))

    if nipype.__version__.split('.')[0] == '0':
        # deprecated since 1.0, might be needed(?) before
        convertnode.inputs.terminal_output = 'allatonce'
    else:
        convertnode.terminal_output = 'allatonce'
    convertnode.inputs.bids_format = bids
    eg = convertnode.run()

    # prov information
    prov_file = prefix + '_prov.ttl' if with_prov else None
    if prov_file:
        safe_copyfile(
            op.join(convertnode.base_dir, convertnode.name, 'provenance.ttl'),
            prov_file)

    return eg, prov_file
Esempio n. 7
0
def dcm_nii():
    g = os.walk("/project/data/dicom/gp_1/")
    for path, dir_list, file_list in g:
        print('*' * 10)
        print(path)
        print(dir_list)
        print(file_list)
        if len(dir_list) == 0 and len(file_list) > 0:
            print(path)

            # print(len(file_list))
            converter = Dcm2niix()
            converter.inputs.bids_format = False
            converter.inputs.compress = 'n'
            converter.inputs.merge_imgs = True
            print(path)
            if path.split('/')[-1] == 'CT':
                temp = 'CT'
            else:
                temp = 'MR'
            converter.inputs.out_filename = temp
            outpath = path.split('New')[0] + 'New_nii' + path.split('New')[-1]
            if not os.path.exists(outpath):
                os.makedirs(outpath)

            converter.inputs.output_dir = outpath
            converter.inputs.source_dir = path
            converter.run()
Esempio n. 8
0
def test_dcm2niix_dti(fetch_data, tmpdir):
    tmpdir.chdir()
    datadir = tmpdir.mkdir('data').strpath
    dicoms = fetch_data(datadir, 'Siemens_Sag_DTI_20160825_145811')

    def assert_dti(res):
        "Some assertions we will make"
        assert res.outputs.converted_files
        assert res.outputs.bvals
        assert res.outputs.bvecs
        outputs = [y for x, y in res.outputs.get().items()]
        if res.inputs.get('bids_format'):
            # ensure all outputs are of equal lengths
            assert len(set(map(len, outputs))) == 1
        else:
            assert not res.outputs.bids

    dcm = Dcm2niix()
    dcm.inputs.source_dir = dicoms
    dcm.inputs.out_filename = '%u%z'
    assert_dti(dcm.run())

    # now run specifying output directory and removing BIDS option
    outdir = tmpdir.mkdir('conversion').strpath
    dcm.inputs.output_dir = outdir
    dcm.inputs.bids_format = False
    assert_dti(dcm.run())
Esempio n. 9
0
def dcm2niix_wf(wf_name='dcm2niix'):
    """Run dcm2niix over one folder with DICOM files.

    Nipype Inputs
    -------------
    dcm2niix.in_dcmdir: traits.Dir
        path to the DICOM images folder.

    Nipype Outputs
    --------------
    dcm2niix.bids: (a list of items which are an existing file name)

    dcm2niix.bvals: (a list of items which are an existing file name)

    dcm2niix.bvecs: (a list of items which are an existing file name)

    dcm2niix.converted_files: (a list of items which are an existing file name)

    Returns
    -------
    wf: nipype Workflow
    """
    # Create the workflow object
    wf = pe.Workflow(name=wf_name)

    # specify input and output fields
    in_fields = [
        "in_dcmdir",
    ]

    out_fields = ["bids", "bvals", "bvecs", "converted_files"]

    # input node
    dcm2niix_input = setup_node(IdentityInterface(fields=in_fields,
                                                  mandatory_inputs=True),
                                name="dcm2niix_input")
    # T1 preprocessing nodes
    dcm2niix = setup_node(Dcm2niix(), name="dcm2niix")

    # output node
    dcm2niix_output = setup_node(IdentityInterface(fields=out_fields),
                                 name="dcm2niix_output")

    # Connect the nodes
    wf.connect([
        # input
        (dcm2niix_input, dcm2niix, [
            ("in_dcmdir", "source_dir"),
        ]),

        # output
        (dcm2niix, dcm2niix_output, [
            ("bids", "bids"),
            ("bvals", "bvals"),
            ("bvecs", "bvecs"),
            ("converted_files", "converted_files"),
        ]),
    ])

    return wf
Esempio n. 10
0
def nipype_convert(item_dicoms,
                   prefix,
                   with_prov,
                   bids_options,
                   tmpdir,
                   dcmconfig=None):
    """
    Converts DICOMs grouped from heuristic using Nipype's Dcm2niix interface.

    Parameters
    ----------
    item_dicoms : List
        DICOM files to convert
    prefix : String
        Heuristic output path
    with_prov : Bool
        Store provenance information
    bids_options : List or None
        If not None then output BIDS sidecar JSONs
        List may contain bids specific options
    tmpdir : Directory
        Conversion working directory
    dcmconfig : File (optional)
        JSON file used for additional Dcm2niix configuration
    """
    import nipype
    if with_prov:
        from nipype import config
        config.enable_provenance()
    from nipype import Node
    from nipype.interfaces.dcm2nii import Dcm2niix

    item_dicoms = list(map(op.abspath, item_dicoms))  # absolute paths

    fromfile = dcmconfig if dcmconfig else None
    if fromfile:
        lgr.info("Using custom config file %s", fromfile)

    convertnode = Node(Dcm2niix(from_file=fromfile), name='convert')
    convertnode.base_dir = tmpdir
    convertnode.inputs.source_names = item_dicoms
    convertnode.inputs.out_filename = prefix

    if nipype.__version__.split('.')[0] == '0':
        # deprecated since 1.0, might be needed(?) before
        convertnode.inputs.terminal_output = 'allatonce'
    else:
        convertnode.terminal_output = 'allatonce'
    convertnode.inputs.bids_format = bids_options is not None
    eg = convertnode.run()

    # prov information
    prov_file = prefix + '_prov.ttl' if with_prov else None
    if prov_file:
        safe_copyfile(
            op.join(convertnode.base_dir, convertnode.name, 'provenance.ttl'),
            prov_file)

    return eg, prov_file
Esempio n. 11
0
def dicom_converter(out_dir=None, source_dir=None, filename=None):
    converter = Dcm2niix()
    converter.inputs.bids_format = True
    converter.inputs.anon_bids = True
    converter.inputs.compress = 'y'
    converter.inputs.output_dir = out_dir
    converter.inputs.source_dir = source_dir
    converter.inputs.out_filename = filename
    converter.run()
Esempio n. 12
0
def my_dcm2niix(folder):
    # convert dcm series to nii.gz and .json using nipype and dcm2niix
    from nipype.interfaces.dcm2nii import Dcm2niix
    converter = Dcm2niix()
    converter.inputs.source_dir = folder
    converter.inputs.compression = 5
    converter.inputs.output_dir = folder
    converter.inputs.out_filename = '%i_%4s_%d'
    converter.cmdline
    converted_files = converter.run()
    return converted_files
Esempio n. 13
0
def convert_to_nifti(studydir):
    logging.info("Converting to nifti")
    dicomdir = pjoin(studydir, "scans")
    niftidir = pjoin(studydir, "nifti")
    os.mkdir(niftidir)
    dcm = Dcm2niix()
    dcm.ignore_exception = True
    dcm.inputs.source_dir = dicomdir
    dcm.inputs.output_dir = niftidir
    dcm.inputs.out_filename = "%d_%s"
    dcm.run()
Esempio n. 14
0
 def dicom_convert(self):
     if not getattr(self,"_dicom_convert",None):
         #self._dicom_convert = pe.Node(name="dicom_convert", interface=Dcm2nii())
         #self._dicom_convert = pe.Node(name="dicom_convert", interface=HCDcm2nii())
         self._dicom_convert = pe.Node(name="dicom_convert", interface=Dcm2niix())
         self._dicom_convert.inputs.out_filename="%p_s%s"
         #self._dicom_convert.inputs.convert_all_pars = True
         #self._dicom_convert.inputs.gzip_output = False
         #self._dicom_convert.inputs.reorient = False
         #self._dicom_convert.inputs.reorient_and_crop = False
         #self._dicom_convert.inputs.events_in_filename=True
         #self._dicom_convert.inputs.protocol_in_filename=True
         #self._dicom_convert.inputs.date_in_filename= False
     return self._dicom_convert
Esempio n. 15
0
def convert_to_nifti(studydir):
    # convert both to nifti and to separated dicom dirs
    dicomdir = pjoin(studydir, "dicom")
    niftidir = pjoin(studydir, "nifti")
    dicomdirsdir = pjoin(studydir, "dicomdirs")
    os.mkdir(niftidir)
    os.mkdir(dicomdirsdir)
    subprocess.call(
        ["/usr/local/bin/dcm2niix", "-r", "y", "-o", dicomdirsdir, dicomdir])
    dcm = Dcm2niix()
    dcm.inputs.source_dir = dicomdir
    dcm.inputs.output_dir = niftidir
    dcm.inputs.out_filename = "%d_%s"
    dcm.run()
def convert (source_dir, output_dir, subName, session): # this is a function that takes input directory, output directory and subject name and then converts everything accordingly
    try:
        os.makedirs(os.path.join(output_dir, subName, session))
    except:
        print ("folder already there")
#    try:
#       os.makedirs(os.path.join(output_dir, subName, ))
#    except:
#       print("Folder Exist")    
    converter = Dcm2niix()
    converter.inputs.source_dir = source_dir
    converter.inputs.compression = 7
    converter.inputs.output_dir = os.path.join(output_dir, subName, session)
    converter.inputs.out_filename = subName + 'seriesNo' '_' + '%2s' + '%p'
    converter.run()
Esempio n. 17
0
def convert_to_nifti(studydir, newdir):
    niftidir = str(studydir) + "_nifti"
    os.mkdir(niftidir)
    dcm = Dcm2niix()
    dcm.inputs.source_dir = studydir
    dcm.inputs.output_dir = niftidir
    dcm.inputs.out_filename = "%d_%s"
    dcm.run()
    shutil.rmtree(studydir)
    newold = newdir.with_suffix(".old")
    if os.path.exists(newdir):
        if os.path.exists(newold):
            shutil.rmtree(newold)
        os.rename(newdir, newold)
    os.rename(niftidir, newdir)
Esempio n. 18
0
def convert_dcm(scan_key):
    """ convert dicom with dcm2niix """
    chdir(scan_key)
    ZipFile('dicomdata.zip').extractall()

    converter = Dcm2niix()
    converter.inputs.source_dir = './dicomdata/DICOM/'
    converter.inputs.output_dir = '.'
    converter.inputs.ignore_deriv = True
    converter.inputs.single_file = True
    converter.inputs.out_filename = "%d"
    converter.run()

    rmtree('dicomdata')
    system('rm *.json *.zip [DEFMS]* T2*a.nii.gz Q*[1-5].nii.gz')
    return converter.cmdline
Esempio n. 19
0
def nipype_convert(item_dicoms, prefix, with_prov, bids, tmpdir):
    """ """
    if with_prov:
        from nipype import config
        config.enable_provenance()
    from nipype import Node
    from nipype.interfaces.dcm2nii import Dcm2niix

    item_dicoms = list(map(op.abspath, item_dicoms)) # absolute paths

    convertnode = Node(Dcm2niix(), name='convert')
    convertnode.base_dir = tmpdir
    convertnode.inputs.source_names = item_dicoms
    convertnode.inputs.out_filename = op.basename(op.dirname(prefix))
    convertnode.inputs.bids_format = bids
    convertnode.inputs.anon_bids = False
    return convertnode.run()
Esempio n. 20
0
    def go(self):
        # since the conversion takes a while, change cursor to hourglass
        QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)

        dcm_node = pe.MapNode(interface=Dcm2niix(),
                              name='dcmnode',
                              iterfield=['source_dir'])

        options = dict()
        options['anon_bids'] = self.chk_anon.isChecked()
        options['merge_imgs'] = self.chk_3D.isChecked()
        options['compression'] = self.comp.currentIndex() + 1

        if self.chk_GZ.isChecked():
            options['compress'] = 'y'
            out_format = '.nii.gz'
        else:
            options['compress'] = 'n'
            out_format = '.nii'

        for opt, value in options.items():
            dcm_node.inputs.__setattr__(opt, value)

        # get selected files
        # since dcm2niix uses directories to convert files we will get the containing directory as input to the script
        # instead of a list of file names
        in_dirs = [
            os.path.split(row.in_file.text())[0] for row in self.dcm_rows
        ]

        dcm_node.inputs.output_dir = self.dir_dic['temp_dir']
        dcm_node.inputs.source_dir = in_dirs

        dcm_node.run()

        # rename and move files into appropriate bids folders
        self.move_and_rename(dcm_node.result.outputs.bids,
                             dcm_node.result.outputs.bvals,
                             dcm_node.result.outputs.bvecs,
                             dcm_node.result.outputs.converted_files,
                             self.process_out_files(), out_format)

        QApplication.restoreOverrideCursor()
        self.parentWidget.post_process_update()
def convert_nii(path="/home/alisher/Documents/data/umc/РДЦ/ПАТОЛОГИЯ",
                new_path='/home/alisher/Documents/data/umc/Patology',
                tag='converted'):

    assert os.path.exists(path)

    create_direct(new_path)

    damaged_files = []

    for folder in os.listdir(path):

        patient_path = f'{path}/{folder}'
        patient_number = os.listdir(patient_path)[0]
        patient_dicom = f'{patient_path}/{patient_number}'

        subject_path = f'{new_path}/{folder}'
        converted_path = f'{subject_path}/{tag}'

        create_direct(subject_path)
        create_direct(converted_path)

        if not len(os.listdir(converted_path)) == 0:
            logger.info(f"Already converted {folder}")
            continue

        converter = Dcm2niix()
        converter.inputs.compression = 5
        # ignore derived, localizer and 2D images
        converter.inputs.ignore_deriv = True
        converter.inputs.source_dir = patient_dicom
        converter.inputs.output_dir = converted_path
        # run converter
        logger.info(f"Started converting for {folder}")
        try:
            converter.run()
        except:
            logger.info(f"Something went wrong with {folder}")
            damaged_files.append(folder)
        logger.info(f"Completed converting for {folder}")

    logger.info(f"Finished converting {len(os.listdir(path))} subjects")
    logger.info("*" * 30)
    logger.info(f"Damaged_files: {damaged_files}")
def dcm_to_nifti(dicom_dir, nifti_dir, split=True, tool_used='dcm2niix'):
    for patient in os.listdir(dicom_dir):
        path_dicom = os.path.join(dicom_dir, patient)
        path_nifti = os.path.join(nifti_dir, patient)
        # make subfolder for each patient
        if not os.path.exists(path_nifti):
            os.makedirs(path_nifti)
        if not split:
            if tool_used == 'dcm2niix':
                converter = Dcm2niix()
                converter.inputs.source_dir = path_dicom
                converter.inputs.compression = 5
                converter.inputs.merge_imgs = True
                converter.inputs.out_filename = '%d'
                converter.inputs.output_dir = path_nifti
                converter.run()
            elif tool_used == 'dcm2nii':
                converter = Dcm2nii()
                converter.inputs.source_dir = path_dicom
                converter.inputs.gzip_output = True
                converter.inputs.output_dir = path_nifti
                converter.run()
            else:
                raise Warning("tool used does not exist, please enter dcm2nii or dcm2niix")

        else:
            for s in os.listdir(path_dicom):
                if tool_used == 'dcm2niix':
                    try:
                        subprocess.call('/home/harryzhang/toolbox/dcm2niix/console/dcm2niix -m y -5 -f %%d -o %s %s' %
                                        (path_nifti, path_dicom + '/'+s), shell=True)
                    except:
                        pass
                elif tool_used == 'dcm2nii':
                    converter = Dcm2nii()
                    converter.inputs.source_dir = path_dicom + '/' + s
                    converter.inputs.gzip_output = True
                    converter.inputs.output_dir = path_nifti
                    converter.run()
                else:
                    raise Warning("tool used does not exist, please enter dcm2nii or dcm2niix")
Esempio n. 23
0
def dcmToniix(dst):
    for root, dirs, files in os.walk(dst):
        if len(files) == 0:
            continue
        sourceList = []
        for file in files:
            if '.dcm' in file:
                sourceList.append(os.path.join(root, file))

        print('Converting files in : ' + root + ' to .nii')
        converter = Dcm2niix()
        #print(sourceList)
        converter.inputs.source_names = sourceList
        converter.inputs.compression = 5
        #print('root is ', root)
        converter.inputs.output_dir = root
        #print('\n\n\nconverter is :', converter.cmdline)
        #converter.run() # this does not yet work due to some unicode error ?? No idea why
        #print('Converting files in : '+root+ ' to .nii')
        os.system('echo "' + converter.cmdline + '">>' + dst + '/runNiix.log')
        runNiix = converter.cmdline + ' >> ' + dst + '/runNiix.log'
        os.system(runNiix)  # use this code .. this works
Esempio n. 24
0
def convert(path):
    '''
        Converts .dcms to .nii.gz

        Input:
            path: (path) Path to folder containing DICOMS
    '''
    dirs = path.split('/')

    if dirs[-1] == 'anat':
        filename = dirs[-2]+'_T1w'
        print(filename)
    elif dirs[-1] =='func':
        filename = dirs[-2]+'_task-rest_bold'
        print(filename)

    converter = Dcm2niix()
    converter.inputs.source_dir = path
    converter.inputs.output_dir = path
    converter.inputs.out_filename = filename
    converter.run()

    print("Completed conversion: {}".format(path))
    return
Esempio n. 25
0
def convert(items, anonymizer=None, symlink=True, converter=None):
    prov_files = []
    tmpdir = mkdtemp()
    for item in items:
        if isinstance(item[1], (list, tuple)):
            outtypes = item[1]
        else:
            outtypes = [item[1]]
        prefix = item[0]
        print('Converting %s' % prefix)
        dirname = os.path.dirname(prefix + '.ext')
        print(dirname)
        if not os.path.exists(dirname):
            os.makedirs(dirname)
        for outtype in outtypes:
            print(outtype)
            if outtype == 'dicom':
                dicomdir = prefix + '_dicom'
                if os.path.exists(dicomdir):
                    shutil.rmtree(dicomdir)
                os.mkdir(dicomdir)
                for filename in item[2]:
                    outfile = os.path.join(dicomdir,
                                           os.path.split(filename)[1])
                    if not os.path.islink(outfile):
                        if symlink:
                            os.symlink(filename, outfile)
                        else:
                            os.link(filename, outfile)
            elif outtype in ['nii', 'nii.gz']:
                outname = prefix + '.' + outtype
                scaninfo = prefix + '_scaninfo.json'
                if not os.path.exists(outname):
                    from nipype import config
                    config.enable_provenance()
                    from nipype import Function, Node
                    from nipype.interfaces.base import isdefined
                    print converter
                    if converter == 'mri_convert':
                        from nipype.interfaces.freesurfer.preprocess import MRIConvert
                        convertnode = Node(MRIConvert(), name='convert')
                        convertnode.base_dir = tmpdir
                        if outtype == 'nii.gz':
                            convertnode.inputs.out_type = 'niigz'
                        convertnode.inputs.in_file = item[2][0]
                        convertnode.inputs.out_file = outname
                        #cmd = 'mri_convert %s %s' % (item[2][0], outname)
                        #print(cmd)
                        #os.system(cmd)
                        res = convertnode.run()
                    elif converter == 'dcm2nii':
                        from nipype.interfaces.dcm2nii import Dcm2niix
                        convertnode = Node(Dcm2niix(), name='convert')
                        convertnode.base_dir = tmpdir
                        convertnode.inputs.source_names = item[2]
                        res = convertnode.run()
                        if isinstance(res.outputs.converted_files, list):
                            print(
                                "Cannot convert dicom files - series likely has multiple orientations: ",
                                item[2])
                            continue
                        else:
                            shutil.copyfile(res.outputs.converted_files,
                                            outname)
                        if isdefined(res.outputs.bvecs):
                            outname_bvecs = prefix + '.bvecs'
                            outname_bvals = prefix + '.bvals'
                            shutil.copyfile(res.outputs.bvecs, outname_bvecs)
                            shutil.copyfile(res.outputs.bvals, outname_bvals)
                    prov_file = prefix + '_prov.ttl'
                    shutil.copyfile(
                        os.path.join(convertnode.base_dir, convertnode.name,
                                     'provenance.ttl'), prov_file)
                    prov_files.append(prov_file)
                    embedfunc = Node(Function(input_names=[
                        'dcmfiles', 'niftifile', 'infofile', 'force'
                    ],
                                              output_names=['outfile', 'meta'],
                                              function=embed_nifti),
                                     name='embedder')
                    embedfunc.inputs.dcmfiles = item[2]
                    embedfunc.inputs.niftifile = outname
                    embedfunc.inputs.infofile = scaninfo
                    embedfunc.inputs.force = True
                    embedfunc.base_dir = tmpdir
                    res = embedfunc.run()
                    #g = res.provenance.rdf()
                    #g.parse(prov_file,
                    #        format='turtle')
                    #g.serialize(prov_file, format='turtle')
                    #out_file, meta_dict = embed_nifti(item[2], outname, force=True)
                    os.chmod(outname, 0440)
                    os.chmod(scaninfo, 0440)
                    os.chmod(prov_file, 0440)
    shutil.rmtree(tmpdir)
Esempio n. 26
0
def run_pipeline(write_dir,
                 smri_data,
                 realign,
                 slicetiming,
                 datasink,
                 fmri_preprocess,
                 data_type=None,
                 **template_dict):
    """This function runs pipeline"""

    write_dir = write_dir + '/' + template_dict[
        'output_zip_dir']  # Store outputs in this directory for zipping the directory
    error_log = dict()  # dict for storing error log

    print('fmri pipeline is running...')
    each_sub=smri_data

    try:

        # Extract subject id and name of nifti file
        if data_type == 'bids':
            write_dir = write_dir + '/' + template_dict[
                'output_zip_dir']  # Store outputs in this directory for zipping the directory
            sub_id = 'sub-' + each_sub.subject
            session_id = getattr(each_sub, 'session', None)

            if session_id is not None:
                session = 'ses-' + getattr(each_sub, 'session', None)
            else:
                session = ''

            nii_output = ((each_sub.filename).split('/')[-1]).split('.gz')[0]
            n1_img = nib.load(each_sub.filename)

        if data_type == 'nifti':
            sub_id = template_dict['subject']
            session = template_dict['session']
            nii_output = ((each_sub).split('/')[-1]).split('.gz')[0]
            n1_img = nib.load(each_sub)

        if data_type == 'dicoms':
            sub_id = template_dict['subject']
            session = template_dict['session']
            fmri_out = os.path.join(write_dir, sub_id, session, 'func')
            os.makedirs(fmri_out, exist_ok=True)

            ## This code runs the dicom to nifti conversion here
            from nipype.interfaces.dcm2nii import Dcm2niix
            dcm_nii_convert = Dcm2niix()
            dcm_nii_convert.inputs.source_dir = each_sub
            dcm_nii_convert.inputs.output_dir = fmri_out
            with stdchannel_redirected(sys.stderr, os.devnull):
                dcm_nii_convert.run()
            with stdchannel_redirected(sys.stderr, os.devnull):
                n1_img = nib.load(glob.glob(os.path.join(fmri_out, '*.nii*'))[0])
                nii_output = ((glob.glob(os.path.join(fmri_out, '*.nii*'))[0]).split('/')[-1]).split('.gz')[0]

        # Directory in which fmri outputs will be written
        fmri_out = os.path.join(write_dir, sub_id, session, 'func')

        # Create output dir for sub_id
        os.makedirs(fmri_out, exist_ok=True)

        if n1_img:
            """
            Save nifti file from input data into output directory only if data_type !=dicoms because the dcm_nii_convert in the previous
            step saves the nifti file to output directory
             """
            nib.save(n1_img, os.path.join(fmri_out, nii_output))
            #os.remove(glob.glob(os.path.join(fmri_out, '*.gz'))[0])

            # Create fmri_spm12 dir under the specific sub-id/func
            os.makedirs(
                os.path.join(fmri_out, template_dict['fmri_output_dirname']),
                exist_ok=True)

            nifti_file = glob.glob(os.path.join(fmri_out, '*.nii'))[0]

            # run reorientation node and pass to realign
            try:
                with stdchannel_redirected(sys.stderr, os.devnull):
                    convert_and_run_reorient_script(nifti_file)
            except:
                pass



            # Edit realign node inputs
            realign.node.inputs.in_files = nifti_file
            # realign.node.inputs.out_file = fmri_out + "/" + template_dict['fmri_output_dirname'] + "/Re.nii"
            # realign.node.run()

            if template_dict['slicetime_ref_slice'] is not None:slicetiming.node.inputs.ref_slice=template_dict['slicetime_ref_slice']
            if template_dict['num_slices'] is not None:slicetiming.node.inputs.num_slices=template_dict['num_slices']
            if template_dict['repetition_time'] is not None:TR=template_dict['repetition_time']
            if template_dict['acquisition_order'] is not None:acq_order=template_dict['acquisition_order']

            # Edit Slicetiming node inputs
            TR = n1_img.header.get_zooms()[-1]
            num_slices = n1_img.shape[2]
            slicetiming.node.inputs.in_files = nifti_file
            slicetiming.node.inputs.num_slices = num_slices
            slicetiming.node.inputs.ref_slice = int(num_slices / 2)
            slicetiming.node.inputs.time_repetition = TR
            time_for_one_slice = TR / num_slices
            slicetiming.node.inputs.time_acquisition = TR - time_for_one_slice
            odd = range(1, num_slices + 1, 2)
            even = range(2, num_slices + 1, 2)
            acq_order = list(odd) + list(even)
            slicetiming.node.inputs.slice_order = acq_order


            # Edit datasink node inputs
            datasink.node.inputs.base_directory = fmri_out

            # Run the nipype pipeline
            with stdchannel_redirected(sys.stderr, os.devnull):
                fmri_preprocess.run()

            # Motion quality control: Calculate Framewise Displacement
            calculate_FD(glob.glob(os.path.join(fmri_out,
                                                template_dict['fmri_output_dirname'], 'rp*.txt'))[0], **template_dict)


            # Write readme files
            write_readme_files(write_dir, data_type, **template_dict)

    except Exception as e:
        # If the above code fails for any reason update the error log for the subject id
        # ex: the nifti file is not a nifti file
        # the input file is not a brian scan
        error_log.update({sub_id: str(e)})

    finally:
        remove_tmp_files()

    output_message = "FMRI preprocessing completed. "

    if bool(error_log):
        output_message = output_message + " Error log:" + str(error_log)
    return output_message
Esempio n. 27
0
infosource.iterables = [('subject_id', sub_list)]
# ======================================================================
# DEFINE SELECTFILES NODE
# ======================================================================
path_root = dicom_directory  #os.path.dirname(os.getcwd())
path_app = os.path.dirname(os.getcwd())

templates = dict(dicom=opj(path_root, '', '{subject_id}'))
test = opj(path_app, 'CLF-python')
# define the selectfiles node:
selectfiles = Node(SelectFiles(templates), name='selectfiles')
# ======================================================================
# DICOM 2 NIFTI CONVERSION
# ======================================================================
# function: put dcm2niix into a node:
dcm2niix = Node(Dcm2niix(), name='dcm2niix')
dcm2niix.inputs.out_filename = '%i_%4s_%d'
print(dcm2niix.inputs.out_filename)

# ======================================================================
# DEFINE FREESURFER NODE
# ======================================================================
# function: autorecon1
# 1. Motion Correction and Conform
# 2. NU (Non-Uniform intensity normalization)
# 3. Talairach transform computation
# 4. Intensity Normalization 1
# 5. Skull Strip
#bk#fs_recon1 = create_AutoRecon1()
#fs_recon1.inputs.inputspec.subject_id = 'subj1'
#fs_recon1.inputs.inputspec.subjects_dir = '.'
Esempio n. 28
0
import os
import pytest
import shutil

from nipype.interfaces.dcm2nii import Dcm2niix
no_dcm2niix = not bool(Dcm2niix().version)
no_datalad = False
try:
    from datalad import api  # to pull and grab data
    from datalad.support.exceptions import IncompleteResultsError
except ImportError:
    no_datalad = True

DICOM_DIR = 'http://datasets-tests.datalad.org/dicoms/dcm2niix-tests'


@pytest.fixture
def fetch_data():
    def _fetch_data(datadir, dicoms):
        try:
            """Fetches some test DICOMs using datalad"""
            api.install(path=datadir, source=DICOM_DIR)
            data = os.path.join(datadir, dicoms)
            api.get(path=data)
        except IncompleteResultsError as exc:
            pytest.skip("Failed to fetch test data: %s" % str(exc))
        return data

    return _fetch_data

        os.makedirs(output_dir)

    for sub_id in sub_id_list:
        subject_out_dir = os.path.join(output_dir, sub_id)
        os.makedirs(subject_out_dir, exist_ok=True)
        par_list = glob(os.path.join(raw_dir, sub_id, "*t1w*.par"))

        if not par_list:
            raise Exception("No t1w images for {}".format(sub_id))
        for par in par_list:
            out_filename = os.path.basename(par).split(".par")[0]
            full_out_path = os.path.join(subject_out_dir,
                                         out_filename + ".nii.gz")
            print(full_out_path)
            if not os.path.isfile(full_out_path):
                converter = Dcm2niix()
                converter.inputs.source_names = [par]
                converter.inputs.bids_format = True
                converter.inputs.compress = 'i'
                converter.inputs.has_private = True
                converter.inputs.output_dir = subject_out_dir
                converter.inputs.out_filename = out_filename

                print("XXXXXXX running dcm2niix command")
                print(converter.cmdline)

                converter_results = converter.run()

                reorient = Reorient2Std()
                reorient.inputs.in_file = converter_results.outputs.converted_files
                reorient.inputs.out_file = converter_results.outputs.converted_files
Esempio n. 30
0
datasource_rt = nipype.Node(
    interface=nipype.DataGrabber(infields=['rt_files'], outfields=['directory']),
    name='datasource_rt')
datasource_rt.inputs.base_directory = base_dir
datasource_rt.inputs.template = '*'
datasource_rt.inputs.sort_filelist = True
datasource_rt.inputs.field_template = dict(directory='*/*/%s/1-*')

dc_rt = nipype.MapNode(interface=DicomCheck(), iterfield=['dicom_dir'], name='dc_rt')
dc_rt.inputs.working_dir = result_dir

dc = nipype.MapNode(interface=DicomCheck(), iterfield=['dicom_dir'], name='dc')
dc.inputs.working_dir = result_dir

converter = nipype.MapNode(interface=Dcm2niix(),
                           iterfield=['source_dir', 'out_filename', 'output_dir'],
                           name='converter')
converter.inputs.compress = 'y'
converter.inputs.philips_float = False
converter.inputs.merge_imgs = True

check = nipype.MapNode(interface=ConversionCheck(),
                       iterfield=['in_file', 'file_name'],
                       name='check_conversion')

workflow = nipype.Workflow('data_preparation_workflow', base_dir=cache_dir)
workflow.connect(inputnode, 'contrasts', datasource, 'contrasts')
workflow.connect(datasource, 'directory', dc, 'dicom_dir')
workflow.connect(inputnode_rt, 'rt_files', datasource_rt, 'rt_files')
workflow.connect(datasource_rt, 'directory', dc_rt, 'dicom_dir')