1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\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
16 // Produces the data needed to calculate the quality assurance.
\r
17 // All data must be mergeable objects.
\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
26 // Created: June 13th 2008
\r
28 // Last update: Sept. 29th. 2011 (by Mario RC: mrodrigu@mail.cern.ch)
\r
29 // --> ACOMultiSL0_DQM_Shifter filling histogram fixed
\r
30 // --> Expert histogram updated: 2 histograms (Checks the hits for SL0 and AMU mode)
\r
31 // --> To be include in the next update: threshold settings from AliACORDEQAThreshold class (not yet)
\r
32 // Last update: May 5th. 2011 (by Mario RC: mrodrigu@mail.cern.ch) -->Creates QA expert histograms
\r
33 // and QA-shifter histograms also with threshold lines and visual alarm
\r
34 // Last Update: Aug. 27th 2008 --> Implementation to declare QA expert histogram
\r
35 // Last update: Nov. 14t 2009 --> MRC <mrodrigu@mail.cern.ch> (FCFM-BUAP)
\r
36 // |--> Change in Multiplicity histogram for AMORE (to detect empty triggers events of ACORDE)
\r
40 // --- ROOT system ---
\r
41 #include <TClonesArray.h>
\r
44 #include <TDirectory.h>
\r
45 #include <TPaveText.h>
\r
46 // --- Standard library ---
\r
48 // --- AliRoot header files ---
\r
49 #include "AliESDEvent.h"
\r
51 #include "AliACORDEdigit.h"
\r
52 #include "AliACORDEhit.h"
\r
53 #include "AliACORDEQADataMakerRec.h"
\r
54 #include "AliQAChecker.h"
\r
55 #include "AliACORDERawReader.h"
\r
56 #include "AliACORDERawStream.h"
\r
57 ClassImp(AliACORDEQADataMakerRec)
\r
59 //____________________________________________________________________________
\r
60 AliACORDEQADataMakerRec::AliACORDEQADataMakerRec():AliQADataMakerRec(AliQAv1::GetDetName(AliQAv1::kACORDE), "ACORDE Quality Assurance Data Maker"),
\r
61 fhACOMean(new TLine(0.,4.,60.,4.)),
\r
62 fhACOMin(new TLine(0.,4.,60.,4.)),
\r
63 fhACOMax(new TLine(0.,4.,60.,4.)),
\r
64 fhACOMulti(new TLine(0.,4.,60.,4.)),
\r
65 fhACOMeanAMU(new TLine(0.,4.,60.,4.)),
\r
66 fhACOMinAMU(new TLine(0.,4.,60.,4.)),
\r
67 fhACOMaxAMU(new TLine(0.,4.,60.,4.)),
\r
68 fhACOMultiAMU(new TLine(0.,4.,60.,4.))
\r
72 //____________________________________________________________________________
\r
73 AliACORDEQADataMakerRec::AliACORDEQADataMakerRec(const AliACORDEQADataMakerRec& qadm):
\r
74 AliQADataMakerRec(),
\r
75 fhACOMean(qadm.fhACOMean),
\r
76 fhACOMin(qadm.fhACOMin),
\r
77 fhACOMax(qadm.fhACOMax),
\r
78 fhACOMulti(qadm.fhACOMulti),
\r
79 fhACOMeanAMU(qadm.fhACOMeanAMU),
\r
80 fhACOMinAMU(qadm.fhACOMinAMU),
\r
81 fhACOMaxAMU(qadm.fhACOMaxAMU),
\r
82 fhACOMultiAMU(qadm.fhACOMultiAMU)
\r
84 SetName((const char*)qadm.GetName()) ;
\r
85 SetTitle((const char*)qadm.GetTitle());
\r
88 //__________________________________________________________________
\r
89 AliACORDEQADataMakerRec::~AliACORDEQADataMakerRec()
\r
95 delete fhACOMeanAMU;
\r
98 delete fhACOMultiAMU;
\r
101 //__________________________________________________________________
\r
102 AliACORDEQADataMakerRec& AliACORDEQADataMakerRec::operator = (const AliACORDEQADataMakerRec& qadm )
\r
105 this->~AliACORDEQADataMakerRec();
\r
106 new(this) AliACORDEQADataMakerRec(qadm);
\r
109 //____________________________________________________________________________
\r
110 void AliACORDEQADataMakerRec::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)
\r
112 //Detector specific actions at end of cycle
\r
113 // do the QA checking
\r
114 ResetEventTrigClasses(); // reset triggers list to select all histos
\r
115 // Update for DQM GUI
\r
118 // Thresholds and alarms definitions
\r
119 /*******************************************************************************************
\r
121 We check the performance of the ACORDE's modules respect to the mean
\r
122 value over the integral for hits for all the modules (in SL0 and AMU), then
\r
123 for the threshold lines we don't use a fixed threshold value.
\r
125 For the alarms, we need two fixed values (one for each configuration, SL0 and AMU):
\r
127 -) SL0_ThresholdAlarm: minimum number of ACORDE's modules woriking properly
\r
128 -) AMU_ThresholdAlarm: minimum number of ACORDE's modules woriking properly
\r
130 This should work for p-p*, HI* and cosmic** data taking.
\r
132 * only as readout detector (if ACORDE is triggering, in some rare trigger cluster,
\r
133 an improvement should be done)
\r
134 ** as readout and trigger detector.
\r
136 *********************************************************************************************/
\r
138 for (Int_t specie = 0; specie < AliRecoParam::kNSpecies ; specie++) {
\r
139 if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) continue ;
\r
141 // RS Set event specie
\r
142 SetEventSpecie(AliRecoParam::ConvertIndex(specie));
\r
144 for (int itc=-1;itc<GetNTrigClasses();itc++) { // RS Loop over the trigger classes
\r
146 TObjArray * parr = GetRawsDataOfTrigClass(itc);
\r
147 if (!parr) continue;
\r
148 TObjArray &harr = *parr;
\r
149 TH1* h0 = (TH1*)harr[0];
\r
150 TH1* h1 = (TH1*)harr[1];
\r
151 if (!h0 || !h1) continue;
\r
152 TH1* h2 = (TH1*)harr[2];
\r
153 TH1* h3 = (TH1*)harr[3];
\r
154 if (!h2 || !h3) continue;
\r
156 Double_t integralSL0 = 0;
\r
157 Double_t integralAMU = 0;
\r
159 // maximimum and minimum for Pads
\r
161 Double_t maxPad = h0->GetMaximum();
\r
163 if ((itc==-1 && !(integralAMU=h2->Integral()) || h2->GetMaximum()==0)||(itc==-1 && !(integralSL0=h0->Integral()) || h0->GetMaximum()==0)) { // default clone
\r
164 printf("No entries in ACORDE Hits histograms for trigger class %d, fatal error, please check !!!\n",itc);
\r
165 Float_t maxPadAMU = h3->GetMaximum();
\r
166 TPaveText *acoBoxFatalAMU = new TPaveText(35,0,55,1,"b");
\r
167 acoBoxFatalAMU->SetFillColor(kRed);
\r
168 acoBoxFatalAMU->SetLineColor(kRed);
\r
169 acoBoxFatalAMU->SetLineWidth(2);
\r
170 acoBoxFatalAMU->AddText("ACO: Not O.K.");
\r
171 acoBoxFatalAMU->AddText("Call the experts");
\r
173 TPaveText *acoBoxFatalMultiAMU = new TPaveText(35,0,55,maxPadAMU,"b");
\r
174 acoBoxFatalMultiAMU->SetFillColor(kRed);
\r
175 acoBoxFatalMultiAMU->SetLineColor(kRed);
\r
176 acoBoxFatalMultiAMU->SetLineWidth(2);
\r
177 acoBoxFatalMultiAMU->AddText("ACO: Not O.K.");
\r
178 acoBoxFatalMultiAMU->AddText("Call the experts");
\r
180 h2->GetListOfFunctions()->Add(acoBoxFatalAMU);
\r
181 h3->GetListOfFunctions()->Add(acoBoxFatalMultiAMU);
\r
183 Float_t maxPadSL0 = h1->GetMaximum();
\r
185 printf("No entries in ACORDE Hits histograms for trigger class %d, fatal error, please check !!!\n",itc);
\r
186 TPaveText *acoBoxFatal = new TPaveText(35,0,55,1,"b");
\r
187 acoBoxFatal->SetFillColor(kRed);
\r
188 acoBoxFatal->SetLineColor(kRed);
\r
189 acoBoxFatal->SetLineWidth(2);
\r
190 acoBoxFatal->AddText("ACO: Not O.K.");
\r
191 acoBoxFatal->AddText("Call the experts");
\r
193 TPaveText *acoBoxFatalMulti = new TPaveText(35,0,55,maxPadSL0,"b");
\r
194 acoBoxFatalMulti->SetFillColor(kRed);
\r
195 acoBoxFatalMulti->SetLineColor(kRed);
\r
196 acoBoxFatalMulti->SetLineWidth(2);
\r
197 acoBoxFatalMulti->AddText("ACO: Not O.K.");
\r
198 acoBoxFatalMulti->AddText("Call the experts");
\r
200 h0->GetListOfFunctions()->Add(acoBoxFatal);
\r
201 h1->GetListOfFunctions()->Add(acoBoxFatalMulti);
\r
207 // setting the thresholds
\r
209 Int_t SL0_ThresholdAlarm = 45; // default value until the creation of AliACORDEThreshold class
\r
210 Int_t AMU_ThresholdAlarm = 45; // default value until the creation of AliACORDEThreshold class
\r
212 // SL0 - histograms
\r
214 Int_t indexActiveModuleSL0 = 0;
\r
215 for(Int_t iModule=0;iModule<60;iModule++){
\r
216 if (h0->GetBinContent(iModule)>0) indexActiveModuleSL0++;
\r
219 Float_t meanHitsSL0 = 0.;
\r
220 if (indexActiveModuleSL0!=0) meanHitsSL0=h0->Integral()/indexActiveModuleSL0;
\r
222 Int_t indexSL0 = 0;
\r
224 // set the threshold lines: minimum, maximum and mean
\r
226 fhACOMean->SetX1(0);
\r
227 fhACOMean->SetY1(meanHitsSL0);
\r
228 fhACOMean->SetX2(59);
\r
229 fhACOMean->SetY2(meanHitsSL0);
\r
231 fhACOMin->SetX1(0);
\r
232 fhACOMin->SetX2(59);
\r
233 fhACOMin->SetY1(meanHitsSL0-0.80*meanHitsSL0);
\r
234 fhACOMin->SetY2(meanHitsSL0-0.80*meanHitsSL0);
\r
236 fhACOMax->SetX1(0);
\r
237 fhACOMax->SetX2(59);
\r
238 fhACOMax->SetY1(meanHitsSL0+0.80*meanHitsSL0);
\r
239 fhACOMax->SetY2(meanHitsSL0+0.80*meanHitsSL0);
\r
241 fhACOMulti->SetX1(0);
\r
242 fhACOMulti->SetY1(0);
\r
243 fhACOMulti->SetX2(0);
\r
244 Float_t maxMulti = 0;
\r
245 if (h1->GetMaximum()>0) maxMulti = h1->GetMaximum();
\r
246 fhACOMulti->SetY2(maxMulti);
\r
248 TPaveText *acoBoxOkHitsSL0 = new TPaveText(35,meanHitsSL0+0.5*meanHitsSL0,55,maxPad,"b");
\r
249 acoBoxOkHitsSL0->SetFillColor(kGreen);
\r
250 acoBoxOkHitsSL0->SetLineColor(kGreen);
\r
251 acoBoxOkHitsSL0->SetLineWidth(2);
\r
252 acoBoxOkHitsSL0->AddText("ACO: O.K.");
\r
254 TPaveText *acoBoxErrorHitsSL0 = new TPaveText(35,meanHitsSL0+0.5*meanHitsSL0,55,maxPad,"b");
\r
255 acoBoxErrorHitsSL0->SetFillColor(kRed);
\r
256 acoBoxErrorHitsSL0->SetLineColor(kRed);
\r
257 acoBoxErrorHitsSL0->SetLineWidth(2);
\r
258 acoBoxErrorHitsSL0->AddText("ACO: Not O.K.");
\r
260 Float_t maxPadMulti = h1->GetMaximum();
\r
262 TPaveText *acoBoxOkMultiSL0 = new TPaveText(35,maxPadMulti-0.3*maxPadMulti,55,maxPadMulti,"b");
\r
263 acoBoxOkMultiSL0->SetFillColor(kGreen);
\r
264 acoBoxOkMultiSL0->SetLineColor(kGreen);
\r
265 acoBoxOkMultiSL0->SetLineWidth(2);
\r
266 acoBoxOkMultiSL0->AddText("ACO: O.K.");
\r
268 TPaveText *acoBoxErrorMultiSL0 = new TPaveText(35,maxPadMulti-0.3*maxPadMulti,55,maxPadMulti,"b");
\r
269 acoBoxErrorMultiSL0->SetFillColor(kRed);
\r
270 acoBoxErrorMultiSL0->SetLineColor(kRed);
\r
271 acoBoxErrorMultiSL0->SetLineWidth(2);
\r
272 acoBoxErrorMultiSL0->AddText("ACO: Not O.K.");
\r
273 TH1* h4 = (TH1*)harr[4];
\r
275 for (Int_t iModule = 0; iModule < 60; iModule++){
\r
276 if (meanHitsSL0!=0){
\r
277 if (TMath::Abs(h0->GetBinContent(iModule)/meanHitsSL0-1) < 1) indexSL0++;
\r
279 h4->Fill(h0->GetBinContent(iModule)/meanHitsSL0-1);
\r
284 if (indexSL0>=SL0_ThresholdAlarm){
\r
285 h0->GetListOfFunctions()->Add(acoBoxOkHitsSL0);
\r
286 h1->GetListOfFunctions()->Add(acoBoxOkMultiSL0);
\r
289 h0->GetListOfFunctions()->Add(acoBoxErrorHitsSL0);
\r
290 h1->GetListOfFunctions()->Add(acoBoxErrorMultiSL0);
\r
294 // AMU - histograms
\r
296 Int_t indexActiveModuleAMU = 0;
\r
297 for(Int_t iModule=0;iModule<60;iModule++){
\r
298 if (h2->GetBinContent(iModule)>0) indexActiveModuleAMU++;
\r
301 Float_t meanHitsAMU = 0.;
\r
302 if (indexActiveModuleAMU!=0) meanHitsAMU=h2->Integral()/indexActiveModuleAMU;
\r
304 // setting the line's thresholds: min, max and mean of hits
\r
306 fhACOMeanAMU->SetX1(0);
\r
307 fhACOMeanAMU->SetY1(meanHitsAMU);
\r
308 fhACOMeanAMU->SetX2(59);
\r
309 fhACOMeanAMU->SetY2(meanHitsAMU);
\r
311 fhACOMinAMU->SetX1(0);
\r
312 fhACOMinAMU->SetX2(59);
\r
313 fhACOMinAMU->SetY1(meanHitsAMU-0.80*meanHitsAMU);
\r
314 fhACOMinAMU->SetY2(meanHitsAMU-0.80*meanHitsAMU);
\r
317 fhACOMaxAMU->SetX1(0);
\r
318 fhACOMaxAMU->SetX2(59);
\r
319 fhACOMaxAMU->SetY1(meanHitsAMU+0.80*meanHitsAMU);
\r
320 fhACOMaxAMU->SetY2(meanHitsAMU+0.80*meanHitsAMU);
\r
323 fhACOMultiAMU->SetX1(0);
\r
324 fhACOMultiAMU->SetY1(0);
\r
325 fhACOMultiAMU->SetX2(0);
\r
326 Float_t maxMultiAMU = 0;
\r
327 if (h3->GetMaximum()>0) maxMultiAMU = h3->GetMaximum();
\r
328 fhACOMultiAMU->SetY2(maxMultiAMU);
\r
330 // setting the alarms
\r
332 TPaveText *acoBoxOkHitsAMU = new TPaveText(35,meanHitsAMU+0.5*meanHitsAMU,55,maxPad,"b");
\r
333 acoBoxOkHitsAMU->SetFillColor(kGreen);
\r
334 acoBoxOkHitsAMU->SetLineColor(kGreen);
\r
335 acoBoxOkHitsAMU->SetLineWidth(2);
\r
336 acoBoxOkHitsAMU->AddText("ACO: O.K.");
\r
338 TPaveText *acoBoxErrorHitsAMU = new TPaveText(35,meanHitsAMU+0.5*meanHitsAMU,55,maxPad,"b");
\r
339 acoBoxErrorHitsAMU->SetFillColor(kRed);
\r
340 acoBoxErrorHitsAMU->SetLineColor(kRed);
\r
341 acoBoxErrorHitsAMU->SetLineWidth(2);
\r
342 acoBoxErrorHitsAMU->AddText("ACO: Not O.K.");
\r
344 Float_t maxPadMultiAMU = h3->GetMaximum();
\r
346 TPaveText *acoBoxOkMultiAMU = new TPaveText(35,maxPadMultiAMU-0.3*maxPadMultiAMU,55,maxPadMultiAMU,"b");
\r
347 acoBoxOkMultiAMU->SetFillColor(kGreen);
\r
348 acoBoxOkMultiAMU->SetLineColor(kGreen);
\r
349 acoBoxOkMultiAMU->SetLineWidth(2);
\r
350 acoBoxOkMultiAMU->AddText("ACO: O.K.");
\r
352 TPaveText *acoBoxErrorMultiAMU = new TPaveText(35,maxPadMultiAMU-0.3*maxPadMultiAMU,55,maxPadMultiAMU,"b");
\r
353 acoBoxErrorMultiAMU->SetFillColor(kRed);
\r
354 acoBoxErrorMultiAMU->SetLineColor(kRed);
\r
355 acoBoxErrorMultiAMU->SetLineWidth(2);
\r
356 acoBoxErrorMultiAMU->AddText("ACO: Not O.K.");
\r
357 TH1* h5 = (TH1*)harr[5];
\r
361 for (Int_t iModule = 0; iModule < 60; iModule++){
\r
362 if (meanHitsAMU!=0){
\r
363 if (TMath::Abs(h2->GetBinContent(iModule)/meanHitsAMU-1) < 1) indexAMU++;
\r
365 h5->Fill(h2->GetBinContent(iModule)/meanHitsAMU-1);
\r
370 if (indexAMU>=AMU_ThresholdAlarm) {
\r
371 h2->GetListOfFunctions()->Add(acoBoxOkHitsAMU);
\r
372 h3->GetListOfFunctions()->Add(acoBoxOkMultiAMU);
\r
375 h2->GetListOfFunctions()->Add(acoBoxErrorHitsAMU);
\r
376 h3->GetListOfFunctions()->Add(acoBoxErrorMultiAMU);
\r
379 } // end of trigger classes loop
\r
380 } // end specie loop
\r
381 // QA Checker standar (to be updated)
\r
383 AliQAChecker::Instance()->Run(AliQAv1::kACORDE, task, list) ;
\r
386 //____________________________________________________________________________
\r
387 void AliACORDEQADataMakerRec::StartOfDetectorCycle()
\r
389 //Detector specific actions at start of cycle
\r
393 //____________________________________________________________________________
\r
394 void AliACORDEQADataMakerRec::InitRaws()
\r
396 // create Raw histograms in Raw subdir
\r
398 const Bool_t expert = kTRUE ;
\r
399 const Bool_t saveCorr = kTRUE ;
\r
400 const Bool_t image = kTRUE ;
\r
401 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
402 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
403 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
404 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
405 TH1F * fhACORDEBitPatternCheckDQMSL0 = new TH1F("ACOHitsTriggerCheck_DQMExpertSL0","Check the activity of ACORDE's modules; |Hits per module/mean of Hits - 1|; Counts",100,-3,5); // Check the trigger status of ACORDE (SL0 vs AMU)
\r
406 TH1F * fhACORDEBitPatternCheckDQMAMU = new TH1F("ACOHitsTriggerCheck_DQMExpertAMU","Check the activity of ACORDE's modules; |Hits per module/mean of Hits - 1|; Counts",100,-3,5); // Check the trigger status of ACORDE (SL0 vs AMU)
\r
407 // Expert histograms
\r
408 // Check the hits multiplicity from trigger configuration
\r
409 Add2RawsList(fhACORDEBitPatternCheckDQMSL0,4,expert,image,!saveCorr);
\r
410 fhACORDEBitPatternCheckDQMSL0->SetFillColor(kOrange);
\r
411 Add2RawsList(fhACORDEBitPatternCheckDQMAMU,5,expert,image,!saveCorr);
\r
412 fhACORDEBitPatternCheckDQMAMU->SetFillColor(kRed+2);
\r
415 // AMORE diplay settings for shifter on GUI
\r
417 // For SL0 ACO trigger mode
\r
419 Add2RawsList(fhACORDEBitPatternDQM,0,!expert,image,!saveCorr);
\r
420 ForbidCloning(fhACORDEBitPatternDQM);
\r
421 Add2RawsList(fhACORDEMultiplicitySL0DQM,1,!expert,image,!saveCorr);
\r
422 ForbidCloning(fhACORDEMultiplicitySL0DQM);
\r
424 // For Hits distribution on ACORDE
\r
426 fhACORDEBitPatternDQM->SetFillColor(kMagenta+2);
\r
427 fhACOMean->SetLineColor(kBlue);
\r
428 fhACOMean->SetLineStyle(2);
\r
429 fhACOMean->SetLineWidth(4);
\r
430 fhACORDEBitPatternDQM->GetListOfFunctions()->Add(fhACOMean);
\r
431 fhACOMin->SetLineColor(kGreen);
\r
432 fhACOMin->SetLineStyle(2);
\r
433 fhACOMin->SetLineWidth(4);
\r
434 fhACORDEBitPatternDQM->GetListOfFunctions()->Add(fhACOMin);
\r
435 fhACOMax->SetLineColor(kGreen);
\r
436 fhACOMax->SetLineStyle(2);
\r
437 fhACOMax->SetLineWidth(4);
\r
438 fhACORDEBitPatternDQM->GetListOfFunctions()->Add(fhACOMax);
\r
440 // For ACORDE Multiplicity distribution of fired modules
\r
442 fhACORDEMultiplicitySL0DQM->SetFillColor(kMagenta);
\r
443 fhACOMulti->SetLineColor(kMagenta);
\r
444 fhACOMulti->SetLineStyle(2);
\r
445 fhACOMulti->SetLineWidth(4);
\r
446 fhACORDEMultiplicitySL0DQM->GetListOfFunctions()->Add(fhACOMulti);
\r
448 // For AMU ACO trigger mode
\r
450 Add2RawsList(fhACORDEBitPatternAMUDQM,2,!expert,image,!saveCorr);
\r
451 Add2RawsList(fhACORDEMultiplicityAMUDQM,3,!expert,image,!saveCorr);
\r
453 // For Hits distribution on ACORDE
\r
455 fhACORDEBitPatternAMUDQM->SetFillColor(kViolet+7);
\r
456 fhACOMeanAMU->SetLineColor(kBlue);
\r
457 fhACOMeanAMU->SetLineStyle(2);
\r
458 fhACOMeanAMU->SetLineWidth(4);
\r
459 fhACORDEBitPatternAMUDQM->GetListOfFunctions()->Add(fhACOMeanAMU);
\r
460 fhACOMinAMU->SetLineColor(kGreen);
\r
461 fhACOMinAMU->SetLineStyle(2);
\r
462 fhACOMinAMU->SetLineWidth(4);
\r
463 fhACORDEBitPatternAMUDQM->GetListOfFunctions()->Add(fhACOMinAMU);
\r
464 fhACOMaxAMU->SetLineColor(kGreen);
\r
465 fhACOMaxAMU->SetLineStyle(2);
\r
466 fhACOMaxAMU->SetLineWidth(4);
\r
467 fhACORDEBitPatternAMUDQM->GetListOfFunctions()->Add(fhACOMaxAMU);
\r
469 // For ACORDE Multiplicity distribution of fired modules
\r
471 fhACORDEMultiplicityAMUDQM->SetFillColor(kViolet+6);
\r
472 fhACOMultiAMU->SetLineColor(kAzure-2);
\r
473 fhACOMultiAMU->SetLineStyle(2);
\r
474 fhACOMultiAMU->SetLineWidth(4);
\r
475 fhACORDEMultiplicityAMUDQM->GetListOfFunctions()->Add(fhACOMultiAMU);
\r
478 ClonePerTrigClass(AliQAv1::kRAWS); // this should be the last line
\r
481 //____________________________________________________________________________
\r
482 void AliACORDEQADataMakerRec::InitDigits()
\r
484 // create Digits histograms in Digits subdir
\r
486 const Bool_t expert = kTRUE ;
\r
487 const Bool_t image = kTRUE ;
\r
488 TH1F * fhDigitsModule;
\r
489 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
490 "1_0","1_1","1_2","1_3","1_4","1_5","1_6","1_7","1_8","1_9",
\r
491 "2_0","2_1","2_2","2_3","2_4","2_5","2_6","2_7","2_8","2_9",
\r
492 "3_0","3_1","3_2","3_3","3_4","3_5","3_6","3_7","3_8","3_9",
\r
493 "4_0","4_1","4_2","4_3","4_4","4_5","4_6","4_7","4_8","4_9",
\r
494 "5_0","5_1","5_2","5_3","5_4","5_5","5_6","5_7","5_8","5_9"};
\r
497 fhDigitsModule = new TH1F("ACORDEBitPatternfromDigits","Distribution of ACORDE from DIGITS;Modules;Counts",60,1,60);
\r
498 Add2DigitsList(fhDigitsModule,0,!expert,image);
\r
499 for (Int_t i=0;i<60;i++) fhDigitsModule->GetXaxis()->SetBinLabel(i+1,acoModule[i]);
\r
501 ClonePerTrigClass(AliQAv1::kDIGITS); // this should be the last line
\r
504 //____________________________________________________________________________
\r
506 void AliACORDEQADataMakerRec::InitRecPoints()
\r
508 // create cluster histograms in RecPoint subdir
\r
509 // Not needed for ACORDE by now !!!
\r
511 ClonePerTrigClass(AliQAv1::kRECPOINTS); // this should be the last line
\r
514 //____________________________________________________________________________
\r
515 void AliACORDEQADataMakerRec::InitESDs()
\r
517 //create ESDs histograms in ESDs subdir
\r
519 const Bool_t expert = kTRUE ;
\r
520 const Bool_t image = kTRUE ;
\r
522 TH1F * fhESDsSingle;
\r
523 TH1F * fhESDsMulti;
\r
524 TH1F * fhESDsMultiplicity;
\r
525 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
526 "1_0","1_1","1_2","1_3","1_4","1_5","1_6","1_7","1_8","1_9",
\r
527 "2_0","2_1","2_2","2_3","2_4","2_5","2_6","2_7","2_8","2_9",
\r
528 "3_0","3_1","3_2","3_3","3_4","3_5","3_6","3_7","3_8","3_9",
\r
529 "4_0","4_1","4_2","4_3","4_4","4_5","4_6","4_7","4_8","4_9",
\r
530 "5_0","5_1","5_2","5_3","5_4","5_5","5_6","5_7","5_8","5_9"};
\r
533 fhESDsSingle = new TH1F("ACORDEBitPatternfromESDsSingle","Distribution of ACORDE fired modules from ESDs-Single;Modules;Counts",60,1,60);
\r
534 Add2ESDsList(fhESDsSingle,0,!expert,image);
\r
536 fhESDsMulti = new TH1F("ACORDEBitPatternfromESDsMulti","Distribution of ACORDE fired modules from ESDs-Multi;Modules;Counts",60,1,60);
\r
537 Add2ESDsList(fhESDsMulti,1,!expert,image);
\r
539 fhESDsMultiplicity = new TH1F("ACORDEMultiplicityfromESD","Number of fired ACORDE modules; No. of fired ACORDE modules;No. of events in ACORDE",60,-0.5,60);
\r
540 Add2ESDsList(fhESDsMultiplicity,2,!expert,image);
\r
541 for (Int_t i=0;i<60;i++)
\r
543 fhESDsSingle->GetXaxis()->SetBinLabel(i+1,acoModule[i]);
\r
544 fhESDsMulti->GetXaxis()->SetBinLabel(i+1,acoModule[i]);
\r
547 ClonePerTrigClass(AliQAv1::kESDS); // this should be the last line
\r
549 //____________________________________________________________________________
\r
550 void AliACORDEQADataMakerRec::MakeRaws(AliRawReader* rawReader)
\r
552 //fills QA histos for RAW
\r
553 IncEvCountCycleRaws();
\r
554 IncEvCountTotalRaws();
\r
555 rawReader->Reset();
\r
556 AliACORDERawStream rawStream(rawReader);
\r
557 size_t contSingle=0;
\r
558 size_t contMulti=0;
\r
561 bool kroSingle[60],kroMulti[60];
\r
564 for(Int_t m=0;m<60;m++) {kroSingle[m]=0;kroMulti[m]=0;}
\r
566 if(rawStream.Next())
\r
568 dy[0]=rawStream.GetWord(0);
\r
569 dy[1]=rawStream.GetWord(1);
\r
570 dy[2]=rawStream.GetWord(2);
\r
571 dy[3]=rawStream.GetWord(3);
\r
573 for(Int_t r=0;r<30;r++)
\r
575 kroSingle[r] = tmpDy & 1;
\r
579 for(Int_t r=30;r<60;r++)
\r
581 kroSingle[r] = tmpDy & 1;
\r
585 for(Int_t r=0;r<30;r++)
\r
587 kroMulti[r] = tmpDy & 1;
\r
591 for(Int_t r=30;r<60;r++)
\r
593 kroMulti[r] = tmpDy & 1;
\r
598 for(Int_t r=0;r<60;r++)
\r
600 if(kroSingle[r]==1)
\r
603 //FillRawsData(4,r);
\r
609 //FillRawsData(6,r);
\r
614 FillRawsData(1,contSingle);
\r
615 FillRawsData(3,contMulti);
\r
616 // FillRawsData(7,contMulti);
\r
619 //____________________________________________________________________________
\r
620 void AliACORDEQADataMakerRec::MakeDigits( TTree *digitsTree)
\r
622 //fills QA histos for Digits
\r
623 IncEvCountCycleDigits();
\r
624 IncEvCountTotalDigits();
\r
627 fDigitsArray->Clear() ;
\r
629 fDigitsArray = new TClonesArray("AliACORDEdigit",1000);
\r
630 TBranch * branch = digitsTree->GetBranch("ACORDEdigit");
\r
632 AliWarning("ACORDE branch in Digits Tree not found");
\r
634 branch->SetAddress(&fDigitsArray);
\r
635 for(Int_t track = 0 ; track < branch->GetEntries() ; track++) {
\r
636 branch->GetEntry(track);
\r
637 for(Int_t idigit = 0 ; idigit < fDigitsArray->GetEntriesFast() ; idigit++) {
\r
638 AliACORDEdigit *AcoDigit = (AliACORDEdigit*) fDigitsArray->UncheckedAt(idigit);
\r
640 AliError("The unchecked digit doesn't exist");
\r
643 FillDigitsData(0,AcoDigit->GetModule()-1);
\r
649 //____________________________________________________________________________
\r
650 void AliACORDEQADataMakerRec::MakeESDs(AliESDEvent * esd)
\r
652 //fills QA histos for ESD
\r
653 IncEvCountCycleESDs();
\r
654 IncEvCountTotalESDs();
\r
656 AliESDACORDE * fESDACORDE= esd->GetACORDEData();
\r
658 for(int i=0;i<60;i++)
\r
660 if(fESDACORDE->GetHitChannel(i))
\r
662 FillESDsData(0,i+1);
\r
663 FillESDsData(1,i+1);
\r
666 } FillESDsData(2,acoMulti);
\r