aboutsummaryrefslogtreecommitdiff
path: root/noao/imred/dtoi/dematch.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/imred/dtoi/dematch.x')
-rw-r--r--noao/imred/dtoi/dematch.x160
1 files changed, 160 insertions, 0 deletions
diff --git a/noao/imred/dtoi/dematch.x b/noao/imred/dtoi/dematch.x
new file mode 100644
index 00000000..ff47e90f
--- /dev/null
+++ b/noao/imred/dtoi/dematch.x
@@ -0,0 +1,160 @@
+include <error.h>
+
+# T_DEMATCH -- matches densities listed in the input database to
+# log exposure values retrieved from a system maintained or user
+# provided file. The output matches are added to the input database.
+
+procedure t_dematch ()
+
+pointer filter, emulsion, wedge_db, density_db, db, exp, den, sp
+pointer wedge, expo
+int nskip, rec, nvalues
+
+pointer ddb_map()
+bool clgetb()
+int ddb_locate(), ddb_geti(), clgeti()
+
+begin
+ call smark (sp)
+ call salloc (filter, SZ_FNAME, TY_CHAR)
+ call salloc (emulsion, SZ_FNAME, TY_CHAR)
+ call salloc (wedge_db, SZ_FNAME, TY_CHAR)
+ call salloc (density_db, SZ_FNAME, TY_CHAR)
+ call salloc (wedge, SZ_FNAME, TY_CHAR)
+
+ # Get parameters
+ call clgstr ("database", Memc[density_db], SZ_FNAME)
+ call clgstr ("wedge", Memc[wedge], SZ_FNAME)
+ call clgstr ("filter", Memc[filter], SZ_FNAME)
+ call clgstr ("emulsion", Memc[emulsion], SZ_FNAME)
+ call clgstr ("wedgefile", Memc[wedge_db], SZ_FNAME)
+ nskip = clgeti ("nskip")
+
+ # Retrieve exposure information; one wedge per run
+ call hd_rwedge (Memc[wedge_db], exp, Memc[wedge], Memc[filter],
+ Memc[emulsion], clgetb("verbose"))
+
+ db = ddb_map (Memc[density_db], READ_ONLY)
+ iferr {
+ rec = ddb_locate (db, "density")
+ nvalues = ddb_geti (db, rec, "den_val")
+ } then
+ call error (0, "Error locating density record in database")
+
+ call salloc (den, nvalues, TY_REAL)
+ iferr (call ddb_gar (db, rec, "den_val", Memr[den], nvalues, nvalues))
+ call error (0, "Error reading density information")
+
+ # Close db file before reopening for append.
+ call ddb_unmap (db)
+
+ # Add fields for wedge, filter and plate as "calibrate" record
+ db = ddb_map (Memc[density_db], APPEND)
+ call ddb_prec (db, "calibrate")
+ call ddb_pstr (db, "wedge", Memc[wedge])
+ call ddb_pstr (db, "filter", Memc[filter])
+ call ddb_pstr (db, "emulsion", Memc[emulsion])
+
+ # Exposures are returned in increasing order. Make sure the
+ # exposures are output in the same order as density values.
+
+ call salloc (expo, nvalues, TY_REAL)
+ call amovr (Memr[exp+nskip], Memr[expo], nvalues)
+
+ if (Memr[den] > Memr[den+nvalues-1])
+ call hd_reorderr (Memr[expo], nvalues)
+
+ # Now add exposure values to database
+ call ddb_ptime (db)
+ call ddb_prec (db, "exposure")
+ call ddb_par (db, "log_exp", Memr[expo], nvalues)
+
+ call ddb_unmap (db)
+
+ call mfree (exp, TY_REAL)
+ call sfree (sp)
+end
+
+
+# HD_RWEDGE -- Read wedge information from database file for a given
+# wedge, filter, emulsion combination. A pointer to the extracted
+# exposure values is returned as an argument.
+
+procedure hd_rwedge (db_file, exp, wedge, filter, emulsion, verbose)
+
+char db_file[SZ_FNAME] # Name of database with exposure information
+pointer exp # Pointer to array of exposure values - output
+char wedge[SZ_FNAME] # Wedge number
+char filter[SZ_FNAME] # Filter used
+char emulsion[SZ_FNAME] # Emulsion used
+bool verbose # Print record of exposure information?
+
+pointer db
+char wfe[SZ_FNAME]
+int rec, nvalues, stat, i
+
+pointer ddb_map()
+int ddb_locate(), ddb_geti(), ddb_scan()
+errchk ddb_map, ddb_scan
+
+begin
+ # Convert strings to upper case for matching in database
+ call strupr (wedge)
+ call strupr (filter)
+ call strupr (emulsion)
+
+ db = ddb_map (db_file, READ_ONLY)
+ iferr (rec = ddb_locate (db, wedge))
+ call erract (EA_FATAL)
+
+ # Construct field name of filter/emulsion combination in question
+ call sprintf (wfe, SZ_FNAME, "%s/%s")
+ call pargstr (emulsion)
+ call pargstr (filter)
+
+ # Retrieve exposure values from database file
+ iferr (nvalues = ddb_geti (db, rec, wfe))
+ call erract (EA_FATAL)
+
+ call malloc (exp, nvalues, TY_REAL)
+ stat = ddb_scan (db)
+
+ do i = 1, nvalues {
+ call gargr (Memr[exp+i-1])
+
+ # Calibration values are stored 8 values per line
+ if (mod (i, 8) == 0) {
+ if (nvalues > i)
+ stat = ddb_scan (db)
+ }
+ }
+
+ if (verbose) {
+ call printf ("\nCalibration log exposure values for %s/%s: \n")
+ call pargstr (wedge)
+ call pargstr (wfe)
+
+ do i = 1, nvalues {
+ call printf ("%8g ")
+ call pargr (Memr[exp+i-1])
+ if (mod (i, 8) == 0)
+ call printf ("\n")
+ }
+
+ # Need a newline if the last line didn't have 8 entries.
+ if (mod (nvalues, 8) != 0)
+ call printf ("\n")
+
+ call flush (STDOUT)
+ }
+
+ # Exposures are returned sorted in increasing order. That is,
+ # the exposure for the lightest spot is element one, and the
+ # darkest spot's exposure value is the last array element.
+
+ if (Memr[exp] > Memr[exp+nvalues-1])
+ # Out of order - flip elements
+ call hd_reorderr (Memr[exp], nvalues)
+
+ call ddb_unmap (db)
+end