STScI Logo

dematch



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

Source Code · Search Form · STSDAS