aboutsummaryrefslogtreecommitdiff
path: root/noao/imred/dtoi/hdshift.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/imred/dtoi/hdshift.x')
-rw-r--r--noao/imred/dtoi/hdshift.x184
1 files changed, 184 insertions, 0 deletions
diff --git a/noao/imred/dtoi/hdshift.x b/noao/imred/dtoi/hdshift.x
new file mode 100644
index 00000000..cde846ad
--- /dev/null
+++ b/noao/imred/dtoi/hdshift.x
@@ -0,0 +1,184 @@
+include <math/curfit.h>
+
+# T_HDSHIFT -- Task hdshift in the dtoi package. This task is provided
+# to support Kormendy's method of combining related characteristic curves.
+# A zero point shift in log exp unique to each set of spots is calculated and
+# subtracted. A single curve is fit to the combined, shifted data in
+# a separate task (hdfit).
+
+procedure t_hdshift ()
+
+pointer sp, de, fun, save, db, cv, ps_coeff, den, exp, cvf
+int fd, rec, nsave, ncoeff, nvalues, i, nfile, junk
+real a0, ref_a0
+
+pointer ddb_map()
+int clpopni(), ddb_locate(), ddb_geti(), cvstati(), strncmp(), clgfil()
+
+begin
+ # Allocate space on stack for string buffers
+ call smark (sp)
+ call salloc (de, SZ_FNAME, TY_CHAR)
+ call salloc (cvf, SZ_FNAME, TY_CHAR)
+ call salloc (fun, SZ_FNAME, TY_CHAR)
+
+ # Get list of the database names. The curfit information is retrieved
+ # from the first file in the list, the list is then rewound.
+
+ fd = clpopni ("database")
+ junk = clgfil (fd, Memc[cvf], SZ_FNAME)
+ call clprew (fd)
+
+ # Get coefficients of common fit from cv_file
+ db = ddb_map (Memc[cvf], READ_ONLY)
+ rec = ddb_locate (db, "cv")
+ nsave = ddb_geti (db, rec, "save")
+ call salloc (save, nsave, TY_REAL)
+ call ddb_gar (db, rec, "save", Memr[save], nsave, nsave)
+ call ddb_gstr (db, rec, "function", Memc[fun], SZ_LINE)
+
+ call cvrestore (cv, Memr[save])
+ ncoeff = cvstati (cv, CVNCOEFF)
+ call salloc (ps_coeff, ncoeff, TY_REAL)
+
+ if (strncmp (Memc[fun], "power", 5) == 0)
+ call cvcoeff (cv, Memr[ps_coeff], ncoeff)
+ else
+ call cvpower (cv, Memr[ps_coeff], ncoeff)
+
+ do i = 1, ncoeff {
+ call eprintf ("%d %.7g\n")
+ call pargi (i)
+ call pargr (Memr[ps_coeff+i-1])
+ }
+
+ call ddb_unmap (db)
+
+ nfile = 0
+ while (clgfil (fd, Memc[de], SZ_FNAME) != EOF) {
+ db = ddb_map (Memc[de], READ_ONLY)
+ call hds_read (db, den, exp, nvalues)
+ call hds_calc (den, exp, nvalues, Memr[ps_coeff], ncoeff, a0)
+ nfile = nfile + 1
+ if (nfile == 1)
+ ref_a0 = a0
+ a0 = a0 - ref_a0
+
+ call printf ("file %s: subtracting zero point a0 = %.7g\n")
+ call pargstr (Memc[de])
+ call pargr (a0)
+
+ # Write new log exposure information to database
+ db = ddb_map (Memc[de], APPEND)
+ call hds_wdb (db, exp, nvalues, a0)
+ call mfree (den, TY_REAL)
+ call mfree (exp, TY_REAL)
+ call ddb_unmap (db)
+ }
+
+ call clpcls (fd)
+ call sfree (sp)
+end
+
+
+# HDS_READ -- Read the density and exposure values from the database file.
+# The density above fog and log exposure values are returned, as well as
+# the number of data pairs read.
+
+procedure hds_read (db, den, exp, nvalues)
+
+pointer db # Pointer to input database file
+pointer den # Pointer to density array - returned
+pointer exp # Pointer to exposure array - returned
+int nvalues # Number of data pairs read - returned
+
+real fog
+int nden, nexp, rec
+int ddb_locate(), ddb_geti()
+real ddb_getr()
+
+begin
+ # Get fog value to be subtracted from density
+ rec = ddb_locate (db, "fog")
+ fog = ddb_getr (db, rec, "density")
+
+ # Get density array
+ rec = ddb_locate (db, "density")
+ nden = ddb_geti (db, rec, "den_val")
+ call malloc (den, nden, TY_REAL)
+ call ddb_gar (db, rec, "den_val", Memr[den], nden, nden)
+ call asubkr (Memr[den], fog, Memr[den], nden)
+
+ # Get exposure array
+ rec = ddb_locate (db, "exposure")
+ nexp = ddb_geti (db, rec, "log_exp")
+ call malloc (exp, nexp, TY_REAL)
+ call ddb_gar (db, rec, "log_exp", Memr[exp], nexp, nexp)
+
+ nvalues = min (nden, nexp)
+end
+
+
+# HDS_CALC -- Calculate the individual shift, a0.
+
+procedure hds_calc (den, exp, nvalues, ps_coeff, ncoeff, a0)
+
+pointer den
+pointer exp
+int nvalues
+real ps_coeff[ARB]
+int ncoeff
+real a0
+
+int i
+real yavg, ycalc, xavg
+
+begin
+ # Calculate average density and log exposure values
+ xavg = 0.0
+ yavg = 0.0
+
+ do i = 1, nvalues {
+ xavg = xavg + Memr[den+i-1]
+ yavg = yavg + Memr[exp+i-1]
+ }
+
+ xavg = xavg / real (nvalues)
+ yavg = yavg / real (nvalues)
+
+ ycalc = 0.0
+ do i = 2, ncoeff
+ ycalc = ycalc + ps_coeff[i] * (xavg ** real (i-1))
+
+ # Subtraction yields the zero point shift in question
+ a0 = yavg - ycalc
+end
+
+
+# HDS_WDB -- Write shifted log exposure values to database.
+
+procedure hds_wdb (db, exp, nvalues, a0)
+
+pointer db # Pointer to database
+pointer exp # Pointer to array of exposure values
+int nvalues # Number of exposure values in sample
+real a0 # Shift to be subtracted
+
+pointer sp, expsub
+
+begin
+ call smark (sp)
+ call salloc (expsub, nvalues, TY_REAL)
+
+ call ddb_ptime (db)
+ call ddb_prec (db, "exposure")
+
+ call eprintf ("a0 = %g\n")
+ call pargr (a0)
+
+ call asubkr (Memr[exp], a0, Memr[expsub], nvalues)
+ call ddb_par (db, "log_exp", Memr[expsub], nvalues)
+
+ call ddb_putr (db, "A0 shift", a0)
+ call sfree (sp)
+end