aboutsummaryrefslogtreecommitdiff
path: root/noao/imred/src/doecslit/sfluxcal.cl
diff options
context:
space:
mode:
Diffstat (limited to 'noao/imred/src/doecslit/sfluxcal.cl')
-rw-r--r--noao/imred/src/doecslit/sfluxcal.cl214
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