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