1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 //_________________________________________________________________________
17 // Class utility for Calorimeter specific selection methods ///
21 //-- Author: Gustavo Conesa (LPSC-Grenoble)
22 //////////////////////////////////////////////////////////////////////////////
25 // --- ROOT system ---
26 #include "TGeoManager.h"
28 // --- ANALYSIS system ---
29 #include "AliCalorimeterUtils.h"
30 #include "AliESDEvent.h"
31 #include "AliMCEvent.h"
33 #include "AliAODPWG4Particle.h"
34 #include "AliVCluster.h"
35 #include "AliVCaloCells.h"
36 #include "AliMixedEvent.h"
39 #include "AliEMCALGeometry.h"
40 #include "AliPHOSGeoUtils.h"
42 ClassImp(AliCalorimeterUtils)
45 //____________________________________________
46 AliCalorimeterUtils::AliCalorimeterUtils() :
48 fEMCALGeoName("EMCAL_COMPLETE12SMV1"),
49 fPHOSGeoName ("PHOSgeo"),
50 fEMCALGeo(0x0), fPHOSGeo(0x0),
51 fEMCALGeoMatrixSet(kFALSE), fPHOSGeoMatrixSet(kFALSE),
52 fLoadEMCALMatrices(kFALSE), fLoadPHOSMatrices(kFALSE),
53 fRemoveBadChannels(kFALSE), fPHOSBadChannelMap(0x0),
54 fNCellsFromPHOSBorder(0),
55 fNMaskCellColumns(0), fMaskCellColumns(0x0),
56 fRecalibration(kFALSE), fPHOSRecalibrationFactors(),
57 fEMCALRecoUtils(new AliEMCALRecoUtils),
58 fRecalculatePosition(kFALSE), fCorrectELinearity(kFALSE),
59 fRecalculateMatching(kFALSE),
61 fCutEta(20), fCutPhi(20)
65 //Initialize parameters
67 for(Int_t i = 0; i < 12; i++) fEMCALMatrix[i] = 0 ;
68 for(Int_t i = 0; i < 5 ; i++) fPHOSMatrix [i] = 0 ;
72 //_________________________________________
73 AliCalorimeterUtils::~AliCalorimeterUtils()
77 //if(fPHOSGeo) delete fPHOSGeo ;
78 if(fEMCALGeo) delete fEMCALGeo ;
80 if(fPHOSBadChannelMap) {
81 fPHOSBadChannelMap->Clear();
82 delete fPHOSBadChannelMap;
85 if(fPHOSRecalibrationFactors) {
86 fPHOSRecalibrationFactors->Clear();
87 delete fPHOSRecalibrationFactors;
90 if(fEMCALRecoUtils) delete fEMCALRecoUtils ;
91 if(fNMaskCellColumns) delete [] fMaskCellColumns;
95 //_____________________________________________________________________________________
96 Bool_t AliCalorimeterUtils::CheckCellFiducialRegion(AliVCluster* cluster,
98 AliVEvent * event, Int_t iev) const
101 // Given the list of AbsId of the cluster, get the maximum cell and
102 // check if there are fNCellsFromBorder from the calorimeter border
104 //If the distance to the border is 0 or negative just exit accept all clusters
105 if(cells->GetType()==AliVCaloCells::kEMCALCell && fEMCALRecoUtils->GetNumberOfCellsFromEMCALBorder() <= 0 ) return kTRUE;
106 if(cells->GetType()==AliVCaloCells::kPHOSCell && fNCellsFromPHOSBorder <= 0 ) return kTRUE;
111 AliMixedEvent * mixEvent = dynamic_cast<AliMixedEvent*> (event);
112 Int_t nMixedEvents = 0 ;
113 Int_t * cellsCumul = NULL ;
114 Int_t numberOfCells = 0 ;
116 nMixedEvents = mixEvent->GetNumberOfEvents() ;
117 if (cells->GetType()==AliVCaloCells::kEMCALCell) {
118 cellsCumul = mixEvent->GetEMCALCellsCumul() ;
119 numberOfCells = mixEvent->GetNumberOfEMCALCells() ;
122 else if (cells->GetType()==AliVCaloCells::kPHOSCell) {
123 cellsCumul = mixEvent->GetPHOSCellsCumul() ;
124 numberOfCells = mixEvent->GetNumberOfPHOSCells() ;
129 Int_t startCell = cellsCumul[iev] ;
130 Int_t endCell = (iev+1 < nMixedEvents)?cellsCumul[iev+1]:numberOfCells;
131 //Find cells with maximum amplitude
132 for(Int_t i = 0; i < cluster->GetNCells() ; i++){
133 Int_t absId = cluster->GetCellAbsId(i) ;
134 for (Int_t j = startCell; j < endCell ; j++) {
138 cells->GetCell(j, cellNumber, amp, time) ;
139 if (absId == cellNumber) {
146 }//loop on cluster cells
147 }// cells cumul available
149 printf("AliCalorimeterUtils::CheckCellFiducialRegion() - CellsCumul is NULL!!!\n");
152 } else {//Normal SE Events
153 for(Int_t i = 0; i < cluster->GetNCells() ; i++){
154 Int_t absId = cluster->GetCellAbsId(i) ;
155 Float_t amp = cells->GetCellAmplitude(absId);
164 printf("AliCalorimeterUtils::CheckCellFiducialRegion() - Cluster Max AbsId %d, Cell Energy %2.2f, Cluster Energy %2.2f\n",
165 absIdMax, ampMax, cluster->E());
167 if(absIdMax==-1) return kFALSE;
169 //Check if the cell is close to the borders:
170 Bool_t okrow = kFALSE;
171 Bool_t okcol = kFALSE;
173 if(cells->GetType()==AliVCaloCells::kEMCALCell){
175 Int_t iTower = -1, iIphi = -1, iIeta = -1, iphi = -1, ieta = -1, iSM = -1;
176 fEMCALGeo->GetCellIndex(absIdMax,iSM,iTower,iIphi,iIeta);
177 fEMCALGeo->GetCellPhiEtaIndexInSModule(iSM,iTower,iIphi, iIeta,iphi,ieta);
178 if(iSM < 0 || iphi < 0 || ieta < 0 ) {
179 Fatal("CheckCellFidutialRegion","Negative value for super module: %d, or cell ieta: %d, or cell iphi: %d, check EMCAL geometry name\n",iSM,ieta,iphi);
183 Int_t nborder = fEMCALRecoUtils->GetNumberOfCellsFromEMCALBorder();
185 if(iphi >= nborder && iphi < 24-nborder) okrow =kTRUE;
188 if(iphi >= nborder && iphi < 12-nborder) okrow =kTRUE;
192 if(!fEMCALRecoUtils->IsEMCALNoBorderAtEta0()){
193 if(ieta > nborder && ieta < 48-nborder) okcol =kTRUE;
197 if(ieta >= nborder) okcol = kTRUE;
200 if(ieta < 48-nborder) okcol = kTRUE;
205 printf("AliCalorimeterUtils::CheckCellFiducialRegion() - EMCAL Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ?",
206 nborder, ieta, iphi, iSM);
207 if (okcol && okrow ) printf(" YES \n");
208 else printf(" NO: column ok? %d, row ok? %d \n",okcol,okrow);
211 else if(cells->GetType()==AliVCaloCells::kPHOSCell){
213 Int_t irow = -1, icol = -1;
214 fPHOSGeo->AbsToRelNumbering(absIdMax,relId);
218 if(irow >= fNCellsFromPHOSBorder && irow < 64-fNCellsFromPHOSBorder) okrow =kTRUE;
219 if(icol >= fNCellsFromPHOSBorder && icol < 56-fNCellsFromPHOSBorder) okcol =kTRUE;
222 printf("AliCalorimeterUtils::CheckCellFiducialRegion() - PHOS Cluster in %d cells fiducial volume: icol %d, irow %d, Module %d?",
223 fNCellsFromPHOSBorder, icol, irow, relId[0]-1);
224 if (okcol && okrow ) printf(" YES \n");
225 else printf(" NO: column ok? %d, row ok? %d \n",okcol,okrow);
229 if (okcol && okrow) return kTRUE;
234 //_________________________________________________________________________________________________________
235 Bool_t AliCalorimeterUtils::ClusterContainsBadChannel(TString calorimeter,UShort_t* cellList, Int_t nCells)
237 // Check that in the cluster cells, there is no bad channel of those stored
238 // in fEMCALBadChannelMap or fPHOSBadChannelMap
240 if (!fRemoveBadChannels) return kFALSE;
241 //printf("fEMCALBadChannelMap %p, fPHOSBadChannelMap %p \n",fEMCALBadChannelMap,fPHOSBadChannelMap);
242 if(calorimeter == "EMCAL" && !fEMCALRecoUtils->GetEMCALChannelStatusMap(0)) return kFALSE;
243 if(calorimeter == "PHOS" && !fPHOSBadChannelMap) return kFALSE;
248 for(Int_t iCell = 0; iCell<nCells; iCell++){
250 //Get the column and row
251 if(calorimeter == "EMCAL"){
252 return fEMCALRecoUtils->ClusterContainsBadChannel((AliEMCALGeometry*)fEMCALGeo,cellList,nCells);
254 else if(calorimeter=="PHOS"){
256 fPHOSGeo->AbsToRelNumbering(cellList[iCell],relId);
260 if(fPHOSBadChannelMap->GetEntries() <= imod)continue;
261 //printf("PHOS bad channels imod %d, icol %d, irow %d\n",imod, irow, icol);
262 if(GetPHOSChannelStatus(imod, irow, icol)) return kTRUE;
266 }// cell cluster loop
272 //_______________________________________________________________
273 void AliCalorimeterUtils::CorrectClusterEnergy(AliVCluster *clus)
275 // Correct cluster energy non linearity
277 clus->SetE(fEMCALRecoUtils->CorrectClusterEnergyLinearity(clus));
281 //________________________________________________________________________________________
282 Int_t AliCalorimeterUtils::GetMaxEnergyCell(AliVCaloCells* cells, const AliVCluster* clu,
283 Float_t & clusterFraction) const
286 //For a given CaloCluster gets the absId of the cell
287 //with maximum energy deposit.
289 if( !clu || !cells ){
290 AliInfo("Cluster or cells pointer is null!");
297 Float_t fraction = 1.;
298 Float_t recalFactor = 1.;
299 Int_t cellAbsId =-1 , absId =-1 ;
300 Int_t iSupMod =-1 , ieta =-1 , iphi = -1, iRCU = -1;
302 TString calo = "EMCAL";
303 if(clu->IsPHOS()) calo = "PHOS";
305 for (Int_t iDig=0; iDig< clu->GetNCells(); iDig++) {
307 cellAbsId = clu->GetCellAbsId(iDig);
309 fraction = clu->GetCellAmplitudeFraction(iDig);
310 if(fraction < 1e-4) fraction = 1.; // in case unfolding is off
312 iSupMod = GetModuleNumberCellIndexes(cellAbsId, calo, ieta, iphi, iRCU);
314 if(IsRecalibrationOn()) {
315 if(calo=="EMCAL") recalFactor = GetEMCALChannelRecalibrationFactor(iSupMod,ieta,iphi);
316 else recalFactor = GetPHOSChannelRecalibrationFactor (iSupMod,iphi,ieta);
319 eCell = cells->GetCellAmplitude(cellAbsId)*fraction*recalFactor;
330 clusterFraction = (eTot-eMax)/eTot; //Do not use cluster energy in case it was corrected for non linearity.
336 //__________________________________________________________________________
337 AliVTrack * AliCalorimeterUtils::GetMatchedTrack(const AliVCluster* cluster,
338 const AliVEvent* event,
339 const Int_t index) const
341 // Get the matched track given its index, usually just the first match
342 // Since it is different for ESDs and AODs here it is a wrap method to do it
344 AliVTrack *track = 0;
346 // EMCAL case only when matching is recalculated
347 if(cluster->IsEMCAL() && IsRecalculationOfClusterTrackMatchingOn())
349 Int_t trackIndex = fEMCALRecoUtils->GetMatchedTrackIndex(cluster->GetID());
350 //printf("track index %d, cluster ID %d \n ",trackIndex,cluster->GetID());
354 printf("AliCalorimeterUtils::GetMatchedTrack() - Wrong track index %d, from recalculation\n", trackIndex);
358 track = dynamic_cast<AliVTrack*> (event->GetTrack(trackIndex));
365 // Normal case, get info from ESD or AOD
367 if(!strcmp("AliESDCaloCluster",Form("%s",cluster->ClassName())))
369 Int_t iESDtrack = cluster->GetTrackMatchedIndex();
373 printf("AliCalorimeterUtils::GetMatchedTrack() - Wrong track index %d\n", index);
377 track = dynamic_cast<AliVTrack*> (event->GetTrack(iESDtrack));
382 if(cluster->GetNTracksMatched() > 0 )
383 track = dynamic_cast<AliVTrack*>(cluster->GetTrackMatched(index));
390 //_____________________________________________________________________________________________________
391 Int_t AliCalorimeterUtils::GetModuleNumber(AliAODPWG4Particle * particle, AliVEvent * inputEvent) const
393 //Get the EMCAL/PHOS module number that corresponds to this particle
396 if(particle->GetDetector()=="EMCAL"){
397 fEMCALGeo->GetAbsCellIdFromEtaPhi(particle->Eta(),particle->Phi(), absId);
399 printf("AliCalorimeterUtils::GetModuleNumber(PWG4AOD) - EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d\n",
400 particle->Eta(), particle->Phi()*TMath::RadToDeg(),absId, fEMCALGeo->GetSuperModuleNumber(absId));
401 return fEMCALGeo->GetSuperModuleNumber(absId) ;
403 else if(particle->GetDetector()=="PHOS"){
404 // In case we use the MC reader, the input are TParticles,
405 // in this case use the corresponing method in PHOS Geometry to get the particle.
406 if(strcmp(inputEvent->ClassName(), "AliMCEvent") == 0 )
409 Double_t z = 0., x=0.;
410 TParticle* primary = 0x0;
411 AliStack * stack = ((AliMCEvent*)inputEvent)->Stack();
413 primary = stack->Particle(particle->GetCaloLabel(0));
416 Fatal("GetModuleNumber(PWG4AOD)", "Stack not available, stop!");
420 fPHOSGeo->ImpactOnEmc(primary,mod,z,x) ;
423 Fatal("GetModuleNumber(PWG4AOD)", "Primary not available, stop!");
427 // Input are ESDs or AODs, get the PHOS module number like this.
430 //AliVCluster *cluster = inputEvent->GetCaloCluster(particle->GetCaloLabel(0));
431 //return GetModuleNumber(cluster);
440 //_____________________________________________________________________
441 Int_t AliCalorimeterUtils::GetModuleNumber(AliVCluster * cluster) const
443 //Get the EMCAL/PHOS module number that corresponds to this cluster
445 Double_t v[]={0.,0.,0.}; //not necessary to pass the real vertex.
447 if(fDebug > 1) printf("AliCalorimeterUtils::GetModuleNumber() - NUL Cluster, please check!!!");
450 cluster->GetMomentum(lv,v);
451 Float_t phi = lv.Phi();
452 if(phi < 0) phi+=TMath::TwoPi();
454 if(cluster->IsEMCAL()){
455 fEMCALGeo->GetAbsCellIdFromEtaPhi(lv.Eta(),phi, absId);
457 printf("AliCalorimeterUtils::GetModuleNumber() - EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d\n",
458 lv.Eta(), phi*TMath::RadToDeg(),absId, fEMCALGeo->GetSuperModuleNumber(absId));
459 return fEMCALGeo->GetSuperModuleNumber(absId) ;
461 else if(cluster->IsPHOS()) {
463 if ( cluster->GetNCells() > 0) {
464 absId = cluster->GetCellAbsId(0);
466 printf("AliCalorimeterUtils::GetModuleNumber() - PHOS: cluster eta %f, phi %f, e %f, absId %d\n",
467 lv.Eta(), phi*TMath::RadToDeg(), lv.E(), absId);
472 fPHOSGeo->AbsToRelNumbering(absId,relId);
474 printf("AliCalorimeterUtils::GetModuleNumber() - PHOS: Module %d\n",relId[0]-1);
483 //___________________________________________________________________________________________________
484 Int_t AliCalorimeterUtils::GetModuleNumberCellIndexes(const Int_t absId, const TString calo,
485 Int_t & icol, Int_t & irow, Int_t & iRCU) const
487 //Get the EMCAL/PHOS module, columns, row and RCU number that corresponds to this absId
491 Int_t iTower = -1, iIphi = -1, iIeta = -1;
492 fEMCALGeo->GetCellIndex(absId,imod,iTower,iIphi,iIeta);
493 fEMCALGeo->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,irow,icol);
494 if(imod < 0 || irow < 0 || icol < 0 ) {
495 Fatal("GetModuleNumberCellIndexes()","Negative value for super module: %d, or cell icol: %d, or cell irow: %d, check EMCAL geometry name\n",imod,icol,irow);
499 if (0<=irow&&irow<8) iRCU=0; // first cable row
500 else if (8<=irow&&irow<16 && 0<=icol&&icol<24) iRCU=0; // first half;
503 else if(8<=irow&&irow<16 && 24<=icol&&icol<48) iRCU=1; // second half;
505 else if(16<=irow&&irow<24) iRCU=1; // third cable row
507 if (imod%2==1) iRCU = 1 - iRCU; // swap for odd=C side, to allow us to cable both sides the same
509 Fatal("GetModuleNumberCellIndexes()","Wrong EMCAL RCU number = %d\n", iRCU);
516 fPHOSGeo->AbsToRelNumbering(absId,relId);
520 iRCU= (Int_t)(relId[2]-1)/16 ;
521 //Int_t iBranch= (Int_t)(relid[3]-1)/28 ; //0 to 1
523 Fatal("GetModuleNumberCellIndexes()","Wrong PHOS RCU number = %d\n", iRCU);
532 //________________________________________
533 void AliCalorimeterUtils::InitParameters()
535 //Initialize the parameters of the analysis.
536 fEMCALGeoName = "EMCAL_COMPLETEV1";
537 fPHOSGeoName = "PHOSgeo";
538 fEMCALGeoMatrixSet = kFALSE;
539 fPHOSGeoMatrixSet = kFALSE;
540 fRemoveBadChannels = kFALSE;
541 fNCellsFromPHOSBorder = 0;
543 // fMaskCellColumns = new Int_t[fNMaskCellColumns];
544 // fMaskCellColumns[0] = 6 ; fMaskCellColumns[1] = 7 ; fMaskCellColumns[2] = 8 ;
545 // fMaskCellColumns[3] = 35; fMaskCellColumns[4] = 36; fMaskCellColumns[5] = 37;
546 // fMaskCellColumns[6] = 12+AliEMCALGeoParams::fgkEMCALCols; fMaskCellColumns[7] = 13+AliEMCALGeoParams::fgkEMCALCols;
547 // fMaskCellColumns[8] = 40+AliEMCALGeoParams::fgkEMCALCols; fMaskCellColumns[9] = 41+AliEMCALGeoParams::fgkEMCALCols;
548 // fMaskCellColumns[10]= 42+AliEMCALGeoParams::fgkEMCALCols;
553 //_____________________________________________________
554 void AliCalorimeterUtils::InitPHOSBadChannelStatusMap()
556 //Init PHOS bad channels map
557 if(fDebug > 0 )printf("AliCalorimeterUtils::InitPHOSBadChannelStatusMap()\n");
558 //In order to avoid rewriting the same histograms
559 Bool_t oldStatus = TH1::AddDirectoryStatus();
560 TH1::AddDirectory(kFALSE);
562 fPHOSBadChannelMap = new TObjArray(5);
563 for (int i = 0; i < 5; i++)fPHOSBadChannelMap->Add(new TH2I(Form("PHOS_BadMap_mod%d",i),Form("PHOS_BadMap_mod%d",i), 64, 0, 64, 56, 0, 56));
565 fPHOSBadChannelMap->SetOwner(kTRUE);
566 fPHOSBadChannelMap->Compress();
568 //In order to avoid rewriting the same histograms
569 TH1::AddDirectory(oldStatus);
572 //______________________________________________________
573 void AliCalorimeterUtils::InitPHOSRecalibrationFactors()
575 //Init EMCAL recalibration factors
576 if(fDebug > 0 )printf("AliCalorimeterUtils::InitPHOSRecalibrationFactors()\n");
577 //In order to avoid rewriting the same histograms
578 Bool_t oldStatus = TH1::AddDirectoryStatus();
579 TH1::AddDirectory(kFALSE);
581 fPHOSRecalibrationFactors = new TObjArray(5);
582 for (int i = 0; i < 5; i++)fPHOSRecalibrationFactors->Add(new TH2F(Form("PHOSRecalFactors_Mod%d",i),Form("PHOSRecalFactors_Mod%d",i), 64, 0, 64, 56, 0, 56));
583 //Init the histograms with 1
584 for (Int_t m = 0; m < 5; m++) {
585 for (Int_t i = 0; i < 56; i++) {
586 for (Int_t j = 0; j < 64; j++) {
587 SetPHOSChannelRecalibrationFactor(m,j,i,1.);
591 fPHOSRecalibrationFactors->SetOwner(kTRUE);
592 fPHOSRecalibrationFactors->Compress();
594 //In order to avoid rewriting the same histograms
595 TH1::AddDirectory(oldStatus);
599 //___________________________________________
600 void AliCalorimeterUtils::InitEMCALGeometry()
602 //Initialize EMCAL geometry if it did not exist previously
604 fEMCALGeo = AliEMCALGeometry::GetInstance(fEMCALGeoName);
606 printf("AliCalorimeterUtils::InitEMCALGeometry()");
607 if (!gGeoManager) printf(" - Careful!, gGeoManager not loaded, load misalign matrices");
613 //__________________________________________
614 void AliCalorimeterUtils::InitPHOSGeometry()
616 //Initialize PHOS geometry if it did not exist previously
618 fPHOSGeo = new AliPHOSGeoUtils(fPHOSGeoName);
620 printf("AliCalorimeterUtils::InitPHOSGeometry()");
621 if (!gGeoManager) printf(" - Careful!, gGeoManager not loaded, load misalign matrices");
627 //_________________________________________________________
628 void AliCalorimeterUtils::Print(const Option_t * opt) const
631 //Print some relevant parameters set for the analysis
635 printf("***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
636 printf("Remove Clusters with bad channels? %d\n",fRemoveBadChannels);
637 printf("Remove Clusters with max cell at less than %d cells from EMCAL border and %d cells from PHOS border\n",
638 fEMCALRecoUtils->GetNumberOfCellsFromEMCALBorder(), fNCellsFromPHOSBorder);
639 if(fEMCALRecoUtils->IsEMCALNoBorderAtEta0()) printf("Do not remove EMCAL clusters at Eta = 0\n");
640 printf("Recalibrate Clusters? %d\n",fRecalibration);
641 printf("Recalculate Clusters Position? %d\n",fRecalculatePosition);
642 printf("Recalculate Clusters Energy? %d\n",fCorrectELinearity);
643 printf("Matching criteria: dR < %2.2f[cm], dZ < %2.2f[cm]\n",fCutR,fCutZ);
648 //__________________________________________________________________
649 Bool_t AliCalorimeterUtils::MaskFrameCluster(const Int_t iSM,
650 const Int_t ieta) const
652 //Check if cell is in one of the regions where we have significant amount
653 //of material in front. Only EMCAL
656 if(iSM%2) icol+=48; // Impair SM, shift index [0-47] to [48-96]
658 if (fNMaskCellColumns && fMaskCellColumns) {
659 for (Int_t imask = 0; imask < fNMaskCellColumns; imask++) {
660 if(icol==fMaskCellColumns[imask]) return kTRUE;
669 //__________________________________________________________________________
670 Float_t AliCalorimeterUtils::RecalibrateClusterEnergy(AliVCluster * cluster,
671 AliVCaloCells * cells)
673 // Recalibrate the cluster energy, considering the recalibration map and the energy of the cells that compose the cluster.
675 //Initialize some used variables
678 Int_t icol = -1, irow = -1, iRCU = -1, module=1;
679 Float_t factor = 1, frac = 0;
683 //Get the cluster number of cells and list of absId, check what kind of cluster do we have.
684 UShort_t * index = cluster->GetCellsAbsId() ;
685 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
686 Int_t ncells = cluster->GetNCells();
687 TString calo = "EMCAL";
688 if(cluster->IsPHOS()) calo = "PHOS";
690 //Loop on the cells, get the cell amplitude and recalibration factor, multiply and and to the new energy
691 for(Int_t icell = 0; icell < ncells; icell++){
692 absId = index[icell];
693 frac = fraction[icell];
694 if(frac < 1e-3) frac = 1; //in case of EMCAL, this is set as 0, not used.
695 module = GetModuleNumberCellIndexes(absId,calo,icol,irow,iRCU);
696 if(cluster->IsPHOS()) factor = GetPHOSChannelRecalibrationFactor (module,irow,icol);
697 else factor = GetEMCALChannelRecalibrationFactor(module,icol,irow);
699 printf("AliCalorimeterUtils::RecalibrateClusterEnergy() - recalibrate cell: %s, module %d, col %d, row %d, cell fraction %f, recalibration factor %f, cell energy %f\n",
700 calo.Data(),module,icol,irow,frac,factor,cells->GetCellAmplitude(absId));
702 energy += cells->GetCellAmplitude(absId)*factor*frac;
706 printf("AliCalorimeterUtils::RecalibrateClusterEnergy() - Energy before %f, after %f\n",cluster->E(),energy);
710 Fatal("RecalibrateClusterEnergy()","Cells pointer does not exist!");
716 //________________________________________________________________________________
717 void AliCalorimeterUtils::SetGeometryTransformationMatrices(AliVEvent* inputEvent)
719 //Set the calorimeters transformation matrices
721 //Get the EMCAL transformation geometry matrices from ESD
722 if(!fEMCALGeoMatrixSet && fEMCALGeo){
723 if(fLoadEMCALMatrices){
724 printf("AliCalorimeterUtils::SetGeometryTransformationMatrices() - Load user defined EMCAL geometry matrices\n");
725 for(Int_t mod=0; mod < (fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
726 if(fEMCALMatrix[mod]){
728 fEMCALMatrix[mod]->Print();
729 fEMCALGeo->SetMisalMatrix(fEMCALMatrix[mod],mod) ;
732 fEMCALGeoMatrixSet = kTRUE;//At least one, so good
735 else if (!gGeoManager) {
738 printf(" AliCalorimeterUtils::SetGeometryTransformationMatrices() - Load EMCAL misalignment matrices. \n");
739 if(!strcmp(inputEvent->GetName(),"AliESDEvent")) {
740 for(Int_t mod=0; mod < (fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
741 //printf("Load ESD matrix %d, %p\n",mod,((AliESDEvent*)inputEvent)->GetEMCALMatrix(mod));
742 if(((AliESDEvent*)inputEvent)->GetEMCALMatrix(mod)) {
743 fEMCALGeo->SetMisalMatrix(((AliESDEvent*)inputEvent)->GetEMCALMatrix(mod),mod) ;
745 }// loop over super modules
747 fEMCALGeoMatrixSet = kTRUE;//At least one, so good
752 printf("AliCalorimeterUtils::SetGeometryTransformationMatrices() - Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file\n");
754 }//Get matrix from data
755 else if(gGeoManager){
756 fEMCALGeoMatrixSet = kTRUE;
758 }//EMCAL geo && no geoManager
760 //Get the PHOS transformation geometry matrices from ESD
761 if(!fPHOSGeoMatrixSet && fPHOSGeo){
763 if(fLoadPHOSMatrices){
764 printf("AliCalorimeterUtils::SetGeometryTransformationMatrices() - Load user defined PHOS geometry matrices\n");
765 for(Int_t mod = 0 ; mod < 5 ; mod++){
766 if(fPHOSMatrix[mod]){
768 fPHOSMatrix[mod]->Print();
769 fPHOSGeo->SetMisalMatrix(fPHOSMatrix[mod],mod) ;
772 fPHOSGeoMatrixSet = kTRUE;//At least one, so good
775 else if (!gGeoManager) {
777 printf(" AliCalorimeterUtils::SetGeometryTransformationMatrices() - Load PHOS misalignment matrices. \n");
778 if(!strcmp(inputEvent->GetName(),"AliESDEvent")) {
779 for(Int_t mod = 0; mod < 5; mod++){
780 if( ((AliESDEvent*)inputEvent)->GetPHOSMatrix(mod)) {
781 //printf("PHOS: mod %d, matrix %p\n",mod, ((AliESDEvent*)inputEvent)->GetPHOSMatrix(mod));
782 fPHOSGeo->SetMisalMatrix( ((AliESDEvent*)inputEvent)->GetPHOSMatrix(mod),mod) ;
784 }// loop over modules
785 fPHOSGeoMatrixSet = kTRUE; //At least one so good
789 printf("AliCalorimeterUtils::SetGeometryTransformationMatrices() - Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file\n");
791 }// get matrix from data
792 else if(gGeoManager){
793 fPHOSGeoMatrixSet = kTRUE;
795 }//PHOS geo and geoManager was not set
799 //__________________________________________________________________________________________
800 void AliCalorimeterUtils::RecalculateClusterPosition(AliVCaloCells* cells, AliVCluster* clu)
803 //Recalculate EMCAL cluster position
805 fEMCALRecoUtils->RecalculateClusterPosition((AliEMCALGeometry*)fEMCALGeo, cells,clu);
809 //________________________________________________________________________________
810 void AliCalorimeterUtils::RecalculateClusterTrackMatching(AliVEvent * event,
811 TObjArray* clusterArray)
813 //Recalculate track matching
815 if (fRecalculateMatching) {
816 fEMCALRecoUtils->FindMatches(event,clusterArray,fEMCALGeo) ;
817 //AliESDEvent* esdevent = dynamic_cast<AliESDEvent*> (event);
819 // fEMCALRecoUtils->SetClusterMatchedToTrack(esdevent) ;
820 // fEMCALRecoUtils->SetTracksMatchedToCluster(esdevent) ;