#!/bin/csh -f #+ #OSIRIS library of scripts # #NAME # osimgTakeCals - takes OSIRIS imager calibrations based upon # passed arguments or a passed file # #SYNOPSIS # osimgTakeCals [-D(ebug)] -file calfile | -f(ilter) filter [-p(upil) pupil -i(time) itime -c(oadds) coadds -n(umber) number -l(ampsoff) lampsoff -d(arks) darks -t(rick) trick -l(evel) level # # #DESCRIPTION # takes a user-defined set of dome flats, lamps off, and darks # #OPTIONS # Best to define a calibration file # # -file calibration_file # ### first argument must be "filter=" #filter=kp,number=9,darks=yes,trick=yes #filter=j itime=2,coadds=1,number=7,darks=no,trick=no #filter=kn3 number=9,darks=3 ### # # -D Debug flag. # # The following arguments are accepted if a calfile is not passed. # osimgTakeCals will handle one setup via command line args. # # -f(ilter) filter (required if no file passed) # # -p(upil) pupil (optional, defaults to Open) [Open,sAnn,LAnn,sHex,LHex,HAM,PV] # # -i(time) integration time (seconds, min 1.5), (optional, # defaults to what gives ~15,000 DN) # # -c(oadds) coadds (optional, defaults to 1) # # -n(umber) number of files (optional, defaults to 1) # # -la(mpsoff) flag to take lamps off (optional, defaults to yes) # # -d(arks) flag to take darks of same itime/coadds as flats. # defaults to take same number as flats. if a integer # larger than 1, take that number of darks # # -t(rick) flag to take flats through the TRICK dichroic. If # yes, use default for filter or defined. (optional, # defaults to Open) # # -le(vel) flat lamp level. 0-20 (bright to faint). (optional, # defaults to 0). Currently no action implemented. # #EXAMPLES # osimgTakeCals -file calibration_file # # #FILES # /kroot/rel/default/data/osimgDomeflatParams.dat # #SEE ALSO # osimgFilterInfo #- # # Modifcation History: # 2022-02-07 - jlyke: Original # #----------------------------------------------------------------------- # Boiler plate for "-h" support for command autohelp. if ("$1" == "-h") then help $0 | more exit $status endif # Set up to trap control-C onintr abort # Set default variable values set fcmd = $0 set cmd = ${fcmd:t} set cmdpre = "" set cmdsuf = "" set usage = "Usage: $cmd [-D(ebug)] -file calfile | -f(ilter) filter [-p(upil) pupil -i(time) itime -c(oadds) coadds -n(umber) number -l(ampsoff) lampsoff -d(arks) darks -t(rick) trick -l(evel) level" #define logging output set logdir = /kroot/var/log/$INSTRUMENT/$cmd mkdir -p $logdir set now = `date "+%Y%m%d_%H:%M:%S"` set logfile = $logdir/${cmd}_${now}.log touch $logfile # put a symlink in the home directory to more easily find for observers ln -s $logfile $HOME/ set div = "=======================================================" # define system time in ms as a script ID set idnum = `timestamp -s` #set idnum = `echo ${idnum}000` set msg = "${cmd}: Starting, User: $USER" osirisScriptMsg -t $idnum -T -f $logfile "$div" osirisScriptMsg -t $idnum -T -f $logfile $msg osirisScriptMsg -t $idnum -T -f $logfile "$div" # check whether another script is running set scriptrun = `show -s osiris -terse scriptrun` if ($scriptrun) then set sexposing = `show -s osiris -terse sexposing` set iexposing = `show -s osiris -terse iexposing` modify -s osiris scriptreply="r" osirisScriptMsg -t $idnum -T -f $logfile -A "${cmd}: Another script appears to be running (scriptrun = 1). " \ "SPEC Exposing = $sexposing. " \ "IMAG Exposing = $iexposing. " \ "Do you want to continue?" osirisScriptMsg -T -f $logfile "${cmd}: Set scriptreply keyword to Y or N to respond." osirisScriptMsg -T -f $logfile "${cmd}: Waiting for response." # pop-up a window to ease setting scriptreply osirisScriptReplyWrapper ### Don't change any other OGS keywords (that ODEC pays attention to) here ### while the modal dialog is up on ODEC, bad things happen... MB 1/6/05 set reply = `show -s osiris -terse scriptreply` while ("$reply" == "r") echo -n "." sleep 1 set reply = `show -s osiris -terse scriptreply` end switch ($reply) case Y: case y: echo "" osirisScriptMsg -t $idnum -T -f $logfile "${cmd}: Reply: ${reply} - resuming script." breaksw case N: case n: echo "" osirisScriptMsg -t $idnum -T -f $logfile "${cmd}: Reply: ${reply} - exiting script." exit 3 breaksw default: echo "" osirisScriptMsg -t $idnum -T -f $logfile "${cmd}: Reply: ${reply} - exiting script." exit 3 breaksw endsw endif # turn on scriptrun modify -s osiris scriptrun=1 # Clear out old messages from script message keywords modify -s osiris scripterror=" " modify -s osiris scriptwarn=" " modify -s osiris scriptask=" " # Make sure script abort and pause keywords are set to their defaults modify -s osiris abortimagonly=0 modify -s osiris scriptwait=0 set file = "" set debug = 0 set dmsg = "" # definitions set paramfile = /kroot/rel/default/data/osimgDomeflatParams.dat # scalars set defpupil = Open set defitime = default set defcoadd = 1 set defnumber = 1 set deflampsoff = 1 set defdark = 0 set deftrick = open set deflevel = 0 set defcount = `awk '/^Desired_counts/ {print $2}' $paramfile` set detgain = `awk '/^Detector_gain/ {print $2}' $paramfile` # source noise limited set defsnr = `math "sqrt($detgain x $defcount)"` set defsnr = `round $defsnr` # arrays set filters = () set pupils = () set itimes = () set coadds = () set numbers = () set lampsoffs = () set darks = () set tricks = () set levels = () if ($#argv > 0) then set origargs = ($argv) set msg = "Passed args: $origargs" osirisScriptMsg -t $idnum -T -f $logfile $msg set idx = 1 set myargs = () # preprocess passed arguments. If debug set or a file passed, remove them # from the list of arguments while ($idx <= $#origargs) switch ($origargs[$idx]) case -D*: set debug = 1 set dmsg = "Debug:" set cmdpre = "echo ${cmd}: sim:" osirisScriptMsg -t $idnum -T -f $logfile "Debug mode enabled" breaksw case -file: case --file: # increment idx to get to next element @ idx++ if (-e $origargs[$idx]) then set file = $origargs[$idx] osirisScriptMsg -t $idnum -T -f $logfile "Using calibration file: $file" else osirisScriptMsg -t $idnum -T -f $logfile "Cannot access passed file: $origargs[$idx]" exit 1 endif breaksw default: set myargs = ($myargs $origargs[$idx]) breaksw endsw @ idx++ end else echo $usage exit endif # parse the passed file if ($file != "") then # determine number of filters (setups), lines must start with "f*=" # set numfilts = `grep -v "^#" $file | grep -c filter=` set numfilts = `grep -v "^#" $file | grep -c f\*=` # parse the file # awk statment is: field sep is space or comma; lines that don't match hash; # for all fields in line, print them space delimited set passed = (`awk -F"[ ,]+" '/^[^#]/ {for ( i=1 ; i <= NF ; ++i ) {print $i}}' $file`) # parse the keyword=value pairs; each line separated by "filter=" else # only allow single setup when passing arguments from command line set numfilts = 1 set passed = ($myargs) endif # pre-populate arrays while ($#pupils < $numfilts) set pupils = ($pupils $defpupil) set itimes = ($itimes $defitime) set coadds = ($coadds $defcoadd) set numbers = ($numbers $defnumber) set lampsoffs = ($lampsoffs $deflampsoff) set darks = ($darks $defdark) set tricks = ($tricks $deftrick) set levels = ($levels $deflevel) end # parse the arguments set newargs = ($passed) osirisScriptMsg -t $idnum -T -f $logfile "Passed args: $newargs" set ind = 0 while ($#newargs > 0 ) if ($file != "") then # keyword=value pairs; each line separated by "filter=" set key = `echo $newargs[1] | cut -d= -f1` set val = `echo $newargs[1] | cut -d= -f2` else set key = $newargs[1] set val = $newargs[2] endif # osirisScriptMsg -t $idnum -T -f $logfile "key: $key val: $val" switch ($key) case f*: case -f*: set myfilt = `osimgFilterInfo -filter $val` if ($status != 0 ) then # unrecognized filter set myfilt = "Unknown" endif set filters = ($filters $myfilt) # if we have seen a new filter, increment the index @ ind++ breaksw case p*: case -p*: # validate pupil set pupilcheck = `osimgFilterInfo -keyword $filters[$ind] $val | awk -F- '{print $2}'` if ($pupilcheck != "" ) then set pupils[$ind] = $pupilcheck endif breaksw case i*: case -i*: if (`isfloat $val` == 1 ) then set itimes[$ind] = $val endif breaksw case c*: case -c*: # coadd must be integer value 1 or greater set val = `round $val` if (`isint $val` == 1 ) then if ($val >= 1) then set coadds[$ind] = $val endif endif breaksw case n*: case -n*: # number must be integer value 0 or greater set val = `round $val` if (`isint $val` == 1 ) then if ($val >= 0) then set numbers[$ind] = $val endif endif breaksw case la*: case of*: case -la*: case -of*: switch ($val) # match false, no, 0 case f*: case F*: case n*: case N*: case 0: set lampsoffs[$ind] = 0 breaksw default: set lampsoffs[$ind] = 1 breaksw endsw breaksw case d*: case -d*: # 0=no darks, 1=match number of flats, n=take n darks set val = `round $val` switch ($val) case f*: case F*: case n*: case N*: case 0: set darks[$ind] = 0 breaksw case t*: case T*: case y*: case Y*: case 1: set darks[$ind] = 1 breaksw default: if (`isint $val` == 1 ) then if ($val >= 0 ) then set darks[$ind] = $val endif endif endsw breaksw case t*: case -t*: switch ($val) case h*: case H*: set tricks[$ind] = hBand breaksw case k*: case K*: set tricks[$ind] = kBand breaksw case t*: case T*: case y*: case Y*: case 1: set ttd = `osimgFilterInfo -trick $filters[$ind]` if ($ttd != "") then set tricks[$ind] = $ttd endif breaksw default: set tricks[$ind] = open breaksw endsw breaksw case le*: case -le*: # just assume the correct value was passed if ( `isfloat $val` == 1 ) then set levels[$ind] = $val endif breaksw default: breaksw endsw shift newargs # if command line args, "-keyword1 value1 -keyword2 value2", must shift again if ( $file == "" ) then shift newargs endif # osirisScriptMsg -t $idnum -T -f $logfile "newargs: $newargs" end osirisScriptMsg -t $idnum -T -f $logfile "newargs: $passed" if ($debug) then osirisScriptMsg -t $idnum -T -f $logfile "filters: $filters" osirisScriptMsg -t $idnum -T -f $logfile "pupils: $pupils" osirisScriptMsg -t $idnum -T -f $logfile "itimes: $itimes" osirisScriptMsg -t $idnum -T -f $logfile "coadds: $coadds" osirisScriptMsg -t $idnum -T -f $logfile "numbers: $numbers" osirisScriptMsg -t $idnum -T -f $logfile "lampsoff: $lampsoffs" osirisScriptMsg -t $idnum -T -f $logfile "darks: $darks" osirisScriptMsg -t $idnum -T -f $logfile "tricks: $tricks" osirisScriptMsg -t $idnum -T -f $logfile "levels: $levels" endif osirisScriptMsg -t $idnum -T -f $logfile "$div" # check if filter is valid # if valid, set properties set ind = 1 if ($#filters > 0 ) then # only do stuff if filters were passed set msg = "$dmsg Received $#filters setups to calibrate" osirisScriptMsg -t $idnum -T -f $logfile $msg while ($ind <= $#filters) osirisScriptMsg -t $idnum -T -f $logfile "$div" set msg = "$dmsg Setup $ind of $#filters" osirisScriptMsg -t $idnum -T -f $logfile $msg set msg = "$dmsg filter=$filters[$ind], pupil=$pupils[$ind], itime=$itimes[$ind], coadd=$coadds[$ind], number=$numbers[$ind], lampsoff=$lampsoffs[$ind], dark=$darks[$ind], trick=$tricks[$ind], level=$levels[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg set filter = $filters[$ind] if ( $filter == "Unknown" ) then # skip to the next filter set msg = "$dmsg ERROR: Filter is Unknown, skipping" osirisScriptMsg -t $idnum -T -f $logfile $msg @ ind++ else if ($numbers[$ind] > 0 || $darks[$ind] > 0 ) then if ($itimes[$ind] == "default") then # calculate it set countrate = `awk '/^'$filter' / {print $3}' $paramfile` if ($countrate == 1) then # need to estimate countrate set reffilt = `awk '/^'$filter' / {print $5}' $paramfile` set refrate = `awk '/^'$reffilt' / {print $3}' $paramfile` set bp = `osimgFilterInfo -bandpass $filter` set refbp = `osimgFilterInfo -bandpass $reffilt` set countrate = `math "$bp / $refbp * $refrate"` endif set secs = `math "$defcount / $countrate + 1.0"` set itimes[$ind] = `round $secs` set totalcounts = `math "$countrate x $itimes[$ind]"` set totalcounts = `round $totalcounts` set msg = "$dmsg Calculate itime from $paramfile" osirisScriptMsg -t $idnum -T -f $logfile $msg set msg = "$dmsg Itime = $itimes[$ind] should yield $totalcounts DN per image" osirisScriptMsg -t $idnum -T -f $logfile $msg endif # now get ready to do the things if ($numbers[$ind] > 0 ) then # check that we are the selected instrument set currinst = `show -s dcs -terse currinst | /usr/bin/tr "[A-Z]" "[a-z]"` set myinst = `printenv INSTRUMENT` if ($currinst != $myinst) then set msg = "$dmsg ERROR: dcs.CURRINST = $currinst, skipping domeflats." osirisScriptMsg -t $idnum -T -f $logfile $msg else # set domecals set msg = "$dmsg Setting dcs.DOMECALS to true" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre modify -s dcs domecals=1 # for now must manually move PCU out of the way set msg = "$dmsg Assume PCU is out of beam" osirisScriptMsg -t $idnum -T -f $logfile $msg # open aohatch set msg = "$dmsg Opening AO Hatch" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre aohatch open # set trickDichroic set msg = "$dmsg Setting trickDichroic to $tricks[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre trickDichroic $tricks[$ind] # turn on dome lamps set msg = "$dmsg Domeflat=on, level=$levels[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre lamp dome $levels[$ind] # configure OSIMG set msg = "$dmsg Configuring OSIMG" osirisScriptMsg -t $idnum -T -f $logfile $msg set msg = "$dmsg ifilt `osimgFilterInfo -keyword $filters[$ind] $pupils[$ind]`" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre ifilt `osimgFilterInfo -keyword $filters[$ind] $pupils[$ind]` set msg = "$dmsg iatint $itimes[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre iatint $itimes[$ind] set msg = "$dmsg icoadds $coadds[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre icoadds $coadds[$ind] # turn wait4ao off set msg = "$dmsg wait4ao off" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre wait4ao off # expose set msg = "$dmsg igoi $numbers[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre igoi $numbers[$ind] # now take lamps off if desired if ($lampsoffs[$ind] == 1 ) then # turn off dome lamps set msg = "$dmsg Domeflat=off" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre lamp dome off set msg = "$dmsg igoi $numbers[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre igoi $numbers[$ind] endif # check if this is the last time through. If so, reset domecals and # close the AO hatch if ($ind == $#filters) then # this is the last time through # set domecals set msg = "$dmsg Setting dcs.DOMECALS to false" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre modify -s dcs domecals=0 # close aohatch set msg = "$dmsg Closing AO Hatch" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre aohatch close endif # if ($ind == $#filters) endif # if ($currinst != $myinst) endif # if ($numbers[$ind] > 0) if ($darks[$ind] > 0 ) then set msg = "$dmsg Prepare for dark exposures" osirisScriptMsg -t $idnum -T -f $logfile $msg set msg = "$dmsg Domeflat=off and Filter=Drk" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre lamp dome off $cmdpre ifilt Drk set msg = "$dmsg iatint $itimes[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre iatint $itimes[$ind] set msg = "$dmsg icoadds $coadds[$ind]" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre icoadds $coadds[$ind] # turn wait4ao off set msg = "$dmsg wait4ao off" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre wait4ao off if ( $darks[$ind] == 1 ) then # take same number of darks as flats set mynum = $numbers[$ind] else set mynum = $darks[$ind] endif set msg = "$dmsg igoi $mynum" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre igoi $mynum endif # if ($darks[$ind] > 0 ) endif # if ($numbers[$ind] > 0 || $darks[$ind] > 0 ) @ ind++ endif # if ( $filter == "Unknown" ) end # while ($ind <= $#filters) set stat = 0 else set msg = "$dmsg No filters were passed, doing nothing" osirisScriptMsg -t $idnum -T -f $logfile $msg set stat = 1 endif goto done abort: # Block of code to handle interrupts # Need abort: and done: blocks # both will 1) turn off dome lamps, 2) unset domecals, 3) close aohatch set msg = "$dmsg CTRL-C issued...aborting" osirisScriptMsg -t $idnum -T -f $logfile $msg set stat = 1 done: osirisScriptMsg -t $idnum -T -f $logfile "$div" set msg = "$dmsg Cleaning up..." osirisScriptMsg -t $idnum -T -f $logfile $msg # turn off dome lamps set msg = "$dmsg Domeflat=off" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre lamp dome off # close aohatch set msg = "$dmsg Closing AO Hatch" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre aohatch close # set domecals set msg = "$dmsg Setting dcs.DOMECALS to false" osirisScriptMsg -t $idnum -T -f $logfile $msg $cmdpre modify -s dcs domecals=0 set msg = "$dmsg $cmd DONE. Exiting with status $stat" osirisScriptMsg -t $idnum -T -f $logfile $msg # Cleanup and reset scripting keywords in OGS osirisScriptCleanUp exit $stat