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')
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()
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)
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
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)
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
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()
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())
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
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
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()
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
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()
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
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()
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)
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
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()
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")
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
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
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)
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
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 = '.'
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
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')