ROOTANA
Loading...
Searching...
No Matches
analyzerDoc.cxx
Go to the documentation of this file.
1/*! \page analyzerClass Analyzer Classes
2
3\section analyzerIntro Introduction
4
5
6This set of classes provides the following functionality
7
8- A class TRootanaEventLoop that handles most of the functionality associated
9with an event loop. The user creates a derived class that inherits from TRootanaEventLoop.
10- A set of bank decoder classes.
11
12These classes depend on the Midas interface classes (TMidasFile, TMidasEvent, TMidasOnline).
13
14\section eventLoop Event Loop Class
15
16The TRootanaEventLoop provides the functionality to handle many of the features for a standard
17event loop including
18
19- looping over events in a midas file or
20- getting online events by connecting to midas server
21
22The idea is that the user provides a class that derives from TRootanaEventLoop. This derived class
23would provides begin-of-run actions, end-of-run actions and midas event actions.
24
25The following simple example shows a full program that simply prints out the event number for
26each event:
27
28
29\verbatim
30#include <stdio.h>
31#include "TRootanaEventLoop.hxx"
32
33class Analyzer: public TRootanaEventLoop {
34public:
35
36 Analyzer() {};
37
38 virtual ~Analyzer() {};
39
40 void BeginRun(int transition,int run,int time){}
41
42 // Get the midas event and print event number
43 bool ProcessMidasEvent(TDataContainer& dataContainer){
44 std::cout << "Event Number " << dataContainer.GetMidasEvent().GetSerialNumber() << std::endl;
45 return true;
46 }
47};
48
49int main(int argc, char *argv[])
50{
51 Analyzer::CreateSingleton<Analyzer>();
52 return Analyzer::Get().ExecuteLoop(argc, argv);
53}
54\endverbatim
55
56
57
58
59\section histogramCreation Histogram Creation, Begin-Of-Run/End-Of-Run
60
61Users will naturally want to create and fill ROOT histograms.
62This needs to be done with some care because of:
63- interaction with the output ROOT file: by default, for each run, the analyzer opens a new ROOT file outputNNNNN.root
64and make it the current directory (gOutputFile) for newly created ROOT objects, i.e. those create by "new TH1(...)".
65At the end of a run, all these objects are saved into the file, the file is closed and all these objects disappear
66from memory. To create ROOT objects that persist across runs, use some other ROOT directory (i.e. gOnlineHistDir->cd()).
67- when using the netDirectoryServer (HAVE_LIBNETDIRECTORY), the contents of gOnlineHistDir and gOutputFile are
68exported to outside applications. Other programs, i.e. ROODY, can use TNetDirectory to "see" the histograms
69(and other objects) as they are filled. (Note: this does not work for most TTree objects because they cannot
70be easily "exported").
71
72The general rule is therefore that you should create histograms in your event loop BeginRun() function, rather than
73in the constructor or the Initialize() method. That is the only way to ensure that the histograms are created after the
74output ROOT file is created. Also, you should ensure that you delete the old histograms before producing new ones. The following
75example shows how this would look:
76
77\verbatim
78#include <stdio.h>
79#include "TRootanaEventLoop.hxx"
80#include <TH1F.h>
81
82class Analyzer: public TRootanaEventLoop {
83private:
84
85 TH1F* evtno_histo; // histogram the event numbers.
86
87public:
88
89 Analyzer() {
90 evtno_histo = 0; // initialize pointer to null.
91 };
92
93 virtual ~Analyzer() {};
94
95 void BeginRun(int transition,int run,int time){
96 // delete old histogram, if it exists.
97 TH1F *old = (TH1F*)gDirectory->Get("evtno_histo");
98 if (old) delete old;
99
100 // create new histogram
101 evtno_histo = new TH1F("evtno_histo","Event Number Histogram",1000,0,10000);
102 }
103
104 bool ProcessMidasEvent(TDataContainer& dataContainer){
105 evtno_histo->Fill(dataContainer.GetMidasEvent().GetSerialNumber());
106 return true;
107 }
108};
109
110int main(int argc, char *argv[])
111{
112 Analyzer::CreateSingleton<Analyzer>();
113 return Analyzer::Get().ExecuteLoop(argc, argv);
114}
115\endverbatim
116
117You also have disable the automatic creation of ROOT files for each run by using the
118function TRootanaEventLoop::DisableRootOutput(true) and then create histograms where ever
119you want in your program.
120
121
122\section decoder Bank Decoder
123
124Naturally we want to do more than just checking the event numbers; we need to process the data in
125the data banks. The rootana analyzer classes facilitate this by providing decoding
126classes for a number of standard MIDAS banks.
127
128Since the data being stored in each bank is different, the format of the decoder classes will also be
129quite different. You should see the individual decoders to see how the data is organized;
130for now we currently have the following decoders:
131- TV792Data
132- TV1190Data
133- TMesytecData
134
135The following example shows how to acces information for a particular V792 bank called 'ADC0' and
136histogram the results:
137
138
139\verbatim
140#include <stdio.h>
141#include "TRootanaEventLoop.hxx"
142#include <TH1F.h>
143#include <TV792Data.hxx>
144
145class Analyzer: public TRootanaEventLoop {
146private:
147
148 TH1F* adc; // ADC spectrum for all V792 channels in bank.
149
150public:
151
152 Analyzer() {
153 adc = 0; // initialize pointer to null.
154 };
155
156 virtual ~Analyzer() {};
157
158 void BeginRun(int transition,int run,int time){
159 // delete old histogram, if it exists.
160 TH1F *old = (TH1F*)gDirectory->Get("adc");
161 if (old) delete old;
162
163 // create new histogram
164 adc = new TH1F("adc","V792 ADC Spectrum",4200,0,4200);
165 }
166
167 bool ProcessMidasEvent(TDataContainer& dataContainer){
168
169 // Get pointer to the V792 decoded data; need to provide the
170 // bank name.
171 TV792Data *data = dataContainer.GetEventData<TV792Data>("ADC0");
172 if(data){
173 // Loop over all measurement for all channels
174 std::vector<VADCMeasurement> measurements = data->GetMeasurements();
175 for(unsigned int i = 0; i < measurements.size(); i++){ // loop over measurements
176 adc->Fill(measurements[i].GetMeasurement());
177 }
178 }
179
180 return true;
181 }
182};
183
184int main(int argc, char *argv[])
185{
186 Analyzer::CreateSingleton<Analyzer>();
187 return Analyzer::Get().ExecuteLoop(argc, argv);
188}
189\endverbatim
190
191
192
193You can also get access to the raw information in the MIDAS banks, if you haven't yet
194written a decoder for a particular bank type. You do this by doing accessing a bank using
195the TGenericData class.
196
197\section analyzerFlowControl Program Flow Control
198
199The following images try to describe the program flow graphically. This is largely the same information
200as what is described above, but presently differently.
201
202
203\image html event_loop_offline_diagram.png "Program flow for offline rootana analyzer" width=10cm
204
205\image html event_loop_online_diagram.png "Program flow for online rootana analyzer" width=10cm
206
207
208\section histogram Histogram Classes
209
210We also provide an ABC class for set of histograms: THistogramArrayBase.
211The derived histogram-set class would specify how to create and fill an interesting
212set of histograms.
213The hope is that these generic histogram-sets would make it easy to provide
214generic analyzer displays.
215
216It remains to be seen how useful these histogram-set classes
217are in other context.
218
219T. Lindner
220*/
221