]>
Commit | Line | Data |
---|---|---|
3db1b975 | 1 | void processContainer(TObject* object, TTreeSRedirector* debugStreamer, TString name); |
e9b7df6d | 2 | void loadLibraries(); |
3db1b975 | 3 | void simpleTrending(TString inputFileName, Int_t run, TString filterExpr=".*", TString trendingFileName="trending.root", TString treeName="trending", TString fileOpenMode="update" ); |
e9b7df6d | 4 | |
5 | TString treeName; | |
6 | ||
3db1b975 | 7 | void simpleTrending(TString inputFileName, Int_t run, TString filterExpr, TString trendingFileName, TString debugTreeName, TString fileOpenMode ) |
e9b7df6d | 8 | { |
9 | ||
10 | // Dump the statistical information about all histograms in the file | |
11 | // into a tree | |
12 | // | |
13 | // | |
14 | // 1. Default dump for all histograms | |
15 | // Information to dump: | |
16 | // stat =Entries, Mean, MeanError, RMS, MaxBin | |
17 | // Branch naming convention: | |
18 | // <detName>_<hisName><statName> | |
19 | // | |
20 | // 2. Detector statistical information - to be implemented by expert | |
21 | // - First version implemented by MI | |
22 | // - updated for QA by MK | |
23 | // | |
24 | // | |
25 | ||
26 | loadLibraries(); | |
27 | ||
28 | treeName=debugTreeName; | |
29 | ||
30 | TFile *inputFile = TFile::Open(inputFileName.Data()); | |
31 | if (!inputFile) return; | |
32 | ||
33 | TList * keyList = inputFile->GetListOfKeys(); | |
34 | Int_t nkeys=keyList->GetEntries(); | |
3db1b975 | 35 | |
36 | TRegexp filterRegexp=filterExpr.Data(); | |
e9b7df6d | 37 | |
3db1b975 | 38 | //check if we have a matching container, only then create the output file |
e9b7df6d | 39 | TList* keyList=inputFile->GetListOfKeys(); |
40 | Int_t nkeys=keyList->GetEntries(); | |
3db1b975 | 41 | Bool_t containerExists=kFALSE; |
42 | for (Int_t i=0; i<nkeys; i++) | |
43 | { | |
44 | TObject* object=keyList->At(i); | |
45 | if (!object) continue; | |
46 | TString name=object->GetName(); | |
47 | if (name.Contains(filterRegexp)) | |
48 | { | |
49 | containerExists=kTRUE; | |
50 | break; | |
51 | } | |
52 | } | |
53 | if (!containerExists) | |
54 | { | |
55 | printf("container %s does not exist in %s\n",filterExpr.Data(),inputFileName.Data()); | |
56 | return; | |
57 | } | |
58 | ||
59 | TTreeSRedirector *pcstream = new TTreeSRedirector(trendingFileName,fileOpenMode); | |
60 | (*pcstream)<<treeName.Data()<<"run="<<run; | |
61 | ||
62 | //main loop over the top level objects, filtering is done here | |
e9b7df6d | 63 | for (Int_t i=0; i<nkeys; i++) |
64 | { | |
65 | TObject * object = inputFile->Get(keyList->At(i)->GetName()); | |
66 | if (!object) continue; | |
67 | TString name=object->GetName(); | |
3db1b975 | 68 | if (!name.Contains(filterRegexp)) continue; |
69 | processContainer(object,pcstream,name); | |
e9b7df6d | 70 | } |
71 | ||
72 | // | |
73 | // Expert dump example (MI first iteration): | |
74 | // | |
75 | // 0.) TOF dump | |
76 | // | |
77 | ||
78 | Int_t tofEvents=0; | |
79 | Int_t tofTracks=0; | |
80 | TList * TOFCalib = (TList*)inputFile->Get("TOFHistos"); | |
81 | if (TOFCalib) { | |
82 | TH1 *histoEvents = (TH1*)TOFCalib->FindObject("hHistoVertexTimestamp"); | |
83 | TH1 *histoTracks = (TH1*)TOFCalib->FindObject("hHistoDeltatTimestamp"); | |
84 | if (histoEvents && histoTracks){ | |
85 | tofEvents = TMath::Nint(histoEvents->GetEntries()); | |
86 | tofTracks = TMath::Nint(histoTracks->GetEntries()); | |
87 | } | |
88 | delete TOFCalib; | |
89 | } | |
90 | printf("Monalisa TOFevents\t%d\n",tofEvents); | |
91 | if (pcstream) (*pcstream)<<treeName.Data()<<"TOFevents="<<tofEvents; | |
92 | printf("Monalisa TOFtracks\t%d\n",tofTracks); | |
93 | if (pcstream) (*pcstream)<<treeName.Data()<<"TOFtracks="<<tofTracks; | |
94 | ||
95 | // | |
96 | // 1.) TPC dump - usefull events/tracks for the calibration | |
97 | // | |
98 | Int_t tpcEvents=0; | |
99 | Int_t tpcTracks=0; | |
100 | TObject* obj = dynamic_cast<TObject*>(inputFile->Get("TPCCalib")); | |
101 | TObjArray* array = dynamic_cast<TObjArray*>(obj); | |
102 | TDirectory* dir = dynamic_cast<TDirectory*>(obj); | |
103 | AliTPCcalibTime * calibTime = NULL; | |
104 | if (dir) { | |
105 | calibTime = dynamic_cast<AliTPCcalibTime*>(dir->Get("calibTime")); | |
106 | } | |
107 | else if (array){ | |
108 | calibTime = (AliTPCcalibTime *)array->FindObject("calibTime"); | |
109 | } | |
110 | if (calibTime) { | |
111 | tpcEvents = TMath::Nint(calibTime->GetTPCVertexHisto(0)->GetEntries()); | |
112 | tpcTracks = TMath::Nint(calibTime->GetResHistoTPCITS(0)->GetEntries()); | |
113 | } | |
114 | printf("Monalisa TPCevents\t%d\n",tpcEvents); | |
115 | if (pcstream) (*pcstream)<<treeName.Data()<<"TPCevents="<<tpcEvents; | |
116 | printf("Monalisa TPCtracks\t%d\n",tpcTracks); | |
117 | if (pcstream) (*pcstream)<<treeName.Data()<<"TPCtracks="<<tpcTracks; | |
118 | ||
119 | // | |
120 | // 2. TRD dump | |
121 | // | |
122 | Int_t trdEvents=0; | |
123 | Int_t trdTracks=0; | |
124 | TList * TRDCalib = (TList*)inputFile->Get("TRDCalib"); | |
125 | if (TRDCalib) { | |
126 | TH1 *histoEvents = (TH1*)TRDCalib->FindObject("NEventsInput_AliTRDCalibTask"); | |
127 | TH1 *histoTracks = (TH1*)TRDCalib->FindObject("AbsoluteGain_AliTRDCalibTask"); | |
128 | if (histoEvents && histoTracks){ | |
129 | trdEvents= TMath::Nint(histoEvents->GetEntries()); | |
130 | trdTracks= TMath::Nint(histoTracks->GetEntries()); | |
131 | } | |
132 | delete TRDCalib; | |
133 | } | |
134 | printf("Monalisa TRDevents\t%d\n",trdEvents); | |
135 | if (pcstream) (*pcstream)<<treeName.Data()<<"TRDevents="<<trdEvents; | |
136 | printf("Monalisa TRDtracks\t%d\n",trdTracks); | |
137 | if (pcstream) (*pcstream)<<treeName.Data()<<"TRDtracks="<<trdTracks; | |
138 | ||
139 | // | |
140 | // 3. T0 dump | |
141 | // | |
142 | Int_t T0Events=0; | |
143 | TList * T0Calib = (TList*)inputFile->Get("T0Calib"); | |
144 | if (T0Calib) { | |
145 | TH1 *histoEvents = (TH1*) T0Calib->FindObject("fTzeroORAplusORC"); | |
146 | if (histoEvents){ | |
147 | T0Events= TMath::Nint(histoEvents->GetEntries()); | |
148 | } | |
149 | delete T0Calib; | |
150 | } | |
151 | printf("Monalisa T0events\t%d\n",T0Events); | |
152 | if (pcstream) (*pcstream)<<treeName.Data()<<"T0events="<<T0Events; | |
153 | ||
154 | // | |
155 | // 4. Mean vertex - dump | |
156 | // Not present in CPass1 | |
157 | /* | |
158 | Int_t meanVertexEvents=0; | |
159 | TList * meanVertexCalib = (TList*)inputFile->Get("MeanVertex"); | |
160 | if (meanVertexCalib) { | |
161 | TH1 *histoEvents = (TH1*) meanVertexCalib->FindObject("hTRKVertexX"); | |
162 | if (histoEvents){ | |
163 | meanVertexEvents = TMath::Nint(histoEvents->GetEntries()); | |
164 | } | |
165 | delete meanVertexCalib; | |
166 | } | |
167 | printf("Monalisa MeanVertexevents\t%d\n",meanVertexEvents); | |
168 | if (pcstream) (*pcstream)<<treeName.Data()<<"MeanVertexevents="<<meanVertexEvents; | |
169 | */ | |
170 | ||
171 | // | |
172 | // 5. SDD dump | |
173 | // | |
174 | Int_t sddEvents=0; | |
175 | Int_t sddTracks=0; | |
176 | TList * SDDCalib = (TList*)inputFile->Get("clistSDDCalib"); | |
177 | if (SDDCalib) { | |
178 | TH1 *histoEvents = (TH1*) SDDCalib->FindObject("hNEvents"); | |
179 | if (histoEvents ){ | |
180 | sddEvents = TMath::Nint(histoEvents->GetBinContent(4)); | |
181 | sddTracks = TMath::Nint(histoEvents->GetBinContent(5)); | |
182 | } | |
183 | delete SDDCalib; | |
184 | } | |
185 | printf("Monalisa SDDevents\t%d\n",sddEvents); | |
186 | if (pcstream) (*pcstream)<<treeName.Data()<<"SDDevents="<<sddEvents; | |
187 | printf("Monalisa SDDtracks\t%d\n",sddTracks); | |
188 | if (pcstream) (*pcstream)<<treeName.Data()<<"SDDtracks="<<sddTracks; | |
189 | ||
190 | // | |
191 | if (pcstream) (*pcstream)<<treeName.Data()<<"\n"; | |
192 | delete pcstream; | |
193 | delete inputFile; | |
194 | ||
195 | } | |
196 | ||
3db1b975 | 197 | void processContainer(TObject* inputObject, TTreeSRedirector* pcstream, TString parentname) |
e9b7df6d | 198 | { |
199 | //recursively process the contents of an object: | |
200 | //might be a TDirectory | |
201 | //or a TCollection | |
202 | //pus information about the contained histograms in the debugStreamer | |
203 | ||
204 | TDirectory* inputDir=NULL; | |
205 | TSeqCollection* inputCollection=NULL; | |
206 | TH1* inputHistogram=NULL; | |
207 | ||
208 | TString inputObjectName=inputObject->GetName(); | |
e9b7df6d | 209 | |
210 | //TDirectory* inputDir=dynamic_cast<TDirectory*>(inputObject); | |
211 | //TSeqCollection* inputCollection=dynamic_cast<TSeqCollection*>(inputObject); | |
212 | //TH1* inputHistogram=dynamic_cast<TH1*>(inputObject); | |
213 | if (inputObject->InheritsFrom("TDirectory")) inputDir=dynamic_cast<TDirectory*>(inputObject); | |
214 | if (inputObject->InheritsFrom("TSeqCollection")) inputCollection=dynamic_cast<TSeqCollection*>(inputObject); | |
215 | if (inputObject->InheritsFrom("TH1")) inputHistogram=dynamic_cast<TH1*>(inputObject); | |
216 | ||
217 | if (inputCollection) | |
218 | { | |
219 | printf("processing collection: %s\n",inputCollection->GetName()); | |
220 | Int_t nentries= inputCollection->GetEntries(); | |
221 | for (Int_t i=0; i<nentries; i++) | |
222 | { | |
223 | TObject * object = inputCollection->At(i); | |
224 | if (!object) continue; | |
225 | TString name=parentname+"/"+object->GetName(); | |
226 | processContainer(object,pcstream,name); | |
227 | } | |
228 | } | |
229 | else if (inputDir) | |
230 | { | |
231 | printf("processing directory: %s\n",inputDir->GetName()); | |
232 | TList* keyList=inputDir->GetListOfKeys(); | |
233 | Int_t nkeys=keyList->GetEntries(); | |
234 | for (Int_t i=0; i<nkeys; i++) | |
235 | { | |
236 | TObject * object = inputDir->Get(keyList->At(i)->GetName()); | |
237 | if (!object) continue; | |
238 | TString name=parentname+"/"+object->GetName(); | |
239 | processContainer(object,pcstream,name); | |
240 | } | |
241 | ||
242 | } | |
243 | else if (inputHistogram) | |
244 | { | |
245 | Double_t hisEntries; | |
246 | Double_t hisMean; | |
247 | Double_t hisMeanError; | |
248 | Double_t hisRMS; | |
249 | Double_t hisMaxBin; | |
250 | if (inputHistogram->InheritsFrom("TH1")==0) continue; | |
251 | TH1* phis = (TH1*)inputHistogram; | |
252 | hisEntries=phis->GetEntries(); | |
253 | Int_t idim=1; | |
254 | if (inputHistogram->InheritsFrom("TH2")) idim=2; | |
255 | if (inputHistogram->InheritsFrom("TH3")) idim=3; | |
256 | hisMean=phis->GetMean(idim); | |
257 | hisMeanError=phis->GetMeanError(idim); | |
258 | hisRMS=phis->GetRMS(idim); | |
259 | hisMaxBin=phis->GetBinCenter(phis->GetMaximumBin()); | |
260 | TString name=parentname; | |
261 | printf("histogram: %s\n",name.Data()); | |
262 | if (pcstream) (*pcstream)<<treeName.Data()<< | |
263 | Form("%s_Entries=",name.Data())<<hisEntries<< | |
264 | Form("%s_Mean=",name.Data())<<hisMean<< | |
265 | Form("%s_MeanError=",name.Data())<<hisMeanError<< | |
266 | Form("%s_RMS=",name.Data())<<hisRMS<< | |
267 | Form("%s_MaxBin=",name)<<hisMaxBin; | |
268 | } | |
269 | ||
270 | } | |
271 | ||
272 | void loadLibraries() | |
273 | { | |
274 | gSystem->SetIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TRD -I$ALICE_ROOT/PWGPP - I$ALICE_ROOT/PWGPP/TRD"); | |
275 | gSystem->Load("libANALYSIS"); | |
276 | gSystem->Load("libANALYSISalice"); | |
277 | gSystem->Load("libANALYSIScalib"); | |
278 | gSystem->Load("libESDfilter"); | |
279 | gSystem->Load("libCORRFW"); | |
280 | gSystem->Load("libTENDER"); | |
281 | gSystem->Load("libPWGPP.so"); | |
282 | gSystem->Load("libAliHLTTrigger.so"); | |
283 | gSystem->Load("libPWGTools"); | |
284 | gSystem->Load("libEMCALUtils"); | |
285 | gSystem->Load("libPHOSUtils"); | |
286 | gSystem->Load("libPWGCaloTrackCorrBase"); | |
287 | gSystem->Load("libPWGGACaloTrackCorrelations"); | |
288 | gSystem->Load("libPWGGACaloTasks"); | |
289 | gSystem->Load("libPWGGAPHOSTasks"); | |
290 | gSystem->Load("libPWGTools"); | |
291 | gSystem->Load("libPWGEMCAL"); | |
292 | gSystem->Load("libPWGGAEMCALTasks"); | |
293 | gSystem->Load("libPWGmuon"); | |
294 | gSystem->Load("libPWGPPMUONlite"); | |
295 | gSystem->Load("libPWGmuondep"); | |
296 | gSystem->Load("libPWGLFforward2"); | |
297 | } | |
298 |