]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - EMCAL/AliEMCALClusterizer.cxx
Added possibility of using * wildcard in histo names to clone (Diego)
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALClusterizer.cxx
... / ...
CommitLineData
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
16/* $Id$ */
17
18//_________________________________________________________________________
19// Base class for the clusterization algorithm (pure abstract)
20//*--
21//*-- Author: Yves Schutz SUBATECH
22//
23// Clusterization mother class. Contains common methods/data members of different
24// clusterizers. GCB 2010
25//////////////////////////////////////////////////////////////////////////////
26
27// --- ROOT system ---
28#include "TClonesArray.h"
29#include "TTree.h"
30#include <TFile.h>
31class TFolder;
32#include <TMath.h>
33#include <TMinuit.h>
34#include <TTree.h>
35class TSystem;
36#include <TBenchmark.h>
37#include <TBrowser.h>
38#include <TROOT.h>
39
40// --- Standard library ---
41#include <cassert>
42
43// --- AliRoot header files ---
44#include "AliEMCALClusterizer.h"
45#include "AliEMCALReconstructor.h"
46#include "AliRunLoader.h"
47#include "AliRun.h"
48#include "AliLog.h"
49#include "AliEMCAL.h"
50#include "AliEMCALRecPoint.h"
51#include "AliEMCALRecParam.h"
52#include "AliEMCALGeometry.h"
53#include "AliEMCALRecParam.h"
54#include "AliCDBManager.h"
55#include "AliCaloCalibPedestal.h"
56#include "AliEMCALCalibData.h"
57class AliCDBStorage;
58#include "AliCDBEntry.h"
59
60ClassImp(AliEMCALClusterizer)
61
62//____________________________________________________________________________
63AliEMCALClusterizer::AliEMCALClusterizer():
64 fIsInputCalibrated(kFALSE),
65 fJustClusters(kFALSE),
66 fDigitsArr(NULL),
67 fTreeR(NULL),
68 fRecPoints(NULL),
69 fGeom(NULL),
70 fCalibData(NULL),
71 fCaloPed(NULL),
72 fADCchannelECA(0.),fADCpedestalECA(0.), fTimeECA(0.),
73 fTimeMin(-1.),fTimeMax(1.),fTimeCut(1.),
74 fDefaultInit(kFALSE),fToUnfold(kFALSE),
75 fNumberOfECAClusters(0), fECAClusteringThreshold(0.),
76 fECALocMaxCut(0.),fECAW0(0.),fMinECut(0.),
77 fClusterUnfolding(NULL)
78{
79 // ctor
80
81 Init();
82}
83
84//____________________________________________________________________________
85AliEMCALClusterizer::AliEMCALClusterizer(AliEMCALGeometry* geometry):
86 fIsInputCalibrated(kFALSE),
87 fJustClusters(kFALSE),
88 fDigitsArr(NULL),
89 fTreeR(NULL),
90 fRecPoints(NULL),
91 fGeom(geometry),
92 fCalibData(NULL),
93 fCaloPed(NULL),
94 fADCchannelECA(0.),fADCpedestalECA(0.), fTimeECA(0.),
95 fTimeMin(-1.),fTimeMax(1.),fTimeCut(1.),
96 fDefaultInit(kFALSE),fToUnfold(kFALSE),
97 fNumberOfECAClusters(0), fECAClusteringThreshold(0.),
98 fECALocMaxCut(0.),fECAW0(0.),fMinECut(0.),
99 fClusterUnfolding(NULL)
100{
101 // Ctor with the indication of the file where header Tree and digits Tree are stored.
102 // Use this contructor to avoid usage of Init() which uses runloader.
103 // Change needed by HLT - MP.
104 // Note for the future: the use on runloader should be avoided or optional at least.
105 // Another way is to make Init virtual and protected at least
106 // such that the deriving classes can overload Init();
107
108 if (!fGeom)
109 {
110 AliFatal("Geometry not initialized.");
111 }
112 Int_t i=0;
113 for (i = 0; i < 8; i++)
114 fSSPars[i] = 0.;
115 for (i = 0; i < 3; i++) {
116 fPar5[i] = 0.;
117 fPar6[i] = 0.;
118 }
119}
120
121//____________________________________________________________________________
122AliEMCALClusterizer::AliEMCALClusterizer(AliEMCALGeometry *geometry,
123 AliEMCALCalibData *calib,
124 AliCaloCalibPedestal *caloped):
125 fIsInputCalibrated(kFALSE),
126 fJustClusters(kFALSE),
127 fDigitsArr(NULL),
128 fTreeR(NULL),
129 fRecPoints(NULL),
130 fGeom(geometry),
131 fCalibData(calib),
132 fCaloPed(caloped),
133 fADCchannelECA(0.),fADCpedestalECA(0.), fTimeECA(0.),
134 fTimeMin(-1.),fTimeMax(1.),fTimeCut(1.),
135 fDefaultInit(kFALSE),fToUnfold(kFALSE),
136 fNumberOfECAClusters(0), fECAClusteringThreshold(0.),
137 fECALocMaxCut(0.),fECAW0(0.),fMinECut(0.),
138 fClusterUnfolding(NULL)
139{
140 // ctor, geometry and calibration are initialized elsewhere.
141
142 if (!fGeom)
143 AliFatal("Geometry not initialized.");
144
145 Int_t i=0;
146 for (i = 0; i < 8; i++)
147 fSSPars[i] = 0.;
148 for (i = 0; i < 3; i++) {
149 fPar5[i] = 0.;
150 fPar6[i] = 0.;
151 }
152}
153
154//____________________________________________________________________________
155AliEMCALClusterizer::~AliEMCALClusterizer()
156{
157 // dtor
158 //Already deleted in AliEMCALReconstructor.
159
160 if(fClusterUnfolding) delete fClusterUnfolding;
161
162 // make sure we delete the rec points array
163 DeleteRecPoints();
164
165 //Delete digits array
166 DeleteDigits();
167
168}
169
170//____________________________________________________________________________
171void AliEMCALClusterizer::DeleteRecPoints()
172{
173 // free the cluster array
174 if (fRecPoints)
175 {
176 AliDebug(2, "Deleting fRecPoints.");
177 fRecPoints->Delete();
178 delete fRecPoints;
179 }
180}
181
182//____________________________________________________________________________
183void AliEMCALClusterizer::DeleteDigits()
184{
185 // free the digits array
186 if (fDigitsArr)
187 {
188 AliDebug(2, "Deleting fDigitsArr.");
189 fDigitsArr->Clear("C");
190 delete fDigitsArr;
191 }
192}
193
194//____________________________________________________________________________
195void AliEMCALClusterizer::Calibrate(Float_t & amp, Float_t & time, const Int_t absId)
196{
197 // Convert digitized amplitude into energy, calibrate time
198 // Calibration parameters are taken from OCDB : OCDB/EMCAL/Calib/Data
199
200 //Return energy with default parameters if calibration is not available
201 if (!fCalibData && !fCaloPed) {
202 if (fIsInputCalibrated == kTRUE)
203 {
204 AliDebug(10, Form("Input already calibrated!"));
205 return ;
206 }
207 else{
208 AliFatal("OCDB calibration and bad map parameters are not available");
209 return;
210 }
211 }
212
213 if (fGeom==0)
214 AliFatal("Did not get geometry from EMCALLoader") ;
215
216 Int_t iSupMod = -1;
217 Int_t nModule = -1;
218 Int_t nIphi = -1;
219 Int_t nIeta = -1;
220 Int_t iphi = -1;
221 Int_t ieta = -1;
222
223 Bool_t bCell = fGeom->GetCellIndex(absId, iSupMod, nModule, nIphi, nIeta) ;
224 if(!bCell) {
225 fGeom->PrintGeometry();
226 AliError(Form("Wrong cell id number : %i", absId));
227 //assert(0); // GCB: This aborts reconstruction of raw simulations
228 //where simulation had more SM than default geometry,
229 //change to return 0, to avoid aborting good generations.
230 amp = 0;
231 time = 0;
232 return ;
233 }
234
235 fGeom->GetCellPhiEtaIndexInSModule(iSupMod,nModule,nIphi, nIeta,iphi,ieta);
236
237 // Check if channel is bad (dead or hot), in this case return 0.
238 // Gustavo: 15-12-09 In case of RAW data this selection is already done, but not in simulation.
239 // for the moment keep it here but remember to do the selection at the sdigitizer level
240 // and remove it from here
241 if (fCaloPed) {
242 Int_t channelStatus = (Int_t)(fCaloPed->GetDeadMap(iSupMod))->GetBinContent(ieta,iphi);
243 if(channelStatus == AliCaloCalibPedestal::kHot || channelStatus == AliCaloCalibPedestal::kDead) {
244 AliDebug(2,Form("Tower from SM %d, ieta %d, iphi %d is BAD : status %d !!!",iSupMod,ieta,iphi, channelStatus));
245 amp = 0 ;
246 time = 0 ;
247 return ;
248 }
249 }
250 //Check if time is too large or too small, indication of a noisy channel, remove in this case
251 if(time > fTimeMax || time < fTimeMin) {
252 amp = 0 ;
253 time = 0 ;
254 return ;
255 }
256
257 if (fIsInputCalibrated||!fCalibData)
258 {
259 AliDebug(10, Form("Input already calibrated!"));
260 return ;
261 }
262
263 fADCchannelECA = fCalibData->GetADCchannel (iSupMod,ieta,iphi);
264 fADCpedestalECA = fCalibData->GetADCpedestal(iSupMod,ieta,iphi);
265 fTimeECA = fCalibData->GetTimeChannel(iSupMod,ieta,iphi);
266
267 time -= fTimeECA ;
268 amp = amp * fADCchannelECA - fADCpedestalECA ;
269
270}
271
272//____________________________________________________________________________
273void AliEMCALClusterizer::GetCalibrationParameters()
274{
275 // Set calibration parameters:
276 // If calibration database exists, they are read from database,
277 // otherwise, they are taken from digitizer.
278 // It is a user responsilibity to open CDB before reconstruction,
279 // for example:
280 // AliCDBStorage* storage = AliCDBManager::Instance()->GetStorage("local://CalibDB");
281
282 if (fIsInputCalibrated)
283 return;
284
285 //Check if calibration is stored in data base
286 if(!fCalibData)
287 {
288 AliCDBEntry *entry = (AliCDBEntry*)
289 AliCDBManager::Instance()->Get("EMCAL/Calib/Data");
290 if (entry) fCalibData = (AliEMCALCalibData*) entry->GetObject();
291 }
292
293 if(!fCalibData)
294 AliFatal("Calibration parameters not found in CDB!");
295}
296
297//____________________________________________________________________________
298void AliEMCALClusterizer::GetCaloCalibPedestal()
299{
300 // Set calibration parameters:
301 // if calibration database exists, they are read from database,
302 // otherwise, they are taken from digitizer.
303 //
304 // It is a user responsilibity to open CDB before reconstruction,
305 // for example:
306 // AliCDBStorage* storage = AliCDBManager::Instance()->GetStorage("local://CalibDB");
307
308 if (fIsInputCalibrated)
309 return;
310
311 // Check if calibration is stored in data base
312 if(!fCaloPed)
313 {
314 AliCDBEntry *entry = (AliCDBEntry*)
315 AliCDBManager::Instance()->Get("EMCAL/Calib/Pedestals");
316 if (entry) fCaloPed = (AliCaloCalibPedestal*) entry->GetObject();
317 }
318
319 if(!fCaloPed)
320 AliFatal("Pedestal info not found in CDB!");
321}
322
323//____________________________________________________________________________
324void AliEMCALClusterizer::Init()
325{
326 // Make all memory allocations which can not be done in default constructor.
327 // Attach the Clusterizer task to the list of EMCAL tasks
328
329 AliRunLoader *rl = AliRunLoader::Instance();
330 if (rl->GetAliRun()){
331 AliEMCAL* emcal = dynamic_cast<AliEMCAL*>(rl->GetAliRun()->GetDetector("EMCAL"));
332 if(emcal)fGeom = emcal->GetGeometry();
333 }
334
335 if(!fGeom){
336 fGeom = AliEMCALGeometry::GetInstance(AliEMCALGeometry::GetDefaultGeometryName());
337 }
338
339 AliDebug(1,Form("geom %p",fGeom));
340
341 if(!gMinuit)
342 gMinuit = new TMinuit(100) ;
343
344 Int_t i=0;
345 for (i = 0; i < 8; i++)
346 fSSPars[i] = 0.;
347 for (i = 0; i < 3; i++) {
348 fPar5[i] = 0.;
349 fPar6[i] = 0.;
350 }
351}
352
353//____________________________________________________________________________
354void AliEMCALClusterizer::InitParameters()
355{
356 // Initializes the parameters for the Clusterizer from AliEMCALReconstructor::GetRecParam().
357
358 return InitParameters(AliEMCALReconstructor::GetRecParam());
359}
360
361//____________________________________________________________________________
362void AliEMCALClusterizer::InitParameters(const AliEMCALRecParam* recParam)
363{
364 // Initializes the parameters for the Clusterizer
365
366 fNumberOfECAClusters = 0 ;
367 fCalibData = 0 ;
368 fCaloPed = 0 ;
369
370 if(!recParam) {
371 AliFatal("Reconstruction parameters for EMCAL not set!");
372 }
373
374 fECAClusteringThreshold = recParam->GetClusteringThreshold();
375 fECAW0 = recParam->GetW0();
376 fMinECut = recParam->GetMinECut();
377 fToUnfold = recParam->GetUnfold();
378 fECALocMaxCut = recParam->GetLocMaxCut();
379 fTimeCut = recParam->GetTimeCut();
380 fTimeMin = recParam->GetTimeMin();
381 fTimeMax = recParam->GetTimeMax();
382
383 //For NxN
384 SetNRowDiff(recParam->GetNRowDiff());
385 SetNColDiff(recParam->GetNColDiff());
386
387 AliDebug(1,Form("Reconstruction parameters: fECAClusteringThreshold=%.3f GeV, fECAW=%.3f, fMinECut=%.3f GeV, "
388 "fToUnfold=%d, fECALocMaxCut=%.3f GeV, fTimeCut=%e s,fTimeMin=%e s,fTimeMax=%e s",
389 fECAClusteringThreshold,fECAW0,fMinECut,fToUnfold,fECALocMaxCut,fTimeCut, fTimeMin, fTimeMax));
390
391 if (fToUnfold) {
392 Int_t i=0;
393 for (i = 0; i < 8; i++) {
394 fSSPars[i] = recParam->GetSSPars(i);
395 } //end of loop over parameters
396 for (i = 0; i < 3; i++) {
397 fPar5[i] = recParam->GetPar5(i);
398 fPar6[i] = recParam->GetPar6(i);
399 } //end of loop over parameters
400
401 InitClusterUnfolding();
402
403 for (i = 0; i < 8; i++) {
404 AliDebug(1,Form("unfolding shower shape parameters: fSSPars=%f \n",fSSPars[i]));
405 }
406 for (i = 0; i < 3; i++) {
407 AliDebug(1,Form("unfolding parameter 5: fPar5=%f \n",fPar5[i]));
408 AliDebug(1,Form("unfolding parameter 6: fPar6=%f \n",fPar6[i]));
409 }
410 } // to unfold
411}
412
413//____________________________________________________________________________
414void AliEMCALClusterizer::Print(Option_t * /*option*/)const
415{
416 // Print clusterizer parameters
417
418 TString message("\n") ;
419
420 if (strcmp(GetName(),"") == 0) {
421 printf("AliEMCALClusterizer not initialized\n");
422 return;
423 }
424
425 // Print parameters
426 TString taskName(Version()) ;
427
428 printf("--------------- ");
429 printf("%s",taskName.Data()) ;
430 printf(" ");
431 printf("Clusterizing digits: ");
432 printf("\n ECA Local Maximum cut = %f", fECALocMaxCut);
433 printf("\n ECA Logarithmic weight = %f", fECAW0);
434 if (fToUnfold) {
435 printf("\nUnfolding on\n");
436 printf("Unfolding parameters: fSSpars: \n");
437 Int_t i=0;
438 for (i = 0; i < 8; i++) {
439 printf("fSSPars[%d] = %f \n", i, fSSPars[i]);
440 }
441 printf("Unfolding parameter 5 and 6: fPar5 and fPar6: \n");
442 for (i = 0; i < 3; i++) {
443 printf("fPar5[%d] = %f \n", i, fPar5[i]);
444 printf("fPar6[%d] = %f \n", i, fPar6[i]);
445 }
446 }
447 else
448 printf("\nUnfolding off\n");
449
450 printf("------------------------------------------------------------------");
451}
452
453//____________________________________________________________________________
454void AliEMCALClusterizer::PrintRecPoints(Option_t * option)
455{
456 // Prints list of RecPoints produced at the current pass of AliEMCALClusterizer
457
458 if (strstr(option,"deb")) {
459 printf("PrintRecPoints: Clusterization result:") ;
460 printf(" Found %d ECA Rec Points\n ",
461 fRecPoints->GetEntriesFast()) ;
462 }
463
464 if (strstr(option,"all")) {
465 if (strstr(option,"deb")) {
466 printf("\n-----------------------------------------------------------------------\n") ;
467 printf("Clusters in ECAL section\n") ;
468 printf("Index Ene(GeV) Multi Module GX GY GZ lX lY lZ Dispersion Lambda 1 Lambda 2 # of prim Primaries list\n") ;
469 }
470 Int_t index;
471 for (index = 0 ; index < fRecPoints->GetEntries() ; index++) {
472 AliEMCALRecPoint * rp = dynamic_cast<AliEMCALRecPoint * >(fRecPoints->At(index)) ;
473 if (!rp)
474 continue;
475
476 TVector3 globalpos;
477 //rp->GetGlobalPosition(globalpos);
478 TVector3 localpos;
479 rp->GetLocalPosition(localpos);
480 Float_t lambda[2];
481 rp->GetElipsAxis(lambda);
482
483 Int_t nprimaries=0;
484 Int_t * primaries = rp->GetPrimaries(nprimaries);
485 if(strstr(option,"deb"))
486 printf("\n%6d %8.4f %3d %4.1f %4.1f %4.1f %4.1f %4.1f %4.1f %4.1f %4f %4f %2d : ",
487 rp->GetIndexInList(), rp->GetEnergy(), rp->GetMultiplicity(),
488 globalpos.X(), globalpos.Y(), globalpos.Z(), localpos.X(), localpos.Y(), localpos.Z(),
489 rp->GetDispersion(), lambda[0], lambda[1], nprimaries) ;
490 if(strstr(option,"deb")){
491 for (Int_t iprimary=0; iprimary<nprimaries; iprimary++) {
492 printf("%d ", primaries[iprimary] ) ;
493 }
494 }
495 }
496
497 if(strstr(option,"deb"))
498 printf("\n-----------------------------------------------------------------------\n");
499 }
500}
501
502//___________________________________________________________________
503void AliEMCALClusterizer::PrintRecoInfo()
504{
505 // Print reco version
506
507 printf(" AliEMCALClusterizer::PrintRecoInfo() : version %s \n", Version() );
508}
509
510//____________________________________________________________________________
511void AliEMCALClusterizer::SetInput(TTree *digitsTree)
512{
513 // Read the digits from the input tree
514
515 TBranch *branch = digitsTree->GetBranch("EMCAL");
516 if (!branch) {
517 AliError("can't get the branch with the EMCAL digits !");
518 return;
519 }
520 if (!fDigitsArr)
521 fDigitsArr = new TClonesArray("AliEMCALDigit",100);
522 branch->SetAddress(&fDigitsArr);
523 branch->GetEntry(0);
524}
525
526//____________________________________________________________________________
527void AliEMCALClusterizer::SetOutput(TTree *clustersTree)
528{
529 // Read the digits from the input tree
530
531 AliDebug(9, "Making array for EMCAL clusters");
532 fRecPoints = new TObjArray(1000);
533 if (clustersTree) {
534 fTreeR = clustersTree;
535 Int_t split = 0;
536 Int_t bufsize = 32000;
537 fTreeR->Branch("EMCALECARP", "TObjArray", &fRecPoints, bufsize, split);
538 }
539}
540
541//___________________________________________________________________
542void AliEMCALClusterizer::SetInputCalibrated(Bool_t val)
543{
544 // Flag to indicate that input is calibrated - the case when we run already on ESD
545
546 fIsInputCalibrated = val;
547}
548
549//___________________________________________________________________
550void AliEMCALClusterizer::SetJustClusters(Bool_t val)
551{
552 // Flag to indicate that we are running on ESDs, when calling
553 // rp->EvalAll(fECAW0,fDigitsArr,fJustClusters); in derived classes
554
555 fJustClusters = val;
556}