|
25 | 25 |
|
26 | 26 | N_PROCS=max(N_PROCS-4, 2)
|
27 | 27 |
|
| 28 | +@argh.arg('-d','--diffusion-match', type=json.loads) |
28 | 29 | @argh.arg('-f','--functional-match', type=json.loads)
|
29 | 30 | @argh.arg('-s','--structural-match', type=json.loads)
|
30 | 31 | @argh.arg('-m','--measurements', nargs='*', type=str)
|
@@ -113,6 +114,14 @@ def bru2bids(measurements_base,
|
113 | 114 | )
|
114 | 115 | functional_scan_types = list(f_data_selection['scan_type'].unique())
|
115 | 116 | data_selection = pd.concat([data_selection,f_data_selection])
|
| 117 | + if diffusion_match: |
| 118 | + d_data_selection = get_data_selection(measurements_base, |
| 119 | + match=diffusion_match, |
| 120 | + exclude=exclude, |
| 121 | + measurements=measurements, |
| 122 | + ) |
| 123 | + diffusion_scan_types = list(d_data_selection['scan_type'].unique()) |
| 124 | + data_selection = pd.concat([data_selection,d_data_selection]) |
116 | 125 |
|
117 | 126 | # we start to define nipype workflow elements (nodes, connections, meta)
|
118 | 127 | subjects_sessions = data_selection[["subject","session"]].drop_duplicates().values.tolist()
|
@@ -221,6 +230,76 @@ def bru2bids(measurements_base,
|
221 | 230 | except (FileNotFoundError, OSError):
|
222 | 231 | pass
|
223 | 232 |
|
| 233 | + if diffusion_scan_types: |
| 234 | + get_d_scan = pe.Node(name='get_d_scan', interface=util.Function(function=get_scan, input_names=inspect.getargspec(get_scan)[0], output_names=['scan_path','scan_type','task'])) |
| 235 | + get_d_scan.inputs.ignore_exception = True |
| 236 | + get_d_scan.inputs.data_selection = data_selection |
| 237 | + get_d_scan.inputs.measurements_base = measurements_base |
| 238 | + get_d_scan.iterables = ("scan_type", diffusion_scan_types) |
| 239 | + |
| 240 | + d_bru2nii = pe.Node(interface=bru2nii.Bru2(), name="d_bru2nii") |
| 241 | + d_bru2nii.inputs.force_conversion=True |
| 242 | + d_bru2nii.inputs.actual_size = not inflated_size |
| 243 | + |
| 244 | + d_filename = pe.Node(name='d_filename', interface=util.Function(function=bids_naming,input_names=inspect.getargspec(bids_naming)[0], output_names=['filename'])) |
| 245 | + d_filename.inputs.metadata = data_selection |
| 246 | + d_filename.inputs.extension='' |
| 247 | + |
| 248 | + d_metadata_filename = pe.Node(name='d_metadata_filename', interface=util.Function(function=bids_naming,input_names=inspect.getargspec(bids_naming)[0], output_names=['filename'])) |
| 249 | + d_metadata_filename.inputs.extension = ".json" |
| 250 | + d_metadata_filename.inputs.metadata = data_selection |
| 251 | + |
| 252 | + d_metadata_file = pe.Node(name='d_metadata_file', interface=util.Function(function=write_bids_metadata_file,input_names=inspect.getargspec(write_bids_metadata_file)[0], output_names=['out_file'])) |
| 253 | + d_metadata_file.inputs.extraction_dicts = BIDS_METADATA_EXTRACTION_DICTS |
| 254 | + |
| 255 | + workflow_connections = [ |
| 256 | + (infosource, datasink, [(('subject_session',ss_to_path), 'container')]), |
| 257 | + (infosource, get_d_scan, [('subject_session', 'selector')]), |
| 258 | + (infosource, d_filename, [('subject_session', 'subject_session')]), |
| 259 | + (infosource, d_metadata_filename, [('subject_session', 'subject_session')]), |
| 260 | + (get_d_scan, d_bru2nii, [('scan_path','input_dir')]), |
| 261 | + (get_d_scan, d_filename, [('scan_type', 'scan_type')]), |
| 262 | + (get_d_scan, d_metadata_filename, [('scan_type', 'scan_type')]), |
| 263 | + (get_d_scan, d_metadata_file, [('scan_path', 'scan_dir')]), |
| 264 | + (d_filename, d_bru2nii, [('filename','output_filename')]), |
| 265 | + (d_metadata_filename, d_metadata_file, [('filename', 'out_file')]), |
| 266 | + (d_bru2nii, datasink, [('nii_file', 'dwi')]), |
| 267 | + (d_metadata_file, datasink, [('out_file', 'dwi.@metadata')]), |
| 268 | + ] |
| 269 | + crashdump_dir = path.join(out_base,'bids_crashdump') |
| 270 | + workflow_config = {'execution': {'crashdump_dir': crashdump_dir}} |
| 271 | + if debug: |
| 272 | + workflow_config['logging'] = { |
| 273 | + 'workflow_level':'DEBUG', |
| 274 | + 'utils_level':'DEBUG', |
| 275 | + 'interface_level':'DEBUG', |
| 276 | + 'filemanip_level':'DEBUG', |
| 277 | + 'log_to_file':'true', |
| 278 | + } |
| 279 | + |
| 280 | + workdir_name = 'bids_work' |
| 281 | + workflow = pe.Workflow(name=workdir_name) |
| 282 | + workflow.connect(workflow_connections) |
| 283 | + workflow.base_dir = path.join(out_base) |
| 284 | + workflow.config = workflow_config |
| 285 | + workflow.write_graph(dotfilename=path.join(workflow.base_dir,workdir_name,"graph_diffusion.dot"), graph2use="hierarchical", format="png") |
| 286 | + |
| 287 | + #Execute the workflow |
| 288 | + if not keep_work or not keep_crashdump: |
| 289 | + try: |
| 290 | + workflow.run(plugin="MultiProc", plugin_args={'n_procs' : n_procs}) |
| 291 | + except RuntimeError: |
| 292 | + pass |
| 293 | + else: |
| 294 | + workflow.run(plugin="MultiProc", plugin_args={'n_procs' : n_procs}) |
| 295 | + if not keep_work: |
| 296 | + shutil.rmtree(path.join(workflow.base_dir,workdir_name)) |
| 297 | + if not keep_crashdump: |
| 298 | + try: |
| 299 | + shutil.rmtree(crashdump_dir) |
| 300 | + except (FileNotFoundError, OSError): |
| 301 | + pass |
| 302 | + |
224 | 303 | if structural_scan_types:
|
225 | 304 | get_s_scan = pe.Node(name='get_s_scan', interface=util.Function(function=get_scan, input_names=inspect.getargspec(get_scan)[0], output_names=['scan_path','scan_type','task']))
|
226 | 305 | get_s_scan.inputs.ignore_exception = True
|
|
0 commit comments