17 #include <TGeoManager.h>
23 #include <TParticle.h>
24 #include <AliMCEvent.h>
28 #include "AliESDEvent.h"
29 #include "AliMCEvent.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"
37 #include "AliVParticle.h"
41 #include "AliEMCALGeometry.h"
42 #include "AliPHOSGeoUtils.h"
58 fEMCALGeo(0x0), fPHOSGeo(0x0),
59 fEMCALGeoMatrixSet(kFALSE), fPHOSGeoMatrixSet(kFALSE),
60 fLoadEMCALMatrices(kFALSE), fLoadPHOSMatrices(kFALSE),
61 fRemoveBadChannels(kFALSE), fPHOSBadChannelMap(0x0),
62 fNCellsFromPHOSBorder(0),
63 fNMaskCellColumns(0), fMaskCellColumns(0x0),
64 fRecalibration(kFALSE), fRunDependentCorrection(kFALSE),
65 fPHOSRecalibrationFactors(), fEMCALRecoUtils(new AliEMCALRecoUtils),
66 fRecalculatePosition(kFALSE), fCorrectELinearity(kFALSE),
67 fRecalculateMatching(kFALSE),
69 fCutEta(20), fCutPhi(20),
70 fLocMaxCutE(0), fLocMaxCutEDiff(0),
71 fPlotCluster(0), fOADBSet(kFALSE),
72 fOADBForEMCAL(kFALSE), fOADBForPHOS(kFALSE),
73 fOADBFilePathEMCAL(
""), fOADBFilePathPHOS(
""),
74 fImportGeometryFromFile(0), fImportGeometryFilePath(
""),
75 fNSuperModulesUsed(0),
76 fFirstSuperModuleUsed(-1), fLastSuperModuleUsed(-1),
78 fMCECellClusFracCorrOn(0), fMCECellClusFracCorrParam()
131 AliOADBContainer *contBC=
new AliOADBContainer(
"");
132 contBC->InitFromFile(Form(
"%s/EMCALBadChannels.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALBadChannels");
139 AliInfo(
"Remove EMCAL bad cells");
141 for (
Int_t i=0; i<nSM; ++i)
148 hbm=(TH2I*)arrayBC->FindObject(Form(
"EMCALBadChannelMap_Mod%d",i));
152 AliError(Form(
"Can not get EMCALBadChannelMap_Mod%d",i));
156 hbm->SetDirectory(0);
160 }
else AliInfo(
"Do NOT remove EMCAL bad channels\n");
168 AliOADBContainer *contRF=
new AliOADBContainer(
"");
170 contRF->InitFromFile(Form(
"%s/EMCALRecalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRecalib");
184 AliInfo(
"Recalibrate EMCAL");
185 for (
Int_t i=0; i < nSM; ++i)
192 h = (
TH2F*)recalib->FindObject(Form(
"EMCALRecalFactors_SM%d",i));
196 AliError(Form(
"Could not load EMCALRecalFactors_SM%d",i));
204 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params object array");
205 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for pass");
206 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for run");
217 AliOADBContainer *contRFTD=
new AliOADBContainer(
"");
219 contRFTD->InitFromFile(Form(
"%s/EMCALTemperatureCorrCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRunDepTempCalibCorrections");
221 TH1S *htd=(TH1S*)contRFTD->GetObject(
fRunNumber);
226 AliWarning(Form(
"No TemperatureCorrCalib Objects for run: %d",
fRunNumber));
230 Int_t maxEntry = contRFTD->GetNumberOfEntries();
232 while ( (ic < maxEntry) && (contRFTD->UpperLimit(ic) <
fRunNumber) )
238 Int_t closest = lower;
239 if ( (ic<maxEntry) &&
245 AliWarning(Form(
"TemperatureCorrCalib Objects found closest id %d from run: %d", closest, contRFTD->LowerLimit(closest)));
246 htd = (TH1S*) contRFTD->GetObjectByIndex(closest);
251 AliInfo(
"Recalibrate (Temperature) EMCAL");
253 for (
Int_t ism=0; ism<nSM; ++ism)
255 for (
Int_t icol=0; icol<48; ++icol)
257 for (
Int_t irow=0; irow<24; ++irow)
261 Int_t absID =
fEMCALGeo->GetAbsCellIdFromCellIndexes(ism, irow, icol);
262 factor *= htd->GetBinContent(absID) / 10000. ;
271 }
else AliInfo(
"Do NOT recalibrate EMCAL with T variations, no params TH1");
279 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
281 contTRF->InitFromFile(Form(
"%s/EMCALTimeCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeCalib");
289 if ( pass==
"spc_calo" ) passM =
"pass3";
298 AliInfo(
"Time Recalibrate EMCAL");
299 for (
Int_t ibc = 0; ibc < 4; ++ibc)
306 h = (TH1F*)trecalpass->FindObject(Form(
"hAllTimeAvBC%d",ibc));
310 AliError(Form(
"Could not load hAllTimeAvBC%d",ibc));
318 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for pass");
319 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for run");
327 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
328 contTRF->InitFromFile(Form(
"%s/EMCALTimeL1PhaseCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeL1PhaseCalib");
333 AliError(Form(
"L1 phase time recal: No params for run %d. Default used.",
fRunNumber));
334 trecal=(
TObjArray*)contTRF->GetObject(0);
348 AliInfo(Form(
"L1 phase time recal: No params for run %d and pass %s, try default",
fRunNumber, passM.Data()));
352 trecal=(
TObjArray*)contTRF->GetObject(0);
355 trecalpass=(
TObjArray*)trecal->FindObject(
"pass1");
357 AliInfo(
"Time L1 phase Recalibrate EMCAL");
366 h = (TH1C*)trecalpass->FindObject(Form(
"h%d",
fRunNumber));
368 if (!h) AliError(Form(
"Could not load h%d",
fRunNumber));
376 AliError(
"Do not calibrate L1 phase time");
382 AliError(
"Do not calibrate L1 phase time");
399 AliOADBContainer badmapContainer(Form(
"phosBadMap"));
401 badmapContainer.InitFromFile(Form(
"%s/PHOSBadMaps.root",
fOADBFilePathPHOS.Data()),
"phosBadMap");
407 AliInfo(Form(
"Can not read PHOS bad map for run %d",
fRunNumber)) ;
411 AliInfo(Form(
"Setting PHOS bad map with name %s",maps->GetName())) ;
413 for(
Int_t mod = 1; mod < 5; mod++)
420 hbmPH = (TH2I*)maps->At(mod);
422 if(hbmPH) hbmPH->SetDirectory(0);
452 AliInfo(
"Load user defined EMCAL geometry matrices");
455 AliOADBContainer emcGeoMat(
"AliEMCALgeo");
456 emcGeoMat.InitFromFile(Form(
"%s/EMCALlocal2master.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALgeo");
459 for(
Int_t mod=0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
463 AliDebug(1,Form(
"EMCAL matrices SM %d, %p", mod,((TGeoHMatrix*) matEMCAL->At(mod))));
478 AliWarning(Form(
"Set matrix for SM %d from gGeoManager",mod));
479 fEMCALGeo->SetMisalMatrix(
fEMCALGeo->GetMatrixForSuperModuleFromGeoManager(mod),mod) ;
483 AliError(Form(
"Alignment atrix for SM %d is not available",mod));
490 else if (!gGeoManager)
492 AliDebug(1,
"Load EMCAL misalignment matrices");
493 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
495 for(
Int_t mod = 0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
498 if(((
AliESDEvent*)inputEvent)->GetEMCALMatrix(mod))
509 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
523 AliInfo(
"Load user defined PHOS geometry matrices");
526 AliOADBContainer geomContainer(
"phosGeo");
527 geomContainer.InitFromFile(Form(
"%s/PHOSGeometry.root",
fOADBFilePathPHOS.Data()),
"PHOSRotationMatrixes");
528 TObjArray *matPHOS = (
TObjArray*)geomContainer.GetObject(139000,
"PHOSRotationMatrixes");
530 for(
Int_t mod = 0 ; mod < 5 ; mod++)
534 AliDebug(1,Form(
"PHOS matrices module %d, %p",mod,((TGeoHMatrix*) matPHOS->At(mod))));
537 fPHOSMatrix[mod] = (TGeoHMatrix*) matPHOS->At(mod) ;
553 else if (!gGeoManager)
555 AliDebug(1,
"Load PHOS misalignment matrices.");
556 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
558 for(
Int_t mod = 0; mod < 5; mod++)
560 if( ((
AliESDEvent*)inputEvent)->GetPHOSMatrix(mod))
571 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
587 Bool_t areNeighbours = kFALSE ;
589 Int_t iRCU1 = -1, irow1 = -1, icol1 = -1;
590 Int_t iRCU2 = -1, irow2 = -1, icol2 = -1;
592 Int_t rowdiff = 0, coldiff = 0;
601 if(nSupMod1%2) icol1+=AliEMCALGeoParams::fgkEMCALCols;
602 else icol2+=AliEMCALGeoParams::fgkEMCALCols;
605 rowdiff = TMath::Abs( irow1 - irow2 ) ;
606 coldiff = TMath::Abs( icol1 - icol2 ) ;
609 if ((coldiff + rowdiff == 1 ))
610 areNeighbours = kTRUE ;
612 return areNeighbours;
620 AliVCluster* cluster)
630 for(
Int_t iDigit = 0; iDigit < cluster->GetNCells(); iDigit++)
633 geom->GetCellIndex(cluster->GetCellAbsId(iDigit),iSupMod,iTower,iIphi,iIeta);
634 geom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi,iIeta, iphi,ieta);
637 if (iDigit == 0 ) iSM0 = iSupMod;
638 else if(iSupMod != iSM0)
640 if(iSupMod > 11 && iSupMod < 18)
641 AliWarning(Form(
"Cluster shared in 2 DCal: SM%d, SM%d??",iSupMod,iSM0));
655 AliVCaloCells* cells)
const
659 if ( cells->GetType()==AliVCaloCells::kEMCALCell &&
fEMCALRecoUtils->GetNumberOfCellsFromEMCALBorder() <= 0 )
return kTRUE;
666 for(
Int_t i = 0; i < cluster->GetNCells() ; i++)
668 Int_t absId = cluster->GetCellAbsId(i) ;
669 Float_t amp = cells->GetCellAmplitude(absId);
678 AliDebug(1,Form(
"Cluster Max AbsId %d, Cell Energy %2.2f, Cluster Energy %2.2f",
679 absIdMax, ampMax, cluster->E()));
681 if ( absIdMax == -1 )
return kFALSE;
687 if ( cells->GetType() == AliVCaloCells::kEMCALCell )
692 Int_t iTower = -1, iIphi = -1, iIeta = -1, iphi = -1, ieta = -1, iSM = -1;
694 fEMCALGeo->GetCellIndex(absIdMax,iSM,iTower,iIphi,iIeta);
696 fEMCALGeo->GetCellPhiEtaIndexInSModule(iSM,iTower,iIphi, iIeta,iphi,ieta);
698 if(iSM < 0 || iphi < 0 || ieta < 0 )
700 AliFatal(Form(
"Negative value for super module: %d, or cell ieta: %d, or cell iphi: %d, check EMCAL geometry name",iSM,ieta,iphi));
706 if ( iSM < 10 || (iSM > 11 && iSM < 18) )
708 if(iphi >= nborder && iphi < 24-nborder) okrow = kTRUE;
712 if(iphi >= nborder && iphi < 8-nborder) okrow = kTRUE;
718 if(!
fEMCALRecoUtils->IsEMCALNoBorderAtEta0() || (iSM > 11 && iSM < 18))
720 if(ieta > nborder && ieta < 48-nborder) okcol =kTRUE;
726 if(ieta >= nborder) okcol = kTRUE;
730 if(ieta < 48-nborder) okcol = kTRUE;
734 AliDebug(1,Form(
"EMCAL Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
735 nborder, ieta, iphi, iSM,okrow,okcol));
738 else if ( cells->GetType() == AliVCaloCells::kPHOSCell )
741 Int_t irow = -1, icol = -1;
742 fPHOSGeo->AbsToRelNumbering(absIdMax,relId);
744 if (relId[1] != 0 )
return kFALSE;
750 if(irow >= fNCellsFromPHOSBorder && irow < 64-fNCellsFromPHOSBorder) okrow =kTRUE;
751 if(icol >= fNCellsFromPHOSBorder && icol < 56-fNCellsFromPHOSBorder) okcol =kTRUE;
753 AliDebug(1,Form(
"PHOS Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
754 fNCellsFromPHOSBorder, icol, irow, relId[0]-1,okrow,okcol));
757 if (okcol && okrow)
return kTRUE;
776 for(
Int_t iCell = 0; iCell<nCells; iCell++)
786 fPHOSGeo->AbsToRelNumbering(cellList[iCell],relId);
788 if (relId[1] != 0 )
return kTRUE;
824 if ( cells->IsEMCAL() )
826 Double_t tcell = cells->GetCellTime(absID);
832 Int_t icol = -1, irow = -1,iRCU = -1;
835 Int_t absId1 = -1, absId2 = -1, absId3 = -1, absId4 = -1;
837 Int_t relId1[] = { imod+1, 0, irow+1, icol };
838 Int_t relId2[] = { imod+1, 0, irow-1, icol };
839 Int_t relId3[] = { imod+1, 0, irow , icol+1 };
840 Int_t relId4[] = { imod+1, 0, irow , icol-1 };
842 fPHOSGeo->RelToAbsNumbering(relId1, absId1);
843 fPHOSGeo->RelToAbsNumbering(relId2, absId2);
844 fPHOSGeo->RelToAbsNumbering(relId3, absId3);
845 fPHOSGeo->RelToAbsNumbering(relId4, absId4);
847 Float_t ecell1 = 0, ecell2 = 0, ecell3 = 0, ecell4 = 0;
849 if(absId1 > 0 ) ecell1 = cells->GetCellAmplitude(absId1);
850 if(absId2 > 0 ) ecell2 = cells->GetCellAmplitude(absId2);
851 if(absId3 > 0 ) ecell3 = cells->GetCellAmplitude(absId3);
852 if(absId4 > 0 ) ecell4 = cells->GetCellAmplitude(absId4);
854 return ecell1+ecell2+ecell3+ecell4;
873 regEta = regPhi = -1 ;
875 if(!clus->IsEMCAL())
return ;
877 Int_t icol = -1, irow = -1, iRCU = -1;
885 if( sm%2 == 1) icol+=AliEMCALGeoParams::fgkEMCALCols;
888 if(icol < 2 || icol > 93 || irow < 2 || irow > 21)
return;
895 if ( icol > 9 && icol < 34 ) regEta = 0;
896 else if ( icol > 62 && icol < 87 ) regEta = 0;
900 else if ( icol <= 9 && icol >= 5 ) regEta = 3;
901 else if ( icol <= 38 && icol >= 34 ) regEta = 3;
902 else if ( icol <= 62 && icol >= 58 ) regEta = 3;
903 else if ( icol <= 91 && icol >= 87 ) regEta = 3;
907 else if ( icol < 58 && icol > 38 ) regEta = 1 ;
917 if ( irow >= 2 && irow <= 5 ) regPhi = 0;
918 else if ( irow >= 18 && irow <= 21 ) regPhi = 0;
919 else if ( irow >= 6 && irow <= 9 ) regPhi = 1;
920 else if ( irow >= 14 && irow <= 17 ) regPhi = 1;
939 Int_t absIdSMMin =
fEMCALGeo->GetAbsCellIdFromCellIndexes(sm,0,1);
942 for(
Int_t k = 0; k < 4; k++ )
944 for(
Int_t p = 0; p < 72; p++ )
946 Int_t n = absIdSMMin + 2*k + 16 *p;
948 if ( absId == n || absId == n+1 ||
949 absId == n+8 || absId == n+9 )
989 if(absId1 == absId2)
return kFALSE;
994 if ( sm1 != sm2 )
return kFALSE ;
997 Int_t iTower = -1, iIphi = -1, iIeta = -1;
1000 fEMCALGeo->GetCellIndex(absId1,sm1,iTower,iIphi,iIeta);
1001 fEMCALGeo->GetCellPhiEtaIndexInSModule(sm1,iTower,iIphi, iIeta,row1,col1);
1004 fEMCALGeo->GetCellIndex(absId2,sm2,iTower,iIphi,iIeta);
1005 fEMCALGeo->GetCellPhiEtaIndexInSModule(sm2,iTower,iIphi, iIeta,row2,col2);
1010 Int_t rowDiff0 = row2-row0;
1011 Int_t colDiff0 = col2-col0;
1013 rowDiff = row1-row2;
1014 colDiff = col1-col2;
1017 if ( colDiff0 >=0 && colDiff0 < 2 && rowDiff0 >=0 && rowDiff0 < 8 )
1036 Float_t & clusterFraction)
const
1038 if( !clu || !cells )
1040 AliInfo(
"Cluster or cells pointer is null!");
1049 Int_t cellAbsId =-1 , absId =-1 ;
1050 Int_t iSupMod =-1 , ieta =-1 , iphi = -1, iRCU = -1;
1055 for (
Int_t iDig=0; iDig< clu->GetNCells(); iDig++)
1057 cellAbsId = clu->GetCellAbsId(iDig);
1059 fraction = clu->GetCellAmplitudeFraction(iDig);
1060 if(fraction < 1e-4) fraction = 1.;
1072 eCell = cells->GetCellAmplitude(cellAbsId)*fraction*recalFactor;
1085 clusterFraction = (eTot-eMax)/eTot;
1087 clusterFraction =1.;
1098 AliVEvent* event,
Int_t index)
const
1100 AliVTrack *track = 0x0;
1111 AliInfo(Form(
"Wrong track index %d, from recalculation", trackIndex));
1113 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(trackIndex));
1123 if( cluster->GetNTracksMatched() < 1 )
return 0x0;
1129 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",cluster->ClassName())))
1131 if( index >= 0 ) iTrack = index;
1132 else iTrack = ((AliESDCaloCluster*)cluster)->GetTracksMatched()->At(0);
1134 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(iTrack) );
1138 if( index > 0 ) iTrack = index;
1140 track =
dynamic_cast<AliVTrack*
>( cluster->GetTrackMatched(iTrack) );
1152 if( eCluster <= 0 || eCluster < eCell )
1154 AliWarning(Form(
"Bad values eCell=%f, eCluster %f",eCell,eCluster));
1158 Float_t frac = eCell / eCluster;
1180 fEMCALGeo->GetAbsCellIdFromEtaPhi(particle->
Eta(),particle->
Phi(), absId);
1182 AliDebug(2,Form(
"EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d",
1183 particle->
Eta(), particle->
Phi()*TMath::RadToDeg(),absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1185 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1191 if(strcmp(inputEvent->ClassName(),
"AliMCEvent") == 0 )
1196 TParticle* primary = ((AliMCEvent*)inputEvent)->Particle(particle->
GetCaloLabel(0));
1200 fPHOSGeo->ImpactOnEmc(primary,mod,z,x) ;
1204 AliFatal(
"Primary not available, stop!");
1229 AliDebug(1,
"AliCalorimeterUtils::GetModuleNumber() - NUL Cluster, please check!!!");
1234 if ( cluster->GetNCells() <= 0 )
return -1;
1236 Int_t absId = cluster->GetCellAbsId(0);
1238 if ( absId < 0 )
return -1;
1240 if( cluster->IsEMCAL() )
1242 AliDebug(2,Form(
"EMCAL absid %d, SuperModule %d",absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1244 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1246 else if ( cluster->IsPHOS() )
1249 fPHOSGeo->AbsToRelNumbering(absId,relId);
1251 if (relId[1] != 0 )
return -1;
1253 AliDebug(2,Form(
"PHOS absid %d Module %d",absId, relId[0]-1));
1269 if ( absId < 0 )
return -1 ;
1273 Int_t iTower = -1, iIphi = -1, iIeta = -1;
1274 fEMCALGeo->GetCellIndex(absId,imod,iTower,iIphi,iIeta);
1275 fEMCALGeo->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,irow,icol);
1277 if(imod < 0 || irow < 0 || icol < 0 )
1279 AliFatal(Form(
"Negative value for super module: %d, or cell icol: %d, or cell irow: %d, check EMCAL geometry name",imod,icol,irow));
1286 if ( imod == 13 || imod == 15 || imod == 17 ) ico2 += 16;
1289 if(imod < 10 || (imod > 11 && imod < 18))
1292 if ( 0 <= irow && irow < 8 ) iRCU = 0;
1293 else if ( 8 <= irow && irow < 16 &&
1294 0 <= ico2 && ico2 < 24 ) iRCU = 0;
1298 else if ( 8 <= irow && irow < 16 &&
1299 24 <= ico2 && ico2 < 48 ) iRCU = 1;
1301 else if ( 16 <= irow && irow < 24 ) iRCU = 1;
1303 if ( imod%2 == 1 ) iRCU = 1 - iRCU;
1312 AliFatal(Form(
"Wrong EMCAL RCU number = %d", iRCU));
1319 fPHOSGeo->AbsToRelNumbering(absId,relId);
1321 if (relId[1] != 0 )
return -1;
1326 iRCU= (
Int_t)(relId[2]-1)/16 ;
1331 AliFatal(Form(
"Wrong PHOS RCU number = %d", iRCU));
1357 irowAbs = irow + 64 * imod;
1368 Int_t shiftEta = 48;
1371 if ( imod > 11 && imod < 18) shiftEta+=48/3;
1373 icolAbs = (imod % 2) ? icol + shiftEta : icol;
1377 irowAbs = irow + 24 *
Int_t(imod / 2);
1380 if ( imod > 11 && imod < 20) irowAbs -= (2*24 / 3);
1392 const Int_t nc = cluster->GetNCells();
1394 Int_t absIdList[nc];
1412 const Int_t nCells = cluster->GetNCells();
1420 simuTotWeight/= eCluster;
1430 for(iDigit = 0; iDigit < nCells ; iDigit++)
1432 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit] ;
1433 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1442 idmax = absIdList[iDigit] ;
1449 for(iDigit = 0 ; iDigit < nCells; iDigit++)
1451 if( absIdList[iDigit] >= 0 )
1453 absId1 = cluster->GetCellsAbsId()[iDigit];
1455 Float_t en1 = cells->GetCellAmplitude(absId1);
1463 for(iDigitN = 0; iDigitN < nCells; iDigitN++)
1465 absId2 = cluster->GetCellsAbsId()[iDigitN] ;
1467 if(absId2==-1 || absId2==absId1)
continue;
1471 Float_t en2 = cells->GetCellAmplitude(absId2);
1484 absIdList[iDigitN] = -1 ;
1489 absIdList[iDigit] = -1 ;
1494 absIdList[iDigit] = -1 ;
1499 absIdList[iDigitN] = -1 ;
1510 for(iDigit = 0; iDigit < nCells; iDigit++)
1512 if( absIdList[iDigit] >= 0 )
1514 absIdList[iDigitN] = absIdList[iDigit] ;
1516 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1524 maxEList[iDigitN] = en ;
1533 AliDebug(1,Form(
"No local maxima found, assign highest energy cell as maxima, id %d, en cell %2.2f, en cluster %2.2f",
1534 idmax,emax,cluster->E()));
1536 maxEList[0] = emax ;
1537 absIdList[0] = idmax ;
1541 AliDebug(1,Form(
"In cluster E %2.2f (wth non lin. %2.2f), M02 %2.2f, M20 %2.2f, N maxima %d",
1542 cluster->E(),eCluster, cluster->GetM02(),cluster->GetM20(), iDigitN));
1557 if (!AliAnalysisManager::GetAnalysisManager()->GetTree())
1559 AliError(
"AliCalorimeterUtils::GetPass() - Pointer to tree = 0, returning null");
1563 if (!AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile())
1565 AliError(
"AliCalorimeterUtils::GetPass() - Null pointer input file, returning null");
1569 TString pass(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());
1570 if (pass.Contains(
"ass1"))
return TString(
"pass1");
1571 else if (pass.Contains(
"ass2"))
return TString(
"pass2");
1572 else if (pass.Contains(
"ass3"))
return TString(
"pass3");
1573 else if (pass.Contains(
"ass4"))
return TString(
"pass4");
1574 else if (pass.Contains(
"ass5"))
return TString(
"pass5");
1575 else if (pass.Contains(
"LHC11c") && pass.Contains(
"spc_calo") )
return TString(
"spc_calo");
1576 else if (pass.Contains(
"calo") || pass.Contains(
"high_lumi"))
1578 AliInfo(
"Path contains <calo> or <high-lumi>, set as <pass1>");
1581 else if (pass.Contains(
"LHC14a1a"))
1583 AliInfo(
"Check that Energy calibration was enabled for this MC production in the tender, clusterizer or here!!");
1589 AliInfo(
"Pass number string not found");
1641 AliDebug(1,
"Init bad channel map");
1644 Bool_t oldStatus = TH1::AddDirectoryStatus();
1645 TH1::AddDirectory(kFALSE);
1648 for (
int i = 0; i < 5; i++)
fPHOSBadChannelMap->Add(
new TH2I(Form(
"PHOS_BadMap_mod%d",i),
1649 Form(
"PHOS_BadMap_mod%d",i),
1650 64, 0, 64, 56, 0, 56));
1656 TH1::AddDirectory(oldStatus);
1664 AliDebug(1,
"Init recalibration map");
1667 Bool_t oldStatus = TH1::AddDirectoryStatus();
1668 TH1::AddDirectory(kFALSE);
1671 for (
int i = 0; i < 5; i++)
1674 Form(
"PHOSRecalFactors_Mod%d",i),
1675 64, 0, 64, 56, 0, 56));
1679 for (
Int_t m = 0; m < 5; m++)
1681 for (
Int_t i = 0; i < 56; i++)
1683 for (
Int_t j = 0; j < 64; j++)
1694 TH1::AddDirectory(oldStatus);
1709 AliInfo(Form(
"Get EMCAL geometry name to <%s> for run %d",
fEMCALGeo->GetName(),
fRunNumber));
1714 AliInfo(Form(
"Set EMCAL geometry name to <%s>",
fEMCALGeoName.Data()));
1733 else if (!gGeoManager) AliInfo(
"Careful!, gGeoManager not loaded, load misalign matrices");
1762 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1778 Int_t icol = -1, irow = -1, iRCU = -1;
1781 if(status > 0) ok = kFALSE;
1800 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1804 Float_t phi = particle->Phi();
1805 if(phi < 0) phi+=TMath::TwoPi();
1811 Double_t vtx[]={ particle->Xv(), particle->Yv(), particle->Zv() } ;
1812 return GetPHOSGeometry()->ImpactOnEmc(vtx, particle->Theta(), phi, mod, z, x) ;
1820 Int_t icol = -1, irow = -1, iRCU = -1;
1823 if(status > 0) ok = kFALSE;
1842 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1846 Float_t phi = particle->Phi();
1847 if(phi < 0) phi+=TMath::TwoPi();
1853 Double_t vtx[]={ particle->Xv(), particle->Yv(), particle->Zv() } ;
1854 return GetPHOSGeometry()->ImpactOnEmc(vtx, particle->Theta(), phi, mod, z, x) ;
1862 Int_t icol = -1, irow = -1, iRCU = -1;
1865 if(status > 0) ok = kFALSE;
1885 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1890 if(phi < 0) phi+=TMath::TwoPi();
1904 Int_t icol = -1, irow = -1, iRCU = -1;
1907 if(status > 0) ok = kFALSE;
1923 if ( iSM%2 ) icol+=48;
1944 printf(
"***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
1946 printf(
"Remove Clusters with max cell at less than %d cells from EMCAL border and %d cells from PHOS border\n",
1948 if(
fEMCALRecoUtils->IsEMCALNoBorderAtEta0()) printf(
"Do not remove EMCAL clusters at Eta = 0\n");
1952 printf(
"Matching criteria: dR < %2.2f[cm], dZ < %2.2f[cm]\n",
fCutR,
fCutZ);
2011 AliVCaloCells * cells)
2019 UShort_t * index = cluster->GetCellsAbsId() ;
2020 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
2021 Int_t ncells = cluster->GetNCells();
2027 for(
Int_t icell = 0; icell < ncells; icell++)
2029 Int_t absId = index[icell];
2031 frac = fraction[icell];
2032 if(frac < 1e-3) frac = 1;
2034 Float_t amp = cells->GetCellAmplitude(absId);
2037 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy: before cal %f; after cal %f",
2038 calo,frac,cells->GetCellAmplitude(absId),amp));
2043 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
2053 AliVCaloCells * cells,
Float_t energyOrg)
2059 UShort_t * index = cluster->GetCellsAbsId() ;
2060 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
2061 Int_t ncells = cluster->GetNCells();
2067 for(
Int_t icell = 0; icell < ncells; icell++)
2069 Int_t absId = index[icell];
2071 frac = fraction[icell];
2072 if(frac < 1e-3) frac = 1;
2074 Float_t amp = cells->GetCellAmplitude(absId);
2079 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy %f",
2080 calo,frac,cells->GetCellAmplitude(absId)));
2085 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
2118 Int_t nClusters =
event->GetNumberOfCaloClusters();
2119 if(clusterArray) nClusters = clusterArray->GetEntriesFast();
2121 AliVCluster * clus = 0;
2123 for (
Int_t iclus = 0; iclus < nClusters ; iclus++)
2125 if ( clusterArray ) clus = (AliVCluster*) clusterArray->At(iclus) ;
2126 else clus =
event->GetCaloCluster(iclus) ;
2128 if (!clus->IsEMCAL())
continue ;
2135 if ( TMath::Abs(clus->GetTrackDx()) < 500 )
2136 AliDebug(2,Form(
"Residuals (Old, New): z (%2.4f,%2.4f), x (%2.4f,%2.4f)\n",
2137 clus->GetTrackDz(),dZ,clus->GetTrackDx(),dR));
2139 clus->SetTrackDistance(dR,dZ);
2144 if(clus->GetNTracksMatched() > 0)
2146 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
2149 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
2153 for(
Int_t iTrack = 0; iTrack < clus->GetNTracksMatched(); iTrack++)
2155 ((AliAODCaloCluster*)clus)->RemoveTrackMatched((
TObject*)((AliAODCaloCluster*)clus)->GetTrackMatched(iTrack));
2164 if ( trackIndex >= 0 )
2166 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
2169 arrayTrackMatched[0] = trackIndex;
2170 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
2174 ((AliAODCaloCluster*)clus)->AddTrackMatched((
TObject*)event->GetTrack(trackIndex));
2196 AliVCluster* cluster,
2197 AliVCaloCells* cells,
2199 AliAODCaloCluster* cluster1,
2200 AliAODCaloCluster* cluster2,
2203 TH2F* hClusterMap = 0 ;
2204 TH2F* hClusterLocMax = 0 ;
2205 TH2F* hCluster1 = 0 ;
2206 TH2F* hCluster2 = 0 ;
2210 hClusterMap =
new TH2F(
"hClusterMap",
"Cluster Map",48,0,48,24,0,24);
2211 hClusterLocMax =
new TH2F(
"hClusterLocMax",
"Cluster 2 highest local maxima",48,0,48,24,0,24);
2212 hCluster1 =
new TH2F(
"hCluster1",
"Cluster 1",48,0,48,24,0,24);
2213 hCluster2 =
new TH2F(
"hCluster2",
"Cluster 2",48,0,48,24,0,24);
2214 hClusterMap ->SetXTitle(
"column");
2215 hClusterMap ->SetYTitle(
"row");
2216 hClusterLocMax ->SetXTitle(
"column");
2217 hClusterLocMax ->SetYTitle(
"row");
2218 hCluster1 ->SetXTitle(
"column");
2219 hCluster1 ->SetYTitle(
"row");
2220 hCluster2 ->SetXTitle(
"column");
2221 hCluster2 ->SetYTitle(
"row");
2225 if(cluster->IsPHOS())
2228 AliWarning(
"Not supported for PHOS yet");
2232 const Int_t ncells = cluster->GetNCells();
2233 Int_t absIdList[ncells];
2236 Int_t icol = -1, irow = -1, iRCU = -1, sm = -1;
2238 Float_t minCol = 100, minRow = 100, maxCol = -1, maxRow = -1;
2239 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++ )
2241 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit];
2243 Float_t ec = cells->GetCellAmplitude(absIdList[iDigit]);
2251 if(sm > -1 && sm < 12)
2253 if(icol > maxCol) maxCol = icol;
2254 if(icol < minCol) minCol = icol;
2255 if(irow > maxRow) maxRow = irow;
2256 if(irow < minRow) minRow = irow;
2257 hClusterMap->Fill(icol,irow,ec);
2266 absIdList1[0] = absId1 ;
2267 fracList1 [0] = 1. ;
2269 Float_t ecell1 = cells->GetCellAmplitude(absId1);
2276 absIdList2[0] = absId2 ;
2277 fracList2 [0] = 1. ;
2279 Float_t ecell2 = cells->GetCellAmplitude(absId2);
2285 Int_t icol1 = -1, irow1 = -1, icol2 = -1, irow2 = -1;
2287 hClusterLocMax->Fill(icol1,irow1,ecell1);
2289 hClusterLocMax->Fill(icol2,irow2,ecell2);
2293 Float_t eRemain = (eCluster-ecell1-ecell2)/2;
2294 Float_t shareFraction1 = ecell1/eCluster+eRemain/eCluster;
2295 Float_t shareFraction2 = ecell2/eCluster+eRemain/eCluster;
2297 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++)
2299 Int_t absId = absIdList[iDigit];
2301 if ( absId==absId1 || absId==absId2 || absId < 0 )
continue;
2303 Float_t ecell = cells->GetCellAmplitude(absId);
2308 absIdList1[ncells1]= absId;
2312 fracList1[ncells1] = shareFraction1;
2313 e1 += ecell*shareFraction1;
2317 fracList1[ncells1] = 1.;
2327 absIdList2[ncells2]= absId;
2331 fracList2[ncells2] = shareFraction2;
2332 e2 += ecell*shareFraction2;
2336 fracList2[ncells2] = 1.;
2345 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",
2346 nMax, eCluster,ecell1,ecell2,e1,e2,eCluster-e1-e2,ncells,ncells1,ncells2,shareFraction1,shareFraction2,shareFraction1+shareFraction2));
2351 cluster1->SetNCells(ncells1);
2352 cluster2->SetNCells(ncells2);
2354 cluster1->SetCellsAbsId(absIdList1);
2355 cluster2->SetCellsAbsId(absIdList2);
2357 cluster1->SetCellsAmplitudeFraction(fracList1);
2358 cluster2->SetCellsAmplitudeFraction(fracList2);
2373 for(
Int_t iDigit = 0; iDigit < ncells1; iDigit++ )
2379 Float_t ecell = cells->GetCellAmplitude(absIdList1[iDigit]);
2382 if(
AreNeighbours(calorimeter, absId2,absIdList1[iDigit]) && absId1!=absIdList1[iDigit])
2383 hCluster1->Fill(icol,irow,ecell*shareFraction1);
2385 hCluster1->Fill(icol,irow,ecell);
2391 for(
Int_t iDigit = 0; iDigit < ncells2; iDigit++ )
2397 Float_t ecell = cells->GetCellAmplitude(absIdList2[iDigit]);
2400 if(
AreNeighbours(calorimeter, absId1,absIdList2[iDigit]) && absId2!=absIdList2[iDigit])
2401 hCluster2->Fill(icol,irow,ecell*shareFraction2);
2403 hCluster2->Fill(icol,irow,ecell);
2407 gStyle->SetPadRightMargin(0.1);
2408 gStyle->SetPadLeftMargin(0.1);
2409 gStyle->SetOptStat(0);
2410 gStyle->SetOptFit(000000);
2412 if(maxCol-minCol > maxRow-minRow)
2414 maxRow+= maxCol-minCol;
2418 maxCol+= maxRow-minRow;
2421 TCanvas *
c=
new TCanvas(
"canvas",
"canvas", 4000, 4000) ;
2427 hClusterMap ->SetAxisRange(minCol, maxCol,
"X");
2428 hClusterMap ->SetAxisRange(minRow, maxRow,
"Y");
2429 hClusterMap ->Draw(
"colz TEXT");
2434 hClusterLocMax ->SetAxisRange(minCol, maxCol,
"X");
2435 hClusterLocMax ->SetAxisRange(minRow, maxRow,
"Y");
2436 hClusterLocMax ->Draw(
"colz TEXT");
2441 hCluster1 ->SetAxisRange(minCol, maxCol,
"X");
2442 hCluster1 ->SetAxisRange(minRow, maxRow,
"Y");
2443 hCluster1 ->Draw(
"colz TEXT");
2448 hCluster2 ->SetAxisRange(minCol, maxCol,
"X");
2449 hCluster2 ->SetAxisRange(minRow, maxRow,
"Y");
2450 hCluster2 ->Draw(
"colz TEXT");
2452 if(eCluster > 6 )c->Print(Form(
"clusterFigures/Event%d_E%1.0f_nMax%d_NCell1_%d_NCell2_%d.eps",
2453 eventNumber,cluster->E(),nMax,ncells1,ncells2));
2457 delete hClusterLocMax;
Bool_t fRecalculatePosition
Recalculate cluster position.
virtual Double_t Eta() const
AliEMCALGeometry * fEMCALGeo
! EMCAL geometry pointer.
Bool_t IsMCParticleInCalorimeterAcceptance(Int_t calo, AliVParticle *particle)
Check that a MC AOD is in the calorimeter acceptance.
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.
Bool_t IsAbsIDsFromTCard(Int_t absId1, Int_t absId2, Int_t &rowDiff, Int_t &colDiff) const
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
Float_t GetECross(Int_t absId, AliVCaloCells *cells, Int_t bc)
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
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
virtual UInt_t GetDetectorTag() const
Bool_t IsRecalibrationOn() const
virtual void Print(const Option_t *opt) const
Print some relevant parameters set for the analysis.
Int_t GetModuleNumber(AliCaloTrackParticle *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
Container for input particle information on CaloTrackCorr package.
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()
void RecalculateClusterTrackMatching(AliVEvent *event, TObjArray *clusterArray=0x0, AliMCEvent *mc=0x0)
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.
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.
virtual Double_t Phi() const
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)
virtual Int_t GetCaloLabel(Int_t i) const
void SplitEnergy(Int_t absId1, Int_t absId2, AliVCluster *cluster, AliVCaloCells *cells, AliAODCaloCluster *cluster1, AliAODCaloCluster *cluster2, Int_t nMax, Int_t eventNumber=0)
Bool_t GetFECCorrelatedCellAbsId(Int_t absId, Int_t absIdCorr[4]) const
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