|
28 | 28 | CommandLineInputSpec, isdefined)
|
29 | 29 |
|
30 | 30 |
|
| 31 | +from ... import logging |
| 32 | +iflogger = logging.getLogger('interface') |
| 33 | + |
31 | 34 | class ParseDICOMDirInputSpec(FSTraitedSpec):
|
32 | 35 | dicom_dir = Directory(exists=True, argstr='--d %s', mandatory=True,
|
33 | 36 | desc='path to siemens dicom directory')
|
@@ -593,7 +596,8 @@ class ReconAllInputSpec(CommandLineInputSpec):
|
593 | 596 | directive = traits.Enum('all', 'autorecon1', 'autorecon2', 'autorecon2-cp',
|
594 | 597 | 'autorecon2-wm', 'autorecon2-inflate1', 'autorecon2-perhemi',
|
595 | 598 | 'autorecon3', 'localGI', 'qcache', argstr='-%s',
|
596 |
| - desc='process directive', usedefault=True) |
| 599 | + desc='process directive', usedefault=True, |
| 600 | + position=0) |
597 | 601 | hemi = traits.Enum('lh', 'rh', desc='hemisphere to process', argstr="-hemi %s")
|
598 | 602 | T1_files = InputMultiPath(File(exists=True), argstr='-i %s...',
|
599 | 603 | desc='name of T1 file to process')
|
@@ -621,14 +625,97 @@ class ReconAll(CommandLine):
|
621 | 625 | >>> reconall.inputs.subjects_dir = '.'
|
622 | 626 | >>> reconall.inputs.T1_files = 'structural.nii'
|
623 | 627 | >>> reconall.cmdline
|
624 |
| - 'recon-all -i structural.nii -all -subjid foo -sd .' |
| 628 | + 'recon-all -all -i structural.nii -subjid foo -sd .' |
625 | 629 |
|
626 | 630 | """
|
627 | 631 |
|
628 | 632 | _cmd = 'recon-all'
|
629 | 633 | _additional_metadata = ['loc', 'altkey']
|
630 | 634 | input_spec = ReconAllInputSpec
|
631 | 635 | output_spec = ReconAllIOutputSpec
|
| 636 | + _can_resume = True |
| 637 | + |
| 638 | + |
| 639 | + _steps = [ |
| 640 | + #autorecon1 |
| 641 | + ('motioncor', ['mri/rawavg.mgz', 'mri/orig.mgz']), |
| 642 | + ('talairach', ['mri/transforms/talairach.auto.xfm', |
| 643 | + 'mri/transforms/talairach.xfm']), |
| 644 | + ('nuintensitycor', ['mri/nu.mgz']), |
| 645 | + ('normalization', ['mri/T1.mgz']), |
| 646 | + ('skullstrip', |
| 647 | + ['mri/transforms/talairach_with_skull.lta', |
| 648 | + 'mri/brainmask.auto.mgz', |
| 649 | + 'mri/brainmask.mgz']), |
| 650 | + #autorecon2 |
| 651 | + ('gcareg', ['mri/transforms/talairach.lta']), |
| 652 | + ('canorm', ['mri/norm.mgz']), |
| 653 | + ('careg', ['mri/transforms/talairach.m3z']), |
| 654 | + ('careginv', ['mri/transforms/talairach.m3z.inv.x.mgz', |
| 655 | + 'mri/transforms/talairach.m3z.inv.y.mgz', |
| 656 | + 'mri/transforms/talairach.m3z.inv.z.mgz']), |
| 657 | + ('rmneck', ['mri/nu_noneck.mgz']), |
| 658 | + ('skull-lta', ['mri/transforms/talairach_with_skull_2.lta']), |
| 659 | + ('calabel', |
| 660 | + ['mri/aseg.auto_noCCseg.mgz', 'mri/aseg.auto.mgz', 'mri/aseg.mgz']), |
| 661 | + ('normalization2', ['mri/brain.mgz']), |
| 662 | + ('maskbfs', ['mri/brain.finalsurfs.mgz']), |
| 663 | + ('segmentation', ['mri/wm.asegedit.mgz', 'mri/wm.mgz']), |
| 664 | + ('fill', ['mri/filled.mgz']), |
| 665 | + ('tessellate', ['surf/lh.orig.nofix', 'surf/rh.orig.nofix']), |
| 666 | + ('smooth1', ['surf/lh.smoothwm.nofix', 'surf/rh.smoothwm.nofix']), |
| 667 | + ('inflate1', ['surf/lh.inflated.nofix', 'surf/rh.inflated.nofix']), |
| 668 | + ('qsphere', ['surf/lh.qsphere.nofix', 'surf/rh.qsphere.nofix']), |
| 669 | + ('fix', ['surf/lh.orig', 'surf/rh.orig']), |
| 670 | + ('white', |
| 671 | + ['surf/lh.white', |
| 672 | + 'surf/rh.white', |
| 673 | + 'surf/lh.curv', |
| 674 | + 'surf/rh.curv', |
| 675 | + 'surf/lh.area', |
| 676 | + 'surf/rh.area', |
| 677 | + 'label/lh.cortex.label', |
| 678 | + 'label/rh.cortex.label']), |
| 679 | + ('smooth2', ['surf/lh.smoothwm', 'surf/rh.smoothwm']), |
| 680 | + ('inflate2', |
| 681 | + ['surf/lh.inflated', |
| 682 | + 'surf/rh.inflated', |
| 683 | + 'surf/lh.sulc', |
| 684 | + 'surf/rh.sulc', |
| 685 | + 'surf/lh.inflated.H', |
| 686 | + 'surf/rh.inflated.H', |
| 687 | + 'surf/lh.inflated.K', |
| 688 | + 'surf/rh.inflated.K']), |
| 689 | + #autorecon3 |
| 690 | + ('sphere', ['surf/lh.sphere', 'surf/rh.sphere']), |
| 691 | + ('surfreg', ['surf/lh.sphere.reg', 'surf/rh.sphere.reg']), |
| 692 | + ('jacobian_white', ['surf/lh.jacobian_white', |
| 693 | + 'surf/rh.jacobian_white']), |
| 694 | + ('avgcurv', ['surf/lh.avg_curv', 'surf/rh.avg_curv']), |
| 695 | + ('cortparc', ['label/lh.aparc.annot', 'label/rh.aparc.annot']), |
| 696 | + ('pial', |
| 697 | + ['surf/lh.pial', |
| 698 | + 'surf/rh.pial', |
| 699 | + 'surf/lh.curv.pial', |
| 700 | + 'surf/rh.curv.pial', |
| 701 | + 'surf/lh.area.pial', |
| 702 | + 'surf/rh.area.pial', |
| 703 | + 'surf/lh.thickness', |
| 704 | + 'surf/rh.thickness']), |
| 705 | + ('cortparc2', ['label/lh.aparc.a2009s.annot', |
| 706 | + 'label/rh.aparc.a2009s.annot']), |
| 707 | + ('parcstats2', |
| 708 | + ['stats/lh.aparc.a2009s.stats', |
| 709 | + 'stats/rh.aparc.a2009s.stats', |
| 710 | + 'stats/aparc.annot.a2009s.ctab']), |
| 711 | + ('cortribbon', ['mri/lh.ribbon.mgz', 'mri/rh.ribbon.mgz', |
| 712 | + 'mri/ribbon.mgz']), |
| 713 | + ('segstats', ['stats/aseg.stats']), |
| 714 | + ('aparc2aseg', ['mri/aparc+aseg.mgz', 'mri/aparc.a2009s+aseg.mgz']), |
| 715 | + ('wmparc', ['mri/wmparc.mgz', 'stats/wmparc.stats']), |
| 716 | + ('balabels', ['BA.ctab', 'BA.thresh.ctab']), |
| 717 | + ('label-exvivo-ec', ['label/lh.entorhinal_exvivo.label', |
| 718 | + 'label/rh.entorhinal_exvivo.label'])] |
632 | 719 |
|
633 | 720 | def _gen_subjects_dir(self):
|
634 | 721 | return os.getcwd()
|
@@ -660,6 +747,39 @@ def _list_outputs(self):
|
660 | 747 | outputs['subjects_dir'] = subjects_dir
|
661 | 748 | return outputs
|
662 | 749 |
|
| 750 | + @property |
| 751 | + def cmdline(self): |
| 752 | + subjects_dir = self.inputs.subjects_dir |
| 753 | + if not isdefined(subjects_dir): |
| 754 | + subjects_dir = self._gen_subjects_dir() |
| 755 | + if not os.path.isdir( |
| 756 | + os.path.join(subjects_dir,self.inputs.subject_id,'mri')): |
| 757 | + return super(ReconAll, self).cmdline |
| 758 | + self._check_mandatory_inputs() |
| 759 | + skip = ['T1_files'] |
| 760 | + subjects_dir = self.inputs.subjects_dir |
| 761 | + if not isdefined(subjects_dir): |
| 762 | + subjects_dir = self._gen_subjects_dir() |
| 763 | + flags = [] |
| 764 | + directive = 'all' |
| 765 | + for idx, step in enumerate(self._steps): |
| 766 | + step, outfiles = step |
| 767 | + if all([os.path.exists(os.path.join(subjects_dir,self.inputs.subject_id,f)) for f in outfiles]): |
| 768 | + flags.append('-no%s'%step) |
| 769 | + if idx > 4: |
| 770 | + directive = 'autorecon2' |
| 771 | + elif idx > 23: |
| 772 | + directive = 'autorecon3' |
| 773 | + else: |
| 774 | + flags.append('-%s'%step) |
| 775 | + self.inputs.args = ' '.join([self.inputs.args] + flags) |
| 776 | + self.inputs.directive = directive |
| 777 | + allargs = self._parse_inputs(skip=skip) |
| 778 | + allargs.insert(0, self.cmd) |
| 779 | + cmd = ' '.join(allargs) |
| 780 | + iflogger.info('resume recon-all : %s'%cmd) |
| 781 | + return cmd |
| 782 | + |
663 | 783 |
|
664 | 784 | class BBRegisterInputSpec(FSTraitedSpec):
|
665 | 785 | subject_id = traits.Str(argstr='--s %s',
|
|
0 commit comments