#!/bin/sh  
# \
exec oagtclsh "$0" "$@"

set auto_path [linsert $auto_path 0  /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0 /usr/local/oag/lib_patch/$env(HOST_ARCH)]
APSStandardSetup

set usage {usage: processHistograms -filter <string> -output <string> -method \{naff|fft\}}
set args $argv
set filter ""
set output ""
set method naff
if {[APSStrictParseArguments {filter output method}] || ![string length $filter] || ![string length $output] || \
    [lsearch -exact [list NAFF FFT naff fft] $method]==-1} {
    return -code error "$usage"
}
set method [string tolower $method]
if [string compare [file extension $filter] .hf]!=0 {
    set filter $filter.hf
}
if [file exists $output] {
    return -code error "in use: $output"
}

foreach file [glob $filter] {
    # We expect the rootname to have the experimental parameters encoded in it:
    # linac-<n>MP-<m>um-<x>p<y>A-<b>B-<f>F-<l>LSC
    # where <n> = number of particles in millions
    #       <m> = modulation wavelength in microns
    #       <x>p<y> ==> <x>.<y> % modulation
    #       <b> = number of bins
    #       <f> = 0 or 1 for filter on/off
    #       <l> = 0 or 1 for LSC on/off
    if [string match linac-*MP-*um-*p*A-*B-?F-?LSC*.hf $file]==0 {
        puts stderr "Ignoring $file"
        continue
    }
    puts stderr "working on $file"
    set np [exec sdds2stream -parameter=Particles $file]
    switch $method {
        naff { 
            exec sddsprocess $file -pipe=out -clip=500,500 -process=dt,ave,dtMean \
              "-redefine=column,dt,dt dtMean -,units=s" \
              | sddspfit -pipe -column=dt,dtFrequency -terms=7 \
              | sddsnaff -pipe -columns=dt,dtFrequencyResidual -terminate=maxFreq=1 \
              | sddsexpand -pipe \
              | sddscollapse -pipe \
              | sddsprocess -pipe=in $file.naff \
              -print=column,Filename,$file \
              "-define=column,FinalWavelength,c_mks dtFrequencyResidualFrequency / 1e6 *,units=\$gm\$rm" \
              "-define=column,FinalAmplitude,dtFrequencyResidualAmplitude Intercept / 100 *,units=%" \
              "-define=column,InitialWavelength,[os editstring 2Z-S/um/100d $file],units=\$gm\$rm" \
              "-define=column,InitialAmplitude,[os editstring 3Z-%/p/./S/A/100d $file],units=%" \
              "-define=column,Bins,[os editstring 4Z-S/B/100d $file],type=short" \
              "-define=column,FilterOn,[os editstring 5Z-S/F/100d $file],type=short" \
              "-define=column,LscOn,[os editstring 6Z-S/L/100d $file],type=short" \
              "-define=column,WavelengthCompressionFactor,InitialWavelength FinalWavelength /" \
              "-define=column,GainFactor,FinalAmplitude InitialAmplitude /" \
              "-define=column,Particles,$np"
            lappend fileList $file.naff
        }
        fft {
            exec sddsprocess $file -pipe=out -clip=500,500 -process=dt,ave,dtMean \
              "-redefine=column,dt,dt dtMean -,units=s" \
              | sddspfit -pipe -column=dt,dtFrequency -terms=7 \
              | sddsfft -pipe -columns=dt,dtFrequencyResidual \
              | sddsprocess -pipe \
                -process=FFTdtFrequencyResidual,max,%sMax \
                -process=FFTdtFrequencyResidual,max,%sPosMax,functionOf=f,position \
              | sddsexpand -pipe \
              | sddscollapse -pipe \
              | sddsprocess -pipe=in $file.fft \
              -print=column,Filename,$file \
              "-define=column,FinalWavelength,c_mks FFTdtFrequencyResidualPosMax / 1e6 *,units=\$gm$\rm" \
              "-define=column,FinalAmplitude,FFTdtFrequencyResidualMax Intercept / 100 *,units=%" \
              "-define=column,InitialWavelength,[os editstring 2Z-S/um/100d $file],units=\$gm\$rm" \
              "-define=column,InitialAmplitude,[os editstring 3Z-%/p/./S/A/100d $file],units=%" \
              "-define=column,Bins,[os editstring 4Z-S/B/100d $file],type=short" \
              "-define=column,FilterOn,[os editstring 5Z-S/F/100d $file],type=short" \
              "-define=column,LscOn,[os editstring 6Z-S/L/100d $file],type=short" \
              "-define=column,WavelengthCompressionFactor,InitialWavelength FinalWavelength /" \
              "-define=column,GainFactor,FinalAmplitude InitialAmplitude /" \
              "-define=column,Particles,$np"
            lappend fileList $file.fft
        }
    }
}

eval exec sddscombine $fileList -merge -pipe=out \
  | sddsprocess -pipe -filter=col,WavelengthCompressionFactor,0,150 \
  | sddssort -pipe -column=InitialWavelength,incr -column=GainFactor,decr \
  | tee $output.full \
  | sddsbreak -pipe -change=InitialWavelength \
  | sddsprocess -pipe -process=GainFactor,min,%sMinP -process=GainFactor,max,%sMaxP \
    -clip=1,0,invert \
    {"-define=column,GainFactorMin,GainFactorMinP"} \
    {"-define=column,GainFactorMax,GainFactorMaxP"} \
  | sddscombine -pipe=in -merge -overwrite $output


