summaryrefslogtreecommitdiffstats
path: root/funtools/funtest/funstack
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/funtest/funstack')
-rwxr-xr-xfuntools/funtest/funstack86
1 files changed, 86 insertions, 0 deletions
diff --git a/funtools/funtest/funstack b/funtools/funtest/funstack
new file mode 100755
index 0000000..bbcfc3d
--- /dev/null
+++ b/funtools/funtest/funstack
@@ -0,0 +1,86 @@
+#!/bin/sh
+
+if [ x"$3" = x ]; then
+ echo "usage: $0 ifile ofile regions"
+ echo "The regions specification should be in physical coords and can be:"
+ echo " a region string e.g. 'circle 512 512 .1;box(606,606,3,4)'"
+ echo " a region file e.g. 'foo.reg' (nb: s9 file OK, but no @ prefix)"
+ exit 1
+fi
+
+# input parameters
+IFILE=$1
+OFILE=$2
+REGIONS=$3
+
+# temporary fits file
+TFITS=./tfunstack.fits
+rm -f ${TFITS}
+
+# temporary funcalc command file
+TFC=./tfunstack.fc
+rm -f ${TFC}
+
+# convert file to region string, if necessary
+if [ -r "${REGIONS}" ]; then
+ REGIONS=`cat ${REGIONS} | awk '{print $0";"}'`
+fi
+
+# generate the funcalc command file from region string
+# we do this so that awk can parse the region and add in the region centers
+echo "${REGIONS}" | \
+sed '/^physical/d;s/[\(\),]/ /g' | \
+sed '/^#/d;/^global/d' | \
+awk 'BEGIN{RS=";"};
+BEGIN{
+ print "local"
+ print "int nreg;"
+ print "int xdim, ydim;"
+ print "double xmin, xmax, umin, ymax;"
+ print "double xref, yref;"
+ print "double xreg[1024], yreg[1024];"
+ print "end"
+ print "before"
+ print "FunInfoGet(fun, FUN_SECT_DIM1, &xdim, FUN_SECT_DIM2, &ydim, 0);"
+ print "FunInfoGet(fun, FUN_MIN1, &xmin, FUN_MAX1, &xmax, 0);"
+ print "FunInfoGet(fun, FUN_MIN2, &ymin, FUN_MAX2, &ymax, 0);"
+ print "xref = (xmin + xmax)/2.0;"
+ print "yref = (ymin + ymax)/2.0;"
+ i=1
+};
+{
+ if( ($1!="polygon") && ($1!="pie") ){
+ if( ($2 != "") && ($3 != "") ){
+ print "xreg["i"]="$2";"
+ print "yreg["i"]="$3";"
+ i = i+1
+ }
+ if( i >= 1024 ){
+ printf "ERROR: too many regions (1024 max)" > "dev/stderr"
+ exit
+ }
+ }
+}
+END{
+ print "nreg="i-1";"
+ print "end"
+ print "if( cur->region > nreg ){"
+ print " gerror(stderr, \"%d exceeds input reg %d\\n\", cur-> region, nreg);"
+ print " exit(1);"
+ print "}"
+ print "cur->x = cur->x - xreg[cur->region] + xref;"
+ print "cur->y = cur->y - yreg[cur->region] + yref;"
+}' > ${TFC}
+
+# funtools seems to rearrange the order of columns when $REGION is specified
+# so here we get the column names explicitly to preserve order
+COLS=`funhead ${IFILE} | egrep 'TTYPE[0-9]' | awk '{print $3}' | sed "s/'//g"`
+
+# first filter the input file and preserve the region ids
+funtable ${IFILE}"[${REGIONS}]" ${TFITS} "${COLS} "'$REGION'
+
+# now run the funcalc script to stack the events
+funcalc -f ${TFC} ${TFITS} ${OFILE}
+
+# clean up
+rm -f ${TFC} ${TFITS}