aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/ecidentify/ecfitdata.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /noao/onedspec/ecidentify/ecfitdata.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'noao/onedspec/ecidentify/ecfitdata.x')
-rw-r--r--noao/onedspec/ecidentify/ecfitdata.x146
1 files changed, 146 insertions, 0 deletions
diff --git a/noao/onedspec/ecidentify/ecfitdata.x b/noao/onedspec/ecidentify/ecfitdata.x
new file mode 100644
index 00000000..998f5057
--- /dev/null
+++ b/noao/onedspec/ecidentify/ecfitdata.x
@@ -0,0 +1,146 @@
+include <pkg/gtools.h>
+include <smw.h>
+include <units.h>
+include "ecidentify.h"
+
+# EC_FITDATA -- Compute fit coordinates from pixel coordinates.
+
+procedure ec_fitdata (ec)
+
+pointer ec # ID pointer
+
+int i, ecf_oeval()
+
+begin
+ call mfree (EC_FITDATA(ec), TY_DOUBLE)
+ call malloc (EC_FITDATA(ec), EC_NCOLS(ec)*EC_NLINES(ec), TY_DOUBLE)
+
+ do i = 1, EC_NLINES(ec) {
+ call ec_gline (ec, i)
+ if (EC_ECF(ec) == NULL) {
+ if (DC(EC_SH(ec)) != DCNO && EC_UN(ec) != NULL)
+ iferr (call shdr_units (EC_SH(ec), UN_UNITS(EC_UN(ec))))
+ ;
+ call achtrd (Memr[SX(EC_SH(ec))], FITDATA(ec,1), EC_NPTS(ec))
+ call gt_sets (EC_GT(ec), GTXLABEL, LABEL(EC_SH(ec)))
+ call gt_sets (EC_GT(ec), GTXUNITS, UNITS(EC_SH(ec)))
+ } else {
+ ORDERS(ec,i) = ecf_oeval (EC_ECF(ec), APS(ec,i))
+ call ecf_vector (EC_ECF(ec), APS(ec,i), PIXDATA(ec,1),
+ FITDATA(ec,1), EC_NPTS(ec))
+ if (EC_UN(ec) == NULL) {
+ call gt_sets (EC_GT(ec), GTXLABEL, LABEL(EC_SH(ec)))
+ call gt_sets (EC_GT(ec), GTXUNITS, UNITS(EC_SH(ec)))
+ } else {
+ call gt_sets (EC_GT(ec), GTXLABEL, UN_LABEL(EC_UN(ec)))
+ call gt_sets (EC_GT(ec), GTXUNITS, UN_UNITS(EC_UN(ec)))
+ }
+ }
+ }
+
+ call ec_gline (ec, EC_LINE(ec))
+ EC_ORDER(ec) = ORDERS(ec,EC_LINE(ec))
+end
+
+
+# EC_FITFEATURES -- Compute fit coordinates for features.
+
+procedure ec_fitfeatures (ec)
+
+pointer ec # ID pointer
+
+int i, ec_line()
+double ec_fitpt()
+
+begin
+ if (EC_NFEATURES(ec) < 1)
+ return
+
+ do i = 1, EC_NFEATURES(ec) {
+ LINE(ec,i) = ec_line (ec, APN(ec,i))
+ ORDER(ec,i) = ORDERS(ec,LINE(ec,i))
+ FIT(ec,i) = ec_fitpt (ec, APN(ec,i), PIX(ec,i))
+ }
+end
+
+
+# EC_FITPT -- Compute fit coordinates from pixel coordinates.
+
+double procedure ec_fitpt (ec, order, pix)
+
+pointer ec # ID pointer
+int order # Order
+double pix # Pixel coordinate
+
+double fit, ecf_eval(), smw_c1trand(), shdr_lw()
+
+begin
+ if (EC_ECF(ec) == NULL) {
+ fit = smw_c1trand (EC_PL(ec), pix)
+ fit = shdr_lw (EC_SH(ec), fit)
+ } else
+ fit = ecf_eval (EC_ECF(ec), order, pix)
+
+ return (fit)
+end
+
+
+# EC_FITTOPIX -- Transform fit coordinate to pixel coordinate.
+
+define DXMIN .01
+
+double procedure ec_fittopix (ec, fitcoord)
+
+pointer ec # ID pointer
+double fitcoord # Fit coordinate to be transformed
+double pixcoord # Pixel coordinate returned
+
+int i, n
+double dx
+
+double ec_fitpt(), smw_c1trand()
+
+begin
+ n = EC_NPTS(ec)
+ if (FITDATA(ec,1) < FITDATA(ec,n)) {
+ if ((fitcoord<FITDATA(ec,1)) || (fitcoord>FITDATA(ec,n)))
+ return (INDEFD)
+
+ for (i = 1; fitcoord > FITDATA(ec,i); i = i + 1)
+ ;
+
+ if (FITDATA(ec,i) == fitcoord)
+ return (double (i))
+
+ pixcoord = smw_c1trand (EC_LP(ec), double(i-.5))
+ dx = smw_c1trand (EC_LP(ec), double(i+.5)) - pixcoord
+ while (dx > DXMIN) {
+ dx = dx / 2
+ if (ec_fitpt (ec, EC_AP(ec), pixcoord) < fitcoord)
+ pixcoord = pixcoord + dx
+ else
+ pixcoord = pixcoord - dx
+ }
+ } else {
+ if ((fitcoord<FITDATA(ec,n)) || (fitcoord>FITDATA(ec,1)))
+ return (INDEFD)
+
+ for (i = 1; fitcoord < FITDATA(ec,i); i = i + 1)
+ ;
+
+ if (FITDATA(ec,i) == fitcoord)
+ return (double (i))
+
+ pixcoord = smw_c1trand (EC_LP(ec), double(i-.5))
+ dx = smw_c1trand (EC_LP(ec), double(i+.5)) - pixcoord
+ while (dx > DXMIN) {
+ dx = dx / 2
+ if (ec_fitpt (ec, EC_AP(ec), pixcoord) < fitcoord)
+ pixcoord = pixcoord - dx
+ else
+ pixcoord = pixcoord + dx
+ }
+ }
+
+ return (pixcoord)
+end