17 #include <TGeoManager.h>
23 #include <TParticle.h>
27 #include "AliESDEvent.h"
28 #include "AliMCEvent.h"
30 #include "AliAODPWG4Particle.h"
31 #include "AliVCluster.h"
32 #include "AliVCaloCells.h"
33 #include "AliAODCaloCluster.h"
34 #include "AliOADBContainer.h"
35 #include "AliAnalysisManager.h"
36 #include "AliAODMCParticle.h"
40 #include "AliEMCALGeometry.h"
41 #include "AliPHOSGeoUtils.h"
55 fEMCALGeo(0x0), fPHOSGeo(0x0),
56 fEMCALGeoMatrixSet(kFALSE), fPHOSGeoMatrixSet(kFALSE),
57 fLoadEMCALMatrices(kFALSE), fLoadPHOSMatrices(kFALSE),
58 fRemoveBadChannels(kFALSE), fPHOSBadChannelMap(0x0),
59 fNCellsFromPHOSBorder(0),
60 fNMaskCellColumns(0), fMaskCellColumns(0x0),
61 fRecalibration(kFALSE), fRunDependentCorrection(kFALSE),
62 fPHOSRecalibrationFactors(), fEMCALRecoUtils(new AliEMCALRecoUtils),
63 fRecalculatePosition(kFALSE), fCorrectELinearity(kFALSE),
64 fRecalculateMatching(kFALSE),
66 fCutEta(20), fCutPhi(20),
67 fLocMaxCutE(0), fLocMaxCutEDiff(0),
68 fPlotCluster(0), fOADBSet(kFALSE),
69 fOADBForEMCAL(kFALSE), fOADBForPHOS(kFALSE),
70 fOADBFilePathEMCAL(
""), fOADBFilePathPHOS(
""),
71 fImportGeometryFromFile(0), fImportGeometryFilePath(
""),
72 fNSuperModulesUsed(0), fRunNumber(0),
73 fMCECellClusFracCorrOn(0), fMCECellClusFracCorrParam()
121 Int_t nSM =
fEMCALGeo->GetNumberOfSuperModules();
126 AliOADBContainer *contBC=
new AliOADBContainer(
"");
127 contBC->InitFromFile(Form(
"%s/EMCALBadChannels.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALBadChannels");
129 TObjArray *arrayBC=(TObjArray*)contBC->GetObject(
fRunNumber);
134 AliInfo(
"Remove EMCAL bad cells");
136 for (Int_t i=0; i<nSM; ++i)
143 hbm=(TH2I*)arrayBC->FindObject(Form(
"EMCALBadChannelMap_Mod%d",i));
147 AliError(Form(
"Can not get EMCALBadChannelMap_Mod%d",i));
151 hbm->SetDirectory(0);
155 }
else AliInfo(
"Do NOT remove EMCAL bad channels\n");
161 AliOADBContainer *contRF=
new AliOADBContainer(
"");
163 contRF->InitFromFile(Form(
"%s/EMCALRecalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRecalib");
165 TObjArray *recal=(TObjArray*)contRF->GetObject(
fRunNumber);
169 TObjArray *recalpass=(TObjArray*)recal->FindObject(pass);
173 TObjArray *recalib=(TObjArray*)recalpass->FindObject(
"Recalib");
177 AliInfo(
"Recalibrate EMCAL");
178 for (Int_t i=0; i < nSM; ++i)
185 h = (TH2F*)recalib->FindObject(Form(
"EMCALRecalFactors_SM%d",i));
189 AliError(Form(
"Could not load EMCALRecalFactors_SM%d",i));
197 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params object array");
198 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for pass");
199 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for run");
209 AliOADBContainer *contRFTD=
new AliOADBContainer(
"");
211 contRFTD->InitFromFile(Form(
"%s/EMCALTemperatureCorrCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRunDepTempCalibCorrections");
213 TH1S *htd=(TH1S*)contRFTD->GetObject(
fRunNumber);
218 AliWarning(Form(
"No TemperatureCorrCalib Objects for run: %d",
fRunNumber));
222 Int_t maxEntry = contRFTD->GetNumberOfEntries();
224 while ( (ic < maxEntry) && (contRFTD->UpperLimit(ic) <
fRunNumber) )
230 Int_t closest = lower;
231 if ( (ic<maxEntry) &&
237 AliWarning(Form(
"TemperatureCorrCalib Objects found closest id %d from run: %d", closest, contRFTD->LowerLimit(closest)));
238 htd = (TH1S*) contRFTD->GetObjectByIndex(closest);
243 AliInfo(
"Recalibrate (Temperature) EMCAL");
245 for (Int_t ism=0; ism<nSM; ++ism)
247 for (Int_t icol=0; icol<48; ++icol)
249 for (Int_t irow=0; irow<24; ++irow)
253 Int_t absID =
fEMCALGeo->GetAbsCellIdFromCellIndexes(ism, irow, icol);
254 factor *= htd->GetBinContent(absID) / 10000. ;
263 }
else AliInfo(
"Do NOT recalibrate EMCAL with T variations, no params TH1");
269 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
271 contTRF->InitFromFile(Form(
"%s/EMCALTimeCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeCalib");
273 TObjArray *trecal=(TObjArray*)contTRF->GetObject(
fRunNumber);
277 TString passM = pass;
278 if(pass==
"spc_calo") passM =
"pass3";
279 TObjArray *trecalpass=(TObjArray*)trecal->FindObject(passM);
283 AliInfo(
"Time Recalibrate EMCAL");
284 for (Int_t ibc = 0; ibc < 4; ++ibc)
291 h = (TH1F*)trecalpass->FindObject(Form(
"hAllTimeAvBC%d",ibc));
295 AliError(Form(
"Could not load hAllTimeAvBC%d",ibc));
303 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for pass");
304 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for run");
318 AliOADBContainer badmapContainer(Form(
"phosBadMap"));
319 TString fileName=
"$ALICE_PHYSICS/OADB/PHOS/PHOSBadMaps.root";
320 badmapContainer.InitFromFile(Form(
"%s/PHOSBadMaps.root",
fOADBFilePathPHOS.Data()),
"phosBadMap");
323 TObjArray *maps = (TObjArray*)badmapContainer.GetObject(139000,
"phosBadMap");
326 AliInfo(Form(
"Can not read PHOS bad map for run %d",
fRunNumber)) ;
330 AliInfo(Form(
"Setting PHOS bad map with name %s",maps->GetName())) ;
332 for(Int_t mod = 1; mod < 5; mod++)
339 hbmPH = (TH2I*)maps->At(mod);
341 if(hbmPH) hbmPH->SetDirectory(0);
371 AliInfo(
"Load user defined EMCAL geometry matrices");
374 AliOADBContainer emcGeoMat(
"AliEMCALgeo");
375 emcGeoMat.InitFromFile(Form(
"%s/EMCALlocal2master.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALgeo");
376 TObjArray *matEMCAL=(TObjArray*)emcGeoMat.GetObject(
fRunNumber,
"EmcalMatrices");
378 for(Int_t mod=0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
382 AliDebug(1,Form(
"EMCAL matrices SM %d, %p", mod,((TGeoHMatrix*) matEMCAL->At(mod))));
400 else if (!gGeoManager)
402 AliDebug(1,
"Load EMCAL misalignment matrices");
403 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
405 for(Int_t mod = 0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
408 if(((AliESDEvent*)inputEvent)->GetEMCALMatrix(mod))
410 fEMCALGeo->SetMisalMatrix(((AliESDEvent*)inputEvent)->GetEMCALMatrix(mod),mod) ;
419 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
433 AliInfo(
"Load user defined PHOS geometry matrices");
436 AliOADBContainer geomContainer(
"phosGeo");
437 geomContainer.InitFromFile(Form(
"%s/PHOSGeometry.root",
fOADBFilePathPHOS.Data()),
"PHOSRotationMatrixes");
438 TObjArray *matPHOS = (TObjArray*)geomContainer.GetObject(139000,
"PHOSRotationMatrixes");
440 for(Int_t mod = 0 ; mod < 5 ; mod++)
444 AliDebug(1,Form(
"PHOS matrices module %d, %p",mod,((TGeoHMatrix*) matPHOS->At(mod))));
447 fPHOSMatrix[mod] = (TGeoHMatrix*) matPHOS->At(mod) ;
463 else if (!gGeoManager)
465 AliDebug(1,
"Load PHOS misalignment matrices.");
466 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
468 for(Int_t mod = 0; mod < 5; mod++)
470 if( ((AliESDEvent*)inputEvent)->GetPHOSMatrix(mod))
473 fPHOSGeo->SetMisalMatrix( ((AliESDEvent*)inputEvent)->GetPHOSMatrix(mod),mod) ;
481 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
497 Bool_t areNeighbours = kFALSE ;
499 Int_t iRCU1 = -1, irow1 = -1, icol1 = -1;
500 Int_t iRCU2 = -1, irow2 = -1, icol2 = -1;
502 Int_t rowdiff = 0, coldiff = 0;
507 if(calo==
kEMCAL && nSupMod1!=nSupMod2)
511 if(nSupMod1%2) icol1+=AliEMCALGeoParams::fgkEMCALCols;
512 else icol2+=AliEMCALGeoParams::fgkEMCALCols;
515 rowdiff = TMath::Abs( irow1 - irow2 ) ;
516 coldiff = TMath::Abs( icol1 - icol2 ) ;
519 if ((coldiff + rowdiff == 1 ))
520 areNeighbours = kTRUE ;
522 return areNeighbours;
530 AliVCluster* cluster)
540 for(Int_t iDigit = 0; iDigit < cluster->GetNCells(); iDigit++)
543 geom->GetCellIndex(cluster->GetCellAbsId(iDigit),iSupMod,iTower,iIphi,iIeta);
544 geom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi,iIeta, iphi,ieta);
547 if (iDigit == 0 ) iSM0 = iSupMod;
548 else if(iSupMod != iSM0)
550 if(iSupMod > 11 && iSupMod < 18)
551 AliWarning(Form(
"Cluster shared in 2 DCal: SM%d, SM%d??",iSupMod,iSM0));
565 AliVCaloCells* cells)
const
569 if ( cells->GetType()==AliVCaloCells::kEMCALCell &&
fEMCALRecoUtils->GetNumberOfCellsFromEMCALBorder() <= 0 )
return kTRUE;
576 for(Int_t i = 0; i < cluster->GetNCells() ; i++)
578 Int_t absId = cluster->GetCellAbsId(i) ;
579 Float_t amp = cells->GetCellAmplitude(absId);
588 AliDebug(1,Form(
"Cluster Max AbsId %d, Cell Energy %2.2f, Cluster Energy %2.2f",
589 absIdMax, ampMax, cluster->E()));
591 if ( absIdMax == -1 )
return kFALSE;
594 Bool_t okrow = kFALSE;
595 Bool_t okcol = kFALSE;
597 if ( cells->GetType() == AliVCaloCells::kEMCALCell )
602 Int_t iTower = -1, iIphi = -1, iIeta = -1, iphi = -1, ieta = -1, iSM = -1;
604 fEMCALGeo->GetCellIndex(absIdMax,iSM,iTower,iIphi,iIeta);
606 fEMCALGeo->GetCellPhiEtaIndexInSModule(iSM,iTower,iIphi, iIeta,iphi,ieta);
608 if(iSM < 0 || iphi < 0 || ieta < 0 )
610 AliFatal(Form(
"Negative value for super module: %d, or cell ieta: %d, or cell iphi: %d, check EMCAL geometry name",iSM,ieta,iphi));
616 if ( iSM < 10 || (iSM > 11 && iSM < 18) )
618 if(iphi >= nborder && iphi < 24-nborder) okrow = kTRUE;
622 if(iphi >= nborder && iphi < 8-nborder) okrow = kTRUE;
628 if(!
fEMCALRecoUtils->IsEMCALNoBorderAtEta0() || (iSM > 11 && iSM < 18))
630 if(ieta > nborder && ieta < 48-nborder) okcol =kTRUE;
636 if(ieta >= nborder) okcol = kTRUE;
640 if(ieta < 48-nborder) okcol = kTRUE;
644 AliDebug(1,Form(
"EMCAL Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
645 nborder, ieta, iphi, iSM,okrow,okcol));
648 else if ( cells->GetType() == AliVCaloCells::kPHOSCell )
651 Int_t irow = -1, icol = -1;
652 fPHOSGeo->AbsToRelNumbering(absIdMax,relId);
657 if(irow >= fNCellsFromPHOSBorder && irow < 64-fNCellsFromPHOSBorder) okrow =kTRUE;
658 if(icol >= fNCellsFromPHOSBorder && icol < 56-fNCellsFromPHOSBorder) okcol =kTRUE;
660 AliDebug(1,Form(
"PHOS Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
661 fNCellsFromPHOSBorder, icol, irow, relId[0]-1,okrow,okcol));
664 if (okcol && okrow)
return kTRUE;
683 for(Int_t iCell = 0; iCell<nCells; iCell++)
686 if ( calorimeter ==
kEMCAL )
690 else if ( calorimeter ==
kPHOS )
693 fPHOSGeo->AbsToRelNumbering(cellList[iCell],relId);
722 Float_t & clusterFraction)
const
726 AliInfo(
"Cluster or cells pointer is null!");
733 Float_t fraction = 1.;
734 Float_t recalFactor = 1.;
735 Int_t cellAbsId =-1 , absId =-1 ;
736 Int_t iSupMod =-1 , ieta =-1 , iphi = -1, iRCU = -1;
739 if(clu->IsPHOS()) calo =
kPHOS ;
741 for (Int_t iDig=0; iDig< clu->GetNCells(); iDig++)
743 cellAbsId = clu->GetCellAbsId(iDig);
745 fraction = clu->GetCellAmplitudeFraction(iDig);
746 if(fraction < 1e-4) fraction = 1.;
756 eCell = cells->GetCellAmplitude(cellAbsId)*fraction*recalFactor;
769 clusterFraction = (eTot-eMax)/eTot;
782 AliVEvent* event, Int_t index)
const
784 AliVTrack *track = 0x0;
791 Int_t trackIndex =
fEMCALRecoUtils->GetMatchedTrackIndex(cluster->GetID());
795 AliInfo(Form(
"Wrong track index %d, from recalculation", trackIndex));
797 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(trackIndex));
807 if( cluster->GetNTracksMatched() < 1 )
return 0x0;
813 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",cluster->ClassName())))
815 if( index >= 0 ) iTrack = index;
816 else iTrack = cluster->GetTrackMatchedIndex();
818 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(iTrack) );
822 if( index > 0 ) iTrack = index;
824 track =
dynamic_cast<AliVTrack*
>( cluster->GetTrackMatched(iTrack) );
836 if( eCluster <= 0 || eCluster < eCell )
838 AliWarning(Form(
"Bad values eCell=%f, eCluster %f",eCell,eCluster));
842 Float_t frac = eCell / eCluster;
862 if(particle->GetDetectorTag()==
kEMCAL)
864 fEMCALGeo->GetAbsCellIdFromEtaPhi(particle->Eta(),particle->Phi(), absId);
866 AliDebug(2,Form(
"EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d",
867 particle->Eta(), particle->Phi()*TMath::RadToDeg(),absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
869 return fEMCALGeo->GetSuperModuleNumber(absId) ;
871 else if ( particle->GetDetectorTag() ==
kPHOS )
875 if(strcmp(inputEvent->ClassName(),
"AliMCEvent") == 0 )
878 Double_t z = 0., x=0.;
879 TParticle* primary = 0x0;
880 AliStack * stack = ((AliMCEvent*)inputEvent)->Stack();
884 primary = stack->Particle(particle->GetCaloLabel(0));
888 AliFatal(
"Stack not available, stop!");
893 fPHOSGeo->ImpactOnEmc(primary,mod,z,x) ;
897 AliFatal(
"Primary not available, stop!");
922 AliDebug(1,
"AliCalorimeterUtils::GetModuleNumber() - NUL Cluster, please check!!!");
927 if ( cluster->GetNCells() <= 0 )
return -1;
929 Int_t absId = cluster->GetCellAbsId(0);
931 if ( absId < 0 )
return -1;
933 if( cluster->IsEMCAL() )
935 AliDebug(2,Form(
"EMCAL absid %d, SuperModule %d",absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
937 return fEMCALGeo->GetSuperModuleNumber(absId) ;
939 else if ( cluster->IsPHOS() )
942 fPHOSGeo->AbsToRelNumbering(absId,relId);
944 AliDebug(2,Form(
"PHOS absid %d Module %d",absId, relId[0]-1));
956 Int_t & icol, Int_t & irow, Int_t & iRCU)
const
960 if ( absId < 0 )
return -1 ;
964 Int_t iTower = -1, iIphi = -1, iIeta = -1;
965 fEMCALGeo->GetCellIndex(absId,imod,iTower,iIphi,iIeta);
966 fEMCALGeo->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,irow,icol);
968 if(imod < 0 || irow < 0 || icol < 0 )
970 AliFatal(Form(
"Negative value for super module: %d, or cell icol: %d, or cell irow: %d, check EMCAL geometry name",imod,icol,irow));
977 if ( imod == 13 || imod == 15 || imod == 17 ) ico2 += 16;
980 if(imod < 10 || (imod > 11 && imod < 18))
983 if ( 0 <= irow && irow < 8 ) iRCU = 0;
984 else if ( 8 <= irow && irow < 16 &&
985 0 <= ico2 && ico2 < 24 ) iRCU = 0;
989 else if ( 8 <= irow && irow < 16 &&
990 24 <= ico2 && ico2 < 48 ) iRCU = 1;
992 else if ( 16 <= irow && irow < 24 ) iRCU = 1;
994 if ( imod%2 == 1 ) iRCU = 1 - iRCU;
1003 AliFatal(Form(
"Wrong EMCAL RCU number = %d", iRCU));
1010 fPHOSGeo->AbsToRelNumbering(absId,relId);
1015 iRCU= (Int_t)(relId[2]-1)/16 ;
1020 AliFatal(Form(
"Wrong PHOS RCU number = %d", iRCU));
1033 const Int_t nc = cluster->GetNCells();
1035 Int_t absIdList[nc];
1036 Float_t maxEList[nc];
1047 Int_t *absIdList, Float_t *maxEList)
1053 const Int_t nCells = cluster->GetNCells();
1057 Float_t simuTotWeight = 0;
1061 simuTotWeight/= eCluster;
1065 if(!cluster->IsEMCAL()) calorimeter =
kPHOS;
1071 for(iDigit = 0; iDigit < nCells ; iDigit++)
1073 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit] ;
1074 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1083 idmax = absIdList[iDigit] ;
1090 for(iDigit = 0 ; iDigit < nCells; iDigit++)
1092 if( absIdList[iDigit] >= 0 )
1094 absId1 = cluster->GetCellsAbsId()[iDigit];
1096 Float_t en1 = cells->GetCellAmplitude(absId1);
1104 for(iDigitN = 0; iDigitN < nCells; iDigitN++)
1106 absId2 = cluster->GetCellsAbsId()[iDigitN] ;
1108 if(absId2==-1 || absId2==absId1)
continue;
1112 Float_t en2 = cells->GetCellAmplitude(absId2);
1125 absIdList[iDigitN] = -1 ;
1130 absIdList[iDigit] = -1 ;
1135 absIdList[iDigit] = -1 ;
1140 absIdList[iDigitN] = -1 ;
1151 for(iDigit = 0; iDigit < nCells; iDigit++)
1153 if( absIdList[iDigit] >= 0 )
1155 absIdList[iDigitN] = absIdList[iDigit] ;
1157 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1165 maxEList[iDigitN] = en ;
1174 AliDebug(1,Form(
"No local maxima found, assign highest energy cell as maxima, id %d, en cell %2.2f, en cluster %2.2f",
1175 idmax,emax,cluster->E()));
1177 maxEList[0] = emax ;
1178 absIdList[0] = idmax ;
1182 AliDebug(1,Form(
"In cluster E %2.2f (wth non lin. %2.2f), M02 %2.2f, M20 %2.2f, N maxima %d",
1183 cluster->E(),eCluster, cluster->GetM02(),cluster->GetM20(), iDigitN));
1198 if (!AliAnalysisManager::GetAnalysisManager()->GetTree())
1200 AliError(
"AliCalorimeterUtils::GetPass() - Pointer to tree = 0, returning null");
1204 if (!AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile())
1206 AliError(
"AliCalorimeterUtils::GetPass() - Null pointer input file, returning null");
1210 TString pass(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());
1211 if (pass.Contains(
"ass1"))
return TString(
"pass1");
1212 else if (pass.Contains(
"ass2"))
return TString(
"pass2");
1213 else if (pass.Contains(
"ass3"))
return TString(
"pass3");
1214 else if (pass.Contains(
"ass4"))
return TString(
"pass4");
1215 else if (pass.Contains(
"ass5"))
return TString(
"pass5");
1216 else if (pass.Contains(
"LHC11c") && pass.Contains(
"spc_calo") )
return TString(
"spc_calo");
1217 else if (pass.Contains(
"calo") || pass.Contains(
"high_lumi"))
1219 AliInfo(
"Path contains <calo> or <high-lumi>, set as <pass1>");
1220 return TString(
"pass1");
1224 AliInfo(
"Pass number string not found");
1276 AliDebug(1,
"Init bad channel map");
1279 Bool_t oldStatus = TH1::AddDirectoryStatus();
1280 TH1::AddDirectory(kFALSE);
1283 for (
int i = 0; i < 5; i++)
fPHOSBadChannelMap->Add(
new TH2I(Form(
"PHOS_BadMap_mod%d",i),
1284 Form(
"PHOS_BadMap_mod%d",i),
1285 64, 0, 64, 56, 0, 56));
1291 TH1::AddDirectory(oldStatus);
1299 AliDebug(1,
"Init recalibration map");
1302 Bool_t oldStatus = TH1::AddDirectoryStatus();
1303 TH1::AddDirectory(kFALSE);
1306 for (
int i = 0; i < 5; i++)
1309 Form(
"PHOSRecalFactors_Mod%d",i),
1310 64, 0, 64, 56, 0, 56));
1314 for (Int_t m = 0; m < 5; m++)
1316 for (Int_t i = 0; i < 56; i++)
1318 for (Int_t j = 0; j < 64; j++)
1329 TH1::AddDirectory(oldStatus);
1369 else if (!gGeoManager) AliInfo(
"Careful!, gGeoManager not loaded, load misalign matrices");
1393 if(!particle || (calo!=
kEMCAL && calo!=
kPHOS))
return kFALSE ;
1398 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1405 Double_t x = 0, z = 0 ;
1411 Bool_t ok =
GetEMCALGeometry()->GetAbsCellIdFromEtaPhi(particle->Eta(),particle->Phi(),absID);
1414 Int_t icol = -1, irow = -1, iRCU = -1;
1417 if(status > 0) ok = kFALSE;
1431 if(!particle || (calo!=
kEMCAL && calo!=
kPHOS))
return kFALSE ;
1436 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1440 Float_t phi = particle->Phi();
1441 if(phi < 0) phi+=TMath::TwoPi();
1446 Double_t x = 0, z = 0 ;
1447 Double_t vtx[]={ particle->Xv(), particle->Yv(), particle->Zv() } ;
1448 return GetPHOSGeometry()->ImpactOnEmc(vtx, particle->Theta(), phi, mod, z, x) ;
1453 Bool_t ok =
GetEMCALGeometry()->GetAbsCellIdFromEtaPhi(particle->Eta(),phi,absID);
1456 Int_t icol = -1, irow = -1, iRCU = -1;
1459 if(status > 0) ok = kFALSE;
1472 Float_t phiOrg, Int_t & absID)
1479 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1483 Float_t phi = phiOrg;
1484 if(phi < 0) phi+=TMath::TwoPi();
1489 Double_t x = 0, z = 0 ;
1490 Double_t vtx[]={0,0,0} ;
1498 Int_t icol = -1, irow = -1, iRCU = -1;
1501 if(status > 0) ok = kFALSE;
1517 if ( iSM%2 ) icol+=48;
1538 printf(
"***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
1540 printf(
"Remove Clusters with max cell at less than %d cells from EMCAL border and %d cells from PHOS border\n",
1542 if(
fEMCALRecoUtils->IsEMCALNoBorderAtEta0()) printf(
"Do not remove EMCAL clusters at Eta = 0\n");
1546 printf(
"Matching criteria: dR < %2.2f[cm], dZ < %2.2f[cm]\n",
fCutR,
fCutZ);
1559 Int_t icol = -1; Int_t irow = -1; Int_t iRCU = -1;
1590 AliVCaloCells * cells)
1593 Float_t frac = 0., energy = 0.;
1599 UShort_t * index = cluster->GetCellsAbsId() ;
1600 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
1602 Int_t ncells = cluster->GetNCells();
1605 if(cluster->IsPHOS()) calo =
kPHOS ;
1608 for(Int_t icell = 0; icell < ncells; icell++)
1610 Int_t absId = index[icell];
1612 frac = fraction[icell];
1613 if(frac < 1e-3) frac = 1;
1615 Float_t amp = cells->GetCellAmplitude(absId);
1618 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy: before cal %f; after cal %f",
1619 calo,frac,cells->GetCellAmplitude(absId),amp));
1624 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),energy));
1629 AliFatal(
"Cells pointer does not exist!");
1640 AliVCaloCells * cells, Float_t energyOrg)
1643 Float_t frac = 0., energy = 0.;
1649 UShort_t * index = cluster->GetCellsAbsId() ;
1650 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
1652 Int_t ncells = cluster->GetNCells();
1655 if(cluster->IsPHOS()) calo =
kPHOS ;
1658 for(Int_t icell = 0; icell < ncells; icell++)
1660 Int_t absId = index[icell];
1662 frac = fraction[icell];
1663 if(frac < 1e-3) frac = 1;
1665 Float_t amp = cells->GetCellAmplitude(absId);
1670 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy %f",
1671 calo,frac,cells->GetCellAmplitude(absId)));
1676 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),energy));
1680 AliFatal(
"Cells pointer does not exist!");
1698 TObjArray* clusterArray)
1726 AliVCluster* cluster,
1727 AliVCaloCells* cells,
1729 AliAODCaloCluster* cluster1,
1730 AliAODCaloCluster* cluster2,
1731 Int_t nMax, Int_t eventNumber)
1733 TH2F* hClusterMap = 0 ;
1734 TH2F* hClusterLocMax = 0 ;
1735 TH2F* hCluster1 = 0 ;
1736 TH2F* hCluster2 = 0 ;
1740 hClusterMap =
new TH2F(
"hClusterMap",
"Cluster Map",48,0,48,24,0,24);
1741 hClusterLocMax =
new TH2F(
"hClusterLocMax",
"Cluster 2 highest local maxima",48,0,48,24,0,24);
1742 hCluster1 =
new TH2F(
"hCluster1",
"Cluster 1",48,0,48,24,0,24);
1743 hCluster2 =
new TH2F(
"hCluster2",
"Cluster 2",48,0,48,24,0,24);
1744 hClusterMap ->SetXTitle(
"column");
1745 hClusterMap ->SetYTitle(
"row");
1746 hClusterLocMax ->SetXTitle(
"column");
1747 hClusterLocMax ->SetYTitle(
"row");
1748 hCluster1 ->SetXTitle(
"column");
1749 hCluster1 ->SetYTitle(
"row");
1750 hCluster2 ->SetXTitle(
"column");
1751 hCluster2 ->SetYTitle(
"row");
1755 if(cluster->IsPHOS())
1758 AliWarning(
"Not supported for PHOS yet");
1762 const Int_t ncells = cluster->GetNCells();
1763 Int_t absIdList[ncells];
1765 Float_t e1 = 0, e2 = 0 ;
1766 Int_t icol = -1, irow = -1, iRCU = -1, sm = -1;
1767 Float_t eCluster = 0;
1768 Float_t minCol = 100, minRow = 100, maxCol = -1, maxRow = -1;
1769 for(Int_t iDigit = 0; iDigit < ncells; iDigit++ )
1771 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit];
1773 Float_t ec = cells->GetCellAmplitude(absIdList[iDigit]);
1781 if(sm > -1 && sm < 12)
1783 if(icol > maxCol) maxCol = icol;
1784 if(icol < minCol) minCol = icol;
1785 if(irow > maxRow) maxRow = irow;
1786 if(irow < minRow) minRow = irow;
1787 hClusterMap->Fill(icol,irow,ec);
1794 UShort_t absIdList1[9] ;
1795 Double_t fracList1 [9] ;
1796 absIdList1[0] = absId1 ;
1797 fracList1 [0] = 1. ;
1799 Float_t ecell1 = cells->GetCellAmplitude(absId1);
1804 UShort_t absIdList2[9] ;
1805 Double_t fracList2 [9] ;
1806 absIdList2[0] = absId2 ;
1807 fracList2 [0] = 1. ;
1809 Float_t ecell2 = cells->GetCellAmplitude(absId2);
1815 Int_t icol1 = -1, irow1 = -1, icol2 = -1, irow2 = -1;
1817 hClusterLocMax->Fill(icol1,irow1,ecell1);
1819 hClusterLocMax->Fill(icol2,irow2,ecell2);
1823 Float_t eRemain = (eCluster-ecell1-ecell2)/2;
1824 Float_t shareFraction1 = ecell1/eCluster+eRemain/eCluster;
1825 Float_t shareFraction2 = ecell2/eCluster+eRemain/eCluster;
1827 for(Int_t iDigit = 0; iDigit < ncells; iDigit++)
1829 Int_t absId = absIdList[iDigit];
1831 if ( absId==absId1 || absId==absId2 || absId < 0 )
continue;
1833 Float_t ecell = cells->GetCellAmplitude(absId);
1838 absIdList1[ncells1]= absId;
1842 fracList1[ncells1] = shareFraction1;
1843 e1 += ecell*shareFraction1;
1847 fracList1[ncells1] = 1.;
1857 absIdList2[ncells2]= absId;
1861 fracList2[ncells2] = shareFraction2;
1862 e2 += ecell*shareFraction2;
1866 fracList2[ncells2] = 1.;
1875 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",
1876 nMax, eCluster,ecell1,ecell2,e1,e2,eCluster-e1-e2,ncells,ncells1,ncells2,shareFraction1,shareFraction2,shareFraction1+shareFraction2));
1881 cluster1->SetNCells(ncells1);
1882 cluster2->SetNCells(ncells2);
1884 cluster1->SetCellsAbsId(absIdList1);
1885 cluster2->SetCellsAbsId(absIdList2);
1887 cluster1->SetCellsAmplitudeFraction(fracList1);
1888 cluster2->SetCellsAmplitudeFraction(fracList2);
1903 for(Int_t iDigit = 0; iDigit < ncells1; iDigit++ )
1909 Float_t ecell = cells->GetCellAmplitude(absIdList1[iDigit]);
1912 if(
AreNeighbours(calorimeter, absId2,absIdList1[iDigit]) && absId1!=absIdList1[iDigit])
1913 hCluster1->Fill(icol,irow,ecell*shareFraction1);
1915 hCluster1->Fill(icol,irow,ecell);
1921 for(Int_t iDigit = 0; iDigit < ncells2; iDigit++ )
1927 Float_t ecell = cells->GetCellAmplitude(absIdList2[iDigit]);
1930 if(
AreNeighbours(calorimeter, absId1,absIdList2[iDigit]) && absId2!=absIdList2[iDigit])
1931 hCluster2->Fill(icol,irow,ecell*shareFraction2);
1933 hCluster2->Fill(icol,irow,ecell);
1937 gStyle->SetPadRightMargin(0.1);
1938 gStyle->SetPadLeftMargin(0.1);
1939 gStyle->SetOptStat(0);
1940 gStyle->SetOptFit(000000);
1942 if(maxCol-minCol > maxRow-minRow)
1944 maxRow+= maxCol-minCol;
1948 maxCol+= maxRow-minRow;
1951 TCanvas * c=
new TCanvas(
"canvas",
"canvas", 4000, 4000) ;
1957 hClusterMap ->SetAxisRange(minCol, maxCol,
"X");
1958 hClusterMap ->SetAxisRange(minRow, maxRow,
"Y");
1959 hClusterMap ->Draw(
"colz TEXT");
1964 hClusterLocMax ->SetAxisRange(minCol, maxCol,
"X");
1965 hClusterLocMax ->SetAxisRange(minRow, maxRow,
"Y");
1966 hClusterLocMax ->Draw(
"colz TEXT");
1971 hCluster1 ->SetAxisRange(minCol, maxCol,
"X");
1972 hCluster1 ->SetAxisRange(minRow, maxRow,
"Y");
1973 hCluster1 ->Draw(
"colz TEXT");
1978 hCluster2 ->SetAxisRange(minCol, maxCol,
"X");
1979 hCluster2 ->SetAxisRange(minRow, maxRow,
"Y");
1980 hCluster2 ->Draw(
"colz TEXT");
1982 if(eCluster > 6 )c->Print(Form(
"clusterFigures/Event%d_E%1.0f_nMax%d_NCell1_%d_NCell2_%d.eps",
1983 eventNumber,cluster->E(),nMax,ncells1,ncells2));
1987 delete hClusterLocMax;
Bool_t fRecalculatePosition
Recalculate cluster position.
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
AliEMCALGeometry * fEMCALGeo
! EMCAL geometry pointer.
void InitPHOSRecalibrationFactors()
Init PHOS recalibration factors.
Bool_t IsRecalculationOfClusterTrackMatchingOn() const
TGeoHMatrix * fEMCALMatrix[22]
Geometry matrices with alignments.
Int_t GetPHOSChannelStatus(Int_t imod, Int_t iCol, Int_t iRow) const
Float_t fLocMaxCutEDiff
Local maxima cut, when aggregating cells, next can be a bit higher.
TGeoHMatrix * fPHOSMatrix[5]
Geometry matrices with alignments.
Bool_t ClusterContainsBadChannel(Int_t calo, UShort_t *cellList, Int_t nCells)
AliPHOSGeoUtils * fPHOSGeo
! PHOS geometry pointer.
AliEMCALRecoUtils * GetEMCALRecoUtils() const
void SwitchOnDistToBadChannelRecalculation()
AliPHOSGeoUtils * GetPHOSGeometry() const
Bool_t fOADBForEMCAL
Get calibration from OADB for EMCAL.
Float_t GetPHOSChannelRecalibrationFactor(Int_t imod, Int_t iCol, Int_t iRow) const
void RecalculateClusterTrackMatching(AliVEvent *event, TObjArray *clusterArray=0x0)
Recalculate track matching.
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.
Bool_t IsRecalibrationOn() const
Bool_t IsMCParticleInCalorimeterAcceptance(Int_t calo, TParticle *particle)
virtual void Print(const Option_t *opt) const
Print some relevant parameters set for the analysis.
Int_t GetModuleNumber(AliAODPWG4Particle *particle, AliVEvent *inputEvent) const
Get the EMCAL/PHOS module number that corresponds to this particle.
Bool_t fLoadEMCALMatrices
Matrices set from configuration, not get from geometry.root or from ESDs/AODs.
AliEMCALGeometry * GetEMCALGeometry() const
Bool_t fRecalculateMatching
Recalculate cluster position.
Bool_t MaskFrameCluster(Int_t iSM, Int_t ieta) const
Int_t GetMaxEnergyCell(AliVCaloCells *cells, const AliVCluster *clu, Float_t &fraction) const
For a given CaloCluster, it gets the absId of the cell with maximum energy deposit.
Bool_t fOADBForPHOS
Get calibration from OADB for PHOS.
Int_t * fMaskCellColumns
List of masked cells collumn index.
Bool_t fRemoveBadChannels
Check the channel status provided and remove clusters with bad channels.
void InitPHOSBadChannelStatusMap()
Init PHOS bad channels map.
virtual ~AliCalorimeterUtils()
AliCalorimeterUtils()
Constructor. Initialize parameters.
virtual void InitParameters()
Initialize the parameters of the analysis.
Int_t fNMaskCellColumns
Number of masked columns.
Bool_t IsClusterSharedByTwoSuperModules(const AliEMCALGeometry *geom, AliVCluster *cluster)
Int_t GetNumberOfLocalMaxima(AliVCluster *cluster, AliVCaloCells *cells)
Find the number of local maxima in cluster.
Float_t fMCECellClusFracCorrParam[4]
Parameters for the function correcting the weight of the cells in the cluster.
Bool_t fEMCALGeoMatrixSet
Check if the transformation matrix is set for EMCAL.
TH2I * GetPHOSChannelStatusMap(Int_t imod) const
void SetEMCALChannelRecalibrationFactor(Int_t iSM, Int_t iCol, Int_t iRow, Double_t c=1)
TString GetPass()
Get passx from filename.
void RecalculateClusterPosition(AliVCaloCells *cells, AliVCluster *clu)
Recalculate EMCAL cluster position.
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
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.
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.
Float_t fCutR
dR cut on matching (PHOS).
Float_t RecalibrateClusterEnergyWeightCell(AliVCluster *cluster, AliVCaloCells *cells, Float_t energyOrg)
void SplitEnergy(Int_t absId1, Int_t absId2, AliVCluster *cluster, AliVCaloCells *cells, AliAODCaloCluster *cluster1, AliAODCaloCluster *cluster2, Int_t nMax, Int_t eventNumber=0)
Int_t GetModuleNumberCellIndexes(Int_t absId, Int_t calo, Int_t &icol, Int_t &irow, Int_t &iRCU) const
Get the EMCAL/PHOS module, columns, row and RCU/DDL number that corresponds to this absId...
TH2I * GetEMCALChannelStatusMap(Int_t iSM) const
void SetPHOSChannelRecalibrationFactor(Int_t imod, Int_t iCol, Int_t iRow, Double_t c=1)
Float_t RecalibrateClusterEnergy(AliVCluster *cluster, AliVCaloCells *cells)
Recalibrate the cluster energy, considering the recalibration map and the energy of the cells that co...
Bool_t CheckCellFiducialRegion(AliVCluster *cluster, AliVCaloCells *cells) const