]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ACORDE/AliACORDEQADataMakerRec.cxx
Counter for multiplicity AMU-configuration fixed
[u/mrichter/AliRoot.git] / ACORDE / AliACORDEQADataMakerRec.cxx
CommitLineData
dc7f1e9e 1/**************************************************************************\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
3 * *\r
4 * Author: The ALICE Off-line Project. *\r
5 * Contributors are mentioned in the code where appropriate. *\r
6 * *\r
7 * Permission to use, copy, modify and distribute this software and its *\r
8 * documentation strictly for non-commercial purposes is hereby granted *\r
9 * without fee, provided that the above copyright notice appears in all *\r
10 * copies and that both the copyright notice and this permission notice *\r
11 * appear in the supporting documentation. The authors make no claims *\r
12 * about the suitability of this software for any purpose. It is *\r
13 * provided "as is" without express or implied warranty. *\r
14 **************************************************************************/\r
15//---\r
16// Produces the data needed to calculate the quality assurance. \r
17// All data must be mergeable objects.\r
18\r
19\r
20// Authors:\r
21//\r
22// Luciano Diaz Gonzalez <luciano.diaz@nucleares.unam.mx> (ICN-UNAM)\r
23// Mario Rodriguez Cahuantzi <mrodrigu@mail.cern.ch> (FCFM-BUAP)\r
24// Arturo Fernandez Tellez <afernan@mail.cern.ch (FCFM-BUAP)\r
25//\r
26// Created: June 13th 2008\r
27//---\r
92664bc8 28// Last update: May 5th. 2011 (by Mario RC: mrodrigu@mail.cern.ch) -->Creates QA expert histograms \r
29// and QA-shifter histograms also with threshold lines and visual alarm\r
dc7f1e9e 30// Last Update: Aug. 27th 2008 --> Implementation to declare QA expert histogram\r
92664bc8 31// Last update: Nov. 14t 2009 --> MRC <mrodrigu@mail.cern.ch> (FCFM-BUAP) \r
1b368017 32// |--> Change in Multiplicity histogram for AMORE (to detect empty triggers events of ACORDE)\r
33\r
dc7f1e9e 34\r
35\r
36// --- ROOT system ---\r
37#include <TClonesArray.h>\r
38#include <TFile.h> \r
39#include <TH1F.h> \r
40#include <TDirectory.h>\r
7626fda4 41#include <TPaveText.h>\r
dc7f1e9e 42// --- Standard library ---\r
43\r
44// --- AliRoot header files ---\r
45#include "AliESDEvent.h"\r
46#include "AliLog.h"\r
47#include "AliACORDEdigit.h" \r
48#include "AliACORDEhit.h"\r
49#include "AliACORDEQADataMakerRec.h"\r
50#include "AliQAChecker.h"\r
51#include "AliACORDERawReader.h"\r
52#include "AliACORDERawStream.h"\r
53ClassImp(AliACORDEQADataMakerRec)\r
54 \r
55//____________________________________________________________________________ \r
92664bc8 56 AliACORDEQADataMakerRec::AliACORDEQADataMakerRec():AliQADataMakerRec(AliQAv1::GetDetName(AliQAv1::kACORDE), "ACORDE Quality Assurance Data Maker"),\r
57 fhACOMean(new TLine(0.,4.,60.,4.)),\r
58 fhACOMin(new TLine(0.,4.,60.,4.)),\r
59 fhACOMax(new TLine(0.,4.,60.,4.)),\r
60 fhACOMulti(new TLine(0.,4.,60.,4.)),\r
61 fhACOMeanAMU(new TLine(0.,4.,60.,4.)),\r
62 fhACOMinAMU(new TLine(0.,4.,60.,4.)),\r
63 fhACOMaxAMU(new TLine(0.,4.,60.,4.)),\r
64 fhACOMultiAMU(new TLine(0.,4.,60.,4.)),\r
65 fhACOTriggerCheck(new TLine(0.,4.,60.,4.))\r
dc7f1e9e 66{\r
67\r
68}\r
69//____________________________________________________________________________ \r
92664bc8 70AliACORDEQADataMakerRec::AliACORDEQADataMakerRec(const AliACORDEQADataMakerRec& qadm):\r
71 AliQADataMakerRec(),\r
72 fhACOMean(qadm.fhACOMean),\r
73 fhACOMin(qadm.fhACOMin),\r
74 fhACOMax(qadm.fhACOMax),\r
75 fhACOMulti(qadm.fhACOMulti),\r
76 fhACOMeanAMU(qadm.fhACOMeanAMU),\r
77 fhACOMinAMU(qadm.fhACOMinAMU),\r
78 fhACOMaxAMU(qadm.fhACOMaxAMU),\r
79 fhACOMultiAMU(qadm.fhACOMultiAMU),\r
80 fhACOTriggerCheck(qadm.fhACOTriggerCheck)\r
dc7f1e9e 81{\r
82 SetName((const char*)qadm.GetName()) ; \r
83 SetTitle((const char*)qadm.GetTitle()); \r
84}\r
92664bc8 85\r
7626fda4 86//__________________________________________________________________\r
87AliACORDEQADataMakerRec::~AliACORDEQADataMakerRec()\r
88{\r
92664bc8 89 delete fhACOMean;\r
90 delete fhACOMin;\r
91 delete fhACOMax;\r
92 delete fhACOMulti;\r
47f5f498 93 delete fhACOMeanAMU;\r
94 delete fhACOMinAMU;\r
95 delete fhACOMaxAMU;\r
96 delete fhACOMultiAMU;\r
92664bc8 97 delete fhACOTriggerCheck;\r
7626fda4 98}\r
99\r
dc7f1e9e 100//__________________________________________________________________\r
101AliACORDEQADataMakerRec& AliACORDEQADataMakerRec::operator = (const AliACORDEQADataMakerRec& qadm )\r
102{\r
103 // Equal operator.\r
104 this->~AliACORDEQADataMakerRec();\r
105 new(this) AliACORDEQADataMakerRec(qadm);\r
106 return *this;\r
107}\r
108//____________________________________________________________________________\r
109void AliACORDEQADataMakerRec::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)\r
110{\r
111 //Detector specific actions at end of cycle\r
112 // do the QA checking\r
92664bc8 113 ResetEventTrigClasses(); // reset triggers list to select all histos\r
114 // Update for DQM GUI\r
115 //\r
116 for (Int_t specie = 0; specie < AliRecoParam::kNSpecies ; specie++) {\r
117 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) continue ;\r
118 // \r
119 // RS Set event specie\r
120 SetEventSpecie(AliRecoParam::ConvertIndex(specie));\r
121 //\r
122 for (int itc=-1;itc<GetNTrigClasses();itc++) { // RS Loop over the trigger classes\r
123 //\r
a5ef5a9a 124 TObjArray * parr = GetRawsDataOfTrigClass(itc);\r
125 if (!parr) continue;\r
126 TObjArray &harr = *parr;\r
92664bc8 127 //\r
385b26a8 128 TH1* h0 = (TH1*)harr[0];\r
129 TH1* h1 = (TH1*)harr[1];\r
130 if (!h0 || !h1) continue;\r
92664bc8 131 double integral = 0;\r
385b26a8 132 if (itc==-1 && !(integral=h0->Integral())) { // default clone\r
92664bc8 133 printf("No entries in ACORDE Hits histograms for trigger class %d, fatal error, please check !!!\n",itc);\r
134 TPaveText *acoBoxFatal=new TPaveText(35,0.5,55,1,"b");\r
135 acoBoxFatal->SetFillColor(kRed);\r
136 acoBoxFatal->SetLineColor(kRed);\r
137 acoBoxFatal->SetLineWidth(2);\r
138 //acoBox2->SetTextSize(3);\r
139 //acoBox2->SetTextColor(kBlack);\r
140 acoBoxFatal->AddText("FLAG MESSAGE: ACO. Not Ok, Call the expert !!!");\r
141 acoBoxFatal->AddText("Blue line: mean of hits");\r
142 acoBoxFatal->AddText("Between GREEN lines: ACO. O.K.");\r
143 h0->GetListOfFunctions()->Add(acoBoxFatal);\r
7626fda4 144 \r
92664bc8 145 TPaveText *acoMultiBoxFatal = new TPaveText(20,0.5,40,1,"b");\r
146 acoMultiBoxFatal->SetFillColor(kRed);\r
147 acoMultiBoxFatal->SetLineColor(kRed);\r
148 acoMultiBoxFatal->SetLineWidth(2);\r
149 acoMultiBoxFatal->AddText("ACO. Not O.K., Call the experts");\r
150 h1->GetListOfFunctions()->Add(acoMultiBoxFatal);\r
151 continue;\r
152 }\r
153 Double_t mean = integral/60;\r
154 fhACOMean->SetY1(mean);\r
155 fhACOMean->SetY2(mean);\r
156 fhACOMin->SetY1(0.05*mean);\r
157 fhACOMin->SetY2(0.05*mean);\r
158 fhACOMax->SetY1(2.25*mean);\r
159 fhACOMax->SetY2(2.25*mean);\r
160 \r
161 // alarms\r
162 Double_t max = h0->GetMaximum();\r
163 if (max == 0) {\r
164 printf("Maximum of hits equal to ZERO, please check the status of ACORDE !!\n");\r
165 continue;\r
166 }\r
167 // Multiplicity histogram threshold\r
168 Double_t maxMulti = h1->GetMaximum();\r
169 if (maxMulti == 0) {\r
170 printf("Maximum of entries equal to ZERO, please check the status of ACORDE !!\n");\r
171 continue;\r
172 }\r
173 fhACOMulti->SetX1(1);\r
174 fhACOMulti->SetY1(1);\r
175 fhACOMulti->SetX2(1);\r
176 fhACOMulti->SetY2(maxMulti);\r
177 TPaveText *acoBox=new TPaveText(35,max-0.20*max,55,max,"b");\r
178 //acoBox->SetFillStyle(0);\r
179 TPaveText *acoBox1=new TPaveText(35,max-0.20*max,55,max,"b");\r
180 //acoBox1->SetFillStyle(0);\r
181 TPaveText *acoBox2=new TPaveText(35,max-0.20*max,55,max,"b");\r
182 //acoBox2->SetFillStyle(0);\r
183 Int_t flagACO_DQM = 0;\r
184 Bool_t isACOOk = kTRUE;\r
185 Bool_t isACOWarning = kFALSE;\r
186 for(Int_t iModule=0;iModule<60;iModule++) {\r
187 if ((h0->GetBinContent(iModule))/max < 0.5) flagACO_DQM++;\r
188 }\r
189 if (flagACO_DQM < 15) {\r
190 acoBox->SetFillColor(kGreen);\r
191 acoBox->SetLineColor(kGreen);\r
192 acoBox->SetLineWidth(2);\r
193 //acoBox->SetTextSize(3);\r
194 //acoBox->SetTextColor(kBlack);\r
195 acoBox->AddText("FLAG MESSAGE: O.K. !!!");\r
196 acoBox->AddText("Blue line: mean of hits");\r
197 acoBox->AddText("Between GREEN lines: ACO. O.K.");\r
198 h0->GetListOfFunctions()->Add(acoBox); \r
199 //\r
200 } \r
201 else if (flagACO_DQM > 15 && flagACO_DQM<30) {\r
202 acoBox1->SetFillColor(kYellow);\r
203 acoBox1->SetLineColor(kYellow);\r
204 acoBox1->SetLineWidth(2);\r
205 //acoBox1->SetTextSize(3);\r
206 //acoBox1->SetTextColor(kBlack);\r
207 acoBox1->AddText("FLAG MESSAGE: Warning, some modules are not working properly !!!");\r
208 acoBox1->AddText("Blue line: mean of hits");\r
209 acoBox1->AddText("Between GREEN lines: ACO. O.K.");\r
210 h0->GetListOfFunctions()->Add(acoBox1);\r
211 isACOWarning=kTRUE; \r
212 }\r
213 else if (flagACO_DQM > 30) {\r
214 acoBox2->SetFillColor(kRed);\r
215 acoBox2->SetLineColor(kRed);\r
216 acoBox2->SetLineWidth(2);\r
217 //acoBox2->SetTextSize(3);\r
218 //acoBox2->SetTextColor(kBlack);\r
219 acoBox2->AddText("FLAG MESSAGE: ACO. Not Ok, Call the expert !!!");\r
220 acoBox2->AddText("Blue line: mean of hits");\r
221 acoBox2->AddText("Between GREEN lines: ACO. O.K.");\r
222 h0->GetListOfFunctions()->Add(acoBox2);\r
223 isACOOk=kFALSE; \r
224 }\r
225 //\r
226 \r
227 TPaveText *acoMultiBox = new TPaveText(20,maxMulti-0.20*maxMulti,40,maxMulti,"b");\r
228 if (h1->Integral()==0 || isACOOk==kFALSE) {\r
229 acoMultiBox->SetFillColor(kRed);\r
230 acoMultiBox->SetLineColor(kRed);\r
231 acoMultiBox->SetLineWidth(2);\r
232 acoMultiBox->AddText("ACO. Not O.K., Call the experts");\r
233 h1->GetListOfFunctions()->Add(acoMultiBox);\r
234 }\r
235 /* if (GetRawsData(5)->GetBinContent(1) > 0 || isACOOk && GetRawsData(5)->Integral()!=0 && isACOOk==kTRUE){\r
236 acoMultiBox->SetFillColor(kYellow);\r
237 acoMultiBox->SetLineColor(kYellow);\r
238 acoMultiBox->SetLineWidth(2);\r
239 acoMultiBox->AddText("Warning: possible empy events only IF ACORDE is triggering, else: O.K.");\r
240 GetRawsData(5)->GetListOfFunctions()->Add(acoMultiBox);\r
241 }\r
242 */\r
243 if (isACOOk==kTRUE) {\r
244 acoMultiBox->SetFillColor(kGreen);\r
245 acoMultiBox->SetLineColor(kGreen);\r
246 acoMultiBox->SetLineWidth(2);\r
247 acoMultiBox->AddText("FLAG MESSAGE: ACO. O.K.");\r
248 //acoMultiBox->AddText("NOTE: if entries below the pink line and ACO is triggering, then call the expert (possible empty events)");\r
249 h1->GetListOfFunctions()->Add(acoMultiBox);\r
250 }\r
251 if (isACOWarning==kTRUE) {\r
252 acoMultiBox->SetFillColor(kYellow);\r
253 acoMultiBox->SetLineColor(kYellow);\r
254 acoMultiBox->SetLineWidth(2);\r
255 acoMultiBox->AddText("FLAG MESSAGE: ACO. O.K., warning, some modules are not working properly");\r
256 //acoMultiBox->AddText("NOTE: if entries below the pink line and ACO is triggering, then call the expert (possible empty events)");\r
257 h1->GetListOfFunctions()->Add(acoMultiBox);\r
258 }\r
259 \r
260 // for AMU ACORDE trigger option\r
261 TH1* h2 = (TH1*)harr[2];\r
262 TH1* h3 = (TH1*)harr[3];\r
263 if (!h2 || !h3) continue;\r
264 Double_t integral1 = h2->Integral();\r
265 if (integral1==0) {\r
266 printf("No entries in ACORDE Hits histograms for trigger class %d --> fatal error, please check !!!\n",itc);\r
267 TPaveText *acoBoxFatalAMU=new TPaveText(35,0.5,55,1,"b");\r
268 acoBoxFatalAMU->SetFillColor(kRed);\r
269 acoBoxFatalAMU->SetLineColor(kRed);\r
270 acoBoxFatalAMU->SetLineWidth(2);\r
271 //acoBox2->SetTextSize(3);\r
272 //acoBox2->SetTextColor(kBlack);\r
273 acoBoxFatalAMU->AddText("FLAG MESSAGE: ACO. Not Ok, Call the expert !!!");\r
274 acoBoxFatalAMU->AddText("Blue line: mean of hits");\r
275 acoBoxFatalAMU->AddText("Between GREEN lines: ACO. O.K.");\r
276 h2->GetListOfFunctions()->Add(acoBoxFatalAMU);\r
277 \r
278 TPaveText *acoMultiBoxFatalAMU = new TPaveText(20,0.5,40,1,"b");\r
279 acoMultiBoxFatalAMU->SetFillColor(kRed);\r
280 acoMultiBoxFatalAMU->SetLineColor(kRed);\r
281 acoMultiBoxFatalAMU->SetLineWidth(2);\r
282 acoMultiBoxFatalAMU->AddText("ACO. Not O.K., Call the experts");\r
283 h3->GetListOfFunctions()->Add(acoMultiBoxFatalAMU);\r
284 \r
285 continue;\r
286 }\r
287 Double_t mean1 = integral1/60;\r
288 fhACOMeanAMU->SetY1(mean1);\r
289 fhACOMeanAMU->SetY2(mean1);\r
290 fhACOMinAMU->SetY1(0.05*mean1);\r
291 fhACOMinAMU->SetY2(0.05*mean1);\r
292 fhACOMaxAMU->SetY1(2.25*mean1);\r
293 fhACOMaxAMU->SetY2(2.25*mean1);\r
294 \r
295 // alarms\r
296 Double_t max1 = h2->GetMaximum();\r
297 if (max1 == 0) {\r
298 printf("Maximum of hits equal to ZERO, please check the status of ACORDE !!\n");\r
299 continue;\r
300 }\r
301 // Multiplicity histogram threshold\r
302 Double_t maxMulti1 = h3->GetMaximum();\r
303 if (maxMulti1 == 0) {\r
304 printf("Maximum of entries equal to ZERO, please check the status of ACORDE !!\n");\r
305 continue;\r
306 }\r
307 fhACOMultiAMU->SetX1(1);\r
308 fhACOMultiAMU->SetY1(1);\r
309 fhACOMultiAMU->SetX2(1);\r
310 fhACOMultiAMU->SetY2(maxMulti1);\r
311 TPaveText *acoBoxAMU=new TPaveText(35,max1-0.20*max1,55,max1,"b");\r
312 //acoBox->SetFillStyle(0);\r
313 TPaveText *acoBox1AMU=new TPaveText(35,max1-0.20*max1,55,max1,"b");\r
314 //acoBox1->SetFillStyle(0);\r
315 TPaveText *acoBox2AMU=new TPaveText(35,max1-0.20*max1,55,max1,"b");\r
316 //acoBox2->SetFillStyle(0);\r
317 Int_t flagACO_DQMAMU = 0;\r
318 Bool_t isACOOkAMU = kTRUE;\r
319 Bool_t isACOWarningAMU = kFALSE;\r
320 for(Int_t iModule=0;iModule<60;iModule++) {\r
321 if ((h2->GetBinContent(iModule))/max1 < 0.5) flagACO_DQMAMU++;\r
322 }\r
323 if (flagACO_DQMAMU < 15) {\r
324 acoBoxAMU->SetFillColor(kGreen);\r
325 acoBoxAMU->SetLineColor(kGreen);\r
326 acoBoxAMU->SetLineWidth(2);\r
327 //acoBox->SetTextSize(3);\r
328 //acoBox->SetTextColor(kBlack);\r
329 acoBoxAMU->AddText("FLAG MESSAGE: O.K. !!!");\r
330 acoBoxAMU->AddText("Blue line: mean of hits");\r
331 acoBoxAMU->AddText("Between GREEN lines: ACO. O.K.");\r
332 h2->GetListOfFunctions()->Add(acoBoxAMU); \r
333 //\r
334 }\r
335 else if (flagACO_DQMAMU > 15 && flagACO_DQMAMU<30) {\r
336 acoBox1AMU->SetFillColor(kYellow);\r
337 acoBox1AMU->SetLineColor(kYellow);\r
338 acoBox1AMU->SetLineWidth(2);\r
339 //acoBox1->SetTextSize(3);\r
340 //acoBox1->SetTextColor(kBlack);\r
341 acoBox1AMU->AddText("FLAG MESSAGE: Warning, some modules are not working properly !!!");\r
342 acoBox1AMU->AddText("Blue line: mean of hits");\r
343 acoBox1AMU->AddText("Between GREEN lines: ACO. O.K.");\r
344 h2->GetListOfFunctions()->Add(acoBox1AMU);\r
345 isACOWarningAMU=kTRUE;\r
346 //\r
347 } \r
348 else if (flagACO_DQMAMU > 30) {\r
349 acoBox2AMU->SetFillColor(kRed);\r
350 acoBox2AMU->SetLineColor(kRed);\r
351 acoBox2AMU->SetLineWidth(2);\r
352 //acoBox2->SetTextSize(3);\r
353 //acoBox2->SetTextColor(kBlack);\r
354 acoBox2AMU->AddText("FLAG MESSAGE: ACO. Not Ok, Call the expert !!!");\r
355 acoBox2AMU->AddText("Blue line: mean of hits");\r
356 acoBox2AMU->AddText("Between GREEN lines: ACO. O.K.");\r
357 h2->GetListOfFunctions()->Add(acoBox2AMU);\r
358 isACOOkAMU=kFALSE;\r
359 }\r
360 //\r
361 TPaveText *acoMultiBoxAMU = new TPaveText(20,maxMulti1-0.20*maxMulti1,40,maxMulti1,"b");\r
362 if (h3->Integral()==0 || isACOOkAMU==kFALSE) {\r
363 acoMultiBoxAMU->SetFillColor(kRed);\r
364 acoMultiBoxAMU->SetLineColor(kRed);\r
365 acoMultiBoxAMU->SetLineWidth(2);\r
366 acoMultiBoxAMU->AddText("ACO. Not O.K., Call the experts");\r
367 h3->GetListOfFunctions()->Add(acoMultiBoxAMU);\r
368 }\r
369 /* if (GetRawsData(5)->GetBinContent(1) > 0 || isACOOk && GetRawsData(5)->Integral()!=0 && isACOOk==kTRUE){\r
370 acoMultiBox->SetFillColor(kYellow);\r
371 acoMultiBox->SetLineColor(kYellow);\r
372 acoMultiBox->SetLineWidth(2);\r
373 acoMultiBox->AddText("Warning: possible empy events only IF ACORDE is triggering, else: O.K.");\r
374 GetRawsData(5)->GetListOfFunctions()->Add(acoMultiBox);\r
375 }\r
376 */\r
377 if (isACOOkAMU==kTRUE) {\r
378 acoMultiBoxAMU->SetFillColor(kGreen);\r
379 acoMultiBoxAMU->SetLineColor(kGreen);\r
380 acoMultiBoxAMU->SetLineWidth(2);\r
381 acoMultiBoxAMU->AddText("FLAG MESSAGE: ACO. O.K.");\r
382 //acoMultiBox->AddText("NOTE: if entries below the pink line and ACO is triggering, then call the expert (possible empty events)");\r
383 h3->GetListOfFunctions()->Add(acoMultiBoxAMU);\r
384 }\r
385 if (isACOWarningAMU==kTRUE) {\r
386 acoMultiBoxAMU->SetFillColor(kYellow);\r
387 acoMultiBoxAMU->SetLineColor(kYellow);\r
388 acoMultiBoxAMU->SetLineWidth(2);\r
389 acoMultiBoxAMU->AddText("FLAG MESSAGE: ACO. O.K., warning, some modules are not working properly");\r
390 //acoMultiBox->AddText("NOTE: if entries below the pink line and ACO is triggering, then call the expert (possible empty events)");\r
391 h3->GetListOfFunctions()->Add(acoMultiBoxAMU);\r
392 }\r
393 \r
394 // Checks if hits distribution from SL0 and AMU are equal\r
395 Float_t eff = 0.0;\r
396 Int_t effFlag = 0;\r
397 //\r
398 TH1* h4 = (TH1*)harr[4];\r
399 if (h4) {\r
400 for (Int_t iModule = 0; iModule < 60; iModule++) {\r
401 if (h2->GetBinContent(iModule)==0) {\r
402 eff = 0.0;\r
403 continue;\r
404 }\r
405 else {\r
406 eff = h0->GetBinContent(iModule)/h2->GetBinContent(iModule);\r
407 h4->Fill(iModule,eff);\r
408 if (eff!=1) effFlag++;\r
409 }\r
410 }\r
411 \r
412 if (effFlag == 0) {\r
413 TPaveText *checkTriggerBox = new TPaveText(20,0.6,40,0.8,"b");\r
414 checkTriggerBox->SetFillColor(kGreen);\r
415 checkTriggerBox->SetLineColor(kGreen);\r
416 checkTriggerBox->SetLineWidth(2);\r
417 checkTriggerBox->AddText("FLAG MESSAGE: ACO. trigger O.K.");\r
418 h4->GetListOfFunctions()->Add(checkTriggerBox);\r
419 }\r
420 else {\r
421 TPaveText *checkTriggerBox1 = new TPaveText(20,0.6,40,0.8,"b");\r
422 checkTriggerBox1->SetFillColor(kYellow);\r
423 checkTriggerBox1->SetLineColor(kYellow);\r
424 checkTriggerBox1->SetLineWidth(2);\r
425 checkTriggerBox1->AddText("FLAG MESSAGE: Warning, please check the ACO trigger configuration");\r
426 h4->GetListOfFunctions()->Add(checkTriggerBox1);\r
427 }\r
428 } // h4\r
429 } // end of trigger classes loop\r
430 } // end specie loop\r
431 // QA Checker standar (to be updated)\r
432 //\r
dc7f1e9e 433 AliQAChecker::Instance()->Run(AliQAv1::kACORDE, task, list) ;\r
434}\r
435\r
436//____________________________________________________________________________\r
437void AliACORDEQADataMakerRec::StartOfDetectorCycle()\r
438{\r
439 //Detector specific actions at start of cycle\r
440\r
441}\r
442 \r
443//____________________________________________________________________________ \r
444void AliACORDEQADataMakerRec::InitRaws()\r
445{\r
446 // create Raw histograms in Raw subdir\r
447\r
448 const Bool_t expert = kTRUE ; \r
449 const Bool_t saveCorr = kTRUE ; \r
450 const Bool_t image = kTRUE ; \r
92664bc8 451 /*\r
452 const char *acoModule[60]={"0_0","0_1","0_2","0_3","0_4","0_5","0_6","0_7","0_8","0_9",\r
dc7f1e9e 453 "1_0","1_1","1_2","1_3","1_4","1_5","1_6","1_7","1_8","1_9",\r
454 "2_0","2_1","2_2","2_3","2_4","2_5","2_6","2_7","2_8","2_9",\r
455 "3_0","3_1","3_2","3_3","3_4","3_5","3_6","3_7","3_8","3_9",\r
456 "4_0","4_1","4_2","4_3","4_4","4_5","4_6","4_7","4_8","4_9",\r
457 "5_0","5_1","5_2","5_3","5_4","5_5","5_6","5_7","5_8","5_9"};\r
92664bc8 458 */\r
459 // TH1F *fhACORDEBitPattern[4];\r
460 //TH1F *fhACORDEBitPatternDQM;\r
461 // fhACORDEBitPattern[0] = new TH1F("ACORDEBitPatternfromRAWSingle","Distribution of ACORDE fired modules from RAW-Single;Modules;Counts",60,-0.5,59.5);//AcordeSingleMuon BitPattern\r
462 // fhACORDEBitPattern[1] = new TH1F("ACORDEBitPatternfromRAWMulti","Distribution of ACORDE fired modules from RAW-Multi;Modules;Counts",60,-0.5,59.5);//AcordeMultiMuon BitPattern\r
463 // fhACORDEBitPattern[2] = new TH1F("ACORDEMultiplicityfromRAWSingle","Number of fired ACORDE modules;No. of fired ACORDE modules;No. of events in ACORDE",61,-1,60);//AcordeSingleMuon Multiplicity\r
464 // fhACORDEBitPattern[3] = new TH1F("ACORDEMultiplicityfromRAWMulti","Number of fired ACORDE modules; No. of fired ACORDE modules;No. of events in ACORDE",61,-1,60);//AcordeMultiMuon Multiplicity\r
465 TH1F * fhACORDEBitPatternDQM = new TH1F("ACOHitsSL0_DQM_Shifter","Distribution of ACORDE fired modules for DQM shifter; No. of module; Counts",60,-0.5,59.5);// Hits histogram for QA-shifter ACO-SL0 trigger mode\r
466 TH1F * fhACORDEMultiplicitySL0DQM = new TH1F("ACOMultiSL0_DQM_Shifter","Multiplicity of ACORDE fired modules for DQM shifter; No. of fired modules; No. of events",62,-1,60); // Multiplicity histo. for QA-shifter ACO-SL0 trigger mode\r
467 TH1F * fhACORDEBitPatternAMUDQM = new TH1F("ACOHitsAMU_DQM_Shifter","Distribution of ACORDE fired modules for DQM shifter; No. of module; Counts",60,-0.5,59.5);// Hits histogram for QA-shifter ACO-SL0 trigger mode\r
468 TH1F * fhACORDEMultiplicityAMUDQM = new TH1F("ACOMultiAMU_DQM_Shifter","Multiplicity of ACORDE fired modules for DQM shifter; No. of fired modules; No. of events",62,-1,60); // Multiplicity histo. for QA-shifter ACO-SL0 trigger mode\r
469 TH1F * fhACORDEBitPatternCheckDQM = new TH1F("ACOHitsTriggerCheck_DQMExpert","Check distribution for ACORDE trigger configuration; No. of module; Trigger hits difference",60,-0.5,59.5); // Check the trigger status of ACORDE (SL0 vs AMU)\r
470 // Expert histograms\r
471 // for(Int_t i=0;i<4;i++)\r
472 // Add2RawsList(fhACORDEBitPattern[i],i,expert, !image, !saveCorr);\r
473 // Check the hits multiplicity from trigger configuration\r
474 Add2RawsList(fhACORDEBitPatternCheckDQM,4,expert,image,!saveCorr);\r
475 fhACORDEBitPatternCheckDQM->SetFillColor(kOrange);\r
476 // AMORE diplay settings for shifter on GUI\r
477 \r
478 // For SL0 ACO trigger mode\r
479 \r
480 Add2RawsList(fhACORDEBitPatternDQM,0,!expert,image,!saveCorr);\r
481 ForbidCloning(fhACORDEBitPatternDQM);\r
482 Add2RawsList(fhACORDEMultiplicitySL0DQM,1,!expert,image,!saveCorr);\r
483 ForbidCloning(fhACORDEMultiplicitySL0DQM);\r
484 // For Hits distribution on ACORDE\r
485 \r
486 fhACORDEBitPatternDQM->SetFillColor(kCyan-7);\r
487 fhACOMean->SetLineColor(kBlue);\r
488 fhACOMean->SetLineStyle(2);\r
489 fhACOMean->SetLineWidth(4);\r
490 fhACORDEBitPatternDQM->GetListOfFunctions()->Add(fhACOMean);\r
491 fhACOMin->SetLineColor(kGreen);\r
492 fhACOMin->SetLineStyle(2);\r
493 fhACOMin->SetLineWidth(4);\r
494 fhACORDEBitPatternDQM->GetListOfFunctions()->Add(fhACOMin);\r
495 fhACOMax->SetLineColor(kGreen);\r
496 fhACOMax->SetLineStyle(2);\r
497 fhACOMax->SetLineWidth(4);\r
498 fhACORDEBitPatternDQM->GetListOfFunctions()->Add(fhACOMax);\r
499 \r
500 // For ACORDE Multiplicity distribution of fired modules\r
501 \r
502 fhACORDEMultiplicitySL0DQM->SetFillColor(kBlue+1);\r
503 fhACOMulti->SetLineColor(kMagenta);\r
504 fhACOMulti->SetLineStyle(2);\r
505 fhACOMulti->SetLineWidth(4);\r
506 fhACORDEMultiplicitySL0DQM->GetListOfFunctions()->Add(fhACOMulti);\r
507 \r
508 // For AMU ACO trigger mode\r
509 \r
510 Add2RawsList(fhACORDEBitPatternAMUDQM,2,!expert,image,!saveCorr);\r
511 Add2RawsList(fhACORDEMultiplicityAMUDQM,3,!expert,image,!saveCorr);\r
512 \r
513 // For Hits distribution on ACORDE\r
514 \r
515 fhACORDEBitPatternAMUDQM->SetFillColor(kCyan-7);\r
516 fhACOMeanAMU->SetLineColor(kBlue);\r
517 fhACOMeanAMU->SetLineStyle(2);\r
518 fhACOMeanAMU->SetLineWidth(4);\r
519 fhACORDEBitPatternAMUDQM->GetListOfFunctions()->Add(fhACOMeanAMU);\r
520 fhACOMinAMU->SetLineColor(kGreen);\r
521 fhACOMinAMU->SetLineStyle(2);\r
522 fhACOMinAMU->SetLineWidth(4);\r
523 fhACORDEBitPatternAMUDQM->GetListOfFunctions()->Add(fhACOMinAMU);\r
524 fhACOMaxAMU->SetLineColor(kGreen);\r
525 fhACOMaxAMU->SetLineStyle(2);\r
526 fhACOMaxAMU->SetLineWidth(4);\r
527 fhACORDEBitPatternAMUDQM->GetListOfFunctions()->Add(fhACOMaxAMU);\r
528 \r
529 // For ACORDE Multiplicity distribution of fired modules\r
530 \r
531 fhACORDEMultiplicityAMUDQM->SetFillColor(kBlue+1);\r
532 fhACOMultiAMU->SetLineColor(kMagenta);\r
533 fhACOMultiAMU->SetLineStyle(2);\r
534 fhACOMultiAMU->SetLineWidth(4);\r
535 fhACORDEMultiplicityAMUDQM->GetListOfFunctions()->Add(fhACOMultiAMU);\r
536 \r
537 /*\r
dc7f1e9e 538 for (Int_t iModule = 0; iModule<60; iModule++)\r
539 {\r
92664bc8 540 fhACORDEBitPattern[0]->GetXaxis()->SetBinLabel(iModule+1,acoModule[iModule]);\r
541 fhACORDEBitPattern[1]->GetXaxis()->SetBinLabel(iModule+1,acoModule[iModule]);\r
dc7f1e9e 542 }\r
92664bc8 543 */\r
544 //\r
545 ClonePerTrigClass(AliQAv1::kRAWS); // this should be the last line\r
dc7f1e9e 546}\r
92664bc8 547\r
dc7f1e9e 548//____________________________________________________________________________ \r
549void AliACORDEQADataMakerRec::InitDigits()\r
550{\r
551 // create Digits histograms in Digits subdir\r
552 \r
553 const Bool_t expert = kTRUE ; \r
554 const Bool_t image = kTRUE ; \r
555 TH1F * fhDigitsModule;\r
41d0241f 556 const char *acoModule[60]={"0_0","0_1","0_2","0_3","0_4","0_5","0_6","0_7","0_8","0_9",\r
dc7f1e9e 557 "1_0","1_1","1_2","1_3","1_4","1_5","1_6","1_7","1_8","1_9",\r
558 "2_0","2_1","2_2","2_3","2_4","2_5","2_6","2_7","2_8","2_9",\r
559 "3_0","3_1","3_2","3_3","3_4","3_5","3_6","3_7","3_8","3_9",\r
560 "4_0","4_1","4_2","4_3","4_4","4_5","4_6","4_7","4_8","4_9",\r
561 "5_0","5_1","5_2","5_3","5_4","5_5","5_6","5_7","5_8","5_9"};\r
562\r
563\r
564 fhDigitsModule = new TH1F("ACORDEBitPatternfromDigits","Distribution of ACORDE from DIGITS;Modules;Counts",60,1,60);\r
565 Add2DigitsList(fhDigitsModule,0,!expert,image);\r
566 for (Int_t i=0;i<60;i++) fhDigitsModule->GetXaxis()->SetBinLabel(i+1,acoModule[i]); \r
92664bc8 567 //\r
3542faa1 568 ClonePerTrigClass(AliQAv1::kDIGITS); // this should be the last line\r
dc7f1e9e 569}\r
570\r
571//____________________________________________________________________________ \r
572\r
573void AliACORDEQADataMakerRec::InitRecPoints()\r
574{\r
575 // create cluster histograms in RecPoint subdir\r
576 // Not needed for ACORDE by now !!!\r
92664bc8 577 //\r
578 ClonePerTrigClass(AliQAv1::kRECPOINTS); // this should be the last line\r
dc7f1e9e 579}\r
580\r
581//____________________________________________________________________________\r
582void AliACORDEQADataMakerRec::InitESDs()\r
583{\r
584 //create ESDs histograms in ESDs subdir\r
585\r
586 const Bool_t expert = kTRUE ; \r
587 const Bool_t image = kTRUE ; \r
588 \r
589 TH1F * fhESDsSingle;\r
590 TH1F * fhESDsMulti;\r
1b368017 591 TH1F * fhESDsMultiplicity;\r
41d0241f 592 const char *acoModule[60]={"0_0","0_1","0_2","0_3","0_4","0_5","0_6","0_7","0_8","0_9",\r
dc7f1e9e 593 "1_0","1_1","1_2","1_3","1_4","1_5","1_6","1_7","1_8","1_9",\r
594 "2_0","2_1","2_2","2_3","2_4","2_5","2_6","2_7","2_8","2_9",\r
595 "3_0","3_1","3_2","3_3","3_4","3_5","3_6","3_7","3_8","3_9",\r
596 "4_0","4_1","4_2","4_3","4_4","4_5","4_6","4_7","4_8","4_9",\r
597 "5_0","5_1","5_2","5_3","5_4","5_5","5_6","5_7","5_8","5_9"};\r
598\r
599\r
600 fhESDsSingle = new TH1F("ACORDEBitPatternfromESDsSingle","Distribution of ACORDE fired modules from ESDs-Single;Modules;Counts",60,1,60);\r
601 Add2ESDsList(fhESDsSingle,0,!expert,image);\r
602\r
603 fhESDsMulti = new TH1F("ACORDEBitPatternfromESDsMulti","Distribution of ACORDE fired modules from ESDs-Multi;Modules;Counts",60,1,60);\r
604 Add2ESDsList(fhESDsMulti,1,!expert,image);\r
1b368017 605 \r
606 fhESDsMultiplicity = new TH1F("ACORDEMultiplicityfromESD","Number of fired ACORDE modules; No. of fired ACORDE modules;No. of events in ACORDE",60,-0.5,60);\r
607 Add2ESDsList(fhESDsMultiplicity,2,!expert,image); \r
dc7f1e9e 608 for (Int_t i=0;i<60;i++)\r
609 {\r
610 fhESDsSingle->GetXaxis()->SetBinLabel(i+1,acoModule[i]);\r
611 fhESDsMulti->GetXaxis()->SetBinLabel(i+1,acoModule[i]);\r
612 }\r
92664bc8 613 //\r
614 ClonePerTrigClass(AliQAv1::kESDS); // this should be the last line\r
dc7f1e9e 615}\r
616//____________________________________________________________________________\r
617void AliACORDEQADataMakerRec::MakeRaws(AliRawReader* rawReader)\r
618{\r
619 //fills QA histos for RAW\r
92664bc8 620 IncEvCountCycleRaws();\r
621 IncEvCountTotalRaws();\r
dc7f1e9e 622 rawReader->Reset();\r
623 AliACORDERawStream rawStream(rawReader);\r
624 size_t contSingle=0;\r
625 size_t contMulti=0;\r
626 UInt_t dy[4];\r
627\r
628 bool kroSingle[60],kroMulti[60];\r
629 UInt_t tmpDy;\r
630\r
631 for(Int_t m=0;m<60;m++) {kroSingle[m]=0;kroMulti[m]=0;}\r
632\r
633if(rawStream.Next())\r
634{\r
635 dy[0]=rawStream.GetWord(0);\r
636 dy[1]=rawStream.GetWord(1);\r
637 dy[2]=rawStream.GetWord(2);\r
638 dy[3]=rawStream.GetWord(3);\r
639 tmpDy=dy[0];\r
10f9e41a 640 for(Int_t r=0;r<30;r++)\r
dc7f1e9e 641 {\r
642 kroSingle[r] = tmpDy & 1;\r
643 tmpDy>>=1;\r
644 }\r
645 tmpDy=dy[1];\r
10f9e41a 646 for(Int_t r=30;r<60;r++)\r
dc7f1e9e 647 {\r
648 kroSingle[r] = tmpDy & 1;\r
649 tmpDy>>=1;\r
650 }\r
651 tmpDy=dy[2];\r
10f9e41a 652 for(Int_t r=0;r<30;r++)\r
dc7f1e9e 653 {\r
654 kroMulti[r] = tmpDy & 1;\r
655 tmpDy>>=1;\r
656 }\r
657 tmpDy=dy[3];\r
10f9e41a 658 for(Int_t r=30;r<60;r++)\r
dc7f1e9e 659 {\r
660 kroMulti[r] = tmpDy & 1;\r
661 tmpDy>>=1;\r
662 }\r
663 contSingle=0;\r
92664bc8 664 contMulti=0;\r
10f9e41a 665 for(Int_t r=0;r<60;r++)\r
dc7f1e9e 666 {\r
92664bc8 667 if(kroSingle[r]==1)\r
668 {\r
669 FillRawsData(0,r);\r
670 //FillRawsData(4,r);\r
671 contSingle++;\r
672 }\r
1b368017 673 if(kroMulti[r]==1)\r
674 {\r
92664bc8 675 FillRawsData(2,r);\r
676 //FillRawsData(6,r);\r
677 contMulti++;\r
1b368017 678 }\r
92664bc8 679 \r
680 } \r
47f5f498 681 FillRawsData(1,contSingle); \r
682 FillRawsData(3,contMulti); \r
9f9f68fb 683 // FillRawsData(7,contMulti);\r
dc7f1e9e 684}\r
685}\r
686//____________________________________________________________________________\r
687void AliACORDEQADataMakerRec::MakeDigits( TTree *digitsTree)\r
688{\r
689 //fills QA histos for Digits\r
3542faa1 690 IncEvCountCycleDigits();\r
691 IncEvCountTotalDigits();\r
92664bc8 692\r
dc7f1e9e 693 if (fDigitsArray) \r
694 fDigitsArray->Clear() ; \r
695 else \r
696 fDigitsArray = new TClonesArray("AliACORDEdigit",1000);\r
697 TBranch * branch = digitsTree->GetBranch("ACORDEdigit");\r
698 if (!branch) {\r
699 AliWarning("ACORDE branch in Digits Tree not found");\r
700 } else {\r
701 branch->SetAddress(&fDigitsArray);\r
702 for(Int_t track = 0 ; track < branch->GetEntries() ; track++) {\r
703 branch->GetEntry(track);\r
704 for(Int_t idigit = 0 ; idigit < fDigitsArray->GetEntriesFast() ; idigit++) {\r
705 AliACORDEdigit *AcoDigit = (AliACORDEdigit*) fDigitsArray->UncheckedAt(idigit);\r
706 if (!AcoDigit) {\r
707 AliError("The unchecked digit doesn't exist");\r
708 continue ;\r
709 }\r
92664bc8 710 FillDigitsData(0,AcoDigit->GetModule()-1);\r
dc7f1e9e 711 }\r
712 }\r
713 }\r
714}\r
715\r
716//____________________________________________________________________________\r
717void AliACORDEQADataMakerRec::MakeESDs(AliESDEvent * esd)\r
718{\r
719 //fills QA histos for ESD\r
92664bc8 720 IncEvCountCycleESDs();\r
721 IncEvCountTotalESDs();\r
722 //\r
dc7f1e9e 723 AliESDACORDE * fESDACORDE= esd->GetACORDEData();\r
1b368017 724 Int_t acoMulti=0;\r
dc7f1e9e 725 for(int i=0;i<60;i++)\r
726 {\r
92664bc8 727 if(fESDACORDE->GetHitChannel(i)) \r
728 {\r
729 FillESDsData(0,i+1);\r
730 FillESDsData(1,i+1);\r
731 acoMulti++;\r
dc7f1e9e 732 }\r
92664bc8 733 } FillESDsData(2,acoMulti);\r
dc7f1e9e 734\r
735}\r