#!/bin/sh  
# \
exec oagwish "$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)]
APSDebugPath

set CVSRevisionAuthor "\$Revision: 1.4 $ \$Author: borland $"
APSApplication . -name SRAnalyzeConditioningConfig -version $CVSRevisionAuthor 

proc SetMainStatus {text} {
    global mainStatus
    set mainStatus $text
    update
}

SetMainStatus "Wait..."
APSScrolledStatus .status -parent .userFrame -textVariable mainStatus -width 80

proc DoAnalyzeConditioningConfiguration {args} {
    set doQuad 0
    set doSext 0
    set doHCorr 0

    set familyFlagList {doQuad doSext doHCorr}
    set familyList {Q S H}
    APSStrictParseArguments $familyFlagList

    foreach familyFlag $familyFlagList family $familyList {
        if ![set $familyFlag] continue
        SetMainStatus "Working on $family"
        if [catch {AnalyzeConditioningConfiguration -family $family} result] {
            return -code error "$result"
        }
    }
}

proc AnalyzeConditioningConfiguration {args} {
    set family ""
    APSStrictParseArguments family
    set inputDir /home/helios/oagData/sr/requestFiles/
    switch $family {
        Q {
            set reqFile $inputDir/quadConditionConfig.req
            set fieldListFile $inputDir/standardizeTemplate.sdds
            lappend checkOptionList -filter=column,To,-100,100,! -filter=column,Min,-0.9,0.9,! \
              -filter=column,Finish,0,100,! 
        }
        S {
            set reqFile $inputDir/sextConditionConfig.req
            set fieldListFile $inputDir/standardizeTemplate.sdds
            lappend checkOptionList -filter=column,To,-100,100,! -filter=column,Min,-0.9,0.9,! \
              -filter=column,Finish,0,35,!
        }
        H {
            set reqFile $inputDir/hcConditionConfig.req
            set fieldListFile $inputDir/degaussTemplate.sdds
            lappend checkOptionList -filter=column,DecayMin,-0.9,0.9,! -filter=column,MaxCurrent,-50,50,! \
              -filter=column,PeriodSec,0,5,! -filter=column,NumDecayTimes,0,2,!
        }
    }

    set tmpFile /tmp/[APSTmpString]
    APSAddToTempFileList $tmpFile.snap $tmpFile.bad $tmpFile.bad.print \
        $tmpFile.col $tmpFile.out $tmpFile.col.print $tmpFile.col.good \
      $tmpFile.col.bad 
    if [catch {exec sddssnapshot $reqFile $tmpFile.snap} result] {
        return -code error "AnalyzeConditioningConfiguration: $result" }
    if [catch {exec sddsprocess $tmpFile.snap -pipe=out \
                 -match=column,CAError=y -nowarning \
                 | tee $tmpFile.bad \
                 | sdds2stream -rows -pipe} badRows] {
        return -code error "AnalyzeConditioningConfiguration: $badRows" }
    if [string compare $badRows "0 rows"]!=0 {
        if [catch {exec sddsprintout $tmpFile.bad $tmpFile.bad.print \
                     -print=column,ControlName -print=column,ReadbackName \
                     "-title=PVs not connecting"} result] {
            return -code error "AnalyzeConditioningConfiguration: $result" }
        APSFileDisplayWindow [APSUniqueName .] \
          -fileName  $tmpFile.bad.print -sddsExportableFile $tmpFile.bad 
        return
    }

    if [catch {exec sdds2stream -column=FieldName $fieldListFile} fieldList] {
        return -code error "AnalyzeConditioningConfiguration: $fieldList"  }
    foreach item $fieldList {
        lappend collectArgs -collect=suffix=$item
        lappend printArgs -column=$item
        if [string compare $item Finish] {
            lappend processOpts1 -process=$item,median,${item}Median 
            lappend processOpts1 "-define=column,${item}Dev,${item} ${item}Median -"
            lappend outlierColumns ${item}Dev
        }
    }

    # Remove outlier records to get a list of supposedly good ones.
    if [catch {eval exec sddsconvert $tmpFile.snap -pipe=out \
                 -retain=column,ReadbackName,Value \
                 | sddstranspose -pipe -newColumn=ReadbackName \
                 | sddscollect -pipe $collectArgs \
                 | sddsprocess -pipe -defi=column,Index,i_row,type=long \
                 $processOpts1 -nowarning \
                 | tee $tmpFile.col \
                 | sddsoutlier -pipe -columns=[join $outlierColumns ,] \
                 -pass=1 -minimumLimit=-0.1 -maximumLimit=0.1 \
                 | sddsprocess -pipe=in $tmpFile.col.good \
                 $checkOptionList -nowarning \
                 "-print=column,Status,ok"} result] {
        return -code error "AnalyzeConditioningConfiguration: $result" 
    }

    # Make a list of the bad record values.
    if [catch {exec sddsselect $tmpFile.col $tmpFile.col.good -match=Rootname \
                 -invert -pipe=out -nowarning \
                 | sddsprocess -pipe=in $tmpFile.col.bad \
                 -nowarning "-print=col,Status,SUSPECT" 
        exec sddscombine $tmpFile.col.good $tmpFile.col.bad -merge -pipe=out \
                 | sddssort -pipe=in $tmpFile.col -column=Index} result] {
        return -code error "AnalyzeConditioningConfiguration: $result" }
    
    if {[catch {exec sddsprocess $tmpFile.col -pipe=out -match=column,Status=SUSPECT -nowarning \
                  | sdds2stream -rows -pipe} outliers]} {
        return -code error "AnalyzeConditioningConfiguration: $outliers" }
    set outliers [lindex [split $outliers] 0]
    if [catch {eval exec sddsprintout $tmpFile.col $tmpFile.col.print \
                 {"-title=$outliers suspect records found\n"} \
                 -format=double=%8.3f \
                 -column=Rootname,label=PSName -column=Status \
                 $printArgs} result] {
        return -code error "AnalyzeConditioningConfiguration: $result" }
    APSFileDisplayWindow [APSUniqueName .] -width 110 \
          -fileName  $tmpFile.col.print -sddsExportableFile $tmpFile.col
}


APSCheckButtonFrame .cb1 -parent .userFrame -orientation horizontal \
  -label Family \
  -buttonList {Quad Sext HCorr} \
  -variableList {doQuad doSext doHCorr} \
  -allNone 1
APSButton .run -parent .userFrame -text Analyze -command \
  {DoAnalyzeConditioningConfiguration -doQuad $doQuad \
     -doSext $doSext -doHCorr $doHCorr }
SetMainStatus Ready.
