diff options
Diffstat (limited to 'noao/imred/src/doecslit/sfluxcal.cl')
-rw-r--r-- | noao/imred/src/doecslit/sfluxcal.cl | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/noao/imred/src/doecslit/sfluxcal.cl b/noao/imred/src/doecslit/sfluxcal.cl new file mode 100644 index 00000000..b8b7fd80 --- /dev/null +++ b/noao/imred/src/doecslit/sfluxcal.cl @@ -0,0 +1,214 @@ +# SFLUXCAL -- Extract standard stars and determine sensitivity function. +# If flux calibrating, extract and dispersion correct the standard star +# spectra. Compile the standard star fluxes from the calibration +# directory. The user is queried for the star name but the band passes +# are not allow to change interactively. Next compute the sensitivity +# function using SENSFUNC. This is interactive. Once the sensitivity +# function images are created, flux and extinction calibrate the standard +# stars. This is done in such a way that if new standard stars are added +# in a later execution only the new stars are added and then a new +# sensitivity function is computed. If the update flag is set all +# spectra which are specified are reprocessed if they were previously +# processed. In a redo the "std" file is deleted, otherwise additions +# are appended to this file. + +procedure sfluxcal (stds, arcs, arcref, arcrefs, redo, update, + scattered, arcap, extcor, done, log1, log2) + +file stds +file arcs +file arcref +string arcrefs +bool redo +bool update +bool scattered +bool arcap +bool extcor +file done +file log1 +file log2 + +struct *fd1, *fd2, *fd3 + +begin + string imtype, ectype + string spec, specec, arc, str1, str2, str3, str4 + file temp1, temp2 + int i, j + bool reextract, log, scat + str1 = "" + str2 = "" + + imtype = "." // envget ("imtype") + i = stridx (",", imtype) + if (i > 0) + imtype = substr (imtype, 1, i-1) + ectype = ".ec" // imtype + + temp1 = mktemp ("tmp$iraf") + temp2 = mktemp ("tmp$iraf") + + reextract = redo || (update && (sproc.newaps || sproc.newdisp)) + sproc.newsens = no + + if (redo && access ("std")) + delete ("std", verify=no) + + fd1 = stds + while (fscan (fd1, spec) != EOF) { + specec = spec // ectype + + scat = no + if (scattered) { + hselect (spec, "apscatte", yes, > temp1) + fd2 = temp1 + if (fscan (fd2, str1) < 1) + scat = yes + fd2 = ""; delete (temp1, verify=no) + } + if (reextract || !access (specec) || (update && scat)) { + if (access (specec)) + imdelete (specec, verify=no) + + if (scat) { + print ("Subtract scattered light in ", spec) | tee (log1) + apslitproc (spec, ansextract="NO", ansscat="YES") + } + + print ("Extract standard star spectrum ", spec) | tee (log1) + hselect (spec, "date-obs,ut,exptime", yes, > temp1) + hselect (spec, "ra,dec,epoch,st", yes, >> temp1) + fd2 = temp1 + if (fscan (fd2, str1, str2, str3) == 3) { + setjd (spec, observatory=observatory, date="date-obs", + time="ut", exposure="exptime", jd="jd", hjd="", + ljd="ljd", utdate=yes, uttime=yes, listonly=no, + >> log1) + if (fscan (fd2, str1, str2, str3, str4) == 4) + setairmass (spec, intype="beginning", + outtype="effective", exposure="exptime", + observatory=observatory, show=no, update=yes, + override=yes, >> log1) + } + fd2 = ""; delete (temp1, verify=no) + apslitproc (spec) + } + + hselect (specec, "dc-flag,std-flag", yes, > temp1) + fd2 = temp1 + j = fscan (fd2, str1, str2) + fd2 = ""; delete (temp1, verify=no) + if (j < 1) { + # Fix arc headers if necessary. + if (sproc.newarcs) { + fd2 = arcs + while (fscan (fd2, arc) != EOF) { + hselect (arc, "date-obs,ut,exptime", yes, > temp1) + hselect (arc, "ra,dec,epoch,st", yes, >> temp1) + fd3 = temp1 + if (fscan (fd3, str1, str2, str3) == 3) { + setjd (arc, observatory=observatory, + date="date-obs", time="ut", exposure="exptime", + jd="jd", hjd="", ljd="ljd", utdate=yes, + uttime=yes, listonly=no, >> log1) + if (fscan (fd3, str1, str2, str3, str4) == 4) + setairmass (arc, intype="beginning", + outtype="effective", exposure="exptime", + observatory=observatory, show=no, + update=yes, override=yes, >> log1) + } + fd3 = ""; delete (temp1, verify=no) + hedit (arc, "refspec1", arc, add=yes, verify=no, + show=no, update=yes) + } + fd2 = "" + sproc.newarcs = no + } + + print ("Assign arc spectra for ", spec) | tee (log1) + refspectra (spec, references=arcrefs, + apertures="", refaps="", ignoreaps=no, + select=sparams.select, sort=sparams.sort, + group=sparams.group, time=sparams.time, + timewrap=sparams.timewrap, override=yes, confirm=no, + assign=yes, logfiles="STDOUT", verbose=no) | + tee (log1, > log2) + + sdoarcs (spec, arcref, reextract, arcap, log1, no) + + hselect (specec, "refspec1", yes, > temp1) + fd2 = temp1 + i = fscan (fd2, arc) + fd2 = ""; delete (temp1, verify=no) + if (i < 1) { + print ("No arc reference assigned for ", spec) | tee (log1) + next + } else { + print ("Dispersion correct ", spec) | tee (log1) + dispcor (specec, "", linearize=sparams.linearize, + database=database, table=arcref//ectype, + w1=INDEF, w2=INDEF, dw=INDEF, nw=INDEF, log=sparams.log, + flux=sparams.flux, global=no, ignoreaps=no, confirm=no, + listonly=no, logfile=logfile) + hedit (specec, "dc-flag", 0, add=yes, show=no, + verify=no, update=yes) + } + } + + if (j < 2 || !access ("std")) { + print ("Compile standard star fluxes for ", spec) | tee (log1) + standard (specec, output="std", samestar=yes, beam_switch=no, + apertures="", bandwidth=sparams.bandwidth, + bandsep=sparams.bandsep, fnuzero=3.68E-20, + extinction=extinction, caldir=caldir, + observatory=observatory, interact=sparams.s_interact) + hedit (specec, "std-flag", "yes", add=yes, verify=no, + show=no, update=yes) + print (specec, >> temp2) + sproc.newsens = yes + } + } + fd1 = "" + + sections ("sens.????"//imtype, option="nolist") + if (sproc.newsens || sections.nimages == 0) { + if (!access ("std")) { + print ("No standard star data") | tee (log1) + sproc.fluxcal1 = no + } else { + imdelete ("sens.????"//imtype, verify=no) + print ("Compute sensitivity function") | tee (log1) + sensfunc ("std", "sens", apertures="", ignoreaps=no, + logfile=logfile, extinction=extinction, + newextinction="extinct.dat", observatory=observatory, + function=sparams.s_function, order=sparams.s_order, + interactive=yes, graphs="sr", marks="plus cross box") + sproc.newsens = yes + } + } + + # Note that if new standard stars are added the old standard + # stars are not recalibrated unless the redo flag is used. + + if (sproc.fluxcal1 && sproc.newsens) { + print ("Flux and/or extinction calibrate standard stars") | + tee (log1) + calibrate ("@"//temp2, "", extinct=extcor, flux=sproc.fluxcal1, + extinction=extinction, observatory=observatory, ignoreaps=no, + sensitivity="sens", fnu=sparams.fnu) | tee (log1, > log2) + if (sproc.splot1) { + print ("Standard stars:") + str1 = sproc.anssplot + if (str1 == "NO" || str1 == "YES") + sproc.splot1 = no + if (str1 == "no" || str1 == "NO") + sproc.splot2 = no + else + sproc.splot2 = yes + } + if (sproc.splot2) + splot ("@"//temp2) + sections (temp2, option="fullname", >> done) + delete (temp2, verify=no) + } +end |