Output » History » Version 1
Ole Hansen, 03/30/2018 10:16 PM
1 | 1 | Ole Hansen | h1. Configuring Analysis Output |
---|---|---|---|
2 | |||
3 | Bob Michaels |
||
4 | |||
5 | e-mail: rom@jlab.org |
||
6 | |||
7 | h2. FEATURES |
||
8 | |||
9 | Class THaOutput can be used to control the output of the new Root/C++ analyzer . The output is defined by an output definition file, e.g. what is specified when you do 'analyzer->SetOdefFile("output.def");' and has the following elements. Note: To get vectorized formulas and histograms you must be using version 1.1 and higher of the analyzer. To get EPICS and Scaler data you need version 1.2. |
||
10 | |||
11 | * Global variables written to the tree. Can include arrays -- fixed or variable size. To see a list of variables, type 'gHaVars->Print()' at the analyzer prompt. |
||
12 | * Blocks of variables, e.g. L.* is everything in Left Spectrometer. |
||
13 | * Formulas involving variables. These can be vectors. |
||
14 | * Cuts. They appear in tree as 0 (false) or 1 (true). Also can be vectors. |
||
15 | * Histograms. These can involve variables and/or formul40.65a, as well as optional cuts. The histograms can be vectors depending on the rules for dimensionality. |
||
16 | * EPICS data (slow controls variables recorded in datastream.) |
||
17 | * Scalers (i.e. data from devices called scalers that count things). |
||
18 | |||
19 | h2. SYNTAX of "output.def" FILE |
||
20 | |||
21 | To add global variables, formulas, and histograms, the |
||
22 | syntax of each line of "output.def" is of the form |
||
23 | |||
24 | <pre> |
||
25 | keyword rest-of-line |
||
26 | </pre> |
||
27 | |||
28 | where the keywords are as follows : |
||
29 | (keywords are case-insensitive, the rest of the line is not) |
||
30 | |||
31 | VARIABLE -- indicates that a global variable is to |
||
32 | be added to the tree. The next string is |
||
33 | the name of the variable. You can see a list |
||
34 | of variables by typing gHaVars->Print() at |
||
35 | the analyzer's root shell prompt. |
||
36 | A variable can also be an array, e.g. R.s1.lt |
||
37 | Then the values in the tree will be R.s1.lt[0], |
||
38 | R.s1.lt[1], etc, up to the array size which |
||
39 | is Ndata.R.s1.lt |
||
40 | |||
41 | BLOCK -- An entire block of variables are written to the |
||
42 | output. E.g. "L.*" writes all Left HRS variables. |
||
43 | |||
44 | FORMULA -- indicates a THaFormula to add to the output. |
||
45 | The next word will be the "name" of the formula result |
||
46 | in the tree. The 3rd string is the formula to evaluate. |
||
47 | Note, it cannot have spaces in it. |
||
48 | Formulas can be vectors if the arrays are fixed size. |
||
49 | |||
50 | CUT -- Like a formula, but the data are 0 (false) or 1 (true) |
||
51 | |||
52 | TH1F, TH2F, TH1D, TH2D -- defines histograms (1D or 2D). |
||
53 | The next word is the name of the object. |
||
54 | The following string (must be in single quotes) is 40.65 |
||
55 | the title of the histogram. Next, the variables |
||
56 | or formulas names that are put into the histogram |
||
57 | are listed together with bin info: nbin, xlo, xhi and if 2D |
||
58 | the same bin info for y. Optional cuts can be specified |
||
59 | at the end of the line. See examples below. |
||
60 | |||
61 | One can add EPICS data or SCALER data to the output with a pair of |
||
62 | ("begin", "end") statements in the output.def file. This adds the data |
||
63 | to both the main tree as well as to new trees. The new trees are "E" |
||
64 | for epics data, and "left" or "right" for the left and right HRS scalers. |
||
65 | |||
66 | begin epics40.65 |
||
67 | # put list of variables here |
||
68 | end epics |
||
69 | |||
70 | And for the "left" spectrometer scalers (similarly for "right"): |
||
71 | |||
72 | begin scalers left |
||
73 | # put list of variables here |
||
74 | end scalers |
||
75 | |||
76 | |||
77 | h2. LEARN BY EXAMPLE |
||
78 | |||
79 | <pre> |
||
80 | # -------- Example output.def -------------------------- |
||
81 | |||
82 | # Variables appear in the tree. |
||
83 | |||
84 | variable L.s1.lt[4] |
||
85 | variable L.s1.rt40.65 |
||
86 | |||
87 | # The 'block' variables: All data in Right HRS go to tree. |
||
88 | block R.* |
||
89 | |||
90 | # Formulas can be scalers or vectors. |
||
91 | # Lt4a is a scaler. |
||
92 | formula Lt4a 5.*L.s1.lt[4] |
||
93 | # Lt4b is a vector. Access by Lt4b[0], Lt4b[1],... |
||
94 | formula Lt4b 5.*L.s1.lt |
||
95 | # Tsm is a vector |
||
96 | formula Tsm 4*L.s1.lt+2*L.s1.rt+3*L.s1.lt[4] |
||
97 | # Tsm[0] = 4*L.s1.lt[0]+2*L.s1.rt[0]+3*L.s1.lt[4] |
||
98 | # Tsm[1] = 4*L.s1.lt[1]+2*L.s1.rt[1]+3*L.s1.lt[4] |
||
99 | # etc... |
||
100 | |||
101 | # Cuts can be defined globally and used in histograms. |
||
102 | # Cut C1 is a scaler. Data is 0 or 1. |
||
103 | cut C1 L.s1.lt[4]>1350 |
||
104 | # Cut C2 is a vector. Access as C2[0], C2[1],... |
||
105 | cut C2 L.s1.lt>1160 |
||
106 | |||
107 | # Histograms can involve formulas, variables, and cuts. |
||
108 | # th1f, th1d, th2f, th2d supported. |
||
109 | # Formulas and cuts may be global, or defined in the line. |
||
110 | # Histograms are vector or scalers whose dimensionality is |
||
111 | # determined by the dimensionality of its components. |
||
112 | # 1. dim(X)>=0 && dim(Y)==0 && dim(Cut)==0 --> Data in 1 histo, |
||
113 | # and if dim(X)>1 all components go into 1 histo. |
||
114 | # 2. dim(X)>1 && (dim(Y)>1 || dim(Cut)>1) --> vector of histos |
||
115 | # appear in output, the dim's must match and the indices track. |
||
116 | # The "eye" variable [I] becomes an index that tracks the |
||
117 | # index of the accompanying variable. L.s1.lt[I] is synonymous |
||
118 | # with L.s1.lt. |
||
119 | # Prefixes SUM:, OR:, and AND: supported. |
||
120 | # SUM: the sum of variables or sum of a vector formula. |
||
121 | # AND:, OR: logical "and","or" of cut conditions. |
||
122 | |||
123 | TH1F rv1n 'L-arm vdc hits on V1' L.vdc.v1.nhit 10 0 10 |
||
124 | th1f rv1w 'L-arm vdc wiremap on V1' L.vdc.v1.wire 200 0 400 |
||
125 | TH1F rv1z 'L-arm vdc TDC on V1' L.vdc.v1.rawtime 200 0 2500 |
||
126 | TH1d hLt4 'Lt4a formula' Lt4a 100 0 9000 |
||
127 | th1d hLta 'Lt4b formula' Lt4b 100 0 9000 |
||
128 | TH1F Lt4c0 'Lt4 from var, no cut' L.s1.lt[4] 100 -1 2000 |
||
129 | TH1F Lt4c1 'Lt4 from var, cut' L.s1.lt[4] 100 -1 2000 L.s1.lt[4]>1300. |
||
130 | TH1F Lt4c2 'Lt4 from var, cut C1' L.s1.lt[4] 100 -1 2000 C1 |
||
131 | TH1F Lt4c3 'Lt4 from formula, cut C1' Lt4a 100 -1 9000 C1 |
||
132 | TH1F Lts1 'L.s1.rt (all elements)' L.s1.rt 100 -1 2000 |
||
133 | # Since Lt4b and C2 are vectors, get histograms Ltv0, Ltv1, ... Ltv5 |
||
134 | TH1F Ltv 'Vector formula, cut C2' Lt4b 100 -1 20000 C2 |
||
135 | # The "eye" variable as R. Feuerbach requested |
||
136 | TH2F a1eye 'Eye test 1' [I] L.s1.lt 14 0 7 100 0 2000 |
||
137 | TH2F a2eye 'Eye test 2' [i] L.s1.lt[I] 14 0 7 100 0 2000 # same as above |
||
138 | TH2F a3eye 'Eye test 3' [I] Lt4b 14 0 7 100 0 9000 |
||
139 | TH2F a4eye 'Eye test 4' [I] Lt4b 14 0 7 100 0 9000 L.s1.lt>1300 |
||
140 | TH2F a5eye 'Eye test 5' [I] Lt4b 14 0 7 100 0 9000 C2 |
||
141 | # Prefixes (SUM: OR: AND:) |
||
142 | TH1F Lsum1 'Test of sum 1' SUM:L.s1.lt 100 0 15000 |
||
143 | TH2f Lsum2 'Test of sum 2' SUM:L.s1.rt SUM:L.s1.rt 100 0 15000 100 0 2000 |
||
144 | TH1F Lor1 'Test of or 1' L.s1.lt[4] 100 0 2000 OR:L.s1.lt>1000 |
||
145 | TH1F Lor2 'Test of or 2' L.s1.lt 100 0 2000 OR:L.s1.lt>1000 |
||
146 | TH1F Land1 'Test of and 1' L.s1.lt 100 0 2000 AND:L.s1.lt<1200 |
||
147 | |||
148 | |||
149 | # -------------------------------------------------- |
||
150 | # For reference, here is a collection of things that do NOT work. |
||
151 | # Cannot define formula in terms of variable sized arrays. |
||
152 | # Exception: 'formula Lv1w L.vdc.v1.wire' results in Lv1w[0], Lv1w[1]... |
||
153 | # formula Lw2 L.vdc.v1.wire[2] # error |
||
154 | # formula Lw3 3*L.vdc.v1.wire # error |
||
155 | # A cut defined by a formula does NOT work. Perhaps in future. |
||
156 | # cut C4 Lta>1160 |
||
157 | # Cannot use prefix like SUM: inside a formula. |
||
158 | # TH1F Lnot 'Invalid test1' 3*SUM:L.s1.lt 100 0 20000 |
||
159 | # If Lta is a formula, then cut = Lta>1160 is illegal. |
||
160 | # Must instead write the formula explicitly. |
||
161 | # TH1F Lte 'Lta vector formula, cut 3' Lta 100 -1 2000 Lta>1160 |
||
162 | |||
163 | |||
164 | # -------------------------------------------------- |
||
165 | # EPICS data to appear in regular event tree ("T") and |
||
166 | # a new EPICS tree ("E"). The E tree is only filled |
||
167 | # on EPICS events. The E tree also has a timestamp. |
||
168 | # Access via T->Draw("hac_bcm_average") |
||
169 | # and E->Draw("hac_bcm_average") |
||
170 | # and E->Draw("hac_bcm_average:timestamp") |
||
171 | # Notice that slia:DataValid appears in the |
||
172 | # tree as slia_DataValid (i.e. ":" is replaced |
||
173 | # by "_"). This replacement makes TTree::Draw |
||
174 | # work properly. Note also, the value of |
||
175 | # slia_DataValid is 71 if slia:DataValid |
||
176 | # was "Yes" (case senstive!), 422 if "No" and |
||
177 | # 0 otherwise. |
||
178 | |||
179 | begin epics |
||
180 | hac_bcm_average |
||
181 | IPM1H04A.XPOS |
||
182 | IPM1H04A.YPOS |
||
183 | IPM1H04B.XPOS |
||
184 | IPM1H04B.YPOS |
||
185 | slia:DataValid Yes=71 No=422 |
||
186 | end epics |
||
187 | |||
188 | # Rules about EPICS variable assignment: |
||
189 | # You can now do things like this in |
||
190 | # the output definition file |
||
191 | |||
192 | begin epics |
||
193 | FB_A:use_RF 'RF On'=14 'RF Off'=52 |
||
194 | slia:DataValid Yes=1 No=0 |
||
195 | end epics |
||
196 | |||
197 | # The rule is that everything between single |
||
198 | # quotes is EPICS data (string type) which, |
||
199 | # if found in the datastream, gets assigned |
||
200 | # the numerical value after the equal sign. |
||
201 | # So, if the string "RF On" is found, you get |
||
202 | # 14 in the tree. The strings with white space |
||
203 | # must contain single quotes. The other strings |
||
204 | # could contain single quotes, but it is not |
||
205 | # necessary (e.g. slia:DataValid 'Yes'=1). |
||
206 | |||
207 | # Examples of *GOOD* syntax: |
||
208 | |||
209 | begin epics |
||
210 | hac_bcm_average |
||
211 | IPM1H04A.XPOS |
||
212 | FB_A:use_RF 'RF On'=14 'RF Off'=52 |
||
213 | slia:DataValid Yes=1 No=0 |
||
214 | hla:DataValid Fred=2 'No'=22 Yes==452 |
||
215 | end epics |
||
216 | |||
217 | # Examples of *BAD* syntax: |
||
218 | |||
219 | begin epics |
||
220 | Joe Momma # erroneous space |
||
221 | FB_A:use_RF 'RF On=14 # missing a quote |
||
222 | slia:DataValid Yes = 1 # erroneous space |
||
223 | hla:DataValid Fred= 2 # erroneous space |
||
224 | end epics |
||
225 | |||
226 | |||
227 | |||
228 | |||
229 | # -------------------------------------------------- |
||
230 | # Scalers to appear in the regular event tree ("T") and |
||
231 | # new scaler trees, one for each bank. |
||
232 | # Banks are "right", "left" (and perhaps 3rd arm). |
||
233 | # Access to data: |
||
234 | # T->Draw("right_bcm_u1"), right->Draw("bcm_u1") for R-arm |
||
235 | # T->Draw("left_bcm_u1"), left->Draw("bcm_u1") for L-arm |
||
236 | # "default" and "default_helicity" cause a list |
||
237 | # of normalization scalers to appear. Examples: |
||
238 | # T->Draw("right_trigger_1") from default list |
||
239 | # T->Draw("right_P_trigger_1") helicity plus ("P") |
||
240 | # T->Draw("right_M_trigger_1") helicity minus ("M") |
||
241 | # also right->Draw("trigger_1"), etc. appear. |
||
242 | # Implictly the values are RATES (Hz) unless one |
||
243 | # specifies the "counts" flag. |
||
244 | # "myclk 8 7" is a rate from slot 8 chan 7 and |
||
245 | # appears as T->Draw("myclk"). |
||
246 | # "myclkc 8 7 counts" are raw counts, slot 8, chan 7. |
||
247 | |||
248 | begin scalers right |
||
249 | default # this expands to "trigger_1", "bcm_u1", etc... |
||
250 | default_helicity # expands to "P_trigger_1", "M_trigger_1" ... |
||
251 | mypulser 7 3 |
||
252 | myclk 8 7 |
||
253 | myclkc 8 7 counts |
||
254 | end scalers |
||
255 | |||
256 | begin scalers left |
||
257 | default |
||
258 | default_helicity |
||
259 | mypulser 4 3 |
||
260 | myclk 4 7 |
||
261 | myclkc 4 7 counts |
||
262 | end scalers |
||
263 | </pre> |
||
264 | |||
265 | |||
266 | h2. EXPECTED RESULTS |
||
267 | |||
268 | Below is a table showing examples of lines in the output definition file (output.def) and the corresponding expected output. |
||
269 | |||
270 | |\3=.Behavior of Output | |
||
271 | |_.output.def line |_.Example How to Access |_.Comments | |
||
272 | | @VARIABLE L.s1.lt[4]@ | @T->Draw("L.s1.lt[4]")@ | | |
||
273 | | @VARIABLE L.s1.rt@ | Tree has @L.s1.lt[i], i = 0,1,...Ndata.L.s1.lt@ | Array | |
||
274 | | @BLOCK R.*@ | @T->Draw("R.s1.lt[0]")@, etc. | All variables in Right (R) HRS | |
||
275 | | @FORMULA Lt4a 5*L.s1.lt[4]@ | @T->Draw("Lt4a")@ | Scaler Formula | |
||
276 | | @FORMULA Lt4b 5*L.s1.lt@ | Tree has @Lt4b[i], i = 0,1,...Ndata.Lt4b@ | Vector Formula | |
||
277 | | @CUT C1 L.s1.lt[4]>1350@ | @T->Draw("C1")@ | Scaler Cut | |
||
278 | | @CUT C2 L.s1.lt>1350@ | Tree has @C2[i], i = 0,1,...Ndata.C2@ | Vector Cut | |
||
279 | | @TH1F rs 'Scint' R.s1.lt 100 0 2000@ | @rs->Draw()@ | Histogram (all elements of @R.s1.lt[]@ in 1 histo) | |
||
280 | | @TH1F rs4 'Scint' R.s1.lt[4] 100 0 2000 R.s1.lt[4]>500@ | @rs4->Draw()@ | Cut @R.s1.lt[4]>500@ is optional | |
||
281 | | @TH1F rv 'Scint' R.s1.lt 200 0 2000 R.s1.lt>500@ | @rv0->Draw(), rv1->Draw, ... rv5->Draw()@ | Vector Histogram (size 6) | |