From 1b5ddf77c9c7ebf59967611ade831623649ab1d1 Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Mon, 5 Mar 2012 22:58:03 -0500 Subject: [PATCH 01/35] Adding the functionality of VBM8 into the workflow. Also made some modifications for error handling in the way we exit bash script. If exiting on error then we delete any shell script or matlab script code written - @rcwelsh --- spm8Batch/auxiliary/case_error | 2 +- spm8Batch/auxiliary/case_run_number | 2 +- spm8Batch/auxiliary/checkInputForSubjects | 2 +- spm8Batch/auxiliary/checkVBMParts | 14 + spm8Batch/auxiliary/checkVBMParts~ | 14 + spm8Batch/auxiliary/commonCode_VBM8_01 | 8 + spm8Batch/auxiliary/coregDirectoryErrorCheck | 2 +- spm8Batch/auxiliary/coregFindSourceAndMove | 4 +- spm8Batch/auxiliary/coregPrepOtherImages | 4 +- spm8Batch/auxiliary/exit_w_removal | 36 +++ spm8Batch/auxiliary/exit_w_removal~ | 0 .../auxiliary/help/help_vbm8HiRes_Options | 6 + .../auxiliary/help/help_vbm8HiRes_Options~ | 7 + .../auxiliary/help/help_warpfMRI_Options | 1 + spm8Batch/auxiliary/help/vbm8HiRes_Help | 18 ++ spm8Batch/auxiliary/help/vbm8HiRes_Help~ | 19 ++ spm8Batch/auxiliary/initialization_vbm8HiRes | 16 + spm8Batch/auxiliary/parse_arguments | 23 +- spm8Batch/auxiliary/parse_arguments_end | 15 - spm8Batch/auxiliary/parse_arguments_start | 24 -- spm8Batch/auxiliary/parse_case_code | 209 ------------- spm8Batch/auxiliary/setAnatomyPath | 2 +- spm8Batch/auxiliary/setBestBET | 4 +- spm8Batch/auxiliary/setCoRegPath | 2 +- spm8Batch/auxiliary/setFunctionalPath | 2 +- spm8Batch/auxiliary/setFunctionalSubPathName | 2 +- spm8Batch/auxiliary/setGenericFileName | 4 +- spm8Batch/auxiliary/setGradientValue | 2 +- spm8Batch/auxiliary/setMCFlirtOptions | 2 +- spm8Batch/auxiliary/setOtherNames | 4 +- spm8Batch/auxiliary/setOutputName | 2 +- spm8Batch/auxiliary/setPhysioName | 2 +- spm8Batch/auxiliary/setPhysioOptions | 10 +- spm8Batch/auxiliary/setRunList | 2 +- spm8Batch/auxiliary/setStandardVolumeNumber | 2 +- spm8Batch/auxiliary/setSubjectsMasterDir | 4 +- spm8Batch/auxiliary/setUserEmail | 2 +- spm8Batch/auxiliary/setVolumeTR | 2 +- spm8Batch/auxiliary/setVolumeWildCar | 9 - spm8Batch/auxiliary/setVolumeWildCard | 2 +- spm8Batch/auxiliary/setVoxelSize | 2 +- spm8Batch/auxiliary/verifyTargetImage | 8 +- spm8Batch/auxiliary/warpPrepOtherImages | 4 +- spm8Batch/matlabScripts/UMBatchVBM8.m | 154 ++++++++++ spm8Batch/matlabScripts/UMBatchVBM8.m~ | 279 +++++++++++++++++ spm8Batch/matlabScripts/UMBatchWarp.m | 7 +- spm8Batch/matlabScripts/UMBatchWarpVBM8.m | 279 +++++++++++++++++ spm8Batch/matlabScripts/UMBatchWarpVBM8.m~ | 285 ++++++++++++++++++ spm8Batch/parts/vbm8_part_01.m | 43 +++ spm8Batch/parts/vbm8_part_02.m | 44 +++ spm8Batch/parts/vbm8_part_02.m~ | 43 +++ spm8Batch/vbm8HiRes | 165 ++++++++++ spm8Batch/vbm8HiRes~ | 156 ++++++++++ 53 files changed, 1653 insertions(+), 303 deletions(-) create mode 100644 spm8Batch/auxiliary/checkVBMParts create mode 100644 spm8Batch/auxiliary/checkVBMParts~ create mode 100644 spm8Batch/auxiliary/commonCode_VBM8_01 create mode 100644 spm8Batch/auxiliary/exit_w_removal create mode 100644 spm8Batch/auxiliary/exit_w_removal~ create mode 100644 spm8Batch/auxiliary/help/help_vbm8HiRes_Options create mode 100644 spm8Batch/auxiliary/help/help_vbm8HiRes_Options~ create mode 100644 spm8Batch/auxiliary/help/vbm8HiRes_Help create mode 100644 spm8Batch/auxiliary/help/vbm8HiRes_Help~ create mode 100644 spm8Batch/auxiliary/initialization_vbm8HiRes delete mode 100644 spm8Batch/auxiliary/parse_arguments_end delete mode 100644 spm8Batch/auxiliary/parse_arguments_start delete mode 100644 spm8Batch/auxiliary/parse_case_code delete mode 100755 spm8Batch/auxiliary/setVolumeWildCar create mode 100644 spm8Batch/matlabScripts/UMBatchVBM8.m create mode 100644 spm8Batch/matlabScripts/UMBatchVBM8.m~ create mode 100644 spm8Batch/matlabScripts/UMBatchWarpVBM8.m create mode 100644 spm8Batch/matlabScripts/UMBatchWarpVBM8.m~ create mode 100644 spm8Batch/parts/vbm8_part_01.m create mode 100644 spm8Batch/parts/vbm8_part_02.m create mode 100644 spm8Batch/parts/vbm8_part_02.m~ create mode 100755 spm8Batch/vbm8HiRes create mode 100644 spm8Batch/vbm8HiRes~ diff --git a/spm8Batch/auxiliary/case_error b/spm8Batch/auxiliary/case_error index 5aa6bcf1..d4705cac 100644 --- a/spm8Batch/auxiliary/case_error +++ b/spm8Batch/auxiliary/case_error @@ -3,4 +3,4 @@ # *) . ${thisDir}/auxiliary/caseError - exit 1 + . ${thisDir}/auxiliary/exit_w_removal diff --git a/spm8Batch/auxiliary/case_run_number b/spm8Batch/auxiliary/case_run_number index 23186362..87a704c1 100644 --- a/spm8Batch/auxiliary/case_run_number +++ b/spm8Batch/auxiliary/case_run_number @@ -7,7 +7,7 @@ if (( $argn >= $args )) then echo "Missing parameter for run number, aborting" - exit 0 + . ${thisDir}/auxiliary/exit_w_removal else runNAMES[$nRUN]=$1 let nRUN++ diff --git a/spm8Batch/auxiliary/checkInputForSubjects b/spm8Batch/auxiliary/checkInputForSubjects index 5bc87640..cf46bdc2 100644 --- a/spm8Batch/auxiliary/checkInputForSubjects +++ b/spm8Batch/auxiliary/checkInputForSubjects @@ -1,6 +1,6 @@ if (( ${#subjects[@]} < 1 )) then . ${thisDir}/auxiliary/noSubjectsErrorMsg - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi diff --git a/spm8Batch/auxiliary/checkVBMParts b/spm8Batch/auxiliary/checkVBMParts new file mode 100644 index 00000000..18006351 --- /dev/null +++ b/spm8Batch/auxiliary/checkVBMParts @@ -0,0 +1,14 @@ +# validate that we have what we need. + +for CRITICALMATLAB in vbm8_part_01.m vbm8_part_02.m +do + if [ ! -e "${SPM8B2}/parts/${CRITICALMATLAB}" ] + then + echo + echo "Validate that you have 'vbm8_part_01.m' and 'vbm_part_02.m' " + echo "Missing a critical component '${CRITICALMATLAB}'" + echo + exit 0 + fi +done + diff --git a/spm8Batch/auxiliary/checkVBMParts~ b/spm8Batch/auxiliary/checkVBMParts~ new file mode 100644 index 00000000..e463b0e5 --- /dev/null +++ b/spm8Batch/auxiliary/checkVBMParts~ @@ -0,0 +1,14 @@ +# validate that we have what we need. + +for CRITICALMATLAB in warp_part_1.m warp_fMRI_part_2.m warp_HIRES_part_2.m +do + if [ ! -e "${SPM8B2}/parts/${CRITICALMATLAB}" ] + then + echo + echo "Validate that you have 'warp_part_1.m' and 'warp_part_2.m' " + echo "Missing a critical component '${CRITICALMATLAB}'" + echo + exit 0 + fi +done + diff --git a/spm8Batch/auxiliary/commonCode_VBM8_01 b/spm8Batch/auxiliary/commonCode_VBM8_01 new file mode 100644 index 00000000..b96ff48f --- /dev/null +++ b/spm8Batch/auxiliary/commonCode_VBM8_01 @@ -0,0 +1,8 @@ +# validate that we have what we need. + +. ${thisDir}/auxiliary/checkVBM8Parts + +# Initialize warping variables. + +. ${thisDir}/auxiliary/initialization_all + diff --git a/spm8Batch/auxiliary/coregDirectoryErrorCheck b/spm8Batch/auxiliary/coregDirectoryErrorCheck index f5dd4488..183abf53 100755 --- a/spm8Batch/auxiliary/coregDirectoryErrorCheck +++ b/spm8Batch/auxiliary/coregDirectoryErrorCheck @@ -5,6 +5,6 @@ echo echo " ABORTING " echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi diff --git a/spm8Batch/auxiliary/coregFindSourceAndMove b/spm8Batch/auxiliary/coregFindSourceAndMove index 2f9203d1..286b6b67 100755 --- a/spm8Batch/auxiliary/coregFindSourceAndMove +++ b/spm8Batch/auxiliary/coregFindSourceAndMove @@ -52,7 +52,7 @@ echo echo "ABORTING" echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi if [ -e "${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${anatomyPATH}/${SOURCENAME}${USEEXT}" ] @@ -67,7 +67,7 @@ echo echo "ABORTING" echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi fileLIST=`ls -1 ${destSOURCENAME}* | wc |awk '{print $1}'` diff --git a/spm8Batch/auxiliary/coregPrepOtherImages b/spm8Batch/auxiliary/coregPrepOtherImages index 3cd28712..0972e8b1 100755 --- a/spm8Batch/auxiliary/coregPrepOtherImages +++ b/spm8Batch/auxiliary/coregPrepOtherImages @@ -57,7 +57,7 @@ do echo echo ABORTING echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi otherSOURCE=${otherSRCNAME}${USEEXT} @@ -84,7 +84,7 @@ do echo echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi done fi diff --git a/spm8Batch/auxiliary/exit_w_removal b/spm8Batch/auxiliary/exit_w_removal new file mode 100644 index 00000000..0cf1a6aa --- /dev/null +++ b/spm8Batch/auxiliary/exit_w_removal @@ -0,0 +1,36 @@ + +# +# We must do a graceful exit and clean up everthing that was possibly written. +# + +echo +echo "An error was found in your data and/or parameter specification, se we can not proceed. Going to now" +echo "gently remove any script files partially written." +echo + +if [ ! -z ${FULLSCRIPTNAME} ] +then + for EXT in sh m log + do + if [ -e ${FULLSCRIPTNAME}.${EXT} ] + then + echo -n "Found '${FULLSCRIPTNAME}.${EXT}', removing...." + rm ${FULLSCRIPTNAME}.${EXT} 2> /dev/null + echo + fi + done +fi + +# +# Now exiting +# + +echo +echo "Clean up finished, now exiting." +echo + +exit 1 + +# +# all done. +# \ No newline at end of file diff --git a/spm8Batch/auxiliary/exit_w_removal~ b/spm8Batch/auxiliary/exit_w_removal~ new file mode 100644 index 00000000..e69de29b diff --git a/spm8Batch/auxiliary/help/help_vbm8HiRes_Options b/spm8Batch/auxiliary/help/help_vbm8HiRes_Options new file mode 100644 index 00000000..b6bae34b --- /dev/null +++ b/spm8Batch/auxiliary/help/help_vbm8HiRes_Options @@ -0,0 +1,6 @@ + echo "${helpComment} anatomy path : $anatomyPATH" + echo "${helpComment} name of hisres image : $HIRESNAME" + echo "${helpComment} directory to vbm8 : $anatomyPATH/$coregPATH/" + echo + + . ${thisDir}/auxiliary/help/help_options_end diff --git a/spm8Batch/auxiliary/help/help_vbm8HiRes_Options~ b/spm8Batch/auxiliary/help/help_vbm8HiRes_Options~ new file mode 100644 index 00000000..427f3b61 --- /dev/null +++ b/spm8Batch/auxiliary/help/help_vbm8HiRes_Options~ @@ -0,0 +1,7 @@ + echo "${helpComment} anatomy path : $anatomyPATH" + echo "${helpComment} name of hisres image : $HIRESNAME" + echo "${helpComment} BET gradient : $BETGRADIENT" + echo "${helpComment} BET gradient name : $BETNAME" + echo + + . ${thisDir}/auxiliary/help/help_options_end diff --git a/spm8Batch/auxiliary/help/help_warpfMRI_Options b/spm8Batch/auxiliary/help/help_warpfMRI_Options index f53b4711..402cff88 100644 --- a/spm8Batch/auxiliary/help/help_warpfMRI_Options +++ b/spm8Batch/auxiliary/help/help_warpfMRI_Options @@ -1,5 +1,6 @@ echo "${helpComment} directory to coreg : ${fmriPATH}/$coregPATH/" echo "${helpComment} name of the high res : $HIRESNAME" + echo "${helpComment} Warping Method (1=VBM8) : ${WARPMETHOD}" echo "${helpComment} template image dir/name : ${TemplateImage}" echo "${helpComment} prepending name : $outputName" echo "${helpComment} Voxel dimension (0=spm) : ${voxelSize}" diff --git a/spm8Batch/auxiliary/help/vbm8HiRes_Help b/spm8Batch/auxiliary/help/vbm8HiRes_Help new file mode 100644 index 00000000..9900f7ed --- /dev/null +++ b/spm8Batch/auxiliary/help/vbm8HiRes_Help @@ -0,0 +1,18 @@ + echo + echo " A command line command to drive batch processing to VBM8 the 'HIRES' image." + echo + . ${thisDir}/auxiliary/help/help_options_start + + echo + echo " e.g. " + echo + echo " To process the image 'ht1spgr.nii' through VBM8 to create a skull-stripped" + echo " image in the native space do: + echo + echo " vbm8HiRes 050126zz" + echo + echo + echo " Current command default configuration is:" + echo + + . ${thisDir}/auxiliary/help/help_vbm8HiRes_Options diff --git a/spm8Batch/auxiliary/help/vbm8HiRes_Help~ b/spm8Batch/auxiliary/help/vbm8HiRes_Help~ new file mode 100644 index 00000000..92736184 --- /dev/null +++ b/spm8Batch/auxiliary/help/vbm8HiRes_Help~ @@ -0,0 +1,19 @@ + echo + echo " A command line command to drive batch processing to coregister the 'HIRES'" + echo " to 'overlay' analyze image. " + echo + . ${thisDir}/auxiliary/help/help_options_start + + echo + echo " e.g. " + echo + echo " To coregister the 'het1spgr.img' to the 'het1overlay.img' that has been coreg'd" + echo " to the fMRI times series and to drop the results in 'func/MSIT/coReg' :" + echo + echo " coregSPGR -w MSIT/coReg 050126zz" + echo + echo + echo " Current command default configuration is:" + echo + + . ${thisDir}/auxiliary/help/help_coregHiRes_Options diff --git a/spm8Batch/auxiliary/initialization_vbm8HiRes b/spm8Batch/auxiliary/initialization_vbm8HiRes new file mode 100644 index 00000000..0da1e6c8 --- /dev/null +++ b/spm8Batch/auxiliary/initialization_vbm8HiRes @@ -0,0 +1,16 @@ +# +# Inialization. +# + +# we do things in the top level of the subject, so not +# in the func directory. + +fmriPATH=./ + +# Output directory + +coregPATH=anatomy/vbm8/ + +# +# all done +# diff --git a/spm8Batch/auxiliary/parse_arguments b/spm8Batch/auxiliary/parse_arguments index dcde2802..86289e2d 100644 --- a/spm8Batch/auxiliary/parse_arguments +++ b/spm8Batch/auxiliary/parse_arguments @@ -2,6 +2,12 @@ # Parse the arguments # +# permitted arguments +# +# AabDdFfghiMmnOopPRrSsTtUuVvwZ# +# +# + while (( $argn < $args )) do # @@ -32,7 +38,7 @@ do echo echo "Option : $curParam : is not allowed for ${thisCommand}" echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi case "${curParam:1:1}" in @@ -260,6 +266,13 @@ do . ${thisDir}/auxiliary/setCoRegPath ;; + # case_warp_method + # + # Use VBM8 for warping + # + "W") + . ${thisDir}/auxillary/setWarpMethod + ;; # case_voxel_size # # Voxel size @@ -278,7 +291,7 @@ do if (( $argn >= $args )) then echo "Missing parameter for run number, aborting" - exit 0 + . ${thisDir}/auxiliary/exit_w_removal else runNAMES[$nRUN]=$1 let nRUN++ @@ -291,7 +304,7 @@ do # *) . ${thisDir}/auxiliary/caseError - exit 1 + . ${thisDir}/auxiliary/exit_w_removal esac else @@ -307,14 +320,14 @@ do echo -e "\a" echo "Parameter number ${nParam} with a value of $1 is not a valid number" echo "Buggering out" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi else # # It is not a directory and not an option, so it will be an error. # . ${thisDir}/auxiliary/unrecognizedArgument - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi fi fi diff --git a/spm8Batch/auxiliary/parse_arguments_end b/spm8Batch/auxiliary/parse_arguments_end deleted file mode 100644 index 2c18937f..00000000 --- a/spm8Batch/auxiliary/parse_arguments_end +++ /dev/null @@ -1,15 +0,0 @@ - esac - else - # - # It is not a directory and not an option, so it will be an error. - # - . ${thisDir}/auxiliary/unrecognizedArgument - exit 1 - fi - fi - # - # get the next argument. - # - shift - let argn++ -done diff --git a/spm8Batch/auxiliary/parse_arguments_start b/spm8Batch/auxiliary/parse_arguments_start deleted file mode 100644 index 3ef131fb..00000000 --- a/spm8Batch/auxiliary/parse_arguments_start +++ /dev/null @@ -1,24 +0,0 @@ -# -# Parse the arguments -# - -while (( $argn < $args )) - do - # - # If a directory then we assume it is a subject, - # this means you need to specify the subject - # master directory first. ( SUBJDIR ) - # - if [ -d "./${SUBJDIR}/$1" ] - then - let nSubjects++ - subjects[${nSubjects}]=$1 - else - # - # Else it could be an option flag. - # - curParam=$1 - # Check to see if option - if [ "${curParam:0:1}" == "-" ] - then - case "${curParam:1:1}" in diff --git a/spm8Batch/auxiliary/parse_case_code b/spm8Batch/auxiliary/parse_case_code deleted file mode 100644 index 23ecd8df..00000000 --- a/spm8Batch/auxiliary/parse_case_code +++ /dev/null @@ -1,209 +0,0 @@ - - # case_all_runs - # - # All runs in func - # - "A") - ALLRUNSFLAG=1 - ;; - - # case_anatomy_path - # - # Path name to find virgin anatomy files. - # - "a") - . ${thisDir}/auxiliary/setAnatomyPath - ;; - - # case_debug_flag - # - # debug flag - # - "d") - . ${thisDir}/auxiliary/setDebugFlag - ;; - - # case_super_debug_flag - # - # super debug flag - # - "D") - . ${thisDir}/auxiliary/setSuperDebugFlag - ;; - - # case_fmri_tr - # - # Set the TR - # - "F") - . ${thisDir}/auxiliary/setVolumeTR - ;; - - # case_functional_path - # - # Path name to search for functional images. - # - "f") - . ${thisDir}/auxiliary/setFunctionalPath - ;; - - # case_hires_name - # - # SPGR (hiRES) name to use - # - "h") - . ${thisDir}/auxiliary/setHiResName - ;; - - # case_set_run - # - # run list - # - "i") - . ${thisDir}/auxiliary/setRunList - ;; - - # case_subject_dir - # - # subject directory name to use - # - "M") - . ${thisDir}/auxiliary/setSubjectsMasterDir - ;; - - # case_flirt_options - # - # find the flirt options - # - "m") - . ${thisDir}/auxiliary/setMCFlirtOptions - ;; - - # case_output_name - # - # Set the name to add. - # - "n") - . ${thisDir}/auxiliary/setOutputName - ;; - - # case_other_names - # - # Simliar Other images - # - "O") - . ${thisDir}/auxiliary/setOtherNames - ;; - - # case_overlay_name - # - # overlay name to use - # - "o") - . ${thisDir}/auxiliary/setOverlayName - ;; - - # case_reslice_2 - # - # reslice the geometry only with no estimation? - # - "R") - resliceFLAG=2 - ;; - - # case_reslice_1 - # - # reslice the geometry? - # - "r") - resliceFLAG=1 - ;; - - # case_standard_volume - # - # find the standard volume number. - # - "S") - . ${thisDir}/auxiliary/setStandardVolumeNumber - ;; - - # case_sub_path - # - # sub-Path name to search for functional images. - # - "s") - . ${thisDir}/auxiliary/setFunctionalSubPathName - ;; - - # case_template_name - # - # Template Image. - # - "T") - . ${thisDir}/auxiliary/setTemplateImageName - ;; - - # case_test_flag - # - # Test FLAG - # - "t") - . ${thisDir}/auxiliary/setTestFlag - ;; - - # case_user_email - # - # Where to send email when finished - # - "U") - . ${thisDir}/auxiliary/setUserEmail - ;; - - # case_volume_name - # - # wildcard name to use for which to co-reg. - # - "v") - . ${thisDir}/auxiliary/setVolumeWildCard - ;; - - # case_coreg_path - # - # Path name to place coregistration results. - # - "w") - . ${thisDir}/auxiliary/setCoRegPath - ;; - - # case_voxel_size - # - # Voxel size - # - "z") - . ${thisDir}/auxiliary/setVoxelSize - ;; - - # case_run_number - # - # run numbers - # - "#") - shift - let argn++ - if (( $argn >= $args )) - then - echo "Missing parameter for run number, aborting" - exit 0 - else - runNAMES[$nRUN]=$1 - let nRUN++ - fi - ;; - - # case_error - # - # Anything should result in an error. - # - *) - . ${thisDir}/auxiliary/caseError - exit 1 diff --git a/spm8Batch/auxiliary/setAnatomyPath b/spm8Batch/auxiliary/setAnatomyPath index 8f022a91..d210f83a 100755 --- a/spm8Batch/auxiliary/setAnatomyPath +++ b/spm8Batch/auxiliary/setAnatomyPath @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for path name, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else anatomyPATH=$1 fi diff --git a/spm8Batch/auxiliary/setBestBET b/spm8Batch/auxiliary/setBestBET index 66b35dca..67544df4 100644 --- a/spm8Batch/auxiliary/setBestBET +++ b/spm8Batch/auxiliary/setBestBET @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for best BET threshold" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else USEBETBEST=$1 isnumber ${USEBETBEST} @@ -13,6 +13,6 @@ echo -e "\a" echo "Parameter $1 is not a valid number" echo "Buggering out" - exit 0 + . ${thisDir}/auxiliary/exit_w_removal fi fi diff --git a/spm8Batch/auxiliary/setCoRegPath b/spm8Batch/auxiliary/setCoRegPath index efed29b0..35953e49 100755 --- a/spm8Batch/auxiliary/setCoRegPath +++ b/spm8Batch/auxiliary/setCoRegPath @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for path name to place results, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else coregPATH=$1 fi diff --git a/spm8Batch/auxiliary/setFunctionalPath b/spm8Batch/auxiliary/setFunctionalPath index 5ef11119..8e538c6c 100755 --- a/spm8Batch/auxiliary/setFunctionalPath +++ b/spm8Batch/auxiliary/setFunctionalPath @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for functional path name, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else fmriPATH=$1 fi diff --git a/spm8Batch/auxiliary/setFunctionalSubPathName b/spm8Batch/auxiliary/setFunctionalSubPathName index 2a06072e..71048b8f 100755 --- a/spm8Batch/auxiliary/setFunctionalSubPathName +++ b/spm8Batch/auxiliary/setFunctionalSubPathName @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for path name, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else subPATH=$1 fi diff --git a/spm8Batch/auxiliary/setGenericFileName b/spm8Batch/auxiliary/setGenericFileName index a7ca00ad..016d6339 100755 --- a/spm8Batch/auxiliary/setGenericFileName +++ b/spm8Batch/auxiliary/setGenericFileName @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for overlay name, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else FILENAME=$1 fi @@ -15,5 +15,5 @@ echo echo "ABORTING" echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi diff --git a/spm8Batch/auxiliary/setGradientValue b/spm8Batch/auxiliary/setGradientValue index a10623aa..9406471d 100644 --- a/spm8Batch/auxiliary/setGradientValue +++ b/spm8Batch/auxiliary/setGradientValue @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for setting the gradient for BET" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else BETGRADIENT=$1 . ${thisDir}/auxiliary/calcBETname diff --git a/spm8Batch/auxiliary/setMCFlirtOptions b/spm8Batch/auxiliary/setMCFlirtOptions index 49144c22..ac2062d7 100755 --- a/spm8Batch/auxiliary/setMCFlirtOptions +++ b/spm8Batch/auxiliary/setMCFlirtOptions @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing mcflirt options, aborting" - exit 0 + . ${thisDir}/auxiliary/exit_w_removal else mcOPT=$1 fi diff --git a/spm8Batch/auxiliary/setOtherNames b/spm8Batch/auxiliary/setOtherNames index 7eaf2509..0a583483 100644 --- a/spm8Batch/auxiliary/setOtherNames +++ b/spm8Batch/auxiliary/setOtherNames @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for other image name, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else otherName[$iother]=$1 let iother++ @@ -24,7 +24,7 @@ echo echo "ABORTING" echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi otherName[$iother]=${FILENAME} otherExt[$iother]=${FILEEXT} diff --git a/spm8Batch/auxiliary/setOutputName b/spm8Batch/auxiliary/setOutputName index 9721b8e4..606fb2d3 100755 --- a/spm8Batch/auxiliary/setOutputName +++ b/spm8Batch/auxiliary/setOutputName @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for output name, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else outputName=$1 fi diff --git a/spm8Batch/auxiliary/setPhysioName b/spm8Batch/auxiliary/setPhysioName index e3fa1a54..085383a1 100644 --- a/spm8Batch/auxiliary/setPhysioName +++ b/spm8Batch/auxiliary/setPhysioName @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for physio xref table name, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else PHYSIOTABLE=$1 fi diff --git a/spm8Batch/auxiliary/setPhysioOptions b/spm8Batch/auxiliary/setPhysioOptions index 0aaede08..e819d0c6 100644 --- a/spm8Batch/auxiliary/setPhysioOptions +++ b/spm8Batch/auxiliary/setPhysioOptions @@ -4,7 +4,7 @@ then echo echo "Missing physio options, aborting" - exit 0 + . ${thisDir}/auxiliary/exit_w_removal else PHYSIOOPTIONS="$1" fi @@ -16,7 +16,7 @@ then echo echo "You need to specifiy three options: 'rate', 'disdaq' and 'down', aborting" - exit 0 + . ${thisDir}/auxiliary/exit_w_removal fi for IELE in 0 1 2 do @@ -27,7 +27,7 @@ echo echo "Physio Option '$THISOPTION' missing assignment (=), aborting" echo - exit 0 + . ${thisDir}/auxiliary/exit_w_removal fi OPTIONVARIABLE=`echo $THISOPTION | awk -F= '{print $1}'` OPTIONVALUE=`echo $THISOPTION | awk -F= '{print $2}'` @@ -37,7 +37,7 @@ echo echo "Physio Option '$OPTIONVARIABLE' not recognized, needs to be either 'down', 'disdaq', or 'rate', aborting" echo - exit 0 + . ${thisDir}/auxiliary/exit_w_removal fi done # @@ -52,6 +52,6 @@ echo echo "You need to specifiy threee: 'rate','disdaq', and 'down', aborting" echo - exit 0 + . ${thisDir}/auxiliary/exit_w_removal fi done diff --git a/spm8Batch/auxiliary/setRunList b/spm8Batch/auxiliary/setRunList index cb19e716..9d4c6b37 100755 --- a/spm8Batch/auxiliary/setRunList +++ b/spm8Batch/auxiliary/setRunList @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing run list option, abortin." - exit 0 + . ${thisDir}/auxiliary/exit_w_removal else runLIST=$1 run0=`echo ${runLIST} | awk -F- '{print $1}'` diff --git a/spm8Batch/auxiliary/setStandardVolumeNumber b/spm8Batch/auxiliary/setStandardVolumeNumber index 599c991d..1a6eba70 100755 --- a/spm8Batch/auxiliary/setStandardVolumeNumber +++ b/spm8Batch/auxiliary/setStandardVolumeNumber @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing standard volume number, aborting" - exit 0 + . ${thisDir}/auxiliary/exit_w_removal else standardVolume=$1 fi diff --git a/spm8Batch/auxiliary/setSubjectsMasterDir b/spm8Batch/auxiliary/setSubjectsMasterDir index ba2656e9..36ff170e 100755 --- a/spm8Batch/auxiliary/setSubjectsMasterDir +++ b/spm8Batch/auxiliary/setSubjectsMasterDir @@ -3,12 +3,12 @@ if (( $argn >= $args )) then echo "Missing parameter for subject directory." - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else SUBJDIR=$1 if [ ! -d "${SUBJDIR}" ] then echo "The master subject directory that you have specified does not exist." - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi fi diff --git a/spm8Batch/auxiliary/setUserEmail b/spm8Batch/auxiliary/setUserEmail index 38339249..77d7816f 100755 --- a/spm8Batch/auxiliary/setUserEmail +++ b/spm8Batch/auxiliary/setUserEmail @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for user email name, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else USEREMAIL=$1 fi diff --git a/spm8Batch/auxiliary/setVolumeTR b/spm8Batch/auxiliary/setVolumeTR index 1b70f343..e355204a 100644 --- a/spm8Batch/auxiliary/setVolumeTR +++ b/spm8Batch/auxiliary/setVolumeTR @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for volume TR, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else TR=$1 fi diff --git a/spm8Batch/auxiliary/setVolumeWildCar b/spm8Batch/auxiliary/setVolumeWildCar deleted file mode 100755 index 3e8689a2..00000000 --- a/spm8Batch/auxiliary/setVolumeWildCar +++ /dev/null @@ -1,9 +0,0 @@ - shift - let argn++ - if (( $argn >= $args )) - then - echo "Missing parameter for volume name functional, aborting" - exit 1 - else - volumeWILD=$1 - fi diff --git a/spm8Batch/auxiliary/setVolumeWildCard b/spm8Batch/auxiliary/setVolumeWildCard index 3e8689a2..a1fdd6b7 100755 --- a/spm8Batch/auxiliary/setVolumeWildCard +++ b/spm8Batch/auxiliary/setVolumeWildCard @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for volume name functional, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else volumeWILD=$1 fi diff --git a/spm8Batch/auxiliary/setVoxelSize b/spm8Batch/auxiliary/setVoxelSize index ee9c6c82..b900c605 100755 --- a/spm8Batch/auxiliary/setVoxelSize +++ b/spm8Batch/auxiliary/setVoxelSize @@ -3,7 +3,7 @@ if (( $argn >= $args )) then echo "Missing parameter for voxel size, aborting" - exit 1 + . ${thisDir}/auxiliary/exit_w_removal else voxelSize=$1 fi diff --git a/spm8Batch/auxiliary/verifyTargetImage b/spm8Batch/auxiliary/verifyTargetImage index 4fc2791f..69286278 100755 --- a/spm8Batch/auxiliary/verifyTargetImage +++ b/spm8Batch/auxiliary/verifyTargetImage @@ -10,9 +10,11 @@ # image really exists, else we bugger out with error. # + # For now SPM8 can NOT handle nift-gz images, only nifti. - @rcwelsh + if [ -z ${TARGETEXT} ] then - for EXT in .nii.gz .nii + for EXT in .nii do if [ -e "${TARGETNAME}${EXT}" ] then @@ -32,7 +34,7 @@ echo echo "ABORTING" echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi if [ ! -e "${TARGETNAME}${USEEXT}" ] @@ -42,7 +44,7 @@ echo echo "ABORTING" echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi TARGETIMG=${TARGETNAME}${USEEXT} diff --git a/spm8Batch/auxiliary/warpPrepOtherImages b/spm8Batch/auxiliary/warpPrepOtherImages index 5ad25da9..84d65016 100644 --- a/spm8Batch/auxiliary/warpPrepOtherImages +++ b/spm8Batch/auxiliary/warpPrepOtherImages @@ -56,7 +56,7 @@ do echo echo ABORTING echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi otherSOURCE=${otherSRCNAME}${USEEXT} @@ -82,7 +82,7 @@ do echo echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " echo - exit 1 + . ${thisDir}/auxiliary/exit_w_removal fi done fi diff --git a/spm8Batch/matlabScripts/UMBatchVBM8.m b/spm8Batch/matlabScripts/UMBatchVBM8.m new file mode 100644 index 00000000..fcd74b16 --- /dev/null +++ b/spm8Batch/matlabScripts/UMBatchVBM8.m @@ -0,0 +1,154 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Robert C. Welsh +% Ann Arbor Michigan, USA +% +% March 2005-2011 +% Copyright. +% +% UMBatchWarp +% +% A drivable routine for warping some images using the +% batch options of spm2. +% +% Version 2.0 +% +% This should ONLY BE CALLED BY UMBatchWarp and NOT directly. +% +% Call as : +% +% function results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +% +% To Make this work you need to provide the following input: +% +% ParamImage = Image to determine warping parameters. +% ObjectMask = Masking Image. +% Images2Write = Images to write normalize. +% TestFlag = Flag to test file existance but do nothing. +% +% If the TemplateImage is blank then we are doing "Write Normalized Only" +% +% If Images2Write is blank then we are doing "Determine Parameters Only" +% +% If ObjectMask = [] or '' then no masking. +% +% ParamImage CAN NOT BE BLANK and must exist, as must its "_sn.mat" file. +% +% If TestFlag = 0 then execute, else just test files. +% +% Output +% +% results = -1 if failure +% # of seconds to execute. +% +% If you wish to use any normalization parameters other than the default +% you must set them yourself! +% +% You should make call to UMBatchPrep first. +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function results = UMBatchVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); + +% Get the defaults from SPM. + +global defaults +global vbm8 + +if isempty(vbm8) + if exist('cg_vbm8_defaults') == 0 + fprintf('\n\n* * * * * * * * * * * * \n\n'); + fprintf(' FATAL ERROR \n'); + fprintf(' You do no have the VBM8 toolbox\n'); + fprintf('\n\n* * * * * * * * * * * * \n\n'); + exit + else + fprintf('\nConfiguring VBM8 to defaults\n'); + cg_vbm8_defaults + end +end + +% Make the call to prepare the system for batch processing. + +UMBatchPrep + +fprintf('Entering UMBatchVBM8 V2.0 SPM8 Compatible\n'); + +if TestFlag~=0 + fprintf('\nTesting only, no work to be done\n\n'); +end + +% +% Set the return status to -1, that is error by default. +% + +results = -1; + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +% +% Make sure that the ParamImage is there. +% + +tic; + +if isempty(ParamImage) | exist(ParamImage) == 0 + fprintf('\n\nThe Parameter Image Must EXIST!\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + +% We need to make sure tha the VBM8 toolbox is present. + +if exist('spm_vbm8.m') ~= 2 + fprintf('\n\n* * * * * * MISSING THE VBM8 TOOLBOX * * * * * * \n') + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + +clear matlabbatch + +matlabbatch{1}.spm.tools.vmb8.estwrite.data = {[ParamImage ',1']}; +matlabbatch{1}.spm.tools.vbm8.estwrite.opts = vbm8.opts; +matlabbatch{1}.spm.tools.vbm8.estwrite.output = vbm8.output; + +% But now we also turn on ALL native output. + +matlabbatch{1}.spm.tools.vbm8.estwrite.output.GM.native = 1; +matlabbatch{1}.spm.tools.vbm8.estwrite.output.GM.warped = 1; + +matlabbatch{1}.spm.tools.vbm8.estwrite.output.WM.native = 1; +matlabbatch{1}.spm.tools.vbm8.estwrite.output.WM.warped = 1; + +matlabbatch{1}.spm.tools.vbm8.estwrite.output.CSF.native = 1; +matlabbatch{1}.spm.tools.vbm8.estwrite.output.CSF.warped = 1; + +matlabbatch{1}.spm.tools.vbm8.estwrite.output.bias.native = 1; +matlabbatch{1}.spm.tools.vbm8.estwrite.output.bias.warped = 1; + +matlabbatch{1}.spm.tools.vbm8.estwrite.output.label.native = 1; +matlabbatch{1}.spm.tools.vbm8.estwrite.output.label.warped = 1; + +matlabbatch{1}.spm.tools.vbm8.estwrite.output.warps = [1 0]; + +% Now the extopts. + +matlabbatch{1}.spm.tools.vbm8.estwrite.extopts.dartelwarp.normhigh.darteltpm = vbm8.extopts.darteltpm; + +matlabbatch{1}.spm.tools.vbm8.estwrite.extopts.sanlm = 2; +matlabbatch{1}.spm.tools.vbm8.estwrite.extopts.mrf = 0.15; +matlabbatch{1}.spm.tools.vbm8.estwrite.extopts.cleanup = 1; +matlabbatch{1}.spm.tools.vbm8.estwrite.extopts.print = 1; + +% Now call the batch manager. + +spm_jobman('run_nogui',matlabbatch); + +% Log that we finished this portion. + +UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchVBM8 : VBM8 processed : %s',ParamImage)); + +clear matlabbatch + +% +% All done. +% diff --git a/spm8Batch/matlabScripts/UMBatchVBM8.m~ b/spm8Batch/matlabScripts/UMBatchVBM8.m~ new file mode 100644 index 00000000..b9e2b2dc --- /dev/null +++ b/spm8Batch/matlabScripts/UMBatchVBM8.m~ @@ -0,0 +1,279 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Robert C. Welsh +% Ann Arbor Michigan, USA +% +% March 2005-2011 +% Copyright. +% +% UMBatchWarp +% +% A drivable routine for warping some images using the +% batch options of spm2. +% +% Version 2.0 +% +% This should ONLY BE CALLED BY UMBatchWarp and NOT directly. +% +% Call as : +% +% function results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +% +% To Make this work you need to provide the following input: +% +% ParamImage = Image to determine warping parameters. +% ObjectMask = Masking Image. +% Images2Write = Images to write normalize. +% TestFlag = Flag to test file existance but do nothing. +% +% If the TemplateImage is blank then we are doing "Write Normalized Only" +% +% If Images2Write is blank then we are doing "Determine Parameters Only" +% +% If ObjectMask = [] or '' then no masking. +% +% ParamImage CAN NOT BE BLANK and must exist, as must its "_sn.mat" file. +% +% If TestFlag = 0 then execute, else just test files. +% +% Output +% +% results = -1 if failure +% # of seconds to execute. +% +% If you wish to use any normalization parameters other than the default +% you must set them yourself! +% +% You should make call to UMBatchPrep first. +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function results = UMBatchVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); + +% Get the defaults from SPM. + +global defaults + +% Make the call to prepare the system for batch processing. + +UMBatchPrep + +fprintf('Entering UMBatchWarpVBM8 V2.0 SPM8 Compatible\n'); + +if TestFlag~=0 + fprintf('\nTesting only, no work to be done\n\n'); +end + +% +% Set the return status to -1, that is error by default. +% + +results = -1; + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +% +% Make sure that the ParamImage is there. +% + +tic; + +if isempty(ParamImage) | exist(ParamImage) == 0 + fprintf('\n\nThe Parameter Image Must EXIST!\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + +% We need to make sure tha the VBM8 toolbox is present. + +if exist('spm_vbm8.m') ~= 2 + fprintf('\n\n* * * * * * MISSING THE VBM8 TOOLBOX * * * * * * \n') + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + + +% +% Check to see if they want a mask on the object. +% + +if isempty(ObjectMask) | ObjectMask == '' + ObjectMask = ''; +else + if exist(ObjectMask) == 0 + fprintf('Object mask specified is missing\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return + end +end + +% +% Now see about the images to write. Bugger out at ANY error! +% + +WarpMATName = [spm_str_manip(ParamImage,'sd') '_sn.mat']; + +if isempty(Images2Write) + WriteImage = 0; +else + WriteImage = 1; + for iP = 1:size(Images2Write,1) + tmpFile=Images2Write(iP,:); + commaIDX = findstr(',',tmpFile); + if ~isempty(commaIDX) + tmpFile = tmpFile(1:commaIDX(1)-1); + end + if exist(tmpFile) == 0 + WriteImage = 0 + fprintf('Error, image file : %s \n does not exist\n',tmpFile); + end + end + % + % Only require the warping matrix to pre-exist if we are NOT + % attempting to determine the warping parameters. + % + if DetermineParam == 0 & exist(WarpMATName) == 0 + fprintf('Error, warping matrix file: %s\n does not exist.\n',WarpMATName); + WriteImage == 0; + end + if WriteImage == 0 + fprintf('\n * * * A B O R T I N G * * *\n\n'); + end +end + +% +% Check to see if they actually want anything done? +% + +if DetermineParam == 0 & WriteImage == 0 + fprintf('You have chosen to do nothing, check your input params.\n'); + return +end + +% +% Now if we are determining the warping parameters let's do that. +% + +if DetermineParam == 1 + if TestFlag ~= 0 + fprintf('Would be calculating warp for \n%s to\n%s\n',ParamImage,TemplateImage) + else + % Warping estimating and writing + + fprintf('Warping %s to \n %s\n',ParamImage,TemplateImage); + + % We need to add the ",1" to the name for spm to handle + % nifti/nifti_gz images. + + % Pull out the directory + + ParamImageDirectory = fileparts(ParamImage); + + % Need to indicate to SPM which frame to use. + + TemplateImage = [ TemplateImage ',1']; + ParamImage = [ParamImage ',1']; + + % Set up the estimation + + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.source{1} = ParamImage; + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.wtsrc = ''; + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.resample{1} = ParamImage; + + matlabbatch{1}.spm.spatial.normalise.estwrite.eoptions = defaults.normalise.estimate; + matlabbatch{1}.spm.spatial.normalise.estwrite.eoptions.template{1} = TemplateImage; + + % And set up the write options. + + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions = defaults.normalise.write; + + % Only override the default if explicitly set > 0 + + if VoxelSize > 0 + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions.vox ... + = VoxelSize * ones(1,3); + else + VoxelSize = defaults.normalise.write.vox(1); + end + + % And the output name prefix. + + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions.prefix ... + = OutputName; + + % Now call the batch manager. + + spm_jobman('run_nogui',matlabbatch); + + % Log that we finished this portion. + + UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchWarp : Determined parameter for : %s',ParamImage)); + + end + clear matlabbatch +end + +% +% If we are warping some images to write then let's do that. +% + +if WriteImage == 1 + fprintf('Using warping matrix \n%s\n',WarpMATName); + if TestFlag ~= 0 + fprintf('Would be warping %d images like %s\n',size(Images2Write,1),deblank(Images2Write(1,:))); + % Warping writing only. + else + matlabbatch{1}.spm.spatial.normalise.write.subj.matname{1} = WarpMATName; + matlabbatch{1}.spm.spatial.normalise.write.subj.resample = {}; + for iP = 1:size(Images2Write,1) + matlabbatch{1}.spm.spatial.normalise.write.subj.resample{iP,1} ... + = strtrim(Images2Write(iP,:)); + end + matlabbatch{1}.spm.spatial.normalise.write.roptions = defaults.normalise.write; + + % Only override the default if explicitly set > 0 + + if VoxelSize > 0 + matlabbatch{1}.spm.spatial.normalise.write.roptions.vox ... + = VoxelSize * ones(1,3); + else + VoxelSize = defaults.normalise.write.vox(1); + end + + % And the output name prefix. + + matlabbatch{1}.spm.spatial.normalise.write.roptions.prefix ... + = OutputName; + + fprintf('Warping %d images like %s to voxel size %f\n',size(Images2Write,1),deblank(Images2Write(1,:)),VoxelSize); + + spm_jobman('run_nogui',matlabbatch); + + % Log that we finished this portion. + + % Get the directory of the images that we warped. + + ImageDirectory = fileparts(Images2Write(1,:)); + + UMBatchLogProcess(ImageDirectory,sprintf('UMBatchWarp : Warped images (%04d) : %s -> %s',size(Images2Write,1),Images2Write(1,:),OutputName)); + + if size(Images2Write,1) > 1 + UMBatchLogProcess(ImageDirectory,sprintf('UMBatchWarp : through image : %s',Images2Write(end,:))); + end + + end + clear matlabbatch +end + +% +% Set the flag to the amount of time to execute. +% + +results = toc; + +fprintf('Warping finished in %f seconds\n',results); + +return + +% +% All done. +% diff --git a/spm8Batch/matlabScripts/UMBatchWarp.m b/spm8Batch/matlabScripts/UMBatchWarp.m index e1724142..e061ce6e 100755 --- a/spm8Batch/matlabScripts/UMBatchWarp.m +++ b/spm8Batch/matlabScripts/UMBatchWarp.m @@ -47,7 +47,7 @@ % % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function results = UMBatchWarp(TemplateImage,ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +function results = UMBatchWarp(TemplateImage,ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName,WARPMETHOD); % Get the defaults from SPM. @@ -67,6 +67,11 @@ % Set the return status to -1, that is error by default. % +if WARPMETHOD + results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName,WARPMETHOD); + return +end + results = -1; % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/spm8Batch/matlabScripts/UMBatchWarpVBM8.m b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m new file mode 100644 index 00000000..9ae24b9b --- /dev/null +++ b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m @@ -0,0 +1,279 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Robert C. Welsh +% Ann Arbor Michigan, USA +% +% March 2005-2011 +% Copyright. +% +% UMBatchWarp +% +% A drivable routine for warping some images using the +% batch options of spm2. +% +% Version 2.0 +% +% This should ONLY BE CALLED BY UMBatchWarp and NOT directly. +% +% Call as : +% +% function results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +% +% To Make this work you need to provide the following input: +% +% ParamImage = Image to determine warping parameters. +% ObjectMask = Masking Image. +% Images2Write = Images to write normalize. +% TestFlag = Flag to test file existance but do nothing. +% +% If the TemplateImage is blank then we are doing "Write Normalized Only" +% +% If Images2Write is blank then we are doing "Determine Parameters Only" +% +% If ObjectMask = [] or '' then no masking. +% +% ParamImage CAN NOT BE BLANK and must exist, as must its "_sn.mat" file. +% +% If TestFlag = 0 then execute, else just test files. +% +% Output +% +% results = -1 if failure +% # of seconds to execute. +% +% If you wish to use any normalization parameters other than the default +% you must set them yourself! +% +% You should make call to UMBatchPrep first. +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); + +% Get the defaults from SPM. + +global defaults + +% Make the call to prepare the system for batch processing. + +UMBatchPrep + +fprintf('Entering UMBatchWarpVBM8 V2.0 SPM8 Compatible\n'); + +if TestFlag~=0 + fprintf('\nTesting only, no work to be done\n\n'); +end + +% +% Set the return status to -1, that is error by default. +% + +results = -1; + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +% +% Make sure that the ParamImage is there. +% + +tic; + +if isempty(ParamImage) | exist(ParamImage) == 0 + fprintf('\n\nThe Parameter Image Must EXIST!\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + +% We need to make sure tha the VBM8 toolbox is present. + +if exist('spm_vbm8.m') ~= 2 + fprintf('\n\n* * * * * * MISSING THE VBM8 TOOLBOX * * * * * * \n') + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + + +% +% Check to see if they want a mask on the object. +% + +if isempty(ObjectMask) | ObjectMask == '' + ObjectMask = ''; +else + if exist(ObjectMask) == 0 + fprintf('Object mask specified is missing\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return + end +end + +% +% Now see about the images to write. Bugger out at ANY error! +% + +WarpMATName = [spm_str_manip(ParamImage,'sd') '_sn.mat']; + +if isempty(Images2Write) + WriteImage = 0; +else + WriteImage = 1; + for iP = 1:size(Images2Write,1) + tmpFile=Images2Write(iP,:); + commaIDX = findstr(',',tmpFile); + if ~isempty(commaIDX) + tmpFile = tmpFile(1:commaIDX(1)-1); + end + if exist(tmpFile) == 0 + WriteImage = 0 + fprintf('Error, image file : %s \n does not exist\n',tmpFile); + end + end + % + % Only require the warping matrix to pre-exist if we are NOT + % attempting to determine the warping parameters. + % + if DetermineParam == 0 & exist(WarpMATName) == 0 + fprintf('Error, warping matrix file: %s\n does not exist.\n',WarpMATName); + WriteImage == 0; + end + if WriteImage == 0 + fprintf('\n * * * A B O R T I N G * * *\n\n'); + end +end + +% +% Check to see if they actually want anything done? +% + +if DetermineParam == 0 & WriteImage == 0 + fprintf('You have chosen to do nothing, check your input params.\n'); + return +end + +% +% Now if we are determining the warping parameters let's do that. +% + +if DetermineParam == 1 + if TestFlag ~= 0 + fprintf('Would be calculating warp for \n%s to\n%s\n',ParamImage,TemplateImage) + else + % Warping estimating and writing + + fprintf('Warping %s to \n %s\n',ParamImage,TemplateImage); + + % We need to add the ",1" to the name for spm to handle + % nifti/nifti_gz images. + + % Pull out the directory + + ParamImageDirectory = fileparts(ParamImage); + + % Need to indicate to SPM which frame to use. + + TemplateImage = [ TemplateImage ',1']; + ParamImage = [ParamImage ',1']; + + % Set up the estimation + + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.source{1} = ParamImage; + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.wtsrc = ''; + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.resample{1} = ParamImage; + + matlabbatch{1}.spm.spatial.normalise.estwrite.eoptions = defaults.normalise.estimate; + matlabbatch{1}.spm.spatial.normalise.estwrite.eoptions.template{1} = TemplateImage; + + % And set up the write options. + + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions = defaults.normalise.write; + + % Only override the default if explicitly set > 0 + + if VoxelSize > 0 + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions.vox ... + = VoxelSize * ones(1,3); + else + VoxelSize = defaults.normalise.write.vox(1); + end + + % And the output name prefix. + + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions.prefix ... + = OutputName; + + % Now call the batch manager. + + spm_jobman('run_nogui',matlabbatch); + + % Log that we finished this portion. + + UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchWarp : Determined parameter for : %s',ParamImage)); + + end + clear matlabbatch +end + +% +% If we are warping some images to write then let's do that. +% + +if WriteImage == 1 + fprintf('Using warping matrix \n%s\n',WarpMATName); + if TestFlag ~= 0 + fprintf('Would be warping %d images like %s\n',size(Images2Write,1),deblank(Images2Write(1,:))); + % Warping writing only. + else + matlabbatch{1}.spm.spatial.normalise.write.subj.matname{1} = WarpMATName; + matlabbatch{1}.spm.spatial.normalise.write.subj.resample = {}; + for iP = 1:size(Images2Write,1) + matlabbatch{1}.spm.spatial.normalise.write.subj.resample{iP,1} ... + = strtrim(Images2Write(iP,:)); + end + matlabbatch{1}.spm.spatial.normalise.write.roptions = defaults.normalise.write; + + % Only override the default if explicitly set > 0 + + if VoxelSize > 0 + matlabbatch{1}.spm.spatial.normalise.write.roptions.vox ... + = VoxelSize * ones(1,3); + else + VoxelSize = defaults.normalise.write.vox(1); + end + + % And the output name prefix. + + matlabbatch{1}.spm.spatial.normalise.write.roptions.prefix ... + = OutputName; + + fprintf('Warping %d images like %s to voxel size %f\n',size(Images2Write,1),deblank(Images2Write(1,:)),VoxelSize); + + spm_jobman('run_nogui',matlabbatch); + + % Log that we finished this portion. + + % Get the directory of the images that we warped. + + ImageDirectory = fileparts(Images2Write(1,:)); + + UMBatchLogProcess(ImageDirectory,sprintf('UMBatchWarp : Warped images (%04d) : %s -> %s',size(Images2Write,1),Images2Write(1,:),OutputName)); + + if size(Images2Write,1) > 1 + UMBatchLogProcess(ImageDirectory,sprintf('UMBatchWarp : through image : %s',Images2Write(end,:))); + end + + end + clear matlabbatch +end + +% +% Set the flag to the amount of time to execute. +% + +results = toc; + +fprintf('Warping finished in %f seconds\n',results); + +return + +% +% All done. +% diff --git a/spm8Batch/matlabScripts/UMBatchWarpVBM8.m~ b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m~ new file mode 100644 index 00000000..230bbe18 --- /dev/null +++ b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m~ @@ -0,0 +1,285 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Robert C. Welsh +% Ann Arbor Michigan, USA +% +% March 2005-2011 +% Copyright. +% +% UMBatchWarp +% +% A drivable routine for warping some images using the +% batch options of spm2. +% +% Version 2.0 +% +% +% Call as : +% +% function results = UMBatchWarp(TemplateImage,ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +% +% To Make this work you need to provide the following input: +% +% TemplateImage = Image to warp the Parameter image. +% ParamImage = Image to determine warping parameters. +% ObjectMask = Masking Image. +% Images2Write = Images to write normalize. +% TestFlag = Flag to test file existance but do nothing. +% +% If the TemplateImage is blank then we are doing "Write Normalized Only" +% +% If Images2Write is blank then we are doing "Determine Parameters Only" +% +% If ObjectMask = [] or '' then no masking. +% +% ParamImage CAN NOT BE BLANK and must exist, as must its "_sn.mat" file. +% +% If TestFlag = 0 then execute, else just test files. +% +% Output +% +% results = -1 if failure +% # of seconds to execute. +% +% If you wish to use any normalization parameters other than the default +% you must set them yourself! +% +% You should make call to UMBatchPrep first. +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function results = UMBatchWarpVBM8(TemplateImage,ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName,WARPMETHOD); + +% Get the defaults from SPM. + +global defaults + +% Make the call to prepare the system for batch processing. + +UMBatchPrep + +fprintf('Entering UMBatchWarp V2.0 SPM8 Compatible\n'); + +if TestFlag~=0 + fprintf('\nTesting only, no work to be done\n\n'); +end + +% +% Set the return status to -1, that is error by default. +% + +if WARPMETHOD + results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName,WARPMETHOD); + return +end + +results = -1; + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +% +% Make sure that the ParamImage is there. +% + +tic; + +if isempty(ParamImage) | exist(ParamImage) == 0 + fprintf('\n\nThe Parameter Image Must EXIST!\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + +% +% Check to see if the template image exists? +% + +if isempty(TemplateImage) | exist(TemplateImage) == 0 + DetermineParam = 0; +else + DetermineParam = 1; +end + +% +% Check to see if they want a mask on the object. +% + +if isempty(ObjectMask) | ObjectMask == '' + ObjectMask = ''; +else + if exist(ObjectMask) == 0 + fprintf('Object mask specified is missing\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return + end +end + +% +% Now see about the images to write. Bugger out at ANY error! +% + +WarpMATName = [spm_str_manip(ParamImage,'sd') '_sn.mat']; + +if isempty(Images2Write) + WriteImage = 0; +else + WriteImage = 1; + for iP = 1:size(Images2Write,1) + tmpFile=Images2Write(iP,:); + commaIDX = findstr(',',tmpFile); + if ~isempty(commaIDX) + tmpFile = tmpFile(1:commaIDX(1)-1); + end + if exist(tmpFile) == 0 + WriteImage = 0 + fprintf('Error, image file : %s \n does not exist\n',tmpFile); + end + end + % + % Only require the warping matrix to pre-exist if we are NOT + % attempting to determine the warping parameters. + % + if DetermineParam == 0 & exist(WarpMATName) == 0 + fprintf('Error, warping matrix file: %s\n does not exist.\n',WarpMATName); + WriteImage == 0; + end + if WriteImage == 0 + fprintf('\n * * * A B O R T I N G * * *\n\n'); + end +end + +% +% Check to see if they actually want anything done? +% + +if DetermineParam == 0 & WriteImage == 0 + fprintf('You have chosen to do nothing, check your input params.\n'); + return +end + +% +% Now if we are determining the warping parameters let's do that. +% + +if DetermineParam == 1 + if TestFlag ~= 0 + fprintf('Would be calculating warp for \n%s to\n%s\n',ParamImage,TemplateImage) + else + % Warping estimating and writing + + fprintf('Warping %s to \n %s\n',ParamImage,TemplateImage); + + % We need to add the ",1" to the name for spm to handle + % nifti/nifti_gz images. + + % Pull out the directory + + ParamImageDirectory = fileparts(ParamImage); + + % Need to indicate to SPM which frame to use. + + TemplateImage = [ TemplateImage ',1']; + ParamImage = [ParamImage ',1']; + + % Set up the estimation + + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.source{1} = ParamImage; + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.wtsrc = ''; + matlabbatch{1}.spm.spatial.normalise.estwrite.subj.resample{1} = ParamImage; + + matlabbatch{1}.spm.spatial.normalise.estwrite.eoptions = defaults.normalise.estimate; + matlabbatch{1}.spm.spatial.normalise.estwrite.eoptions.template{1} = TemplateImage; + + % And set up the write options. + + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions = defaults.normalise.write; + + % Only override the default if explicitly set > 0 + + if VoxelSize > 0 + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions.vox ... + = VoxelSize * ones(1,3); + else + VoxelSize = defaults.normalise.write.vox(1); + end + + % And the output name prefix. + + matlabbatch{1}.spm.spatial.normalise.estwrite.roptions.prefix ... + = OutputName; + + % Now call the batch manager. + + spm_jobman('run_nogui',matlabbatch); + + % Log that we finished this portion. + + UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchWarp : Determined parameter for : %s',ParamImage)); + + end + clear matlabbatch +end + +% +% If we are warping some images to write then let's do that. +% + +if WriteImage == 1 + fprintf('Using warping matrix \n%s\n',WarpMATName); + if TestFlag ~= 0 + fprintf('Would be warping %d images like %s\n',size(Images2Write,1),deblank(Images2Write(1,:))); + % Warping writing only. + else + matlabbatch{1}.spm.spatial.normalise.write.subj.matname{1} = WarpMATName; + matlabbatch{1}.spm.spatial.normalise.write.subj.resample = {}; + for iP = 1:size(Images2Write,1) + matlabbatch{1}.spm.spatial.normalise.write.subj.resample{iP,1} ... + = strtrim(Images2Write(iP,:)); + end + matlabbatch{1}.spm.spatial.normalise.write.roptions = defaults.normalise.write; + + % Only override the default if explicitly set > 0 + + if VoxelSize > 0 + matlabbatch{1}.spm.spatial.normalise.write.roptions.vox ... + = VoxelSize * ones(1,3); + else + VoxelSize = defaults.normalise.write.vox(1); + end + + % And the output name prefix. + + matlabbatch{1}.spm.spatial.normalise.write.roptions.prefix ... + = OutputName; + + fprintf('Warping %d images like %s to voxel size %f\n',size(Images2Write,1),deblank(Images2Write(1,:)),VoxelSize); + + spm_jobman('run_nogui',matlabbatch); + + % Log that we finished this portion. + + % Get the directory of the images that we warped. + + ImageDirectory = fileparts(Images2Write(1,:)); + + UMBatchLogProcess(ImageDirectory,sprintf('UMBatchWarp : Warped images (%04d) : %s -> %s',size(Images2Write,1),Images2Write(1,:),OutputName)); + + if size(Images2Write,1) > 1 + UMBatchLogProcess(ImageDirectory,sprintf('UMBatchWarp : through image : %s',Images2Write(end,:))); + end + + end + clear matlabbatch +end + +% +% Set the flag to the amount of time to execute. +% + +results = toc; + +fprintf('Warping finished in %f seconds\n',results); + +return + +% +% All done. +% diff --git a/spm8Batch/parts/vbm8_part_01.m b/spm8Batch/parts/vbm8_part_01.m new file mode 100644 index 00000000..cfa192ac --- /dev/null +++ b/spm8Batch/parts/vbm8_part_01.m @@ -0,0 +1,43 @@ +% +% Copyright Robert C. Welsh +% Ann Arbor, Michigan 2005 +% +% This is to be used with the UMBatch System for SPM8. +% +% To Warp image using batch use the following code. +% + +% You must point to the batch processing code +% +% addpath /net/dysthymia/spm8Batch +% + +% You need to fill the following variables: +% +% UMBatchMaster = point to the directory of the experiment. +% +% ParamImage = image for determining the normalization. +% +% UMBatchSubjs = list of subjects within experiment. Space +% pad if need be. +% + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +% Make sure the UM Batch system is installed. + +if exist('UMBatchPrep') ~= 2 | exist('UMBatchVBM8') ~= 2 + fprintf('You need to have the UM Batch system\n'); + return +end + +% +% Prepare the batch processes +% + +UMBatchPrep + +% - - - - - - - END OF PART I - - - - - - - - - - - - - - - - - + + diff --git a/spm8Batch/parts/vbm8_part_02.m b/spm8Batch/parts/vbm8_part_02.m new file mode 100644 index 00000000..81c5b70c --- /dev/null +++ b/spm8Batch/parts/vbm8_part_02.m @@ -0,0 +1,44 @@ + +% - - - - - - - START OF PART II - - - - - - - - - - - - - - - + +% Deblank just in case. + +UMBatchMaster = deblank(UMBatchMaster); + +% If all of the subjects are in the same organization scheme +% then you should not have to modify this piece of code from this point +% forward. + +fprintf('\nWarping images using UMBatchVBM8\n'); + +fprintf('Looping on the subjects now\n\n'); + +% +% Loop over the subjects and coregister each one. +% + +for iSub = 1:length(UMBatchSubjs) + % + fprintf('Working on %s\n',UMBatchSubjs{iSub}); + % + % Break into two steps, one to calculate the normalization for the + % SPGR. + % + ParamImage = UMImg2Warp{iSub}; + % + % Make sure the image exists. + % + ParamImage=UMImg2Warp{iSub}; + if exist(ParamImage) == 2 + UMBatchWarp(ParamImage); + else + fprintf('FATAL ERROR : Image to warpVBM8 process does not exist: %s\n',ParamImage) + exit + end +end + +fprintf('\nAll done with warpingVBM8 processing of High Resolution image.\n'); + +% +% All done. +% diff --git a/spm8Batch/parts/vbm8_part_02.m~ b/spm8Batch/parts/vbm8_part_02.m~ new file mode 100644 index 00000000..6ff183db --- /dev/null +++ b/spm8Batch/parts/vbm8_part_02.m~ @@ -0,0 +1,43 @@ + +% - - - - - - - START OF PART II - - - - - - - - - - - - - - - + +% Deblank just in case. + +UMBatchMaster = deblank(UMBatchMaster); + +% If all of the subjects are in the same organization scheme +% then you should not have to modify this piece of code from this point +% forward. + +fprintf('\nWarping images using UMBatchVBM8\n'); + +fprintf('Looping on the subjects now\n\n'); + +% +% Loop over the subjects and coregister each one. +% + +for iSub = 1:length(UMBatchSubjs) + % + fprintf('Working on %s\n',UMBatchSubjs{iSub}); + % + % Break into two steps, one to calculate the normalization for the + % SPGR. + % + ParamImage = UMImg2Warp{iSub}; + % + % Make sure the image exists. + % + if exist(ParamImage) == 2 + UMBatchWarp(ParamImage,[],Img2Write,UMTestFlag,VoxelSize,OutputName); + else + fprintf('FATAL ERROR : Image to warp does not exist: %s\n',ParamImage) + exit + end +end + +fprintf('\nAll done with warping of High Resolution images to template\n'); + +% +% All done. +% diff --git a/spm8Batch/vbm8HiRes b/spm8Batch/vbm8HiRes new file mode 100755 index 00000000..501509c2 --- /dev/null +++ b/spm8Batch/vbm8HiRes @@ -0,0 +1,165 @@ +#!/bin/bash + +# # # # # # # # # # # # # # # # # # +# +# A command to make it easier on the user to warp the +# SPGR to the standard template. +# +# This command will build a script to run and will also +# run the script in background. +# +# e.g. vbm8HiRes +# +# +# Robert C. Welsh +# Copyright 2005-2011 +# +# warpHiRes +# +# # # # # # # # # # # # # # # # # # + +# +# Main vbm8HiRes function. +# + +VERSION="1.0" +VERSIONDATE="2012-03-05" + +# Find out where the current command lives and execute some common code. + +theFullCommand="$0 $*" +execDIR=`pwd` + +# Find out where the current command lives and execute some common code. + +theCommand=`which $0` +thisDir=`dirname $theCommand` + +thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` + +allowedOptions="aDdhMntUWwz" + +# This piece of code all of the spm8Batch scripts will use +. ${thisDir}/auxiliary/commonCode_AllScriptsStart + +# This is the common in-line code for the warping steps. +. ${thisDir}/auxiliary/commonCode_VBM8_01 + +# This is common in-line code for all spm8Batch script to make sure arguments were passed +. ${thisDir}/auxiliary/commonCode_checkIfArgsPassed + +# +# The actual function. +# + +. ${thisDir}/auxiliary/parse_arguments + +# + +. ${thisDir}/auxiliary/superDebugStatus + +# +# Ok - let's start displaying things back to the terminal +# + +. ${thisDir}/auxiliary/shellScriptInfo + +# +# Prepare to write the script. +# + +# Makes sure they speficied some subjects. +. ${thisDir}/auxiliary/checkInputForSubjects + +# Write out debug status +. ${thisDir}/auxiliary/debugStatus + +# Ok, lets do the business. + +# Print out the list of subjects that we operate upon. +. ${thisDir}/auxiliary/printSubjectsList + +# Now start building the automatic scripts. + +# +# the following environmental variables are from spm8Batch_Global +# +# HOSTCOMPUTER - name of the computer. +# SCRIPTNAME - name of the scripts to write. +# MATLABDIR - location of the scripts. +# UMBatchMatcher - present working directory. +# FULLSCRIPTNAME - full path and name of scripts to write. +# + +. ${thisDir}/auxiliary/vbm8_part_01 + +# Now build the list of directories for each subject. + +echo "UMImg2Warp = {..." >> ${FULLSCRIPTNAME}.m + +declare -i is +declare -i ii + +curDIR=`pwd` + +for (( is=1 ; is<=$nSubjects ; is++ )) +do + + cd ${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/ + # + # create the vbm8 directory. + # + + debugout "- - - - - - - - - - - - - -" $SuperDebugFLAG + debugout "mkdir -p ${fmriPATH}/${coregPATH}/" $SuperDebugFLAG + debugout "- - - - - - - - - - - - - -" $SuperDebugFLAG + mkdir -p ${fmriPATH}/${coregPATH}/ + debugout "- - - - - - - - - - - - - -" $SuperDebugFLAG + debugout "cd ${fmriPATH}/${coregPATH}/" $SuperDebugFLAG + debugout "- - - - - - - - - - - - - -" $SuperDebugFLAG + + . ${thisDir}/auxiliary/coregDirectoryErrorCheck + + # The hires is becoming the source, + + SOURCENAME=${HIRESNAME} + SOURCEEXT=${HIRESEXT} + + debugout "HiRes name is : ${SOURCENAME}" $SuperDebugFLAG + debugout "- - - - - - - - - - - - - - - -" $SuperDebugFLAG + + echo "'${SOURCEIMG}';..." >> ${FULLSCRIPTNAME}.m + +done + +echo " };" >> ${FULLSCRIPTNAME}.m + +echo + +echo " 4) finalizing matlab scripts" + +cat ${thisDir}/parts/vbm8_part_02.m >> ${FULLSCRIPTNAME}.m + +echo " 5) building shell script" +echo + +# Now build the shell script command that will get launched into the background. + +# Common star to all shell scripts +. ${thisDir}/auxiliary/shellScriptStart + +# Add the matlab code to the shell script + +. ${thisDir}/auxiliary/shellScriptMATLABCall + +# Finalize the shell script. + +. ${thisDir}/auxiliary/shellScriptFinalize + +# Now launch into the background if desired. + +. ${thisDir}/auxiliary/shellScriptLaunch + +# +# all done. +# diff --git a/spm8Batch/vbm8HiRes~ b/spm8Batch/vbm8HiRes~ new file mode 100644 index 00000000..0609b2d9 --- /dev/null +++ b/spm8Batch/vbm8HiRes~ @@ -0,0 +1,156 @@ +#!/bin/bash + +# # # # # # # # # # # # # # # # # # +# +# A command to make it easier on the user to warp the +# SPGR to the standard template. +# +# This command will build a script to run and will also +# run the script in background. +# +# e.g. vbm8HiRes +# +# +# Robert C. Welsh +# Copyright 2005-2011 +# +# warpHiRes +# +# # # # # # # # # # # # # # # # # # + +# +# Main warpHiRes function. +# + +VERSION="2.1" +VERSIONDATE="2011-07-30" + +# Find out where the current command lives and execute some common code. + +theFullCommand="$0 $*" +execDIR=`pwd` + +# Find out where the current command lives and execute some common code. + +theCommand=`which $0` +thisDir=`dirname $theCommand` + +thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` + +allowedOptions="DdfhMnOTtUWwz" + +# This piece of code all of the spm8Batch scripts will use +. ${thisDir}/auxiliary/commonCode_AllScriptsStart + +# This is the common in-line code for the warping steps. +. ${thisDir}/auxiliary/commonCode_Warp_01 + +# This is common in-line code for all spm8Batch script to make sure arguments were passed +. ${thisDir}/auxiliary/commonCode_checkIfArgsPassed + +# +# The actual function. +# + +. ${thisDir}/auxiliary/parse_arguments + +# + +. ${thisDir}/auxiliary/superDebugStatus + +# +# Ok - let's start displaying things back to the terminal +# + +. ${thisDir}/auxiliary/shellScriptInfo + +# +# Prepare to write the script. +# + +# Makes sure they speficied some subjects. +. ${thisDir}/auxiliary/checkInputForSubjects + +# Write out debug status +. ${thisDir}/auxiliary/debugStatus + +# Ok, lets do the business. + +# Print out the list of subjects that we operate upon. +. ${thisDir}/auxiliary/printSubjectsList + +# Now start building the automatic scripts. + +# +# the following environmental variables are from spm8Batch_Global +# +# HOSTCOMPUTER - name of the computer. +# SCRIPTNAME - name of the scripts to write. +# MATLABDIR - location of the scripts. +# UMBatchMatcher - present working directory. +# FULLSCRIPTNAME - full path and name of scripts to write. +# + +. ${thisDir}/auxiliary/warpPart_01 + +# Now build the list of directories for each subject. + +echo "UMImg2Warp = {..." >> ${FULLSCRIPTNAME}.m + +declare -i is +declare -i ii + +curDIR=`pwd` + +for (( is=1 ; is<=$nSubjects ; is++ )) +do + + # + # Make sure that now the HIRES exists. + # + + TARGETNAME=${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${fmriPATH}/${coregPATH}/${HIRESNAME} + TARGETEXT=${overlayExt} + + . ${thisDir}/auxiliary/verifyTargetImage + + debugout "HiRes name is : ${TARGETIMG}" $SuperDebugFLAG + debugout "- - - - - - - - - - - - - - - -" $SuperDebugFLAG + + echo "'${TARGETIMG}';..." >> ${FULLSCRIPTNAME}.m + +done + +echo " };" >> ${FULLSCRIPTNAME}.m + +echo + +. ${thisDir}/auxiliary/warpPrepOtherImages + +echo " 4) finalizing matlab scripts" + +cat ${thisDir}/parts/warp_HIRES_part_2.m >> ${FULLSCRIPTNAME}.m + +echo " 5) building shell script" +echo + +# Now build the shell script command that will get launched into the background. + +# Common star to all shell scripts +. ${thisDir}/auxiliary/shellScriptStart + +# Add the matlab code to the shell script + +. ${thisDir}/auxiliary/shellScriptMATLABCall + +# Finalize the shell script. + +. ${thisDir}/auxiliary/shellScriptFinalize + +# Now launch into the background if desired. + +. ${thisDir}/auxiliary/shellScriptLaunch + +# +# all done. +# From 6fcf1027db7c48eac8d724d5ae195aba4bdb5ee3 Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Mon, 5 Mar 2012 23:35:48 -0500 Subject: [PATCH 02/35] Left out vbm_part_01 shell stuff --- spm8Batch/auxiliary/commonCode_VBM8_01 | 2 +- spm8Batch/auxiliary/help/help_vbm8HiRes_Options | 2 +- spm8Batch/auxiliary/help/vbm8HiRes_Help | 2 +- spm8Batch/auxiliary/vbm8_part_01 | 13 +++++++++++++ 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 spm8Batch/auxiliary/vbm8_part_01 diff --git a/spm8Batch/auxiliary/commonCode_VBM8_01 b/spm8Batch/auxiliary/commonCode_VBM8_01 index b96ff48f..370d4ea3 100644 --- a/spm8Batch/auxiliary/commonCode_VBM8_01 +++ b/spm8Batch/auxiliary/commonCode_VBM8_01 @@ -1,6 +1,6 @@ # validate that we have what we need. -. ${thisDir}/auxiliary/checkVBM8Parts +. ${thisDir}/auxiliary/checkVBMParts # Initialize warping variables. diff --git a/spm8Batch/auxiliary/help/help_vbm8HiRes_Options b/spm8Batch/auxiliary/help/help_vbm8HiRes_Options index b6bae34b..3dccdf30 100644 --- a/spm8Batch/auxiliary/help/help_vbm8HiRes_Options +++ b/spm8Batch/auxiliary/help/help_vbm8HiRes_Options @@ -1,6 +1,6 @@ echo "${helpComment} anatomy path : $anatomyPATH" echo "${helpComment} name of hisres image : $HIRESNAME" - echo "${helpComment} directory to vbm8 : $anatomyPATH/$coregPATH/" + echo "${helpComment} directory to vbm8 : $coregPATH/" echo . ${thisDir}/auxiliary/help/help_options_end diff --git a/spm8Batch/auxiliary/help/vbm8HiRes_Help b/spm8Batch/auxiliary/help/vbm8HiRes_Help index 9900f7ed..3c2fb5ad 100644 --- a/spm8Batch/auxiliary/help/vbm8HiRes_Help +++ b/spm8Batch/auxiliary/help/vbm8HiRes_Help @@ -7,7 +7,7 @@ echo " e.g. " echo echo " To process the image 'ht1spgr.nii' through VBM8 to create a skull-stripped" - echo " image in the native space do: + echo " image in the native space do:" echo echo " vbm8HiRes 050126zz" echo diff --git a/spm8Batch/auxiliary/vbm8_part_01 b/spm8Batch/auxiliary/vbm8_part_01 new file mode 100644 index 00000000..f893f373 --- /dev/null +++ b/spm8Batch/auxiliary/vbm8_part_01 @@ -0,0 +1,13 @@ +# Use common in-line code #01 -- comments out to standard output. + +. ${thisDir}/auxiliary/buildMatlabScripts_01 + +cat ${SPM8B2}/parts/vmb8_part_01.m > ${FULLSCRIPTNAME}.m + +# Use common in-line code #02 -- header information + +. ${thisDir}/auxiliary/buildMatlabScripts_02 + +# Use common in-line code #03 -- subject list. +. ${thisDir}/auxiliary/buildMatlabScripts_03 + From dee2d6910271f114251c4346ee792c67070a001f Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Sun, 11 Mar 2012 14:11:34 -0400 Subject: [PATCH 03/35] Added VBM8 option to warpfMRI --- spm8Batch/auxiliary/help/help_case_warpmethod | 3 + .../auxiliary/help/help_case_warpmethod~ | 3 + spm8Batch/auxiliary/help/warpfMRI_Help | 16 +- spm8Batch/auxiliary/initialization_warpfMRI | 9 + spm8Batch/auxiliary/parse_arguments | 7 + spm8Batch/auxiliary/setReferenceImage | 17 ++ spm8Batch/auxiliary/setWarpMethod | 7 + .../auxiliary/{ => toDeprecate}/case_all_runs | 0 .../{ => toDeprecate}/case_anatomy_path | 0 .../{ => toDeprecate}/case_coreg_path | 0 .../{ => toDeprecate}/case_debug_flag | 0 .../auxiliary/{ => toDeprecate}/case_error | 0 .../{ => toDeprecate}/case_flirt_options | 0 .../auxiliary/{ => toDeprecate}/case_fmri_tr | 0 .../{ => toDeprecate}/case_functional_path | 0 .../{ => toDeprecate}/case_hires_name | 0 .../{ => toDeprecate}/case_other_names | 0 .../{ => toDeprecate}/case_output_name | 0 .../{ => toDeprecate}/case_overlay_name | 0 .../{ => toDeprecate}/case_reslice_1 | 0 .../{ => toDeprecate}/case_reslice_2 | 0 .../{ => toDeprecate}/case_run_number | 0 .../auxiliary/{ => toDeprecate}/case_set_run | 0 .../{ => toDeprecate}/case_standard_volume | 0 .../auxiliary/{ => toDeprecate}/case_sub_path | 0 .../{ => toDeprecate}/case_subject_dir | 0 .../{ => toDeprecate}/case_super_debug_flag | 0 .../{ => toDeprecate}/case_template_name | 0 .../{ => toDeprecate}/case_test_flag | 0 .../{ => toDeprecate}/case_user_email | 0 .../{ => toDeprecate}/case_volume_name | 0 .../{ => toDeprecate}/case_voxel_size | 0 .../auxiliary/{ => toDeprecate}/set_all_runs | 0 spm8Batch/auxiliary/vbm8_part_01 | 2 +- spm8Batch/auxiliary/warpPart_01 | 4 + spm8Batch/matlabScripts/UMBatchVBM8.m | 46 ++- spm8Batch/matlabScripts/UMBatchWarp.m | 4 +- spm8Batch/matlabScripts/UMBatchWarpVBM8.m | 262 +++++++++--------- spm8Batch/matlabScripts/uniqueNII.m | 43 +++ spm8Batch/matlabScripts/uniqueNII.m~ | 42 +++ spm8Batch/parts/vbm8_part_02.m | 2 +- spm8Batch/parts/warp_fMRI_part_2.m | 2 +- spm8Batch/vbm8HiRes | 2 + spm8Batch/warpfMRI | 15 +- 44 files changed, 326 insertions(+), 160 deletions(-) create mode 100644 spm8Batch/auxiliary/help/help_case_warpmethod create mode 100644 spm8Batch/auxiliary/help/help_case_warpmethod~ create mode 100644 spm8Batch/auxiliary/setReferenceImage create mode 100644 spm8Batch/auxiliary/setWarpMethod rename spm8Batch/auxiliary/{ => toDeprecate}/case_all_runs (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_anatomy_path (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_coreg_path (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_debug_flag (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_error (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_flirt_options (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_fmri_tr (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_functional_path (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_hires_name (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_other_names (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_output_name (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_overlay_name (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_reslice_1 (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_reslice_2 (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_run_number (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_set_run (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_standard_volume (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_sub_path (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_subject_dir (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_super_debug_flag (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_template_name (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_test_flag (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_user_email (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_volume_name (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/case_voxel_size (100%) rename spm8Batch/auxiliary/{ => toDeprecate}/set_all_runs (100%) create mode 100644 spm8Batch/matlabScripts/uniqueNII.m create mode 100644 spm8Batch/matlabScripts/uniqueNII.m~ diff --git a/spm8Batch/auxiliary/help/help_case_warpmethod b/spm8Batch/auxiliary/help/help_case_warpmethod new file mode 100644 index 00000000..29c1a021 --- /dev/null +++ b/spm8Batch/auxiliary/help/help_case_warpmethod @@ -0,0 +1,3 @@ + echo " -W Enable VBM8 warping for fMRI, you need to run vbm8HiRes first." + echo " Default is to use standard SPM8 normalization." + echo diff --git a/spm8Batch/auxiliary/help/help_case_warpmethod~ b/spm8Batch/auxiliary/help/help_case_warpmethod~ new file mode 100644 index 00000000..1646dd12 --- /dev/null +++ b/spm8Batch/auxiliary/help/help_case_warpmethod~ @@ -0,0 +1,3 @@ + echo " -t enable testing flag, script will be built" + echo " but not run." + echo diff --git a/spm8Batch/auxiliary/help/warpfMRI_Help b/spm8Batch/auxiliary/help/warpfMRI_Help index a5fbabe5..0f5f6724 100644 --- a/spm8Batch/auxiliary/help/warpfMRI_Help +++ b/spm8Batch/auxiliary/help/warpfMRI_Help @@ -1,6 +1,6 @@ echo echo " A command line command to drive batch processing to warp the fMRI time series" - echo " to the standard template using normalization derived during the 'warpHiRes' phase." + echo " to the standard template using normalization derived during the 'warpHiRes/vbm8HiRes' phase." echo . ${thisDir}/auxiliary/help/help_options_start @@ -12,12 +12,14 @@ echo " warpfMRI -w func/MSIT 050126zz" echo echo - echo "*NOTE: This code will actually hunt out rapruns's (or those specified in the -v flag" - echo " The code does not actually care where the files live and will attempt to warp " - echo " any and all volumes using the specified SPGR (or default) volume. However you" - echo " can narrow the search by supplying the '-s subdir' option which will then require" - echo " that 'subdir' is a string contained in the list of directories returned for warping." - echo " If this DOES NOT make sense to you please contact Robert before proceeding." + echo "*NOTE: This code will actually hunt out rapruns's (or those specified in the -v flag" + echo " The code does not actually care where the files live and will attempt to warp " + echo " any and all volumes using the specified SPGR (or default) volume. However you" + echo " can narrow the search by supplying the '-s subdir' option which will then require" + echo " that 'subdir' is a string contained in the list of directories returned for warping." + echo " If this DOES NOT make sense to you please contact Robert before proceeding." + echo + echo "**NOTE: You can also use the VBM8 toolbox to process data, see vbm8HiRes" echo echo " Current command default configuration is:" echo diff --git a/spm8Batch/auxiliary/initialization_warpfMRI b/spm8Batch/auxiliary/initialization_warpfMRI index 83e621cf..fef64645 100755 --- a/spm8Batch/auxiliary/initialization_warpfMRI +++ b/spm8Batch/auxiliary/initialization_warpfMRI @@ -5,6 +5,15 @@ # Output name outputName=w +# Warping method, 0=SPM8, 1=VBM8 + +WARPMETHOD=0 + +# The VBM8ReferenceImage to override the bounding box and voxelsize +# if this is left blank we use the defaults. + +VBM8ReferenceImage= + # # all done # diff --git a/spm8Batch/auxiliary/parse_arguments b/spm8Batch/auxiliary/parse_arguments index 86289e2d..d932646d 100644 --- a/spm8Batch/auxiliary/parse_arguments +++ b/spm8Batch/auxiliary/parse_arguments @@ -114,6 +114,13 @@ do . ${thisDir}/auxiliary/setHiResName ;; + # case_set_referenceImage + # + # reference image for warpfMRI with vbm8 + # + "I") + . ${thisDir}/auxiliary/setReferenceImage + ;; # case_set_run # # run list diff --git a/spm8Batch/auxiliary/setReferenceImage b/spm8Batch/auxiliary/setReferenceImage new file mode 100644 index 00000000..730311bf --- /dev/null +++ b/spm8Batch/auxiliary/setReferenceImage @@ -0,0 +1,17 @@ + ERRORMESSAGE="Trying to determine the VBM8 reference image." + + . ${thisDir}/auxiliary/setGenericFileName + + # If they speficified the directory, else we use the default directory. + + if [ "${FILENAME:0:1}" == "/" ] + then + TARGETNAME=${FILENAME} + else + TARGETNAME=${TemplateImageDir}/${FILENAME} + fi + TARGETEXT=${FILEEXT} + + . ${thisDir}/auxiliary/verifyTargetImage + + VBM8ReferenceImage=${TARGETIMG} diff --git a/spm8Batch/auxiliary/setWarpMethod b/spm8Batch/auxiliary/setWarpMethod new file mode 100644 index 00000000..d28ababf --- /dev/null +++ b/spm8Batch/auxiliary/setWarpMethod @@ -0,0 +1,7 @@ +# +# Set the flag to say we are using VBM8 for +# warping of fMRI data. +# + + WARPMETHOD=1 + diff --git a/spm8Batch/auxiliary/case_all_runs b/spm8Batch/auxiliary/toDeprecate/case_all_runs similarity index 100% rename from spm8Batch/auxiliary/case_all_runs rename to spm8Batch/auxiliary/toDeprecate/case_all_runs diff --git a/spm8Batch/auxiliary/case_anatomy_path b/spm8Batch/auxiliary/toDeprecate/case_anatomy_path similarity index 100% rename from spm8Batch/auxiliary/case_anatomy_path rename to spm8Batch/auxiliary/toDeprecate/case_anatomy_path diff --git a/spm8Batch/auxiliary/case_coreg_path b/spm8Batch/auxiliary/toDeprecate/case_coreg_path similarity index 100% rename from spm8Batch/auxiliary/case_coreg_path rename to spm8Batch/auxiliary/toDeprecate/case_coreg_path diff --git a/spm8Batch/auxiliary/case_debug_flag b/spm8Batch/auxiliary/toDeprecate/case_debug_flag similarity index 100% rename from spm8Batch/auxiliary/case_debug_flag rename to spm8Batch/auxiliary/toDeprecate/case_debug_flag diff --git a/spm8Batch/auxiliary/case_error b/spm8Batch/auxiliary/toDeprecate/case_error similarity index 100% rename from spm8Batch/auxiliary/case_error rename to spm8Batch/auxiliary/toDeprecate/case_error diff --git a/spm8Batch/auxiliary/case_flirt_options b/spm8Batch/auxiliary/toDeprecate/case_flirt_options similarity index 100% rename from spm8Batch/auxiliary/case_flirt_options rename to spm8Batch/auxiliary/toDeprecate/case_flirt_options diff --git a/spm8Batch/auxiliary/case_fmri_tr b/spm8Batch/auxiliary/toDeprecate/case_fmri_tr similarity index 100% rename from spm8Batch/auxiliary/case_fmri_tr rename to spm8Batch/auxiliary/toDeprecate/case_fmri_tr diff --git a/spm8Batch/auxiliary/case_functional_path b/spm8Batch/auxiliary/toDeprecate/case_functional_path similarity index 100% rename from spm8Batch/auxiliary/case_functional_path rename to spm8Batch/auxiliary/toDeprecate/case_functional_path diff --git a/spm8Batch/auxiliary/case_hires_name b/spm8Batch/auxiliary/toDeprecate/case_hires_name similarity index 100% rename from spm8Batch/auxiliary/case_hires_name rename to spm8Batch/auxiliary/toDeprecate/case_hires_name diff --git a/spm8Batch/auxiliary/case_other_names b/spm8Batch/auxiliary/toDeprecate/case_other_names similarity index 100% rename from spm8Batch/auxiliary/case_other_names rename to spm8Batch/auxiliary/toDeprecate/case_other_names diff --git a/spm8Batch/auxiliary/case_output_name b/spm8Batch/auxiliary/toDeprecate/case_output_name similarity index 100% rename from spm8Batch/auxiliary/case_output_name rename to spm8Batch/auxiliary/toDeprecate/case_output_name diff --git a/spm8Batch/auxiliary/case_overlay_name b/spm8Batch/auxiliary/toDeprecate/case_overlay_name similarity index 100% rename from spm8Batch/auxiliary/case_overlay_name rename to spm8Batch/auxiliary/toDeprecate/case_overlay_name diff --git a/spm8Batch/auxiliary/case_reslice_1 b/spm8Batch/auxiliary/toDeprecate/case_reslice_1 similarity index 100% rename from spm8Batch/auxiliary/case_reslice_1 rename to spm8Batch/auxiliary/toDeprecate/case_reslice_1 diff --git a/spm8Batch/auxiliary/case_reslice_2 b/spm8Batch/auxiliary/toDeprecate/case_reslice_2 similarity index 100% rename from spm8Batch/auxiliary/case_reslice_2 rename to spm8Batch/auxiliary/toDeprecate/case_reslice_2 diff --git a/spm8Batch/auxiliary/case_run_number b/spm8Batch/auxiliary/toDeprecate/case_run_number similarity index 100% rename from spm8Batch/auxiliary/case_run_number rename to spm8Batch/auxiliary/toDeprecate/case_run_number diff --git a/spm8Batch/auxiliary/case_set_run b/spm8Batch/auxiliary/toDeprecate/case_set_run similarity index 100% rename from spm8Batch/auxiliary/case_set_run rename to spm8Batch/auxiliary/toDeprecate/case_set_run diff --git a/spm8Batch/auxiliary/case_standard_volume b/spm8Batch/auxiliary/toDeprecate/case_standard_volume similarity index 100% rename from spm8Batch/auxiliary/case_standard_volume rename to spm8Batch/auxiliary/toDeprecate/case_standard_volume diff --git a/spm8Batch/auxiliary/case_sub_path b/spm8Batch/auxiliary/toDeprecate/case_sub_path similarity index 100% rename from spm8Batch/auxiliary/case_sub_path rename to spm8Batch/auxiliary/toDeprecate/case_sub_path diff --git a/spm8Batch/auxiliary/case_subject_dir b/spm8Batch/auxiliary/toDeprecate/case_subject_dir similarity index 100% rename from spm8Batch/auxiliary/case_subject_dir rename to spm8Batch/auxiliary/toDeprecate/case_subject_dir diff --git a/spm8Batch/auxiliary/case_super_debug_flag b/spm8Batch/auxiliary/toDeprecate/case_super_debug_flag similarity index 100% rename from spm8Batch/auxiliary/case_super_debug_flag rename to spm8Batch/auxiliary/toDeprecate/case_super_debug_flag diff --git a/spm8Batch/auxiliary/case_template_name b/spm8Batch/auxiliary/toDeprecate/case_template_name similarity index 100% rename from spm8Batch/auxiliary/case_template_name rename to spm8Batch/auxiliary/toDeprecate/case_template_name diff --git a/spm8Batch/auxiliary/case_test_flag b/spm8Batch/auxiliary/toDeprecate/case_test_flag similarity index 100% rename from spm8Batch/auxiliary/case_test_flag rename to spm8Batch/auxiliary/toDeprecate/case_test_flag diff --git a/spm8Batch/auxiliary/case_user_email b/spm8Batch/auxiliary/toDeprecate/case_user_email similarity index 100% rename from spm8Batch/auxiliary/case_user_email rename to spm8Batch/auxiliary/toDeprecate/case_user_email diff --git a/spm8Batch/auxiliary/case_volume_name b/spm8Batch/auxiliary/toDeprecate/case_volume_name similarity index 100% rename from spm8Batch/auxiliary/case_volume_name rename to spm8Batch/auxiliary/toDeprecate/case_volume_name diff --git a/spm8Batch/auxiliary/case_voxel_size b/spm8Batch/auxiliary/toDeprecate/case_voxel_size similarity index 100% rename from spm8Batch/auxiliary/case_voxel_size rename to spm8Batch/auxiliary/toDeprecate/case_voxel_size diff --git a/spm8Batch/auxiliary/set_all_runs b/spm8Batch/auxiliary/toDeprecate/set_all_runs similarity index 100% rename from spm8Batch/auxiliary/set_all_runs rename to spm8Batch/auxiliary/toDeprecate/set_all_runs diff --git a/spm8Batch/auxiliary/vbm8_part_01 b/spm8Batch/auxiliary/vbm8_part_01 index f893f373..5d1bd7ad 100644 --- a/spm8Batch/auxiliary/vbm8_part_01 +++ b/spm8Batch/auxiliary/vbm8_part_01 @@ -2,7 +2,7 @@ . ${thisDir}/auxiliary/buildMatlabScripts_01 -cat ${SPM8B2}/parts/vmb8_part_01.m > ${FULLSCRIPTNAME}.m +cat ${SPM8B2}/parts/vbm8_part_01.m > ${FULLSCRIPTNAME}.m # Use common in-line code #02 -- header information diff --git a/spm8Batch/auxiliary/warpPart_01 b/spm8Batch/auxiliary/warpPart_01 index 1d7a2dc2..cb53a20c 100644 --- a/spm8Batch/auxiliary/warpPart_01 +++ b/spm8Batch/auxiliary/warpPart_01 @@ -10,6 +10,10 @@ echo "TemplateImage = '${TemplateImage}';" >> ${FULLSCRIPTNAM echo "VoxelSize = ${voxelSize};" >> ${FULLSCRIPTNAME}.m +echo "WARPMETHOD = ${WARPMETHOD};" >> ${FULLSCRIPTNAME}.m + +echo "VBM8RefImage = '${VBM8ReferenceImage}';" >> ${FULLSCRIPTNAME}.m + echo "OutputName = '${outputName}';" >> ${FULLSCRIPTNAME}.m echo "SandBoxDIR = '${SANDBOX}/';" >> ${FULLSCRIPTNAME}.m diff --git a/spm8Batch/matlabScripts/UMBatchVBM8.m b/spm8Batch/matlabScripts/UMBatchVBM8.m index fcd74b16..254a622e 100644 --- a/spm8Batch/matlabScripts/UMBatchVBM8.m +++ b/spm8Batch/matlabScripts/UMBatchVBM8.m @@ -10,19 +10,15 @@ % A drivable routine for warping some images using the % batch options of spm2. % -% Version 2.0 -% -% This should ONLY BE CALLED BY UMBatchWarp and NOT directly. +% Version 1.0 % % Call as : % -% function results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +% function results = UMBatchWarpVBM8(ParamImage,TestFlag); % % To Make this work you need to provide the following input: % % ParamImage = Image to determine warping parameters. -% ObjectMask = Masking Image. -% Images2Write = Images to write normalize. % TestFlag = Flag to test file existance but do nothing. % % If the TemplateImage is blank then we are doing "Write Normalized Only" @@ -47,7 +43,7 @@ % % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function results = UMBatchVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +function results = UMBatchVBM8(ParamImage,TestFlag); % Get the defaults from SPM. @@ -107,9 +103,9 @@ clear matlabbatch -matlabbatch{1}.spm.tools.vmb8.estwrite.data = {[ParamImage ',1']}; +matlabbatch{1}.spm.tools.vbm8.estwrite.data = {[ParamImage ',1']}; matlabbatch{1}.spm.tools.vbm8.estwrite.opts = vbm8.opts; -matlabbatch{1}.spm.tools.vbm8.estwrite.output = vbm8.output; +matlabbatch{1}.spm.tools.vbm8.estwrite.output = rmfield(vbm8.output,'surf'); % But now we also turn on ALL native output. @@ -145,8 +141,40 @@ % Log that we finished this portion. +[ParamImageDirectory ParamImageName ParamImageExt] = fileparts(ParamImage); + UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchVBM8 : VBM8 processed : %s',ParamImage)); +% Now create the masked image of the input. We will take the p0 image and +% use spm_imcalc to create a skull stripped which we will preprend as +% "bet_" + +CURDIR=pwd; + +cd(ParamImageDirectory); + +% Now create the skull stripped brain. + +MaskParam = fullfile(ParamImageDirectory,['p0' ParamImageName ParamImageExt]); + +inputImages = strvcat(ParamImage,MaskParam); + +Vi = spm_vol(inputImages); + +clear Vo + +Vo.fname = fullfile(ParamImageDirectory,['bet_' ParamImageName ParamImageExt]); +Vo.dim = Vi(1).dim; +Vo.mat = Vi(1).mat; +Vo.descrip = ['Skull Stripped spm8Batch/VMB8 ' Vi(1).descrip]; +Vo.dt = Vi(1).dt; + +spm_imcalc(Vi,Vo,'i1.*(i2>0)'); + +% And now log it. + +UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchVBM8 : VBM8 created skull stripped : %s',Vo.fname)); + clear matlabbatch % diff --git a/spm8Batch/matlabScripts/UMBatchWarp.m b/spm8Batch/matlabScripts/UMBatchWarp.m index e061ce6e..d80c1c90 100755 --- a/spm8Batch/matlabScripts/UMBatchWarp.m +++ b/spm8Batch/matlabScripts/UMBatchWarp.m @@ -67,8 +67,8 @@ % Set the return status to -1, that is error by default. % -if WARPMETHOD - results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName,WARPMETHOD); +if exist('WARPMETHOD') == 1 & WARPMETHOD + results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); return end diff --git a/spm8Batch/matlabScripts/UMBatchWarpVBM8.m b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m index 9ae24b9b..3fc621af 100644 --- a/spm8Batch/matlabScripts/UMBatchWarpVBM8.m +++ b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m @@ -91,9 +91,67 @@ return end +% + +% Store where we are presently to restore before going back. + +CURDIR = pwd; + +clear matlabbatch + +% grab what we need, first break apart the file name. + +[ParamImageDirectory ParamImageName ParamImageExt ParamImageNum] = spm_fileparts(ParamImage); + +% Name of the deformation file + +matlabbatch{1}.spm.util.defs.comp{1}.def{1} = fullfile(ParamImageDirectory,['y_' ParamImageName ParamImageExt]); + +% Check to make sure that the defomation field is there. + +if isempty(matlabbatch{1}.spm.util.defs.comp{1}.def{1}) | exist(matlabbatch{1}.spm.util.defs.comp{1}.def{1}) == 0 + fprintf('\n\nDeformation field is missing!\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + +% Size of the data we want to write out. + +if VoxelSize > 0 + matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.vox = VoxelSize*ones(3,1); +else + matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.vox = defaults.normalise.write.vox; +end + +% We use the default bounding box. +% Though we need to add the option of using a reference images as +% well. + +matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.bb = defaults.normalise.write.bb; + +% No option here. + +matlabbatch{1}.spm.util.defs.ofname = ''; + +% Save to the directory where the times-series data exist. + +matlabbatch{1}.spm.util.defs.savedir.savesrc = 1; + +% Now get the file/frame names as the utility wants them, which is +% different from other routines. + +matlabbatch{1}.spm.util.defs.fnames = {}; +for iP = 1:size(Images2Write,1) + matlabbatch{1}.spm.util.defs.fnames{iP} = strtrim(Images2Write(iP,:)); +end + +% Interpolation method: + +matlabbatch{1}.spm.util.defs.interp = 1; % -% Check to see if they want a mask on the object. +% Check to see if they want a mask on the object --- this is NOT +% implemented in the present work. - RCWelsh 2012-03-09 % if isempty(ObjectMask) | ObjectMask == '' @@ -109,13 +167,11 @@ % % Now see about the images to write. Bugger out at ANY error! % - -WarpMATName = [spm_str_manip(ParamImage,'sd') '_sn.mat']; - if isempty(Images2Write) - WriteImage = 0; + fprintf('\nYou did not specify any images to write deformed\m'); + fprintf('\n * * * A B O R T I N G * * *\n\n'); + return else - WriteImage = 1; for iP = 1:size(Images2Write,1) tmpFile=Images2Write(iP,:); commaIDX = findstr(',',tmpFile); @@ -125,152 +181,88 @@ if exist(tmpFile) == 0 WriteImage = 0 fprintf('Error, image file : %s \n does not exist\n',tmpFile); + fprintf('\n * * * A B O R T I N G * * *\n\n'); + return end end - % - % Only require the warping matrix to pre-exist if we are NOT - % attempting to determine the warping parameters. - % - if DetermineParam == 0 & exist(WarpMATName) == 0 - fprintf('Error, warping matrix file: %s\n does not exist.\n',WarpMATName); - WriteImage == 0; - end - if WriteImage == 0 - fprintf('\n * * * A B O R T I N G * * *\n\n'); - end -end - -% -% Check to see if they actually want anything done? -% - -if DetermineParam == 0 & WriteImage == 0 - fprintf('You have chosen to do nothing, check your input params.\n'); - return -end - -% -% Now if we are determining the warping parameters let's do that. -% - -if DetermineParam == 1 - if TestFlag ~= 0 - fprintf('Would be calculating warp for \n%s to\n%s\n',ParamImage,TemplateImage) - else - % Warping estimating and writing - - fprintf('Warping %s to \n %s\n',ParamImage,TemplateImage); - - % We need to add the ",1" to the name for spm to handle - % nifti/nifti_gz images. - - % Pull out the directory - - ParamImageDirectory = fileparts(ParamImage); - - % Need to indicate to SPM which frame to use. - - TemplateImage = [ TemplateImage ',1']; - ParamImage = [ParamImage ',1']; - - % Set up the estimation - - matlabbatch{1}.spm.spatial.normalise.estwrite.subj.source{1} = ParamImage; - matlabbatch{1}.spm.spatial.normalise.estwrite.subj.wtsrc = ''; - matlabbatch{1}.spm.spatial.normalise.estwrite.subj.resample{1} = ParamImage; - - matlabbatch{1}.spm.spatial.normalise.estwrite.eoptions = defaults.normalise.estimate; - matlabbatch{1}.spm.spatial.normalise.estwrite.eoptions.template{1} = TemplateImage; - - % And set up the write options. - - matlabbatch{1}.spm.spatial.normalise.estwrite.roptions = defaults.normalise.write; - - % Only override the default if explicitly set > 0 - - if VoxelSize > 0 - matlabbatch{1}.spm.spatial.normalise.estwrite.roptions.vox ... - = VoxelSize * ones(1,3); - else - VoxelSize = defaults.normalise.write.vox(1); - end - - % And the output name prefix. - - matlabbatch{1}.spm.spatial.normalise.estwrite.roptions.prefix ... - = OutputName; - - % Now call the batch manager. - - spm_jobman('run_nogui',matlabbatch); - - % Log that we finished this portion. - - UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchWarp : Determined parameter for : %s',ParamImage)); - - end - clear matlabbatch end % % If we are warping some images to write then let's do that. % -if WriteImage == 1 - fprintf('Using warping matrix \n%s\n',WarpMATName); - if TestFlag ~= 0 - fprintf('Would be warping %d images like %s\n',size(Images2Write,1),deblank(Images2Write(1,:))); - % Warping writing only. - else - matlabbatch{1}.spm.spatial.normalise.write.subj.matname{1} = WarpMATName; - matlabbatch{1}.spm.spatial.normalise.write.subj.resample = {}; - for iP = 1:size(Images2Write,1) - matlabbatch{1}.spm.spatial.normalise.write.subj.resample{iP,1} ... - = strtrim(Images2Write(iP,:)); - end - matlabbatch{1}.spm.spatial.normalise.write.roptions = defaults.normalise.write; - - % Only override the default if explicitly set > 0 - - if VoxelSize > 0 - matlabbatch{1}.spm.spatial.normalise.write.roptions.vox ... - = VoxelSize * ones(1,3); - else - VoxelSize = defaults.normalise.write.vox(1); - end - - % And the output name prefix. - - matlabbatch{1}.spm.spatial.normalise.write.roptions.prefix ... - = OutputName; - - fprintf('Warping %d images like %s to voxel size %f\n',size(Images2Write,1),deblank(Images2Write(1,:)),VoxelSize); - - spm_jobman('run_nogui',matlabbatch); - - % Log that we finished this portion. - - % Get the directory of the images that we warped. - - ImageDirectory = fileparts(Images2Write(1,:)); - - UMBatchLogProcess(ImageDirectory,sprintf('UMBatchWarp : Warped images (%04d) : %s -> %s',size(Images2Write,1),Images2Write(1,:),OutputName)); - - if size(Images2Write,1) > 1 - UMBatchLogProcess(ImageDirectory,sprintf('UMBatchWarp : through image : %s',Images2Write(end,:))); - end - +fprintf('Using deformation field \n%s\n',matlabbatch{1}.spm.util.defs.comp{1}.def{1}); + +if TestFlag ~= 0 + fprintf('Would be warping %d images like %s\n',size(Images2Write,1),deblank(Images2Write(1,:))); + % Warping writing only. +else + fprintf('Warping %d images like %s to voxel size %f\n',size(Images2Write,1),deblank(Images2Write(1,:)),VoxelSize); + + spm_jobman('run_nogui',matlabbatch); + + % Log that we finished this portion. + + % Get the directory of the images that we warped. + + % Now let's find out if successful? + + % We only operate on NIFTI so we can just take the unique ones, + % and return the count. + + [Image2WriteUnique Images2WriteCount] = uniqueNII(Images2Write); + + for iNII = 1:size(Images2WriteUnique) + [d1 d2 d3 d4] = spm_fileparts(Images2WriteUnique(iNII,:)); + newFile = fullfile(d1,['w' d2 d3]); + if exist(newFile) == 0 + fprintf('\n\n* * * * * * * * * * * * \n\n'); + fprintf('FATAL ERROR - I CAN''T FIND THE OUTPUT FILE EXPECTED : %s\n',newFile); + fprintf('ABORTING\n'); + fprintf('\n\n* * * * * * * * * * * * \n\n'); + exit + end + end + + % Everything up to this point is okay + % Okay, if the OutputName option is not specified, or it's + % already set to 'w', then we do nothing, else we rename the file + % for them as moveOutOfSandbox is expecting the new name. + + newImages2WriteUnique = []; + if exist('OutputName') == 1 & strcmp(OutputName,'w') ~= 1 + % We need to identify all of the files that need to be renamed. + for iNII = 1:size(Images2WriteUnique) + [d1 d2 d3 d4] = spm_fileparts(Images2WriteUnique(iNII,:)); + oldFile = fullfile(d1,['w' d2 d3]); + newFile = fullfile(d1,[OutoutName d2 d3]); + [mS mM mI] = movefile(oldFile,newFile); + newImages2WriteUnique = strvcat(newImages2WriteUnique; newFile); end - clear matlabbatch + end + + ImageDirectory = fileparts(Images2Write(1,:)); + + for iNII = 1:size(Images2WriteUnique,1);a + UMBatchLogProcess(ImageDirectory,... + sprintf('UMBatchWarp : Warped images (frames:%04d) : %s -> %s',... + Images2WriteCount(iNII),... + Images2WriteUnique(iNII,:),... + newImages2WriteUnique(iNII,:))); + + end + end +clear matlabbatch + % % Set the flag to the amount of time to execute. % results = toc; -fprintf('Warping finished in %f seconds\n',results); +fprintf('Deformation finished in %f seconds\n',results); return diff --git a/spm8Batch/matlabScripts/uniqueNII.m b/spm8Batch/matlabScripts/uniqueNII.m new file mode 100644 index 00000000..73f62edf --- /dev/null +++ b/spm8Batch/matlabScripts/uniqueNII.m @@ -0,0 +1,43 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Robert C. Welsh +% Ann Arbor Michigan, USA +% +% March 2005-2011 +% Copyright. +% +% uniqueNII +% +% A utility function to return a unique list of files +% names, after the frame number has been discarded. +% +% function [uniqueList count] = uniqueNII(inputList) +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [uniqueList count] = uniqueNII(inputList) + +uniqueList = []; +count = []; + +for iP = 1:size(inputList,1) + [d1 d2 d3 d4] = spm_fileparts(inputList(iP,:)); + uniqueList = strvcat(uniqueList,fullfile(d1,[d2 d3])); +end + +uniqueList = unique(uniqueList,'rows'); + +count = zeros(size(uniqueList,1),1); + +for iP = 1:size(uniqueList,1) + count(iP) = 0; + for iO = 1:size(inputList,1) + [d1 d2 d3 d4] = spm_fileparts(inputList(iO,:)); + if strcmp(uniqueList(iP,:),fullfile(d1,[d2 d3])) + count(iP) = count(iP) + 1; + end + end +end + +% +% all done. +% \ No newline at end of file diff --git a/spm8Batch/matlabScripts/uniqueNII.m~ b/spm8Batch/matlabScripts/uniqueNII.m~ new file mode 100644 index 00000000..087006b6 --- /dev/null +++ b/spm8Batch/matlabScripts/uniqueNII.m~ @@ -0,0 +1,42 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Robert C. Welsh +% Ann Arbor Michigan, USA +% +% March 2005-2011 +% Copyright. +% +% uniqueNII +% +% A utility function to return a unique list of files +% names, after the frame number has been discarded. +% +% function [uniqueList count] = uniqueNII(inputList) +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function [uniqueList count] = uniqueNII(inputList) + +uniqueList = []; +count = []; + +for iP = 1:size(inputList,1) + [d1 d2 d3 d4] = spm_fileparts(inputList(iP,:)); + uniqueList = strvcat(uniqueList,fullfile(d1,[d2 d3])); + count = [count ; 0]; +end + +uniqueList = unique(uniqueList,'rows'); + +for iP = 1:size(uniqueList,1) + count(iP) = 0; + for iO = 1:size(inputList,1) + [d1 d2 d3 d4] = spm_fileparts(inputList(iO,:)); + if strcmp(uniqueList(iP,:),fullfile(d1,[d2 d3])) + count(iP) = count(iP) + 1; + end + end +end + +% +% all done. +% \ No newline at end of file diff --git a/spm8Batch/parts/vbm8_part_02.m b/spm8Batch/parts/vbm8_part_02.m index 81c5b70c..912fca6e 100644 --- a/spm8Batch/parts/vbm8_part_02.m +++ b/spm8Batch/parts/vbm8_part_02.m @@ -30,7 +30,7 @@ % ParamImage=UMImg2Warp{iSub}; if exist(ParamImage) == 2 - UMBatchWarp(ParamImage); + UMBatchVBM8(ParamImage,UMTestFlag); else fprintf('FATAL ERROR : Image to warpVBM8 process does not exist: %s\n',ParamImage) exit diff --git a/spm8Batch/parts/warp_fMRI_part_2.m b/spm8Batch/parts/warp_fMRI_part_2.m index 34365de5..41866471 100755 --- a/spm8Batch/parts/warp_fMRI_part_2.m +++ b/spm8Batch/parts/warp_fMRI_part_2.m @@ -34,7 +34,7 @@ % % The other step to apply the normalization to the SPGR. % - UMBatchWarp([],ParamImage,[],Images2Write,UMTestFlag,VoxelSize,OutputName); + UMBatchWarp([],ParamImage,[],Images2Write,UMTestFlag,VoxelSize,OutputName,WARPMETHOD); % % Now move back out of sandbox if so specified % diff --git a/spm8Batch/vbm8HiRes b/spm8Batch/vbm8HiRes index 501509c2..1d7cfdba 100755 --- a/spm8Batch/vbm8HiRes +++ b/spm8Batch/vbm8HiRes @@ -128,6 +128,8 @@ do debugout "HiRes name is : ${SOURCENAME}" $SuperDebugFLAG debugout "- - - - - - - - - - - - - - - -" $SuperDebugFLAG + . ${thisDir}/auxiliary/coregFindSourceAndMove + echo "'${SOURCEIMG}';..." >> ${FULLSCRIPTNAME}.m done diff --git a/spm8Batch/warpfMRI b/spm8Batch/warpfMRI index 790a27f5..49a57901 100755 --- a/spm8Batch/warpfMRI +++ b/spm8Batch/warpfMRI @@ -37,7 +37,7 @@ thisDir=`dirname $theCommand` thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` -allowedOptions="DdfhMntUvwz" +allowedOptions="DdfhMntUvWwz" # This piece of code all of the spm8Batch scripts will use . ${thisDir}/auxiliary/commonCode_AllScriptsStart @@ -121,10 +121,18 @@ do debugout "HiRes name is : ${TARGETIMG}" $SuperDebugFLAG debugout "- - - - - - - - - - - - - - - -" $SuperDebugFLAG - if [ ! -e "${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${fmriPATH}/${coregPATH}/${HIRESNAME}_sn.mat" ] + # Check for the warping matrix (_sn.mat) or the deformation field (y_). + + if [ ${WARPMETHOD} == "1" ] + then + WARP_FILE=${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${fmriPATH}/${coregPATH}/y_${HIRESNAME}.nii + else + WARP_FILE=${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${fmriPATH}/${coregPATH}/${HIRESNAME}_sn.mat + fi + if [ ! -e "${WARP_FILE}" ] then echo - echo "MISSING _sn.mat for ${subjects[$is]}" + echo "MISSING warping instuctions for ${subjects[$is]}" echo # # remove the sandbox if we made one. @@ -132,7 +140,6 @@ do ${thisDir}/auxiliary/remove_sandbox ${SANDBOXYES} ${SANDBOXPID} exit 1 fi - echo "'${TARGETIMG}';..." >> ${FULLSCRIPTNAME}.m done From 3658aaf0802c1b4599a37f50b2dd43cb8e77acf2 Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Tue, 13 Mar 2012 11:58:11 -0400 Subject: [PATCH 04/35] spm8Batch with VBM8 support - 2012-03-12 --- spm8Batch/SPM8Batch_Supplement.key | Bin 0 -> 300339 bytes spm8Batch/SPM8Batch_Supplement.pdf | Bin 0 -> 126492 bytes spm8Batch/auxiliary/help/help_case_hires_name | 2 +- .../auxiliary/help/help_case_template_name | 3 +- spm8Batch/auxiliary/help/help_case_voxel_size | 1 + spm8Batch/auxiliary/help/help_options_start | 6 ++ spm8Batch/auxiliary/help/tmp.help | 31 ------ spm8Batch/auxiliary/help/tmp_076460.txt | 26 ----- spm8Batch/auxiliary/help/tmp_078468.txt | 26 ----- spm8Batch/auxiliary/help/tmp_081508.txt | 26 ----- spm8Batch/auxiliary/initialization_vbm8HiRes | 4 + spm8Batch/auxiliary/initialization_warpHiRes | 3 + spm8Batch/auxiliary/parse_arguments | 7 +- spm8Batch/auxiliary/setWarpMethod | 9 ++ spm8Batch/auxiliary/toDelete/commonCode_01 | 14 --- spm8Batch/auxiliary/toDeprecate/case_all_runs | 6 -- .../auxiliary/toDeprecate/case_anatomy_path | 6 -- .../auxiliary/toDeprecate/case_coreg_path | 6 -- .../auxiliary/toDeprecate/case_debug_flag | 6 -- spm8Batch/auxiliary/toDeprecate/case_error | 6 -- .../auxiliary/toDeprecate/case_flirt_options | 6 -- spm8Batch/auxiliary/toDeprecate/case_fmri_tr | 6 -- .../toDeprecate/case_functional_path | 6 -- .../auxiliary/toDeprecate/case_hires_name | 6 -- .../auxiliary/toDeprecate/case_other_names | 6 -- .../auxiliary/toDeprecate/case_output_name | 6 -- .../auxiliary/toDeprecate/case_overlay_name | 6 -- .../auxiliary/toDeprecate/case_reslice_1 | 6 -- .../auxiliary/toDeprecate/case_reslice_2 | 6 -- .../auxiliary/toDeprecate/case_run_number | 15 --- spm8Batch/auxiliary/toDeprecate/case_set_run | 6 -- .../toDeprecate/case_standard_volume | 6 -- spm8Batch/auxiliary/toDeprecate/case_sub_path | 6 -- .../auxiliary/toDeprecate/case_subject_dir | 6 -- .../toDeprecate/case_super_debug_flag | 6 -- .../auxiliary/toDeprecate/case_template_name | 6 -- .../auxiliary/toDeprecate/case_test_flag | 6 -- .../auxiliary/toDeprecate/case_user_email | 6 -- .../auxiliary/toDeprecate/case_volume_name | 6 -- .../auxiliary/toDeprecate/case_voxel_size | 6 -- spm8Batch/auxiliary/toDeprecate/set_all_runs | 6 -- spm8Batch/auxiliary/vbm8_part_01 | 6 ++ spm8Batch/matlab/coregOnly_Job.m | 16 --- spm8Batch/matlab/coregOnly_Job.mat | Bin 2056 -> 0 bytes spm8Batch/matlab/coregResliceJob_only.mat | Bin 2384 -> 0 bytes spm8Batch/matlab/coreg_EstimateOnly_Job.mat | Bin 2064 -> 0 bytes .../coreg_EstimateOnly_NoOthers_Job.mat | Bin 1680 -> 0 bytes .../matlab/coreg_EstimateReslice_Job.mat | Bin 2008 -> 0 bytes .../coreg_EstimateReslice_WithOthers_Job.mat | Bin 2392 -> 0 bytes spm8Batch/matlab/coreg_ResliceOnly_Job.mat | Bin 1664 -> 0 bytes spm8Batch/matlab/coreg_Reslice_Only_Job.mat | Bin 1408 -> 0 bytes .../segmentation_job_in_native_space.mat | Bin 2384 -> 0 bytes spm8Batch/matlab/simplejob.mat | Bin 16936 -> 0 bytes .../matlab/smooth_warped_functions_job.mat | Bin 95440 -> 0 bytes .../warp_all_phases_functionals_job.mat | Bin 95888 -> 0 bytes .../matlab/warp_t1spgr_and_write_job.mat | Bin 2512 -> 0 bytes spm8Batch/matlabScripts/UMBatchCoReg.m | 12 +++ spm8Batch/matlabScripts/UMBatchPrep.m | 23 +++-- spm8Batch/matlabScripts/UMBatchSegment.m | 8 ++ spm8Batch/matlabScripts/UMBatchSmooth.m | 12 +++ spm8Batch/matlabScripts/UMBatchVBM8.m | 48 +++++++-- spm8Batch/matlabScripts/UMBatchWarp.m | 10 +- spm8Batch/matlabScripts/UMBatchWarpVBM8.m | 94 ++++++++++-------- spm8Batch/matlabScripts/uniqueNII.m | 4 +- spm8Batch/parts/coreg_part_2.m | 3 +- spm8Batch/parts/smooth_part_2.m | 3 +- spm8Batch/parts/vbm8_part_02.m | 5 +- spm8Batch/parts/warp_HIRES_part_2.m | 8 +- spm8Batch/parts/warp_fMRI_part_2.m | 7 +- spm8Batch/spm8Batch_Global | 8 +- spm8Batch/vbm8HiRes | 4 +- spm8Batch/warpfMRI | 11 +- 72 files changed, 219 insertions(+), 386 deletions(-) create mode 100644 spm8Batch/SPM8Batch_Supplement.key create mode 100644 spm8Batch/SPM8Batch_Supplement.pdf delete mode 100644 spm8Batch/auxiliary/help/tmp.help delete mode 100644 spm8Batch/auxiliary/help/tmp_076460.txt delete mode 100644 spm8Batch/auxiliary/help/tmp_078468.txt delete mode 100644 spm8Batch/auxiliary/help/tmp_081508.txt delete mode 100755 spm8Batch/auxiliary/toDelete/commonCode_01 delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_all_runs delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_anatomy_path delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_coreg_path delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_debug_flag delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_error delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_flirt_options delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_fmri_tr delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_functional_path delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_hires_name delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_other_names delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_output_name delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_overlay_name delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_reslice_1 delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_reslice_2 delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_run_number delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_set_run delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_standard_volume delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_sub_path delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_subject_dir delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_super_debug_flag delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_template_name delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_test_flag delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_user_email delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_volume_name delete mode 100644 spm8Batch/auxiliary/toDeprecate/case_voxel_size delete mode 100644 spm8Batch/auxiliary/toDeprecate/set_all_runs delete mode 100755 spm8Batch/matlab/coregOnly_Job.m delete mode 100755 spm8Batch/matlab/coregOnly_Job.mat delete mode 100755 spm8Batch/matlab/coregResliceJob_only.mat delete mode 100755 spm8Batch/matlab/coreg_EstimateOnly_Job.mat delete mode 100755 spm8Batch/matlab/coreg_EstimateOnly_NoOthers_Job.mat delete mode 100755 spm8Batch/matlab/coreg_EstimateReslice_Job.mat delete mode 100755 spm8Batch/matlab/coreg_EstimateReslice_WithOthers_Job.mat delete mode 100755 spm8Batch/matlab/coreg_ResliceOnly_Job.mat delete mode 100644 spm8Batch/matlab/coreg_Reslice_Only_Job.mat delete mode 100755 spm8Batch/matlab/segmentation_job_in_native_space.mat delete mode 100755 spm8Batch/matlab/simplejob.mat delete mode 100755 spm8Batch/matlab/smooth_warped_functions_job.mat delete mode 100755 spm8Batch/matlab/warp_all_phases_functionals_job.mat delete mode 100755 spm8Batch/matlab/warp_t1spgr_and_write_job.mat diff --git a/spm8Batch/SPM8Batch_Supplement.key b/spm8Batch/SPM8Batch_Supplement.key new file mode 100644 index 0000000000000000000000000000000000000000..2bb2214c3fcb98bd9ebce8b198f4d0d9fb865fa2 GIT binary patch literal 300339 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 z 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 literal 0 HcmV?d00001 diff --git a/spm8Batch/SPM8Batch_Supplement.pdf b/spm8Batch/SPM8Batch_Supplement.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7ec6a27a2086efee118cbcf072026efd98c992d9 GIT binary patch literal 126492 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

)h0aR4QgF!%YxRv(AD=)5Yq;+T4J)smDPXgKk8 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 z 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 l-6*$wb9sOB|0K^vP`^F#edzj~0?rCWAl|+E@z= $args )) - then - echo "Missing parameter for run number, aborting" - . ${thisDir}/auxiliary/exit_w_removal - else - runNAMES[$nRUN]=$1 - let nRUN++ - fi - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_set_run b/spm8Batch/auxiliary/toDeprecate/case_set_run deleted file mode 100644 index 0e303acd..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_set_run +++ /dev/null @@ -1,6 +0,0 @@ - # - # run list - # - "i") - . ${thisDir}/auxiliary/setRunList - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_standard_volume b/spm8Batch/auxiliary/toDeprecate/case_standard_volume deleted file mode 100644 index 0d9ced36..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_standard_volume +++ /dev/null @@ -1,6 +0,0 @@ - # - # find the standard volume number. - # - "S") - . ${thisDir}/auxiliary/setStandardVolumeNumber - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_sub_path b/spm8Batch/auxiliary/toDeprecate/case_sub_path deleted file mode 100644 index dd227d91..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_sub_path +++ /dev/null @@ -1,6 +0,0 @@ - # - # sub-Path name to search for functional images. - # - "s") - . ${thisDir}/auxiliary/setFunctionalSubPathName - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_subject_dir b/spm8Batch/auxiliary/toDeprecate/case_subject_dir deleted file mode 100644 index c05a9b7b..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_subject_dir +++ /dev/null @@ -1,6 +0,0 @@ - # - # subject directory name to use - # - "M") - . ${thisDir}/auxiliary/setSubjectsMasterDir - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_super_debug_flag b/spm8Batch/auxiliary/toDeprecate/case_super_debug_flag deleted file mode 100644 index 739c870c..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_super_debug_flag +++ /dev/null @@ -1,6 +0,0 @@ - # - # super debug flag - # - "D") - . ${thisDir}/auxiliary/setSuperDebugFlag - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_template_name b/spm8Batch/auxiliary/toDeprecate/case_template_name deleted file mode 100644 index 194997e1..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_template_name +++ /dev/null @@ -1,6 +0,0 @@ - # - # Template Image. - # - "T") - . ${thisDir}/auxiliary/setTemplateImageName - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_test_flag b/spm8Batch/auxiliary/toDeprecate/case_test_flag deleted file mode 100644 index 2d84bab0..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_test_flag +++ /dev/null @@ -1,6 +0,0 @@ - # - # Test FLAG - # - "t") - . ${thisDir}/auxiliary/setTestFlag - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_user_email b/spm8Batch/auxiliary/toDeprecate/case_user_email deleted file mode 100644 index c8dc7fd6..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_user_email +++ /dev/null @@ -1,6 +0,0 @@ - # - # Where to send email when finished - # - "U") - . ${thisDir}/auxiliary/setUserEmail - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_volume_name b/spm8Batch/auxiliary/toDeprecate/case_volume_name deleted file mode 100644 index d27790d7..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_volume_name +++ /dev/null @@ -1,6 +0,0 @@ - # - # wildcard name to use for which to co-reg. - # - "v") - . ${thisDir}/auxiliary/setVolumeWildCard - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/case_voxel_size b/spm8Batch/auxiliary/toDeprecate/case_voxel_size deleted file mode 100644 index a418a84b..00000000 --- a/spm8Batch/auxiliary/toDeprecate/case_voxel_size +++ /dev/null @@ -1,6 +0,0 @@ - # - # Voxel size - # - "z") - . ${thisDir}/auxiliary/setVoxelSize - ;; diff --git a/spm8Batch/auxiliary/toDeprecate/set_all_runs b/spm8Batch/auxiliary/toDeprecate/set_all_runs deleted file mode 100644 index 0e42ac23..00000000 --- a/spm8Batch/auxiliary/toDeprecate/set_all_runs +++ /dev/null @@ -1,6 +0,0 @@ - # - # All runs in func - # - "A") - ALLRUNSFLAG=1 - ;; diff --git a/spm8Batch/auxiliary/vbm8_part_01 b/spm8Batch/auxiliary/vbm8_part_01 index 5d1bd7ad..2a3b770a 100644 --- a/spm8Batch/auxiliary/vbm8_part_01 +++ b/spm8Batch/auxiliary/vbm8_part_01 @@ -8,6 +8,12 @@ cat ${SPM8B2}/parts/vbm8_part_01.m > ${FULLSCRIPTNAME . ${thisDir}/auxiliary/buildMatlabScripts_02 +echo "VoxelSize = ${voxelSize};" >> ${FULLSCRIPTNAME}.m + +echo "VBM8RefImage = '${VBM8ReferenceImage}';" >> ${FULLSCRIPTNAME}.m + +echo "OutputName = '${outputName}';" >> ${FULLSCRIPTNAME}.m + # Use common in-line code #03 -- subject list. . ${thisDir}/auxiliary/buildMatlabScripts_03 diff --git a/spm8Batch/matlab/coregOnly_Job.m b/spm8Batch/matlab/coregOnly_Job.m deleted file mode 100755 index 59f07adf..00000000 --- a/spm8Batch/matlab/coregOnly_Job.m +++ /dev/null @@ -1,16 +0,0 @@ - -% -%matlabbatch{1}.spm.spatial.coreg.estimate -% -% ref: {[1x84 char]} -% source: {[1x82 char]} -% other: {2x1 cell} -% eoptions: [1x1 struct] -% -% matlabbatch{1}.spm.spatial.coreg.estimate.ref{1} = '....../run_01.nii,1'; -% -% matlabbatch{1}.spm.spatial.coreg.estimate.source{1} = '....../ht1overlay.nii,1'; -% -% matlabbatch{1}.spm.spatial.coreg.estimate.other{n} = '....../otherImage_n.nii,1'; -% -% \ No newline at end of file diff --git a/spm8Batch/matlab/coregOnly_Job.mat b/spm8Batch/matlab/coregOnly_Job.mat deleted file mode 100755 index 03d7e991e4b54a30014c033fc16b7bb52b9c6310..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2056 zcmdT_J8#oa6h18}EdntyFy5hKXyTM2$kLh!p-7FWn!s8dW5-60ZP_=J$HKr5U|?oq zC=24JASOom32Y1ue4mpmOo*bS5~{dYC+D8`JrCb>?B2e8TkUMsRmbjK^TWuis)NYU zev%EF;I-N}u2)qn^BnCxQc2uYT}LZB&6K*O8uezwYHl}huq?Igl9hJnvWUD~7da2S z0ayWWtpN;89^oQj=;+Al_Z{s9phRfDSF&F%xU=mkT9ZoQoBkLhPlsd|etzH*<{pdq zG4~_RQ%8qRRQUP0q#wrQeTdy8^9I1oD_GLc1=!FJv6t%*weoN*7X4j4rN2$sW}ZKG zlqaLirQ1XYUPhjmq&iIEypS`_1}?!|OnoSr)lc%N{{>+5D`aAo^?RV17Z>FxfSTNw zTs+C}Tf?s_$Dkrm0q8sORMJ8k$`CjfUFg}eFJ0`Gw4v3Nk@V#;n6EA@<*}cUJ4RRC(-!e9|z+%n&<8#mR-t+KvyV2ci+%~G46{FqgZn&QBl#G4f z(r&1Rb;z2n+IGokD#y~!BO?sz#$DwZjYt{Bj$v-qw`=uk&A3@HO=DS*l~((zh=?OVN`rR@PY5&FN%_!koCe1ED|rI^HKJnj)kLyD6)x0Z~P zo{uz+EbUo-66fdIX+C+*!`yiuQae;mAC!50Tr$oj_%IHs6YH_^w1Z^=jCXX#cpLCl zjynkyha+V(Y^Vp0qRa^+?S(-sDqTRx{nl}qJbh&l+J6P6_C*Q-**WNfXMP0gPk?24 zAh9^2@Gj$R%NU#wZUFv{97~jFJsE-qq7%D@>`4btQ(Ca<$Vhtf7}xV^{^$B1JtXJ8Vpb~ z6Z})~3cax8nPh8$VB zZGd~h1EqguD&u`l9U*)Fq%%o*0Z$PE`n?9G`_A*b0)4tKb2|dQxc1@R_vdeRXX&r^ zKfbhk`@6GrV)t@te@bWVQvNLYtl|HV)N#pv!7a(}I;a(Dh@J6mPdOtowDQx!*bbqL-_QsrzaXQy7fU9WAaTGesXqC=Ki?du})c2(pu z_!?*l#IXXhGIgY@prLC*x7TxxH-IF<_y>jfEo~9Kk<++)Udt}Lw>O7Aun8%)v zJWE^?xM7~>3yQJzoaH?9<$1`xIMsb{)|D)n=L%w&hg@eS09G2yd@!FnXTEjBrrIAT z%HmP#F>P!HI;Bp>i3#E;%kA9f1`femEIu^Mx=-rq{{v+GOIULh{SP6tE)LpHKoxl; znP^Gzt>Ej)F{BXE0P;O~AxUlxWC$LK$^9C#CmqbDwBXf|k@Vyl?B2xQk;l@OE;Jc5 z6>+4BxeeMxKJMfrCW1fr%tj*TPKKTlohsVQ$Kl|hZ=%V`MUpzAO zM;~~cMuK(y@Av$vaL;FX5A8d)4s5(QGe`a?l1wKMF-#ne7yj{J{B~0$j(0%w`r{Jp zwx8G^^o{U71mKLXPIP>?XyYipL$)WWU&bs!!MJxIyYH;HYp~mWS=$rP>zgO{f4+LZ hJI#N8{`IZh+uxn$W4|{O|G#|N&&ubiXBGc{e*i6-@qhpT diff --git a/spm8Batch/matlab/coreg_EstimateOnly_NoOthers_Job.mat b/spm8Batch/matlab/coreg_EstimateOnly_NoOthers_Job.mat deleted file mode 100755 index fc654bc6123d2ec250e134a68be0898acef8a9ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmc&!y>8P`6g~|p4FVws9^eigLlgIplBF^cLXm2zY62Zw$6VJ&j<03kP-qth9)N)d zU|@iy&%w;Z2yXy81K+vs6~K*Ja=*@j1$=vyNRzu zmCpvS4M&^nT`|n1ujLb=(t+5AbhBJIYr@$atlk~0-xI5S#}Q457DnDpBI;Zv!jC%O z1u)Yh*y?O!z7C%GI`OAdUk4F1BF2A2u*J8G^s!0oT-Si%JS=6QW9&-e(Gcf*d&zvuz~(Y66BTNn z2b@;vNak#lD$}t_3*+ZHx6p(=5AKHvEBWI*+0OA_z&0K&8mh+c!(#KW{|wxtM^uoc z9QPjX0Ubk2pheIh&~wU+H>Me6O4`J^v_oTDLmDA!OmmvjQ}}~(|Ck<=M-x~ISbF48 zAJ+zW4f(iI2uzB2uE|da@Hs~F5mB|Rz#HT0!e7qWX}Fiq!2NA6d+=BH^6o$GB_Kt6 z*xM0y5n*=@^k>j>oQY2_==W`u`#7x3XXmJ%JKLyg+2)9DHSp+D`=IJ58-iCemhv@I$K~{$JVdTa|Qlte;k|Q{fr^&^RbVq zis#-fzC|r+!@#)LU|aVh+>Hv3XFCL+-adQy_2kWVUHS|a)h_B^&s diff --git a/spm8Batch/matlab/coreg_EstimateReslice_Job.mat b/spm8Batch/matlab/coreg_EstimateReslice_Job.mat deleted file mode 100755 index 7d5ea342d97787a41da75030c2b79616c8048077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2008 zcmc&!KX21O6n_aREdn71#tt4B(zGSpaBS;*Aq5r&J^%wB zfdQ6&4rV4s*jU*a_`P$VdPEUQx^UL>yZ8US-<{oQ_79p5y`9av*J<`QhEc4lUN;WR zFxBG*bglO8{i@f}DlqDqmnIGG2)vnT&)@d^-Nx2~hF|x#>b~zSyQtLe+$N&#D$#ZD zHBbq}YXu}S>zHnW#({~0!5}c<2oe#;-*Mv0Ry#kQO)FHfxj7%#$g?r4ZJsY^Li$)F zkMzep&jJ$#vCZ>#$vj+>`(YlYTAhOPTzgCAxq%qY!(8QNsw1PYwTtup#K2sG`(0!{ z$+rQ2t%i7G<>^F+oHjKhrCFoW%tUFDla>vX_FT}6)Z@N*G3J6B>qO7~-$CME!Je1v ze*{_l*?tbH(G$u^k;c1*cSuu6F{BaXM|4J+wMH}sPsmumCLK@@Pm9{{>d}M-^c?o^ z!rr5&)S*5!IW#r$sg7p{w2gdRX^5Bv{#=uH$FTWU3gF@DHerqMRADc0S;G)Ar_AHd z$vV+9F5f`nKM$8f$Di#VLH`SvkWxAXZl~yA1nhjsFClB3NkFgYZ!`)#PSCH+Cv*P` zkGkVOiw8`0NglB?j-Q~EI?LSudx#Cw+#C-l3FRs)Dws4bHpA(t_=m8_b@o6~N9w!t zT!Y>1k9`x|&j_63-TBzY%Z=yWCBBR=xdH{py$4C%d2zR#IR3UzKyU7zKmPIh!~QJ) z{rT6|&Y-(L%L~7E7yg%g)=%WC%(IIBxy5nG^Fo-#WgR?9jM5oRb->3p4)PaZ8UA9? l88(aI%otzdT(bK`=5f!rOe|fk-n_VZ_sQ+Eg8RUK1y=rm4$Mpp zuyp3nsF)bxPhe-@`<$F`Llh-lDsk5HyZ7_%eeZm3*4lfu2iEp_#cI~tYkm-VC2K!) zv>&T}6}oz3XRBn@mFH;hg%w9t>kzz_D9hfo?49by{pwc5+NjvJwdjzgM)RhKoUMvn z1qYKQ5XUme$kdUpgZhpRoleKmZV!?O<4MYOW1@oBw zk*A5H11HS#aO0+)dGs>J48e)~_ zj}oQvK)FmC>z=2m^WsDYag>TO6DYafEo{c%znrv2{{b@oMa((!{)doF9@znbhx3r}4d@M_6GI`R^BcWiITGigd2 zniQI{*iyl>4cbILuH+*off>ReqAm+y$1h06i#d0akS zA}+4Pasb@Az@i82Y{;)6EA+&XH*y}0ao=a)!S9E)nfiE6{&zgiP~)tAKgr?2@8Bco zvc7|V`<>$achT?joo3%Y=lVR)y=d;UyNGq;R3G_+NK!9>h@s)Zp) z!tV;~<~$KU`bM}P0&vDx#yZ~Xv~lF`A#*0FFW@Oc!MGEUS$A684cN`PtnE4I-R;vy zKi_`Xo#em2{QB1H?C(zUk>C5V|6e}oXXK02vx5IbhU0?$LRePc9q=I1o=Rk>9JZ_P xq_4md{6&IeOyXaEUBqS1_m9x%u3gx4WZYavVHUhXQr;r(kcDWv)Ws%z zhn(s%(bK6e!v!@!^1n6mTh6*VUtGIryV_Du_9#p$W>?2-S*Pw-WMOm}>%`UB-?EO( zF8zoMa~sVmWv-v?Ke%i%SF_I2#${C1`Lt!7+su=G?vrga<4P*>GaE`po0~Guv%*0qd%vH+iRf)tnC~6eV=;6K4CtwO|4y~bKmFHhJ6IP z%p*3fteMdYuHV~#d07WnyU)UA&Mf=<*s#wt*2z3CsMbvROKGaPO{Jr)YL``I23K%r>6P)AX-o_Yk9n-&H z&IF&CmBRVV2oX+}%VNQtl)Xx>yPQ6ztSK4o!}_mF_KLixQ9p?7GcV)nabLv0U)q2t z%-zN#u@GMe|GQSc;QvnjU-*TY59DR$xx6BS5hFK@ShBD26%QE@JjVnV@UQbupDyve zq|HiaY>kE0HN8SN*EBU>UG{|^cl-`$Lw~U%kMY|f)55jP^{+bqE$;871M$|YYu~4w Qx2kT{yKdKY(IKP2AM59Lng9R* diff --git a/spm8Batch/matlab/segmentation_job_in_native_space.mat b/spm8Batch/matlab/segmentation_job_in_native_space.mat deleted file mode 100755 index bfdafe8e1660a11b8ecf770dbba267541eab8081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2384 zcmcgty>1gh5FQ^61R>E;fGDn{aN-~0$hMHcSOi&$r4Sn^VSPE<7ks|e-C9oGfXASq zpyV;~2-LK^043k7JTb#HGoB zC=MIYwc7i81-BLZ%J?U4G-Sf#^!jOBhewNZJbvd#u0qX z6Rk|3#x~C1dzbrJ2TwYVj(r_Ro{jT!!#Hrab$SGTqKpEIrbbT|uStj0 z#jizecy(z?eL98RTiCnwfjZQKCV{3%Wh&uU1wBVR&cr!~%a}!E9l^5v5K<$0q0X3~S$ZI116n1#fi^tlSS&;zii^*jJOOws}ghNFAB;NZ0WWWT~S= zbBXcY-nw}`uFJ<5FLCDVd>x$GbqHhYa)G9ix~xwP+3 zc0Q6~tb?}!zcgM0`R4KRjphCL{~>0)-$1MCTZ27~mrwTQ@p^b$21~5AZ&ElJFAwP( zK6l0_I32v0j^pHc9phiMKj}HR*>{$GL;IfH?!A4Cyji^2eaaqXpL}Qee{QGs^w018 rCoiw7Q+BNmMGAMJNI@EpOP48KdQzpdJC{k9A~Vi=yYC?(>4e0ufnAO6?a#a2+wb0eZ}*)v zH8M9ja@qc(x8I%`nY)HaY^c9~C^le!7K_L2@hev^*TW!re&>Ze!|RWSP=Zp8G*jY*5llfX;ou9kg+|#cEMCA&ekW zhWwKbxob~lvFEcm4*xBW$K7Br4^>SF?n57Z4IVg9#A6>GQ*awgIV@$cJO-;!P_0?W zqg)1G>5af7%;IMhCQxe@R$visVS9?(XW<)|f;p`5u%-{<5W~+U{PtsiG*TMRSw?*t zlXCOe7FVStYLwUYVrv#ZJ=m_(IgXgneAX}gI@ONnQnH`}Tf%@ZP4WHdd@7gp6!#K+ zwyJj00!U?&M9VzIR?Xg_(OoP&3b%K`I(*mI--d)Ci-LIG?sFIs$___r{xCuqG)$lsy!0o1X++_Ts2JRXt>+X})_3(XDt$Ynet03gz-A@t zRZ@5_c%9go9}jWQGHz+TcnbF-dEATWwCm@4&;4bj3KOc3b)sflfWePzs%=&Z&e5LD zs+t+`&i6j4*}Pe4bME1%n^i|LBYq>;uXZWF)@cv(o-Y9dXJOzu8&u`KMEq;X&NQMW zKO0FfP)hE^-cDf$(*KgXvY1nw+G*}~Z-wBqzynsVqnpF0oi9(WKa49_N+DQ)A6~nE z?dkWw3|Gqke*fpssm1BxN~!gJV*Qe=)RQueb5!s?ID5R1AY1^ne9`fd-!-rEzW5LJ zKaH#}%by$1FRr9~iWjY_*<0{3u3;k*XG&+C+!6(vC>%%(Oz|eNSy@Nx*pZG+boF8b zwc(d&LCVAhp#dD2e#YopgE)w94fUwSUE5tH~+;T7tGlK53AixfXA*C$f^Zks+` zT^D8LJqKY!Nu<2@ke@HfdGa1a{Eo=V_aZU#o>K#Ajs^jPfI+|@U=T0}7z7Lg1_6VB zLBJqj5I_VZo{^yd1Ew|p9pYidGboNA@d?`VQ#?S*l&3l=Q*40t|5B#B%x8i3|3C8Y ot9Lpd>F);re`1yYx3Sy)ra7=t;Qxc|w!d)>z+^a3veW+l2kEs^lmGw# diff --git a/spm8Batch/matlab/smooth_warped_functions_job.mat b/spm8Batch/matlab/smooth_warped_functions_job.mat deleted file mode 100755 index 39f5ee8b18e173ba39482b0327034c660a19c8e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95440 zcmd^|U2Yp?7=^!<6e1z9220$Q*7o?fccB7NsgaP{rkBWV6V)hbLSodi6V`xG*T7P^ zWEs4#zgRI5I^!TN;`2%eBRkRJMVNRo!;Ok(O3D3q*Y>}=T>J0) z=capQXL;;AUcSb~*-5Tm9_NpXtM{?VaaQjyA1}^ki}~z$d7KY7JkDpaf4-l5yf`^M zU4*pM)%}mh`7-u>Gh58!;pqL_)c0ob%h_Qm^Q!gi{P1Z0Ay&tfuk+VWSGx0kb9q&MjP0*4w?8WfWxqU+H5akwVd<4_ zd<|o6;&}N=N3qYlcz(WSe)mIc>&4Rhe=I+UE%W%gAKU8WuCou(*+6s-AUcN-og;|O zF+}GCqH}r!od@yU^_=i~EN@Rv=q{CRk`uODXH7)@I%^{G*I5&hzs{P7{B_nugcH)Lfo1bI*MZBo8%^Jk%6M9%>+Ys40v*)Ijo31Ia@TBo7TBd1wI1Ljy=2 z8bI>U0Fs9WkUTVip14-FuBXaLDWd5tomryfG`&=8V`hLAiogyf+iBo7TCd1wg9 zLqkX&8bb2W2$F|JkUTVk zd1wO3LsLi|nnLo>6q1LgkUTVnMa{0f}e~$R7a@x_p`q|V@A-) z=!fbE)dW8o{ZJjDn&2m+AF3l%6Z~ZKLv@5|e?RL8)dZc4eyEO6P4JV^57iN>34SvA zp*lkKCVsw%-hTZ$jN8V~?qB0)_lqY#Tj{KHq|MH+Y_p%0j^wYi(g6H*=I`2^+43(q=jj!uR!@aNGFV>hEX0I)R|mhZm{+^x;Knoi!0{^80qX ze?EQqNZQYui2VJmiO64PO+@}WeRz@j=hKH5sdPH=v$ak}9&+MmYd;xzsBd&XulAFX zhx$hM^J+gCdB};Mt^H)=At!#e^3#c*t#vZ`At!#e_LI>MIq|c#pNxLUiJz_gWb{K$ z{A}f?6F*z)Wb{K${A}$fqaSkOXKOzh{g4wsTl>lAhn)D?+D}G5BP_0IvM?t6F*z~ z$>@ii_}SV|MnB}l&(?l2`XMKNw(>K_V|3v~w&~1zV=*)(QpfeK@L1#8Z1f7|P2s*PN^4ICZ&(=AiXTytZ)5*v~y~4;tKK$&q z&n+Vl`S7#b{AA=IAAWY5pNu@@!_U@!`tY;cbTaag4?nxjPewoF!_RK>lhF_P@Uz?e zWb{Km{A}%~4?nw2C*ypX4?nxjPewoF!_RK>lhF_P@Uxq1{Orb*pRIJ(t2H+}kMttW zH?4C{ZyOI?>8y9J`0K1!Yx?WV-?ceya{hChKezR2O@E#B?iGKX^=eIjo%QaO&2%2b z&++=-mD|S8R)1HV_}N;g&;7hwXH7(#{9W1Z&uvXa{yKf`U(ui2nuz@Utcl29XH7)@ zI(_b6(LbL)_wy>9PW)`GlaYs<_}SV|MjmqFXKOzhdB};Mt^H)=At!#e_LGr^ocP(w zPbYr1*2(CHocP(=PewoF#Lw1#GWsDWezx|L(GNNCvz4Dt{A{h0(GNNCv$da$e#nWR zt^H*5Lr(l`?I)uja^h!eKNBP_0IvM?t6F*z~$>@ii_}SV|MnB}l&(?l2 z`XMKNw(`@7pRIK=`XMKNw)T_J4>|F(wV#ZB$cdk={bck*PW)``C!-&7;%6&Ao%q>W zC!-&7;%93=8U2tGKU@3B=!cy6+1gJ=Kjg&ER(?A1v$ak}Kjg&E)_yYjAt!#e_LI>M zIq|c#pNxLUiJz_gWb{K${A}f?6F*z)Wb{K${A}$fqaSkOXKOzh{g4wsTl>lAhn)D? z%1C8k#(3uSpL1!i+g3fG+2s$$n5p-rlM9`Uu zh@dkYB7dDe{A`^QeE8XIIvIJ$ho9Z%CnFE_3L_8s@Uz=Kw~RdG!_RK>laYsf_}SV| zAAWY5PDUQ`;b*t`$;d-K{OmSA8U2tCKfBFOMnB}k&(?nW@Uz==GR~Lz@Uz?eWSlSa z;b*t`$>@i!_}Se!|L|$dyO)pgQ0`qWClB+Jm{(lPyRo#pySqGJ(Y9aibG2XnF3)rP WAN%dZadKLJpX;x;Q|^|F*#0-PvVJQ7 diff --git a/spm8Batch/matlab/warp_all_phases_functionals_job.mat b/spm8Batch/matlab/warp_all_phases_functionals_job.mat deleted file mode 100755 index ef78be1dafc204a4410a407b63acf197bb894c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95888 zcmd^I&2Af27`-t`)dE6@C-4K5CiClYR)h+qN(mq}>9(2#hq!VackDJ@@(3(hA(jZS z;wf06F1zfKw1?te3B7sqGa>9+LUy;qmF`**uhyBK}jKbvm%zwE~SomtoKH~p;I-YU1Nyq|An zS%1|jtliuDD1>nH=~}p)NO718Jx2V$vQSwu_?^Sqnk;|KrK){d>#a zf8Sp>ZG`pZvGsU*j`{3VyO+oLe#PV1_33;*YZv2ovOG?+;&I-W{q=fuK9$?vPR8?* zEbFBB{#vYtPw%B3Pv_^|c%jGAzdYn(B&7T}Tl357d*=#XBo6eUj@wl^Y zwd=clT;X%tp2`(=qj`Hen_R}NC%?+?go}asd>R(Z&+UZWa9@7zhI{g<`{7AA43A{{ z(Z%-r;X&97`_eO)p3RVjE%~XW6>>a1(|Ks+Y%^IpkxyjOHw)iM&qG<7hC6b$R{A5Z zj~~CjzjpnG>qqI(KI_-}@Isn*ANDVOUhl&%(*Cdea4h$3D)&wAy)HeJdz8Jkc1QZh z@^f3ZVB^cd@fG0sN^pD?IKCPj-vAt61CDRF#P?FZuf6a01KDnRK)>IAm3Cde-?!vi zb<*$om(oyiW`a#8bewsF36HZN!C8{vtVnRyBsd2oI2#h2LkgU^xFK=E)(N>dI~+JU z^iVE7CkLM#dMFp~nuAXcJ(LFyJ(LFyJ(LFyJyekBp@KvY6@fz!6(oA72poE-Akjlb z;Lt+_i5@CQ^iV;fhe{GXRFdeSl0*-cBzmYM(L*JP9x6%nP)VYPN)kO(lIS5FVa?!E zS0s9^BzkB_qKAeg zdT27}Ai~EP-?+!e87mOs!&d$GmI#-X2b*oJS8QQm&DQ6DjA>!-n_%T$r*UHCUVAt>^bl6=wZ|ui9>U7K z_W0z`Ls+@j9-ka~2rKv6!XLN|raax6He4HG52r2j4(|uXs&_hVM*FK*ddI%}^+UJu)4`Lqhv_&7QIA*)c0 z&nJgJWEHCM`Q-42tU|T&`Qn=AUKelVUKen=*J*qhxz}lY7`fMJd>FacX?z&D*J*qh zxz}lY7`fMJd>FacX?z&D*J*qAe#VC(?Vk9!{k9PCT4Q@8Nnl zk={G;a3Z~j>)}Lt@5IB2^d4>+r;RE=*F!d{03RoZ9?eWR+ybLS%+T)Ysc^Ovjb(&AC+-nafhd+dsd+qVb;SXWuUVD6U_(NE^ z*B+l7{t#B~wZ|uiKZKQgo#qoO_u9kB;SXWuUVD6U_(NE^*B+l7{t#B~wZ|uiKZKQg zo#qoO_u9kB;SXWuUVD6U_(NE^*B+l7{t#B~wZ|uiKZKQg?eWRs4`JnAr}@Onz4mZ& z_(NE^*B+l7{t#B~wZ|uiKZKQg?eWRs4`JnAr}@Onz4mcNhX|n_x{os|B7B_DA;QNQ z6%jtp=n&!KjEV>!XLN}0aYjXik25+%=s2xHH9k%bJ%p5d?dd+G+-n~vhaSoThaN)8 zz4m`^IrI=x?zPV+haR#D)#!T2Dpcd+;SX7bYJ5I9{2{AQ zjn1c4sK&?1;SX7bYJ5I9o|jpLYJ5I9{2{AQt$aRT3*m;$Z%XS)(`iGRuFIx>nk-8H zdboAbr;2LUjpn27=_ni?>Smdqo;`~Tv_F&2rS{Y7e@~iTw@$kJp|sy$eHDIqwHy9?b)enhD(Am^oSq!1*XvzrKf7mo c9=&c||1am${omeiT{~q;-KTXq1gh5S| z0r3Pp0ZK{9W6*`~TW7^3a=nA)wOWjsK~0fVLGUXFO3cxnF+&MSgF>lTlH!!+$dKn;k+bEyUn{IvU5}9 zI^-&N2~1i6`!#Lk+u$U!an$KVw%f-_g!!w5{J>eK=hL+!%MP1(+#}BtnjOwpZ0PHl z1;^J%nP-vJQS5NWbK=}WKI@?zpzTqta|NBm^F5ps5AASxlq$C)qpgQ?c;9c#cTSJ@ z0C@SZa|{9CG_yJ#+o@vu~so zu)h!5yq)oom7n9$J)o!{}Ei0L&-&n!EXt_T^V5&W7Ws{g^VS0UM&gaK&*>v z$ey(DY|Ad9S~8T59K+u|_qXJ=G^Gto4ogWYQpU3hehfVBG?ECrWzhPFsKA!V5iIN2 zL*rS4jl^@6!B?G&F{I+Txc=Y2-~Ic!;GFKDk5*wO@kx}C(noy@OP-{YiG^ZR4;G`2 z?7Iwu+a21pN6SFl9KyMrbocQCs=r5nU&Z;P&D(i@p9}HR=J{zMp8ogXKhJYZQt4sd zCex=7-I4=LY7H7EFoE_4UX7SOv{zD<4S9kIEWx7S&+u+UPUjT2F{KwL_Fv|;IOpsW z>8kz&=oG&Lm-m|`kGRaMf&G0<>+d!A{e95S*u=e`i|uLE{ifA9Z4QY~CM`>V_fzB-3;D$z diff --git a/spm8Batch/matlabScripts/UMBatchCoReg.m b/spm8Batch/matlabScripts/UMBatchCoReg.m index efc0b5ab..3b82a553 100755 --- a/spm8Batch/matlabScripts/UMBatchCoReg.m +++ b/spm8Batch/matlabScripts/UMBatchCoReg.m @@ -36,6 +36,7 @@ % changed by users, we don't want to hard-code options here. global defaults +global UMBatch % % Set the return status to -1, that is error by default. @@ -43,6 +44,17 @@ results = -1; +% Make the call to prepare the system for batch processing. + +UMBatchPrep + +if UMBatch == 0 + fprintf('UMBatchPrep failed.') + return +end + +% Only proceed if successful. + fprintf('Entering UMBatchCoReg V2.0 for SPM8\n'); if TestFlag~=0 diff --git a/spm8Batch/matlabScripts/UMBatchPrep.m b/spm8Batch/matlabScripts/UMBatchPrep.m index 2db6eb69..a8e8b196 100755 --- a/spm8Batch/matlabScripts/UMBatchPrep.m +++ b/spm8Batch/matlabScripts/UMBatchPrep.m @@ -12,7 +12,12 @@ % Turn off progress bar. +function UMBatchPrep + global UMBatch +global UMBatchInit + +% Success code. UMBatch = 1; @@ -20,14 +25,16 @@ if exist('spm') ~= 2 fprintf('\nFATAL ERROR, no SPM in the matlab path!!!\n'); - exit + UMBatch = 0; + return end % Check for SPM8 if strcmp(spm('ver'),'SPM8') == 0 fprintf('\nFATAL ERROR, these scripts only are SPM8 specific!!!\n'); - exit + UMBatch = 0; + return end % Make sure spm_defaults has been called. @@ -43,21 +50,25 @@ if isempty(defaults) fprintf('\n\n* * * * * \nAre you not running SPM8?\n\n* * * * * \n\n'); fprintf(' A B O R T I N G\n\n'); - exit + UMBatch = 0; return end end % Initialize the batch processing system. -fprintf('Initializing the job manager in SPM\n'); - -spm_jobman('initcfg'); +if isempty(UMBatchInit) + fprintf('Initializing the job manager in SPM8\n'); + spm_jobman('initcfg'); + UMBatchInit = 1; +end % Turn off annoying warnings. warning off +return + % % That is all. % diff --git a/spm8Batch/matlabScripts/UMBatchSegment.m b/spm8Batch/matlabScripts/UMBatchSegment.m index da084014..7e3a95e0 100755 --- a/spm8Batch/matlabScripts/UMBatchSegment.m +++ b/spm8Batch/matlabScripts/UMBatchSegment.m @@ -38,6 +38,7 @@ function results = UMBatchSegment(Image2Segment,TestFlag,NormedAlready); global defaults +global UMBatch results = -1; @@ -49,6 +50,13 @@ UMBatchPrep +if UMBatch == 0 + fprintf('UMBatchPrep failed.') + return +end + +% Only proceed if successful. + fprintf('Entering UMBatchSegment V0.1\n'); if TestFlag~=0 diff --git a/spm8Batch/matlabScripts/UMBatchSmooth.m b/spm8Batch/matlabScripts/UMBatchSmooth.m index d4c67fcc..acb29b19 100755 --- a/spm8Batch/matlabScripts/UMBatchSmooth.m +++ b/spm8Batch/matlabScripts/UMBatchSmooth.m @@ -40,6 +40,7 @@ function results = UMBatchSmooth(Images2Smooth,sKernel,OutputName,TestFlag); global defaults +global UMBatch % % Set the return status to -1, that is error by default. @@ -47,6 +48,17 @@ results = -1; +% Make the call to prepare the system for batch processing. + +UMBatchPrep + +if UMBatch == 0 + fprintf('UMBatchPrep failed.') + return +end + +% Only proceed if successful. + fprintf('Entering UMBatchSmooth V0.1\n'); if TestFlag~=0 diff --git a/spm8Batch/matlabScripts/UMBatchVBM8.m b/spm8Batch/matlabScripts/UMBatchVBM8.m index 254a622e..dd9286c6 100644 --- a/spm8Batch/matlabScripts/UMBatchVBM8.m +++ b/spm8Batch/matlabScripts/UMBatchVBM8.m @@ -43,12 +43,19 @@ % % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function results = UMBatchVBM8(ParamImage,TestFlag); +function results = UMBatchVBM8(ParamImage,ReferenceImage,TestFlag,VoxelSize,OutputName); % Get the defaults from SPM. global defaults global vbm8 +global UMBatch + +% +% Set the return status to -1, that is error by default. +% + +results = -1; if isempty(vbm8) if exist('cg_vbm8_defaults') == 0 @@ -56,7 +63,7 @@ fprintf(' FATAL ERROR \n'); fprintf(' You do no have the VBM8 toolbox\n'); fprintf('\n\n* * * * * * * * * * * * \n\n'); - exit + return else fprintf('\nConfiguring VBM8 to defaults\n'); cg_vbm8_defaults @@ -67,18 +74,19 @@ UMBatchPrep +if UMBatch == 0 + fprintf('UMBatchPrep failed.') + return +end + +% Only proceed if successful. + fprintf('Entering UMBatchVBM8 V2.0 SPM8 Compatible\n'); if TestFlag~=0 fprintf('\nTesting only, no work to be done\n\n'); end -% -% Set the return status to -1, that is error by default. -% - -results = -1; - % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % @@ -175,6 +183,30 @@ UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchVBM8 : VBM8 created skull stripped : %s',Vo.fname)); +% And now warp the parent image to the specification and with the +% name specified. But we only do that if they specified anything +% different. + +if exist(ReferenceImage) | VoxelSize(1) > 0 | strcmp(OutputName,'w')==0 + % + % Okay looks like they want us to override what they have, so we + % need to build a list and then pass on to UMBatchWarpVBM8 + % + % The images to warp are [ParamImage], bet_[ParamImage], + % p0_[ParamImage], p1_[ParamImage], and p2_[ParamImage]; + % + IMAGELIST={'','m','bet_','p0','p1','p2','p3'}; + PList = []; + for iP = 1:length(IMAGELIST) + Pthis = spm_select('ExtFPList',ParamImageDirectory,sprintf('^%s%s.nii',IMAGELIST{iP},ParamImageName),[1 inf]); + PList = strvcat(PList,Pthis); + end + results = UMBatchWarpVBM8(ParamImage,ReferenceImage,PList,TestFlag,VoxelSize,OutputName); + UMCheckFailure(results); +end + + + clear matlabbatch % diff --git a/spm8Batch/matlabScripts/UMBatchWarp.m b/spm8Batch/matlabScripts/UMBatchWarp.m index d80c1c90..14916774 100755 --- a/spm8Batch/matlabScripts/UMBatchWarp.m +++ b/spm8Batch/matlabScripts/UMBatchWarp.m @@ -21,7 +21,7 @@ % % TemplateImage = Image to warp the Parameter image. % ParamImage = Image to determine warping parameters. -% ObjectMask = Masking Image. +% ObjectMask = Masking Image/ReferenceImage for VBM8 % Images2Write = Images to write normalize. % TestFlag = Flag to test file existance but do nothing. % @@ -52,11 +52,19 @@ % Get the defaults from SPM. global defaults +global UMBatch % Make the call to prepare the system for batch processing. UMBatchPrep +if UMBatch == 0 + fprintf('UMBatchPrep failed.') + return +end + +% Only proceed if successful. + fprintf('Entering UMBatchWarp V2.0 SPM8 Compatible\n'); if TestFlag~=0 diff --git a/spm8Batch/matlabScripts/UMBatchWarpVBM8.m b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m index 3fc621af..4f20a578 100644 --- a/spm8Batch/matlabScripts/UMBatchWarpVBM8.m +++ b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m @@ -16,7 +16,7 @@ % % Call as : % -% function results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +% function results = UMBatchWarpVBM8(ParamImage,ReferenceImage,Images2Write,TestFlag,VoxelSize,OutputName); % % To Make this work you need to provide the following input: % @@ -47,7 +47,7 @@ % % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function results = UMBatchWarpVBM8(ParamImage,ObjectMask,Images2Write,TestFlag,VoxelSize,OutputName); +function results = UMBatchWarpVBM8(ParamImage,ReferenceImage,Images2Write,TestFlag,VoxelSize,OutputName); % Get the defaults from SPM. @@ -105,7 +105,7 @@ % Name of the deformation file -matlabbatch{1}.spm.util.defs.comp{1}.def{1} = fullfile(ParamImageDirectory,['y_' ParamImageName ParamImageExt]); +matlabbatch{1}.spm.util.defs.comp{1}.def{1} = fullfile(ParamImageDirectory,['y_r' ParamImageName ParamImageExt]); % Check to make sure that the defomation field is there. @@ -115,20 +115,30 @@ return end -% Size of the data we want to write out. +% Now if there is a reference image then we rewrite comp{2} -if VoxelSize > 0 - matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.vox = VoxelSize*ones(3,1); +[d1 d2 d3 d4] = spm_fileparts(ReferenceImage); + +if exist(fullfile(d1,[d2 d3])) + matlabbatch{1}.spm.util.defs.comp{2}.id.space{1} = [fullfile(d1,[d2 d3]),',1']; + USINGREF=1; else - matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.vox = defaults.normalise.write.vox; + % Size of the data we want to write out. + + if VoxelSize > 0 + matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.vox = VoxelSize*ones(3,1); + else + matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.vox = defaults.normalise.write.vox; + end + + % We use the default bounding box. + % Though we need to add the option of using a reference images as + % well. + + matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.bb = defaults.normalise.write.bb; + USINGREF=0; end -% We use the default bounding box. -% Though we need to add the option of using a reference images as -% well. - -matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.bb = defaults.normalise.write.bb; - % No option here. matlabbatch{1}.spm.util.defs.ofname = ''; @@ -149,24 +159,10 @@ matlabbatch{1}.spm.util.defs.interp = 1; -% -% Check to see if they want a mask on the object --- this is NOT -% implemented in the present work. - RCWelsh 2012-03-09 -% - -if isempty(ObjectMask) | ObjectMask == '' - ObjectMask = ''; -else - if exist(ObjectMask) == 0 - fprintf('Object mask specified is missing\n'); - fprintf(' * * * A B O R T I N G * * *\n\n'); - return - end -end - % % Now see about the images to write. Bugger out at ANY error! % + if isempty(Images2Write) fprintf('\nYou did not specify any images to write deformed\m'); fprintf('\n * * * A B O R T I N G * * *\n\n'); @@ -197,8 +193,13 @@ fprintf('Would be warping %d images like %s\n',size(Images2Write,1),deblank(Images2Write(1,:))); % Warping writing only. else - fprintf('Warping %d images like %s to voxel size %f\n',size(Images2Write,1),deblank(Images2Write(1,:)),VoxelSize); - + if USINGREF + fprintf('Warping %d images like %s to space of %s\n',size(Images2Write,1),... + deblank(Images2Write(1,:)),matlabbatch{1}.spm.util.defs.comp{2}.id.space{1}); + else + fprintf('Warping %d images like %s to voxel size %f\n',size(Images2Write,1),... + deblank(Images2Write(1,:)),matlabbatch{1}.spm.util.defs.comp{2}.idbbvox.vox(1)); + end spm_jobman('run_nogui',matlabbatch); % Log that we finished this portion. @@ -210,17 +211,17 @@ % We only operate on NIFTI so we can just take the unique ones, % and return the count. - [Image2WriteUnique Images2WriteCount] = uniqueNII(Images2Write); + [Images2WriteUnique Images2WriteCount] = uniqueNII(Images2Write); - for iNII = 1:size(Images2WriteUnique) - [d1 d2 d3 d4] = spm_fileparts(Images2WriteUnique(iNII,:)); + for iNII = 1:size(Images2WriteUnique,1) + [d1 d2 d3 d4] = spm_fileparts(strtrim(Images2WriteUnique(iNII,:))); newFile = fullfile(d1,['w' d2 d3]); if exist(newFile) == 0 fprintf('\n\n* * * * * * * * * * * * \n\n'); fprintf('FATAL ERROR - I CAN''T FIND THE OUTPUT FILE EXPECTED : %s\n',newFile); fprintf('ABORTING\n'); fprintf('\n\n* * * * * * * * * * * * \n\n'); - exit + return end end @@ -231,19 +232,26 @@ newImages2WriteUnique = []; if exist('OutputName') == 1 & strcmp(OutputName,'w') ~= 1 - % We need to identify all of the files that need to be renamed. - for iNII = 1:size(Images2WriteUnique) - [d1 d2 d3 d4] = spm_fileparts(Images2WriteUnique(iNII,:)); - oldFile = fullfile(d1,['w' d2 d3]); - newFile = fullfile(d1,[OutoutName d2 d3]); - [mS mM mI] = movefile(oldFile,newFile); - newImages2WriteUnique = strvcat(newImages2WriteUnique; newFile); - end + % We need to identify all of the files that need to be renamed. + for iNII = 1:size(Images2WriteUnique,1) + [d1 d2 d3 d4] = spm_fileparts(strtrim(Images2WriteUnique(iNII,:))); + oldFile = fullfile(d1,['w' d2 d3]); + newFile = fullfile(d1,[OutputName d2 d3]); + [mS mM mI] = movefile(oldFile,newFile); + if ~mS + fprintf('\n\n* * * * * * * * * * * * \n\n'); + fprintf('FATAL ERROR - I CAN''T NAME OUTPUT FILE AS EXPECTED : \n %s\n %s\n',oldFile,newFile); + fprintf('ABORTING\n'); + fprintf('\n\n* * * * * * * * * * * * \n\n'); + return + end + newImages2WriteUnique = strvcat(newImages2WriteUnique, newFile); + end end ImageDirectory = fileparts(Images2Write(1,:)); - for iNII = 1:size(Images2WriteUnique,1);a + for iNII = 1:size(Images2WriteUnique,1); UMBatchLogProcess(ImageDirectory,... sprintf('UMBatchWarp : Warped images (frames:%04d) : %s -> %s',... Images2WriteCount(iNII),... diff --git a/spm8Batch/matlabScripts/uniqueNII.m b/spm8Batch/matlabScripts/uniqueNII.m index 73f62edf..d7aabd52 100644 --- a/spm8Batch/matlabScripts/uniqueNII.m +++ b/spm8Batch/matlabScripts/uniqueNII.m @@ -32,8 +32,8 @@ count(iP) = 0; for iO = 1:size(inputList,1) [d1 d2 d3 d4] = spm_fileparts(inputList(iO,:)); - if strcmp(uniqueList(iP,:),fullfile(d1,[d2 d3])) - count(iP) = count(iP) + 1; + if strcmp(strtrim(uniqueList(iP,:)),fullfile(d1,[d2 d3])) + count(iP) = count(iP) + 1; end end end diff --git a/spm8Batch/parts/coreg_part_2.m b/spm8Batch/parts/coreg_part_2.m index dd55ca47..23503e24 100755 --- a/spm8Batch/parts/coreg_part_2.m +++ b/spm8Batch/parts/coreg_part_2.m @@ -15,7 +15,8 @@ fprintf('%s\n',TargetImageFull); fprintf('%s\n',ObjectImageFull); fprintf('UMReSlice:%d\n',UMReSlice); - UMBatchCoReg(TargetImageFull,ObjectImageFull,UMOtherImages{iSub},UMReSlice,UMTestFlag); + results = UMBatchCoReg(TargetImageFull,ObjectImageFull,UMOtherImages{iSub},UMReSlice,UMTestFlag); + UMCheckFailure(results); end fprintf('\nAll done with coregistration.\n'); diff --git a/spm8Batch/parts/smooth_part_2.m b/spm8Batch/parts/smooth_part_2.m index 9784651a..3785af81 100755 --- a/spm8Batch/parts/smooth_part_2.m +++ b/spm8Batch/parts/smooth_part_2.m @@ -23,7 +23,8 @@ [CS SandBoxPID Images2Write] = moveToSandBox(UMImgDIRS{iSub}{iRun},UMVolumeWild,SandBoxPID); %P = spm_select('ExtFPList',UMImgDIRS{iSub}{iRun},['^' UMVolumeWild '.*.nii'],inf); fprintf('Smoothing %d "%s" images in %s with %2.1f %2.1f %2.1f\n',size(Images2Write,1),UMImgWildCard,UMImgDIRS{iSub}{iRun},UMKernel(1),UMKernel(2),UMKernel(3)); - UMBatchSmooth(Images2Write,UMKernel,OutputName,UMTestFlag); + results = UMBatchSmooth(Images2Write,UMKernel,OutputName,UMTestFlag); + UMCheckFailure(results); % % Now move back out of sandbox if so specified % diff --git a/spm8Batch/parts/vbm8_part_02.m b/spm8Batch/parts/vbm8_part_02.m index 912fca6e..51ed19b9 100644 --- a/spm8Batch/parts/vbm8_part_02.m +++ b/spm8Batch/parts/vbm8_part_02.m @@ -30,10 +30,11 @@ % ParamImage=UMImg2Warp{iSub}; if exist(ParamImage) == 2 - UMBatchVBM8(ParamImage,UMTestFlag); + results = UMBatchVBM8(ParamImage,VBM8RefImage,UMTestFlag,VoxelSize,OutputName); + UMCheckFailure(results); else fprintf('FATAL ERROR : Image to warpVBM8 process does not exist: %s\n',ParamImage) - exit + break end end diff --git a/spm8Batch/parts/warp_HIRES_part_2.m b/spm8Batch/parts/warp_HIRES_part_2.m index 59d54c74..b48eed98 100755 --- a/spm8Batch/parts/warp_HIRES_part_2.m +++ b/spm8Batch/parts/warp_HIRES_part_2.m @@ -23,7 +23,7 @@ fprintf('Working on %s\n',UMBatchSubjs{iSub}); % % Break into two steps, one to calculate the normalization for the - % SPGR. + % HiRes. % ParamImage = UMImg2Warp{iSub}; % @@ -34,10 +34,12 @@ for iW = 1:length(UMOtherImages{iSub}) Img2Write = strvcat(Img2Write,[UMOtherImages{iSub}{iW},',1']); end - UMBatchWarp(TemplateImage,ParamImage,[],Img2Write,UMTestFlag,VoxelSize,OutputName); + % Force the warping method to be the standard SPM8 + results = UMBatchWarp(TemplateImage,ParamImage,[],Img2Write,UMTestFlag,VoxelSize,OutputName,0); + UMCheckFailure(results); else fprintf('FATAL ERROR : Image to warp does not exist: %s\n',ParamImage) - exit + break end end diff --git a/spm8Batch/parts/warp_fMRI_part_2.m b/spm8Batch/parts/warp_fMRI_part_2.m index 41866471..7432e874 100755 --- a/spm8Batch/parts/warp_fMRI_part_2.m +++ b/spm8Batch/parts/warp_fMRI_part_2.m @@ -34,7 +34,12 @@ % % The other step to apply the normalization to the SPGR. % - UMBatchWarp([],ParamImage,[],Images2Write,UMTestFlag,VoxelSize,OutputName,WARPMETHOD); + if WARPMETHOD + results = UMBatchWarp([],ParamImage,VBM8RefImage,Images2Write,UMTestFlag,VoxelSize,OutputName,WARPMETHOD); + else + results = UMBatchWarp([],ParamImage,[],Images2Write,UMTestFlag,VoxelSize,OutputName,WARPMETHOD); + end + UMCheckFailure(results); % % Now move back out of sandbox if so specified % diff --git a/spm8Batch/spm8Batch_Global b/spm8Batch/spm8Batch_Global index e0d5e0f4..1e8b25fe 100755 --- a/spm8Batch/spm8Batch_Global +++ b/spm8Batch/spm8Batch_Global @@ -42,17 +42,17 @@ then # You must point to SPM8 !!! - SPM8B1=${topDIR}/SPM8/spm8_with_R4290 + SPM8B1=${topDIR}/SPM8/spm8_with_R4667 # This is Robert Welsh's UNIX batch interface to spm8 - SPM8B2=${topDIR}/spm8Batch_V2.0.4 + SPM8B2=${topDIR}/spm8Batch/spm8Batch_VBM8.1 # This must point to the place where the SPM8 patch is locally. - SPM8B3=${topDIR}/spm8Batch_V2.0.4/matlabScripts + SPM8B3=${SPM8B2}/matlabScripts - AUXPATH=${topDIR}/spm8Batch_V2.0.4/spm8_patch + AUXPATH=${SPM8B2}/spm8_patch # # If the sandbox is populated then we copy files to local disk for processing diff --git a/spm8Batch/vbm8HiRes b/spm8Batch/vbm8HiRes index 1d7cfdba..e8e4d888 100755 --- a/spm8Batch/vbm8HiRes +++ b/spm8Batch/vbm8HiRes @@ -37,7 +37,7 @@ thisDir=`dirname $theCommand` thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` -allowedOptions="aDdhMntUWwz" +allowedOptions="aDdhIMntUwz" # This piece of code all of the spm8Batch scripts will use . ${thisDir}/auxiliary/commonCode_AllScriptsStart @@ -128,7 +128,7 @@ do debugout "HiRes name is : ${SOURCENAME}" $SuperDebugFLAG debugout "- - - - - - - - - - - - - - - -" $SuperDebugFLAG - . ${thisDir}/auxiliary/coregFindSourceAndMove + . ${thisDir}/auxiliary/vbm8FindSourceAndMove echo "'${SOURCEIMG}';..." >> ${FULLSCRIPTNAME}.m diff --git a/spm8Batch/warpfMRI b/spm8Batch/warpfMRI index 49a57901..044947d5 100755 --- a/spm8Batch/warpfMRI +++ b/spm8Batch/warpfMRI @@ -37,7 +37,7 @@ thisDir=`dirname $theCommand` thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` -allowedOptions="DdfhMntUvWwz" +allowedOptions="DdfhIMntUvWwz" # This piece of code all of the spm8Batch scripts will use . ${thisDir}/auxiliary/commonCode_AllScriptsStart @@ -119,20 +119,21 @@ do . ${thisDir}/auxiliary/verifyTargetImage debugout "HiRes name is : ${TARGETIMG}" $SuperDebugFLAG + debugout "HiRes name is : ${HIRESNAME}" $SuperDebugFLAG debugout "- - - - - - - - - - - - - - - -" $SuperDebugFLAG - # Check for the warping matrix (_sn.mat) or the deformation field (y_). + # Check for the warping matrix (_sn.mat) or the deformation field (y_r). - if [ ${WARPMETHOD} == "1" ] + if [ "${WARPMETHOD}" -eq "1" ] then - WARP_FILE=${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${fmriPATH}/${coregPATH}/y_${HIRESNAME}.nii + WARP_FILE=${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${fmriPATH}/${coregPATH}/y_r${HIRESNAME}.nii else WARP_FILE=${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${fmriPATH}/${coregPATH}/${HIRESNAME}_sn.mat fi if [ ! -e "${WARP_FILE}" ] then echo - echo "MISSING warping instuctions for ${subjects[$is]}" + echo "MISSING warping instuctions ${WARP_FILE} for ${subjects[$is]}" echo # # remove the sandbox if we made one. From 7d1b637aa7f15b08c13c497bdc0000033f6f3e2f Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Tue, 13 Mar 2012 12:02:00 -0400 Subject: [PATCH 05/35] spm8Batch with VBM8 support - 2012-03-12 --- spm8Batch/.gitignore | 1 - spm8Batch/.spm8BatchVersion | 1 + spm8Batch/dev/post-commit | 8 -- spm8Batch/vbm8HiRes~ | 156 ------------------------------------ 4 files changed, 1 insertion(+), 165 deletions(-) create mode 100644 spm8Batch/.spm8BatchVersion delete mode 100755 spm8Batch/dev/post-commit delete mode 100644 spm8Batch/vbm8HiRes~ diff --git a/spm8Batch/.gitignore b/spm8Batch/.gitignore index 3535c5b2..70b7bd11 100644 --- a/spm8Batch/.gitignore +++ b/spm8Batch/.gitignore @@ -1,2 +1 @@ -.spm8BatchVersion Usage/ \ No newline at end of file diff --git a/spm8Batch/.spm8BatchVersion b/spm8Batch/.spm8BatchVersion new file mode 100644 index 00000000..b1024c69 --- /dev/null +++ b/spm8Batch/.spm8BatchVersion @@ -0,0 +1 @@ +spm8Batch VBM8 2012-03-13 diff --git a/spm8Batch/dev/post-commit b/spm8Batch/dev/post-commit deleted file mode 100755 index 9eeb58ae..00000000 --- a/spm8Batch/dev/post-commit +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -# -# An example hook script that is called after a successful -# commit is made. -# -# To enable this hook, rename this file to "post-commit". - -cat .git/`cat .git/HEAD | awk '{print $NF'}` > .spm8BatchVersion diff --git a/spm8Batch/vbm8HiRes~ b/spm8Batch/vbm8HiRes~ deleted file mode 100644 index 0609b2d9..00000000 --- a/spm8Batch/vbm8HiRes~ +++ /dev/null @@ -1,156 +0,0 @@ -#!/bin/bash - -# # # # # # # # # # # # # # # # # # -# -# A command to make it easier on the user to warp the -# SPGR to the standard template. -# -# This command will build a script to run and will also -# run the script in background. -# -# e.g. vbm8HiRes -# -# -# Robert C. Welsh -# Copyright 2005-2011 -# -# warpHiRes -# -# # # # # # # # # # # # # # # # # # - -# -# Main warpHiRes function. -# - -VERSION="2.1" -VERSIONDATE="2011-07-30" - -# Find out where the current command lives and execute some common code. - -theFullCommand="$0 $*" -execDIR=`pwd` - -# Find out where the current command lives and execute some common code. - -theCommand=`which $0` -thisDir=`dirname $theCommand` - -thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` - -allowedOptions="DdfhMnOTtUWwz" - -# This piece of code all of the spm8Batch scripts will use -. ${thisDir}/auxiliary/commonCode_AllScriptsStart - -# This is the common in-line code for the warping steps. -. ${thisDir}/auxiliary/commonCode_Warp_01 - -# This is common in-line code for all spm8Batch script to make sure arguments were passed -. ${thisDir}/auxiliary/commonCode_checkIfArgsPassed - -# -# The actual function. -# - -. ${thisDir}/auxiliary/parse_arguments - -# - -. ${thisDir}/auxiliary/superDebugStatus - -# -# Ok - let's start displaying things back to the terminal -# - -. ${thisDir}/auxiliary/shellScriptInfo - -# -# Prepare to write the script. -# - -# Makes sure they speficied some subjects. -. ${thisDir}/auxiliary/checkInputForSubjects - -# Write out debug status -. ${thisDir}/auxiliary/debugStatus - -# Ok, lets do the business. - -# Print out the list of subjects that we operate upon. -. ${thisDir}/auxiliary/printSubjectsList - -# Now start building the automatic scripts. - -# -# the following environmental variables are from spm8Batch_Global -# -# HOSTCOMPUTER - name of the computer. -# SCRIPTNAME - name of the scripts to write. -# MATLABDIR - location of the scripts. -# UMBatchMatcher - present working directory. -# FULLSCRIPTNAME - full path and name of scripts to write. -# - -. ${thisDir}/auxiliary/warpPart_01 - -# Now build the list of directories for each subject. - -echo "UMImg2Warp = {..." >> ${FULLSCRIPTNAME}.m - -declare -i is -declare -i ii - -curDIR=`pwd` - -for (( is=1 ; is<=$nSubjects ; is++ )) -do - - # - # Make sure that now the HIRES exists. - # - - TARGETNAME=${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${fmriPATH}/${coregPATH}/${HIRESNAME} - TARGETEXT=${overlayExt} - - . ${thisDir}/auxiliary/verifyTargetImage - - debugout "HiRes name is : ${TARGETIMG}" $SuperDebugFLAG - debugout "- - - - - - - - - - - - - - - -" $SuperDebugFLAG - - echo "'${TARGETIMG}';..." >> ${FULLSCRIPTNAME}.m - -done - -echo " };" >> ${FULLSCRIPTNAME}.m - -echo - -. ${thisDir}/auxiliary/warpPrepOtherImages - -echo " 4) finalizing matlab scripts" - -cat ${thisDir}/parts/warp_HIRES_part_2.m >> ${FULLSCRIPTNAME}.m - -echo " 5) building shell script" -echo - -# Now build the shell script command that will get launched into the background. - -# Common star to all shell scripts -. ${thisDir}/auxiliary/shellScriptStart - -# Add the matlab code to the shell script - -. ${thisDir}/auxiliary/shellScriptMATLABCall - -# Finalize the shell script. - -. ${thisDir}/auxiliary/shellScriptFinalize - -# Now launch into the background if desired. - -. ${thisDir}/auxiliary/shellScriptLaunch - -# -# all done. -# From baa7fe322c8d8abb11220bc81d726e44659cd778 Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Tue, 13 Mar 2012 13:30:33 -0400 Subject: [PATCH 06/35] Added some forgotten scripts for spm8Batch w/ VBM8 support --- .../auxiliary/help/help_case_set_reference | 8 +++ spm8Batch/auxiliary/vbm8FindSourceAndMove | 72 +++++++++++++++++++ spm8Batch/matlabScripts/UMCheckFailure.m | 30 ++++++++ 3 files changed, 110 insertions(+) create mode 100644 spm8Batch/auxiliary/help/help_case_set_reference create mode 100644 spm8Batch/auxiliary/vbm8FindSourceAndMove create mode 100644 spm8Batch/matlabScripts/UMCheckFailure.m diff --git a/spm8Batch/auxiliary/help/help_case_set_reference b/spm8Batch/auxiliary/help/help_case_set_reference new file mode 100644 index 00000000..a17d16f1 --- /dev/null +++ b/spm8Batch/auxiliary/help/help_case_set_reference @@ -0,0 +1,8 @@ + echo " -I ReferenceName set the reference image to use for VBM8, " + echo " you can specify relative to :" + echo " ${TemplateImageDir}, or." + echo " specify an absolute directory path." + echo " default is none, but to use defaults.normalise.write.bb" + echo + echo " A reference image takes precedence over the voxel size." + echo diff --git a/spm8Batch/auxiliary/vbm8FindSourceAndMove b/spm8Batch/auxiliary/vbm8FindSourceAndMove new file mode 100644 index 00000000..8b5c784b --- /dev/null +++ b/spm8Batch/auxiliary/vbm8FindSourceAndMove @@ -0,0 +1,72 @@ + # Now lets find the source and move it into where we need it to be. + + cd ${fmriPATH}/${coregPATH}/ + anatPATH=`pwd` + + + destSOURCENAME=${SOURCENAME} + + # + # remove any current coregistation in that directory. + # + \rm ${destSOURCENAME}.* 2> /dev/null + + # + # now copy over the virgin copy of the anatomy, after we find it. + # + + USEEXT= + + # + # If no extension was specified so we will find one, and we can do this independently for each + # subject, else we use the one specified and we stripped. But we also check to see if the overlay + # image really exists, else we bugger out with error. + # + + if [ -z ${SOURCEEXT} ] + then + for EXT in .nii.gz .nii + do + if [ -e "${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${anatomyPATH}/${SOURCENAME}${EXT}" ] + then + USEEXT=${EXT} + fi + done + else + USEEXT=${SOURCEEXT} + fi + # + # We did not find anything. + # + if [ -z ${USEEXT} ] + then + echo + echo "Scanning for source image : ${SOURCENAME} for subject : ${subjects[$is]} returned no result." + echo + echo "ABORTING" + echo + . ${thisDir}/auxiliary/exit_w_removal + fi + + if [ -e "${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${anatomyPATH}/${SOURCENAME}${USEEXT}" ] + then + cp ${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${anatomyPATH}/${SOURCENAME}${USEEXT} ${destSOURCENAME}${USEEXT} + debugout "- - - - - - - - - - - - - -" $SuperDebugFLAG + debugout "cp ${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${anatomyPATH}/${SOURCENAME}.nii ${destSOURCENAME}.nii" $SuperDebugFLAG + debugout "- - - - - - - - - - - - - -" $SuperDebugFLAG + else + echo + echo "Scanning for source image : ${SOURCENAME}${USEEXT} for subject : ${subjects[$is]} returned no result." + echo + echo "ABORTING" + echo + . ${thisDir}/auxiliary/exit_w_removal + fi + + fileLIST=`ls -1 ${destSOURCENAME}* | wc |awk '{print $1}'` + + debugout "- - - - - - - - - - - - - -" $SuperDebugFLAG + debugout "Total # of ${destSOURCENAME} is $fileLIST in directory ${anatPATH}" $SuperDebugFLAG + + SOURCEIMG=${anatPATH}/${destSOURCENAME}${USEEXT} + diff --git a/spm8Batch/matlabScripts/UMCheckFailure.m b/spm8Batch/matlabScripts/UMCheckFailure.m new file mode 100644 index 00000000..2af4d820 --- /dev/null +++ b/spm8Batch/matlabScripts/UMCheckFailure.m @@ -0,0 +1,30 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Robert C. Welsh +% Ann Arbor Michigan, USA +% +% March 2012 +% Copyright. +% +% Simple code to check the error status. +% +% If results == -1 then error. +% +% function UMCheckFailure(results) +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +function UMCheckFailure(results) + +global UMBatchProcessName + +if results == -1 + fprintf('* * * * * FAILURE * * * *\n') + fprintf(' %s failed.\n',UMBatchProcessName); + fprintf('* * * * * FAILURE * * * *\n') +end + +return + +% +% all done. +% From ffc5a6284b6e27b5a4443800ad93b9cc168fb619 Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Tue, 13 Mar 2012 14:53:05 -0400 Subject: [PATCH 07/35] Added timer output to UMBatchVBM8.m --- spm8Batch/matlabScripts/UMBatchVBM8.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/spm8Batch/matlabScripts/UMBatchVBM8.m b/spm8Batch/matlabScripts/UMBatchVBM8.m index dd9286c6..a93e3151 100644 --- a/spm8Batch/matlabScripts/UMBatchVBM8.m +++ b/spm8Batch/matlabScripts/UMBatchVBM8.m @@ -205,10 +205,17 @@ UMCheckFailure(results); end - - clear matlabbatch +% Set the flag to the amount of time to execute. +% + +results = toc; + +fprintf('Deformation finished in %f seconds\n',results); + +return + % % All done. % From cd54ea9434ebcb113c8d7148efedeb5ba5349d47 Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Thu, 15 Mar 2012 15:42:13 -0400 Subject: [PATCH 08/35] Added intensity normalized 'bet' to UMBatchVBM8.m --- spm8Batch/matlabScripts/UMBatchVBM8.m | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/spm8Batch/matlabScripts/UMBatchVBM8.m b/spm8Batch/matlabScripts/UMBatchVBM8.m index a93e3151..b79ada26 100644 --- a/spm8Batch/matlabScripts/UMBatchVBM8.m +++ b/spm8Batch/matlabScripts/UMBatchVBM8.m @@ -161,10 +161,12 @@ cd(ParamImageDirectory); -% Now create the skull stripped brain. +% Get the masking image, which is the "p0" image. MaskParam = fullfile(ParamImageDirectory,['p0' ParamImageName ParamImageExt]); +% Now create the skull stripped brain. + inputImages = strvcat(ParamImage,MaskParam); Vi = spm_vol(inputImages); @@ -179,6 +181,24 @@ spm_imcalc(Vi,Vo,'i1.*(i2>0)'); +% Now create an intensity normalized stripped brain. + +ParamImageNorm = fullfile(ParamImageDirectory,['m' ParamImageName ParamImageExt]); + +inputImages = strvcat(ParamImageNorm,MaskParam); + +Vi = spm_vol(inputImages); + +clear Vo + +Vo.fname = fullfile(ParamImageDirectory,['bet_m' ParamImageName ParamImageExt]); +Vo.dim = Vi(1).dim; +Vo.mat = Vi(1).mat; +Vo.descrip = ['Skull Stripped spm8Batch/VMB8 (intensity normalized)' Vi(1).descrip]; +Vo.dt = Vi(1).dt; + +spm_imcalc(Vi,Vo,'i1.*(i2>0)'); + % And now log it. UMBatchLogProcess(ParamImageDirectory,sprintf('UMBatchVBM8 : VBM8 created skull stripped : %s',Vo.fname)); From a532a8d3f5cf2d97ca9f194eea0b5214cd9f0a9e Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Thu, 15 Mar 2012 16:17:26 -0400 Subject: [PATCH 09/35] Created command vbm8Check --- spm8Batch/.DS_Store | Bin 0 -> 12292 bytes .../auxiliary/help/help_vbm8Check_Options | 5 ++ spm8Batch/auxiliary/help/vbm8Check_Help | 15 ++++ spm8Batch/auxiliary/help/vbm8Check_Help~ | 15 ++++ spm8Batch/auxiliary/initialization_vbm8Check | 17 ++++ spm8Batch/vbm8Check | 77 ++++++++++++++++++ spm8Batch/vbm8Check~ | 0 7 files changed, 129 insertions(+) create mode 100644 spm8Batch/.DS_Store create mode 100644 spm8Batch/auxiliary/help/help_vbm8Check_Options create mode 100644 spm8Batch/auxiliary/help/vbm8Check_Help create mode 100644 spm8Batch/auxiliary/help/vbm8Check_Help~ create mode 100644 spm8Batch/auxiliary/initialization_vbm8Check create mode 100644 spm8Batch/vbm8Check create mode 100644 spm8Batch/vbm8Check~ diff --git a/spm8Batch/.DS_Store b/spm8Batch/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ecb0e306abf2af7e96bbd8114aeddb3a7302ac90 GIT binary patch literal 12292 zcmeHMTWl0n82-O)3p0+RXIpEpG#iSMHi!kJRzTQZz*a;EZRtfr+1(jrWcK3Dc1u*^ zKKS5;@In-fPa1FG1rx2t_+Y#|@E|^zK49XDPnu{N&|d-<Gz0$z2Kb#Vn{k8pzVhl(GoTsxUos${4+-uPlMz-FhK~*&!V-Y7p3Pz7Ypw&r zoJ54l2rCN1RQ{W)dO(zlsKkIuXMaM5GbSUfC{*bLl}?COMpU67T%Ge0VK^bFP>-4c z&A>_qm@CpW4q<57oW4&)v0 zxaT_N#dv#SL(k@I1G@&78k=rwwpy&VnN*N*bB>pLY;wVKN++huUf`vDch+;}r%)G;5YHRD`|WHXe~n4;Nh?9c8}5y3-aZb0XkfDNC=l z$r6D%anj2l+q}#*B;|bQ})j$88&Jrh93O4%2aZf}W)_ zbe7K31$vEMr%UuMeN11_SF}Xm()aWO{YXF2FZ3&7s7C`D(S%N{Ll1hf4cpO=o!EuF zcmSg~fQK=K8O-7sQg|FbvY1C1&!B?m@dD1_CA^F`@fI#&5ue~we1d$3bh-7+lwaN6GxD@B@Ev;?s-5c-P+P`zpNT``mCZP_MJg$BGH4^;2?y8zu zCW)nv&UIaO!dib_3$@~(WIej43>K@X3xh4zuE|Oj^-EoyJsoDRWmS)WJRGJ9V)2?R zUeTbYz4ms~5Np+H1J(|MPm4e_wRanah^fFqd)Q=!i#5u(&mJ{c$KtO@@^iXOSLkcH zO5f4Xp%~+6#|9SRRt(_2P=vcf5k83hEW{%?$`VW?6N)g80*ZJFPvbO;@i`Xbi#UU` zIFAc>1+U@_7UkP`2N&@k-p2>{aG5B_s&Z6_k80<7rWsgO4AiN+ZI$)^-W&h^zpD16 zZ&ov)8Tfk)pnhb0WQcRB-@cZo%OWAc{TO%IWL!mIn8Je$k@m10XT0_gL%vQ#zGQ?I zh3w(>kN*&$-~S=+de97L1~dbj0nLDBKr^5j&Gy|Fe&46Y=GoTsxZ!_>43oCnB literal 0 HcmV?d00001 diff --git a/spm8Batch/auxiliary/help/help_vbm8Check_Options b/spm8Batch/auxiliary/help/help_vbm8Check_Options new file mode 100644 index 00000000..feef6201 --- /dev/null +++ b/spm8Batch/auxiliary/help/help_vbm8Check_Options @@ -0,0 +1,5 @@ + echo "${helpComment} anatomy path : ${anatomyPATH}" + echo "${helpComment} name of hisres image : ${HIRESNAME}" + echo + + . ${thisDir}/auxiliary/help/help_options_end diff --git a/spm8Batch/auxiliary/help/vbm8Check_Help b/spm8Batch/auxiliary/help/vbm8Check_Help new file mode 100644 index 00000000..5f40a491 --- /dev/null +++ b/spm8Batch/auxiliary/help/vbm8Check_Help @@ -0,0 +1,15 @@ + echo + echo " A command line command to fslview the ht1spgr and vbm8 bet" + echo + . ${thisDir}/auxiliary/help/help_options_start + + echo + echo " e.g. " + echo + echo " vbm8Check 050126zz" + echo + echo + echo " Current command default configuration is:" + echo + + . ${thisDir}/auxiliary/help/help_vbm8Check_Options diff --git a/spm8Batch/auxiliary/help/vbm8Check_Help~ b/spm8Batch/auxiliary/help/vbm8Check_Help~ new file mode 100644 index 00000000..77511a91 --- /dev/null +++ b/spm8Batch/auxiliary/help/vbm8Check_Help~ @@ -0,0 +1,15 @@ + echo + echo " A command line command to fslview the ht1spgr and best BET" + echo + . ${thisDir}/auxiliary/help/help_options_start + + echo + echo " e.g. " + echo + echo " fslCheck 050126zz" + echo + echo + echo " Current command default configuration is:" + echo + + . ${thisDir}/auxiliary/help/help_fslCheck_Options diff --git a/spm8Batch/auxiliary/initialization_vbm8Check b/spm8Batch/auxiliary/initialization_vbm8Check new file mode 100644 index 00000000..41e12b38 --- /dev/null +++ b/spm8Batch/auxiliary/initialization_vbm8Check @@ -0,0 +1,17 @@ +# Inialization. + +FSL_COMMENT_B="fsl check reging between best BET and original hi res" + +BATCHCOMMAND=0 + +# If this is a number then we use the number +# else we use the number that is in the file +# below, which is been created with "bestBET" + +# Hiresolution image +HIRESNAME=ht1spgr +HIRESEXT= + +# +# all done +# diff --git a/spm8Batch/vbm8Check b/spm8Batch/vbm8Check new file mode 100644 index 00000000..729fb197 --- /dev/null +++ b/spm8Batch/vbm8Check @@ -0,0 +1,77 @@ +#!/bin/bash + +# # # # # # # # # # # # # # # # # # +# +# Pull up the ht1spgr and the best BET +# +# Robert C. Welsh +# Copyright 2005-2011 +# +# +# # # # # # # # # # # # # # # # # # + +# +# Main fslCheck function. +# + +VERSION="2.0" +VERSIONDATE="2011-09-13" + +# Find out where the current command lives and execute some common code. + +theFullCommand="$0 $*" +execDIR=`pwd` + +# Find out where the current command lives and execute some common code. + +theCommand=`which $0` +thisDir=`dirname $theCommand` + +thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` + +#allowedOptions="abhMu" +allowedOptions="ahM" + +# This piece of code all of the spm8Batch scripts will use +. ${thisDir}/auxiliary/commonCode_AllScriptsStart + +# Validate that we have FSL installed. +. ${thisDir}/auxiliary/commonCode_FSL_01 + +# This is common in-line code for all spm8Batch script to make sure arguments were passed +. ${thisDir}/auxiliary/commonCode_checkIfArgsPassed + +# +# The actual function. +# + +. ${thisDir}/auxiliary/parse_arguments + +for (( is=1 ; is<=$nSubjects ; is++ )) +do + SUBJECTANATOMY=${UMBatchMaster}/${SUBJDIR}/${subjects[$is]}/${anatomyPATH} + if [ ! -d "${SUBJECTANATOMY}" ] + then + echo + echo " FATAL ERROR, can't find directory ${SUBJECTANATOMY}" + echo + echo + exit 0 + fi + cd ${SUBJECTANATOMY} + IMG1=`ls ${SUBJECTANATOMY}/bet_m${HIRESNAME}*.nii + IMG2=`ls ${SUBJECTANATOMY}/m${HIRESNAME}*.nii + if [ -z "${IMG1}" ] + then + echo " ${SUBJECTANATOMY}: I can't find bet_m${HIRESNAME}*.nii" + else + if [ -z "${IMG2}" ] + then + echo " ${SUBJECTANATOMY}: I can't find bet_m${HIRESNAME}*.nii" + else + echo ${SUBJETANATOMY} + fslview ${IMG1} -l Copper -t .7 -b 0,2000 ${IMG2} -b 0,2000 & + fi + fi +done + diff --git a/spm8Batch/vbm8Check~ b/spm8Batch/vbm8Check~ new file mode 100644 index 00000000..e69de29b From ff0fb9377b9925586b738c6212974a8d967a57bf Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Thu, 15 Mar 2012 17:05:32 -0400 Subject: [PATCH 10/35] Cleaned up some small issues, added some debug out, need to do more of that, that is to have each set* routine dump to screen what they do if SuperDebugFLAG is set --- spm8Batch/auxiliary/initialization_vbm8Check | 6 +- spm8Batch/auxiliary/parse_arguments | 241 ++++++++++--------- spm8Batch/auxiliary/setAnatomyPath | 2 + spm8Batch/auxiliary/setSuperDebugFlag | 2 + spm8Batch/spm8Batch_Global | 2 +- spm8Batch/vbm8Check | 11 +- 6 files changed, 134 insertions(+), 130 deletions(-) diff --git a/spm8Batch/auxiliary/initialization_vbm8Check b/spm8Batch/auxiliary/initialization_vbm8Check index 41e12b38..bcfe4be1 100644 --- a/spm8Batch/auxiliary/initialization_vbm8Check +++ b/spm8Batch/auxiliary/initialization_vbm8Check @@ -1,13 +1,9 @@ # Inialization. -FSL_COMMENT_B="fsl check reging between best BET and original hi res" +FSL_COMMENT_B="fsl check reging between best BET and original hi res from VBM8" BATCHCOMMAND=0 -# If this is a number then we use the number -# else we use the number that is in the file -# below, which is been created with "bestBET" - # Hiresolution image HIRESNAME=ht1spgr HIRESEXT= diff --git a/spm8Batch/auxiliary/parse_arguments b/spm8Batch/auxiliary/parse_arguments index 3b1d6449..8f11ef2a 100644 --- a/spm8Batch/auxiliary/parse_arguments +++ b/spm8Batch/auxiliary/parse_arguments @@ -8,6 +8,9 @@ # # +echo "Parsing commands:" +echo + while (( $argn < $args )) do # @@ -15,6 +18,8 @@ do # this means you need to specify the subject # master directory first. ( SUBJDIR ) # + debugout "Current param: $1" $SuperDebugFLAG + if [ -d "./${SUBJDIR}/$1" ] then let nSubjects++ @@ -41,10 +46,8 @@ do . ${thisDir}/auxiliary/exit_w_removal fi + debugout "Parsing command : ${curParam}" $SuperDebugFLAG - - debugout "Parsing command : ${curParam}" $SuperDebugFlag - case "${curParam:1:1}" in @@ -52,272 +55,272 @@ do # # All runs in func # - "A") - ALLRUNSFLAG=1 - ;; + "A") + ALLRUNSFLAG=1 + ;; # case_anatomy_path # # Path name to find virgin anatomy files. # - "a") - . ${thisDir}/auxiliary/setAnatomyPath - ;; + "a") + . ${thisDir}/auxiliary/setAnatomyPath + ;; # case_bet_best_flag # # look at the BET best flag # - "b") - . ${thisDir}/auxiliary/setBETFLAG - ;; - + "b") + . ${thisDir}/auxiliary/setBETFLAG + ;; + # case_super_debug_flag # # super debug flag # - "D") - . ${thisDir}/auxiliary/setSuperDebugFlag - ;; + "D") + . ${thisDir}/auxiliary/setSuperDebugFlag + ;; # case_debug_flag # # debug flag # - "d") - . ${thisDir}/auxiliary/setDebugFlag - ;; + "d") + . ${thisDir}/auxiliary/setDebugFlag + ;; # case_fmri_tr # # Set the TR # - "F") - . ${thisDir}/auxiliary/setVolumeTR - ;; + "F") + . ${thisDir}/auxiliary/setVolumeTR + ;; # case_functional_path # # Path name to search for functional images. # - "f") - . ${thisDir}/auxiliary/setFunctionalPath - ;; - + "f") + . ${thisDir}/auxiliary/setFunctionalPath + ;; + # case_set_BET_gradient # # Set the gradient scale for bestBET # - "g") - . ${thisDir}/auxiliary/setGradientValue - ;; + "g") + . ${thisDir}/auxiliary/setGradientValue + ;; # case_hires_name # # SPGR (hiRES) name to use # - "h") - . ${thisDir}/auxiliary/setHiResName - ;; + "h") + . ${thisDir}/auxiliary/setHiResName + ;; # case_set_referenceImage # # reference image for warpfMRI with vbm8 # - "I") - . ${thisDir}/auxiliary/setReferenceImage - ;; + "I") + . ${thisDir}/auxiliary/setReferenceImage + ;; # case_set_run # # run list # - "i") - . ${thisDir}/auxiliary/setRunList - ;; - + "i") + . ${thisDir}/auxiliary/setRunList + ;; + # case_subject_dir # # subject directory name to use # - "M") - . ${thisDir}/auxiliary/setSubjectsMasterDir - ;; - + "M") + . ${thisDir}/auxiliary/setSubjectsMasterDir + ;; + # case_flirt_options # # find the flirt options # - "m") - . ${thisDir}/auxiliary/setMCFlirtOptions - ;; - + "m") + . ${thisDir}/auxiliary/setMCFlirtOptions + ;; + # case_output_name # # Set the name to add. # - "n") - . ${thisDir}/auxiliary/setOutputName - ;; - + "n") + . ${thisDir}/auxiliary/setOutputName + ;; + # case_other_names # # Simliar Other images # - "O") - . ${thisDir}/auxiliary/setOtherNames - ;; + "O") + . ${thisDir}/auxiliary/setOtherNames + ;; # case_overlay_name # # overlay name to use # - "o") - . ${thisDir}/auxiliary/setOverlayName - ;; - + "o") + . ${thisDir}/auxiliary/setOverlayName + ;; + # case_physfile_name # # physio phys file table # - "p") - . ${thisDir}/auxiliary/setPhysioName - ;; + "p") + . ${thisDir}/auxiliary/setPhysioName + ;; # case_physio_options # # physio options # - "P") - . ${thisDir}/auxiliary/setPhysioOptions - ;; + "P") + . ${thisDir}/auxiliary/setPhysioOptions + ;; # case_reslice_2 # # reslice the geometry only with no estimation? # - "R") - resliceFLAG=2 - ;; + "R") + resliceFLAG=2 + ;; # case_reslice_1 # # reslice the geometry? # - "r") - resliceFLAG=1 - ;; + "r") + resliceFLAG=1 + ;; # case_standard_volume # # find the standard volume number. # - "S") - . ${thisDir}/auxiliary/setStandardVolumeNumber - ;; + "S") + . ${thisDir}/auxiliary/setStandardVolumeNumber + ;; # case_sub_path # # sub-Path name to search for functional images. # - "s") - . ${thisDir}/auxiliary/setFunctionalSubPathName - ;; + "s") + . ${thisDir}/auxiliary/setFunctionalSubPathName + ;; # case_template_name # # Template Image. # - "T") - . ${thisDir}/auxiliary/setTemplateImageName - ;; + "T") + . ${thisDir}/auxiliary/setTemplateImageName + ;; # case_test_flag # # Test FLAG # - "t") - . ${thisDir}/auxiliary/setTestFlag - ;; + "t") + . ${thisDir}/auxiliary/setTestFlag + ;; # case_user_email # # Where to send email when finished # - "U") - . ${thisDir}/auxiliary/setUserEmail - ;; + "U") + . ${thisDir}/auxiliary/setUserEmail + ;; # case_set_bet # # Pick up the best BET threshold # - "u") - . ${thisDir}/auxiliary/setBestBET - ;; + "u") + . ${thisDir}/auxiliary/setBestBET + ;; # case_verify_flag # # Set the verify flag # - "V") - . ${thisDir}/auxiliary/setVerifyFLAG - ;; + "V") + . ${thisDir}/auxiliary/setVerifyFLAG + ;; # case_volume_name # # wildcard name to use for which to co-reg. # - "v") - . ${thisDir}/auxiliary/setVolumeWildCard - ;; + "v") + . ${thisDir}/auxiliary/setVolumeWildCard + ;; # case_coreg_path # # Path name to place coregistration results, our output of anatomy routines. # - "w") - . ${thisDir}/auxiliary/setCoRegPath - ;; + "w") + . ${thisDir}/auxiliary/setCoRegPath + ;; # case_warp_method # # Use VBM8 for warping # - "W") - . ${thisDir}/auxiliary/setWarpMethod - ;; + "W") + . ${thisDir}/auxiliary/setWarpMethod + ;; # case_voxel_size # # Voxel size # - "z") - . ${thisDir}/auxiliary/setVoxelSize - ;; + "z") + . ${thisDir}/auxiliary/setVoxelSize + ;; # case_run_number # # run numbers # - "#") - shift - let argn++ - if (( $argn >= $args )) - then - echo "Missing parameter for run number, aborting" - . ${thisDir}/auxiliary/exit_w_removal - else - runNAMES[$nRUN]=$1 - let nRUN++ - fi - ;; + "#") + shift + let argn++ + if (( $argn >= $args )) + then + echo "Missing parameter for run number, aborting" + . ${thisDir}/auxiliary/exit_w_removal + else + runNAMES[$nRUN]=$1 + let nRUN++ + fi + ;; # case_error # # Anything should result in an error. # - *) - . ${thisDir}/auxiliary/caseError - . ${thisDir}/auxiliary/exit_w_removal - + *) + . ${thisDir}/auxiliary/caseError + . ${thisDir}/auxiliary/exit_w_removal + esac else if [ "${thisCommand}" == "smoothfMRI" ] diff --git a/spm8Batch/auxiliary/setAnatomyPath b/spm8Batch/auxiliary/setAnatomyPath index d210f83a..3df18f40 100755 --- a/spm8Batch/auxiliary/setAnatomyPath +++ b/spm8Batch/auxiliary/setAnatomyPath @@ -7,3 +7,5 @@ else anatomyPATH=$1 fi + + debugout "Anatomy path set to: $anatomyPATH" $SuperDebugFLAG \ No newline at end of file diff --git a/spm8Batch/auxiliary/setSuperDebugFlag b/spm8Batch/auxiliary/setSuperDebugFlag index 4699fd08..2e762450 100644 --- a/spm8Batch/auxiliary/setSuperDebugFlag +++ b/spm8Batch/auxiliary/setSuperDebugFlag @@ -1,2 +1,4 @@ SuperDebugFLAG=D debugFLAG=1 + + echo "Turning on debugger" \ No newline at end of file diff --git a/spm8Batch/spm8Batch_Global b/spm8Batch/spm8Batch_Global index 1e8b25fe..99e1cf0d 100755 --- a/spm8Batch/spm8Batch_Global +++ b/spm8Batch/spm8Batch_Global @@ -46,7 +46,7 @@ then # This is Robert Welsh's UNIX batch interface to spm8 - SPM8B2=${topDIR}/spm8Batch/spm8Batch_VBM8.1 + SPM8B2=${topDIR}/spm8Batch/spm8Batch_VBM8 # This must point to the place where the SPM8 patch is locally. diff --git a/spm8Batch/vbm8Check b/spm8Batch/vbm8Check index 729fb197..6da8238b 100644 --- a/spm8Batch/vbm8Check +++ b/spm8Batch/vbm8Check @@ -30,7 +30,7 @@ thisDir=`dirname $theCommand` thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` #allowedOptions="abhMu" -allowedOptions="ahM" +allowedOptions="aDdhM" # This piece of code all of the spm8Batch scripts will use . ${thisDir}/auxiliary/commonCode_AllScriptsStart @@ -59,8 +59,8 @@ do exit 0 fi cd ${SUBJECTANATOMY} - IMG1=`ls ${SUBJECTANATOMY}/bet_m${HIRESNAME}*.nii - IMG2=`ls ${SUBJECTANATOMY}/m${HIRESNAME}*.nii + IMG1=`ls ${SUBJECTANATOMY}/bet_m${HIRESNAME}*.nii 2> /dev/null` + IMG2=`ls ${SUBJECTANATOMY}/m${HIRESNAME}*.nii 2> /dev/null` if [ -z "${IMG1}" ] then echo " ${SUBJECTANATOMY}: I can't find bet_m${HIRESNAME}*.nii" @@ -69,8 +69,9 @@ do then echo " ${SUBJECTANATOMY}: I can't find bet_m${HIRESNAME}*.nii" else - echo ${SUBJETANATOMY} - fslview ${IMG1} -l Copper -t .7 -b 0,2000 ${IMG2} -b 0,2000 & + echo ${SUBJECTANATOMY} + #fslview ${IMG2} -b 0,2000 & ${IMG1} -l Copper -t .7 -b 0,2000 + fslview ${IMG2} -b 0,2000 ${IMG1} -l Copper -t .7 -b 0,2000 fi fi done From ced61f520b5f4e3130e610221b47d7a40e421740 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Sun, 25 Mar 2012 17:20:09 -0400 Subject: [PATCH 11/35] Added CheckSpike folder and dSpike.m dSpike.m implements the spike detection method implemented in "Automatic Spike Detection for fMRI" by Greve et al --- QualityChecks/CheckSpike/dSpike.m | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 QualityChecks/CheckSpike/dSpike.m diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m new file mode 100644 index 00000000..a5bcaade --- /dev/null +++ b/QualityChecks/CheckSpike/dSpike.m @@ -0,0 +1,65 @@ +function results = dSpike(inputData,detOpt) + +results = -1; + +if exist(inputData,'file') ~= 2 + fprintf('Invalid file.\n'); + return +end + +% Read in data +P = nifti(inputData); +data = P.dat(:,:,:,:); + +X = size(data,1); +Y = size(data,2); +Z = size(data,3); +T = size(data,4); + +% Remove whole mean +mu_whole = mean( data(:) ); +data = data - mu_whole; + +series = zeros(T,1); +% Remove temporal trend, then compute temporal Z-score for each voxel +for z=1:Z + for y=1:Y + for x=1:X + % detrend + series(:) = data(x,y,z,:); + d_series = spm_detrend(series,detOpt); + + % compute Z-score + s_mu = mean(d_series); + s_std = std(d_series); + z_series = (d_series - s_mu)./(s_std + eps); + + % reassign values + data(x,y,z,:) = abs( z_series(:) ); + end + end +end + +AAZ = zeros(Z,T); +% Average the Z-scores across slices and time +for t=1:T + for z=1:Z + AAZ(z,t) = sum(sum(data(:,:,z,t)))/(X*Y); + end +end + +AJKZ = zeros(Z,T); +indexes = [1:Z]'; +% Calculate AJKZ +for z=1:Z + loc = (indexes ~= z); + included = AAZ(loc,:); + mu_i = mean(included,1); + std_i = std(included,1); + + AJKZ(z,:) = (AAZ(z,:) - mu_i)./(std_i + eps); +end + +results = abs(AJKZ); + +return \ No newline at end of file From 35a9b87c176303da28247a88d431ca9bcfea8bf5 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 26 Mar 2012 09:56:12 -0400 Subject: [PATCH 12/35] Improved dSpike performance --- QualityChecks/CheckSpike/dSpike.m | 34 ++++++++++--------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index a5bcaade..7211ddc7 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -11,33 +11,21 @@ P = nifti(inputData); data = P.dat(:,:,:,:); -X = size(data,1); -Y = size(data,2); -Z = size(data,3); -T = size(data,4); +[X Y Z T] = size(data); % Remove whole mean mu_whole = mean( data(:) ); data = data - mu_whole; -series = zeros(T,1); % Remove temporal trend, then compute temporal Z-score for each voxel for z=1:Z - for y=1:Y - for x=1:X - % detrend - series(:) = data(x,y,z,:); - d_series = spm_detrend(series,detOpt); - - % compute Z-score - s_mu = mean(d_series); - s_std = std(d_series); - z_series = (d_series - s_mu)./(s_std + eps); - - % reassign values - data(x,y,z,:) = abs( z_series(:) ); - end - end + % detrend + slice = squeeze(data(:,:,z,:)); + reSlice = reshape(slice,X*Y,T)'; + detrendSlice = spm_detrend(reSlice,detOpt); + %get z score + zScoreSlice = zscore(detrendSlice); + data(:,:,z,:) = abs( reshape(zScoreSlice',X,Y,1,T) ); end AAZ = zeros(Z,T); @@ -46,7 +34,7 @@ for z=1:Z AAZ(z,t) = sum(sum(data(:,:,z,t)))/(X*Y); end -end +end AJKZ = zeros(Z,T); indexes = [1:Z]'; @@ -56,8 +44,8 @@ included = AAZ(loc,:); mu_i = mean(included,1); std_i = std(included,1); - - AJKZ(z,:) = (AAZ(z,:) - mu_i)./(std_i + eps); + std_i(std_i==0) = 1; + AJKZ(z,:) = (AAZ(z,:) - mu_i)./(std_i); end results = abs(AJKZ); From 46a8cf14d74e1871510641293b3f37a8d2beda6e Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 26 Mar 2012 10:11:20 -0400 Subject: [PATCH 13/35] Renamed some variables and added matrix support for dSpike.m --- QualityChecks/CheckSpike/dSpike.m | 59 ++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index 7211ddc7..8f16cba3 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -2,44 +2,63 @@ results = -1; -if exist(inputData,'file') ~= 2 - fprintf('Invalid file.\n'); +if ischar(inputData) + inputData = strtrim(inputData); + % Check if file exists + if exist(inputData,'file') ~= 2 + fprintf('Input data "%s"\n does not exist.\n',inputData); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return + end + P = nifti(inputData); + inputData = P.dat(:,:,:,:); +end + +% support only 4D arrays for now +if ndims(inputData) ~= 4 + fprintf('Expected 4D time series\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); return end +if nargin < 2 + detOpt = []; +end + % Read in data -P = nifti(inputData); -data = P.dat(:,:,:,:); +inputData = P.dat(:,:,:,:); -[X Y Z T] = size(data); +[xDim yDim nSlice nTime] = size(inputData); % Remove whole mean -mu_whole = mean( data(:) ); -data = data - mu_whole; +mu_whole = mean( inputData(:) ); +inputData = inputData - mu_whole; % Remove temporal trend, then compute temporal Z-score for each voxel -for z=1:Z +for z=1:nSlice + slice = squeeze(inputData(:,:,z,:)); + reSlice = reshape(slice,xDim*yDim,nTime)'; % detrend - slice = squeeze(data(:,:,z,:)); - reSlice = reshape(slice,X*Y,T)'; - detrendSlice = spm_detrend(reSlice,detOpt); + if ~isempty(detOpt) + reSlice = spm_detrend(reSlice,detOpt); + end %get z score - zScoreSlice = zscore(detrendSlice); - data(:,:,z,:) = abs( reshape(zScoreSlice',X,Y,1,T) ); + zScoreSlice = zscore(reSlice); + inputData(:,:,z,:) = abs( reshape(zScoreSlice',xDim,yDim,1,nTime) ); end -AAZ = zeros(Z,T); +AAZ = zeros(nSlice,nTime); % Average the Z-scores across slices and time -for t=1:T - for z=1:Z - AAZ(z,t) = sum(sum(data(:,:,z,t)))/(X*Y); +for t=1:nTime + for z=1:nSlice + AAZ(z,t) = sum(sum(inputData(:,:,z,t)))/(xDim*yDim); end end -AJKZ = zeros(Z,T); -indexes = [1:Z]'; +AJKZ = zeros(nSlice,nTime); +indexes = [1:nSlice]'; % Calculate AJKZ -for z=1:Z +for z=1:nSlice loc = (indexes ~= z); included = AAZ(loc,:); mu_i = mean(included,1); From 983c0ac9e32af17f4e847c2040cdf37467af87dd Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 26 Mar 2012 10:30:00 -0400 Subject: [PATCH 14/35] Cleaned up dSpike Added QC_calcSliceVariance --- .../CheckSpike/QC_calcSliceVariance.m | 70 +++++++++++++++++++ QualityChecks/CheckSpike/dSpike.m | 3 - 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 QualityChecks/CheckSpike/QC_calcSliceVariance.m diff --git a/QualityChecks/CheckSpike/QC_calcSliceVariance.m b/QualityChecks/CheckSpike/QC_calcSliceVariance.m new file mode 100644 index 00000000..8e4c4173 --- /dev/null +++ b/QualityChecks/CheckSpike/QC_calcSliceVariance.m @@ -0,0 +1,70 @@ +function results = QC_calcSliceVariance(inputData,options) + +results = -1; + +if ischar(inputData) + inputData = strtrim(inputData); + % Check if file exists + if exist(inputData,'file') ~= 2 + fprintf('Input data "%s"\n does not exist.\n',inputData); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return + end + P = nifti(inputData); + inputData = P.dat(:,:,:,:); +end + +% support only 4D arrays for now +if ndims(inputData) ~= 4 + fprintf('Expected 4D time series\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + +if nargin < 2 + options = []; +end + +[xDim yDim nSlice scans] = size(inputData); + +% Remove whole mean +globalMean = mean(inputData(:)); +inputData = inputData - globalMean; + +% detrend time series +if ~isempty(options) + voxelsPerPlane = xDim*yDim; + for z=1:nSlice + slice = squeeze(inputData(:,:,z,:)); + optSlice = reshape(slice,voxelsPerPlane,scans)'; + detrendSlice = spm_detrend(optSlice,options); + inputData(:,:,z,:) = reshape(detrendSlice',xDim,yDim,1,scans); + end +end + +% calculate mean of slice and std of slice over time +sliceMean = zeros(nSlice,1); +sliceSTD = zeros(nSlice,1); +for z=1:nSlice + slice = inputData(:,:,z,:); + + sliceMean(z) = mean(slice(:)); + sliceSTD(z) = std(slice(:)); +end + +sliceSTD(sliceSTD==0) = 1; + +% calculate array of the mean slice intensity at a given time point/std +sliceVariance = zeros(nSlice,scans); +for t=1:scans + for z=1:nSlice + slice = inputData(:,:,z,t); + sliceVariance(z,t) = (mean(slice(:)) - sliceMean(z))/sliceSTD(z); + end +end + +results = struct('sliceMean',sliceMean,... + 'sliceSTD',sliceSTD,... + 'globalMean',globalMean,... + 'sliceVariance',sliceVariance); +return \ No newline at end of file diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index 8f16cba3..be8055f0 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -25,9 +25,6 @@ detOpt = []; end -% Read in data -inputData = P.dat(:,:,:,:); - [xDim yDim nSlice nTime] = size(inputData); % Remove whole mean From 96a746d612034c726f342c5099ec422eec709ac9 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 26 Mar 2012 11:08:40 -0400 Subject: [PATCH 15/35] Added help sections to dSpike.m and QC_calcSliceVariance.m --- .../CheckSpike/QC_calcSliceVariance.m | 29 +++++++++++++++++ QualityChecks/CheckSpike/dSpike.m | 31 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/QualityChecks/CheckSpike/QC_calcSliceVariance.m b/QualityChecks/CheckSpike/QC_calcSliceVariance.m index 8e4c4173..67d9d8f7 100644 --- a/QualityChecks/CheckSpike/QC_calcSliceVariance.m +++ b/QualityChecks/CheckSpike/QC_calcSliceVariance.m @@ -1,3 +1,32 @@ +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% QC_calcSlicerVariance +% +% A routine for calculating some statistical properties for slices in a +% time series +% +% Call as : +% +% function results = QC_calcSliceVariance(inputData,options) +% +% To Make this work you need to provide the following input: +% +% inputData = Either a 4D matrix or file name% +% options = polynomial order used in spm_detrend (OPTIONAL) +% +% Output +% +% results +% = -1 if failure +% OR +% = struct { +% globalMean - scalar mean of whole volume +% sliceMean - nSlice x 1 array mean of each slice over time +% sliceSTD - nSlice x 1 array std of each slice over time +% sliceVariance - nSlice x nTime array mean slice intensity at +% given timepoint / std (slice) +% } +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function results = QC_calcSliceVariance(inputData,options) results = -1; diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index be8055f0..1b1d69b4 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -1,3 +1,34 @@ +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% dSpike +% +% A routine that implements the spike detection algorithm from "Automatic +% Spike Detection for fMRI" by Greve et al. +% +% Call as : +% +% function results = dSpike(inputData,options) +% +% To Make this work you need to provide the following input: +% +% inputData = Either a 4D matrix or file name +% options = polynomial order used in spm_detrend (OPTIONAL) +% +% Output +% +% results +% = -1 if failure +% OR +% = nSlice x nTime array of the absolute measure of the jackknife +% z-score for each slice in each timepoint (AJKZ) +% +% Comments +% +% Obvious spikes will be obvious in the output. The paper classifies +% any AJKZ > 25 as a spike. It seems reasonable. Figure 1 in paper +% was not exactly reproduced. The distrubution of AJKZ was shifted +% further left. +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function results = dSpike(inputData,detOpt) results = -1; From 9bfe8c9c4bbd3bf83e2b399c54ec0e3bf41c8363 Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Tue, 27 Mar 2012 10:21:38 -0400 Subject: [PATCH 16/35] Added ability to vbm8HiRes warp other images with -O flag --- spm8Batch/matlabScripts/UMBatchVBM8.m | 9 ++++++++- spm8Batch/matlabScripts/UMBatchWarpVBM8.m | 10 ++++++++-- spm8Batch/parts/vbm8_part_02.m | 6 +++++- spm8Batch/vbm8HiRes | 4 +++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/spm8Batch/matlabScripts/UMBatchVBM8.m b/spm8Batch/matlabScripts/UMBatchVBM8.m index b79ada26..9219fe1a 100644 --- a/spm8Batch/matlabScripts/UMBatchVBM8.m +++ b/spm8Batch/matlabScripts/UMBatchVBM8.m @@ -43,7 +43,7 @@ % % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function results = UMBatchVBM8(ParamImage,ReferenceImage,TestFlag,VoxelSize,OutputName); +function results = UMBatchVBM8(ParamImage,ReferenceImage,Img2Write,TestFlag,VoxelSize,OutputName); % Get the defaults from SPM. @@ -225,6 +225,13 @@ UMCheckFailure(results); end +% Now warp other images that might be speficied. + +if length(Img2Write) > 0 + results = UMBatchWarpVBM8(ParamImage,ReferenceImage,Img2Write,TestFlag,VoxelSize,OutputName); + UMCheckFailure(results); +end + clear matlabbatch % Set the flag to the amount of time to execute. diff --git a/spm8Batch/matlabScripts/UMBatchWarpVBM8.m b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m index 4f20a578..1a319a86 100644 --- a/spm8Batch/matlabScripts/UMBatchWarpVBM8.m +++ b/spm8Batch/matlabScripts/UMBatchWarpVBM8.m @@ -117,9 +117,15 @@ % Now if there is a reference image then we rewrite comp{2} -[d1 d2 d3 d4] = spm_fileparts(ReferenceImage); +if length(ReferenceImage) > 0 + [d1 d2 d3 d4] = spm_fileparts(ReferenceImage); +else + d1 = ''; + d2 = ''; + d3 = ''; +end -if exist(fullfile(d1,[d2 d3])) +if length(ReferenceImage) > 0 & exist(fullfile(d1,[d2 d3])) matlabbatch{1}.spm.util.defs.comp{2}.id.space{1} = [fullfile(d1,[d2 d3]),',1']; USINGREF=1; else diff --git a/spm8Batch/parts/vbm8_part_02.m b/spm8Batch/parts/vbm8_part_02.m index 51ed19b9..d841b2e3 100644 --- a/spm8Batch/parts/vbm8_part_02.m +++ b/spm8Batch/parts/vbm8_part_02.m @@ -29,8 +29,12 @@ % Make sure the image exists. % ParamImage=UMImg2Warp{iSub}; + Img2Write=[]; + for iW = 1:length(UMOtherImages{iSub}) + Img2Write = strvcat(Img2Write,[UMOtherImages{iSub}{iW},',1']); + end if exist(ParamImage) == 2 - results = UMBatchVBM8(ParamImage,VBM8RefImage,UMTestFlag,VoxelSize,OutputName); + results = UMBatchVBM8(ParamImage,VBM8RefImage,Img2Write,UMTestFlag,VoxelSize,OutputName); UMCheckFailure(results); else fprintf('FATAL ERROR : Image to warpVBM8 process does not exist: %s\n',ParamImage) diff --git a/spm8Batch/vbm8HiRes b/spm8Batch/vbm8HiRes index e8e4d888..c70f43c8 100755 --- a/spm8Batch/vbm8HiRes +++ b/spm8Batch/vbm8HiRes @@ -37,7 +37,7 @@ thisDir=`dirname $theCommand` thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` -allowedOptions="aDdhIMntUwz" +allowedOptions="aDdhIMnOtUwz" # This piece of code all of the spm8Batch scripts will use . ${thisDir}/auxiliary/commonCode_AllScriptsStart @@ -138,6 +138,8 @@ echo " };" >> ${FULLSCRIPTNAME}.m echo +. ${thisDir}/auxiliary/warpPrepOtherImages + echo " 4) finalizing matlab scripts" cat ${thisDir}/parts/vbm8_part_02.m >> ${FULLSCRIPTNAME}.m From 6140e54b7113cd3c520b796f127c7f402f4224f1 Mon Sep 17 00:00:00 2001 From: "Robert C. Welsh" Date: Thu, 5 Apr 2012 15:56:38 -0400 Subject: [PATCH 17/35] Fixed small error in help file reference for smoothfMRI --- spm8Batch/auxiliary/help/smoothfMRI_Help | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spm8Batch/auxiliary/help/smoothfMRI_Help b/spm8Batch/auxiliary/help/smoothfMRI_Help index 28d63726..cd5efbdc 100644 --- a/spm8Batch/auxiliary/help/smoothfMRI_Help +++ b/spm8Batch/auxiliary/help/smoothfMRI_Help @@ -3,7 +3,7 @@ echo " NIFTI images." echo - . ${thisDir}/auxiliary/help/help_Options_Start + . ${thisDir}/auxiliary/help/help_options_start echo echo " e.g. to smooth 'raprun' for 2 subjects with 5x6x7" From d728e7631b215309b27c96f99f7d2ee19511faaa Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 9 Apr 2012 14:19:06 -0400 Subject: [PATCH 18/35] Changed batchDetectSpike.m to zero mean per slice per time instead of whole brain. Added batchDetectSpike.m to perform dSpike.m on several images. --- QualityChecks/CheckSpike/batchDetectSpike.m | 32 +++++++++++++++++++++ QualityChecks/CheckSpike/dSpike.m | 12 ++++++-- 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 QualityChecks/CheckSpike/batchDetectSpike.m diff --git a/QualityChecks/CheckSpike/batchDetectSpike.m b/QualityChecks/CheckSpike/batchDetectSpike.m new file mode 100644 index 00000000..9083698b --- /dev/null +++ b/QualityChecks/CheckSpike/batchDetectSpike.m @@ -0,0 +1,32 @@ +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% batchDetectSpike +% +% A routine that calculates the AJKZ score values for a set of 4D images. +% The final result is expected to be used to create a distribution of the +% values. +% +% function results = dSpike(TextFile,DetrendOpt) +% +% To Make this work you need to provide the following input: +% +% TextFile = name of text file where each line is an image +% DetrendOpt = polynomial order used in spm_detrend (OPTIONAL) +% +% Output +% +% results +% = -1 if failure +% OR +% = an Nx2 cell array +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +function results = batchDetectSpike(TextFile,DetrendOpt) + +results = -1; +fid = fopen(TextFile,'r'); + +if fid == -1 + fprintf('Invalid textfile: %s\n',TextFile); + fprintf(' * * * A B O R T I N G * * *\n'); + results = -1; +end + diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index 1b1d69b4..6bdd459a 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -58,9 +58,15 @@ [xDim yDim nSlice nTime] = size(inputData); -% Remove whole mean -mu_whole = mean( inputData(:) ); -inputData = inputData - mu_whole; +% Remove mean per slice per time +for z=1:nSlice + slice = inputData(:,:,z,:); + mu_slice = mean( slice(:) ); + inputData(:,:,z,:) = slice - mu_slice; +end + +%mu_whole = mean( inputData(:) ); +%inputData = inputData - mu_whole; % Remove temporal trend, then compute temporal Z-score for each voxel for z=1:nSlice From 3f0128ec2536aad156b4e896ee86c83fd9572f16 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Tue, 10 Apr 2012 09:17:05 -0400 Subject: [PATCH 19/35] dSpike.m now returns ajkz and results. Ajkz are the interesting metrics. Results indicates whether the function completed successfully. --- QualityChecks/CheckSpike/dSpike.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index 6bdd459a..fbfd35fd 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -29,9 +29,11 @@ % further left. % % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function results = dSpike(inputData,detOpt) +function [results ajkz]= dSpike(inputData,detOpt) results = -1; +ajkz = []; +tic; if ischar(inputData) inputData = strtrim(inputData); @@ -101,6 +103,7 @@ AJKZ(z,:) = (AAZ(z,:) - mu_i)./(std_i); end -results = abs(AJKZ); +ajkz = abs(AJKZ); +results = toc; return \ No newline at end of file From ac41597a530f847f292bdd7500dbac4e37b15ef9 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Tue, 10 Apr 2012 11:02:31 -0400 Subject: [PATCH 20/35] Rearranged some code to experiment with best treshold value. 10 seems like the best. --- QualityChecks/CheckSpike/batchDetectSpike.m | 51 ++++++++++++++++----- QualityChecks/CheckSpike/dSpike.m | 20 ++++---- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/QualityChecks/CheckSpike/batchDetectSpike.m b/QualityChecks/CheckSpike/batchDetectSpike.m index 9083698b..44e9986a 100644 --- a/QualityChecks/CheckSpike/batchDetectSpike.m +++ b/QualityChecks/CheckSpike/batchDetectSpike.m @@ -5,28 +5,55 @@ % The final result is expected to be used to create a distribution of the % values. % -% function results = dSpike(TextFile,DetrendOpt) +% function results = dSpike(TextFile,DetrendOpt) % -% To Make this work you need to provide the following input: +% To Make this work you need to provide the following input: % -% TextFile = name of text file where each line is an image -% DetrendOpt = polynomial order used in spm_detrend (OPTIONAL) +% TextFile = name of text file where each line is an image +% DetrendOpt = polynomial order used in spm_detrend (OPTIONAL) % -% Output +% Output % -% results -% = -1 if failure -% OR -% = an Nx2 cell array +% success = seconds for operation is success; otherwise, -1 +% data = Nx2 cell array where column1:ImageName, column2:Results % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function results = batchDetectSpike(TextFile,DetrendOpt) +function [success data only_data] = batchDetectSpike(TextFile,DetrendOpt) -results = -1; +success = -1; +data = []; fid = fopen(TextFile,'r'); +tic; if fid == -1 fprintf('Invalid textfile: %s\n',TextFile); fprintf(' * * * A B O R T I N G * * *\n'); - results = -1; + return; end +images = textscan(fid,'%s'); +images = images{1}; +fclose(fid); + +data = cell( size(images,1),2 ); +totalSlices = 0; +for i=1:size(images,1) + [SpikeSuccess results] = dSpike(images{i,:},DetrendOpt); + + if SpikeSuccess == -1 + data = []; + return; + end + + data{i,2} = results; + totalSlices = totalSlices + numel(results); +end + +only_data = zeros(totalSlices,1); +BeginIndex = 1; +for i=1:size(data,1) + EndIndex = numel(data{i,2}) + BeginIndex - 1; + only_data(BeginIndex:EndIndex) = data{i,2}(:); + BeginIndex = EndIndex + 1; +end + +success = toc; \ No newline at end of file diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index fbfd35fd..3af4c331 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -11,15 +11,13 @@ % To Make this work you need to provide the following input: % % inputData = Either a 4D matrix or file name -% options = polynomial order used in spm_detrend (OPTIONAL) +% detOpt = polynomial order used in spm_detrend (OPTIONAL) % % Output % -% results -% = -1 if failure -% OR -% = nSlice x nTime array of the absolute measure of the jackknife -% z-score for each slice in each timepoint (AJKZ) +% success = seconds for operation if no errors; otherwise, -1 +% results = nSlice x nTime array of the absolute measure of the +% jackknife z-score for each slice in each timepoint (AJKZ) % % Comments % @@ -29,10 +27,10 @@ % further left. % % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function [results ajkz]= dSpike(inputData,detOpt) +function [success results]= dSpike(inputData,detOpt) -results = -1; -ajkz = []; +success = -1; +results = []; tic; if ischar(inputData) @@ -103,7 +101,7 @@ AJKZ(z,:) = (AAZ(z,:) - mu_i)./(std_i); end -ajkz = abs(AJKZ); -results = toc; +results = abs(AJKZ); +success = toc; return \ No newline at end of file From 4310b796da635109c9ff952aa60506dfc29bb9d0 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Fri, 13 Apr 2012 08:58:47 -0400 Subject: [PATCH 21/35] Added the Thres parameter to be used to detect for spikes --- QualityChecks/CheckSpike/batchDetectSpike.m | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/QualityChecks/CheckSpike/batchDetectSpike.m b/QualityChecks/CheckSpike/batchDetectSpike.m index 44e9986a..341b2106 100644 --- a/QualityChecks/CheckSpike/batchDetectSpike.m +++ b/QualityChecks/CheckSpike/batchDetectSpike.m @@ -17,12 +17,12 @@ % success = seconds for operation is success; otherwise, -1 % data = Nx2 cell array where column1:ImageName, column2:Results % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function [success data only_data] = batchDetectSpike(TextFile,DetrendOpt) +function [success data only_data] = batchDetectSpike(TextFile,DetrendOpt,Thres) success = -1; data = []; fid = fopen(TextFile,'r'); -tic; +time = 0; if fid == -1 fprintf('Invalid textfile: %s\n',TextFile); @@ -34,9 +34,10 @@ images = images{1}; fclose(fid); -data = cell( size(images,1),2 ); +data = cell( size(images,1),4 ); totalSlices = 0; for i=1:size(images,1) + data{i,1} = images(i,:); [SpikeSuccess results] = dSpike(images{i,:},DetrendOpt); if SpikeSuccess == -1 @@ -44,8 +45,13 @@ return; end + time = time + SpikeSuccess; data{i,2} = results; - totalSlices = totalSlices + numel(results); + totalSlices = totalSlices + numel(results); + + [row col] = find( results > Thres ); + data{i,3} = row; + data{i,4} = col; end only_data = zeros(totalSlices,1); @@ -56,4 +62,4 @@ BeginIndex = EndIndex + 1; end -success = toc; \ No newline at end of file +success = time; From 0d8c01b51ee95bd63e3cec1e77f3a1db7ccee43e Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Tue, 24 Apr 2012 10:07:51 -0400 Subject: [PATCH 22/35] Hardcoded detrending when detOpt = 0, because spm_detrend is just too slow --- QualityChecks/CheckSpike/QC_calcSliceVariance.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/QualityChecks/CheckSpike/QC_calcSliceVariance.m b/QualityChecks/CheckSpike/QC_calcSliceVariance.m index 67d9d8f7..dc953bf2 100644 --- a/QualityChecks/CheckSpike/QC_calcSliceVariance.m +++ b/QualityChecks/CheckSpike/QC_calcSliceVariance.m @@ -66,7 +66,14 @@ for z=1:nSlice slice = squeeze(inputData(:,:,z,:)); optSlice = reshape(slice,voxelsPerPlane,scans)'; - detrendSlice = spm_detrend(optSlice,options); + if options ~= 0 + detrendSlice = spm_detrend(optSlice,options); + else + for t=1:scans + optSlice(:,t) = optSlice(:,t) - mean(optSlice(:,t)); + end + detrendSlice = optSlice; + end inputData(:,:,z,:) = reshape(detrendSlice',xDim,yDim,1,scans); end end From d78194f80ba727388270e9f441b1e59857b25344 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Tue, 24 Apr 2012 10:09:31 -0400 Subject: [PATCH 23/35] Hardcoded detrending when detOpt = 0, because spm_detrend is just too slow --- QualityChecks/CheckSpike/dSpike.m | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index 3af4c331..a964b74e 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -64,9 +64,6 @@ mu_slice = mean( slice(:) ); inputData(:,:,z,:) = slice - mu_slice; end - -%mu_whole = mean( inputData(:) ); -%inputData = inputData - mu_whole; % Remove temporal trend, then compute temporal Z-score for each voxel for z=1:nSlice @@ -74,7 +71,13 @@ reSlice = reshape(slice,xDim*yDim,nTime)'; % detrend if ~isempty(detOpt) - reSlice = spm_detrend(reSlice,detOpt); + if detOpt ~= 0 + reSlice = spm_detrend(reSlice,detOpt); + else % do this because spm_detrend is just too slow when detOpt = 0 + for t=1:nTime + reSlice(:,t) = reSlice(:,t) - mean(reSlice(:,t)); + end + end end %get z score zScoreSlice = zscore(reSlice); From 533b005fd7de1d0502616da66b84c7def3c58f1d Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 30 Apr 2012 09:12:12 -0400 Subject: [PATCH 24/35] Added UMBatchDetectSpike to be used in spm8Batch. Started work on MC_CheckSpike_Template.m --- .../CheckSpike/MC_CheckSpike_Template.m | 19 +++++ QualityChecks/CheckSpike/UMBatchDetectSpike.m | 85 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 QualityChecks/CheckSpike/MC_CheckSpike_Template.m create mode 100644 QualityChecks/CheckSpike/UMBatchDetectSpike.m diff --git a/QualityChecks/CheckSpike/MC_CheckSpike_Template.m b/QualityChecks/CheckSpike/MC_CheckSpike_Template.m new file mode 100644 index 00000000..fee9d2a1 --- /dev/null +++ b/QualityChecks/CheckSpike/MC_CheckSpike_Template.m @@ -0,0 +1,19 @@ +%{ + Options has the following structure: + + struct Options { + MasterDir - Directory path that contains subject directories + Subjects - a cell array of the subject folders + SubRun - possible directory below run directory + }; +%} + +Options.MasterDir = '/oracle7/Researchers/heffjos/Mock_Data/fMRI/MYDATA/'; + +Options.Subjects = { + 'subject'; +}; + +Options.SubRun = 'SubRun'; + +UMBatchDetectSpike(Options); \ No newline at end of file diff --git a/QualityChecks/CheckSpike/UMBatchDetectSpike.m b/QualityChecks/CheckSpike/UMBatchDetectSpike.m new file mode 100644 index 00000000..b0740b82 --- /dev/null +++ b/QualityChecks/CheckSpike/UMBatchDetectSpike.m @@ -0,0 +1,85 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% UMBatchDetectSpike +% +% A function that performs a batch detect spike upon several subjects. +% +% Call as : +% +% function results = UMBatchDetectSpike(Images,OutputFile,Subject,Run) +% +% To Make this work you need to provide the following input: +% +% Images = char array of images to text +% OutputFile = file to write detected spikes +% ImagePath = full directory path to Images +% +% Output +% +% results = -1 if failure +% 1 if success +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +function results = UMBatchDetectSpike(Images,OutputFile,ImagePath) + detOpt = 1; + Thres = 10; + results = -1; + + fid = fopen(OutputFile,'w'); + if fid == -1 + fprintf('Cannot open file: %s\n',Outputfile); + fprintf(' * * * A B O R T I N G * * *\n'); + return; + end + + % + % Build 4D array + % + if size(Images,1) > 1 + firstImage = nifti( strtrim(Images(1,:)) ); + data = zeros( [firstImage.dat.dim(1:3) size(Images,1)] ); + clear firstImage + + for i=1:size(Images,1) + dumImage = nifti( strtim(Images(i,:)) ); + data(:,:,:,i) = dumImage.dat(:,:,:,i); + clear dumImage + end + else + dumImage = nifti( strtim(Images) ); + data = dumImage.dat(:,:,:,:); + clear dumImage + end + + % + % Detect spikes here + % + [success results] = dSpike(data,detOpt); + if success == -1 + return; + end + + % + % Write output to text file + % + [nSlice nTime] = size(results); + + % Common header first + fprintf(fid,'%s\n\n',ImagePath); + fprintf(fid,'Slices:%s\n',nSlice); + fprintf(fid,'nTime :%s\n\n',nTime); + + % Write detected spikes now + [Slice Timepoint] = find(results > Thres); + if isempty(Slice) + fprintf(fid,'Status : No spikes found\n'); + else + fprintf(fid,'Status : %d spikes found\n',size(Slice,1)); + + for i=1:size(Slice,1) + fprintf(fid,'Slice:%d,Timepoint:%d,AJKZ:%f\n',Slice(i),Timepoint(i),results( Slice(i), Timepoint(i) ) ); + end + end + + fclose(fid); + results = 1; +end + From 2616bb32b049a7580872a688a78e58da0b64f9ec Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 30 Apr 2012 10:19:24 -0400 Subject: [PATCH 25/35] Added all files necessary for detectSpike --- spm8Batch/auxiliary/checkDetectSpikeParts | 14 ++ spm8Batch/auxiliary/commonCode_Detect_01 | 7 + spm8Batch/auxiliary/detectSpikePart_01 | 14 ++ spm8Batch/auxiliary/help/detectSpike_Help | 24 ++++ .../auxiliary/help/help_detectSpike_Options | 6 + .../auxiliary/initialization_detectSpike | 13 ++ spm8Batch/detectSpike | 131 ++++++++++++++++++ spm8Batch/matlabScripts/UMBatchDetectSpike.m | 85 ++++++++++++ spm8Batch/matlabScripts/dSpike.m | 110 +++++++++++++++ spm8Batch/parts/detect_spike_part_1.m | 55 ++++++++ spm8Batch/parts/detect_spike_part_2.m | 57 ++++++++ 11 files changed, 516 insertions(+) create mode 100644 spm8Batch/auxiliary/checkDetectSpikeParts create mode 100644 spm8Batch/auxiliary/commonCode_Detect_01 create mode 100644 spm8Batch/auxiliary/detectSpikePart_01 create mode 100644 spm8Batch/auxiliary/help/detectSpike_Help create mode 100644 spm8Batch/auxiliary/help/help_detectSpike_Options create mode 100644 spm8Batch/auxiliary/initialization_detectSpike create mode 100755 spm8Batch/detectSpike create mode 100644 spm8Batch/matlabScripts/UMBatchDetectSpike.m create mode 100644 spm8Batch/matlabScripts/dSpike.m create mode 100644 spm8Batch/parts/detect_spike_part_1.m create mode 100644 spm8Batch/parts/detect_spike_part_2.m diff --git a/spm8Batch/auxiliary/checkDetectSpikeParts b/spm8Batch/auxiliary/checkDetectSpikeParts new file mode 100644 index 00000000..4bc26f37 --- /dev/null +++ b/spm8Batch/auxiliary/checkDetectSpikeParts @@ -0,0 +1,14 @@ +# validate that we have what we need. + +for CRITICALMATLAB in detect_spike_part_1.m detect_spike_part_2.m +do + if [ ! -e "${SPM8B2}/parts/${CRITICALMATLAB}" ] + then + echo + echo "Validate that you have 'detect_spike_1.m' and 'detect_spike_part_2.m' " + echo "Missing a critical component '${CRITICALMATLAB}'" + echo + exit 0 + fi +done + diff --git a/spm8Batch/auxiliary/commonCode_Detect_01 b/spm8Batch/auxiliary/commonCode_Detect_01 new file mode 100644 index 00000000..52d4481f --- /dev/null +++ b/spm8Batch/auxiliary/commonCode_Detect_01 @@ -0,0 +1,7 @@ +# validate that we have what we need. + +. ${thisDir}/auxiliary/checkDetectSpikeParts + +# Initialize warping variables. + +. ${thisDir}/auxiliary/initialization_all diff --git a/spm8Batch/auxiliary/detectSpikePart_01 b/spm8Batch/auxiliary/detectSpikePart_01 new file mode 100644 index 00000000..12808ea9 --- /dev/null +++ b/spm8Batch/auxiliary/detectSpikePart_01 @@ -0,0 +1,14 @@ +# Use common in-line code #01 -- comments out to standard output. + +. ${thisDir}/auxiliary/buildMatlabScripts_01 + +cat ${thisDir}/parts/detect_spike_part_1.m > ${FULLSCRIPTNAME}.m + +. ${thisDir}/auxiliary/buildMatlabScripts_02 + +echo "SandBoxDIR = '${SANDBOX}/';" >> ${FULLSCRIPTNAME}.m + +echo "SandBoxPID = '${SANDBOXPID}/';" >> ${FULLSCRIPTNAME}.m + +. ${thisDir}/auxiliary/buildMatlabScripts_03 + diff --git a/spm8Batch/auxiliary/help/detectSpike_Help b/spm8Batch/auxiliary/help/detectSpike_Help new file mode 100644 index 00000000..4a3c593b --- /dev/null +++ b/spm8Batch/auxiliary/help/detectSpike_Help @@ -0,0 +1,24 @@ + echo + echo " A command line to drive batch processing to detect spike instensities" + echo " in slices for a 4D scan." + echo + . ${thisDir}/auxiliary/help/help_options_start + + + echo " e.g. " + echo + echo " To detect spikes:" + echo + echo " detectSpike -f func/MSIT 050126zz" + echo + echo + echo "*NOTE: This code will actually hunt out rapruns's (or those specified in the -v flag)" + echo " The code does not actually care where the files live. However you can narrow" + echo " the search by supplying the '-s subdir' option which will then require that" + echo " 'subdir' is a string contained in the list of directories returned for warping." + echo + echo " Current command default configuration is:" + echo + echo + + . ${thisDir}/auxiliary/help/help_${thisCommand}_Options diff --git a/spm8Batch/auxiliary/help/help_detectSpike_Options b/spm8Batch/auxiliary/help/help_detectSpike_Options new file mode 100644 index 00000000..2c198a8c --- /dev/null +++ b/spm8Batch/auxiliary/help/help_detectSpike_Options @@ -0,0 +1,6 @@ + echo "${helpComment} volumeWILD : $volumeWILD" + echo "${helpComment} functioanl path : $fmriPATH" + echo "${helpComment} functional sub-dir : $subPATH" + echo + + . ${thisDir}/auxiliary/help/help_options_end diff --git a/spm8Batch/auxiliary/initialization_detectSpike b/spm8Batch/auxiliary/initialization_detectSpike new file mode 100644 index 00000000..83de4ecc --- /dev/null +++ b/spm8Batch/auxiliary/initialization_detectSpike @@ -0,0 +1,13 @@ +# +# Inialization. +# + +# Output name +outputName= + +# Use different default volumeWILD +volumeWILD=run + +# +# all done +# diff --git a/spm8Batch/detectSpike b/spm8Batch/detectSpike new file mode 100755 index 00000000..32e25b78 --- /dev/null +++ b/spm8Batch/detectSpike @@ -0,0 +1,131 @@ +#!/bin/bash + +# # # # # # # # # # # # # # # # # # +# +# A command to make it easier on the user to detect +# spikes in the fmri time-series. +# +# This command will build a script to run and will also +# run the script in background. +# +# e.g. detectSpike +# +# +# detectSpike +# +# # # # # # # # # # # # # # # # # # + +# +# Main detectSpike function. +# + +VERSION="2.1" +VERSIONDATE="2012-04-28" + +# Find out where the current command lives and execute some common code. + +theFullCommand="$0 $*" +execDIR=`pwd` + +# Find out where the current command lives and execute some common code. + +theCommand=`which $0` +thisDir=`dirname $theCommand` + +thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` + +allowedOptions="AfMsUv#" + +# This piece of code all of the spm8Batch scripts will use +. ${thisDir}/auxiliary/commonCode_AllScriptsStart + +# This is the common in-line code for the warping steps. ### +. ${thisDir}/auxiliary/commonCode_Detect_01 + +# This is common in-line code for all spm8Batch script to make sure arguments were passed +. ${thisDir}/auxiliary/commonCode_checkIfArgsPassed + +# +# The actual function. +# + +. ${thisDir}/auxiliary/parse_arguments + +# + +. ${thisDir}/auxiliary/superDebugStatus + +# Make the sandbox if possible. + +. ${thisDir}/auxiliary/make_sandbox + +# +# Ok - let's start displaying things back to the terminal +# + +. ${thisDir}/auxiliary/shellScriptInfo + +# +# Prepare to write the script. +# + +# Makes sure they speficied some subjects. +. ${thisDir}/auxiliary/checkInputForSubjects + +# Write out debug status +. ${thisDir}/auxiliary/debugStatus + +# Ok, lets do the business. + +# Print out the list of subjects that we operate upon. +. ${thisDir}/auxiliary/printSubjectsList + +# Now start building the automatic scripts. + +# +# the following environmental variables are from spm8Batch_Global +# +# HOSTCOMPUTER - name of the computer. +# SCRIPTNAME - name of the scripts to write. +# MATLABDIR - location of the scripts. +# UMBatchMatcher - present working directory. +# FULLSCRIPTNAME - full path and name of scripts to write. +# + +. ${thisDir}/auxiliary/detectSpikePart_01 + +# Name of the functional volumes to find. + +echo "UMVolumeWild = '${volumeWILD}';" >> ${FULLSCRIPTNAME}.m + +# Now build the list of directories for each subject. + +. ${thisDir}/auxiliary/createDirectoryList + +echo " 4) finalizing matlab scripts" + +cat ${thisDir}/parts/detect_spike_part_2.m >> ${FULLSCRIPTNAME}.m ### + +echo " 5) building shell script" + + +# Now build the shell script command that will get launched into the background. + +# Common start to all shell scripts +. ${thisDir}/auxiliary/shellScriptStart + +# Add the matlab code to the shell script + +. ${thisDir}/auxiliary/shellScriptMATLABCall + +# Finalize the shell script. + +. ${thisDir}/auxiliary/shellScriptFinalize + +# Now launch into the background if desired. + +. ${thisDir}/auxiliary/shellScriptLaunch + +# +# all done. +# diff --git a/spm8Batch/matlabScripts/UMBatchDetectSpike.m b/spm8Batch/matlabScripts/UMBatchDetectSpike.m new file mode 100644 index 00000000..efc0089f --- /dev/null +++ b/spm8Batch/matlabScripts/UMBatchDetectSpike.m @@ -0,0 +1,85 @@ +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% UMBatchDetectSpike +% +% A function that performs a batch detect spike upon several subjects. +% +% Call as : +% +% function results = UMBatchDetectSpike(Images,OutputFile,Subject,Run) +% +% To Make this work you need to provide the following input: +% +% Images = char array of images to text +% OutputFile = file to write detected spikes +% ImagePath = full directory path to Images +% +% Output +% +% results = -1 if failure +% 1 if success +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +function results = UMBatchDetectSpike(Images,OutputFile,ImagePath) + detOpt = 1; + Thres = 10; + results = -1; + + fid = fopen(OutputFile,'w'); + if fid == -1 + fprintf('Cannot open file: %s\n',Outputfile); + fprintf(' * * * A B O R T I N G * * *\n'); + return; + end + + % + % Build 4D array + % + if size(Images,1) > 1 + firstImage = nifti( strtrim(Images(1,:)) ); + data = zeros( [firstImage.dat.dim(1:3) size(Images,1)] ); + clear firstImage + + for i=1:size(Images,1) + dumImage = nifti( strtim(Images(i,:)) ); + data(:,:,:,i) = dumImage.dat(:,:,:,i); + clear dumImage + end + else + dumImage = nifti( strtrim(Images) ); + data = dumImage.dat(:,:,:,:); + clear dumImage + end + + % + % Detect spikes here + % + [success results] = dSpike(data,detOpt); + if success == -1 + return; + end + + % + % Write output to text file + % + [nSlice nTime] = size(results); + + % Common header first + fprintf(fid,'%s\n\n',ImagePath); + fprintf(fid,'Slices:%d\n',nSlice); + fprintf(fid,'nTime :%d\n\n',nTime); + + % Write detected spikes now + [Slice Timepoint] = find(results > Thres); + if isempty(Slice) + fprintf(fid,'Status : No spikes found\n'); + else + fprintf(fid,'Status : %d spikes found\n',size(Slice,1)); + + for i=1:size(Slice,1) + fprintf(fid,'Slice:%d,Timepoint:%d,AJKZ:%f\n',Slice(i),Timepoint(i),results( Slice(i), Timepoint(i) ) ); + end + end + + fclose(fid); + results = 1; +end + diff --git a/spm8Batch/matlabScripts/dSpike.m b/spm8Batch/matlabScripts/dSpike.m new file mode 100644 index 00000000..a964b74e --- /dev/null +++ b/spm8Batch/matlabScripts/dSpike.m @@ -0,0 +1,110 @@ +%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% dSpike +% +% A routine that implements the spike detection algorithm from "Automatic +% Spike Detection for fMRI" by Greve et al. +% +% Call as : +% +% function results = dSpike(inputData,options) +% +% To Make this work you need to provide the following input: +% +% inputData = Either a 4D matrix or file name +% detOpt = polynomial order used in spm_detrend (OPTIONAL) +% +% Output +% +% success = seconds for operation if no errors; otherwise, -1 +% results = nSlice x nTime array of the absolute measure of the +% jackknife z-score for each slice in each timepoint (AJKZ) +% +% Comments +% +% Obvious spikes will be obvious in the output. The paper classifies +% any AJKZ > 25 as a spike. It seems reasonable. Figure 1 in paper +% was not exactly reproduced. The distrubution of AJKZ was shifted +% further left. +% +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +function [success results]= dSpike(inputData,detOpt) + +success = -1; +results = []; +tic; + +if ischar(inputData) + inputData = strtrim(inputData); + % Check if file exists + if exist(inputData,'file') ~= 2 + fprintf('Input data "%s"\n does not exist.\n',inputData); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return + end + P = nifti(inputData); + inputData = P.dat(:,:,:,:); +end + +% support only 4D arrays for now +if ndims(inputData) ~= 4 + fprintf('Expected 4D time series\n'); + fprintf(' * * * A B O R T I N G * * *\n\n'); + return +end + +if nargin < 2 + detOpt = []; +end + +[xDim yDim nSlice nTime] = size(inputData); + +% Remove mean per slice per time +for z=1:nSlice + slice = inputData(:,:,z,:); + mu_slice = mean( slice(:) ); + inputData(:,:,z,:) = slice - mu_slice; +end + +% Remove temporal trend, then compute temporal Z-score for each voxel +for z=1:nSlice + slice = squeeze(inputData(:,:,z,:)); + reSlice = reshape(slice,xDim*yDim,nTime)'; + % detrend + if ~isempty(detOpt) + if detOpt ~= 0 + reSlice = spm_detrend(reSlice,detOpt); + else % do this because spm_detrend is just too slow when detOpt = 0 + for t=1:nTime + reSlice(:,t) = reSlice(:,t) - mean(reSlice(:,t)); + end + end + end + %get z score + zScoreSlice = zscore(reSlice); + inputData(:,:,z,:) = abs( reshape(zScoreSlice',xDim,yDim,1,nTime) ); +end + +AAZ = zeros(nSlice,nTime); +% Average the Z-scores across slices and time +for t=1:nTime + for z=1:nSlice + AAZ(z,t) = sum(sum(inputData(:,:,z,t)))/(xDim*yDim); + end +end + +AJKZ = zeros(nSlice,nTime); +indexes = [1:nSlice]'; +% Calculate AJKZ +for z=1:nSlice + loc = (indexes ~= z); + included = AAZ(loc,:); + mu_i = mean(included,1); + std_i = std(included,1); + std_i(std_i==0) = 1; + AJKZ(z,:) = (AAZ(z,:) - mu_i)./(std_i); +end + +results = abs(AJKZ); +success = toc; + +return \ No newline at end of file diff --git a/spm8Batch/parts/detect_spike_part_1.m b/spm8Batch/parts/detect_spike_part_1.m new file mode 100644 index 00000000..9462f0d6 --- /dev/null +++ b/spm8Batch/parts/detect_spike_part_1.m @@ -0,0 +1,55 @@ +% +% This is to be used with SPM8. +% +% To detect spikes in a run using batch use the following code. +% + +% You must point to the batch processing code +% +% addpath /net/dysthymia/spm8Batch +% + +% You need to fill the following variables: +% +% UMBatchMaster = point to the directory of the experiment. +% +% Images = char array of images in a run +% +% OutputFile = results of spike detection is writeen here +% +% Subject = subject name +% +% Run = run name +% +% +% If you are needing to write alot of images out I suggest you use +% a command like this: +% +% Images = spm_select('files',ImagesDir,'ravol*.img'); +% +% where "ImagesDir" is the directory where the images live. You can of +% course put a loop around to write normalize each run seperately etc. +% +% UMBatchSubjs = list of subjects within experiment. Space +% pad if need be. +% + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +% Make sure the UM Batch system is installed. + +if exist('UMBatchPrep') ~= 2 | exist('UMBatchWarp') ~= 2 + fprintf('You need to have the UM Batch system\n'); + return +end + +% +% Prepare the batch processes +% + +UMBatchPrep + +% - - - - - - - END OF PART I - - - - - - - - - - - - - - - - - + + diff --git a/spm8Batch/parts/detect_spike_part_2.m b/spm8Batch/parts/detect_spike_part_2.m new file mode 100644 index 00000000..1a539ffe --- /dev/null +++ b/spm8Batch/parts/detect_spike_part_2.m @@ -0,0 +1,57 @@ +% - - - - - - - -BEGINNING OF PART II - - - - - - - - - - - - - + +% Deblank just in case. + +UMBatchMaster = strtrim(UMBatchMaster); + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +fprintf('Looping on the subjects now\n\n'); + +% +% Loop over the subjects and test each run. +% + +for iSub = 1:length(UMBatchSubjs) + % + fprintf('Working on %s\n',UMBatchSubjs{iSub}) + + % Loop on the runs and get the names of the files to test. + % We use the "spm_select('FPLIst',[directory],[file wildcard])" command + % to get the list of files. + for iRun = 1:length(UMImgDIRS{iSub}) + % + % Grab the images + % + Images = spm_select('FPList',UMImgDIRS{iSub}{iRun},['^' UMVolumeWild '.*.nii']); + nFiles = size(Images,1); + fprintf('Testing a total of %d %s''s\n',nFiles,UMVolumeWild); + % + % Create OutputFile name + % + index = strfind(UMImgDIRS{iSub}{iRun},'run'); + if isempty(index) + OutputFile = fullfile( UMImgDIRS{iSub}{iRun},[UMBatchSubjs{iSub} '_ds.txt'] ); + else + temp = UMImgDIRS{iSub}{iRun}; + index2 = strfind(temp(index(1):end),filesep); + if isempty(index2) + RunStr = temp( index(1):end ); + else + RunStr = temp( index(1):index2(1)-1 ); + end + OutputFile = fullfile( UMImgDIRS{iSub}{iRun},[UMBatchSubjs{iSub} '_' RunStr '_ds.txt'] ); + end + % + % Detect the spikes + % + UMBatchDetectSpike(Images,OutputFile,UMImgDIRS{iSub}{iRun}); + + end +end + +fprintf('\nAll done spike detection.\n'); + +% +% All done. +% From eb93704dd6ae3c7e87a189113b653d9e3ba3b84a Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 30 Apr 2012 10:45:50 -0400 Subject: [PATCH 26/35] Changed options in detectSpike to process all runs whenever it is called. Updated help options. --- spm8Batch/auxiliary/help/help_detectSpike_Options | 1 - spm8Batch/detectSpike | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/spm8Batch/auxiliary/help/help_detectSpike_Options b/spm8Batch/auxiliary/help/help_detectSpike_Options index 2c198a8c..af977db2 100644 --- a/spm8Batch/auxiliary/help/help_detectSpike_Options +++ b/spm8Batch/auxiliary/help/help_detectSpike_Options @@ -1,5 +1,4 @@ echo "${helpComment} volumeWILD : $volumeWILD" - echo "${helpComment} functioanl path : $fmriPATH" echo "${helpComment} functional sub-dir : $subPATH" echo diff --git a/spm8Batch/detectSpike b/spm8Batch/detectSpike index 32e25b78..441f5d33 100755 --- a/spm8Batch/detectSpike +++ b/spm8Batch/detectSpike @@ -34,7 +34,7 @@ thisDir=`dirname $theCommand` thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` -allowedOptions="AfMsUv#" +allowedOptions="AfMsUv" # This piece of code all of the spm8Batch scripts will use . ${thisDir}/auxiliary/commonCode_AllScriptsStart From 8fecbdfe8f462e1f6917ad2a60efa63026fd4b35 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Mon, 30 Apr 2012 11:25:05 -0400 Subject: [PATCH 27/35] Fixed a typo, indexing problem, and formatted output to .txt file. --- spm8Batch/matlabScripts/UMBatchDetectSpike.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spm8Batch/matlabScripts/UMBatchDetectSpike.m b/spm8Batch/matlabScripts/UMBatchDetectSpike.m index efc0089f..670dce0b 100644 --- a/spm8Batch/matlabScripts/UMBatchDetectSpike.m +++ b/spm8Batch/matlabScripts/UMBatchDetectSpike.m @@ -39,8 +39,8 @@ clear firstImage for i=1:size(Images,1) - dumImage = nifti( strtim(Images(i,:)) ); - data(:,:,:,i) = dumImage.dat(:,:,:,i); + dumImage = nifti( strtrim(Images(i,:)) ); + data(:,:,:,i) = dumImage.dat(:,:,:,1); clear dumImage end else @@ -78,7 +78,7 @@ fprintf(fid,'Slice:%d,Timepoint:%d,AJKZ:%f\n',Slice(i),Timepoint(i),results( Slice(i), Timepoint(i) ) ); end end - + fprintf(fid,'\n'); fclose(fid); results = 1; end From 9d9a50e847dec3744ae60c9d886b37f9c2e46bfc Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Thu, 3 May 2012 10:39:14 -0400 Subject: [PATCH 28/35] Corrected output file to have the correct run number in its name --- spm8Batch/parts/detect_spike_part_2.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/spm8Batch/parts/detect_spike_part_2.m b/spm8Batch/parts/detect_spike_part_2.m index 1a539ffe..d2666b86 100644 --- a/spm8Batch/parts/detect_spike_part_2.m +++ b/spm8Batch/parts/detect_spike_part_2.m @@ -33,12 +33,16 @@ if isempty(index) OutputFile = fullfile( UMImgDIRS{iSub}{iRun},[UMBatchSubjs{iSub} '_ds.txt'] ); else + % + % Find out what run it is and put in in OutputFile name + % temp = UMImgDIRS{iSub}{iRun}; - index2 = strfind(temp(index(1):end),filesep); + temp = temp(index(1):end); + index2 = strfind(temp,filesep); if isempty(index2) - RunStr = temp( index(1):end ); + RunStr = strtrim(temp); else - RunStr = temp( index(1):index2(1)-1 ); + RunStr = temp( 1:index2(1)-1 ); end OutputFile = fullfile( UMImgDIRS{iSub}{iRun},[UMBatchSubjs{iSub} '_' RunStr '_ds.txt'] ); end From fdae2646e995aac7cd0f2d39046a509b07211b58 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Thu, 10 May 2012 13:27:40 -0400 Subject: [PATCH 29/35] Removed a for loop --- QualityChecks/CheckSpike/dSpike.m | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/QualityChecks/CheckSpike/dSpike.m b/QualityChecks/CheckSpike/dSpike.m index a964b74e..fd2924ce 100644 --- a/QualityChecks/CheckSpike/dSpike.m +++ b/QualityChecks/CheckSpike/dSpike.m @@ -87,9 +87,8 @@ AAZ = zeros(nSlice,nTime); % Average the Z-scores across slices and time for t=1:nTime - for z=1:nSlice - AAZ(z,t) = sum(sum(inputData(:,:,z,t)))/(xDim*yDim); - end + temp = sum(sum(inputData(:,:,:,t)))./(xDim*yDim); + AAZ(:,t) = temp(:); end AJKZ = zeros(nSlice,nTime); From d2dd71f766906a0f7325d93cf7919d86b7ca98dd Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Thu, 10 May 2012 13:39:41 -0400 Subject: [PATCH 30/35] Removed batchDetectSpike.m from the repository, becuase it was for personal use --- QualityChecks/CheckSpike/batchDetectSpike.m | 65 --------------------- 1 file changed, 65 deletions(-) delete mode 100644 QualityChecks/CheckSpike/batchDetectSpike.m diff --git a/QualityChecks/CheckSpike/batchDetectSpike.m b/QualityChecks/CheckSpike/batchDetectSpike.m deleted file mode 100644 index 341b2106..00000000 --- a/QualityChecks/CheckSpike/batchDetectSpike.m +++ /dev/null @@ -1,65 +0,0 @@ -%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -% batchDetectSpike -% -% A routine that calculates the AJKZ score values for a set of 4D images. -% The final result is expected to be used to create a distribution of the -% values. -% -% function results = dSpike(TextFile,DetrendOpt) -% -% To Make this work you need to provide the following input: -% -% TextFile = name of text file where each line is an image -% DetrendOpt = polynomial order used in spm_detrend (OPTIONAL) -% -% Output -% -% success = seconds for operation is success; otherwise, -1 -% data = Nx2 cell array where column1:ImageName, column2:Results -% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -function [success data only_data] = batchDetectSpike(TextFile,DetrendOpt,Thres) - -success = -1; -data = []; -fid = fopen(TextFile,'r'); -time = 0; - -if fid == -1 - fprintf('Invalid textfile: %s\n',TextFile); - fprintf(' * * * A B O R T I N G * * *\n'); - return; -end - -images = textscan(fid,'%s'); -images = images{1}; -fclose(fid); - -data = cell( size(images,1),4 ); -totalSlices = 0; -for i=1:size(images,1) - data{i,1} = images(i,:); - [SpikeSuccess results] = dSpike(images{i,:},DetrendOpt); - - if SpikeSuccess == -1 - data = []; - return; - end - - time = time + SpikeSuccess; - data{i,2} = results; - totalSlices = totalSlices + numel(results); - - [row col] = find( results > Thres ); - data{i,3} = row; - data{i,4} = col; -end - -only_data = zeros(totalSlices,1); -BeginIndex = 1; -for i=1:size(data,1) - EndIndex = numel(data{i,2}) + BeginIndex - 1; - only_data(BeginIndex:EndIndex) = data{i,2}(:); - BeginIndex = EndIndex + 1; -end - -success = time; From 654ca1feed3d792a4e1cba967f3f5fd3010e2c99 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Thu, 10 May 2012 13:59:39 -0400 Subject: [PATCH 31/35] Removed an unnecessary note from help message --- spm8Batch/auxiliary/help/detectSpike_Help | 5 ----- 1 file changed, 5 deletions(-) diff --git a/spm8Batch/auxiliary/help/detectSpike_Help b/spm8Batch/auxiliary/help/detectSpike_Help index 4a3c593b..acc75cf8 100644 --- a/spm8Batch/auxiliary/help/detectSpike_Help +++ b/spm8Batch/auxiliary/help/detectSpike_Help @@ -11,11 +11,6 @@ echo echo " detectSpike -f func/MSIT 050126zz" echo - echo - echo "*NOTE: This code will actually hunt out rapruns's (or those specified in the -v flag)" - echo " The code does not actually care where the files live. However you can narrow" - echo " the search by supplying the '-s subdir' option which will then require that" - echo " 'subdir' is a string contained in the list of directories returned for warping." echo echo " Current command default configuration is:" echo From 9fe25fa2bb0d0bb931fc7b0ff9bb5f9bc4c0fa13 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Thu, 10 May 2012 14:00:24 -0400 Subject: [PATCH 32/35] Threshold and detrend option is now written in the output text file --- spm8Batch/matlabScripts/UMBatchDetectSpike.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spm8Batch/matlabScripts/UMBatchDetectSpike.m b/spm8Batch/matlabScripts/UMBatchDetectSpike.m index 670dce0b..b497283b 100644 --- a/spm8Batch/matlabScripts/UMBatchDetectSpike.m +++ b/spm8Batch/matlabScripts/UMBatchDetectSpike.m @@ -65,7 +65,9 @@ % Common header first fprintf(fid,'%s\n\n',ImagePath); fprintf(fid,'Slices:%d\n',nSlice); - fprintf(fid,'nTime :%d\n\n',nTime); + fprintf(fid,'nTime :%d\n',nTime); + fprintf(fid,'Thres :%d\n',Thres); + fprintf(fid,'detOpt:%d\n\n',detOpt); % Write detected spikes now [Slice Timepoint] = find(results > Thres); From cbf57efd96d12fbb8d2c7c652c5c9e54c00f9d73 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Thu, 10 May 2012 14:53:59 -0400 Subject: [PATCH 33/35] Added a note in spikeDetect help for where the results are written --- spm8Batch/auxiliary/help/detectSpike_Help | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spm8Batch/auxiliary/help/detectSpike_Help b/spm8Batch/auxiliary/help/detectSpike_Help index acc75cf8..bf504234 100644 --- a/spm8Batch/auxiliary/help/detectSpike_Help +++ b/spm8Batch/auxiliary/help/detectSpike_Help @@ -11,6 +11,9 @@ echo echo " detectSpike -f func/MSIT 050126zz" echo + echo " Note: Results are written in a text file 'subject_[run_##_]ds.txt'" + echo " in the same directory where the 4D scan is located." + echo echo echo " Current command default configuration is:" echo From 3ce1655bd2e6d85b96402c9d158401ca3fedccb1 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Thu, 17 May 2012 11:11:58 -0400 Subject: [PATCH 34/35] Updated flag options for detect spike. --- spm8Batch/detectSpike | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spm8Batch/detectSpike b/spm8Batch/detectSpike index 441f5d33..31b7db78 100755 --- a/spm8Batch/detectSpike +++ b/spm8Batch/detectSpike @@ -34,7 +34,7 @@ thisDir=`dirname $theCommand` thisCommand=`echo $theCommand | awk -F/ '{print $NF}'` -allowedOptions="AfMsUv" +allowedOptions="AfMi#sUv" # This piece of code all of the spm8Batch scripts will use . ${thisDir}/auxiliary/commonCode_AllScriptsStart From 2ce315a108cc7bb792af317f07ccea3a3c492f89 Mon Sep 17 00:00:00 2001 From: Joseph Heffernan Date: Thu, 14 Jun 2012 10:57:18 -0400 Subject: [PATCH 35/35] Added UMBatchLogProcess to UMBatchDetectSpike.m --- spm8Batch/matlabScripts/UMBatchDetectSpike.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spm8Batch/matlabScripts/UMBatchDetectSpike.m b/spm8Batch/matlabScripts/UMBatchDetectSpike.m index b497283b..70e68a5d 100644 --- a/spm8Batch/matlabScripts/UMBatchDetectSpike.m +++ b/spm8Batch/matlabScripts/UMBatchDetectSpike.m @@ -9,7 +9,7 @@ % % To Make this work you need to provide the following input: % -% Images = char array of images to text +% Images = char array of images to test % OutputFile = file to write detected spikes % ImagePath = full directory path to Images % @@ -82,6 +82,16 @@ end fprintf(fid,'\n'); fclose(fid); + + % Log detectSpike was performed + DetectSpikeDir = fileparts( strtrim( Images(1,:) ) ); + + UMBatchLogProcess(DetectSpikeDir,sprintf('UMBatchDetectSpike : Scanned images (%04d) : %s',size(Images,1),Images(1,:))); + + if size(Images,1) > 1 + UMBatchLogProcess(DetectSpikeDir,sprintf('UMBatchDetectSpike : through image : %s',Images(end,:))); + end + results = 1; end