aboutsummaryrefslogtreecommitdiff
path: root/vo/votools/t_sbquery.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 /vo/votools/t_sbquery.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'vo/votools/t_sbquery.x')
-rw-r--r--vo/votools/t_sbquery.x406
1 files changed, 406 insertions, 0 deletions
diff --git a/vo/votools/t_sbquery.x b/vo/votools/t_sbquery.x
new file mode 100644
index 00000000..cba977ef
--- /dev/null
+++ b/vo/votools/t_sbquery.x
@@ -0,0 +1,406 @@
+#
+
+# SBQUERY -- Call the IMCCE SkyBoT (Sky Bodies Tracker) service to locate
+# minor planets within a radius at a given position and epoch.
+#
+
+include <time.h>
+
+
+# Possible fields.
+define SB_FIELDS "|num|name|class|ra|dec|vmag|poserr|cdist|dra|ddec|\
+ |dgeo|dhelio|px|py|pz|vx|vy|vz|jd0|"
+
+define SB_NFIELDS 20 # accounts for the newline
+
+define SB_KNUM "NUM" # keywords
+define SB_KNAME "NAME"
+define SB_KCLASS "CLASS"
+define SB_KRA "RA"
+define SB_KDEC "DEC"
+define SB_KVMAG "VMAG"
+define SB_KPOSERR "POSERR"
+define SB_KCDIST "CDIST"
+define SB_KDRA "DRA"
+define SB_KDDEC "DDEC"
+define SB_KDGEO "DGEO"
+define SB_KDHELIO "DHELIO"
+define SB_KPX "PX"
+define SB_KPY "PY"
+define SB_KPZ "PZ"
+define SB_KVX "VX"
+define SB_KVY "VY"
+define SB_KVZ "VZ"
+define SB_KJD0 "JD0"
+
+define SB_LNUM "number" # attribute keywords
+define SB_LNAME "name"
+define SB_LCLASS "class"
+define SB_LRA "ra"
+define SB_LDEC "dec"
+define SB_LVMAG "vmag"
+define SB_LPOSERR "poserr"
+define SB_LCDIST "cdist"
+define SB_LDRA "dra"
+define SB_LDDEC "ddec"
+define SB_LDGEO "dgeo"
+define SB_LDHELIO "dhelio"
+define SB_LPX "px"
+define SB_LPY "py"
+define SB_LPZ "pz"
+define SB_LVX "vx"
+define SB_LVY "vy"
+define SB_LVZ "vz"
+define SB_LJD0 "jd0"
+
+define SB_FNUM 1 # field numbers
+define SB_FNAME 2
+define SB_FCLASS 3
+define SB_FRA 4
+define SB_FDEC 5
+define SB_FVMAG 6
+define SB_FPOSERR 7
+define SB_FCDIST 8
+define SB_FDRA 9
+define SB_FDDEC 10
+# NL
+define SB_FDGEO 12
+define SB_FDHELIO 13
+define SB_FPX 14
+define SB_FPY 15
+define SB_FPZ 16
+define SB_FVX 17
+define SB_FVY 18
+define SB_FVZ 19
+define SB_FJD0 20
+
+define SB_FREAL "%-10.4f"
+define SB_FWSTRING "%-12s"
+define SB_FSTRING "%-10s"
+define SB_FINTEGER "%10d"
+define SB_FSEX "%-012h"
+
+
+
+procedure t_sbquery ()
+
+pointer sp, fields, fieldstr, epoch
+double ra, dec, sr, ut, jd_epoch
+int sb, nobjs, nfields, i, gmtco
+int tm[LEN_TMSTRUCT]
+bool fmt
+long otime, ntime
+
+real clgetr()
+bool clgetb(), streq()
+int vx_initVOClient(), vx_skybotnobjs(), vx_skybot()
+int sb_fields()
+long clktime()
+double ast_date_to_julday()
+
+begin
+ call smark (sp)
+ call salloc (epoch, SZ_FNAME, TY_CHAR)
+ call salloc (fields, SZ_LINE, TY_INT)
+ call salloc (fieldstr, SZ_LINE, TY_CHAR)
+
+ call aclrs (Memc[epoch], SZ_FNAME)
+ call aclri (Memc[fields], SZ_LINE)
+ call aclrs (Memc[fieldstr], SZ_LINE)
+
+
+ ra = clgetr ("ra") # Get the parameters
+ dec = clgetr ("dec")
+ sr = clgetr ("sr")
+ call clgstr ("epoch", Memc[epoch], SZ_LINE)
+ if (streq (Memc[epoch], "now")) {
+ # Handle the special case of 'now', i.e. find out what time it is.
+ call zgmtco (gmtco)
+ call brktime (clktime(0)+gmtco, tm)
+ ut = real (TM_HOUR(tm)) +
+ (real(TM_MIN(tm))/60.) +
+ (real(TM_SEC(tm))/3600.)
+ jd_epoch = ast_date_to_julday (TM_YEAR(tm), TM_MONTH(tm),
+ TM_MDAY(tm), ut)
+
+ } else {
+ # Convert the user-supplied epoch.
+ call sscan (Memc[epoch])
+ call gargd (jd_epoch)
+ }
+ call clgstr ("fields", Memc[fieldstr], SZ_LINE)
+ fmt = clgetb ("fmt")
+
+ if (vx_initVOClient("") == ERR) { # Initialize
+ call clputi ("status", ERR)
+ return
+ }
+
+ if (fmt) {
+ call printf ("#\n# Search Terms: ")
+ call printf ("Position=(%H,%h) sr=%.1f epoch=%.4f\n")
+ call pargd (ra)
+ call pargd (dec)
+ call pargd (sr)
+ call pargd (jd_epoch)
+ call printf ("#\n")
+ call flush (STDOUT)
+ }
+
+ # Call the service
+ otime = clktime (0)
+ sb = vx_skybot (ra, dec, sr, sr, jd_epoch)
+ ntime = clktime (otime)
+
+ if (sb != NULL) {
+ nobjs = vx_skybotnobjs (sb)
+ if (fmt) {
+ call printf ("# Found %d objects in %d seconds\n#\n")
+ call pargi (nobjs)
+ call pargl (ntime)
+ }
+ } else {
+ call eprintf ("Error in calling SkyBoT service\n")
+ call sfree (sp)
+ call clputi ("status", ERR)
+ call vx_closeVOClient (0)
+ return
+ }
+
+ # Get the selected fields.
+ nfields = sb_fields (Memc[fieldstr], Memi[fields], SB_NFIELDS)
+ if (nfields <= 0) {
+ call vx_closeVOClient (0)
+ call sfree (sp)
+ return
+ }
+
+ # Finally, print the table of results.
+ if (fmt)
+ call sb_pheader (Memi[fields], nfields)
+ for (i=0; i < nobjs; i=i+1)
+ call sb_print (sb, i, Memi[fields], nfields)
+
+ call vx_closeVOClient (0)
+
+ call clputi ("status", OK)
+end
+
+
+# SB_FIELDS -- Procedure to decode the fields string into a list of the
+# fields to be printed.
+
+int procedure sb_fields (fieldstr, fields, max_nfields)
+
+char fieldstr[ARB] #I string containing the list of fields
+int fields[ARB] #O fields array
+int max_nfields #I maximum number of fields
+
+int nfields, flist, field
+pointer sp, fname
+int fntopenb(), fntgfnb(), strdic()
+
+begin
+ nfields = 0
+
+ call smark (sp)
+ call salloc (fname, SZ_FNAME, TY_CHAR)
+
+ flist = fntopenb (fieldstr, NO)
+ while (fntgfnb (flist, Memc[fname], SZ_FNAME) != EOF &&
+ (nfields < max_nfields)) {
+ field = strdic (Memc[fname], Memc[fname], SZ_FNAME, SB_FIELDS)
+ if (field == 0)
+ next
+ nfields = nfields + 1
+ fields[nfields] = field
+ }
+ call fntclsb (flist)
+
+ call sfree (sp)
+
+ return (nfields)
+end
+
+
+# SB_PHEADER -- Print the banner fields.
+
+procedure sb_pheader (fields, nfields)
+
+int fields[ARB] # fields to be printed
+int nfields # number of fields
+
+int i
+
+begin
+ call printf ("#")
+ do i = 1, nfields {
+
+ switch (fields[i]) {
+ case SB_FNUM:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KNUM)
+ case SB_FNAME:
+ call printf (SB_FWSTRING)
+ call pargstr (SB_KNAME)
+ case SB_FCLASS:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KCLASS)
+ case SB_FRA:
+ call printf (SB_FWSTRING)
+ call pargstr (SB_KRA)
+ case SB_FDEC:
+ call printf (SB_FWSTRING)
+ call pargstr (SB_KDEC)
+ case SB_FVMAG:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KVMAG)
+ case SB_FPOSERR:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KPOSERR)
+ case SB_FCDIST:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KCDIST)
+ case SB_FDRA:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KDRA)
+ case SB_FDDEC:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KDDEC)
+ case SB_FDGEO:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KDGEO)
+ case SB_FDHELIO:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KDHELIO)
+ case SB_FPX:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KPX)
+ case SB_FPY:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KPY)
+ case SB_FPZ:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KPZ)
+ case SB_FVX:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KVX)
+ case SB_FVY:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KVY)
+ case SB_FVZ:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KVZ)
+ case SB_FJD0:
+ call printf (SB_FSTRING)
+ call pargstr (SB_KJD0)
+ }
+ }
+ call printf ("\n")
+ call flush (STDOUT)
+end
+
+
+# SB_PRINT -- Print the banner fields.
+
+procedure sb_print (sb, objnum, fields, nfields)
+
+int sb # skybot pointer
+int objnum # skybot result number
+int fields[ARB] # fields to be printed
+int nfields # number of fields
+
+int i, len
+char buf[SZ_LINE]
+double dval
+
+int vx_skybotstr()
+double vx_skybotdbl()
+
+begin
+ do i = 1, nfields {
+ call aclrs (buf, SZ_LINE)
+
+ switch (fields[i]) {
+ case SB_FNUM:
+ len = vx_skybotstr (sb, SB_LNUM, objnum, buf, SZ_FNAME)
+ call printf (SB_FSTRING)
+ call pargstr (buf)
+ case SB_FNAME:
+ len = vx_skybotstr (sb, SB_LNAME, objnum, buf, SZ_FNAME)
+ call printf (SB_FWSTRING)
+ call pargstr (buf)
+ case SB_FCLASS:
+ len = vx_skybotstr (sb, SB_LCLASS, objnum, buf, SZ_FNAME)
+ call printf (SB_FSTRING)
+ call pargstr (buf)
+
+ case SB_FRA:
+ dval = vx_skybotdbl (sb, SB_LRA, objnum)
+ call printf (SB_FSEX)
+ call pargd (dval)
+ case SB_FDEC:
+ dval = vx_skybotdbl (sb, SB_LDEC, objnum)
+ call printf (SB_FSEX)
+ call pargd (dval)
+ case SB_FVMAG:
+ dval = vx_skybotdbl (sb, SB_LVMAG, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FPOSERR:
+ dval = vx_skybotdbl (sb, SB_LPOSERR, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FCDIST:
+ dval = vx_skybotdbl (sb, SB_LCDIST, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FDRA:
+ dval = vx_skybotdbl (sb, SB_LDRA, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FDDEC:
+ dval = vx_skybotdbl (sb, SB_LDDEC, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FDGEO:
+ dval = vx_skybotdbl (sb, SB_LDGEO, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FDHELIO:
+ dval = vx_skybotdbl (sb, SB_LDHELIO, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FPX:
+ dval = vx_skybotdbl (sb, SB_LPX, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FPY:
+ dval = vx_skybotdbl (sb, SB_LPY, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FPZ:
+ dval = vx_skybotdbl (sb, SB_LPZ, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FVX:
+ dval = vx_skybotdbl (sb, SB_LVX, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FVY:
+ dval = vx_skybotdbl (sb, SB_LVY, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FVZ:
+ dval = vx_skybotdbl (sb, SB_LVZ, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ case SB_FJD0:
+ dval = vx_skybotdbl (sb, SB_LJD0, objnum)
+ call printf (SB_FREAL)
+ call pargd (dval)
+ }
+ }
+ call printf ("\n")
+ call flush (STDOUT)
+end