summaryrefslogtreecommitdiffstats
path: root/funtools/filter/tl.c
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/filter/tl.c')
-rw-r--r--funtools/filter/tl.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/funtools/filter/tl.c b/funtools/filter/tl.c
new file mode 100644
index 0000000..a5aa346
--- /dev/null
+++ b/funtools/filter/tl.c
@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "word.h"
+#include "tl.h"
+
+#ifndef UNUSED
+#ifdef __GNUC__
+# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
+#else
+# define UNUSED(x) UNUSED_ ## x
+#endif
+#endif
+
+/*
+ * getfitsfloatcenter: funtools and cfitsio have a 0.5 pixel descrepancy
+ * when converting floating point physical coords to image coords.
+ * setting this environment variable makes funtools work like cfitsio
+ */
+static double fitscenval=0.5;
+static int ceninited=0;
+#ifdef ANSI_FUNC
+static double getfitsfloatcenter(void)
+#else
+static double getfitsfloatcenter()
+#endif
+{
+ char *s=NULL;
+ if( !ceninited ){
+ if( (s=getenv("FILTER_CFITSIO")) && istrue(s) ){
+ fitscenval = 1.0;
+ }
+ ceninited = 1;
+ }
+ return fitscenval;
+}
+
+#ifdef ANSI_FUNC
+double
+tlp2i (double dp, double tlmin, double binsiz, int type)
+#else
+double tlp2i (dp, tlmin, binsiz, type)
+ double dp;
+ double tlmin;
+ double binsiz;
+ int type;
+#endif
+{
+ double dval = getfitsfloatcenter();
+ if( (binsiz == 1.0) || (binsiz <= 0.0) ){
+ switch(type){
+ case 'B':
+ case 'I':
+ case 'U':
+ case 'J':
+ case 'K':
+ case 'V':
+ default:
+ return ((dp - tlmin) + 1.0);
+ case 'E':
+ case 'D':
+ return ((dp - tlmin) + dval);
+ }
+ }
+ else{
+ switch(type){
+ case 'B':
+ case 'I':
+ case 'U':
+ case 'J':
+ case 'K':
+ case 'V':
+ default:
+ return ((dp - tlmin)/binsiz + 1.0);
+ case 'E':
+ case 'D':
+ return ((dp - tlmin)/binsiz + dval);
+ }
+ }
+}
+
+#ifdef ANSI_FUNC
+int
+itlp2i (double dp, double tlmin, double binsiz, int UNUSED(type))
+#else
+int itlp2i (dp, tlmin, binsiz, type)
+ double dp;
+ double tlmin;
+ double binsiz;
+ int type;
+#endif
+{
+ if( (binsiz == 1.0) || (binsiz <= 0.0) ){
+ return (int)((dp - tlmin) + 1.0);
+ }
+ else{
+ return (int)((dp - tlmin)/binsiz + 1.0);
+ }
+}
+
+#ifdef ANSI_FUNC
+double
+tli2p (double di, double tlmin, double binsiz, int type)
+#else
+double tli2p (di, tlmin, binsiz, type)
+ double di;
+ double tlmin;
+ double binsiz;
+ int type;
+#endif
+{
+ double dval = getfitsfloatcenter();
+ if( (binsiz == 1.0) || (binsiz <= 0.0) ){
+ switch(type){
+ case 'B':
+ case 'I':
+ case 'U':
+ case 'J':
+ case 'K':
+ case 'V':
+ default:
+ return ((di - 1.0) + tlmin);
+ case 'E':
+ case 'D':
+ return ((di - dval) + tlmin);
+ }
+ }
+ else{
+ switch(type){
+ case 'B':
+ case 'I':
+ case 'U':
+ case 'J':
+ case 'K':
+ case 'V':
+ default:
+ return ((di - 1.0)*binsiz + tlmin);
+ case 'E':
+ case 'D':
+ return ((di - dval)*binsiz + tlmin);
+ }
+ }
+}
+
+#ifdef ANSI_FUNC
+double
+tldim (double tlmin, double tlmax, double binsiz, int type)
+#else
+double tldim (tlmin, tlmax, binsiz, type)
+ double tlmin;
+ double tlmax;
+ double binsiz;
+ int type;
+#endif
+{
+ if( (binsiz == 1.0) || (binsiz <= 0.0) ){
+ switch(type){
+ case 'B':
+ case 'I':
+ case 'U':
+ case 'J':
+ case 'K':
+ case 'V':
+ default:
+ return ((tlmax-tlmin) + 1.0);
+ case 'E':
+ case 'D':
+ return (tlmax-tlmin);
+ }
+ }
+ else{
+ switch(type){
+ case 'B':
+ case 'I':
+ case 'U':
+ case 'J':
+ case 'K':
+ case 'V':
+ default:
+ return ((tlmax-tlmin)/binsiz + 1.0);
+ case 'E':
+ case 'D':
+ return ((tlmax-tlmin)/binsiz);
+ }
+ }
+}
+