#!/bin/tcsh


@global_parse `basename $0` "$*" ; if ($status) exit 0

#set version   = "0.1";  set rev_dat   = "Feb 22, 2021"
# [PT] start of this program in program form.  Programmatically speaking.
#
#set version   = "0.2";  set rev_dat   = "Feb 22, 2021"
# [PT] program up and running.
#    + requires a mask
#
#set version   = "0.3";  set rev_dat   = "Mar 10, 2021"
# [PT] add in more @chauffeur_afni options
#
set version   = "0.4";  set rev_dat   = "Mar 10, 2021"
# [PT] even more @chauffeur_afni options
#
# ----------------------------------------------------------------

set this_prog = "adjunct_apqc_tsnr_with_mask"
set tpname    = "${this_prog:gas/adjunct_//}"
set here      = $PWD

set ulay  = ""
set olay  = ""
set focus = ""
set mask  = ""
set opref = ""
set opref_cbar = ""
set hot_max = 95   # %ile
set hot_min =  5   # %ile

set urange_meth    = "-ulay_range"
set umin           = "0%"
set umax           = "120%"

set opacity        = 4
set Nx             = 7                   # num of mont wins, b/c Ny=1
set Ny             = 1                   
set mgap           = 1                   # gapsize (in px) bt montage slices
set mcolor         = 'black'             # color of montage gap

set user_coors     = "-pass"
set label_mode     = 1

set delta_slices   = "-pass"

# ------------------- process options, a la rr ----------------------

