

include <error.h>
include <fset.h>
include <gset.h>
include <pkg/gtools.h>
include <smw.h>
include "identify.h"
define ICFITHELP "noao$lib/scr/idicgfit.key"
# T_AUTOIDENTIFY -- Automatically identify spectral features.
procedure t_autoidentify ()
int list # List of images
int interactive # Examine identifications interactively?
int dbwrite # Write database results?
int i, fd, hdr, hdr1
pointer sp, str, aid, id
int clgeti(), clgwrd(), nscan(), open(), nowhite()
int imtopenp(), imtgetim(), id_dbcheck()
bool clgetb(), aid_autoid()
real clgetr()
pointer gopen(), gt_init(), un_open()
errchk open, id_mapll, aid_autoid, aid_init, reidentify
define done_ 10
begin
call smark (sp)
call salloc (str, SZ_LINE, TY_CHAR)
# Initialize data structures. Note the AID structure is initialized
# with CL queries to the AIDPARS pset.
aid = NULL
call aid_init (aid, "aidpars")
call id_init (id)
# Get query parameters.
list = imtopenp ("images")
call aid_sets (aid, "crval", "CL crval")
call aid_sets (aid, "cdelt", "CL cdelt")
# Get other parameters and IDENITFY set data structures.
ID_NSUM(id,1) = clgeti ("nsum")
call gargi (ID_NSUM(id,2))
if (nscan() != 2)
ID_NSUM(id,2) = ID_NSUM(id,1)
ID_NSUM(id,1) = max (1, ID_NSUM(id,1))
ID_NSUM(id,2) = max (1, ID_NSUM(id,2))
ID_MAXFEATURES(id) = clgetr ("aidpars.ntarget")
ID_MINSEP(id) = clgetr ("minsep")
ID_FTYPE(id) = clgwrd ("ftype", Memc[str], SZ_LINE, FTYPES)
ID_FWIDTH(id) = clgetr ("fwidth")
ID_CRADIUS(id) = clgetr ("cradius")
ID_THRESHOLD(id) = clgetr ("threshold")
ID_MATCH(id) = clgetr ("match")
ID_ZWIDTH(id) = clgetr ("identify.zwidth")
ID_LABELS(id) = 1
call clgstr ("database", ID_DATABASE(id), ID_LENSTRING)
dbwrite = clgwrd ("dbwrite", Memc[str], SZ_FNAME, "|no|yes|NO|YES|")
if (dbwrite == 1)
dbwrite = 3
call clgstr ("coordlist", ID_COORDLIST(id), ID_LENSTRING)
if (nowhite (ID_COORDLIST(id), ID_COORDLIST(id), ID_LENSTRING) == 0) {
call clgstr ("coordlist.p_prompt", Memc[str], SZ_LINE)
call printf (Memc[str])
call flush (STDOUT)
call clgstr ("query", ID_COORDLIST(id), ID_LENSTRING)
}
call clgstr ("units", Memc[str], SZ_LINE)
call xt_stripwhite (Memc[str])
if (Memc[str] != EOS)
ID_UN(id) = un_open (Memc[str])
call id_mapll (id)
if (ID_LL(id) == NULL)
call error (0, "Required coordinate line list not found")
# Dispersion fitting parameters.
call ic_open (ID_IC(id))
call clgstr ("function", Memc[str], SZ_LINE)
call ic_pstr (ID_IC(id), "function", Memc[str])
call ic_puti (ID_IC(id), "order", clgeti ("order"))
call clgstr ("sample", Memc[str], SZ_LINE)
call ic_pstr (ID_IC(id), "sample", Memc[str])
call ic_puti (ID_IC(id), "naverage", 1)
call ic_puti (ID_IC(id), "niterate", clgeti ("niterate"))
call ic_putr (ID_IC(id), "low", clgetr ("low_reject"))
call ic_putr (ID_IC(id), "high", clgetr ("high_reject"))
call ic_putr (ID_IC(id), "grow", clgetr ("grow"))
call ic_pstr (ID_IC(id), "xlabel", "Feature positions")
call ic_pstr (ID_IC(id), "xunits", "pixels")
call ic_pstr (ID_IC(id), "ylabel", "")
call ic_pkey (ID_IC(id), 1, 'y', 'x')
call ic_pkey (ID_IC(id), 2, 'y', 'v')
call ic_pkey (ID_IC(id), 3, 'y', 'r')
call ic_pkey (ID_IC(id), 4, 'y', 'd')
call ic_pkey (ID_IC(id), 5, 'y', 'n')
call ic_puti (ID_IC(id), "key", 5)
call ic_pstr (ID_IC(id), "help", ICFITHELP)
# Interactive, graphics, and output parameters.
interactive = clgwrd ("interactive", Memc[str], SZ_FNAME,
"|no|yes|NO|YES|")
switch (interactive) {
case 1, 3:
ID_GP(id) = NULL
interactive = 3
case 2, 4:
# Open graphics
call clgstr ("graphics", Memc[str], SZ_LINE)
ID_GP(id) = gopen (Memc[str], NEW_FILE+AW_DEFER, STDGRAPH)
}
ID_GT(id) = gt_init()
call gt_sets (ID_GT(id), GTTYPE, "line")
call fseti (STDOUT, F_FLUSHNL, YES)
hdr = YES
hdr1 = YES
# Log and plot files.
call calloc (ID_LOGFILES(id), 4, TY_INT)
if (clgetb ("verbose"))
Memi[ID_LOGFILES(id)] = STDOUT
call clgstr ("logfile", Memc[str], SZ_LINE)
if (nowhite (Memc[str], Memc[str], SZ_FNAME) > 0) {
fd = open (Memc[str], APPEND, TEXT_FILE)
Memi[ID_LOGFILES(id)+1] = fd
}
call clgstr ("plotfile", Memc[str], SZ_LINE)
if (nowhite (Memc[str], Memc[str], SZ_FNAME) > 0) {
fd = open (Memc[str], APPEND, BINARY_FILE)
Memi[ID_LOGFILES(id)+2] = fd
}
# Expand the image template and identify features.
while (imtgetim (list, ID_IMAGE(id), ID_LENSTRING) != EOF) {
# Initialize.
iferr (call id_map(id)) {
call erract (EA_WARN)
next
}
if (!clgetb ("overwrite")) {
if (id_dbcheck (id, ID_IMAGE(id), ID_AP(id,1)) == YES) {
if (Memi[ID_LOGFILES(id)] != NULL) {
if (ID_GP(id) != NULL)
call gdeactivate (ID_GP(id), 0)
call fprintf (Memi[ID_LOGFILES(id)],
" %s%s%24t Database entry already exists\n")
call pargstr (ID_IMAGE(id))
call pargstr (ID_SECTION(id))
}
goto done_
}
}
call id_gdata(id)
call id_fitdata(id)
call ic_putr (ID_IC(id), "xmin", real (PIXDATA(id,1)))
call ic_putr (ID_IC(id), "xmax", real (PIXDATA(id,ID_NPTS(id))))
call dcvfree (ID_CV(id))
ID_SHIFT(id) = 0.
ID_NFEATURES(id) = 0
# Automatically identify the features.
if (aid_autoid (id, aid))
ID_NEWDBENTRY(id) = YES
else if (Memi[ID_LOGFILES(id)] == NULL)
call aid_log (id, STDOUT, NO)
call aid_log (id, Memi[ID_LOGFILES(id)], hdr)
call aid_log (id, Memi[ID_LOGFILES(id)+1], hdr1)
# Enter interactive identification mode if desired.
if (interactive != 3) {
if (interactive != 4) {
repeat {
call clgstr ("interactive.p_prompt", Memc[str],
SZ_FNAME)
call printf ("%s%s: %s")
call pargstr (ID_IMAGE(id))
call pargstr (ID_SECTION(id))
call pargstr (Memc[str])
call flush (STDOUT)
if (interactive == 1)
call clpstr ("query", "no")
else
call clpstr ("query", "yes")
ifnoerr (interactive = clgwrd ("query", Memc[str],
SZ_FNAME, "|no|yes|NO|YES|"))
break
}
}
if (interactive == 2 || interactive == 4) {
call reidentify (id)
call gdeactivate (ID_GP(id), 0)
}
}
# Write results to the database.
if (ID_NEWDBENTRY(id) == YES) {
if (dbwrite == 1 || dbwrite == 2) {
repeat {
call clgstr ("dbwrite.p_prompt", Memc[str], SZ_FNAME)
call printf ("%s%s: %s")
call pargstr (ID_IMAGE(id))
call pargstr (ID_SECTION(id))
call pargstr (Memc[str])
call flush (STDOUT)
if (dbwrite == 1)
call clpstr ("query", "no")
else
call clpstr ("query", "yes")
ifnoerr (dbwrite = clgwrd ("query", Memc[str],
SZ_FNAME, "|no|yes|NO|YES|"))
break
}
}
if (dbwrite == 2 || dbwrite == 4)
call id_dbwrite (id, ID_IMAGE(id), ID_AP(id,1), NO)
}
done_ # Close the database, image, and spectrum data structures.
if (ID_DT(id) != NULL)
call dtunmap (ID_DT(id))
call smw_close (MW(ID_SH(id)))
call imunmap (IM(ID_SH(id)))
call shdr_close (ID_SH(id))
}
# Finish up.
do i = 1, 3 {
fd = Memi[ID_LOGFILES(id)+i-1]
if (fd != NULL)
call close (fd)
}
call mfree (ID_LOGFILES(id), TY_INT)
if (ID_GP(id) != NULL)
call gclose (ID_GP(id))
call smw_daxis (NULL, NULL, 0, 0, 0)
call imtclose (list)
if (aid != NULL)
call aid_free (aid)
call id_free (id)
call sfree (sp)
end
Source Code · Search Form · STSDAS
Maintained by the Science Software Group at STScI
This file last updated on 12 Mar 1997