17 #include <TGeoManager.h>
23 #include <TParticle.h>
27 #include "AliESDEvent.h"
28 #include "AliMCEvent.h"
30 #include "AliAODPWG4Particle.h"
31 #include "AliVCluster.h"
32 #include "AliVCaloCells.h"
33 #include "AliAODCaloCluster.h"
34 #include "AliOADBContainer.h"
35 #include "AliAnalysisManager.h"
36 #include "AliAODMCParticle.h"
40 #include "AliEMCALGeometry.h"
41 #include "AliPHOSGeoUtils.h"
57 fEMCALGeo(0x0), fPHOSGeo(0x0),
58 fEMCALGeoMatrixSet(kFALSE), fPHOSGeoMatrixSet(kFALSE),
59 fLoadEMCALMatrices(kFALSE), fLoadPHOSMatrices(kFALSE),
60 fRemoveBadChannels(kFALSE), fPHOSBadChannelMap(0x0),
61 fNCellsFromPHOSBorder(0),
62 fNMaskCellColumns(0), fMaskCellColumns(0x0),
63 fRecalibration(kFALSE), fRunDependentCorrection(kFALSE),
64 fPHOSRecalibrationFactors(), fEMCALRecoUtils(new AliEMCALRecoUtils),
65 fRecalculatePosition(kFALSE), fCorrectELinearity(kFALSE),
66 fRecalculateMatching(kFALSE),
68 fCutEta(20), fCutPhi(20),
69 fLocMaxCutE(0), fLocMaxCutEDiff(0),
70 fPlotCluster(0), fOADBSet(kFALSE),
71 fOADBForEMCAL(kFALSE), fOADBForPHOS(kFALSE),
72 fOADBFilePathEMCAL(
""), fOADBFilePathPHOS(
""),
73 fImportGeometryFromFile(0), fImportGeometryFilePath(
""),
74 fNSuperModulesUsed(0), fRunNumber(0),
75 fMCECellClusFracCorrOn(0), fMCECellClusFracCorrParam()
123 Int_t nSM =
fEMCALGeo->GetNumberOfSuperModules();
128 AliOADBContainer *contBC=
new AliOADBContainer(
"");
129 contBC->InitFromFile(Form(
"%s/EMCALBadChannels.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALBadChannels");
131 TObjArray *arrayBC=(TObjArray*)contBC->GetObject(
fRunNumber);
136 AliInfo(
"Remove EMCAL bad cells");
138 for (Int_t i=0; i<nSM; ++i)
145 hbm=(TH2I*)arrayBC->FindObject(Form(
"EMCALBadChannelMap_Mod%d",i));
149 AliError(Form(
"Can not get EMCALBadChannelMap_Mod%d",i));
153 hbm->SetDirectory(0);
157 }
else AliInfo(
"Do NOT remove EMCAL bad channels\n");
165 AliOADBContainer *contRF=
new AliOADBContainer(
"");
167 contRF->InitFromFile(Form(
"%s/EMCALRecalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRecalib");
169 TObjArray *recal=(TObjArray*)contRF->GetObject(
fRunNumber);
173 TObjArray *recalpass=(TObjArray*)recal->FindObject(pass);
177 TObjArray *recalib=(TObjArray*)recalpass->FindObject(
"Recalib");
181 AliInfo(
"Recalibrate EMCAL");
182 for (Int_t i=0; i < nSM; ++i)
189 h = (TH2F*)recalib->FindObject(Form(
"EMCALRecalFactors_SM%d",i));
193 AliError(Form(
"Could not load EMCALRecalFactors_SM%d",i));
201 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params object array");
202 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for pass");
203 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for run");
214 AliOADBContainer *contRFTD=
new AliOADBContainer(
"");
216 contRFTD->InitFromFile(Form(
"%s/EMCALTemperatureCorrCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRunDepTempCalibCorrections");
218 TH1S *htd=(TH1S*)contRFTD->GetObject(
fRunNumber);
223 AliWarning(Form(
"No TemperatureCorrCalib Objects for run: %d",
fRunNumber));
227 Int_t maxEntry = contRFTD->GetNumberOfEntries();
229 while ( (ic < maxEntry) && (contRFTD->UpperLimit(ic) <
fRunNumber) )
235 Int_t closest = lower;
236 if ( (ic<maxEntry) &&
242 AliWarning(Form(
"TemperatureCorrCalib Objects found closest id %d from run: %d", closest, contRFTD->LowerLimit(closest)));
243 htd = (TH1S*) contRFTD->GetObjectByIndex(closest);
248 AliInfo(
"Recalibrate (Temperature) EMCAL");
250 for (Int_t ism=0; ism<nSM; ++ism)
252 for (Int_t icol=0; icol<48; ++icol)
254 for (Int_t irow=0; irow<24; ++irow)
258 Int_t absID =
fEMCALGeo->GetAbsCellIdFromCellIndexes(ism, irow, icol);
259 factor *= htd->GetBinContent(absID) / 10000. ;
268 }
else AliInfo(
"Do NOT recalibrate EMCAL with T variations, no params TH1");
276 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
278 contTRF->InitFromFile(Form(
"%s/EMCALTimeCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeCalib");
280 TObjArray *trecal=(TObjArray*)contTRF->GetObject(
fRunNumber);
284 TString passM = pass;
285 if(pass==
"spc_calo") passM =
"pass3";
286 TObjArray *trecalpass=(TObjArray*)trecal->FindObject(passM);
290 AliInfo(
"Time Recalibrate EMCAL");
291 for (Int_t ibc = 0; ibc < 4; ++ibc)
298 h = (TH1F*)trecalpass->FindObject(Form(
"hAllTimeAvBC%d",ibc));
302 AliError(Form(
"Could not load hAllTimeAvBC%d",ibc));
310 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for pass");
311 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for run");
318 Bool_t useDefault=kFALSE;
319 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
320 contTRF->InitFromFile(Form(
"%s/EMCALTimeL1PhaseCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeL1PhaseCalib");
321 TObjArray *trecal=(TObjArray*)contTRF->GetObject(
fRunNumber);
323 AliError(Form(
"Do NOT recalibrate time EMCAL. No params for run %d. Default used.",
fRunNumber));
324 trecal=(TObjArray*)contTRF->GetObject(0);
326 AliFatal(Form(
"No params for run %d. No default params.",
fRunNumber));
332 TString passM = pass;
333 if(useDefault) passM =
"pass1";
334 else if(pass==
"muon_calo_pass1") passM =
"muon_calo_pass1";
335 else if(pass==
"muon_calo_pass2") passM =
"muon_calo_pass2";
337 TObjArray *trecalpass=(TObjArray*)trecal->FindObject(passM);
340 AliFatal(
"No defaults params pass1.");
343 AliInfo(
"Do NOT recalibrate time EMCAL, no params for pass");
346 trecal=(TObjArray*)contTRF->GetObject(0);
348 AliFatal(Form(
"No params for run %d. No default params.",
fRunNumber));
352 trecalpass=(TObjArray*)trecal->FindObject(
"pass1");
354 AliFatal(
"No defaults params pass1.");
359 AliInfo(
"Time L1 phase Recalibrate EMCAL");
362 h = (TH1C*)trecalpass->FindObject(Form(
"h%d",
fRunNumber));
363 if (!h) AliError(Form(
"Could not load h%d",
fRunNumber));
380 AliOADBContainer badmapContainer(Form(
"phosBadMap"));
381 TString
fileName=
"$ALICE_PHYSICS/OADB/PHOS/PHOSBadMaps.root";
382 badmapContainer.InitFromFile(Form(
"%s/PHOSBadMaps.root",
fOADBFilePathPHOS.Data()),
"phosBadMap");
385 TObjArray *maps = (TObjArray*)badmapContainer.GetObject(139000,
"phosBadMap");
388 AliInfo(Form(
"Can not read PHOS bad map for run %d",
fRunNumber)) ;
392 AliInfo(Form(
"Setting PHOS bad map with name %s",maps->GetName())) ;
394 for(Int_t mod = 1; mod < 5; mod++)
401 hbmPH = (TH2I*)maps->At(mod);
403 if(hbmPH) hbmPH->SetDirectory(0);
433 AliInfo(
"Load user defined EMCAL geometry matrices");
436 AliOADBContainer emcGeoMat(
"AliEMCALgeo");
437 emcGeoMat.InitFromFile(Form(
"%s/EMCALlocal2master.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALgeo");
438 TObjArray *matEMCAL=(TObjArray*)emcGeoMat.GetObject(
fRunNumber,
"EmcalMatrices");
440 for(Int_t mod=0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
444 AliDebug(1,Form(
"EMCAL matrices SM %d, %p", mod,((TGeoHMatrix*) matEMCAL->At(mod))));
459 AliWarning(Form(
"Set matrix for SM %d from gGeoManager",mod));
460 fEMCALGeo->SetMisalMatrix(
fEMCALGeo->GetMatrixForSuperModuleFromGeoManager(mod),mod) ;
464 AliError(Form(
"Alignment atrix for SM %d is not available",mod));
471 else if (!gGeoManager)
473 AliDebug(1,
"Load EMCAL misalignment matrices");
474 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
476 for(Int_t mod = 0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
479 if(((AliESDEvent*)inputEvent)->GetEMCALMatrix(mod))
481 fEMCALGeo->SetMisalMatrix(((AliESDEvent*)inputEvent)->GetEMCALMatrix(mod),mod) ;
490 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
504 AliInfo(
"Load user defined PHOS geometry matrices");
507 AliOADBContainer geomContainer(
"phosGeo");
508 geomContainer.InitFromFile(Form(
"%s/PHOSGeometry.root",
fOADBFilePathPHOS.Data()),
"PHOSRotationMatrixes");
509 TObjArray *matPHOS = (TObjArray*)geomContainer.GetObject(139000,
"PHOSRotationMatrixes");
511 for(Int_t mod = 0 ; mod < 5 ; mod++)
515 AliDebug(1,Form(
"PHOS matrices module %d, %p",mod,((TGeoHMatrix*) matPHOS->At(mod))));
518 fPHOSMatrix[mod] = (TGeoHMatrix*) matPHOS->At(mod) ;
534 else if (!gGeoManager)
536 AliDebug(1,
"Load PHOS misalignment matrices.");
537 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
539 for(Int_t mod = 0; mod < 5; mod++)
541 if( ((AliESDEvent*)inputEvent)->GetPHOSMatrix(mod))
544 fPHOSGeo->SetMisalMatrix( ((AliESDEvent*)inputEvent)->GetPHOSMatrix(mod),mod) ;
552 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
568 Bool_t areNeighbours = kFALSE ;
570 Int_t iRCU1 = -1, irow1 = -1, icol1 = -1;
571 Int_t iRCU2 = -1, irow2 = -1, icol2 = -1;
573 Int_t rowdiff = 0, coldiff = 0;
582 if(nSupMod1%2) icol1+=AliEMCALGeoParams::fgkEMCALCols;
583 else icol2+=AliEMCALGeoParams::fgkEMCALCols;
586 rowdiff = TMath::Abs( irow1 - irow2 ) ;
587 coldiff = TMath::Abs( icol1 - icol2 ) ;
590 if ((coldiff + rowdiff == 1 ))
591 areNeighbours = kTRUE ;
593 return areNeighbours;
601 AliVCluster* cluster)
611 for(Int_t iDigit = 0; iDigit < cluster->GetNCells(); iDigit++)
614 geom->GetCellIndex(cluster->GetCellAbsId(iDigit),iSupMod,iTower,iIphi,iIeta);
615 geom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi,iIeta, iphi,ieta);
618 if (iDigit == 0 ) iSM0 = iSupMod;
619 else if(iSupMod != iSM0)
621 if(iSupMod > 11 && iSupMod < 18)
622 AliWarning(Form(
"Cluster shared in 2 DCal: SM%d, SM%d??",iSupMod,iSM0));
636 AliVCaloCells* cells)
const
640 if ( cells->GetType()==AliVCaloCells::kEMCALCell &&
fEMCALRecoUtils->GetNumberOfCellsFromEMCALBorder() <= 0 )
return kTRUE;
647 for(Int_t i = 0; i < cluster->GetNCells() ; i++)
649 Int_t absId = cluster->GetCellAbsId(i) ;
650 Float_t amp = cells->GetCellAmplitude(absId);
659 AliDebug(1,Form(
"Cluster Max AbsId %d, Cell Energy %2.2f, Cluster Energy %2.2f",
660 absIdMax, ampMax, cluster->E()));
662 if ( absIdMax == -1 )
return kFALSE;
665 Bool_t okrow = kFALSE;
666 Bool_t okcol = kFALSE;
668 if ( cells->GetType() == AliVCaloCells::kEMCALCell )
673 Int_t iTower = -1, iIphi = -1, iIeta = -1, iphi = -1, ieta = -1, iSM = -1;
675 fEMCALGeo->GetCellIndex(absIdMax,iSM,iTower,iIphi,iIeta);
677 fEMCALGeo->GetCellPhiEtaIndexInSModule(iSM,iTower,iIphi, iIeta,iphi,ieta);
679 if(iSM < 0 || iphi < 0 || ieta < 0 )
681 AliFatal(Form(
"Negative value for super module: %d, or cell ieta: %d, or cell iphi: %d, check EMCAL geometry name",iSM,ieta,iphi));
687 if ( iSM < 10 || (iSM > 11 && iSM < 18) )
689 if(iphi >= nborder && iphi < 24-nborder) okrow = kTRUE;
693 if(iphi >= nborder && iphi < 8-nborder) okrow = kTRUE;
699 if(!
fEMCALRecoUtils->IsEMCALNoBorderAtEta0() || (iSM > 11 && iSM < 18))
701 if(ieta > nborder && ieta < 48-nborder) okcol =kTRUE;
707 if(ieta >= nborder) okcol = kTRUE;
711 if(ieta < 48-nborder) okcol = kTRUE;
715 AliDebug(1,Form(
"EMCAL Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
716 nborder, ieta, iphi, iSM,okrow,okcol));
719 else if ( cells->GetType() == AliVCaloCells::kPHOSCell )
722 Int_t irow = -1, icol = -1;
723 fPHOSGeo->AbsToRelNumbering(absIdMax,relId);
725 if (relId[1] != 0 )
return kFALSE;
731 if(irow >= fNCellsFromPHOSBorder && irow < 64-fNCellsFromPHOSBorder) okrow =kTRUE;
732 if(icol >= fNCellsFromPHOSBorder && icol < 56-fNCellsFromPHOSBorder) okcol =kTRUE;
734 AliDebug(1,Form(
"PHOS Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
735 fNCellsFromPHOSBorder, icol, irow, relId[0]-1,okrow,okcol));
738 if (okcol && okrow)
return kTRUE;
757 for(Int_t iCell = 0; iCell<nCells; iCell++)
767 fPHOSGeo->AbsToRelNumbering(cellList[iCell],relId);
769 if (relId[1] != 0 )
return kTRUE;
804 Int_t & regEta, Int_t & regPhi)
const
806 regEta = regPhi = -1 ;
808 if(!clus->IsEMCAL())
return ;
810 Int_t icol = -1, irow = -1, iRCU = -1;
811 Float_t clusterFraction = 0;
818 if( sm%2 == 1) icol+=AliEMCALGeoParams::fgkEMCALCols;
821 if(icol < 2 || icol > 93 || irow < 2 || irow > 21)
return;
828 if ( icol > 9 && icol < 34 ) regEta = 0;
829 else if ( icol > 62 && icol < 87 ) regEta = 0;
833 else if ( icol <= 9 && icol >= 5 ) regEta = 3;
834 else if ( icol <= 38 && icol >= 34 ) regEta = 3;
835 else if ( icol <= 62 && icol >= 58 ) regEta = 3;
836 else if ( icol <= 91 && icol >= 87 ) regEta = 3;
840 else if ( icol < 58 && icol > 38 ) regEta = 1 ;
850 if ( irow >= 2 && irow <= 5 ) regPhi = 0;
851 else if ( irow >= 18 && irow <= 21 ) regPhi = 0;
852 else if ( irow >= 6 && irow <= 9 ) regPhi = 1;
853 else if ( irow >= 14 && irow <= 17 ) regPhi = 1;
863 Float_t & clusterFraction)
const
867 AliInfo(
"Cluster or cells pointer is null!");
874 Float_t fraction = 1.;
875 Float_t recalFactor = 1.;
876 Int_t cellAbsId =-1 , absId =-1 ;
877 Int_t iSupMod =-1 , ieta =-1 , iphi = -1, iRCU = -1;
882 for (Int_t iDig=0; iDig< clu->GetNCells(); iDig++)
884 cellAbsId = clu->GetCellAbsId(iDig);
886 fraction = clu->GetCellAmplitudeFraction(iDig);
887 if(fraction < 1e-4) fraction = 1.;
899 eCell = cells->GetCellAmplitude(cellAbsId)*fraction*recalFactor;
912 clusterFraction = (eTot-eMax)/eTot;
925 AliVEvent* event, Int_t index)
const
927 AliVTrack *track = 0x0;
934 Int_t trackIndex =
fEMCALRecoUtils->GetMatchedTrackIndex(cluster->GetID());
938 AliInfo(Form(
"Wrong track index %d, from recalculation", trackIndex));
940 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(trackIndex));
950 if( cluster->GetNTracksMatched() < 1 )
return 0x0;
956 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",cluster->ClassName())))
958 if( index >= 0 ) iTrack = index;
959 else iTrack = ((AliESDCaloCluster*)cluster)->GetTracksMatched()->At(0);
961 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(iTrack) );
965 if( index > 0 ) iTrack = index;
967 track =
dynamic_cast<AliVTrack*
>( cluster->GetTrackMatched(iTrack) );
979 if( eCluster <= 0 || eCluster < eCell )
981 AliWarning(Form(
"Bad values eCell=%f, eCluster %f",eCell,eCluster));
985 Float_t frac = eCell / eCluster;
1007 fEMCALGeo->GetAbsCellIdFromEtaPhi(particle->Eta(),particle->Phi(), absId);
1009 AliDebug(2,Form(
"EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d",
1010 particle->Eta(), particle->Phi()*TMath::RadToDeg(),absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1012 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1018 if(strcmp(inputEvent->ClassName(),
"AliMCEvent") == 0 )
1021 Double_t z = 0., x=0.;
1022 TParticle* primary = 0x0;
1023 AliStack * stack = ((AliMCEvent*)inputEvent)->Stack();
1027 primary = stack->Particle(particle->GetCaloLabel(0));
1031 AliFatal(
"Stack not available, stop!");
1036 fPHOSGeo->ImpactOnEmc(primary,mod,z,x) ;
1040 AliFatal(
"Primary not available, stop!");
1065 AliDebug(1,
"AliCalorimeterUtils::GetModuleNumber() - NUL Cluster, please check!!!");
1070 if ( cluster->GetNCells() <= 0 )
return -1;
1072 Int_t absId = cluster->GetCellAbsId(0);
1074 if ( absId < 0 )
return -1;
1076 if( cluster->IsEMCAL() )
1078 AliDebug(2,Form(
"EMCAL absid %d, SuperModule %d",absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1080 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1082 else if ( cluster->IsPHOS() )
1085 fPHOSGeo->AbsToRelNumbering(absId,relId);
1087 if (relId[1] != 0 )
return -1;
1089 AliDebug(2,Form(
"PHOS absid %d Module %d",absId, relId[0]-1));
1101 Int_t & icol, Int_t & irow, Int_t & iRCU)
const
1105 if ( absId < 0 )
return -1 ;
1109 Int_t iTower = -1, iIphi = -1, iIeta = -1;
1110 fEMCALGeo->GetCellIndex(absId,imod,iTower,iIphi,iIeta);
1111 fEMCALGeo->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,irow,icol);
1113 if(imod < 0 || irow < 0 || icol < 0 )
1115 AliFatal(Form(
"Negative value for super module: %d, or cell icol: %d, or cell irow: %d, check EMCAL geometry name",imod,icol,irow));
1122 if ( imod == 13 || imod == 15 || imod == 17 ) ico2 += 16;
1125 if(imod < 10 || (imod > 11 && imod < 18))
1128 if ( 0 <= irow && irow < 8 ) iRCU = 0;
1129 else if ( 8 <= irow && irow < 16 &&
1130 0 <= ico2 && ico2 < 24 ) iRCU = 0;
1134 else if ( 8 <= irow && irow < 16 &&
1135 24 <= ico2 && ico2 < 48 ) iRCU = 1;
1137 else if ( 16 <= irow && irow < 24 ) iRCU = 1;
1139 if ( imod%2 == 1 ) iRCU = 1 - iRCU;
1148 AliFatal(Form(
"Wrong EMCAL RCU number = %d", iRCU));
1155 fPHOSGeo->AbsToRelNumbering(absId,relId);
1157 if (relId[1] != 0 )
return -1;
1162 iRCU= (Int_t)(relId[2]-1)/16 ;
1167 AliFatal(Form(
"Wrong PHOS RCU number = %d", iRCU));
1180 Int_t & icol , Int_t & irow , Int_t & iRCU,
1181 Int_t & icolAbs, Int_t & irowAbs)
const
1193 irowAbs = irow + 64 * imod;
1204 Int_t shiftEta = 48;
1207 if ( imod > 11 && imod < 18) shiftEta+=48/3;
1209 icolAbs = (imod % 2) ? icol + shiftEta : icol;
1213 irowAbs = irow + 24 * Int_t(imod / 2);
1216 if ( imod > 11 && imod < 20) irowAbs -= (2*24 / 3);
1228 const Int_t nc = cluster->GetNCells();
1230 Int_t absIdList[nc];
1231 Float_t maxEList[nc];
1242 Int_t *absIdList, Float_t *maxEList)
1248 const Int_t nCells = cluster->GetNCells();
1252 Float_t simuTotWeight = 0;
1256 simuTotWeight/= eCluster;
1266 for(iDigit = 0; iDigit < nCells ; iDigit++)
1268 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit] ;
1269 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1278 idmax = absIdList[iDigit] ;
1285 for(iDigit = 0 ; iDigit < nCells; iDigit++)
1287 if( absIdList[iDigit] >= 0 )
1289 absId1 = cluster->GetCellsAbsId()[iDigit];
1291 Float_t en1 = cells->GetCellAmplitude(absId1);
1299 for(iDigitN = 0; iDigitN < nCells; iDigitN++)
1301 absId2 = cluster->GetCellsAbsId()[iDigitN] ;
1303 if(absId2==-1 || absId2==absId1)
continue;
1307 Float_t en2 = cells->GetCellAmplitude(absId2);
1320 absIdList[iDigitN] = -1 ;
1325 absIdList[iDigit] = -1 ;
1330 absIdList[iDigit] = -1 ;
1335 absIdList[iDigitN] = -1 ;
1346 for(iDigit = 0; iDigit < nCells; iDigit++)
1348 if( absIdList[iDigit] >= 0 )
1350 absIdList[iDigitN] = absIdList[iDigit] ;
1352 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1360 maxEList[iDigitN] = en ;
1369 AliDebug(1,Form(
"No local maxima found, assign highest energy cell as maxima, id %d, en cell %2.2f, en cluster %2.2f",
1370 idmax,emax,cluster->E()));
1372 maxEList[0] = emax ;
1373 absIdList[0] = idmax ;
1377 AliDebug(1,Form(
"In cluster E %2.2f (wth non lin. %2.2f), M02 %2.2f, M20 %2.2f, N maxima %d",
1378 cluster->E(),eCluster, cluster->GetM02(),cluster->GetM20(), iDigitN));
1393 if (!AliAnalysisManager::GetAnalysisManager()->GetTree())
1395 AliError(
"AliCalorimeterUtils::GetPass() - Pointer to tree = 0, returning null");
1399 if (!AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile())
1401 AliError(
"AliCalorimeterUtils::GetPass() - Null pointer input file, returning null");
1405 TString pass(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());
1406 if (pass.Contains(
"ass1"))
return TString(
"pass1");
1407 else if (pass.Contains(
"ass2"))
return TString(
"pass2");
1408 else if (pass.Contains(
"ass3"))
return TString(
"pass3");
1409 else if (pass.Contains(
"ass4"))
return TString(
"pass4");
1410 else if (pass.Contains(
"ass5"))
return TString(
"pass5");
1411 else if (pass.Contains(
"LHC11c") && pass.Contains(
"spc_calo") )
return TString(
"spc_calo");
1412 else if (pass.Contains(
"calo") || pass.Contains(
"high_lumi"))
1414 AliInfo(
"Path contains <calo> or <high-lumi>, set as <pass1>");
1415 return TString(
"pass1");
1419 AliInfo(
"Pass number string not found");
1471 AliDebug(1,
"Init bad channel map");
1474 Bool_t oldStatus = TH1::AddDirectoryStatus();
1475 TH1::AddDirectory(kFALSE);
1478 for (
int i = 0; i < 5; i++)
fPHOSBadChannelMap->Add(
new TH2I(Form(
"PHOS_BadMap_mod%d",i),
1479 Form(
"PHOS_BadMap_mod%d",i),
1480 64, 0, 64, 56, 0, 56));
1486 TH1::AddDirectory(oldStatus);
1494 AliDebug(1,
"Init recalibration map");
1497 Bool_t oldStatus = TH1::AddDirectoryStatus();
1498 TH1::AddDirectory(kFALSE);
1501 for (
int i = 0; i < 5; i++)
1504 Form(
"PHOSRecalFactors_Mod%d",i),
1505 64, 0, 64, 56, 0, 56));
1509 for (Int_t m = 0; m < 5; m++)
1511 for (Int_t i = 0; i < 56; i++)
1513 for (Int_t j = 0; j < 64; j++)
1524 TH1::AddDirectory(oldStatus);
1539 AliInfo(Form(
"Get EMCAL geometry name to <%s> for run %d",
fEMCALGeo->GetName(),
fRunNumber));
1544 AliInfo(Form(
"Set EMCAL geometry name to <%s>",
fEMCALGeoName.Data()));
1563 else if (!gGeoManager) AliInfo(
"Careful!, gGeoManager not loaded, load misalign matrices");
1592 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1599 Double_t x = 0, z = 0 ;
1605 Bool_t ok =
GetEMCALGeometry()->GetAbsCellIdFromEtaPhi(particle->Eta(),particle->Phi(),absID);
1608 Int_t icol = -1, irow = -1, iRCU = -1;
1611 if(status > 0) ok = kFALSE;
1630 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1634 Float_t phi = particle->Phi();
1635 if(phi < 0) phi+=TMath::TwoPi();
1640 Double_t x = 0, z = 0 ;
1641 Double_t vtx[]={ particle->Xv(), particle->Yv(), particle->Zv() } ;
1642 return GetPHOSGeometry()->ImpactOnEmc(vtx, particle->Theta(), phi, mod, z, x) ;
1647 Bool_t ok =
GetEMCALGeometry()->GetAbsCellIdFromEtaPhi(particle->Eta(),phi,absID);
1650 Int_t icol = -1, irow = -1, iRCU = -1;
1653 if(status > 0) ok = kFALSE;
1666 Float_t phiOrg, Int_t & absID)
1673 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1677 Float_t phi = phiOrg;
1678 if(phi < 0) phi+=TMath::TwoPi();
1683 Double_t x = 0, z = 0 ;
1684 Double_t vtx[]={0,0,0} ;
1692 Int_t icol = -1, irow = -1, iRCU = -1;
1695 if(status > 0) ok = kFALSE;
1711 if ( iSM%2 ) icol+=48;
1732 printf(
"***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
1734 printf(
"Remove Clusters with max cell at less than %d cells from EMCAL border and %d cells from PHOS border\n",
1736 if(
fEMCALRecoUtils->IsEMCALNoBorderAtEta0()) printf(
"Do not remove EMCAL clusters at Eta = 0\n");
1740 printf(
"Matching criteria: dR < %2.2f[cm], dZ < %2.2f[cm]\n",
fCutR,
fCutZ);
1755 Int_t icol = -1; Int_t irow = -1; Int_t iRCU = -1;
1799 AliVCaloCells * cells)
1802 Float_t frac = 0.,
energy = 0.;
1808 UShort_t * index = cluster->GetCellsAbsId() ;
1809 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
1811 Int_t ncells = cluster->GetNCells();
1817 for(Int_t icell = 0; icell < ncells; icell++)
1819 Int_t absId = index[icell];
1821 frac = fraction[icell];
1822 if(frac < 1e-3) frac = 1;
1824 Float_t amp = cells->GetCellAmplitude(absId);
1827 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy: before cal %f; after cal %f",
1828 calo,frac,cells->GetCellAmplitude(absId),amp));
1833 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
1838 AliFatal(
"Cells pointer does not exist!");
1849 AliVCaloCells * cells, Float_t energyOrg)
1852 Float_t frac = 0.,
energy = 0.;
1858 UShort_t * index = cluster->GetCellsAbsId() ;
1859 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
1861 Int_t ncells = cluster->GetNCells();
1867 for(Int_t icell = 0; icell < ncells; icell++)
1869 Int_t absId = index[icell];
1871 frac = fraction[icell];
1872 if(frac < 1e-3) frac = 1;
1874 Float_t amp = cells->GetCellAmplitude(absId);
1879 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy %f",
1880 calo,frac,cells->GetCellAmplitude(absId)));
1885 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
1889 AliFatal(
"Cells pointer does not exist!");
1912 TObjArray* clusterArray)
1921 Int_t nClusters =
event->GetNumberOfCaloClusters();
1922 if(clusterArray) nClusters = clusterArray->GetEntriesFast();
1924 AliVCluster * clus = 0;
1926 for (Int_t iclus = 0; iclus < nClusters ; iclus++)
1928 if ( clusterArray ) clus = (AliVCluster*) clusterArray->At(iclus) ;
1929 else clus =
event->GetCaloCluster(iclus) ;
1931 if (!clus->IsEMCAL())
continue ;
1938 if ( TMath::Abs(clus->GetTrackDx()) < 500 )
1939 AliDebug(2,Form(
"Residuals (Old, New): z (%2.4f,%2.4f), x (%2.4f,%2.4f)\n",
1940 clus->GetTrackDz(),dZ,clus->GetTrackDx(),dR));
1942 clus->SetTrackDistance(dR,dZ);
1947 if(clus->GetNTracksMatched() > 0)
1949 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
1951 TArrayI arrayTrackMatched(0);
1952 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
1956 for(Int_t iTrack = 0; iTrack < clus->GetNTracksMatched(); iTrack++)
1958 ((AliAODCaloCluster*)clus)->RemoveTrackMatched((TObject*)((AliAODCaloCluster*)clus)->GetTrackMatched(iTrack));
1967 if ( trackIndex >= 0 )
1969 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
1971 TArrayI arrayTrackMatched(1);
1972 arrayTrackMatched[0] = trackIndex;
1973 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
1977 ((AliAODCaloCluster*)clus)->AddTrackMatched((TObject*)event->GetTrack(trackIndex));
1999 AliVCluster* cluster,
2000 AliVCaloCells* cells,
2002 AliAODCaloCluster* cluster1,
2003 AliAODCaloCluster* cluster2,
2004 Int_t nMax, Int_t eventNumber)
2006 TH2F* hClusterMap = 0 ;
2007 TH2F* hClusterLocMax = 0 ;
2008 TH2F* hCluster1 = 0 ;
2009 TH2F* hCluster2 = 0 ;
2013 hClusterMap =
new TH2F(
"hClusterMap",
"Cluster Map",48,0,48,24,0,24);
2014 hClusterLocMax =
new TH2F(
"hClusterLocMax",
"Cluster 2 highest local maxima",48,0,48,24,0,24);
2015 hCluster1 =
new TH2F(
"hCluster1",
"Cluster 1",48,0,48,24,0,24);
2016 hCluster2 =
new TH2F(
"hCluster2",
"Cluster 2",48,0,48,24,0,24);
2017 hClusterMap ->SetXTitle(
"column");
2018 hClusterMap ->SetYTitle(
"row");
2019 hClusterLocMax ->SetXTitle(
"column");
2020 hClusterLocMax ->SetYTitle(
"row");
2021 hCluster1 ->SetXTitle(
"column");
2022 hCluster1 ->SetYTitle(
"row");
2023 hCluster2 ->SetXTitle(
"column");
2024 hCluster2 ->SetYTitle(
"row");
2028 if(cluster->IsPHOS())
2031 AliWarning(
"Not supported for PHOS yet");
2035 const Int_t ncells = cluster->GetNCells();
2036 Int_t absIdList[ncells];
2038 Float_t e1 = 0, e2 = 0 ;
2039 Int_t icol = -1, irow = -1, iRCU = -1, sm = -1;
2040 Float_t eCluster = 0;
2041 Float_t minCol = 100, minRow = 100, maxCol = -1, maxRow = -1;
2042 for(Int_t iDigit = 0; iDigit < ncells; iDigit++ )
2044 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit];
2046 Float_t ec = cells->GetCellAmplitude(absIdList[iDigit]);
2054 if(sm > -1 && sm < 12)
2056 if(icol > maxCol) maxCol = icol;
2057 if(icol < minCol) minCol = icol;
2058 if(irow > maxRow) maxRow = irow;
2059 if(irow < minRow) minRow = irow;
2060 hClusterMap->Fill(icol,irow,ec);
2067 UShort_t absIdList1[9] ;
2068 Double_t fracList1 [9] ;
2069 absIdList1[0] = absId1 ;
2070 fracList1 [0] = 1. ;
2072 Float_t ecell1 = cells->GetCellAmplitude(absId1);
2077 UShort_t absIdList2[9] ;
2078 Double_t fracList2 [9] ;
2079 absIdList2[0] = absId2 ;
2080 fracList2 [0] = 1. ;
2082 Float_t ecell2 = cells->GetCellAmplitude(absId2);
2088 Int_t icol1 = -1, irow1 = -1, icol2 = -1, irow2 = -1;
2090 hClusterLocMax->Fill(icol1,irow1,ecell1);
2092 hClusterLocMax->Fill(icol2,irow2,ecell2);
2096 Float_t eRemain = (eCluster-ecell1-ecell2)/2;
2097 Float_t shareFraction1 = ecell1/eCluster+eRemain/eCluster;
2098 Float_t shareFraction2 = ecell2/eCluster+eRemain/eCluster;
2100 for(Int_t iDigit = 0; iDigit < ncells; iDigit++)
2102 Int_t absId = absIdList[iDigit];
2104 if ( absId==absId1 || absId==absId2 || absId < 0 )
continue;
2106 Float_t ecell = cells->GetCellAmplitude(absId);
2111 absIdList1[ncells1]= absId;
2115 fracList1[ncells1] = shareFraction1;
2116 e1 += ecell*shareFraction1;
2120 fracList1[ncells1] = 1.;
2130 absIdList2[ncells2]= absId;
2134 fracList2[ncells2] = shareFraction2;
2135 e2 += ecell*shareFraction2;
2139 fracList2[ncells2] = 1.;
2148 AliDebug(1,Form(
"N Local Max %d, Cluster energy = %f, Ecell1 = %f, Ecell2 = %f, Enew1 = %f, Enew2 = %f, Remain %f, \n ncells %d, ncells1 %d, ncells2 %d, f1 %f, f2 %f, sum f12 = %f",
2149 nMax, eCluster,ecell1,ecell2,e1,e2,eCluster-e1-e2,ncells,ncells1,ncells2,shareFraction1,shareFraction2,shareFraction1+shareFraction2));
2154 cluster1->SetNCells(ncells1);
2155 cluster2->SetNCells(ncells2);
2157 cluster1->SetCellsAbsId(absIdList1);
2158 cluster2->SetCellsAbsId(absIdList2);
2160 cluster1->SetCellsAmplitudeFraction(fracList1);
2161 cluster2->SetCellsAmplitudeFraction(fracList2);
2176 for(Int_t iDigit = 0; iDigit < ncells1; iDigit++ )
2182 Float_t ecell = cells->GetCellAmplitude(absIdList1[iDigit]);
2185 if(
AreNeighbours(calorimeter, absId2,absIdList1[iDigit]) && absId1!=absIdList1[iDigit])
2186 hCluster1->Fill(icol,irow,ecell*shareFraction1);
2188 hCluster1->Fill(icol,irow,ecell);
2194 for(Int_t iDigit = 0; iDigit < ncells2; iDigit++ )
2200 Float_t ecell = cells->GetCellAmplitude(absIdList2[iDigit]);
2203 if(
AreNeighbours(calorimeter, absId1,absIdList2[iDigit]) && absId2!=absIdList2[iDigit])
2204 hCluster2->Fill(icol,irow,ecell*shareFraction2);
2206 hCluster2->Fill(icol,irow,ecell);
2210 gStyle->SetPadRightMargin(0.1);
2211 gStyle->SetPadLeftMargin(0.1);
2212 gStyle->SetOptStat(0);
2213 gStyle->SetOptFit(000000);
2215 if(maxCol-minCol > maxRow-minRow)
2217 maxRow+= maxCol-minCol;
2221 maxCol+= maxRow-minRow;
2224 TCanvas * c=
new TCanvas(
"canvas",
"canvas", 4000, 4000) ;
2230 hClusterMap ->SetAxisRange(minCol, maxCol,
"X");
2231 hClusterMap ->SetAxisRange(minRow, maxRow,
"Y");
2232 hClusterMap ->Draw(
"colz TEXT");
2237 hClusterLocMax ->SetAxisRange(minCol, maxCol,
"X");
2238 hClusterLocMax ->SetAxisRange(minRow, maxRow,
"Y");
2239 hClusterLocMax ->Draw(
"colz TEXT");
2244 hCluster1 ->SetAxisRange(minCol, maxCol,
"X");
2245 hCluster1 ->SetAxisRange(minRow, maxRow,
"Y");
2246 hCluster1 ->Draw(
"colz TEXT");
2251 hCluster2 ->SetAxisRange(minCol, maxCol,
"X");
2252 hCluster2 ->SetAxisRange(minRow, maxRow,
"Y");
2253 hCluster2 ->Draw(
"colz TEXT");
2255 if(eCluster > 6 )c->Print(Form(
"clusterFigures/Event%d_E%1.0f_nMax%d_NCell1_%d_NCell2_%d.eps",
2256 eventNumber,cluster->E(),nMax,ncells1,ncells2));
2260 delete hClusterLocMax;
Bool_t fRecalculatePosition
Recalculate cluster position.
AliEMCALGeometry * fEMCALGeo
! EMCAL geometry pointer.
void InitPHOSRecalibrationFactors()
Init PHOS recalibration factors.
Bool_t IsRecalculationOfClusterTrackMatchingOn() const
TGeoHMatrix * fEMCALMatrix[22]
Geometry matrices with alignments.
Int_t GetPHOSChannelStatus(Int_t imod, Int_t iCol, Int_t iRow) const
Float_t fLocMaxCutEDiff
Local maxima cut, when aggregating cells, next can be a bit higher.
TGeoHMatrix * fPHOSMatrix[5]
Geometry matrices with alignments.
Bool_t ClusterContainsBadChannel(Int_t calo, UShort_t *cellList, Int_t nCells)
AliPHOSGeoUtils * fPHOSGeo
! PHOS geometry pointer.
AliEMCALRecoUtils * GetEMCALRecoUtils() const
void SetEMCALL1PhaseInTimeRecalibrationForAllSM(TObjArray *map)
void SwitchOnDistToBadChannelRecalculation()
AliPHOSGeoUtils * GetPHOSGeometry() const
Bool_t fOADBForEMCAL
Get calibration from OADB for EMCAL.
Float_t GetPHOSChannelRecalibrationFactor(Int_t imod, Int_t iCol, Int_t iRow) const
void RecalculateClusterTrackMatching(AliVEvent *event, TObjArray *clusterArray=0x0)
Float_t fLocMaxCutE
Local maxima cut must have more than this energy.
Float_t GetMCECellClusFracCorrection(Float_t eCell, Float_t eCluster) const
void SetEMCALChannelStatusMap(Int_t iSM, TH2I *h)
Bool_t fRunDependentCorrection
Switch on or off the recalibration dependent on T.
TObjArray * fPHOSRecalibrationFactors
Array of histograms with map of recalibration factors, PHOS.
TString fEMCALGeoName
Name of geometry to use for EMCAL.
TH2F * GetEMCALChannelRecalibrationFactors(Int_t iSM) const
Bool_t fRecalibration
Switch on or off the recalibration.
Float_t GetEMCALChannelRecalibrationFactor(Int_t iSM, Int_t iCol, Int_t iRow) const
TH1F * GetEMCALChannelTimeRecalibrationFactors(Int_t bc) const
const TString calorimeter
Int_t fDebug
Debugging level.
TH1C * GetEMCALL1PhaseInTimeRecalibrationForAllSM() const
Bool_t IsRecalibrationOn() const
Bool_t IsMCParticleInCalorimeterAcceptance(Int_t calo, TParticle *particle)
virtual void Print(const Option_t *opt) const
Print some relevant parameters set for the analysis.
Int_t GetModuleNumber(AliAODPWG4Particle *particle, AliVEvent *inputEvent) const
Get the EMCAL/PHOS module number that corresponds to this particle.
Bool_t fLoadEMCALMatrices
Matrices set from configuration, not get from geometry.root or from ESDs/AODs.
AliEMCALGeometry * GetEMCALGeometry() const
Bool_t IsL1PhaseInTimeRecalibrationOn() const
Bool_t fRecalculateMatching
Recalculate cluster position.
Bool_t MaskFrameCluster(Int_t iSM, Int_t ieta) const
Bool_t fOADBForPHOS
Get calibration from OADB for PHOS.
Int_t * fMaskCellColumns
List of masked cells collumn index.
Bool_t fRemoveBadChannels
Check the channel status provided and remove clusters with bad channels.
void InitPHOSBadChannelStatusMap()
Init PHOS bad channels map.
virtual ~AliCalorimeterUtils()
AliCalorimeterUtils()
Constructor. Initialize parameters.
virtual void InitParameters()
Initialize the parameters of the analysis.
Int_t fNMaskCellColumns
Number of masked columns.
Bool_t IsClusterSharedByTwoSuperModules(const AliEMCALGeometry *geom, AliVCluster *cluster)
Int_t GetNumberOfLocalMaxima(AliVCluster *cluster, AliVCaloCells *cells)
Find the number of local maxima in cluster.
Float_t fMCECellClusFracCorrParam[4]
Parameters for the function correcting the weight of the cells in the cluster.
Bool_t fEMCALGeoMatrixSet
Check if the transformation matrix is set for EMCAL.
TH2I * GetPHOSChannelStatusMap(Int_t imod) const
void SetEMCALChannelRecalibrationFactor(Int_t iSM, Int_t iCol, Int_t iRow, Double_t c=1)
TString GetPass()
Get passx from filename.
void RecalculateClusterPosition(AliVCaloCells *cells, AliVCluster *clu)
Bool_t fImportGeometryFromFile
Import geometry settings in geometry.root file.
Bool_t fCorrectELinearity
Correct cluster energy linearity.
Bool_t fPHOSGeoMatrixSet
Check if the transformation matrix is set for PHOS.
TString fOADBFilePathPHOS
Default path $ALICE_PHYSICS/OADB/PHOS, if needed change.
void CorrectClusterEnergy(AliVCluster *cl)
Correct cluster energy non linearity.
Float_t fCutZ
dZ cut on matching (EMCAL/PHOS).
Bool_t fLoadPHOSMatrices
Matrices set from configuration, not get from geometry.root or from ESDs/AODs.
void SetPHOSChannelStatusMap(Int_t imod, TH2I *h)
Int_t fNCellsFromPHOSBorder
Number of cells from PHOS border the cell with maximum amplitude has to be.
AliVTrack * GetMatchedTrack(AliVCluster *cluster, AliVEvent *event, Int_t index=-1) const
void RecalibrateCellTimeL1Phase(Double_t &time, Int_t calo, Int_t iSM, Int_t bunchCrossNumber) const
Recalculate time L1 phase shift if time recalibration available for EMCAL.
Bool_t fMCECellClusFracCorrOn
Correct or not the weight of cells in cluster.
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
Int_t fNSuperModulesUsed
Number of supermodules to be used in analysis, can be different than the real geo, to be used at initialization of histograms.
TString fImportGeometryFilePath
Path fo geometry.root file.
Bool_t fPlotCluster
Plot cluster in splitting method.
Int_t fRunNumber
Run number of the data, take it from data itself unless set by user.
void RecalibrateCellAmplitude(Float_t &, Int_t calo, Int_t absId) const
Recalculate cell energy if recalibration factor.
void SetEMCALChannelTimeRecalibrationFactors(TObjArray *map)
Bool_t IsPHOSGeoMatrixSet() const
Bool_t IsTimeRecalibrationOn() const
Bool_t fOADBSet
AODB parameters already set.
TObjArray * fPHOSBadChannelMap
Array of histograms with map of bad channels, PHOS.
TString fPHOSGeoName
Name of geometry to use for PHOS.
Bool_t AreNeighbours(Int_t calo, Int_t absId1, Int_t absId2) const
Int_t GetEMCALChannelStatus(Int_t iSM, Int_t iCol, Int_t iRow) const
Bool_t IsEMCALGeoMatrixSet() const
Class with utils specific to calorimeter clusters/cells.
void AccessGeometry(AliVEvent *inputEvent)
AliEMCALRecoUtils * fEMCALRecoUtils
EMCAL utils for cluster rereconstruction.
void SetEMCALChannelRecalibrationFactors(Int_t iSM, TH2F *h)
void AccessOADB(AliVEvent *event)
TString fOADBFilePathEMCAL
Default path $ALICE_PHYSICS/OADB/EMCAL, if needed change.
void RecalibrateCellTime(Double_t &time, Int_t calo, Int_t absId, Int_t bunchCrossNumber) const
Recalculate time if time recalibration available for EMCAL not ready for PHOS.
Int_t GetMaxEnergyCell(AliVCaloCells *cells, AliVCluster *clu, Float_t &fraction) const
For a given CaloCluster, it gets the absId of the cell with maximum energy deposit.
Float_t fCutR
dR cut on matching (PHOS).
Float_t RecalibrateClusterEnergyWeightCell(AliVCluster *cluster, AliVCaloCells *cells, Float_t energyOrg)
void SplitEnergy(Int_t absId1, Int_t absId2, AliVCluster *cluster, AliVCaloCells *cells, AliAODCaloCluster *cluster1, AliAODCaloCluster *cluster2, Int_t nMax, Int_t eventNumber=0)
Int_t GetModuleNumberCellIndexes(Int_t absId, Int_t calo, Int_t &icol, Int_t &irow, Int_t &iRCU) const
Get the EMCAL/PHOS module, columns, row and RCU/DDL number that corresponds to this absId...
TH2I * GetEMCALChannelStatusMap(Int_t iSM) const
void SetPHOSChannelRecalibrationFactor(Int_t imod, Int_t iCol, Int_t iRow, Double_t c=1)
Float_t RecalibrateClusterEnergy(AliVCluster *cluster, AliVCaloCells *cells)
Recalibrate the cluster energy, considering the recalibration map and the energy of the cells that co...
void GetEMCALSubregion(AliVCluster *clus, AliVCaloCells *cells, Int_t ®Eta, Int_t ®Phi) const
Bool_t CheckCellFiducialRegion(AliVCluster *cluster, AliVCaloCells *cells) const
Int_t GetModuleNumberCellIndexesAbsCaloMap(Int_t absId, Int_t calo, Int_t &icol, Int_t &irow, Int_t &iRCU, Int_t &icolAbs, Int_t &irowAbs) const