Introduction

Sample scripts demonstrating how to produce screen-cap images from tkmedit and tksurfer.

The basic ideas:

1. A tcl script run from within tkmedit (or tksurfer) instructing it to load particular files, set up a particular view, and save images. (The tcl script needs to finish by causing tkmedit/tksurfer to quit, so that the whole operation can be run multiple times from a shell script.)

2. A shell script to launch tkmedit (or tksurfer) and tell it to run the tcl script. The shell script can do this multiple times to handle multi subjects.

3. Optional: some mechanism to view the saved image files en masse (could be just the thummbnail viewer in your file browser), maybe convert them to gif or jpg and possibly generate html pages to allow users to access them in an organized and annotated manner.

tkmedit example

tcl script (images for one subject)

# tkmedit_surfposn_makeimages.tcl

set subject    [GetSubjectName 0]
#set subjectdir [GetSubjectDir  0]  # FS bug -- this returns path to main volume, not SubjectDir

global env
set subjectsdir $env(SUBJECTS_DIR)
set subjectdir "${subjectsdir}/${subject}"

set    imagedir "$subjectdir/screencaps_surfpos"

puts "Subject    : $subject"
puts "Subject Dir: $subjectdir"

#----------------------------------
# Prep
#----------------------------------
# 0 Main vertices 
# 1 Inflated vertices 
# 2 White vertices 
# 3 Pial vertices 
# 4 Orig vertices 

#-------------------------------------
# Load T1.mgz to main volume -- already done by original command

#-------------------------------------
# Load surfaces:
# 
#LoadMainSurface [0=main; 1=Aux] [filename] 

puts "Load main surfaces"
LoadMainSurface      0 lh.white
LoadPialSurface      0 lh.pial
LoadOriginalSurface  0 lh.orig

puts "Load aux surfaces"
LoadMainSurface      1 rh.white
LoadPialSurface      1 rh.pial
LoadOriginalSurface  1 rh.orig

puts "SetDisplayFlags"
# SetDisplayFlag  2 1
SetDisplayFlag    4 1
SetDisplayFlag    5 1
SetDisplayFlag    6 1
SetDisplayFlag   22 1

#---------------------------
proc do_one_view {orient  slicenum} {
#---------------------------
global imagedir
global subject

  switch -exact -- $orient {
    0 { set viewname cor }
    1 { set viewname axl }
    2 { set viewname sag }
  }

  set slicestr [format "%03d" $slicenum]

  SetOrientation $orient
  SetSlice $slicenum

  puts "RedrawScreen"
  RedrawScreen
  RedrawAll
  RedrawScreen
  RedrawAll
  RedrawScreen
  RedrawAll
  RedrawScreen
  RedrawAll

  # Use braces to avoid tcl's utterly brain-dead catenation inadequacies...
  set imagepath "${imagedir}/${subject}_${viewname}_${slicestr}.tif"

  puts "SaveTIFF ${imagepath}"
  SaveTIFF $imagepath
}

#-----------------------------
# coronal
#-----------------------------
foreach slicenum { 95 120 150 160 170 200 } {
  do_one_view 0 $slicenum
}

#-----------------------------
# axial
#-----------------------------
foreach slicenum { 120 150 160 170 180 190 } {
  do_one_view 1 $slicenum
}

puts "QuitMedit"
QuitMedit

# exit(0)

#=============================================

bash shell script (to produce images for multi subjects)

# tkmedit_surfposn_mass_images_20070917.bash
# mass images

subjectsdir=/brain-RAID2C/freesurfer_gw/MMIL_Download/20070917/Subjects
  scriptdir=/brain-RAID2C/freesurfer_gw/MMIL_Download/20070917/scripts


function onesubject() {
  sbjid=$1

  echo "========================================"
  echo "            "$sbjid
  echo "========================================"
  subjectdir=$subjectsdir"/FS_"$sbjid
  screencapdir=$subjectdir"/screencaps_surfpos"
  mkdir $screencapdir

  tkmedit "FS_"$sbjid T1.mgz  -tcl $scriptdir"/tkmedit_surfposn_makeimages.tcl"
}

onesubject 10419
onesubject 12009
onesubject 12378
[... etc ...]

tksurfer example

tcl script (images for one subject)

# surfparc_makeimages.tcl

set subjectsdir $home
set  subjectdir "$home/$subject"
set    imagedir "$subjectdir/screencaps"

puts "Subject Dir: $subjectdir"
puts "Hemi: $hemi"

#----------------------------------
# Prep
#----------------------------------
# 0 Main vertices 
# 1 Inflated vertices 
# 2 White vertices 
# 3 Pial vertices 
# 4 Orig vertices 

# Supposed to load into pial vertex slots, but appears to load into main instead
# read_pial_vertex_coordinates

read_surface_vertex_set 2 white
read_surface_vertex_set 3 pial 

# note: following command wants side omitted
labl_import_annotation "aparc.annot"

set rotmult 1

if {$hemi == "rh"} {
  set rotmult -1
}

#---------------------------
# Iterate surfaces
#---------------------------
foreach surfix {2 3} {
  set surfname "ERROR"

  switch -exact -- $surfix {
    2 { set surfname wh }
    3 { set surfname pl }
  }

  #show_surf vertexSet

  set_current_vertex_set $surfix

  #---------------------------
  # Iterate views
  #---------------------------
  for {set viewix0 0} {$viewix0 < 6} {incr viewix0 1} {

    switch -exact -- $viewix0 {
      0 { set rot   0                   ; set axis a ; set viewname lat ; set zoom 1.35 }
      1 { set rot 180                   ; set axis y ; set viewname med ; set zoom 1.35 }
      2 { set rot [expr -90 * $rotmult] ; set axis y ; set viewname ant ; set zoom 1.8  }
      3 { set rot [expr  90 * $rotmult] ; set axis y ; set viewname pst ; set zoom 1.8  }
      4 { set rot -90                   ; set axis x ; set viewname sup ; set zoom 1.35 }
      5 { set rot  90                   ; set axis x ; set viewname inf ; set zoom 1.35 }
    }

    make_lateral_view

    switch -exact -- $axis {
      x { rotate_brain_x $rot }
      y { rotate_brain_y $rot }
    }

    scale_brain $zoom
    redraw
     
    # Use braces to avoid tcl's utterly brain-dead catenation inadequacies...
    set imagepath "${imagedir}/${subject}_${surfname}_${hemi}_${viewname}.tif"
    save_tiff $imagepath
  }
}

# will cause FS to exit
exit 0

bash shell script (to produce images for multi subjects)

# tkmedit_surfposn_mass_images_20070917.bash
# mass images

subjectsdir=/brain-RAID2C/freesurfer_gw/MMIL_Download/20070917/Subjects
  scriptdir=/brain-RAID2C/freesurfer_gw/MMIL_Download/20070917/scripts

function onehemi() {
  sbjid=$1
  hemi=$2

  subjectdir=$subjectsdir"/FS_"$sbjid
  screencapdir=$subjectdir"/screencaps"
  mkdir $screencapdir

  tksurfer "FS_"$sbjid $hemi white -tcl $scriptdir"/surfparc_makeimages.tcl"
}

function onesubject() {
  sbjid=$1

  echo "========================================"
  echo "            "$sbjid
  echo "========================================"

  onehemi $sbjid lh
  onehemi $sbjid rh
}

onesubject 10419
onesubject 12009
onesubject 12378
[... etc ...]