SPD cooling collectors
[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
183//____________________________________________________________________________
38986b78 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}
236//____________________________________________________________________________
9e47432c 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
1557b01a 301 const Bool_t expert = kTRUE ;
302 const Bool_t saveCorr = kTRUE ;
303 const Bool_t image = kTRUE ;
304 const Option_t *profileOption = "s";
9e47432c 305
38986b78 306 Int_t nTowersPerSM = AliEMCALGeoParams::fgkEMCALRows * AliEMCALGeoParams::fgkEMCALCols; // number of towers in a SuperModule; 24x48
307 Int_t nTot = fSuperModules * nTowersPerSM; // max number of towers in all SuperModules
308
309
1557b01a 310 //Defining histograms binning, each 2D histogram covers all SMs
311 Int_t nSMSectors = fSuperModules / 2; // 2 SMs per sector
312 Int_t nbinsZ = 2*AliEMCALGeoParams::fgkEMCALCols;
313 Int_t nbinsPhi = nSMSectors * AliEMCALGeoParams::fgkEMCALRows;
38986b78 314
315 // counter info: number of channels per event (bins are SM index)
9e47432c 316 TProfile * h0 = new TProfile("hLowEmcalSupermodules", "Low Gain EMC: # of towers vs SuperMod;SM Id;# of towers",
1557b01a 317 fSuperModules, -0.5, fSuperModules-0.5, profileOption) ;
00957c37 318 Add2RawsList(h0, kNsmodLG, expert, !image, !saveCorr) ;
9e47432c 319 TProfile * h1 = new TProfile("hHighEmcalSupermodules", "High Gain EMC: # of towers vs SuperMod;SM Id;# of towers",
1557b01a 320 fSuperModules, -0.5, fSuperModules-0.5, profileOption) ;
00957c37 321 Add2RawsList(h1, kNsmodHG, expert, !image, !saveCorr) ;
9e47432c 322
323 // where did max sample occur? (bins are towers)
324 TProfile * h2 = new TProfile("hLowEmcalRawtime", "Low Gain EMC: Time at Max vs towerId;Tower Id;Time [ticks]",
1557b01a 325 nTot, -0.5, nTot-0.5, profileOption) ;
00957c37 326 Add2RawsList(h2, kTimeLG, expert, !image, !saveCorr) ;
9e47432c 327 TProfile * h3 = new TProfile("hHighEmcalRawtime", "High Gain EMC: Time at Max vs towerId;Tower Id;Time [ticks]",
1557b01a 328 nTot, -0.5, nTot-0.5, profileOption) ;
00957c37 329 Add2RawsList(h3, kTimeHG, expert, !image, !saveCorr) ;
9e47432c 330
331 // how much above pedestal was the max sample? (bins are towers)
332 TProfile * h4 = new TProfile("hLowEmcalRawMaxMinusMin", "Low Gain EMC: Max - Min vs towerId;Tower Id;Max-Min [ADC counts]",
1557b01a 333 nTot, -0.5, nTot-0.5, profileOption) ;
9e47432c 334 Add2RawsList(h4, kSigLG, expert, image, !saveCorr) ;
335 TProfile * h5 = new TProfile("hHighEmcalRawMaxMinusMin", "High Gain EMC: Max - Min vs towerId;Tower Id;Max-Min [ADC counts]",
1557b01a 336 nTot, -0.5, nTot-0.5, profileOption) ;
9e47432c 337 Add2RawsList(h5, kSigHG, expert, image, !saveCorr) ;
338
339 // total counter: channels per event
340 TH1I * h6 = new TH1I("hLowNtot", "Low Gain EMC: Total Number of found towers;# of Towers;Counts", 200, 0, nTot) ;
341 h6->Sumw2() ;
00957c37 342 Add2RawsList(h6, kNtotLG, expert, !image, !saveCorr) ;
9e47432c 343 TH1I * h7 = new TH1I("hHighNtot", "High Gain EMC: Total Number of found towers;# of Towers;Counts", 200,0, nTot) ;
344 h7->Sumw2() ;
00957c37 345 Add2RawsList(h7, kNtotHG, expert, !image, !saveCorr) ;
9e47432c 346
347 // pedestal (bins are towers)
348 TProfile * h8 = new TProfile("hLowEmcalRawPed", "Low Gain EMC: Pedestal vs towerId;Tower Id;Pedestal [ADC counts]",
1557b01a 349 nTot, -0.5, nTot-0.5, profileOption) ;
00957c37 350 Add2RawsList(h8, kPedLG, expert, !image, !saveCorr) ;
9e47432c 351 TProfile * h9 = new TProfile("hHighEmcalRawPed", "High Gain EMC: Pedestal vs towerId;Tower Id;Pedestal [ADC counts]",
1557b01a 352 nTot, -0.5, nTot-0.5, profileOption) ;
00957c37 353 Add2RawsList(h9, kPedHG, expert, !image, !saveCorr) ;
9e47432c 354
38986b78 355 //temp 2D amplitude histogram for the current run
356 fHighEmcHistoH2F = new TH2F("h2DHighEC2", "High Gain EMC:Max - Min [ADC counts]", nbinsZ, -0.5 , nbinsZ-0.5, nbinsPhi, -0.5, nbinsPhi-0.5);
f05c8877 357 fHighEmcHistoH2F->SetDirectory(0) ; // this histo must be memory resident
38986b78 358 //add ratio histograms: to comapre the current run with the reference data
359 TH2F * h15 = new TH2F("h2DRatioAmp", "High Gain Ratio to Reference:Amplitude_{current run}/Amplitude_{reference run}", nbinsZ, -0.5 , nbinsZ-0.5,
360 nbinsPhi, -0.5, nbinsPhi-0.5);
361 //settings for display in amore
362 h15->SetTitle("Amplitude_{current run}/Amplitude_{reference run}");
00957c37 363 h15->SetMaximum(2.0);
364 h15->SetMinimum(0.1);
365 h15->SetOption("COLZ");
366 gStyle->SetOptStat(0);
367 Int_t color[] = {4,3,2} ;
368 gStyle->SetPalette(3,color);
369 h15->GetZaxis()->SetNdivisions(3);
370 h15->UseCurrentStyle();
371 h15->SetDirectory(0);
38986b78 372 Add2RawsList(h15, k2DRatioAmp, !expert, image, !saveCorr) ;
373
374 TH1F * h16 = new TH1F("hRatioDist", "Amplitude_{current run}/Amplitude_{reference run} ratio distribution", nTot, 0., 2.);
00957c37 375 h16->SetMinimum(0.1);
376 h16->SetMaximum(100.);
377 gStyle->SetOptStat(0);
378 h16->UseCurrentStyle();
f05c8877 379 h16->SetDirectory(0);
38986b78 380 Add2RawsList(h16, kRatioDist, !expert, image, !saveCorr) ;
381
9e47432c 382 // now repeat the same for TRU and LEDMon data
38986b78 383 Int_t nTot2x2 = fSuperModules * AliEMCALGeoParams::fgkEMCALTRUsPerSM * AliEMCALGeoParams::fgkEMCAL2x2PerTRU; // max number of TRU channels for all SuperModules
9e47432c 384
385 // counter info: number of channels per event (bins are SM index)
386 TProfile * hT0 = new TProfile("hTRUEmcalSupermodules", "TRU EMC: # of TRU channels vs SuperMod;SM Id;# of TRU channels",
1557b01a 387 fSuperModules, -0.5, fSuperModules-0.5, profileOption) ;
00957c37 388 Add2RawsList(hT0, kNsmodTRU, expert, !image, !saveCorr) ;
9e47432c 389
390 // where did max sample occur? (bins are TRU channels)
391 TProfile * hT1 = new TProfile("hTRUEmcalRawtime", "TRU EMC: Time at Max vs 2x2Id;2x2 Id;Time [ticks]",
1557b01a 392 nTot2x2, -0.5, nTot2x2-0.5, profileOption) ;
00957c37 393 Add2RawsList(hT1, kTimeTRU, expert, !image, !saveCorr) ;
9e47432c 394
395 // how much above pedestal was the max sample? (bins are TRU channels)
396 TProfile * hT2 = new TProfile("hTRUEmcalRawMaxMinusMin", "TRU EMC: Max - Min vs 2x2Id;2x2 Id;Max-Min [ADC counts]",
1557b01a 397 nTot2x2, -0.5, nTot2x2-0.5, profileOption) ;
00957c37 398 Add2RawsList(hT2, kSigTRU, expert, !image, !saveCorr) ;
9e47432c 399
400 // total counter: channels per event
401 TH1I * hT3 = new TH1I("hTRUNtot", "TRU EMC: Total Number of found TRU channels;# of TRU Channels;Counts", 200, 0, nTot2x2) ;
402 hT3->Sumw2() ;
00957c37 403 Add2RawsList(hT3, kNtotTRU, expert, !image, !saveCorr) ;
9e47432c 404
405 // pedestal (bins are TRU channels)
406 TProfile * hT4 = new TProfile("hTRUEmcalRawPed", "TRU EMC: Pedestal vs 2x2Id;2x2 Id;Pedestal [ADC counts]",
1557b01a 407 nTot2x2, -0.5, nTot2x2-0.5, profileOption) ;
00957c37 408 Add2RawsList(hT4, kPedTRU, expert, !image, !saveCorr) ;
9e47432c 409
5c6517c3 410 // L0 trigger hits: # of hits (bins are TRU channels)
411 TH1I * hT5 = new TH1I("hTRUEmcalL0hits", "L0 trigger hits: Total number of 2x2 L0 generated", nTot2x2, -0.5, nTot2x2);
412 hT5->Sumw2();
00957c37 413 Add2RawsList(hT5, kNL0TRU, expert, !image, !saveCorr);
5c6517c3 414
415 // L0 trigger hits: average time (bins are TRU channels)
1557b01a 416 TProfile * hT6 = new TProfile("hTRUEmcalL0hitsAvgTime", "L0 trigger hits: average time bin", nTot2x2, -0.5, nTot2x2, profileOption);
00957c37 417 Add2RawsList(hT6, kTimeL0TRU, expert, !image, !saveCorr);
5c6517c3 418
9e47432c 419 // and also LED Mon..
420 // LEDMon has both high and low gain channels, just as regular FEE/towers
38986b78 421 Int_t nTotLEDMon = fSuperModules * AliEMCALGeoParams::fgkEMCALLEDRefs; // max number of LEDMon channels for all SuperModules
9e47432c 422
423 // counter info: number of channels per event (bins are SM index)
424 TProfile * hL0 = new TProfile("hLowLEDMonEmcalSupermodules", "LowLEDMon Gain EMC: # of strips vs SuperMod;SM Id;# of strips",
1557b01a 425 fSuperModules, -0.5, fSuperModules-0.5, profileOption) ;
00957c37 426 Add2RawsList(hL0, kNsmodLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 427 TProfile * hL1 = new TProfile("hHighLEDMonEmcalSupermodules", "HighLEDMon Gain EMC: # of strips vs SuperMod;SM Id;# of strips",
1557b01a 428 fSuperModules, -0.5, fSuperModules-0.5, profileOption) ;
00957c37 429 Add2RawsList(hL1, kNsmodHGLEDMon, expert, !image, !saveCorr) ;
9e47432c 430
431 // where did max sample occur? (bins are strips)
432 TProfile * hL2 = new TProfile("hLowLEDMonEmcalRawtime", "LowLEDMon Gain EMC: Time at Max vs stripId;Strip Id;Time [ticks]",
1557b01a 433 nTotLEDMon, -0.5, nTotLEDMon-0.5, profileOption) ;
00957c37 434 Add2RawsList(hL2, kTimeLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 435 TProfile * hL3 = new TProfile("hHighLEDMonEmcalRawtime", "HighLEDMon Gain EMC: Time at Max vs stripId;Strip Id;Time [ticks]",
1557b01a 436 nTotLEDMon, -0.5, nTotLEDMon-0.5, profileOption) ;
00957c37 437 Add2RawsList(hL3, kTimeHGLEDMon, expert, !image, !saveCorr) ;
9e47432c 438
439 // how much above pedestal was the max sample? (bins are strips)
440 TProfile * hL4 = new TProfile("hLowLEDMonEmcalRawMaxMinusMin", "LowLEDMon Gain EMC: Max - Min vs stripId;Strip Id;Max-Min [ADC counts]",
1557b01a 441 nTotLEDMon, -0.5, nTotLEDMon-0.5, profileOption) ;
00957c37 442 Add2RawsList(hL4, kSigLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 443 TProfile * hL5 = new TProfile("hHighLEDMonEmcalRawMaxMinusMin", "HighLEDMon Gain EMC: Max - Min vs stripId;Strip Id;Max-Min [ADC counts]",
1557b01a 444 nTotLEDMon, -0.5, nTotLEDMon-0.5, profileOption) ;
00957c37 445 Add2RawsList(hL5, kSigHGLEDMon, expert, !image, !saveCorr) ;
38986b78 446
447 // total counter: channels per event
9e47432c 448 TH1I * hL6 = new TH1I("hLowLEDMonNtot", "LowLEDMon Gain EMC: Total Number of found strips;# of Strips;Counts", 200, 0, nTotLEDMon) ;
449 hL6->Sumw2() ;
00957c37 450 Add2RawsList(hL6, kNtotLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 451 TH1I * hL7 = new TH1I("hHighLEDMonNtot", "HighLEDMon Gain EMC: Total Number of found strips;# of Strips;Counts", 200,0, nTotLEDMon) ;
452 hL7->Sumw2() ;
00957c37 453 Add2RawsList(hL7, kNtotHGLEDMon, expert, !image, !saveCorr) ;
9e47432c 454
455 // pedestal (bins are strips)
456 TProfile * hL8 = new TProfile("hLowLEDMonEmcalRawPed", "LowLEDMon Gain EMC: Pedestal vs stripId;Strip Id;Pedestal [ADC counts]",
1557b01a 457 nTotLEDMon, -0.5, nTotLEDMon-0.5, profileOption) ;
00957c37 458 Add2RawsList(hL8, kPedLGLEDMon, expert, !image, !saveCorr) ;
9e47432c 459 TProfile * hL9 = new TProfile("hHighLEDMonEmcalRawPed", "HighLEDMon Gain EMC: Pedestal vs stripId;Strip Id;Pedestal [ADC counts]",
1557b01a 460 nTotLEDMon, -0.5, nTotLEDMon-0.5, profileOption) ;
00957c37 461 Add2RawsList(hL9, kPedHGLEDMon, expert, !image, !saveCorr) ;
38986b78 462
463 //add two histograms for shifter from the LED monitor system: comapre LED monitor with the reference run
464 //to be used for decision whether we need to change reference data
465 TH1F * hL10 = new TH1F("hMaxMinusMinLEDMonRatio", "LEDMon amplitude, Ratio to reference run", nTotLEDMon, -0.5, nTotLEDMon-0.5) ;
38986b78 466 //settings for display in amore
467 hL10->SetTitle("Amplitude_{LEDMon current}/Amplitude_{LEDMon reference}");
00957c37 468 hL10->SetMaximum(2.0);
469 hL10->SetMinimum(0.1);
470 gStyle->SetOptStat(0);
471 hL10->UseCurrentStyle();
472 hL10->SetDirectory(0);
38986b78 473// hL10->SetOption("E");
00957c37 474 Add2RawsList(hL10, kLEDMonRatio, !expert, image, !saveCorr) ;
475
38986b78 476 TH1F * hL11 = new TH1F("hMaxMinusMinLEDMonRatioDist", "LEDMon amplitude, Ratio distribution", nTot, 0, 2);
00957c37 477 hL11->SetMinimum(0.1) ;
478 hL11->SetMaximum(100.);
479 gStyle->SetOptStat(0);
480 hL11->UseCurrentStyle();
481 hL11->SetDirectory(0);
38986b78 482 Add2RawsList(hL11, kLEDMonRatioDist, !expert, image, !saveCorr) ;
483
484 GetCalibRefFromOCDB() ;
9e47432c 485}
486
487//____________________________________________________________________________
488void AliEMCALQADataMakerRec::MakeESDs(AliESDEvent * esd)
489{
490 // make QA data from ESDs
491
492 Int_t nTot = 0 ;
493 for ( Int_t index = 0; index < esd->GetNumberOfCaloClusters() ; index++ ) {
494 AliESDCaloCluster * clu = esd->GetCaloCluster(index) ;
495 if( clu->IsEMCAL() ) {
496 GetESDsData(kESDCaloClusE)->Fill(clu->E()) ;
497 nTot++ ;
498 }
499 }
500 GetESDsData(kESDCaloClusM)->Fill(nTot) ;
501
502 //fill calo cells
503 AliESDCaloCells* cells = esd->GetEMCALCells();
504 GetESDsData(kESDCaloCellM)->Fill(cells->GetNumberOfCells()) ;
505
506 for ( Int_t index = 0; index < cells->GetNumberOfCells() ; index++ ) {
507 GetESDsData(kESDCaloCellA)->Fill(cells->GetAmplitude(index)) ;
508 }
509
510}
511
512//____________________________________________________________________________
513void AliEMCALQADataMakerRec::MakeRaws(AliRawReader* rawReader)
514{
e03bcdd4 515 // make sure EMCal was readout during the event
516 Int_t emcID = AliDAQ::DetectorID("EMCAL"); // bit 18..
7b2c20bb 517 const UInt_t *detPattern = rawReader->GetDetectorPattern();
e03bcdd4 518 UInt_t emcInReadout = ( ((1 << emcID) & detPattern[0]) >> emcID);
38986b78 519 if (! emcInReadout) return; // no poInt_t in looking at this event, if no EMCal data
e03bcdd4 520
def665cb 521 // setup
9e47432c 522 rawReader->Reset() ;
523 AliCaloRawStreamV3 in(rawReader,"EMCAL");
30aa89b0 524 rawReader->Select("EMCAL", 0, AliEMCALGeoParams::fgkLastAltroDDL) ; //select EMCAL DDL's
9e47432c 525
5c6517c3 526 AliRecoParam::EventSpecie_t saveSpecie = fEventSpecie ;
527
def665cb 528 if (rawReader->GetType() == AliRawEventHeaderBase::kCalibrationEvent) {
529 SetEventSpecie(AliRecoParam::kCalib) ;
530 }
38986b78 531
38986b78 532 const Int_t nTowersPerSM = AliEMCALGeoParams::fgkEMCALRows * AliEMCALGeoParams::fgkEMCALCols; // number of towers in a SuperModule; 24x48
533 const Int_t nRows = AliEMCALGeoParams::fgkEMCALRows; // number of rows per SuperModule
534 const Int_t nStripsPerSM = AliEMCALGeoParams::fgkEMCALLEDRefs; // number of strips per SuperModule
535 const Int_t n2x2PerSM = AliEMCALGeoParams::fgkEMCALTRUsPerSM * AliEMCALGeoParams::fgkEMCAL2x2PerTRU; // number of TRU 2x2's per SuperModule
536 const Int_t n2x2PerTRU = AliEMCALGeoParams::fgkEMCAL2x2PerTRU;
9e47432c 537
9e47432c 538 // SM counters; decl. should be safe, assuming we don't get more than expected SuperModules..
38986b78 539 Int_t nTotalSMLG[AliEMCALGeoParams::fgkEMCALModules] = {0};
540 Int_t nTotalSMHG[AliEMCALGeoParams::fgkEMCALModules] = {0};
541 Int_t nTotalSMTRU[AliEMCALGeoParams::fgkEMCALModules] = {0};
542 Int_t nTotalSMLGLEDMon[AliEMCALGeoParams::fgkEMCALModules] = {0};
543 Int_t nTotalSMHGLEDMon[AliEMCALGeoParams::fgkEMCALModules] = {0};
544
545 const Int_t nTRUL0ChannelBits = 10; // used for L0 trigger bits checks
546 Int_t iSM = 0; // SuperModule index
def665cb 547 // start loop over input stream
def665cb 548 while (in.NextDDL()) {
38986b78 549 Int_t iRCU = in.GetDDLNumber() % 2; // RCU0 or RCU1, within SuperModule
dc16c015 550 fRawAnalyzer->SetIsZeroSuppressed( in.GetZeroSupp() );
9e47432c 551
98d6fe2e 552 while (in.NextChannel()) {
553 iSM = in.GetModule(); // SuperModule
38986b78 554 //prInt_tf("iSM %d DDL %d", iSM, in.GetDDLNumber());
98d6fe2e 555 if (iSM>=0 && iSM<fSuperModules) { // valid module reading
9e47432c 556
38986b78 557 Int_t nsamples = 0;
def665cb 558 vector<AliCaloBunchInfo> bunchlist;
559 while (in.NextBunch()) {
560 nsamples += in.GetBunchLength();
561 bunchlist.push_back( AliCaloBunchInfo(in.GetStartTimeBin(), in.GetBunchLength(), in.GetSignals() ) );
562 }
563
564 if (nsamples > 0) { // this check is needed for when we have zero-supp. on, but not sparse readout
38986b78 565 Float_t time = 0.;
566 Float_t amp = 0.;
def665cb 567 // indices for pedestal calc.
38986b78 568 Int_t firstPedSample = 0;
569 Int_t lastPedSample = 0;
570 bool isTRUL0IdData = false;
def665cb 571
572 if (! in.IsTRUData() ) { // high gain, low gain, LED Mon data - all have the same shaper/sampling
573 AliCaloFitResults fitResults = fRawAnalyzer->Evaluate( bunchlist, in.GetAltroCFG1(), in.GetAltroCFG2());
38986b78 574 amp = fitResults.GetAmp();
def665cb 575 time = fitResults.GetTof();
576 firstPedSample = fFirstPedestalSample;
38986b78 577 lastPedSample = fLastPedestalSample;
9e47432c 578 }
def665cb 579 else { // TRU data is special, needs its own analyzer
580 AliCaloFitResults fitResults = fRawAnalyzerTRU->Evaluate( bunchlist, in.GetAltroCFG1(), in.GetAltroCFG2());
38986b78 581 amp = fitResults.GetAmp();
def665cb 582 time = fitResults.GetTof();
583 firstPedSample = fFirstPedestalSampleTRU;
38986b78 584 lastPedSample = fLastPedestalSampleTRU;
5c6517c3 585 if (in.GetColumn() > n2x2PerTRU) {
586 isTRUL0IdData = true;
587 }
def665cb 588 }
589
590 // pedestal samples
38986b78 591 Int_t nPed = 0;
592 vector<Int_t> pedSamples;
9e47432c 593
def665cb 594 // select earliest bunch
595 unsigned int bunchIndex = 0;
596 unsigned int startBin = bunchlist.at(0).GetStartBin();
597 if (bunchlist.size() > 0) {
598 for(unsigned int ui=1; ui < bunchlist.size(); ui++ ) {
599 if (startBin > bunchlist.at(ui).GetStartBin() ) {
600 startBin = bunchlist.at(ui).GetStartBin();
601 bunchIndex = ui;
602 }
9e47432c 603 }
604 }
def665cb 605
606 // check bunch for entries in the pedestal sample range
38986b78 607 Int_t bunchLength = bunchlist.at(bunchIndex).GetLength();
def665cb 608 const UShort_t *sig = bunchlist.at(bunchIndex).GetData();
38986b78 609 Int_t timebin = 0;
5c6517c3 610
611 if (! isTRUL0IdData) { // regular data, can look at pedestals
38986b78 612 for (Int_t i = 0; i<bunchLength; i++) {
5c6517c3 613 timebin = startBin--;
614 if ( firstPedSample<=timebin && timebin<=lastPedSample ) {
615 pedSamples.push_back( sig[i] );
616 nPed++;
617 }
618 } // i
5c6517c3 619 }
620 else { // TRU L0 Id Data
621 // which TRU the channel belongs to?
38986b78 622 Int_t iTRUId = in.GetModule()*3 + (iRCU*in.GetBranch() + iRCU);
5c6517c3 623
38986b78 624 for (Int_t i = 0; i< bunchLength; i++) {
625 for( Int_t j = 0; j < nTRUL0ChannelBits; j++ ){
5c6517c3 626 // check if the bit j is 1
627 if( (sig[i] & ( 1 << j )) > 0 ){
38986b78 628 Int_t iTRUIdInSM = (in.GetColumn() - n2x2PerTRU)*nTRUL0ChannelBits+j;
ce95bae9 629 if(iTRUIdInSM < n2x2PerTRU) {
38986b78 630 Int_t iTRUAbsId = iTRUIdInSM + n2x2PerTRU * iTRUId;
5c6517c3 631 // Fill the histograms
ce95bae9 632 GetRawsData(kNL0TRU)->Fill(iTRUAbsId);
633 GetRawsData(kTimeL0TRU)->Fill(iTRUAbsId, startBin);
5c6517c3 634 }
635 }
636 }
637 startBin--;
638 } // i
639 } // TRU L0 Id data
def665cb 640
641 // fill histograms
642 if ( in.IsLowGain() || in.IsHighGain() ) { // regular towers
38986b78 643 Int_t towerId = iSM*nTowersPerSM + in.GetColumn()*nRows + in.GetRow();
def665cb 644 if ( in.IsLowGain() ) {
645 nTotalSMLG[iSM]++;
def665cb 646 if ( (amp > fMinSignalLG) && (amp < fMaxSignalLG) ) {
647 GetRawsData(kSigLG)->Fill(towerId, amp);
648 GetRawsData(kTimeLG)->Fill(towerId, time);
649 }
650 if (nPed > 0) {
38986b78 651 for (Int_t i=0; i<nPed; i++) {
def665cb 652 GetRawsData(kPedLG)->Fill(towerId, pedSamples[i]);
653 }
654 }
655 } // gain==0
656 else if ( in.IsHighGain() ) {
657 nTotalSMHG[iSM]++;
def665cb 658 if ( (amp > fMinSignalHG) && (amp < fMaxSignalHG) ) {
659 GetRawsData(kSigHG)->Fill(towerId, amp);
660 GetRawsData(kTimeHG)->Fill(towerId, time);
661 }
662 if (nPed > 0) {
38986b78 663 for (Int_t i=0; i<nPed; i++) {
def665cb 664 GetRawsData(kPedHG)->Fill(towerId, pedSamples[i]);
665 }
666 }
667 } // gain==1
668 } // low or high gain
38986b78 669 // TRU
def665cb 670 else if ( in.IsTRUData() && in.GetColumn()<AliEMCALGeoParams::fgkEMCAL2x2PerTRU) {
38986b78 671 // for TRU data, the mapping class holds the TRU Int_ternal 2x2 number (0..95) in the Column var..
672 Int_t iTRU = (iRCU*in.GetBranch() + iRCU); //TRU0 is from RCU0, TRU1 from RCU1, TRU2 is from branch B on RCU1
673 Int_t iTRU2x2Id = iSM*n2x2PerSM + iTRU*AliEMCALGeoParams::fgkEMCAL2x2PerTRU
def665cb 674 + in.GetColumn();
def665cb 675 nTotalSMTRU[iSM]++;
676 if ( (amp > fMinSignalTRU) && (amp < fMaxSignalTRU) ) {
677 GetRawsData(kSigTRU)->Fill(iTRU2x2Id, amp);
678 GetRawsData(kTimeTRU)->Fill(iTRU2x2Id, time);
9e47432c 679 }
def665cb 680 if (nPed > 0) {
38986b78 681 for (Int_t i=0; i<nPed; i++) {
def665cb 682 GetRawsData(kPedTRU)->Fill(iTRU2x2Id, pedSamples[i]);
683 }
9e47432c 684 }
def665cb 685 }
686 // LED Mon
687 else if ( in.IsLEDMonData() ) {
688 // for LED Mon data, the mapping class holds the gain info in the Row variable
689 // and the Strip number in the Column..
38986b78 690 Int_t gain = in.GetRow();
691 Int_t stripId = iSM*nStripsPerSM + in.GetColumn();
def665cb 692
693 if ( gain == 0 ) {
694 nTotalSMLGLEDMon[iSM]++;
695 if ( (amp > fMinSignalLGLEDMon) && (amp < fMaxSignalLGLEDMon) ) {
696 GetRawsData(kSigLGLEDMon)->Fill(stripId, amp);
697 GetRawsData(kTimeLGLEDMon)->Fill(stripId, time);
698 }
699 if (nPed > 0) {
38986b78 700 for (Int_t i=0; i<nPed; i++) {
def665cb 701 GetRawsData(kPedLGLEDMon)->Fill(stripId, pedSamples[i]);
702 }
703 }
704 } // gain==0
705 else if ( gain == 1 ) {
706 nTotalSMHGLEDMon[iSM]++;
707 if ( (amp > fMinSignalHGLEDMon) && (amp < fMaxSignalHGLEDMon) ) {
708 GetRawsData(kSigHGLEDMon)->Fill(stripId, amp);
709 GetRawsData(kTimeHGLEDMon)->Fill(stripId, time);
710 }
711 if (nPed > 0) {
38986b78 712 for (Int_t i=0; i<nPed; i++) {
def665cb 713 GetRawsData(kPedHGLEDMon)->Fill(stripId, pedSamples[i]);
714 }
715 }
716 } // low or high gain
717 } // LEDMon
718
719 } // SM index OK
9e47432c 720
721 } // nsamples>0 check, some data found for this channel; not only trailer/header
722 }// end while over channel
723
724 }//end while over DDL's, of input stream
725
38986b78 726 // TProfile * p = dynamic_cast<TProfile *>(GetRawsData(kSigHG)) ;
727 ConvertProfile2H(dynamic_cast<TProfile *>(GetRawsData(kSigHG)), fHighEmcHistoH2F) ;
728 Double_t binContent = 0. ;
00957c37 729
1557b01a 730 //reset ratio histograms
00957c37 731 GetRawsData(k2DRatioAmp)->Reset("ICE");
732 GetRawsData(kRatioDist)->Reset("ICE");
733 GetRawsData(kLEDMonRatio)->Reset("ICE");
734 GetRawsData(kLEDMonRatioDist)->Reset("ICE");
735 GetRawsData(k2DRatioAmp)->ResetStats();
736 GetRawsData(kRatioDist)->ResetStats();
737 GetRawsData(kLEDMonRatio)->ResetStats();
738 GetRawsData(kLEDMonRatioDist)->ResetStats();
739
38986b78 740 //calculate the ratio of the amplitude and fill the histograms, only if the events type is Calib
741 if (rawReader->GetType() == AliRawEventHeaderBase::kCalibrationEvent) {
00957c37 742 for(Int_t ix = 1; ix <= fHighEmcHistoH2F->GetNbinsX(); ix++) {
743 for(Int_t iy = 1; iy <= fHighEmcHistoH2F->GetNbinsY(); iy++) {
744 if(fCalibRefHistoH2F->GetBinContent(ix, iy))binContent = fHighEmcHistoH2F->GetBinContent(ix, iy)/fCalibRefHistoH2F->GetBinContent(ix, iy) ;
745 GetRawsData(k2DRatioAmp)->SetBinContent(ix, iy, binContent);
746 GetRawsData(kRatioDist)->Fill(GetRawsData(k2DRatioAmp)->GetBinContent(ix, iy));
747 }
748 }
749
38986b78 750 }
751 //Now for LED monitor system, to calculate the ratio as well
f05c8877 752 Double_t binError = 0. ;
1557b01a 753 // for the binError, we add the relative errors, squared
754 Double_t relativeErrorSqr = 0. ;
38986b78 755
756 for(int ib = 1; ib <= fLEDMonRefHistoPro->GetNbinsX(); ib++) {
757
1557b01a 758 if(fLEDMonRefHistoPro->GetBinContent(ib) != 0) {
759 binContent = GetRawsData(kSigLGLEDMon)->GetBinContent(ib) / fLEDMonRefHistoPro->GetBinContent(ib);
760 relativeErrorSqr = TMath::Power(fLEDMonRefHistoPro->GetBinError(ib) / fLEDMonRefHistoPro->GetBinContent(ib), 2);
761 }
762 else {
763 binContent = 0;
764 relativeErrorSqr = 0;
765 }
38986b78 766 GetRawsData(kLEDMonRatio)->SetBinContent(ib, binContent);
767
31aa47ff 768 if(GetRawsData(kLEDMonRatio)->GetBinContent(ib) != 0) {
1557b01a 769 relativeErrorSqr += TMath::Power(GetRawsData(kSigLGLEDMon)->GetBinError(ib)/GetRawsData(kLEDMonRatio)->GetBinContent(ib), 2);
770 }
771
772 binError = sqrt(relativeErrorSqr) * binContent;
38986b78 773 GetRawsData(kLEDMonRatio)->SetBinError(ib, binError);
774 GetRawsData(kLEDMonRatioDist)->Fill(GetRawsData(kLEDMonRatio)->GetBinContent(ib));
775 }
00957c37 776
38986b78 777
9e47432c 778 // let's also fill the SM and event counter histograms
38986b78 779 Int_t nTotalHG = 0;
780 Int_t nTotalLG = 0;
781 Int_t nTotalTRU = 0;
782 Int_t nTotalHGLEDMon = 0;
783 Int_t nTotalLGLEDMon = 0;
1a78a765 784 for (iSM=0; iSM<fSuperModules; iSM++) {
9e47432c 785 nTotalLG += nTotalSMLG[iSM];
786 nTotalHG += nTotalSMHG[iSM];
787 nTotalTRU += nTotalSMTRU[iSM];
98d6fe2e 788 nTotalLGLEDMon += nTotalSMLGLEDMon[iSM];
789 nTotalHGLEDMon += nTotalSMHGLEDMon[iSM];
9e47432c 790 GetRawsData(kNsmodLG)->Fill(iSM, nTotalSMLG[iSM]);
791 GetRawsData(kNsmodHG)->Fill(iSM, nTotalSMHG[iSM]);
792 GetRawsData(kNsmodTRU)->Fill(iSM, nTotalSMTRU[iSM]);
793 GetRawsData(kNsmodLGLEDMon)->Fill(iSM, nTotalSMLGLEDMon[iSM]);
794 GetRawsData(kNsmodHGLEDMon)->Fill(iSM, nTotalSMHGLEDMon[iSM]);
795 }
def665cb 796
9e47432c 797 GetRawsData(kNtotLG)->Fill(nTotalLG);
798 GetRawsData(kNtotHG)->Fill(nTotalHG);
799 GetRawsData(kNtotTRU)->Fill(nTotalTRU);
800 GetRawsData(kNtotLGLEDMon)->Fill(nTotalLGLEDMon);
801 GetRawsData(kNtotHGLEDMon)->Fill(nTotalHGLEDMon);
5c6517c3 802
803
def665cb 804 SetEventSpecie(saveSpecie) ;
9e47432c 805 // just in case the next rawreader consumer forgets to reset; let's do it here again..
806 rawReader->Reset() ;
807
808 return;
809}
810
811//____________________________________________________________________________
812void AliEMCALQADataMakerRec::MakeDigits()
813{
814 // makes data from Digits
815
816 GetDigitsData(1)->Fill(fDigitsArray->GetEntriesFast()) ;
817 TIter next(fDigitsArray) ;
818 AliEMCALDigit * digit ;
819 while ( (digit = dynamic_cast<AliEMCALDigit *>(next())) ) {
829ba234 820 GetDigitsData(0)->Fill( digit->GetAmplitude()) ;
9e47432c 821 }
822
823}
824
825//____________________________________________________________________________
826void AliEMCALQADataMakerRec::MakeDigits(TTree * digitTree)
827{
828 // makes data from Digit Tree
829 if (fDigitsArray)
830 fDigitsArray->Clear() ;
831 else
832 fDigitsArray = new TClonesArray("AliEMCALDigit", 1000) ;
833
834 TBranch * branch = digitTree->GetBranch("EMCAL") ;
835 if ( ! branch ) {
836 AliWarning("EMCAL branch in Digit Tree not found") ;
837 } else {
838 branch->SetAddress(&fDigitsArray) ;
839 branch->GetEntry(0) ;
840 MakeDigits() ;
841 }
842
843}
844
845//____________________________________________________________________________
846void AliEMCALQADataMakerRec::MakeRecPoints(TTree * clustersTree)
847{
848 // makes data from RecPoints
849 TBranch *emcbranch = clustersTree->GetBranch("EMCALECARP");
850 if (!emcbranch) {
851 AliError("can't get the branch with the EMCAL clusters !");
852 return;
853 }
854
38986b78 855 TObjArray * emcRecPoints = new TObjArray(100) ;
856 emcbranch->SetAddress(&emcRecPoints);
9e47432c 857 emcbranch->GetEntry(0);
858
38986b78 859 GetRecPointsData(kRecPM)->Fill(emcRecPoints->GetEntriesFast()) ;
860 TIter next(emcRecPoints) ;
9e47432c 861 AliEMCALRecPoint * rp ;
862 while ( (rp = dynamic_cast<AliEMCALRecPoint *>(next())) ) {
38986b78 863 GetRecPointsData(kRecPE)->Fill(rp->GetEnergy()) ;
9e47432c 864 GetRecPointsData(kRecPDigM)->Fill(rp->GetMultiplicity());
865 }
38986b78 866 emcRecPoints->Delete();
867 delete emcRecPoints;
9e47432c 868
869}
870
871//____________________________________________________________________________
872void AliEMCALQADataMakerRec::StartOfDetectorCycle()
873{
874 //Detector specific actions at start of cycle
875
876}
877
def665cb 878//____________________________________________________________________________
879void AliEMCALQADataMakerRec::SetFittingAlgorithm(Int_t fitAlgo)
880{
881 //Set fitting algorithm and initialize it if this same algorithm was not set before.
882 //printf("**** Set Algorithm , number %d ****\n",fitAlgo);
883
884 if(fitAlgo == fFittingAlgorithm && fRawAnalyzer) {
885 //Do nothing, this same algorithm already set before.
886 //printf("**** Algorithm already set before, number %d, %s ****\n",fitAlgo, fRawAnalyzer->GetName());
887 return;
888 }
889 //Initialize the requested algorithm
890 if(fitAlgo != fFittingAlgorithm || !fRawAnalyzer) {
891 //printf("**** Init Algorithm , number %d ****\n",fitAlgo);
892
893 fFittingAlgorithm = fitAlgo;
894 if (fRawAnalyzer) delete fRawAnalyzer; // delete prev. analyzer if existed.
895
896 if (fitAlgo == kFastFit) {
897 fRawAnalyzer = new AliCaloRawAnalyzerFastFit();
898 }
899 else if (fitAlgo == kNeuralNet) {
900 fRawAnalyzer = new AliCaloRawAnalyzerNN();
901 }
902 else if (fitAlgo == kLMS) {
903 fRawAnalyzer = new AliCaloRawAnalyzerLMS();
904 }
905 else if (fitAlgo == kPeakFinder) {
906 fRawAnalyzer = new AliCaloRawAnalyzerPeakFinder();
907 }
908 else if (fitAlgo == kCrude) {
909 fRawAnalyzer = new AliCaloRawAnalyzerCrude();
910 }
911 else {
912 AliWarning("EMCAL QA invalid fit algorithm choice") ;
913 }
914
915 }
916 return;
917}
918
38986b78 919//_____________________________________________________________________________________
920void AliEMCALQADataMakerRec::ConvertProfile2H(TProfile * p, TH2 * histo)
921{
922 // set some histogram defaults
923 //histo->Reset() ;
924 //histo->SetStats(kFALSE); // no statistics box shown
925 Int_t nbinsProf = p->GetNbinsX();
926
927 // loop through the TProfile p and fill the TH2F histo
928 Int_t row = 0;
929 Int_t col = 0;
930 Double_t binContent = 0;
931 Int_t towerNum = 0; // global tower Id
932 // i = 0; // tower Id within SuperModule
933 Int_t iSM = 0; // SuperModule index
934 Int_t iSMSide = 0; // 0=A, 1=C side
935 Int_t iSMSector = 0; // 2 SM's per sector
936
937 // indices for 2D plots
938 Int_t col2d = 0;
939 Int_t row2d = 0;
940
941 for (Int_t ibin = 1; ibin <= nbinsProf; ibin++) {
942 towerNum = (Int_t) p->GetBinCenter(ibin);
943 binContent = p->GetBinContent(ibin);
944
945 // figure out what the tower indices are: col, row within a SuperModule
946 iSM = towerNum/(AliEMCALGeoParams::fgkEMCALRows * AliEMCALGeoParams::fgkEMCALCols);
947 col = (towerNum/AliEMCALGeoParams::fgkEMCALRows) % (AliEMCALGeoParams::fgkEMCALCols);
948 row = towerNum % (AliEMCALGeoParams::fgkEMCALRows);
949
950 //DecodeTowerNum(towerNum, &SM, &col, &row);
951 // then we calculate what the global 2D coord are, based on which SM
952 // we are in
953 iSMSector = iSM / 2;
954 iSMSide = iSM % 2;
955
956 if (iSMSide == 1) { // C side, shown to the right
957 col2d = col + AliEMCALGeoParams::fgkEMCALCols;
958 }
959 else { // A side, shown to the left
960 col2d = col;
961 }
962
963 row2d = row + iSMSector * AliEMCALGeoParams::fgkEMCALRows;
964
965 histo->SetBinContent(col2d+1, row2d+1, binContent);
966 }
967}