aboutsummaryrefslogtreecommitdiff
path: root/noao/nproto/skygroup.cl
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/nproto/skygroup.cl
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/nproto/skygroup.cl')
-rw-r--r--noao/nproto/skygroup.cl195
1 files changed, 195 insertions, 0 deletions
diff --git a/noao/nproto/skygroup.cl b/noao/nproto/skygroup.cl
new file mode 100644
index 00000000..24fa05aa
--- /dev/null
+++ b/noao/nproto/skygroup.cl
@@ -0,0 +1,195 @@
+# SKYGROUP -- Group coordinate list on the sky.
+#
+# The input is list of ra (0h-24h or 0d-360d) and dec (-90d to 90d) in the
+# first two columns followed by arbitrary data (usually a filename).
+# This is complicated by the periodicities at 0h.
+
+procedure skygroup (input, output)
+
+file input {prompt="Input list"}
+string output {prompt="Output rootname"}
+string extn = "" {prompt="Optional output extension"}
+real sep = 60 {prompt="Separation between groups (arcsec)"}
+string raunit = "hr" {prompt="RA unit (hr|deg)"}
+bool keepcoords = yes {prompt="Keep coordinates in output?"}
+string raformat = "%.2h" {prompt="Output RA format"}
+string decformat = "%.1h" {prompt="Output DEC format"}
+
+struct *fd1, *fd2
+
+begin
+ file in, out, fname, temp1, temp2, temp3
+ int i, j, n, n1
+ real dra, r1, d1, r2, d2, r3, d3, r4
+ struct fmtstr, data1, data2, data3
+
+ # Temporary files.
+ fname = mktemp ("tmp")
+ in = fname // "in"
+ temp1 = fname // "1"
+ temp2 = fname // "2"
+ temp3 = fname // "3"
+
+ # Set parameters.
+ fname = input
+ out = output
+
+ # Check for existing output files.
+ files (out//"_[0-9][0-9][0-9][0-9]*"//extn, > temp1)
+ count (temp1) | scan (n); delete (temp1, verify-)
+ if (access(out) || n > 0)
+ error (1, "Output files already exist")
+
+ if (raunit == "hr")
+ dra = 24
+ else
+ dra = 360
+
+ if (keepcoords)
+ fmtstr = "%d " // raformat // " " // decformat // " %s"
+ else
+ fmtstr = "%d %s"
+ fmtstr += "\n"
+
+ # We start by sorting in dec.
+ sort (fname, col=2, num+, > in)
+
+ # Find jumps in dec bigger than the separation and then sort
+ # in ra and find jumps in ra bigger than separation. Handle
+ # the wrap around at 0h by duplicating to extend beyond 24h.
+ # The duplicates will be eliminated during the merging process.
+
+ n = 1
+ fd1 = in
+ if (fscan (fd1, r1, d1, data1) == EOF)
+ error (1, "No data or badly formated data")
+ while (fscan (fd1, r2, d2, data2) != EOF) {
+ print (r1, d1, data1, >> temp1)
+ if (r1 / max (0.001, dcos(d1)) * 3600 <= sep) {
+ r4 = r1 + dra
+ print (r4, d1, data1, >> temp1)
+ }
+ if (abs(d2-d1) <= sep) {
+ r1 = r2; d1 = d2; data1 = data2
+ next
+ }
+
+ r3 = r2; d3 = d2; data3 = data2
+
+ sort (temp1, col=1, num+, > temp2)
+ delete (temp1, verify-)
+
+ fd2 = temp2
+ if (fscan (fd2, r1, d1, data1) == EOF);
+ while (fscan (fd2, r2, d2, data2) != EOF) {
+ if (keepcoords)
+ printf (fmtstr, n, r1, d1, data1, >> temp3)
+ else
+ printf (fmtstr, n, data1, >> temp3)
+ skysep (r1, d1, r2, d2, raunit=raunit, verb-)
+ if (skysep.sep <= sep) {
+ r1 = r2; d1 = d2; data1 = data2
+ next
+ }
+
+ n += 1
+ r1 = r2; d1 = d2; data1 = data2
+ }
+ fd2 = ""; delete (temp2, verify-)
+
+ if (keepcoords)
+ printf (fmtstr, n, r1, d1, data1, >> temp3)
+ else
+ printf (fmtstr, n, data1, >> temp3)
+ n += 1
+
+ r1 = r3; d1 = d3; data1 = data3
+ }
+ fd1 = ""; delete (in, verify-)
+
+ print (r1, d1, data1, >> temp1)
+ if (r1 / max (0.001, dcos(d1)) * 3600 <= sep) {
+ r4 = r1 + dra
+ print (r4, d1, data1, >> temp1)
+ }
+
+ sort (temp1, col=1, num+, > temp2)
+ delete (temp1, verify-)
+
+ fd2 = temp2
+ if (fscan (fd2, r1, d1, data1) == EOF);
+ while (fscan (fd2, r2, d2, data2) != EOF) {
+ if (keepcoords)
+ printf (fmtstr, n, r1, d1, data1, >> temp3)
+ else
+ printf (fmtstr, n, data1, >> temp3)
+ skysep (r1, d1, r2, d2, raunit=raunit, verb-)
+ if (skysep.sep <= sep) {
+ r1 = r2; d1 = d2; data1 = data2
+ next
+ }
+
+ n += 1
+ r1 = r2; d1 = d2; data1 = data2
+ }
+ fd2 = ""; delete (temp2, verify-)
+
+ if (keepcoords)
+ printf (fmtstr, n, r1, d1, data1, >> temp3)
+ else
+ printf (fmtstr, n, data1, >> temp3)
+
+ # Now write out the lists and check for duplicate which must be
+ # merged.
+
+ sort (temp3, col=1, num+, > temp1); delete (temp3, verify-)
+ touch (temp2)
+ fd1 = temp1
+ if (fscan (fd1, i, data1) == EOF);
+ while (fscan (fd1, j, data2) != EOF) {
+ if (data1 == data2) {
+ print (j, i, >> temp2)
+ next
+ }
+ printf ("%s_%03d%s\n", out, i, extn) | scan (fname)
+ print (data1, >> fname)
+ i = j; data1 = data2
+ }
+ fd1 = ""; delete (temp1, verify-)
+ printf ("%s_%03d%s\n", out, i, extn) | scan (fname)
+ print (data1, >> fname)
+ sort (temp2, col=1, num+, rev+) | unique (> temp1)
+ delete (temp2, verify-)
+
+ # Merge the lists.
+ n1 = n
+ fd1 = temp1
+ while (fscan (fd1, j, i) != EOF) {
+ printf ("%s_%03d%s\n", out, j, extn) | scan (fname)
+ if (access (fname)) {
+ printf ("%s_%03d%s\n", out, i, extn) | scan (in)
+ concat (in, fname, append+)
+ delete (in, verify-)
+ n1 -= 1
+ }
+ }
+ fd1 = ""; delete (temp1, verify-)
+
+ # Renumber if needed.
+ if (n1 != n) {
+ i = 1
+ for (j=1; j<=n; j+=1) {
+ printf ("%s_%03d%s\n", out, j, extn) | scan (fname)
+ if (access(fname)) {
+ if (i != j) {
+ printf ("%s_%03d%s\n", out, i, extn) | scan (in)
+ rename (fname, in)
+ }
+ i += 1
+ }
+ }
+ }
+
+ # Create the final output list of lists.
+ files (out//"_[0-9]*", > out//extn)
+end