diff options
Diffstat (limited to 'funtools/doc/funtools.ps')
-rw-r--r-- | funtools/doc/funtools.ps | 11446 |
1 files changed, 11446 insertions, 0 deletions
diff --git a/funtools/doc/funtools.ps b/funtools/doc/funtools.ps new file mode 100644 index 0000000..210149e --- /dev/null +++ b/funtools/doc/funtools.ps @@ -0,0 +1,11446 @@ +%!PS +%%Title: The Funtools Help Facility +%%Creator: html2ps version 1.0 beta5 +%%EndComments +save +2000 dict begin +/d {bind def} bind def +/D {def} d +/t true D +/f false D +/FL [/Times-Roman +/Times-Italic +/Times-Bold +/Times-BoldItalic +/Courier +/Courier-Oblique +/Courier-Bold +/Courier-BoldOblique +/Helvetica +/Helvetica-Oblique +/Helvetica-Bold +/Helvetica-BoldOblique] D +/WF t D +/WI 0 D +/F 1 D +/IW 471 F div D +/IL 621 F div D +/PS 791 D +/EF [0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 2] D +/EZ [11 9 19 17 15 13 12 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 8 8] D +/Ey [0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] D +/EG [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] D +/Tm [1 1 0.8 0.8 0.8 0.8 0.8 0.8 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1.3 0 0] D +/Bm [1 1 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1 0 0] D +/Lm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 2 0 0 0] D +/Rm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0] D +/EU [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0] D +/NO t D +/YY [[{()}1][{()}0][{()}2]] D +/ZZ [[{()}1][{()}0][{()}2]] D +/Ts EZ 0 get D +/TU f D +/Xp t D +/AU t D +/SN 0 D +/Cf f D +/Tp f D +/Fe f D +/TI 1 Ts mul D +/Fm 14 D +/xL 71 D +/xR 71 D +/yL 706 D +/yR 706 D +/Wl 471 F div D +/Wr 471 F div D +/hL 621 F div D +/hR 621 F div D +/FE {newpath Fm neg Fm M CP BB IW Fm add Fm L IW Fm add IL Fm add neg L CP BB + Fm neg IL Fm add neg L closepath} D +/LA {PM 0 eq{/IW Wl D /IL hL D}{/IW Wr D /IL hR D}ie /W IW D /LL W D /LS W D + TU PM 0 eq and{IW 56 F div add SA{Sf div}if 0 translate} + {PM 0 eq{xL yL}{xR yR}ie translate F SA{Sf mul}if dup scale + CS CF FS Cf{CA CL get VC}if /Bb f D}ie 0 0 M + TF not Tc or {Cf{gsave SA{1 Sf div dup scale}if Cb VC FE fill grestore}if}if}D +/Pi 0 Ts mul D +/SG [0.8 1 1] D +/Ab 15 D +/J 0 D +/Tc t D +/NH 6 D +/Nf f D +/Pa f D +/LH 1.2 D +/XR f D +/Xr {/pN E D ( [p ) WB pN WB (] )WB} D +/Db [16#FF 16#FF 16#FF] D +/Dt [16#00 16#00 16#00] D +/eA f D +/Fi f D +/bT f D +/Lc t D +/Dl [16#00 16#00 16#00] D +/LX f D +/Br 0.25 D +/IA ([IMAGE]) D +/DS {/PF f D()WB NL NP()pop RC ZF} D +/Gb f D +/Mb t D +/Hc [16#00 16#00 16#00] D +/Bl 3 D +/MI -15.2 D +/DX (DRAFT) D +/Di 0 D +/Tt 113.385826771654 D +/Th {()2 Al()BR ( + ) 0 1 -1 H()4 FZ Ti ES()EH ( + ) 0 2 -1 H() ME 0 get join EH()Ea()BR()} D +/tH {()0 1 -1 H (Table of Contents) EH()} D +/FD 2 D +/Dy 2 D +/cD [16#F0 16#F0 16#F0] D +/FW 0.6 D +/FU [16#00 16#00 16#00] D +/ET {/RM f D /A0 0 D /PN SN D /OU t D /Ou t D /W IW D /LL W D D1 + Ms not TP and{Ip}if /TF f D} D +[{true statusdict/setduplexmode get exec} stopped cleartomark +%-- End of variable part -- +/MySymbol 10 dict dup begin + /FontType 3 D /FontMatrix [.001 0 0 .001 0 0 ] D /FontBBox [25 -10 600 600] D + /Encoding 256 array D 0 1 255{Encoding exch /.notdef put}for + Encoding (e) 0 get /euro put + /Metrics 2 dict D Metrics begin + /.notdef 0 D + /euro 651 D + end + /BBox 2 dict D BBox begin + /.notdef [0 0 0 0] D + /euro [25 -10 600 600] D + end + /CharacterDefs 2 dict D CharacterDefs begin + /.notdef {} D + /euro{newpath 114 600 moveto 631 600 lineto 464 200 lineto 573 200 lineto + 573 0 lineto -94 0 lineto 31 300 lineto -10 300 lineto closepath clip + 50 setlinewidth newpath 656 300 moveto 381 300 275 0 360 arc stroke + -19 350 moveto 600 0 rlineto -19 250 moveto 600 0 rlineto stroke}d + end + /BuildChar{0 begin + /char E D /fontdict E D /charname fontdict /Encoding get char get D + fontdict begin + Metrics charname get 0 BBox charname get aload pop setcachedevice + CharacterDefs charname get exec + end + end}D + /BuildChar load 0 3 dict put /UniqueID 1 D +end +definefont pop + +/Cd {aload length 2 idiv dup dict begin {D} repeat currentdict end} D +/EX {EC cvx exec} D +/DU {} d +/BB {pop pop}d +/ie {ifelse} d +/E {exch} d +/M {moveto} d +/R {rmoveto} d +/L {lineto} d +/RL {rlineto} d +/CP {currentpoint} d +/SW {stringwidth} d +/GI {getinterval} d +/PI {putinterval} d +/Sg {setgray} d +/LW {setlinewidth} d +/S {dup () ne OU and{0 Co R AT 3 eq LB and HF not and A1 0 ne A2 0 ne or and + {A2 0 32 A1 0 6 -1 roll awidthshow}{show}ie 0 Co neg R}{pop}ie + OU PH 3 eq or{/Ms t D}if} D +/U {OU{gsave CP currentfont /FontInfo get /UnderlinePosition get + 0 E currentfont /FontMatrix get dtransform E pop add newpath M dup SW pop + CJ 0 RL stroke grestore}if} D +/B {OU Br 0 gt and{CP Ts neg Ts .33 mul R gsave 0 Sg + CP newpath Ts Br mul 0 360 arc closepath UI 2 mod 0 eq{stroke}{fill}ie + grestore M CP E Ts Br 1 add mul sub E BB /Ms t D}if}D +/NP {Ms TP not or PA and OU and{TP{OR}if f1{mF k2 /mF E D /YC 0 D}if + TP TU not PM 0 eq or and{showpage}if DU Ip TE not{LA}if 0.6 LW + /CI 0 D /TP t D /Hs f D /hl 6 D /Hv 6 D /HI hi D /Ms f D}if Bs XO BO M} D +/Np {LE sub CP E pop gt PL 0 eq and{NP}if}D +/Ip {/PN PN 1 add D /Pn RM{1}{4}ie PN Ns D /PM PN SN sub 2 mod D} D +/GP {E dup 3 -1 roll get PN 1 add 2 mod get dup type /integertype eq + {get 0 get}{E pop}ie}d +/Fc {dup 2 GP exec SW pop /S1 E D dup 1 GP exec SW pop /S2 E D 0 GP exec SW + pop /S3 E D S1 0 gt{S2 2 mul S1 add S3 2 mul S1 add 2 copy lt{E}if pop}{0}ie + S2 S3 add 2 copy lt{E}if pop IW .9 mul div dup 1 gt{1 E div}{pop 1}ie}D +/OR {Df{Sd}if tp not{gsave SA{1 Sf div dup scale}if Fe{Cf{FU VC}if FW LW + 1 setlinejoin FE stroke}if /YO {60 F div dup 40 gt{pop 40}if}D /cs CS D + /cf CF D /CF 0 D /pf PF D /PF f D /Fn FN D /At AT D /AT 0 D /FN EF Hf 1 add + get D Fz Fs FS ZZ Fc Fz mul Fs FS EU Hf 1 add get dup type /arraytype eq + Cf and{VC}{pop 0 Sg}ie IW IL neg YO sub M ZZ 1 GP exec dup SW pop neg 0 R Sh + 0 IL neg YO sub M ZZ 0 GP exec Sh ZZ 2 GP exec dup SW pop IW E sub 2 div + IL neg YO sub M Sh Fz Fs FS NO{/AW IW Pn SW pop sub D AW 2 div IL neg YO sub + S1 0 gt S2 AW .45 mul gt or S3 AW .45 mul gt or{Fz 2 mul sub}if M Pn Sh}if + EU Hf get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie YY Fc /FN EF Hf get D + Hz mul HS FS IW YO M YY 1 GP exec dup SW pop neg 0 R Sh 0 YO M YY 0 GP exec Sh + YY 2 GP exec dup SW pop IW E sub 2 div YO M Sh /FN Fn D /AT At D t Pb XO SZ + SL get neg R /PF pf D grestore /CF 0 D cs cf FS}if}D +/Sh {dup () ne{CP Hz 4 div sub BB show CP CS add BB}{pop}ie}D +/Pb {/OU E D /Ou OU D /PB t D 0 0 M Ba{/Sa save D /BP t D /Fl t D RC /PL 0 D + /PH 0 D /W IW D /LE IL .7 mul D /EO 0 D SI ZF /YA 0 D /BO 0 D /C1 () D + BA 0 Ts neg R Bb{Xl Yl Xh Yh}if Bb CP Sa restore M + {/Yh E D /Xh E D /Yl E D /Xl E D}if /Fl t D}if + BL /OU t D /HM f D /Ou t D /PB f D} D +/Bs {/BP Ba not D}D +/reencodeISO { + dup dup findfont dup length dict begin{1 index /FID ne{D}{pop pop}ie}forall + /Encoding ISOLatin1Encoding D currentdict end definefont} D +/ISOLatin1Encoding [ +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright +/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash +/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon +/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N +/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright +/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m +/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/space/exclamdown/cent/sterling/currency/yen/brokenbar +/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot +/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown +/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex +/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute +/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave +/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex +/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis +/yacute/thorn/ydieresis +] D +[128/backslash 129/parenleft 130/parenright 141/circumflex 142/tilde +143/perthousand 144/dagger 145/daggerdbl 146/Ydieresis 147/scaron 148/Scaron +149/oe 150/OE 151/guilsinglleft 152/guilsinglright 153/quotesinglbase +154/quotedblbase 155/quotedblleft 156/quotedblright 157/endash 158/emdash +159/trademark] +aload length 2 idiv 1 1 3 -1 roll{pop ISOLatin1Encoding 3 1 roll put}for +/colorimage where{pop}{ + /colorimage { + pop pop /Pr E D {/Cv Pr D /Gr Cv length 3 idiv string D 0 1 Gr length 1 sub + {Gr E dup /i E 3 mul D Cv i get 0.299 mul Cv i 1 add get 0.587 mul add + Cv i 2 add get 0.114 mul add cvi put}for Gr} image} D +}ie +/pdfmark where{pop}{userdict /pdfmark /cleartomark load put}ie +WF{FL{reencodeISO D}forall}{4 1 FL length 1 sub{FL E get reencodeISO D}for}ie +/Symbol dup dup findfont dup length dict begin + {1 index /FID ne{D}{pop pop}ie}forall /Encoding [Encoding aload pop] + dup 128 /therefore put D currentdict end definefont D + +/SF {/CS E D SZ SL CS put FO SL FN put /YI CS LH neg mul D dup ST cvs ( ) join + CS ST cvs join C1 E join ( NF ) join /C1 E D CS NF /Wf WF FN 0 gt or D + /BW Wf{( ) SW pop}{0}ie D}D +/NF {/cS E D /cF E D cF 0 ge{FL cF get}{cF -1 eq{/Symbol}{/MySymbol}ie}ie + findfont cS scalefont setfont} D +/FS {CF or /CF E D FR SL CF put CF CF 0 ge{FN 4 mul add}if E SF} D +/PC {SH /BP f D fin not GL not and{NL}if /HM t D /LL LS D} D +/BS {/TX E D Wf{/fin f D /CW 0 D /LK 0 D /SC 0 D + /RT TX D {RT ( ) search{/NW E D pop /RT E D /WH NW SW pop D CW WH add LL gt + {TX SC LK SC sub 1 sub NN GI GL{SH cF cS OC + 2 copy cS ne E cF ne or{NF}{pop pop}ie}{PC /CW WH BW add D}ie + /SC LK D} + {GL{JC}if + /CW CW WH add BW add D /HM t D}ie /GL f D /Ph f D + /LK LK NW length 1 add add D}{pop exit}ie}loop + /fin t D TX SC LK SC sub GI SH RT () ne{GL not{CC}if}if + /LC TX length D /WH RT SW pop D CW WH add Hy{HC SW pop add}if LL gt + {RT GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie + Hy{/Ph t D}if /LL LS D}{NL /LL LS D SH}ie} + {RT PC Hy{CC}if /Ph Ph Hy or D}ie RT () ne{/GL t D /HM t D}if} + {TX SW pop LL le{TX SH}{/NW () D 0 2 TX length 1 sub + {/CW E D TX 0 CW GI dup SW pop LL gt{pop NW SH /HM t D NL/LL W XO sub MR sub D + /CW CW 2 sub NN D /TX TX CW TX length CW sub GI D TX BS exit} + {/NW E D}ie}for}ie}ie /HM t D}D +/CC {C0 length 0 gt{JC}if /C0 [C1 L1 YA YB Mf NS NB TB AF Bw] D + /C1 () D /L0 L1 D /YA 0 D /YB 0 D /Mf 0 D /NS 0 D /NB 0 D}D +/JC {C0 aload length 0 gt{pop pop pop NB add /NB E D NS add /NS E D + dup Mf gt{/Mf E D}{pop}ie dup YB gt{/YB E D}{pop}ie + dup YA gt{/YA E D}{pop}ie pop C1 join /C1 E D /C0 [] D}if}D +/OC {C0 length 0 gt{C1 L1 L0 sub YA YB Mf NS NB TB AF Bw GL C0 aload pop + /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /C0 [] D + /L1 E D /C1 E D Ph{HC SH}if NL /GL E D /Bw E D /AF E D /TB E D /NB E D /NS E D + /Mf E D /YB E D /YA E D /L1 E D /LL W L1 sub XO sub MR sub WH sub D /CW 0 D + C1 E join /C1 E D}if}D +/BT {/LB t D dup length string copy RS dup dup () ne E ( ) ne and + {/CI 0 D /LS LL D /LL W L1 sub XO sub MR sub D BS} + {dup ( ) eq{/GL f D}if dup () eq L1 0 eq or{pop}{SH /BP f D /Ph f D}ie}ie + /LB f D} D +/BL {CP E pop XO E M} D +/NL {JC /GL f D /SK W XO sub MR sub L1 sub TB{Bw add}if D + /YA LF{Mf HM Fl not and PF or{LH mul}if}{0 /LF t D}ie YA 2 copy lt{E}if pop D + C1 () ne{/FB YB Mf SA{Sf mul}if 4 div 2 copy lt{E}if pop D}if Fl{/Ya YA D}if + CP E pop YA sub YB sub LE neg lt Fl not and PB not and{NP}if NT TL BL + OU PF not and PB or{/RE L1 TB{Bw sub}if + W XO sub MR sub div YA YB add LE BO add div 2 copy lt{E}if pop D + RE 1 gt{BL 1 RE div dup scale}if}if + AT 2 le{SK AT mul 2 div YA neg R}if + AT 3 eq{0 YA neg R TB{/NB NB 1 sub D /NS NS 1 sub D}if /NB NB 1 sub NN D + /A3 NS 6 mul NB add D NS NB add 0 eq + {/A1 0 D /A2 0 D} + {NS 0 eq{/A1 SK NB div dup J gt{pop 0}if D /A2 0 D}{J A3 mul SK lt + {/A1 J D /A2 SK J NB mul sub NS div dup Ab gt{/A1 0 D pop 0}if D} + {/A1 SK A3 div D /A2 A1 6 mul D}ie}ie}ie /A1 A1 NN D /A2 A2 NN D}if + AT 4 eq{0 YA neg R PH 2 le{PD 0 lt{/PD L1 D}if PD M1 gt{/M1 PD D}if + L1 PD sub M2 gt{/M2 L1 PD sub D}if}{DV ID 1 sub get 0 ge{Lo 0 R}if}ie}if + F0 cF ne Cs cS ne or{F0 Cs NF}if + /ms Ms D /Ms f D CP FB sub + C1 cvx exec XO EO sub L1 add TB{BW sub}if dup LM gt{/LM E D}{pop}ie + PH 0 eq PH 4 eq or Ms and{HF not{/PO t D /AH t D}if + BB CP YA add E AT 3 eq LB and{A1 sub}if TB{BW sub}if E BB} + {pop pop}ie Ms HM PH 3 eq and or{/BP f D /Fl f D}if + /Lo 0 D /L1 0 D /F0 cF D /Cs cS D BP not{0 YB NN neg R}if + OU f1 and mF not and{k2 /f1 f D}if + OU PF not and PB or{RE 1 gt{RE dup scale}if}if /Ms ms Ms or D + /C1 AF{(Cp )}{()}ie D /YA 0 D /YB 0 D BL + AT 4 eq LB not and PH 3 ge and + {ID DV length lt{DV ID get dup 0 ge{DO E sub /Lo E D /L1 Lo D}{pop}ie + /ID ID 1 add D}if}if /T t D CD{/LN LN 1 add D PD}if + /PD -1 D /NS 0 D /NB 0 D /TB f D /Ph f D /Mf 0 D /HM f D} D +/RS {/TM E D /CN 0 D TM{10 eq{TM CN ( ) PI}if /CN CN 1 add D}forall + /CN 0 D /BK HM EN and{0}{1}ie D TM + {dup 32 ne{TM CN 3 2 roll put /CN CN 1 add D /BK 0 D} + {pop BK 0 eq{TM CN 32 put /CN CN 1 add D}if /BK 1 D}ie}forall + TM 0 CN GI dup dup () ne E ( ) ne and + {dup CN 1 sub get 32 eq{/EN f D}{/EN t D}ie}if} D +/join {2 copy length E length add string dup 4 2 roll 2 index 0 3 index + PI E length E PI}d +/WR {(\n) search{dup () ne BP not or + {Li 4 le CP E pop YI Li mul add LE add 0 lt and PL 0 eq and{NP}if + SH NL pop /Li Li 1 sub D WR}{pop pop WR}ie}{SH}ie /CI 0 D /BP f D} D +/SH {dup dup () ne E ( ) ne and PF or CS Mf gt and{/Mf CS D}if + T not Wf and{( ) E join /T t D}if dup BP{/MF CS D}if + AT 3 eq{2 copy length dup 0 gt{/NB E NB add D + {( ) search{/NS NS 1 add D pop pop}{pop exit}ie}loop}{pop pop}ie}if + CD PD 0 lt and{dup DC search{SW pop /PD E L1 add D pop pop}{pop}ie}if + 0 Np dup SW pop L1 add /L1 E D dup () ne + {C1 (\() join E join (\)) join AU AF and UF or Wf and{( U ) join}if + sF{( s ) join}if ( S ) join + /C1 E D dup length 1 sub get 32 eq /TB E D /Bw BW D}{pop pop}ie} D +/BG {AI LG BC add add 0 eq} D +/ON {OU{Ty AR AI NN get dup 1 add Ln Ns Ty 2 mod 0 eq{(. )}{(\) )}ie join + dup SW pop neg 0 R CP E 0 lt{0 E M}{pop}ie CP BB show /Ms t D}if} D +/Ln {AR AI 3 -1 roll put}D +/SP {dup CI lt BP not and{dup CI sub 0 E R /CI E D}{pop}ie} D +/BN {PF{WR /HM f D}{BT NL}ie} D +/NN {dup 0 lt{pop 0}if} D +/h {(h) HI ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie} D +/H {/fn FN D /Hi E 1 add D 1 sub /HL E D /H2 HL 2 add D /GS EZ H2 get D + E Tm H2 get GS mul BE dup 0 gt{1 sub}{pop EG H2 get dup 0 lt{pop AT}if}ie NA + WW Np /SL SL 1 add D /FN EF H2 get D GS Ey H2 get FS + EU H2 get Sc Hs not HL Hl lt and Hs HL hl lt and or Hi 0 eq or + {/HI Hi D /Hs t D /hl HL D /Hv HL D}if HL Hl lt{/hi Hi D}if + Nf HI 0 gt and{(h) Hi ST cvs join cvx exec 0 get WB}if + /HF t D /AH f D /PO f D} D +/EH {Bm H2 get GS mul BE OA /SL SL 1 sub NN D /CF 0 D /FN fn D + SZ SL get FR SL get FS /HF f D /GS Ts D ()Ec} D +/P {E PF{WR}{PO{EP}{BN}ie Ts 4 mul Np AE not{Tm 0 get Ts mul neg SP}if + dup 0 ge AH and{Pi Pd}if}ie 1 sub dup 0 lt{pop AV AL get}if /AT E D /PO t D} D +/EP {PF{WR}{BN Ts 4 mul Np}ie AE not{Bm 0 get Ts mul neg SP}if + /AT AV AL get D /PO f D} D +/BE {E PO{EP}{BN}ie Ts 4 mul Np neg SP} D +/HR {/Aw W EO sub D /RW E dup 0 gt{Aw mul}{neg}ie dup Aw gt{pop Aw}if D /RZ E D + E BN Ts neg SP 1 sub 2 div Aw RW sub mul EO add CP E pop M PF{0 Ps neg R}if + 0 Np OU{gsave RZ LW Cf{Hc VC}{0 Sg}ie CP BB RW 0 RL CP BB stroke grestore}if + /CI 0 D /BP f D PF not{Ts neg SP}if /Ms t D} D +/AD {I NL EG 14 get dup 0 lt{pop AT}if NA /AE t D Tm 14 get Ts mul neg SP + Cf{EU 14 get dup -1 eq{pop CA CL get}if Sc}if} D +/DA {BN ()ES OA /AE f D ()Ec Bm 14 get Ts mul neg SP} D +/PR {/MW E D /Li E D Tm 1 get Ps mul BE 0 NA /FN Fp D /PF t D SI /SL SL 1 add D + /CF 0 D Ps CS mul Ts div MW WC mul CS mul Ts div dup LL gt PL 0 eq and + {LL div div}{pop}ie Ey 1 get FS CP E pop LE add YI neg div cvi dup Li lt + AH and{4 lt YI Li mul 5 mul LE add 0 gt or PL 0 eq and{NP}if}{pop}ie + EU 1 get Sc /GS Ps D}D +/RP {WR NL () /PF f D SI /FN 0 D ES Bm 1 get Ps mul neg SP OA /GS Ts D} D +/SI {/XO Lm 15 get BC NN mul Lm 16 get AI UI sub NN mul add + Lm 17 get UI NN mul add Lm 20 get LG NN mul add Ts mul + PF{Lm 1 get Ps mul add}if EO add D + /MR Rm 15 get BC NN mul Rm 16 get AI UI sub NN mul add + Rm 17 get UI NN mul add Rm 20 get LG NN mul add Ts mul + PF{Rm 1 get Ps mul add}if D /LL W XO sub MR sub D} D +/DT {/cC E D BN /LG LG 1 sub D SI /LG LG 1 add D WW 2 div Np BL} D +/DD {WB Cc 0 eq cC 0 eq and L1 0 eq or Lm 20 get Ts mul L1 sub TB{BW add}if + Ts 2 div lt or NL /LF E D SI BL /cC 0 D} D +/DL {Dc LG Cc put /Cc E D BG{Tm 18 get Ts mul BE}{BN}ie /LG LG 1 add D BL} D +/LD {BN LG 0 gt{/LG LG 1 sub D}if /Cc Dc LG get D SI + BG{()Bm 18 get Ts mul BE}if BL} D +/UL {BG{Tm 17 get Ts mul BE}{BN}ie NR AI NN 0 put /UI UI 1 add D + /AI AI 1 add D SI BL} D +/LU {BN /UI UI 1 sub D /AI AI 1 sub D SI BG{()Bm 17 get Ts mul BE}if BL} D +/OL {E BG{Tm 16 get Ts mul BE}{BN}ie TR AI NN Ty put /Ty E D NR AI NN 1 put + /AI AI 1 add D SI BL 1 Ln} D +/LO {BN /AI AI 1 sub D /Ty TR AI get D SI BG{()Bm 16 get Ts mul BE}if BL} D +/LI {E BN -1 SP /BP f D /CI 0 D 0 Np NR AI 1 sub NN get 1 eq + {dup dup 0 gt E 4 le and{/Ty E D}{pop}ie + /L1 L1 Ty AR AI NN get Ns SW pop XO sub dup 0 lt{pop 0}if add D ( ON )} + {pop ( B )}ie C1 E join /C1 E D CS Mf gt{/Mf CS D}if BL} D +/BQ {Tm 15 get Ts mul BE /BC BC 1 add D SI BL} D +/QB {Bm 15 get Ts mul BE /BC BC 1 sub D SI BL} D +/Al {E EP 1 sub dup 0 lt{pop AV AL get}if NA} D +/Ea {EP OA} D +/WB {PF{WR}{BT}ie} D +/F1 {WB /FN 0 D CS 0 FS} D +/F2 {WB /FN WI D CS 0 FS} D +/HY {/Hy t D WB /Hy f D} D +/YH {WB} D +/A {/LT E D LT 1 eq{/RN E D}if /Lh E D WB /C1 C1 ( Cp ) join D + Lc AF not and{Cl Sc}if /AF t D} D +/EA {Lc AF and{Ec}{WB}ie TL Pa AF and Lh 0 ne and + {( \() Lh join (\)) join /AF f D WB}if /AF f D} D +/TL {C1 ( Tl ) apa /C1 E D} d +/apa {AF OU and Lh 0 ne LT 1 eq or and{LT 1 eq{RN ( /) E ST cvs join} + {(\() Lh join (\)) join}ie E join join}{pop}ie} d +/Cp {/Xc CP /Yc E D D} D +/SS {Cf{dup 0 ge{EU E get dup -1 eq{pop CA CL get}if}{pop CA CL get}ie Sc} + {pop}ie SZ SL get /SL SL 1 add D} D +/I {WB 8 SS 1 FS} D +/EM {WB 8 SS /CF CF 1 xor D 0 FS} D +/BD {WB 9 SS 2 FS} D +/TT {WB 10 SS /FN Fp D 0 FS} D +/KB {WB 11 SS /FN Fp D 2 FS} D +/CT {WB 12 SS 1 FS} D +/SM {WB 13 SS /FN Fp D 0 FS} D +/Q {/QL QL 1 add D QO QL 2 mod get La get join WB} D +/EQ {QC QL 2 mod get La get join WB /QL QL 1 sub D} D +/RO {WB -1 SS /CF 0 D 0 FS} D +/SY {WB -1 SS -1 FS} D +/MY {WB -1 SS -2 FS} D +/ES {WB /SL SL 1 sub NN D /CF 0 D /FN FO SL get D SZ SL get FR SL get FS ()Ec}D +/FZ {3 sub 1.2 E exp GS mul E WB TL /C1 C1 ( Cp ) join D /SL SL 1 add D 0 FS} D +/Ef {WB TL ()ES /C1 C1 ( Cp ) join D} D +/BZ {dup /Bf E D FZ}D +/Sc {dup -1 ne Cf and{/CL CL 1 add D dup 0 eq{pop [0 0 0]}if + dup CA E CL E put VS ( VC ) join C1 E join /C1 E D}{pop}ie} D +/Ec {WB Cf{/CL CL 1 sub NN D CA CL get VS ( VC ) join C1 E join /C1 E D}if} D +/VS {dup type /arraytype eq{([) E {ST cvs join ( ) join}forall (]) join}if} D +/VC {{255 div}forall setrgbcolor} D +/Sl {dup type /integertype ne{Ds}if /La E D WB}d +/UN {WB /UF t D} D +/NU {WB /UF f D} D +/SE {WB /sF t D} D +/XE {WB /sF f D} D +/sM {/C1 C1 ( k1 ) join D}d +/eM {/C1 C1 ( k2 ) join D}d +/k1 {/YC CP E pop Ts add D /mF t D /f1 t D}d +/k2 {gsave 3 LW -9 CP E pop Ts 0.2 mul sub M -9 YC L stroke grestore /mF f D}d +/Ac {/AC E D WB}d +/Ca {eA{( \()join AC join(\) )join}if WB}d +/s {OU{gsave 0 CS .25 mul R dup SW pop CJ 0 RL stroke grestore}if}D +/CJ {AT 3 eq LB and{E dup dup length 1 sub A1 mul E + {( ) search{pop pop E A2 add E}{pop exit}ie}loop 3 -1 roll add + W CP pop sub 2 copy gt{E}if pop}if}D +/So {/Co E D} D +/SO {C1 Yo ST cvs join ( So ) join /C1 E D (j) SW pop 2 div Pd} D +/Se {E WB CS E div Pd}D +/Pd {dup type /stringtype eq{SW pop}if dup /L1 E L1 add D + ST cvs ( 0 R ) join C1 E join /C1 E D} D +/Sp {0.35 CO} D +/Sb {-0.2 CO} D +/CO {OV Io Yo put /Yo E CS mul Yo add D /Io Io 1 add D -1.5 Io mul 3 add FZ SO + CS Yo add dup YA gt{/YA E D}{pop}ie + Yo neg dup YB gt{/YB E D}{pop}ie} D +/Es {ES /Io Io 1 sub NN D /Yo OV Io get D SO} D +/SB {/N2 0 D 0 1 NI{/N E D{IX N2 get 0 lt{/N2 N2 1 add D}{exit}ie}loop + /K WS N get FC N get mul D /NY AY N2 get D /BV NY array D + 0 1 NY 1 sub{/TM K string D currentfile TM readhexstring pop pop BV E TM put} + for BM N BV put /N2 N2 1 add D}for} D +/IC [{/MA E D /MB 0 D}{2 div /MA E D /MB MA D}{/MB E CS sub D /MA CS D} + {pop /MA YS AB mul D /MB 1 AB sub YS mul D}{pop /MA 0 D /MB 0 D}] D +/IP {BV N get /N N 1 add D} D +/II {/K E D IX K get 0 lt{/EC E D}if /TY E D + TY 4 eq{/Y E D /X E D}if TY 3 eq{/AB E D}if + /XW AX K get D /YW AY K get D /IS SG IT K get get D /XS XW IS mul D + /YS YW IS mul D YS IC TY get exec /MA MA Fl not{3 add}if D} D +/IM {II /ty TY D /xs XS D /ys YS D /ya YA D /yb YB D /ma MA D /mb MB D /k K D + /ec EC D /BP f D /CI 0 D WB TL L1 xs add dup XO add MR add W gt + {pop /ma ma Fl{3 add}if D NL /YA ma D /YB mb D /YS ys D /L1 xs D} + {/L1 E D ma YA gt{/YA ma D}if mb YB gt{/YB mb D}if}ie /TB f D + OU{CP E pop YS sub LE neg lt Fl not and PB not and{NP /YA ma D /YB mb D}if + /BP f D ty ST cvs ( ) join IX k get 0 lt{(\() join ec join (\) ) join}if + k ST cvs join ty 3 eq{AB ST cvs ( ) join E join}if + ty 4 eq{X ST cvs ( ) join Y ST cvs join ( ) join E join}if C1 E join + ( DI ) join FP 2 eq FP 1 eq AF and or{( FM ) join}if + ( Il Cp ) apa /C1 E D /EN f D}if /HM t D /T f D} D +/DI {II /Xc CP /Yc E D D /YN YW neg D /HM t D /CI 0 D /K2 IX K get D gsave + TY 4 eq{OX X IS mul add OY FY add YS sub Y IS mul sub} + {/FY YS D CP MB sub 2 copy /OY E D /OX E D}ie + translate K2 0 ge{/DP AZ K2 get D /BV BM K2 get D XS YS scale /N 0 D XW YW DP + [XW 0 0 YN 0 YW] {IP} FC K2 get 1 eq{image}{f 3 colorimage}ie} + {EX}ie grestore XS 0 R /Ms t D} D +/FM {gsave 0 Sg CP MB sub translate XS neg 0 M 0 YS RL XS 0 RL 0 YS neg RL + XS neg 0 RL stroke grestore} D +/NA {/AT E D /AL AL 1 add D AV AL AT put} D +/OA {AL 0 gt{/AL AL 1 sub D /AT AV AL get D}if} D +/D1 {/BR {CP E pop E BN Mb{CP E pop eq{0 YI R}if}{pop}ie} D + /Sn {OU{C1 E ST cvs join ( Ld ) join /C1 E D}{pop}ie} D} D +/D1 {/BR {BN} D /Sn {OU {C1 E ST cvs join ( Ld ) join /C1 E D} {pop} ie} D} D +/TC {/TF t D /ML 0 D HN{SW pop dup ML gt{/ML E D}{pop}ie}forall NP /RM RM not D + RC /OU Tc D Ep /PN 0 D Ms not TP and{Ip}if /W IW ML sub Ts sub D + /A0 0 D TH{/BR {( ) join BT} D /Sn {pop} D /Au () D}if} D +/TN {0 eq{E EA PF HF or not XR and{HN E get Xr}{pop}ie} + {OU{Tn 0 ge{() BN}if /Tn E D}{pop}ie WB}ie} D +/NT {OU LB not and Tn 0 ge and{PL 0 eq{Ms not{CS CF FS}if CP dup + /y E YA sub D W 9 sub CS -1.8 mul XO L1 add 2 add{y M (.) show}for + HN Tn get dup SW pop IW E sub y M show CP BB M}if /Tn -1 D}if} D +/Ld {/DN E D HN DN Pn put [/View [/XYZ -4 Fl{PS}{CP YA add US E pop}ie null] + /Dest DN ST cvs cvn /DEST pdfmark} D +/C {ND 1 eq{1 sub}if TI mul /XO E D NL Nf not{pop()}if 0 3 -1 roll 1 A} D +/OP {BP not{NP}if PN 2 mod 0 eq{/Ms t D NP}if}D +/Ep {Xp PN 2 mod 0 eq and OU and{/Pn (-) D showpage /PM 1 D LA}if}D +/Dg [73 86 88 76 67 68 77] D +/Rd [0 [1 1 0][2 1 0][3 1 0][2 1 1][1 1 1][2 2 1][3 3 1][4 4 1][2 1 2]] D +/Ns {/m E D /c E 32 mul D /j m 1000 idiv D /p j 12 add string D + c 96 le m 0 gt and{c 32 le {/i 0 D /d 77 D /l 100 D /m m j 1000 mul sub D + j -1 1 {pop p i d c add put /i i 1 add D}for + 4 -2 0 {/j E D /n m l idiv D /m m n l mul sub D /d Dg j get D + n 0 gt {/x Rd n get D x 0 get -1 1 {pop p i d c add put /i i 1 add D}for + p i x 1 get sub Dg x 2 get j add get c add put}if /l l 10 idiv D + }for p 0 i GI} + {/i ST length 1 sub D m {1 sub dup 0 ge{dup 26 mod c add 1 add + ST i 3 -1 roll put 26 idiv dup 0 eq{pop exit}if}if /i i 1 sub D}loop + ST i ST length i sub GI}ie} + {m p cvs}ie} D +/US {matrix currentmatrix matrix defaultmatrix matrix invertmatrix + matrix concatmatrix transform} D +/GB {Gb{US}if}D +/Tl {/Rn E D Xc CP pop ne{ + [/Rect [Xc 1 sub Yc cS 0.25 mul sub GB CP E 1 add E cS 0.85 mul add GB] + /Subtype /Link /Border [0 0 Cf Lc and LX and AU or{0}{1}ie] Rn type + /nametype eq {/Dest Rn}{/Action [/Subtype /URI /URI Rn] Cd}ie + /ANN pdfmark}if} D +/Il {/Rn E D [/Rect [Xc Yc GB Xc XS add Yc YS add GB] /Subtype /Link + /Border [0 0 0] Rn type /nametype eq{/Dest Rn} + {/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark} D +/XP {[{/Z Bz 2 div D Z 0 R Z Z RL Z neg Z RL Z neg Z neg RL Z Z neg RL + Fi cH 1 eq and{fill}if} {Bz 0 RL 0 Bz RL Bz neg 0 RL 0 Bz neg RL + Fi cH 1 eq and{fill}if} {0 -5 R Bz 0 RL 0 21 RL Bz neg 0 RL 0 -21 RL}]} D +/MS {/Sm E D WB}D +/O {BN()Sm BX} D +/O {BN()0 Sm BX} D +/BX {/Bt E D Bt 2 lt{/Ch E D CS 0.8 mul}{11 mul}ie W XO sub MR sub + 2 copy gt{E}if pop /HZ E D Bt 2 eq{Fi not{pop()}if ( )E join /Ft E D TT + /PF t D /MW 1 D /Li 1 D /Fw Ft SW pop D Fw HZ gt{/HZ Fw 8 add D}if + HZ ST cvs( )join}{WB Ch ST cvs( )join}ie L1 HZ add XO add MR add W gt{NL}if + Bt 2 eq{Ft ES Fw neg HM{CS sub}if Pd}if Bt ST cvs join( Bx )join + Bt 2 eq HM and{CS Pd}if C1 E join /C1 E D /L1 L1 HZ add D /T f D + ( ) Pd /PF f D Bt 2 lt{YA CS .8 mul lt{/YA CS .8 mul D}if} + {YB 5 lt{/YB 5 D}if YA 21 lt{/YA 21 D}if}ie /CI 0 D} D +/Bx {dup 2 eq{E /Bz E D}{E /cH E D /Bz CS .8 mul D}ie + OU {gsave 0 Sg XP E get exec stroke grestore}{pop}ie Bz 0 R /Ms t D}D +/SD {FD 4 mul Dy add DZ NF newpath 0 0 M DX t charpath pathbbox + 3 -1 roll sub /DY E D E dup /X1 E D sub WM mul WX DY mul add WM DG mul E div + /DF E D /DR WX DF mul DY mul WM div 2 div D} d +/Sd {gsave 0 IL Di mul neg translate IL IW atan Di 0 eq{neg}if rotate + FD 4 mul Dy add DZ NF DR X1 sub DY 2 div neg M cD VC DX show grestore} d +/Pt {/tp t D Tp{NP /Pn (TP) D 0 Tt neg R Th BN NP Ep ET RC ZF}if /tp f D} D +/RC {/AI 0 D /LG 0 D /BC 0 D /UI 0 D /PF f D /Cc 0 D /cC 0 D /Dc 10 array D + /NR [0 1 9{pop 0}for] D /La Ds D /AR 10 array D /TR 10 array D /AV 30 array D + SI /AL -1 D /AT A0 D AT NA /OV 9 array D /Yo 0 D /Co 0 D /Io 0 D /Hy f D + /Ph f D /CL -1 D Ct Sc}D +/ZF {/FR [0 1 30{pop 0}for] D /SZ [0 1 30{pop 0}for] D /FO [0 1 30{pop 0}for] D + /SL 0 D /CF 0 D /FN 0 D 0 Ts SF}D +/QO [[(\234)(\233)(\253\240)(\232)(\273)(\253)][(')(`)(\253\240)(\231)(\273)(\253)]] D +/QC [[(\234)(\234)(\240\273)(\233)(\253)(\273)][(')(')(\240\273)(`)(\253)(\273)]] D +/Hf EF length 2 sub D +/Hz EZ Hf get D +/HS Ey Hf get D +/Fz EZ Hf 1 add get D +/Fs Ey Hf 1 add get D +/LE IL D +/Ps EZ 1 get D +/Fp EF 1 get D +/XO 0 D +/YI 0 D +/CI 0 D +/FP 0 D +/WW Ts 7 mul D +/Mf 0 D +/YA 0 D +/YB 0 D +/Cs Ts D +/GS Ts D +/F0 0 D +/NS 0 D +/NB 0 D +/N 0 D +/C0 [] D +/C1 () D +/Lo 0 D +/L1 0 D +/LM 0 D +/PH 0 D +/EC 0 D +/Lh 0 D +/LT 0 D +/CH 1 string D +/ST 16 string D +/CA 9 array D +/HC (\255) D +/HM f D +/PF f D +/EN f D +/TB f D +/UF f D +/sF f D +/AE f D +/AF f D +/BP t D +/CD f D +/PA t D +/GL f D +/T t D +/HF f D +/AH f D +/SA f D +/PB f D +/f1 f D +/mF f D +/OX 0 D +/OY 0 D +/FY 0 D +/EO 0 D +/FB 0 D +/PL 0 D +/Bw 0 D +/PD -1 D +/TP f D +/tp f D +/TH f D +/Ty 4 D +/Tn -1 D +/Fl t D +/LB t D +/PM 1 D +/Ms f D +/Ba f D +/Bb f D +/Hl 3 D +/hl 6 D +/Hv 6 D +/Hs f D +/HI 0 D +/hi 0 D +/PO t D +/TE f D +/LF t D +/BO 0 D +/Sm 1 D +/Bf 3 D +/A1 0 D +/A2 0 D +/Ds 1 D +/QL -1 D +/Cb Db D +/Ct Dt D +/Cl Dl D +[/Creator (html2ps version 1.0 beta5) /Author () /Keywords () /Subject () + /Title (The Funtools Help Facility) /DOCINFO pdfmark +/ND 18 D +/HN [(1) (1) (1) (1) (8) (9) (19) (21) (28) (30) (33) (37) (38) (41) (42) (45) +(48) (51) (53) (??) (54) (56) (56) (87) (57) (58) (60) (62) (64) (65) (76) +(77) (66) (73) (75) (82) (85) (78) (80) (86) (87) (57) (91) (91) (92) (92) +(94) (102) (111) (95) (96) (100) (117) (123) (127) (136) (152) (157) (161) +(164) (165) (167) (171) (1) (1) (1) (3) (1) (1) (1) (8) (9) (19) (21) (28) +(30) (33) (37) (38) (41) (42) (45) (48) (50) (51) (51) (51) (51) (52) (53) +(53) (53) (53) (53) (54) (56) (56) (57) (57) (58) (60) (62) (64) (65) (66) +(73) (75) (76) (77) (80) (82) (85) (86) (87) (87) (87) (88) (90) (91) (98) +(91) (91) (91) (91) (92) (92) (94) (95) (96) (98) (99) (100) (101) (102) +(102) (102) (102) (102) (103) (104) (105) (105) (108) (109) (110) (111) +(111) (111) (111) (111) (111) (112) (113) (114) (114) (115) (116) (116) +(116) (117) (119) (119) (120) (120) (120) (117) (117) (117) (117) (119) +(119) (120) (120) (120) (121) (122) (123) (123) (123) (123) (126) (127) +(127) (127) (127) (127) (129) (129) (130) (131) (131) (132) (132) (133) +(135) (136) (136) (136) (136) (146) (151) (152) (152) (152) (152) (156) +(157) (157) (157) (157) (157) (158) (159) (160) (161) (161) (161) (161) +(161) (161) (162) (162) (163) (164) (164) (164) (164) (164) (165) (165) +(165) (165) (165) (166) (167) (167) (167) (167) (170) (171) (171) (171) +(171) (171) (172) (172) (172) (175) (178) (178) (179) (180) (181) (181) +(182) (182) (183) (183) (184) (184) (184) (184) (185) (185) (185) (186) +(187) (187)] D +/h0 [()(Table of Contents)] D +/h1 [(0.1\240\240)(Funtools: FITS Users Need Tools)] D +/h2 [(0.2\240\240)(Summary)] D +/h3 [(0.3\240\240)(Description)] D +/h4 [(0.3.0.0.1\240\240)(Last updated: January 6, 2006)] D +/h5 [(0.4\240\240)(Funtools Programs)] D +/h6 [(0.5\240\240)(Summary)] D +/h7 [(0.6\240\240)(funcalc - Funtools calculator \(for binary tables\))] D +/h8 [(0.7\240\240)(funcen - find centroid \(for binary tables\))] D +/h9 [(0.8\240\240)(funcnts - count photons in specified regions, with bkgd subtraction)] D +/h10 [(0.9\240\240)(funcone - cone search of a binary table containing RA, Dec columns)] D +/h11 [(0.10\240\240)(fundisp - display data in a Funtools data file)] D +/h12 [(0.11\240\240)(funhead - display a header in a Funtools file)] D +/h13 [(0.12\240\240)(funhist - create a 1D histogram of a column \(from a FITS binary table or raw event file\) or an image)] D +/h14 [(0.13\240\240)(funimage - create a FITS image from a Funtools data file)] D +/h15 [(0.14\240\240)(funindex - create an index for a column of a FITS binary table)] D +/h16 [(0.15\240\240)(funjoin - join two or more FITS binary tables on specified columns)] D +/h17 [(0.16\240\240)(funmerge - merge one or more Funtools table files)] D +/h18 [(0.17\240\240)(funsky - convert between image and sky coordinates)] D +/h19 [(0.18\240\240)(funtable - copy selected rows from a Funtools file to a FITS binary table)] D +/h20 [(0.19\240\240)(funtbl - extract a table from Funtools ASCII output)] D +/h21 [(0.19.0.0.1\240\240)(Last updated: April 1, 2007)] D +/h22 [(0.20\240\240)(FunDS9: Funtools and DS9 Image Display)] D +/h23 [(0.21\240\240)(Summary)] D +/h24 [(0.22\240\240)(Description)] D +/h25 [(0.22.0.0.1\240\240)(Last updated: November 16, 2005)] D +/h26 [(0.23\240\240)(FunLib: the Funtools Programming Interface)] D +/h27 [(0.24\240\240)(Summary)] D +/h28 [(0.25\240\240)(Introduction to the Funtools Programming Interface)] D +/h29 [(0.26\240\240)(Funtools Programming Tutorial)] D +/h30 [(0.27\240\240)(Compiling and Linking)] D +/h31 [(0.28\240\240)(A Short Digression on Subroutine Order)] D +/h32 [(0.29\240\240)(Funtools Programming Examples)] D +/h33 [(0.30\240\240)(The Funtools Programming Reference Manual)] D +/h34 [(0.31\240\240)(FunOpen - open a Funtools data file)] D +/h35 [(0.32\240\240)(FunImageGet - get an image or image section)] D +/h36 [(0.33\240\240)(FunImagePut - put an image to a Funtools file)] D +/h37 [(0.34\240\240)(FunImageRowGet - get row\(s\) of an image)] D +/h38 [(0.35\240\240)(FunImageRowPut - put row\(s\) of an image)] D +/h39 [(0.36\240\240)(FunColumnSelect - select Funtools columns)] D +/h40 [(0.37\240\240)(FunColumnActivate - activate Funtools columns)] D +/h41 [(0.38\240\240)(FunColumnLookup - lookup a Funtools column)] D +/h42 [(0.39\240\240)(FunTableRowGet - get Funtools rows)] D +/h43 [(0.40\240\240)(FunTableRowPut - put Funtools rows)] D +/h44 [(0.41\240\240)(FunParamPut - put a Funtools param value)] D +/h45 [(0.42\240\240)(FunInfoGet - get information from Funtools struct)] D +/h46 [(0.43\240\240)(FunInfoPut - put information into a Funtools struct)] D +/h47 [(0.44\240\240)(FunFlush - flush data to output file)] D +/h48 [(0.45\240\240)(FunClose - close a Funtools data file)] D +/h49 [(0.46\240\240)(FunRef: the Funtools Reference Handle)] D +/h50 [(0.47\240\240)(Summary)] D +/h51 [(0.48\240\240)(Description)] D +/h52 [(0.48.0.0.1\240\240)(Last updated: December 1, 2005)] D +/h53 [(0.49\240\240)(FunFiles: Funtools Data Files)] D +/h54 [(0.50\240\240)(Summary)] D +/h55 [(0.51\240\240)(Description)] D +/h56 [(0.52\240\240)(Supported Data Formats)] D +/h57 [(0.53\240\240)(FITS Images and Binary Tables)] D +/h58 [(0.54\240\240)(Non-FITS Raw Event Files)] D +/h59 [(0.55\240\240)(Non-FITS Array Files)] D +/h60 [(0.56\240\240)(Specifying Image Sections)] D +/h61 [(0.57\240\240)(Binning FITS Binary Tables and Non-FITS Event Files)] D +/h62 [(0.58\240\240)(Table and Spatial Region Filters)] D +/h63 [(0.59\240\240)(Disk Files and Other Supported File Types)] D +/h64 [(0.60\240\240)(Lists of Files)] D +/h65 [(0.60.0.0.1\240\240)(Last updated: February 15, 2006)] D +/h66 [(0.61\240\240)(Funtext: Support for Column-based Text Files)] D +/h67 [(0.62\240\240)(Summary)] D +/h68 [(0.63\240\240)(Description)] D +/h69 [(0.64\240\240)(Standard Text Files)] D +/h70 [(0.65\240\240)(Comments Convert to Header Params)] D +/h71 [(0.66\240\240)(Multiple Tables in a Single File)] D +/h72 [(0.67\240\240)(TEXT\(\) Specifier)] D +/h73 [(0.68\240\240)(Text\(\) Keyword Options)] D +/h74 [(0.69\240\240)(Environment Variables)] D +/h75 [(0.70\240\240)(Restrictions and Problems)] D +/h76 [(0.70.0.0.1\240\240)(Last updated: August 3, 2007)] D +/h77 [(0.71\240\240)(Funview: Database View Support for Tables)] D +/h78 [(0.72\240\240)(Summary)] D +/h79 [(0.73\240\240)(Description)] D +/h80 [(0.74\240\240)(Database Views)] D +/h81 [(0.75\240\240)(Funtools View Attributes)] D +/h82 [(0.76\240\240)(Invoking a Funtools View \(in Place of an Input File\))] D +/h83 [(0.77\240\240)(Basic View Matching Rules)] D +/h84 [(0.78\240\240)(More on View Matching Rules: Single vs. Multiple Matches)] D +/h85 [(0.79\240\240)(View Lists: Applying a View to Any File)] D +/h86 [(0.80\240\240)(Overriding Values Associated with a View)] D +/h87 [(0.81\240\240)(Environment Variables)] D +/h88 [(0.82\240\240)(Restrictions and Problems)] D +/h89 [(0.82.0.0.1\240\240)(Last updated: August 3, 2007)] D +/h90 [(0.83\240\240)(Funfilters: Filtering Rows in a Table)] D +/h91 [(0.84\240\240)(Summary)] D +/h92 [(0.85\240\240)(Description)] D +/h93 [(0.86\240\240)(Filter Expressions)] D +/h94 [(0.87\240\240)(Separators Also Are Operators)] D +/h95 [(0.88\240\240)(Range Lists)] D +/h96 [(0.89\240\240)(Math Operations and Functions)] D +/h97 [(0.90\240\240)(Include Files)] D +/h98 [(0.91\240\240)(Header Parameters)] D +/h99 [(0.92\240\240)(Examples)] D +/h100 [(0.92.0.0.1\240\240)(Last updated: November 17, 2005)] D +/h101 [(0.93\240\240)(Funidx: Using Indexes to Filter Rows in a Table)] D +/h102 [(0.94\240\240)(Summary)] D +/h103 [(0.95\240\240)(Description)] D +/h104 [(0.95.0.0.1\240\240)(Last updated: August 3, 2007)] D +/h105 [(0.96\240\240)(Regions: Spatial Region Filtering)] D +/h106 [(0.97\240\240)(Summary)] D +/h107 [(0.98\240\240)(Description)] D +/h108 [(0.99\240\240)(Region Expressions)] D +/h109 [(0.100\240\240)(Columns Used in Region Filtering)] D +/h110 [(0.101\240\240)(Region Algebra)] D +/h111 [(0.102\240\240)(Region Separators Also Are Operators)] D +/h112 [(0.103\240\240)(Region Exclusion)] D +/h113 [(0.104\240\240)(Include Files)] D +/h114 [(0.105\240\240)(Global and Local Properties of Regions)] D +/h115 [(0.106\240\240)(Coordinate Systems)] D +/h116 [(0.107\240\240)(Specifying Positions, Sizes, and Angles)] D +/h117 [(0.107.0.0.1\240\240)(Last updated: November 17, 2005)] D +/h118 [(0.108\240\240)(RegGeometry: Geometric Shapes in Spatial Region Filtering)] D +/h119 [(0.109\240\240)(Summary)] D +/h120 [(0.110\240\240)(Geometric shapes)] D +/h121 [(0.111\240\240)(Region accelerators)] D +/h122 [(0.111.0.0.1\240\240)(Last updated: March 12, 2007)] D +/h123 [(0.112\240\240)(RegAlgebra: Boolean Algebra on Spatial Regions)] D +/h124 [(0.113\240\240)(Summary)] D +/h125 [(0.114\240\240)(Description)] D +/h126 [(0.114.0.0.1\240\240)(Last updated: November 17, 2005)] D +/h127 [(0.115\240\240)(RegCoords: Spatial Region Coordinates)] D +/h128 [(0.116\240\240)(Summary)] D +/h129 [(0.117\240\240)(Pixel coordinate systems)] D +/h130 [(0.118\240\240)(World Coordinate Systems)] D +/h131 [(0.119\240\240)(WCS Positions and Sizes)] D +/h132 [(0.120\240\240)(NB: The Meaning of Pure Numbers Are Context Sensitive)] D +/h133 [(0.120.0.0.1\240\240)(Last updated: November 17, 2005)] D +/h134 [(0.121\240\240)(RegBounds: Region Boundaries)] D +/h135 [(0.122\240\240)(Summary)] D +/h136 [(0.123\240\240)(Description)] D +/h137 [(0.124\240\240)(Image boundaries : radially-symmetric shapes \(circle, annuli, ellipse\))] D +/h138 [(0.125\240\240)(Image Boundaries: non-radially symmetric shapes \(polygons, boxes\))] D +/h139 [(0.126\240\240)(Row Boundaries are Analytic)] D +/h140 [(0.127\240\240)(Image Boundaries vs. Row Boundaries: Practical Considerations)] D +/h141 [(0.127.0.0.1\240\240)(Last updated: November 16, 2005)] D +/h142 [(0.128\240\240)(RegDiff:Differences Between Funtools and IRAF Regions)] D +/h143 [(0.129\240\240)(Summary)] D +/h144 [(0.130\240\240)(Description)] D +/h145 [(0.130.0.0.1\240\240)(Last updated: November 16, 2005)] D +/h146 [(0.131\240\240)(FunCombine: Combining Region and Table Filters)] D +/h147 [(0.132\240\240)(Summary)] D +/h148 [(0.133\240\240)(Comma Conventions)] D +/h149 [(0.133.0.0.1\240\240)(Last updated: November 16, 2005)] D +/h150 [(0.134\240\240)(FunEnv: Funtools Environment Variables)] D +/h151 [(0.135\240\240)(Summary)] D +/h152 [(0.136\240\240)(Description)] D +/h153 [(0.136.0.0.1\240\240)(Last updated: November 16, 2005)] D +/h154 [(0.137\240\240)(Funtools ChangeLog)] D +/h155 [(0.138\240\240)(Patch Release 1.4.5 \(internal ds9 release\))] D +/h156 [(0.139\240\240)(Patch Release 1.4.4 \(internal ds9 release\))] D +/h157 [(0.140\240\240)(Patch Release 1.4.3 \(internal ds9 release\))] D +/h158 [(0.141\240\240)(Patch Release 1.4.2 \(internal ds9 release\))] D +/h159 [(0.142\240\240)(Patch Release 1.4.1 \(internal ds9 release\))] D +/h160 [(0.143\240\240)(Public Release 1.4.0 \(15 August 2007\))] D +/h161 [(0.144\240\240)(Release 1.3.0b[n] \(mainly internal SAO beta releases\))] D +/h162 [(0.145\240\240)(Patch Release 1.2.4 \(internal SAO and beta release only\))] D +/h163 [(0.146\240\240)(Patch Release 1.2.3 \(12 January 2004\))] D +/h164 [(0.147\240\240)(Patch Release 1.2.3b1 \(19 August 2003\))] D +/h165 [(0.148\240\240)(Patch Release 1.2.2 \(18 May 2003\))] D +/h166 [(0.149\240\240)(Patch Release 1.2.1 \(24 April 2003\))] D +/h167 [(0.150\240\240)(Public Release 1.2.0 \(24 March 2003\))] D +/h168 [(0.151\240\240)(Beta Release 1.2.b3 \(4 February 2003\))] D +/h169 [(0.152\240\240)(Beta Release 1.2.b2 \(7 October 2002\))] D +/h170 [(0.153\240\240)(Beta Release 1.2.b1 \(24 September 2002\))] D +/h171 [(0.154\240\240)(Public Release 1.1.0 \(22 April 2002\))] D +/h172 [(0.155\240\240)(Pre-Release 1.1.0e \(10 April 2002\))] D +/h173 [(0.156\240\240)(Pre-Release 1.1.0e \(19 March 2002\))] D +/h174 [(0.157\240\240)(Pre-Release 1.1.0e \(27 February 2002\))] D +/h175 [(0.158\240\240)(Pre-Release 1.1.0e \(11 February 2002\))] D +/h176 [(0.159\240\240)(Beta Release 1.0.1b5 \(31 January 2002\))] D +/h177 [(0.160\240\240)(Beta Release 1.0.1b4 \(26 January 2002\))] D +/h178 [(0.161\240\240)(Beta Release 1.0.1b3 \(4 January 2002\))] D +/h179 [(0.162\240\240)(Beta Release 1.0.1b2 \(14 November 2001\))] D +/h180 [(0.163\240\240)(Beta Release 1.0.1b1 \(6 November 2001\))] D +/h181 [(0.164\240\240)(Public Release 1.0.0 \(31 July 2001\))] D +/h182 [(0.164.0.0.1\240\240)(Last updated: 22 April 2002)] D +/Hr [-63 63 64 65 -66 -66 66 -67 67 68 69 70 71 72 73 74 75 76 77 78 79 +80 81 82 -83 -83 83 -85 85 86 87 -88 -88 88 -91 91 92 93 94 95 96 97 98 +99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 -117 +-117 117 -120 120 121 122 123 124 125 126 127 128 129 130 131 -132 -132 +132 -134 134 135 136 137 138 139 140 141 142 143 -144 -144 144 -146 146 +147 148 149 150 151 152 153 154 155 156 157 -158 -158 158 -165 165 166 167 +168 169 170 171 172 173 174 -175 -175 175 -177 177 178 179 -180 -180 180 +-182 182 183 184 185 186 187 188 189 190 191 192 193 -194 -194 194 -196 +196 197 198 199 -200 -200 200 -202 202 203 204 -205 -205 205 -207 207 208 +209 210 211 212 -213 -213 213 -215 215 216 217 218 219 220 221 -222 -222 +222 -224 224 225 226 -227 -227 227 -230 230 231 232 -233 -233 233 -235 235 +236 237 -238 -238 238 -239 239 240 241 242 243 244 245 246 247 248 249 250 +251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 -267 -267 +267]D +/HV [1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 +5 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 2 +2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 +2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 +2 2 2 3 4 5 1 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 3 4 5 1 2 2 2 2 +2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5]D +/Cn [3 0 0 1 1 1 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 +0 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 12 0 0 0 +0 0 0 0 0 0 0 0 1 1 1 0 10 0 0 0 0 0 0 0 0 0 1 1 1 0 12 0 0 0 0 0 0 0 0 +0 0 0 1 1 1 0 10 0 0 0 0 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 12 0 0 0 0 0 0 +0 0 0 0 0 1 1 1 0 4 0 0 0 1 1 1 0 3 0 0 1 1 1 0 6 0 0 0 0 0 1 1 1 0 7 0 +0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0 1 1 1 0 28 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0]D +Hr length 0 gt{[/PageMode /UseOutlines /DOCVIEW pdfmark}if +/Hn 1 D +0 1 Hr length 1 sub{ + /Bn E D [Cn Bn get dup 0 gt{/Count E HV Bn get Bl ge{neg}if}{pop}ie + /Dest Hr Bn get dup abs ST cvs cvn E 0 ge{(h)Hn ST cvs join cvx exec + dup 1 get E Nf{0 get E join}{pop}ie /Hn Hn 1 add D}{()}ie + /Title E dup length 255 gt{0 255 getinterval}if /OUT pdfmark}for +ZF /FN Fp D Ps 0 FS /WC Wf{( )}{<A1A1>}ie SW pop D +ET RC ZF +/Df f D +/R1 (http://hea-www.harvard.edu/saord/ds9/index.html) D +/R2 (http://hea-www.harvard.edu/saord/xpa/index.html) D +/R3 (ftp://cfa-ftp.harvard.edu/pub/gsc/WCSTools/home.html) D +/R4 (http://tdc-www.harvard.edu/software/wcstools/) D +/R5 (http://hea-www.harvard.edu/RD/funtools/changelog.html) D +/R6 (http://hea-www.harvard.edu/RD/funtools/changelog_beta.html) D +/Ba f D /BO 0 D Bs +/UR (help.html) D +/Ti (The Funtools Help Facility) D +/Au () D +/Df f D +/ME [()] D + TC + +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc + +/Ba f D /BO 0 D Bs +/UR (help.html) D +/Ti (The Funtools Help Facility) D +/Au () D +/Df f D +/ME [()] D + TC + +NP RC ZF +()1 Sl()WB 0 Sn( + + +)0 2 0 H(Funtools:)WB 63 Sn()WB 1 Sn( FITS Users Need Tools)EA()EH( + + +)0 2 1 H(Summary)WB 64 Sn()EH( +This document is the Table of Contents for Funtools. + + +)0 2 2 H(Description)WB 65 Sn()EH( +Funtools, is a "minimal buy-in" FITS library and utility package developed +at the the High Energy Astrophysics Division of SAO. The Funtools +library provides simplified access to a wide array of file types: +standard astronomical FITS images and binary tables, raw arrays and +binary event lists, and even tables of ASCII column data. A +sophisticated region filtering library \201compatible with ds9\202 filters +images and tables using boolean operations between geometric shapes, +support world coordinates, etc. Funtools also supports advanced +capabilities such as optimized data searching using index files. + +The main goal of the Funtools project has been to develop a minimal buy-in +FITS library for researchers who are occasional \201but serious\202 coders. In +this case, "minimal buy-in" means "easy to learn, easy to use, and easy to +re-learn next month". We have tried to achieve this goal by emphasizing two +essential capabilities. The first is the ability to develop FITS programs +without knowing much about FITS, i.e., without having to deal with the +arcane rules for generating a properly formatted FITS file. The second is +to support the use of already-familiar C/Unix facilities, especially C +structs and Unix stdio. Taken together, these two capabilities should allow +researchers to leverage their existing programming expertise while +minimizing the need to learn new and complex coding rules. + + +)0 P(Choose from the following topics: + +)0 P()UL()-1 LI()0 2 1 A(Funtools User Programs)2 1 TN TL()Ec /AF f D( +)UL()-1 LI()0 3 1 A(funcalc: Funtools calculator \201for binary tables\202)3 1 TN TL()Ec /AF f D( + +)-1 LI()0 4 1 A(funcen: find centroid \201for binary tables\202)4 1 TN TL()Ec /AF f D( + +)-1 LI()0 5 1 A(funcnts: count photons in specified regions)5 1 TN TL()Ec /AF f D( + +)-1 LI()0 6 1 A(funcone: cone search on RA, Dec columns)6 1 TN TL()Ec /AF f D( + +)-1 LI()0 7 1 A(fundisp: display data in a Funtools data file)7 1 TN TL()Ec /AF f D( + +)-1 LI()0 8 1 A(funhead: display a header in a Funtools file)8 1 TN TL()Ec /AF f D( + +)-1 LI()0 9 1 A(funhist: create a 1D histogram of a column)9 1 TN TL()Ec /AF f D( + +)-1 LI()0 10 1 A(funimage: create a FITS image from a Funtools data file)10 1 TN TL()Ec /AF f D( + +)-1 LI()0 11 1 A(funindex: create an index on a column in a binary table)11 1 TN TL()Ec /AF f D( + +)-1 LI()0 12 1 A(funjoin: join two or more FITS binary tables on specified columns)12 1 TN TL()Ec /AF f D( + +)-1 LI()0 13 1 A(funmerge: merge one or more Funtools table files)13 1 TN TL()Ec /AF f D( + +)-1 LI()0 14 1 A(funsky: convert between image and sky coordinates, using WCS info from a FITS header)14 1 TN TL()Ec /AF f D( + +)-1 LI()0 15 1 A(funtable: copy selected rows from a Funtools file to a FITS binary table)15 1 TN TL()Ec /AF f D( + +)-1 LI()0 16 1 A(funtbl: extract a table from +Funtools ASCII output)16 1 TN TL()Ec /AF f D( + +)-1 LI()0 17 1 A(funtools and ds9 image display)17 1 TN TL()Ec /AF f D( +)LU( + +)-1 LI()0 18 1 A(Funtools Programming)18 1 TN TL()Ec /AF f D( +)UL()-1 LI()0 19 1 A(Funtools Programming Summary)19 1 TN TL()Ec /AF f D( + +)-1 LI()0 20 1 A(Funtools Programming Tutorial)20 1 TN TL()Ec /AF f D( + +)-1 LI()0 21 1 A(A Short Digression on Subroutine Order)21 1 TN TL()Ec /AF f D( + +)-1 LI()0 22 1 A(Compiling and Linking)22 1 TN TL()Ec /AF f D( + +)-1 LI()0 23 1 A(The Funtools Reference Handle)23 1 TN TL()Ec /AF f D( + +)-1 LI()0 24 1 A(The Funtools Programming Reference Manual)24 1 TN TL()Ec /AF f D( +)UL()-1 LI( )0 25 1 A(FunOpen: open a Funtools file)25 1 TN TL()Ec /AF f D( + +)-1 LI()0 26 1 A(FunImageGet: retrieve image data)26 1 TN TL()Ec /AF f D( + +)-1 LI()0 27 1 A(FunImagePut: output image data)27 1 TN TL()Ec /AF f D( + +)-1 LI()0 28 1 A(FunImageRowGet: retrieve image data by row)28 1 TN TL()Ec /AF f D( + +)-1 LI()0 29 1 A(FunImageRowPut: output image data by row)29 1 TN TL()Ec /AF f D( + +)-1 LI()0 30 1 A(FunTableRowGet: retrieve rows from a table)30 1 TN TL()Ec /AF f D( + +)-1 LI()0 31 1 A(FunTableRowPut: output rows to a table)31 1 TN TL()Ec /AF f D( + +)-1 LI()0 32 1 A(FunColumnSelect: select columns in a table for access)32 1 TN TL()Ec /AF f D( + +)-1 LI()0 33 1 A(FunColumnActivate: activate columns in a table for read/write)33 1 TN TL()Ec /AF f D( + +)-1 LI()0 34 1 A(FunColumnLookup: lookup info about the columns in a table)34 1 TN TL()Ec /AF f D( + +)-1 LI()0 35 1 A(FunInfoGet: get info about an image or table)35 1 TN TL()Ec /AF f D( + +)-1 LI()0 36 1 A(FunInfoPut: put info about an image or table)36 1 TN TL()Ec /AF f D( + +)-1 LI()0 37 1 A(FunParamGet: get header param)37 1 TN TL()Ec /AF f D( + +)-1 LI()0 38 1 A(FunParamPut: put header param)38 1 TN TL()Ec /AF f D( + +)-1 LI()0 39 1 A(FunFlush: flush I/O in a Funtools file)39 1 TN TL()Ec /AF f D( + +)-1 LI()0 40 1 A(FunClose: close a Funtools file)40 1 TN TL()Ec /AF f D( +)LU( + +)-1 LI()0 41 1 A(Funtools Programming Examples)41 1 TN TL()Ec /AF f D( + +)UL( +)-1 LI()0 2 A(evmerge: merge new columns with existing columns)EA( +)-1 LI()0 2 A(evcols: add column and rows to binary tables)EA( +)-1 LI()0 2 A(imblank: blank out image values below a threshold)EA()LU()LU( + +)-1 LI()0 42 1 A(Funtools Data Files)42 1 TN TL()Ec /AF f D( + +)UL( +)-1 LI()0 43 1 A(Supported Data Formats)43 1 TN TL()Ec /AF f D( +)UL()-1 LI()0 44 1 A(FITS File and Extensions)44 1 TN TL()Ec /AF f D( +)-1 LI()0 45 1 A(Non-FITS Raw Event Files)45 1 TN TL()Ec /AF f D( +)-1 LI()0 46 1 A(Non-FITS Array Files)46 1 TN TL()Ec /AF f D( +)-1 LI()0 47 1 A(Column-based Text \201ASCII\202 Files)47 1 TN TL()Ec /AF f D( +)-1 LI()0 48 1 A(Database Views of Tables)48 1 TN TL()Ec /AF f D()LU( +)-1 LI()0 49 1 A(Image Sections and Blocking)49 1 TN TL()Ec /AF f D( +)-1 LI()0 50 1 A(Binning FITS Binary Tables and Non-FITS Event Files)EH( +)-1 LI()0 51 1 A(Disk Files and Other Supported File Types)50 1 TN TL()Ec /AF f D()LU( + +)-1 LI(Funtools Data Filtering +)UL()-1 LI()0 52 1 A(Table Filtering)51 1 TN TL()Ec /AF f D( + +)-1 LI()0 53 1 A(Fast Table Filtering using Indexes)52 1 TN TL()Ec /AF f D( + +)-1 LI()0 54 1 A(Spatial Region Filtering)53 1 TN TL()Ec /AF f D( + +)UL()-1 LI()0 55 1 A(Region Geometry)54 1 TN TL()Ec /AF f D( + +)-1 LI()0 56 1 A(Region Algebra)55 1 TN TL()Ec /AF f D( + +)-1 LI()0 57 1 A(Region Coordinates)56 1 TN TL()Ec /AF f D( + +)-1 LI()0 58 1 A(Region Boundaries)57 1 TN TL()Ec /AF f D( + +)-1 LI()0 59 1 A(Differences Between Funtools and IRAF Regions)58 1 TN TL()Ec /AF f D( +)LU( +)-1 LI()0 60 1 A(Combining Table and Region Filters)59 1 TN TL()Ec /AF f D( +)LU( + +)-1 LI( Miscellaneous +)UL()-1 LI()0 61 1 A(Funtools Environment Variables)60 1 TN TL()Ec /AF f D( + +)-1 LI()0 62 1 A(Funtools ChangeLog)61 1 TN TL()Ec /AF f D()LU( +)LU( + + + +)0 5 3 H(Last)WB 66 Sn( updated: January 6, 2006)EH( + + +)WB NL NP Ep ET /Tc f D +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (programs.html) D +/Ti (Funtools Programs) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 2 Sn( +)0 2 4 H(Funtools)WB 67 Sn( Programs)EH( + +)0 2 5 H(Summary)WB 68 Sn()EH( + +)0 P() 27 129 PR()0 3 1 A(funcalc)3 0 TN TL()Ec /AF f D( [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] [-u] <iname> [oname [columns]] + +)0 4 1 A(funcen)4 0 TN TL()Ec /AF f D( [-i] [-n iter] [-t tol] [-v lev] <iname> <region> + +)0 5 1 A(funcnts)5 0 TN TL()Ec /AF f D( [switches] <source_file> [source_region] [bkgd_file] [bkgd_region|bkgd_cnts] + +)0 6 1 A(funcone)6 0 TN TL()Ec /AF f D( [-n] [-x|-X|-j|-J] [[-l|-L] list] [-r ra_col] [-d dec_col] <iname> <oname> <ra[hdr]> <dec[hdr]> <radius[dr'"]> [columns] + +)0 7 1 A(fundisp)7 0 TN TL()Ec /AF f D( [-f format] [-l] [-n] [-T] <iname> [columns|bitpix=n] + +)0 8 1 A(funhead)8 0 TN TL()Ec /AF f D( [-a] [-l] [-s] [-t] [-L] <iname> [oname ename] + +)0 9 1 A(funhist)9 0 TN TL()Ec /AF f D( [-n|-w|-T] <iname> [column] [[lo_edge:hi_edge:]bins] + +)0 10 1 A(funimage)10 0 TN TL()Ec /AF f D( [-a] [-l] [-p x|y] <iname> <oname> [bitpix=n] + +)0 11 1 A(funindex)11 0 TN TL()Ec /AF f D( <iname> <key> [oname] + +)0 12 1 A(funjoin)12 0 TN TL()Ec /AF f D( [switches] <ifile1> <ifile2> ... <ifilen> <ofile> + +)0 13 1 A(funmerge)13 0 TN TL()Ec /AF f D( <iname1> <iname2> ... <oname> + +)0 14 1 A(funsky)14 0 TN TL()Ec /AF f D( [switches] <iname1> [<lname2> <col1> <col2>] + +)0 15 1 A(funtable)15 0 TN TL()Ec /AF f D( [-a] [-i|-z] [-m] [-s cols] <iname> <oname> [columns] + +)0 16 1 A(funtbl)16 0 TN TL()Ec /AF f D( [-c cols] [-h] [-n table] [-p prog] [-s sep] [-T] <iname>)RP( + + + + +)0 2 6 H(funcalc)WB 69 Sn()WB 3 Sn( - Funtools calculator \201for binary tables\202)EA()EH( + +)BD() 1 90 PR(funcalc [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] <iname> [oname [columns]])RP()ES( + + +)0 P() 7 73 PR( -a argstr # user arguments to pass to the compiled program + -e expr # funcalc expression + -f file # file containing funcalc expression + -l libs # libs to add to link command + -n # output generated code instead of compiling and executing + -p prog # generate named program, no execution + -u # die if any variable is undeclared \201don't auto-declare\202)RP( + + +)0 P()BD(funcalc)ES( is a calculator program that allows arbitrary +expressions to be constructed, compiled, and executed on columns in a +Funtools table \201FITS binary table or raw event file\202. It works by +integrating user-supplied expression\201s\202 into a template C program, +then compiling and executing the program. )BD(funcalc)ES( expressions +are C statements, although some important simplifications \201such +as automatic declaration of variables\202 are supported. + +)0 P()BD(funcalc)ES( expressions can be specified in three ways: on the +command line using the )BD(-e [expression])ES( switch, in a file using +the )BD(-f [file])ES( switch, or from stdin \201if neither )BD(-e)ES( nor +)BD(-f)ES( is specified\202. Of course a file containing )BD(funcalc)ES( +expressions can be read from stdin. + +)0 P(Each invocation of )BD(funcalc)ES( requires an input Funtools table +file to be specified as the first command line argument. The output +Funtools table file is the second optional argument. It is needed only +if an output FITS file is being created \201i.e., in cases where the +)BD(funcalc)ES( expression only prints values, no output file is +needed\202. If input and output file are both specified, a third optional +argument can specify the list of columns to activate \201using +)0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D(\202. Note +that )BD(funcalc)ES( determines whether or not to generate code for +writing an output file based on the presence or absence of an +output file argument. + +)0 P(A )BD(funcalc)ES( expression executes on each row of a table and +consists of one or more C statements that operate on the columns of +that row \201possibly using temporary variables\202. Within an expression, +reference is made to a column of the )BD(current)ES( row using the C +struct syntax )BD(cur->[colname])ES(, e.g. cur->x, cur->pha, etc. +Local scalar variables can be defined using C declarations at very the +beginning of the expression, or else they can be defined automatically +by )BD(funcalc)ES( \201to be of type double\202. Thus, for example, a swap of +columns x and y in a table can be performed using either of the +following equivalent )BD(funcalc)ES( expressions: + +) 4 18 PR( double temp; + temp = cur->x; + cur->x = cur->y; + cur->y = temp;)RP( + +or: + +) 3 18 PR( temp = cur->x; + cur->x = cur->y; + cur->y = temp;)RP( + +When this expression is executed using a command such as: +) 1 40 PR( funcalc -f swap.expr itest.ev otest.ev)RP( +the resulting file will have values of the x and y columns swapped. + +)0 P(By default, the data type of the variable for a column is the same as +the data type of the column as stored in the file. This can be changed +by appending ":[dtype]" to the first reference to that column. In the +example above, to force x and y to be output as doubles, specify the +type 'D' explicitly: +) 3 20 PR( temp = cur->x:D; + cur->x = cur->y:D; + cur->y = temp;)RP( + +Data type specifiers follow standard FITS table syntax for defining +columns using TFORM: +)UL()-1 LI(A: ASCII characters +)-1 LI(B: unsigned 8-bit char +)-1 LI(I: signed 16-bit int +)-1 LI(U: unsigned 16-bit int \201not standard FITS\202 +)-1 LI(J: signed 32-bit int +)-1 LI(V: unsigned 32-bit int \201not standard FITS\202 +)-1 LI(E: 32-bit float +)-1 LI(D: 64-bit float +)-1 LI(X: bits \201treated as an array of chars\202)LU( +Note that only the first reference to a column should contain the +explicit data type specifier. + +)0 P(Of course, it is important to handle the data type of the columns +correctly. One of the most frequent cause of error in )BD(funcalc)ES( +programming is the implicit use of the wrong data type for a column in +expression. For example, the calculation: +) 1 43 PR( dx = \201cur->x - cur->y\202/\201cur->x + cur->y\202;)RP( +usually needs to be performed using floating point arithmetic. In +cases where the x and y columns are integers, this can be done by +reading the columns as doubles using an explicit type specification: +) 1 47 PR( dx = \201cur->x:D - cur->y:D\202/\201cur->x + cur->y\202;)RP( + +Alternatively, it can be done using C type-casting in the expression: +) 1 75 PR( dx = \201\201double\202cur->x - \201double\202cur->y\202/\201\201double\202cur->x + \201double\202cur->y\202;)RP( + +)0 P(In addition to accessing columns in the current row, reference also +can be made to the )BD(previous)ES( row using )BD(prev->[colname])ES(, +and to the )BD(next)ES( row using )BD(next->[colname])ES(. Note that if +)BD(prev->[colname])ES( is specified in the )BD(funcalc)ES( +expression, the very first row is not processed. If +)BD(next->[colname])ES( is specified in the )BD(funcalc)ES( +expression, the very last row is not processed. In this way, +)BD(prev)ES( and )BD(next)ES( are guaranteed always to point to valid +rows. For example, to print out the values of the current x column +and the previous y column, use the C fprintf function in a +)BD(funcalc)ES( expression: +) 1 46 PR( fprintf\201stdout, "%d %d\200n", cur->x, prev->y\202;)RP( + +)0 P(New columns can be specified using the same )BD(cur->[colname])ES( +syntax by appending the column type \201and optional tlmin/tlmax/binsiz +specifiers\202, separated by colons. For example, cur->avg:D will define +a new column of type double. Type specifiers are the same those +used above to specify new data types for existing columns. + +)0 P(For example, to create and output a new column that is the average value of the +x and y columns, a new "avg" column can be defined: +) 1 36 PR( cur->avg:D = \201cur->x + cur->y\202/2.0)RP( +Note that the final ';' is not required for single-line expressions. + +)0 P(As with FITS TFORM data type specification, the column data type +specifier can be preceded by a numeric count to define an array, e.g., +"10I" means a vector of 10 short ints, "2E" means two single precision +floats, etc. A new column only needs to be defined once in a +)BD(funcalc)ES( expression, after which it can be used without +re-specifying the type. This includes reference to elements of a +column array: + +) 2 41 PR( cur->avg[0]:2D = \201cur->x + cur->y\202/2.0; + cur->avg[1] = \201cur->x - cur->y\202/2.0;)RP( + +)0 P(The 'X' \201bits\202 data type is treated as a char array of dimension +\201numeric_count/8\202, i.e., 16X is processed as a 2-byte char array. Each +8-bit array element is accessed separately: +) 2 24 PR( cur->stat[0]:16X = 1; + cur->stat[1] = 2;)RP( +Here, a 16-bit column is created with the MSB is set to 1 and the LSB set to 2. + +)0 P(By default, all processed rows are written to the specified output +file. If you want to skip writing certain rows, simply execute the C +"continue" statement at the end of the )BD(funcalc)ES( expression, +since the writing of the row is performed immediately after the +expression is executed. For example, to skip writing rows whose +average is the same as the current x value: + +) 4 41 PR( cur->avg[0]:2D = \201cur->x + cur->y\202/2.0; + cur->avg[1] = \201cur->x - cur->y\202/2.0; + if\201 cur->avg[0] == cur->x \202 + continue;)RP( + +)0 P(If no output file argument is specified on the )BD(funcalc)ES( command +line, no output file is opened and no rows are written. This is useful +in expressions that simply print output results instead of generating +a new file: +) 5 73 PR( fpv = \201cur->av3:D-cur->av1:D\202/\201cur->av1+cur->av2:D+cur->av3\202; + fbv = cur->av2/\201cur->av1+cur->av2+cur->av3\202; + fpu = \201\201double\202cur->au3-cur->au1\202/\201\201double\202cur->au1+cur->au2+cur->au3\202; + fbu = cur->au2/\201double\202\201cur->au1+cur->au2+cur->au3\202; + fprintf\201stdout, "%f\200t%f\200t%f\200t%f\200n", fpv, fbv, fpu, fbu\202;)RP( +In the above example, we use both explicit type specification +\201for "av" columns\202 and type casting \201for "au" columns\202 to ensure that +all operations are performed in double precision. + +)0 P(When an output file is specified, the selected input table is +processed and output rows are copied to the output file. Note that +the output file can be specified as "stdout" in order to write the +output rows to the standard output. If the output file argument is +passed, an optional third argument also can be passed to specify which +columns to process. + +)0 P(In a FITS binary table, it sometimes is desirable to copy all of the +other FITS extensions to the output file as well. This can be done by +appending a '+' sign to the name of the extension in the input file +name. See )BD(funtable)ES( for a related example. + +)0 P()BD(funcalc)ES( works by integrating the user-specified expression +into a template C program called )0 2 A(tabcalc.c)EA(. +The completed program then is compiled and executed. Variable +declarations that begin the )BD(funcalc)ES( expression are placed in +the local declaration section of the template main program. All other +lines are placed in the template main program's inner processing +loop. Other details of program generation are handled +automatically. For example, column specifiers are analyzed to build a +C struct for processing rows, which is passed to +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( and used +in )0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(. If +an unknown variable is used in the expression, resulting in a +compilation error, the program build is retried after defining the +unknown variable to be of type double. + +)0 P(Normally, )BD(funcalc)ES( expression code is added to +)BD(funcalc)ES( row processing loop. It is possible to add code +to other parts of the program by placing this code inside +special directives of the form: +) 3 26 PR( [directive name] + ... code goes here ... + end)RP( + +The directives are: +)UL()-1 LI()BD(global)ES( add code and declarations in global space, before the main routine. + +)-1 LI()BD(local)ES( add declarations \201and code\202 just after the local declarations in +main + +)-1 LI()BD(before)ES( add code just before entering the main row processing loop + +)-1 LI()BD(after)ES( add code just after exiting the main row processing loop)LU( + +Thus, the following )BD(funcalc)ES( expression will declare global +variables and make subroutine calls just before and just after the +main processing loop: +) 16 62 PR( global + double v1, v2; + double init\201void\202; + double finish\201double v\202; + end + before + v1 = init\201\202; + end + ... process rows, with calculations using v1 ... + after + v2 = finish\201v1\202; + if\201 v2 < 0.0 \202{ + fprintf\201stderr, "processing failed %g -> %g\200n", v1, v2\202; + exit\2011\202; + } + end)RP( +Routines such as init\201\202 and finish\201\202 above are passed to the generated +program for linking using the )BD(-l [link directives ...])ES( +switch. The string specified by this switch will be added to the link +line used to build the program \201before the funtools library\202. For +example, assuming that init\201\202 and finish\201\202 are in the library +libmysubs.a in the /opt/special/lib directory, use: +) 1 47 PR( funcalc -l "-L/opt/special/lib -lmysubs" ...)RP( + +)0 P(User arguments can be passed to a compiled funcalc program using a string +argument to the "-a" switch. The string should contain all of the +user arguments. For example, to pass the integers 1 and 2, use: +) 1 22 PR( funcalc -a "1 2" ...)RP( +The arguments are stored in an internal array and are accessed as +strings via the ARGV\201n\202 macro. For example, consider the following +expression: +) 11 60 PR( local + int pmin, pmax; + end + + before + pmin=atoi\201ARGV\2010\202\202; + pmax=atoi\201ARGV\2011\202\202; + end + + if\201 \201cur->pha >= pmin\202 && \201cur->pha <= pmax\202 \202 + fprintf\201stderr, "%d %d %d\200n", cur->x, cur->y, cur->pha\202;)RP( +This expression will print out x, y, and pha values for all rows in which +the pha value is between the two user-input values: +) 11 51 PR( funcalc -a '1 12' -f foo snr.ev'[cir 512 512 .1]' + 512 512 6 + 512 512 8 + 512 512 5 + 512 512 5 + 512 512 8 + + funcalc -a '5 6' -f foo snr.ev'[cir 512 512 .1]' + 512 512 6 + 512 512 5 + 512 512 5)RP( + +)0 P(Note that it is the user's responsibility to ensure that the correct +number of arguments are passed. The ARGV\201n\202 macro returns a NULL if a +requested argument is outside the limits of the actual number of args, +usually resulting in a SEGV if processed blindly. To check the +argument count, use the ARGC macro: +) 12 42 PR( local + long int seed=1; + double limit=0.8; + end + + before + if\201 ARGC >= 1 \202 seed = atol\201ARGV\2010\202\202; + if\201 ARGC >= 2 \202 limit = atof\201ARGV\2011\202\202; + srand48\201seed\202; + end + + if \201 drand48\201\202 > limit \202 continue;)RP( + +)0 P(The macro WRITE_ROW expands to the FunTableRowPut\201\202 call that writes +the current row. It can be used to write the row more than once. In +addition, the macro NROW expands to the row number currently being +processed. Use of these two macros is shown in the following example: +) 7 41 PR( if\201 cur->pha:I == cur->pi:I \202 continue; + a = cur->pha; + cur->pha = cur->pi; + cur->pi = a; + cur->AVG:E = \201cur->pha+cur->pi\202/2.0; + cur->NR:I = NROW; + if\201 NROW < 10 \202 WRITE_ROW;)RP( + +)0 P(If the )BD(-p [prog])ES( switch is specified, the expression is not +executed. Rather, the generated executable is saved with the specified +program name for later use. + +)0 P(If the )BD(-n)ES( switch is specified, the expression is not +executed. Rather, the generated code is written to stdout. This is +especially useful if you want to generate a skeleton file and add your +own code, or if you need to check compilation errors. Note that the +comment at the start of the output gives the compiler command needed +to build the program on that platform. \201The command can change from +platform to platform because of the use of different libraries, +compiler switches, etc.\202 + +)0 P(As mentioned previously, )BD(funcalc)ES( will declare a scalar +variable automatically \201as a double\202 if that variable has been used +but not declared. This facility is implemented using a sed script +named )0 2 A(funcalc.sed)EA(, which processes the +compiler output to sense an undeclared variable error. This script +has been seeded with the appropriate error information for gcc, and for +cc on Solaris, DecAlpha, and SGI platforms. If you find that automatic +declaration of scalars is not working on your platform, check this sed +script; it might be necessary to add to or edit some of the error +messages it senses. + +)0 P(In order to keep the lexical analysis of )BD(funcalc)ES( expressions +\201reasonably\202 simple, we chose to accept some limitations on how +accurately C comments, spaces, and new-lines are placed in the +generated program. In particular, comments associated with local +variables declared at the beginning of an expression \201i.e., not in a +)BD(local...end)ES( block\202 will usually end up in the inner loop, not +with the local declarations: +) 8 69 PR( /* this comment will end up in the wrong place \201i.e, inner loop\202 */ + double a; /* also in wrong place */ + /* this will be in the the right place \201inner loop\202 */ + if\201 cur->x:D == cur->y:D \202 continue; /* also in right place */ + a = cur->x; + cur->x = cur->y; + cur->y = a; + cur->avg:E = \201cur->x+cur->y\202/2.0;)RP( +Similarly, spaces and new-lines sometimes are omitted or added in a +seemingly arbitrary manner. Of course, none of these stylistic +blemishes affect the correctness of the generated code. + +)0 P(Because )BD(funcalc)ES( must analyze the user expression using the data +file\201s\202 passed on the command line, the input file\201s\202 must be opened +and read twice: once during program generation and once during +execution. As a result, it is not possible to use stdin for the +input file: )BD(funcalc)ES( cannot be used as a filter. We will +consider removing this restriction at a later time. + +)0 P(Along with C comments, )BD(funcalc)ES( expressions can have one-line +internal comments that are not passed on to the generated C +program. These internal comment start with the )BD(#)ES( character and +continue up to the new-line: +) 7 56 PR( double a; # this is not passed to the generated C file + # nor is this + a = cur->x; + cur->x = cur->y; + cur->y = a; + /* this comment is passed to the C file */ + cur->avg:E = \201cur->x+cur->y\202/2.0;)RP( + +)0 P(As previously mentioned, input columns normally are identified by +their being used within the inner event loop. There are rare cases +where you might want to read a column and process it outside the main +loop. For example, qsort might use a column in its sort comparison +routine that is not processed inside the inner loop \201and therefore not +implicitly specified as a column to be read\202. To ensure that such a +column is read by the event loop, use the )BD(explicit)ES( keyword. +The arguments to this keyword specify columns that should be read into +the input record structure even though they are not mentioned in the +inner loop. For example: + ) 1 17 PR( explicit pi pha)RP( +will ensure that the pi and pha columns are read for each row, +even if they are not processed in the inner event loop. The )BD(explicit)ES( +statement can be placed anywhere. + +)0 P(Finally, note that )BD(funcalc)ES( currently works on expressions +involving FITS binary tables and raw event files. We will consider +adding support for image expressions at a later point, if there is +demand for such support from the community. + + + + +)0 2 7 H(funcen)WB 70 Sn()WB 4 Sn( - find centroid \201for binary tables\202)EA()EH( + +)BD() 1 56 PR(funcen [-i] [-n iter] [-t tol] [-v lev] <iname> <region>)RP()ES( + + +)0 P() 4 64 PR( -i # use image filtering \201default: event filtering\202 + -n iter # max number of iterations \201default: 0\202 + -t tol # pixel tolerance distance \201default: 1.0\202 + -v [0,1,2,3] # output verbosity level \201default: 0\202)RP( + + +)0 P()BD(funcen)ES( iteratively calculates the centroid position within one +or more regions of a Funtools table \201FITS binary table or raw event +file\202. Starting with an input table, an initial region specification, +and an iteration count, the program calculates the average x and y +position within the region and then uses this new position as the +region center for the next iteration. Iteration terminates when the +maximum number of iterations is reached or when the input tolerance +distance is met for that region. A count of events in the final region +is then output, along with the pixel position value \201and, where +available, WCS position\202. + +)0 P(The first argument to the program specifies the Funtools table file to +process. Since the file must be read repeatedly, a value of "stdin" +is not permitted when the number of iterations is non-zero. Use +)0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS +extensions and filters. + +)0 P(The second required argument is the initial region descriptor. Multiple +regions are permitted. However, compound regions \201accelerators, +variable argument regions and regions connected via boolean algebra\202 +are not permitted. Points and polygons also are illegal. These +restrictions might be lifted in a future version, if warranted. + +)0 P(The )BD(-n)ES( \201iteration number\202 switch specifies the maximum number of +iterations to perform. The default is 0, which means that the program will +simply count and display the number of events in the initial region\201s\202. +Note that when iterations is 0, the data can be input via stdin. + +)0 P(The )BD(-t)ES( \201tolerance\202 switch specifies a floating point tolerance +value. If the distance between the current centroid position value and +the last position values is less than this value, iteration terminates. +The default value is 1 pixel. + +)0 P(The )BD(-v)ES( \201verbosity\202 switch specifies the verbosity level of the +output. The default is 0, which results in a single line of output for +each input region consisting of the following values: +) 1 30 PR( counts x y [ra dec coordsys])RP( +The last 3 WCS values are output if WCS information is available in the +data file header. Thus, for example: +) 5 47 PR( [sh] funcen -n 0 snr.ev "cir 505 508 5" + 915 505.00 508.00 345.284038 58.870920 j2000 + + [sh] funcen -n 3 snr.ev "cir 505 508 5" + 1120 504.43 509.65 345.286480 58.874587 j2000)RP( +The first example simply counts the number of events in the initial region. +The second example iterates the centroid calculation three times to determine +a final "best" position. + +)0 P( +Higher levels of verbosity obviously imply more verbose output. At +level 1, the output essentially contains the same information as level +0, but with keyword formatting: + + [sh] funcen -v 1 -n 3 snr.ev "cir 505 508 5" + event_file: snr.ev + initial_region: cir 505 508 5 + tolerance: 1.0000 + iterations: 1 + + events: 1120 + x,y\201physical\202: 504.43 509.65 + ra,dec\201j2000\202: 345.286480 58.874587 + final_region1: cir 504.43 509.65 5)RP( +Level 2 outputs results from intermediate calculations as well. + +)0 P(Ordinarily, region filtering is performed using analytic \201event\202 +filtering, i.e. that same style of filtering as is performed by +)BD(fundisp)ES( and )BD(funtable)ES(. Use the )BD(-i)ES( switch to specify image +filtering, i.e. the same style filtering as is performed by )BD(funcnts)ES(. +Thus, you can perform a quick calculation of counts in regions, using +either the analytic or image filtering method, by specifying the + )BD(-n 0)ES( and optional )BD(-i)ES( switches. These two method often +give different results because of how boundary events are processed: +) 5 46 PR( [sh] funcen snr.ev "cir 505 508 5" + 915 505.00 508.00 345.284038 58.870920 j2000 + + [sh] funcen -i snr.ev "cir 505 508 5" + 798 505.00 508.00 345.284038 58.870920 j2000)RP( +See )0 58 1 A(Region Boundaries)58 0 TN TL()Ec /AF f D( for more information +about how boundaries are calculated using these two methods. + + + + +)0 2 8 H(funcnts)WB 71 Sn()WB 5 Sn( - count photons in specified regions, with bkgd subtraction)EA()EH( + + +)BD() 1 86 PR(funcnts [switches] <source_file> [source_region] [bkgd_file] [bkgd_region|bkgd_value])RP()ES( + + +)0 P() 16 79 PR( -e "source_exposure[;bkgd_exposure]" + # source \201bkgd\202 FITS exposure image using matching files + -w "source_exposure[;bkgd_exposure]" + # source \201bkgd\202 FITS exposure image using WCS transform + -t "source_timecorr[;bkgd_timecorr]" + # source \201bkgd\202 time correction value or header parameter name + -g # output using nice g format + -G # output using %.14g format \201maximum precision\202 + -i "[column;]int1;int2..." # column-based intervals + -m # match individual source and bkgd regions + -p # output in pixels, even if wcs is present + -r # output inner/outer radii \201and angles\202 for annuli \201and pandas\202 + -s # output summed values + -v "scol[;bcol]" # src and bkgd value columns for tables + -T # output in starbase/rdb format + -z # output regions with zero area)ES()RP( + + +)0 P()BD(funcnts)ES( counts photons in the specified source regions and +reports the results for each region. Regions are specified using the +)0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D( mechanism. +Photons are also counted in the specified bkgd regions applied to the +same data file or a different data file. \201Alternatively, a constant +background value in counts/pixel**2 can be specified.\202 The bkgd regions +are either paired one-to-one with source regions or pooled and +normalized by area, and then subtracted from the source counts in each +region. Displayed results include the bkgd-subtracted counts in each +region, as well as the error on the counts, the area in +each region, and the surface brightness \201cnts/area**2\202 calculated for +each region. + +)0 P(The first argument to the program specifies the FITS input image, array, or +raw event file to process. If "stdin" is specified, data are read from +the standard input. Use )0 42 1 A(Funtools Bracket +Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, image sections, and filters. + +)0 P(The optional second argument is the source region descriptor. If no +region is specified, the entire field is used. + +)0 P(The background arguments can take one of two forms, depending on +whether a separate background file is specified. If the source +file is to be used for background as well, the third argument can be +either the background region, or a constant value denoting background +cnts/pixel. Alternatively, the third argument can be a background +data file, in which case the fourth argument is the background region. +If no third argument is specified, a constant value of 0 is used +\201i.e., no background\202. + +)0 P(In summary, the following command arguments are valid: +) 5 77 PR( [sh] funcnts sfile # counts in source file + [sh] funcnts sfile sregion # counts in source region + [sh] funcnts sfile sregion bregion # bkgd reg. is from source file + [sh] funcnts sfile sregion bvalue # bkgd reg. is constant + [sh] funcnts sfile sregion bfile bregion # bkgd reg. is from separate file)RP( + +)0 P(NB: unlike other Funtools programs, source and background regions are +specified as separate arguments on the command line, rather than being +placed inside brackets as part of the source and background filenames. +This is because regions in funcnts are not simply used as data +filters, but also are used to calculate areas, exposure, etc. If you +put the source region inside the brackets \201i.e. use it simply as a +filter\202 rather than specifying it as argument two, the program still +will only count photons that pass the region filter. However, the area +calculation will be performed on the whole field, since field\201\202 is the +default source region. This rarely is the desired behavior. On the +other hand, with FITS binary tables, it often is useful to put a column +filter in the filename brackets, so that only events matching the +column filter are counted inside the region. + +)0 P(For example, to extract the counts within a radius of 22 pixels from the +center of the FITS binary table snr.ev and subtract the background determined +from the same image within an annulus of radii 50-100 pixels: +) 33 82 PR( [sh] funcnts snr.ev "circle\201502,512,22\202" "annulus\201502,512,50,100\202" + # source + # data file: snr.ev + # degrees/pix: 0.00222222 + # background + # data file: snr.ev + # column units + # area: arcsec**2 + # surf_bri: cnts/arcsec**2 + # surf_err: cnts/arcsec**2 + + # background-subtracted results + reg net_counts error background berror area surf_bri surf_err + ---- ------------ --------- ------------ --------- --------- --------- --------- + 1 3826.403 66.465 555.597 5.972 96831.98 0.040 0.001 + + + # the following source and background components were used: + source region\201s\202 + ---------------- + circle\201502,512,22\202 + + reg counts pixels + ---- ------------ --------- + 1 4382.000 1513 + + background region\201s\202 + -------------------- + annulus\201502,512,50,100\202 + + reg counts pixels)WR( + ---- ------------ --------- + all 8656.000 23572)RP( +The area units for the output columns labeled "area", "surf_bri" +\201surface brightness\202 and "surf_err" will be given either in +arc-seconds \201if appropriate WCS information is in the data file +header\201s\202\202 or in pixels. If the data file has WCS info, but you do not +want arc-second units, use the )BD(-p)ES( switch to force output in +pixels. Also, regions having zero area are not normally included in +the primary \201background-subtracted\202 table, but are included in the +secondary source and bkgd tables. If you want these regions to be +included in the primary table, use the )BD(-z)ES( switch. + +)0 P(Note that a simple sed command will extract the background-subtracted results +for further analysis: +) 6 79 PR( [sh] cat funcnts.sed + 1,/---- .*/d + /^$/,$d + + [sh] sed -f funcnts.sed funcnts.out + 1 3826.403 66.465 555.597 5.972 96831.98 0.040 0.001)RP( + +)0 P(If separate source and background files are specified, )BD(funcnts)ES( will +attempt to normalize the the background area so that the background +pixel size is the same as the source pixel size. This normalization +can only take place if the appropriate WCS information is contained in +both files \201e.g. degrees/pixel values in CDELT\202. If either +file does not contain the requisite size information, the normalization +is not performed. In this case, it is the user's responsibility to +ensure that the pixel sizes are the same for the two files. + +)0 P(Normally, if more than one background region is specified, )BD(funcnts)ES( +will combine them all into a single region and use this background +region to produce the background-subtracted results for each source +region. The )BD(-m)ES( \201match multiple backgrounds\202 switch tells +)BD(funcnts)ES( to make a one to one correspondence between background and +source regions, instead of using a single combined background region. +For example, the default case is to combine 2 background +regions into a single region and then apply that region to each of the +source regions: + +) 35 82 PR( [sh] funcnts snr.ev "annulus\201502,512,0,22,n=2\202" "annulus\201502,512,50,100,n=2\202" + # source + # data file: snr.ev + # degrees/pix: 0.00222222 + # background + # data file: snr.ev + # column units + # area: arcsec**2 + # surf_bri: cnts/arcsec**2 + # surf_err: cnts/arcsec**2 + + # background-subtracted results + reg net_counts error background berror area surf_bri surf_err + ---- ------------ --------- ------------ --------- --------- --------- --------- + 1 3101.029 56.922 136.971 1.472 23872.00 0.130 0.002 + 2 725.375 34.121 418.625 4.500 72959.99 0.010 0.000 + + + # the following source and background components were used: + source region\201s\202 + ---------------- + annulus\201502,512,0,22,n=2\202 + + reg counts pixels + ---- ------------ --------- + 1 3238.000 373 + 2 1144.000 1140 + + background region\201s\202 + -------------------- + annulus\201502,512,50,100,n=2\202)WR( + + reg counts pixels + ---- ------------ --------- + all 8656.000 23572)RP( +Note that the basic region filter rule "each photon is counted once +and no photon is counted more than once" still applies when using The +)BD(-m)ES( to match background regions. That is, if two background +regions overlap, the overlapping pixels will be counted in only one of +them. In a worst-case scenario, if two background regions are the same +region, the first will get all the counts and area and the second +will get none. + +)0 P(Using the )BD(-m)ES( switch causes )BD(funcnts)ES( to use each of the two +background regions independently with each of the two source regions: + +) 36 82 PR( [sh] funcnts -m snr.ev "annulus\201502,512,0,22,n=2\202" "ann\201502,512,50,100,n=2\202" + # source + # data file: snr.ev + # degrees/pix: 0.00222222 + # background + # data file: snr.ev + # column units + # area: arcsec**2 + # surf_bri: cnts/arcsec**2 + # surf_err: cnts/arcsec**2 + + # background-subtracted results + reg net_counts error background berror area surf_bri surf_err + ---- ------------ --------- ------------ --------- --------- --------- --------- + 1 3087.015 56.954 150.985 2.395 23872.00 0.129 0.002 + 2 755.959 34.295 388.041 5.672 72959.99 0.010 0.000 + + + # the following source and background components were used: + source region\201s\202 + ---------------- + annulus\201502,512,0,22,n=2\202 + + reg counts pixels + ---- ------------ --------- + 1 3238.000 373 + 2 1144.000 1140 + + background region\201s\202 + -------------------- + ann\201502,512,50,100,n=2\202)WR( + + reg counts pixels + ---- ------------ --------- + 1 3975.000 9820 + 2 4681.000 13752)RP( + +)0 P(Note that most floating point quantities are displayed using "f" +format. You can change this to "g" format using the )BD(-g)ES( +switch. This can be useful when the counts in each pixel is very +small or very large. If you want maximum precision and don't care +about the columns lining up nicely, use )BD(-G)ES(, which outputs +all floating values as %.14g. + +)0 P(When counting photons using the annulus and panda \201pie and annuli\202 +shapes, it often is useful to have access to the radii \201and panda +angles\202 for each separate region. The )BD(-r)ES( switch will add radii +and angle columns to the output table: + +) 37 122 PR( [sh] funcnts -r snr.ev "annulus\201502,512,0,22,n=2\202" "ann\201502,512,50,100,n=2\202" + # source + # data file: snr.ev + # degrees/pix: 0.00222222 + # background + # data file: snr.ev + # column units + # area: arcsec**2 + # surf_bri: cnts/arcsec**2 + # surf_err: cnts/arcsec**2 + # radii: arcsecs + # angles: degrees + + # background-subtracted results + reg net_counts error background berror area surf_bri surf_err radius1 radius2 angle1 angle2 + ---- ------------ --------- ------------ --------- --------- --------- --------- --------- --------- --------- --------- + 1 3101.029 56.922 136.971 1.472 23872.00 0.130 0.002 0.00 88.00 NA NA + 2 725.375 34.121 418.625 4.500 72959.99 0.010 0.000 88.00 176.00 NA NA + + + # the following source and background components were used: + source region\201s\202 + ---------------- + annulus\201502,512,0,22,n=2\202 + + reg counts pixels + ---- ------------ --------- + 1 3238.000 373 + 2 1144.000 1140 + + background region\201s\202)WR( + -------------------- + ann\201502,512,50,100,n=2\202 + + reg counts pixels + ---- ------------ --------- + all 8656.000 23572)RP( + +)0 P(Radii are given in units of pixels or arc-seconds \201depending on the +presence of WCS info\202, while the angle values \201when present\202 are in +degrees. These columns can be used to plot radial profiles. For +example, the script )BD(funcnts.plot)ES( in the funtools +distribution\202 will plot a radial profile using gnuplot \201version 3.7 or +above\202. A simplified version of this script is shown below: + +) 74 79 PR( #!/bin/sh + + if [ x"$1" = xgnuplot ]; then + if [ x`which gnuplot 2>/dev/null` = x ]; then + echo "ERROR: gnuplot not available" + exit 1 + fi + awk ' + BEGIN{HEADER=1; DATA=0; FILES=""; XLABEL="unknown"; YLABEL="unknown"} + HEADER==1{ + if\201 $1 == "#" && $2 == "data" && $3 == "file:" \202{ + if\201 FILES != "" \202 FILES = FILES "," + FILES = FILES $4 + } + else if\201 $1 == "#" && $2 == "radii:" \202{ + XLABEL = $3 + } + else if\201 $1 == "#" && $2 == "surf_bri:" \202{ + YLABEL = $3 + } + else if\201 $1 == "----" \202{ + printf "set nokey; set title \200"funcnts\201%s\202\200"\200n", FILES + printf "set xlabel \200" radius\201%s\202\200"\200n", XLABEL + printf "set ylabel \200"surf_bri\201%s\202\200"\200n", YLABEL + print "plot \200"-\200" using 3:4:6:7:8 with boxerrorbars" + HEADER = 0 + DATA = 1 + next + } + } + DATA==1{)WR( + if\201 NF == 12 \202{ + print $9, $10, \201$9+$10\202/2, $7, $8, $7-$8, $7+$8, $10-$9 + } + else{ + exit + } + } + ' | gnuplot -persist - 1>/dev/null 2>&1 + + elif [ x"$1" = xds9 ]; then + awk ' + BEGIN{HEADER=1; DATA=0; XLABEL="unknown"; YLABEL="unknown"} + HEADER==1{ + if\201 $1 == "#" && $2 == "data" && $3 == "file:" \202{ + if\201 FILES != "" \202 FILES = FILES "," + FILES = FILES $4 + } + else if\201 $1 == "#" && $2 == "radii:" \202{ + XLABEL = $3 + } + else if\201 $1 == "#" && $2 == "surf_bri:" \202{ + YLABEL = $3 + } + else if\201 $1 == "----" \202{ + printf "funcnts\201%s\202 radius\201%s\202 surf_bri\201%s\202 3\200n", FILES, XLABEL, YLABEL + HEADER = 0 + DATA = 1 + next + } + })WR( + DATA==1{ + if\201 NF == 12 \202{ + print $9, $7, $8 + } + else{ + exit + } + } + ' + else + echo "funcnts -r ... | funcnts.plot [ds9|gnuplot]" + exit 1 + fi)RP( + +Thus, to run )BD(funcnts)ES( and plot the results using gnuplot \201version 3.7 +or above\202, use: +) 1 75 PR( funcnts -r snr.ev "annulus\201502,512,0,50,n=5\202" ... | funcnts.plot gnuplot)RP( + +)0 P(The )BD(-s)ES( \201sum\202 switch causes )BD(funcnts)ES( to produce an +additional table of summed \201integrated\202 background subtracted values, +along with the default table of individual values: + +) 51 82 PR( [sh] funcnts -s snr.ev "annulus\201502,512,0,50,n=5\202" "annulus\201502,512,50,100\202" + # source + # data file: snr.ev + # degrees/pix: 0.00222222 + # background + # data file: snr.ev + # column units + # area: arcsec**2 + # surf_bri: cnts/arcsec**2 + # surf_err: cnts/arcsec**2 + + # summed background-subtracted results + upto net_counts error background berror area surf_bri surf_err + ---- ------------ --------- ------------ --------- --------- --------- --------- + 1 2880.999 54.722 112.001 1.204 19520.00 0.148 0.003 + 2 3776.817 65.254 457.183 4.914 79679.98 0.047 0.001 + 3 4025.492 71.972 1031.508 11.087 179775.96 0.022 0.000 + 4 4185.149 80.109 1840.851 19.786 320831.94 0.013 0.000 + 5 4415.540 90.790 2873.460 30.885 500799.90 0.009 0.000 + + + # background-subtracted results + reg counts error background berror area surf_bri surf_err + ---- ------------ --------- ------------ --------- --------- --------- --------- + 1 2880.999 54.722 112.001 1.204 19520.00 0.148 0.003 + 2 895.818 35.423 345.182 3.710 60159.99 0.015 0.001 + 3 248.675 29.345 574.325 6.173 100095.98 0.002 0.000 + 4 159.657 32.321 809.343 8.699 141055.97 0.001 0.000 + 5 230.390 37.231 1032.610 11.099 179967.96 0.001 0.000 + + )WR( + # the following source and background components were used: + source region\201s\202 + ---------------- + annulus\201502,512,0,50,n=5\202 + + reg counts pixels sumcnts sumpix + ---- ------------ --------- ------------ --------- + 1 2993.000 305 2993.000 305 + 2 1241.000 940 4234.000 1245 + 3 823.000 1564 5057.000 2809 + 4 969.000 2204 6026.000 5013 + 5 1263.000 2812 7289.000 7825 + + background region\201s\202 + -------------------- + annulus\201502,512,50,100\202 + + reg counts pixels + ---- ------------ --------- + all 8656.000 23572)RP( + +)0 P(The )BD(-t)ES( and )BD(-e)ES( switches can be used to apply timing and +exposure corrections, respectively, to the data. Please note that +these corrections are meant to be used qualitatively, since +application of more accurate correction factors is a complex and +mission-dependent effort. The algorithm for applying these simple +corrections is as follows: +) 9 63 PR( C = Raw Counts in Source Region + Ac= Area of Source Region + Tc= Exposure time for Source Data + Ec= Average exposure in Source Region, from exposure map + + B= Raw Counts in Background Region + Ab= Area of Background Region + Tb= \201Exposure\202 time for Background Data + Eb= Average exposure in Background Region, from exposure map)RP( +Then, Net Counts in Source region is +) 1 37 PR( Net= C - B * \201Ac*Tc*Ec\202/\201Ab*Tb*Eb\202)RP( +with the standard propagation of errors for the Error on Net. +The net rate would then be +) 1 27 PR( Net Rate = Net/\201Ac*Tc*Ec\202)RP( +The average exposure in each region is calculated by summing up the +pixel values in the exposure map for the given region and then +dividing by the number of pixels in that region. Exposure maps often +are generated at a block factor > 1 \201e.g., block 4 means that each +exposure pixel contains 4x4 pixels at full resolution\202 and +)BD(funcnts)ES( will deal with the blocking automatically. Using the +)BD(-e)ES( switch, you can supply both source and background exposure +files \201separated by ";"\202, if you have separate source and background +data files. If you do not supply a background exposure file to go with +a separate background data file, )BD(funcnts)ES( assumes that exposure +already has been applied to the background data file. In addition, it +assumes that the error on the pixels in the background data file is +zero. + +)0 P(NB: The )BD(-e)ES( switch assumes that the exposure map overlays the +image file )BD(exactly)ES(, except for the block factor. Each pixel in +the image is scaled by the block factor to access the corresponding +pixel in the exposure map. If your exposure map does not line up +exactly with the image, )BD(do not use)ES( the )BD(-e)ES( exposure +correction. In this case, it still is possible to perform exposure +correction )BD(if)ES( both the image and the exposure map have valid +WCS information: use the )BD(-w)ES( switch so that the transformation +from image pixel to exposure pixel uses the WCS information. That is, +each pixel in the image region will be transformed first from image +coordinates to sky coordinates, then from sky coordinates to exposure +coordinates. Please note that using )BD(-w)ES( can increase the time +required to process the exposure correction considerably. + +)0 P(A time correction can be applied to both source and +background data using the )BD(-t)ES( switch. The value for the correction can +either be a numeric constant or the name of a header parameter in +the source \201or background\202 file: +) 2 74 PR( [sh] funcnts -t 23.4 ... # number for source + [sh] funcnts -t "LIVETIME;23.4" ... # param for source, numeric for bkgd)RP( +When a time correction is specified, it is applied to the net counts +as well \201see algorithm above\202, so that the units of surface brightness +become cnts/area**2/sec. + +)0 P(The )BD(-i)ES( \201interval\202 switch is used to run )BD(funcnts)ES( on multiple +column-based intervals with only a single pass through the data. It is +equivalent to running )BD(funcnts)ES( several times with a different column +filter added to the source and background data each time. For each +interval, the full )BD(funcnts)ES( output is generated, with a linefeed +character \201^L\202 inserted between each run. In addition, the output for +each interval will contain the interval specification in its header. +Intervals are very useful for generating X-ray hardness ratios +efficiently. Of course, they are only supported when the input data +are contained in a table. + +)0 P(Two formats are supported for interval specification. The most general +format is semi-colon-delimited list of filters to be used as intervals: +) 1 73 PR( funcnts -i "pha=1:5;pha=6:10;pha=11:15" snr.ev "circle\201502,512,22\202" ...)RP( +Conceptually, this will be equivalent to running )BD(funcnts)ES( three times: +) 3 50 PR( funcnts snr.ev'[pha=1:5]' "circle\201502,512,22\202" + funcnts snr.ev'[pha=6:10]' "circle\201502,512,22\202" + funcnts snr.ev'[pha=11:15]' "circle\201502,512,22\202")RP( +However, using the )BD(-i)ES( switch will require only one pass through +the data. + +)0 P(Note that complex filters can be used to specify intervals: +) 1 64 PR( funcnts -i "pha=1:5&)SY(\160)ES(=4;pha=6:10&)SY(\160)ES(=5;pha=11:15&)SY(\160)ES(=6" snr.ev ...)RP( +The program simply runs the data through each filter in turn and generates +three )BD(funcnts)ES( outputs, separated by the line-feed character. + +)0 P(In fact, although the intent is to support intervals for hardness ratios, +the specified filters do not have to be intervals at all. Nor does one +"interval" filter have to be related to another. For example: +) 1 75 PR( funcnts -i "pha=1:5;pi=6:10;energy=11:15" snr.ev "circle\201502,512,22\202" ...)RP( +is equivalent to running )BD(funcnts)ES( three times with unrelated filter +specifications. + +)0 P(A second interval format is supported for the simple case in which a +single column is used to specify multiple homogeneous intervals for +that column. In this format, a column name is specified first, +followed by intervals: +) 1 65 PR( funcnts -i "pha;1:5;6:10;11:15" snr.ev "circle\201502,512,22\202" ...)RP( +This is equivalent to the first example, but requires less typing. The +)BD(funcnts)ES( program will simply prepend "pha=" before each of the specified +intervals. \201Note that this format does not contain the "=" character in +the column argument.\202 + +)0 P(Ordinarily, when )BD(funcnts)ES( is run on a FITS binary table \201or a +raw event table\202, one integral count is accumulated for each row +\201event\202 contained within a given region. The )BD(-v "scol[;bcol]")ES( +\201value column\202 switch will accumulate counts using the value from the +specified column for the given event. If only a single column is +specified, it is used for both the source and background regions. Two +separate columns, separated by a semi-colon, can be specified for source +and background. The special token '$none' can be used to specify that +a value column is to be used for one but not the other. For example, +'pha;$none' will use the pha column for the source but use integral +counts for the background, while '$none;pha' will do the converse. +If the value column is of type logical, then the value used will be 1 +for T and 0 for F. Value columns are used, for example, to integrate +probabilities instead of integral counts. + +)0 P(If the )BD(-T)ES( \201rdb table\202 switch is used, the output will conform +to starbase/rdb data base format: tabs will be inserted between +columns rather than spaces and line-feed will be inserted between +tables. + +)0 P(Finally, note that )BD(funcnts)ES( is an image program, even though it +can be run directly on FITS binary tables. This means that image +filtering is applied to the rows in order to ensure that the same +results are obtained regardless of whether a table or the equivalent +binned image is used. Because of this, however, the number of counts +found using )BD(funcnts)ES( can differ from the number of events found +using row-filter programs such as )BD(fundisp)ES( or )BD(funtable)ES( +For more information about these difference, see the discussion of +)0 58 1 A(Region Boundaries)58 0 TN TL()Ec /AF f D(. + + + + +)0 2 9 H(funcone)WB 72 Sn()WB 6 Sn( - cone search of a binary table containing RA, Dec columns)EA()EH( + + +)BD() 1 81 PR(funcone <switches> <iname> <oname> <ra[hdr]> <dec[hdr]> <radius[dr'"]> [columns])RP()ES( + + +)0 P() 9 84 PR( -d deccol:[hdr] # Dec column name, units \201def: DEC:d\202 + -j # join columns from list file + -J # join columns from list file, output all rows + -l listfile # read centers and radii from a list + -L listfile # read centers and radii from a list, output list rows + -n # don't use cone limits as a filter + -r racol:[hdr] # RA column name, units \201def: RA:h\202 + -x # append RA_CEN, DEC_CEN, RAD_CEN, CONE_KEY cols + -X # append RA_CEN, DEC_CEN, RAD_CEN, CONE_KEY cols, output all rows)RP( + + +)0 P(Funcone performs a cone search on the RA and Dec columns of a FITS +binary table. The distance from the center RA, Dec position to the RA, +Dec in each row in the table is calculated. Rows whose distance is +less than the specified radius are output. + +)0 P(The first argument to the program specifies the FITS file, raw event +file, or raw array file. If "stdin" is specified, data are read from +the standard input. Use )0 42 1 A(Funtools Bracket +Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, and filters. The second +argument is the output FITS file. If "stdout" is specified, the FITS +binary table is written to the standard output. + +)0 P( +The third and fourth required arguments are the RA and Dec center +position. By default, RA is specified in hours while Dec is specified +in degrees. You can change the units of either of these by appending +the character "d" \201degrees\202, "h" \201hours\202 or "r" \201radians\202. Sexagesimal +notation is supported, with colons or spaces separating hms and dms. +\201When using spaces, please ensure that the entire string is quoted.\202 + +)0 P(The fifth required argument is the radius of the cone search. By default, +the radius value is given in degrees. The units can be changed by appending +the character "d" \201degrees\202, "r" \201radians\202, "'" \201arc minutes\202 or +'"' \201arc seconds\202. + +)0 P(By default, all +columns of the input file are copied to the output file. Selected +columns can be output using an optional sixth argument in the form: +) 1 31 PR( "column1 column1 ... columnN")RP( +A seventh argument allows you to output selected columns from the list +file when )BD(-j)ES( switch is used. Note that the RA and Dec columns +used in the cone calculation must not be de-selected. + +)0 P(Also by default, the RA and Dec column names are named "RA" and "Dec", +and are given in units of hours and degrees respectively. You can +change both the name and the units using the -r [RA] and/or -d [Dec] +switches. Once again, one of "h", "d", or "r" is appended to the +column name to specify units but in this case, there must be a colon ":" +between the name and the unit specification. + +)0 P(If the )BD(-l [listfile])ES( switch is used, then one or more of the +center RA, center Dec, and radius can be taken from a list file \201which +can be a FITS table or an ASCII column text file\202. In this case, the +third \201center RA\202, fourth \201center Dec\202, and fifth \201radius\202 command +line arguments can either be a column name in the list file \201if that +parameter varies\202 or else a numeric value \201if that parameter is +static\202. When a column name is specified for the RA, Dec, or radius, +you can append a colon followed by "h", "d", or "r" to specify units +\201also ' and " for radius\202. The cone search algorithm is run once for +each row in the list, taking RA, Dec, and radius values from the +specified columns or from static numeric values specified on the +command line. + +)0 P(When using a list, all valid rows from each iteration are written to a +single output file. Use the )BD(-x)ES( switch to help delineate which +line of the list file was used to produce the given output row\201s\202. +This switch causes the values for the center RA, Dec, radius, and row +number to be appended to the output file, in columns called RA_CEN, +DEC_CEN, RAD_CEN and CONE_KEY, respectively. Alternatively, the +)BD(-j)ES( \201join\202 switch will append all columns from the list row to +the output row \201essentially a join of the list row and input row\202, +along with the CONE_KEY row number. These two switches are mutually +exclusive. + +)0 P(The )BD(-X)ES( and )BD(-J)ES( switches write out the same data as their +lower case counterparts for each row satisfying a cone search. In +addition, these switches also write out rows from the event file that +do not satisfy any cone search. In such cases, that CONE_KEY column +will be given a value of -1 and the center and list position information +will be set to zero for the given row. Thus, all rows of the input +event file are guaranteed to be output, with rows satisfying at least +one cone search having additional search information. + +)0 P(The )BD(-L)ES( switch acts similarly to the )BD(-l)ES( switch in that it +takes centers from a list file. However, it also implicitly sets the +-j switch, so that output rows are the join of the input event row and +the center position row. In addition, this switch also writes out all +center position rows for which no event satisfies the cone search +criteria of that row. The CONE_KEY column will be given a value of -2 +for center rows that were not close to any data row and the event +columns will be zeroed out for such rows. In this way, all centers +rows are guaranteed to be output at least once. + +)0 P(If any of "all row" switches \201)BD(-X)ES(, )BD(-J)ES(, or )BD(-L)ES(\202 are +specified, then a new column named JSTAT is added to the output table. +The positive values in this column indicate the center position row number +\201starting from 1\202 in the list file that this data row successful matched +in a cone search. A value of -1 means that the data row did not match +any center position. A value of -2 means that the center position was +not matched by any data row. + +)0 P(Given a center position and radius, the cone search algorithm +calculates limit parameters for a box enclosing the specified cone, +and only tests rows whose positions values lie within those limits. +For small files, the overhead associated with this cone limit +filtering can cause the program to run more slowly than if all events +were tested. You can turn off cone limit filtering using the )BD(-n)ES( +switch to see if this speeds up the processing \201especially useful when +processing a large list of positions\202. + +)0 P(For example, the default cone search uses columns "RA" and "Dec" in hours +and degrees \201respectively\202 and RA position in hours, Dec and radius in degrees: +) 1 42 PR( funone in.fits out.fits 23.45 34.56 0.01)RP( +To specify the RA position in degrees: +) 1 44 PR( funcone in.fits out.fits 23.45d 34.56 0.01)RP( +To get RA and Dec from a list but use a static value for radius \201and +also write identifying info for each row in the list\202: +) 1 57 PR( funcone -x -l list.txt in.fits out.fits MYRA MYDec 0.01)RP( +User specified columns in degrees, RA position in hours \201sexagesimal +notation\202, Dec position in degrees \201sexagesimal notation\202 and radius +in arc minutes: +) 1 66 PR( funcone -r myRa:d -d myDec in.fits out.fits 12:30:15.5 30:12 15')RP( + + + + +)0 2 10 H(fundisp)WB 73 Sn()WB 7 Sn( - display data in a Funtools data file)EA()EH( + + +)BD() 1 62 PR(fundisp [-f format] [-l] [-n] [-T] <iname> [columns|bitpix=n])RP()ES( + + +)0 P() 5 68 PR( -f # format string for display + -l # display image as a list containing the columns X, Y, VAL + -n # don't output header + -F [c] # use specified character as column separator \201def: space\202 + -T # output in rdb/starbase format \201tab separators\202)RP( + + +)0 P()BD(fundisp)ES( displays the data in the specified +)0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D( +and/or +)0 49 1 A(Image Section)49 0 TN TL()Ec /AF f D( +of a FITS file, or in a +)0 49 1 A(Section)49 0 TN TL()Ec /AF f D( +of a non-FITS array or raw event file. +)0 P(The first argument to the program specifies the FITS input image, array, or +raw event file to display. If "stdin" is specified, data are read from +the standard input. Use )0 42 1 A(Funtools Bracket +Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, image sections, and filters. + +)0 P(If the data being displayed are columns \201either in a FITS binary table +or a raw event file\202, the individual rows are listed. Filters can be +added using bracket notation. Thus: +) 13 75 PR( [sh] fundisp "test.ev[time-\201int\202time>.15]" + X Y PHA PI TIME DX DY + ------- ------- ------- --------- ---------------- ---------- ---------- + 10 8 10 8 17.1600 8.50 10.50 + 9 9 9 9 17.1600 9.50 9.50 + 10 9 10 9 18.1600 9.50 10.50 + 10 9 10 9 18.1700 9.50 10.50 + 8 10 8 10 17.1600 10.50 8.50 + 9 10 9 10 18.1600 10.50 9.50 + 9 10 9 10 18.1700 10.50 9.50 + 10 10 10 10 19.1600 10.50 10.50 + 10 10 10 10 19.1700 10.50 10.50 + 10 10 10 10 19.1800 10.50 10.50)RP( +[NB: The FITS binary table test file test.ev, as well as the FITS +image test.fits, are contained in the funtools funtest directory.] + +)0 P(When a table is being displayed using )BD(fundisp)ES(, a second optional +argument can be used to specify the columns to display. For example: +) 12 56 PR( [sh] fundisp "test.ev[time-\201int\202time>=.99]" "x y time" + X Y TIME + -------- -------- --------------------- + 5 -6 40.99000000 + 4 -5 59.99000000 + -1 0 154.99000000 + -2 1 168.99000000 + -3 2 183.99000000 + -4 3 199.99000000 + -5 4 216.99000000 + -6 5 234.99000000 + -7 6 253.99000000)RP( + +)0 P(The special column )BD($REGION)ES( can be specified to display the +region id of each row: +) 12 89 PR( [sh $] fundisp "test.ev[time-\201int\202time>=.99&&annulus\2010 0 0 10 n=3\202]" 'x y time $REGION' + X Y TIME REGION + -------- -------- --------------------- ---------- + 5 -6 40.99000000 3 + 4 -5 59.99000000 2 + -1 0 154.99000000 1 + -2 1 168.99000000 1 + -3 2 183.99000000 2 + -4 3 199.99000000 2 + -5 4 216.99000000 2 + -6 5 234.99000000 3 + -7 6 253.99000000 3)RP( +)0 P(Here only rows with the proper fractional time and whose position also is +within one of the three annuli are displayed. +)0 P(Columns can be excluded from display using a minus sign before the +column: +) 12 64 PR( [sh $] fundisp "test.ev[time-\201int\202time>=.99]" "-time" + X Y PHA PI DX DY + -------- -------- -------- ---------- ----------- ----------- + 5 -6 5 -6 5.50 -6.50 + 4 -5 4 -5 4.50 -5.50 + -1 0 -1 0 -1.50 0.50 + -2 1 -2 1 -2.50 1.50 + -3 2 -3 2 -3.50 2.50 + -4 3 -4 3 -4.50 3.50 + -5 4 -5 4 -5.50 4.50 + -6 5 -6 5 -6.50 5.50 + -7 6 -7 6 -7.50 6.50)RP( +All columns except the time column are displayed. +)0 P(The special column )BD($N)ES( can be specified to display the +ordinal value of each row. Thus, continuing the previous example: +) 12 74 PR( fundisp "test.ev[time-\201int\202time>=.99]" '-time $n' + X Y PHA PI DX DY N + ------- -------- -------- ---------- ----------- ----------- ---------- + 5 -6 5 -6 5.50 -6.50 337 + 4 -5 4 -5 4.50 -5.50 356 + -1 0 -1 0 -1.50 0.50 451 + -2 1 -2 1 -2.50 1.50 465 + -3 2 -3 2 -3.50 2.50 480 + -4 3 -4 3 -4.50 3.50 496 + -5 4 -5 4 -5.50 4.50 513 + -6 5 -6 5 -6.50 5.50 531 + -7 6 -7 6 -7.50 6.50 550)RP( +Note that the column specification is enclosed in single quotes to protect +'$n' from begin expanded by the shell. + +)0 P(In general, the rules for activating and de-activating columns are: +)UL()-1 LI( If only exclude columns are specified, then all columns but +the exclude columns will be activated. +)-1 LI( If only include columns are specified, then only the specified columns +are activated. +)-1 LI( If a mixture of include and exclude columns are specified, then +all but the exclude columns will be active; this last case +is ambiguous and the rule is arbitrary.)LU( +In addition to specifying columns names explicitly, the special +symbols )BD(+)ES( and )BD(-)ES( can be used to activate and +de-activate )BD(all)ES( columns. This is useful if you want to +activate the $REGION column along with all other columns. According +to the rules, the syntax "$REGION" only activates the region column +and de-activates the rest. Use "+ $REGION" to activate all +columns as well as the region column. + +)0 P(If the data being displayed are image data \201either in a FITS primary +image, a FITS image extension, or an array file\202, an mxn pixel display +is produced, where m and n are the dimensions of the image. By +default, pixel values are displayed using the same data type as in the +file. However, for integer data where the BSCALE and BZERO header parameters +are present, the data is displayed as floats. In either case, the +display data type can be overridden using an optional second argument +of the form: +) 1 10 PR( bitpix=n)RP( +where n is 8,16,32,-32,-64, for unsigned char, short, int, float and double, +respectively. + +)0 P(Of course, running )BD(fundisp)ES( on anything but the smallest image +usually results in a display whose size makes it unreadable. +Therefore, one can uses bracket notation \201see below\202 +to apply section and/or blocking to the image before generating a +display. For example: +) 9 66 PR( [sh] fundisp "test.fits[2:6,2:7]" bitpix=-32 + 2 3 4 5 6 + ---------- ---------- ---------- ---------- ---------- + 2: 3.00 4.00 5.00 6.00 7.00 + 3: 4.00 5.00 6.00 7.00 8.00 + 4: 5.00 6.00 7.00 8.00 9.00 + 5: 6.00 7.00 8.00 9.00 10.00 + 6: 7.00 8.00 9.00 10.00 11.00 + 7: 8.00 9.00 10.00 11.00 12.00)RP( + +)0 P(Note that is is possible to display a FITS binary table as an image +simply by passing the table through )BD(funimage)ES( first: +) 9 68 PR( [sh] ./funimage test.ev stdout | fundisp "stdin[2:6,2:7]" bitpix=8 + 2 3 4 5 6 + ------- ------- ------- ------- ------- + 2: 3 4 5 6 7 + 3: 4 5 6 7 8 + 4: 5 6 7 8 9 + 5: 6 7 8 9 10 + 6: 7 8 9 10 11 + 7: 8 9 10 11 12)RP( + +If the )BD(-l)ES( \201list\202 switch is used, then an image is displayed as a +list containing the columns: X, Y, VAL. For example: +) 33 45 PR( fundisp -l "test1.fits[2:6,2:7]" bitpix=-32 + X Y VAL + ---------- ---------- ----------- + 2 2 6.00 + 3 2 1.00 + 4 2 1.00 + 5 2 1.00 + 6 2 1.00 + 2 3 1.00 + 3 3 5.00 + 4 3 1.00 + 5 3 1.00 + 6 3 1.00 + 2 4 1.00 + 3 4 1.00 + 4 4 4.00 + 5 4 1.00 + 6 4 1.00 + 2 5 1.00 + 3 5 1.00 + 4 5 1.00 + 5 5 3.00 + 6 5 1.00 + 2 6 1.00 + 3 6 1.00 + 4 6 1.00 + 5 6 1.00 + 6 6 2.00 + 2 7 1.00 + 3 7 1.00 + 4 7 1.00)WR( + 5 7 1.00 + 6 7 1.00)RP( + +)0 P(If the )BD(-n)ES( \201nohead\202 switch is used, then no header is output for +tables. This is useful, for example, when fundisp output is being +directed into gnuplot. + +)0 P(The )BD(fundisp)ES( program uses a default set of display formats: +) 10 33 PR( datatype TFORM format + -------- ----- -------- + double D "%21.8f" + float E "%11.2f" + int J "%10d" + short I "%8d" + byte B "%6d" + string A "%12.12s" + bits X "%8x" + logical L "%1x")RP( +Thus, the default display of 1 double and 2 shorts gives: +) 7 42 PR( [sh] fundisp snr.ev "time x y" + + TIME X Y + --------------------- -------- -------- + 79494546.56818075 546 201 + 79488769.94469175 548 201 + ...)RP( +You can change the display format for individual columns or for all +columns of a given data types by means of the -f switch. The format +string that accompanies -f is a space-delimited list of keyword=format +values. The keyword values can either be column names \201in which case +the associated format pertains only to that column\202 or FITS table +TFORM specifiers \201in which case the format pertains to all columns +having that data type\202. For example, you can change the double and +short formats for all columns like this: +) 7 53 PR( [sh] fundisp -f "D=%22.11f I=%3d" snr.ev "time x y" + + TIME X Y + ---------------------- --- --- + 79494546.56818075478 546 201 + 79488769.94469174743 548 201 + ...)RP( + +)0 P(Alternatively, you can change the format of the time and x columns like this: +) 7 56 PR( [sh] fundisp -f "time=%22.11f x=%3d" snr.ev "time x y" + + TIME X Y + ---------------------- --- -------- + 79494546.56818075478 546 201 + 79488769.94469174743 548 201 + ...)RP( +Note that there is a potential conflict if a column has the same name +as one of the TFORM specifiers. In the examples above, the the "X" +column in the table has the same name as the X \201bit\202 datatype. To +resolve this conflict, the format string is processed such that +TFORM datatype specifiers are checked for first, using a +case-sensitive comparison. If the specified format value is not an +upper case TFORM value, then a case-insensitive check is made on the +column name. This means that, in the examples above, "X=%3d" will refer +to the X \201bit\202 datatype, while "x=%3d" will refer to the X column: +) 15 38 PR( [sh] fundisp -f "X=%3d" snr.ev "x y" + + X Y + -------- -------- + 546 201 + 548 201 + ... + + [sh] fundisp -f "x=%3d" snr.ev "x y" + + X Y + --- -------- + 546 201 + 548 201 + ...)RP( +As a rule, therefore, it is best always to specify the column name in +lower case and TFORM data types in upper case. + +)0 P(The )BD(-f [format])ES( will change the format for a single execution +of fundisp. You also can use the )BD(FUN_FORMAT)ES( envronment variable +to change the format for all invocations of fundisp. The format of this +environment variable's value is identical to that used with +the )BD(-f)ES( switch. This global value can be overridden in +individual cases by use of the )BD(-f [format])ES( switch. + +)0 P(Caveats: Please also note that it is the user's responsibility to +match the format specifier to the column data type correctly. Also +note that, in order to maintain visual alignment between names and +columns, the column name will be truncated \201on the left\202 if the +format width is less than the length of the name. However, truncation +is not performed if the output is in RDB format \201using the -T switch\202. + +)0 P([An older-style format string is supported but deprecated. It +consists of space-delimited C format statements for all data types, +specified in the following order: +) 1 40 PR( double float int short byte string bit.)RP( +This order of the list is based on the assumption that people generally +will want to change the float formats. +)0 P(If "-" is entered instead of a format statement for a given data type, the +default format is used. Also, the format string can be terminated without +specifying all formats, and defaults will be used for the rest of the +list. Note that you must supply a minimum field width, i.e., "%6d" and +"%-6d" are legal, "%d" is not legal. + +By using -f [format], you can change the double and short formats like this: +) 7 51 PR( [sh] fundisp -f "22.11f - - 3d" snr.ev "time x y" + + TIME X Y + ---------------------- --- --- + 79494546.56818075478 546 201 + 79488769.94469174743 548 201 + ...)RP( +NB: This format is deprecated and will be removed in a future release.] + +)0 P(The )BD(-F[c])ES( switch can be used to specify a \201single-character\202 +column separator \201where the default is a space\202. Note that column +formatting will almost certainly also add spaces to pad individual +columns to the required width. These can be removed with a program +such as sed, at the cost of generating unaligned columns. For example: +) 26 117 PR(fundisp -F',' snr.ev'[cir 512 512 .1]' + X, Y, PHA, PI, TIME, DX, DY +--------,--------,--------,--------,---------------------,--------,-------- + 512, 512, 6, 7, 79493997.45854475, 578, 574 + 512, 512, 8, 9, 79494575.58943175, 579, 573 + 512, 512, 5, 6, 79493631.03866175, 578, 575 + 512, 512, 5, 5, 79493290.86521725, 578, 575 + 512, 512, 8, 9, 79493432.00990875, 579, 573 + +fundisp -F',' snr.ev'[cir 512 512 .1]' | sed 's/ *, */,/g' + X,Y,PHA,PI,TIME,DX,DY +--------,--------,--------,--------,---------------------,--------,-------- + 512,512,6,7,79493997.45854475,578,574 + 512,512,8,9,79494575.58943175,579,573 + 512,512,5,6,79493631.03866175,578,575 + 512,512,5,5,79493290.86521725,578,575 + 512,512,8,9,79493432.00990875,579,573 + +fundisp -f "x=%3d y=%3d pi=%1d pha=%1d time=%20.11f dx=%3d dy=%3d" -F',' snr.ev'[cir 512 512 .1]' | sed 's/ *, */,/g' + X,Y,A,I,TIME,DX,DY +---,---,-,-,--------------------,---,--- +512,512,6,7,79493997.45854474604,578,574 +512,512,8,9,79494575.58943174779,579,573 +512,512,5,6,79493631.03866174817,578,575 +512,512,5,5,79493290.86521725357,578,575 +512,512,8,9,79493432.00990875065,579,573)RP( + +)0 P(If the )BD(-T)ES( \201rdb table\202 switch is used, the output will conform +to starbase/rdb data base format: tabs will be inserted between +columns rather than spaces. This format is not available when +displaying image pixels \201except in conjunction with the )BD(-l)ES( +switch\202. + +)0 P(Finally, note that )BD(fundisp)ES( can be used to create column filters from +the auxiliary tables in a FITS file. For example, the following shell code +will generate a good-time interval \201GTI\202 filter for X-ray data files that +contain a standard GTI extension: +) 3 68 PR( #!/bin/sh + sed '1,/---- .*/d + /^$/,$d' | awk 'tot>0{printf "||"};{printf "time="$1":"$2; tot++}')RP( +If this script is placed in a file called "mkgti", it can be used in a +command such as: +) 1 46 PR( fundisp foo.fits"[GTI]" | mkgti > gti.filter)RP( +The resulting filter file can then be used in various funtools programs: +) 1 37 PR( funcnts foo.fits"[@gti.filter]" ...)RP( +to process only the events in the good-time intervals. + + + + +)0 2 11 H(funhead)WB 74 Sn()WB 8 Sn( - display a header in a Funtools file)EA()EH( + + +)BD() 1 50 PR(funhead [-a] [-s] [-t] [-L] <iname> [oname ename])RP()ES( + + +)0 P() 4 60 PR( -a # display all extension headers + -s # display 79 chars instead of 80 before the new-line + -t # prepend data type char to each line of output + -L # output in rdb/starbase list format)RP( + + +)0 P()BD(funhead)ES( displays the FITS header parameters in the specified +)0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D(. +)0 P(The first argument to the program specifies the Funtools input file +to display. If "stdin" is specified, data are read from +the standard input. )0 42 1 A(Funtools Bracket +Notation)42 0 TN TL()Ec /AF f D( is used to specify particular FITS extension to process. +Normally, the full 80 characters of each header card is output, +followed by a new-line. + +)0 P(If the )BD(-a)ES( switch is specified, the header from each FITS +extensions in the file is displayed. Note, however, that the )BD(-a)ES( +switch does not work with FITS files input via stdin. We hope to +remove this restriction in a future release. + +)0 P(If the )BD(-s)ES( switch is specified, only 79 characters are output +before the new-line. This helps the display on 80 character terminals. + +)0 P(If the )BD(-t)ES( switch is specified, the data type of the parameter +is output as a one character prefix, followed by 77 characters of the +param. The parameter data types are defined as: FUN_PAR_UNKNOWN +\201'u'\202, FUN_PAR_COMMENT \201'c'\202, FUN_PAR_LOGICAL \201'l'\202, FUN_PAR_INTEGER +\201'i'\202, FUN_PAR_STRING \201's'\202, FUN_PAR_REAL \201'r'\202, FUN_PAR_COMPLEX \201'x'\202. + +)0 P(If the )BD(-L)ES( \201rdb table\202 switch is used, the output will conform +to starbase/rdb data base list format. + +)0 P(For example to display the EVENTS extension \201binary table\202: +) 17 65 PR( [sh] funhead "foo.fits[EVENTS]" + XTENSION= 'BINTABLE' / FITS 3D BINARY TABLE + BITPIX = 8 / Binary data + NAXIS = 2 / Table is a matrix + NAXIS1 = 20 / Width of table in bytes + NAXIS2 = 30760 / Number of entries in table + PCOUNT = 0 / Random parameter count + GCOUNT = 1 / Group count + TFIELDS = 7 / Number of fields in each row + EXTNAME = 'EVENTS ' / Table name + EXTVER = 1 / Version number of table + TFORM1 = '1I ' / Data type for field + TTYPE1 = 'X ' / Label for field + TUNIT1 = ' ' / Physical units for field + TFORM2 = '1I ' / Data type for field + etc. ... + END)RP( + +)0 P(To display the third header: +) 14 65 PR( [sh] funhead "foo.fits[3]" + XTENSION= 'BINTABLE' / FITS 3D BINARY TABLE + BITPIX = 8 / Binary data + NAXIS = 2 / Table is a matrix + NAXIS1 = 32 / Width of table in bytes + NAXIS2 = 40 / Number of entries in table + PCOUNT = 0 / Random parameter count + GCOUNT = 1 / Group count + TFIELDS = 7 / Number of fields in each row + EXTNAME = 'TGR ' / Table name + EXTVER = 1 / Version number of table + TFORM1 = '1D ' / Data type for field + etc. ... + END)RP( + +)0 P(To display the primary header \201i.e., extension 0\202: +) 8 59 PR( sh> funhead "coma.fits[0]" + SIMPLE = T /STANDARD FITS FORMAT + BITPIX = 16 /2-BYTE TWOS-COMPL INTEGER + NAXIS = 2 /NUMBER OF AXES + NAXIS1 = 800 / + NAXIS2 = 800 / + DATATYPE= 'INTEGER*2' /SHORT INTEGER + END)RP( + +)0 P(The funhead program also can edit \201i.e. add, delete, or modify\202 or +display individual headers parameters. Edit mode is signalled by the +presence of two additional command-line arguments: output file and +edit command file, in that order. Edit mode acts as a filter: the +output file will contain the entire input FITS file, including other +extensions. The edit command file can be "stdin", in which case edit +command are read from the standard input. + +)0 P(The edit command file contains parameter comments \201having '#' in the +first column\202 and delete and assignment\201modify or add\202 operations. A +delete operation is specified by preceding the parameter name with a +minus sign "-". A display operation \201very useful in interactive +sessions, i.e., where the edit commands are taken from stdin\202 is +specified by preceding the parameter name with a question mark "?". In +either case, a parameter value need not be specified. An assignment +operation is specified in the same two ways that a parameter is +specified in a text header \201but without the comment character that +precedes header params\202, i.e.: + +)UL()-1 LI( FITS-style comments have an equal sign "=" between the keyword and +value and an optional slash "/" to signify a comment. The strict FITS +rules on column positions are not enforced. + +)-1 LI( Free-form comments can have an optional colon separator between the +keyword and value. In the absence of quote, all tokens after the +keyword are part of the value, i.e. no comment is allowed.)LU( + +)0 P(For example, the following interactive session checks for the +existence of parameters, adds new parameters, modifies them, and +modifies and deletes existing parameters: +) 20 55 PR( sh$ ./funhead snr.ev foo.fits - + # look for FOO1 + ? FOO1 + WARNING: FOO1 not found + # add new foo1 + FOO1 = 100 + # add foo2 + FOO2 = 200 + # reset foo1 to a different value + FOO1 -1 + # delete foo2 + -FOO2 + # change existing value + EXTVER 2 + ? XS-SORT + XS-SORT = 'EOF ' / type of event sort + # delete existing value + -XS-SORT + # exit + ^D)RP( + +)0 P(See )0 47 1 A(Column-based Text Files)47 0 TN TL()Ec /AF f D( +for more information about header parameter format. + +)0 P( +)0 P( + + +)0 2 12 H(funhist)WB 75 Sn()WB 9 Sn( - create a 1D histogram of a column \201from a FITS binary table or raw event file\202 or an image)EA()EH( + + +)BD() 1 51 PR(funhist [-n|-w|-T] <iname> [column] [[lo:hi:]bins])RP()ES( + + +)0 P() 3 61 PR( -n # normalize bin value by the width of each bin + -w # specify bin width instead of number of bins in arg3 + -T # output in rdb/starbase format \201tab separators\202)RP( + + +)0 P()BD(funhist)ES( creates a one-dimensional histogram from the specified +columns of a )0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D( +binary table of a FITS file \201or from a non-FITS raw event file\202, or +from a FITS image or array, and writes that histogram as an ASCII +table. Alternatively, the program can perform a 1D projection of one +of the image axes. + +)0 P(The first argument to the program is required, and specifies the +Funtools file: FITS table or image, raw event file, or array. If +"stdin" is specified, data are read from the standard input. Use +)0 42 1 A(Funtools Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS +extensions, and filters. + +)0 P(For a table, the second argument also is required. It specifies the +column to use in generating the histogram. If the data file is of +type image \201or array\202, the column is optional: if "x" \201or "X"\202, "y" +\201or "Y"\202 is specified, then a projection is performed over the x +\201dim1\202 or y \201dim2\202 axes, respectively. \201That is, this projection will +give the same results as a histogram performed on a table containing +the equivalent x,y event rows.\202 If no column name is specified or +"xy" \201or "XY"\202 is specified for the image, then a histogram is +performed on the values contained in the image pixels. + +)0 P(The argument that follows is optional and specifies the number of bins +to use in creating the histogram and, if desired, the range of bin +values. For image and table histograms, the range should specify the +min and max data values. For image histograms on the x and y axes, +the range should specify the min and max image bin values. If this +argument is omitted, the number of output bins for a table is +calculated either from the TLMIN/TLMAX headers values \201if these exist +in the table FITS header for the specified column\202 or by going through +the data to calculate the min and max value. For an image, the number +of output bins is calculated either from the DATAMIN/DATAMAX header +values, or by going through the data to calculate min and max value. +\201Note that this latter calculation might fail if the image cannot be +fit in memory.\202 If the data are floating point \201table or image\202 and +the number of bins is not specified, an arbitrary default of 128 is +used. + +)0 P(For binary table processing, the )BD(-w)ES( \201bin width\202 switch can be used +to specify the width of each bin rather than the number of bins. Thus: +) 1 29 PR( funhist test.ev pha 1:100:5)RP( +means that 5 bins of width 20 are used in the histogram, while: +) 1 32 PR( funhist -w test.ev pha 1:100:5)RP( +means that 20 bins of width 5 are used in the histogram. + +)0 P(The data are divvied up into the specified number of bins and the +resulting 1D histogram \201or projection\202 is output in ASCII table +format. For a table, the output displays the low_edge \201inclusive\202 and +hi_edge \201exclusive\202 values for the data. For example, a 15-row table +containing a "pha" column whose values range from -7.5 to 7.5 +can be processed thus: + +) 47 62 PR( [sh] funhist test.ev pha + # data file: /home/eric/data/test.ev + # column: pha + # min,max,bins: -7.5 7.5 15 + + bin value lo_edge hi_edge + ------ --------- --------------------- --------------------- + 1 22 -7.50000000 -6.50000000 + 2 21 -6.50000000 -5.50000000 + 3 20 -5.50000000 -4.50000000 + 4 19 -4.50000000 -3.50000000 + 5 18 -3.50000000 -2.50000000 + 6 17 -2.50000000 -1.50000000 + 7 16 -1.50000000 -0.50000000 + 8 30 -0.50000000 0.50000000 + 9 16 0.50000000 1.50000000 + 10 17 1.50000000 2.50000000 + 11 18 2.50000000 3.50000000 + 12 19 3.50000000 4.50000000 + 13 20 4.50000000 5.50000000 + 14 21 5.50000000 6.50000000 + 15 22 6.50000000 7.50000000 + + [sh] funhist test.ev pha 1:6 + # data file: /home/eric/data/test.ev + # column: pha + # min,max,bins: 0.5 6.5 6 + + bin value lo_edge hi_edge + ------ --------- --------------------- --------------------- + 1 16 0.50000000 1.50000000)WR( + 2 17 1.50000000 2.50000000 + 3 18 2.50000000 3.50000000 + 4 19 3.50000000 4.50000000 + 5 20 4.50000000 5.50000000 + 6 21 5.50000000 6.50000000 + + [sh] funhist test.ev pha 1:6:3 + # data file: /home/eric/data/test.ev + # column: pha + # min,max,bins: 0.5 6.5 3 + + bin value lo_edge hi_edge + ------ --------- --------------------- --------------------- + 1 33 0.50000000 2.50000000 + 2 37 2.50000000 4.50000000 + 3 41 4.50000000 6.50000000)RP( + +)0 P(For a table histogram, the )BD(-n)ES(\201normalize\202 switch can be used to +normalize the bin value by the width of the bin \201i.e., hi_edge-lo_edge\202: +) 11 74 PR( [sh] funhist -n test.ev pha 1:6:3 + # data file: test.ev + # column: pha + # min,max,bins: 0.5 6.5 3 + # width normalization \201val/\201hi_edge-lo_edge\202\202 is applied + + bin value lo_edge hi_edge + ------ --------------------- --------------------- --------------------- + 1 16.50000000 0.50000000 2.50000000 + 2 6.16666667 2.50000000 4.50000000 + 3 4.10000000 4.50000000 6.50000000)RP( +This could used, for example, to produce a light curve with values +having units of counts/second instead of counts. + +)0 P(For an image histogram, the output displays the low and high image +values \201both inclusive\202 used to generate the histogram. For example, +in the following example, 184 pixels had a value of 1, 31 had a value +of 2, while only 2 had a value of 3,4,5,6, or 7: +) 13 74 PR( [sh] funhist test.fits + # data file: /home/eric/data/test.fits + # min,max,bins: 1 7 7 + + bin value lo_val hi_val + ------ --------------------- --------------------- --------------------- + 1 184.00000000 1.00000000 1.00000000 + 2 31.00000000 2.00000000 2.00000000 + 3 2.00000000 3.00000000 3.00000000 + 4 2.00000000 4.00000000 4.00000000 + 5 2.00000000 5.00000000 5.00000000 + 6 2.00000000 6.00000000 6.00000000 + 7 2.00000000 7.00000000 7.00000000)RP( + +)0 P(For the axis projection of an image, the output displays the low and +high image bins \201both inclusive\202 used to generate the projection. For +example, in the following example, 21 counts had their X bin value of +2, etc.: +) 23 74 PR( [sh] funhist test.fits x 2:7 + # data file: /home/eric/data/test.fits + # column: X + # min,max,bins: 2 7 6 + + bin value lo_bin hi_bin + ------ --------------------- --------------------- --------------------- + 1 21.00000000 2.00000000 2.00000000 + 2 20.00000000 3.00000000 3.00000000 + 3 19.00000000 4.00000000 4.00000000 + 4 18.00000000 5.00000000 5.00000000 + 5 17.00000000 6.00000000 6.00000000 + 6 16.00000000 7.00000000 7.00000000 + + [sh] funhist test.fits x 2:7:2 + # data file: /home/eric/data/test.fits + # column: X + # min,max,bins: 2 7 2 + + bin value lo_bin hi_bin + ------ --------------------- --------------------- --------------------- + 1 60.00000000 2.00000000 4.00000000 + 2 51.00000000 5.00000000 7.00000000)RP( + +)0 P(You can use gnuplot or other plotting programs to graph the +results, using a script such as: +) 7 119 PR( #!/bin/sh + sed -e '1,/---- .*/d + /^$/,$d' | \200 + awk '\200 + BEGIN{print "set nokey; set title \200"funhist\200"; set xlabel \200"bin\200"; set ylabel \200"counts\200"; plot \200"-\200" with boxes"} \200 + {print $3, $2, $4-$3}' | \200 + gnuplot -persist - 1>/dev/null 2>&1)RP( + +Similar plot commands are supplied in the script )BD(funhist.plot)ES(: +) 1 49 PR( funhist test.ev pha ... | funhist.plot gnuplot)RP( + + + + +)0 2 13 H(funimage)WB 76 Sn()WB 10 Sn( - create a FITS image from a Funtools data file)EA()EH( + + +)BD() 3 73 PR(funimage [-a] <iname> <oname> [bitpix=n] +funimage [-l] <iname> <oname> <xcol:xdims> <ycol:ydims> <vcol> [bitpix=n] +funimage [-p x|y] <iname> <oname> [bitpix=n])RP()ES( + + +)0 P() 3 65 PR( -a # append to existing output file as an image extension + -l # input is a list file containing xcol, ycol, value + -p [x|y] # project along x or y axis to create a 1D image)RP( + + +)0 P()BD(funimage)ES( creates a primary FITS image from the specified +)0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D( +and/or +)0 49 1 A(Image Section)49 0 TN TL()Ec /AF f D( +of a FITS file, or from an +)0 49 1 A(Image Section)49 0 TN TL()Ec /AF f D( +of a non-FITS array, or from a raw event file. +)0 P(The first argument to the program specifies the FITS input image, +array, or raw event file to process. If "stdin" is specified, data are +read from the standard input. Use )0 42 1 A(Funtools +Bracket Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, image sections, and +filters. The second argument is the output FITS file. If "stdout" is +specified, the FITS image is written to the standard output. By +default, the output pixel values are of the same data type as those of the +input file \201or type "int" when binning a table\202, but this can be +overridden using an optional third argument of the form: +) 1 10 PR( bitpix=n)RP( +where n is 8,16,32,-32,-64, for unsigned char, short, int, float and double, +respectively. + +)0 P(If the input data are of type image, the appropriate section is +extracted and blocked \201based on how the +)0 49 1 A(Image Section)49 0 TN TL()Ec /AF f D( is specified\202, and +the result is written to the FITS primary image. When an integer +image containing the BSCALE and BZERO keywords is converted to float, +the pixel values are scaled and the scaling keywords are deleted from the +output header. When converting integer scaled data to integer +\201possibly of a different size\202, the pixels are not scaled and the +scaling keywords are retained. + +)0 P(If the input data is a binary table or raw event file, these are +binned into an image, from which a section is extracted and blocked, +and written to a primary FITS image. In this case, it is necessary to +specify the two columns that will be used in the 2D binning. This can +be done on the command line using the )BD(bincols=\201x,y\202)ES( keyword: +) 1 46 PR( funcnts "foo.ev[EVENTS,bincols=\201detx,dety\202]")RP( +The full form of the )BD(bincols=)ES( specifier is: +) 1 77 PR( bincols=\201[xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]]\202)RP( +where the tlmin, tlmax, and binsiz specifiers determine the image binning +dimensions: +) 2 56 PR( dim = \201tlmax - tlmin\202/binsiz \201floating point data\202 + dim = \201tlmax - tlmin\202/binsiz + 1 \201integer data\202)RP( +Using this syntax, it is possible to bin any two columns of a binary +table at any bin size. Note that the tlmin, tlmax, and binsiz +specifiers can be omitted if TLMIN, TLMAX, and TDBIN header parameters +\201respectively\202 are present in the FITS binary table header for the +column in question. Note also that if only one parameter is specified, +it is assumed to be tlmax, and tlmin defaults to 1. If two parameters +are specified, they are assumed to be tlmin and tlmax. +See )0 50 1 A(Binning FITS Binary Tables and Non-FITS +Event Files)50 0 TN TL()Ec /AF f D( for more information about binning parameters. + +)0 P(By default, a new 2D FITS image file is created and the image is written +to the primary HDU. If the )BD(-a)ES( \201append\202 switch is specified, +the image is appended to an existing FITS file as an IMAGE extension. +\201If the output file does not exist, the switch is effectively ignored +and the image is written to the primary HDU.\202 This can be useful in a +shell programming environment when processing multiple FITS images +that you want to combine into a single final FITS file. + +)0 P()BD(funimage)ES( also can take input from a table containing columns of +x, y, and value \201e.g., the output from )BD(fundisp -l)ES( which +displays each image x and y and the number of counts at that +position.\202 When the )BD(-l)ES( \201list\202 switch is used, the input file is +taken to be a FITS or ASCII table containing \201at least\202 three columns +that specify the x and y image coordinates and the value of that +image pixel. In this case, )BD(funimage)ES( requires four extra +arguments: xcolumn:xdims, ycolumn:ydims, vcolumn and bitpix=n. The x +and y col:dim information takes the form: +) 3 55 PR( name:dim # values range from 1 to dim + name:min:max # values range from min to max + name:min:max:binsiz # dimensions scaled by binsize)RP( +In particular, the min value should be used whenever the +minimum coordinate value is something other than one. For example: +) 2 69 PR( + funimage -l foo.lst foo.fits xcol:0:512 ycol:0:512 value bitpix=-32)RP( + +)0 P(The list feature also can be used to read unnamed columns from standard +input: simply replace the column name with a null string. Note +that the dimension information is still required: +) 5 60 PR( funimage -l stdin foo.fits "":0:512 "":0:512 "" bitpix=-32 + 240 250 1 + 255 256 2 + ... + ^D)RP( + +)0 P(The list feature provides a simple way to generate a blank image. +If you pass a )0 47 1 A(Column-based Text File)47 0 TN TL()Ec /AF f D( +to funimage in which the text header contains the required image +information, then funimage will correctly make a blank image. For +example, consider the following text file \201called foo.txt\202: +) 3 20 PR( x:I:1:10 y:I:1:10 + ------ ------ + 0 0)RP( +This text file defines two columns, x and y, each of data type 32-bit int and +image dimension 10. The command: +) 1 36 PR( funimage foo.txt foo.fits bitpix=8)RP( +will create an empty FITS image called foo.fits containing a 10x10 +image of unsigned char: +) 13 75 PR( fundisp foo.fits + 1 2 3 4 5 6 7 8 9 10 + ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ + 10: 0 0 0 0 0 0 0 0 0 0 + 9: 0 0 0 0 0 0 0 0 0 0 + 8: 0 0 0 0 0 0 0 0 0 0 + 7: 0 0 0 0 0 0 0 0 0 0 + 6: 0 0 0 0 0 0 0 0 0 0 + 5: 0 0 0 0 0 0 0 0 0 0 + 4: 0 0 0 0 0 0 0 0 0 0 + 3: 0 0 0 0 0 0 0 0 0 0 + 2: 0 0 0 0 0 0 0 0 0 0 + 1: 1 0 0 0 0 0 0 0 0 0)RP( + +Note that the text file must contain at least +one row of data. However, in the present example, event position 0,0 is +outside the limits of the image and will be ignored. \201You can, of course, +use real x,y values to seed the image with data.\202 + +)0 P(Furthermore, you can use the TEXT filter specification to obviate the need for +an input text file altogether. The following command will create the same +10x10 char image without an actual input file: +) 3 69 PR( funimage stdin'[TEXT\201x:I:10,y:I:10\202]' foo.fits bitpix=8 < /dev/null +or + funimage /dev/null'[TEXT\201x:I:10,y:I:10\202]' foo.fits bitpix=8)RP( + +)0 P(You also can use either of these methods to generate a region mask simply +by appending a region inside the filter brackets and specfying )BD(mask=all)ES( +along with the bitpix. For example, the following command will generate a +10x10 char mask using 3 regions: +) 2 76 PR( funimage stdin'[TEXT\201x:I:10,y:I:10\202,cir\2015,5,4\202,point\20110,1\202,-cir\2015,5,2\202]' \200 + foo.fits bitpix=8,mask=all < /dev/null)RP( +The resulting mask looks like this: +) 13 75 PR( fundisp foo.fits + 1 2 3 4 5 6 7 8 9 10 + ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ + 10: 0 0 0 0 0 0 0 0 0 0 + 9: 0 0 0 0 0 0 0 0 0 0 + 8: 0 0 1 1 1 1 1 0 0 0 + 7: 0 1 1 1 1 1 1 1 0 0 + 6: 0 1 1 0 0 0 1 1 0 0 + 5: 0 1 1 0 0 0 1 1 0 0 + 4: 0 1 1 0 0 0 1 1 0 0 + 3: 0 1 1 1 1 1 1 1 0 0 + 2: 0 0 1 1 1 1 1 0 0 0 + 1: 0 0 0 0 0 0 0 0 0 2)RP( + +)0 P(You can use )BD(funimage)ES( to create 1D image projections along the x +or y axis using the )BD(-p [x|y])ES( switch. This capability works for +both images and tables. For example consider a FITS table named ev.fits +containing the following rows: +) 17 19 PR( X Y + -------- -------- + 1 1 + 1 2 + 1 3 + 1 4 + 1 5 + 2 2 + 2 3 + 2 4 + 2 5 + 3 3 + 3 4 + 3 5 + 4 4 + 4 5 + 5 5)RP( +A corresponding 5x5 image, called dim2.fits, would therefore contain: +) 7 59 PR( 1 2 3 4 5 + ---------- ---------- ---------- ---------- ---------- + 5: 1 1 1 1 1 + 4: 1 1 1 1 0 + 3: 1 1 1 0 0 + 2: 1 1 0 0 0 + 1: 1 0 0 0 0)RP( +A projection along the y axis can be performed on either the table or +the image: +) 9 59 PR( funimage -p y ev.fits stdout | fundisp stdin + 1 2 3 4 5 + ---------- ---------- ---------- ---------- ---------- + 1: 1 2 3 4 5 + + funimage -p y dim2.fits stdout | fundisp stdin + 1 2 3 4 5 + ---------- ---------- ---------- ---------- ---------- + 1: 1 2 3 4 5)RP( + +)0 P(Furthermore, you can create a 1D image projection along any column of +a table by using the )BD(bincols=[column])ES( filter specification and +specifying a single column. For example, the following command +projects the same 1D image along the y axis of a table as use of +the )BD(-p y)ES( switch: +) 4 59 PR( funimage ev.fits'[bincols=y]' stdout | fundisp stdin + 1 2 3 4 5 + ---------- ---------- ---------- ---------- ---------- + 1: 1 2 3 4 5)RP( + +)0 P(Examples: +)0 P(Create a FITS image from a FITS binary table: +) 1 33 PR( [sh] funimage test.ev test.fits)RP( + +)0 P(Display the FITS image generated from a blocked section of FITS binary table: +) 5 60 PR( [sh] funimage "test.ev[2:8,3:7,2]" stdout | fundisp stdin + 1 2 3 + --------- --------- --------- + 1: 20 28 36 + 2: 28 36 44)RP( + + + + +)0 2 14 H(funindex)WB 77 Sn()WB 11 Sn( - create an index for a column of a FITS binary table)EA()EH( + + +)BD() 1 42 PR(funindex <switches> <iname> <key> [oname])RP()ES( + + +)0 P() 7 71 PR( NB: these options are not compatible with Funtools processing. Please + use the defaults instead. + -c # compress output using gzip" + -a # ASCII output, ignore -c \201default: FITS table\202" + -f # FITS table output \201default: FITS table\202" + -l # long output, i.e. with key value\201s\202 \201default: long\202" + -s # short output, i.e. no key value\201s\202 \201default: long\202")RP( + + +)0 P(The funindex script creates an index for the specified column \201key\202 by +running funtable -s \201sort\202 and then saving the column value and the +record number for each sorted row. This index will be used automatically + by funtools filtering of that column, provided the index file's modification +date is later than that of the data file. + +)0 P( +The first required argument is the name of the FITS binary table +to index. Please note that text files cannot be indexed at this time. +The second required argument is the column \201key\202 name to index. While +multiple keys can be specified in principle, the funtools index processing +assume a single key and will not recognize files containing multiple keys. + +)0 P(By default, the output index file name is [root]_[key].idx, where [root] +is the root of the input file. Funtools looks for this specific file name +when deciding whether to use an index for faster filtering. Therefore, the +optional third argument \201output file name\202 should not be used for funtools +processing. + +)0 P(For example, to create an index on column Y for a given FITS file, use: +) 1 21 PR( funindex foo.fits Y)RP( +This will generate an index named foo_y.idx, which will be used by funtools +for filters involving the Y column. + + + + +)0 2 15 H(funjoin)WB 78 Sn()WB 12 Sn( - join two or more FITS binary tables on specified columns)EA()EH( + + +)BD() 1 57 PR(funjoin [switches] <ifile1> <ifile2> ... <ifilen> <ofile>)RP()ES( + + +)0 P() 11 74 PR( -a cols # columns to activate in all files + -a1 cols ... an cols # columns to activate in each file + -b 'c1:bvl,c2:bv2' # blank values for common columns in all files + -bn 'c1:bv1,c2:bv2' # blank values for columns in specific files + -j col # column to join in all files + -j1 col ... jn col # column to join in each file + -m min # min matches to output a row + -M max # max matches to output a row + -s # add 'jfiles' status column + -S col # add col as status column + -t tol # tolerance for joining numeric cols [2 files only])RP( + + +)BD(funjoin)ES( joins rows from two or more \201up to 32\202 +)0 42 1 A(FITS Binary Table files)42 0 TN TL()Ec /AF f D(, based on the values +of specified join columns in each file. NB: the join columns must have +an index file associated with it. These files are generated using the +)BD(funindex)ES( program. + +)0 P(The first argument to the program specifies the first input FITS table +or raw event file. If "stdin" is specified, data are read from the +standard input. Subsequent arguments specify additional event files +and tables to join. The last argument is the output FITS file. + +)0 P(NB: Do )BD(not)ES( use )0 42 1 A(Funtools Bracket +Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions and row filters when running +funjoin or you will get wrong results. Rows are accessed and joined +using the index files directly, and this bypasses all filtering. + +)0 P(The join columns are specified using the )BD(-j col)ES( switch \201which +specifies a column name to use for all files\202 or with )BD(-j1 col1)ES(, +)BD(-j2 col2)ES(, ... )BD(-jn coln)ES( switches \201which specify a column +name to use for each file\202. A join column must be specified for each file. +If both )BD(-j col)ES( and )BD(-jn coln)ES( are specified for a given +file, then the latter is used. Join columns must either be of type +string or type numeric; it is illegal to mix numeric and string +columns in a given join. For example, to join three files using the +same key column for each file, use: +) 1 52 PR( funjoin -j key in1.fits in2.fits in3.fits out.fits)RP( +A different key can be specified for the third file in this way: +) 1 65 PR( funjoin -j key -j3 otherkey in1.fits in2.fits in3.fits out.fits)RP( + +)0 P(The )BD(-a "cols")ES( switch \201and )BD(-a1 "col1")ES(, +)BD(-a2 "cols2")ES( counterparts\202 can be used to specify columns to +activate \201i.e. write to the output file\202 for each input file. By +default, all columns are output. + +)0 P(If two or more columns from separate files have the same name, the +second \201and subsequent\202 columns are renamed to have an underscore +and a numeric value appended. + +)0 P(The )BD(-m min)ES( and )BD(-M max)ES( switches specify the minimum +and maximum number of joins required to write out a row. The default +minimum is 0 joins \201i.e. all rows are written out\202 and the default maximum +is 63 \201the maximum number of possible joins with a limit of 32 input files\202. +For example, to write out only those rows in which exactly two files +have columns that match \201i.e. one join\202: +) 1 66 PR( funjoin -j key -m 1 -M 1 in1.fits in2.fits in3.fits ... out.fits)RP( + +)0 P(A given row can have the requisite number of joins without all of the +files being joined \201e.g. three files are being joined but only two +have a given join key value\202. In this case, all of the columns of the +non-joined file are written out, by default, using blanks \201zeros or NULLs\202. +The )BD(-b c1:bv1,c2:bv2)ES( and +)BD(-b1 'c1:bv1,c2:bv2' -b2 'c1:bv1,c2:bv2' ...)ES( +switches can be used to set the blank value for columns common to all +files and/or columns in a specified file, respectively. Each blank value +string contains a comma-separated list of column:blank_val specifiers. +For floating point values \201single or double\202, a case-insensitive string +value of "nan" means that the IEEE NaN \201not-a-number\202 should be +used. Thus, for example: +) 1 62 PR( funjoin -b "AKEY:???" -b1 "A:-1" -b3 "G:NaN,E:-1,F:-100" ...)RP( +means that a non-joined AKEY column in any file will contain the +string "???", the non-joined A column of file 1 will contain a value +of -1, the non-joined G column of file 3 will contain IEEE NaNs, while +the non-joined E and F columns of the same file will contain values -1 +and -100, respectively. Of course, where common and specific blank values +are specified for the same column, the specific blank value is used. + +)0 P(To distinguish which files are non-blank components of a given row, +the )BD(-s)ES( \201status\202 switch can be used to add a bitmask column named +"JFILES" to the output file. In this column, a bit is set for each +non-blank file composing the given row, with bit 0 corresponds to the +first file, bit 1 to the second file, and so on. The file names +themselves are stored in the FITS header as parameters named JFILE1, +JFILE2, etc. The )BD(-S col)ES( switch allows you to change the name +of the status column from the default "JFILES". + +)0 P(A join between rows is the Cartesian product of all rows in one file +having a given join column value with all rows in a second file having +the same value for its join column and so on. Thus, if file1 has 2 +rows with join column value 100, file2 has 3 rows with the same value, +and file3 has 4 rows, then the join results in 2*3*4=24 rows being output. + +)0 P(The join algorithm directly processes the index file associated with +the join column of each file. The smallest value of all the current +columns is selected as a base, and this value is used to join +equal-valued columns in the other files. In this way, the index files +are traversed exactly once. + +)0 P(The )BD(-t tol)ES( switch specifies a tolerance value for numeric +columns. At present, a tolerance value can join only two files at a +time. \201A completely different algorithm is required to join more than +two files using a tolerance, somethng we might consider implementing +in the future.\202 + +)0 P(The following example shows many of the features of funjoin. The input files +t1.fits, t2.fits, and t3.fits contain the following columns: +) 28 49 PR( [sh] fundisp t1.fits + AKEY KEY A B + ----------- ------ ------ ------ + aaa 0 0 1 + bbb 1 3 4 + ccc 2 6 7 + ddd 3 9 10 + eee 4 12 13 + fff 5 15 16 + ggg 6 18 19 + hhh 7 21 22 + +fundisp t2.fits + AKEY KEY C D + ----------- ------ ------ ------ + iii 8 24 25 + ggg 6 18 19 + eee 4 12 13 + ccc 2 6 7 + aaa 0 0 1 + +fundisp t3.fits + AKEY KEY E F G +------------ ------ -------- -------- ----------- + ggg 6 18 19 100.10 + jjj 9 27 28 200.20 + aaa 0 0 1 300.30 + ddd 3 9 10 400.40)RP( + +)0 P(Given these input files, the following funjoin command: +) 3 59 PR( funjoin -s -a1 "-B" -a2 "-D" -a3 "-E" -b \200 + "AKEY:???" -b1 "AKEY:XXX,A:255" -b3 "G:NaN,E:-1,F:-100" \200 + -j key t1.fits t2.fits t3.fits foo.fits)RP( +will join the files on the KEY column, outputting all columns except B +\201in t1.fits\202, D \201in t2.fits\202 and E \201in t3.fits\202, and setting blank +values for AKEY \201globally, but overridden for t1.fits\202 and A \201in file +1\202 and G, E, and F \201in file 3\202. A JFILES column will be output to +flag which files were used in each row: +) 12 105 PR( AKEY KEY A AKEY_2 KEY_2 C AKEY_3 KEY_3 F G JFILES + ------------ ------ ------ ------------ ------ ------ ------------ ------ -------- ----------- -------- + aaa 0 0 aaa 0 0 aaa 0 1 300.30 7 + bbb 1 3 ??? 0 0 ??? 0 -100 nan 1 + ccc 2 6 ccc 2 6 ??? 0 -100 nan 3 + ddd 3 9 ??? 0 0 ddd 3 10 400.40 5 + eee 4 12 eee 4 12 ??? 0 -100 nan 3 + fff 5 15 ??? 0 0 ??? 0 -100 nan 1 + ggg 6 18 ggg 6 18 ggg 6 19 100.10 7 + hhh 7 21 ??? 0 0 ??? 0 -100 nan 1 + XXX 0 255 iii 8 24 ??? 0 -100 nan 2 + XXX 0 255 ??? 0 0 jjj 9 28 200.20 4)RP( + + + +)0 2 16 H(funmerge)WB 79 Sn()WB 13 Sn( - merge one or more Funtools table files)EA()EH( + + +)BD() 1 61 PR(funmerge [-w|-x] -f [colname] <iname1> <iname2> ... <oname>)RP()ES( + + +)0 P() 3 68 PR( -f # output a column specifying file from which this event came + -w # adjust position values using WCS info + -x # adjust position values using WCS info and save old values)RP( + + +)0 P()BD(funmerge)ES( merges FITS data from one or more +)0 42 1 A(FITS Binary Table files)42 0 TN TL()Ec /AF f D( +or raw event files. +)0 P(The first argument to the program specifies the first input FITS table +or raw event file. If "stdin" is specified, data are read from the +standard input. Use )0 42 1 A(Funtools Bracket +Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions and row filters. Subsequent +arguments specify additional event files and tables to merge. \201NB: Stdin +cannot not be used for any of these additional input file arguments.\202 +The last argument is the output FITS file. The columns in each input table +must be identical. + +)0 P(If an input file begins with the '@' character, it is processed as an +include file, i.e., as a text file containing event file names \201as +well as blank lines and/or comment lines starting with the '#' sign\202. +If standard input is specified as an include file \201'@stdin'\202, then +file names are read from the standard input until EOF \201^D\202. Event +files and include files can be mixed on a command line. + +)0 P(Rows from each table are written sequentially to the output +file. If the switch )BD(-f [colname])ES( is specified on the command +line, an additional column is added to each row containing the number +of the file from which that row was taken \201starting from one\202. In +this case, the corresponding file names are stored in the header +parameters having the prefix )BD(FUNFIL)ES(, i.e., FUNFIL01, +FUNFIL02, etc. + +)0 P(Using the )BD(-w)ES( switch \201or )BD(-x)ES( switch as described +below\202, )BD(funmerge)ES( also can adjust the position column values +using the WCS information in each file. \201By position columns, we mean +the columns that the table is binned on, i.e., those columns defined +by the )BD(bincols=)ES( switch, or \201X,Y\202 by default.\202 To perform WCS +alignment, the WCS of the first file is taken as the base WCS. Each +position in subsequent files is adjusted by first converting it to the +sky coordinate in its own WCS coordinate system, then by converting +this sky position to the sky position of the base WCS, and finally +converting back to a pixel position in the base system. Note that in +order to perform WCS alignment, the appropriate WCS and TLMIN/TLMAX +keywords must already exist in each FITS file. +)0 P(When performing WCS alignment, you can save the original positions in +the output file by using the )BD(-x)ES( \201for "xtra"\202 switch instead +of the )BD(-w)ES( switch \201i.e., using this switch also implies using +)BD(-w)ES(\202 The old positions are saved in columns having the same +name as the original positional columns, with the added prefix "OLD_". +)0 P(Examples: + +)0 P(Merge two tables, and preserve the originating file number for +each row in the column called "FILE" \201along with the corresponding +file name in the header\202: +) 1 51 PR( [sh] funmerge -f "FILE" test.ev test2.ev merge.ev)RP( + +)0 P(Merge two tables with WCS alignment, saving the old position values in +2 additional columns: +) 1 44 PR( [sh] funmerge -x test.ev test2.ev merge.ev)RP( + +)0 P(This program only works on raw event files and binary tables. We have +not yet implemented image and array merging. + + + + +)0 2 17 H(funsky)WB 80 Sn()WB 14 Sn( - convert between image and sky coordinates)EA()EH( + + +)BD() 4 72 PR( funsky iname[ext] # RA,Dec \201deg\202 or image pix from stdin + funsky iname[ext] [lname] # RA, Dec \201deg\202 or image pix from list + funsky iname[ext] [col1] [col2] # named cols:units from stdin + funsky iname[ext] [lname] [col1] [col2] # named cols:units from list)RP()ES( + + +)0 P() 5 73 PR( -d # always use integer tlmin conversion \201as ds9 does\202 + -r # convert x,y to RA,Dec \201default: convert RA,Dec to x,y\202 + -o # include offset from the nominal target position \201in arcsec\202 + -v # display input values also \201default: display output only\202 + -T # output display in rdb format \201w/header,tab delimiters\202)RP( + + +)0 P(Funsky converts input sky coordinates \201RA, Dec\202 to image coordinates \201or vice +versa\202 using the WCS information contained in the specified FITS file. Several +calling sequences are supported in order to make it easy to specify +coordinate positions in different ways. + +)0 P(The first required argument is always the input FITS file \201or +extension\202 containing the WCS information in an extension header. Note +that the data from this file is not used. By default, the program +converts input RA and Dec values to X and Y using this WCS +information. If the WCS is associated with a FITS image, then the X,Y +values are image values. If the WCS is associated with a binary table, +then the X, Y values are physical values. To convert X,Y to RA and +Dec, use the )BD(-r)ES( \201reverse\202 switch. + +)0 P(If no other command arguments are supplied, then the input positions +are read from the standard input. Each line is assumed to contain a +single coordinate position consisting of an RA in degrees \201or X in +pixels\202 followed by a Dec in degrees \201or Y in pixels\202. The usual +delimiters are supported \201spaces, commas, tabs\202. For example: +) 9 52 PR( # read from stdin, default column names and units + [sh] funsky snr.ev + 22.982695 58.606523 # input RA \201hrs\202, Dec\201deg\202 + 510.00 510.00 + 22.982127 58.607634 # input + 512.00 510.50 + 22.981700 58.614301 # input + 513.50 513.50 + ^D # end of input)RP( + +)0 P(If a second argument is supplied, this argument is assumed to be +a file containing RA \201X\202 and Dec \201Y\202 positions. The file can either be +an ASCII table or a FITS binary table. The order of columns is +unimportant, if the table has a column header. In this case, the +names of the columns must be one of "RA", "DEC", or "X", "Y" for sky +to image and image to sky conversions, respectively. If the table has +no header, then once again, RA \201X\202 is assumed to first, followed +by DEC \201Y\202. +For example: +) 12 50 PR( # read from file, default column names and units + [sh] cat hd.in + RA DEC + --------- --------- + 22.982695 58.606523 + 22.982127 58.607634 + 22.981700 58.614301 + + [sh] funsky snr.ev hd.in + 510.00 510.00 + 512.00 510.50 + 513.50 513.50)RP( + +)0 P(If three arguments are supplied, then the input positions again are +read from the standard input. Each line is assumed to contain a single +coordinate position consisting of an RA \201or X in pixels\202 followed by a +Dec \201or Y in pixels\202, with the usual delimiters supported. However, +the second and third arguments now specify the column names and/or +sky units using a colon-delimited syntax: +) 1 19 PR( [colname]:[h|d|r])RP( +If the colname is omitted, the names default to "RA", "DEC", "X", "Y", +"COL1", or "COL2" as above. If the units are omitted, the default is degrees +for both RA and Dec. When the -r switch is used \201convert from image +to sky\202 the units are applied to the output instead of the input. The following +examples will serve to illustrate the options: +) 36 66 PR( # read from stdin, specifying column names \201def. units: degrees\202 + [sh] cat hd.in + MYRA MYDEC + --------- --------- + 22.982695 58.606523 + 22.982127 58.607634 + 22.981700 58.614301 + + [sh] funsky snr.ev MYRA MYDEC < hd.in + 510.00 510.00 + 512.00 510.50 + 513.50 513.50 + + # read from stdin, specifying column names and units + [sh] cat dd.in + MYRA MYDEC + --------- --------- + 344.740432 58.606523 + 344.731900 58.607634 + 344.725500 58.614301 + + [sh] funsky snr.ev MYRA:d MYDEC:d < dd.in + 510.00 510.00 + 512.00 510.50 + 513.50 513.50 + + # read stdin, convert image to sky, specifying output sky units + [sh] cat im.in + 510.00 510.00 + 512.00 510.50 + 513.50 513.50)WR( + + [sh] cat im.in | funsky -r snr.ev :d :d + 344.740432 58.606523 + 344.731900 58.607634 + 344.725500 58.614301)RP( + +)0 P(Finally, four command arguments specify both and input file and column names +and/or units: +) 22 64 PR( [sh] cat dd.in + MYRA MYDEC + --------- --------- + 344.740432 58.606523 + 344.731900 58.607634 + 344.725500 58.614301 + + [sh] funsky snr.ev dd.in MYRA:d MYDEC:d + 510.00 510.00 + 512.00 510.50 + 513.50 513.50 + + # read file, convert image to sky, specifying output sky units + [sh] cat im.in + 510.00 510.00 + 512.00 510.50 + 513.50 513.50 + + [sh] funsky -r snr.ev im.in :d :d + 344.740432 58.606523 + 344.731900 58.607634 + 344.725500 58.614301)RP( + +)0 P(By default, the output of funsky consists only of the converted coordinate +position\201s\202, one per output line. This makes parsing in shell scripts easy. +Use the )BD(-v)ES( \201verbose\202 switch to specify that the input +coordinates should be pre-pended to each line. For example: +) 16 53 PR( [sh] cat dd.in + MYRA MYDEC + --------- --------- + 344.740432 58.606523 + 344.731900 58.607634 + 344.725500 58.614301 + + [sh] funsky snr.ev dd.in MYRA:d MYDEC:d + 510.00 510.00 + 512.00 510.50 + 513.50 513.50 + + [sh] funsky -v snr.ev dd.in MYRA:d MYDEC:d + 344.740432 58.606523 510.00 510.00 + 344.731900 58.607634 512.00 510.50 + 344.725500 58.614301 513.50 513.50)RP( + +)0 P(In addition, a full starbase table can be output using the )BD(-T)ES( +\201table\202 switch. This switch can be used with or without the -v +switch. If the -T and -v are both specified, then a descriptive header +parameters are output before the table \201mainly to remind you of the +sky units\202: +) 23 62 PR( # output table in non-verbose mode + [sh] funsky -T snr.ev dd.in MYRA:d MYDEC:d + X Y + ------------ ------------ + 510.00 510.00 + 512.00 510.50 + 513.50 513.50 + + # output table in verbose mode + [sh] funsky -T -v snr.ev dd.in MYRA:d MYDEC:d + # IFILE = /Users/eric/data/snr.ev + # ICOL1 = MYRA + # ICOL2 = MYDEC + # IUNITS1 = d + # IUNITS2 = d + # OCOL1 = X + # OCOL2 = Y + + MYRA MYDEC X Y + ------------ ------------ ------------ ------------ + 344.740432 58.606523 510.00 510.00 + 344.731900 58.607634 512.00 510.50 + 344.725500 58.614301 513.50 513.50)RP( + +)0 P(Finally, the )BD(-d)ES( \201ds9\202 switch mimicks ds9's use of integer TLMIN +and TLMAX values for all coordinate transformations. FITS conventions +seem to call for use of floating point TLMIN and TLMAX when the data are +floats. This convention is followed by funsky but results in a +small discrepancy with ds9's converted values for floating point +data. We will remedy this conflict in the future, maybe. + + + + +)0 2 18 H(funtable)WB 81 Sn()WB 15 Sn( - copy selected rows from a Funtools file to a FITS binary table)EA()EH( + + +)BD() 1 62 PR(funtable [-a] [-i|-z] [-m] [-s cols] <iname> <oname> [columns])RP()ES( + + +)0 P() 5 61 PR( -a # append to existing output file as a table extension + -i # for image data, only generate X and Y columns + -m # for tables, write a separate file for each region + -s "col1 ..." # columns on which to sort + -z # for image data, output zero-valued pixels)RP( + + +)0 P()BD(funtable)ES( selects rows from the specified +)0 42 1 A(FITS Extension)42 0 TN TL()Ec /AF f D( +\201binary table only\202 of a FITS file, or from a non-FITS raw event +file, and writes those rows to a FITS binary table file. It also +will create a FITS binary table from an image or a raw array file. + +)0 P(The first argument to the program specifies the FITS file, raw event +file, or raw array file. If "stdin" is specified, data are read from +the standard input. Use )0 42 1 A(Funtools Bracket +Notation)42 0 TN TL()Ec /AF f D( to specify FITS extensions, and filters. The second +argument is the output FITS file. If "stdout" is specified, the FITS +binary table is written to the standard output. By default, all +columns of the input file are copied to the output file. Selected +columns can be output using an optional third argument in the form: +) 1 31 PR( "column1 column1 ... columnN")RP( + +)0 P(The )BD(funtable)ES( program generally is used to select rows from a +FITS binary table using +)0 52 1 A(Table Filters)52 0 TN TL()Ec /AF f D( +and/or +)0 54 1 A(Spatial Region Filters)54 0 TN TL()Ec /AF f D(. +For example, you can copy only selected rows \201and output only selected +columns\202 by executing in a command such as: +) 13 75 PR( [sh] funtable "test.ev[pha==1&)SY(\160)ES(==10]" stdout "x y pi pha" | fundisp stdin + X Y PHA PI + ------- ------- ------- --------- + 1 10 1 10 + 1 10 1 10 + 1 10 1 10 + 1 10 1 10 + 1 10 1 10 + 1 10 1 10 + 1 10 1 10 + 1 10 1 10 + 1 10 1 10 + 1 10 1 10)RP( +)0 P(The special column )BD($REGION)ES( can be specified to write the +region id of each row: +) 12 113 PR( [sh $] funtable "test.ev[time-\201int\202time>=.99&&annulus\2010 0 0 10 n=3\202]" stdout 'x y time $REGION' | fundisp stdin + X Y TIME REGION + -------- -------- --------------------- ---------- + 5 -6 40.99000000 3 + 4 -5 59.99000000 2 + -1 0 154.99000000 1 + -2 1 168.99000000 1 + -3 2 183.99000000 2 + -4 3 199.99000000 2 + -5 4 216.99000000 2 + -6 5 234.99000000 3 + -7 6 253.99000000 3)RP( +)0 P(Here only rows with the proper fractional time and whose position also is +within one of the three annuli are written. +)0 P(Columns can be excluded from display using a minus sign before the +column: +) 12 79 PR( [sh $] funtable "test.ev[time-\201int\202time>=.99]" stdout "-time" | fundisp stdin + X Y PHA PI DX DY + -------- -------- -------- ---------- ----------- ----------- + 5 -6 5 -6 5.50 -6.50 + 4 -5 4 -5 4.50 -5.50 + -1 0 -1 0 -1.50 0.50 + -2 1 -2 1 -2.50 1.50 + -3 2 -3 2 -3.50 2.50 + -4 3 -4 3 -4.50 3.50 + -5 4 -5 4 -5.50 4.50 + -6 5 -6 5 -6.50 5.50 + -7 6 -7 6 -7.50 6.50)RP( +All columns except the time column are written. +)0 P(In general, the rules for activating and de-activating columns are: +)UL()-1 LI( If only exclude columns are specified, then all columns but +the exclude columns will be activated. +)-1 LI( If only include columns are specified, then only the specified columns +are activated. +)-1 LI( If a mixture of include and exclude columns are specified, then +all but the exclude columns will be active; this last case +is ambiguous and the rule is arbitrary.)LU( +In addition to specifying columns names explicitly, the special +symbols )EM(+)ES( and )EM(-)ES( can be used to activate and +de-activate )EM(all)ES( columns. This is useful if you want to +activate the $REGION column along with all other columns. According +to the rules, the syntax "$REGION" only activates the region column +and de-activates the rest. Use "+ $REGION" to activate all +columns as well as the region column. + +)0 P(Ordinarily, only the selected table is copied to the output file. In +a FITS binary table, it sometimes is desirable to copy all of the +other FITS extensions to the output file as well. This can be done by +appending a '+' sign to the name of the extension in the input file +name. For example, the first command below copies only the EVENT table, +while the second command copies other extensions as well: +) 2 64 PR( [sh] funtable "/proj/rd/data/snr.ev[EVENTS]" events.ev + [sh] funtable "/proj/rd/data/snr.ev[EVENTS+]" eventsandmore.ev)RP( + +)0 P(If the input file is an image or a raw array file, then +)BD(funtable)ES( will generate a FITS binary table from the pixel +values in the image. Note that it is not possible to specify the +columns to output \201using command-line argument 3\202. Instead, there are +two ways to create such a binary table from an image. By default, a +3-column table is generated, where the columns are "X", "Y", and +"VALUE". For each pixel in the image, a single row \201event\202 is +generated with the "X" and "Y" columns assigned the dim1 and dim2 +values of the image pixel, respectively and the "VALUE" column +assigned the value of the pixel. With sort of table, running +)BD(funhist)ES( on the "VALUE" column will give the same results as +running )BD(funhist)ES( on the original image. + +)0 P(If the )BD(-i)ES( \201"individual" rows\202 switch is specified, then only +the "X" and "Y" columns are generated. In this case, each positive +pixel value in the image generates n rows \201events\202, where n is equal +to the integerized value of that pixel \201plus 0.5, for floating point +data\202. In effect, )BD(-i)ES( approximately recreates the rows of a +table that would have been binned into the input image. \201Of course, +this is only approximately correct, since the resulting x,y positions +are integerized.\202 + +)0 P(If the )BD(-s [col1 col2 ... coln])ES( \201"sort"\202 switch is specified, +the output rows of a binary table will be sorted using the +specified columns as sort keys. The sort keys must be scalar columns +and also must be part of the output file \201i.e. you cannot sort on a +column but not include it in the output\202. This facility uses the +)BD(_sort)ES( program \201included with funtools\202, which must be accessible +via your path. + +)0 P(For binary tables, the )BD(-m)ES( \201"multiple files"\202 switch will +generate a separate file for each region in the filter specification +i.e. each file contains only the rows from that region. Rows +which pass the filter but are not in any region also are put in a +separate file. + +)0 P(The separate output file names generated by the )BD(-m)ES( switch are +produced automatically from the root output file to contain the region id of +the associated region. \201Note that region ids start at 1, so that the +file name associated with id 0 contains rows that pass the filter but +are not in any given region.\202 Output file names are generated as follows: + +)UL()-1 LI( A $n specification can be used anywhere in the root file name \201suitably +quoted to protect it from the shell\202 and will be expanded to be the id +number of the associated region. For example: +) 1 78 PR( funtable -m input.fits'[cir\201512,512,1\202;cir\201520,520,1\202...]' 'foo.goo_$n.fits')RP( +will generate files named foo.goo_0.fits \201for rows not in any region but +still passing the filter\202, foo.goo_1.fits \201rows in region id #1, the first +region\202, foo.goo_2.fits \201rows in region id #2\202, etc. Note that single quotes +in the output root are required to protect the '$' from the shell. + +)-1 LI( If $n is not specified, then the region id will be placed before +the first dot \201.\202 in the filename. Thus: +) 1 73 PR( funtable -m input.fits'[cir\201512,512,1\202;cir\201520,520,1\202...]' foo.evt.fits)RP( +will generate files named foo0.evt.fits \201for rows not in any region but +still passing the filter\202, foo1.evt.fits \201rows in region id #1\202, +foo2.evt.fits \201rows in region id #2\202, etc. + +)-1 LI( If no dot is specified in the root output file name, then +the region id will be appended to the filename. Thus: +) 1 70 PR( funtable -m input.fits'[cir\201512,512,1\202;cir\201520,520,1\202...]' 'foo_evt')RP( +will generate files named foo_evt0 \201for rows not in any region but +still passing the filter\202, foo_evt1 \201rows in region id #1\202, +foo_evt2 \201rows in region id #2\202, etc.)LU( +The multiple file mechanism provide a simple way to generate +individual source data files with a single pass through the data. + +)0 P(By default, a new FITS file is created and the binary table is written +to the first extension. If the )BD(-a)ES( \201append\202 switch is specified, +the table is appended to an existing FITS file as a BINTABLE extension. +Note that the output FITS file must already exist. + +)0 P(If the )BD(-z)ES( \201"zero" pixel values\202 switch is specified and +)BD(-i)ES( is not specified, then pixels having a zero value will +be output with their "VALUE" column set to zero. Obviously, this +switch does not make sense when individual events are output. + + + + +)0 2 19 H(funtbl)WB 82 Sn()WB 16 Sn( - extract a table from Funtools ASCII output)EA()EH( + + +)BD() 1 61 PR(funtable [-c cols] [-h] [-n table] [-p prog] [-s sep] <iname>)RP()ES( + + +)0 P([NB: This program has been deprecated in favor of the ASCII text processing +support in funtools. You can now perform fundisp on funtools ASCII output +files \201specifying the table using bracket notation\202 to extract tables +and columns.] + +The )BD(funtbl)ES( script extracts a specified table \201without the +header and comments\202 from a funtools ASCII output file and writes the +result to the standard output. The first non-switch argument is the +ASCII input file name \201i.e. the saved output from funcnts, fundisp, +funhist, etc.\202. If no filename is specified, stdin is read. The +-n switch specifies which table \201starting from 1\202 to extract. The +default is to extract the first table. The -c switch is a +space-delimited list of column numbers to output, e.g. -c "1 3 5" +will extract the first three odd-numbered columns. The default is to +extract all columns. The -s switch specifies the separator string to +put between columns. The default is a single space. The -h switch +specifies that column names should be added in a header line before +the data is output. Without the switch, no header is prepended. The +-p program switch allows you to specify an awk-like program to run +instead of the default \201which is host-specific and is determined at +build time\202. The -T switch will output the data in rdb format \201i.e., +with a 2-row header of column names and dashes, and with data columns +separated by tabs\202. The -help switch will print out a message +describing program usage. + +)0 P(For example, consider the output from the following funcnts command: +) 37 82 PR( [sh] funcnts -sr snr.ev "ann 512 512 0 9 n=3" + # source + # data file: /proj/rd/data/snr.ev + # arcsec/pixel: 8 + # background + # constant value: 0.000000 + # column units + # area: arcsec**2 + # surf_bri: cnts/arcsec**2 + # surf_err: cnts/arcsec**2 + + # summed background-subtracted results + upto net_counts error background berror area surf_bri surf_err + ---- ------------ --------- ------------ --------- --------- --------- --------- + 1 147.000 12.124 0.000 0.000 1600.00 0.092 0.008 + 2 625.000 25.000 0.000 0.000 6976.00 0.090 0.004 + 3 1442.000 37.974 0.000 0.000 15936.00 0.090 0.002 + + + # background-subtracted results + reg net_counts error background berror area surf_bri surf_err + ---- ------------ --------- ------------ --------- --------- --------- --------- + 1 147.000 12.124 0.000 0.000 1600.00 0.092 0.008 + 2 478.000 21.863 0.000 0.000 5376.00 0.089 0.004 + 3 817.000 28.583 0.000 0.000 8960.00 0.091 0.003 + + + # the following source and background components were used: + source_region\201s\202 + ---------------- + ann 512 512 0 9 n=3)WR( + + reg counts pixels sumcnts sumpix + ---- ------------ --------- ------------ --------- + 1 147.000 25 147.000 25 + 2 478.000 84 625.000 109 + 3 817.000 140 1442.000 249)RP( +)0 P(There are four tables in this output. To extract the last one, you +can execute: +) 4 60 PR( [sh] funcnts -s snr.ev "ann 512 512 0 9 n=3" | funtbl -n 4 + 1 147.000 25 147.000 25 + 2 478.000 84 625.000 109 + 3 817.000 140 1442.000 249)RP( +Note that the output has been re-formatted so that only a single space +separates each column, with no extraneous header or comment information. + +)0 P(To extract only columns 1,2, and 4 from the last example \201but with a header +prepended and tabs between columns\202, you can execute: +) 5 82 PR( [sh] funcnts -s snr.ev "ann 512 512 0 9 n=3" | funtbl -c "1 2 4" -h -n 4 -s "\200t" + #reg counts sumcnts + 1 147.000 147.000 + 2 478.000 625.000 + 3 817.000 1442.000)RP( +)0 P(Of course, if the output has previously been saved in a file named +foo.out, the same result can be obtained by executing: +) 5 48 PR( [sh] funtbl -c "1 2 4" -h -n 4 -s "\200t" foo.out + #reg counts sumcnts + 1 147.000 147.000 + 2 478.000 625.000 + 3 817.000 1442.000)RP( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 20 H(Last)WB 83 Sn( updated: April 1, 2007)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (ds9.html) D +/Ti (Funtools and DS9 Image Display) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 17 Sn( + + +)0 2 21 H(FunDS9:)WB 85 Sn()WB 84 Sn( Funtools and DS9 Image Display)EA()EH( + + +)0 2 22 H(Summary)WB 86 Sn()EH( +Describes how funtools can be integrated into the ds9 Analysis menu. + + +)0 2 23 H(Description)WB 87 Sn()EH( +)0 P()R1 2 A(SAOImage/DS9)EA( is an astronomical imaging and data visualization +application used by astronomers around the world. DS9 can display +standard astronomical FITS images and binary tables, but also has +support for displaying raw array files, shared memory files, and data +files automatically retrieved via FTP and HTTP. Standard functional +capabilities include multiple frame buffers, colormap and region +manipulation, and many data scaling algorithms. DS9's advanced +features include TrueColor visuals, deep frame buffers, true +PostScript printing, and display of image mosaics. The program's +support of image tiling, "blinking", arbitrary zoom, rotation, and pan +is unparalleled in astronomy. It also has innovative support for +automatic retrieval and display of standard image data such as the +Digital Sky Survey \201using servers at SAO, StScI, or ESO\202. + +)0 P(DS9 can communicate with external programs such as Funtools using the +)R2 2 A(XPA)EA( +messaging system. In addition, programs can be integrated directly +into the DS9 GUI by means of a configurable Analysis menu. By +default, the DS9 Analysis menu contains algorithms deemed essential to +the core functions of DS9, e.g., display cross-cuts of data, +iso-intensity contours, and WCS grids. However, new programs can be +added to DS9 by creating a set-up file which can be loaded into DS9 +to reconfigure the Analysis menu. + +) 7 48 PR(The basic format of the analysis set-up file is: +)0 P( # + # Analysis command descriptions: + # menu label/description + # file templates for this command + # "menu" \201add to menu\202 |"bind" \201bind to key\202 + # analysis command line)RP( + +For example, the funcnts program can be specified in this way: +) 4 69 PR( Funcnts \201counts in source/bkgd regions; options: none\202 + * + menu + funcnts $filename $regions\201source,,\202 $regions\201background,,\202 | $text)RP( +As shown above, DS9 supports a macro facility to provide information +as well as task support to command lines. For example, the $regions +macro is expanded by DS9 to provide the current source and/or +background region to the analysis command. The $text macro is expanded +to generate a text window display. It also is possible to query for +parameters using a $param macro, plot data using a $plot macro, +etc. See the DS9 documentation for further details. + +)0 P(A set-up file called )0 2 A(funtools.ds9)EA( will +load some useful Funtools applications \201counts in regions, radial +profile, X-ray light curve and energy spectrum, 1D histogram\202 into the DS9 +Analysis menu \201version 2.1 and above\202. The file resides in the bin +directory where Funtools programs are installed. It can be manually +loaded into DS9 from the )BD(Load Analysis Commands ...)ES( option of +the )BD(Analysis)ES( menu. Alternatively, you can tell DS9 to load +this file automatically at start-up time by adding the pathname to the +)BD(Edit)ES(->)BD(Preferences)ES(->)BD(Analysis Menu)ES(->)BD(Analysis +File)ES( menu option. \201NB: make sure you select +)BD(Edit)ES(->)BD(Preferences)ES(->)BD(Save Preferences)ES( after setting +the pathname.\202 + +)0 P(The tasks in this setup file generally process the original disk-based +FITS file. Funcnts-based results \201radial profile, counts in regions\202 +are presented in WCS units, if present in the FITS header. For +situations where a disk file is not available \201e.g., image data +generated and sent to DS9's 'fits' XPA access point\202, versions of the +radial profile and counts in regions tasks also are also offered +utilizing DS9's internal image data. Results are presented in pixels. +Aside from the units, the results should be identical to the file-based +results. + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 24 H(Last)WB 88 Sn( updated: November 16, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (library.html) D +/Ti (Funtools Programming) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 18 Sn( + + +)0 2 25 H(FunLib:)WB 91 Sn()WB 89 Sn( the Funtools Programming Interface)EA()EH( + + +)0 2 26 H(Summary)WB 92 Sn()EH( +A description of the Funtools library. + + +)0 2 27 H(Introduction)WB 93 Sn()WB 90 Sn( to the Funtools Programming Interface)EH()EA( +)0 P(To create a Funtools application, you need to include +the funtools.h definitions file in your code: +) 1 23 PR( #include <funtools.h>)RP( + +You then call Funtools subroutines and functions to access Funtools data. +The most important routines are: +)UL( +)0 P()-1 LI( )0 25 1 A(FunOpen)25 0 TN TL()Ec /AF f D(: open a Funtools file +)-1 LI()0 35 1 A(FunInfoGet)35 0 TN TL()Ec /AF f D(: get info about an image or table +)-1 LI()0 26 1 A(FunImageGet)26 0 TN TL()Ec /AF f D(: retrieve image data +)-1 LI()0 28 1 A(FunImageRowGet)28 0 TN TL()Ec /AF f D(: retrieve image data by row +)-1 LI()0 27 1 A(FunImagePut)27 0 TN TL()Ec /AF f D(: output image data +)-1 LI()0 29 1 A(FunImageRowPut)29 0 TN TL()Ec /AF f D(: output image data by row +)-1 LI()0 32 1 A(FunColumnSelect)32 0 TN TL()Ec /AF f D(: select columns in a table for access +)-1 LI()0 30 1 A(FunTableRowGet)30 0 TN TL()Ec /AF f D(: retrieve rows from a table +)-1 LI()0 31 1 A(FunTableRowPut)31 0 TN TL()Ec /AF f D(: output rows to a table +)-1 LI( )0 40 1 A(FunClose)40 0 TN TL()Ec /AF f D(: close a Funtools file)LU( + +Your program must be linked against the libfuntools.a library, +along with the math library. The following libraries also might be required +on your system: +)UL()-1 LI( -lsocket -lnsl for socket support +)-1 LI( -ldl for dynamic loading)LU( +)0 P(For example, on a Solaris system using gcc, use the following link line: +) 1 53 PR( gcc -o foo foo.c -lfuntools -lsocket -lnsl -ldl -lm)RP( +On a Solaris system using Solaris cc, use the following link line: +) 1 48 PR( gcc -o foo foo.c -lfuntools -lsocket -lnsl -lm)RP( +On a Linux system using gcc, use the following link line: +) 1 38 PR( gcc -o foo foo.c -lfuntools -ldl -lm)RP( +Once configure has built a Makefile on your platform, the required +"extra" libraries \201aside from -lm, which always is required\202 are +specified in that file's EXTRA_LIBS variable. For example, under +Linux you will find: +) 3 26 PR( grep EXTRA_LIBS Makefile + EXTRA_LIBS = -ldl + ...)RP( + +)0 P(The Funtools library contains both the zlib library +\201http://www.gzip.org/zlib/\202 and Doug Mink's WCS library +\201http://tdc-www.harvard.edu/software/wcstools/\202. It is not necessary +to put these libraries on a Funtools link line. Include files +necessary for using these libraries are installed in the Funtools +include directory. + +)0 2 28 H(Funtools)WB 94 Sn()WB 20 Sn( Programming Tutorial)EA()EH( + +The +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( +function is used to open a FITS file, an array, or a raw event file: +) 4 79 PR( /* open the input FITS file for reading */ + ifun = FunOpen\201iname, "r", NULL\202; + /* open the output FITS file for writing, and connect it to the input file */ + ofun = FunOpen\201iname, "w", ifun\202;)RP( +A new output file can inherit header parameters automatically from +existing input file by passing the input Funtools handle as the last +argument to the new file's +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( +call as shown above. + +)0 P(For image data, you then can call +)0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D( +to read an image into memory. +) 3 61 PR( float buf=NULL; + /* extract and bin the data section into an image buffer */ + buf = FunImageGet\201fun, NULL, "bitpix=-32"\202;)RP( +If the \201second\202 buf argument to this call is NULL, buffer space is allocated +automatically. The \201third\202 plist argument can be used to specify the +return data type of the array. If NULL is specified, the data type of +the input file is used. + +)0 P(To process an image buffer, you would generally make a call to +)0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D( to determine the +dimensions of the image \201which may have been changed from the original +file dimensions due to )0 49 1 A(Funtools image +sectioning)49 0 TN TL()Ec /AF f D( on the command line\202. In a FITS image, the index along +the dim1 axis varies most rapidly, followed by the dim2 axis, etc. +Thus, to access each pixel in an 2D image, use a double loop such as:)RP( + buf = FunImageGet\201fun, NULL, "bitpix=-32"\202; + FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; + for\201i=1; i<=dim2; i++\202{ + for\201j=1; j<=dim1; j++\202{ + ... process buf[\201\201i-1\202*dim1\202+\201j-1\202] ... + } + })RP( +or: +) 5 65 PR( buf = FunImageGet\201fun, NULL, "bitpix=-32"\202; + FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; + for\201i=0; i<\201dim1*dim2\202; i++\202{ + ... process buf[i] ... + })RP( +Finally, you can write the resulting image to disk using +)0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D(: +) 1 48 PR( FunImagePut\201fun2, buf, dim1, dim2, -32, NULL\202;)RP( +Note that Funtools automatically takes care of book-keeping tasks such as +reading and writing FITS headers \201although you can, of course, write +your own header or add your own parameters to a header\202. + +)0 P(For binary tables and raw event files, a call to +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( +will be followed by a call to the +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +routine to select columns to be read from the input file and/or +written to the output file: + +) 8 69 PR( typedef struct evstruct{ + double time; + int time2; + } *Ev, EvRec; + FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, + "time", "D", "rw", FUN_OFFSET\201Ev, time\202, + "time2", "J", "w", FUN_OFFSET\201Ev, time2\202, + NULL\202;)RP( +Columns whose \201third\202 mode argument contains an "r" are "readable", +i.e., columns will be read from the input file and converted into the +data type specified in the call's second argument. These columns +values then are stored in the specified offset of the user record +structure. Columns whose mode argument contains a "w" are +"writable", i.e., these values will be written to the output file. +The +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +routine also offers the option of automatically merging user +columns with the original input columns when writing the output +rows. + +)0 P(Once a set of columns has been specified, you can retrieve rows using +)0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(, +and write the rows using +)0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D(: +) 17 70 PR( Ev ebuf, ev; + /* get rows -- let routine allocate the array */ + while\201 \201ebuf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ + /* process all rows */ + for\201i=0; i<got; i++\202{ + /* point to the i'th row */ + ev = ebuf+i; + /* time2 is generated here */ + ev->time2 = \201int\202\201ev->time+.5\202; + /* change the input time as well */ + ev->time = -\201ev->time/10.0\202; + } + /* write out this batch of rows with the new column */ + FunTableRowPut\201fun2, \201char *\202ebuf, got, 0, NULL\202; + /* free row data */ + if\201 ebuf \202 free\201ebuf\202; + })RP( +The input rows are retrieved into an array of user structs, which +can be accessed serially as shown above. Once again, Funtools +automatically takes care of book-keeping tasks such as reading and writing +FITS headers \201although you can, of course, write your own header or +add your own parameters to a header\202. + +)0 P(When all processing is done, you can call +)0 40 1 A(FunClose\201\202)40 0 TN TL()Ec /AF f D( +to close the file\201s\202: +) 2 17 PR( FunClose\201fun2\202; + FunClose\201fun\202;)RP( + +)0 P(These are the basics of processing FITS files \201and arrays or raw event +data\202 using Funtools. The routines in these examples are described in +more detail below, along with a few other routines that support +parameter access, data flushing, etc. + +)0 2 29 H(Compiling)WB 95 Sn()WB 22 Sn( and Linking)EA()EH( +)0 P(To create a Funtools application, a software developer will include +the funtools.h definitions file in Funtools code: +) 1 23 PR( #include <funtools.h>)RP( +The program is linked against the libfuntools.a library, along with the +math library \201and the dynamic load library, if the latter is available +on your system\202: +) 1 38 PR( gcc -o foo foo.c -lfuntools -ldl -lm)RP( +)0 P(If gcc is used, Funtools filtering can be performed using dynamically +loaded shared objects that are built at run-time. Otherwise, filtering +is performed using a slave process. +)0 P(Funtools has been built on the following systems: +)UL()-1 LI( Sun/Solaris 5.X +)-1 LI( Linux/RedHat Linux 5.X,6.X,7.X +)-1 LI( Dec Alpha/OSF1 V4.X +)-1 LI( WindowsNT/Cygwin 1.0 +)-1 LI( SGI/IRIX64 6.5)LU( + +)0 2 30 H(A)WB 96 Sn()WB 21 Sn( Short Digression on Subroutine Order)EA()EH( +)0 P(There is a natural order for all I/O access libraries. You would not +think of reading a file without first opening it, or writing a file +after closing it. A large part of the experiment in funtools is to use +the idea of "natural order" as a means of making programming +easier. We do this by maintaining the state of processing for a given +funtools file, so that we can do things like write headers and flush +extension padding at the right time, without you having to do it. + +)0 P(For example, if you open a new funtools file for writing using +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(, +then generate an array of image data and call +)0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D(, +funtools knows to write the image header automatically. +There is no need to think about writing a standard header. +Of course, you can add parameters to the file first by +calling one of the +)0 38 1 A(FunParamPut\201\202)38 0 TN TL()Ec /AF f D( +routines, and these parameters will automatically be added +to the header when it is written out. There still is no +need to write the header explicitly. + +)0 P(Maintaining state in this way means that there are certain rules of +order which should be maintained in any funtools program. In particular, +we strongly recommend the following ordering rules be adhered to: + +)UL()-1 LI( When specifying that input extensions be copied to an output file +via a reference handle, open the output file )BD(before)ES( reading the +input file. \201Otherwise the initial copy will not occur\202. + +)-1 LI( Always write parameters to an output file using one of the +)0 38 1 A(FunParamPut\201\202)38 0 TN TL()Ec /AF f D( calls +)BD(before)ES( writing any data. \201This is a good idea for all FITS +libraries, to avoid having to recopy data is the FITS header needs +to be extended by adding a single parameter.\202 + +)-1 LI( If you retrieve an image, and need to know the data +type, use the FUN_SECT_BITPIX option of +)0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D(, +)BD(after)ES( calling +)0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D(, since +it is possible to change the value of BITPIX from the latter. + +)-1 LI( When specifying that input extensions be copied to an output file +via a reference handle, close the output file )BD(before)ES( closing +input file, or else use +)0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( +explicitly on the output file +)BD(before)ES( closing the input file. \201Otherwise the final copy will +not occur\202.)LU( + +)0 P(We believe that these are the natural rules that are implied in most +FITS programming tasks. However, we recognize that making explicit use +of "natural order" to decide what automatic action to take on behalf +of the programmer is experimental. Therefore, if you find that your +needs are not compatible with our preferred order, please let us know +-- it will be most illuminating for us as we evaluate this experiment. + +)0 2 31 H(Funtools)WB 97 Sn()WB 41 Sn( Programming Examples)EA()EH( +)0 P(The following complete coding examples are provided to illustrate the +simplicity of Funtools applications. They can be found in the funtest +subdirectory of the Funtools distribution. In many cases, you should +be able to modify one of these programs to generate your own Funtools +program: +)UL()-1 LI()0 2 A(evread.c)EA(: read and write binary tables +)-1 LI()0 2 A(evcols.c)EA(: add column and rows to binary tables +)-1 LI()0 2 A(evmerge.c)EA(: merge new columns with existing columns +)-1 LI()0 2 A(evnext.c)EA(: manipulate raw data pointers +)-1 LI()0 2 A(imblank.c)EA(: blank out image values below a threshold +)-1 LI()0 2 A(asc2fits.c)EA(: convert a specific ASCII table to FITS binary table)LU( + +)0 2 32 H(The)WB 98 Sn()WB 24 Sn( Funtools Programming Reference Manual)EA()EH( +)0 P() 45 116 PR(#include <funtools.h> + +Fun )0 25 1 A(FunOpen\201char *name, char *mode, Fun ref\202)25 0 TN TL()Ec /AF f D( + +void *)0 26 1 A(FunImageGet\201Fun fun, void *buf, char *plist\202)26 0 TN TL()Ec /AF f D( + +int )0 27 1 A(FunImagePut\201Fun fun, void *buf, int dim1, int dim2, int bitpix, char *plist\202)27 0 TN TL()Ec /AF f D( + +void * )0 28 1 A(FunImageRowGet\201Fun fun, void *buf, int rstart, int rstop, char *plist\202)28 0 TN TL()Ec /AF f D( + +void * )0 29 1 A(FunImageRowPut\201Fun fun, void *buf, int rstart, int rstop, int dim1, int dim2, int bitpix, char *plist\202)29 0 TN TL()Ec /AF f D( + +int )0 32 1 A(FunColumnSelect\201Fun fun, int size, char *plist, ...\202)32 0 TN TL()Ec /AF f D( + +void )0 33 1 A(FunColumnActivate\201Fun fun, char *s, char *plist\202)33 0 TN TL()Ec /AF f D( + +int )0 34 1 A(FunColumnLookup\201Fun fun, char *s, int which, char **name, int *type, int *mode, int *offset, int *n, int *width\202)34 0 TN TL()Ec /AF f D( + +void *)0 30 1 A(FunTableRowGet\201Fun fun, void *rows, int maxrow, char *plist, int *nrow\202)30 0 TN TL()Ec /AF f D( + +int )0 31 1 A(FunTableRowPut\201Fun fun, void *rows, int nev, int idx, char *plist\202)31 0 TN TL()Ec /AF f D( + +int )0 37 1 A(FunParamGetb\201Fun fun, char *name, int n, int defval, int *got\202)37 0 TN TL()Ec /AF f D( + +int )0 37 1 A(FunParamGeti\201Fun fun, char *name, int n, int defval, int *got\202)37 0 TN TL()Ec /AF f D( + +double )0 37 1 A(FunParamGetd\201Fun fun, char *name, int n, double defval, int *got\202)37 0 TN TL()Ec /AF f D( + +char *)0 37 1 A(FunParamGets\201Fun fun, char *name, int n, char *defval, int *got\202)37 0 TN TL()Ec /AF f D( + +int )0 38 1 A(FunParamPutb\201Fun fun, char *name, int n, int value, char *comm, int append\202)38 0 TN TL()Ec /AF f D()WR( + +int )0 38 1 A(FunParamPuti\201Fun fun, char *name, int n, int value, char *comm, int append\202)38 0 TN TL()Ec /AF f D( + +int )0 38 1 A(FunParamPutd\201Fun fun, char *name, int n, double value, int prec, char *comm, int append\202)38 0 TN TL()Ec /AF f D( + +int )0 38 1 A(FunParamPuts\201Fun fun, char *name, int n, char *value, char *comm, int append\202)38 0 TN TL()Ec /AF f D( + +int )0 35 1 A(FunInfoGet\201Fun fun, int type, ...\202)35 0 TN TL()Ec /AF f D( + +int )0 36 1 A(FunInfoPut\201Fun fun, int type, ...\202)36 0 TN TL()Ec /AF f D( + +void )0 39 1 A(FunFlush\201Fun fun, char *plist\202)39 0 TN TL()Ec /AF f D( + +void )0 40 1 A(FunClose\201Fun fun\202)40 0 TN TL()Ec /AF f D()RP( + + + + +)0 2 33 H(FunOpen)WB 99 Sn()WB 25 Sn( - open a Funtools data file)EA()EH( + + +)BD() 3 47 PR( #include <funtools.h> + + Fun FunOpen\201char *name, char *mode, Fun ref\202;)RP()ES( + + +)0 P(The )BD(FunOpen\201\202)ES( routine opens a Funtools data file for reading or +appending, or creates a new FITS file for writing. The )BD(name)ES( +argument specifies the name of the Funtools data file to open. You can +use IRAF-style bracket notation to specify +)0 42 1 A(Funtools Files, Extensions, and Filters)42 0 TN TL()Ec /AF f D(. +A separate call should be made each time a different FITS extension is +accessed: +) 7 65 PR( Fun fun; + char *iname; + ... + if\201 !\201fun = FunOpen\201iname, "r", NULL\202\202 \202{ + fprintf\201stderr, "could not FunOpen input file: %s\200n", iname\202; + exit\2011\202; + })RP( +)0 P(If )BD(mode)ES( is "r", the file is opened for reading, and processing +is set up to begin at the specified extension. For reading, +)BD(name)ES( can be )BD(stdin)ES(, in which case the standard input is read. + +)0 P(If )BD(mode)ES( is "w", the file is created if it does not exist, or +opened and truncated for writing if it does exist. Processing starts +at the beginning of the file. The )BD(name)ES( can be )BD(stdout)ES(, +in which case the standard output is readied for processing. + +)0 P(If )BD(mode)ES( is "a", the file is created if it does not exist, or +opened if it does exist. Processing starts at the end of the file. +The )BD(name)ES( can be )BD(stdout)ES(, in which case the standard +output is readied for processing. + +)0 P(When a Funtools file is opened for writing or appending, a previously +opened )0 23 1 A(Funtools reference +handle)23 0 TN TL()Ec /AF f D( can be specified as the third argument. This handle +typically is associated with the input Funtools file that will be used +to generate the data for the output data. When a reference file is +specified in this way, the output file will inherit the \201extension\202 +header parameters from the input file: +) 8 67 PR( Fun fun, fun2; + ... + /* open input file */ + if\201 !\201fun = FunOpen\201argv[1], "r", NULL\202\202 \202 + gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; + /* open the output FITS image, inheriting params from input */ + if\201 !\201fun2 = FunOpen\201argv[2], "w", fun\202\202 \202 + gerror\201stderr, "could not FunOpen output file: %s\200n", argv[2]\202;)RP( +Thus, in the above example, the output FITS binary table file will +inherit all of the parameters associated with the input binary table +extension. +)0 P(A file opened for writing with a +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( also +inherits the selected columns \201i.e. those columns chosen for +processing using the +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( routine\202 +from the reference file as its default columns. This makes it easy to +open an output file in such a way that the columns written to the +output file are the same as the columns read in the input file. Of +course, column selection can easily be tailored using the +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( routine. +In particular, it is easy to merge user-defined columns with the input +columns to generate a new file. See the +)0 2 A(evmerge)EA( for a complete example. + +)0 P(In addition, when a +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( +is supplied in a )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call, +it is possible also to specify that all other extensions from the +reference file \201other than the input extension being processed\202 should +be copied from the reference file to the output file. This is useful, +for example, in a case where you are processing a FITS binary table +or image and you want to copy all of the other extensions to +the output file as well. Copy of other extensions is controlled by +adding a "C" or "c" to the mode string of the +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call )BD(of the input +reference file)ES(. If "C" is specified, then other extensions are +)BD(always)ES( copied \201i.e., copy is forced by the application\202. If +"c" is used, then other extensions are copied if the user requests +copying by adding a plus sign "+" to the extension name in the bracket +specification. For example, the )BD(funtable)ES( program utilizes +"c" mode, giving users the option of copying all other extensions: +) 6 67 PR( /* open input file -- allow user copy of other extensions */ + if\201 !\201fun = FunOpen\201argv[1], "rc", NULL\202\202 \202 + gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; + /* open the output FITS image, inheriting params from input */ + if\201 !\201fun2 = FunOpen\201argv[2], "w", fun\202\202 \202 + gerror\201stderr, "could not FunOpen output file: %s\200n", argv[2]\202;)RP( + +Thus, )BD(funtable)ES( supports either of these command lines: +) 4 60 PR( # copy only the EVENTS extension + csh> funtable "test.ev[EVENTS,circle\201512,512,10\202]" foo.ev + # copy ALL extensions + csh> funtable "test.ev[EVENTS+,circle\201512,512,10\202]" foo.ev)RP( + +)0 P(Use of a )0 23 1 A(Funtools reference +handle)23 0 TN TL()Ec /AF f D( implies that the input file is opened before the output +file. However, it is important to note that if copy mode \201"c" or "C"\202 +is specified for the input file, the actual input file open is delayed +until just after the output file is opened, since the copy of prior +extensions to the output file takes place while Funtools is seeking to +the specified input extension. This implies that the output file +should be opened before any I/O is done on the input file or else the +copy will fail. Note also that the copy of subsequent extension will +be handled automatically by +)0 40 1 A(FunClose\201\202)40 0 TN TL()Ec /AF f D( +if the output file is +closed before the input file. Alternatively, it can be done explicitly +by )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D(, but again, this +assumes that the input file still is open. + +)0 P(Upon success )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( returns a +Fun handle that is used in subsequent Funtools calls. On error, NULL +is returned. + + + + +)0 2 34 H(FunImageGet)WB 100 Sn()WB 26 Sn( - get an image or image section)EA()EH( + + +)BD() 3 52 PR( #include <funtools.h> + + void *FunImageGet\201Fun fun, void *buf, char *plist\202)RP()ES( + + +)0 P(The )BD(FunImageGet\201\202)ES( routine returns an binned image array of the +specified section of a Funtools data file. If the input data are +already of type image, the array is generated by extracting the +specified image section and then binning it according to the specified +bin factor. If the input data are contained in a binary table or raw +event file, the rows are binned on the columns specified by the +)BD(bincols=)ES( keyword \201using appropriate default columns as +necessary\202, after which the image section and bin factors are +applied. In both cases, the data is automatically converted from FITS +to native format, if necessary. +)0 P(The first argument is the Funtools handle returned by +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The second )BD(buf)ES( +argument is a pointer to a data buffer to fill. If NULL is specified, +FunImageGet will allocate a buffer of the appropriate size. Generally +speaking, you always want Funtools to allocate the buffer because +the image dimensions will be determined by +)0 49 1 A(Funtools image sectioning)49 0 TN TL()Ec /AF f D( +on the command line. +)0 P(The third )BD(plist)ES( \201i.e., parameter list\202 argument is a string +containing one or more comma-delimited )BD(keyword=value)ES( +parameters. It can be used to specify the return data type using the +)BD(bitpix=)ES( keyword. If no such keyword is specified in the plist +string, the data type of the returned image is the same as the data type +of the original input file, or is of type int for FITS binary tables. + +)0 P(If the )BD(bitpix=)ES( keyword is supplied in the plist string, the data +type of the returned image will be one of the supported FITS image +data types: +)UL()-1 LI( 8 unsigned char +)-1 LI( 16 short +)-1 LI( 32 int +)-1 LI( -32 float +)-1 LI( -64 double)LU( +For example: +) 4 57 PR( void *buf; + /* extract data section into an image buffer */ + if\201 !\201buf = FunImageGet\201fun, NULL, NULL\202\202 \202 + gerror\201stderr, "could not FunImageGet: %s\200n", iname\202;)RP( +will allocate buf and retrieve the image in the file data format. In +this case, you will have to determine the data type \201using the +FUN_SECT_BITPIX value in the +)0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D( +routine\202 +and then use a switch statement to process each data type: +) 17 65 PR( int bitpix; + void *buf; + unsigned char *cbuf; + short *sbuf; + int *ibuf; + ... + buf = FunImageGet\201fun, NULL, NULL\202; + FunInfoGet\201fun, FUN_SECT_BITPIX, &bitpix, 0\202; + /* set appropriate data type buffer to point to image buffer */ + switch\201bitpix\202{ + case 8: + cbuf = \201unsigned char *\202buf; break; + case 16: + sbuf = \201short *\202buf; break; + case 32: + ibuf = \201int *\202buf; break; + ...)RP( +See the +)0 2 A(imblank example code)EA( +for more details on how to process an image when the data type is not +specified beforehand. + +)0 P(It often is easier to specify the data type directly: +) 4 57 PR( double *buf; + /* extract data section into a double image buffer */ + if\201 !\201buf = FunImageGet\201fun, NULL, "bitpix=-64"\202\202 \202 + gerror\201stderr, "could not FunImageGet: %s\200n", iname\202;)RP( +will extract the image while converting to type double. + +)0 P(On success, a pointer to the image buffer is returned. \201This will be +the same as the second argument, if NULL is not passed to the latter.\202 +On error, NULL is returned. + +)0 P(In summary, to retrieve image or row data into a binned image, you simply +call FunOpen\201\202 followed by +)0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D(. Generally, you +then will want to call +)0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D( +to retrieve the +axis dimensions \201and data type\202 of the section you are processing +\201so as to take account of sectioning and blocking of the original data\202: +) 20 73 PR( double *buf; + int i, j; + int dim1, dim2; + ... other declarations, etc. + + /* open the input FITS file */ + if\201 !\201fun = FunOpen\201argv[1], "rc", NULL\202\202 \202 + gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; + + /* extract and bin the data section into a double float image buffer */ + if\201 !\201buf = FunImageGet\201fun, NULL, "bitpix=-64"\202\202 \202 + gerror\201stderr, "could not FunImageGet: %s\200n", argv[1]\202; + + /* get dimension information from funtools structure */ + FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; + + /* loop through pixels and reset values below limit to value */ + for\201i=0; i<dim1*dim2; i++\202{ + if\201 buf[i] <= blimit \202 buf[i] = bvalue; + })RP( + +)0 P(Another useful plist string value is "mask=all", which returns an +image populated with regions id values. Image pixels within a region +will contain the associated region id \201region values start at 1\202, and +otherwise will contain a 0 value. Thus, the returned image is a +region mask which can be used to process the image data \201which +presumably is retrieved by a separate call to FunImageGet\202 pixel by +pixel. + +)0 P(If a FITS binary table or a non-FITS raw event file is being binned +into an image, it is necessary to specify the two columns that will be +used in the 2D binning. This usually is done on the command line +using the )BD(bincols=\201x,y\202)ES( keyword: +) 1 46 PR( funcnts "foo.ev[EVENTS,bincols=\201detx,dety\202]")RP( + +)0 P(The full form of the )BD(bincols=)ES( specifier is: +) 1 77 PR( bincols=\201[xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]]\202)RP( +where the tlmin, tlmax, and binsiz specifiers determine the image binning +dimensions: +) 2 56 PR( dim = \201tlmax - tlmin\202/binsiz \201floating point data\202 + dim = \201tlmax - tlmin\202/binsiz + 1 \201integer data\202)RP( +These tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, +TLMAX, and TDBIN header parameters \201respectively\202 are present in the +FITS binary table header for the column in question. Note that if +only one parameter is specified, it is assumed to be tlmax, and tlmin +defaults to 1. If two parameters are specified, they are assumed to be +tlmin and tlmax. + +)0 P(If )BD(bincols)ES( is not specified on the command line, Funtools tries +to use appropriate defaults: it looks for the environment variable +FITS_BINCOLS \201or FITS_BINKEY\202. Then it looks for the Chandra +parameters CPREF \201or PREFX\202 in the FITS binary table header. Failing +this, it looks for columns named "X" and "Y" and if these are not +found, it looks for columns containing the characters "X" and "Y". +)0 P(See )0 50 1 A(Binning FITS Binary Tables and +Non-FITS Event Files)50 0 TN TL()Ec /AF f D( for more information. + + + + +)0 2 35 H(FunImagePut)WB 101 Sn()WB 27 Sn( - put an image to a Funtools file)EA()EH( + +)BD() 4 69 PR( #include <funtools.h> + + int FunImagePut\201Fun fun, void *buf, int dim1, int dim2, int bitpix, + char *plist\202)RP()ES( + + +The )BD(FunImagePut\201\202)ES( routine outputs an image array to a FITS +file. The image is written either as a primary header/data unit or as +an image extension, depending on whether other data have already been +written to the file. That is, if the current file position is at the +beginning of the file, a primary HDU is written. Otherwise, an +image extension is written. + +)0 P(The first argument is the Funtools handle returned by +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The second )BD(buf)ES( +argument is a pointer to a data buffer to write. The )BD(dim1)ES(and +)BD(dim2)ES( arguments that follow specify the dimensions of the image, +where dim1 corresponds to naxis1 and dim2 corresponds to naxis2. The +)BD(bitpix)ES( argument specifies the data type of the image and can +have the following FITS-standard values: +)UL()-1 LI( 8 unsigned char +)-1 LI( 16 short +)-1 LI( 32 int +)-1 LI( -32 float +)-1 LI( -64 double)LU( + +)0 P(When )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( is first +called for a given image, Funtools checks to see if the primary header +has already been written \201by having previously written an image or a +binary table.\202 If not, this image is written to the primary HDU. +Otherwise, it is written to an image extension. +)0 P(Thus, a simple program to generate a FITS image might look like this: +) 16 67 PR( int i; + int dim1=512, dim2=512; + double *dbuf; + Fun fun; + dbuf = malloc\201dim1*dim2*sizeof\201double\202\202; + /* open the output FITS image, preparing to copy input params */ + if\201 !\201fun = FunOpen\201argv[1], "w", NULL\202\202 \202 + gerror\201stderr, "could not FunOpen output file: %s\200n", argv[1]\202; + for\201i=0; i<\201dim1*dim2\202; i++\202{ + ... fill dbuf ... + } + /* put the image \201header will be generated automatically */ + if\201 !FunImagePut\201fun, buf, dim1, dim2, -64, NULL\202 \202 + gerror\201stderr, "could not FunImagePut: %s\200n", argv[1]\202; + FunClose\201fun\202; + free\201dbuf\202;)RP( + +)0 P(In addition, if a +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( +was specified when this table was opened, the +parameters from this +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( +are merged into the new image +header. Furthermore, if a reference image was specified during +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(, the values of +)BD(dim1)ES(, )BD(dim2)ES(, and )BD(bitpix)ES( in the calling sequence +can all be set to 0. In this case, default values are taken from the +reference image section. This is useful if you are reading an image +section in its native data format, processing it, and then writing +that section to a new FITS file. See the +)0 2 A(imblank example code)EA(. + +)0 P(The data are assumed to be in the native machine format and will +automatically be swapped to FITS big-endian format if necessary. This +behavior can be over-ridden with the )BD(convert=[true|false])ES( +keyword in the )BD(plist)ES( param list string. + +)0 P(When you are finished writing the image, you should call +)0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( to write out the FITS +image padding. However, this is not necessary if you subsequently call +FunClose\201\202 without doing any other I/O to the FITS file. + + + + +)0 2 36 H(FunImageRowGet)WB 102 Sn()WB 28 Sn( - get row\201s\202 of an image)EA()EH( + + +)BD() 4 65 PR( #include <funtools.h> + + void *FunImageRowGet\201Fun fun, void *buf, int rstart, int rstop, + char *plist\202)RP()ES( + + +)0 P(The )BD(FunImageRowGet\201\202)ES( routine returns one or more image rows +from the specified section of a Funtools data file. If the input data +are of type image, the array is generated by extracting the specified +image rows and then binning them according to the specified bin +factor. If the input data are contained in a binary table or raw +event file, the rows are binned on the columns specified by the +)BD(bincols=)ES( keyword \201using appropriate default columns as needed\202, +after which the image section and bin factors are applied. + +)0 P(The first argument is the Funtools handle returned by +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The second )BD(buf)ES( +argument is a pointer to a data buffer to fill. If NULL is specified, +FunImageGet\201\202 will allocate a buffer of the appropriate size. + +)0 P(The third and fourth arguments specify the first and last row to +retrieve. Rows are counted starting from 1, up to the value of +FUN_YMAX\201fun\202. The final )BD(plist)ES( \201i.e., parameter list\202 argument +is a string containing one or more comma-delimited +)BD(keyword=value)ES( parameters. It can be used to specify the return +data type using the )BD(bitpix=)ES( keyword. If no such keyword is +specified in the plist string, the data type of the image is the same +as the data type of the original input file, or is of type int for +FITS binary tables. + +)0 P(If the )BD(bitpix=)ES(value is supplied in the plist string, the data +type of the returned image will be one of the supported FITS image +data types: +)UL()-1 LI( 8 unsigned char +)-1 LI( 16 short +)-1 LI( 32 int +)-1 LI( -32 float +)-1 LI( -64 double)LU( + +)0 P(For example: +) 17 65 PR( double *drow; + Fun fun; + ... open files ... + /* get section dimensions */ + FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; + /* allocate one line's worth */ + drow = malloc\201dim1*sizeof\201double\202\202; + /* retrieve and process each input row \201starting at 1\202 */ + for\201i=1; i <= dim2; i++\202{ + if\201 !FunImageRowGet\201fun, drow, i, i, "bitpix=-64"\202 \202 + gerror\201stderr, "can't FunImageRowGet: %d %s\200n", i, iname\202; + /* reverse the line */ + for\201j=1; j<=dim1; j++\202{ + ... process drow[j-1] ... + } + } + ...)RP( + +)0 P(On success, a pointer to the image buffer is returned. \201This will be +the same as the second argument, if NULL is not passed to the latter.\202 +On error, NULL is returned. Note that the considerations described +above for specifying binning columns in +)0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D( also apply to +)BD(FunImageRowGet\201\202)ES(. + + + + +)0 2 37 H(FunImageRowPut)WB 103 Sn()WB 29 Sn( - put row\201s\202 of an image)EA()EH( + + +)BD() 4 67 PR( #include <funtools.h> + + void *FunImageRowPut\201Fun fun, void *buf, int rstart, int rstop, + int dim1, int dim2, int bitpix, char *plist\202)RP()ES( + + +)0 P(The )BD(FunImageRowPut\201\202)ES( routine writes one or more image rows to +the specified FITS image file. The first argument is the Funtools +handle returned by )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. +The second )BD(buf)ES( argument is a pointer to the row data buffer, +while the third and fourth arguments specify the starting and ending +rows to write. Valid rows values range from 1 to dim2, i.e., row is +one-valued. + +)0 P(The )BD(dim1)ES(and )BD(dim2)ES( arguments that follow specify the +dimensions, where dim1 corresponds to naxis1 and dim2 corresponds to +naxis2. The )BD(bitpix)ES( argument data type of the image and can +have the following FITS-standard values: +)UL()-1 LI( 8 unsigned char +)-1 LI( 16 short +)-1 LI( 32 int +)-1 LI( -32 float +)-1 LI( -64 double)LU( + +For example: +) 16 65 PR( double *drow; + Fun fun, fun2; + ... open files ... + /* get section dimensions */ + FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0\202; + /* allocate one line's worth */ + drow = malloc\201dim1*sizeof\201double\202\202; + /* retrieve and process each input row \201starting at 1\202 */ + for\201i=1; i <= dim2; i++\202{ + if\201 !FunImageRowGet\201fun, drow, i, i, "bitpix=-64"\202 \202 + gerror\201stderr, "can't FunImageRowGet: %d %s\200n", i, iname\202; + ... process drow ... + if\201 !FunImageRowPut\201fun2, drow, i, i, 64, NULL\202 \202 + gerror\201stderr, "can't FunImageRowPut: %d %s\200n", i, oname\202; + } + ...)RP( + +)0 P(The data are assumed to be in the native machine format and will +automatically be swapped to big-endian FITS format if necessary. This +behavior can be over-ridden with the )BD(convert=[true|false])ES( +keyword in the )BD(plist)ES( param list string. + +)0 P(When you are finished writing the image, you should call +)0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( to write out the FITS +image padding. However, this is not necessary if you subsequently call +FunClose\201\202 without doing any other I/O to the FITS file. + + + + +)0 2 38 H(FunColumnSelect)WB 104 Sn()WB 32 Sn( - select Funtools columns)EA()EH( + +)BD() 11 73 PR( #include <funtools.h> + + int FunColumnSelect\201Fun fun, int size, char *plist, + char *name1, char *type1, char *mode1, int offset1, + char *name2, char *type2, char *mode2, int offset2, + ..., + NULL\202 + + int FunColumnSelectArr\201Fun fun, int size, char *plist, + char **names, char **types, char **modes, + int *offsets, int nargs\202;)RP()ES( + + +The )BD(FunColumnSelect\201\202)ES( routine is used to select the columns +from a Funtools binary table extension or raw event file for +processing. This routine allows you to specify how columns in a file +are to be read into a user record structure or written from a user +record structure to an output FITS file. + +)0 P(The first argument is the Fun handle associated with this set of +columns. The second argument specifies the size of the user record +structure into which columns will be read. Typically, the sizeof\201\202 +macro is used to specify the size of a record structure. The third +argument allows you to specify keyword directives for the selection +and is described in more detail below. + +)0 P(Following the first three required arguments is a variable length list of +column specifications. Each column specification will consist of four +arguments: +)UL()-1 LI( )BD(name)ES(: the name of the column + +)-1 LI( )BD(type)ES(: the data type of the column as it will be stored in +the user record struct \201not the data type of the input file\202. The +following basic data types are recognized: +)UL()-1 LI(A: ASCII characters +)-1 LI(B: unsigned 8-bit char +)-1 LI(I: signed 16-bit int +)-1 LI(U: unsigned 16-bit int \201not standard FITS\202 +)-1 LI(J: signed 32-bit int +)-1 LI(V: unsigned 32-bit int \201not standard FITS\202 +)-1 LI(E: 32-bit float +)-1 LI(D: 64-bit float)LU( +The syntax used is similar to that which defines the TFORM parameter +in FITS binary tables. That is, a numeric repeat value can precede +the type character, so that "10I" means a vector of 10 short ints, "E" +means a single precision float, etc. Note that the column value from +the input file will be converted to the specified data type as the +data is read by +)0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(. + +)0 P([ A short digression regarding bit-fields: Special attention is +required when reading or writing the FITS bit-field type +\201"X"\202. Bit-fields almost always have a numeric repeat character +preceding the 'X' specification. Usually this value is a multiple of 8 +so that bit-fields fit into an integral number of bytes. For all +cases, the byte size of the bit-field B is \201N+7\202/8, where N is the +numeric repeat character. + +)0 P(A bit-field is most easily declared in the user struct as an array of +type char of size B as defined above. In this case, bytes are simply +moved from the file to the user space. If, instead, a short or int +scalar or array is used, then the algorithm for reading the bit-field +into the user space depends on the size of the data type used along +with the value of the repeat character. That is, if the user data +size is equal to the byte size of the bit-field, then the data is +simply moved \201possibly with endian-based byte-swapping\202 from one to +the other. If, on the other hand, the data storage is larger than the +bit-field size, then a data type cast conversion is performed to move +parts of the bit-field into elements of the array. Examples will help +make this clear: + +)UL()-1 LI( If the file contains a 16X bit-field and user space specifies a 2B +char array[2], then the bit-field is moved directly into the char array. + +)-1 LI( If the file contains a 16X bit-field and user space specifies a 1I +scalar short int, then the bit-field is moved directly into the short int. + +)-1 LI( If the file contains a 16X bit-field and user space specifies a 1J +scalar int, then the bit-field is type-cast to unsigned int before +being moved \201use of unsigned avoids possible sign extension\202. + +)-1 LI( If the file contains a 16X bit-field and user space specifies a 2J +int array[2], then the bit-field is handled as 2 chars, each of which +are type-cast to unsigned int before being moved \201use of unsigned +avoids possible sign extension\202. + +)-1 LI( If the file contains a 16X bit-field and user space specifies a 1B +char, then the bit-field is treated as a char, i.e., truncation will +occur. + +)-1 LI( If the file contains a 16X bit-field and user space specifies a 4J +int array[4], then the results are undetermined. +)LU( +For all user data types larger than char, the bit-field is byte-swapped +as necessary to convert to native format, so that bits in the +resulting data in user space can be tested, masked, etc. in the same +way regardless of platform.] + +)0 P(In addition to setting data type and size, the )BD(type)ES( +specification allows a few ancillary parameters to be set, using the +full syntax for )BD(type)ES(: +) 1 53 PR( [@][n]<type>[[['B']poff]][:[tlmin[:tlmax[:binsiz]]]])RP( + +)0 P(The special character "@" can be prepended to this specification to +indicated that the data element is a pointer in the user record, +rather than an array stored within the record. + +)0 P(The [n] value is an integer that specifies the +number of elements that are in this column \201default is 1\202. TLMIN, +TLMAX, and BINSIZ values also can be specified for this column after +the type, separated by colons. If only one such number is specified, +it is assumed to be TLMAX, and TLMIN and BINSIZ are set to 1. + +)0 P(The [poff] value can be used to specify the offset into an +array. By default, this offset value is set to zero and the data +specified starts at the beginning of the array. The offset usually +is specified in terms of the data type of the column. Thus an offset +specification of [5] means a 20-byte offset if the data type is a +32-bit integer, and a 40-byte offset for a double. If you want to +specify a byte offset instead of an offset tied to the column data type, +precede the offset value with 'B', e.g. [B6] means a 6-bye offset, +regardless of the column data type. + +The [poff] is especially useful in conjunction with the pointer @ +specification, since it allows the data element to anywhere stored +anywhere in the allocated array. For example, a specification such as +"@I[2]" specifies the third \201i.e., starting from 0\202 element in the +array pointed to by the pointer value. A value of "@2I[4]" specifies +the fifth and sixth values in the array. For example, consider the +following specification: ) 12 67 PR( typedef struct EvStruct{ + short x[4], *atp; + } *Event, EventRec; + /* set up the \201hardwired\202 columns */ + FunColumnSelect\201 fun, sizeof\201EventRec\202, NULL, + "2i", "2I ", "w", FUN_OFFSET\201Event, x\202, + "2i2", "2I[2]", "w", FUN_OFFSET\201Event, x\202, + "at2p", "@2I", "w", FUN_OFFSET\201Event, atp\202, + "at2p4", "@2I[4]", "w", FUN_OFFSET\201Event, atp\202, + "atp9", "@I[9]", "w", FUN_OFFSET\201Event, atp\202, + "atb20", "@I[B20]", "w", FUN_OFFSET\201Event, atb\202, + NULL\202;)RP( +Here we have specified the following columns: +)UL()-1 LI( 2i: two short ints in an array which is stored as part the +record +)-1 LI( 2i2: the 3rd and 4th elements of an array which is stored +as part of the record +)-1 LI( an array of at least 10 elements, not stored in the record but +allocated elsewhere, and used by three different columns: +)UL()-1 LI( at2p: 2 short ints which are the first 2 elements of the allocated array +)-1 LI( at2p4: 2 short ints which are the 5th and 6th elements of +the allocated array +)-1 LI( atp9: a short int which is the 10th element of the allocated array)LU( +)-1 LI( atb20: a short int which is at byte offset 20 of another allocated array)LU( +In this way, several columns can be specified, all of which are in a +single array. )BD(NB)ES(: it is the programmer's responsibility to +ensure that specification of a positive value for poff does not point +past the end of valid data. + +)-1 LI( )BD(read/write mode)ES(: "r" means that the column is read from an +input file into user space by +)0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(, "w" means that +the column is written to an output file. Both can specified at the same +time. + +)-1 LI( )BD(offset)ES(: the offset into the user data to store +this column. Typically, the macro FUN_OFFSET\201recname, colname\202 is used +to define the offset into a record structure.)LU( + +)0 P(When all column arguments have been specified, a final NULL argument +must added to signal the column selection list. + +)0 P(As an alternative to the varargs +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +routine, a non-varargs routine called +)0 32 1 A(FunColumnSelectArr\201\202)32 0 TN TL()Ec /AF f D( +also is available. The first three arguments \201fun, size, plist\202 of this +routine are the same as in +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D(. +Instead of a variable +argument list, however, +)0 32 1 A(FunColumnSelectArr\201\202)32 0 TN TL()Ec /AF f D( +takes 5 additional arguments. The first 4 arrays arguments contain the +names, types, modes, and offsets, respectively, of the columns being +selected. The final argument is the number of columns that are +contained in these arrays. It is the user's responsibility to free +string space allocated in these arrays. + +)0 P(Consider the following example: +) 12 54 PR( typedef struct evstruct{ + int status; + float pi, pha, *phas; + double energy; + } *Ev, EvRec; + + FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, + "status", "J", "r", FUN_OFFSET\201Ev, status\202, + "pi", "E", "r", FUN_OFFSET\201Ev, pi\202, + "pha", "E", "r", FUN_OFFSET\201Ev, pha\202, + "phas", "@9E", "r", FUN_OFFSET\201Ev, phas\202, + NULL\202;)RP( +)0 P(Each time a row is read into the Ev struct, the "status" column is +converted to an int data type \201regardless of its data type in the +file\202 and stored in the status value of the struct. Similarly, "pi" +and "pha", and the phas vector are all stored as floats. Note that the +"@" sign indicates that the "phas" vector is a pointer to a 9 element +array, rather than an array allocated in the struct itself. The row +record can then be processed as required: +) 9 70 PR( /* get rows -- let routine allocate the row array */ + while\201 \201ebuf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ + /* process all rows */ + for\201i=0; i<got; i++\202{ + /* point to the i'th row */ + ev = ebuf+i; + ev->pi = \201ev->pi+.5\202; + ev->pha = \201ev->pi-.5\202; + })RP( + +)0 P()0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +can also be called to define "writable" columns in order to generate a FITS +Binary Table, without reference to any input columns. For +example, the following will generate a 4-column FITS binary table when +)0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( is used to +write Ev records: + +) 12 56 PR( typedef struct evstruct{ + int status; + float pi, pha + double energy; + } *Ev, EvRec; + + FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, + "status", "J", "w", FUN_OFFSET\201Ev, status\202, + "pi", "E", "w", FUN_OFFSET\201Ev, pi\202, + "pha", "E", "w", FUN_OFFSET\201Ev, pha\202, + "energy", "D", "w", FUN_OFFSET\201Ev, energy\202, + NULL\202;)RP( +All columns are declared to be write-only, so presumably the column +data is being generated or read from some other source. + +)0 P(In addition, +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +can be called to define )BD(both)ES( "readable" and "writable" columns. +In this case, the "read" columns +are associated with an input file, while the "write" columns are +associated with the output file. Of course, columns can be specified as both +"readable" and "writable", in which case they are read from input +and \201possibly modified data values are\202 written to the output. +The +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +call itself is made by passing the input Funtools handle, and it is +assumed that the output file has been opened using this input handle +as its +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D(. + +)0 P(Consider the following example: +) 13 54 PR( typedef struct evstruct{ + int status; + float pi, pha, *phas; + double energy; + } *Ev, EvRec; + + FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, + "status", "J", "r", FUN_OFFSET\201Ev, status\202, + "pi", "E", "rw", FUN_OFFSET\201Ev, pi\202, + "pha", "E", "rw", FUN_OFFSET\201Ev, pha\202, + "phas", "@9E", "rw", FUN_OFFSET\201Ev, phas\202, + "energy", "D", "w", FUN_OFFSET\201Ev, energy\202, + NULL\202;)RP( +As in the "read" example above, each time an row is read into the Ev +struct, the "status" column is converted to an int data type +\201regardless of its data type in the file\202 and stored in the status +value of the struct. Similarly, "pi" and "pha", and the phas vector +are all stored as floats. Since the "pi", "pha", and "phas" variables +are declared as "writable" as well as "readable", they also will be +written to the output file. Note, however, that the "status" variable +is declared as "readable" only, and hence it will not be written to +an output file. Finally, the "energy" column is declared as +"writable" only, meaning it will not be read from the input file. In +this case, it can be assumed that "energy" will be calculated in the +program before being output along with the other values. + +)0 P(In these simple cases, only the columns specified as "writable" will +be output using +)0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D(. However, +it often is the case that you want to merge the user columns back in +with the input columns, even in cases where not all of the input +column names are explicitly read or even known. For this important +case, the )BD(merge=[type])ES( keyword is provided in the plist string. + +)0 P(The )BD(merge=[type])ES( keyword tells Funtools to merge the columns from +the input file with user columns on output. It is normally used when +an input and output file are opened and the input file provides the +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( +for the output file. In this case, each time +)0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D( is called, the +raw input rows are saved in a special buffer. If +)0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( then is called +\201before another call to +)0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D(\202, the contents +of the raw input rows are merged with the user rows according to the +value of )BD(type)ES( as follows: + +)UL()-1 LI( )BD(update)ES(: add new user columns, and update value of existing ones \201maintaining the input data type\202 + +)-1 LI( )BD(replace)ES(: add new user columns, and replace the data type +and value of existing ones. \201Note that if tlmin/tlmax values are not +specified in the replacing column, but are specified in the original +column being replaced, then the original tlmin/tlmax values are used +in the replacing column.\202 + +)-1 LI( )BD(append)ES(: only add new columns, do not "replace" or "update" existing ones)LU( + +)0 P(Consider the example above. If )BD(merge=update)ES( is specified in the +plist string, then "energy" will be added to the input columns, and +the values of "pi", "pha", and "phas" will be taken from the user +space \201i.e., the values will be updated from the original values, if +they were changed by the program\202. The data type for "pi", "pha", and +"phas" will be the same as in the original file. If +)BD(merge=replace)ES( is specified, both the data type and value of +these three input columns will be changed to the data type and value +in the user structure. If )BD(merge=append)ES( is specified, none of +these three columns will be updated, and only the "energy" column will +be added. Note that in all cases, "status" will be written from the +input data, not from the user record, since it was specified as read-only. + +)0 P(Standard applications will call +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +to define user columns. However, if this routine is not called, the +default behavior is to transfer all input columns into user space. For +this purpose a default record structure is defined such that each data +element is properly aligned on a valid data type boundary. This +mechanism is used by programs such as fundisp and funtable to process +columns without needing to know the specific names of those columns. +It is not anticipated that users will need such capabilities \201contact +us if you do!\202 + +)0 P(By default, )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +reads/writes rows to/from an "array of structs", where each struct contains +the column values for a single row of the table. This means that the +returned values for a given column are not contiguous. You can +set up the IO to return a "struct of arrays" so that each of the +returned columns are contiguous by specifying )BD(org=structofarrays)ES( +\201abbreviation: )BD(org=soa)ES(\202 in the plist. +\201The default case is )BD(org=arrayofstructs)ES( or )BD(org=aos)ES(.\202 + +)0 P(For example, the default setup to retrieve rows from a table would be +to define a record structure for a single event and then call + )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +as follows: +) 14 73 PR( typedef struct evstruct{ + short region; + double x, y; + int pi, pha; + double time; + } *Ev, EvRec; + + got = FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, + "x", "D:10:10", mode, FUN_OFFSET\201Ev, x\202, + "y", "D:10:10", mode, FUN_OFFSET\201Ev, y\202, + "pi", "J", mode, FUN_OFFSET\201Ev, pi\202, + "pha", "J", mode, FUN_OFFSET\201Ev, pha\202, + "time", "1D", mode, FUN_OFFSET\201Ev, time\202, + NULL\202;)RP( +Subsequently, each call to +FunTableRowGet\201\202)EA( +will return an array of structs, one for each returned row. If instead you +wanted to read columns into contiguous arrays, you specify )BD(org=soa)ES(: +) 14 72 PR( typedef struct aevstruct{ + short region[MAXROW]; + double x[MAXROW], y[MAXROW]; + int pi[MAXROW], pha[MAXROW]; + double time[MAXROW]; + } *AEv, AEvRec; + + got = FunColumnSelect\201fun, sizeof\201AEvRec\202, "org=soa", + "x", "D:10:10", mode, FUN_OFFSET\201AEv, x\202, + "y", "D:10:10", mode, FUN_OFFSET\201AEv, y\202, + "pi", "J", mode, FUN_OFFSET\201AEv, pi\202, + "pha", "J", mode, FUN_OFFSET\201AEv, pha\202, + "time", "1D", mode, FUN_OFFSET\201AEv, time\202, + NULL\202;)RP( +Note that the only modification to the call is in the plist string. + +)0 P(Of course, instead of using staticly allocated arrays, you also can specify +dynamically allocated pointers: +) 16 75 PR( /* pointers to arrays of columns \201used in struct of arrays\202 */ + typedef struct pevstruct{ + short *region; + double *x, *y; + int *pi, *pha; + double *time; + } *PEv, PEvRec; + + got = FunColumnSelect\201fun, sizeof\201PEvRec\202, "org=structofarrays", + "$region", "@I", mode, FUN_OFFSET\201PEv, region\202, + "x", "@D:10:10", mode, FUN_OFFSET\201PEv, x\202, + "y", "@D:10:10", mode, FUN_OFFSET\201PEv, y\202, + "pi", "@J", mode, FUN_OFFSET\201PEv, pi\202, + "pha", "@J", mode, FUN_OFFSET\201PEv, pha\202, + "time", "@1D", mode, FUN_OFFSET\201PEv, time\202, + NULL\202;)RP( +Here, the actual storage space is either allocated by the user or by the +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( call\202. + +)0 P(In all of the above cases, the same call is made to retrieve rows, e.g.: +) 1 64 PR( buf = \201void *\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202;)RP( +However, the individual data elements are accessed differently. +For the default case of an "array of structs", the +individual row records are accessed using: +) 5 69 PR( for\201i=0; i<got; i++\202{ + ev = \201Ev\202buf+i; + fprintf\201stdout, "%.2f\200t%.2f\200t%d\200t%d\200t%.4f\200t%.4f\200t%21.8f\200n", + ev->x, ev->y, ev->pi, ev->pha, ev->dx, ev->dy, ev->time\202; + })RP( +For a struct of arrays or a struct of array pointers, we have a single struct +through which we access individual columns and rows using: +) 6 63 PR( aev = \201AEv\202buf; + for\201i=0; i<got; i++\202{ + fprintf\201stdout, "%.2f\200t%.2f\200t%d\200t%d\200t%.4f\200t%.4f\200t%21.8f\200n", + aev->x[i], aev->y[i], aev->pi[i], aev->pha[i], + aev->dx[i], aev->dy[i], aev->time[i]\202; + })RP( +Support for struct of arrays in the +)0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( +call is handled analogously. + +)0 P(See the )0 2 A(evread example code)EA( +and +)0 2 A(evmerge example code)EA( +for working examples of how +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( is used. + + + + +)0 2 39 H(FunColumnActivate)WB 105 Sn()WB 33 Sn( - activate Funtools columns)EA()EH( + + +)BD() 3 55 PR( #include <funtools.h> + + void FunColumnActivate\201Fun fun, char *s, char *plist\202)RP()ES( + + +)0 P(The )BD(FunColumnActivate\201\202)ES( routine determines which columns \201set up +by )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D(\202 +ultimately will be read and/or written. By default, all columns that +are selected using +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +are activated. The +)0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D( +routine can be used to turn off/off activation of specific columns. + +)0 P(The first argument is the Fun handle associated with this set of +columns. The second argument is a space-delimited list of columns to +activate or de-activate. Columns preceded by "+" are activated and +columns preceded by a "-" are de-activated. If a column is named +without "+" or "-", it is activated. The reserved strings "$region" +and '$n' are used to activate a special columns containing the filter +region value and row value, respectively, associated with +this row. For example, if a filter containing two circular regions is +specified as part of the Funtools file name, this column will contain +a value of 1 or 2, depending on which region that row was in. The +reserved strings "$x" and "$y" are used to activate the current +binning columns. Thus, if the columns DX and DY are specified as +binning columns: +) 1 42 PR( [sh $] fundisp foo.fits[bincols=\201DX,DY\202])RP( +then "$x" and "$y" will refer to these columns in a call to +)0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D(. + +)0 P(In addition, if the activation string contains only columns to be +activated, then the routine will de-activate all other columns. +Similarly, if the activation string contains only +columns to de-activate, then the routine will activate all other columns +before activating the list. This makes it simple to change the +activation state of all columns without having to know all of the +column names. For example: +)UL()-1 LI( )BD("pi pha time")ES( # only these three columns will be active +)-1 LI( )BD("-pi -pha -time")ES( # all but these columns will be active +)-1 LI( )BD("pi -pha")ES( # only pi is active, pha is not, others are not +)-1 LI( )BD("+pi -pha")ES( # same as above +)-1 LI( )BD("pi -pha -time")ES( # only pi is active, all others are not +)-1 LI( )BD("pi pha")ES( # pha and pi are active, all others are not +)-1 LI( )BD("pi pha -x -y")ES( # pha and pi are active, all others are not)LU( + +)0 P(You can use the column activation list to reorder columns, since +columns are output in the order specified. For example: +) 19 77 PR( # default output order + fundisp snr.ev'[cir 512 512 .1]' + X Y PHA PI TIME DX DY + -------- -------- -------- -------- --------------------- -------- -------- + 512 512 6 7 79493997.45854475 578 574 + 512 512 8 9 79494575.58943175 579 573 + 512 512 5 6 79493631.03866175 578 575 + 512 512 5 5 79493290.86521725 578 575 + 512 512 8 9 79493432.00990875 579 573 + + # re-order the output by specifying explicit order + fundisp snr.ev'[cir 512 512 .1]' "time x y dy dx pi pha" + TIME X Y DY DX PI PHA + --------------------- -------- -------- -------- -------- -------- -------- + 79493997.45854475 512 512 574 578 7 6 + 79494575.58943175 512 512 573 579 9 8 + 79493631.03866175 512 512 575 578 6 5 + 79493290.86521725 512 512 575 578 5 5 + 79493432.00990875 512 512 573 579 9 8)RP( + +)0 P(A "+" sign by itself means to activate all columns, so that you can reorder +just a few columns without specifying all of them: +) 9 77 PR( # reorder 3 columns and then output the rest + fundisp snr.ev'[cir 512 512 .1]' "time pi pha +" + TIME PI PHA Y X DX DY + --------------------- -------- -------- -------- -------- -------- -------- + 79493997.45854475 7 6 512 512 578 574 + 79494575.58943175 9 8 512 512 579 573 + 79493631.03866175 6 5 512 512 578 575 + 79493290.86521725 5 5 512 512 578 575 + 79493432.00990875 9 8 512 512 579 573)RP( +The column activation/deactivation is performed in the order of the +specified column arguments. This means you can mix "+", "-" \201which +de-activates all columns\202 and specific column names to reorder and +select columns in one command. For example, consider the following: +) 9 59 PR( # reorder and de-activate + fundisp snr.ev'[cir 512 512 .1]' "time pi pha + -x -y" + TIME PI PHA DX DY + --------------------- -------- -------- -------- -------- + 79493997.45854475 7 6 578 574 + 79494575.58943175 9 8 579 573 + 79493631.03866175 6 5 578 575 + 79493290.86521725 5 5 578 575 + 79493432.00990875 9 8 579 573)RP( +We first activate "time", "pi", and "pha" so that they are output first. +We then activate all of the other columns, and then de-activate "x" and "y". +Note that this is different from: +) 9 77 PR( # probably not what you want ... + fundisp snr.ev'[cir 512 512 .1]' "time pi pha -x -y +" + TIME PI PHA Y X DX DY + --------------------- -------- -------- -------- -------- -------- -------- + 79493997.45854475 7 6 512 512 578 574 + 79494575.58943175 9 8 512 512 579 573 + 79493631.03866175 6 5 512 512 578 575 + 79493290.86521725 5 5 512 512 578 575 + 79493432.00990875 9 8 512 512 579 573)RP( +Here, "x" and "y" are de-activated, but then all columns including "x" and +"y" are again re-activated. + +)0 P(Typically, +)0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D( uses a +list of columns that are passed into the program from the command line. For +example, the code for funtable contains the following: +) 9 66 PR( char *cols=NULL; + + /* open the input FITS file */ + if\201 !\201fun = FunOpen\201argv[1], "rc", NULL\202\202 \202 + gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; + + /* set active flag for specified columns */ + if\201 argc >= 4 \202 cols = argv[3]; + FunColumnActivate\201fun, cols, NULL\202;)RP( + +The )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call sets the +default columns to be all columns in the input file. The +)0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D( call +then allows the user to control which columns ultimately will be +activated \201i.e., in this case, written to the new file\202. For example: +) 1 39 PR( funtable test.ev foo.ev "pi pha time")RP( +will process only the three columns mentioned, while: +) 1 33 PR( funtable test.ev foo.ev "-time")RP( +will process all columns except "time". + +)0 P(If )0 33 1 A(FunColumnActivate\201\202)33 0 TN TL()Ec /AF f D( +is called with a null string, then the environment variable +)BD(FUN_COLUMNS)ES( will be used to provide a global value, if present. +This is the reason why we call the routine even if no columns +are specified on the command line \201see example above\202, instead +of calling it this way: +) 4 45 PR( /* set active flag for specified columns */ + if\201 argc >= 4 \202{ + FunColumnActivate\201fun, argv[3], NULL\202; + })RP( + + + + +)0 2 40 H(FunColumnLookup)WB 106 Sn()WB 34 Sn( - lookup a Funtools column)EA()EH( + +)BD() 5 56 PR( #include <funtools.h> + + int FunColumnLookup\201Fun fun, char *s, int which, + char **name, int *type, int *mode, + int *offset, int *n, int *width\202)RP()ES( + + +)0 P(The )BD(FunColumnLookup\201\202)ES( routine returns information about a named +\201or indexed\202 column. The first argument is the Fun handle associated +with this set of columns. The second argument is the name of the +column to look up. If the name argument is NULL, the argument that +follows is the zero-based index into the column array of the column +for which information should be returned. The next argument is a +pointer to a char *, which will contain the name of the column. The +arguments that follow are the addresses of int values into which +the following information will be returned: +)UL()-1 LI( )BD(type)ES(: data type of column: +)UL()-1 LI(A: ASCII characters +)-1 LI(B: unsigned 8-bit char +)-1 LI(I: signed 16-bit int +)-1 LI(U: unsigned 16-bit int \201not standard FITS\202 +)-1 LI(J: signed 32-bit int +)-1 LI(V: unsigned 32-bit int \201not standard FITS\202 +)-1 LI(E: 32-bit float +)-1 LI(D: 64-bit float)LU( +)-1 LI( )BD(mode)ES(: bit flag status of column, including: +)UL()-1 LI( COL_ACTIVE 1 is column activated? +)-1 LI( COL_IBUF 2 is column in the raw input data? +)-1 LI( COL_PTR 4 is column a pointer to an array? +)-1 LI( COL_READ 010 is read mode selected? +)-1 LI( COL_WRITE 020 is write mode selected? +)-1 LI( COL_REPLACEME 040 is this column being replaced by user data?)LU( +)-1 LI( )BD(offset)ES(: byte offset in struct +)-1 LI( )BD(n)ES(: number of elements \201i.e. size of vector\202 in this column +)-1 LI( )BD(width)ES(: size in bytes of this column)LU( +If the named column exists, the routine returns a positive integer, +otherwise zero is returned. \201The positive integer is the index+1 into +the column array where this column was located.\202 + +If NULL is passed as the return address of one \201or more\202 of these +values, no data is passed back for that information. For +example: +) 2 76 PR( if\201 !FunColumnLookup\201fun, "phas", 0, NULL NULL, NULL, NULL, &npha, NULL\202 \202 + gerror\201stderr, "can't find phas column\200n"\202;)RP( +only returns information about the size of the phas vector. + + + + +)0 2 41 H(FunTableRowGet)WB 107 Sn()WB 30 Sn( - get Funtools rows)EA()EH( + + +)BD() 4 68 PR( #include <funtools.h> + + void *FunTableRowGet\201Fun fun, void *rows, int maxrow, char *plist, + int *nrow\202)RP()ES( + + +)0 P(The )BD(FunTableRowGet\201\202)ES( routine retrieves rows from a Funtools +binary table or raw event file, and places the values of columns +selected by )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( +into an array of user structs. Selected column values are +automatically converted to the specified user data type \201and to native +data format\202 as necessary. + +)0 P(The first argument is the Fun handle associated with this row data. +The second )BD(rows)ES( argument is the array of user structs into +which the selected columns will be stored. If NULL is passed, the +routine will automatically allocate space for this array. \201This +includes proper allocation of pointers within each struct, if the "@" +pointer type is used in the selection of columns. Note that if you +pass NULL in the second argument, you should free this space using the +standard free\201\202 system call when you are finished with the array of +rows.\202 The third )BD(maxrow)ES( argument specifies the maximum number +of rows to be returned. Thus, if )BD(rows)ES( is allocated by the +user, it should be at least of size maxrow*sizeof\201evstruct\202. + +)0 P(The fourth )BD(plist)ES( argument is a param list string. Currently, +the keyword/value pair "mask=transparent" is supported in the plist +argument. If this string is passed in the call's plist argument, then +all rows are passed back to the user \201instead of just rows passing +the filter\202. This is only useful when +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( also is +used to specify "$region" as a column to return for each row. In +such a case, rows found within a region have a returned region value +greater than 0 \201corresponding to the region id of the region in which +they are located\202, rows passing the filter but not in a region have +region value of -1, and rows not passing any filter have region +value of 0. Thus, using "mask=transparent" and the returned region +value, a program can process all rows and decide on an action based +on whether a given row passed the filter or not. + +)0 P(The final argument is a pointer to an int variable that will return +the actual number of rows returned. The routine returns a pointer to +the array of stored rows, or NULL if there was an error. \201This pointer +will be the same as the second argument, if the latter is non-NULL\202. +) 16 69 PR( /* get rows -- let routine allocate the row array */ + while\201 \201buf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ + /* process all rows */ + for\201i=0; i<got; i++\202{ + /* point to the i'th row */ + ev = buf+i; + /* rearrange some values. etc. */ + ev->energy = \201ev->pi+ev->pha\202/2.0; + ev->pha = -ev->pha; + ev->pi = -ev->pi; + } + /* write out this batch of rows */ + FunTableRowPut\201fun2, buf, got, 0, NULL\202; + /* free row data */ + if\201 buf \202 free\201buf\202; + })RP( +As shown above, successive calls to +)0 30 1 A(FunTableRowGet\201\202)30 0 TN TL()Ec /AF f D( will return the +next set of rows from the input file until all rows have been read, +i.e., the routine behaves like sequential Unix I/O calls such as +fread\201\202. See )0 2 A(evmerge example code)EA( for a +more complete example. + +)0 P(Note that FunTableRowGet\201\202 also can be called as FunEventsGet\201\202, for +backward compatibility. + + + + +)0 2 42 H(FunTableRowPut)WB 108 Sn()WB 31 Sn( - put Funtools rows)EA()EH( + + +) 1 70 PR()BD(int FunTableRowPut\201Fun fun, void *rows, int nev, int idx, char *plist\202)ES()RP( + + +The )BD(FunTableRowPut\201\202)ES( routine writes rows to a FITS binary +table, taking its input from an array of user structs that contain +column values selected by a previous call to +)0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D(. Selected +column values are automatically converted from native data format to +FITS data format as necessary. + +)0 P(The first argument is the Fun handle associated with this row data. +The second )BD(rows)ES( argument is the array of user structs to +output. The third )BD(nrow)ES( argument specifies the number number of +rows to write. The routine will write )BD(nrow)ES( records, starting +from the location specified by )BD(rows)ES(. + +)0 P(The fourth )BD(idx)ES( argument is the index of the first raw input +row to write, in the case where rows from the user buffer are +being merged with their raw input row counterparts \201see below\202. Note +that this )BD(idx)ES( value is has nothing to do with the +row buffer specified in argument 1. It merely matches the row +being written with its corresponding \201hidden\202 raw row. Thus, if you +read a number of rows, process them, and then write them out all at +once starting from the first user row, the value of )BD(idx)ES( +should be 0: +) 14 70 PR( Ev ebuf, ev; + /* get rows -- let routine allocate the row array */ + while\201 \201ebuf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ + /* process all rows */ + for\201i=0; i<got; i++\202{ + /* point to the i'th row */ + ev = ebuf+i; + ... + } + /* write out this batch of rows, starting with the first */ + FunTableRowPut\201fun2, \201char *\202ebuf, got, 0, NULL\202; + /* free row data */ + if\201 ebuf \202 free\201ebuf\202; + })RP( + +)0 P(On the other hand, if you write out the rows one at a time \201possibly +skipping rows\202, then, when writing the i'th row from the input +array of rows, set )BD(idx)ES( to the value of i: +) 14 70 PR( Ev ebuf, ev; + /* get rows -- let routine allocate the row array */ + while\201 \201ebuf = \201Ev\202FunTableRowGet\201fun, NULL, MAXROW, NULL, &got\202\202 \202{ + /* process all rows */ + for\201i=0; i<got; i++\202{ + /* point to the i'th row */ + ev = ebuf+i; + ... + /* write out the current \201i.e., i'th\202 row */ + FunTableRowPut\201fun2, \201char *\202ev, 1, i, NULL\202; + } + /* free row data */ + if\201 ebuf \202 free\201ebuf\202; + })RP( + +)0 P(The final argument is a param list string that is not currently used. +The routine returns the number of rows output. This should be equal +to the value passed in the third )BD(nrowFunParamGet)WB 37 Sn( - get a Funtools param value)EA()EH( + + +)BD() 9 74 PR( #include <funtools.h> + + int FunParamGetb\201Fun fun, char *name, int n, int defval, int *got\202 + + int FunParamGeti\201Fun fun, char *name, int n, int defval, int *got\202 + + double FunParamGetd\201Fun fun, char *name, int n, double defval, int *got\202 + + char *FunParamGets\201Fun fun, char *name, int n, char *defval, int *got\202)RP()ES( + + +)0 P(The four routines )BD(FunParamGetb\201\202)ES(, )BD(FunParamGeti\201\202)ES(, +)BD(FunParamGetd\201\202)ES(, and )BD(FunParamGets\201\202)ES(, return the value of +a FITS header parameter as a boolean, int, double, and string, +respectively. The string returned by )BD(FunParamGets\201\202)ES( is a malloc'ed +copy of the header value and should be freed when no longer needed. + +)0 P(The first argument is the Fun handle associated with the FITS header +being accessed. Normally, the header is associated with the FITS +extension that you opened with )BD(FunOpen\201\202)ES(. However, you can use +FunInfoPut\201\202 to specify access of the primary header. In particular, +if you set the FUN_PRIMARYHEADER parameter to 1, then the primary +header is used for all parameter access until the value is reset to +0. For example: +) 9 75 PR( int val; + FunParamGeti\201fun, "NAXIS", 1, 0, &got\202; # current header + val=1; + FunInfoPut\201fun, FUN_PRIMARYHEADER, &val, 0\202; # switch to ... + FunParamGeti\201fun, "NAXIS", 1, 0, &got\202; # ... primary header + FunParamGeti\201fun, "NAXIS", 2, 0, &got\202; # ... primary header + val=0; + FunInfoPut\201fun, FUN_PRIMARYHEADER, &val, 0\202; # switch back to ... + FunParamGeti\201fun, "NAXIS", 2, 0, &got\202; # current header)RP( + +)0 P(Alternatively, you can use the FUN_PRIMARY macro to access parameters +from the primary header on a per-parameter basis: +) 2 72 PR( FunParamGeti\201fun, "NAXIS1", 0, 0, &got\202; # current header + FunParamGeti\201FUN_PRIMARY\201fun\202, "NAXIS1", 0, 0, &got\202; # primary header)RP( +)BD(NB: FUN_PRIMARY is deprecated.)ES( +It makes use of a global parameter and therefore will not not +appropriate for threaded applications, when we make funtools +thread-safe. We recommend use of FunInfoPut\201\202 to switch between the +extension header and the primary header. + +)0 P(For output data, access to the primary header is only possible until +the header is written out, which usually takes place when the first +data are written. + +)0 P(The second argument is the name of the parameter to access. The third +)BD(n)ES( argument, if non-zero, is an integer that will be added as a +suffix to the parameter name. This makes it easy to use a simple loop +to process parameters having the same root name. For example, to +gather up all values of TLMIN and TLMAX for each column in a binary +table, you can use: +) 4 74 PR( for\201i=0, got=1; got; i++\202{ + fun->cols[i]->tlmin = \201int\202FunParamGeti\201fun, "TLMIN", i+1, 0.0, &got\202; + fun->cols[i]->tlmax = \201int\202FunParamGeti\201fun, "TLMAX", i+1, 0.0, &got\202; + })RP( + +)0 P(The fourth )BD(defval)ES( argument is the default value to return if +the parameter does not exist. Note that the data type of this +parameter is different for each specific FunParamGet\201\202 call. The final +)BD(got)ES( argument will be 0 if no param was found. Otherwise the +data type of the parameter is returned as follows: FUN_PAR_UNKNOWN +\201'u'\202, FUN_PAR_COMMENT \201'c'\202, FUN_PAR_LOGICAL \201'l'\202, FUN_PAR_INTEGER +\201'i'\202, FUN_PAR_STRING \201's'\202, FUN_PAR_REAL \201'r'\202, FUN_PAR_COMPLEX \201'x'\202. + +)0 P(These routines return the value of the header parameter, or the +specified default value if the header parameter does not exist. The +returned value is a malloc'ed string and should be freed when no +longer needed. + +)0 P(By default, )BD(FunParamGets\201\202)ES( returns the string value of the +named parameter. However, you can use FunInfoPut\201\202 to retrieve the +raw 80-character FITS card instead. In particular, if you set the +FUN_RAWPARAM parameter to 1, then card images will be returned by +FunParamGets\201\202 until the value is reset to 0. + +)0 P(Alternatively, if the FUN_RAW macro is applied to the name, then the +80-character raw FITS card is returned instead. +)BD(NB: FUN_RAW is deprecated.)ES( +It makes use of a global parameter and therefore will not not +appropriate for threaded applications, when we make funtools +thread-safe. We recommend use of FunInfoPut\201\202 to switch between the +extension header and the primary header. + +)0 P(Note that in addition to the behaviors described above, the +routine )BD(FunParamGets\201\202)ES( will return the 80 raw characters of the +)BD(nth)ES( FITS card \201including the comment\202 if )BD(name)ES( is specified as +NULL and )BD(n)ES( is positive. For example, to loop through all FITS +header cards in a given extension and print out the raw card, use: +) 9 55 PR( for\201i=1; ;i++\202{ + if\201 \201s = FunParamGets\201fun, NULL, i, NULL, &got\202\202 \202{ + fprintf\201stdout, "%.80s\200n", s\202; + free\201s\202; + } + else{ + break; + } + })RP( + + + + +)0 2 43 H(FunParamPut)WB 109 Sn()WB 38 Sn( - put a Funtools param value)EA()EH( + + +)BD() 13 71 PR( #include <funtools.h> + + int FunParamPutb\201Fun fun, char *name, int n, int value, char *comm, + int append\202 + + int FunParamPuti\201Fun fun, char *name, int n, int value, char *comm, + int append\202 + + int FunParamPutd\201Fun fun, char *name, int n, double value, int prec, + char *comm, int append\202 + + int FunParamPuts\201Fun fun, char *name, int n, char *value, char *comm, + int append\202)RP()ES( + + +)0 P(The four routines )BD(FunParamPutb\201\202)ES(, )BD(FunParamPuti\201\202)ES(, +)BD(FunParamPutd\201\202)ES(, and )BD(FunParamPuts\201\202)ES(, will set the value +of a FITS header parameter as a boolean, int, double, and string, +respectively. + +)0 P(The first argument is the Fun handle associated with the FITS header +being accessed. Normally, the header is associated with the FITS +extension that you opened with )BD(FunOpen\201\202)ES(. +However, you can use FunInfoPut\201\202 to specify that use of the primary +header. In particular, if you set the FUN_PRIMARYHEADER parameter to +1, then the primary header is used for all parameter access until the +value is reset to 0. For example: +) 5 69 PR( int val; + FunParamPuti\201fun, "NAXIS1", 0, 10, NULL, 1\202; # current header + val=1; + FunInfoPut\201fun, FUN_PRIMARYHEADER, &val, 0\202; # switch to ... + FunParamPuti\201fun, "NAXIS1", 0, 10, NULL, 1\202; # primary header)RP( +\201You also can use the deprecated FUN_PRIMARY macro, to access +parameters from the primary header.\202 + +)0 P(The second argument is the )BD(name)ES( of the parameter. \201 +In accordance with FITS standards, the special names )BD(COMMENT)ES( +and )BD(HISTORY)ES(, as well as blank names, are output without the "= " +value indicator in columns 9 and 10. + +)0 P(The third )BD(n)ES( argument, if non-zero, is an integer that will be +added as a suffix to the parameter name. This makes it easy to use a +simple loop to process parameters having the same root name. For +example, to set the values of TLMIN and TLMAX for each column in a +binary table, you can use: +) 4 70 PR( for\201i=0; i<got; i++\202{ + FunParamPutd\201fun, "TLMIN", i+1, tlmin[i], 7, "min column val", 1\202; + FunParamPutd\201fun, "TLMAX", i+1, tlmax[i], 7, "max column val", 1\202; + })RP( + +)0 P(The fourth )BD(defval)ES( argument is the value to set. Note that the +data type of this argument is different for each specific +FunParamPut\201\202 call. The )BD(comm)ES( argument is the comment +string to add to this header parameter. Its value can be NULL. The +final )BD(append)ES( argument determines whether the parameter is added +to the header if it does not exist. If set to a non-zero value, the +header parameter will be appended to the header if it does not exist. +If set to 0, the value will only be used to change an existing parameter. + +)0 P(Note that the double precision routine FunParamPutd\201\202 supports an +extra )BD(prec)ES( argument after the )BD(value)ES( argument, in order +to specify the precision when converting the double value to ASCII. In +general a 20.[prec] format is used \201since 20 characters are alloted to +a floating point number in FITS\202 as follows: if the double value being +put to the header is less than 0.1 or greater than or equal to +10**\20120-2-[prec]\202, then %20.[prec]e format is used \201i.e., scientific +notation\202; otherwise %20.[prec]f format is used \201i.e., numeric +notation\202. + +)0 P(As a rule, parameters should be set before writing the table or image. +It is, however, possible to update the value of an )BD(existing)ES( +parameter after writing an image or table \201but not to add a new +one\202. Such updating only works if the parameter already exists and if +the output file is seekable, i.e. if it is a disk file or is stdout +being redirected to a disk file. + +)0 P(It is possible to add a new parameter to a header after the data has +been written, but only if space has previously been reserved. To reserve +space, add a blank parameter whose value is the name of the parameter you +eventually will update. Then, when writing the new parameter, specify a +value of 2 for the append flag. The parameter writing routine will +first look to update an existing parameter, as usual. If an existing +parameter is not found, an appropriately-valued blank parameter will be +searched for and replaced. For example: +) 8 71 PR( /* add blank card to be used as a place holder for IPAR1 update */ + FunParamPuts\201fun, NULL, 0, "IPAR1", "INTEGER Param", 0\202; + ... + /* write header and data */ + FunTableRowPut\201fun, events, got, 0, NULL\202; + ... + /* update param in file after writing data -- note append = 2 here */ + FunParamPuti\201fun, "IPAR", 1, 400, "INTEGER Param", 2\202;)RP( + +)0 P(The parameter routines return a 1 if the routine was successful and a 0 on +failure. In general, the major reason for failure is that you did not +set the append argument to a non-zero value and the parameter did not +already exist in the file. + + + + +)0 2 44 H(FunInfoGet)WB 110 Sn()WB 35 Sn( - get information from Funtools struct)EA()EH( + + +)BD() 3 52 PR( #include <funtools.h> + + int FunInfoGet\201Fun fun, int type, char *addr, ...\202)RP()ES( + + +)0 P(The )BD(FunInfoGet\201\202)ES( routine returns information culled from the +Funtools structure. The first argument is the Fun handle from which +information is to be retrieved. This first required argument is followed +by a variable length list of pairs of arguments. Each pair consists +of an integer representing the type of information to retrieve and the +address where the information is to be stored. The list is terminated by a 0. +The routine returns the number of get actions performed. + +)0 P(The full list of available information is described below. Please note +that only a few of these will be useful to most application developers. +For imaging applications, the most important types are: +) 3 47 PR( FUN_SECT_DIM1 int /* dim1 for section */ + FUN_SECT_DIM2 int /* dim2 for section */ + FUN_SECT_BITPIX int /* bitpix for section */)RP( +These would be used to determine the dimensions and data type of image +data retrieved using the +)0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D( routine. For +example: +) 17 68 PR( /* extract and bin the data section into an image buffer */ + buf = FunImageGet\201fun, NULL, NULL\202; + /* get required information from funtools structure. + this should come after the FunImageGet\201\202 call, in case the call + changed sect_bitpix */ + FunInfoGet\201fun, + FUN_SECT_BITPIX, &bitpix, + FUN_SECT_DIM1, &dim1, + FUN_SECT_DIM2, &dim2, + 0\202; + /* loop through pixels and reset values below limit to value */ + for\201i=0; i<dim1*dim2; i++\202{ + switch\201bitpix\202{ + case 8: + if\201 cbuf[i] <= blimit \202 cbuf[i] = bvalue; + ... + })RP( +It is important to bear in mind that the call to +)0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D( +can change the value of FUN_SECT_BITPIX \201e.g. if "bitpix=n" is passed +in the param list\202. Therefore, a call to +)0 35 1 A(FunInfoGet\201\202)35 0 TN TL()Ec /AF f D( +should be made )BD(after)ES( the call to +)0 26 1 A(FunImageGet\201\202)26 0 TN TL()Ec /AF f D(, +in order to retrieve the updated bitpix value. +See the )0 2 A(imblank example code)EA( for more +details. + +)0 P(It also can be useful to retrieve the World Coordinate System +information from the Funtools structure. Funtools uses the the WCS +Library developed by Doug Mink at SAO, which is available +)R3 2 A(here)EA(. +\201More information about the WCSTools project in general can be found +)R4 2 A(here)EA(.\202 +The )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( routine initializes +two WCS structures that can be used with this WCS Library. +Applications can retrieve either of these two WCS structures using +)BD(FunInfoGet\201\202)ES(: +) 2 75 PR( FUN_WCS struct WorldCoor * /* wcs structure, for image coordinates*/ + FUN_WCS0 struct WorldCoor * /* wcs structure, for physical coordinates */)RP( +The structure retrieved by FUN_WCS is a WCS library handle containing +parameters suitable for use with image coordinates, regardless of whether the +data are images or tables. For this structure, the WCS reference point +\201CRPIX\202 has been converted to image coordinates if the underlying file +is a table \201and therefore in physical coordinates\202. You therefore must +ensure that the positions being passed to a routine like pix2wcs are in +image coordinates. The FUN_WCS0 structure has not had its WCS +reference point converted to image coordinates. It therefore is useful +when passing processing physical coordinates from a table. + +)0 P(Once a WCS structure has been retrieved, it can be used as the first +argument to the WCS library routines. \201If the structure is NULL, no +WCS information was contained in the file.\202 The two important WCS routines +that Funtools uses are: +) 5 66 PR( #include <wcs.h> + void pix2wcs \201wcs,xpix,ypix,xpos,ypos\202 + struct WorldCoor *wcs; /* World coordinate system structure */ + double xpix,ypix; /* x and y coordinates in pixels */ + double *xpos,*ypos; /* RA and Dec in degrees \201returned\202 */)RP( + +which converts pixel coordinates to sky coordinates, and: + +) 5 67 PR( void wcs2pix \201wcs, xpos, ypos, xpix, ypix, offscl\202 + struct WorldCoor *wcs; /* World coordinate system structure */ + double xpos,ypos; /* World coordinates in degrees */ + double *xpix,*ypix; /* coordinates in pixels */ + int *offscl; /* 0 if within bounds, else off scale */)RP( +which converts sky coordinates to pixel coordinates. Again, please note +that the wcs structure returned by FUN_WCS assumes that image coordinates +are passed to the pix2wcs routine, while FUN_WCS0 assumes that physical +coordinates are passed. + +)0 P(Note that funtools.h file automatically includes wcs.h. An example +program that utilizes these WCS structure to call WCS Library routines +is )0 2 A(twcs.c)EA(. + +)0 P(The following is the complete list of information that can be returned: +) 52 79 PR( name type comment + --------- -------- --------------------------------------------- + FUN_FNAME char * /* file name */ + FUN_GIO GIO /* gio handle */ + FUN_HEADER FITSHead /* fitsy header struct */ + FUN_TYPE int /* TY_TABLE,TY_IMAGE,TY_EVENTS,TY_ARRAY */ + FUN_BITPIX int /* bits/pixel in file */ + FUN_MIN1 int /* tlmin of axis1 -- tables */ + FUN_MAX1 int /* tlmax of axis1 -- tables */ + FUN_MIN2 int /* tlmin of axis2 -- tables */ + FUN_MAX2 int /* tlmax of axis2 -- tables */ + FUN_DIM1 int /* dimension of axis1 */ + FUN_DIM2 int /* dimension of axis2 */ + FUN_ENDIAN int /* 0=little, 1=big endian */ + FUN_FILTER char * /* supplied filter */ + FUN_IFUN FITSHead /* pointer to reference header */ + FUN_IFUN0 FITSHead /* same as above, but no reset performed */ + /* image information */ + FUN_DTYPE int /* data type for images */ + FUN_DLEN int /* length of image in bytes */ + FUN_DPAD int /* padding to end of extension */ + FUN_DOBLANK int /* was blank keyword defined? */ + FUN_BLANK int /* value for blank */ + FUN_SCALED int /* was bscale/bzero defined? */ + FUN_BSCALE double /* bscale value */ + FUN_BZERO double /* bzero value */ + /* table information */ + FUN_NROWS int /* number of rows in file \201naxis2\202 */ + FUN_ROWSIZE int /* size of user row struct */ + FUN_BINCOLS char * /* specified binning columns */ + FUN_OVERFLOW int /* overflow detected during binning? */)WR( + /* array information */ + FUN_SKIP int /* bytes to skip in array header */ + /* section information */ + FUN_SECT_X0 int /* low dim1 value of section */ + FUN_SECT_X1 int /* hi dim1 value of section */ + FUN_SECT_Y0 int /* low dim2 value of section */ + FUN_SECT_Y1 int /* hi dim2 value of section */ + FUN_SECT_BLOCK int /* section block factor */ + FUN_SECT_BTYPE int /* 's' \201sum\202, 'a' \201average\202 for binning */ + FUN_SECT_DIM1 int /* dim1 for section */ + FUN_SECT_DIM2 int /* dim2 for section */ + FUN_SECT_BITPIX int /* bitpix for section */ + FUN_SECT_DTYPE int /* data type for section */ + FUN_RAWBUF char * /* pointer to raw row buffer */ + FUN_RAWSIZE int /* byte size of raw row records */ + /* column information */ + FUN_NCOL int /* number of row columns defined */ + FUN_COLS FunCol /* array of row columns */ + /* WCS information */ + FUN_WCS struct WorldCoor * /* wcs structure, converted for images*/ + FUN_WCS0 struct WorldCoor * /* wcs structure, not converted */)RP( + +)0 P(Row applications would not normally need any of this information. +An example of how these values can be used in more complex programs is +the )0 2 A(evnext example code)EA(. In this program, the +time value for each row is changed to be the value of the succeeding +row. The program thus reads the time values for a batch of rows, +changes the time values to be the value for the succeeding row, and +then merges these changed time values back with the other columns to +the output file. It then reads the next batch, etc. + +)0 P(This does not work for the last row read in each batch, since there +is no succeeding row until the next batch is read. Therefore, the +program saves that last row until it has read the next batch, then +processes the former before starting on the new batch. In order to +merge the last row successfully, the code uses FUN_RAWBUF to save +and restore the raw input data associated with each batch of +rows. Clearly, this requires some information about how funtools +works internally. We are happy to help you write such programs as the +need arises. + + + + +)0 2 45 H(FunInfoPut)WB 111 Sn()WB 36 Sn( - put information into a Funtools struct)EA()EH( + + +)BD() 3 52 PR( #include <funtools.h> + + int FunInfoPut\201Fun fun, int type, char *addr, ...\202)RP()ES( + + +)0 P(The )BD(FunInfoPut\201\202)ES( routine puts information into a Funtools +structure. The first argument is the Fun handle from which +information is to be retrieved. After this first required argument +comes a variable length list of pairs of arguments. Each pair consists +of an integer representing the type of information to store and the +address of the new information to store in the struct. The variable +list is terminated by a 0. The routine returns the number of put +actions performed. + +)0 P(The full list of available information is described above with the +)0 36 1 A(FunInfoPut\201\202)36 0 TN TL()Ec /AF f D( routine. Although +use of this routine is expected to be uncommon, there is one +important situation in which it plays an essential part: writing +multiple extensions to a single output file. + +)0 P(For input, multiple extensions are handled by calling +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( for each extension to be +processed. When opening multiple inputs, it sometimes is the case that +you will want to process them and then write them \201including their +header parameters\202 to a single output file. To accomplish this, you +open successive input extensions using +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( and then call +)BD(FunInfoPut\201\202)ES( to set the +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( +of the output file to that of the newly opened input extension: +) 4 71 PR( /* open a new input extension */ + ifun=FunOpen\201tbuf, "r", NULL\202\202 \202 + /* make the new extension the reference handle for the output file */ + FunInfoPut\201ofun, FUN_IFUN, &ifun, 0\202;)RP( + +Resetting FUN_IFUN has same effect as when a funtools handle is passed +as the final argument to +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(. The state of the output +file is reset so that a new extension is ready to be written. +Thus, the next I/O call on the output extension will output the +header, as expected. + +)0 P(For example, in a binary table, after resetting FUN_IFUN you can then +call )0 32 1 A(FunColumnSelect\201\202)32 0 TN TL()Ec /AF f D( to +select the columns for output. When you then call +)0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D( or )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D(, a new +extension will be written that contains the header parameters from the +reference extension. Remember to call +)0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( to complete output of a +given extension. + +)0 P(A complete example of this capability is given +in the )0 2 A(evcol example code)EA(. +The central algorithm is: +)UL()-1 LI( open the output file without a reference handle +)-1 LI( loop: open each input extension in turn +)UL()-1 LI( set the reference handle for output to the newly opened input extension +)-1 LI( read the input rows or image and perform processing +)-1 LI( write new rows or image to the output file +)-1 LI( flush the output +)-1 LI( close input extension)LU( +)-1 LI( close output file)LU( +Note that )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( is called +after processing each input extension in order to ensure that the +proper padding is written to the output file. A call to +)0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( also ensures that the +extension header is written to the output file in the case where there +are no rows to output. + +)0 P(If you wish to output a new extension without using a +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D(, you can +call FunInfoPut\201\202 to reset the FUN_OPS value directly. For a binary +table, you would then call FunColumnSelect\201\202 to set up the columns for +this new extension. +) 6 59 PR( /* reset the operations performed on this handle */ + int ops=0; + FunInfoPut\201ofun, FUN_OPS, &ops, 0\202; + FunColumnSelect\201fun, sizeof\201EvRec\202, NULL, + "MYCOL", "J", "w", FUN_OFFSET\201Ev, mycol\202, + NULL\202;)RP( +Once the FUN_OPS variable has been reset, the next I/O call on the +output extension will output the header, as expected. + + + + +)0 2 46 H(FunFlush)WB 112 Sn()WB 39 Sn( - flush data to output file)EA()EH( + + +)BD() 3 37 PR( #include <funtools.h> + + void FunFlush\201Fun fun, char *plist\202)RP()ES( + + +)0 P(The )BD(FunFlush)ES( routine will flush data to a FITS output file. In +particular, it can be called after all rows have been written \201using +the )0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( routine\202 +in order to add the null padding that is required to complete a FITS +block. It also should be called after completely writing an image using +)0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D( or after writing +the final row of an image using +)0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D(. + +)0 P(The )BD(plist)ES( \201i.e., parameter list\202 argument is a string +containing one or more comma-delimited )BD(keyword=value)ES( +parameters. If the plist string contains the parameter +"copy=remainder" and the file was opened with a reference file, which, +in turn, was opened for extension copying \201i.e. the input +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( mode also was "c" or "C"\202, +then FunFlush also will copy the remainder of the FITS extensions from +the input reference file to the output file. This normally would be +done only at the end of processing. + +)0 P(Note that )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( is called +with "copy=remainder" in the mode string by FunClose\201\202. This means +that if you close the output file before the reference input file, it +is not necessary to call +)0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( explicitly, unless you +are writing more than one extension. See the +)0 2 A(evmerge example code)EA(. However, it is safe to +call )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( more than once +without fear of re-writing either the padding or the copied +extensions. + +)0 P(In addition, if )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( is +called on an output file with the plist set to "copy=reference" and if +the file was opened with a reference file, the reference extension is +written to the output file. This mechanism provides a simple way to +copy input extensions to an output file without processing the former. +For example, in the code fragment below, an input extension is set to +be the reference file for a newly opened output extension. If that +reference extension is not a binary table, it is written to the output +file: +) 22 73 PR( /* process each input extension in turn */ + for\201ext=0; ;ext++\202{ + /* get new extension name */ + sprintf\201tbuf, "%s[%d]", argv[1], ext\202; + /* open input extension -- if we cannot open it, we are done */ + if\201 !\201ifun=FunOpen\201tbuf, "r", NULL\202\202 \202 + break; + /* make the new extension the reference handle for the output file */ + FunInfoPut\201ofun, FUN_IFUN, &ifun, 0\202; + /* if its not a binary table, just write it out */ + if\201 !\201s=FunParamGets\201ifun, "XTENSION", 0, NULL, &got\202\202 || + strcmp\201s, "BINTABLE"\202\202{ + if\201 s \202 free\201s\202; + FunFlush\201ofun, "copy=reference"\202; + FunClose\201ifun\202; + continue; + } + else{ + /* process binary table */ + .... + } + })RP( + + + + +)0 2 47 H(FunClose)WB 113 Sn()WB 40 Sn( - close a Funtools data file)EA()EH( + + +)BD() 3 24 PR( #include <funtools.h> + + void FunClose\201Fun fun\202)RP()ES( + + +)0 P(The )BD(FunClose\201\202)ES( routine closes a previously-opened Funtools data +file, freeing control structures. If a +)0 23 1 A(Funtools reference handle)23 0 TN TL()Ec /AF f D( +was passed to +the )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call for this file, +and if copy mode also was specified for that file, then +)0 40 1 A(FunClose\201\202)40 0 TN TL()Ec /AF f D( also will copy the +remaining extensions from the input file to the output file \201if the +input file still is open\202. Thus, we recommend always closing the +output Funtools file )BD(before)ES( the input file. \201Alternatively, +you can call )0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( +explicitly\202. + + + + +)0 2 48 H(FunRef:)WB 114 Sn()WB 23 Sn( the Funtools Reference Handle)EA()EH( + + +)0 2 49 H(Summary)WB 115 Sn()EH( +A description of how to use a Funtools reference handle to connect a +Funtools input file to an output file. + + +)0 2 50 H(Description)WB 116 Sn()EH( +)0 P(The Funtools reference handle connects a Funtools input file to a +Funtools output file so that parameters \201or even whole extensions\202 can +be copied from the one to the other. To make the connection, the Funtools +handle of the input file is passed to the +final argument of the +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( call for the output file: +) 4 67 PR( if\201 !\201ifun = FunOpen\201argv[1], "r", NULL\202\202 \202 + gerror\201stderr, "could not FunOpen input file: %s\200n", argv[1]\202; + if\201 !\201ofun = FunOpen\201argv[2], "w", ifun\202\202 \202 + gerror\201stderr, "could not FunOpen output file: %s\200n", argv[2]\202;)RP( +It does not matter what type of input or output file \201or extension\202 is +opened, or whether they are the same type. When the output image or +binary table is written using +)0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D( +or +)0 31 1 A(FunTableRowPut\201\202)31 0 TN TL()Ec /AF f D( +an appropriate header will be written first, with parameters copied +from the input extension. Of course, invalid parameters will be +removed first, e.g., if the input is a binary table and the output is +an image, then binary table parameters such as TFORM, TUNIT, +etc. parameters will not be copied to the output. + +)0 P(Use of a reference handle also allows default values to be passed +to +)0 27 1 A(FunImagePut\201\202)27 0 TN TL()Ec /AF f D( in order to +write out an output image with the same dimensions and data type +as the input image. To use the defaults from the input, a value +of 0 is entered for dim1, dim2, and bitpix. For example: +) 5 40 PR( fun = FunOpen\201argv[1], "r", NULL\202; + fun2 = FunOpen\201argv[2], "w", fun\202; + buf = FunImageGet\201fun, NULL, NULL\202; + ... process image data ... + FunImagePut\201fun2, buf, 0, 0, 0, NULL\202;)RP( +Of course, you often want to get information about the data type +and dimensions of the image for processing. The above code +is equivalent to the following: +) 7 61 PR( fun = FunOpen\201argv[1], "r", NULL\202; + fun2 = FunOpen\201argv[2], "w", fun\202; + buf = FunImageGet\201fun, NULL, NULL\202; + FunInfoGet\201fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, + FUN_SECT_BITPIX, &bitpix, 0\202; + ... process image data ... + FunImagePut\201fun2, buf, dim1, dim2, bitpix, NULL\202;)RP( + +)0 P(It is possible to change the reference handle for a given output Funtools +handle using the +)0 36 1 A(FunInfoPut\201\202)36 0 TN TL()Ec /AF f D( routine: +) 2 71 PR( /* make the new extension the reference handle for the output file */ + FunInfoPut\201fun2, FUN_IFUN, &fun, 0\202;)RP( +When this is done, Funtools specially resets the output file to start +a new output extension, which is connected to the new input reference +handle. You can use this mechanism to process multiple input extensions +into a single output file, by successively opening the former and +setting the reference handle for the latter. For example: +) 18 73 PR( /* open a new output FITS file */ + if\201 !\201fun2 = FunOpen\201argv[2], "w", NULL\202\202 \202 + gerror\201stderr, "could not FunOpen output file: %s\200n", argv[2]\202; + /* process each input extension in turn */ + for\201ext=0; ;ext++\202{ + /* get new extension name */ + sprintf\201tbuf, "%s[%d]", argv[1], ext\202; + /* open it -- if we cannot open it, we are done */ + if\201 !\201fun=FunOpen\201tbuf, "r", NULL\202\202 \202 + break; + /* make the new extension the reference handle for the output file */ + FunInfoPut\201fun2, FUN_IFUN, &fun, 0\202; + ... process ... + /* flush output extension \201write padding, etc.\202 */ + FunFlush\201fun2, NULL\202; + /* close the input extension */ + FunClose\201fun\202; + })RP( +In this example, the output file is opened first. Then each successive +input extension is opened, and the output reference handle is set to +the newly opened input handle. After data processing is performed, the +output extension is flushed and the input extension is closed, in +preparation for the next input extension. +)0 P(Finally, a reference handle can be used to copy other extensions from +the input file to the output file. Copy of other extensions is +controlled by adding a "C" or "c" to the mode string of the +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( +call )BD(of the input reference file)ES(. If "C" is specified, then +other extensions are )BD(always)ES( copied \201i.e., copy is forced by the +application\202. If "c" is used, then other extensions are copied if the +user requests copying by adding a plus sign "+" to the extension name +in the bracket specification. For example, the )BD(funtable)ES( +program utilizes user-specified "c" mode so that the second example +below will copy all extensions: +) 4 60 PR( # copy only the EVENTS extension + csh> funtable "test.ev[EVENTS,circle\201512,512,10\202]" foo.ev + # copy ALL extensions + csh> funtable "test.ev[EVENTS+,circle\201512,512,10\202]" foo.ev)RP( +When extension copy is specified in the input file, the call to +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( +on the input file delays the actual file open until the output file +also is opened \201or until I/O is performed on the input file, which +ever happens first\202. Then, when the output file is opened, the input +file is also opened and input extensions are copied to the output +file, up to the specific extension being opened. Processing of input +and output extensions then proceed. +)0 P(When extension processing is complete, the remaining extensions need to +be copied from input to output. This can be done explicitly, using the +)0 39 1 A(FunFlush\201\202)39 0 TN TL()Ec /AF f D( +call with the "copy=remaining" plist: +) 1 34 PR( FunFlush\201fun, "copy=remaining"\202;)RP( +Alternatively, this will happen automatically, if the output file +is closed )BD(before)ES( the input file: +) 5 77 PR( /* we could explicitly flush remaining extensions that need copying */ + /* FunFlush\201fun2, "copy=remaining"\202; */ + /* but if we close output before input, end flush is done automatically */ + FunClose\201fun2\202; + FunClose\201fun\202;)RP( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 51 H(Last)WB 117 Sn( updated: December 1, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (files.html) D +/Ti (Funtools Data Files) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 42 Sn( + + +)0 2 52 H(FunFiles:)WB 120 Sn()WB 118 Sn( Funtools Data Files)EA()EH( + + +)0 2 53 H(Summary)WB 121 Sn()EH( +This document describes the data file formats \201FITS, array, raw +events\202 as well as the file types \201gzip, socket, etc.\202 supported +by Funtools. + + +)0 2 54 H(Description)WB 122 Sn()EH( +)0 P(Funtools supports FITS images and binary tables, and binary files +containing array \201homogeneous\202 data or event \201heterogeneous\202 data. +IRAF-style brackets are appended to the filename to specify various +kinds of information needed to characterize these data: +) 3 49 PR( file[ext|ind|ARRAY\201\202|EVENTS\201\202,section][filters] + or + file[ext|ind|ARRAY\201\202|EVENTS\201\202,section,filters])RP( +where: +)UL()-1 LI( )BD(file)ES( is the Funtools file name +)-1 LI( )BD(ext)ES( is the FITS extension name +)-1 LI( )BD(ind)ES( is the FITS extension number +)-1 LI( )BD(ARRAY\201\202)ES( is an array specification +)-1 LI( )BD(EVENTS\201\202)ES( is an event specification +)-1 LI( )BD(section)ES( is the image section specification +)-1 LI( )BD(filters)ES( are spatial region and table \201row\202 filters)LU( + +)0 2 55 H(Supported)WB 123 Sn()WB 43 Sn( Data Formats)EA()EH( +)0 P(Funtools programs \201and the underlying libraries\202 support the +following data file formats: +)UL()-1 LI( FITS images \201and image extensions\202 +)-1 LI( FITS binary tables +)-1 LI( binary files containing an array of homogeneous data +)-1 LI( binary files containing events, i.e. records of heterogeneous data +)-1 LI( column-based text files, which are documented )0 47 1 A(here)47 0 TN TL()Ec /AF f D( +)-1 LI( non-disk files and lists of files)LU( +Information needed to identify and characterize +the event or image data can be specified on the command line +using IRAF-style bracket notation appended to the filename: +) 5 69 PR( foo.fits # open FITS default extension + image.fits[3] # open FITS extension #3 + events.fits[EVENTS] # open EVENTS extension + array.file[ARRAY\201s1024\202] # open 1024x1024 short array + events.file[EVENTS\201x:1024,y:1024...\202] # open non-FITS event list)RP( +Note that in many Unix shells \201e.g., csh and tcsh\202, filenames must +be enclosed in quotes to protect the brackets from shell processing. + +)0 2 56 H(FITS)WB 124 Sn()WB 44 Sn( Images and Binary Tables)EA()EH( +)0 P(When )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( opens a FITS file +without a bracket specifier, the default behavior is to look for a +valid image in the primary HDU. In the absence of a primary image, +Funtools will try to open an extension named either )BD(EVENTS)ES( or +)BD(STDEVT)ES(, if one of these exists. This default behavior supports +both FITS image processing and standard X-ray event list processing +\201which, after all, is what we at SAO/HEAD do\202. + +)0 P(In order to open a FITS binary table or image extension explicitly, it +is necessary to specify either the extension name or the extension +number in brackets: +) 3 71 PR( foo.fits[1] # open extension #1: the primary HDU + foo.fits[3] # open extension #3 of a FITS file + foo.fits[GTI] # open GTI extension of a FITS file)RP( +The ext argument specifies the name of the FITS extension \201i.e. the +value of the EXTENSION header parameter in a FITS extension\202, while +the index specifies the value of the FITS EXTVER header parameter. +Following FITS conventions, extension numbers start at 1. + +)0 P(When a FITS data file is opened for reading using +)0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D(, the specified extension +is automatically located and is used to initialize the Funtools internal +data structures. + +)0 2 57 H(Non-FITS)WB 125 Sn()WB 45 Sn( Raw Event Files)EA()EH( + +In addition to FITS tables, Funtools programs and libraries can operate +on non-FITS files containing heterogeneous event records. To specify +such an event file, use: + +)UL()-1 LI( file[EVENTS\201event-spec\202] +)-1 LI( file[EVENTS\201\202])LU( +where )BD(event-spec)ES( is a string that specified the names, data +types, and optional image dimensions for each element of the event +record: +)UL()-1 LI( [name]:[n][type]:[\201lodim:\202hidim])LU( + +)0 P(Data types follow standard conventions for FITS binary tables, but include +two extra unsigned types \201'U' and 'V'\202: +)UL()-1 LI( )BD(B)ES( -- unsigned 8-bit char +)-1 LI( )BD(I)ES( -- signed 16-bit int +)-1 LI( )BD(J)ES( -- signed 32-bit int +)-1 LI( )BD(K)ES( -- signed 64-bit int +)-1 LI( )BD(E)ES( -- 32-bit float +)-1 LI( )BD(D)ES( -- 64-bit float +)-1 LI( )BD(U)ES( -- unsigned 16-bit int +)-1 LI( )BD(V)ES( -- unsigned 32-bit int)LU( +An optional integer value )BD(n)ES( can be prefixed to the type to indicate +that the element is an array of n values. For example: +) 1 37 PR( foo.fits[EVENTS\201x:I,y:I,status:4J\202])RP( +defines x and y as 16-bit ints and status as an array of 4 32-bit ints. + +)0 P(Furthermore, image dimensions can be attached to the event specification +in order to tell Funtools how to bin the events into an image. They +follow the conventions for the FITS TLMIN/TLMAX keywords. If the low +image dimension is not specified, it defaults to 1. Thus: + +)UL()-1 LI( RAWX:J:1:100 +)-1 LI( RAWX:J:100)LU( +both specify that the dimension of this column runs from 1 to 100. + +)0 P(NB: it is required that all padding be specified in the record +definition. Thus, when writing out whole C structs instead of +individual record elements, great care must be taken to include +the compiler-added padding in the event definition. + +)0 P(For example, suppose a FITS binary table has the following set of column +definitions: +) 22 54 PR( TTYPE1 = 'X ' / Label for field + TFORM1 = '1I ' / Data type for field + TLMIN1 = 1 / Min. axis value + TLMAX1 = 10 / Max. axis value + TTYPE2 = 'Y ' / Label for field + TFORM2 = '1I ' / Data type for field + TLMIN2 = 2 / Min. axis value + TLMAX2 = 11 / Max. axis value + TTYPE3 = 'PHA ' / Label for field + TFORM3 = '1I ' / Data type for field + TTYPE4 = 'PI ' / Label for field + TFORM4 = '1J ' / Data type for field + TTYPE5 = 'TIME ' / Label for field + TFORM5 = '1D ' / Data type for field + TTYPE6 = 'DX ' / Label for field + TFORM6 = '1E ' / Data type for field + TLMIN6 = 1 / Min. axis value + TLMAX6 = 10 / Max. axis value + TTYPE7 = 'DY ' / Label for field + TFORM7 = '1E ' / Data type for field + TLMIN7 = 3 / Min. axis value + TLMAX7 = 12 / Max. axis value)RP( + +An raw event file containing these same data would have the event +specification: +) 1 61 PR( EVENTS\201X:I:10,Y:I:2:11,PHA:I,PI:J,TIME:D,DX:E:10,DY:E:3:12\202)RP( + +)0 P(If no event specification string is included within the EVENTS\201\202 operator, +then the event specification is taken from the )BD(EVENTS)ES( environment +variable: +) 1 65 PR( setenv EVENTS "X:I:10,Y:I:10,PHA:I,PI:J,TIME:D,DX:E:10,DY:E:10")RP( + +)0 P(In addition to knowing the data structure, it is necessary to know the +)EM(endian)ES( ordering of the data, i.e., whether or not the data is +in )EM(bigendian)ES( format, so that we can convert to the native +format for this platform. This issue does not arise for FITS Binary +Tables because all FITS files use big-endian ordering, regardless of +platform. But for non-FITS data, big-endian data produced on a Sun +workstation but read on a Linux PC needs to be byte-swapped, since PCs +use little-endian ordering. To specify an ordering, use the +)EM(bigendian=)ES( or )EM(endian=)ES( keywords on the command-line +or the EVENTS_BIGENDIAN or EVENTS_ENDIAN environment variables. The +value of the )EM(bigendian)ES( variables should be "true" or "false", +while the value of the )EM(endian)ES( variables should be "little" or +"big". + +)0 P(For example, a PC can access data produced by a Sun using: +) 7 35 PR( hrc.nepr[EVENTS\201\202,bigendian=true] +or + hrc.nepr[EVENTS\201\202,endian=big] +or + setenv EVENTS_BIGENDIAN true +or + setenv EVENTS_ENDIAN big)RP( +If none of these are specified, the data are assumed to follow the +format for that platform and no byte-swapping is performed. + +)0 2 58 H(Non-FITS)WB 126 Sn()WB 46 Sn( Array Files)EA()EH( + +In addition to FITS images, Funtools programs and libraries can operate +on non-FITS files containing arrays of homogeneous data. To specify +an array file, use: +)UL()-1 LI( file[ARRAY\201array-spec\202] +)-1 LI( file[ARRAY\201\202])LU( + +where array-spec is of the form: +)UL()-1 LI( [type][dim1][.dim2][:skip][endian])LU( + +and where [type] is: +)UL()-1 LI( b \2018-bit unsigned char\202 +)-1 LI( s \20116-bit short int\202 +)-1 LI( u \20116-bit unsigned short int\202 +)-1 LI( i \20132-bit int\202 +)-1 LI( r,f \20132-bit float\202 +)-1 LI( d \20164-bit float\202)LU( + +)0 P(The dim1 specification is required, but dim2 is optional and defaults +to dim1. The skip specification is optional and defaults to 0. The +optional endian specification can be 'l' or 'b' and defaults to the +endian type for the current machine. + +)0 P(If no array specification is included within the ARRAY\201\202 operator, +then the array specification is taken from the )BD(ARRAY)ES( environment +variable. For example: + +) 7 76 PR( foo.arr[ARRAY\201r512\202] # bitpix=-32 dim1=512 dim2=512 + foo.arr[ARRAY\201r512.400\202] # bitpix=-32 dim1=512 dim2=400 + foo.arr[ARRAY\201r512.400]\202 # bitpix=-32 dim1=512 dim2=400 + foo.arr[ARRAY\201r512.400:2880\202] # bitpix=-32 dim1=512 dim2=400 skip=2880 + foo.arr[ARRAY\201r512l\202] # bitpix=-32 dim1=512 dim2=512 endian=little + setenv ARRAY "r512.400:2880" + foo.arr[ARRAY\201\202] # bitpix=-32 dim1=512 dim2=400 skip=2880)RP( + +)0 2 59 H(Specifying)WB 127 Sn()WB 49 Sn( Image Sections)EA()EH( + +Once a data file \201and possibly, a FITS extension\202 has been specified, +the next \201optional\202 part of a bracket specification can be used to +select image )BD(section)ES( information, i.e., to specify the x,y +limits of an image section, as well as the blocking factor to apply to +that section. This information can be added to any file specification but +only is used by Funtools image processing routines. + +)0 P(The format of the image section specification is one of the following: +)UL()-1 LI( file[xy0:xy1,block] +)-1 LI( file[x0:x1,y0:y1,block] +)-1 LI( file[x0:x1,*,block] +)-1 LI( file[*,y0:y1,block] +)-1 LI( file[*,block])LU( +where the limit values can be ints or "*" for default. A single "*" +can be used instead of val:val, as shown. Note that blocking is +applied to the section after it is extracted. + +)0 P(In addition to image sections specified by the lo and hi x,y limits, image +sections using center positions can be specified: +)UL()-1 LI( file[dim1@xcen,dim2@ycen] +)-1 LI( file[xdim2@xcen@ycen] +)-1 LI( file[dim1@xcen,dim2@ycen,block] +)-1 LI( file[dim@xcen@ycen,block])LU( +Note that the \201float\202 values for dim, dim1, dim2, xcen, ycen must be +specified or else the expression does not make sense! + +)0 P(In all cases, block is optional and defaults to 1. An 's' or 'a' can +be appended to signify "sum" or "average" blocking \201default is "sum"\202. +Section specifications are given in image coordinates by default. If you +wish to specify physical coordinates, add a 'p' as the last character +of the section specification, before the closing bracket. +For example: +) 2 21 PR()UL()-1 LI( file[-8:-7,-8:-7p] +)-1 LI( file[-8:-7,-8:-7,2p])LU()RP( +A section can be specified in any Funtools file name. If the operation +to be applied to that file is an imaging operation, then the +specification will be utilized. If the operation is purely a table +operation, then the section specification is ignored. + +)0 P(Do not be confused by: +) 2 15 PR( foo.fits[2] + foo.fits[*,2])RP( +The former specifies opening the second extension of the FITS file. +The latter specifies application of block 2 to the image section. + +)0 P(Note that the section specification must come after +any of FITS )BD(ext)ES( name or )BD(ind)ES( number, +but all sensible defaults are supported: +)UL()-1 LI( file[ext] +)-1 LI( file[ext,index] +)-1 LI( file[index] +)-1 LI( file[ext,section] +)-1 LI( file[ext,index,section] +)-1 LI( file[index,section] +)-1 LI( file[section])LU( + +)0 2 60 H(Binning)WB 128 Sn()WB 50 Sn( FITS Binary Tables and Non-FITS Event Files)EH( + +If a FITS binary table or a non-FITS raw event file is to be binned +into a 2D image \201e.g., using the +)0 10 1 A(funimage)10 0 TN TL()Ec /AF f D( +program\202, it is necessary to specify the two columns to be used for the +binning, as well as the dimensions of the image. Funtools first looks +for a specifier of the form: +) 1 74 PR( bincols=\201[xnam[:tlmin[:tlmax:[binsiz]]]],[ynam[:tlmin[:tlmax[:binsiz]]]]\202)RP( +in bracket syntax, and uses the column names thus specified. The tlmin, tlmax, +and binsiz specifiers determine the image binning dimensions using: +) 2 56 PR( dim = \201tlmax - tlmin\202/binsiz \201floating point data\202 + dim = \201tlmax - tlmin\202/binsiz + 1 \201integer data\202)RP( +These tlmin, tlmax, and binsiz specifiers can be omitted if TLMIN, +TLMAX, and TDBIN header parameters are present in the FITS binary +table header, respectively. If only one parameter is specified, it is +assumed to be tlmax, and tlmin defaults to 1. If two parameters are +specified, they are assumed to be tlmin and tlmax. + +For example, to bin an HRC event list columns "VPOS" and "UPOS", use: +) 1 31 PR( hrc.nepr[bincols=\201VPOS,UPOS\202])RP( +or +) 1 42 PR( hrc.nepr[bincols=\201VPOS:49152,UPOS:4096\202])RP( +Note that you can optionally specify the dimensions of these columns +to cover cases where neither TLMAX keywords are defined in +the header. If either dimension is specified, then both must be specified. + +)0 P(You can set the FITS_BINCOLS or EVENTS_BINCOLS environment variable as +an alternative to adding the "bincols=" specifier to each file name +for FITS binary tables and raw event files, respectively. If no +binning keywords or environment variables are specified, or if the +specified columns are not in the binary table, the Chandra parameters +CPREF \201or PREFX\202 are searched for in the FITS binary table header. +Failing this, columns named "X" and "Y" are sought. If these are not +found, the code looks for columns containing the characters "X" and +"Y". Thus, you can bin on "DETX" and "DETX" columns without +specifying them, if these are the only column names containing the "X" +and "Y" characters. + +)0 P(Ordinarily, each event or row contributes one count to an image pixel +during the 2D binning process. Thus, if five events all have the same +\201x,y\202 position, the image pixel value for that position will have a +value of five. It is possible to specify a variable contribution +for each event by using the vcol=[colname] filter spec: +) 1 15 PR( vcol=[colname])RP( +The vcol colname is a column containing a numeric value in each event row +that will be used as the contribution of the given event to its image +pixel. For example, consider an event file that has the following content: +) 10 24 PR( x:e:4 y:e:4 v:e + ------ ------ ---- + 1 1 1.0 + 2 2 2.0 + 3 3 3.0 + 4 4 0.0 + 1 1 1.0 + 2 2 2.0 + 3 3 3.0 + 4 4 4.0)RP( +There are two events with x,y value of \2011,1\202 so ordinarily a 2D image will +have a value of 2 in the \2011,1\202 pixel. If the v column is specified as the +value column: +) 1 20 PR( foo.fits'[vcol=v]')RP( +then each pixel will contain the additive sum of the associated \201x,y\202 +column values from the v column. For example, image pixel \2011,1\202 will +contain 1. + 1. = 2, image pixel \2012,2\202 will contain \2012 + 2\202 = 4, etc. + +)0 P(An important variation on the use of a value column to specify the +contribution an event makes to an image pixel is when the value column +contains the reciprocal of the event contribution. For this case, the +column name should be prefixed with a / \201divide sign\202 thus: +) 1 21 PR( foo.fits'[vcol=/v]')RP( +Each image pixel value will then be the sum of the reciprocals of the value +column. A zero in the value column results in NaN \201not a number\202. +Thus, in the above example, image pixel \2011.1\202 will contain 1/1 + 1/1 = 2, +image pixel \2012,2\202 will contain \2011/2 + 1/2\202 = 1, etc. Image pixel \2014,4\202 +will contain \2011/0 + 1/4\202 = NaN. + +)0 P(You can set the FITS_VCOL or EVENTS_VCOL environment variable as +an alternative to adding the "vcol=" specifier to each file name +for FITS binary tables and raw event files, respectively. + +)0 P(Finally, when binning events, the data type of the resulting 2D image +must be specified. This can be done with the "bitpix=[n]" keyword in +the bracket specification. For example: +) 1 45 PR( events.fits[bincols=\201VPOS,UPOS\202,bitpix=-32])RP( +will create a floating point image binned on columns VPOS and UPOS. +If no bitpix keyword is specified, bitpix=32 is assumed. As with +bincols values, you also can use the FITS_BITPIX and EVENTS_BITPIX +environment variables to set this value for FITS binary tables and +raw event files, respectively. + +)0 P(The )BD(funimage)ES( program also allows you to create a 1D image projection +along any column of a table by using the )BD(bincols=[column])ES( +filter specification and specifying a single column. +For example, the following command projects a 1D image along +the chipx column of a table: +) 1 43 PR( funimage ev.fits'[bincols=chipx]' im.fits)RP( +See )0 10 1 A(funimage)10 0 TN TL()Ec /AF f D( for more +information about creating 1D and 2D images. + +)0 P(Finally, please note that Funtools supports most FITS standards. +We will add missing support as required by the community. In general, +however, we do not support non-standard extensions. For example, we +sense the presence of the binary table 'variable length array' +proposed extension and we pass it along when copying and filtering +files, but we do not process it. We will add support for new standards +as they become official. + +)0 2 61 H(Table)WB 129 Sn()WB 119 Sn( and Spatial Region Filters)EH( +)0 P(Note that, in addition extensions and image sections, Funtools bracket +notation can be used to specify table and spatial region filters. These +filters are always placed after the image section information. They +can be specified in the same bracket or in a separate bracket +immediately following: +)UL()-1 LI( file[ext|ind|ARRAY\201\202|EVENTS\201\202,section][filters] +)-1 LI( file[ext|ind|ARRAY\201\202|EVENTS\201\202,section,filters])LU( +where: +)UL()-1 LI( )BD(file)ES( is the Funtools file name +)-1 LI( )BD(ARRAY\201\202)ES( is an array specification +)-1 LI( )BD(EVENTS\201\202)ES( is an event list specification +)-1 LI( )BD(ext)ES( is the FITS extension name +)-1 LI( )BD(ind)ES( is the FITS extension number +)-1 LI( )BD(section)ES( is the image section to extract +)-1 LI( )BD(filters)ES( are spatial region and table \201row\202 filters to apply)LU( + +The topics of table and region filtering are covered in detail in: +)UL()-1 LI()0 52 1 A(Table Filtering)52 0 TN TL()Ec /AF f D( +)-1 LI()0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D()LU( + +)0 2 62 H(Disk)WB 130 Sn()WB 51 Sn( Files and Other Supported File Types)EA()EH( +)0 P(The specified )BD(file)ES( usually is an ordinary disk file. In +addition, gzip'ed files are supported in Funtools: gzip'ed input files +are automatically uncompressed as they are read, and gzip'ed output +files are compressed as they are written. NB: if a FITS binary table +is written in gzip format, the number of rows in the table will be set +to -1. Such a file will work with Funtools programs but will not work +with other FITS programs such as ds9. + +)0 P(The special keywords "stdin" and "stdout" designate Unix standard +input and standard output, respectively. The string "-" \201hyphen\202 will +be taken to mean "stdin" if the file is opened for reading and +"stdout" if the file is opened for writing. + +)0 P(A file also can be an INET socket on the same or another machine using +the syntax: +) 1 14 PR( machine:port)RP( +Thus, for example: +) 1 14 PR( karapet:1428)RP( +specifies that I/O should be performed to/from port 1428 on the +machine karapet. If no machine name is specified, the default is to +use the current machine: +) 1 7 PR( :1428)RP( +This means to open port 1428 on the current machine. Socket support +allows you to generate a distributed pipe: +) 2 48 PR( on karapet: funtask1 in.fits bynars:1428 + on bynars: funtask2 :1428 out.fits)RP( +The socket mechanism thus supports simple parallel processing using +)BD(process decomposition)ES(. Note that parallel processing using +)BD(data decomposition)ES( is supported via the )BD(section)ES( specifier \201see +below\202, and the )BD(row#)ES( specifier, which is part of +)0 52 1 A(Table Filtering)52 0 TN TL()Ec /AF f D(. + +)0 P(A file also can be a pointer to shared memory using the syntax: +) 1 22 PR( shm:[id|@key][:size])RP( +A shared memory segment is specified with a )BD(shm:)ES( prefix, +followed by either the shared memory id or the shared memory key +\201where the latter is prefixed by the '@' character\202. The size \201in +bytes\202 of the shared memory segment can then be appended \201preceded by +the ':' character\202. If the size specification is absent, the code will +attempt to determine the length automatically. + +If the open mode contains the string "w+", then the memory segment will be +created if it does not exist. \201It also will be released and deleted when the +file is closed.\202 In the case where a memory segment is being created, the +length of the segment is required. + +)0 P(A file also can be Unix piped command \201i.e. a program to run\202 using the syntax: +) 1 31 PR( "pipe: command arg1 ... argn")RP( +The output from the command must be a valid FITS file. It is important +to use quotes to protect spaces so that command arguments are passed +correctly. A silly example is: +) 1 60 PR( fundisp "pipe: funtable 'foo.fits[cir 512 512 .1]' stdout")RP( +This seemed like a good idea at the time ... + +)0 2 63 H(Lists)WB 131 Sn()WB 51 Sn( of Files)EA()EH( + +)0 P(Funtools also will process a list of files as a single file using the +syntax: +) 1 31 PR( "list: file1 file2 ... filen")RP( +The files in the list are separated by whitespace. Any of the +above file types can be used. For example, if two files, foo1.fits and +foo2.fits, are part of the same observation, they can be processed as +a single file \201using their own filters\202: +) 17 77 PR( fundisp "list: foo1.fits[cir\201512,512,10\202] foo2.fits[cir\201511,511,10\202]" + X Y PHA PI TIME DX DY + -------- -------- -------- -------- --------------------- -------- -------- + 512 512 6 7 79493997.45854475 578 574 + 512 512 8 9 79494575.58943175 579 573 + 512 512 5 6 79493631.03866175 578 575 + 512 512 5 5 79493290.86521725 578 575 + 512 512 8 9 79493432.00990875 579 573 + 511 511 5 5 79488631.09462625 580 575 + 511 511 10 11 79488780.60006675 580 573 + 511 511 4 4 79494562.35474326 580 575 + 511 511 6 6 79488203.01561825 580 575 + 511 511 6 6 79488017.99730176 580 575 + 511 511 4 4 79494332.45355175 580 575 + 511 511 9 10 79492685.94014275 581 574 + 511 511 5 5 79487708.71298325 580 575 + 511 511 8 9 79493719.00160225 581 573)RP( +Again, note that it is important to avoid spaces in the filters +because the list separator also is whitespace. To protect whitespace +in a filter, enclose the file specification in quotes: +) 1 72 PR( fundisp "list: 'foo1.fits[cir 512 512 .1]' foo2.fits[cir\201511,511,.1\202]")RP( + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 64 H(Last)WB 132 Sn( updated: February 15, 2006)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (text.html) D +/Ti (Column-based Text Files) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 47 Sn( + + +)0 2 65 H(Funtext:)WB 134 Sn()WB 133 Sn( Support for Column-based Text Files)EA()EH( + + +)0 2 66 H(Summary)WB 135 Sn()EH( +)0 P(This document contains a summary of the options for processing column-based +text files. + + +)0 2 67 H(Description)WB 136 Sn()EH( + +)0 P(Funtools will automatically sense and process "standard" +column-based text files as if they were FITS binary tables without any +change in Funtools syntax. In particular, you can filter text files +using the same syntax as FITS binary tables: +) 3 54 PR( fundisp foo.txt'[cir 512 512 .1]' + fundisp -T foo.txt > foo.rdb + funtable foo.txt'[pha=1:10,cir 512 512 10]' foo.fits)RP( + +)0 P(The first example displays a filtered selection of a text file. The +second example converts a text file to an RDB file. The third example +converts a filtered selection of a text file to a FITS binary table. + +)0 P(Text files can also be used in Funtools image programs. In this case, +you must provide binning parameters \201as with raw event files\202, using +the bincols keyword specifier: + +) 1 75 PR( bincols=\201[xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]])RP( + +For example: +) 1 64 PR( funcnts foo'[bincols=\201x:1024,y:1024\202]' "ann 512 512 0 10 n=10")RP( + +)0 2 68 H(Standard)WB 137 Sn( Text Files)EH( + +)0 P(Standard text files have the following characteristics: + +)UL()-1 LI( Optional comment lines start with # +)-1 LI( Optional blank lines are considered comments +)-1 LI( An optional table header consists of the following \201in order\202: +)UL( )-1 LI( a single line of alpha-numeric column names + )-1 LI( an optional line of unit strings containing the same number of cols + )-1 LI( an optional line of dashes containing the same number of cols)LU( +)-1 LI( Data lines follow the optional header and \201for the present\202 consist of + the same number of columns as the header. +)-1 LI( Standard delimiters such as space, tab, comma, semi-colon, and bar.)LU( + +)0 P(Examples: + +) 26 46 PR( # rdb file + foo1 foo2 foo3 foos + ---- ---- ---- ---- + 1 2.2 3 xxxx + 10 20.2 30 yyyy + + # multiple consecutive whitespace and dashes + foo1 foo2 foo3 foos + --- ---- ---- ---- + 1 2.2 3 xxxx + 10 20.2 30 yyyy + + # comma delims and blank lines + foo1,foo2,foo3,foos + + 1,2.2,3,xxxx + 10,20.2,30,yyyy + + # bar delims with null values + foo1|foo2|foo3|foos + 1||3|xxxx + 10|20.2||yyyy + + # header-less data + 1 2.2 3 xxxx + 10 20.2 30 yyyy)RP( + +)0 P(The default set of token delimiters consists of spaces, tabs, commas, +semi-colons, and vertical bars. Several parsers are used +simultaneously to analyze a line of text in different ways. One way +of analyzing a line is to allow a combination of spaces, tabs, and +commas to be squashed into a single delimiter \201no null values between +consecutive delimiters\202. Another way is to allow tab, semi-colon, and +vertical bar delimiters to support null values, i.e. two consecutive +delimiters implies a null value \201e.g. RDB file\202. A successful parser +is one which returns a consistent number of columns for all rows, with +each column having a consistent data type. More than one parser can +be successful. For now, it is assumed that successful parsers all +return the same tokens for a given line. \201Theoretically, there are +pathological cases, which will be taken care of as needed\202. Bad parsers +are discarded on the fly. + +)0 P(If the header does not exist, then names "col1", "col2", etc. are +assigned to the columns to allow filtering. Furthermore, data types +for each column are determined by the data types found in the columns +of the first data line, and can be one of the following: string, int, +and double. Thus, all of the above examples return the following +display: +) 4 58 PR( fundisp foo'[foo1>5]' + FOO1 FOO2 FOO3 FOOS + ---------- --------------------- ---------- ------------ + 10 20.20000000 30 yyyy)RP( + +)0 2 69 H(Comments)WB 138 Sn( Convert to Header Params)EH( + +)0 P(Comments which precede data rows are converted into header parameters and +will be written out as such using funimage or funhead. Two styles of comments +are recognized: + +)0 P(1. FITS-style comments have an equal sign "=" between the keyword and +value and an optional slash "/" to signify a comment. The strict FITS +rules on column positions are not enforced. In addition, strings only +need to be quoted if they contain whitespace. For example, the following +are valid FITS-style comments: + +) 5 55 PR( # fits0 = 100 + # fits1 = /usr/local/bin + # fits2 = "/usr/local/bin /opt/local/bin" + # fits3c = /usr/local/bin /opt/local/bin /usr/bin + # fits4c = "/usr/local/bin /opt/local/bin" / path dir)RP( + +Note that the fits3c comment is not quoted and therefore its value is the +single token "/usr/local/bin" and the comment is "opt/local/bin /usr/bin". +This is different from the quoted comment in fits4c. + +)0 P(2. Free-form comments can have an optional colon separator between the +keyword and value. In the absence of quote, all tokens after the +keyword are part of the value, i.e. no comment is allowed. If a string +is quoted, then slash "/" after the string will signify a comment. +For example: + +) 9 54 PR( # com1 /usr/local/bin + # com2 "/usr/local/bin /opt/local/bin" + # com3 /usr/local/bin /opt/local/bin /usr/bin + # com4c "/usr/local/bin /opt/local/bin" / path dir + + # com11: /usr/local/bin + # com12: "/usr/local/bin /opt/local/bin" + # com13: /usr/local/bin /opt/local/bin /usr/bin + # com14c: "/usr/local/bin /opt/local/bin" / path dir)RP( + +)0 P(Note that com3 and com13 are not quoted, so the whole string is part of +the value, while comz4c and com14c are quoted and have comments following +the values. + +)0 P(Some text files have column name and data type information in the header. +You can specify the format of column information contained in the +header using the "hcolfmt=" specification. See below for a detailed +description. + +)0 2 70 H(Multiple)WB 139 Sn( Tables in a Single File)EH( + +)0 P( +Multiple tables are supported in a single file. If an RDB-style file +is sensed, then a ^L \201vertical tab\202 will signify end of +table. Otherwise, an end of table is sensed when a new header \201i.e., +all alphanumeric columns\202 is found. \201Note that this heuristic does not +work for single column tables where the column type is ASCII and the +table that follows also has only one column.\202 You also can specify +characters that signal an end of table condition using the )BD(eot=)ES( +keyword. See below for details. + +)0 P(You can access the nth table \201starting from 1\202 in a multi-table file +by enclosing the table number in brackets, as with a FITS extension: + +) 1 18 PR( fundisp foo'[2]')RP( +The above example will display the second table in the file. +\201Index values start at 1 in oder to maintain logical compatibility +with FITS files, where extension numbers also start at 1\202. + + +)0 2 71 H(TEXT\201\202)WB 140 Sn( Specifier)EH( + +)0 P(As with ARRAY\201\202 and EVENTS\201\202 specifiers for raw image arrays and raw +event lists respectively, you can use TEXT\201\202 on text files to pass +key=value options to the parsers. An empty set of keywords is +equivalent to not having TEXT\201\202 at all, that is: + +) 2 23 PR( fundisp foo + fundisp foo'[TEXT\201\202]')RP( + +are equivalent. A multi-table index number is placed before the TEXT\201\202 +specifier as the first token, when indexing into a multi-table: + + fundisp foo'[2,TEXT\201...\202]' + +)0 P(The filter specification is placed after the TEXT\201\202 specifier, separated +by a comma, or in an entirely separate bracket: + +) 2 47 PR( fundisp foo'[TEXT\201...\202,circle 512 512 .1]' + fundisp foo'[2,TEXT\201...\202][circle 512 512 .1]')RP( + +)0 2 72 H(Text\201\202)WB 141 Sn( Keyword Options)EH( + +)0 P( +The following is a list of keywords that can be used within the TEXT\201\202 +specifier \201the first three are the most important\202: + +)0 DL( +)0 P()0 DT( delims="[delims]" +)DD(Specify token delimiters for this file. Only a single parser having these +delimiters will be used to process the file. +) 2 40 PR( fundisp foo.fits'[TEXT\201delims="!"\202]' + fundisp foo.fits'[TEXT\201delims="\200t%"\202]')RP( + +)0 P()0 DT( comchars="[comchars]" +)DD( Specify comment characters. You must include "\200n" to allow blank lines. +These comment characters will be used for all standard parsers \201unless delims +are also specified\202. +) 1 42 PR( fundisp foo.fits'[TEXT\201comchars="!\200n"\202]')RP( + +)0 P()0 DT( cols="[name1:type1 ...]" +)DD( Specify names and data type of columns. This overrides header +names and/or data types in the first data row or default names and +data types for header-less tables. +) 1 70 PR( fundisp foo.fits'[TEXT\201cols="x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e"\202]')RP( +)0 P(If the column specifier is the only keyword, then the cols= is not +required \201in analogy with EVENTS\201\202\202: +) 1 63 PR( fundisp foo.fits'[TEXT\201x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e\202]')RP( +Of course, an index is allowed in this case: +) 1 65 PR( fundisp foo.fits'[2,TEXT\201x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e\202]')RP( + +)0 P()0 DT( eot="[eot delim]" +)DD( Specify end of table string specifier for multi-table files. RDB +files support ^L. The end of table specifier is a string and the whole +string must be found alone on a line to signify EOT. For example: +) 1 37 PR( fundisp foo.fits'[TEXT\201eot="END"\202]')RP( +will end the table when a line contains "END" is found. Multiple lines +are supported, so that: +) 1 43 PR( fundisp foo.fits'[TEXT\201eot="END\200nGAME"\202]')RP( +will end the table when a line contains "END" followed by a line +containing "GAME". +)0 P(In the absence of an EOT delimiter, a new table will be sensed when a new +header \201all alphanumeric columns\202 is found. + +)0 P()0 DT( null1="[datatype]" +)DD( Specify data type of a single null value in row 1. +Since column data types are determined by the first row, a null value +in that row will result in an error and a request to specify names and +data types using cols=. If you only have a one null in row 1, you don't +need to specify all names and columns. Instead, use null1="type" to +specify its data type. + +)0 P()0 DT( alen=[n] +)DD(Specify size in bytes for ASCII type columns. +FITS binary tables only support fixed length ASCII columns, so a +size value must be specified. The default is 16 bytes. + +)0 P()0 DT( nullvalues=["true"|"false"] +)DD(Specify whether to expect null values. +Give the parsers a hint as to whether null values should be allowed. The +default is to try to determine this from the data. + +)0 P()0 DT( whitespace=["true"|"false"] +)DD( Specify whether surrounding white space should be kept as part of +string tokens. By default surrounding white space is removed from +tokens. + +)0 P()0 DT( header=["true"|"false"] +)DD(Specify whether to require a header. This is needed by tables +containing all string columns \201and with no row containing dashes\202, in +order to be able to tell whether the first row is a header or part of +the data. The default is false, meaning that the first row will be +data. If a row dashes are present, the previous row is considered the +column name row. + +)0 P()0 DT( units=["true"|"false"] +)DD(Specify whether to require a units line. +Give the parsers a hint as to whether a row specifying units should be +allowed. The default is to try to determine this from the data. + +)0 P()0 DT( i2f=["true"|"false"] +)DD(Specify whether to allow int to float conversions. +If a column in row 1 contains an integer value, the data type for that +column will be set to int. If a subsequent row contains a float in +that same column, an error will be signaled. This flag specifies that, +instead of an error, the float should be silently truncated to +int. Usually, you will want an error to be signaled, so that you can +specify the data type using cols= \201or by changing the value of +the column in row 1\202. + +)0 P()0 DT( comeot=["true"|"false"|0|1|2] +)DD(Specify whether comment signifies end of table. +If comeot is 0 or false, then comments do not signify end of table and +can be interspersed with data rows. If the value is true or 1 \201the +default for standard parsers\202, then non-blank lines \201e.g. lines +beginning with '#'\202 signify end of table but blanks are allowed +between rows. If the value is 2, then all comments, including blank +lines, signify end of table. + +)0 P()0 DT( lazyeot=["true"|"false"] +)DD(Specify whether "lazy" end of table should be permitted \201default is +true for standard formats, except rdb format where explicit ^L is required +between tables\202. A lazy EOT can occur when a new table starts directly +after an old one, with no special EOT delimiter. A check for this EOT +condition is begun when a given row contains all string tokens. If, in +addition, there is a mismatch between the number of tokens in the +previous row and this row, or a mismatch between the number of string +tokens in the prev row and this row, a new table is assumed to have +been started. For example: +) 9 20 PR( ival1 sval3 + ----- ----- + 1 two + 3 four + + jval1 jval2 tval3 + ----- ----- ------ + 10 20 thirty + 40 50 sixty)RP( +Here the line "jval1 ..." contains all string tokens. In addition, +the number of tokens in this line \2013\202 differs from the number of +tokens in the previous line \2012\202. Therefore a new table is assumed +to have started. Similarly: +) 9 20 PR( ival1 ival2 sval3 + ----- ----- ----- + 1 2 three + 4 5 six + + jval1 jval2 tval3 + ----- ----- ------ + 10 20 thirty + 40 50 sixty)RP( +Again, the line "jval1 ..." contains all string tokens. The number of +string tokens in the previous row \2011\202 differs from the number of +tokens in the current row\2013\202. We therefore assume a new table as been +started. This lazy EOT test is not performed if lazyeot is explicitly +set to false. + +)0 P()0 DT( hcolfmt=[header column format] +)DD( Some text files have column name and data type information in the header. +For example, VizieR catalogs have headers containing both column names +and data types: +) 3 95 PR( #Column e_Kmag \201F6.3\202 ?\201k_msigcom\202 K total magnitude uncertainty \2014\202 [ucd=ERROR] + #Column Rflg \201A3\202 \201rd_flg\202 Source of JHK default mag \2016\202 [ucd=REFER_CODE] + #Column Xflg \201I1\202 [0,2] \201gal_contam\202 Extended source contamination \20110\202 [ucd=CODE_MISC])RP( + +while Sextractor files have headers containing column names alone: + +) 4 79 PR( # 1 X_IMAGE Object position along x [pixel] + # 2 Y_IMAGE Object position along y [pixel] + # 3 ALPHA_J2000 Right ascension of barycenter \201J2000\202 [deg] + # 4 DELTA_J2000 Declination of barycenter \201J2000\202 [deg])RP( +The hcolfmt specification allows you to describe which header lines +contain column name and data type information. It consists of a string +defining the format of the column line, using "$col" \201or "$name"\202 to +specify placement of the column name, "$fmt" to specify placement of the +data format, and "$skip" to specify tokens to ignore. You also can +specify tokens explicitly \201or, for those users familiar with how +sscanf works, you can specify scanf skip specifiers using "%*"\202. +For example, the VizieR hcolfmt above might be specified in several ways: +) 3 67 PR( Column $col \201$fmt\202 # explicit specification of "Column" string + $skip $col \201$fmt\202 # skip one token + %*s $col \201$fmt\202 # skip one string \201using scanf format\202)RP( +while the Sextractor format might be specified using: +) 2 59 PR( $skip $col # skip one token + %*d $col # skip one int \201using scanf format\202)RP( +You must ensure that the hcolfmt statement only senses actual column +definitions, with no false positives or negatives. For example, the +first Sextractor specification, "$skip $col", will consider any header +line containing two tokens to be a column name specifier, while the +second one, "%*d $col", requires an integer to be the first token. In +general, it is preferable to specify formats as explicitly as +possible. + +)0 P(Note that the VizieR-style header info is sensed automatically by the +funtools standard VizieR-like parser, using the hcolfmt "Column $col +\201$fmt\202". There is no need for explicit use of hcolfmt in this case. + +)0 P()0 DT( debug=["true"|"false"] +)DD(Display debugging information during parsing. +)LD( + +)0 2 73 H(Environment)WB 142 Sn( Variables)EH( + +)0 P( +Environment variables are defined to allow many of these TEXT\201\202 values to be +set without having to include them in TEXT\201\202 every time a file is processed: + +) 10 36 PR( keyword environment variable + ------- -------------------- + delims TEXT_DELIMS + comchars TEXT_COMCHARS + cols TEXT_COLUMNS + eot TEXT_EOT + null1 TEXT_NULL1 + alen TEXT_ALEN + bincols TEXT_BINCOLS + hcolfmt TEXT_HCOLFMT)RP( + +)0 2 74 H(Restrictions)WB 143 Sn( and Problems)EH( + +)0 P( +As with raw event files, the '+' \201copy extensions\202 specifier is not +supported for programs such as funtable. + +)0 P(String to int and int to string data conversions are allowed by the +text parsers. This is done more by force of circumstance than by +conviction: these transitions often happens with VizieR catalogs, +which we want to support fully. One consequence of allowing these +transitions is that the text parsers can get confused by columns which +contain a valid integer in the first row and then switch to a +string. Consider the following table: +) 4 20 PR( xxx yyy zzz + ---- ---- ---- + 111 aaa bbb + ccc 222 ddd)RP( +The xxx column has an integer value in row one a string in row two, +while the yyy column has the reverse. The parser will erroneously +treat the first column as having data type int: +) 5 38 PR( fundisp foo.tab + XXX YYY ZZZ + ---------- ------------ ------------ + 111 'aaa' 'bbb' + 1667457792 '222' 'ddd')RP( +while the second column is processed correctly. This situation can be avoided +in any number of ways, all of which force the data type of the first column +to be a string. For example, you can edit the file and explicitly quote the +first row of the column: +) 10 40 PR( xxx yyy zzz + ---- ---- ---- + "111" aaa bbb + ccc 222 ddd + + [sh] fundisp foo.tab + XXX YYY ZZZ + ------------ ------------ ------------ + '111' 'aaa' 'bbb' + 'ccc' '222' 'ddd')RP( +You can edit the file and explicitly set the data type of the first column: +) 10 40 PR( xxx:3A yyy zzz + ------ ---- ---- + 111 aaa bbb + ccc 222 ddd + + [sh] fundisp foo.tab + XXX YYY ZZZ + ------------ ------------ ------------ + '111' 'aaa' 'bbb' + 'ccc' '222' 'ddd')RP( +You also can explicitly set the column names and data types of all columns, +without editing the file: +) 5 52 PR( [sh] fundisp foo.tab'[TEXT\201xxx:3A,yyy:3A,zzz:3a\202]' + XXX YYY ZZZ + ------------ ------------ ------------ + '111' 'aaa' 'bbb' + 'ccc' '222' 'ddd')RP( +The issue of data type transitions \201which to allow and which to disallow\202 +is still under discussion. + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 75 H(Last)WB 144 Sn( updated: August 3, 2007)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (view.html) D +/Ti (Database View Support for Tables) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 48 Sn( + + +)0 2 76 H(Funview:)WB 146 Sn()WB 145 Sn( Database View Support for Tables)EA()EH( + + +)0 2 77 H(Summary)WB 147 Sn()EH( +)0 P(This document contains a summary of the options for utilizing +database-inspired Views of tables. + + +)0 2 78 H(Description)WB 148 Sn()EH( + +)0 2 79 H(Database)WB 149 Sn( Views)EH( +)0 P(In database parlance, a )BD(View)ES( defines a "virtual table", i.e., +a description of row and/or column selection filters \201but with no +permanent storage space allocated\202. When used in place of a table, a +View selects the specified rows and/or columns from one or more real +tables. Views enable you to see complicated data tables in a more +convenient format. They also can be used as a security mechanism, by +restricting user access to specific columns and/or rows. [See: +) 1 72 PR(http://www.cs.unibo.it/~ciaccia/COURSES/RESOURCES/SQLTutorial/sqlch5.htm)RP( +for a good discussion of SQL Views.] + +)0 P(Funtools supports an expanded notion of Views for all tabular data +\201FITS tables, raw binary tables, and ASCII column files\202. Funtools +Views allow you to pre-set values for the filter specification, the +columns to activate, and display format \201though the latter is for +fundisp only\202. Setting the filter and column activation values +provides functionality equivalent to that of a classical database +View, while the ability to set the format is similar to classical +report writing capabilities. + +)0 2 80 H(Funtools)WB 150 Sn( View Attributes)EH( +)0 P(A Funtools View is a text file containing one or more of the following +columns: +) 7 46 PR( column description + ------ ----------------------------- + view name of view + file data file name or template + filter filter specification + columns columns to activate + format fundisp format specification)RP( +All of the attribute columns are optional, including +the )BD(view)ES( name itself. This means that a View can be named or +unnamed. Unnamed Views can refer to a specific file or a template of +files \201obviously if neither the view or the file column is specified, +the input View specification will never be used\202. You can specify any +combination of filter, column, and format parameters. \201It also is +possible to apply file-specific View to other files; see the discussion +on )BD(View Lists)ES( below\202. Each column has a size limit of 1024 characters. + +)0 P(For example, consider the following View file: +) 13 70 PR( view file format columns filter + ---- ---------------------- ------ ------------ ------- + x3 ${HOME}/data/snr.ev I=%4d x y pi pha cir 512 512 .1 + x2 ${HOME}/data/snr.ev x y pi pha cir 512 512 .1 + x1 ${HOME}/data/snr.ev cir 512 512 .1 + x1a ${HOME}/data/snr.ev x y pi pha + x0 ${HOME}/data/snr.ev + xf I=%4d + xc x y pi pha + xr cir 512 512 .1 + *.ev x y pi pha + *.fit x y dx dy cir 400 400 3 + *.fits I=%3d x y dx dy cir 400 400 3)RP( +This database example is in rdb format, i.e. using tab delimiters and +permitting null values. Any valid ASCII table format is acceptable, +but if you use a format that does not permit null values, it will be +necessary to quote the null strings. + +)0 P(The first five entries \201x3, x2, x1, x1a, x0\202 are named entries defining +default values specifically for the snr.ev data file. Typically, you +would use these Views by specifying View name, and the corresponding +file, filter, column, and format values would be used. Note that the x0 +View is essentially an alias for the pathname of this file. + +)0 P(The next three entries define defaults that can be applied to any +file. You typically would use these View names in conjunction with +a specific file name \201see )BD(View Lists)ES( below\202 so that the associated +parameter\201s\202 were applied to that file. + +)0 P(The last three entry in the database define unnamed Views that +pertains to all files ending with the specified templates. In these +cases, any View that specifies a file name matching the file template +would be processed with the associated parameter attributes. + +)0 2 81 H(Invoking)WB 151 Sn( a Funtools View \201in Place of an Input File\202)EH( +)0 P(To use a Funtools View, you simply pre-pend the "v:" prefix to a View name or +a file name where an input file name usually is specified. For example: +) 1 14 PR( fundisp v:x3)RP( +specifies that the View named x3 \201with its file name and associated +parameters\202 is processed as the input file to fundisp. Using the +example database, above, this is equivalent to: +) 1 73 PR( fundisp -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]' "x y pi pha")RP( +That is, the format is used with fundisp's -f \201format\202 switch, while the +filename and extension are composed of the x3 View's filename and +region filter. + +)0 P(Similarly, executing a command such as: +) 1 19 PR( fundisp v:foo.fit)RP( +will match the unnamed View associated with the template "*.fit". +This is equivalent to executing: +) 1 46 PR( fundisp foo.fit'[cir 400 400 3]' "x y dx dy")RP( +Of course, if you omit the "v:" prefix, then no View processing takes place: +) 2 66 PR( fundisp foo.fit # process foo.fit without any View parameters + fundisp x3 # error \201assuming there is no file named x3\202)RP( + +)0 2 82 H(Basic)WB 152 Sn( View Matching Rules)EH( + +)0 P(When a "v:" prefix is recognized, Funtools searches for a View database +file in the following order: +) 5 59 PR( location description + ------------ ------------------------------------ + FUN_VIEWFILE environment variable \201any file name\202 + ./.funtools.vu hidden file, default name + $HOME/.funtools.vu hidden file, default name)RP( +The first View database file located is used to construct a new +filename, as well as an activation column specification and a format +specification. The following rules are used: + +)0 P(1. An attempt is made to match the input name \201i.e., the part of the +input View after the "v:" prefix\202 against the )BD(view)ES( column value +\201if present\202 of each row in the database. If a match is found, the +values of all non-blank columns are saved for later use. Also note +that the first match terminates the search: i.e., )BD(the order of the +database rows matters)ES(. + +)0 P(2. If no )BD(view)ES( match is made, an attempt is made to match the input +name against the )BD(file)ES( column value \201if present\202. Matching is +performed on the full pathname of both the input name and the +database file name, and on the non-directory \201root\202 part of these +files. This means that the root specification: +) 1 18 PR( fundisp v:snr.ev)RP( +will match a row in the database that has a full pathname in the file, +allowing you to use a )BD(file)ES(-matched View without having to +specify the full pathname. In this example, the "v:snr.ev" View +specification will match the first row \201v:x3\202 in the database: +) 1 67 PR( x3 ${HOME}/data/snr.ev I=%4d x y pi pha cir 512 512 .1)RP( +even though the row contains a fully qualified pathname as the file +value. Once again, values of all non-blank columns are saved, and the +first match terminates the search. + +)0 P(3. If neither a )BD(view)ES( or a )BD(view)ES( match has been found, +then a simple template match is attempted against the )BD(view)ES( +values. Template matching supports a simplified version of file +globbing \201not a regular expression\202, with support for a single "*" +\201all characters\202, "?" \201single character\202, or "[...]" \201range\202 specification. + +)0 P(4. If no template match was found on the )BD(view)ES( column, then a +simple template match is attempted against the )BD(file)ES( columns. + +)0 P(5. If no match is found, then the filename \201minus the "v:" prefix\202 is +returned. + +)0 2 83 H(More)WB 153 Sn( on View Matching Rules: Single vs. Multiple Matches )EH( + +The matching rules described above stop after the first match, +regardless of whether that match provides values for all three +parameters \201filter, columns, and format\202. In cases where a )BD(view)ES( +or )BD(file)ES( match does not provide all three values, it is possible +that a template match might do so. With regard to the example View +database above, the x1 View provides only a filter, while omitting +both the format and columns values. But note that the final rows in +the database could provide the values via a template match on the +filename. This sort of multiple matching is especially valuable in +order to provide "global" values to several Views. + +)0 P(Obviously, multiple matching might not be wanted in every +case. Therefore, we support both multiple matching and single matching +according to the value of the FUN_VIEWMATCH environment variable. If +the FUN_VIEWMATCH environment variable exists and if its value begins +with "s", then a single match is used and missing parameters are not +filled in with subsequent template matches on the file name. That is, +matching rules above are followed exactly as explained above. If the +value of this environment variable begins with "m" \201or does not exist\202, +then multiple matches are used to try to fill in missing parameters. +In this case, template matching always takes place and missing values are +taken from these template matches. + +)0 P(Thus, in the example above, the View specification: +) 1 14 PR( fundisp v:x1)RP( +will take the file name and filter value from the x1 View: +) 1 70 PR( x1 ${HOME}/data/snr.ev cir 512 512 .1)RP( +The column value then will be taken from the "*.ev" file template match +against the x1 file name: +) 1 52 PR( *.ev x y pi pha)RP( +Note once again that order is important: missing values are taken in the +order in which the template matches are processed. + +)0 2 84 H(View)WB 154 Sn( Lists: Applying a View to Any File)EH( + +)0 P(It is possible to apply a named View, or even several Views, to any +data file by appending a )BD(viewlist)ES( immediately after the standard "v:" +prefix. A viewlist takes the form: +) 1 15 PR( :v1,v2,...vn:)RP( +where v1, v2, etc. are named Views. The two ":" colon characters surrounding +the list are required. Thus, the syntax for applying a viewlist to a file is: +) 1 34 PR( v::view1,view2,...viewn:filename)RP( +Note that the name after the last ":" is assumed to be a file; it is +not permissible \201or sensible\202 to use a View name. + +)0 P(For example, the View specification: +) 1 19 PR( fundisp v::x2:foo)RP( +applies the x2 View to the file foo \201even if there is a View named foo\202 +and \201in using our example database\202 is equivalent to: +) 1 45 PR( ./fundisp foo'[cir 512 512 .1] "x y pi pha")RP( +The same command can be effected using a list of Views: +) 1 23 PR( fundisp v::x1,x1a:foo)RP( + +)0 P(What happens if a viewlist is used and the file also matches a +template? Consider, for example, this View specification: +) 1 23 PR( fundisp v::x2:foo.fit)RP( +Here, the x2 View will supply filter and column values, while the +template *.fit can also supply \201different\202 filter and column +values. In this case, the explicitly specified Views of the viewlist +trump the matched view values. + +)0 P(On the other hand, if a file template match can supply a View value +that is not supplied by the viewlist, then that value will be taken +from the file template match. For example: +) 1 24 PR( fundisp v::x2:foo.fits)RP( +does not explicitly supply a format value, but the file match on *.fits +can and does. You can avoid supplying missing values using file template +matching by replacing the first ":" with a "-" in a viewlist +specification: +) 1 24 PR( fundisp v:-x2:foo.fits)RP( +The use of ":+" to explicitly allow file template matching is also +supported, but is the same as the default case. Note that the nuances +of viewlist support are subject to change as our experience and +understanding grow. + +)0 2 85 H(Overriding)WB 155 Sn( Values Associated with a View)EH( + +)0 P(To override values associated with a View, simply supply the override +values in the correct place on the command line. Thus, given +the example database described above, the command: +) 1 14 PR( fundisp v:x3)RP( +specifies that the View named x3, along with its file name and +associated parameters, be processed as the input file to fundisp in +this way: +) 1 73 PR( fundisp -f "I=%4d" ${HOME}/data/snr.ev'[cir 512 512 .1]' "x y pi pha")RP( +To override one or more of these values, simply specify a new value +for the format, filter, or columns. For example, if your input View file +contains a filter, then the View will use that filter as an override +of the View filter: +) 1 31 PR( fundisp v:x3'[cir 400 400 3]')RP( +will use the columns and format of the x3 View but not the x3 filter. Further +examples are: +) 2 67 PR( fundisp v:x3 "x y dx dy" # activate a different set of columns + fundisp -f "I=%3d" v:x3 # use a different format statement)RP( + +)0 P(Note that extension names, extension index values, and other +non-filter specifications )BD(do not)ES( override the View +filter. Thus: +) 1 22 PR( fundisp v:foo.fit[3])RP( +will still use the filter associated with the .fit template \201see above\202, since +the "3" is an extension index, not a filter. + +)0 2 86 H(Environment)WB 156 Sn( Variables)EH( + +The following environment variables are used by Funtools Views: +)0 DL()0 DT()BD(FUN_VIEWNAME)ES( +)DD( The )BD(FUN_VIEWNAME)ES( environment variable specifies the +name and location of the View database file. If not present, the +files ./.funtools.vu and $HOME/.funtools.vu are searched for, in +that order. + +)0 DT()BD(FUN_VIEWMATCH)ES( +)DD( The )BD(FUN_VIEWMATCH)ES( environment variable specifies whether a +single match or multiple match algorithm is used to locate parameter +values. If the value of this environment variable begins with "s", +then a single match is used and missing parameters are not filled in +with subsequent template matches on the file name. If the value begins +with "m", then multiple matches are used to try to fill in missing +parameters. The default is to use multiple matches.)LD( + +)0 2 87 H(Restrictions)WB 157 Sn( and Problems)EH( + +Support for overriding a filter \201while not overriding extension names, +extension indexes, etc.\202 requires that we can sense the presence of a +filter in a bracket specification. It is unclear yet whether our +algorithm is perfect. + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 88 H(Last)WB 158 Sn( updated: August 3, 2007)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (filters.html) D +/Ti (Table Filtering) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 52 Sn( + + +)0 2 89 H(Funfilters:)WB 165 Sn()WB 159 Sn( Filtering Rows in a Table)EA()EH( + + +)0 2 90 H(Summary)WB 166 Sn()EH( +)0 P(This document contains a summary of the user interface for +filtering rows in binary tables. + + +)0 2 91 H(Description)WB 167 Sn()EH( +)0 P(Table filtering allows a program to select rows from an table \201e.g., +X-ray event list\202 by checking each row against one or more expressions +involving the columns in the table. When a table is filtered, only +valid rows satisfying these expressions are passed through for processing. + +)0 P(A filter expression is specified using bracket notation appended to +the filename of the data being processed: +) 1 23 PR( foo.fits[pha==1&)SY(\160)ES(==2])RP( +It is also possible to put region specification inside a file and +then pass the filename in bracket notation: +) 1 19 PR( foo.fits[@my.reg])RP( +Filters must be placed after the extension and image section +information, when such information is present. The correct order is: +)UL()-1 LI( file[fileinfo,sectioninfo][filters] +)-1 LI( file[fileinfo,sectioninfo,filters])LU( +where: +)UL()-1 LI( )BD(file)ES( is the Funtools file name +)-1 LI( )BD(fileinfo)ES( is an ARRAY, EVENT, FITS extension, or FITS index +)-1 LI( )BD(sectioninfo)ES( is the image section to extract +)-1 LI( )BD(filters)ES( are spatial region and table \201row\202 filters to apply)LU( +See )0 42 1 A(Funtools Files)42 0 TN TL()Ec /AF f D( for more information +on file and image section specifications. + +)0 2 92 H(Filter)WB 168 Sn( Expressions)EH( + +)0 P(Table filtering can be performed on columns of data in a FITS +binary table or a raw event file. Table filtering is accomplished by +means of )BD(table filter specifications)ES(. An table filter +specification consists of one or more )BD(filter expressions)ES( Filter +specifications also can contain comments and local/global processing +directives. + +)0 P(More specifically, a filter specification consist of one or more lines +containing: +) 13 75 PR( # comment until end of line + # include the following file in the table descriptor + @file + # each row expression can contain filters separated by operators + [filter_expression] BOOLOP [filter_expression2], ... + # each row expression can contain filters separated by the comma operator + [filter_expression1], [filter_expression2], ... + # the special row# keyword allows a range of rows to be processed + row#=m:n + # or a single row + row#=m + # regions are supported -- but are described elsewhere + [spatial_region_expression])RP( + +)0 P(A single filter expression consists of an arithmetic, logical, or +other operations involving one or more column values from a +table. Columns can be compared to other columns, to header values, +or to numeric constants. Standard math functions can be applied to +columns. Separate filter expressions can be combined using boolean operators. +Standard C semantics can be used when constructing expressions, with +the usual precedence and associativity rules holding sway: +) 15 55 PR( Operator Associativity + -------- ------------- + \201\202 left to right + !! \201logical not\202 right to left + ! \201bitwise not\202 - \201unary minus\202 right to left + * / left to right + + - left to right + < <= > >= left to right + == != left to right + & \201bitwise and\202 left to right + ^ \201bitwise exclusive or\202 left to right + | \201bitwise inclusive or\202 left to right + && \201logical and\202 left to right + || \201logical or\202 left to right + = right to left)RP( +For example, if energy and pha are columns in a table, +then the following are valid expressions: +) 4 24 PR( pha>1 + energy == pha + \201pha>1\202 && \201energy<=2\202 + max\201pha,energy\202>=2.5)RP( + +)0 P(Comparison values can be integers or floats. Integer comparison values can be +specified in decimal, octal \201using '0' as prefix\202, hex \201using '0x' as prefix\202 +or binary \201using '0b' as prefix\202. Thus, the following all specify the same +comparison test of a status mask: +) 4 40 PR( \201status & 15\202 == 8 # decimal + \201status & 017\202 == 010 # octal + \201status & 0xf\202 == 0x8 # hex + \201status & 0b1111\202 == 0b1000 # binary)RP( +)0 P(The special keyword row# allows you to process a range of rows. +When row# is specified, the filter code skips to the designated +row and only processes the specified number of rows. The +"*" character can be utilized as the high limit value to denote +processing of the remaining rows. Thus: +) 1 14 PR( row#=100:109)RP( +processes 10 rows, starting with row 100 \201counting from 1\202, +while: +) 1 12 PR( row#=100:*)RP( +specifies that all but the first 99 rows are to be processed. + +)0 P(Spatial region filtering allows a program to select regions of an +image or rows of a table \201e.g., X-ray events\202 using simple geometric +shapes and boolean combinations of shapes. For a complete description +of regions, see )0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D(. + +)0 2 93 H(Separators)WB 169 Sn()WB 160 Sn( Also Are Operators)EA()EH( +)0 P(As mentioned previously, multiple filter expressions can be specified +in a filter descriptor, separated by commas or new-lines. +When such a comma or new-line separator is used, the boolean AND operator +is automatically generated in its place. Thus and expression such as: +) 1 15 PR( pha==1,pi=2:4)RP( +is equivalent to: +) 1 26 PR( \201pha==1\202 && \201pi>=2&)SY(\160)ES(<=4\202)RP( +)0 P([Note that the behavior of separators is different for filter expressions +and spatial region expressions. The former uses AND as the operator, while +the latter user OR. See +)0 60 1 A(Combining Region and Table Filters)60 0 TN TL()Ec /AF f D( +for more information about these conventions and how they are treated +when combined.] + +)0 2 94 H(Range)WB 170 Sn()WB 161 Sn( Lists)EA()EH()0 P( +)0 P(Aside from the standard C syntax, filter expressions can make use of +IRAF-style )BD(range lists)ES( which specify a range of values. The +syntax requires that the column name be followed by an '=' sign, which +is followed by one or more comma-delimited range expressions of the form: +) 4 52 PR( col = vv # col == vv in range + col = :vv # col <= vv in range + col = vv: # col >= vv in range + col = vv1:vv2 # vv1 <= col <= vv2 in range)RP( +The vv's above must be numeric constants; the right hand side of a +range list cannot contain a column name or header value. +)0 P(Note that, unlike an ordinary comma separator, the comma separator used +between two or more range expressions denotes OR. Thus, when two or +more range expressions are combined with a comma separator, the resulting +expression is a shortcut for more complicated boolean logic. For example: +) 1 18 PR( col = :3,6:8,10:)RP( +is equivalent to: +) 1 47 PR( \201col<=3\202 || \201col>=6 && col <=8\202 || \201col >=10\202)RP( +Note also that the single-valued rangelist: +) 1 11 PR( col = val)RP( +is equivalent to the C-based filter expression: +) 1 12 PR( col == val)RP( +assuming, of course, that val is a numeric constant. + +)0 2 95 H(Math)WB 171 Sn()WB 162 Sn( Operations and Functions)EA()EH()0 P( +)0 P(It is permissible to specify C math functions as part of the filter syntax. +When the filter parser recognizes a function call, it automatically +includes the math.h and links in the C math library. Thus, it is +possible to filter rows by expressions such as these: +)UL()-1 LI(\201pi+pha\202>\2012+log\201pi\202-pha\202 +)-1 LI( min\201pi,pha\202*14>x +)-1 LI( max\201pi,pha\202==\201pi+1\202 +)-1 LI( feq\201pi,pha\202 +)-1 LI( div\201pi,pha\202>0)LU( +The function feq\201a,b\202 returns true \2011\202 if the difference between a and b +\201taken as double precision values\202 is less than approximately 10E-15. +The function div\201a,b\202 divides a by b, but returns NaN \201not a number\202 +if b is 0. It is a safe way to avoid floating point errors when +dividing one column by another. + +)0 2 96 H(Include)WB 172 Sn()WB 163 Sn( Files)EA()EH()0 P( +)0 P(The special )BD(@filename)ES( directive specifies an include file +containing filter expressions. This file is processed as part of +the overall filter descriptor: +) 1 23 PR( foo.fits[pha==1,@foo])RP( + +)0 2 97 H(Header)WB 173 Sn()WB 164 Sn( Parameters)EA()EH()0 P( +)0 P(The filter syntax supports comparison between a column value and a +header parameter value of a FITS binary tables \201raw event files have no +such header\202. The header parameters can be taken from the binary +table header or the primary header. For example, assuming there is a +header value MEAN_PHA in one of these headers, you can select photons +having exactly this value using: + +)UL()-1 LI( pha==MEAN_PHA)LU( + +)0 2 98 H(Examples)WB 174 Sn()EH( +)0 P(Table filtering is more easily described by means of examples. +Consider data containing the following table structure: +)UL()-1 LI( double TIME +)-1 LI( int X +)-1 LI( int Y +)-1 LI( short PI +)-1 LI( short PHA +)-1 LI( int DX +)-1 LI( int DY)LU( + +)0 P(Tables can be filtered on these columns using IRAF/QPOE range syntax or +any valid C syntax. The following examples illustrate the possibilities: +)0 DL( +)0 P()0 DT( pha=10 +)0 DT( pha==10 +)DD( select rows whose pha value is exactly 10 + +)0 P()0 DT( pha=10:50 +)DD( select rows whose pha value is in the range of 10 to 50 + +)0 P()0 DT( pha=10:50,100 +)DD( select rows whose pha value is in the range of 10 to 50 or is +equal to 100 + +)0 P()0 DT( pha>=10 && pha<=50 +)DD( select rows whose pha value is in the range of 10 to 50 + +)0 P()0 DT( pi=1,2&&pha>3 +)DD( select rows whose pha value is 1 or 2 and whose pi value is 3 + +)0 P()0 DT( pi=1,2 || pha>3 +)DD( select rows whose pha value is 1 or 2 or whose pi value is 3 + +)0 P()0 DT( pha==pi+1 +)DD( select rows whose pha value is 1 less than the pi value + +)0 P()0 DT( \201pha==pi+1\202 && \201time>50000.0\202 +)DD( select rows whose pha value is 1 less than the pi value +and whose time value is greater than 50000 + +)0 P()0 DT(\201pi+pha\202>20 +)DD( select rows in which the sum of the pi and pha values is greater +than 20 + +)0 P()0 DT( pi%2==1 +)DD( select rows in which the pi value is odd)LD( + +)0 P(Currently, integer range list limits cannot be specified in binary +notation \201use decimal, hex, or octal instead\202. Please contact us if +this is a problem. + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 99 H(Last)WB 175 Sn( updated: November 17, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (idx.html) D +/Ti (Table Filtering with Indexes) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 53 Sn( + + +)0 2 100 H(Funidx:)WB 177 Sn()WB 176 Sn( Using Indexes to Filter Rows in a Table)EA()EH( + + +)0 2 101 H(Summary)WB 178 Sn()EH( +)0 P(This document contains a summary of the user interface for +filtering rows in binary tables with indexes. + + +)0 2 102 H(Description)WB 179 Sn()EH( +)0 P(Funtools )0 52 1 A(Table Filtering)52 0 TN TL()Ec /AF f D( allows rows in a +table to be selected based on the values of one or more columns in the +row. Because the actual filter code is compiled on the fly, it is very +efficient. However, for very large files \201hundreds of Mb or larger\202, +evaluating the filter expression on each row can take a long time. Therefore, +funtools supports index files for columns, which are used automatically during +filtering to reduce dramatically the number of row evaluations performed. +The speed increase for indexed filtering can be an order of magnitude or +more, depending on the size of the file. + +)0 P(The )0 11 1 A(funindex)11 0 TN TL()Ec /AF f D( program creates an +index on one or more columns in a binary table. For example, to create an index +for the column pi in the file huge.fits, use: +) 1 23 PR( funindex huge.fits pi)RP( +This will create an index named huge_pi.idx. + +)0 P(When a filter expression is initialized for row evaluation, funtools +looks for an index file for each column in the filter expression. If +found, and if the file modification date of the index file is later +than that of the data file, then the index will be used to reduce the +number of rows that are evaluated in the filter. When +)0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D( is part of the +expression, the columns associated with the region are checked for index +files. + +)0 P(If an index file is not available for a given column, then in general, +all rows must be checked when that column is part of a filter +expression. This is not true, however, when a non-indexed column is +part of an AND expression. In this case, only the rows that pass the +other part of the AND expression need to be checked. Thus, in some cases, +filtering speed can increase significantly even if all columns are not +indexed. + +)0 P(Also note that certain types of filter expression syntax cannot make +use of indices. For example, calling functions with column names as +arguments implies that all rows must be checked against the function +value. Once again, however, if this function is part of an AND +expression, then a significant improvement in speed still is possible +if the other part of the AND expression is indexed. + +)0 P(For example, note below the dramatic speedup in searching a 1 Gb +file using an AND filter, even when one of the columns \201pha\202 has no +index: + +) 49 69 PR( time fundisp \200 + huge.fits'[idx_activate=0,idx_debug=1,pha=2348&&cir 4000 4000 1]' \200 + "x y pha" + x y pha + ---------- ----------- ---------- + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 42.36u 13.07s 6:42.89 13.7% + + time fundisp \200 + huge.fits'[idx_activate=1,idx_debug=1,pha=2348&&cir 4000 4000 1]' \200 + "x y pha" + x y pha + ---------- ----------- ---------- + idxeq: [INDEF] + idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352] + idxand\2011\202: INDEF [IDX_OR_SORT] )WR( + idxall\2011\202: [IDX_OR_SORT] + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 3999.48 4000.47 2348 + 1.55u 0.37s 1:19.80 2.4%)RP( + +When all columns are indexed, the increase in speed can be even more dramatic: +) 50 67 PR( time fundisp \200 + huge.fits'[idx_activate=0,idx_debug=1,pi=770&&cir 4000 4000 1]' \200 + "x y pi" + x y pi + ---------- ----------- ---------- + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 42.60u 12.63s 7:28.63 12.3% + + time fundisp \200 + huge.fits'[idx_activate=1,idx_debug=1,pi=770&&cir 4000 4000 1]' \200 + "x y pi" + x y pi + ---------- ----------- ---------- + idxeq: pi start=9473025,stop=9492240 => pi[ROW 9473025:9492240] + idxand sort: x[ROW 8037025:8070128] y[ROW 5757665:5792352] + idxor sort/merge: pi[ROW 9473025:9492240] [IDX_OR_SORT] )WR( + idxmerge\2015\202: [IDX_OR_SORT] pi[ROW] + idxall\2011\202: [IDX_OR_SORT] + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 3999.48 4000.47 770 + 1.67u 0.30s 0:24.76 7.9%)RP( + +)0 P(The miracle of indexed filtering \201and indeed, of any indexing\202 is the +speed of the binary search on the index, which is of order log2\201n\202 +instead of n. \201The funtools binary search method is taken from +http://www.tbray.org/ongoing/When/200x/2003/03/22/Binary, to whom +grateful acknowledgement is made.\202 This means that the larger the +file, the better the performance. Conversely, it also means that for +small files, using an index \201and the overhead involved\202 can slow +filtering down somewhat. Our tests indicate that on a file containing +a few tens of thousands of rows, indexed filtering can be 10 to 20 +percent slower than non-indexed filtering. Of course, your mileage +will vary with conditions \201disk access speed, amount of available +memory, process load, etc.\202 + +)0 P(Any problem encountered during index processing will result in +indexing being turned off, and replaced by filtering all rows. You can turn +filtering off manually by setting the idx_activate variable to 0 \201in a filter +expression\202 or the FILTER_IDX_ACTIVATE environment variable to 0 \201in the global +environment\202. Debugging output showing how the indexes are being processed can +be displayed to stderr by setting the idx_debug variable to 1 \201in a filter +expression\202 or the FILTER_IDX_DEBUG environment variable to 1 \201in the global +environment\202. + +)0 P(Currently, indexed filtering only works with FITS binary tables and raw +event files. It does not work with text files. This restriction might be +removed in a future release. + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 103 H(Last)WB 180 Sn( updated: August 3, 2007)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (regions.html) D +/Ti (Spatial Region Filtering) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 54 Sn( + + +)0 2 104 H(Regions:)WB 182 Sn()WB 181 Sn( Spatial Region Filtering)EA()EH( + + +)0 2 105 H(Summary)WB 183 Sn()EH( +)0 P(This document contains a summary of the user interface for spatial +region filtering images and tables. + + +)0 2 106 H(Description)WB 184 Sn()EH( +)0 P(Spatial region filtering allows a program to select regions of an +image or rows of a table \201e.g., X-ray events\202 to process using +simple geometric shapes and boolean combinations of shapes. When an +image is filtered, only pixels found within these shapes are +processed. When a table is filtered, only rows found within these +shapes are processed. + +)0 P(Spatial region filtering for images and tables is accomplished by +means of )BD(region specifications)ES(. A region specification +consists of one or more )BD(region expressions)ES(, which are geometric +shapes,combined according to the rules of boolean algebra. Region +specifications also can contain comments and local/global processing +directives. + +)0 P(Typically, region specifications are specified using bracket notation +appended to the filename of the data being processed: +) 1 31 PR( foo.fits[circle\201512,512,100\202])RP( +It is also possible to put region specification inside a file and +then pass the filename in bracket notation: +) 1 19 PR( foo.fits[@my.reg])RP( + +)0 P(When region filters are passed in bracket notation in this manner, the +filtering is set up automatically when the file is opened and all +processing occurs through the filter. Programs also can use the filter +library API to open filters explicitly. + +)0 2 107 H(Region)WB 185 Sn( Expressions)EH( + +More specifically, region specifications consist of one or more lines +containing: +) 9 68 PR( # comment until end of line + global keyword=value keyword=value ... # set global value\201s\202 + # include the following file in the region descriptor + @file + # use the FITS image as a mask \201cannot be used with other regions\202 + @fitsimage + # each region expression contains shapes separated by operators + [region_expression1], [region_expression2], ... + [region_expression], [region_expression], ...)RP( + +)0 P(A single region expression consists of: +) 8 72 PR( # parens and commas are optional, as is the + sign + [+-]shape\201num , num , ...\202 OP1 shape num num num OP2 shape ... + +e.g.: + + \201[+-]shape\201num , num , ...\202 && shape num num || shape\201num, num\202 + # a comment can come after a region -- reserved for local properties + [+-]shape\201num , num , ...\202 # local properties go here, e.g. color=red)RP( + +)0 P(Thus, a region descriptor consists of one or more )BD(region +expressions)ES( or )BD(regions)ES(, separated by comas, new-lines, or +semi-colons. Each )BD(region)ES( consists of one or more )BD(geometric +shapes)ES( combined using standard boolean operation. Several types +of shapes are supported, including: + +) 11 57 PR( shape: arguments: + ----- ---------------------------------------- + ANNULUS xcenter ycenter inner_radius outer_radius + BOX xcenter ycenter xwidth yheight \201angle\202 + CIRCLE xcenter ycenter radius + ELLIPSE xcenter ycenter xwidth yheight \201angle\202 + FIELD none + LINE x1 y1 x2 y2 + PIE xcenter ycenter angle1 angle2 + POINT x1 y1 + POLYGON x1 y1 x2 y2 ... xn yn)RP( + +)0 P(In addition, the following regions accept )BD(accelerator)ES( syntax: + +) 13 73 PR( shape arguments + ----- ------------------------------------------ + ANNULUS xcenter ycenter radius1 radius2 ... radiusn + ANNULUS xcenter ycenter inner_radius outer_radius n=[number] + BOX xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 + BOX xcenter ycenter xwlo yhlo xwhi yhhi n=[number] \201angle\202 + CIRCLE xcenter ycenter r1 r2 ... rn # same as annulus + CIRCLE xcenter ycenter rinner router n=[number] # same as annulus + ELLIPSE xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 + ELLIPSE xcenter ycenter xwlo yhlo xwhi yhhi n=[number] \201angle\202 + PIE xcenter ycenter angle1 angle2 \201angle3\202 \201angle4\202 \201angle5\202 ... + PIE xcenter ycenter angle1 angle2 \201n=[number]\202 + POINT x1 y1 x2 y2 ... xn yn)RP( +Note that the circle accelerators are simply aliases for the annulus +accelerators. See )0 55 1 A(region geometry)55 0 TN TL()Ec /AF f D( +for more information about accelerators. + +)0 P(Finally, the following are combinations of pie with different shapes +\201called "panda" for "Pie AND Annulus"\202 allow for easy specification of +radial sections: + +) 6 75 PR( shape: arguments: + ----- --------- + PANDA xcen ycen ang1 ang2 nang irad orad nrad # circular + CPANDA xcen ycen ang1 ang2 nang irad orad nrad # circular + BPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad \201ang\202 # box + EPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad \201ang\202 # ellipse)RP( + +The panda and cpanda specify combinations of annulus and circle with pie, +respectively and give identical results. The bpanda combines box and pie, +while epanda combines ellipse and pie. +See )0 55 1 A(region geometry)55 0 TN TL()Ec /AF f D( +for more information about pandas. + +)0 P(The following "shapes" are ignored by funtools \201generated by ds9\202: +) 8 62 PR( shape: arguments: + ----- --------- + PROJECTION x1 y1 x2 y2 width # NB: ignored by funtools + RULER x1 y1 x2 y2 # NB: ignored by funtools + TEXT x y # NB: ignored by funtools + GRID # NB: ignored by funtools + TILE # NB: ignored by funtools + COMPASS # NB: ignored by funtools)RP( + +)0 P(All arguments to regions are real values; integer values are +automatically converted to real where necessary. All angles are in +degrees and run from the positive image x-axis to the positive image +y-axis. If a rotation angle is part of the associated WCS header, that +angle is added implicitly as well. + +)0 P(Note that 3-letter abbreviations are supported for all shapes, so that +you can specify "circle" or "cir". + +)0 P()0 2 108 H(Columns)WB 186 Sn( Used in Region Filtering)EH( +)0 P(By default, the x,y values in a region expression refer to the two +"image binning" columns, i.e. the columns that would be used to +bin the data into an image. For images, these are just the 2 dimensions +of the image. For tables, these usually default to x and y but +can be changed as required. For example, in Funtools, new binning +columns are specified using a bincols=\201col1,col2\202 statement within +the bracket string on the command line. +)0 P(Alternate columns for region filtering can be specified by the syntax: +) 1 25 PR( \201col1,col2\202=region\201...\202)RP( +e.g.: +) 3 34 PR( \201X,Y\202=annulus\201x,y,ri,ro\202 + \201PHA,PI\202=circle\201x,y,r\202 + \201DX,DY\202=ellipse\201x,y,a,b[,angle]\202)RP( + +)0 P()0 2 109 H(Region)WB 187 Sn( Algebra)EH( + +\201See also )0 56 1 A(Region Algebra)56 0 TN TL()Ec /AF f D( for more complete +information.\202 + +)0 P(Region shapes can be combined together using Boolean operators: +) 6 72 PR( Symbol Operation Use + -------- --------- ----------------------------------- + ! not Exclude this shape from this region + & or && and Include only the overlap of these shapes + | or || inclusive or Include all of both shapes + ^ exclusive or Include both shapes except their overlap)RP( +Note that the !region syntax must be combined with another region in order +that we be able to assign a region id properly. That is, +) 1 21 PR( !circle\201512,512,10\202)RP( +is not a legal region because there is no valid region id to work with. +To get the full field without a circle, combine the above with field\201\202, +as in: +) 1 32 PR( field\201\202 && !circle\201512,512,10\202)RP( + +)0 2 110 H()WB 188 Sn( Region Separators Also Are Operators)EH( + +)0 P(As mentioned previously, multiple region expressions can be specified +in a region descriptor, separated by commas, new-lines, or +semi-colons. When such a separator is used, the boolean OR operator +is automatically generated in its place but, unlike explicit use of +the OR operator, the region ID is incremented \201starting from 1\202. + +)0 P(For example, the two shapes specified in this example are given the +same region value: +) 1 50 PR( foo.fits[circle\201512,512,10\202||circle\201400,400,20\202])RP( +On the other hand, the two shapes defined in the following example are +given different region values: +) 1 49 PR( foo.fits[circle\201512,512,10\202,circle\201400,400,20\202])RP( + +)0 P(Of course these two examples will both mask the same table rows or +pixels. However, in programs that distinguish region id's \201such as +)0 5 1 A(funcnts)5 0 TN TL()Ec /AF f D( \202, they will act +differently. The explicit OR operator will result in one region +expression consisting of two shapes having the same region id and +funcnts will report a single region. The comma operator will cause +funcnts to report two region expressions, each with one shape, in +its output. + +)0 P(In general, commas are used to separate region expressions entered +in bracket notation on the command line: +) 2 57 PR( # regions are added to the filename in bracket notation + foo.fits[circle\201512,512,100\202,circle\201400,400,20\202])RP( +New-lines are used to separate region +expressions in a file: +) 4 58 PR( # regions usually are separated by new-lines in a file + # use @filename to include this file on the command line + circle\201512,512,100\202 + circle\201400,400,20\202)RP( +Semi-colons are provided for backward compatibility with the original +IRAF/PROS implementation and can be used in either case. + +)0 P(If a pixel is covered by two different regions expressions, it is +given the mask value of the )BD(first)ES( region that contains that +pixel. That is, successive regions )BD(do not)ES( overwrite previous +regions in the mask, as was the case with the original PROS regions. +In this way, an individual pixel is covered by one and only one +region. This means that one must sometimes be careful about the order +in which regions are defined. If region N is fully contained within +region M, then N should be defined )BD(before)ES( M, or else it will be +"covered up" by the latter. + +)0 2 111 H(Region)WB 189 Sn( Exclusion)EH( +)0 P(Shapes also can be globally excluded from all the region specifiers in +a region descriptor by using a minus sign before a region: + +) 4 73 PR( operator arguments: + -------- ----------- + - Globally exclude the region expression following '-' sign + from ALL regions specified in this file)RP( +The global exclude region can be used by itself; in such a case, field\201\202 is +implied. + +)0 P(A global exclude differs from the local exclude \201i.e. a shape prefixed +by the logical not "!" symbol\202 in that global excludes are logically +performed last, so that no region will contain pixels from a globally +excluded shape. A local exclude is used in a boolean expression with +an include shape, and only excludes pixels from that include shape. +Global excludes cannot be used in boolean expressions. + +)0 2 112 H(Include)WB 190 Sn( Files)EH( + +)0 P(The )BD(@filename)ES( directive specifies an include file +containing region expressions. This file is processed as part of +the overall region descriptor: +) 1 35 PR( foo.fits[circle\201512,512,10\202,@foo])RP( +A filter include file simply includes text without changing the state +of the filter. It therefore can be used in expression. That is, if the +file foo1 contains "pi==1" and foo2 contains "pha==2" then +the following expressions are equivalent: +) 3 57 PR( "[@foo1&&@foo2]" is equivalent to "[pi==1&&pha==2]" + "[pha==1||@foo2]" is equivalent to "[pi==1||pha==2]" + "[@foo1,@foo2]" is equivalent to "[pi==1,pha==2]")RP( +Be careful that you specify evaluation order properly using +parenthesis, especially if the include file contains multiple +filter statements. For example, consider a file containing two +regions such as: +) 2 19 PR( circle 512 512 10 + circle 520 520 10)RP( +If you want to include only events \201or pixels\202 that are in these regions +and have a pi value of 4, then the correct syntax is: +) 1 17 PR( pi==4&&\201@foo\202)RP( +since this is equivalent to: +) 1 53 PR( pi==4 && \201circle 512 512 10 || circle 520 520 10\202)RP( +If you leave out the parenthesis, you are filtering this statement: +) 1 52 PR( pi==4 && circle 512 512 10 || circle 520 520 10\202)RP( +which is equivalent to: +) 1 54 PR( \201pi==4 && circle 512 512 10\202 || circle 520 520 10\202)RP( +The latter syntax only applies the pi test to the first region. + +)0 P(For image-style filtering, the )BD(@filename)ES( can specify an 8-bit +or 16-bit FITS image. In this case, the pixel values in the mask image +are used as the region mask. The valid pixels in the mask must have +positive values. Zero values are excluded from the mask and negative +values are not allowed. Moreover, the region id value is taken as +the image pixel value and the total number of regions is taken to be +the highest pixel value. The dimensions of the image mask must be less +than or equal to the image dimensions of the data. The mask will be +replicated as needed to match the size of the image. \201Thus, best +results are obtained when the data dimensions are an even multiple of +the mask dimensions.\202 + +)0 P(An image mask can be used in any image filtering operation, regardless +of whether the data is of type image or table. For example, the +)0 5 1 A(funcnts)5 0 TN TL()Ec /AF f D( \202 +program performs image filtering on images or tables, and so +FITS image masks are valid input for either type of data in this +program.. An image mask cannot be used in a program such as +)0 7 1 A(fundisp)7 0 TN TL()Ec /AF f D( \202 +when the input data is a table, because fundisp displays +rows of a table and processes these rows using event-style filtering. + +)0 2 113 H(Global)WB 191 Sn( and Local Properties of Regions)EH( + +)0 P(The ds9 image display program describes a host of properties such as +color, font, fix/free state, etc. Such properties can be specified +globally \201for all regions\202 or locally \201for an individual region\202. +The )BD(global)ES( keyword specifies properties and qualifiers for all +regions, while local properties are specified in comments on the same +line as the region: +) 4 30 PR( global color=red + circle\20110,10,2\202 + circle\20120,20,3\202 # color=blue + circle\20130,30,4\202)RP( +The first and third circles will be red, which the second circle will +be blue. Note that funtools currently ignores region properties, as +they are used in display only. + +)0 2 114 H()WB 192 Sn( Coordinate Systems)EH( + +For each region, it is important to specify the coordinate system +used to interpret the region, i.e., to set the context in which position and +size values are interpreted. For this purpose, the following keywords +are recognized: + +) 12 68 PR( name description + ---- ------------------------------------------ + PHYSICAL pixel coords of original file using LTM/LTV + IMAGE pixel coords of current file + FK4, B1950 sky coordinate systems + FK5, J2000 sky coordinate systems + GALACTIC sky coordinate systems + ECLIPTIC sky coordinate systems + ICRS currently same as J2000 + LINEAR linear wcs as defined in file + AMPLIFIER mosaic coords of original file using ATM/ATV + DETECTOR mosaic coords of original file using DTM/DTV)RP( + +)0 P()0 2 115 H(Specifying)WB 193 Sn( Positions, Sizes, and Angles)EH( + +The arguments to region shapes can be floats or integers describing +positions and sizes. They can be specified as pure numbers or using +explicit formatting directives: + +) 21 57 PR( position arguments description + ------------------ ------------------------------ + [num] context-dependent \201see below\202 + [num]d degrees + [num]r radians + [num]p physical pixels + [num]i image pixels + [num]:[num]:[num] hms for 'odd' position arguments + [num]:[num]:[num] dms for 'even' position arguments + [num]h[num]m[num]s explicit hms + [num]d[num]m[num]s explicit dms + + size arguments description + -------------- ----------- + [num] context-dependent \201see below\202 + [num]" arc seconds + [num]' arc minutes + [num]d degrees + [num]r radians + [num]p physical pixels + [num]i image pixels)RP( + + +When a "pure number" \201i.e. one without a format directive such as 'd' +for 'degrees'\202 is specified, its interpretation depends on the context +defined by the 'coordsys' keyword. In general, the rule is: + +)0 P()BD(All pure numbers have implied units corresponding to the current +coordinate system.)ES( + +)0 P(If no such system is explicitly specified, the default system is +implicitly assumed to be PHYSICAL. + +)0 P(In practice this means that for IMAGE and PHYSICAL systems, pure +numbers are pixels. Otherwise, for all systems other than linear, +pure numbers are degrees. For LINEAR systems, pure numbers are in the +units of the linear system. This rule covers both positions and +sizes. + +)0 P(The input values to each shape can be specified in several coordinate +systems including: + +) 12 68 PR( name description + ---- ---------------------------- + IMAGE pixel coords of current file + LINEAR linear wcs as defined in file + FK4, B1950 various sky coordinate systems + FK5, J2000 + GALACTIC + ECLIPTIC + ICRS + PHYSICAL pixel coords of original file using LTM/LTV + AMPLIFIER mosaic coords of original file using ATM/ATV + DETECTOR mosaic coords of original file using DTM/DTV)RP( + +)0 P(If no coordinate system is specified, PHYSICAL is assumed. PHYSICAL or +a World Coordinate System such as J2000 is preferred and most general. +The coordinate system specifier should appear at the beginning of the +region description, on a separate line \201in a file\202, or followed by a +new-line or semicolon; e.g., + +) 2 26 PR( global coordsys physical + circle 6500 9320 200)RP( + +The use of celestial input units automatically implies WORLD +coordinates of the reference image. Thus, if the world coordinate +system of the reference image is J2000, then + +) 1 27 PR( circle 10:10:0 20:22:0 3')RP( + +is equivalent to: + +) 1 35 PR( circle 10:10:0 20:22:0 3' # j2000)RP()RP( +Note that by using units as described above, you may mix coordinate +systems within a region specifier; e.g., + +) 1 32 PR( circle 6500 9320 3' # physical)RP( + +)0 P(Note that, for regions which accept a rotation angle: + +) 2 29 PR(ellipse \201x, y, r1, r2, angle\202 +box\201x, y, w, h, angle\202)RP( + +the angle is relative to the specified coordinate system. In +particular, if the region is specified in WCS coordinates, the angle +is related to the WCS system, not x/y image coordinate axis. For WCS +systems with no rotation, this obviously is not an issue. However, +some images do define an implicit rotation \201e.g., by using a non-zero +CROTA value in the WCS parameters\202 and for these images, the angle +will be relative to the WCS axes. In such case, a region specification +such as: + +) 1 54 PR(fk4;ellipse\20122:59:43.985, +58:45:26.92,320", 160", 30\202)RP( + +will not, in general, be the same region specified as: + +) 1 38 PR(physical;ellipse\201465, 578, 40, 20, 30\202)RP( + +even when positions and sizes match. The angle is relative to WCS axes +in the first case, and relative to physical x,y axes in the second. + + +)0 P(More detailed descriptions are available for: +)0 55 1 A(Region Geometry)55 0 TN TL()Ec /AF f D(, +)0 56 1 A(Region Algebra)56 0 TN TL()Ec /AF f D(, +)0 57 1 A(Region Coordinates)57 0 TN TL()Ec /AF f D(, and +)0 58 1 A(Region Boundaries)58 0 TN TL()Ec /AF f D(. + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 116 H(Last)WB 194 Sn( updated: November 17, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (reggeometry.html) D +/Ti (Region Geometry) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 55 Sn( + + +)0 2 117 H(RegGeometry:)WB 196 Sn()WB 195 Sn( Geometric Shapes in Spatial Region Filtering)EA()EH( + + +)0 2 118 H(Summary)WB 197 Sn()EH( +)0 P(This document describes the geometry of regions available for spatial +filtering in IRAF/PROS analysis. + + +)0 2 119 H(Geometric)WB 198 Sn( shapes)EH( +)0 P(Several geometric shapes are used to describe regions. The valid +shapes are: + +) 11 57 PR( shape: arguments: + ----- ---------------------------------------- + ANNULUS xcenter ycenter inner_radius outer_radius + BOX xcenter ycenter xwidth yheight \201angle\202 + CIRCLE xcenter ycenter radius + ELLIPSE xcenter ycenter xwidth yheight \201angle\202 + FIELD none + LINE x1 y1 x2 y2 + PIE xcenter ycenter angle1 angle2 + POINT x1 y1 + POLYGON x1 y1 x2 y2 ... xn yn)RP( + + +All arguments are real values; integer values are automatically +converted to real where necessary. All angles are in degrees and +specify angles that run counter-clockwise from the positive y-axis. + +)0 P(Shapes can be specified using "command" syntax: +) 1 23 PR( [shape] arg1 arg2 ...)RP( +or using "routine" syntax: +) 1 26 PR( [shape]\201arg1, arg2, ...\202)RP( +or by any combination of the these. \201Of course, the parentheses must +balance and there cannot be more commas than necessary.\202 The shape +keywords are case-insensitive. Furthermore, any shape can be +specified by a three-character unique abbreviation. For example, one +can specify three circular regions as: + +) 1 64 PR( "foo.fits[CIRCLE 512 512 50;CIR\201128 128, 10\202;cir\201650,650,20\202]")RP( + +\201Quotes generally are required to protect the region descriptor +from being processed by the Unix shell.\202 + +)2 1 1 HR( +)0 P(The )BD(annulus)ES( shape specifies annuli, centered at xcenter, +ycenter, with inner and outer radii \201r1, r2\202. For example, +) 1 20 PR( ANNULUS 25 25 5 10)RP( +specifies an annulus centered at 25.0 25.0 with an inner radius of 5.0 and +an outer radius of 10. Assuming \201as will be done for all examples in this +document, unless otherwise noted\202 this shape is used in a mask of size 40x40, +it will look like this: +) 42 51 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........................................ + 35:........................................ + 34:....................111111111........... + 33:...................11111111111.......... + 32:.................111111111111111........ + 31:.................111111111111111........ + 30:................11111111111111111....... + 29:...............1111111.....1111111...... + 28:...............111111.......111111...... + 27:...............11111.........11111...... + 26:...............11111.........11111...... + 25:...............11111.........11111...... + 24:...............11111.........11111...... + 23:...............11111.........11111...... + 22:...............111111.......111111...... + 21:...............1111111.....1111111...... + 20:................11111111111111111....... + 19:.................111111111111111........ + 18:.................111111111111111........ + 17:...................11111111111.......... + 16:....................111111111........... + 15:........................................ + 14:........................................ + 13:........................................ + 12:........................................)WR( + 11:........................................ + 10:........................................ + 9:........................................ + 8:........................................ + 7:........................................ + 6:........................................ + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( + +)2 1 1 HR( +)0 P(The )BD(box)ES( shape specifies an orthogonally oriented box, +centered at xcenter, ycenter, of size xwidth, yheight. It requires four +arguments and accepts an optional fifth argument to specify a rotation angle. +When the rotation angle is specified \201in degrees\202, the box is rotated by +an angle that runs counter-clockwise from the positive y-axis. + +)0 P(The )BD(box)ES( shape specifies a rotated box, centered at +xcenter, ycenter, of size xwidth, yheight. The box is rotated by an angle +specified in degrees that runs counter-clockwise from the positive y-axis. +If the angle argument is omitted, it defaults to 0. + +)2 1 1 HR( +)0 P(The )BD(circle)ES( shape specifies a circle, centered at xcenter, +ycenter, of radius r. It requires three arguments. + +)2 1 1 HR( +)0 P(The )BD(ellipse)ES( shape specifies an ellipse, centered at +xcenter, ycenter, with y-axis width a and the y-axis length b defined such +that: +) 1 27 PR( x**2/a**2 + y**2/b**2 = 1)RP( +Note that a can be less than, equal to, or greater than b. The ellipse +is rotated the specified number of degrees. The rotation is done according +to astronomical convention, counter-clockwise from the positive y-axis. +An ellipse defined by: +) 1 23 PR( ELLIPSE 20 20 5 10 45)RP( +will look like this: +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........................................ + 35:........................................ + 34:........................................ + 33:........................................ + 32:........................................ + 31:........................................ + 30:........................................ + 29:........................................ + 28:........................................ + 27:............111111...................... + 26:............11111111.................... + 25:............111111111................... + 24:............11111111111................. + 23:............111111111111................ + 22:............111111111111................ + 21:.............111111111111............... + 20:.............1111111111111.............. + 19:..............111111111111.............. + 18:...............111111111111............. + 17:...............111111111111............. + 16:................11111111111............. + 15:..................111111111............. + 14:...................11111111............. + 13:.....................111111............. + 12:........................................)WR( + 11:........................................ + 10:........................................ + 9:........................................ + 8:........................................ + 7:........................................ + 6:........................................ + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( + + +)2 1 1 HR( +)0 P(The )BD(field)ES( shape specifies the entire field as a +region. It is not usually specified explicitly, but is used implicitly in the +case where no regions are specified, that is, in cases where either a null +string or some abbreviation of the string "none" is input. +)BD(Field)ES( takes no arguments. + +)2 1 1 HR( +)0 P(The )BD(pie)ES( shape specifies an angular wedge of the entire field, +centered at xcenter, ycenter. The wedge runs between the two specified angles. +The angles are given in degrees, running counter-clockwise from the positive +x-axis. For example, +) 1 18 PR( PIE 20 20 90 180)RP( +defines a region from 90 degrees to 180 degrees, i.e., quadrant 2 of the +Cartesian plane. The display of such a region looks like this: + +) 42 51 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:11111111111111111111.................... + 39:11111111111111111111.................... + 38:11111111111111111111.................... + 37:11111111111111111111.................... + 36:11111111111111111111.................... + 35:11111111111111111111.................... + 34:11111111111111111111.................... + 33:11111111111111111111.................... + 32:11111111111111111111.................... + 31:11111111111111111111.................... + 30:11111111111111111111.................... + 29:11111111111111111111.................... + 28:11111111111111111111.................... + 27:11111111111111111111.................... + 26:11111111111111111111.................... + 25:11111111111111111111.................... + 24:11111111111111111111.................... + 23:11111111111111111111.................... + 22:11111111111111111111.................... + 21:11111111111111111111.................... + 20:........................................ + 19:........................................ + 18:........................................ + 17:........................................ + 16:........................................ + 15:........................................ + 14:........................................ + 13:........................................ + 12:........................................)WR( + 11:........................................ + 10:........................................ + 9:........................................ + 8:........................................ + 7:........................................ + 6:........................................ + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( +The pie slice specified is always a counter-clockwise sweep between +the angles, starting at the first angle and ending at the second. Thus: +) 1 17 PR( PIE 10 15 30 60)RP( +describes a 30 degree sweep from 2 o'clock to 1 o'clock, while: +) 1 17 PR( PIE 10 15 60 30)RP( +describes a 330 degree counter-clockwise sweep from 1 o'clock to 2 o'clock +passing through 12 o'clock \2010 degrees\202. Note in both of these examples that +the center of the slice can be anywhere on the plane. The second mask looks +like this: + +) 42 51 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:111111111111111111111111................ + 39:11111111111111111111111................. + 38:11111111111111111111111................. + 37:1111111111111111111111.................. + 36:1111111111111111111111.................. + 35:111111111111111111111................... + 34:11111111111111111111.................... + 33:11111111111111111111.................... + 32:1111111111111111111....................1 + 31:1111111111111111111..................111 + 30:111111111111111111.................11111 + 29:111111111111111111................111111 + 28:11111111111111111...............11111111 + 27:1111111111111111..............1111111111 + 26:1111111111111111.............11111111111 + 25:111111111111111............1111111111111 + 24:111111111111111..........111111111111111 + 23:11111111111111.........11111111111111111 + 22:11111111111111........111111111111111111 + 21:1111111111111.......11111111111111111111 + 20:111111111111......1111111111111111111111 + 19:111111111111....111111111111111111111111 + 18:11111111111....1111111111111111111111111 + 17:11111111111..111111111111111111111111111 + 16:1111111111.11111111111111111111111111111 + 15:1111111111111111111111111111111111111111 + 14:1111111111111111111111111111111111111111 + 13:1111111111111111111111111111111111111111 + 12:1111111111111111111111111111111111111111)WR( + 11:1111111111111111111111111111111111111111 + 10:1111111111111111111111111111111111111111 + 9:1111111111111111111111111111111111111111 + 8:1111111111111111111111111111111111111111 + 7:1111111111111111111111111111111111111111 + 6:1111111111111111111111111111111111111111 + 5:1111111111111111111111111111111111111111 + 4:1111111111111111111111111111111111111111 + 3:1111111111111111111111111111111111111111 + 2:1111111111111111111111111111111111111111 + 1:1111111111111111111111111111111111111111)RP( +The pie slice goes to the edge of the field. To limit its scope, pie +usually is is combined with other shapes, such as circles and annuli, +using boolean operations. \201See below and in "help regalgebra"\202. + +)0 P(Pie Performance Notes: +)0 P(Pie region processing time is proportional to the size of the image, +and not the size of the region. This is because the pie shape is the +only infinite length shape, and we essentially must check all y rows +for inclusion \201unlike other regions, where the y limits can be +calculated beforehand\202. Thus, pie can run very slowly on large images. +In particular, it will run MUCH more slowly than the panda shape in +image-based region operations \201such as funcnts\202. We recommend use of +panda over pie where ever possible. + +)0 P(If you must use pie, always try to put it last in a boolean && +expression. The reason for this is that the filter code is optimized +to exit as soon as the result is know. Since pie is the slowest +region, it is better to avoid executing it if another region can decide +the result. Consider, for example, the difference in time required to +process a Chandra ACIS file when a pie and circle are combined in +two different orders: + +) 5 74 PR( time ./funcnts nacis.fits "circle 4096 4096 100 && pie 4096 4096 10 78" +2.87u 0.38s 0:35.08 9.2% + + time ./funcnts nacis.fits "pie 4096 4096 10 78 && circle 4096 4096 100 " +89.73u 0.36s 1:03.50 141.8%)RP( + +)0 P(Black-magic performance note: + +)0 P(Panda region processing uses a )BD(quick test)ES( pie region instead of +the normal pie region when combining its annulus and pie shapes. This +)BD(qtpie)ES( shape differs from the normal pie in that it utilizes the +y limits from the previous region with which it is combined. In a +panda shape, which is a series of annuli combined with pies, the +processing time is thus reduced to that of the annuli. + +)0 P(You can use the qtpie shape instead of pie in cases where you are +combining pie with another shape using the && operator. This will +cause the pie limits to be set using limits from the other shape, and +will speed up the processing considerably. For example, the above +execution of funcnts can be improved considerably using this technique: + +) 2 75 PR( time ./funcnts nacis.fits "circle 4096 4096 100 && qtpie 4096 4096 10 78" +4.66u 0.33s 0:05.87 85.0%)RP( + +)0 P(We emphasize that this is a quasi-documented feature and might change in +the future. The qtpie shape is not recognized by ds9 or other programs. + +)2 1 1 HR( +)0 P(The )BD(line)ES( shape allows single pixels in a line between \201x1,y1\202 and +\201x2,y2\202 to be included or excluded. For example: +) 44 49 PR( LINE \2015,6, 24,25\202 +) 43 49 PR(displays as: +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........................................ + 35:........................................ + 34:........................................ + 33:........................................ + 32:........................................ + 31:........................................ + 30:........................................ + 29:........................................ + 28:........................................ + 27:........................................ + 26:........................................ + 25:.......................1................ + 24:......................1................. + 23:.....................1.................. + 22:....................1................... + 21:...................1.................... + 20:..................1..................... + 19:.................1...................... + 18:................1....................... + 17:...............1........................ + 16:..............1......................... + 15:.............1.......................... + 14:............1...........................)WR( + 13:...........1............................)WR( + 12:..........1.............................)WR( + 11:.........1.............................. + 10:........1............................... + 9:.......1................................ + 8:......1................................. + 7:.....1.................................. + 6:....1................................... + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( + +)2 1 1 HR( +)0 P(The )BD(point)ES( shape allows single pixels to be included or +excluded. Although the \201x,y\202 values are real numbers, they are truncated +to integer and the corresponding pixel is included or excluded, as specified. + +)0 P(Several points can be put in one region declaration; unlike the +original IRAF implementation, each now is given a different region mask value. +This makes it easier, for example, for funcnts to determine the number of +photons in the individual pixels. For example, +) 1 37 PR( POINT \2015,6, 10,11, 20,20, 35,30\202)RP( +will give the different region mask values to all four points, as shown below: + +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........................................ + 35:........................................ + 34:........................................ + 33:........................................ + 32:........................................ + 31:........................................ + 30:..................................4..... + 29:........................................ + 28:........................................ + 27:........................................ + 26:........................................ + 25:........................................ + 24:........................................ + 23:........................................ + 22:........................................ + 21:........................................ + 20:...................3.................... + 19:........................................ + 18:........................................ + 17:........................................ + 16:........................................ + 15:........................................ + 14:........................................ + 13:........................................ + 12:........................................)WR( + 11:.........2.............................. + 10:........................................ + 9:........................................ + 8:........................................ + 7:........................................ + 6:....1................................... + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( + +)2 1 1 HR( +)0 P(The )BD(polygon)ES( shape specifies a polygon with vertices +\201x1, y1\202 ... \201xn, yn\202. The polygon is closed automatically: one should +not specify the last vertex to be the same as the first. Any number of +vertices are allowed. For example, the following polygon defines a +right triangle as shown below: +) 1 33 PR( POLYGON \20110,10, 10,30, 30,30\202)RP( + +looks like this: + +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........................................ + 35:........................................ + 34:........................................ + 33:........................................ + 32:........................................ + 31:........................................ + 30:..........11111111111111111111.......... + 29:..........1111111111111111111........... + 28:..........111111111111111111............ + 27:..........11111111111111111............. + 26:..........1111111111111111.............. + 25:..........111111111111111............... + 24:..........11111111111111................ + 23:..........1111111111111................. + 22:..........111111111111.................. + 21:..........11111111111................... + 20:..........1111111111.................... + 19:..........111111111..................... + 18:..........11111111...................... + 17:..........1111111....................... + 16:..........111111........................ + 15:..........11111......................... + 14:..........1111.......................... + 13:..........111........................... + 12:..........11............................)WR( + 11:..........1............................. + 10:........................................ + 9:........................................ + 8:........................................ + 7:........................................ + 6:........................................ + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( +Note that polygons can get twisted upon themselves if edge lines +cross. Thus: +) 1 37 PR( POL \20110,10, 20,20, 20,10, 10,20\202)RP( +will produce an area which is two triangles, like butterfly wings, as shown +below: + +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........................................ + 35:........................................ + 34:........................................ + 33:........................................ + 32:........................................ + 31:........................................ + 30:........................................ + 29:........................................ + 28:........................................ + 27:........................................ + 26:........................................ + 25:........................................ + 24:........................................ + 23:........................................ + 22:........................................ + 21:........................................ + 20:........................................ + 19:..........1........1.................... + 18:..........11......11.................... + 17:..........111....111.................... + 16:..........1111..1111.................... + 15:..........1111111111.................... + 14:..........1111..1111.................... + 13:..........111....111.................... + 12:..........11......11....................)WR( + 11:..........1........1.................... + 10:........................................ + 9:........................................ + 8:........................................ + 7:........................................ + 6:........................................ + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( + +)2 1 1 HR( +)0 P(The following are combinations of pie with different shapes +\201called "panda" for "Pie AND Annulus"\202 allow for easy specification of +radial sections: +) 6 76 PR( shape: arguments: + ----- --------- + PANDA xcen ycen ang1 ang2 nang irad orad nrad # circular + CPANDA xcen ycen ang1 ang2 nang irad orad nrad # circular + BPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad \201ang\202 # box + EPANDA xcen ycen ang1 ang2 nang xwlo yhlo xwhi yhhi nrad \201ang\202 # ellipse)RP( + +The )BD(panda)ES( \201)BD(P)ES(ies )BD(AND)ES( )BD(A)ES(nnuli\202 shape can be +used to create combinations of pie and annuli markers. It is analogous +to a Cartesian product on those shapes, i.e., the result is several +shapes generated by performing a boolean AND between pies and +annuli. Thus, the panda and cpanda specify combinations of annulus and +circle with pie, respectively and give identical results. The bpanda +combines box and pie, while epanda combines ellipse and pie. + +)0 P(Consider the example shown below: +) 1 31 PR( PANDA\20120,20, 0,360,3, 0,15,4\202)RP( +Here, 3 pie slices centered at 20, 20 are combined with 4 annuli, also +centered at 20, 20. The result is a mask with 12 regions \201displayed in +base 16 to save characters\202: +) 42 51 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........................................ + 35:........................................ + 34:..............44444444444............... + 33:............444444444444444............. + 32:...........88444444444444444............ + 31:.........888844443333344444444.......... + 30:........88888833333333333444444......... + 29:........88888733333333333344444......... + 28:.......8888877733333333333344444........ + 27:......888887777332222233333344444....... + 26:......888877777622222222333334444....... + 25:.....88887777766622222222333334444...... + 24:.....88887777666622222222233334444...... + 23:.....88887777666651111222233334444...... + 22:.....88877776666551111122223333444...... + 21:.....88877776666555111122223333444...... + 20:.....888777766665559999aaaabbbbccc...... + 19:.....888777766665559999aaaabbbbccc...... + 18:.....888777766665599999aaaabbbbccc...... + 17:.....88887777666659999aaaabbbbcccc...... + 16:.....888877776666aaaaaaaaabbbbcccc...... + 15:.....888877777666aaaaaaaabbbbbcccc...... + 14:......8888777776aaaaaaaabbbbbcccc....... + 13:......888887777bbaaaaabbbbbbccccc....... + 12:.......88888777bbbbbbbbbbbbccccc........)WR( + 11:........888887bbbbbbbbbbbbccccc......... + 10:........888888bbbbbbbbbbbcccccc......... + 9:.........8888ccccbbbbbcccccccc.......... + 8:...........88ccccccccccccccc............ + 7:............ccccccccccccccc............. + 6:..............ccccccccccc............... + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( + +)2 1 1 HR( +)0 P(Several regions with different mask values can be combined in the +same mask. This supports comparing data from the different regions. +\201For information on how to combine different shapes into a single +region, see "help regalgebra".\202 For example, consider the following +set of regions: +) 3 24 PR( ANNULUS 25 25 5 10 + ELLIPSE 20 20 5 10 315 + BOX 15 15 5 10)RP( +The resulting mask will look as follows: + +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........................................ + 35:........................................ + 34:....................111111111........... + 33:...................11111111111.......... + 32:.................111111111111111........ + 31:.................111111111111111........ + 30:................11111111111111111....... + 29:...............1111111.....1111111...... + 28:...............111111.......111111...... + 27:...............11111.222222..11111...... + 26:...............111112222222..11111...... + 25:...............111112222222..11111...... + 24:...............111112222222..11111...... + 23:...............111112222222..11111...... + 22:...............111111222222.111111...... + 21:..............211111112222.1111111...... + 20:............322211111111111111111....... + 19:............32222111111111111111........ + 18:............22222111111111111111........ + 17:............222222211111111111.......... + 16:............22222222111111111........... + 15:............222222222................... + 14:............22222222.................... + 13:............222222...................... + 12:............33333.......................)WR( + 11:............33333....................... + 10:........................................ + 9:........................................ + 8:........................................ + 7:........................................ + 6:........................................ + 5:........................................ + 4:........................................ + 3:........................................ + 2:........................................ + 1:........................................)RP( +Note that when a pixel is in 2 or more regions, it is arbitrarily +assigned to a one of the regions in question \201often based on how a +give C compiler optimizes boolean expressions\202. + +)0 P()0 2 120 H(Region)WB 199 Sn( accelerators)EH( + +)0 P(Two types of \200fBaccelerators)ES(, to simplify region specification, +are provided as natural extensions to the ways shapes are described. +These are: extended lists of parameters, specifying multiple regions, +valid for annulus, box, circle, ellipse, pie, and points; and +)BD(n=)ES(, valid for annulus, box, circle, ellipse, and pie \201not +point\202. In both cases, one specification is used to define several +different regions, that is, to define shapes with different mask +values in the region mask. + +)0 P(The following regions accept )BD(accelerator)ES( syntax: +) 13 73 PR( shape arguments + ----- ------------------------------------------ + ANNULUS xcenter ycenter radius1 radius2 ... radiusn + ANNULUS xcenter ycenter inner_radius outer_radius n=[number] + BOX xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 + BOX xcenter ycenter xwlo yhlo xwhi yhhi n=[number] \201angle\202 + CIRCLE xcenter ycenter r1 r2 ... rn # same as annulus + CIRCLE xcenter ycenter rinner router n=[number] # same as annulus + ELLIPSE xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 + ELLIPSE xcenter ycenter xwlo yhlo xwhi yhhi n=[number] \201angle\202 + PIE xcenter ycenter angle1 angle2 \201angle3\202 \201angle4\202 \201angle5\202 ... + PIE xcenter ycenter angle1 angle2 \201n=[number]\202 + POINT x1 y1 x2 y2 ... xn yn)RP( +Note that the circle accelerators are simply aliases for the annulus +accelerators. + +)0 P(For example, several annuli at the same center can be specified in one +region expression by specifying more than two radii. If )BD(N)ES( +radii are specified, then )BD(N)ES(-1 annuli result, with the outer +radius of each preceding annulus being the inner radius of the +succeeding annulus. Each annulus is considered a separate region, and +is given a separate mask value. For example, +) 1 30 PR( ANNULUS 20 20 0 2 5 10 15 20)RP( +specifies five different annuli centered at 20 20, and is equivalent to: +) 5 25 PR( ANNULUS 20.0 20.0 0 2 + ANNULUS 20.0 20.0 2 5 + ANNULUS 20.0 20.0 5 10 + ANNULUS 20.0 20.0 10 15 + ANNULUS 20.0 20.0 15 20)RP( +The mask is shown below: + +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:.............5555555555555.............. + 38:...........55555555555555555............ + 37:.........555555555555555555555.......... + 36:........55555555555555555555555......... + 35:......555555555555555555555555555....... + 34:.....55555555544444444444555555555...... + 33:....5555555544444444444444455555555..... + 32:....5555555444444444444444445555555..... + 31:...555555444444444444444444444555555.... + 30:..55555544444444444444444444444555555... + 29:..55555544444443333333334444444555555... + 28:.5555554444444333333333334444444555555.. + 27:.5555544444433333333333333344444455555.. + 26:555555444444333333333333333444444555555. + 25:555554444443333333333333333344444455555. + 24:555554444433333332222233333334444455555. + 23:555554444433333322222223333334444455555. + 22:555554444433333222222222333334444455555. + 21:555554444433333222111222333334444455555. + 20:555554444433333222111222333334444455555. + 19:555554444433333222111222333334444455555. + 18:555554444433333222222222333334444455555. + 17:555554444433333322222223333334444455555. + 16:555554444433333332222233333334444455555. + 15:555554444443333333333333333344444455555. + 14:555555444444333333333333333444444555555. + 13:.5555544444433333333333333344444455555.. + 12:.5555554444444333333333334444444555555..)WR( + 11:..55555544444443333333334444444555555... + 10:..55555544444444444444444444444555555... + 9:...555555444444444444444444444555555.... + 8:....5555555444444444444444445555555..... + 7:....5555555544444444444444455555555..... + 6:.....55555555544444444444555555555...... + 5:......555555555555555555555555555....... + 4:........55555555555555555555555......... + 3:.........555555555555555555555.......... + 2:...........55555555555555555............ + 1:.............5555555555555..............)RP( + +)0 P(For boxes and ellipses, if an odd number of arguments is specified, +then the last argument is assumed to be an angle. Otherwise, the +angle is assumed to be zero. For example: +) 1 38 PR( ellipse 20 20 3 5 6 10 9 15 12 20 45)RP( +specifies an 3 ellipses at a 45 degree angle: +) 42 51 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:........................................ + 38:........................................ + 37:........................................ + 36:........33333333........................ + 35:......333333333333...................... + 34:.....3333333333333333................... + 33:....333333333333333333.................. + 32:....33333332222233333333................ + 31:...3333332222222222333333............... + 30:...33333222222222222233333.............. + 29:...333332222222222222223333............. + 28:...3333222222211112222223333............ + 27:...33332222211111111222223333........... + 26:...333322222111111111122223333.......... + 25:...3333222211111111111122223333......... + 24:....3332222111111..1111122223333........ + 23:....333322211111.....11112222333........ + 22:....33332222111.......11112223333....... + 21:.....33322221111.......11122223333...... + 20:.....33332221111.......11112223333...... + 19:.....33332222111.......11112222333...... + 18:......33332221111.......11122223333..... + 17:.......33322221111.....111112223333..... + 16:.......3333222211111..1111112222333..... + 15:........3333222211111111111122223333.... + 14:.........333322221111111111222223333.... + 13:..........33332222211111111222223333.... + 12:...........3333222222111122222223333....)WR( + 11:............333322222222222222233333.... + 10:.............33333222222222222233333.... + 9:..............3333332222222222333333.... + 8:...............33333333222223333333..... + 7:.................333333333333333333..... + 6:..................3333333333333333...... + 5:.....................333333333333....... + 4:.......................33333333......... + 3:........................................ + 2:........................................ + 1:........................................)RP( +Note in the above example that the lower limit is not part of the +region for boxes, circles, and ellipses. This makes circles and annuli +equivalent, i.e.: +) 2 26 PR( circle 20 20 5 10 15 20 + annulus 20 20 5 10 15 20)RP( +both give the following region mask: +) 42 51 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........................................ + 39:.............3333333333333.............. + 38:...........33333333333333333............ + 37:.........333333333333333333333.......... + 36:........33333333333333333333333......... + 35:......333333333333333333333333333....... + 34:.....33333333322222222222333333333...... + 33:....3333333322222222222222233333333..... + 32:....3333333222222222222222223333333..... + 31:...333333222222222222222222222333333.... + 30:..33333322222222222222222222222333333... + 29:..33333322222221111111112222222333333... + 28:.3333332222222111111111112222222333333.. + 27:.3333322222211111111111111122222233333.. + 26:333333222222111111111111111222222333333. + 25:333332222221111111111111111122222233333. + 24:33333222221111111.....11111112222233333. + 23:3333322222111111.......1111112222233333. + 22:333332222211111.........111112222233333. + 21:333332222211111.........111112222233333. + 20:333332222211111.........111112222233333. + 19:333332222211111.........111112222233333. + 18:333332222211111.........111112222233333. + 17:3333322222111111.......1111112222233333. + 16:33333222221111111.....11111112222233333. + 15:333332222221111111111111111122222233333. + 14:333333222222111111111111111222222333333. + 13:.3333322222211111111111111122222233333.. + 12:.3333332222222111111111112222222333333..)WR( + 11:..33333322222221111111112222222333333... + 10:..33333322222222222222222222222333333... + 9:...333333222222222222222222222333333.... + 8:....3333333222222222222222223333333..... + 7:....3333333322222222222222233333333..... + 6:.....33333333322222222222333333333...... + 5:......333333333333333333333333333....... + 4:........33333333333333333333333......... + 3:.........333333333333333333333.......... + 2:...........33333333333333333............ + 1:.............3333333333333..............)RP( + +)0 P(As a final example, specifying several angles in one pie slice +expression is equivalent to specifying several separate slices with +the same center. As with the annulus, if )BD(N)ES( angles are +specified, then )BD(N)ES(-1 slices result, with the ending angle of +each preceding slice being the starting angle of the succeeding slice. +Each slice is considered a separate region, and is given a separate +mask value. For example, +) 1 26 PR( PIE 12 12 315 45 115 270)RP( +specifies three regions as shown below: +) 42 51 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:2222222222222222222222222222222222222222 + 39:2222222222222222222222222222222222222221 + 38:2222222222222222222222222222222222222211 + 37:2222222222222222222222222222222222222111 + 36:2222222222222222222222222222222222221111 + 35:3222222222222222222222222222222222211111 + 34:3222222222222222222222222222222222111111 + 33:3322222222222222222222222222222221111111 + 32:3322222222222222222222222222222211111111 + 31:3332222222222222222222222222222111111111 + 30:3332222222222222222222222222221111111111 + 29:3333222222222222222222222222211111111111 + 28:3333222222222222222222222222111111111111 + 27:3333322222222222222222222221111111111111 + 26:3333322222222222222222222211111111111111 + 25:3333322222222222222222222111111111111111 + 24:3333332222222222222222221111111111111111 + 23:3333332222222222222222211111111111111111 + 22:3333333222222222222222111111111111111111 + 21:3333333222222222222221111111111111111111 + 20:3333333322222222222211111111111111111111 + 19:3333333322222222222111111111111111111111 + 18:3333333332222222221111111111111111111111 + 17:3333333332222222211111111111111111111111 + 16:3333333333222222111111111111111111111111 + 15:3333333333222221111111111111111111111111 + 14:3333333333322211111111111111111111111111 + 13:3333333333322111111111111111111111111111 + 12:33333333333.1111111111111111111111111111)WR( + 11:3333333333331111111111111111111111111111 + 10:333333333333.111111111111111111111111111 + 9:333333333333..11111111111111111111111111 + 8:333333333333...1111111111111111111111111 + 7:333333333333....111111111111111111111111 + 6:333333333333.....11111111111111111111111 + 5:333333333333......1111111111111111111111 + 4:333333333333.......111111111111111111111 + 3:333333333333........11111111111111111111 + 2:333333333333.........1111111111111111111 + 1:333333333333..........111111111111111111)RP( + +)0 P(The annulus, box, circle, ellipse, and pie shapes also accept an +)BD(n=[int])ES( syntax for specifying multiple regions. The +)BD(n=[int])ES(syntax interprets the previous \201shape-dependent\202 +arguments as lower and upper limits for the region and creates n +shapes with evenly spaced boundaries. For example, if )BD(n=[int])ES( +is specified in an annulus, the two immediately preceding radii +\201)BD(rn)ES( and )BD(rm)ES(\202 are divided into )BD(int)ES( annuli, such +that the inner radius of the first is )BD(rn)ES( and the outer radius +of the last is )BD(rm)ES(. For example, +) 1 24 PR( ANNULUS 20 20 5 20 n=3)RP( +is equivalent to: +) 1 26 PR( ANNULUS 20 20 5 10 15 20)RP( +If this syntax is used with an ellipse or box, then the two preceding +pairs of values are taken to be lower and upper limits for a set of +ellipses or boxes. A circle uses the two preceding arguments for upper +and lower radii. For pie, the two preceding angles are divided into n +wedges such that the starting angle of the first is the lower bound +and the ending angle of the last is the upper bound. In all cases, +the )BD(n=[int])ES( syntax allows any single alphabetic character +before the "=", i.e, i=3, z=3, etc. are all equivalent. + +)0 P(Also note that for boxes and ellipses, the optional angle argument is +always specified after the )BD(n=[int])ES( syntax. For example: +) 45 57 PR( ellipse 20 20 4 6 16 24 n=3 45 +) 44 57 PR(specifies 3 elliptical regions at an angle of 45 degrees: + +) 42 45 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 40:........33333333........................ + 39:.....33333333333333..................... + 38:....33333333333333333................... + 37:...33333333333333333333................. + 36:..33333333333333333333333............... + 35:.3333333333222223333333333.............. + 34:3333333322222222222233333333............ + 33:33333332222222222222223333333........... + 32:333333222222222222222222333333.......... + 31:3333322222222222222222222333333......... + 30:33333222222222111122222222333333........ + 29:333332222222111111112222222333333....... + 28:3333222222211111111111222222333333...... + 27:3333222222111111111111112222233333...... + 26:33332222221111111111111112222233333..... + 25:33332222211111111.111111112222233333.... + 24:333322222111111......111111222223333.... + 23:333322222111111.......111112222233333... + 22:33333222221111.........11111222223333... + 21:333332222211111.........11112222233333.. + 20:.33332222211111.........11111222223333.. + 19:.33333222221111.........111112222233333. + 18:..33332222211111.........11112222233333. + 17:..333332222211111.......111111222233333. + 16:...333322222111111......111111222223333. + 15:...333332222211111111.111111112222233333)WR( + 14:....333332222211111111111111122222233333)WR( + 13:.....33333222221111111111111122222233333 + 12:.....33333322222211111111111222222233333)WR( + 11:......3333332222222111111112222222333333 + 10:.......333333222222221111222222222333333 + 9:........33333322222222222222222222333333 + 8:.........333333222222222222222222333333. + 7:..........33333332222222222222223333333. + 6:...........3333333322222222222233333333. + 5:.............3333333333222223333333333.. + 4:..............33333333333333333333333... + 3:................33333333333333333333.... + 2:..................33333333333333333..... + 1:....................33333333333333......)RP( + +)0 P(Both the variable argument syntax and the )BD(n=[int])ES( syntax must +occur alone in a region descriptor \201aside from the optional angle for +boxes and ellipses\202. They cannot be combined. Thus, it is not valid +to precede or follow an )BD(n=[int])ES( accelerator with more angles or +radii, as in this example: +) 3 49 PR( # INVALID -- one too many angles before a=5 ... + # and no angles are allowed after a=5 + PIE 12 12 10 25 50 a=5 85 135)RP( +Instead, use three separate specifications, such as: +) 3 21 PR( PIE 12 12 10 25 + PIE 12 12 25 50 a=5 + PIE 12 12 85 135)RP( +The original \201IRAF\202 implementation of region filtering permitted this +looser syntax, but we found it caused more confusion than it was worth +and therefore removed it. + +)0 P(NB: Accelerators may be combined with other shapes in a boolean +expression in any order. \201This is a change starting with funtools +v1.1.1. Prior to this release, the accelerator shape had to be +specified last\202. The actual region mask id values returned depend on the +order in which the shapes are specified, although the total number of +pixels or rows that pass the filter will be consistent. For this +reason, use of accelerators in boolean expressions is discouraged in +programs such as funcnts, where region mask id values are used +to count events or image pixels. + +)0 P([All region masks displayed in this document were generated using the +)BD(fundisp)ES( routine and the undocumented "mask=all" argument \201with +spaced removed using sed \202: +) 2 72 PR( fundisp "funtools/funtest/test40.fits[ANNULUS 25 25 5 10]" mask=all |\200 + sed 's/ //g')RP( +Note that you must supply an image of the appropriate size -- in this case, +a FITS image of dimension 40x40 is used.] + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 121 H(Last)WB 200 Sn( updated: March 12, 2007)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (regalgebra.html) D +/Ti (Region Algebra) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 56 Sn( + + +)0 2 122 H(RegAlgebra:)WB 202 Sn()WB 201 Sn( Boolean Algebra on Spatial Regions)EA()EH( + + +)0 2 123 H(Summary)WB 203 Sn()EH( +)0 P(This document describes the boolean arithmetic defined for +region expressions. + + +)0 2 124 H(Description)WB 204 Sn()EH( +)0 P(When defining a region, several shapes can be combined using boolean +operations. The boolean operators are \201in order of precedence\202: +) 6 53 PR( Symbol Operator Associativity + ------ -------- ------------- + ! not right to left + & and left to right + ^ exclusive or left to right + | inclusive or left to right)RP( +For example, to create a mask consisting of a large circle with a +smaller box removed, one can use the )BD(and)ES( and )BD(not)ES( +operators: +) 1 36 PR( CIRCLE\20111,11,15\202 & !BOX\20111,11,3,6\202)RP( + +and the resulting mask is: +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 1:1111111111111111111111.................. + 2:1111111111111111111111.................. + 3:11111111111111111111111................. + 4:111111111111111111111111................ + 5:111111111111111111111111................ + 6:1111111111111111111111111............... + 7:1111111111111111111111111............... + 8:1111111111111111111111111............... + 9:111111111...1111111111111............... + 10:111111111...1111111111111............... + 11:111111111...1111111111111............... + 12:111111111...1111111111111............... + 13:111111111...1111111111111............... + 14:111111111...1111111111111............... + 15:1111111111111111111111111............... + 16:1111111111111111111111111............... + 17:111111111111111111111111................ + 18:111111111111111111111111................ + 19:11111111111111111111111................. + 20:1111111111111111111111.................. + 21:1111111111111111111111.................. + 22:111111111111111111111................... + 23:..11111111111111111..................... + 24:...111111111111111...................... + 25:.....11111111111........................ + 26:........................................ + 27:........................................ + 28:........................................ + 29:........................................)WR( + 30:........................................ + 31:........................................ + 32:........................................ + 33:........................................ + 34:........................................ + 35:........................................ + 36:........................................ + 37:........................................ + 38:........................................ + 39:........................................ + 40:........................................)RP( +A three-quarter circle can be defined as: +) 1 40 PR( CIRCLE\20120,20,10\202 & !PIE\20120,20,270,360\202)RP( + +and looks as follows: +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 1:........................................ + 2:........................................ + 3:........................................ + 4:........................................ + 5:........................................ + 6:........................................ + 7:........................................ + 8:........................................ + 9:........................................ + 10:........................................ + 11:...............111111111................ + 12:..............11111111111............... + 13:............111111111111111............. + 14:............111111111111111............. + 15:...........11111111111111111............ + 16:..........1111111111111111111........... + 17:..........1111111111111111111........... + 18:..........1111111111111111111........... + 19:..........1111111111111111111........... + 20:..........1111111111111111111........... + 21:..........1111111111.................... + 22:..........1111111111.................... + 23:..........1111111111.................... + 24:..........1111111111.................... + 25:...........111111111.................... + 26:............11111111.................... + 27:............11111111.................... + 28:..............111111.................... + 29:...............11111....................)WR( + 30:........................................ + 31:........................................ + 32:........................................ + 33:........................................ + 34:........................................ + 35:........................................ + 36:........................................ + 37:........................................ + 38:........................................ + 39:........................................ + 40:........................................)RP( +Two non-intersecting ellipses can be made into the same region: +) 1 40 PR( ELL\20120,20,10,20,90\202 | ELL\2011,1,20,10,0\202)RP( + +and looks as follows: +) 42 49 PR( 1234567890123456789012345678901234567890 + ---------------------------------------- + 1:11111111111111111111.................... + 2:11111111111111111111.................... + 3:11111111111111111111.................... + 4:11111111111111111111.................... + 5:1111111111111111111..................... + 6:111111111111111111...................... + 7:1111111111111111........................ + 8:111111111111111......................... + 9:111111111111............................ + 10:111111111............................... + 11:...........11111111111111111............ + 12:........111111111111111111111111........ + 13:.....11111111111111111111111111111...... + 14:....11111111111111111111111111111111.... + 15:..11111111111111111111111111111111111... + 16:.1111111111111111111111111111111111111.. + 17:111111111111111111111111111111111111111. + 18:111111111111111111111111111111111111111. + 19:111111111111111111111111111111111111111. + 20:111111111111111111111111111111111111111. + 21:111111111111111111111111111111111111111. + 22:111111111111111111111111111111111111111. + 23:111111111111111111111111111111111111111. + 24:.1111111111111111111111111111111111111.. + 25:..11111111111111111111111111111111111... + 26:...11111111111111111111111111111111..... + 27:.....11111111111111111111111111111...... + 28:.......111111111111111111111111......... + 29:...........11111111111111111............)WR( + 30:........................................ + 31:........................................ + 32:........................................ + 33:........................................ + 34:........................................ + 35:........................................ + 36:........................................ + 37:........................................ + 38:........................................ + 39:........................................ + 40:........................................)RP( +You can use several boolean operations in a single region expression, +to create arbitrarily complex regions. With the important exception +below, you can apply the operators in any order, using parentheses if +necessary to override the natural precedences of the operators. + +)0 P(NB: Using a panda shape is always much more efficient than explicitly +specifying "pie & annulus", due to the ability of panda to place a +limit on the number of pixels checked in the pie shape. If you are +going to specify the intersection of pie and annulus, use panda +instead. + +)0 P(As described in "help regreometry", the )BD(PIE)ES( slice goes to the +edge of the field. To limit its scope, )BD(PIE)ES( usually is is +combined with other shapes, such as circles and annuli, using boolean +operations. In this context, it is worth noting that that there is a +difference between )BD(-PIE)ES( and )BD(&!PIE)ES(. The former is a +global exclude of all pixels in the )BD(PIE)ES( slice, while the latter +is a local excludes of pixels affecting only the region\201s\202 with which +the )BD(PIE)ES( is combined. For example, the following region uses +)BD(&!PIE)ES( as a local exclude of a single circle. Two other circles +are also defined and are unaffected by the local exclude: +) 21 56 PR( CIRCLE\2011,8,1\202 + CIRCLE\2018,8,7\202&!PIE\2018,8,60,120\202&!PIE\2018,8,240,300\202 + CIRCLE\20115,8,2\202 + + 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + - - - - - - - - - - - - - - - + 15: . . . . . . . . . . . . . . . + 14: . . . . 2 2 2 2 2 2 2 . . . . + 13: . . . 2 2 2 2 2 2 2 2 2 . . . + 12: . . 2 2 2 2 2 2 2 2 2 2 2 . . + 11: . . 2 2 2 2 2 2 2 2 2 2 2 . . + 10: . . . . 2 2 2 2 2 2 2 . . . . + 9: . . . . . . 2 2 2 . . . . 3 3 + 8: 1 . . . . . . . . . . . . 3 3 + 7: . . . . . . 2 2 2 . . . . 3 3 + 6: . . . . 2 2 2 2 2 2 2 . . . . + 5: . . 2 2 2 2 2 2 2 2 2 2 2 . . + 4: . . 2 2 2 2 2 2 2 2 2 2 2 . . + 3: . . . 2 2 2 2 2 2 2 2 2 . . . + 2: . . . . 2 2 2 2 2 2 2 . . . . + 1: . . . . . . . . . . . . . . .)RP( +Note that the two other regions are not affected by the )BD(&!PIE)ES(, +which only affects the circle with which it is combined. + +)0 P(On the other hand, a )BD(-PIE)ES( is an global exclude that does +affect other regions with which it overlaps: +) 23 39 PR( CIRCLE\2011,8,1\202 + CIRCLE\2018,8,7\202 + -PIE\2018,8,60,120\202 + -PIE\2018,8,240,300\202 + CIRCLE\20115,8,2\202 + + 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + - - - - - - - - - - - - - - - + 15: . . . . . . . . . . . . . . . + 14: . . . . 2 2 2 2 2 2 2 . . . . + 13: . . . 2 2 2 2 2 2 2 2 2 . . . + 12: . . 2 2 2 2 2 2 2 2 2 2 2 . . + 11: . . 2 2 2 2 2 2 2 2 2 2 2 . . + 10: . . . . 2 2 2 2 2 2 2 . . . . + 9: . . . . . . 2 2 2 . . . . . . + 8: . . . . . . . . . . . . . . . + 7: . . . . . . 2 2 2 . . . . . . + 6: . . . . 2 2 2 2 2 2 2 . . . . + 5: . . 2 2 2 2 2 2 2 2 2 2 2 . . + 4: . . 2 2 2 2 2 2 2 2 2 2 2 . . + 3: . . . 2 2 2 2 2 2 2 2 2 . . . + 2: . . . . 2 2 2 2 2 2 2 . . . . + 1: . . . . . . . . . . . . . . .)RP( +The two smaller circles are entirely contained within the two exclude +)BD(PIE)ES( slices and therefore are excluded from the region. + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 125 H(Last)WB 205 Sn( updated: November 17, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (regcoords.html) D +/Ti (Spatial Region Coordinates) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 57 Sn( + + +)0 2 126 H(RegCoords:)WB 207 Sn()WB 206 Sn( Spatial Region Coordinates)EA()EH( + + +)0 2 127 H(Summary)WB 208 Sn()EH( +)0 P(This document describes the specification of coordinate systems, and the +interpretation of coordinate values, for spatial region filtering. + + +)0 2 128 H(Pixel)WB 209 Sn( coordinate systems)EH( +)0 P(The default coordinate system for regions is PHYSICAL, which means +that region position and size values are taken from the original +data. \201Note that this is a change from the original IRAF/PROS +implementation, in which the IMAGE coordinate system was the default.\202 +PHYSICAL coordinates always refer to pixel positions on the original +image \201using IRAF LTM and LTV keywords\202. With PHYSICAL coordinates, +if a set of coordinates specifies the position of an object in an +original FITS file, the same coordinates will specify the same object +in any FITS derived from the original. Physical coordinates are +invariant with blocking of FITS files or taking sections of images, +even when a blocked section is written to a new file. + +)0 P(Thus, although a value in pixels refers, by default, to the PHYSICAL +coordinate system, you may specify that position values refer to the +image coordinate system using the )BD(global)ES( or )BD(local)ES( +properties commands: + +) 2 23 PR( global coordsys image + circle 512 512 100)RP( + +The )BD(global)ES( command changes the coordinate system for all +regions that follow, while the )BD(local)ES( command changes the +coordinate system only for the region immediately following: +) 3 22 PR( local coordsys image + circle 512 512 100 + circle 1024 1024 200)RP( +This changes the coordinate system only for the region that follows. +In the above example, the second region uses the global coordinate +system \201PHYSICAL by default\202. + +)0 P()0 2 129 H(World)WB 210 Sn( Coordinate Systems)EH( + +If World Coordinate System information is contained in the data file +being filtered, it also is possible to define regions using a sky +coordinate system. Supported systems include: + +) 10 67 PR( name description + ---- ----------- + PHYSICAL pixel coords of original file using LTM/LTV + IMAGE pixel coords of current file + FK4, B1950 sky coordinate systems + FK5, J2000 sky coordinate systems + GALACTIC sky coordinate systems + ECLIPTIC sky coordinate systems + ICRS currently same as J2000 + LINEAR linear wcs as defined in file)RP( + +In addition, two mosaic coordinate systems have been defined that +utilize the \201evolving\202 IRAF mosaic keywords: + +) 4 68 PR( name description + ---- ----------- + AMPLIFIER mosaic coords of original file using ATM/ATV + DETECTOR mosaic coords of original file using DTM/DTV)RP( +Again, to use one of these coordinate systems, the )BD(global)ES( or +)BD(local)ES( properties commands are used: + +) 1 26 PR( global coordsys galactic)RP( + +)0 2 130 H(WCS)WB 211 Sn( Positions and Sizes)EH( + +In addition to pixels, positional values in a WCS-enabled region can +be specified using sexagesimal or degrees format: + +) 11 57 PR( position arguments description + ------------------ ----------- + [num] context-dependent \201see below\202 + [num]d degrees + [num]r radians + [num]p physical pixels + [num]i image pixels + [num]:[num]:[num] hms for 'odd' position arguments + [num]:[num]:[num] dms for 'even' position arguments + [num]h[num]m[num]s explicit hms + [num]d[num]m[num]s explicit dms)RP( + +If ':' is used as sexagesimal separator, the value is considered to be +specifying hours/minutes/seconds if it is the first argument of a +positional pair, and degrees/minutes/seconds for the second argument +of a pair \201except for galactic coordinates, which always use degrees\202: + +) 7 78 PR( argument description + ----------- ----------- + 10:20:30.0 10 hours, 20 minutes, 30 seconds for 1st positional argument + 10 degrees, 20 minutes, 30 seconds for 2nd positional argument + 10h20m30.0 10 hours, 20 minutes, 30 seconds + 10d20m30.0 10 degrees, 20 minutes, 30 seconds + 10.20d 10.2 degrees)RP( + +Similarly, the units of size values are defined by the formating +character\201s\202 attached to a number: + +) 9 53 PR( size arguments description + -------------- ----------- + [num] context-dependent \201see below\202 + [num]" arc seconds + [num]' arc minutes + [num]d degrees + [num]r radians + [num]p physical pixels + [num]i image pixels)RP( + +For example: +) 8 34 PR( argument description + ----------- ----------- + 10 ten pixels + 10' ten minutes of arc + 10" ten seconds of arc + 10d ten degrees + 10p ten pixels + 0.5r half of a radian)RP( + +)0 P(An example of using sky coordinate systems follows: + +) 4 65 PR( global coordsys B1950 + -box 175.54d 20.01156d 10' 10' + local coordsys J2000 + pie 179.57d 22.4d 0 360 n=4 && annulus 179.57d 22.4d 3' 24' n=5)RP( + +At the FK4 1950 coordinates 175.54d RA, 20.01156d DEC exclude a 10 +minute by 10 minute box. Then at the FK5 2000 coordinates 179.57d RA +22.4d DEC draw a radial profile regions pattern with 4 quadrants and 5 +annuli ranging from 3 minutes to 24 minutes in diameter. In this +example, the default coordinate system is overridden by the commands +in the regions spec. + +)0 2 131 H(NB:)WB 212 Sn( The Meaning of Pure Numbers Are Context Sensitive)EH( + +)0 P(When a "pure number" \201i.e. one without a format directive such as 'd' +for 'degrees'\202 is specified as a position or size, its interpretation +depends on the context defined by the 'coordsys' keyword. In general, +the rule is: + +)0 P()BD(All pure numbers have implied units corresponding to the current +coordinate system.)ES( + +)0 P(If no coordinate system is explicitly specified, the default system is +implicitly assumed to be PHYSICAL. In practice this means that for +IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, +for all systems other than LINEAR, pure numbers are degrees. For +LINEAR systems, pure numbers are in the units of the linear system. +This rule covers both positions and sizes. + +)0 P(As a corollary, when a sky-formatted number is used with the IMAGE +or PHYSICAL coordinate system \201which includes the default case of no +coordsys being specified\202, the formatted number is assumed to be in +the units of the WCS contained in the current file. If no sky WCS is +specified, an error results. + +)0 P(Examples: + +) 2 43 PR( circle\201512,512,10\202 + ellipse 202.44382d 47.181656d 0.01d 0.02d)RP( + +)0 P(In the absence of a specified coordinate system, the circle uses the +default PHYSICAL units of pixels, while the ellipse explicitly uses degrees, +presumably to go with the WCS in the current file. + +) 5 43 PR( global coordsys=fk5 + global color=green font="system 10 normal" + circle 202.44382 47.181656 0.01 + circle 202.44382 47.181656 10p + ellipse\201512p,512p,10p,15p,20\202)RP( + + +)0 P(Here, the circles use the FK5 units of degrees \201except for the +explicit use of pixels in the second radius\202, while the ellipse +explicitly specifies pixels. The ellipse angle is in degrees. + +)0 P(Note that Chandra data format appears to use "coordsys=physical" +implicitly. Therefore, for most Chandra applications, valid regions +can be generated safely by asking ds9 to save/display regions in +pixels using the PHYSICAL coordsys. + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 132 H(Last)WB 213 Sn( updated: November 17, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (regbounds.html) D +/Ti (Spatial Region Boundaries) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 58 Sn( + + +)0 2 133 H(RegBounds:)WB 215 Sn()WB 214 Sn( Region Boundaries)EA()EH( + + +)0 2 134 H(Summary)WB 216 Sn()EH( +Describes how spatial region boundaries are handled. + + +)0 2 135 H(Description)WB 217 Sn()EH( +)0 P(The golden rule for spatial region filtering was first enunciated by +Leon VanSpeybroeck in 1986: + +)0 P()BD(Each photon will be counted once, and no photon will be counted +more than once)ES(. + +)0 P(This means that we must be careful about boundary +conditions. For example, if a circle is contained in an annulus such +that the inner radius of the annulus is the same as the radius of the +circle, then photons on that boundary must always be assigned to one +or the other region. That is, the number of photons in both regions +must equal the sum of the number of photons in each region taken +separately. + +With this in mind, the rules for determining whether a boundary image +pixel or table row are assigned to a region are defined below. + +)0 2 136 H(Image)WB 218 Sn( boundaries : radially-symmetric shapes \201circle, annuli, ellipse\202)EH( + +For image filtering, pixels whose center is inside the boundary are +included. This also applies non-radially-symmetric shapes. When a +pixel center is exactly on the boundary, the pixel assignment rule is: + +)UL()-1 LI( the outer boundary of a symmetric shape does not include such pixels +)-1 LI( the inner boundary of a symmetric shape \201annulus\202 includes such pixels)LU( + +In this way, an annulus with radius from 0 to 1, centered exactly on a +pixel, includes the pixel on which it is centered, but none of its +neighbors. + +These rules ensure that when defining concentric shapes, no pixels are +omitted between concentric regions and no pixels are claimed by two +regions. When applied to small symmetric shapes, the shape is less +likely to be skewed, as would happen with non-radially-symmetric +rules. These rules differ from the rules for box-like shapes, which +are more likely to be positioned adjacent to one another. + +)0 2 137 H(Image)WB 219 Sn( Boundaries: non-radially symmetric shapes \201polygons, boxes\202)EH( + +For image filtering, pixels whose center is inside the boundary are +included. This also applies radially-symmetric shapes. When a pixel +center is exactly on the boundary of a non-radially symmetric region, +the pixel is included in the right or upper region, but not the left +or lower region. This ensures that geometrically adjoining regions +touch but don't overlap. + +)0 2 138 H(Row)WB 220 Sn( Boundaries are Analytic)EH( + +When filtering table rows, the boundary rules are the same as for +images, except that the calculation is not done on the center of a +pixel, \201since table rows, especially X-ray events rows, often have +discrete, floating point positions\202 but are calculated exactly. That +is, an row is inside the boundary without regard to its integerized +pixel value. For rows that are exactly on a region boundary, the +above rules are applied to ensure that all rows are counted once and +no row is counted more than once. + +)0 P(Because row boundaries are calculated differently from image boundaries, +certain programs will give different results when filtering the same +region file. In particular, fundisp/funtable \201which utilize analytic +row filtering\202 perform differently from funcnts \201which performs image +filtering, even on tables\202. + +)0 2 139 H(Image)WB 221 Sn( Boundaries vs. Row Boundaries: Practical Considerations)EH( + +)0 P(You will sometimes notice a discrepancy between running funcnts on an +binary table file and running fundisp on the same file with the same filter. +For example, consider the following: +) 2 49 PR( fundisp test1.fits"[box\2014219,3887,6,6,0\202]" | wc + 8893 320148 3752846)RP( +Since fundisp has a 2-line header, there are actually 8891 photons +that pass the filter. But then run funtable and select only the +rows that pass this filter, placing them in a new file: +) 1 58 PR( ./funtable test1.fits"[box\2014219,3887,6,6,0\202]" test2.fits)RP( +Now run funcnts using the original filter on the derived file: +) 12 61 PR( ./funcnts test2.fits "physical; box\2014219,3887,6,6,0\202" + + [... lot of processed output ...] + + # the following source and background components were used: + source region\201s\202 + ---------------- + physical; box\2014219,3887,6,6,0\202 + + reg counts pixels + ---- ------------ --------- + 1 7847.000 36)RP( +There are 1044 rows \201events\202 that pass the row filter in fundisp \201or +funtable\202 but fail to make it through funcnts. Why? + +)0 P(The reason can be traced to how analytic row filtering \201fundisp, funtable\202 +differs from integerized pixel filtering\201funcnts, funimage\202. Consider the +region: +) 1 22 PR( box\2014219,3887,6,6,0\202)RP( +Analytically \201i.e., using row filtering\202, positions will pass this +filter successfully if: +) 2 19 PR( 4216 <= x <= 4222 + 3884 <= y <= 3890)RP( +For example, photons with position values of x=4216.4 or y=3884.08 will pass. + +)0 P(Integerized image filtering is different in that the pixels that will +pass this filter have centers at: +) 2 40 PR( x = 4217, 4218, 4219, 4220, 4221, 4222 + y = 3885, 3886, 3887, 3888, 3889, 3890)RP( +Note that there are 6 pixels in each direction, as specified by the region. +That means that positions will pass the filter successfully if: +) 2 24 PR( 4217 <= \201int\202x <= 4222 + 3885 <= \201int\202y <= 3890)RP( +Photons with position values of x=4216.4 or y=3884.08 will NOT pass. + +)0 P(Note that the position values are integerized, in effect, binned into +image values. This means that x=4222.4 will pass this filter, but not +the analytic filter above. We do this to maintain the design goal that +either all counts in a pixel are included in an integerized filter, or +else none are included. + +)0 P([It could be argued that the correct photon limits for floating point +row data really should be: +) 2 23 PR( 4216.5 <= x <= 4222.5 + 3884.5 <= y <= 3890.5)RP( +since each pixel extends for .5 on either side of the center. We chose +to the maintain integerized algorithm for all image-style filtering so +that funcnts would give the exact same results regardless of whether +a table or a derived non-blocked binned image is used.] + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 140 H(Last)WB 222 Sn( updated: November 16, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (regdiff.html) D +/Ti (Differences Between Funtools and IRAF Regions) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 59 Sn( + + +)0 2 141 H(RegDiff:Differences)WB 224 Sn()WB 223 Sn( Between Funtools and IRAF Regions)EA()EH( + + +)0 2 142 H(Summary)WB 225 Sn()EH( +Describes the differences between Funtools/ds9 regions and the old IRAF/PROS +regions. + + +)0 2 143 H(Description)WB 226 Sn()EH( +)0 P(We have tried to make Funtools regions compatible with their +predecessor, IRAF/PROS regions. For simple regions and simple boolean +algebra between regions, there should be no difference between the two +implementations. The following is a list of differences and +incompatibilities between the two: + +)UL( +)0 P()-1 LI(If a pixel is covered by two different regions expressions, +Funtools assigns the mask value of the )BD(first)ES( region that +contains that pixel. That is, successive regions )BD(do not)ES( +overwrite previous regions in the mask, as was the case with the +original PROS regions. This means that one must define overlapping +regions in the reverse order in which they were defined in PROS. If +region N is fully contained within region M, then N should be defined +)BD(before)ES( M, or else it will be "covered up" by the latter. This +change is necessitated by the use of optimized filter compilation, i.e., +Funtools only tests individual regions until a proper match is made. + +)0 P()-1 LI( The )BD(PANDA)ES( region has replaced the old PROS syntax in which +a )BD(PIE)ES( accelerator was combined with an )BD(ANNULUS)ES( accelerator +using )BD(AND)ES(. That is, +) 1 48 PR( ANNULUS\20120,20,0,15,n=4\202 & PIE\20120,20,0,360,n=3\202)RP( +has been replaced by: +) 1 29 PR( PANDA\20120,20,0,360,3,0,15,4\202)RP( +The PROS syntax was inconsistent with the meaning of the )BD(AND)ES( operator. + +)0 P()-1 LI( The meaning of pure numbers \201i.e., without format specifiers\202 in +regions has been clarified, as has the syntax for specifying coordinate +systems. See the general discussion on +)0 54 1 A(Spatial Region Filtering)54 0 TN TL()Ec /AF f D( +for more information. +)LU( + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 144 H(Last)WB 227 Sn( updated: November 16, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (combo.html) D +/Ti (Combining Region and Table Filters) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 60 Sn( + + +)0 2 145 H(FunCombine:)WB 230 Sn()WB 228 Sn( Combining Region and Table Filters)EA()EH( + + +)0 2 146 H(Summary)WB 231 Sn()EH( +)0 P(This document discusses the conventions for combining region and table +filters, especially with regards to the comma operator. + + + +)0 2 147 H(Comma)WB 232 Sn()WB 229 Sn( Conventions)EA()EH( +)0 P(Filter specifications consist of a series of boolean expressions, +separated by commas. These expressions can be table filters, +spatial region filters, or combinations thereof. Unfortunately, +common usage requires that the comma operator must act differently +in different situations. Therefore, while its use is intuitive in +most cases, commas can be a source of confusion. + +)0 P(According to long-standing usage in IRAF, when a comma separates two +table filters, it takes on the meaning of a boolean )BD(and)ES(. Thus: +) 1 24 PR( foo.fits[pha==1,pi==2])RP( +is equivalent to: +) 1 27 PR( foo.fits[pha==1 && pi==2])RP( + +When a comma separates two spatial region filters, however, it has +traditionally taken on the meaning of a boolean )BD(or)ES(. Thus: +) 1 46 PR( foo.fits[circle\20110,10,3\202,ellipse\20120,20,8,5\202])RP( +is equivalent to: +) 1 49 PR( foo.fits[circle\20110,10,3\202 || ellipse\20120,20,8,5\202])RP( +\201except that in the former case, each region is given a unique id +in programs such as funcnts\202. + +)0 P(Region and table filters can be combined: +) 1 34 PR( foo.fits[circle\20110,10,3\202,pi=1:5])RP( +or even: +) 1 61 PR( foo.fits[pha==1&&circle\20110,10,3\202,pi==2&&ellipse\20120,20,8,5\202])RP( +In these cases, it is not obvious whether the command should utilize an +)BD(or)ES( or )BD(and)ES( operator. We therefore arbitrarily chose to +implement the following rule: +)UL()-1 LI( if both expressions contain a region, the operator used is )BD(or)ES(. +)-1 LI( if one \201or both\202 expression\201s\202 does not contain a region, the operator +used is )BD(and)ES(.)LU( +This rule handles the cases of pure regions and pure column filters properly. +It unambiguously assigns the boolean )BD(and)ES( to all mixed cases. Thus: +) 1 34 PR( foo.fits[circle\20110,10,3\202,pi=1:5])RP( +and +) 1 34 PR( foo.fits[pi=1:5,circle\20110,10,3\202])RP( +both are equivalent to: +) 1 37 PR( foo.fits[circle\20110,10,3\202 && pi=1:5])RP( + +)0 P([NB: This arbitrary rule )BD(replaces the previous arbitrary rule)ES( +\201pre-funtools 1.2.3\202 which stated: +)UL()-1 LI( if the 2nd expression contains a region, the operator used is )BD(or)ES(. +)-1 LI( if the 2nd expression does not contain a region, the operator +used is )BD(and)ES(.)LU( +In that scenario, the )BD(or)ES( operator was implied by: +) 1 21 PR( pha==4,circle 5 5 1)RP( +while the )BD(and)ES( operator was implied by +) 1 21 PR( circle 5 5 1,pha==4)RP( +Experience showed that this non-commutative treatment of the comma +operator was confusing and led to unexpected results.] + +)0 P(The comma rule must be considered provisional: comments and complaints +are welcome to help clarify the matter. Better still, we recommend +that the comma operator be avoided in such cases in favor of an +explicit boolean operator. + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 148 H(Last)WB 233 Sn( updated: November 16, 2005)EH( + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (env.html) D +/Ti (Funtools Environment Variables) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 61 Sn( + + +)0 2 149 H(FunEnv:)WB 235 Sn()WB 234 Sn( Funtools Environment Variables)EA()EH( + + +)0 2 150 H(Summary)WB 236 Sn()EH( +Describes the environment variables which can be used to tailor the overall +Funtools environment. + + +)0 2 151 H(Description)WB 237 Sn()EH( +)0 P(The following environment variables are supported by Funtools: +)0 DL()0 P()0 DT()BD(FITS_EXTNAME)ES( +)DD( The )BD(FITS_EXTNAME)ES( environment variable specifies the +default FITS extension name when )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( is called on a file lacking +a primary image. Thus, +) 1 29 PR( setenv FITS_EXTNAME "NEWEV")RP( +will allow you to call )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( on files without specifying NEWEV in +the +)0 42 1 A(Funtools bracket specification)42 0 TN TL()Ec /AF f D(. +If no FITS_EXTNAME variable is defined and the extension name also is +not passed in the bracket specification, then the default will be to +look for standard X-ray event table extension names "EVENTS" or +"STDEVT" \201we are, after all, and X-ray astronomy group at heart!\202. + +)0 P()0 DT()BD(FITS_EXTNUM)ES( +)DD( The )BD(FITS_EXTNUM)ES( environment variable specifies the +default FITS extension number when )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( is called on a file lacking +a primary image. Thus, +) 1 22 PR( setenv FITS_EXTNUM 7)RP( +will allow you to call )0 25 1 A(FunOpen\201\202)25 0 TN TL()Ec /AF f D( on files to open the seventh +extension without specifying the number in the +)0 42 1 A(Funtools bracket specification)42 0 TN TL()Ec /AF f D(. + +)0 P()0 DT()BD(FITS_BINCOLS)ES( and )BD(EVENTS_BINCOLS)ES( +)DD( These environment variable specifies the default binning key for +FITS binary tables and raw event files, respectively. They can be +over-ridden using the )BD(bincols=[naxis1,naxis2])ES( keyword in a +)0 42 1 A(Funtools bracket specification)42 0 TN TL()Ec /AF f D(. +The value of each environment variable +is a pair of comma-delimited columns, enclosed in parentheses, to use +for binning. For example, if you want to bin on detx and dety by +default, then use: +) 1 35 PR( setenv FITS_BINCOLS "\201detx,dety\202")RP( +in preference to adding a bincols specification to each filename: +) 1 31 PR( foo.fits[bincols=\201detx,dety\202])RP( + +)0 P()0 DT()BD(FITS_BITPIX)ES( and )BD(EVENTS_BITPIX)ES( +)DD( These environment variable specifies the default bitpix value for +binning FITS binary tables and raw event files, respectively. They can +be over-ridden using the )BD(bitpix=[value])ES( keyword in a +)0 42 1 A(Funtools bracket specification)42 0 TN TL()Ec /AF f D(. The value +of each environment variable is one of the standard FITS bitpix values +\2018,16,32,-32,-64\202. For example, if you want binning routines to +create a floating array, then use: +) 1 24 PR( setenv FITS_BITPIX -32)RP( +in preference to adding a bitpix specification to each filename: +) 1 22 PR( foo.fits[bitpix=-32])RP( + +)0 P()0 DT()BD(ARRAY)ES( +)DD( The )BD(ARRAY)ES( environment variable specifies the default +definition of an array file for Funtools. +It is used if there is no array specification passed in the +)BD(ARRAY\201\202)ES( directive in a +)0 46 1 A(Non-FITS Array specification)46 0 TN TL()Ec /AF f D(. +The value of the environment variable is a valid array specification such as: +) 2 25 PR( setenv ARRAY "s100.150" + foo.arr[ARRAY\201\202])RP( +This can be defined in preference to adding the specification to each filename: +) 1 26 PR( foo.arr[ARRAY\201s100.150\202])RP( + +)0 P()0 DT()BD(EVENTS)ES( +)DD( The )BD(EVENTS)ES( environment variable specifies the default +definition of an raw event file for Funtools. +It is used if there is no EVENTS specification passed in the +)BD(EVENTS\201\202)ES( directive in a +)0 45 1 A(Non-FITS EVENTS specification)45 0 TN TL()Ec /AF f D(. +The value of the environment variable is a valid EVENTS specification such as: +) 2 73 PR( setenv EVENTS "x:J:1024,y:J:1024,pi:I,pha:I,time:D,dx:E:1024,dx:E:1024" + foo.ev[EVENTS\201\202])RP( +This can be defined in preference to adding the specification to each filename: +) 1 73 PR( foo.ev[EVENTS\201x:J:1024,y:J:1024,pi:I,pha:I,time:D,dx:E:1024,dx:E:1024\202])RP()LD( + +The following filter-related environment variables are supported by Funtools: +)0 DL( +)0 P()0 DT()BD(FILTER_PTYPE)ES( +)DD( The )BD(FILTER_PTYPE)ES( environment variable specifies how to +build a filter. There are three possible methods: +)0 DL()0 DT(process or p +)DD(The filter is compiled and linked against the funtools library \201which +must therefore be accessible in the original install directory\202 to produce +a slave program. This program is fed events or image data and returns +filter results. + +)0 DT(dynamic or d \201gcc only\202 +)DD(The filter is compiled and linked against the funtools library \201which +must therefore be accessible in the original install directory\202 to produce +a dynamic shared object, which is loaded into the funtools program and +executed as a subroutine. \201Extensive testing has shown that, contrary to +expectations, this method is no faster than using a slave process.\202 + +)0 DT(contained or c +)DD(The filter and all supporting region code is compiled and linked +without reference to the funtools library to produce a slave program +\201which is fed events or image data and returns filter results\202. This method +is slower than the other two, because of the time it takes to compile the +region filtering code. It is used by stand-alone programs such as ds9, +which do not have access to the funtools library.)LD( + +By default, )BD(dynamic)ES( is generally used for gcc compilers and +)BD(process)ES( for other compilers. However the filter building algorithm +will check for required external files and will use )BD(contained)ES( is +these are missing. + +)0 P()0 DT()BD(FUN_MAXROW)ES( +)DD( The )BD(FUN_MAXROW)ES( environment variable is used by core +row-processing Funtools programs \201funtable, fundisp, funcnts, funhist, +funmerge, and funcalc\202 to set the maximum number of rows read at once +\201i.e. it sets the third argument to the FunTableRowGet\201\202 call\202. The +default is 8192. Note that this variable is a convention only: it will +not be a part of a non-core Funtools program unless code is explicitly +added, since each call to FunTableRowGet\201\202 specifies its own maximum +number of rows to read. NB: if you make this value very large, you +probably will need to increase )BD(FUN_MAXBUFSIZE)ES( \201see below\202 as well. + +)0 P()0 DT()BD(FUN_MAXBUFSIZE)ES( +)DD( The )BD(FUN_MAXBUFSIZE)ES( environment variable is used to limit the +max buffer size that will be allocated to hold table row data. This +buffer size is calculated to be the row size of the table multiplied +by the maximum number of rows read at once \201see above\202. Since the +row size is unlimited \201and we have examples of it being larger than 5 +Mb\202, it is possible that the total buffer size will exceed the machine +capabilities. We therefore set a default value of 5Mb for the max buffer +size, and adjust maxrow so that the total size calculated is less than +this max buffer size. \201If the row size is greater than this max buffer +size, then maxrow is set to 1.\202 This environment variable will change +the max buffer size allowed. + +)0 P()0 DT()BD(FILTER_CC)ES( +)DD( The )BD(FILTER_CC)ES( environment variable specifies the compiler to +use for compiling a filter specification. You also can use the )BD(CC)ES( +environment variable. If neither has been set, then gcc will be used +if available. Otherwise cc is used if available. + +)0 P()0 DT()BD(FILTER_EXTRA)ES( +)DD( The )BD(FILTER_EXTRA)ES( environment variable specifies extra options +to add to a filter compile command line. In principle, you can add libraries, +include files, and compiler switches. This variable should be used with care. + +)0 P()0 DT()BD(FILTER_TMPDIR)ES( +)DD( The )BD(FILTER_TMPDIR)ES( environment variable specifies the temporary +directory for filter compilation intermediate files. You also can use +the )BD(TMPDIR)ES( and )BD(TMP)ES( variables. By default, /tmp is used +as the temporary directory. + +)0 P()0 DT()BD(FILTER_KEEP)ES( +)DD( The )BD(FILTER_KEEP)ES( environment variable specifies whether the +intermediate filter files \201i.e. C source file and compile log file\202 +should be saved after a filter is built. The default is "false", so that +these intermediate files are deleted. This variable is useful for debugging, +but care should be taken to reset its value to false when debugging is +complete. +)LD( + + + + + +)0 P()0 0 1 A(Go to Funtools Help Index)0 0 TN TL()Ec /AF f D( + +)0 5 152 H(Last)WB 238 Sn( updated: November 16, 2005)EH( + + +)WB NL +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc +DS +/Ba f D /BO 0 D Bs +/UR (changelog.html) D +/Ti (Funtools ChangeLog) D +/Au () D +/Df f D +/ME [()] D + +0 BO R +()1 Sl()WB 62 Sn( +)0 2 153 H(Funtools)WB 239 Sn( ChangeLog)EH( + +)0 P(This ChangeLog covers both the Funtools library and the suite of +applications. It will be updated as we continue to develop and improve +Funtools. The up-to-date version can be found +)R5 2 A(here)EA(. +[The changelog for the initial development of Funtools, covering the +beta releases, can be found +)R6 2 A(here)EA(.] + +)0 2 154 H()WB 240 Sn( Patch Release 1.4.5 \201internal ds9 release\202)EH( +)UL()0 P()-1 LI( Removed permission checking from Find\201\202 on cygwin systems. This was broken +by Windows 7. +)0 P()-1 LI( Removed addition of -no-cpp-precomp flag from gcc 4.2 and beyond.)LU( + +)0 2 155 H()WB 241 Sn( Patch Release 1.4.4 \201internal ds9 release\202)EH( +)UL()0 P()-1 LI( Fixed -J funcone, which was not properly outputting all rows. +)0 P()-1 LI( Filter: when an image is flipped, the rotation angle must be reversed. +)0 P()-1 LI( Filter: add support for windows-based ipc communication when using tcc +compiler.)LU( + +)0 2 156 H()WB 242 Sn( Patch Release 1.4.3 \201internal ds9 release\202)EH( +)UL()0 P()-1 LI( Filter: improve checks for existence of compiler, even if CC is set. +)0 P()-1 LI( Change launch.h to xlaunch.h to avoid conflict with OS X. +)0 P()-1 LI( handle flipped images in filtering)LU( + +)0 2 157 H()WB 243 Sn( Patch Release 1.4.2 \201internal ds9 release\202)EH( +)UL()0 P( +)-1 LI( Port to gcc 4.2. +)0 P()-1 LI( Fix 1-byte filters on intel machines \201missing SW1 no-op\202. +)0 P()-1 LI( Remove ambiguity from filt.l \201and calc.l\202 using [A-z] in a +case-insensitive lexer. +)0 P()-1 LI( In funsky, the default unit for RA was changed from hours to degrees. +)0 P()-1 LI( Fixed bug in funtable in which TCRVL header values were output as strings. +)0 P()-1 LI( Added support for running funtools filters in Rosetta \201i.e. running PPC +executables on an Intel Mac\202 by sensing and handling data swap requirements. +Only works with FILTER_PTYPE set to 'c' \201can't link against wrong architecture +libraries\202. +)0 P()-1 LI( Fixed bug in FITS library to allow "-" in extension names. +)0 P()-1 LI( Code and documentation now agree that the copy extension specifier \201'+'\202 +comes after the extension name.)LU( + +)0 2 158 H()WB 244 Sn( Patch Release 1.4.1 \201internal ds9 release\202)EH( +)UL()0 P()-1 LI( Modified internal Launch\201\202 routine to use posix_spawn\201\202, if necessary. +This is required for OS X 10.5 \201leopard\202, which frowns upon use of fork\201\202 +and exec\201\202. Also modified zprocess routines to use Launch\201\202.)LU( + +)0 2 159 H()WB 245 Sn( Public Release 1.4.0 \20115 August 2007\202)EH( + +)UL()-1 LI( Public release of production-quality code, incorporating changes +and improvements from previous beta releases, including: +)UL()-1 LI( Support for access to ASCII text column files. +)-1 LI( Support for fast indexed access of binary tables. +)-1 LI( Support for database views of tables, i.e. pre-set values for the filter + specification, the columns to activate, and display format. +)-1 LI( New programs include funcone \201cone search\202, funindex \201create index files\202, + and funcen \201calculate centroids within regions\202.)LU( +)LU( + +)0 2 160 H()WB 246 Sn( Release 1.3.0b[n] \201mainly internal SAO beta releases\202)EH( +)UL( +)0 P()-1 LI( Added -F[c] switch to change the column delimiter to the +specified character. + +)0 P()-1 LI( Extended fundisp's format switch \201-f\202 so that it can now handle complex +formats such as 'x=sometext%3d- y=othertest%3d.ext'. + +)0 P()-1 LI( Added support for creating and processing 1D FITS images. + +)0 P()-1 LI( Added vcol=colname and vcol=/colname to filter specifications to +support use of a third value column when binning 2D images. + +)0 P()-1 LI( Added switches to funcone to write out data rows are not within +any cone \201-J, -X\202 and centers which have no close data rows \201-L\202. + +)0 P()-1 LI( In funjoin, added ability to specify a numeric tolerance for when joining +two files. + +)0 P()-1 LI( shared memory support in gio now can create a shared segment if w+ is +specified as the open mode. + +)0 P()-1 LI( Changed reggeometry man page so that examples correctly show angles +going counter-clockwise from the x-axis instead of from the y-axis. + +)0 P()-1 LI( Added checks to funmerge to ensure that all files have the same columns. + +)0 P()-1 LI( Fixed bug in text support that prevented header-less files from being +processed properly. + +)0 P()-1 LI( Added support for 64-bit images \201bitpix=64\202 and table columns \201TFORM=K\202. + +)0 P()-1 LI( Filter code was not applying bscale/bzero to columns. + +)0 P( +)-1 LI( Fixed funimage bug that caused a .5/block error in WCS CRPIX values +generated from binary tables. + +)0 P()-1 LI( Added feq\201a,b\202 and div\201a,b\202 macros to funcalc. + +)0 P()-1 LI( Added support for single-line #define to funcalc. + +)0 P()-1 LI( Updated wcs library to 3.6.6 + +)0 P()-1 LI( Fix bug in funcen in which ra,dec was not being calculated correctly +if physical and image coords did not match up. + +)0 P()-1 LI( The filter syntax "col1 = col2" now explicitly generates an error +\201you really want to do "col1 == col2"\202. + +)0 P()-1 LI( Added -o switch to include offset from the nominal target position. + +)0 P()-1 LI( Fundisp now displays multi-dimensional vector columns properly. + +)0 P()-1 LI( Documented support for lists of files processed as a single file +using "list: file1 ... filen" syntax. + +)0 P()-1 LI( Fixed bugs in support for pipe file type \201i.e. ability to pass +commands as a filename using "pipe: cmd arg1 ... argn" syntax\202. + +)0 P()-1 LI( Fixed bug in funhist processing of image-based pixel histograms +\201i.e using "xy" for columns\202 where a region was specified. All pixels +outside the region were erroneously being added to the bin containing +the 0 value. + +)0 P()-1 LI( Disabled multi-file processing in funds9, which was breaking support +for pathnames containing spaces and is not used by ds9 anyway. + +)0 P()-1 LI( Added support for Views of tables, i.e. pre-set values for the +filter specification, the columns to activate, and display format +\201though the latter is for fundisp only\202. + +)0 P()-1 LI( Added -l switch to funimage to read x, y, val columns from a list. + +)0 P()-1 LI( Removed useless and meaningless section syntax foo'[*]' because it +breaks pointer de-referencing on string columns \201i.e. foo'[*xxx=='a']'\202. +Use foo'[*,*]' instead, as documented. + +)0 P()-1 LI( String variables were not always being terminated properly in the +filter code because FITS 'A' data is not necessarily null-terminated. + +)0 P()-1 LI( Added funtools version number to all usage\201\202 displays. + +)0 P()-1 LI( Added explanation of switch arguments to many usage\201\202 displays. + +)0 P()-1 LI( The filter keyword row# now supports single row selection as well +as range selection, i.e., "row#=100" along with previous "row#=100:200". + +)0 P()-1 LI( fundisp now outputs "0x" before hex values. + +)0 P()-1 LI( Fixed bug in filter parser which processed rangelists incorrectly +if spaces were put into the rangelist \201i.e. "pha= 1 : 3" instead of +pha=1:3\202. + +)0 P()-1 LI( Fixed a bug in funindex which created a wrongly named index file +if more than one "." was in the input file name. + +)0 P()-1 LI( Added support to funcone to take ra, dec, radius from a list +\201i.e. columns in a FITS file or a text file\202. + +)0 P()-1 LI( Fixed a bug in FunColumnActivate so that if some columns are +explicitly activated while others are de-activated, only the +explicitly activated columns are activated \201code was activating all +columns in this case\202. + +)0 P()-1 LI( Fixed a bug in funindex which prevented indexing tables containing +a column named N. + +)0 P()-1 LI( fundisp now encloses ASCII column values in single quotes \201unless +-T is specified to output RDB format\202. + +)0 P()-1 LI( If a filter specification only involves indexed columns, then the +compiled filter is not used. + +)0 P()-1 LI( Funmerge can now be given a list of files to merge using @list syntax. +Also removed the restriction on how many files can be merged \201was limited to +the max number of open files\202. + +)0 P()-1 LI( Added ability to edit \201add, delete, modify\202 header parameters in funhead +by specifying an output file \201editing acts as a filter\202 and an edit command +file \201which can be stdin\202. + +)0 P()-1 LI( Funtools now contains preliminary code to support \201fast\202 indexed access +of binary tables. See idx.html or "man funidx" for more details. + +)0 P()-1 LI( Funtools now contains preliminary code supporting access to ASCII +column files. See text.html or "man funtext" for more details. + +)0 P()-1 LI( Fixed bug in funcalc in which columns used in an expression were +always being replaced by new columns, with all associated parameters +\201e.g. WCS\202 were being deleted. Now this only happens if the column +explicitly changes its data type. + +)0 P()-1 LI( Fixed bug in funcalc in which the raw data and user data became out +of sync for one row after every 8192 \201FUN_MAXROW\202 rows. + +)0 P()-1 LI( Fixed bug in gio in which gseek returned 0 instead of the current byte +offset for disk files. + +)0 P()-1 LI( Added funcone program to perform cone search on RA, Dec columns in +a FITS binary table. + +)0 P()-1 LI( Fixed bug in polygon, pie and rotated box region filtering for +tables \201nearby rows exactly in line between two non-vertical or +non-horizontal vertices were being accepted incorrectly\202. + +)0 P()-1 LI( Fixed pie and panda regions so that the angles now start from +positive x axis == 0 degrees and run counter-clockwise, as +documented. They were going from positive y. NB: a similar change +was made to ds9 release 4.0b3. You must be using ds9 4.0b3 or later +in order to have the correct behavior when generating regions in ds9 +and using them in funtools. + +)0 P()-1 LI( Added -p [prog] switch to funcalc to save the generated program. +instead of executing \201and deleting\202 it. + +)0 P()-1 LI( Upgraded zlib to 1.2.3. +)LU( + +)0 2 161 H()WB 247 Sn( Patch Release 1.2.4 \201internal SAO and beta release only\202)EH( +)UL( +)0 P()-1 LI( In funcalc, added support for user-specified arguments via the +-a [argstr] switch. These arguments are accessed in the compiled program +using the supplied ARGC and ARGV\201n\202 macros. + +)0 P()-1 LI( Added -n \201no header display\202 to fundisp to skip outputting header. + +)0 P()-1 LI( Added checks for various types of blank filters. + +)0 P( +)-1 LI( Added macros NROW \201current row number\202 and WRITE_ROW \201write current +row to disk\202 to funcalc. + +)0 P()-1 LI( funcalc no longer requires that at least one data column be +specified in the compiled expression. + +)0 P()-1 LI( Added FUN_NROWS to FunInfoGet\201\202 to return the total number of rows in +an input table \201i.e. value of NAXIS2\202. + +)0 P( +)-1 LI( The compiled funcalc program now includes stdlib.h and unistd.h. + +)0 P()-1 LI( The util/NaN.h header file is now modified at configure time to +contain endian status for the target architecture. References to +specific platforms have been removed. + +)0 P()-1 LI( Added -m switch to funtable to output multiple files, one for +each input region \201and a separate file for events that pass the +filters but are not in any region\202. + +)0 P()-1 LI( Added ability to add new parameters \201FunParamPutx\202 after writing +data if space is previously reserved in the form of a blank parameter +whose value is the name of the param to be updated. \201Also requires the +append argument of FunParamPutx be set to 2\202. + +)0 P( +)-1 LI( Added ability to build shared libraries. With --enable-shared=yes, +shared library is built but not used. With --enable-shared=link, +shared library is linked against \201requires proper installation and/or +use of LD_LIBRARY_PATH\202. + +)0 P()-1 LI( Added -v [column] support to funcnts so that counts in a table +can be accumulated using values from a specified column \201instead of +the default case where an integral count is accumulated for each event +in a region\202. + +)0 P()-1 LI( Added funcen program to calculate centroids within regions +\201binary tables only\202. Also added support for a funcen-based centroid +tool to funtools.ds9. + +)0 P()-1 LI( Fixed bug which prevented successful filtering of columns containing +arrays. + +)0 P()-1 LI( Added filter check to ensure that a column is not incorrectly used +as an array. + +)0 P()-1 LI( Fundisp now displays column arrays indexed from 0, not 1. + +)0 P()-1 LI( Added -i [interval] support to funcnts so that multiple intervals +can be processed in a single pass through the data. For example, +specifying -i "pha=1:5;pha=6:10;pha=11:15" will generate results in +each of 3 pha bands. + +)0 P()-1 LI( Fixed calculation of LTV quantities when binning floating point +column data \201value was off by 0.5\202. + +)0 P()-1 LI( Added support for 'D' in floating point header values. + +)0 P()-1 LI( Added -a switch to funimage and funtable to append output image or +table to an existing FITS file \201as an IMAGE or BINTABLE extension\202. + +)0 P()-1 LI( Added support for column scaling \201TSCAL and TZERO\202 on input columns. +Note that the default column type is changed to accommodate scaling \201e.g. +a column of type 'I' is changed to 'J', 'J' is changed to 'D'\202 so that +the scaled values can be handled properly by programs such as fundisp +\201which utilize default types\202. + +)0 P( +)-1 LI( Added support to FunColumnSelect\201\202 for handling structs of arrays +\201i.e. where returned columns are contiguous\202 instead of the default array +of structs \201returned row are contiguous\202. This is done by specifying +"org=structofarrays" in the plist and passing a single struct containing +the arrays. + +)0 P()-1 LI( When writing an rdb/starbase file, fundisp now outputs the full +column name, regardless of the width of the column \201which ordinarily +is truncated to match\202. + +)0 P()-1 LI( Fixed support for large files by changing all file positions variables +from "long" declarations to "off_t. + +)0 P()-1 LI( Fixed bug in funcalc incorrectly processed multiple array +references \201e.g. cur->foo[0]=cur->x;cur->foo[1]=cur->y;\202 within a single +line of code. + +)0 P()-1 LI( Added FILTER_CFLAGS environment variable for all filtering. Also added +--with-filter-cc and --with-filter-cflags options on configure to allow +specification of a default C compiler and associated CFLAGS for filtering. +All of this is necessary in order to support 64-bit libraries under Solaris. + +)0 P()-1 LI( Added the funtbl script to extract a table from Funtools ASCII output. + +)0 P()-1 LI( Added code to funimage to update IRAF DATASEC keyword. + +)0 P()-1 LI( Added checks to ensure that image dimensions are positive. + +)0 P()-1 LI( Fixed a bug in funimage where int data was being scaled using BSCALE and +BZERO but these keywords also were being retained in the output image header. +Now the data are not scaled unless the output data type is float \201in which +case the scaling parameters are removed\202. + +)0 P()-1 LI( Fixed a bug in funmerge which prevented merging of files unless one of +the -f, -w, or -x switches were used. + +)0 P()-1 LI( Fixed a bug in funtable and fundisp which caused the special '$n' column +to be output incorrectly. + +)0 P()-1 LI( Fixed sort option in funtable, which previously worked only if the +record size was an even divisor of 8192 \201and returned garbage otherwise\202. + +)0 P()-1 LI( Fixed bug in filters involving FITS data type 'X' \201bitfield\202. + +)0 P()-1 LI( Fixed bug in funcnts in which the output angles and radii were +being displayed incorrectly when multiple panda shapes were specified. + +)0 P()-1 LI( Fixed bug in pandas and pies using n= syntax when first angle +specified was greater than second. The resulting mask was of +the correct shape but contained only a single region. + +)0 P()-1 LI( Table row access routines will now decrease maxrows if memory cannot be +allocated for maxrows*sizeof\201row\202, i.e. if the size of a row is so large that +space for maxrows cannot be allocated. + +)0 P()-1 LI( The FUN_MAXBUFSIZE environment variable was added to limit the +max buffer size that will be allocated to hold table row data. The +default is 5Mb. + +)0 P()-1 LI( Generated PostScript and PDF versions of the help pages. + +)0 P()-1 LI( Moved OPTIONS section before \201often-lengthy\202 DESCRIPTION section in +man pages. + +)0 P()-1 LI( All memory allocation now does error checking on the result +\201except wcs library, which is external code\202. + +)0 P()-1 LI( Removed some compiler warnings that surfaced when using gcc -O2. + +)0 P()-1 LI( Updated wcs library to 3.5.5. + +)0 P()-1 LI( Upgraded zlib to 1.2.1. +)LU( + +)0 2 162 H()WB 248 Sn( Patch Release 1.2.3 \20112 January 2004\202)EH( +)UL( +)0 P()-1 LI( Generated man pages from the html pages. These are installed +automatically at build time. + +)0 P()-1 LI( Changed instances of sprintf\201\202 to snprintf\201\202 to protect +against buffer overflow. + +)0 P()-1 LI( Fixed a number of compiler warnings in non-ANSI compilers. + +)0 P()-1 LI( Increased SZ_LINE parameter value from 1024 to 4096. +)LU( + +)0 2 163 H()WB 249 Sn( Patch Release 1.2.3b1 \20119 August 2003\202)EH( +)UL( +)0 P()-1 LI( The rule for using comma to separate a table filter expression +and a region expression has been changed. The rule now states: +)UL()-1 LI( if both expressions contain a region, the operator used is )BD(or)ES(. +)-1 LI( if one \201or both\202 expression\201s\202 does not contain a region, the operator +used is )BD(and)ES(.)LU( +This rule handles the cases of pure regions and pure column filters properly. +It unambiguously assigns the boolean )BD(and)ES( to all mixed cases. Thus: +) 1 34 PR( foo.fits[circle\20110,10,3\202,pi=1:5])RP( +and +) 1 34 PR( foo.fits[pi=1:5,circle\20110,10,3\202])RP( +both are equivalent to: +) 1 37 PR( foo.fits[circle\20110,10,3\202 && pi=1:5])RP( + +)0 P()-1 LI( When include files are used in filters, they now have implied +parentheses surrounding them. Thus, if a region file foo.reg contains two +regions \201e.g. circle 1 2 3 and circle 4 5 6\202, the syntax: +) 1 21 PR( pha=4:5&&@foo.reg)RP( +is equivalent to: +) 1 42 PR( pha=4:5 && \201circle 1 2 3 || cir 4 5 6\202)RP( +instead of: +) 1 40 PR( pha=4:5 && circle 1 2 3 || cir 4 5 6)RP( +and the pha filter is applied to both regions. + +)0 P()-1 LI( Filters and comments now can be terminated with the string +literal "\200n" as well as ";" and the new-line character. This means +that a region can have comments embedded in it: +) 1 72 PR( funcnts foo.fits "circle 512 512 10 # color=red\200n circle 512 512 20")RP( + +)0 P()-1 LI( Added capability to update the value of an existing parameter +after writing the table or image \201assuming the output image is a +disk file or is being redirected into a file\202. + +)0 P()-1 LI( Improved handling of parentheses in filter expressions. + +)0 P( +)-1 LI( Fixed a bug in image \201not event\202 regions in which circles and +annuli with radius of 1 pixel were not being processed. No counts and +no area would be found in such regions. + +)0 P()-1 LI( Fixed a bug in funcnts in which the radii column values for out of sync +if multiple annuli were specified \201instead of a single varargs or accel +annulus\202. + +)0 P()-1 LI( By default, fundisp will display integer image data as floats +if the BSCALE and BZERO header parameters are present. + +)0 P()-1 LI( Added -L switch to funhead to output starbase list format. + +)0 P()-1 LI( Changed the name of the routine _FunColumnSelect to +FunColumnSelectArr, in order to emphasize that it is not +a private routine. + +)0 P()-1 LI( Funcalc now checks to ensure that a column was specified as part of +the expression. + +)0 P()-1 LI( Funcalc local variables in the compiled program now use a "__" prefix +to avoid conflicts with user-defined variables. + +)0 P()-1 LI( Unofficial unsigned short \201bitpix=-16\202 image data now is scaled +correctly using BSCALE and BZERO header parameters. + +)0 P()-1 LI( Ported to Intel icc and gcc 3.3 compilers. + +)0 P()-1 LI( Updated wcs library to 3.5.1. + +)0 P()-1 LI( Changed license from public domain to GNU GPL. +)LU( + +)0 2 164 H()WB 250 Sn( Patch Release 1.2.2 \20118 May 2003\202)EH( +)UL( +)0 P( +)-1 LI( Fixed funcalc so that it now actually compiles an expression and +runs it, instead of getting a "filter compilation error". Oops! + +)0 P()-1 LI( Fixed bug in FunOpen in which the bracket specification was being +removed from the filename if a disk file was opened for "w" or "a". + +)0 P()-1 LI( Fixed bug in FunFlush which prevented two successive calls to +FunImagePut from writing the second extension header properly. + +)0 P()-1 LI( All filter routines now use gerror\201stderr, ...\202 call instead of +fprintf\201stderr, ...\202 so that output to stderr can be turned off \201via +setgerror\201level\202 or GERROR environment variable\202. + +)0 P()-1 LI( All standard Funtools programs check for GERROR environment +variable before setting gerror flag. + +)0 P()-1 LI( Some error messages about invalid region arguments were not being +printed. + +)0 P()-1 LI( FITS parameters/headers now conform more closely to FITS standard: +)UL()-1 LI( Blank keywords are treated in the same way as COMMENTS and HISTORY cards +)-1 LI( XTENSION keywords are now exactly 8 characters long +)-1 LI( 'E' is output instead of 'e' in floating point param values +)-1 LI( PCOUNT and GCOUNT are output correctly for image extensions +)-1 LI( EXTEND=T is output in primary header +)-1 LI( COMMENTS and HISTORY start in column 9)LU( +)LU( + +)0 2 165 H()WB 251 Sn( Patch Release 1.2.1 \20124 April 2003\202)EH( +)UL( +)0 P()-1 LI( Varargs ellipse and box annular regions were being +processed incorrectly when the following conditions all were met: +)UL()-1 LI( the region was specified in physical or wcs coordinates +)-1 LI( the data file contained LTM/LTV keywords, i.e., it +was blocked with respect to the original data file +)-1 LI( the program being run was an image program \201e.g. funcnts, funimage\202)LU( +Varargs ellipse and boxes are regions of the form: +) 2 43 PR( ellipse x y a1 b1 a2 b2 ... an bn [angle] + box x y l1 w1 l2 w2 ... ln wn [angle])RP( +where at least 2 sets of axis \201length\202 values were specified to form +an annulus \201i.e. simple ellipses and boxes worked properly\202. With all +of the above conditions met, a region in physical coordinates saw its +second length argument converted incorrectly from physical coordinates +to image coordinates. In simple terms, this means that funcnts did not +process elliptical or box regions in physical coords on blocked images +properly. Note that blocking on the command line \201e.g. foo.fits[*,*,2]\202 +did work when no LTM/LTV keywords existed in the file. + +)0 P()-1 LI( The fundisp -f switch now supports specification of +column-specific display formats as well as a more convenient way to +specify datatype-specific display formats. Both use keyword=value +specifiers. For columns, use: +) 1 58 PR( fundisp -f "colname1=format1 colname2=format2 ..." ...)RP( +e.g. +) 1 40 PR( fundisp -f "time=%13.2f pha=%3d" ...)RP( +You also can specify display formats for individual datatypes using the FITS +binary table TFORM variables as the keywords: +) 1 65 PR( fundisp -f "D=double_format E=float_format J=int_format etc.")RP( +e.g. +) 1 35 PR( fundisp -f "D=%13.2f I=%3d" ...)RP( +The old position-dependent syntax is deprecated. + +)0 P()-1 LI( Fundisp will now print out a single 16-bit \201or 32-bit\202 unsigned +int for a column whose data format is 16X \201or 32X\202, instead of +printing 2 \201or 4\202 unsigned chars. + +)0 P()-1 LI( Fixed bug in which fundisp was not able to display bitfield data for +raw event lists. + +)0 P()-1 LI( Previously, when binning columns used implicitly in a region +and explicitly in a filter could suffer from a case sensitivity problem. +This has been fixed. + +)0 P()-1 LI( Fixed internal mask=all switch on fundisp. + +)0 P()-1 LI( Filter include files now simply include text without changing the state +of the filter. They therefore can be used in expression. That is, if foo1 +contains "pi==1" and foo2 contains "pha==2" then the following expressions +are equivalent: +) 3 57 PR( "[@foo1&&@foo2]" is equivalent to "[pi==1&&pha==2]" + "[pha==1||@foo2]" is equivalent to "[pi==1||pha==2]" + "[@foo1,@foo2]" is equivalent to "[pi==1,pha==2]")RP( + +)0 P()-1 LI( Fixed bug in filter specification which caused a SEGV if a varargs-style +region was enclosed in parens. + +)0 P()-1 LI( Updated wcs library to 3.3.2. +)LU( + +)0 2 166 H()WB 252 Sn( Public Release 1.2.0 \20124 March 2003\202)EH( +)UL( +)0 P()-1 LI( BSCALE and BZERO are now always applied to int pixel data, instead of +only being applied if the desired output is floating point. +)LU( + +)0 2 167 H()WB 253 Sn( Beta Release 1.2.b3 \2014 February 2003\202)EH( +)UL( +)0 P()-1 LI( In FunColumnSelect, added the ability to specify an offset into +an array in the type specification, using the extended syntax: +) 1 48 PR( [@][n]<type>[[poff]][:[tlmin[:tlmax[:binsiz]]]])RP( +The [poff] string specifies the offset. For example, a type specification +such as "@I[2]" specifies the third \201i.e., starting from 0\202 element in +the array pointed to by the pointer value. A value of "@2I[4]" specifies +the fifth and sixth values in the array. + +)0 P()-1 LI( Added a non-varargs version of FunColumnSelect called _FunColumnSelect: +) 3 76 PR(int _FunColumnSelect\201Fun fun, int size, char *plist, + char **names, char **types, char **modes, int *offsets, + int nargs\202;)RP( + +)0 P()-1 LI( Added support for sorting binary tables by column name using: +funtable -s "col1 col2 ... coln" ... + +)0 P()-1 LI( Added the FUN_RAW macro which, when applied to the "name" parameter +of FunParamGets\201\202, returns the 80-character raw FITS card instead of +only the value. + +)0 P()-1 LI( Added support for comparing column values with binary masks of the +form 0b[01]+, e.g.: +) 1 23 PR( \201status&0b111\202==0b001)RP( +Previously, such masks had to be specified in decimal, octal, or hex. + +)0 P()-1 LI( Completed support for type 'L' \201logical\202 in fundisp and in filtering of +binary tables. + +)0 P()-1 LI( Fixed bug in funhist that was improperly setting the number of bins +when the data was of type float. + +)0 P()-1 LI( Fixed bug in filter/Makefile where the filter OBJPATH #define was +being passed to the wrong module. +)LU( + +)0 2 168 H()WB 254 Sn( Beta Release 1.2.b2 \2017 October 2002\202)EH( +)UL( +)0 P()-1 LI( Updated wcs library to 3.1.3. + +)0 P()-1 LI( Added support for reading gzip'ed files via stdin. +)LU( + +)0 2 169 H()WB 255 Sn( Beta Release 1.2.b1 \20124 September 2002\202)EH( +)UL( +)0 P()-1 LI( Added the following accelerators to region filtering: +) 8 73 PR( shape: arguments: + ----- --------- + BOX xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 + BOX xcenter ycenter xwlo yhin xwout yhhi n=[number] \201angle\202 + CIRCLE xcenter ycenter r1 r2 ... rn # same as annulus + CIRCLE xcenter ycenter rinner router n=[number] # same as annulus + ELLIPSE xcenter ycenter xw1 yh1 xw2 yh2 ... xwn yhn \201angle\202 + ELLIPSE xcenter ycenter xwlo yhin xwout yhhi n=[number] \201angle\202)RP( + +)0 P()-1 LI( Added the following new pandas \201Pie AND Annulus\202 to region filtering: +) 5 77 PR( shape: arguments: + ----- --------- + CPANDA xcen ycen ang1 ang2 nang irad orad nrad # same as panda + BPANDA xcen ycen ang1 ang2 nang ixlo iylo ixhi iyhi nrad \201ang\202 # box + EPANDA xcen ycen ang1 ang2 nang ixlo iylo ixhi iyhi nrad \201ang\202 # ellipse)RP( + +)0 P()-1 LI( Added support for filtering images using simple FITS image masks, +i.e. 8-bit or 16-bit FITS images where the value of a pixel is the +region id number for that pixel \201and therefore must be greater than +0\202. The image section being filtered must either be the same size as the +mask dimensions or else be an even multiple of the mask. This works with +image-style filtering, i.e., funcnts can utilize a mask on both +images and binary tables. + +)0 P()-1 LI( Added '$n' to fundisp column specification to allow display of +ordinal value of each row passing the filter. + +)0 P()-1 LI( Added code to support region filtering on image sections. + +)0 P()-1 LI( Fixed bugs which prevented filtering more than one ASCII region file. + +)0 P()-1 LI( Fixed bug occasionally causing filter slave processes to become zombies. + +)0 P()-1 LI( Fixed bugs in event filtering: annulus with inner radius of 0 +\201i.e., a circle\202 was rejecting events with coordinates xcen, ycen. +Also, pie with angles of 0 and 360 was rejecting some events. +Image filtering \201e.g. funcnts\202 did not have these problems. + +)0 P()-1 LI( Filters now accept global exclude regions without an include region. +In such a case, the field region is implied. That is, "-circle\201x,y,r\202" +is equivalent to "field; -circle\201x,y,r\202", etc. + +)0 P()-1 LI( Fixed panda so that it can be used as a global exclude. + +)0 P()-1 LI( Allow empty ds9 region file \201comments and globals only\202 to be +a valid filter. Totally ignore zero length region or include file. + +)0 P( +)-1 LI( Fixed funcnts bug that was displaying 0 value as inner radius of +a circle, instead of just one radius value. +)LU( + +)0 2 170 H()WB 256 Sn( Public Release 1.1.0 \20122 April 2002\202)EH( + +)0 P(New features include: +)UL()0 P()-1 LI( Funtools programs now accept gzip'ed files as valid input. + +)0 P()-1 LI( Improved security via replacement of system\201\202 function. + +)0 P()-1 LI( fundisp, funcnts, funhist can output starbase/rdb format \201tabs between columns, form-feeds between tables\202. + +)0 P()-1 LI( Improved support for Windows platform, as well as new support for Mac OSX.)LU( + +)0 2 171 H()WB 257 Sn( Pre-Release 1.1.0e \20110 April 2002\202)EH( +)UL( + +)0 P()-1 LI( Added enough support to skip over variable length arrays in BINTABLES. +We will add full support if this non-standard construct becomes more widely +used. + +)0 P()-1 LI( Fixed bug in underlying fitsy _gread\201\202 routine that was returning +an arbitrary bytes-read value if the input fd was invalid. +)LU( + +)0 2 172 H()WB 258 Sn( Pre-Release 1.1.0e \20119 March 2002\202)EH( +)UL( + +)0 P()-1 LI( Added additional check for Windows/PC to filter/Nan.h. + +)0 P()-1 LI( Upgraded zlib library to 1.1.4 \201fix double free security hole\202. +)LU( + + +)0 2 173 H()WB 259 Sn( Pre-Release 1.1.0e \20127 February 2002\202)EH( +)UL( + +)0 P()-1 LI( Changed filter/process.[ch] to filter/zprocess.[ch] to avoid name +collision with Cygwin include file. + +)0 P()-1 LI( Added -a switch to funhead to display all headers in a FITS file. +)LU( + +)0 2 174 H()WB 260 Sn( Pre-Release 1.1.0e \20111 February 2002\202)EH( +)UL( + +)0 P()-1 LI( Fixed filter parser so that it ignores ds9 "ruler" and "text" markers +only up to the first \200n or ; \201was ignoring to last \200n\202. + +)0 P()-1 LI( The NBLOCK parameter in fitsy/headdata.c was too large for Mac OS X +\201max size of a declared char buf seems to be about .5 Mb\202. +)LU( + +)0 2 175 H()WB 261 Sn( Beta Release 1.0.1b5 \20131 January 2002\202)EH( +)UL( + +)0 P()-1 LI( Fixed bug introduced in calculated IRAF LTM values in 1.0.1b3. + +)0 P()-1 LI( Fixed bug in filter parser giving wrong answers when two range +lists were combined with and explicit boolean operator: +) 1 34 PR( $ fundisp $S"[x=512&&y=511,512]")RP( +incorrectly acted like: +) 1 39 PR( fundisp $S"[\201x=512&&y=511\202||\201y=512\202]")RP( +instead of: +) 1 37 PR( fundisp $S"[x=512&&\201y=511||y=512\202]")RP( +In general, we recommend use of explicit parentheses. + +)0 P()-1 LI( Fixed filter/NaN.h to recognize Compaq Alpha again \201broken by their last change to cc\202. + +)0 P()-1 LI( Removed redundant varargs definitions that conflicted with Alpha compiler definitions. + +)0 P()-1 LI( Added blank line to inc.sed to work around Apple Mac OS X bug in which the +"i" \201insert\202 command was treating final \200\200 as continuation \200 in the text. + +)0 P( +)-1 LI( Added include of mkrtemp.h to mkrtemp.c to get conditional compilation +for Mac OSX. + +)0 P()-1 LI( Added support for --with-zlib to fitsy so that ds9 could use its own +copy of zlib \201and not build the copy in fitsy\202. + +)0 P()-1 LI( Removed config.cache and Makefile files from distribution tar file. +)LU( + +)0 2 176 H()WB 262 Sn( Beta Release 1.0.1b4 \20126 January 2002\202)EH( +)UL( + +)0 P()-1 LI( Make explicit that column filters are not permitted in an image +expression \201such as the funcnts region arguments\202. + +)0 P()-1 LI( Fix bug in region parser in which a region \201without parens\202, +followed immediately by an operator: +) 1 24 PR( circle 512 512 .5&)SY(\160)ES(==1)RP( +was not processing the final argument of the region correctly. + +)0 P()-1 LI( Ignore new "tile" directive in filters \201used by ds9\202. +)LU( + +)0 2 177 H()WB 263 Sn( Beta Release 1.0.1b3 \2014 January 2002\202)EH( +)UL( + +)0 P()-1 LI( Made modifications to Makefile.in to make releases easier. + +)0 P()-1 LI( Added instructions Makefile.in so that funtools.h will always +have correct #defines for FUN_VERSION, FUN_MAJOR_VERSION, +FUN_MINOR_VERSION, and FUN_PATCH_LEVEL. + +)0 P()-1 LI( Allow #include statements in funcalc program files. + +)0 P()-1 LI( funimage now updates all 4 CDX_Y values by the block factor. + +)0 P()-1 LI( Minor changes to make funtools work under darwin \201Mac OS X\202. +)LU( + +)0 2 178 H()WB 264 Sn( Beta Release 1.0.1b2 \20114 November 2001\202)EH( +)UL( + +)0 P()-1 LI( Fixed FunOpen\201\202 bug \201introduced in b1\202 in which filenames without +extensions SEGV'ed on open. Yikes! + +)0 P()-1 LI( Funmerge now extends the tlmin/tlmax values of the output +binning columns so that merged events from widely separated files are +valid in the output table. + +)0 P()-1 LI( In funhist, added -w switch to specify bin width \201lo:hi:width\202 +instead of number of bins \201lo:hi:num\202. Added support for this new +width option in funtools.ds9. + +)0 P()-1 LI( If a tdbin value was set using bincols=\201name:tlmin:tlmax:tdbin, ...\202, +the WCS parameters were not being updated properly. + +)0 P()-1 LI( Cleaned up build support for zlib. +)LU( + +)0 2 179 H()WB 265 Sn( Beta Release 1.0.1b1 \2016 November 2001\202)EH( +)UL( + +)0 P()-1 LI( Added support for gzip'ed files to the underlying fitsy/gio +library. This means that all funtools programs now accept gzip'ed +files as valid input: +) 1 41 PR( funcnts foo.fits.gz "circle 504 512 10")RP( +It is no longer necessary to run gunzip and pipe the results to +stdin of a funtools program. + +)0 P()-1 LI( Funtools tasks are now placed in a sub-menu in the DS9 Analysis +menu, instead of at the top level. + +)0 P()-1 LI( Fixed a bug in funcnts in which the bottom-most pixel of a small +circle or annulus region could be missed when the region is only one +pixel wide for that value of y. + +)0 P()-1 LI( Added -n switch to funhist so that table histograms could be +normalized by the width of the bin \201val/\201hi_edge-lo_edge\202\202. + +)0 P()-1 LI( Added -T switch to fundisp, funcnts, funhist to output in +starbase/rdb format \201uses tabs instead of spaces between columns, +form-feeds between tables, etc.\202 + +)0 P()-1 LI( Fixed a bug in which the field\201\202 region was not being properly +processed in combination with an image section. This could affect +funcnts processing of image data where an image section was specified +\201though it usually resulted in a funcnts error\202. + +)0 P()-1 LI( Fixed bug in display of binary table header for vector columns. + +)0 P()-1 LI( Filters now recognize hex constants \201starting with 0x\202 and long +constants \201ending with L\202. + +)0 P()-1 LI(Filenames containing a ':' are now only treated as sockets if they +actually are in the form of a valid ip:port. + +)0 P()-1 LI(Replaced funtools.ds9 with a new version that calls a new funds9 +script, instead of calling funcnts or funhist directly. The new script +supports gzip'ed files and bracket specifications on filenames at the +same time, which the direct call could not. Also the new script has +better error reporting. + +)0 P()-1 LI( Replaced system\201\202 call used to compile filter and funcalc +expression with a special launch\201\202 call, which performs execvp\201\202 +directly without going through sh. \201launch\201\202 works under DOS and has +fewer security problems.\202 + +)0 P()-1 LI( Fixed image filter code in which the field\201\202 region was being ignored +if it was combined with one or more exclude regions \201and no other include +regions\202, resulting in no valid pixels. + +)0 P()-1 LI( Changed use of getdtable\201\202 to FD_SETSIZE in calls to select\201\202. + +)0 P()-1 LI( Added code to guard against FITS binary tables without proper TFORMx +parameters. + +)0 P()-1 LI( Added support to FunParamGets so that it returns the raw FITS card +if the specified input name is NULL and the input n value is positive. + +)0 P()-1 LI( Fixed bug in underlying fitsy code that set the comment in a +header parameter. +)LU( + + +)0 2 180 H()WB 266 Sn( Public Release 1.0.0 \20131 July 2001\202)EH( +)UL( +)0 P()-1 LI( "a new day with no mistakes ... yet")LU( + +)2 1 1 HR()0 0 1 A(Index to the Funtools Help Pages)0 0 TN TL()Ec /AF f D( +)0 5 181 H(Last)WB 267 Sn( updated: 22 April 2002)EH( +)WB NL +/TE t D NP TU PM 0 eq and{/Pn () D showpage}if end restore |