#!/bin/sh
# \
exec oagwish "$0" "$@"
wm withdraw .

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 fileIndex 0
set plotOnly 1
set plane Y
#set frequency 60.0
set frequency 127.3
#set frequency 147.1
#set frequency 711.6
#set frequency 1406.7
#set frequency 1661.6
set lattice nux36nuy19
set args $argv

# Added Glenn's reciprocal of MAD as measure of minimum difference between measured FFT orbts and response orbit for each corrector ns.
#developed by Nick Sereno, modified by H. Shang to work with new data collection which collects data by IOC instead of by PV.
#simplied the code and improved the efficiency

APSStrictParseArguments {fileIndex plotOnly plane frequency lattice}

set plane [string toupper $plane]

switch $plane {
    X {
        set rmFile $OAGGlobal(SRLatticesDirectory)/$lattice/sr.h1rm
        set beta betax
        set beta betax
    }
    Y {
        set rmFile $OAGGlobal(SRLatticesDirectory)/$lattice/sr.v1rm
        set beta betay
        set beta betay
    }
}

set twissFile $OAGGlobal(SRLatticesDirectory)/default/aps.twi

set sectorList [exec sdds2stream -col=Sector  /home/helios/oagData/sr/FPGAbpm/sectors.sdds]
if !$plotOnly {
    set fileList ""
    foreach sector ${sectorList} {
        foreach type {A B} {
            set fileRoot S${sector}${type}-[format %03d $fileIndex]
            if [file exists $fileRoot.sdds] {
                puts "processing $fileRoot.sdds ...."
                if [catch {exec sddsconvert $fileRoot.sdds -pipe=out \
                             -retain=col,Index,S*${plane}position  \
                             | sddsconvert -pipe -del=col,S*A:Pj* \
                             | sddsprocess -pipe \
                             "-redefine=col,Time,Index 1296.0 * RFFreq /,units=s" \
                             | sddsconvert -pipe -edit=col,S*,%/:turnHistory//%/:${plane}position// \
                             | sddsfft -pipe -col=Time,S* -fullOutput \
                             | sddsprocess -pipe -filter=col,f,[expr $frequency -0.5],[expr $frequency + 0.5] \
                             | sddsprocess -pipe -process=*FFTS*,first,%s \
                             -process=f,first,Frequency \
                             | sddsconvert -pipe \
                             -retain=par,Frequency,*FFT* \
                             | sddscollapse -pipe \
                             | sddscollect -pipe=in ${fileRoot}${plane}.proc  \
                             -collect=prefix=FFT -collect=prefix=RealFFT -collect=prefix=ImagFFT \
                             -coll=prefix=ArgFFT } result] {
                    puts stderr $result
                    exit 1
                }
                lappend fileList ${fileRoot}${plane}.proc
            }
        }
    }
    if ![llength $fileList] {
        puts stderr "No files found for $plane with $fileIndex fileIndex."
        exit 1
    }
    if [catch {eval exec sddscombine $fileList -merge -pipe=out \
                 | sddsconvert -pipe -rename=col,Rootname=BPMName \
                 | sddsprocess -pipe=in ${fileIndex}${plane}.fft  \
                 -process=*FFT,max,%s_Max \
                 \"-define=col,%s_Norm,%s %s_Max /,select=*FFT\" } result] {
        puts stderr "Error in processing normalized fft: $result"
        exit 1
    }

    #reorder the fft file with the order of response matrix file --this is important
 
    exec sddsconvert $rmFile -pipe=out -retain=col,BPMName,s \
      | sddsxref -pipe=in ${fileIndex}${plane}.fft -nowarnings \
      -match=BPMName -leave=BPMName ${fileIndex}${plane}.fft.1
    
    exec sddsconvert ${fileIndex}${plane}.fft.1 ${fileIndex}${plane}_Real.fft \
      -retain=col,RealFFT
    exec sddsconvert ${fileIndex}${plane}.fft.1 ${fileIndex}${plane}_Imag.fft \
      -retain=col,ImagFFT 
    
    if [catch {exec sddsselect $rmFile ${fileIndex}${plane}.fft.1 \
                 -match=BPMName -pipe=out -nowarnings \
                 | tee ${fileIndex}${plane}.rm \
                 | sddsconvert -pipe \
                 -delete=col,s,etax \
                 | sddspseudoinverse -pipe=in ${fileIndex}${plane}.inv  } result] {
        puts stderr "Error in generating inv file: $result"
        exit 1
    }
    
    exec sddsprocess ${fileIndex}${plane}.rm ${fileIndex}${plane}.rmNeg \
      "-redefine=col,%sNeg,%s -1.0 *,select=S*"

    exec sddsxref -pipe=out ${fileIndex}${plane}.inv ${twissFile} \
      -match=OldColumnNames=ElementName \
      -take=${beta} \
      | sddsconvert -pipe \
      -delete=col,S* \
      -rename=col,OldColumnNames=Corrector \
      | sddstranspose -pipe \
      | sddsprocess -pipe \
      "-process=S*,first,%s_${beta}" \
      | sddsconvert -pipe=in ${fileIndex}${plane}.CorrBeta \
      -retain=param,S*

    exec sddsxref -pipe=out ${fileIndex}${plane}.inv ${twissFile} \
      -match=OldColumnNames=ElementName \
      -take=${beta} \
      | sddsconvert -pipe \
      -delete=col,S* \
      -rename=col,OldColumnNames=Corrector \
      | sddstranspose -pipe \
      | sddsprocess -pipe \
      "-process=S*,first,%sNeg_${beta}" \
      | sddsconvert -pipe=in ${fileIndex}${plane}.CorrBetaNeg \
      -retain=param,S*

    exec sddsxref -pipe=out ${fileIndex}${plane}.fft.1 ${fileIndex}${plane}.rm \
      -take=S* \
      | sddsxref -pipe ${twissFile} \
      -match=BPMName=ElementName \
      -take=${beta} \
      | sddsxref -pipe ${fileIndex}${plane}.CorrBeta \
      -transfer=param,S*_${beta} -leave=* \
      | sddsprocess -pipe=in ${fileIndex}${plane}.Diff \
      -redefine=param,frequency,${frequency},units=Hz \
      "-print=param,frequencyString,Frequency = %0.1f %s,frequency,frequency.units" \
      "-redefine=col,%s_RealDiff,RealFFT_Norm %s - ${beta} sqrt / %s_${beta} sqrt /,select=S*" \
      "-redefine=col,%s_ImagDiff,ImagFFT_Norm %s - ${beta} sqrt / %s_${beta} sqrt /,select=S*"

    exec sddsprocess -pipe=out ${fileIndex}${plane}.Diff \
      "-process=S*_RealDiff,mad,%s_Mad" \
      "-process=S*_ImagDiff,mad,%s_Mad" \
      | sddscollapse -pipe \
      | sddsconvert -pipe \
      -delete=col,* \
      -retain=col,S*_RealDiff_Mad \
      | sddstranspose -pipe \
      | sddsprocess -pipe=in ${fileIndex}${plane}.RealDiffMad \
      "-redefine=col,MadRecip,Column rec" \
      -edit=col,CorrString,OldColumnNames,%/_RealDiff_Mad// \
      -process=MadRecip,maximum,Real_Max \
      -process=MadRecip,maximum,MadRecipMaxPos,functionOf=CorrString,position \
      -redefine=param,frequency,${frequency},units=Hz \
      "-print=param,frequencyString,Frequency = %0.1f %s,frequency,frequency.units" \
      "-print=param,MadRecipMaxPosString,Max Real Diff Orbit: %s,MadRecipMaxPos"

    exec sddsprocess -pipe=out ${fileIndex}${plane}.Diff \
      "-process=S*_RealDiff,mad,%s_Mad" \
      "-process=S*_ImagDiff,mad,%s_Mad" \
      | sddscollapse -pipe \
      | sddsconvert -pipe \
      -delete=col,* \
      -retain=col,S*_ImagDiff_Mad \
      | sddstranspose -pipe \
      | sddsprocess -pipe=in ${fileIndex}${plane}.ImagDiffMad \
      "-redefine=col,MadRecip,Column rec" \
      -edit=col,CorrString,OldColumnNames,%/_ImagDiff_Mad// \
      -process=MadRecip,maximum,Imag_Max \
      -process=MadRecip,maximum,MadRecipMaxPos,functionOf=CorrString,position \
      -redefine=param,frequency,${frequency},units=Hz \
      "-print=param,frequencyString,Frequency = %0.1f %s,frequency,frequency.units" \
      "-print=param,MadRecipMaxPosString,Max Imag Diff Orbit: %s,MadRecipMaxPos"

    exec sddsxref -pipe=out ${fileIndex}${plane}.fft.1 ${fileIndex}${plane}.rmNeg \
      -take=S* \
      | sddsxref -pipe ${twissFile} \
      -match=BPMName=ElementName \
      -take=${beta} \
      | sddsxref -pipe ${fileIndex}${plane}.CorrBetaNeg\
      -transfer=param,S*Neg_${beta} -leave=* \
      | sddsprocess -pipe=in ${fileIndex}${plane}.DiffNeg \
      -redefine=param,frequency,${frequency},units=Hz \
      "-print=param,frequencyString,Frequency = %0.1f %s,frequency,frequency.units" \
      "-redefine=col,%s_RealDiff,RealFFT_Norm %s - ${beta} sqrt / %s_${beta} sqrt /,select=S*Neg" \
      "-redefine=col,%s_ImagDiff,ImagFFT_Norm %s - ${beta} sqrt / %s_${beta} sqrt /,select=S*Neg"

    exec sddsprocess -pipe=out ${fileIndex}${plane}.DiffNeg \
      "-process=S*_RealDiff,mad,%s_Mad" \
      "-process=S*_ImagDiff,mad,%s_Mad" \
      | sddscollapse -pipe \
      | sddsconvert -pipe \
      -delete=col,* \
      -retain=col,S*_RealDiff_Mad \
      | sddstranspose -pipe \
      | sddsprocess -pipe=in ${fileIndex}${plane}.RealDiffMadNeg \
      "-redefine=col,MadRecip,Column rec" \
      -edit=col,CorrString,OldColumnNames,%/Neg_RealDiff_Mad// \
      -process=MadRecip,maximum,RealMax \
      -process=MadRecip,maximum,MadRecipMaxPos,functionOf=CorrString,position \
      -redefine=param,frequency,${frequency},units=Hz \
      "-print=param,frequencyString,Frequency = %0.1f %s,frequency,frequency.units" \
      "-print=param,MadRecipMaxPosString,Max (-) Real Diff Orbit: %s,MadRecipMaxPos"

    exec sddsprocess -pipe=out ${fileIndex}${plane}.DiffNeg \
      "-process=S*_RealDiff,mad,%s_Mad" \
      "-process=S*_ImagDiff,mad,%s_Mad" \
      | sddscollapse -pipe \
      | sddsconvert -pipe \
      -delete=col,* \
      -retain=col,S*_ImagDiff_Mad \
      | sddstranspose -pipe \
      | sddsprocess -pipe=in ${fileIndex}${plane}.ImagDiffMadNeg \
      "-redefine=col,MadRecip,Column rec" \
      -edit=col,CorrString,OldColumnNames,%/Neg_ImagDiff_Mad// \
      -process=MadRecip,maximum,Imag_Max \
      -process=MadRecip,maximum,MadRecipMaxPos,functionOf=CorrString,position \
      -redefine=param,frequency,${frequency},units=Hz \
      "-print=param,frequencyString,Frequency = %0.1f %s,frequency,frequency.units" \
      "-print=param,MadRecipMaxPosString,Max (-) Imag Diff Orbit at: %s,MadRecipMaxPos"
}

if ![file exist  ${fileIndex}${plane}.fft.1] {
    puts stderr "Error:  ${fileIndex}${plane}.fft.1 does not exist yet, do processing first."
    exit 1
}

exec sddsplot -layout=1,2 -graph=line,vary -enum=interval=5 \
  "-topline=FFT of FPGA BPM Orbit Data" -leg  \
  -col=s,RealFFT ${fileIndex}${plane}.fft.1  \
  -col=s,ImagFFT ${fileIndex}${plane}.fft.1 -end \
  -col=BPMName,RealFFT ${fileIndex}${plane}.fft.1 \
  -col=BPMName,ImagFFT ${fileIndex}${plane}.fft.1 \&

exec sddsplot -sep=nameString \
  "-topline=Comparison of Real FFT Orbit with Corrector Response" -leg \
  -col=s,S* ${fileIndex}${plane}.rm -graph=line,type=0 \
  -col=s,RealFFT_Norm ${fileIndex}${plane}.fft.1 -graph=line,type=1 -omni \&

exec sddsplot -sep=nameString \
  "-topline=Comparison of Imag FFT Orbit with Corrector Response" -leg \
  -col=s,S* ${fileIndex}${plane}.rm -graph=line,type=0 \
  -col=s,ImagFFT_Norm ${fileIndex}${plane}.fft.1 -graph=line,type=1 -omni \&

exec sddsplot -sep=nameString \
  "-topline=Comparison of Real FFT Orbit with Negative of Corrector Response" -leg \
  -col=s,S*Neg ${fileIndex}${plane}.rmNeg  -graph=line,type=0 \
  -col=s,RealFFT_Norm ${fileIndex}${plane}.fft.1  -graph=line,type=1 -omni \&

exec sddsplot -sep=nameString \
  "-topline=Comparison of Imag FFT Orbit with Negative of Corrector Response" -leg \
  -col=s,S*Neg ${fileIndex}${plane}.rmNeg  -graph=line,type=0 \
  -col=s,ImagFFT_Norm ${fileIndex}${plane}.fft.1  -graph=line,type=1 -omni \&

exec sddsplot -same=y -sep=nameIndex -groupby=nameIndex -graph=line,vary \
  "-topline=Difference Between Real and Imag FFT and Corrector Response" \
  -title=@frequencyString \
  -col=s,S*_RealDiff ${fileIndex}${plane}.Diff -leg=spec=RealDiff \
  -col=s,S*_ImagDiff ${fileIndex}${plane}.Diff -leg=spec=ImagDiff \&

exec sddsplot -same=y -sep=nameIndex -groupby=nameIndex -graph=line,vary \
  "-topline=Difference Between Real and Imag FFT and Corrector Response" \
  -title=@frequencyString \
  -col=BPMName,S*_RealDiff ${fileIndex}${plane}.Diff -leg=spec=RealDiff \
  -col=BPMName,S*_ImagDiff ${fileIndex}${plane}.Diff -leg=spec=ImagDiff \&

exec sddsplot -same=y -sep=nameIndex -groupby=nameIndex -graph=line,vary \
  "-topline=Difference Between Real and Imag FFT and Neg Corrector Response" \
  -title=@frequencyString \
  -col=s,S*_RealDiff ${fileIndex}${plane}.DiffNeg -leg=spec=RealDiffNeg \
  -col=s,S*_ImagDiff ${fileIndex}${plane}.DiffNeg -leg=spec=ImagDiffNeg \&

exec sddsplot -same=y -sep=nameIndex -groupby=nameIndex -graph=line,vary \
  "-topline=Difference Between Real and Imag FFT and Neg Corrector Response"  \
  -title=@frequencyString \
  -col=BPMName,S*_RealDiff ${fileIndex}${plane}.DiffNeg -leg=spec=RealDiffNeg \
  -col=BPMName,S*_ImagDiff ${fileIndex}${plane}.DiffNeg -leg=spec=ImagDiffNeg \&

exec sddsplot -layout=1,2 -graph=line,vary -title=@frequencyString -enum=interval=4 \
  "-topline=Reciprocal of MAD for Negative Diff Orbits" \
  -col=CorrString,MadRecip ${fileIndex}${plane}.RealDiffMad -leg=spec=Real \
  -string=@MadRecipMaxPosString,p=0.4,q=0.9 \
  -col=CorrString,MadRecip ${fileIndex}${plane}.ImagDiffMad -leg=spec=Imag \
  -string=@MadRecipMaxPosString,p=0.4,q=0.8 -end \
  "-topline=Reciprocal of MAD for Diff Orbits" \
  -col=CorrString,MadRecip ${fileIndex}${plane}.RealDiffMadNeg -leg=spec=Real \
  -string=@MadRecipMaxPosString,p=0.4,q=0.9 \
  -col=CorrString,MadRecip ${fileIndex}${plane}.ImagDiffMadNeg -leg=spec=Imag \
  -string=@MadRecipMaxPosString,p=0.4,q=0.8 \&

exit 0
