aboutsummaryrefslogtreecommitdiff
path: root/noao/astutil/pdm/pdmalltheta.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /noao/astutil/pdm/pdmalltheta.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/astutil/pdm/pdmalltheta.x')
-rw-r--r--noao/astutil/pdm/pdmalltheta.x104
1 files changed, 104 insertions, 0 deletions
diff --git a/noao/astutil/pdm/pdmalltheta.x b/noao/astutil/pdm/pdmalltheta.x
new file mode 100644
index 00000000..b7a48889
--- /dev/null
+++ b/noao/astutil/pdm/pdmalltheta.x
@@ -0,0 +1,104 @@
+include <mach.h>
+include <ctype.h>
+include <error.h>
+include "pdm.h"
+
+# PDM_ALLTHETA -- Calculate the theta statistic for the period window.
+
+procedure pdm_alltheta (pdmp, porf)
+
+pointer pdmp # structure pointer
+int porf # period or frequency flag
+
+int i
+double factor, period, pdm_theta(), mmean, mmin, mmax, scale
+pointer rg, rg_xrangesd()
+errchk calloc, realloc, rg_xrangesd
+
+begin
+ # Check to see that maxp > minp.
+ if (PDM_PMAX(pdmp) <= PDM_PMIN(pdmp))
+ call error (0,"maxp smaller or equal minp in alltheta")
+
+ # Calculate the mean of the Y data, remove it.
+ mmean = 0.0d+0
+ do i = 1, PDM_NPT(pdmp) {
+ mmean = mmean + PDM_DY(pdmp,i)
+ }
+ mmean = mmean/PDM_NPT(pdmp)
+ do i = 1, PDM_NPT(pdmp) {
+ PDM_DY(pdmp,i) = PDM_DY(pdmp,i) - mmean
+ }
+
+ # Find the min and max of the data, scale the data 0 to 1.
+ mmin = PDM_DY(pdmp,1)
+ mmax = PDM_DY(pdmp,1)
+ do i = 1, PDM_NPT(pdmp) {
+ if (PDM_DY(pdmp,i) > mmax)
+ mmax = PDM_DY(pdmp,i)
+ if (PDM_DY(pdmp,i) < mmin)
+ mmin = PDM_DY(pdmp,i)
+ }
+ scale = mmax - mmin
+ do i = 1, PDM_NPT(pdmp) {
+ PDM_DY(pdmp,i) = (PDM_DY(pdmp,i) - mmin)/scale
+ }
+
+ # Bring the statistics up to date.
+ iferr (call pdm_statistics (pdmp))
+ call error (0, "alltheta: error in statistics")
+
+ # Allocate space for the ordinate and abscissa vectors for theta
+ # in the pdm data structure.
+
+ if (PDM_XTHP(pdmp) == NULL) {
+ call calloc (PDM_XTHP(pdmp), PDM_NTHPT(pdmp), TY_DOUBLE)
+ call calloc (PDM_YTHP(pdmp), PDM_NTHPT(pdmp), TY_DOUBLE)
+ } else {
+ call realloc (PDM_XTHP(pdmp), PDM_NTHPT(pdmp), TY_DOUBLE)
+ call realloc (PDM_YTHP(pdmp), PDM_NTHPT(pdmp), TY_DOUBLE)
+ }
+
+ # Calculate constant for incrementing the period. Give equally
+ # spaced frequencies.
+
+ if (PDM_PMIN(pdmp) <= EPSILOND)
+ if (PDM_NTHPT(pdmp) >= 1)
+ PDM_PMIN(pdmp) = PDM_PMAX(PDMP)/PDM_NTHPT(pdmp)
+ else
+ call error (1, "alltheta: num thpts < 1")
+
+ if (PDM_PMIN(pdmp) >= EPSILONR && PDM_NTHPT(pdmp) != 1)
+ factor = (PDM_PMAX(pdmp)/PDM_PMIN(pdmp))**
+ (1.0/(PDM_NTHPT(pdmp)-1))
+
+ # Calculate the ranges information from the sample string.
+ rg = rg_xrangesd (PDM_SAMPLE(pdmp), PDM_X(pdmp,1), PDM_NPT(pdmp))
+
+ # Call pdm_theta for each period and store the thetas and periods
+ # in the pdm data structure, calculate frequencies (1/p) as we go.
+
+ period = PDM_PMIN(pdmp)
+ do i = 1, PDM_NTHPT(pdmp) {
+ PDM_YTH(pdmp,i) = pdm_theta (pdmp, rg, period)
+ if (porf == THETAPPLOT)
+ PDM_XTH(pdmp,i) = period
+ else {
+ if (period > EPSILOND)
+ PDM_XTH(pdmp,i) = 1.0d+0/period
+ else
+ call error (0, "alltheta: period very close to zero")
+ }
+ period = period * factor
+ }
+
+ # Remove the scaling.
+ do i = 1, PDM_NPT(pdmp) {
+ PDM_DY(pdmp,i) = (PDM_DY(pdmp,i) * scale) + mmin
+ }
+
+ # Put the mean back in.
+ do i = 1, PDM_NPT(pdmp) {
+ PDM_DY(pdmp,i) = PDM_DY(pdmp,i) + mmean
+ }
+end