aboutsummaryrefslogtreecommitdiff
path: root/noao/rv/rvrebin.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/rv/rvrebin.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'noao/rv/rvrebin.x')
-rw-r--r--noao/rv/rvrebin.x155
1 files changed, 155 insertions, 0 deletions
diff --git a/noao/rv/rvrebin.x b/noao/rv/rvrebin.x
new file mode 100644
index 00000000..4c0710f7
--- /dev/null
+++ b/noao/rv/rvrebin.x
@@ -0,0 +1,155 @@
+include <error.h>
+include "rvpackage.h"
+include "rvflags.h"
+include "rvcont.h"
+
+
+# FORCE_REBIN - Rebin the input spectrum in log space from a specified
+# uniform log binning. This is to force both object and templates to the
+# same dispersion if at all possible.
+
+int procedure force_rebin (rv)
+
+pointer rv #I RV struct pointer
+
+int npts, dcflag, which, status
+int force_which(), rv_getim()
+real w0, wpc, w2
+errchk realloc
+
+begin
+ # Skip this if not dispersion corrected.
+ if (RV_DCFLAG(rv) == -1)
+ return (OK)
+
+ # First get the intermediate values to rebin the spectrum
+ dcflag = 1 # Rebinning to log dispersion.
+ if (force_which (rv, which, w0, wpc, npts) == NO)
+ return (OK)
+
+ # Move the data before rebinning and increase the size of the data cache
+ if (which == OBJECT_SPECTRUM) {
+ call realloc (RV_OPIXX(rv), npts, TY_REAL)
+ call realloc (RV_OPIXY(rv), npts, TY_REAL)
+ call aclrr (OBJPIXX(rv,1), npts)
+ call aclrr (OBJPIXY(rv,1), npts)
+ } else {
+ call realloc (RV_RPIXX(rv), npts, TY_REAL)
+ call realloc (RV_RPIXY(rv), npts, TY_REAL)
+ call aclrr (REFPIXX(rv,1), npts)
+ call aclrr (REFPIXY(rv,1), npts)
+ }
+
+ w2 = w0 + (npts - 1) * wpc
+ if (DEBUG(rv)) {
+ call d_printf (DBG_FD(rv), "force_rebin:\n")
+ call d_printf (DBG_FD(rv), "\tw0,wpc,w2,npts = %g,%g,%g,%d - %d\n")
+ call pargr(w0);call pargr(wpc);call pargr(w2)
+ call pargi(npts);call pargi(which)
+ call d_printf (DBG_FD(rv), "\to_w0=%g o_wpc=%g o_w2=%g\n")
+ call pargr(RV_OW0(rv)) ; call pargr(RV_OWPC(rv))
+ call pargr(RV_OW2(rv))
+ call d_printf (DBG_FD(rv), "\tr_w0=%g r_wpc=%g r_w2=%g\n")
+ call pargr(RV_RW0(rv)) ; call pargr(RV_RWPC(rv))
+ call pargr(RV_RW2(rv))
+ }
+
+ # Now rebin to the desired dispersion.
+ #wpc = (10.0 ** (w0 + (npts-1)*wpc) - 10.0 ** w0) / (npts - 1)
+ w2 = 10.0 ** w2
+ w0 = 10.0 ** w0
+ if (which == OBJECT_SPECTRUM)
+ status = rv_getim (rv, IMAGE(rv), OBJECT_SPECTRUM, w0, w2, npts)
+ else
+ status = rv_getim (rv, RIMAGE(rv), REFER_SPECTRUM, w0, w2, npts)
+
+ if (DEBUG(rv)) {
+ call d_printf (DBG_FD(rv), "\tend: w0,wpc,w2,npts = %g,%g,%g,%d\n")
+ call pargr(w0);call pargr(wpc);call pargr(w2);call pargi(npts)
+ }
+
+ # Re-calculate the velocity dispersion and global endpoints
+ RV_DELTAV(rv) = wpc * CLN10
+ RV_GLOB_W1(rv) = min (RV_OW0(rv), RV_RW0(rv))
+ RV_GLOB_W2(rv) = max (RV_OW2(rv), RV_RW2(rv))
+
+ return (OK)
+end
+
+
+# FORCE_WHICH - Determine if spectra have to be rebinned to have the same
+# dispersion and same starting wavelengths to within an integer shift.
+
+int procedure force_which (rv, which, w0, wpc, npts)
+
+pointer rv #I RV struct pointer
+int which #O Which spectrum?
+real w0 #O Rebinned W0
+real wpc #O Rebinned WPC
+int npts #O Rebinned number of pixels
+
+int i
+int stat
+bool fp_equalr()
+
+begin
+ # Check if the spectra have the same dispersion.
+ which = OBJECT_SPECTRUM
+ w0 = RV_RW0(rv)
+ wpc = RV_RWPC(rv)
+ npts = RV_RNPTS(rv)
+ stat = NO
+ if (fp_equalr (w0, RV_OW0(rv)) && fp_equalr (wpc, RV_OWPC(rv)))
+ return (stat)
+
+ # Determine spectrum to rebin.
+ switch (RV_REBIN(rv)) {
+ case RB_OBJ:
+ which = REFER_SPECTRUM
+ case RB_TEMP:
+ which = OBJECT_SPECTRUM
+ case RB_SMALL:
+ if (abs (RV_OWPC(rv)) < abs (RV_RWPC(rv)))
+ which = REFER_SPECTRUM
+ else
+ which = OBJECT_SPECTRUM
+ case RB_BIG:
+ if (abs (RV_OWPC(rv)) > abs (RV_RWPC(rv)))
+ which = REFER_SPECTRUM
+ else
+ which = OBJECT_SPECTRUM
+ }
+
+ # Set the new dispersion parameters. The dispersion is the same as
+ # the target spectrum and the starting wavelength is adjusted by a
+ # fractional pixel amount into the data so that the starting
+ # wavelengths of the two spectra are an integer number of pixels
+ # apart in the common dispersion.
+
+ switch (which) {
+ case REFER_SPECTRUM:
+ w0 = RV_OW0(rv)
+ wpc = RV_OWPC(rv)
+ if (RV_RWPC(rv) / RV_OWPC(rv) > 0)
+ i = (RV_RW0(rv) - w0) / wpc + 0.999
+ else
+ i = (RV_RW0(rv) - w0) / wpc
+ w0 = w0 + i * wpc
+ npts = (RV_RW2(rv) - w0) / wpc + 1
+ if (!fp_equalr (w0, RV_RW0(rv)) || !fp_equalr (wpc, RV_RWPC(rv)))
+ stat = YES
+ case OBJECT_SPECTRUM:
+ w0 = RV_RW0(rv)
+ wpc = RV_RWPC(rv)
+ if (RV_RWPC(rv) / RV_OWPC(rv) > 0)
+ i = (RV_OW0(rv) - w0) / wpc + 0.999
+ else
+ i = (RV_OW0(rv) - w0) / wpc
+ w0 = w0 + i * wpc
+ npts = (RV_OW2(rv) - w0) / wpc + 1
+ if (!fp_equalr (w0, RV_OW0(rv)) || !fp_equalr (wpc, RV_OWPC(rv)))
+ stat = YES
+ }
+
+ return (stat)
+end