#!/bin/sh
# the next line restarts using wish \
exec pvWish "$0" $*

#
# global parameters
#
# PsKey:    Parameter Space Key
# UpdateDelay: defines the delay to refresh the parameter values 
# Psid:  Parameter Space Id
#
global PvCmd Psid PsKey UpdateDelay Macro_Message afni_to3d
set Psid -1
set NMRHOME $env(XWINNMRHOME)
set HOMEPATH $env(HOME)
set PvCmd "$env(XWINNMRHOME)/prog/bin/pvcmd"
set afni_to3d "$HOMEPATH/afni/to3d"
set PsKey [lindex $argv 0]
set ParSpaceId [lindex $argv 1]
set DataPathNew [lindex $argv 2]

set UpdateDelay 300 
set Macro_Message "Background Macro Starts!"

# rename the default exit handler.
rename exit __exit

set DebugFile [open $env(HOME)/debug.txt w+]

#
# exit handler.
# The opened parameter space must be closed.
#
proc exit {{status 0}} {
    global DebugFile
  	global Psid PvCmd
	if { $Psid != -1 } {
  		catch { exec $PvCmd  -a ParxServer -r ClosePs -psid $Psid }
	}
  	__exit $status	
}

# set the window manager close to the exit handler.
wm protocol . WM_DELETE_WINDOW exit

wm title . "Macro Message during Acquisition"
label .label -text "Macro_Message:"
label .value -textvariable Macro_Message
button .exit -text "Exit" -command exit
pack .label .value .exit -padx 3m -pady 3m
update

#
# main loop to perform the parameter refresh
#

set Path2dseq "$DataPathNew/2dseq"

# Find ACQ_dim MR parameters from ParxServer
set ACQ_dim [exec $PvCmd -a ParxServer -r ParamGetValue -psid $ParSpaceId -param ACQ_dim]
if { $ACQ_dim != 3 } {
   set Macro_Message "This script does not work with 2D acquistion!" 
   exit
}

# Get 3D Matrix Size
set Matrix [exec $PvCmd -a ParxServer -r ParamGetValue -psid $ParSpaceId -param PVM_Matrix ]

# Remove { } symbol
set Matrix_temp [lindex $Matrix 0] 

# Split Matrix x,y,z
set splitMatrixxyz [split $Matrix_temp ","]
lassign $splitMatrixxyz Matrix_X Matrix_Y Matrix_Z

set Matrix_X [format %d $Matrix_X]
set Matrix_Y [format %d $Matrix_Y]
set Matrix_Z [format %d $Matrix_Z]

set Matrix_All "$Matrix_X*$Matrix_Y*$Matrix_Z"

set SPackArrNSlices [exec $PvCmd -a ParxServer -r ParamGetValue -psid $ParSpaceId -param PVM_SPackArrNSlices]
set SPackArrNSlices_temp [lindex $SPackArrNSlices 0] 
set SPackArrNSlices_temp [string index $SPackArrNSlices_temp 1]
set NEchoImages [exec $PvCmd -a ParxServer -r ParamGetValue -psid $ParSpaceId -param PVM_NEchoImages 2> /dev/null]

if { "$NEchoImages" != "0"} {
	set SPackArrNSlices_temp [expr $SPackArrNSlices_temp*$NEchoImages]
}
set Block [expr $Matrix_X*$Matrix_Y*$Matrix_Z*$SPackArrNSlices_temp*2]

set FOVxyz [exec $PvCmd -a ParxServer -r ParamGetValue -psid $ParSpaceId -param PVM_Fov]
set FOVxyz_temp [lindex $FOVxyz 0]

# Split FOV x,y,z
set splitFOVxyz [split $FOVxyz_temp ","]
lassign $splitFOVxyz FOVx FOVy FOVz

set FOVx [expr $FOVx*0.5]
set FOVy [expr $FOVy*0.5]
set FOVz [expr $FOVz*0.5]
set FOV_X [format %#.5gL-R $FOVx]
set FOV_Y [format %#.5gS-I $FOVy]
set FOV_Z [format %#.5gP-A $FOVz]

set FOVstring "-xFOV $FOV_X -yFOV $FOV_Y -zFOV $FOV_Z"
puts $DebugFile "FOVstring=$FOVstring"

set RepetitionTime [exec $PvCmd -a ParxServer -r ParamGetValue -psid $ParSpaceId -param PVM_RepetitionTime]
set OneSecond 1000 
set PauseTime [expr $RepetitionTime*0.025*$OneSecond]

set NRepetitions [exec $PvCmd -a ParxServer -r ParamGetValue -psid $ParSpaceId -param PVM_NRepetitions]
set TotalImages [expr $SPackArrNSlices*$NRepetitions]

# wait until 2dseq has been created (with nonzero size)
while { [ file exist $Path2dseq ] !=  1} {
    after 1000
}

set imgtype "-omri"

# Convert each volume to AFNI format
for {set iter 0} {$iter < $NRepetitions} {incr iter} {
	set BlockIter [expr $Block*$iter]
    	set ImgFormat "3D:$BlockIter:0:$Matrix_X:$Matrix_Y:$Matrix_Z:"
    	set Prefix [format realtime_%04d $iter]
    	set LastVolName $Prefix
    	set fsize [expr $Block*($iter+1)]

    	while { [file size $Path2dseq] < $fsize } {
 	      after [expr {int($PauseTime)}]
	  	  set Macro_Message "Path2dseq size less than block size!"
	}
  
    set systemTime [clock seconds]
	set date [clock format $systemTime -format %D]
    set time [clock format $systemTime -format %H:%M:%S]
    puts $DebugFile "\niter_num=$iter"
    puts $DebugFile "$date, $time "

    set directory "$HOMEPATH/rt_fMRI/data"
    cd $directory

	set afni_prefix "-prefix"
	puts $DebugFile "$afni_to3d $imgtype $FOVstring $afni_prefix $LastVolName $ImgFormat$Path2dseq &"
	
 	set AFNI_RUN_ID [exec $afni_to3d -omri -xFOV $FOV_X -yFOV $FOV_Y -zFOV $FOV_Z -prefix $LastVolName $ImgFormat$Path2dseq &]
	puts $DebugFile "\n"
}

close $DebugFile


