aboutsummaryrefslogtreecommitdiff
path: root/noao/nproto/ace/t_acedetect.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/nproto/ace/t_acedetect.x')
-rw-r--r--noao/nproto/ace/t_acedetect.x1195
1 files changed, 1195 insertions, 0 deletions
diff --git a/noao/nproto/ace/t_acedetect.x b/noao/nproto/ace/t_acedetect.x
new file mode 100644
index 00000000..8c211cef
--- /dev/null
+++ b/noao/nproto/ace/t_acedetect.x
@@ -0,0 +1,1195 @@
+include <error.h>
+include <fset.h>
+include <imset.h>
+include <pmset.h>
+include <imhdr.h>
+include "ace.h"
+include "acedetect.h"
+include "cat.h"
+
+
+# T_ACEDETECT -- Detect objects in images.
+# This entry procedure simply sets up the parameters.
+
+procedure t_acedetect ()
+
+pointer par # Parameters
+
+pointer sp, str
+
+bool clgetb()
+int clgwrd(), imtopenp(), imtopen(), clpopnu(), fntopnb()
+
+begin
+ call smark (sp)
+ call salloc (par, PAR_LEN, TY_STRUCT)
+ call salloc (str, SZ_LINE, TY_CHAR)
+ call aclri (Memi[par], PAR_LEN)
+
+ # Get list parameters.
+ PAR_IMLIST(par,1) = imtopenp ("images")
+ PAR_BPMLIST(par,1) = imtopenp ("masks")
+ PAR_SKYLIST(par,1) = imtopenp ("skys")
+ PAR_SIGLIST(par,1) = imtopenp ("sigmas")
+ PAR_EXPLIST(par,1) = imtopenp ("exps")
+ PAR_GAINLIST(par,1) = imtopenp ("gains")
+ PAR_SCALELIST(par,1) = fntopnb ("", NO)
+
+ PAR_IMLIST(par,2) = imtopen ("")
+ PAR_BPMLIST(par,2) = imtopen ("")
+ PAR_SKYLIST(par,2) = imtopen ("")
+ PAR_SIGLIST(par,2) = imtopen ("")
+ PAR_EXPLIST(par,2) = imtopen ("")
+ PAR_GAINLIST(par,2) = imtopen ("")
+ PAR_SCALELIST(par,2) = fntopnb ("", NO)
+
+ PAR_OMLIST(par) = imtopenp ("objmasks")
+ PAR_OMTYPE(par) = clgwrd ("omtype", Memc[str], SZ_LINE, OM_TYPES)
+ PAR_INCATLIST(par) = imtopen ("")
+ PAR_OUTCATLIST(par) = imtopenp ("catalogs")
+ PAR_CATDEFLIST(par) = clpopnu ("catdefs")
+ PAR_LOGLIST(par) = clpopnu ("logfiles")
+
+ PAR_OUTSKYLIST(par) = imtopen ("")
+ PAR_OUTSIGLIST(par) = imtopen ("")
+
+ call clgstr ("extnames", PAR_EXTNAMES(par), PAR_SZSTR)
+
+ # Get other parameters.
+ # The parameter structures flag whether an operation is requested.
+ #if (clgetb ("dosky"))
+ call sky_pars ("open", "", PAR_SKY(par))
+ if (clgetb ("dodetect"))
+ call det_pars ("open", "", PAR_DET(par))
+ if (clgetb ("dosplit"))
+ call spt_pars ("open", "", PAR_SPT(par))
+ if (clgetb ("dogrow"))
+ call grw_pars ("open", "", PAR_GRW(par))
+ if (clgetb ("doevaluate"))
+ call evl_pars ("open", "", PAR_EVL(par))
+
+ # Do the detection.
+ call aceall (par)
+
+ # Finish up.
+ call sky_pars ("close", "", PAR_SKY(par))
+ call det_pars ("close", "", PAR_DET(par))
+ call spt_pars ("close", "", PAR_SPT(par))
+ call grw_pars ("close", "", PAR_GRW(par))
+ call evl_pars ("close", "", PAR_EVL(par))
+
+ call imtclose (PAR_OUTSIGLIST(par))
+ call imtclose (PAR_OUTSKYLIST(par))
+
+ call clpcls (PAR_LOGLIST(par))
+ call imtclose (PAR_OMLIST(par))
+ call clpcls (PAR_CATDEFLIST(par))
+ call imtclose (PAR_OUTCATLIST(par))
+ call imtclose (PAR_INCATLIST(par))
+
+ call clpcls (PAR_SCALELIST(par,2))
+ call imtclose (PAR_GAINLIST(par,2))
+ call imtclose (PAR_EXPLIST(par,2))
+ call imtclose (PAR_SIGLIST(par,2))
+ call imtclose (PAR_SKYLIST(par,2))
+ call imtclose (PAR_BPMLIST(par,2))
+ call imtclose (PAR_IMLIST(par,2))
+
+ call clpcls (PAR_SCALELIST(par,1))
+ call imtclose (PAR_GAINLIST(par,1))
+ call imtclose (PAR_EXPLIST(par,1))
+ call imtclose (PAR_SIGLIST(par,1))
+ call imtclose (PAR_SKYLIST(par,1))
+ call imtclose (PAR_BPMLIST(par,1))
+ call imtclose (PAR_IMLIST(par,1))
+
+ call sfree (sp)
+end
+
+
+# T_ACEEVALUATE -- Evaluate objects.
+# This entry procedure simply sets up the parameters.
+
+procedure t_aceevaluate ()
+
+pointer par # Parameters
+
+pointer sp, str
+
+int imtopenp(), imtopen(), clpopnu(), fntopnb()
+
+begin
+ call smark (sp)
+ call salloc (par, PAR_LEN, TY_STRUCT)
+ call salloc (str, SZ_LINE, TY_CHAR)
+ call aclri (Memi[par], PAR_LEN)
+
+ # Get list parameters.
+ PAR_IMLIST(par,1) = imtopenp ("images")
+ PAR_BPMLIST(par,1) = imtopen ("")
+ PAR_SKYLIST(par,1) = imtopenp ("skys")
+ PAR_SIGLIST(par,1) = imtopenp ("sigmas")
+ PAR_EXPLIST(par,1) = imtopenp ("exps")
+ PAR_GAINLIST(par,1) = imtopenp ("gains")
+ PAR_SCALELIST(par,1) = fntopnb ("", NO)
+
+ PAR_IMLIST(par,2) = imtopen ("")
+ PAR_BPMLIST(par,2) = imtopen ("")
+ PAR_SKYLIST(par,2) = imtopen ("")
+ PAR_SIGLIST(par,2) = imtopen ("")
+ PAR_EXPLIST(par,2) = imtopen ("")
+ PAR_GAINLIST(par,2) = imtopen ("")
+ PAR_SCALELIST(par,2) = fntopnb ("", NO)
+
+ PAR_OMLIST(par) = imtopenp ("objmasks")
+ PAR_OMTYPE(par) = OM_ALL
+ PAR_INCATLIST(par) = imtopenp ("incatalogs")
+ PAR_OUTCATLIST(par) = imtopenp ("outcatalogs")
+ PAR_CATDEFLIST(par) = clpopnu ("catdefs")
+ PAR_LOGLIST(par) = clpopnu ("logfiles")
+
+ PAR_OUTSKYLIST(par) = imtopen ("")
+ PAR_OUTSIGLIST(par) = imtopen ("")
+
+ # Get other parameters.
+ # The parameter structures flag whether an operation is requested.
+ call sky_pars ("open", "", PAR_SKY(par))
+ call evl_pars ("open", "", PAR_EVL(par))
+
+ # Do the detection.
+ call aceall (par)
+
+ # Finish up.
+ call sky_pars ("close", "", PAR_SKY(par))
+ call det_pars ("close", "", PAR_DET(par))
+ call spt_pars ("close", "", PAR_SPT(par))
+ call grw_pars ("close", "", PAR_GRW(par))
+ call evl_pars ("close", "", PAR_EVL(par))
+
+ call imtclose (PAR_OUTSIGLIST(par))
+ call imtclose (PAR_OUTSKYLIST(par))
+
+ call clpcls (PAR_LOGLIST(par))
+ call imtclose (PAR_OMLIST(par))
+ call clpcls (PAR_CATDEFLIST(par))
+ call imtclose (PAR_INCATLIST(par))
+ call imtclose (PAR_OUTCATLIST(par))
+
+ call clpcls (PAR_SCALELIST(par,2))
+ call imtclose (PAR_GAINLIST(par,2))
+ call imtclose (PAR_EXPLIST(par,2))
+ call imtclose (PAR_SIGLIST(par,2))
+ call imtclose (PAR_SKYLIST(par,2))
+ call imtclose (PAR_BPMLIST(par,2))
+ call imtclose (PAR_IMLIST(par,2))
+
+ call clpcls (PAR_SCALELIST(par,1))
+ call imtclose (PAR_GAINLIST(par,1))
+ call imtclose (PAR_EXPLIST(par,1))
+ call imtclose (PAR_SIGLIST(par,1))
+ call imtclose (PAR_SKYLIST(par,1))
+ call imtclose (PAR_BPMLIST(par,1))
+ call imtclose (PAR_IMLIST(par,1))
+
+ call sfree (sp)
+end
+
+
+# T_ACESKY -- Output sky images.
+# This entry procedure simply sets up the parameters.
+
+procedure t_acesky ()
+
+pointer par # Parameters
+
+pointer sp, str
+
+int imtopenp(), imtopen(), clpopnu(), fntopnb()
+
+begin
+ call smark (sp)
+ call salloc (par, PAR_LEN, TY_STRUCT)
+ call salloc (str, SZ_LINE, TY_CHAR)
+ call aclri (Memi[par], PAR_LEN)
+
+ # Get list parameters.
+ PAR_IMLIST(par,1) = imtopenp ("images")
+ PAR_OUTSKYLIST(par) = imtopenp ("skyimages")
+ PAR_OUTSIGLIST(par) = imtopenp ("sigmaimages")
+ PAR_BPMLIST(par,1) = imtopen ("")
+ PAR_SKYLIST(par,1) = imtopenp ("skys")
+ PAR_SIGLIST(par,1) = imtopenp ("sigmas")
+ PAR_EXPLIST(par,1) = imtopenp ("exps")
+ PAR_GAINLIST(par,1) = imtopenp ("gains")
+ PAR_SCALELIST(par,1) = fntopnb ("", NO)
+
+ PAR_IMLIST(par,2) = imtopen ("")
+ PAR_BPMLIST(par,2) = imtopen ("")
+ PAR_SKYLIST(par,2) = imtopen ("")
+ PAR_SIGLIST(par,2) = imtopen ("")
+ PAR_EXPLIST(par,2) = imtopen ("")
+ PAR_GAINLIST(par,2) = imtopen ("")
+ PAR_SCALELIST(par,2) = fntopnb ("", NO)
+
+ PAR_OMLIST(par) = imtopen ("")
+ PAR_OMTYPE(par) = OM_ALL
+ PAR_INCATLIST(par) = imtopen ("")
+ PAR_OUTCATLIST(par) = imtopen ("")
+ PAR_CATDEFLIST(par) = fntopnb ("", NO)
+ PAR_LOGLIST(par) = clpopnu ("logfiles")
+
+ # Do the detection.
+ call aceall (par)
+
+ # Finish up.
+ call sky_pars ("close", "", PAR_SKY(par))
+ call det_pars ("close", "", PAR_DET(par))
+ call spt_pars ("close", "", PAR_SPT(par))
+ call grw_pars ("close", "", PAR_GRW(par))
+ call evl_pars ("close", "", PAR_EVL(par))
+
+ call imtclose (PAR_OUTSIGLIST(par))
+ call imtclose (PAR_OUTSKYLIST(par))
+
+ call clpcls (PAR_LOGLIST(par))
+ call imtclose (PAR_OMLIST(par))
+ call clpcls (PAR_CATDEFLIST(par))
+ call imtclose (PAR_INCATLIST(par))
+ call imtclose (PAR_OUTCATLIST(par))
+
+ call clpcls (PAR_SCALELIST(par,2))
+ call imtclose (PAR_GAINLIST(par,2))
+ call imtclose (PAR_EXPLIST(par,2))
+ call imtclose (PAR_SIGLIST(par,2))
+ call imtclose (PAR_SKYLIST(par,2))
+ call imtclose (PAR_BPMLIST(par,2))
+ call imtclose (PAR_IMLIST(par,2))
+
+ call clpcls (PAR_SCALELIST(par,1))
+ call imtclose (PAR_GAINLIST(par,1))
+ call imtclose (PAR_EXPLIST(par,1))
+ call imtclose (PAR_SIGLIST(par,1))
+ call imtclose (PAR_SKYLIST(par,1))
+ call imtclose (PAR_BPMLIST(par,1))
+ call imtclose (PAR_IMLIST(par,1))
+
+ call sfree (sp)
+end
+
+
+# T_DIFFDETECT -- Detect objects in the difference of images.
+
+procedure t_diffdetect ()
+
+pointer par # Parameters
+
+pointer sp, str
+
+int imtopenp(), imtopen(), clpopnu()
+
+begin
+ call smark (sp)
+ call salloc (par, PAR_LEN, TY_STRUCT)
+ call salloc (str, SZ_LINE, TY_CHAR)
+ call aclri (Memi[par], PAR_LEN)
+
+ # Get list parameters.
+ PAR_IMLIST(par,1) = imtopenp ("images")
+ PAR_BPMLIST(par,1) = imtopenp ("masks")
+ PAR_SKYLIST(par,1) = imtopenp ("skys")
+ PAR_SIGLIST(par,1) = imtopenp ("sigmas")
+ PAR_EXPLIST(par,1) = imtopenp ("exps")
+ PAR_GAINLIST(par,1) = imtopenp ("gains")
+ PAR_SCALELIST(par,1) = clpopnu ("scales")
+
+ PAR_IMLIST(par,2) = imtopenp ("rimages")
+ PAR_BPMLIST(par,2) = imtopenp ("rmasks")
+ PAR_SKYLIST(par,2) = imtopenp ("rskys")
+ PAR_SIGLIST(par,2) = imtopenp ("rsigmas")
+ PAR_EXPLIST(par,2) = imtopenp ("rexps")
+ PAR_GAINLIST(par,2) = imtopen ("")
+ PAR_SCALELIST(par,2) = clpopnu ("rscales")
+
+ PAR_OMLIST(par) = imtopenp ("objmasks")
+ PAR_OMTYPE(par) = OM_ALL
+ PAR_INCATLIST(par) = imtopen ("")
+ PAR_OUTCATLIST(par) = imtopenp ("catalogs")
+ PAR_CATDEFLIST(par) = clpopnu ("catdefs")
+ PAR_LOGLIST(par) = clpopnu ("logfiles")
+
+ PAR_OUTSKYLIST(par) = imtopen ("")
+ PAR_OUTSIGLIST(par) = imtopen ("")
+
+ # Get other parameters.
+ call sky_pars ("open", "", PAR_SKY(par))
+ call det_pars ("diff", "", PAR_DET(par))
+ call grw_pars ("open", "", PAR_GRW(par))
+ call evl_pars ("open", "", PAR_EVL(par))
+
+ # Do the detection.
+ call aceall (par)
+
+ # Finish up.
+ call sky_pars ("close", "", PAR_SKY(par))
+ call det_pars ("close", "", PAR_DET(par))
+ call spt_pars ("close", "", PAR_SPT(par))
+ call grw_pars ("close", "", PAR_GRW(par))
+ call evl_pars ("close", "", PAR_EVL(par))
+
+ call imtclose (PAR_OUTSIGLIST(par))
+ call imtclose (PAR_OUTSKYLIST(par))
+
+ call clpcls (PAR_LOGLIST(par))
+ call imtclose (PAR_OMLIST(par))
+ call clpcls (PAR_CATDEFLIST(par))
+ call imtclose (PAR_INCATLIST(par))
+ call imtclose (PAR_OUTCATLIST(par))
+
+ call clpcls (PAR_SCALELIST(par,2))
+ call imtclose (PAR_GAINLIST(par,2))
+ call imtclose (PAR_EXPLIST(par,2))
+ call imtclose (PAR_SIGLIST(par,2))
+ call imtclose (PAR_SKYLIST(par,2))
+ call imtclose (PAR_BPMLIST(par,2))
+ call imtclose (PAR_IMLIST(par,2))
+
+ call clpcls (PAR_SCALELIST(par,1))
+ call imtclose (PAR_GAINLIST(par,1))
+ call imtclose (PAR_EXPLIST(par,1))
+ call imtclose (PAR_SIGLIST(par,1))
+ call imtclose (PAR_SKYLIST(par,1))
+ call imtclose (PAR_BPMLIST(par,1))
+ call imtclose (PAR_IMLIST(par,1))
+
+ call sfree (sp)
+end
+
+
+
+# ACEALL -- Expand input list and set filenames.
+# This calls ACE for each image to be analyzed.
+
+procedure aceall (par)
+
+pointer par #I Parameters
+
+int i, j, k, list, imext
+pointer sp, str
+pointer image[4], bpmask[4], skyname[4], signame[4], expname[4], gainname[4]
+pointer incat[2], outcat[2], objmask[2], outsky[2], outsig[2], scalestr[2]
+pointer catdef, logfile
+pointer im, ptr
+
+int nowhite(), mscextensions(), strldxs(), strlen()
+int imtlen(), imtgetim(), clplen(), clgfil()
+pointer immap()
+errchk immap
+
+begin
+ call smark (sp)
+
+ # Allocate memory for all the file names. The first half of each
+ # array of names is for image names including extensions and the
+ # second half is for cluster names. The names are initialized
+ # to EOS and are only filled in if specified.
+
+ do j = 1, 4 {
+ call salloc (image[j], SZ_FNAME, TY_CHAR)
+ call salloc (bpmask[j], SZ_FNAME, TY_CHAR)
+ call salloc (skyname[j], SZ_FNAME, TY_CHAR)
+ call salloc (signame[j], SZ_FNAME, TY_CHAR)
+ call salloc (expname[j], SZ_FNAME, TY_CHAR)
+ call salloc (gainname[j], SZ_FNAME, TY_CHAR)
+ Memc[image[j]] = EOS
+ Memc[bpmask[j]] = EOS
+ Memc[skyname[j]] = EOS
+ Memc[signame[j]] = EOS
+ Memc[expname[j]] = EOS
+ Memc[gainname[j]] = EOS
+ }
+ do j = 1, 2 {
+ call salloc (objmask[j], SZ_FNAME, TY_CHAR)
+ call salloc (incat[j], SZ_FNAME, TY_CHAR)
+ call salloc (outcat[j], SZ_FNAME, TY_CHAR)
+ call salloc (outsky[j], SZ_FNAME, TY_CHAR)
+ call salloc (outsig[j], SZ_FNAME, TY_CHAR)
+ call salloc (scalestr[j], SZ_FNAME, TY_CHAR)
+ Memc[objmask[j]] = EOS
+ Memc[incat[j]] = EOS
+ Memc[outcat[j]] = EOS
+ Memc[outsky[j]] = EOS
+ Memc[outsig[j]] = EOS
+ Memc[scalestr[j]] = EOS
+ }
+ call salloc (catdef, SZ_FNAME, TY_CHAR)
+ call salloc (logfile, SZ_FNAME, TY_CHAR)
+ Memc[catdef] = EOS
+ Memc[logfile] = EOS
+
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ # Check lists match.
+ j = imtlen (PAR_IMLIST(par,1))
+ i = imtlen (PAR_BPMLIST(par,1))
+ if (i > 1 && i != j)
+ call error (1,
+ "Image and bad pixel mask lists do not match")
+ i = imtlen (PAR_SKYLIST(par,1))
+ if (i > 1 && i != j)
+ call error (1,
+ "Image and sky lists do not match")
+ i = imtlen (PAR_SIGLIST(par,1))
+ if (i > 1 && i != j)
+ call error (1,
+ "Image and sky sigma lists do not match")
+ i = imtlen (PAR_EXPLIST(par,1))
+ if (i > 1 && i != j)
+ call error (1,
+ "Image and exposure map lists do not match")
+ i = imtlen (PAR_GAINLIST(par,1))
+ if (i > 1 && i != j)
+ call error (1,
+ "Image and measurement gain lists do not match")
+ i = clplen (PAR_SCALELIST(par,1))
+ if (i > 1 && i != j)
+ call error (1,
+ "Image and scale lists do not match")
+
+ k = imtlen (PAR_IMLIST(par,2))
+ if (k > 1 && i != j)
+ call error (1,
+ "Image and reference lists do not match")
+ i = imtlen (PAR_BPMLIST(par,2))
+ if (i > 1 && i != k)
+ call error (1,
+ "Reference image bad pixel mask lists do not match")
+ i = imtlen (PAR_SKYLIST(par,2))
+ if (i > 1 && i != k)
+ call error (1,
+ "Reference image and sky lists do not match")
+ i = imtlen (PAR_SIGLIST(par,2))
+ if (i > 1 && i != k)
+ call error (1,
+ "Reference image and sky sigma lists do not match")
+ i = imtlen (PAR_EXPLIST(par,2))
+ if (i > 1 && i != k)
+ call error (1,
+ "Reference image and exposure map lists do not match")
+ i = imtlen (PAR_GAINLIST(par,2))
+ if (i > 1 && i != j)
+ call error (1,
+ "Reference image and measurement gain lists do not match")
+ i = clplen (PAR_SCALELIST(par,2))
+ if (i > 1 && i != k)
+ call error (1,
+ "Reference image and scale lists do not match")
+
+ i = clplen (PAR_INCATLIST(par))
+ if (i > 0 && i != j)
+ call error (1,
+ "Input image and input catalog lists do not match")
+ i = clplen (PAR_OUTCATLIST(par))
+ if (i > 0 && i != j)
+ call error (1,
+ "Input image and output catalog lists do not match")
+ i = clplen (PAR_CATDEFLIST(par))
+ if (i > 1 && i != j)
+ call error (1,
+ "Input image and catalog definition lists do not match")
+ i = imtlen (PAR_OMLIST(par))
+ if (i > 0 && i != j)
+ call error (1,
+ "Input image and object mask lists do not match")
+ i = clplen (PAR_LOGLIST(par))
+ if (i > 1 && i != j)
+ call error (1,
+ "Input image and logfile lists do not match")
+ i = imtlen (PAR_OUTSKYLIST(par))
+ if (i > 0 && i != j)
+ call error (1,
+ "Input image and output sky lists do not match")
+ i = imtlen (PAR_OUTSIGLIST(par))
+ if (i > 0 && i != j)
+ call error (1,
+ "Input image and output sigma lists do not match")
+
+ # Do each input image cluster.
+ while (imtgetim (PAR_IMLIST(par,1), Memc[image[1]], SZ_FNAME) != EOF) {
+ if (imtgetim (PAR_IMLIST(par,2), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[image[2]], SZ_FNAME)
+
+ # Get associated cluster names.
+ # Initialize image names to the cluster names.
+ # Strip whitespace to check for no name.
+ do j = 1, 2 {
+ if (imtgetim (PAR_BPMLIST(par,j), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[bpmask[j]], SZ_FNAME)
+ if (imtgetim (PAR_SKYLIST(par,j), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[skyname[j]], SZ_FNAME)
+ if (imtgetim (PAR_SIGLIST(par,j), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[signame[j]], SZ_FNAME)
+ if (imtgetim (PAR_EXPLIST(par,j), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[expname[j]], SZ_FNAME)
+ if (imtgetim (PAR_GAINLIST(par,j), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[gainname[j]], SZ_FNAME)
+ if (clgfil (PAR_SCALELIST(par,j), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[scalestr[j]], SZ_FNAME)
+
+ i = nowhite (Memc[bpmask[j]], Memc[bpmask[j]], SZ_FNAME)
+ i = nowhite (Memc[skyname[j]], Memc[skyname[j]], SZ_FNAME)
+ i = nowhite (Memc[signame[j]], Memc[signame[j]], SZ_FNAME)
+ i = nowhite (Memc[expname[j]], Memc[expname[j]], SZ_FNAME)
+ i = nowhite (Memc[gainname[j]], Memc[gainname[j]], SZ_FNAME)
+ i = nowhite (Memc[scalestr[j]], Memc[scalestr[j]], SZ_FNAME)
+ }
+
+ if (clgfil (PAR_INCATLIST(par), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[incat[1]], SZ_FNAME)
+ if (clgfil (PAR_OUTCATLIST(par), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[outcat[1]], SZ_FNAME)
+ if (imtgetim (PAR_OMLIST(par), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[objmask[1]], SZ_FNAME)
+ if (imtgetim (PAR_OUTSKYLIST(par), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[outsky[1]], SZ_FNAME)
+ if (imtgetim (PAR_OUTSIGLIST(par), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[outsig[1]], SZ_FNAME)
+ if (clgfil (PAR_CATDEFLIST(par), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[catdef], SZ_FNAME)
+ if (clgfil (PAR_LOGLIST(par), Memc[str], SZ_LINE) != EOF)
+ call strcpy (Memc[str], Memc[logfile], SZ_FNAME)
+
+ i = nowhite (Memc[incat[1]], Memc[incat[1]], SZ_FNAME)
+ i = nowhite (Memc[outcat[1]], Memc[outcat[1]], SZ_FNAME)
+ i = nowhite (Memc[objmask[1]], Memc[objmask[1]], SZ_FNAME)
+ i = nowhite (Memc[outsky[1]], Memc[outsky[1]], SZ_FNAME)
+ i = nowhite (Memc[outsig[1]], Memc[outsig[1]], SZ_FNAME)
+ i = nowhite (Memc[catdef], Memc[catdef], SZ_FNAME)
+ i = nowhite (Memc[logfile], Memc[logfile], SZ_FNAME)
+
+ # Expand clusters to images. As a special case, if the input is
+ # an explicit extension image then don't treat the filenames as MEF.
+ list = mscextensions (Memc[image[1]], "0-", PAR_EXTNAMES(par),
+ "", NO, YES, NO, "", NO, imext)
+ if (strldxs ("[", Memc[image[1]]) != 0)
+ imext = NO
+ while (imtgetim (list, Memc[image[3]], SZ_FNAME) != EOF) {
+ call strcpy (Memc[image[2]], Memc[image[4]], SZ_FNAME)
+ do j = 1, 2 {
+ call strcpy (Memc[bpmask[j]], Memc[bpmask[j+2]], SZ_FNAME)
+ call strcpy (Memc[skyname[j]], Memc[skyname[j+2]], SZ_FNAME)
+ call strcpy (Memc[signame[j]], Memc[signame[j+2]], SZ_FNAME)
+ call strcpy (Memc[expname[j]], Memc[expname[j+2]], SZ_FNAME)
+ call strcpy (Memc[gainname[j]],Memc[gainname[j+2]],SZ_FNAME)
+ }
+ call strcpy (Memc[incat[1]], Memc[incat[2]], SZ_FNAME)
+ call strcpy (Memc[outcat[1]], Memc[outcat[2]], SZ_FNAME)
+ call strcpy (Memc[objmask[1]], Memc[objmask[2]], SZ_FNAME)
+ call strcpy (Memc[outsky[1]], Memc[outsky[2]], SZ_FNAME)
+ call strcpy (Memc[outsig[1]], Memc[outsig[2]], SZ_FNAME)
+
+ # Add extensions if needed.
+ i = strldxs ("[", Memc[image[3]])
+ if (imext == YES && i > 0) {
+ i = image[3]+i-1
+ call strcpy (Memc[i], Memc[str], SZ_LINE)
+ Memc[str+strldxs ("]", Memc[str])-1] = EOS
+ call strcat (",append]", Memc[str], SZ_LINE)
+
+ if (Memc[image[2]]!=EOS &&
+ strldxs ("[", Memc[image[2]]) == 0)
+ call strcat (Memc[i], Memc[image[4]], SZ_FNAME)
+ do j = 1, 2 {
+ if (Memc[bpmask[j]]!=EOS && Memc[bpmask[j]]!='!' &&
+ strldxs ("[", Memc[bpmask[j]]) == 0)
+ call strcat (Memc[i], Memc[bpmask[j+2]], SZ_FNAME)
+ if (Memc[skyname[j]]!=EOS && Memc[skyname[j]]!='!' &&
+ strldxs ("[", Memc[skyname[j]]) == 0)
+ call strcat (Memc[str], Memc[skyname[j+2]],
+ SZ_FNAME)
+ if (Memc[signame[j]]!=EOS && Memc[signame[j]]!='!' &&
+ strldxs ("[", Memc[signame[j]]) == 0)
+ call strcat (Memc[str], Memc[signame[j+2]],
+ SZ_FNAME)
+ if (Memc[expname[j]]!=EOS && Memc[expname[j]]!='!' &&
+ strldxs ("[", Memc[expname[j]]) == 0)
+ call strcat (Memc[i], Memc[expname[j+2]], SZ_FNAME)
+ if (Memc[gainname[j]]!=EOS && Memc[gainname[j]]!='!' &&
+ strldxs ("[", Memc[gainname[j]]) == 0)
+ call strcat (Memc[i], Memc[gainname[j+2]], SZ_FNAME)
+ }
+ if (Memc[incat[1]]!=EOS && Memc[incat[1]]!='!' &&
+ strldxs ("[", Memc[incat[1]]) == 0)
+ call strcat (Memc[i], Memc[incat[2]], SZ_FNAME)
+ if (Memc[outcat[1]]!=EOS && Memc[outcat[1]]!='!' &&
+ strldxs ("[", Memc[outcat[1]]) == 0)
+ call strcat (Memc[i], Memc[outcat[2]], SZ_FNAME)
+ if (Memc[outsky[1]]!=EOS && Memc[outsky[1]]!='!' &&
+ strldxs ("[", Memc[outsky[1]]) == 0)
+ call strcat (Memc[str], Memc[outsky[2]], SZ_FNAME)
+ if (Memc[outsig[1]]!=EOS && Memc[outsig[1]]!='!' &&
+ strldxs ("[", Memc[outsig[1]]) == 0)
+ call strcat (Memc[str], Memc[outsig[2]], SZ_FNAME)
+ if (Memc[objmask[1]]!=EOS && Memc[objmask[1]]!='!' &&
+ strldxs ("[", Memc[objmask[1]]) == 0)
+ call strcat (Memc[str], Memc[objmask[2]], SZ_FNAME)
+ }
+
+ # Append DATASEC.
+ do i = 3, 4 {
+ if (Memc[image[i]] == EOS)
+ next
+ iferr {
+ im = NULL
+ ptr = immap (Memc[image[i]], READ_ONLY, 0); im = ptr
+ j = strlen (Memc[image[i]])
+ call imgstr (im, "DATASEC", Memc[image[i]+j],
+ SZ_FNAME-j)
+ } then
+ ;
+ if (im != NULL)
+ call imunmap (im)
+ }
+
+ # Process the image.
+ call ace (par, image[3], bpmask[3], skyname[3], signame[3],
+ expname[3], gainname[3], scalestr, Memc[incat[2]],
+ Memc[outcat[2]], Memc[objmask[2]], Memc[outsky[2]],
+ Memc[outsig[2]], Memc[catdef], Memc[logfile])
+
+ }
+ call imtclose (list)
+ }
+
+ call sfree (sp)
+end
+
+
+# ACE -- Do all the primary steps for a single input image/catalog.
+
+procedure ace (par, image, bpmask, skyname, signame, expname, gainname,
+ scalestr, incat, outcat, objmask, outsky, outsig, catdef, logfile)
+
+pointer par #I Parameters
+pointer image[2], bpmask[2], skyname[2], signame[2], expname[2]
+pointer gainname[2], scalestr[2]
+char incat[ARB], outcat[ARB], objmask[ARB], outsky[ARB], outsig[ARB]
+char catdef[ARB], logfile[ARB]
+
+bool dosky[2], dosig[2]
+int i, j, logfd, offset[2,2]
+real scale[2]
+pointer sp, bpname[2], str
+pointer im[2], bpm[2], skymap[2], sigmap[2], expmap[2], gainmap[2]
+pointer ptr, cat, om, omim, siglevmap, siglevels
+
+bool strne()
+real imgetr()
+int ctor(), strdic(), fnextn(), imstati()
+int open(), access(), imaccess()
+pointer immap(), xt_pmmap(), pm_open(), map_open()
+
+errchk open, immap, xt_pmmap, pm_newmask
+errchk cnvparse, sky, detect, split, grow, evaluate, map_open
+errchk catdefine, catopen, catgets
+
+#pointer bpm1, im_pmmapo()
+
+begin
+ call smark (sp)
+ call salloc (bpname[1], SZ_FNAME, TY_CHAR)
+ call salloc (bpname[2], SZ_FNAME, TY_CHAR)
+ call salloc (str, SZ_LINE, TY_CHAR)
+
+ # Deal with image types if needed.
+ if (Memc[bpmask[1]] != EOS && Memc[bpmask[1]] != '!')
+ call xt_maskname (Memc[bpmask[1]], "pl", READ_ONLY, Memc[bpmask[1]],
+ SZ_FNAME)
+ if (Memc[bpmask[2]] != EOS && Memc[bpmask[2]] != '!')
+ call xt_maskname (Memc[bpmask[2]], "pl", READ_ONLY, Memc[bpmask[2]],
+ SZ_FNAME)
+ if (objmask[1] != EOS && objmask[1] != '!')
+ call xt_maskname (objmask, "pl", NEW_IMAGE, objmask, SZ_FNAME)
+ if (incat[1] != EOS) {
+ i = fnextn (incat, Memc[str], SZ_LINE)
+ if (i > 0)
+ i = strdic (Memc[str], Memc[str], SZ_LINE, CATEXTNS)
+ #if (i == 0)
+ # call strcat (".fits", incat, SZ_FNAME)
+ }
+ if (outcat[1] != EOS) {
+ i = fnextn (outcat, Memc[str], SZ_LINE)
+ if (i > 0)
+ i = strdic (Memc[str], Memc[str], SZ_LINE, CATEXTNS)
+ #if (i == 0)
+ # call strcat (".fits", outcat, SZ_FNAME)
+ }
+
+ iferr {
+ # Initialize for error recovery.
+ do j = 1, 2 {
+ im[j] = NULL; bpm[j] = NULL; skymap[j] = NULL
+ sigmap[j] = NULL; expmap[j] = NULL; gainmap[j] = NULL
+ }
+ cat = NULL; logfd = NULL
+
+ # Log file.
+ if (logfile[1] != EOS) {
+ ptr = open (logfile, APPEND, TEXT_FILE)
+ logfd = ptr
+ call fseti (logfd, F_FLUSHNL, YES)
+ }
+
+ # Open images.
+ if (PAR_DET(par) == NULL && PAR_EVL(par) == NULL)
+ ptr = immap (Memc[image[1]], READ_ONLY, 0)
+ else {
+ iferr (ptr = immap (Memc[image[1]], READ_WRITE, 0))
+ ptr = immap (Memc[image[1]], READ_ONLY, 0)
+ }
+ im[1] = ptr
+
+ # Open input catalog and object mask.
+ if (PAR_DET(par) == NULL && PAR_EVL(par) == NULL)
+ ;
+ else if (PAR_DET(par) == NULL) {
+ if (incat[1] == EOS) {
+ call sprintf (Memc[str], SZ_LINE,
+ "No input catalog for image (%s)")
+ call pargstr (Memc[image[1]])
+ call error (1, Memc[str])
+ } else {
+ if (access (incat, 0, 0) != YES) {
+ call sprintf (Memc[str], SZ_LINE,
+ "Catalog does not exist (%s)")
+ call pargstr (incat)
+ call error (1, Memc[str])
+ }
+ }
+ if (outcat[1]!=EOS && strne(incat,outcat)) {
+ if (access (outcat, 0, 0) == YES) {
+ call sprintf (Memc[str], SZ_LINE,
+ "Catalog already exists (%s)")
+ call pargstr (outcat)
+ call error (1, Memc[str])
+ }
+ }
+ call catopen (cat, incat, outcat, catdef)
+ call catrobjs (cat, "")
+ if (objmask[1] == EOS)
+ call catgets (cat, "mask", objmask, SZ_FNAME)
+ omim = xt_pmmap (objmask, im[1], objmask, SZ_FNAME)
+ om = imstati (omim, IM_PMDES)
+ } else {
+ # Check for existing catalog. Check catalog definitions.
+ if (outcat[1] != EOS) {
+ if (access (outcat, 0, 0) == YES) {
+ call sprintf (Memc[str], SZ_LINE,
+ "Catalog already exists (%s)")
+ call pargstr (outcat)
+ call error (1, Memc[str])
+ }
+ call catdefine (NULL, NULL, catdef)
+ }
+ call catopen (cat, "", "", "")
+
+ # Check for existing mask and initialize.
+ if (objmask[1] != EOS) {
+ if (imaccess (objmask, 0) == YES) {
+ call sprintf (Memc[str], SZ_LINE,
+ "Object mask already exists (%s)")
+ call pargstr (objmask)
+ call error (1, Memc[str])
+ }
+ }
+ }
+
+ # Open bad pixel mask.
+ ptr = xt_pmmap (Memc[bpmask[1]], im[1], Memc[bpname[1]],
+ SZ_FNAME)
+ bpm[1] = ptr
+
+ # Do reference image.
+ if (Memc[image[2]] != EOS) {
+# if (Memc[bpmask[2]] == EOS)
+# call imgimage (Memc[image[2]], Memc[image[2]], SZ_FNAME)
+
+ iferr (ptr = immap (Memc[image[2]], READ_WRITE, 0))
+ ptr = immap (Memc[image[2]], READ_ONLY, 0)
+ im[2] = ptr
+
+ # Set offsets.
+ call get_offsets (im, 2, "world", offset)
+ offset[1,2] = offset[1,2] - offset[1,1]
+ offset[2,2] = offset[2,2] - offset[2,1]
+
+# # Attempt to make an overlapping image section if
+# # there is no bad pixel mask. This is a kludge.
+# if (Memc[bpmask[2]] == EOS) {
+# c1 = max (1, 1-offset[1,2])
+# c2 = min (IM_LEN(im[2],1), IM_LEN(im[1],1)-offset[1,2])
+# l1 = max (1, 1-offset[2,2])
+# l2 = min (IM_LEN(im[2],2), IM_LEN(im[1],2)-offset[2,2])
+# if (c1!=1 || c2!=IM_LEN(im[2],1) ||
+# l1!=1 || l2!=IM_LEN(im[2],2)) {
+# call sprintf (Memc[str], SZ_LINE, "%s[%d:%d,%d:%d]")
+# call pargstr (Memc[image[2]])
+# call pargi (c1)
+# call pargi (c2)
+# call pargi (l1)
+# call pargi (l2)
+# call strcpy (Memc[str], Memc[image[2]], SZ_FNAME)
+# call imunmap (im[2])
+# iferr (ptr = immap (Memc[image[2]], READ_WRITE, 0))
+# ptr = immap (Memc[image[2]], READ_ONLY, 0)
+# im[2] = ptr
+#
+# call get_offsets (im, 2, "world", offset)
+# offset[1,2] = offset[1,2] - offset[1,1]
+# offset[2,2] = offset[2,2] - offset[2,1]
+# PAR_OFFSET(par,1) = offset[1,2]
+# PAR_OFFSET(par,2) = offset[2,2]
+# }
+# }
+
+ ptr = xt_pmmap (Memc[bpmask[2]], im[2], Memc[bpname[2]],
+ SZ_FNAME)
+ bpm[2] = ptr
+
+ i = 1
+ if (Memc[scalestr[1]] == EOS)
+ scale[1] = 1.
+ else if (Memc[scalestr[1]] == '!') {
+ iferr (scale[1] = imgetr (im[1], Memc[scalestr[1]+1]))
+ call error (1, "Bad scale for input image")
+ } else if (ctor (Memc[scalestr[1]], i, scale[1]) == 0)
+ call error (1, "Bad scale for image")
+
+ i = 1
+ if (Memc[scalestr[2]] == EOS)
+ scale[2] = 1.
+ else if (Memc[scalestr[2]] == '!') {
+ iferr (scale[2] = imgetr (im[2], Memc[scalestr[2]+1]))
+ call error (1, "Bad scale for reference image")
+ } else if (ctor (Memc[scalestr[2]], i, scale[2]) == 0)
+ call error (1, "Bad scale for reference image")
+ }
+
+ if (logfd != NULL) {
+ call sysid (Memc[str], SZ_LINE)
+ call fprintf (logfd, "ACE: %s\n")
+ call pargstr (Memc[str])
+ call fprintf (logfd, " Image: %s - %s\n")
+ call pargstr (Memc[image[1]])
+ call pargstr (IM_TITLE(im[1]))
+ if (bpm[1] != NULL) {
+ call fprintf (logfd, " Bad pixel mask: %s\n")
+ call pargstr (Memc[bpname[1]])
+ }
+ if (im[2] != EOS) {
+ call fprintf (logfd, " Reference image: %s - %s\n")
+ call pargstr (Memc[image[2]])
+ call pargstr (IM_TITLE(im[2]))
+ if (bpm[2] != NULL) {
+ call fprintf (logfd,
+ " Reference bad pixel mask: %s\n")
+ call pargstr (Memc[bpname[2]])
+ }
+ }
+ }
+
+ # Open optional maps.
+ do j = 1, 2 {
+ if (im[j] == NULL)
+ next
+ if (Memc[expname[j]] != EOS)
+ expmap[j] = map_open (Memc[expname[j]], im[j])
+ }
+ do j = 1, 2 {
+ if (im[j] == NULL)
+ next
+ if (Memc[gainname[j]] != EOS)
+ gainmap[j] = map_open (Memc[gainname[j]], im[j])
+ }
+
+ # Get sky and sky sigma.
+ do j = 1, 2 {
+ dosky[j] = false
+ dosig[j] = false
+ if (im[j] == NULL)
+ next
+ if (PAR_SKY(par) == NULL) {
+ if (Memc[skyname[j]] != EOS)
+ skymap[j] = map_open (Memc[skyname[j]], im[j])
+ if (Memc[signame[j]] != EOS)
+ sigmap[j] = map_open (Memc[signame[j]], im[j])
+ } else {
+ if (j == 1 && om != NULL)
+ call sky (PAR_SKY(par), im[j], omim, expmap[j],
+ Memc[skyname[j]], Memc[signame[j]],
+ skymap[j], sigmap[j], dosky[j], dosig[j], logfd)
+ else
+ call sky (PAR_SKY(par), im[j], bpm[j], expmap[j],
+ Memc[skyname[j]], Memc[signame[j]],
+ skymap[j], sigmap[j], dosky[j], dosig[j], logfd)
+ }
+ if (skymap[j] != NULL)
+ call map_seti (skymap[j], "sample", 5)
+ if (sigmap[j] != NULL)
+ call map_seti (sigmap[j], "sample", 5)
+ }
+
+ # Detect objects.
+ if (PAR_DET(par) != NULL) {
+ # Open object mask.
+ om = pm_open (NULL)
+ call pm_ssize (om, IM_NDIM(im[1]), IM_LEN(im[1],1), 27)
+
+ # Initialize splitting map if needed.
+ if (PAR_SPT(par) != NULL) {
+ siglevmap = pm_open (NULL)
+ call pm_ssize (siglevmap, IM_NDIM(im[1]),
+ IM_LEN(im[1],1), 27)
+ } else
+ siglevmap = NULL
+
+ # Detect objects.
+ call detect (PAR_DET(par), PAR_SPT(par), dosky, dosig,
+ Memc[skyname[1]], Memc[signame[1]], im, bpm, skymap,
+ sigmap, expmap, scale, offset[1,2], om, siglevmap,
+ siglevels, logfd, cat)
+
+ # Split objects.
+ if (PAR_SPT(par) != NULL)
+ call split (PAR_SPT(par), cat, om, siglevmap,
+ Memr[siglevels], logfd)
+
+ # Grow objects.
+ if (PAR_GRW(par) != NULL)
+ call grow (PAR_GRW(par), cat, om, logfd)
+
+ # Set boundary flags and write out the object mask.
+ if (objmask[1] != EOS) {
+ if (PAR_OMTYPE(par) == OM_ALL)
+ call bndry (om, NULL)
+ call omwrite (om, objmask, PAR_OMTYPE(par), im[1], cat,
+ outcat, outcat, logfd)
+ }
+ }
+
+ # Evaluate and write out the catalog.
+ if (PAR_EVL(par) != NULL && outcat[1] != EOS) {
+ if (incat[1] == EOS)
+ call catopen (cat, "", outcat, catdef)
+ call catputs (cat, "image", Memc[image[1]])
+ if (objmask[1] != EOS)
+ call catputs (cat, "mask", objmask)
+ call catputs (cat, "catalog", outcat)
+ call catputs (cat, "objid", outcat)
+
+ # Evaluate objects.
+ call evaluate (PAR_EVL(par), cat, im[1], om, skymap[1],
+ sigmap[1], gainmap[1], expmap[1], logfd)
+
+ if (logfd != NULL) {
+ call fprintf (logfd,
+ " Write catalog: catalog = %s\n")
+ call pargstr (outcat)
+ }
+
+ call catcreate (cat)
+ call catwcs (cat, im)
+ call catwhdr (cat, im)
+ call catwobjs (cat)
+
+ call imastr (im[1], "CATALOG", outcat)
+ }
+
+ # Output sky images.
+ call skyimages (outsky, outsig, im[1], skymap[1],
+ sigmap[1], gainmap[1], expmap[1], logfd)
+
+ } then
+ call erract (EA_WARN)
+
+ if (logfd != NULL)
+ call close (logfd)
+ if (cat != NULL)
+ call catclose (cat)
+ if (siglevmap != NULL) {
+ call pm_close (siglevmap)
+ call mfree (siglevels, TY_REAL)
+ }
+ if (omim != NULL) {
+ call imunmap (omim)
+ om = NULL
+ } else if (om != NULL)
+ call pm_close (om)
+
+ do j = 1, 2 {
+ if (gainmap[j] != NULL)
+ call map_close (gainmap[j])
+ if (expmap[j] != NULL)
+ call map_close (expmap[j])
+ if (sigmap[j] != NULL)
+ call map_close (sigmap[j])
+ if (skymap[j] != NULL)
+ call map_close (skymap[j])
+ if (bpm[j] != NULL)
+ call imunmap (bpm[j])
+ if (im[j] != NULL)
+ call imunmap (im[j])
+ }
+
+ call sfree (sp)
+end
+
+
+define OFFTYPES "|none|wcs|world|physical|"
+define FILE 0
+define NONE 1
+define WCS 2
+define WORLD 3
+define PHYSICAL 4
+
+# GET_OFFSETS -- Get offsets.
+
+procedure get_offsets (in, nimages, param, offsets)
+
+pointer in[nimages] #I Input image pointers
+int nimages #I Number of images
+char param[ARB] #I Offset parameter string
+int offsets[2,nimages] #O Offsets
+
+int i, j, fd, offtype, off
+real val
+bool flip, streq(), fp_equald()
+pointer sp, str, fname
+pointer pref, lref, wref, cd, ltm, coord, section
+pointer mw, ct, mw_openim(), mw_sctran(), immap()
+int open(), fscan(), nscan(), strlen(), strdic()
+errchk mw_openim, mw_gwtermd, mw_gltermd, mw_gaxmap
+errchk mw_sctran, mw_ctrand, open, immap
+
+begin
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+ call salloc (fname, SZ_LINE, TY_CHAR)
+ call salloc (lref, 2, TY_DOUBLE)
+ call salloc (wref, 2, TY_DOUBLE)
+ call salloc (cd, 2*2, TY_DOUBLE)
+ call salloc (coord, 2, TY_DOUBLE)
+
+ call aclri (offsets, 2*nimages)
+
+ # Parse the user offset string. If "none" then there are no offsets.
+ # If "world" or "wcs" then set the offsets based on the world WCS.
+ # If "physical" then set the offsets based on the physical WCS.
+ # If a file scan the offsets.
+
+ call sscan (param)
+ call gargwrd (Memc[str], SZ_LINE)
+ if (nscan() == 0)
+ offtype = NONE
+ else {
+ offtype = strdic (Memc[str], Memc[fname], SZ_LINE, OFFTYPES)
+ if (offtype > 0 && !streq (Memc[str], Memc[fname]))
+ offtype = 0
+ }
+ if (offtype == 0)
+ offtype = FILE
+
+ switch (offtype) {
+ case NONE:
+ ;
+ case WORLD, WCS:
+ mw = mw_openim (in[1])
+ call mw_gwtermd (mw, Memd[lref], Memd[wref], Memd[cd], 2)
+ ct = mw_sctran (mw, "world", "logical", 0)
+ call mw_ctrand (ct, Memd[wref], Memd[lref], 2)
+ call mw_close (mw)
+
+ do i = 2, nimages {
+ mw = mw_openim (in[i])
+ ct = mw_sctran (mw, "world", "logical", 0)
+ call mw_ctrand (ct, Memd[wref], Memd[coord], 2)
+ do j = 1, 2
+ offsets[j,i] = nint (Memd[lref+j-1] - Memd[coord+j-1])
+ call mw_close (mw)
+ }
+ case PHYSICAL:
+ call salloc (pref, 2, TY_DOUBLE)
+ call salloc (ltm, 4, TY_DOUBLE)
+ call salloc (section, SZ_FNAME, TY_CHAR)
+
+ mw = mw_openim (in[1])
+ call mw_gltermd (mw, Memd[ltm], Memd[coord], 2)
+ call mw_close (mw)
+ do i = 2, nimages {
+ mw = mw_openim (in[i])
+ call mw_gltermd (mw, Memd[cd], Memd[coord], 2)
+ call strcpy ("[", Memc[section], SZ_FNAME)
+ flip = false
+ do j = 0, 3, 3 {
+ if (Memd[ltm+j] * Memd[cd+j] >= 0.)
+ call strcat ("*,", Memc[section], SZ_FNAME)
+ else {
+ call strcat ("-*,", Memc[section], SZ_FNAME)
+ flip = true
+ }
+ }
+ Memc[section+strlen(Memc[section])-1] = ']'
+ if (flip) {
+ call imstats (in[i], IM_IMAGENAME, Memc[fname], SZ_LINE)
+ call strcat (Memc[section], Memc[fname], SZ_LINE)
+ call imunmap (in[i])
+ in[i] = immap (Memc[fname], READ_ONLY, TY_CHAR)
+ call mw_close (mw)
+ mw = mw_openim (in[i])
+ call mw_gltermd (mw, Memd[cd], Memd[coord], 2)
+ do j = 0, 3
+ if (!fp_equald (Memd[ltm+j], Memd[cd+j]))
+ call error (1,
+ "Cannot match physical coordinates")
+ }
+ call mw_close (mw)
+ }
+
+ mw = mw_openim (in[1])
+ ct = mw_sctran (mw, "logical", "physical", 0)
+ call mw_ctrand (ct, Memd[lref], Memd[pref], 2)
+ call mw_close (mw)
+ do i = 2, nimages {
+ mw = mw_openim (in[i])
+ ct = mw_sctran (mw, "physical", "logical", 0)
+ call mw_ctrand (ct, Memd[pref], Memd[coord], 2)
+ do j = 1, 2
+ offsets[j,i] = nint (Memd[lref+j-1] - Memd[coord+j-1])
+ call mw_close (mw)
+ }
+ case FILE:
+ fd = open (Memc[str], READ_ONLY, TEXT_FILE)
+ i = 1
+ while (fscan (fd) != EOF) {
+ do j = 1, 2 {
+ call gargr (val)
+ offsets[j,i] = nint (val)
+ }
+ if (nscan() == 2)
+ i = i + 1
+ }
+ call close (fd)
+ if (i <= nimages)
+ call error (1, "offset file incomplete")
+ }
+
+ # Adjust offsets to be positive.
+ do j = 1, 2 {
+ off = offsets[j,1]
+ do i = 2, nimages
+ off = min (off, offsets[j,i])
+ do i = 1, nimages
+ offsets[j,i] = offsets[j,i] - off
+ }
+
+ call sfree (sp)
+end