aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/photcal/evaluate/phcheck.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/digiphot/photcal/evaluate/phcheck.x')
-rw-r--r--noao/digiphot/photcal/evaluate/phcheck.x240
1 files changed, 240 insertions, 0 deletions
diff --git a/noao/digiphot/photcal/evaluate/phcheck.x b/noao/digiphot/photcal/evaluate/phcheck.x
new file mode 100644
index 00000000..2f729930
--- /dev/null
+++ b/noao/digiphot/photcal/evaluate/phcheck.x
@@ -0,0 +1,240 @@
+include "../lib/parser.h"
+include "../lib/preval.h"
+
+# PH_SETEQN -- Determine whether a PHOTCAL expression includes any set
+# equations which contain references to catalog variables. Return a YES
+# or NO status.
+
+int procedure ph_seteqn (code)
+
+pointer code # the photcal equation code
+
+int ip, ins
+pointer setcode
+int pr_geti(), pr_gsym(), ph_cateqn()
+pointer pr_gsymp()
+
+begin
+ # Return NO if there are no defined set equations.
+ if (pr_geti (NSETEQS) <= 0)
+ return (NO)
+
+ # Initialize.
+ ip = 0
+ ins = Memi[code+ip]
+
+ # Loop over the equation parsing instructions.
+ while (ins != PEV_EOC) {
+
+ switch (ins) {
+ case PEV_SETEQ:
+ ip = ip + 1
+ setcode = pr_gsymp (pr_gsym (Memi[code+ip], PTY_SETEQ),
+ PSEQRPNEQ)
+ if (ph_cateqn (setcode) == YES)
+ return (YES)
+ case PEV_NUMBER, PEV_CATVAR, PEV_OBSVAR, PEV_PARAM:
+ ip = ip + 1
+ case PEV_EXTEQ, PEV_TRNEQ:
+ ip = ip + 1
+ default:
+ # do nothing
+ }
+
+ ip = ip + 1
+ ins = Memi[code+ip]
+ }
+
+ return (NO)
+end
+
+
+# PH_CATEQN -- Given a PHOTCAL set equation determine whether there are any
+# references in it to catalog variables. Return a YES or NO status.
+
+int procedure ph_cateqn (code)
+
+pointer code # pointer to the equation code
+
+int ip, ins
+int pr_geti()
+
+begin
+ # Return NO if there are no catalog variables.
+ if (pr_geti (NCATVARS) <= 0)
+ return (NO)
+
+ # Initialize.
+ ip = 0
+ ins = Memi[code+ip]
+
+ # Loop over the equation parsing instructions.
+ while (ins != PEV_EOC) {
+
+ switch (ins) {
+ case PEV_CATVAR:
+ return (YES)
+ case PEV_NUMBER, PEV_OBSVAR, PEV_PARAM:
+ ip = ip + 1
+ case PEV_SETEQ, PEV_EXTEQ, PEV_TRNEQ:
+ ip = ip + 1
+ default:
+ # do nothing
+ }
+
+ ip = ip + 1
+ ins = Memi[code+ip]
+ }
+
+ return (NO)
+end
+
+
+# PH_SETVAR -- Check to see whether the fit expression portion of a PHOTCAL
+# transformation equation contains references to set equations which include
+# previously unreferenced catalog variables. Return the number of previously
+# unreferenced set equations.
+
+int procedure ph_setvar (eqn, sym, cmap, omap, tuservars, uservars, usererrs,
+ nstdvars, nobsvars, eqset, maxnset, userset, nset)
+
+int eqn # the equation number
+pointer sym # pointer to the equation symbol
+pointer cmap # pointer to catalog variable column map
+pointer omap # pointer to observations variable column map
+int tuservars[nstdvars,ARB] # list of active catalog variables per equation
+int uservars[ARB] # list of active catalog variables
+int usererrs[ARB] # list of active observational error columns
+int nstdvars # total number of catalog variables
+int nobsvars # total number of observations variables
+int eqset[maxnset,ARB] # set equation table
+int maxnset # maximum number of set equations
+int userset[ARB] # the list of active set equations
+int nset # number of set equations
+
+bool new
+int i, ip, ins, nvar
+pointer fitcode, setsym
+int pr_gsym(), ph_catvar()
+pointer pr_gsymp()
+
+begin
+ # Get the fit expression symbols.
+ fitcode = pr_gsymp (sym, PTEQRPNFIT)
+
+ # Initialize.
+ nvar = 0
+ ip = 0
+ ins = Memi[fitcode+ip]
+
+ # Loop over the fit expression.
+ while (ins != PEV_EOC) {
+
+ switch (ins) {
+ case PEV_SETEQ:
+ ip = ip + 1
+ setsym = pr_gsym (Memi[fitcode+ip], PTY_SETEQ)
+ if (ph_catvar (eqn, setsym, cmap, omap, tuservars, uservars,
+ usererrs, nstdvars, nobsvars) == YES) {
+ new = true
+ do i = 1, nset + nvar {
+ if (setsym != userset[i])
+ next
+ eqset[i,eqn] = setsym
+ new = false
+ break
+ }
+ if (new) {
+ nvar = nvar + 1
+ eqset[nset+nvar,eqn] = setsym
+ userset[nset+nvar] = setsym
+ }
+ }
+ case PEV_NUMBER, PEV_CATVAR, PEV_OBSVAR, PEV_PARAM:
+ ip = ip + 1
+ case PEV_EXTEQ, PEV_TRNEQ:
+ ip = ip + 1
+ default:
+ # do nothing
+ }
+
+ ip = ip + 1
+ ins = Memi[fitcode+ip]
+ }
+
+ return (nvar)
+end
+
+
+# PH_CATVAR -- Determine whether any catalog variables in the set
+# equation have not been previously referenced in the transformation
+# equations.
+
+int procedure ph_catvar (eqn, setsym, cmap, omap, tuservars, uservars,
+ usererrs, nstdvars, nobsvars)
+
+int eqn # the transformation equation number
+int setsym # the set equation symbol
+pointer cmap # pointer to catalog variable column map
+pointer omap # pointer to observations variable column map
+int tuservars[nstdvars,ARB] # active variables as a function of eqn
+int uservars[ARB] # currently active catalog variables
+int usererrs[ARB] # currently active observations varaiables errs
+int nstdvars # the total number of catalog variables
+int nobsvars # the total number of observations variables
+
+int setcode, ip, ins, stat, vcol, ecol
+pointer catsym, obsym
+int pr_gsym(), pr_gsymi(), pr_findmap1()
+pointer pr_gsymp()
+
+begin
+ # Get the set equation code.
+ setcode = pr_gsymp (setsym, PSEQRPNEQ)
+
+ # Initialize.
+ ip = 0
+ ins = Memi[setcode+ip]
+ stat = NO
+
+ while (ins != PEV_EOC) {
+
+ switch (ins) {
+ case PEV_CATVAR:
+ ip = ip + 1
+ catsym = pr_gsym (Memi[setcode+ip] - nobsvars, PTY_CATVAR)
+ vcol = pr_gsymi (catsym, PINPCOL)
+ vcol = pr_findmap1 (cmap, vcol)
+ if (uservars[vcol] <= 0) {
+ tuservars[vcol,eqn] = -(vcol + nobsvars)
+ uservars[vcol] = -(vcol + nobsvars)
+ stat = YES
+ }
+
+ case PEV_OBSVAR:
+ ip = ip + 1
+ obsym = pr_gsym (Memi[setcode+ip], PTY_OBSVAR)
+ vcol = pr_gsymi (obsym, PINPCOL)
+ ecol = pr_gsymi (obsym, PINPERRCOL)
+ vcol = pr_findmap1 (omap, vcol)
+ if (! IS_INDEFI(ecol))
+ ecol = pr_findmap1 (omap, ecol)
+ if (! IS_INDEFI(ecol))
+ usererrs[vcol] = ecol
+
+ case PEV_NUMBER, PEV_PARAM:
+ ip = ip + 1
+
+ case PEV_SETEQ, PEV_EXTEQ, PEV_TRNEQ:
+ ip = ip + 1
+
+ default:
+ # do nothing
+ }
+
+ ip = ip + 1
+ ins = Memi[setcode+ip]
+ }
+
+ return (stat)
+end