if ( $#argv == 0 ) goto SHOW_HELP

set ac = 1
while ( $ac <= $#argv )
    # terminal options
    if ( ("$argv[$ac]" == "-h" ) || ("$argv[$ac]" == "-help" )) then
        goto SHOW_HELP
    endif
    if ( "$argv[$ac]" == "-ver" ) then
        goto SHOW_VERSION
    endif

    #  ---------- inputs: required ---------------

    if ( "$argv[$ac]" == "-ulay" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set ulay = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-olay" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set olay = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-mask" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set mask = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-focus" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set focus = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-prefix" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set opref = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-prefix_cbar" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set opref_cbar = "$argv[$ac]"

    # --------------------- opts ------------------

    else if ( "$argv[$ac]" == "-montgap" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set mgap = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-montcolor" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set mcolor = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-montx" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set Nx = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-monty" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set Ny = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-opacity" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set opacity = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-label_mode" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set label_mode = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-set_dicom_xyz" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set user_coors = "-set_dicom_xyz "
        set user_coors = "$user_coors $argv[$ac]"
        @ ac += 1
        set user_coors = "$user_coors $argv[$ac]"
        @ ac += 1
        set user_coors = "$user_coors $argv[$ac]"

    else if ( "$argv[$ac]" == "-set_ijk" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set user_coors = "-set_ijk "
        set user_coors = "$user_coors $argv[$ac]"
        @ ac += 1
        set user_coors = "$user_coors $argv[$ac]"
        @ ac += 1
        set user_coors = "$user_coors $argv[$ac]"
    else if ( "$argv[$ac]" == "-ulay_range" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set umin = "$argv[$ac]"
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set umax = "$argv[$ac]"

    else if ( "$argv[$ac]" == "-ulay_range_nz" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set umin = "$argv[$ac]"
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set umax = "$argv[$ac]"
        set urange_meth = "-ulay_range_nz"

    else if ( "$argv[$ac]" == "-delta_slices" ) then
        if ( $ac >= $#argv ) goto FAIL_MISSING_ARG
        @ ac += 1
        set delta_slices = "-delta_slices "
        set delta_slices = "$delta_slices $argv[$ac]"
        @ ac += 1
        set delta_slices = "$delta_slices $argv[$ac]"
        @ ac += 1
        set delta_slices = "$delta_slices $argv[$ac]"

    # ------- end

    else
        echo "\n\n** ERROR: unexpected option #$ac = '$argv[$ac]'\n\n"
        goto BAD_EXIT
        
    endif
    @ ac += 1
end

# =======================================================================
# ============================ ** SETUP ** ==============================
# =======================================================================

echo "++ Prepare for running ${this_prog} (ver = ${version})"

if ( "${ulay}" == "" ) then
    echo "** ERROR: use '-ulay ..'"
    goto BAD_EXIT
endif

if ( "${olay}" == "" ) then
    echo "** ERROR: use '-olay ..'"
    goto BAD_EXIT
endif

if ( "${focus}" == "" ) then
    echo "** ERROR: use '-focus ..'"
    goto BAD_EXIT
endif

if ( "${mask}" == "" ) then
    echo "** ERROR: use '-mask ..'"
    goto BAD_EXIT
endif

if ( "${opref}" == "" ) then
    echo "** ERROR: use '-prefix ..'"
    goto BAD_EXIT
endif

if ( "${opref_cbar}" == "" ) then
    echo "** ERROR: use '-prefix_cbar ..'"
    goto BAD_EXIT
endif

# =========================== calcs ==============================

@ hot_diff = ${hot_max} - ${hot_min}

set uuu0 = `3dBrickStat -slow                \
              -non-zero                      \
              -mask "${mask}"                \
              -percentile 1 1 1              \
              ${olay}`

set uuu2 = `3dBrickStat -slow                \
              -non-zero                      \
              -mask "${mask}"                \
              -percentile ${hot_min} ${hot_diff} ${hot_max} \
              ${olay}`

# round values to nearest int; easier for presentation/reporting
set uuu0[2] = `echo "scale=0; $uuu0[2] / 1.0" | bc`
set uuu2[2] = `echo "scale=0; $uuu2[2] / 1.0" | bc`
set uuu2[4] = `echo "scale=0; $uuu2[4] / 1.0" | bc`

# =========================== make cbar ==============================

set colors   = ( red        oran-red   orange    \
                 oran-yell  yell-oran  yellow    \
                 lt-blue2   blue )

# calc size of spacing within 5-95%ile range
@   ncol     = ${#colors} - 2
set col_step = `echo "scale=3; ($uuu2[4] - $uuu2[2])/(${ncol} * 1.0)" | bc`

# make colorstring within 5-95%ile range
set ll       = 0
set cbar_str = ""

foreach kk ( `seq 0 1 ${ncol}` )
    @ ll += 1
    set val = `echo "scale=0; ($uuu2[4] - ${kk} * ${col_step})/1.0" | bc`
    set cbar_str = "${cbar_str}  ${val}=${colors[$ll]}"
end

# add the bottom values to colorstring
@ ll += 1
set cbar_str = "${cbar_str}  ${uuu0[2]}=${colors[$ll]}"
set cbar_str = "${cbar_str}  0=none"

set range    = "`printf ': %3d - %3d' ${uuu2[2]} ${uuu2[4]}`"
set gen_comm = " cbar: hot color range (${hot_min}-${hot_max}%ile TSNR in mask)"
set gen_comm = "${gen_comm}${range}" 

# =========================== plot ==============================

@chauffeur_afni                                             \
    -ulay             "${ulay}"                             \
    -olay             "${olay}"                             \
    "${urange_meth}" "${umin}" "${umax}"    \
    -func_range       "${uuu2[4]}"                          \
    -box_focus_slices "${focus}"                            \
    -set_subbricks    0 0 0                                 \
    -pbar_posonly                                           \
    -cbar_ncolors     "${ll}"                               \
    -cbar_topval      ""                                    \
    -cbar             "${cbar_str}"                         \
    -opacity          "${opacity}"                          \
    -pbar_saveim      "${opref_cbar}"                       \
    -pbar_comm_range  "${hot_max}%ile in mask"              \
    -pbar_comm_gen    "${gen_comm}"                         \
    -prefix           "${opref}"                            \
    -save_ftype JPEG                                        \
    -montx ${Nx}    -monty ${Ny}                            \
    -montgap $mgap  -montcolor $mcolor                      \
    -set_xhairs OFF                                         \
    -label_mode ${label_mode}   -label_size 3               \
    -do_clean                                               \
    ${user_coors}                                           \
    ${delta_slices}


# ---------------------------------


goto GOOD_EXIT

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

SHOW_HELP:
cat << EOF
-------------------------------------------------------------------------

OVERVIEW ~1~

Just an adjunct program for making TSNR plots for APQC.

Ceci n'est pas un fichier d'aide utile!

written by PA Taylor.

EXTRA OPTS ~1~

-montgap        A
-montcolor      A 
-montx          A
-monty          A
-opacity        A
-set_dicom_xyz  A B C
-set_ijk        A B C
-ulay_range_nz  A B 
-ulay_range     A B
-delta_slices   A B C

EXAMPLE ~1~

adjunct_apqc_tsnr_with_mask                       \
    -ulay         MNI152_2009_template_SSW.nii.gz \
    -focus        MNI152_2009_template_SSW.nii.gz \
    -olay         TSNR*HEAD                       \
    -mask         mask_epi_anat.*HEAD             \
    -prefix       img                             \
    -prefix_cbar  img.cbar

EOF

# ----------------------------------------------------------------------

    goto GOOD_EXIT

SHOW_VERSION:
   echo "version  $version (${rev_dat})"
   goto GOOD_EXIT

FAIL_MISSING_ARG:
    echo "** ERROR! Missing an argument after option flag: '$argv[$ac]'"
    goto BAD_EXIT

BAD_EXIT:
    exit 1

GOOD_EXIT:
    exit 0
