17 #include <TGeoManager.h>
23 #include <TParticle.h>
27 #include "AliESDEvent.h"
28 #include "AliMCEvent.h"
30 #include "AliAODPWG4Particle.h"
31 #include "AliVCluster.h"
32 #include "AliVCaloCells.h"
33 #include "AliAODCaloCluster.h"
34 #include "AliOADBContainer.h"
35 #include "AliAnalysisManager.h"
36 #include "AliAODMCParticle.h"
40 #include "AliEMCALGeometry.h"
41 #include "AliPHOSGeoUtils.h"
57 fEMCALGeo(0x0), fPHOSGeo(0x0),
58 fEMCALGeoMatrixSet(kFALSE), fPHOSGeoMatrixSet(kFALSE),
59 fLoadEMCALMatrices(kFALSE), fLoadPHOSMatrices(kFALSE),
60 fRemoveBadChannels(kFALSE), fPHOSBadChannelMap(0x0),
61 fNCellsFromPHOSBorder(0),
62 fNMaskCellColumns(0), fMaskCellColumns(0x0),
63 fRecalibration(kFALSE), fRunDependentCorrection(kFALSE),
64 fPHOSRecalibrationFactors(), fEMCALRecoUtils(new AliEMCALRecoUtils),
65 fRecalculatePosition(kFALSE), fCorrectELinearity(kFALSE),
66 fRecalculateMatching(kFALSE),
68 fCutEta(20), fCutPhi(20),
69 fLocMaxCutE(0), fLocMaxCutEDiff(0),
70 fPlotCluster(0), fOADBSet(kFALSE),
71 fOADBForEMCAL(kFALSE), fOADBForPHOS(kFALSE),
72 fOADBFilePathEMCAL(
""), fOADBFilePathPHOS(
""),
73 fImportGeometryFromFile(0), fImportGeometryFilePath(
""),
74 fNSuperModulesUsed(0), fRunNumber(0),
75 fMCECellClusFracCorrOn(0), fMCECellClusFracCorrParam()
128 AliOADBContainer *contBC=
new AliOADBContainer(
"");
129 contBC->InitFromFile(Form(
"%s/EMCALBadChannels.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALBadChannels");
136 AliInfo(
"Remove EMCAL bad cells");
138 for (
Int_t i=0; i<nSM; ++i)
145 hbm=(TH2I*)arrayBC->FindObject(Form(
"EMCALBadChannelMap_Mod%d",i));
149 AliError(Form(
"Can not get EMCALBadChannelMap_Mod%d",i));
153 hbm->SetDirectory(0);
157 }
else AliInfo(
"Do NOT remove EMCAL bad channels\n");
165 AliOADBContainer *contRF=
new AliOADBContainer(
"");
167 contRF->InitFromFile(Form(
"%s/EMCALRecalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRecalib");
181 AliInfo(
"Recalibrate EMCAL");
182 for (
Int_t i=0; i < nSM; ++i)
189 h = (
TH2F*)recalib->FindObject(Form(
"EMCALRecalFactors_SM%d",i));
193 AliError(Form(
"Could not load EMCALRecalFactors_SM%d",i));
201 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params object array");
202 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for pass");
203 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for run");
214 AliOADBContainer *contRFTD=
new AliOADBContainer(
"");
216 contRFTD->InitFromFile(Form(
"%s/EMCALTemperatureCorrCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRunDepTempCalibCorrections");
218 TH1S *htd=(TH1S*)contRFTD->GetObject(
fRunNumber);
223 AliWarning(Form(
"No TemperatureCorrCalib Objects for run: %d",
fRunNumber));
227 Int_t maxEntry = contRFTD->GetNumberOfEntries();
229 while ( (ic < maxEntry) && (contRFTD->UpperLimit(ic) <
fRunNumber) )
235 Int_t closest = lower;
236 if ( (ic<maxEntry) &&
242 AliWarning(Form(
"TemperatureCorrCalib Objects found closest id %d from run: %d", closest, contRFTD->LowerLimit(closest)));
243 htd = (TH1S*) contRFTD->GetObjectByIndex(closest);
248 AliInfo(
"Recalibrate (Temperature) EMCAL");
250 for (
Int_t ism=0; ism<nSM; ++ism)
252 for (
Int_t icol=0; icol<48; ++icol)
254 for (
Int_t irow=0; irow<24; ++irow)
258 Int_t absID =
fEMCALGeo->GetAbsCellIdFromCellIndexes(ism, irow, icol);
259 factor *= htd->GetBinContent(absID) / 10000. ;
268 }
else AliInfo(
"Do NOT recalibrate EMCAL with T variations, no params TH1");
276 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
278 contTRF->InitFromFile(Form(
"%s/EMCALTimeCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeCalib");
285 if(pass==
"spc_calo") passM =
"pass3";
290 AliInfo(
"Time Recalibrate EMCAL");
291 for (
Int_t ibc = 0; ibc < 4; ++ibc)
298 h = (TH1F*)trecalpass->FindObject(Form(
"hAllTimeAvBC%d",ibc));
302 AliError(Form(
"Could not load hAllTimeAvBC%d",ibc));
310 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for pass");
311 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for run");
319 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
320 contTRF->InitFromFile(Form(
"%s/EMCALTimeL1PhaseCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeL1PhaseCalib");
325 AliError(Form(
"L1 phase time recal: No params for run %d. Default used.",
fRunNumber));
326 trecal=(
TObjArray*)contTRF->GetObject(0);
333 if (pass==
"calo_spc") passM =
"pass1";
334 if (pass==
"muon_calo_pass1") passM =
"pass0";
335 if (pass==
"muon_calo_pass2" || pass==
"pass2" || pass==
"pass3" || pass==
"pass4") passM =
"pass1";
340 AliInfo(Form(
"L1 phase time recal: No params for run %d and pass %s, try default",
fRunNumber, passM.Data()));
344 trecal=(
TObjArray*)contTRF->GetObject(0);
347 trecalpass=(
TObjArray*)trecal->FindObject(
"pass1");
349 AliInfo(
"Time L1 phase Recalibrate EMCAL");
358 h = (TH1C*)trecalpass->FindObject(Form(
"h%d",
fRunNumber));
360 if (!h) AliError(Form(
"Could not load h%d",
fRunNumber));
368 AliError(
"Do not calibrate L1 phase time");
374 AliError(
"Do not calibrate L1 phase time");
391 AliOADBContainer badmapContainer(Form(
"phosBadMap"));
393 badmapContainer.InitFromFile(Form(
"%s/PHOSBadMaps.root",
fOADBFilePathPHOS.Data()),
"phosBadMap");
399 AliInfo(Form(
"Can not read PHOS bad map for run %d",
fRunNumber)) ;
403 AliInfo(Form(
"Setting PHOS bad map with name %s",maps->GetName())) ;
405 for(
Int_t mod = 1; mod < 5; mod++)
412 hbmPH = (TH2I*)maps->At(mod);
414 if(hbmPH) hbmPH->SetDirectory(0);
444 AliInfo(
"Load user defined EMCAL geometry matrices");
447 AliOADBContainer emcGeoMat(
"AliEMCALgeo");
448 emcGeoMat.InitFromFile(Form(
"%s/EMCALlocal2master.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALgeo");
451 for(
Int_t mod=0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
455 AliDebug(1,Form(
"EMCAL matrices SM %d, %p", mod,((TGeoHMatrix*) matEMCAL->At(mod))));
470 AliWarning(Form(
"Set matrix for SM %d from gGeoManager",mod));
471 fEMCALGeo->SetMisalMatrix(
fEMCALGeo->GetMatrixForSuperModuleFromGeoManager(mod),mod) ;
475 AliError(Form(
"Alignment atrix for SM %d is not available",mod));
482 else if (!gGeoManager)
484 AliDebug(1,
"Load EMCAL misalignment matrices");
485 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
487 for(
Int_t mod = 0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
490 if(((
AliESDEvent*)inputEvent)->GetEMCALMatrix(mod))
501 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
515 AliInfo(
"Load user defined PHOS geometry matrices");
518 AliOADBContainer geomContainer(
"phosGeo");
519 geomContainer.InitFromFile(Form(
"%s/PHOSGeometry.root",
fOADBFilePathPHOS.Data()),
"PHOSRotationMatrixes");
520 TObjArray *matPHOS = (
TObjArray*)geomContainer.GetObject(139000,
"PHOSRotationMatrixes");
522 for(
Int_t mod = 0 ; mod < 5 ; mod++)
526 AliDebug(1,Form(
"PHOS matrices module %d, %p",mod,((TGeoHMatrix*) matPHOS->At(mod))));
529 fPHOSMatrix[mod] = (TGeoHMatrix*) matPHOS->At(mod) ;
545 else if (!gGeoManager)
547 AliDebug(1,
"Load PHOS misalignment matrices.");
548 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
550 for(
Int_t mod = 0; mod < 5; mod++)
552 if( ((
AliESDEvent*)inputEvent)->GetPHOSMatrix(mod))
563 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
579 Bool_t areNeighbours = kFALSE ;
581 Int_t iRCU1 = -1, irow1 = -1, icol1 = -1;
582 Int_t iRCU2 = -1, irow2 = -1, icol2 = -1;
584 Int_t rowdiff = 0, coldiff = 0;
593 if(nSupMod1%2) icol1+=AliEMCALGeoParams::fgkEMCALCols;
594 else icol2+=AliEMCALGeoParams::fgkEMCALCols;
597 rowdiff = TMath::Abs( irow1 - irow2 ) ;
598 coldiff = TMath::Abs( icol1 - icol2 ) ;
601 if ((coldiff + rowdiff == 1 ))
602 areNeighbours = kTRUE ;
604 return areNeighbours;
612 AliVCluster* cluster)
622 for(
Int_t iDigit = 0; iDigit < cluster->GetNCells(); iDigit++)
625 geom->GetCellIndex(cluster->GetCellAbsId(iDigit),iSupMod,iTower,iIphi,iIeta);
626 geom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi,iIeta, iphi,ieta);
629 if (iDigit == 0 ) iSM0 = iSupMod;
630 else if(iSupMod != iSM0)
632 if(iSupMod > 11 && iSupMod < 18)
633 AliWarning(Form(
"Cluster shared in 2 DCal: SM%d, SM%d??",iSupMod,iSM0));
647 AliVCaloCells* cells)
const
651 if ( cells->GetType()==AliVCaloCells::kEMCALCell &&
fEMCALRecoUtils->GetNumberOfCellsFromEMCALBorder() <= 0 )
return kTRUE;
658 for(
Int_t i = 0; i < cluster->GetNCells() ; i++)
660 Int_t absId = cluster->GetCellAbsId(i) ;
661 Float_t amp = cells->GetCellAmplitude(absId);
670 AliDebug(1,Form(
"Cluster Max AbsId %d, Cell Energy %2.2f, Cluster Energy %2.2f",
671 absIdMax, ampMax, cluster->E()));
673 if ( absIdMax == -1 )
return kFALSE;
679 if ( cells->GetType() == AliVCaloCells::kEMCALCell )
684 Int_t iTower = -1, iIphi = -1, iIeta = -1, iphi = -1, ieta = -1, iSM = -1;
686 fEMCALGeo->GetCellIndex(absIdMax,iSM,iTower,iIphi,iIeta);
688 fEMCALGeo->GetCellPhiEtaIndexInSModule(iSM,iTower,iIphi, iIeta,iphi,ieta);
690 if(iSM < 0 || iphi < 0 || ieta < 0 )
692 AliFatal(Form(
"Negative value for super module: %d, or cell ieta: %d, or cell iphi: %d, check EMCAL geometry name",iSM,ieta,iphi));
698 if ( iSM < 10 || (iSM > 11 && iSM < 18) )
700 if(iphi >= nborder && iphi < 24-nborder) okrow = kTRUE;
704 if(iphi >= nborder && iphi < 8-nborder) okrow = kTRUE;
710 if(!
fEMCALRecoUtils->IsEMCALNoBorderAtEta0() || (iSM > 11 && iSM < 18))
712 if(ieta > nborder && ieta < 48-nborder) okcol =kTRUE;
718 if(ieta >= nborder) okcol = kTRUE;
722 if(ieta < 48-nborder) okcol = kTRUE;
726 AliDebug(1,Form(
"EMCAL Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
727 nborder, ieta, iphi, iSM,okrow,okcol));
730 else if ( cells->GetType() == AliVCaloCells::kPHOSCell )
733 Int_t irow = -1, icol = -1;
734 fPHOSGeo->AbsToRelNumbering(absIdMax,relId);
736 if (relId[1] != 0 )
return kFALSE;
742 if(irow >= fNCellsFromPHOSBorder && irow < 64-fNCellsFromPHOSBorder) okrow =kTRUE;
743 if(icol >= fNCellsFromPHOSBorder && icol < 56-fNCellsFromPHOSBorder) okcol =kTRUE;
745 AliDebug(1,Form(
"PHOS Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
746 fNCellsFromPHOSBorder, icol, irow, relId[0]-1,okrow,okcol));
749 if (okcol && okrow)
return kTRUE;
768 for(
Int_t iCell = 0; iCell<nCells; iCell++)
778 fPHOSGeo->AbsToRelNumbering(cellList[iCell],relId);
780 if (relId[1] != 0 )
return kTRUE;
817 regEta = regPhi = -1 ;
819 if(!clus->IsEMCAL())
return ;
821 Int_t icol = -1, irow = -1, iRCU = -1;
829 if( sm%2 == 1) icol+=AliEMCALGeoParams::fgkEMCALCols;
832 if(icol < 2 || icol > 93 || irow < 2 || irow > 21)
return;
839 if ( icol > 9 && icol < 34 ) regEta = 0;
840 else if ( icol > 62 && icol < 87 ) regEta = 0;
844 else if ( icol <= 9 && icol >= 5 ) regEta = 3;
845 else if ( icol <= 38 && icol >= 34 ) regEta = 3;
846 else if ( icol <= 62 && icol >= 58 ) regEta = 3;
847 else if ( icol <= 91 && icol >= 87 ) regEta = 3;
851 else if ( icol < 58 && icol > 38 ) regEta = 1 ;
861 if ( irow >= 2 && irow <= 5 ) regPhi = 0;
862 else if ( irow >= 18 && irow <= 21 ) regPhi = 0;
863 else if ( irow >= 6 && irow <= 9 ) regPhi = 1;
864 else if ( irow >= 14 && irow <= 17 ) regPhi = 1;
874 Float_t & clusterFraction)
const
878 AliInfo(
"Cluster or cells pointer is null!");
887 Int_t cellAbsId =-1 , absId =-1 ;
888 Int_t iSupMod =-1 , ieta =-1 , iphi = -1, iRCU = -1;
893 for (
Int_t iDig=0; iDig< clu->GetNCells(); iDig++)
895 cellAbsId = clu->GetCellAbsId(iDig);
897 fraction = clu->GetCellAmplitudeFraction(iDig);
898 if(fraction < 1e-4) fraction = 1.;
910 eCell = cells->GetCellAmplitude(cellAbsId)*fraction*recalFactor;
923 clusterFraction = (eTot-eMax)/eTot;
936 AliVEvent* event,
Int_t index)
const
938 AliVTrack *track = 0x0;
949 AliInfo(Form(
"Wrong track index %d, from recalculation", trackIndex));
951 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(trackIndex));
961 if( cluster->GetNTracksMatched() < 1 )
return 0x0;
967 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",cluster->ClassName())))
969 if( index >= 0 ) iTrack = index;
970 else iTrack = ((AliESDCaloCluster*)cluster)->GetTracksMatched()->At(0);
972 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(iTrack) );
976 if( index > 0 ) iTrack = index;
978 track =
dynamic_cast<AliVTrack*
>( cluster->GetTrackMatched(iTrack) );
990 if( eCluster <= 0 || eCluster < eCell )
992 AliWarning(Form(
"Bad values eCell=%f, eCluster %f",eCell,eCluster));
996 Float_t frac = eCell / eCluster;
1018 fEMCALGeo->GetAbsCellIdFromEtaPhi(particle->Eta(),particle->Phi(), absId);
1020 AliDebug(2,Form(
"EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d",
1021 particle->Eta(), particle->Phi()*TMath::RadToDeg(),absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1023 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1029 if(strcmp(inputEvent->ClassName(),
"AliMCEvent") == 0 )
1033 TParticle* primary = 0x0;
1034 AliStack * stack = ((AliMCEvent*)inputEvent)->Stack();
1038 primary = stack->Particle(particle->GetCaloLabel(0));
1042 AliFatal(
"Stack not available, stop!");
1047 fPHOSGeo->ImpactOnEmc(primary,mod,z,x) ;
1051 AliFatal(
"Primary not available, stop!");
1076 AliDebug(1,
"AliCalorimeterUtils::GetModuleNumber() - NUL Cluster, please check!!!");
1081 if ( cluster->GetNCells() <= 0 )
return -1;
1083 Int_t absId = cluster->GetCellAbsId(0);
1085 if ( absId < 0 )
return -1;
1087 if( cluster->IsEMCAL() )
1089 AliDebug(2,Form(
"EMCAL absid %d, SuperModule %d",absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1091 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1093 else if ( cluster->IsPHOS() )
1096 fPHOSGeo->AbsToRelNumbering(absId,relId);
1098 if (relId[1] != 0 )
return -1;
1100 AliDebug(2,Form(
"PHOS absid %d Module %d",absId, relId[0]-1));
1116 if ( absId < 0 )
return -1 ;
1120 Int_t iTower = -1, iIphi = -1, iIeta = -1;
1121 fEMCALGeo->GetCellIndex(absId,imod,iTower,iIphi,iIeta);
1122 fEMCALGeo->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,irow,icol);
1124 if(imod < 0 || irow < 0 || icol < 0 )
1126 AliFatal(Form(
"Negative value for super module: %d, or cell icol: %d, or cell irow: %d, check EMCAL geometry name",imod,icol,irow));
1133 if ( imod == 13 || imod == 15 || imod == 17 ) ico2 += 16;
1136 if(imod < 10 || (imod > 11 && imod < 18))
1139 if ( 0 <= irow && irow < 8 ) iRCU = 0;
1140 else if ( 8 <= irow && irow < 16 &&
1141 0 <= ico2 && ico2 < 24 ) iRCU = 0;
1145 else if ( 8 <= irow && irow < 16 &&
1146 24 <= ico2 && ico2 < 48 ) iRCU = 1;
1148 else if ( 16 <= irow && irow < 24 ) iRCU = 1;
1150 if ( imod%2 == 1 ) iRCU = 1 - iRCU;
1159 AliFatal(Form(
"Wrong EMCAL RCU number = %d", iRCU));
1166 fPHOSGeo->AbsToRelNumbering(absId,relId);
1168 if (relId[1] != 0 )
return -1;
1173 iRCU= (
Int_t)(relId[2]-1)/16 ;
1178 AliFatal(Form(
"Wrong PHOS RCU number = %d", iRCU));
1204 irowAbs = irow + 64 * imod;
1215 Int_t shiftEta = 48;
1218 if ( imod > 11 && imod < 18) shiftEta+=48/3;
1220 icolAbs = (imod % 2) ? icol + shiftEta : icol;
1224 irowAbs = irow + 24 *
Int_t(imod / 2);
1227 if ( imod > 11 && imod < 20) irowAbs -= (2*24 / 3);
1239 const Int_t nc = cluster->GetNCells();
1241 Int_t absIdList[nc];
1259 const Int_t nCells = cluster->GetNCells();
1267 simuTotWeight/= eCluster;
1277 for(iDigit = 0; iDigit < nCells ; iDigit++)
1279 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit] ;
1280 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1289 idmax = absIdList[iDigit] ;
1296 for(iDigit = 0 ; iDigit < nCells; iDigit++)
1298 if( absIdList[iDigit] >= 0 )
1300 absId1 = cluster->GetCellsAbsId()[iDigit];
1302 Float_t en1 = cells->GetCellAmplitude(absId1);
1310 for(iDigitN = 0; iDigitN < nCells; iDigitN++)
1312 absId2 = cluster->GetCellsAbsId()[iDigitN] ;
1314 if(absId2==-1 || absId2==absId1)
continue;
1318 Float_t en2 = cells->GetCellAmplitude(absId2);
1331 absIdList[iDigitN] = -1 ;
1336 absIdList[iDigit] = -1 ;
1341 absIdList[iDigit] = -1 ;
1346 absIdList[iDigitN] = -1 ;
1357 for(iDigit = 0; iDigit < nCells; iDigit++)
1359 if( absIdList[iDigit] >= 0 )
1361 absIdList[iDigitN] = absIdList[iDigit] ;
1363 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1371 maxEList[iDigitN] = en ;
1380 AliDebug(1,Form(
"No local maxima found, assign highest energy cell as maxima, id %d, en cell %2.2f, en cluster %2.2f",
1381 idmax,emax,cluster->E()));
1383 maxEList[0] = emax ;
1384 absIdList[0] = idmax ;
1388 AliDebug(1,Form(
"In cluster E %2.2f (wth non lin. %2.2f), M02 %2.2f, M20 %2.2f, N maxima %d",
1389 cluster->E(),eCluster, cluster->GetM02(),cluster->GetM20(), iDigitN));
1404 if (!AliAnalysisManager::GetAnalysisManager()->GetTree())
1406 AliError(
"AliCalorimeterUtils::GetPass() - Pointer to tree = 0, returning null");
1410 if (!AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile())
1412 AliError(
"AliCalorimeterUtils::GetPass() - Null pointer input file, returning null");
1416 TString pass(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());
1417 if (pass.Contains(
"ass1"))
return TString(
"pass1");
1418 else if (pass.Contains(
"ass2"))
return TString(
"pass2");
1419 else if (pass.Contains(
"ass3"))
return TString(
"pass3");
1420 else if (pass.Contains(
"ass4"))
return TString(
"pass4");
1421 else if (pass.Contains(
"ass5"))
return TString(
"pass5");
1422 else if (pass.Contains(
"LHC11c") && pass.Contains(
"spc_calo") )
return TString(
"spc_calo");
1423 else if (pass.Contains(
"calo") || pass.Contains(
"high_lumi"))
1425 AliInfo(
"Path contains <calo> or <high-lumi>, set as <pass1>");
1428 else if (pass.Contains(
"LHC14a1a"))
1430 AliInfo(
"Check that Energy calibration was enabled for this MC production in the tender, clusterizer or here!!");
1436 AliInfo(
"Pass number string not found");
1488 AliDebug(1,
"Init bad channel map");
1491 Bool_t oldStatus = TH1::AddDirectoryStatus();
1492 TH1::AddDirectory(kFALSE);
1495 for (
int i = 0; i < 5; i++)
fPHOSBadChannelMap->Add(
new TH2I(Form(
"PHOS_BadMap_mod%d",i),
1496 Form(
"PHOS_BadMap_mod%d",i),
1497 64, 0, 64, 56, 0, 56));
1503 TH1::AddDirectory(oldStatus);
1511 AliDebug(1,
"Init recalibration map");
1514 Bool_t oldStatus = TH1::AddDirectoryStatus();
1515 TH1::AddDirectory(kFALSE);
1518 for (
int i = 0; i < 5; i++)
1521 Form(
"PHOSRecalFactors_Mod%d",i),
1522 64, 0, 64, 56, 0, 56));
1526 for (
Int_t m = 0; m < 5; m++)
1528 for (
Int_t i = 0; i < 56; i++)
1530 for (
Int_t j = 0; j < 64; j++)
1541 TH1::AddDirectory(oldStatus);
1556 AliInfo(Form(
"Get EMCAL geometry name to <%s> for run %d",
fEMCALGeo->GetName(),
fRunNumber));
1561 AliInfo(Form(
"Set EMCAL geometry name to <%s>",
fEMCALGeoName.Data()));
1580 else if (!gGeoManager) AliInfo(
"Careful!, gGeoManager not loaded, load misalign matrices");
1609 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1625 Int_t icol = -1, irow = -1, iRCU = -1;
1628 if(status > 0) ok = kFALSE;
1647 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1651 Float_t phi = particle->Phi();
1652 if(phi < 0) phi+=TMath::TwoPi();
1658 Double_t vtx[]={ particle->Xv(), particle->Yv(), particle->Zv() } ;
1659 return GetPHOSGeometry()->ImpactOnEmc(vtx, particle->Theta(), phi, mod, z, x) ;
1667 Int_t icol = -1, irow = -1, iRCU = -1;
1670 if(status > 0) ok = kFALSE;
1690 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1695 if(phi < 0) phi+=TMath::TwoPi();
1709 Int_t icol = -1, irow = -1, iRCU = -1;
1712 if(status > 0) ok = kFALSE;
1728 if ( iSM%2 ) icol+=48;
1749 printf(
"***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
1751 printf(
"Remove Clusters with max cell at less than %d cells from EMCAL border and %d cells from PHOS border\n",
1753 if(
fEMCALRecoUtils->IsEMCALNoBorderAtEta0()) printf(
"Do not remove EMCAL clusters at Eta = 0\n");
1757 printf(
"Matching criteria: dR < %2.2f[cm], dZ < %2.2f[cm]\n",
fCutR,
fCutZ);
1816 AliVCaloCells * cells)
1825 UShort_t * index = cluster->GetCellsAbsId() ;
1826 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
1828 Int_t ncells = cluster->GetNCells();
1834 for(
Int_t icell = 0; icell < ncells; icell++)
1836 Int_t absId = index[icell];
1838 frac = fraction[icell];
1839 if(frac < 1e-3) frac = 1;
1841 Float_t amp = cells->GetCellAmplitude(absId);
1844 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy: before cal %f; after cal %f",
1845 calo,frac,cells->GetCellAmplitude(absId),amp));
1850 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
1855 AliFatal(
"Cells pointer does not exist!");
1866 AliVCaloCells * cells,
Float_t energyOrg)
1875 UShort_t * index = cluster->GetCellsAbsId() ;
1876 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
1878 Int_t ncells = cluster->GetNCells();
1884 for(
Int_t icell = 0; icell < ncells; icell++)
1886 Int_t absId = index[icell];
1888 frac = fraction[icell];
1889 if(frac < 1e-3) frac = 1;
1891 Float_t amp = cells->GetCellAmplitude(absId);
1896 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy %f",
1897 calo,frac,cells->GetCellAmplitude(absId)));
1902 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
1906 AliFatal(
"Cells pointer does not exist!");
1938 Int_t nClusters =
event->GetNumberOfCaloClusters();
1939 if(clusterArray) nClusters = clusterArray->GetEntriesFast();
1941 AliVCluster * clus = 0;
1943 for (
Int_t iclus = 0; iclus < nClusters ; iclus++)
1945 if ( clusterArray ) clus = (AliVCluster*) clusterArray->At(iclus) ;
1946 else clus =
event->GetCaloCluster(iclus) ;
1948 if (!clus->IsEMCAL())
continue ;
1955 if ( TMath::Abs(clus->GetTrackDx()) < 500 )
1956 AliDebug(2,Form(
"Residuals (Old, New): z (%2.4f,%2.4f), x (%2.4f,%2.4f)\n",
1957 clus->GetTrackDz(),dZ,clus->GetTrackDx(),dR));
1959 clus->SetTrackDistance(dR,dZ);
1964 if(clus->GetNTracksMatched() > 0)
1966 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
1969 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
1973 for(
Int_t iTrack = 0; iTrack < clus->GetNTracksMatched(); iTrack++)
1975 ((AliAODCaloCluster*)clus)->RemoveTrackMatched((
TObject*)((AliAODCaloCluster*)clus)->GetTrackMatched(iTrack));
1984 if ( trackIndex >= 0 )
1986 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
1989 arrayTrackMatched[0] = trackIndex;
1990 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
1994 ((AliAODCaloCluster*)clus)->AddTrackMatched((
TObject*)event->GetTrack(trackIndex));
2016 AliVCluster* cluster,
2017 AliVCaloCells* cells,
2019 AliAODCaloCluster* cluster1,
2020 AliAODCaloCluster* cluster2,
2023 TH2F* hClusterMap = 0 ;
2024 TH2F* hClusterLocMax = 0 ;
2025 TH2F* hCluster1 = 0 ;
2026 TH2F* hCluster2 = 0 ;
2030 hClusterMap =
new TH2F(
"hClusterMap",
"Cluster Map",48,0,48,24,0,24);
2031 hClusterLocMax =
new TH2F(
"hClusterLocMax",
"Cluster 2 highest local maxima",48,0,48,24,0,24);
2032 hCluster1 =
new TH2F(
"hCluster1",
"Cluster 1",48,0,48,24,0,24);
2033 hCluster2 =
new TH2F(
"hCluster2",
"Cluster 2",48,0,48,24,0,24);
2034 hClusterMap ->SetXTitle(
"column");
2035 hClusterMap ->SetYTitle(
"row");
2036 hClusterLocMax ->SetXTitle(
"column");
2037 hClusterLocMax ->SetYTitle(
"row");
2038 hCluster1 ->SetXTitle(
"column");
2039 hCluster1 ->SetYTitle(
"row");
2040 hCluster2 ->SetXTitle(
"column");
2041 hCluster2 ->SetYTitle(
"row");
2045 if(cluster->IsPHOS())
2048 AliWarning(
"Not supported for PHOS yet");
2052 const Int_t ncells = cluster->GetNCells();
2053 Int_t absIdList[ncells];
2056 Int_t icol = -1, irow = -1, iRCU = -1, sm = -1;
2058 Float_t minCol = 100, minRow = 100, maxCol = -1, maxRow = -1;
2059 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++ )
2061 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit];
2063 Float_t ec = cells->GetCellAmplitude(absIdList[iDigit]);
2071 if(sm > -1 && sm < 12)
2073 if(icol > maxCol) maxCol = icol;
2074 if(icol < minCol) minCol = icol;
2075 if(irow > maxRow) maxRow = irow;
2076 if(irow < minRow) minRow = irow;
2077 hClusterMap->Fill(icol,irow,ec);
2086 absIdList1[0] = absId1 ;
2087 fracList1 [0] = 1. ;
2089 Float_t ecell1 = cells->GetCellAmplitude(absId1);
2096 absIdList2[0] = absId2 ;
2097 fracList2 [0] = 1. ;
2099 Float_t ecell2 = cells->GetCellAmplitude(absId2);
2105 Int_t icol1 = -1, irow1 = -1, icol2 = -1, irow2 = -1;
2107 hClusterLocMax->Fill(icol1,irow1,ecell1);
2109 hClusterLocMax->Fill(icol2,irow2,ecell2);
2113 Float_t eRemain = (eCluster-ecell1-ecell2)/2;
2114 Float_t shareFraction1 = ecell1/eCluster+eRemain/eCluster;
2115 Float_t shareFraction2 = ecell2/eCluster+eRemain/eCluster;
2117 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++)
2119 Int_t absId = absIdList[iDigit];
2121 if ( absId==absId1 || absId==absId2 || absId < 0 )
continue;
2123 Float_t ecell = cells->GetCellAmplitude(absId);
2128 absIdList1[ncells1]= absId;
2132 fracList1[ncells1] = shareFraction1;
2133 e1 += ecell*shareFraction1;
2137 fracList1[ncells1] = 1.;
2147 absIdList2[ncells2]= absId;
2151 fracList2[ncells2] = shareFraction2;
2152 e2 += ecell*shareFraction2;
2156 fracList2[ncells2] = 1.;
2165 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",
2166 nMax, eCluster,ecell1,ecell2,e1,e2,eCluster-e1-e2,ncells,ncells1,ncells2,shareFraction1,shareFraction2,shareFraction1+shareFraction2));
2171 cluster1->SetNCells(ncells1);
2172 cluster2->SetNCells(ncells2);
2174 cluster1->SetCellsAbsId(absIdList1);
2175 cluster2->SetCellsAbsId(absIdList2);
2177 cluster1->SetCellsAmplitudeFraction(fracList1);
2178 cluster2->SetCellsAmplitudeFraction(fracList2);
2193 for(
Int_t iDigit = 0; iDigit < ncells1; iDigit++ )
2199 Float_t ecell = cells->GetCellAmplitude(absIdList1[iDigit]);
2202 if(
AreNeighbours(calorimeter, absId2,absIdList1[iDigit]) && absId1!=absIdList1[iDigit])
2203 hCluster1->Fill(icol,irow,ecell*shareFraction1);
2205 hCluster1->Fill(icol,irow,ecell);
2211 for(
Int_t iDigit = 0; iDigit < ncells2; iDigit++ )
2217 Float_t ecell = cells->GetCellAmplitude(absIdList2[iDigit]);
2220 if(
AreNeighbours(calorimeter, absId1,absIdList2[iDigit]) && absId2!=absIdList2[iDigit])
2221 hCluster2->Fill(icol,irow,ecell*shareFraction2);
2223 hCluster2->Fill(icol,irow,ecell);
2227 gStyle->SetPadRightMargin(0.1);
2228 gStyle->SetPadLeftMargin(0.1);
2229 gStyle->SetOptStat(0);
2230 gStyle->SetOptFit(000000);
2232 if(maxCol-minCol > maxRow-minRow)
2234 maxRow+= maxCol-minCol;
2238 maxCol+= maxRow-minRow;
2241 TCanvas *
c=
new TCanvas(
"canvas",
"canvas", 4000, 4000) ;
2247 hClusterMap ->SetAxisRange(minCol, maxCol,
"X");
2248 hClusterMap ->SetAxisRange(minRow, maxRow,
"Y");
2249 hClusterMap ->Draw(
"colz TEXT");
2254 hClusterLocMax ->SetAxisRange(minCol, maxCol,
"X");
2255 hClusterLocMax ->SetAxisRange(minRow, maxRow,
"Y");
2256 hClusterLocMax ->Draw(
"colz TEXT");
2261 hCluster1 ->SetAxisRange(minCol, maxCol,
"X");
2262 hCluster1 ->SetAxisRange(minRow, maxRow,
"Y");
2263 hCluster1 ->Draw(
"colz TEXT");
2268 hCluster2 ->SetAxisRange(minCol, maxCol,
"X");
2269 hCluster2 ->SetAxisRange(minRow, maxRow,
"Y");
2270 hCluster2 ->Draw(
"colz TEXT");
2272 if(eCluster > 6 )c->Print(Form(
"clusterFigures/Event%d_E%1.0f_nMax%d_NCell1_%d_NCell2_%d.eps",
2273 eventNumber,cluster->E(),nMax,ncells1,ncells2));
2277 delete hClusterLocMax;
Bool_t fRecalculatePosition
Recalculate cluster position.
AliEMCALGeometry * fEMCALGeo
! EMCAL geometry pointer.
void InitPHOSRecalibrationFactors()
Init PHOS recalibration factors.
Bool_t IsRecalculationOfClusterTrackMatchingOn() const
TGeoHMatrix * fEMCALMatrix[22]
Geometry matrices with alignments.
Int_t GetPHOSChannelStatus(Int_t imod, Int_t iCol, Int_t iRow) const
Float_t fLocMaxCutEDiff
Local maxima cut, when aggregating cells, next can be a bit higher.
TGeoHMatrix * fPHOSMatrix[5]
Geometry matrices with alignments.
Bool_t ClusterContainsBadChannel(Int_t calo, UShort_t *cellList, Int_t nCells)
AliPHOSGeoUtils * fPHOSGeo
! PHOS geometry pointer.
AliEMCALRecoUtils * GetEMCALRecoUtils() const
void SetEMCALL1PhaseInTimeRecalibrationForAllSM(TObjArray *map)
void SwitchOnDistToBadChannelRecalculation()
AliPHOSGeoUtils * GetPHOSGeometry() const
Bool_t fOADBForEMCAL
Get calibration from OADB for EMCAL.
Float_t GetPHOSChannelRecalibrationFactor(Int_t imod, Int_t iCol, Int_t iRow) const
void RecalculateClusterTrackMatching(AliVEvent *event, TObjArray *clusterArray=0x0)
Float_t fLocMaxCutE
Local maxima cut must have more than this energy.
Float_t GetMCECellClusFracCorrection(Float_t eCell, Float_t eCluster) const
void SetEMCALChannelStatusMap(Int_t iSM, TH2I *h)
Bool_t fRunDependentCorrection
Switch on or off the recalibration dependent on T.
TObjArray * fPHOSRecalibrationFactors
Array of histograms with map of recalibration factors, PHOS.
TString fEMCALGeoName
Name of geometry to use for EMCAL.
TH2F * GetEMCALChannelRecalibrationFactors(Int_t iSM) const
Bool_t fRecalibration
Switch on or off the recalibration.
Float_t GetEMCALChannelRecalibrationFactor(Int_t iSM, Int_t iCol, Int_t iRow) const
TH1F * GetEMCALChannelTimeRecalibrationFactors(Int_t bc) const
const TString calorimeter
Int_t fDebug
Debugging level.
TH1C * GetEMCALL1PhaseInTimeRecalibrationForAllSM() const
Bool_t IsRecalibrationOn() const
Bool_t IsMCParticleInCalorimeterAcceptance(Int_t calo, TParticle *particle)
virtual void Print(const Option_t *opt) const
Print some relevant parameters set for the analysis.
Int_t GetModuleNumber(AliAODPWG4Particle *particle, AliVEvent *inputEvent) const
Get the EMCAL/PHOS module number that corresponds to this particle.
Bool_t fLoadEMCALMatrices
Matrices set from configuration, not get from geometry.root or from ESDs/AODs.
AliEMCALGeometry * GetEMCALGeometry() const
Bool_t IsL1PhaseInTimeRecalibrationOn() const
Bool_t fRecalculateMatching
Recalculate cluster position.
Bool_t MaskFrameCluster(Int_t iSM, Int_t ieta) const
Bool_t fOADBForPHOS
Get calibration from OADB for PHOS.
Int_t * fMaskCellColumns
List of masked cells collumn index.
Bool_t fRemoveBadChannels
Check the channel status provided and remove clusters with bad channels.
void InitPHOSBadChannelStatusMap()
Init PHOS bad channels map.
virtual ~AliCalorimeterUtils()
AliCalorimeterUtils()
Constructor. Initialize parameters.
virtual void InitParameters()
Initialize the parameters of the analysis.
Int_t fNMaskCellColumns
Number of masked columns.
Bool_t IsClusterSharedByTwoSuperModules(const AliEMCALGeometry *geom, AliVCluster *cluster)
Int_t GetNumberOfLocalMaxima(AliVCluster *cluster, AliVCaloCells *cells)
Find the number of local maxima in cluster.
Float_t fMCECellClusFracCorrParam[4]
Parameters for the function correcting the weight of the cells in the cluster.
Bool_t fEMCALGeoMatrixSet
Check if the transformation matrix is set for EMCAL.
TH2I * GetPHOSChannelStatusMap(Int_t imod) const
void SetEMCALChannelRecalibrationFactor(Int_t iSM, Int_t iCol, Int_t iRow, Double_t c=1)
TString GetPass()
Get passx from filename.
void RecalculateClusterPosition(AliVCaloCells *cells, AliVCluster *clu)
Bool_t fImportGeometryFromFile
Import geometry settings in geometry.root file.
Bool_t fCorrectELinearity
Correct cluster energy linearity.
Bool_t fPHOSGeoMatrixSet
Check if the transformation matrix is set for PHOS.
TString fOADBFilePathPHOS
Default path $ALICE_PHYSICS/OADB/PHOS, if needed change.
void CorrectClusterEnergy(AliVCluster *cl)
Correct cluster energy non linearity.
Float_t fCutZ
dZ cut on matching (EMCAL/PHOS).
Bool_t fLoadPHOSMatrices
Matrices set from configuration, not get from geometry.root or from ESDs/AODs.
void SetPHOSChannelStatusMap(Int_t imod, TH2I *h)
Int_t fNCellsFromPHOSBorder
Number of cells from PHOS border the cell with maximum amplitude has to be.
AliVTrack * GetMatchedTrack(AliVCluster *cluster, AliVEvent *event, Int_t index=-1) const
void RecalibrateCellTimeL1Phase(Double_t &time, Int_t calo, Int_t iSM, Int_t bunchCrossNumber) const
Recalculate time L1 phase shift if time recalibration available for EMCAL.
Bool_t fMCECellClusFracCorrOn
Correct or not the weight of cells in cluster.
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
Int_t fNSuperModulesUsed
Number of supermodules to be used in analysis, can be different than the real geo, to be used at initialization of histograms.
TString fImportGeometryFilePath
Path fo geometry.root file.
Bool_t fPlotCluster
Plot cluster in splitting method.
Int_t fRunNumber
Run number of the data, take it from data itself unless set by user.
void RecalibrateCellAmplitude(Float_t &, Int_t calo, Int_t absId) const
Recalculate cell energy if recalibration factor.
void SetEMCALChannelTimeRecalibrationFactors(TObjArray *map)
Bool_t IsPHOSGeoMatrixSet() const
Bool_t IsTimeRecalibrationOn() const
Bool_t fOADBSet
AODB parameters already set.
TObjArray * fPHOSBadChannelMap
Array of histograms with map of bad channels, PHOS.
TString fPHOSGeoName
Name of geometry to use for PHOS.
Bool_t AreNeighbours(Int_t calo, Int_t absId1, Int_t absId2) const
Int_t GetEMCALChannelStatus(Int_t iSM, Int_t iCol, Int_t iRow) const
Bool_t IsEMCALGeoMatrixSet() const
Class with utils specific to calorimeter clusters/cells.
void AccessGeometry(AliVEvent *inputEvent)
AliEMCALRecoUtils * fEMCALRecoUtils
EMCAL utils for cluster rereconstruction.
void SetEMCALChannelRecalibrationFactors(Int_t iSM, TH2F *h)
void AccessOADB(AliVEvent *event)
TString fOADBFilePathEMCAL
Default path $ALICE_PHYSICS/OADB/EMCAL, if needed change.
void RecalibrateCellTime(Double_t &time, Int_t calo, Int_t absId, Int_t bunchCrossNumber) const
Recalculate time if time recalibration available for EMCAL not ready for PHOS.
Int_t GetMaxEnergyCell(AliVCaloCells *cells, AliVCluster *clu, Float_t &fraction) const
For a given CaloCluster, it gets the absId of the cell with maximum energy deposit.
Float_t fCutR
dR cut on matching (PHOS).
Float_t RecalibrateClusterEnergyWeightCell(AliVCluster *cluster, AliVCaloCells *cells, Float_t energyOrg)
void SplitEnergy(Int_t absId1, Int_t absId2, AliVCluster *cluster, AliVCaloCells *cells, AliAODCaloCluster *cluster1, AliAODCaloCluster *cluster2, Int_t nMax, Int_t eventNumber=0)
Int_t GetModuleNumberCellIndexes(Int_t absId, Int_t calo, Int_t &icol, Int_t &irow, Int_t &iRCU) const
Get the EMCAL/PHOS module, columns, row and RCU/DDL number that corresponds to this absId...
TH2I * GetEMCALChannelStatusMap(Int_t iSM) const
void SetPHOSChannelRecalibrationFactor(Int_t imod, Int_t iCol, Int_t iRow, Double_t c=1)
Float_t RecalibrateClusterEnergy(AliVCluster *cluster, AliVCaloCells *cells)
Recalibrate the cluster energy, considering the recalibration map and the energy of the cells that co...
void GetEMCALSubregion(AliVCluster *clus, AliVCaloCells *cells, Int_t ®Eta, Int_t ®Phi) const
Bool_t CheckCellFiducialRegion(AliVCluster *cluster, AliVCaloCells *cells) const
Int_t GetModuleNumberCellIndexesAbsCaloMap(Int_t absId, Int_t calo, Int_t &icol, Int_t &irow, Int_t &iRCU, Int_t &icolAbs, Int_t &irowAbs) const