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;
823 if ( debug > 0 ) printf(
"ConfigureEMCALRecoUtils() - **** Start ***\n");
829 if ( debug > 0 ) printf(
"ConfigureEMCALRecoUtils() - Remove exotics in EMCAL\n");
830 fEMCALRecoUtils->SwitchOnRejectExoticCell() ;
831 fEMCALRecoUtils->SwitchOnRejectExoticCluster();
834 fEMCALRecoUtils->SetExoticCellFractionCut(0.97);
835 fEMCALRecoUtils->SetExoticCellMinAmplitudeCut(4.);
842 if ( debug > 0 ) printf(
"ConfigureEMCALRecoUtils() - Switch on energy recalibration in EMCAL\n");
843 fEMCALRecoUtils->SwitchOnRecalibration();
844 fEMCALRecoUtils->SwitchOnRunDepCorrection();
851 if ( debug > 0 ) printf(
"ConfigureEMCALRecoUtils() - Switch on bad channels removal in EMCAL\n");
852 fEMCALRecoUtils->SwitchOnBadChannelsRemoval();
853 fEMCALRecoUtils->SwitchOnDistToBadChannelRecalculation();
860 if ( debug > 0 ) printf(
"ConfigureEMCALRecoUtils() - Switch on time recalibration in EMCAL\n");
861 fEMCALRecoUtils->SwitchOnTimeRecalibration();
862 fEMCALRecoUtils->SwitchOnL1PhaseInTimeRecalibration() ;
867 fEMCALRecoUtils->SetPositionAlgorithm(AliEMCALRecoUtils::kPosTowerGlobal);
875 if ( debug > 0 ) printf(
"ConfigureEMCALRecoUtils() xxx SET Non linearity correction kBeamTestCorrected xxx\n");
876 fEMCALRecoUtils->SetNonLinearityFunction(AliEMCALRecoUtils::kBeamTestCorrectedv3);
880 if ( debug > 0 ) printf(
"ConfigureEMCALRecoUtils() xxx SET Non linearity correction kPi0MCv3 xxx\n");
881 fEMCALRecoUtils->SetNonLinearityFunction(AliEMCALRecoUtils::kPi0MCv3);
886 if ( debug > 0 ) printf(
"ConfigureEMCALRecoUtils() xxx DON'T SET Non linearity correction xxx\n");
887 fEMCALRecoUtils->SetNonLinearityFunction(AliEMCALRecoUtils::kNoCorrection);
911 if ( cells->IsEMCAL() )
913 Double_t tcell = cells->GetCellTime(absID);
919 Int_t icol = -1, irow = -1,iRCU = -1;
922 Int_t absId1 = -1, absId2 = -1, absId3 = -1, absId4 = -1;
924 Int_t relId1[] = { imod+1, 0, irow+1, icol };
925 Int_t relId2[] = { imod+1, 0, irow-1, icol };
926 Int_t relId3[] = { imod+1, 0, irow , icol+1 };
927 Int_t relId4[] = { imod+1, 0, irow , icol-1 };
929 fPHOSGeo->RelToAbsNumbering(relId1, absId1);
930 fPHOSGeo->RelToAbsNumbering(relId2, absId2);
931 fPHOSGeo->RelToAbsNumbering(relId3, absId3);
932 fPHOSGeo->RelToAbsNumbering(relId4, absId4);
934 Float_t ecell1 = 0, ecell2 = 0, ecell3 = 0, ecell4 = 0;
936 if(absId1 > 0 ) ecell1 = cells->GetCellAmplitude(absId1);
937 if(absId2 > 0 ) ecell2 = cells->GetCellAmplitude(absId2);
938 if(absId3 > 0 ) ecell3 = cells->GetCellAmplitude(absId3);
939 if(absId4 > 0 ) ecell4 = cells->GetCellAmplitude(absId4);
941 return ecell1+ecell2+ecell3+ecell4;
960 regEta = regPhi = -1 ;
962 if(!clus->IsEMCAL())
return ;
964 Int_t icol = -1, irow = -1, iRCU = -1;
972 if( sm%2 == 1) icol+=AliEMCALGeoParams::fgkEMCALCols;
975 if(icol < 2 || icol > 93 || irow < 2 || irow > 21)
return;
982 if ( icol > 9 && icol < 34 ) regEta = 0;
983 else if ( icol > 62 && icol < 87 ) regEta = 0;
987 else if ( icol <= 9 && icol >= 5 ) regEta = 3;
988 else if ( icol <= 38 && icol >= 34 ) regEta = 3;
989 else if ( icol <= 62 && icol >= 58 ) regEta = 3;
990 else if ( icol <= 91 && icol >= 87 ) regEta = 3;
994 else if ( icol < 58 && icol > 38 ) regEta = 1 ;
1004 if ( irow >= 2 && irow <= 5 ) regPhi = 0;
1005 else if ( irow >= 18 && irow <= 21 ) regPhi = 0;
1006 else if ( irow >= 6 && irow <= 9 ) regPhi = 1;
1007 else if ( irow >= 14 && irow <= 17 ) regPhi = 1;
1026 Int_t absIdSMMin =
fEMCALGeo->GetAbsCellIdFromCellIndexes(sm,0,1);
1029 for(
Int_t k = 0; k < 4; k++ )
1031 for(
Int_t p = 0; p < 72; p++ )
1033 Int_t n = absIdSMMin + 2*k + 16 *p;
1035 if ( absId == n || absId == n+1 ||
1036 absId == n+8 || absId == n+9 )
1039 absIdCorr[1] = n+1 ;
1040 absIdCorr[2] = n+8 ;
1041 absIdCorr[3] = n+9 ;
1076 if(absId1 == absId2)
return kFALSE;
1081 if ( sm1 != sm2 )
return kFALSE ;
1084 Int_t iTower = -1, iIphi = -1, iIeta = -1;
1087 fEMCALGeo->GetCellIndex(absId1,sm1,iTower,iIphi,iIeta);
1088 fEMCALGeo->GetCellPhiEtaIndexInSModule(sm1,iTower,iIphi, iIeta,row1,col1);
1091 fEMCALGeo->GetCellIndex(absId2,sm2,iTower,iIphi,iIeta);
1092 fEMCALGeo->GetCellPhiEtaIndexInSModule(sm2,iTower,iIphi, iIeta,row2,col2);
1097 Int_t rowDiff0 = row2-row0;
1098 Int_t colDiff0 = col2-col0;
1100 rowDiff = row1-row2;
1101 colDiff = col1-col2;
1104 if ( colDiff0 >=0 && colDiff0 < 2 && rowDiff0 >=0 && rowDiff0 < 8 )
1123 Float_t & clusterFraction)
const
1125 if( !clu || !cells )
1127 AliInfo(
"Cluster or cells pointer is null!");
1136 Int_t cellAbsId =-1 , absId =-1 ;
1137 Int_t iSupMod =-1 , ieta =-1 , iphi = -1, iRCU = -1;
1142 for (
Int_t iDig=0; iDig< clu->GetNCells(); iDig++)
1144 cellAbsId = clu->GetCellAbsId(iDig);
1146 fraction = clu->GetCellAmplitudeFraction(iDig);
1147 if(fraction < 1e-4) fraction = 1.;
1159 eCell = cells->GetCellAmplitude(cellAbsId)*fraction*recalFactor;
1172 clusterFraction = (eTot-eMax)/eTot;
1174 clusterFraction =1.;
1185 AliVEvent* event,
Int_t index)
const
1187 AliVTrack *track = 0x0;
1198 AliInfo(Form(
"Wrong track index %d, from recalculation", trackIndex));
1200 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(trackIndex));
1210 if( cluster->GetNTracksMatched() < 1 )
return 0x0;
1216 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",cluster->ClassName())))
1218 if( index >= 0 ) iTrack = index;
1219 else iTrack = ((AliESDCaloCluster*)cluster)->GetTracksMatched()->At(0);
1221 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(iTrack) );
1225 if( index > 0 ) iTrack = index;
1227 track =
dynamic_cast<AliVTrack*
>( cluster->GetTrackMatched(iTrack) );
1239 if( eCluster <= 0 || eCluster < eCell )
1241 AliWarning(Form(
"Bad values eCell=%f, eCluster %f",eCell,eCluster));
1245 Float_t frac = eCell / eCluster;
1267 fEMCALGeo->GetAbsCellIdFromEtaPhi(particle->
Eta(),particle->
Phi(), absId);
1269 AliDebug(2,Form(
"EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d",
1270 particle->
Eta(), particle->
Phi()*TMath::RadToDeg(),absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1272 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1278 if(strcmp(inputEvent->ClassName(),
"AliMCEvent") == 0 )
1283 TParticle* primary = ((AliMCEvent*)inputEvent)->Particle(particle->
GetCaloLabel(0));
1287 fPHOSGeo->ImpactOnEmc(primary,mod,z,x) ;
1291 AliFatal(
"Primary not available, stop!");
1316 AliDebug(1,
"AliCalorimeterUtils::GetModuleNumber() - NUL Cluster, please check!!!");
1321 if ( cluster->GetNCells() <= 0 )
return -1;
1323 Int_t absId = cluster->GetCellAbsId(0);
1325 if ( absId < 0 )
return -1;
1327 if( cluster->IsEMCAL() )
1329 AliDebug(2,Form(
"EMCAL absid %d, SuperModule %d",absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1331 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1333 else if ( cluster->IsPHOS() )
1336 fPHOSGeo->AbsToRelNumbering(absId,relId);
1338 if (relId[1] != 0 )
return -1;
1340 AliDebug(2,Form(
"PHOS absid %d Module %d",absId, relId[0]-1));
1356 if ( absId < 0 )
return -1 ;
1360 Int_t iTower = -1, iIphi = -1, iIeta = -1;
1361 fEMCALGeo->GetCellIndex(absId,imod,iTower,iIphi,iIeta);
1362 fEMCALGeo->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,irow,icol);
1364 if(imod < 0 || irow < 0 || icol < 0 )
1366 AliFatal(Form(
"Negative value for super module: %d, or cell icol: %d, or cell irow: %d, check EMCAL geometry name",imod,icol,irow));
1373 if ( imod == 13 || imod == 15 || imod == 17 ) ico2 += 16;
1376 if(imod < 10 || (imod > 11 && imod < 18))
1379 if ( 0 <= irow && irow < 8 ) iRCU = 0;
1380 else if ( 8 <= irow && irow < 16 &&
1381 0 <= ico2 && ico2 < 24 ) iRCU = 0;
1385 else if ( 8 <= irow && irow < 16 &&
1386 24 <= ico2 && ico2 < 48 ) iRCU = 1;
1388 else if ( 16 <= irow && irow < 24 ) iRCU = 1;
1390 if ( imod%2 == 1 ) iRCU = 1 - iRCU;
1399 AliFatal(Form(
"Wrong EMCAL RCU number = %d", iRCU));
1406 fPHOSGeo->AbsToRelNumbering(absId,relId);
1408 if (relId[1] != 0 )
return -1;
1413 iRCU= (
Int_t)(relId[2]-1)/16 ;
1418 AliFatal(Form(
"Wrong PHOS RCU number = %d", iRCU));
1444 irowAbs = irow + 64 * imod;
1455 Int_t shiftEta = 48;
1458 if ( imod > 11 && imod < 18) shiftEta+=48/3;
1460 icolAbs = (imod % 2) ? icol + shiftEta : icol;
1464 irowAbs = irow + 24 *
Int_t(imod / 2);
1467 if ( imod > 11 && imod < 20) irowAbs -= (2*24 / 3);
1479 const Int_t nc = cluster->GetNCells();
1481 Int_t absIdList[nc];
1499 const Int_t nCells = cluster->GetNCells();
1507 simuTotWeight/= eCluster;
1517 for(iDigit = 0; iDigit < nCells ; iDigit++)
1519 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit] ;
1520 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1529 idmax = absIdList[iDigit] ;
1536 for(iDigit = 0 ; iDigit < nCells; iDigit++)
1538 if( absIdList[iDigit] >= 0 )
1540 absId1 = cluster->GetCellsAbsId()[iDigit];
1542 Float_t en1 = cells->GetCellAmplitude(absId1);
1550 for(iDigitN = 0; iDigitN < nCells; iDigitN++)
1552 absId2 = cluster->GetCellsAbsId()[iDigitN] ;
1554 if(absId2==-1 || absId2==absId1)
continue;
1558 Float_t en2 = cells->GetCellAmplitude(absId2);
1571 absIdList[iDigitN] = -1 ;
1576 absIdList[iDigit] = -1 ;
1581 absIdList[iDigit] = -1 ;
1586 absIdList[iDigitN] = -1 ;
1597 for(iDigit = 0; iDigit < nCells; iDigit++)
1599 if( absIdList[iDigit] >= 0 )
1601 absIdList[iDigitN] = absIdList[iDigit] ;
1603 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1611 maxEList[iDigitN] = en ;
1620 AliDebug(1,Form(
"No local maxima found, assign highest energy cell as maxima, id %d, en cell %2.2f, en cluster %2.2f",
1621 idmax,emax,cluster->E()));
1623 maxEList[0] = emax ;
1624 absIdList[0] = idmax ;
1628 AliDebug(1,Form(
"In cluster E %2.2f (wth non lin. %2.2f), M02 %2.2f, M20 %2.2f, N maxima %d",
1629 cluster->E(),eCluster, cluster->GetM02(),cluster->GetM20(), iDigitN));
1644 if (!AliAnalysisManager::GetAnalysisManager()->GetTree())
1646 AliError(
"AliCalorimeterUtils::GetPass() - Pointer to tree = 0, returning null");
1650 if (!AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile())
1652 AliError(
"AliCalorimeterUtils::GetPass() - Null pointer input file, returning null");
1656 TString pass(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());
1657 if (pass.Contains(
"ass1"))
return TString(
"pass1");
1658 else if (pass.Contains(
"ass2"))
return TString(
"pass2");
1659 else if (pass.Contains(
"ass3"))
return TString(
"pass3");
1660 else if (pass.Contains(
"ass4"))
return TString(
"pass4");
1661 else if (pass.Contains(
"ass5"))
return TString(
"pass5");
1662 else if (pass.Contains(
"LHC11c") && pass.Contains(
"spc_calo") )
return TString(
"spc_calo");
1663 else if (pass.Contains(
"calo") || pass.Contains(
"high_lumi"))
1665 AliInfo(
"Path contains <calo> or <high-lumi>, set as <pass1>");
1668 else if (pass.Contains(
"LHC14a1a"))
1670 AliInfo(
"Check that Energy calibration was enabled for this MC production in the tender, clusterizer or here!!");
1676 AliInfo(
"Pass number string not found");
1728 AliDebug(1,
"Init bad channel map");
1731 Bool_t oldStatus = TH1::AddDirectoryStatus();
1732 TH1::AddDirectory(kFALSE);
1735 for (
int i = 0; i < 5; i++)
fPHOSBadChannelMap->Add(
new TH2I(Form(
"PHOS_BadMap_mod%d",i),
1736 Form(
"PHOS_BadMap_mod%d",i),
1737 64, 0, 64, 56, 0, 56));
1743 TH1::AddDirectory(oldStatus);
1751 AliDebug(1,
"Init recalibration map");
1754 Bool_t oldStatus = TH1::AddDirectoryStatus();
1755 TH1::AddDirectory(kFALSE);
1758 for (
int i = 0; i < 5; i++)
1761 Form(
"PHOSRecalFactors_Mod%d",i),
1762 64, 0, 64, 56, 0, 56));
1766 for (
Int_t m = 0; m < 5; m++)
1768 for (
Int_t i = 0; i < 56; i++)
1770 for (
Int_t j = 0; j < 64; j++)
1781 TH1::AddDirectory(oldStatus);
1796 AliInfo(Form(
"Get EMCAL geometry name to <%s> for run %d",
fEMCALGeo->GetName(),
fRunNumber));
1801 AliInfo(Form(
"Set EMCAL geometry name to <%s>",
fEMCALGeoName.Data()));
1820 else if (!gGeoManager) AliInfo(
"Careful!, gGeoManager not loaded, load misalign matrices");
1849 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1865 Int_t icol = -1, irow = -1, iRCU = -1;
1868 if(status > 0) ok = kFALSE;
1887 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1891 Float_t phi = particle->Phi();
1892 if(phi < 0) phi+=TMath::TwoPi();
1898 Double_t vtx[]={ particle->Xv(), particle->Yv(), particle->Zv() } ;
1899 return GetPHOSGeometry()->ImpactOnEmc(vtx, particle->Theta(), phi, mod, z, x) ;
1907 Int_t icol = -1, irow = -1, iRCU = -1;
1910 if(status > 0) ok = kFALSE;
1929 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1933 Float_t phi = particle->Phi();
1934 if(phi < 0) phi+=TMath::TwoPi();
1940 Double_t vtx[]={ particle->Xv(), particle->Yv(), particle->Zv() } ;
1941 return GetPHOSGeometry()->ImpactOnEmc(vtx, particle->Theta(), phi, mod, z, x) ;
1949 Int_t icol = -1, irow = -1, iRCU = -1;
1952 if(status > 0) ok = kFALSE;
1972 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1977 if(phi < 0) phi+=TMath::TwoPi();
1991 Int_t icol = -1, irow = -1, iRCU = -1;
1994 if(status > 0) ok = kFALSE;
2010 if ( iSM%2 ) icol+=48;
2031 printf(
"***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
2033 printf(
"Remove Clusters with max cell at less than %d cells from EMCAL border and %d cells from PHOS border\n",
2035 if(
fEMCALRecoUtils->IsEMCALNoBorderAtEta0()) printf(
"Do not remove EMCAL clusters at Eta = 0\n");
2039 printf(
"Matching criteria: dR < %2.2f[cm], dZ < %2.2f[cm]\n",
fCutR,
fCutZ);
2098 AliVCaloCells * cells)
2106 UShort_t * index = cluster->GetCellsAbsId() ;
2107 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
2108 Int_t ncells = cluster->GetNCells();
2114 for(
Int_t icell = 0; icell < ncells; icell++)
2116 Int_t absId = index[icell];
2118 frac = fraction[icell];
2119 if(frac < 1e-3) frac = 1;
2121 Float_t amp = cells->GetCellAmplitude(absId);
2124 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy: before cal %f; after cal %f",
2125 calo,frac,cells->GetCellAmplitude(absId),amp));
2130 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
2140 AliVCaloCells * cells,
Float_t energyOrg)
2146 UShort_t * index = cluster->GetCellsAbsId() ;
2147 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
2148 Int_t ncells = cluster->GetNCells();
2154 for(
Int_t icell = 0; icell < ncells; icell++)
2156 Int_t absId = index[icell];
2158 frac = fraction[icell];
2159 if(frac < 1e-3) frac = 1;
2161 Float_t amp = cells->GetCellAmplitude(absId);
2166 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy %f",
2167 calo,frac,cells->GetCellAmplitude(absId)));
2172 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
2205 Int_t nClusters =
event->GetNumberOfCaloClusters();
2206 if(clusterArray) nClusters = clusterArray->GetEntriesFast();
2208 AliVCluster * clus = 0;
2210 for (
Int_t iclus = 0; iclus < nClusters ; iclus++)
2212 if ( clusterArray ) clus = (AliVCluster*) clusterArray->At(iclus) ;
2213 else clus =
event->GetCaloCluster(iclus) ;
2215 if (!clus->IsEMCAL())
continue ;
2222 if ( TMath::Abs(clus->GetTrackDx()) < 500 )
2223 AliDebug(2,Form(
"Residuals (Old, New): z (%2.4f,%2.4f), x (%2.4f,%2.4f)\n",
2224 clus->GetTrackDz(),dZ,clus->GetTrackDx(),dR));
2226 clus->SetTrackDistance(dR,dZ);
2231 if(clus->GetNTracksMatched() > 0)
2233 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
2236 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
2240 for(
Int_t iTrack = 0; iTrack < clus->GetNTracksMatched(); iTrack++)
2242 ((AliAODCaloCluster*)clus)->RemoveTrackMatched((
TObject*)((AliAODCaloCluster*)clus)->GetTrackMatched(iTrack));
2251 if ( trackIndex >= 0 )
2253 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
2256 arrayTrackMatched[0] = trackIndex;
2257 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
2261 ((AliAODCaloCluster*)clus)->AddTrackMatched((
TObject*)event->GetTrack(trackIndex));
2283 AliVCluster* cluster,
2284 AliVCaloCells* cells,
2286 AliAODCaloCluster* cluster1,
2287 AliAODCaloCluster* cluster2,
2290 TH2F* hClusterMap = 0 ;
2291 TH2F* hClusterLocMax = 0 ;
2292 TH2F* hCluster1 = 0 ;
2293 TH2F* hCluster2 = 0 ;
2297 hClusterMap =
new TH2F(
"hClusterMap",
"Cluster Map",48,0,48,24,0,24);
2298 hClusterLocMax =
new TH2F(
"hClusterLocMax",
"Cluster 2 highest local maxima",48,0,48,24,0,24);
2299 hCluster1 =
new TH2F(
"hCluster1",
"Cluster 1",48,0,48,24,0,24);
2300 hCluster2 =
new TH2F(
"hCluster2",
"Cluster 2",48,0,48,24,0,24);
2301 hClusterMap ->SetXTitle(
"column");
2302 hClusterMap ->SetYTitle(
"row");
2303 hClusterLocMax ->SetXTitle(
"column");
2304 hClusterLocMax ->SetYTitle(
"row");
2305 hCluster1 ->SetXTitle(
"column");
2306 hCluster1 ->SetYTitle(
"row");
2307 hCluster2 ->SetXTitle(
"column");
2308 hCluster2 ->SetYTitle(
"row");
2312 if(cluster->IsPHOS())
2315 AliWarning(
"Not supported for PHOS yet");
2319 const Int_t ncells = cluster->GetNCells();
2320 Int_t absIdList[ncells];
2323 Int_t icol = -1, irow = -1, iRCU = -1, sm = -1;
2325 Float_t minCol = 100, minRow = 100, maxCol = -1, maxRow = -1;
2326 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++ )
2328 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit];
2330 Float_t ec = cells->GetCellAmplitude(absIdList[iDigit]);
2338 if(sm > -1 && sm < 12)
2340 if(icol > maxCol) maxCol = icol;
2341 if(icol < minCol) minCol = icol;
2342 if(irow > maxRow) maxRow = irow;
2343 if(irow < minRow) minRow = irow;
2344 hClusterMap->Fill(icol,irow,ec);
2353 absIdList1[0] = absId1 ;
2354 fracList1 [0] = 1. ;
2356 Float_t ecell1 = cells->GetCellAmplitude(absId1);
2363 absIdList2[0] = absId2 ;
2364 fracList2 [0] = 1. ;
2366 Float_t ecell2 = cells->GetCellAmplitude(absId2);
2372 Int_t icol1 = -1, irow1 = -1, icol2 = -1, irow2 = -1;
2374 hClusterLocMax->Fill(icol1,irow1,ecell1);
2376 hClusterLocMax->Fill(icol2,irow2,ecell2);
2380 Float_t eRemain = (eCluster-ecell1-ecell2)/2;
2381 Float_t shareFraction1 = ecell1/eCluster+eRemain/eCluster;
2382 Float_t shareFraction2 = ecell2/eCluster+eRemain/eCluster;
2384 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++)
2386 Int_t absId = absIdList[iDigit];
2388 if ( absId==absId1 || absId==absId2 || absId < 0 )
continue;
2390 Float_t ecell = cells->GetCellAmplitude(absId);
2395 absIdList1[ncells1]= absId;
2399 fracList1[ncells1] = shareFraction1;
2400 e1 += ecell*shareFraction1;
2404 fracList1[ncells1] = 1.;
2414 absIdList2[ncells2]= absId;
2418 fracList2[ncells2] = shareFraction2;
2419 e2 += ecell*shareFraction2;
2423 fracList2[ncells2] = 1.;
2432 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",
2433 nMax, eCluster,ecell1,ecell2,e1,e2,eCluster-e1-e2,ncells,ncells1,ncells2,shareFraction1,shareFraction2,shareFraction1+shareFraction2));
2438 cluster1->SetNCells(ncells1);
2439 cluster2->SetNCells(ncells2);
2441 cluster1->SetCellsAbsId(absIdList1);
2442 cluster2->SetCellsAbsId(absIdList2);
2444 cluster1->SetCellsAmplitudeFraction(fracList1);
2445 cluster2->SetCellsAmplitudeFraction(fracList2);
2460 for(
Int_t iDigit = 0; iDigit < ncells1; iDigit++ )
2466 Float_t ecell = cells->GetCellAmplitude(absIdList1[iDigit]);
2469 if(
AreNeighbours(calorimeter, absId2,absIdList1[iDigit]) && absId1!=absIdList1[iDigit])
2470 hCluster1->Fill(icol,irow,ecell*shareFraction1);
2472 hCluster1->Fill(icol,irow,ecell);
2478 for(
Int_t iDigit = 0; iDigit < ncells2; iDigit++ )
2484 Float_t ecell = cells->GetCellAmplitude(absIdList2[iDigit]);
2487 if(
AreNeighbours(calorimeter, absId1,absIdList2[iDigit]) && absId2!=absIdList2[iDigit])
2488 hCluster2->Fill(icol,irow,ecell*shareFraction2);
2490 hCluster2->Fill(icol,irow,ecell);
2494 gStyle->SetPadRightMargin(0.1);
2495 gStyle->SetPadLeftMargin(0.1);
2496 gStyle->SetOptStat(0);
2497 gStyle->SetOptFit(000000);
2499 if(maxCol-minCol > maxRow-minRow)
2501 maxRow+= maxCol-minCol;
2505 maxCol+= maxRow-minRow;
2508 TCanvas *
c=
new TCanvas(
"canvas",
"canvas", 4000, 4000) ;
2514 hClusterMap ->SetAxisRange(minCol, maxCol,
"X");
2515 hClusterMap ->SetAxisRange(minRow, maxRow,
"Y");
2516 hClusterMap ->Draw(
"colz TEXT");
2521 hClusterLocMax ->SetAxisRange(minCol, maxCol,
"X");
2522 hClusterLocMax ->SetAxisRange(minRow, maxRow,
"Y");
2523 hClusterLocMax ->Draw(
"colz TEXT");
2528 hCluster1 ->SetAxisRange(minCol, maxCol,
"X");
2529 hCluster1 ->SetAxisRange(minRow, maxRow,
"Y");
2530 hCluster1 ->Draw(
"colz TEXT");
2535 hCluster2 ->SetAxisRange(minCol, maxCol,
"X");
2536 hCluster2 ->SetAxisRange(minRow, maxRow,
"Y");
2537 hCluster2 ->Draw(
"colz TEXT");
2539 if(eCluster > 6 )c->Print(Form(
"clusterFigures/Event%d_E%1.0f_nMax%d_NCell1_%d_NCell2_%d.eps",
2540 eventNumber,cluster->E(),nMax,ncells1,ncells2));
2544 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
void ConfigureEMCALRecoUtils(Bool_t bMC=kFALSE, Bool_t bExotic=kTRUE, Bool_t bNonLin=kFALSE, Bool_t bRecalE=kTRUE, Bool_t bBad=kTRUE, Bool_t bRecalT=kTRUE, Int_t debug=-1)
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