aboutsummaryrefslogtreecommitdiff
path: root/pkg/xtools/peaks.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/xtools/peaks.x')
-rw-r--r--pkg/xtools/peaks.x70
1 files changed, 70 insertions, 0 deletions
diff --git a/pkg/xtools/peaks.x b/pkg/xtools/peaks.x
new file mode 100644
index 00000000..dfad9abb
--- /dev/null
+++ b/pkg/xtools/peaks.x
@@ -0,0 +1,70 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+# PEAKS -- find the peaks in an array of x and y points.
+# The extrema in the input data points are found using extrema(xtools).
+# The extrema are located to a precision of dx.
+# The extrema with negative curvature (peaks) are selected and returned
+# in the x array. The spline value is returned in the y array. The
+# background is estimated by linear interpolation of the neighboring
+# minima (extrema of positive curvature) to the position of the peak.
+# The background is returned in the background array. The number of
+# peaks found is returned as the function value.
+
+int procedure peaks (x, y, background, npts, dx)
+
+real x[npts], y[npts] # Input data points and output peaks
+real background[npts] # Background estimate
+int npts # Number of input data points
+real dx # Precision of peak positions
+
+int i, j, k, npeaks, nextrema
+pointer sp, a, b, c
+
+int extrema()
+errchk salloc
+
+begin
+ nextrema = extrema (x, y, background, npts, dx)
+
+ if (nextrema == 0)
+ return (0)
+
+ # Allocate working storage
+ call smark (sp)
+ call salloc (a, nextrema, TY_REAL)
+ call salloc (b, nextrema, TY_REAL)
+ call salloc (c, nextrema, TY_REAL)
+
+ npeaks = 0
+ do i = 1, nextrema {
+ if (background[i] < 0.) {
+ Memr[a + npeaks] = x[i]
+ Memr[b + npeaks] = y[i]
+ for (j = i - 1; j > 0; j = j - 1)
+ if (background[j] > 0.)
+ break;
+ for (k = i + 1; k <= npts; k = k + 1)
+ if (background[k] > 0.)
+ break;
+ if ((j >= 1) && (k <= npts))
+ Memr[c + npeaks] =
+ (y[k] - y[j]) / (x[k] - x[j]) * (x[i] - x[j]) + y[j]
+ else if (j >= 1)
+ Memr[c + npeaks] = y[j]
+ else if (k <= npts)
+ Memr[c + npeaks] = y[k]
+ else {
+ call sfree (sp)
+ call error (1, "No background points")
+ }
+ npeaks = npeaks + 1
+ }
+ }
+
+ call amovr (Memr[a], x, npeaks)
+ call amovr (Memr[b], y, npeaks)
+ call amovr (Memr[c], background, npeaks)
+
+ call sfree (sp)
+ return (npeaks)
+end