]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EMCAL/AliEMCALQADataMakerRec.cxx
QA updates from Yaxian
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALQADataMakerRec.cxx
CommitLineData
9e47432c 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15/*
16Based on the QA code for PHOS written by Yves Schutz July 2007
17
18Authors: J.Klay (Cal Poly) May 2008
19 S. Salur LBL April 2008
20
38986b78 21Created one histogram for QA shifter;-- Yaxian Mao: 11/2009
9e47432c 22The idea:average counts for all the towers should be flat
23Change all existing histograms as experts
9e47432c 24
38986b78 25Change histograms for DQM shifter: -- Yaxian Mao 04/2010
26Calcuate the amplitude ratio from current run and the LED reference, for QAChecker use
27Also calculate the ratio of amplitude from LED Monitor system (current/Reference), to check LED system
28
9e47432c 29*/
30
31// --- ROOT system ---
32#include <TClonesArray.h>
33#include <TFile.h>
34#include <TH1F.h>
35#include <TH1I.h>
36#include <TH2F.h>
38986b78 37#include <TLine.h>
38#include <TText.h>
9e47432c 39#include <TProfile.h>
38986b78 40#include <TStyle.h>
9e47432c 41// --- Standard library ---
42
43
44// --- AliRoot header files ---
e03bcdd4 45#include "AliDAQ.h"
9e47432c 46#include "AliESDCaloCluster.h"
47#include "AliESDCaloCells.h"
48#include "AliESDEvent.h"
49#include "AliLog.h"
50#include "AliEMCALQADataMakerRec.h"
51#include "AliQAChecker.h"
52#include "AliEMCALDigit.h"
53#include "AliEMCALRecPoint.h"
54#include "AliEMCALRawUtils.h"
55#include "AliEMCALReconstructor.h"
56#include "AliEMCALRecParam.h"
57#include "AliRawReader.h"
58#include "AliCaloRawStreamV3.h"
59#include "AliEMCALGeoParams.h"
def665cb 60#include "AliRawEventHeaderBase.h"
38986b78 61#include "AliQAManager.h"
62#include "AliCDBEntry.h"
def665cb 63
64#include "AliCaloBunchInfo.h"
65#include "AliCaloFitResults.h"
66#include "AliCaloRawAnalyzerFastFit.h"
67#include "AliCaloRawAnalyzerNN.h"
68#include "AliCaloRawAnalyzerLMS.h"
69#include "AliCaloRawAnalyzerPeakFinder.h"
70#include "AliCaloRawAnalyzerCrude.h"
9e47432c 71
ce95bae9 72using namespace std;
73
9e47432c 74ClassImp(AliEMCALQADataMakerRec)
75
76//____________________________________________________________________________
def665cb 77AliEMCALQADataMakerRec::AliEMCALQADataMakerRec(fitAlgorithm fitAlgo) :
78 AliQADataMakerRec(AliQAv1::GetDetName(AliQAv1::kEMCAL), "EMCAL Quality Assurance Data Maker"),
79 fFittingAlgorithm(0),
80 fRawAnalyzer(0),
81 fRawAnalyzerTRU(0),
82 fSuperModules(4), // FIXME!!! number of SuperModules; 4 for 2009; update default to 12 for later runs..
83 fFirstPedestalSample(0),
84 fLastPedestalSample(3),
85 fFirstPedestalSampleTRU(0),
86 fLastPedestalSampleTRU(3),
87 fMinSignalLG(0),
88 fMaxSignalLG(AliEMCALGeoParams::fgkSampleMax),
89 fMinSignalHG(0),
90 fMaxSignalHG(AliEMCALGeoParams::fgkSampleMax),
91 fMinSignalTRU(0),
92 fMaxSignalTRU(AliEMCALGeoParams::fgkSampleMax),
93 fMinSignalLGLEDMon(0),
94 fMaxSignalLGLEDMon(AliEMCALGeoParams::fgkSampleMax),
95 fMinSignalHGLEDMon(0),
38986b78 96 fMaxSignalHGLEDMon(AliEMCALGeoParams::fgkSampleMax),
97 fCalibRefHistoPro(NULL),
98 fCalibRefHistoH2F(NULL),
99 fLEDMonRefHistoPro(NULL),
100 fHighEmcHistoH2F(NULL)
101// fTextSM(new TText*[fSuperModules]) ,
102// fLineCol(NULL),
103// fLineRow(NULL)
104
def665cb 105{
9e47432c 106 // ctor
def665cb 107 SetFittingAlgorithm(fitAlgo);
108 fRawAnalyzerTRU = new AliCaloRawAnalyzerLMS();
109 fRawAnalyzerTRU->SetFixTau(kTRUE);
110 fRawAnalyzerTRU->SetTau(2.5); // default for TRU shaper
38986b78 111// for (Int_t sm = 0 ; sm < fSuperModules ; sm++){
112// fTextSM[sm] = NULL ;
113// }
9e47432c 114}
115
116//____________________________________________________________________________
117AliEMCALQADataMakerRec::AliEMCALQADataMakerRec(const AliEMCALQADataMakerRec& qadm) :
118 AliQADataMakerRec(),
def665cb 119 fFittingAlgorithm(0),
120 fRawAnalyzer(0),
121 fRawAnalyzerTRU(0),
9e47432c 122 fSuperModules(qadm.GetSuperModules()),
123 fFirstPedestalSample(qadm.GetFirstPedestalSample()),
124 fLastPedestalSample(qadm.GetLastPedestalSample()),
def665cb 125 fFirstPedestalSampleTRU(qadm.GetFirstPedestalSampleTRU()),
126 fLastPedestalSampleTRU(qadm.GetLastPedestalSampleTRU()),
127 fMinSignalLG(qadm.GetMinSignalLG()),
128 fMaxSignalLG(qadm.GetMaxSignalLG()),
9e47432c 129 fMinSignalHG(qadm.GetMinSignalHG()),
def665cb 130 fMaxSignalHG(qadm.GetMaxSignalHG()),
131 fMinSignalTRU(qadm.GetMinSignalTRU()),
132 fMaxSignalTRU(qadm.GetMaxSignalTRU()),
133 fMinSignalLGLEDMon(qadm.GetMinSignalLGLEDMon()),
134 fMaxSignalLGLEDMon(qadm.GetMaxSignalLGLEDMon()),
135 fMinSignalHGLEDMon(qadm.GetMinSignalHGLEDMon()),
38986b78 136 fMaxSignalHGLEDMon(qadm.GetMaxSignalHGLEDMon()),
137 fCalibRefHistoPro(NULL),
138 fCalibRefHistoH2F(NULL),
139 fLEDMonRefHistoPro(NULL),
140 fHighEmcHistoH2F(NULL)
141// fTextSM(new TText*[fSuperModules]) ,
142// fLineCol(NULL),
143// fLineRow(NULL)
9e47432c 144{
145 //copy ctor
146 SetName((const char*)qadm.GetName()) ;
147 SetTitle((const char*)qadm.GetTitle());
def665cb 148 SetFittingAlgorithm(qadm.GetFittingAlgorithm());
149 fRawAnalyzerTRU = new AliCaloRawAnalyzerLMS();
150 fRawAnalyzerTRU->SetFixTau(kTRUE);
151 fRawAnalyzerTRU->SetTau(2.5); // default for TRU shaper
38986b78 152// for (Int_t sm = 0 ; sm < fSuperModules ; sm++){
153// fTextSM[sm] = qadm.fTextSM[sm] ;
154// }
9e47432c 155}
156
157//__________________________________________________________________
158AliEMCALQADataMakerRec& AliEMCALQADataMakerRec::operator = (const AliEMCALQADataMakerRec& qadm )
159{
160 // Equal operator.
161 this->~AliEMCALQADataMakerRec();
162 new(this) AliEMCALQADataMakerRec(qadm);
38986b78 163// fLineCol = NULL;
164// fLineRow = NULL;
165// for (Int_t sm = 0 ; sm < fSuperModules ; sm++){
166// fTextSM[sm] = qadm.fTextSM[sm] ;
167// }
9e47432c 168 return *this;
169}
170
171//____________________________________________________________________________
172void AliEMCALQADataMakerRec::EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list)
173{
174 //Detector specific actions at end of cycle
175
176// if(fCycleCounter)
177// GetRawsData(kNEventsPerTower)->Scale(1./fCycleCounter);
178
179 // do the QA checking
180 AliQAChecker::Instance()->Run(AliQAv1::kEMCAL, task, list) ;
181}
182
38986b78 183//____________________________________________________________________________
184void AliEMCALQADataMakerRec::GetCalibRefFromOCDB()
185{
186 //Get the reference histogram from OCDB
187 TString sName1("hHighEmcalRawMaxMinusMin") ;
188 TString sName2("hLowLEDMonEmcalRawMaxMinusMin") ;
189 sName1.Prepend(Form("%s_", AliRecoParam::GetEventSpecieName(AliRecoParam::kCalib))) ;
190 sName2.Prepend(Form("%s_", AliRecoParam::GetEventSpecieName(AliRecoParam::kCalib))) ;
191
192 TString refStorage(AliQAv1::GetQARefStorage()) ;
193 if (!refStorage.Contains(AliQAv1::GetLabLocalOCDB()) && !refStorage.Contains(AliQAv1::GetLabAliEnOCDB())) {
194 AliFatal(Form("%s is not a valid location for reference data", refStorage.Data())) ;
195 } else {
196 AliQAManager* manQA = AliQAManager::QAManager(AliQAv1::kRAWS) ;
197 AliQAv1::SetQARefDataDirName(AliRecoParam::kCalib) ;
198 if ( ! manQA->GetLock() ) {
199 manQA->SetDefaultStorage(AliQAv1::GetQARefStorage()) ;
200 manQA->SetSpecificStorage("*", AliQAv1::GetQARefStorage()) ;
201 manQA->SetRun(AliCDBManager::Instance()->GetRun()) ;
202 manQA->SetLock() ;
203 }
204 char * detOCDBDir = Form("%s/%s/%s", GetName(), AliQAv1::GetRefOCDBDirName(), AliQAv1::GetRefDataDirName()) ;
205 AliCDBEntry * entry = manQA->Get(detOCDBDir, manQA->GetRun()) ;
206 if (entry) {
207 TList * listDetQAD =static_cast<TList *>(entry->GetObject()) ;
208 if ( strcmp(listDetQAD->ClassName(), "TList") != 0 ) {
209 AliError(Form("Expected a Tlist and found a %s for detector %s", listDetQAD->ClassName(), GetName())) ;
210 listDetQAD = NULL ;
211 }
212 TObjArray * dirOCDB= NULL ;
213 if ( listDetQAD )
214 dirOCDB = static_cast<TObjArray *>(listDetQAD->FindObject(Form("%s/%s", AliQAv1::GetTaskName(AliQAv1::kRAWS).Data(), AliRecoParam::GetEventSpecieName(AliRecoParam::kCalib)))) ;
215 if (dirOCDB){
216 fCalibRefHistoPro = dynamic_cast<TProfile *>(dirOCDB->FindObject(sName1.Data())) ;
217 fLEDMonRefHistoPro = dynamic_cast<TProfile *>(dirOCDB->FindObject(sName2.Data())) ;
218 }
219 }
220 }
221
222 if(fCalibRefHistoPro && fLEDMonRefHistoPro){
223
224 //Defining histograms binning, each 2D histogram covers all SMs
225 Int_t nSMSectors = fSuperModules / 2; // 2 SMs per sector
226 Int_t nbinsZ = 2*AliEMCALGeoParams::fgkEMCALCols;
227 Int_t nbinsPhi = nSMSectors * AliEMCALGeoParams::fgkEMCALRows;
228
229 if(!fCalibRefHistoH2F)
230 fCalibRefHistoH2F = new TH2F("hCalibRefHisto", "hCalibRefHisto", nbinsZ, -0.5, nbinsZ - 0.5, nbinsPhi, -0.5, nbinsPhi -0.5);
231 ConvertProfile2H(fCalibRefHistoPro,fCalibRefHistoH2F) ;
232 } else {
233 AliFatal(Form("No reference object with name %s or %s found", sName1.Data(), sName2.Data())) ;
234 }
235}
9e47432c 236//____________________________________________________________________________
237void AliEMCALQADataMakerRec::InitESDs()
238{
239 //Create histograms to controll ESD
240 const Bool_t expert = kTRUE ;
241 const Bool_t image = kTRUE ;
242
243 TH1F * h1 = new TH1F("hESDCaloClusterE", "ESDs CaloCluster energy in EMCAL;Energy [GeV];Counts", 200, 0., 100.) ;
244 h1->Sumw2() ;
245 Add2ESDsList(h1, kESDCaloClusE, !expert, image) ;
246
247 TH1I * h2 = new TH1I("hESDCaloClusterM", "ESDs CaloCluster multiplicity in EMCAL;# of Clusters;Entries", 100, 0, 100) ;
248 h2->Sumw2() ;
249 Add2ESDsList(h2, kESDCaloClusM, !expert, image) ;
250
251 TH1F * h3 = new TH1F("hESDCaloCellA", "ESDs CaloCell amplitude in EMCAL;Energy [GeV];Counts", 500, 0., 50.) ;
252 h3->Sumw2() ;
253 Add2ESDsList(h3, kESDCaloCellA, !expert, image) ;
254
255 TH1I * h4 = new TH1I("hESDCaloCellM", "ESDs CaloCell multiplicity in EMCAL;# of Clusters;Entries", 200, 0, 1000) ;
256 h4->Sumw2() ;
257 Add2ESDsList(h4, kESDCaloCellM, !expert, image) ;
258
259}
260
261//____________________________________________________________________________
262void AliEMCALQADataMakerRec::InitDigits()
263{
264 // create Digits histograms in Digits subdir
265 const Bool_t expert = kTRUE ;
266 const Bool_t image = kTRUE ;
267
268 TH1I * h0 = new TH1I("hEmcalDigits", "Digits amplitude distribution in EMCAL;Amplitude [ADC counts];Counts", 500, 0, 500) ;
269 h0->Sumw2() ;
270 Add2DigitsList(h0, 0, !expert, image) ;
271 TH1I * h1 = new TH1I("hEmcalDigitsMul", "Digits multiplicity distribution in EMCAL;# of Digits;Entries", 200, 0, 2000) ;
272 h1->Sumw2() ;
273 Add2DigitsList(h1, 1, !expert, image) ;
274}
275
276//____________________________________________________________________________
277void AliEMCALQADataMakerRec::InitRecPoints()
278{
38986b78 279 // create Reconstructed PoInt_ts histograms in RecPoints subdir
9e47432c 280 const Bool_t expert = kTRUE ;
281 const Bool_t image = kTRUE ;
282
283 TH1F* h0 = new TH1F("hEMCALRpE","EMCAL RecPoint energies;Energy [GeV];Counts",200, 0.,20.); //GeV
284 h0->Sumw2();
285 Add2RecPointsList(h0,kRecPE, !expert, image);
286
287 TH1I* h1 = new TH1I("hEMCALRpM","EMCAL RecPoint multiplicities;# of Clusters;Entries",100,0,100);
288 h1->Sumw2();
289 Add2RecPointsList(h1,kRecPM, !expert, image);
290
291 TH1I* h2 = new TH1I("hEMCALRpDigM","EMCAL RecPoint Digit Multiplicities;# of Digits;Entries",20,0,20);
292 h2->Sumw2();
293 Add2RecPointsList(h2,kRecPDigM, !expert, image);
294
295}
296
297//____________________________________________________________________________
298void AliEMCALQADataMakerRec::InitRaws()
299{
300 // create Raws histograms in Raws subdir
301 const Bool_t expert = kTRUE ;
302 const Bool_t saveCorr = kTRUE ;
303 const Bool_t image = kTRUE ;
304
38986b78 305 Int_t nTowersPerSM = AliEMCALGeoParams::fgkEMCALRows * AliEMCALGeoParams::fgkEMCALCols; // number of towers in a SuperModule; 24x48
306 Int_t nTot = fSuperModules * nTowersPerSM; // max number of towers in all SuperModules
307
308
309 //Defining histograms binning, each 2D histogram covers all SMs
310 Int_t nSMSectors = fSuperModules / 2; // 2 SMs per sector
311 Int_t nbinsZ = 2*AliEMCALGeoParams::fgkEMCALCols;
312 Int_t nbinsPhi = nSMSectors * AliEMCALGeoParams::fgkEMCALRows;
313
314 // counter info: number of channels per event (bins are SM index)
9e47432c 315 TProfile * h0 = new TProfile("hLowEmcalSupermodules", "Low Gain EMC: # of towers vs SuperMod;SM Id;# of towers",
316 fSuperModules, -0.5, fSuperModules-0.5) ;
00957c37 317 Add2RawsList(h0, kNsmodLG, expert, !image, !saveCorr) ;
9e47432c 318 TProfile * h1 = new TProfile("hHighEmcalSupermodules", "High Gain EMC: # of towers vs SuperMod;SM Id;# of towers",
319 fSuperModules, -0.5, fSuperModules-0.5) ;
00957c37 320 Add2RawsList(h1, kNsmodHG, expert, !image, !saveCorr) ;
9e47432c 321
322 // where did max sample occur? (bins are towers)
323 TProfile * h2 = new TProfile("hLowEmcalRawtime", "Low Gain EMC: Time at Max vs towerId;Tower Id;Time [ticks]",
324 nTot, -0.5, nTot-0.5) ;
00957c37 325 Add2RawsList(h2, kTimeLG, expert, !image, !saveCorr) ;
9e47432c 326 TProfile * h3 = new TProfile("hHighEmcalRawtime", "High Gain EMC: Time at Max vs towerId;Tower Id;Time [ticks]",
327 nTot, -0.5, nTot-0.5) ;
00957c37 328 Add2RawsList(h3, kTimeHG, expert, !image, !saveCorr) ;
9e47432c 329
330 // how much above pedestal was the max sample? (bins are towers)
331 TProfile * h4 = new TProfile("hLowEmcalRawMaxMinusMin", "Low Gain EMC: Max - Min vs towerId;Tower Id;Max-Min [ADC counts]",
332 nTot, -0.5, nTot-0.5) ;
333 Add2RawsList(h4, kSigLG, expert, image, !saveCorr) ;
334 TProfile * h5 = new TProfile("hHighEmcalRawMaxMinusMin", "High Gain EMC: Max - Min vs towerId;Tower Id;Max-Min [ADC counts]",
335 nTot, -0.5, nTot-0.5) ;
336 Add2RawsList(h5, kSigHG, expert, image, !saveCorr) ;
337
338 // total counter: channels per event
339 TH1I * h6 = new TH1I("hLowNtot", "Low Gain EMC: Total Number of found towers;# of Towers;Counts", 200, 0, nTot) ;
340 h6->Sumw2() ;
00957c37 341 Add2RawsList(h6, kNtotLG, expert, !image, !saveCorr) ;
9e47432c 342 TH1I * h7 = new TH1I("hHighNtot", "High Gain EMC: Total Number of found towers;# of Towers;Counts", 200,0, nTot) ;
343 h7->Sumw2() ;
00957c37 344 Add2RawsList(h7, kNtotHG, expert, !image, !saveCorr) ;
9e47432c 345
346 // pedestal (bins are towers)
347 TProfile * h8 = new TProfile("hLowEmcalRawPed", "Low Gain EMC: Pedestal vs towerId;Tower Id;Pedestal [ADC counts]",
348 nTot, -0.5, nTot-0.5) ;
00957c37 349 Add2RawsList(h8, kPedLG, expert, !image, !saveCorr) ;
9e47432c 350 TProfile * h9 = new TProfile("hHighEmcalRawPed", "High Gain EMC: Pedestal vs towerId;Tower Id;Pedestal [ADC counts]",
351 nTot, -0.5, nTot-0.5) ;
00957c37 352 Add2RawsList(h9, kPedHG, expert, !image, !saveCorr) ;
9e47432c 353
38986b78 354 //temp 2D amplitude histogram for the current run
355 fHighEmcHistoH2F = new TH2F("h2DHighEC2", "High Gain EMC:Max - Min [ADC counts]", nbinsZ, -0.5 , nbinsZ-0.5, nbinsPhi, -0.5, nbinsPhi-0.5);
f05c8877 356 fHighEmcHistoH2F->SetDirectory(0) ; // this histo must be memory resident
38986b78 357 //add ratio histograms: to comapre the current run with the reference data
358 TH2F * h15 = new TH2F("h2DRatioAmp", "High Gain Ratio to Reference:Amplitude_{current run}/Amplitude_{reference run}", nbinsZ, -0.5 , nbinsZ-0.5,
359 nbinsPhi, -0.5, nbinsPhi-0.5);
360 //settings for display in amore
361 h15->SetTitle("Amplitude_{current run}/Amplitude_{reference run}");
00957c37 362 h15->SetMaximum(2.0);
363 h15->SetMinimum(0.1);
364 h15->SetOption("COLZ");
365 gStyle->SetOptStat(0);
366 Int_t color[] = {4,3,2} ;
367 gStyle->SetPalette(3,color);
368 h15->GetZaxis()->SetNdivisions(3);
369 h15->UseCurrentStyle();
370 h15->SetDirectory(0);
38986b78 371 Add2RawsList(h15, k2DRatioAmp, !expert, image, !saveCorr) ;
372
373 TH1F * h16 = new TH1F("hRatioDist", "Amplitude_{current run}/Amplitude_{reference run} ratio distribution", nTot, 0., 2.);
00957c37 374 h16->SetMinimum(0.1);
375 h16->SetMaximum(100.);
376 gStyle->SetOptStat(0);
377 h16->UseCurrentStyle();
f05c8877 378 h16->SetDirectory(0);
38986b78 379 Add2RawsList(h16, kRatioDist, !expert, image, !saveCorr) ;
380
9e47432c 381 // now repeat the same for TRU and LEDMon data
38986b78 382 Int_t nTot2x2 = fSuperModules * AliEMCALGeoParams::fgkEMCALTRUsPerSM * AliEMCALGeoParams::fgkEMCAL2x2PerTRU; // max number of TRU channels for all SuperModules
9e47432c 383
384 // counter info: number of channels per event (bins are SM index)
385 TProfile * hT0 = new TProfile("hTRUEmcalSupermodules", "TRU EMC: # of TRU channels vs SuperMod;SM Id;# of TRU channels",
386 fSuperModules, -0.5, fSuperModules-0.5) ;
00957c37 387 Add2RawsList(hT0, kNsmodTRU, expert, !image, !saveCorr) ;
9e47432c 388
389 // where did max sample occur? (bins are TRU channels)
390 TProfile * hT1 = new TProfile("hTRUEmcalRawtime", "TRU EMC: Time at Max vs 2x2Id;2x2 Id;Time [ticks]",
391 nTot2x2, -0.5, nTot2x2-0.5) ;
00957c37 392 Add2RawsList(hT1, kTimeTRU, expert, !image, !saveCorr) ;
9e47432c 393
394 // how much above pedestal was the max sample? (bins are TRU channels)
395 TProfile * hT2 = new TProfile("hTRUEmcalRawMaxMinusMin", "TRU EMC: Max - Min vs 2x2Id;2x2 Id;Max-Min [ADC counts]",
396 nTot2x2, -0.5, nTot2x2-0.5) ;
00957c37 397 Add2RawsList(hT2, kSigTRU, expert, !image, !saveCorr) ;
9e47432c 398
399 // total counter: channels per event
400 TH1I * hT3 = new TH1I("hTRUNtot", "TRU EMC: Total Number of found TRU channels;# of TRU Channels;Counts", 200, 0, nTot2x2) ;
401 hT3->Sumw2() ;
00957c37 402 Add2RawsList(hT3, kNtotTRU, expert, !image, !saveCorr) ;
9e47432c 403
404 // pedestal (bins are TRU channels)
405 TProfile * hT4 = new TProfile("hTRUEmcalRawPed", "TRU EMC: Pedestal vs 2x2Id;2x2 Id;Pedestal [ADC counts]",
406 nTot2x2, -0.5, nTot2x2-0.5) ;
00957c37 407 Add2RawsList(hT4, kPedTRU, expert, !image, !saveCorr) ;
9e47432c 408
5c6517c3 409 // L0 trigger hits: # of hits (bins are TRU channels)
410 TH1I * hT5 = new TH1I("hTRUEmcalL0hits", "L0 trigger hits: Total number of 2x2 L0 generated", nTot2x2, -0.5, nTot2x2);
411 hT5->Sumw2();
00957c37 412 Add2RawsList(hT5, kNL0TRU, expert, !image, !saveCorr);
5c6517c3 413
414 // L0 trigger hits: average time (bins are TRU channels)
415 TProfile * hT6 = new TProfile("hTRUEmcalL0hitsAvgTime", "L0 trigger hits: average time bin", nTot2x2, -0.5, nTot2x2);
00957c37 416 Add2RawsList(hT6, kTimeL0TRU, expert, !image, !saveCorr);
5c6517c3 417
9e47432c 418 // and also LED Mon..
419 // LEDMon has both high and low gain channels, just as regular FEE/towers
38986b78 420 Int_t nTotLEDMon = fSuperModules * AliEMCALGeoParams::fgkEMCALLEDRefs; // max number of LEDMon channels for all SuperModules
9e47432c 421
422 // counter info: number of channels per event (bins are SM index)
423 TProfile * hL0 = new TProfile("hLowLEDMonEmcalSupermodules", "LowLEDMon Gain EMC: # of strips vs SuperMod;SM Id;# of strips",
424 fSuperModules, -0.5, fSuperModules-0.5) ;
00957c37 425 Add2RawsList(hL0, kNsmodLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 426 TProfile * hL1 = new TProfile("hHighLEDMonEmcalSupermodules", "HighLEDMon Gain EMC: # of strips vs SuperMod;SM Id;# of strips",
427 fSuperModules, -0.5, fSuperModules-0.5) ;
00957c37 428 Add2RawsList(hL1, kNsmodHGLEDMon, expert, !image, !saveCorr) ;
9e47432c 429
430 // where did max sample occur? (bins are strips)
431 TProfile * hL2 = new TProfile("hLowLEDMonEmcalRawtime", "LowLEDMon Gain EMC: Time at Max vs stripId;Strip Id;Time [ticks]",
432 nTotLEDMon, -0.5, nTotLEDMon-0.5) ;
00957c37 433 Add2RawsList(hL2, kTimeLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 434 TProfile * hL3 = new TProfile("hHighLEDMonEmcalRawtime", "HighLEDMon Gain EMC: Time at Max vs stripId;Strip Id;Time [ticks]",
435 nTotLEDMon, -0.5, nTotLEDMon-0.5) ;
00957c37 436 Add2RawsList(hL3, kTimeHGLEDMon, expert, !image, !saveCorr) ;
9e47432c 437
438 // how much above pedestal was the max sample? (bins are strips)
439 TProfile * hL4 = new TProfile("hLowLEDMonEmcalRawMaxMinusMin", "LowLEDMon Gain EMC: Max - Min vs stripId;Strip Id;Max-Min [ADC counts]",
440 nTotLEDMon, -0.5, nTotLEDMon-0.5) ;
00957c37 441 Add2RawsList(hL4, kSigLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 442 TProfile * hL5 = new TProfile("hHighLEDMonEmcalRawMaxMinusMin", "HighLEDMon Gain EMC: Max - Min vs stripId;Strip Id;Max-Min [ADC counts]",
443 nTotLEDMon, -0.5, nTotLEDMon-0.5) ;
00957c37 444 Add2RawsList(hL5, kSigHGLEDMon, expert, !image, !saveCorr) ;
38986b78 445
446 // total counter: channels per event
9e47432c 447 TH1I * hL6 = new TH1I("hLowLEDMonNtot", "LowLEDMon Gain EMC: Total Number of found strips;# of Strips;Counts", 200, 0, nTotLEDMon) ;
448 hL6->Sumw2() ;
00957c37 449 Add2RawsList(hL6, kNtotLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 450 TH1I * hL7 = new TH1I("hHighLEDMonNtot", "HighLEDMon Gain EMC: Total Number of found strips;# of Strips;Counts", 200,0, nTotLEDMon) ;
451 hL7->Sumw2() ;
00957c37 452 Add2RawsList(hL7, kNtotHGLEDMon, expert, !image, !saveCorr) ;
9e47432c 453
454 // pedestal (bins are strips)
455 TProfile * hL8 = new TProfile("hLowLEDMonEmcalRawPed", "LowLEDMon Gain EMC: Pedestal vs stripId;Strip Id;Pedestal [ADC counts]",
456 nTotLEDMon, -0.5, nTotLEDMon-0.5) ;
00957c37 457 Add2RawsList(hL8, kPedLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 458 TProfile * hL9 = new TProfile("hHighLEDMonEmcalRawPed", "HighLEDMon Gain EMC: Pedestal vs stripId;Strip Id;Pedestal [ADC counts]",
459 nTotLEDMon, -0.5, nTotLEDMon-0.5) ;
00957c37 460 Add2RawsList(hL9, kPedHGLEDMon, expert, !image, !saveCorr) ;
38986b78 461
462 //add two histograms for shifter from the LED monitor system: comapre LED monitor with the reference run
463 //to be used for decision whether we need to change reference data
464 TH1F * hL10 = new TH1F("hMaxMinusMinLEDMonRatio", "LEDMon amplitude, Ratio to reference run", nTotLEDMon, -0.5, nTotLEDMon-0.5) ;
38986b78 465 //settings for display in amore
466 hL10->SetTitle("Amplitude_{LEDMon current}/Amplitude_{LEDMon reference}");
00957c37 467 hL10->SetMaximum(2.0);
468 hL10->SetMinimum(0.1);
469 gStyle->SetOptStat(0);
470 hL10->UseCurrentStyle();
471 hL10->SetDirectory(0);
38986b78 472// hL10->SetOption("E");
00957c37 473 Add2RawsList(hL10, kLEDMonRatio, !expert, image, !saveCorr) ;
474
38986b78 475 TH1F * hL11 = new TH1F("hMaxMinusMinLEDMonRatioDist", "LEDMon amplitude, Ratio distribution", nTot, 0, 2);
00957c37 476 hL11->SetMinimum(0.1) ;
477 hL11->SetMaximum(100.);
478 gStyle->SetOptStat(0);
479 hL11->UseCurrentStyle();
480 hL11->SetDirectory(0);
38986b78 481 Add2RawsList(hL11, kLEDMonRatioDist, !expert, image, !saveCorr) ;
482
483 GetCalibRefFromOCDB() ;
9e47432c 484}
485
486//____________________________________________________________________________
487void AliEMCALQADataMakerRec::MakeESDs(AliESDEvent * esd)
488{
489 // make QA data from ESDs
490
491 Int_t nTot = 0 ;
492 for ( Int_t index = 0; index < esd->GetNumberOfCaloClusters() ; index++ ) {
493 AliESDCaloCluster * clu = esd->GetCaloCluster(index) ;
494 if( clu->IsEMCAL() ) {
495 GetESDsData(kESDCaloClusE)->Fill(clu->E()) ;
496 nTot++ ;
497 }
498 }
499 GetESDsData(kESDCaloClusM)->Fill(nTot) ;
500
501 //fill calo cells
502 AliESDCaloCells* cells = esd->GetEMCALCells();
503 GetESDsData(kESDCaloCellM)->Fill(cells->GetNumberOfCells()) ;
504
505 for ( Int_t index = 0; index < cells->GetNumberOfCells() ; index++ ) {
506 GetESDsData(kESDCaloCellA)->Fill(cells->GetAmplitude(index)) ;
507 }
508
509}
510
511//____________________________________________________________________________
512void AliEMCALQADataMakerRec::MakeRaws(AliRawReader* rawReader)
513{
514 //Fill prepared histograms with Raw digit properties
00957c37 515 GetRawsData(kSigHG)->Reset("ICE");
516 GetRawsData(kSigHG)->ResetStats();
517 GetRawsData(kSigLGLEDMon)->Reset("ICE");
518 GetRawsData(kSigLGLEDMon)->ResetStats();
519
e03bcdd4 520 // make sure EMCal was readout during the event
521 Int_t emcID = AliDAQ::DetectorID("EMCAL"); // bit 18..
7b2c20bb 522 const UInt_t *detPattern = rawReader->GetDetectorPattern();
e03bcdd4 523 UInt_t emcInReadout = ( ((1 << emcID) & detPattern[0]) >> emcID);
38986b78 524 if (! emcInReadout) return; // no poInt_t in looking at this event, if no EMCal data
e03bcdd4 525
def665cb 526 // setup
9e47432c 527 rawReader->Reset() ;
528 AliCaloRawStreamV3 in(rawReader,"EMCAL");
30aa89b0 529 rawReader->Select("EMCAL", 0, AliEMCALGeoParams::fgkLastAltroDDL) ; //select EMCAL DDL's
9e47432c 530
5c6517c3 531 AliRecoParam::EventSpecie_t saveSpecie = fEventSpecie ;
532
def665cb 533 if (rawReader->GetType() == AliRawEventHeaderBase::kCalibrationEvent) {
534 SetEventSpecie(AliRecoParam::kCalib) ;
535 }
38986b78 536
38986b78 537 const Int_t nTowersPerSM = AliEMCALGeoParams::fgkEMCALRows * AliEMCALGeoParams::fgkEMCALCols; // number of towers in a SuperModule; 24x48
538 const Int_t nRows = AliEMCALGeoParams::fgkEMCALRows; // number of rows per SuperModule
539 const Int_t nStripsPerSM = AliEMCALGeoParams::fgkEMCALLEDRefs; // number of strips per SuperModule
540 const Int_t n2x2PerSM = AliEMCALGeoParams::fgkEMCALTRUsPerSM * AliEMCALGeoParams::fgkEMCAL2x2PerTRU; // number of TRU 2x2's per SuperModule
541 const Int_t n2x2PerTRU = AliEMCALGeoParams::fgkEMCAL2x2PerTRU;
9e47432c 542
9e47432c 543 // SM counters; decl. should be safe, assuming we don't get more than expected SuperModules..
38986b78 544 Int_t nTotalSMLG[AliEMCALGeoParams::fgkEMCALModules] = {0};
545 Int_t nTotalSMHG[AliEMCALGeoParams::fgkEMCALModules] = {0};
546 Int_t nTotalSMTRU[AliEMCALGeoParams::fgkEMCALModules] = {0};
547 Int_t nTotalSMLGLEDMon[AliEMCALGeoParams::fgkEMCALModules] = {0};
548 Int_t nTotalSMHGLEDMon[AliEMCALGeoParams::fgkEMCALModules] = {0};
549
550 const Int_t nTRUL0ChannelBits = 10; // used for L0 trigger bits checks
551 Int_t iSM = 0; // SuperModule index
def665cb 552 // start loop over input stream
def665cb 553 while (in.NextDDL()) {
38986b78 554 Int_t iRCU = in.GetDDLNumber() % 2; // RCU0 or RCU1, within SuperModule
dc16c015 555 fRawAnalyzer->SetIsZeroSuppressed( in.GetZeroSupp() );
9e47432c 556
98d6fe2e 557 while (in.NextChannel()) {
558 iSM = in.GetModule(); // SuperModule
38986b78 559 //prInt_tf("iSM %d DDL %d", iSM, in.GetDDLNumber());
98d6fe2e 560 if (iSM>=0 && iSM<fSuperModules) { // valid module reading
9e47432c 561
38986b78 562 Int_t nsamples = 0;
def665cb 563 vector<AliCaloBunchInfo> bunchlist;
564 while (in.NextBunch()) {
565 nsamples += in.GetBunchLength();
566 bunchlist.push_back( AliCaloBunchInfo(in.GetStartTimeBin(), in.GetBunchLength(), in.GetSignals() ) );
567 }
568
569 if (nsamples > 0) { // this check is needed for when we have zero-supp. on, but not sparse readout
38986b78 570 Float_t time = 0.;
571 Float_t amp = 0.;
def665cb 572 // indices for pedestal calc.
38986b78 573 Int_t firstPedSample = 0;
574 Int_t lastPedSample = 0;
575 bool isTRUL0IdData = false;
def665cb 576
577 if (! in.IsTRUData() ) { // high gain, low gain, LED Mon data - all have the same shaper/sampling
578 AliCaloFitResults fitResults = fRawAnalyzer->Evaluate( bunchlist, in.GetAltroCFG1(), in.GetAltroCFG2());
38986b78 579 amp = fitResults.GetAmp();
def665cb 580 time = fitResults.GetTof();
581 firstPedSample = fFirstPedestalSample;
38986b78 582 lastPedSample = fLastPedestalSample;
9e47432c 583 }
def665cb 584 else { // TRU data is special, needs its own analyzer
585 AliCaloFitResults fitResults = fRawAnalyzerTRU->Evaluate( bunchlist, in.GetAltroCFG1(), in.GetAltroCFG2());
38986b78 586 amp = fitResults.GetAmp();
def665cb 587 time = fitResults.GetTof();
588 firstPedSample = fFirstPedestalSampleTRU;
38986b78 589 lastPedSample = fLastPedestalSampleTRU;
5c6517c3 590 if (in.GetColumn() > n2x2PerTRU) {
591 isTRUL0IdData = true;
592 }
def665cb 593 }
594
595 // pedestal samples
38986b78 596 Int_t nPed = 0;
597 vector<Int_t> pedSamples;
9e47432c 598
def665cb 599 // select earliest bunch
600 unsigned int bunchIndex = 0;
601 unsigned int startBin = bunchlist.at(0).GetStartBin();
602 if (bunchlist.size() > 0) {
603 for(unsigned int ui=1; ui < bunchlist.size(); ui++ ) {
604 if (startBin > bunchlist.at(ui).GetStartBin() ) {
605 startBin = bunchlist.at(ui).GetStartBin();
606 bunchIndex = ui;
607 }
9e47432c 608 }
609 }
def665cb 610
611 // check bunch for entries in the pedestal sample range
38986b78 612 Int_t bunchLength = bunchlist.at(bunchIndex).GetLength();
def665cb 613 const UShort_t *sig = bunchlist.at(bunchIndex).GetData();
38986b78 614 Int_t timebin = 0;
5c6517c3 615
616 if (! isTRUL0IdData) { // regular data, can look at pedestals
38986b78 617 for (Int_t i = 0; i<bunchLength; i++) {
5c6517c3 618 timebin = startBin--;
619 if ( firstPedSample<=timebin && timebin<=lastPedSample ) {
620 pedSamples.push_back( sig[i] );
621 nPed++;
622 }
623 } // i
5c6517c3 624 }
625 else { // TRU L0 Id Data
626 // which TRU the channel belongs to?
38986b78 627 Int_t iTRUId = in.GetModule()*3 + (iRCU*in.GetBranch() + iRCU);
5c6517c3 628
38986b78 629 for (Int_t i = 0; i< bunchLength; i++) {
630 for( Int_t j = 0; j < nTRUL0ChannelBits; j++ ){
5c6517c3 631 // check if the bit j is 1
632 if( (sig[i] & ( 1 << j )) > 0 ){
38986b78 633 Int_t iTRUIdInSM = (in.GetColumn() - n2x2PerTRU)*nTRUL0ChannelBits+j;
ce95bae9 634 if(iTRUIdInSM < n2x2PerTRU) {
38986b78 635 Int_t iTRUAbsId = iTRUIdInSM + n2x2PerTRU * iTRUId;
5c6517c3 636 // Fill the histograms
ce95bae9 637 GetRawsData(kNL0TRU)->Fill(iTRUAbsId);
638 GetRawsData(kTimeL0TRU)->Fill(iTRUAbsId, startBin);
5c6517c3 639 }
640 }
641 }
642 startBin--;
643 } // i
644 } // TRU L0 Id data
def665cb 645
646 // fill histograms
647 if ( in.IsLowGain() || in.IsHighGain() ) { // regular towers
38986b78 648 Int_t towerId = iSM*nTowersPerSM + in.GetColumn()*nRows + in.GetRow();
def665cb 649 if ( in.IsLowGain() ) {
650 nTotalSMLG[iSM]++;
def665cb 651 if ( (amp > fMinSignalLG) && (amp < fMaxSignalLG) ) {
652 GetRawsData(kSigLG)->Fill(towerId, amp);
653 GetRawsData(kTimeLG)->Fill(towerId, time);
654 }
655 if (nPed > 0) {
38986b78 656 for (Int_t i=0; i<nPed; i++) {
def665cb 657 GetRawsData(kPedLG)->Fill(towerId, pedSamples[i]);
658 }
659 }
660 } // gain==0
661 else if ( in.IsHighGain() ) {
662 nTotalSMHG[iSM]++;
def665cb 663 if ( (amp > fMinSignalHG) && (amp < fMaxSignalHG) ) {
664 GetRawsData(kSigHG)->Fill(towerId, amp);
665 GetRawsData(kTimeHG)->Fill(towerId, time);
666 }
667 if (nPed > 0) {
38986b78 668 for (Int_t i=0; i<nPed; i++) {
def665cb 669 GetRawsData(kPedHG)->Fill(towerId, pedSamples[i]);
670 }
671 }
672 } // gain==1
673 } // low or high gain
38986b78 674 // TRU
def665cb 675 else if ( in.IsTRUData() && in.GetColumn()<AliEMCALGeoParams::fgkEMCAL2x2PerTRU) {
38986b78 676 // for TRU data, the mapping class holds the TRU Int_ternal 2x2 number (0..95) in the Column var..
677 Int_t iTRU = (iRCU*in.GetBranch() + iRCU); //TRU0 is from RCU0, TRU1 from RCU1, TRU2 is from branch B on RCU1
678 Int_t iTRU2x2Id = iSM*n2x2PerSM + iTRU*AliEMCALGeoParams::fgkEMCAL2x2PerTRU
def665cb 679 + in.GetColumn();
def665cb 680 nTotalSMTRU[iSM]++;
681 if ( (amp > fMinSignalTRU) && (amp < fMaxSignalTRU) ) {
682 GetRawsData(kSigTRU)->Fill(iTRU2x2Id, amp);
683 GetRawsData(kTimeTRU)->Fill(iTRU2x2Id, time);
9e47432c 684 }
def665cb 685 if (nPed > 0) {
38986b78 686 for (Int_t i=0; i<nPed; i++) {
def665cb 687 GetRawsData(kPedTRU)->Fill(iTRU2x2Id, pedSamples[i]);
688 }
9e47432c 689 }
def665cb 690 }
691 // LED Mon
692 else if ( in.IsLEDMonData() ) {
693 // for LED Mon data, the mapping class holds the gain info in the Row variable
694 // and the Strip number in the Column..
38986b78 695 Int_t gain = in.GetRow();
696 Int_t stripId = iSM*nStripsPerSM + in.GetColumn();
def665cb 697
698 if ( gain == 0 ) {
699 nTotalSMLGLEDMon[iSM]++;
700 if ( (amp > fMinSignalLGLEDMon) && (amp < fMaxSignalLGLEDMon) ) {
701 GetRawsData(kSigLGLEDMon)->Fill(stripId, amp);
702 GetRawsData(kTimeLGLEDMon)->Fill(stripId, time);
703 }
704 if (nPed > 0) {
38986b78 705 for (Int_t i=0; i<nPed; i++) {
def665cb 706 GetRawsData(kPedLGLEDMon)->Fill(stripId, pedSamples[i]);
707 }
708 }
709 } // gain==0
710 else if ( gain == 1 ) {
711 nTotalSMHGLEDMon[iSM]++;
712 if ( (amp > fMinSignalHGLEDMon) && (amp < fMaxSignalHGLEDMon) ) {
713 GetRawsData(kSigHGLEDMon)->Fill(stripId, amp);
714 GetRawsData(kTimeHGLEDMon)->Fill(stripId, time);
715 }
716 if (nPed > 0) {
38986b78 717 for (Int_t i=0; i<nPed; i++) {
def665cb 718 GetRawsData(kPedHGLEDMon)->Fill(stripId, pedSamples[i]);
719 }
720 }
721 } // low or high gain
722 } // LEDMon
723
724 } // SM index OK
9e47432c 725
726 } // nsamples>0 check, some data found for this channel; not only trailer/header
727 }// end while over channel
728
729 }//end while over DDL's, of input stream
730
38986b78 731 // TProfile * p = dynamic_cast<TProfile *>(GetRawsData(kSigHG)) ;
732 ConvertProfile2H(dynamic_cast<TProfile *>(GetRawsData(kSigHG)), fHighEmcHistoH2F) ;
733 Double_t binContent = 0. ;
00957c37 734
735 //reset histograms
736 GetRawsData(k2DRatioAmp)->Reset("ICE");
737 GetRawsData(kRatioDist)->Reset("ICE");
738 GetRawsData(kLEDMonRatio)->Reset("ICE");
739 GetRawsData(kLEDMonRatioDist)->Reset("ICE");
740 GetRawsData(k2DRatioAmp)->ResetStats();
741 GetRawsData(kRatioDist)->ResetStats();
742 GetRawsData(kLEDMonRatio)->ResetStats();
743 GetRawsData(kLEDMonRatioDist)->ResetStats();
744
38986b78 745 //calculate the ratio of the amplitude and fill the histograms, only if the events type is Calib
746 if (rawReader->GetType() == AliRawEventHeaderBase::kCalibrationEvent) {
00957c37 747 for(Int_t ix = 1; ix <= fHighEmcHistoH2F->GetNbinsX(); ix++) {
748 for(Int_t iy = 1; iy <= fHighEmcHistoH2F->GetNbinsY(); iy++) {
749 if(fCalibRefHistoH2F->GetBinContent(ix, iy))binContent = fHighEmcHistoH2F->GetBinContent(ix, iy)/fCalibRefHistoH2F->GetBinContent(ix, iy) ;
750 GetRawsData(k2DRatioAmp)->SetBinContent(ix, iy, binContent);
751 GetRawsData(kRatioDist)->Fill(GetRawsData(k2DRatioAmp)->GetBinContent(ix, iy));
752 }
753 }
754
38986b78 755 }
756 //Now for LED monitor system, to calculate the ratio as well
f05c8877 757 Double_t binError = 0. ;
38986b78 758
759 for(int ib = 1; ib <= fLEDMonRefHistoPro->GetNbinsX(); ib++) {
760
761 if(fLEDMonRefHistoPro->GetBinContent(ib) != 0) binContent = GetRawsData(kSigLGLEDMon)->GetBinContent(ib) / fLEDMonRefHistoPro->GetBinContent(ib);
762 else binContent = 0;
763 GetRawsData(kLEDMonRatio)->SetBinContent(ib, binContent);
764
765 binError = GetRawsData(kSigLGLEDMon)->GetBinError(ib)/fLEDMonRefHistoPro->GetBinContent(ib) +
766 GetRawsData(kSigLGLEDMon)->GetBinContent(ib)/TMath::Power(fLEDMonRefHistoPro->GetBinContent(ib), 2)*fLEDMonRefHistoPro->GetBinError(ib);
767 GetRawsData(kLEDMonRatio)->SetBinError(ib, binError);
768 GetRawsData(kLEDMonRatioDist)->Fill(GetRawsData(kLEDMonRatio)->GetBinContent(ib));
769 }
00957c37 770
38986b78 771
772
773
9e47432c 774 // let's also fill the SM and event counter histograms
38986b78 775 Int_t nTotalHG = 0;
776 Int_t nTotalLG = 0;
777 Int_t nTotalTRU = 0;
778 Int_t nTotalHGLEDMon = 0;
779 Int_t nTotalLGLEDMon = 0;
1a78a765 780 for (iSM=0; iSM<fSuperModules; iSM++) {
9e47432c 781 nTotalLG += nTotalSMLG[iSM];
782 nTotalHG += nTotalSMHG[iSM];
783 nTotalTRU += nTotalSMTRU[iSM];
98d6fe2e 784 nTotalLGLEDMon += nTotalSMLGLEDMon[iSM];
785 nTotalHGLEDMon += nTotalSMHGLEDMon[iSM];
9e47432c 786 GetRawsData(kNsmodLG)->Fill(iSM, nTotalSMLG[iSM]);
787 GetRawsData(kNsmodHG)->Fill(iSM, nTotalSMHG[iSM]);
788 GetRawsData(kNsmodTRU)->Fill(iSM, nTotalSMTRU[iSM]);
789 GetRawsData(kNsmodLGLEDMon)->Fill(iSM, nTotalSMLGLEDMon[iSM]);
790 GetRawsData(kNsmodHGLEDMon)->Fill(iSM, nTotalSMHGLEDMon[iSM]);
791 }
def665cb 792
9e47432c 793 GetRawsData(kNtotLG)->Fill(nTotalLG);
794 GetRawsData(kNtotHG)->Fill(nTotalHG);
795 GetRawsData(kNtotTRU)->Fill(nTotalTRU);
796 GetRawsData(kNtotLGLEDMon)->Fill(nTotalLGLEDMon);
797 GetRawsData(kNtotHGLEDMon)->Fill(nTotalHGLEDMon);
5c6517c3 798
799
def665cb 800 SetEventSpecie(saveSpecie) ;
9e47432c 801 // just in case the next rawreader consumer forgets to reset; let's do it here again..
802 rawReader->Reset() ;
803
804 return;
805}
806
807//____________________________________________________________________________
808void AliEMCALQADataMakerRec::MakeDigits()
809{
810 // makes data from Digits
811
812 GetDigitsData(1)->Fill(fDigitsArray->GetEntriesFast()) ;
813 TIter next(fDigitsArray) ;
814 AliEMCALDigit * digit ;
815 while ( (digit = dynamic_cast<AliEMCALDigit *>(next())) ) {
829ba234 816 GetDigitsData(0)->Fill( digit->GetAmplitude()) ;
9e47432c 817 }
818
819}
820
821//____________________________________________________________________________
822void AliEMCALQADataMakerRec::MakeDigits(TTree * digitTree)
823{
824 // makes data from Digit Tree
825 if (fDigitsArray)
826 fDigitsArray->Clear() ;
827 else
828 fDigitsArray = new TClonesArray("AliEMCALDigit", 1000) ;
829
830 TBranch * branch = digitTree->GetBranch("EMCAL") ;
831 if ( ! branch ) {
832 AliWarning("EMCAL branch in Digit Tree not found") ;
833 } else {
834 branch->SetAddress(&fDigitsArray) ;
835 branch->GetEntry(0) ;
836 MakeDigits() ;
837 }
838
839}
840
841//____________________________________________________________________________
842void AliEMCALQADataMakerRec::MakeRecPoints(TTree * clustersTree)
843{
844 // makes data from RecPoints
845 TBranch *emcbranch = clustersTree->GetBranch("EMCALECARP");
846 if (!emcbranch) {
847 AliError("can't get the branch with the EMCAL clusters !");
848 return;
849 }
850
38986b78 851 TObjArray * emcRecPoints = new TObjArray(100) ;
852 emcbranch->SetAddress(&emcRecPoints);
9e47432c 853 emcbranch->GetEntry(0);
854
38986b78 855 GetRecPointsData(kRecPM)->Fill(emcRecPoints->GetEntriesFast()) ;
856 TIter next(emcRecPoints) ;
9e47432c 857 AliEMCALRecPoint * rp ;
858 while ( (rp = dynamic_cast<AliEMCALRecPoint *>(next())) ) {
38986b78 859 GetRecPointsData(kRecPE)->Fill(rp->GetEnergy()) ;
9e47432c 860 GetRecPointsData(kRecPDigM)->Fill(rp->GetMultiplicity());
861 }
38986b78 862 emcRecPoints->Delete();
863 delete emcRecPoints;
9e47432c 864
865}
866
867//____________________________________________________________________________
868void AliEMCALQADataMakerRec::StartOfDetectorCycle()
869{
870 //Detector specific actions at start of cycle
871
872}
873
def665cb 874//____________________________________________________________________________
875void AliEMCALQADataMakerRec::SetFittingAlgorithm(Int_t fitAlgo)
876{
877 //Set fitting algorithm and initialize it if this same algorithm was not set before.
878 //printf("**** Set Algorithm , number %d ****\n",fitAlgo);
879
880 if(fitAlgo == fFittingAlgorithm && fRawAnalyzer) {
881 //Do nothing, this same algorithm already set before.
882 //printf("**** Algorithm already set before, number %d, %s ****\n",fitAlgo, fRawAnalyzer->GetName());
883 return;
884 }
885 //Initialize the requested algorithm
886 if(fitAlgo != fFittingAlgorithm || !fRawAnalyzer) {
887 //printf("**** Init Algorithm , number %d ****\n",fitAlgo);
888
889 fFittingAlgorithm = fitAlgo;
890 if (fRawAnalyzer) delete fRawAnalyzer; // delete prev. analyzer if existed.
891
892 if (fitAlgo == kFastFit) {
893 fRawAnalyzer = new AliCaloRawAnalyzerFastFit();
894 }
895 else if (fitAlgo == kNeuralNet) {
896 fRawAnalyzer = new AliCaloRawAnalyzerNN();
897 }
898 else if (fitAlgo == kLMS) {
899 fRawAnalyzer = new AliCaloRawAnalyzerLMS();
900 }
901 else if (fitAlgo == kPeakFinder) {
902 fRawAnalyzer = new AliCaloRawAnalyzerPeakFinder();
903 }
904 else if (fitAlgo == kCrude) {
905 fRawAnalyzer = new AliCaloRawAnalyzerCrude();
906 }
907 else {
908 AliWarning("EMCAL QA invalid fit algorithm choice") ;
909 }
910
911 }
912 return;
913}
914
38986b78 915//_____________________________________________________________________________________
916void AliEMCALQADataMakerRec::ConvertProfile2H(TProfile * p, TH2 * histo)
917{
918 // set some histogram defaults
919 //histo->Reset() ;
920 //histo->SetStats(kFALSE); // no statistics box shown
921 Int_t nbinsProf = p->GetNbinsX();
922
923 // loop through the TProfile p and fill the TH2F histo
924 Int_t row = 0;
925 Int_t col = 0;
926 Double_t binContent = 0;
927 Int_t towerNum = 0; // global tower Id
928 // i = 0; // tower Id within SuperModule
929 Int_t iSM = 0; // SuperModule index
930 Int_t iSMSide = 0; // 0=A, 1=C side
931 Int_t iSMSector = 0; // 2 SM's per sector
932
933 // indices for 2D plots
934 Int_t col2d = 0;
935 Int_t row2d = 0;
936
937 for (Int_t ibin = 1; ibin <= nbinsProf; ibin++) {
938 towerNum = (Int_t) p->GetBinCenter(ibin);
939 binContent = p->GetBinContent(ibin);
940
941 // figure out what the tower indices are: col, row within a SuperModule
942 iSM = towerNum/(AliEMCALGeoParams::fgkEMCALRows * AliEMCALGeoParams::fgkEMCALCols);
943 col = (towerNum/AliEMCALGeoParams::fgkEMCALRows) % (AliEMCALGeoParams::fgkEMCALCols);
944 row = towerNum % (AliEMCALGeoParams::fgkEMCALRows);
945
946 //DecodeTowerNum(towerNum, &SM, &col, &row);
947 // then we calculate what the global 2D coord are, based on which SM
948 // we are in
949 iSMSector = iSM / 2;
950 iSMSide = iSM % 2;
951
952 if (iSMSide == 1) { // C side, shown to the right
953 col2d = col + AliEMCALGeoParams::fgkEMCALCols;
954 }
955 else { // A side, shown to the left
956 col2d = col;
957 }
958
959 row2d = row + iSMSector * AliEMCALGeoParams::fgkEMCALRows;
960
961 histo->SetBinContent(col2d+1, row2d+1, binContent);
962 }
963}