aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/splot/sumflux.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/splot/sumflux.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'noao/onedspec/splot/sumflux.x')
-rw-r--r--noao/onedspec/splot/sumflux.x165
1 files changed, 165 insertions, 0 deletions
diff --git a/noao/onedspec/splot/sumflux.x b/noao/onedspec/splot/sumflux.x
new file mode 100644
index 00000000..36f6ca3b
--- /dev/null
+++ b/noao/onedspec/splot/sumflux.x
@@ -0,0 +1,165 @@
+# SUMFLUX -- Sum up the flux in a specified bandpass
+
+procedure sumflux (sh, x, y, s, n, eqx1, eqx2, eqy1, eqy2,
+ sum, rsum, esum, ctr)
+
+pointer sh
+real x[n], y[n], s[n]
+int n
+real eqx1, eqx2, eqy1, eqy2
+real sum[2], rsum[2], esum[2], ctr[2]
+
+real slope, csum[2], sum2[2], rampval, scale, delta, wpc
+real w1, w2
+int i, i1, i2
+bool fp_equalr()
+
+begin
+ call fixx (sh, eqx1, eqx2, eqy1, eqy2, i1, i2)
+ slope = (eqy2-eqy1) / (eqx2-eqx1)
+
+ sum[1] = 0.0
+ rsum[1] = 0.0
+ esum[1] = 0.0
+ csum[1] = 0.0
+ sum2[1] = 0.0
+ scale = 0.0
+
+ for (i=i1+1; i <= i2-1; i = i+1)
+ scale = max (scale, y[i])
+ if (scale <= 0.)
+ scale = 1.
+
+ for (i=i1+1; i <= i2-1; i = i+1) {
+ rampval = eqy1 + slope * (x[i] - eqx1)
+ sum[1] = sum[1] + y[i]
+ rsum[1] = rsum[1] + rampval
+ if (!IS_INDEF(esum[1])) {
+ if (fp_equalr (0., rampval/scale))
+ esum[1] = INDEF
+ else
+ esum[1] = esum[1] + (1. - y[i] / rampval)
+ }
+ }
+
+ for (i=i1+1; i <= i2-1; i = i+1) {
+ rampval = eqy1 + slope * (x[i] - eqx1)
+ delta = (y[i] - rampval) / scale
+ csum[1] = csum[1] + abs(delta)**1.5 * x[i]
+ sum2[1] = sum2[1] + abs(delta)**1.5
+ }
+
+ # end points
+ if (eqx1 < x[i1]) {
+ if (i1 > 1)
+ w1 = (x[i1] - eqx1) / (x[i1] - x[i1-1])
+ else
+ w1 = (x[i1] - eqx1) / (x[i1+1] - x[i1])
+ } else {
+ if (i1 < n)
+ w1 = (x[i1] - eqx1) / (x[i1+1] - x[i1])
+ else
+ w1 = (x[i1] - eqx1) / (x[i1] - x[i1-1])
+ }
+ if (eqx2 < x[i2]) {
+ if (i2 > 1)
+ w2 = (x[i2] - eqx2) / (x[i2] - x[i2-1])
+ else
+ w2 = (x[i2] - eqx2) / (x[i2+1] - x[i2])
+ } else {
+ if (i2 < n)
+ w2 = (x[i2] - eqx2) / (x[i2+1] - x[i2])
+ else
+ w2 = (x[i2] - eqx2) / (x[i2] - x[i2-1])
+ }
+ w2 = 1.0 - w2
+
+ sum[1] = sum[1] + w1 * y[i1] + w2 * y[i2]
+ rsum[1] = rsum[1] + w1 * eqy1 + w2 * eqy2
+ if (!IS_INDEF(esum[1])) {
+ if (fp_equalr (0., eqy1/scale)|| fp_equalr (0., eqy2/scale))
+ esum[1] = INDEF
+ else
+ esum[1] = esum[1] + w1 * (1. - y[i1] / eqy1) +
+ w2 * (1. - y[i2] / eqy2)
+ }
+
+ delta = (y[i1] - eqy1) / scale
+ csum[1] = csum[1] + w1 * abs(delta)**1.5 * eqx1
+ sum2[1] = sum2[1] + w1 * abs(delta)**1.5
+
+ delta = (y[i2] - eqy2) / scale
+ csum[1] = csum[1] + w2 * abs(delta)**1.5 * eqx2
+ sum2[1] = sum2[1] + w2 * abs(delta)**1.5
+
+ if (sum2[1] != 0.0)
+ ctr[1] = csum[1] / sum2[1]
+ else
+ ctr[1] = 0.0
+
+ # Correct for angstroms/channel
+ if (i1 != i2)
+ wpc = abs ((x[i2] - x[i1]) / (i2 - i1))
+ else if (i1 < n)
+ wpc = abs (x[i1+1] - x[i1])
+ else
+ wpc = abs (x[i1-1] - x[i1])
+ sum[1] = sum[1] * wpc
+ if (!IS_INDEF(esum[1]))
+ esum[1] = esum[1] * wpc
+ rsum[1] = rsum[1] * wpc
+
+ # Errors (Note there are no errors in the ramp values).
+ if (!IS_INDEF(s[1])) {
+ sum[2] = 0.0
+ rsum[2] = 0.0
+ esum[2] = 0.0
+ csum[2] = 0.0
+ sum2[2] = 0.0
+ for (i=i1+1; i <= i2-1; i = i+1) {
+ rampval = eqy1 + slope * (x[i] - eqx1)
+ sum[2] = sum[2] + s[i]**2
+ if (!IS_INDEF(esum[1])) {
+ if (fp_equalr (0., rampval/scale))
+ esum[2] = INDEF
+ else
+ esum[2] = esum[2] + (s[i] / rampval) ** 2
+ }
+ }
+
+ for (i=i1+1; i <= i2-1; i = i+1) {
+ rampval = eqy1 + slope * (x[i] - eqx1)
+ delta = (y[i] - rampval) / scale
+ csum[2] = csum[2] + abs(delta)*((x[i]-ctr[1])*s[i]) ** 2
+ }
+
+ # endpoints
+ sum[2] = sum[2] + (w1 * s[i1])**2 + (w2 * s[i2])**2
+ if (!IS_INDEF(esum[1])) {
+ if (fp_equalr (0., eqy1/scale)|| fp_equalr (0., eqy2/scale))
+ esum[2] = INDEF
+ else
+ esum[2] = esum[2] + (w1 * s[i1] / eqy1) ** 2 +
+ (w2 * s[i2] / eqy2) ** 2
+ }
+
+ delta = (y[i1] - eqy1) / scale
+ csum[2] = csum[2] + abs(delta)*(w1*(eqx1-ctr[1])*s[i1]) ** 2
+
+ delta = (y[i2] - eqy2) / scale
+ csum[2] = csum[2] + abs(delta)*(w2*(eqx2-ctr[1])*s[i2]) ** 2
+
+ if (sum2[1] != 0.0)
+ ctr[2] = 1.5 / scale * sqrt (csum[2]) / sum2[1]
+ else
+ ctr[2] = 0.0
+
+ sum[2] = sqrt (sum[2])
+ esum[2] = sqrt (esum[2])
+
+ # Correct for angstroms/channel
+ sum[2] = sum[2] * wpc
+ if (!IS_INDEF(esum[1]))
+ esum[2] = esum[2] * wpc
+ }
+end