17 #include <TGeoManager.h>
23 #include <TParticle.h>
24 #include <AliMCEvent.h>
28 #include "AliESDEvent.h"
29 #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"
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)
2020 UShort_t * index = cluster->GetCellsAbsId() ;
2021 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
2023 Int_t ncells = cluster->GetNCells();
2029 for(
Int_t icell = 0; icell < ncells; icell++)
2031 Int_t absId = index[icell];
2033 frac = fraction[icell];
2034 if(frac < 1e-3) frac = 1;
2036 Float_t amp = cells->GetCellAmplitude(absId);
2039 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy: before cal %f; after cal %f",
2040 calo,frac,cells->GetCellAmplitude(absId),amp));
2045 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
2050 AliFatal(
"Cells pointer does not exist!");
2061 AliVCaloCells * cells,
Float_t energyOrg)
2070 UShort_t * index = cluster->GetCellsAbsId() ;
2071 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
2073 Int_t ncells = cluster->GetNCells();
2079 for(
Int_t icell = 0; icell < ncells; icell++)
2081 Int_t absId = index[icell];
2083 frac = fraction[icell];
2084 if(frac < 1e-3) frac = 1;
2086 Float_t amp = cells->GetCellAmplitude(absId);
2091 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy %f",
2092 calo,frac,cells->GetCellAmplitude(absId)));
2097 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
2101 AliFatal(
"Cells pointer does not exist!");
2135 Int_t nClusters =
event->GetNumberOfCaloClusters();
2136 if(clusterArray) nClusters = clusterArray->GetEntriesFast();
2138 AliVCluster * clus = 0;
2140 for (
Int_t iclus = 0; iclus < nClusters ; iclus++)
2142 if ( clusterArray ) clus = (AliVCluster*) clusterArray->At(iclus) ;
2143 else clus =
event->GetCaloCluster(iclus) ;
2145 if (!clus->IsEMCAL())
continue ;
2152 if ( TMath::Abs(clus->GetTrackDx()) < 500 )
2153 AliDebug(2,Form(
"Residuals (Old, New): z (%2.4f,%2.4f), x (%2.4f,%2.4f)\n",
2154 clus->GetTrackDz(),dZ,clus->GetTrackDx(),dR));
2156 clus->SetTrackDistance(dR,dZ);
2161 if(clus->GetNTracksMatched() > 0)
2163 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
2166 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
2170 for(
Int_t iTrack = 0; iTrack < clus->GetNTracksMatched(); iTrack++)
2172 ((AliAODCaloCluster*)clus)->RemoveTrackMatched((
TObject*)((AliAODCaloCluster*)clus)->GetTrackMatched(iTrack));
2181 if ( trackIndex >= 0 )
2183 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
2186 arrayTrackMatched[0] = trackIndex;
2187 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
2191 ((AliAODCaloCluster*)clus)->AddTrackMatched((
TObject*)event->GetTrack(trackIndex));
2213 AliVCluster* cluster,
2214 AliVCaloCells* cells,
2216 AliAODCaloCluster* cluster1,
2217 AliAODCaloCluster* cluster2,
2220 TH2F* hClusterMap = 0 ;
2221 TH2F* hClusterLocMax = 0 ;
2222 TH2F* hCluster1 = 0 ;
2223 TH2F* hCluster2 = 0 ;
2227 hClusterMap =
new TH2F(
"hClusterMap",
"Cluster Map",48,0,48,24,0,24);
2228 hClusterLocMax =
new TH2F(
"hClusterLocMax",
"Cluster 2 highest local maxima",48,0,48,24,0,24);
2229 hCluster1 =
new TH2F(
"hCluster1",
"Cluster 1",48,0,48,24,0,24);
2230 hCluster2 =
new TH2F(
"hCluster2",
"Cluster 2",48,0,48,24,0,24);
2231 hClusterMap ->SetXTitle(
"column");
2232 hClusterMap ->SetYTitle(
"row");
2233 hClusterLocMax ->SetXTitle(
"column");
2234 hClusterLocMax ->SetYTitle(
"row");
2235 hCluster1 ->SetXTitle(
"column");
2236 hCluster1 ->SetYTitle(
"row");
2237 hCluster2 ->SetXTitle(
"column");
2238 hCluster2 ->SetYTitle(
"row");
2242 if(cluster->IsPHOS())
2245 AliWarning(
"Not supported for PHOS yet");
2249 const Int_t ncells = cluster->GetNCells();
2250 Int_t absIdList[ncells];
2253 Int_t icol = -1, irow = -1, iRCU = -1, sm = -1;
2255 Float_t minCol = 100, minRow = 100, maxCol = -1, maxRow = -1;
2256 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++ )
2258 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit];
2260 Float_t ec = cells->GetCellAmplitude(absIdList[iDigit]);
2268 if(sm > -1 && sm < 12)
2270 if(icol > maxCol) maxCol = icol;
2271 if(icol < minCol) minCol = icol;
2272 if(irow > maxRow) maxRow = irow;
2273 if(irow < minRow) minRow = irow;
2274 hClusterMap->Fill(icol,irow,ec);
2283 absIdList1[0] = absId1 ;
2284 fracList1 [0] = 1. ;
2286 Float_t ecell1 = cells->GetCellAmplitude(absId1);
2293 absIdList2[0] = absId2 ;
2294 fracList2 [0] = 1. ;
2296 Float_t ecell2 = cells->GetCellAmplitude(absId2);
2302 Int_t icol1 = -1, irow1 = -1, icol2 = -1, irow2 = -1;
2304 hClusterLocMax->Fill(icol1,irow1,ecell1);
2306 hClusterLocMax->Fill(icol2,irow2,ecell2);
2310 Float_t eRemain = (eCluster-ecell1-ecell2)/2;
2311 Float_t shareFraction1 = ecell1/eCluster+eRemain/eCluster;
2312 Float_t shareFraction2 = ecell2/eCluster+eRemain/eCluster;
2314 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++)
2316 Int_t absId = absIdList[iDigit];
2318 if ( absId==absId1 || absId==absId2 || absId < 0 )
continue;
2320 Float_t ecell = cells->GetCellAmplitude(absId);
2325 absIdList1[ncells1]= absId;
2329 fracList1[ncells1] = shareFraction1;
2330 e1 += ecell*shareFraction1;
2334 fracList1[ncells1] = 1.;
2344 absIdList2[ncells2]= absId;
2348 fracList2[ncells2] = shareFraction2;
2349 e2 += ecell*shareFraction2;
2353 fracList2[ncells2] = 1.;
2362 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",
2363 nMax, eCluster,ecell1,ecell2,e1,e2,eCluster-e1-e2,ncells,ncells1,ncells2,shareFraction1,shareFraction2,shareFraction1+shareFraction2));
2368 cluster1->SetNCells(ncells1);
2369 cluster2->SetNCells(ncells2);
2371 cluster1->SetCellsAbsId(absIdList1);
2372 cluster2->SetCellsAbsId(absIdList2);
2374 cluster1->SetCellsAmplitudeFraction(fracList1);
2375 cluster2->SetCellsAmplitudeFraction(fracList2);
2390 for(
Int_t iDigit = 0; iDigit < ncells1; iDigit++ )
2396 Float_t ecell = cells->GetCellAmplitude(absIdList1[iDigit]);
2399 if(
AreNeighbours(calorimeter, absId2,absIdList1[iDigit]) && absId1!=absIdList1[iDigit])
2400 hCluster1->Fill(icol,irow,ecell*shareFraction1);
2402 hCluster1->Fill(icol,irow,ecell);
2408 for(
Int_t iDigit = 0; iDigit < ncells2; iDigit++ )
2414 Float_t ecell = cells->GetCellAmplitude(absIdList2[iDigit]);
2417 if(
AreNeighbours(calorimeter, absId1,absIdList2[iDigit]) && absId2!=absIdList2[iDigit])
2418 hCluster2->Fill(icol,irow,ecell*shareFraction2);
2420 hCluster2->Fill(icol,irow,ecell);
2424 gStyle->SetPadRightMargin(0.1);
2425 gStyle->SetPadLeftMargin(0.1);
2426 gStyle->SetOptStat(0);
2427 gStyle->SetOptFit(000000);
2429 if(maxCol-minCol > maxRow-minRow)
2431 maxRow+= maxCol-minCol;
2435 maxCol+= maxRow-minRow;
2438 TCanvas *
c=
new TCanvas(
"canvas",
"canvas", 4000, 4000) ;
2444 hClusterMap ->SetAxisRange(minCol, maxCol,
"X");
2445 hClusterMap ->SetAxisRange(minRow, maxRow,
"Y");
2446 hClusterMap ->Draw(
"colz TEXT");
2451 hClusterLocMax ->SetAxisRange(minCol, maxCol,
"X");
2452 hClusterLocMax ->SetAxisRange(minRow, maxRow,
"Y");
2453 hClusterLocMax ->Draw(
"colz TEXT");
2458 hCluster1 ->SetAxisRange(minCol, maxCol,
"X");
2459 hCluster1 ->SetAxisRange(minRow, maxRow,
"Y");
2460 hCluster1 ->Draw(
"colz TEXT");
2465 hCluster2 ->SetAxisRange(minCol, maxCol,
"X");
2466 hCluster2 ->SetAxisRange(minRow, maxRow,
"Y");
2467 hCluster2 ->Draw(
"colz TEXT");
2469 if(eCluster > 6 )c->Print(Form(
"clusterFigures/Event%d_E%1.0f_nMax%d_NCell1_%d_NCell2_%d.eps",
2470 eventNumber,cluster->E(),nMax,ncells1,ncells2));
2474 delete hClusterLocMax;
Bool_t fRecalculatePosition
Recalculate cluster position.
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
Bool_t IsRecalibrationOn() const
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()
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.
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)
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