#!/bin/tcsh -f # make surface spec files from the surface files # # usage @SUMA_Make_Spec_FS [options] # # options: -sid subject_id : specify subject ID # -fspath FreeSurfer_path : specify path to FreeSurfer files # -neuro : use neurological orientation # -debug level : display extra output # #---------------------------------------------------------------------- goto L_INIT_VARS L_INIT_VARS_DONE: goto L_CHECK_USAGE L_CHECK_USAGE_DONE: goto L_PARSE_COMMAND L_PARSE_COMMAND_DONE: goto L_VERIFY_PROGRAMS L_VERIFY_PROGRAMS_DONE: goto L_SET_SURF_DIRS L_SET_SURF_DIRS_DONE: goto L_CHECK_FOR_OVERWRITE L_CHECK_FOR_OVERWRITE_DONE: goto L_LOOK_FOR_SURF L_LOOK_FOR_SURF_DONE: goto L_CONVERT_SURFACES L_CONVERT_SURFACES_DONE: goto L_CREATE_SPEC L_CREATE_SPEC_DONE: goto L_CREATE_BRICK L_CREATE_BRICK_DONE: goto L_TEST_SURF_VOL L_TEST_SURF_VOL_DONE: goto L_GOOD_END # finished, woohooo! #################################################################### # variable initialization L_INIT_VARS: set prog_name = $0:t set endstr = "$prog_name ... finished" set debug = 0 set surf_attribs = (smoothwm \ pial \ inflated \ occip.patch.3d \ occip.patch.flat \ full.patch.3d \ full.patch.flat \ sphere \ white \ sphere.reg \ ) goto L_INIT_VARS_DONE #################################################################### # check usage, and possibly print help L_CHECK_USAGE: if ( $#argv == 0 ) then echo "usage: $prog_name [options] -sid SUBJECT_ID" echo "usage: $prog_name -help" set endstr = "" goto L_GOOD_END endif goto L_CHECK_USAGE_DONE #################################################################### # parse the command line L_PARSE_COMMAND: # init command line arg values set fs_dir = "." set subj_id = "" set neuro_ori = 0 set args = $#argv set count = 1 while ( $count <= $args ) switch ( "$argv[$count]" ) # ---------------------------------------------------------- # usage: -help case "-h": case "-help": goto L_HELP_END # and don't ya' come back, neither breaksw # ---------------------------------------------------------- # usage: -sid SUBJECT_ID case "-sid": if ( $count >= $args ) then set endstr = "arg usage: -sid SUBJECT_ID" goto L_BAD_END endif @ count ++ set subj_id = $argv[$count] breaksw # ---------------------------------------------------------- # usage: -fspath FREESURFER_PATH case "-fspath": if ( $count >= $args ) then set endstr = "arg usage: -fspath FREESURFER_PATH" goto L_BAD_END endif @ count ++ set fs_dir = $argv[$count] if ( ! -d $fs_dir ) then set endstr = "failure: directory not found - '$fs_dir'" goto L_BAD_END endif breaksw # ---------------------------------------------------------- # usage : -neuro case "-neuro": set neuro_ori = 1 breaksw # ---------------------------------------------------------- # usage : -debug DEBUG_LEVEL case "-debug": if ( $count >= $args ) then set endstr = "arg usage: -debug DEBUG_LEVEL" goto L_BAD_END endif @ count ++ set debug = $argv[$count] if ( "$debug" > 2 ) set debug = 2 if ( "$debug" < 0 ) set debug = 0 breaksw # ---------------------------------------------------------- # bad argument default: set endstr = "invalid option: '$argv[$count]'" goto L_BAD_END breaksw endsw @ count ++ end if ( $subj_id == "" ) then set endstr = "missing required option: -sid" goto L_BAD_END endif if ( $debug ) echo "-- usage okay" if ( $debug > 1 ) set echo set spec_files = ({$subj_id}_lh.spec {$subj_id}_rh.spec ) set afni_prefix = ${subj_id}_SurfVol set afni_dataset = $afni_prefix+orig # set and go to the base directory cd $fs_dir set start_dir = $cwd if ( $debug ) echo "-- using start_dir '$start_dir'" goto L_PARSE_COMMAND_DONE #################################################################### # make sure programs exist L_VERIFY_PROGRAMS: set failed_pgms = 0 foreach test_command ( afni to3d suma mris_convert ) (which $test_command) >& /dev/null if ( $status ) then echo "program not found in path: $test_command" @ failed_pgms ++ endif end if ( $failed_pgms ) then set endstr = "$failed_pgms program(s) not found" goto L_BAD_END endif if ( $debug ) echo "-- all programs found" goto L_VERIFY_PROGRAMS_DONE #################################################################### # 1. set surf_dir and orig_dir - check cwd and parent # 2. create SUMA directory at the same level as surf_dir and store the results there L_SET_SURF_DIRS: # find surf directory if ( -d surf ) then set surf_dir = ./surf else if ( $cwd:t == surf ) then set surf_dir = . else if ( -d ../surf ) then set surf_dir = ../surf else # this is a general failure case, even if we find one set surf_dirs = ( `find . -maxdepth 4 -type d -name surf -print` ) if ( $#surf_dirs == 0 ) then echo "failure: cannot find directory 'surf' under '$fs_dir'" echo "(subject to a maximum search depth of 4 subdirectories)" set endstr = "" else if ( $#surf_dirs == 1 ) then echo "surf directory found at '$surf_dirs[1]'" set endstr = "consider running program from '$surf_dirs[1]:h'" else echo "multiple surf directories found:" set count = 1 while ( $count <= $#surf_dirs ) echo " $surf_dirs[$count]" @ count ++ end set endstr = ( "consider running program from one of the" \ "surf directories" ) endif goto L_BAD_END endif # verify surf dir permissions if ( ! -w $surf_dir ) then set endstr = "failure: no write permissions for directory '$surf_dir'" goto L_BAD_END endif if ( $debug ) echo "-- using surf directory '$surf_dir'..." # now check for orig dir set orig_dir = "" foreach test_dir ( $surf_dir/orig \ $surf_dir/mri/orig \ orig \ mri/orig \ ../orig \ ../mri/orig ) if ( -d $test_dir ) then set orig_dir = $test_dir break endif end if ( $orig_dir == "" ) then set endstr = "failure: cannot find directory 'orig' under $fs_dir" goto L_BAD_END endif # verify orig dir permissions if ( ! -w $orig_dir ) then set endstr = "failure: no write permissions for directory '$orig_dir'" goto L_BAD_END endif if ( $debug ) echo "-- using orig directory '$orig_dir'..." # decide whether we need to make surf/SUMA directory set suma_dir = ./SUMA if ( -d $suma_dir ) then if ( $debug ) echo "-- $suma_dir already exists, continuing..." else echo "++ creating directory '$suma_dir' for results..." mkdir $suma_dir if ( $status ) then set endstr = "failure: cannot create directory '$suma_dir'" goto L_BAD_END endif endif goto L_SET_SURF_DIRS_DONE #################################################################### # verify non-existence of spec files and AFNI files L_CHECK_FOR_OVERWRITE: set test_failures = 0 foreach test_file ( $suma_dir/$spec_files[1] \ $suma_dir/$spec_files[2] \ $suma_dir/$afni_dataset.HEAD \ $suma_dir/$afni_dataset.BRIK \ $orig_dir/$afni_dataset.HEAD \ $orig_dir/$afni_dataset.BRIK ) if ( -f $test_file ) then if ( $test_failures == 0 ) then echo "failure: will not overwrite files: " set test_failures = 1 endif echo " '$test_file'" endif end if ( $test_failures ) then set endstr = "please remove these files if you want to rerun the script." goto L_BAD_END endif goto L_CHECK_FOR_OVERWRITE_DONE #################################################################### # find surface files L_LOOK_FOR_SURF: cd $surf_dir set list_lh = "X" # init to something useless - allows nice empty check set list_rh = "X" foreach attrib ( $surf_attribs ) if ( -f lh.$attrib ) set list_lh = ( $list_lh lh.$attrib ) if ( -f rh.$attrib ) set list_rh = ( $list_rh rh.$attrib ) end set list_lh = ( $list_lh[2-] ) # now remove the leading "X" set list_rh = ( $list_rh[2-] ) if ( $#list_lh == 0 && $#list_rh == 0 ) then set endstr = "found no LH or RH surface files under '$surf_dir'" goto L_BAD_END endif if ( $#list_lh > 0 ) then echo "-- found $#list_lh LH surfaces" if ( $debug ) echo " --" $list_lh endif if ( $#list_rh > 0 ) then echo "-- found $#list_rh RH surfaces" if ( $debug ) echo " --" $list_rh endif cd $start_dir goto L_LOOK_FOR_SURF_DONE #################################################################### # convert to ascii via mris_convert (found earlier) L_CONVERT_SURFACES: cd $surf_dir foreach surf ( $list_lh $list_rh ) # run mris_convert and verify if ( $surf =~ *patch* ) then echo "-- running 'mris_convert -p $surf $surf.asc'" mris_convert -p $surf $surf.asc else echo "-- running 'mris_convert $surf $surf.asc'" mris_convert $surf $surf.asc endif if ( ! -f $surf.asc ) then echo "failure: could not create surface $surf.asc" if ( ! -w . ) then set endstr = "--> no write permissions in this directory" else set endstr = "--> is your FreeSurfer license installed?" endif goto L_BAD_END endif if ( $debug ) then echo "++ $surf.asc created" if ( -f $start_dir/$suma_dir/$surf.asc ) then echo "++ overwriting '$suma_dir/$surf.asc'" endif endif \mv -f $surf.asc $start_dir/$suma_dir # how barbaric! if ( $status ) then set endstr = ( "failure: cannot write" \ "'$suma_dir/$surf.asc'" ) goto L_BAD_END endif end cd $start_dir goto L_CONVERT_SURFACES_DONE #################################################################### # actually create the spec file L_CREATE_SPEC: cd $suma_dir foreach hand ( lh rh ) if ( $hand == lh ) then set list_cur = ( $list_lh ) # get a current list copy else set list_cur = ( $list_rh ) endif set spec_file = {$subj_id}_$hand.spec if ( $debug ) echo "++ creating spec file '$spec_file'..." (echo "# delimits comments" > $spec_file) >& /dev/null if ( $status ) then set endstr = ( "failure: no permissions to create spec file" \ "'$suma_dir/$spec_file'" ) goto L_BAD_END endif # note user, date, machine, pwd, command line echo "" >> $spec_file echo "# Creation information:" >> $spec_file echo "# user : $user" >> $spec_file echo "# date : `date`" >> $spec_file echo "# machine : `uname -n`" >> $spec_file echo "# pwd : $cwd" >> $spec_file echo "# command : $prog_name $argv" >> $spec_file echo "" >> $spec_file # define the group echo "# define the group" >> $spec_file echo " Group = $subj_id" >> $spec_file echo "" >> $spec_file # define the states echo "# define various States" >> $spec_file foreach attrib ( $surf_attribs ) echo " StateDef = $attrib" >> $spec_file end echo "" >> $spec_file foreach surf ( $list_cur ) set s_head = `echo $surf | cut -d. -f1` # up to first '.' set s_state = `echo $surf | cut -d. -f2-` # after first '.' # check for SAME mapping ref if ( "$surf.asc" == "$s_head.smoothwm.asc" ) then set map_ref = SAME else set map_ref = $s_head.smoothwm.asc endif # EmbedDimension is 2 for .flat surfaces, else 3 if ( $surf =~ *.flat* ) then set embed_ref = 2 else set embed_ref = 3 endif echo "NewSurface" >> $spec_file echo " SurfaceFormat = ASCII" >> $spec_file echo " SurfaceType = FreeSurfer" >> $spec_file echo " FreeSurferSurface = $surf.asc" >> $spec_file echo " LocalDomainParent = $map_ref" >> $spec_file echo " SurfaceState = $s_state" >> $spec_file echo " EmbedDimension = $embed_ref" >> $spec_file echo "" >> $spec_file end echo "++ created spec file'$suma_dir/$spec_file'" end # foreach hand cd $start_dir goto L_CREATE_SPEC_DONE #################################################################### # actually create an AFNI dataset L_CREATE_BRICK: cd $orig_dir # verify existence of 256 COR files, Checking for 256 is now obsolete ZSS Oct 14 04 set cor_files = ( COR-??? ) >& /dev/null if ( $status ) then set endstr = "failure: did not find COR files under '$orig_dir'" goto L_BAD_END #else if ( $#cor_files != 256 ) then #set endstr = "failure: 256 COR files required under '$orig_dir'" #goto L_BAD_END endif # create BRIK with to3d #SLAB changed by ZSS Mar 12 04. was 0.5 mm off. Bug pointed #out by A. Thomas. Good info found here: #www.wideman-one.com/gw/brain/fs/coords/fscoords.htm #New block added for reading COR images that are no longer 256x256x256 / 1mm cubic voxels ZSS Oct 20 04 set Sr = `grep -w imnr0 COR-.info` set i0 = $Sr[$#Sr] set Sr = `grep -w imnr1 COR-.info` set i1 = $Sr[$#Sr] set Sr = `grep -w fov COR-.info` set FOV = `ccalc -eval $Sr[$#Sr] \* 1000` set Sr = `grep -w x COR-.info` set nx = $Sr[$#Sr] set Sr = `grep -w y COR-.info` set ny = $Sr[$#Sr] set Sr = `grep -w thick COR-.info` set zthick = `ccalc -eval $Sr[$#Sr] \* 1000` set Sr = `grep -w psiz COR-.info` set psize = `ccalc -eval $Sr[$#Sr] \* 1000` set xSLAB0 = `ccalc -eval $nx \* $psize / 2` set xSLAB1 = `ccalc -eval $xSLAB0 - $psize` set ySLAB0 = `ccalc -eval $ny \* $psize / 2` set ySLAB1 = `ccalc -eval $ySLAB0 - $psize` set zSLAB0 = `ccalc -eval '('$i1 - $i0 + 1')' \* $zthick / 2` set zSLAB1 = `ccalc -eval $zSLAB0 - $zthick` if (0) then echo "COR-.info:" echo "i0,i1 = $i0, $i1, FOV = $FOV" echo "nx,ny = $nx, $ny" echo "pdim = $psize mm, thick = $zthick mm" echo "SLABS: $xSLAB0..$xSLAB1, $ySLAB0..$ySLAB1, $zSLAB0..$zSLAB1" if ( $neuro_ori == 1 ) then echo "to3d -xSLAB $xSLAB0'L'-$xSLAB1'R' -ySLAB $ySLAB0'S'-$ySLAB1'I' \ -zSLAB $zSLAB0'P'-$zSLAB1'A' '3Db:0:0:'$nx':'$ny':1:COR-???'" else echo "to3d -xSLAB $xSLAB0'R'-$xSLAB1'L' -ySLAB $ySLAB0'S'-$ySLAB1'I' \ -zSLAB $zSLAB0'P'-$zSLAB1'A' '3Db:0:0:'$nx':'$ny':1:COR-???'" endif endif if ( $neuro_ori == 1 ) then to3d -prefix $afni_prefix -xSLAB $xSLAB0'L'-$xSLAB1'R' -ySLAB $ySLAB0'S'-$ySLAB1'I' -zSLAB $zSLAB0'P'-$zSLAB1'A' '3Db:0:0:'$nx':'$ny':1:COR-???' #to3d -prefix $afni_prefix -xSLAB 127L-128R -ySLAB 128S-127I \ # -zSLAB 128P-127A $cor_files else to3d -prefix $afni_prefix -xSLAB $xSLAB0'R'-$xSLAB1'L' -ySLAB $ySLAB0'S'-$ySLAB1'I' -zSLAB $zSLAB0'P'-$zSLAB1'A' '3Db:0:0:'$nx':'$ny':1:COR-???' #to3d -prefix $afni_prefix -xSLAB 128R-127L -ySLAB 128S-127I \ # -zSLAB 128P-127A $cor_files endif mv $afni_dataset.HEAD $afni_dataset.BRIK $start_dir/$suma_dir echo "++ created AFNI file '$suma_dir/$afni_dataset.HEAD'" echo "++ created AFNI file '$suma_dir/$afni_dataset.BRIK'" cd $start_dir goto L_CREATE_BRICK_DONE #################################################################### # echo details for the user to launch suma and afni, in order to # check the alignment L_TEST_SURF_VOL: echo "" echo "------------------------------------------------------------------" echo "Please verify that the datasets are aligned properly in both" echo "afni and suma. You may do this by running the following commands:" echo "" echo " cd $suma_dir" echo " afni -niml &" echo " suma -spec $spec_file -sv $afni_dataset" goto L_TEST_SURF_VOL_DONE #################################################################### # display help and exit L_HELP_END: echo "" echo "$prog_name - prepare for surface viewing in SUMA" echo "" echo " This script goes through the following steps:" echo " - verify existence of necessary programs " echo " (afni, to3d, suma, mris_convert)" echo " - determine the location of surface and COR files" echo " - creation of ascii surface files via 'mris_convert'" echo " - creation of left and right hemisphere SUMA spec files" echo " - creation of an AFNI dataset from the COR files via 'to3d'" echo "" echo " - all created files are stored in a new SUMA directory" echo "" echo " Usage: $prog_name [options] -sid SUBJECT_ID" echo "" echo " examples:" echo "" echo " $prog_name -sid subject1" echo " $prog_name -help" echo " $prog_name -fspath subject1/surface_stuff -sid subject1" echo " $prog_name -neuro -sid 3.14159265 -debug 1" echo "" echo " options:" echo "" echo " -help : show this help information" echo "" echo " -debug LEVEL : print debug information along the way" echo " e.g. -debug 1" echo " the default level is 0, max is 2" echo "" echo " -fspath PATH : path to 'surf' and 'orig' directories" echo " e.g. -fspath subject1/surface_info" echo " the default PATH value is './', the current directory" echo "" echo " This is generally the location of the 'surf' directory," echo " though having PATH end in surf is OK. The mri/orig" echo " directory should also be located here." echo "" echo " Note: when this option is provided, all file/path" echo " messages will be with respect to this directory." echo "" echo " -neuro : use neurological orientation" echo " e.g. -neuro" echo " the default is radiological orientation" echo "" echo " In the default radiological orientation, the subject's" echo " right is on the left side of the image. In the" echo " neurological orientation, left is really left." echo "" echo " -sid SUBJECT_ID : required subject ID for file naming" echo "" echo "" echo " notes:" echo "" echo " 0. More help may be found at http://afni.nimh.nih.gov/ssc/ziad/SUMA/SUMA_doc.htm" echo " 1. Surface file names should look like 'lh.smoothwm'." echo " 2. Patches of surfaces need the word patch in their name, in" echo " order to use the correct option for 'mris_convert'." echo " 3. Flat surfaces must have .flat in their name." echo " 4. You can tailor the script to your needs. Just make sure you rename it or risk" echo " having your modifications overwritten with the next SUMA version you install." echo "" echo " R. Reynolds (rickr@codon.nih.gov), Z. Saad (ziad@nih.gov)" echo "" exit #################################################################### # failure! L_BAD_END: echo "" if ( "$endstr" != "" ) echo "$endstr" echo program failure: exiting... echo "" exit #################################################################### # finished! L_GOOD_END: if ( $debug > 1 ) unset echo echo "" if ( "$endstr" != "" ) then echo "$endstr" echo "" endif exit # just to be consistent