17 #include <TGeoManager.h>
23 #include <TParticle.h>
24 #include <AliMCEvent.h>
28 #include "AliESDEvent.h"
29 #include "AliMCEvent.h"
31 #include "AliAODPWG4Particle.h"
32 #include "AliVCluster.h"
33 #include "AliVCaloCells.h"
34 #include "AliAODCaloCluster.h"
35 #include "AliOADBContainer.h"
36 #include "AliAnalysisManager.h"
37 #include "AliAODMCParticle.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), fRunNumber(0),
76 fMCECellClusFracCorrOn(0), fMCECellClusFracCorrParam()
129 AliOADBContainer *contBC=
new AliOADBContainer(
"");
130 contBC->InitFromFile(Form(
"%s/EMCALBadChannels.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALBadChannels");
137 AliInfo(
"Remove EMCAL bad cells");
139 for (
Int_t i=0; i<nSM; ++i)
146 hbm=(TH2I*)arrayBC->FindObject(Form(
"EMCALBadChannelMap_Mod%d",i));
150 AliError(Form(
"Can not get EMCALBadChannelMap_Mod%d",i));
154 hbm->SetDirectory(0);
158 }
else AliInfo(
"Do NOT remove EMCAL bad channels\n");
166 AliOADBContainer *contRF=
new AliOADBContainer(
"");
168 contRF->InitFromFile(Form(
"%s/EMCALRecalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRecalib");
182 AliInfo(
"Recalibrate EMCAL");
183 for (
Int_t i=0; i < nSM; ++i)
190 h = (
TH2F*)recalib->FindObject(Form(
"EMCALRecalFactors_SM%d",i));
194 AliError(Form(
"Could not load EMCALRecalFactors_SM%d",i));
202 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params object array");
203 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for pass");
204 }
else AliInfo(
"Do NOT recalibrate EMCAL, no params for run");
215 AliOADBContainer *contRFTD=
new AliOADBContainer(
"");
217 contRFTD->InitFromFile(Form(
"%s/EMCALTemperatureCorrCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALRunDepTempCalibCorrections");
219 TH1S *htd=(TH1S*)contRFTD->GetObject(
fRunNumber);
224 AliWarning(Form(
"No TemperatureCorrCalib Objects for run: %d",
fRunNumber));
228 Int_t maxEntry = contRFTD->GetNumberOfEntries();
230 while ( (ic < maxEntry) && (contRFTD->UpperLimit(ic) <
fRunNumber) )
236 Int_t closest = lower;
237 if ( (ic<maxEntry) &&
243 AliWarning(Form(
"TemperatureCorrCalib Objects found closest id %d from run: %d", closest, contRFTD->LowerLimit(closest)));
244 htd = (TH1S*) contRFTD->GetObjectByIndex(closest);
249 AliInfo(
"Recalibrate (Temperature) EMCAL");
251 for (
Int_t ism=0; ism<nSM; ++ism)
253 for (
Int_t icol=0; icol<48; ++icol)
255 for (
Int_t irow=0; irow<24; ++irow)
259 Int_t absID =
fEMCALGeo->GetAbsCellIdFromCellIndexes(ism, irow, icol);
260 factor *= htd->GetBinContent(absID) / 10000. ;
269 }
else AliInfo(
"Do NOT recalibrate EMCAL with T variations, no params TH1");
277 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
279 contTRF->InitFromFile(Form(
"%s/EMCALTimeCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeCalib");
286 if(pass==
"spc_calo") passM =
"pass3";
291 AliInfo(
"Time Recalibrate EMCAL");
292 for (
Int_t ibc = 0; ibc < 4; ++ibc)
299 h = (TH1F*)trecalpass->FindObject(Form(
"hAllTimeAvBC%d",ibc));
303 AliError(Form(
"Could not load hAllTimeAvBC%d",ibc));
311 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for pass");
312 }
else AliInfo(
"Do NOT recalibrate time EMCAL, no params for run");
320 AliOADBContainer *contTRF=
new AliOADBContainer(
"");
321 contTRF->InitFromFile(Form(
"%s/EMCALTimeL1PhaseCalib.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALTimeL1PhaseCalib");
326 AliError(Form(
"L1 phase time recal: No params for run %d. Default used.",
fRunNumber));
327 trecal=(
TObjArray*)contTRF->GetObject(0);
334 if (pass==
"calo_spc") passM =
"pass1";
335 if (pass==
"muon_calo_pass1") passM =
"pass0";
336 if (pass==
"muon_calo_pass2" || pass==
"pass2" || pass==
"pass3" || pass==
"pass4") passM =
"pass1";
341 AliInfo(Form(
"L1 phase time recal: No params for run %d and pass %s, try default",
fRunNumber, passM.Data()));
345 trecal=(
TObjArray*)contTRF->GetObject(0);
348 trecalpass=(
TObjArray*)trecal->FindObject(
"pass1");
350 AliInfo(
"Time L1 phase Recalibrate EMCAL");
359 h = (TH1C*)trecalpass->FindObject(Form(
"h%d",
fRunNumber));
361 if (!h) AliError(Form(
"Could not load h%d",
fRunNumber));
369 AliError(
"Do not calibrate L1 phase time");
375 AliError(
"Do not calibrate L1 phase time");
392 AliOADBContainer badmapContainer(Form(
"phosBadMap"));
394 badmapContainer.InitFromFile(Form(
"%s/PHOSBadMaps.root",
fOADBFilePathPHOS.Data()),
"phosBadMap");
400 AliInfo(Form(
"Can not read PHOS bad map for run %d",
fRunNumber)) ;
404 AliInfo(Form(
"Setting PHOS bad map with name %s",maps->GetName())) ;
406 for(
Int_t mod = 1; mod < 5; mod++)
413 hbmPH = (TH2I*)maps->At(mod);
415 if(hbmPH) hbmPH->SetDirectory(0);
445 AliInfo(
"Load user defined EMCAL geometry matrices");
448 AliOADBContainer emcGeoMat(
"AliEMCALgeo");
449 emcGeoMat.InitFromFile(Form(
"%s/EMCALlocal2master.root",
fOADBFilePathEMCAL.Data()),
"AliEMCALgeo");
452 for(
Int_t mod=0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
456 AliDebug(1,Form(
"EMCAL matrices SM %d, %p", mod,((TGeoHMatrix*) matEMCAL->At(mod))));
471 AliWarning(Form(
"Set matrix for SM %d from gGeoManager",mod));
472 fEMCALGeo->SetMisalMatrix(
fEMCALGeo->GetMatrixForSuperModuleFromGeoManager(mod),mod) ;
476 AliError(Form(
"Alignment atrix for SM %d is not available",mod));
483 else if (!gGeoManager)
485 AliDebug(1,
"Load EMCAL misalignment matrices");
486 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
488 for(
Int_t mod = 0; mod < (
fEMCALGeo->GetEMCGeometry())->GetNumberOfSuperModules(); mod++)
491 if(((
AliESDEvent*)inputEvent)->GetEMCALMatrix(mod))
502 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
516 AliInfo(
"Load user defined PHOS geometry matrices");
519 AliOADBContainer geomContainer(
"phosGeo");
520 geomContainer.InitFromFile(Form(
"%s/PHOSGeometry.root",
fOADBFilePathPHOS.Data()),
"PHOSRotationMatrixes");
521 TObjArray *matPHOS = (
TObjArray*)geomContainer.GetObject(139000,
"PHOSRotationMatrixes");
523 for(
Int_t mod = 0 ; mod < 5 ; mod++)
527 AliDebug(1,Form(
"PHOS matrices module %d, %p",mod,((TGeoHMatrix*) matPHOS->At(mod))));
530 fPHOSMatrix[mod] = (TGeoHMatrix*) matPHOS->At(mod) ;
546 else if (!gGeoManager)
548 AliDebug(1,
"Load PHOS misalignment matrices.");
549 if(!strcmp(inputEvent->GetName(),
"AliESDEvent"))
551 for(
Int_t mod = 0; mod < 5; mod++)
553 if( ((
AliESDEvent*)inputEvent)->GetPHOSMatrix(mod))
564 AliDebug(1,
"Setting of EMCAL transformation matrixes for AODs not implemented yet. \n Import geometry.root file");
580 Bool_t areNeighbours = kFALSE ;
582 Int_t iRCU1 = -1, irow1 = -1, icol1 = -1;
583 Int_t iRCU2 = -1, irow2 = -1, icol2 = -1;
585 Int_t rowdiff = 0, coldiff = 0;
594 if(nSupMod1%2) icol1+=AliEMCALGeoParams::fgkEMCALCols;
595 else icol2+=AliEMCALGeoParams::fgkEMCALCols;
598 rowdiff = TMath::Abs( irow1 - irow2 ) ;
599 coldiff = TMath::Abs( icol1 - icol2 ) ;
602 if ((coldiff + rowdiff == 1 ))
603 areNeighbours = kTRUE ;
605 return areNeighbours;
613 AliVCluster* cluster)
623 for(
Int_t iDigit = 0; iDigit < cluster->GetNCells(); iDigit++)
626 geom->GetCellIndex(cluster->GetCellAbsId(iDigit),iSupMod,iTower,iIphi,iIeta);
627 geom->GetCellPhiEtaIndexInSModule(iSupMod,iTower,iIphi,iIeta, iphi,ieta);
630 if (iDigit == 0 ) iSM0 = iSupMod;
631 else if(iSupMod != iSM0)
633 if(iSupMod > 11 && iSupMod < 18)
634 AliWarning(Form(
"Cluster shared in 2 DCal: SM%d, SM%d??",iSupMod,iSM0));
648 AliVCaloCells* cells)
const
652 if ( cells->GetType()==AliVCaloCells::kEMCALCell &&
fEMCALRecoUtils->GetNumberOfCellsFromEMCALBorder() <= 0 )
return kTRUE;
659 for(
Int_t i = 0; i < cluster->GetNCells() ; i++)
661 Int_t absId = cluster->GetCellAbsId(i) ;
662 Float_t amp = cells->GetCellAmplitude(absId);
671 AliDebug(1,Form(
"Cluster Max AbsId %d, Cell Energy %2.2f, Cluster Energy %2.2f",
672 absIdMax, ampMax, cluster->E()));
674 if ( absIdMax == -1 )
return kFALSE;
680 if ( cells->GetType() == AliVCaloCells::kEMCALCell )
685 Int_t iTower = -1, iIphi = -1, iIeta = -1, iphi = -1, ieta = -1, iSM = -1;
687 fEMCALGeo->GetCellIndex(absIdMax,iSM,iTower,iIphi,iIeta);
689 fEMCALGeo->GetCellPhiEtaIndexInSModule(iSM,iTower,iIphi, iIeta,iphi,ieta);
691 if(iSM < 0 || iphi < 0 || ieta < 0 )
693 AliFatal(Form(
"Negative value for super module: %d, or cell ieta: %d, or cell iphi: %d, check EMCAL geometry name",iSM,ieta,iphi));
699 if ( iSM < 10 || (iSM > 11 && iSM < 18) )
701 if(iphi >= nborder && iphi < 24-nborder) okrow = kTRUE;
705 if(iphi >= nborder && iphi < 8-nborder) okrow = kTRUE;
711 if(!
fEMCALRecoUtils->IsEMCALNoBorderAtEta0() || (iSM > 11 && iSM < 18))
713 if(ieta > nborder && ieta < 48-nborder) okcol =kTRUE;
719 if(ieta >= nborder) okcol = kTRUE;
723 if(ieta < 48-nborder) okcol = kTRUE;
727 AliDebug(1,Form(
"EMCAL Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
728 nborder, ieta, iphi, iSM,okrow,okcol));
731 else if ( cells->GetType() == AliVCaloCells::kPHOSCell )
734 Int_t irow = -1, icol = -1;
735 fPHOSGeo->AbsToRelNumbering(absIdMax,relId);
737 if (relId[1] != 0 )
return kFALSE;
743 if(irow >= fNCellsFromPHOSBorder && irow < 64-fNCellsFromPHOSBorder) okrow =kTRUE;
744 if(icol >= fNCellsFromPHOSBorder && icol < 56-fNCellsFromPHOSBorder) okcol =kTRUE;
746 AliDebug(1,Form(
"PHOS Cluster in %d cells fiducial volume: ieta %d, iphi %d, SM %d ? ok row %d, ok column %d",
747 fNCellsFromPHOSBorder, icol, irow, relId[0]-1,okrow,okcol));
750 if (okcol && okrow)
return kTRUE;
769 for(
Int_t iCell = 0; iCell<nCells; iCell++)
779 fPHOSGeo->AbsToRelNumbering(cellList[iCell],relId);
781 if (relId[1] != 0 )
return kTRUE;
818 regEta = regPhi = -1 ;
820 if(!clus->IsEMCAL())
return ;
822 Int_t icol = -1, irow = -1, iRCU = -1;
830 if( sm%2 == 1) icol+=AliEMCALGeoParams::fgkEMCALCols;
833 if(icol < 2 || icol > 93 || irow < 2 || irow > 21)
return;
840 if ( icol > 9 && icol < 34 ) regEta = 0;
841 else if ( icol > 62 && icol < 87 ) regEta = 0;
845 else if ( icol <= 9 && icol >= 5 ) regEta = 3;
846 else if ( icol <= 38 && icol >= 34 ) regEta = 3;
847 else if ( icol <= 62 && icol >= 58 ) regEta = 3;
848 else if ( icol <= 91 && icol >= 87 ) regEta = 3;
852 else if ( icol < 58 && icol > 38 ) regEta = 1 ;
862 if ( irow >= 2 && irow <= 5 ) regPhi = 0;
863 else if ( irow >= 18 && irow <= 21 ) regPhi = 0;
864 else if ( irow >= 6 && irow <= 9 ) regPhi = 1;
865 else if ( irow >= 14 && irow <= 17 ) regPhi = 1;
875 Float_t & clusterFraction)
const
879 AliInfo(
"Cluster or cells pointer is null!");
888 Int_t cellAbsId =-1 , absId =-1 ;
889 Int_t iSupMod =-1 , ieta =-1 , iphi = -1, iRCU = -1;
894 for (
Int_t iDig=0; iDig< clu->GetNCells(); iDig++)
896 cellAbsId = clu->GetCellAbsId(iDig);
898 fraction = clu->GetCellAmplitudeFraction(iDig);
899 if(fraction < 1e-4) fraction = 1.;
911 eCell = cells->GetCellAmplitude(cellAbsId)*fraction*recalFactor;
924 clusterFraction = (eTot-eMax)/eTot;
937 AliVEvent* event,
Int_t index)
const
939 AliVTrack *track = 0x0;
950 AliInfo(Form(
"Wrong track index %d, from recalculation", trackIndex));
952 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(trackIndex));
962 if( cluster->GetNTracksMatched() < 1 )
return 0x0;
968 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",cluster->ClassName())))
970 if( index >= 0 ) iTrack = index;
971 else iTrack = ((AliESDCaloCluster*)cluster)->GetTracksMatched()->At(0);
973 track =
dynamic_cast<AliVTrack*
> (
event->GetTrack(iTrack) );
977 if( index > 0 ) iTrack = index;
979 track =
dynamic_cast<AliVTrack*
>( cluster->GetTrackMatched(iTrack) );
991 if( eCluster <= 0 || eCluster < eCell )
993 AliWarning(Form(
"Bad values eCell=%f, eCluster %f",eCell,eCluster));
997 Float_t frac = eCell / eCluster;
1019 fEMCALGeo->GetAbsCellIdFromEtaPhi(particle->Eta(),particle->Phi(), absId);
1021 AliDebug(2,Form(
"EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d",
1022 particle->Eta(), particle->Phi()*TMath::RadToDeg(),absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1024 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1030 if(strcmp(inputEvent->ClassName(),
"AliMCEvent") == 0 )
1034 TParticle* primary = 0x0;
1035 AliStack * stack = ((AliMCEvent*)inputEvent)->Stack();
1039 primary = stack->Particle(particle->GetCaloLabel(0));
1043 AliFatal(
"Stack not available, stop!");
1048 fPHOSGeo->ImpactOnEmc(primary,mod,z,x) ;
1052 AliFatal(
"Primary not available, stop!");
1077 AliDebug(1,
"AliCalorimeterUtils::GetModuleNumber() - NUL Cluster, please check!!!");
1082 if ( cluster->GetNCells() <= 0 )
return -1;
1084 Int_t absId = cluster->GetCellAbsId(0);
1086 if ( absId < 0 )
return -1;
1088 if( cluster->IsEMCAL() )
1090 AliDebug(2,Form(
"EMCAL absid %d, SuperModule %d",absId,
fEMCALGeo->GetSuperModuleNumber(absId)));
1092 return fEMCALGeo->GetSuperModuleNumber(absId) ;
1094 else if ( cluster->IsPHOS() )
1097 fPHOSGeo->AbsToRelNumbering(absId,relId);
1099 if (relId[1] != 0 )
return -1;
1101 AliDebug(2,Form(
"PHOS absid %d Module %d",absId, relId[0]-1));
1117 if ( absId < 0 )
return -1 ;
1121 Int_t iTower = -1, iIphi = -1, iIeta = -1;
1122 fEMCALGeo->GetCellIndex(absId,imod,iTower,iIphi,iIeta);
1123 fEMCALGeo->GetCellPhiEtaIndexInSModule(imod,iTower,iIphi, iIeta,irow,icol);
1125 if(imod < 0 || irow < 0 || icol < 0 )
1127 AliFatal(Form(
"Negative value for super module: %d, or cell icol: %d, or cell irow: %d, check EMCAL geometry name",imod,icol,irow));
1134 if ( imod == 13 || imod == 15 || imod == 17 ) ico2 += 16;
1137 if(imod < 10 || (imod > 11 && imod < 18))
1140 if ( 0 <= irow && irow < 8 ) iRCU = 0;
1141 else if ( 8 <= irow && irow < 16 &&
1142 0 <= ico2 && ico2 < 24 ) iRCU = 0;
1146 else if ( 8 <= irow && irow < 16 &&
1147 24 <= ico2 && ico2 < 48 ) iRCU = 1;
1149 else if ( 16 <= irow && irow < 24 ) iRCU = 1;
1151 if ( imod%2 == 1 ) iRCU = 1 - iRCU;
1160 AliFatal(Form(
"Wrong EMCAL RCU number = %d", iRCU));
1167 fPHOSGeo->AbsToRelNumbering(absId,relId);
1169 if (relId[1] != 0 )
return -1;
1174 iRCU= (
Int_t)(relId[2]-1)/16 ;
1179 AliFatal(Form(
"Wrong PHOS RCU number = %d", iRCU));
1205 irowAbs = irow + 64 * imod;
1216 Int_t shiftEta = 48;
1219 if ( imod > 11 && imod < 18) shiftEta+=48/3;
1221 icolAbs = (imod % 2) ? icol + shiftEta : icol;
1225 irowAbs = irow + 24 *
Int_t(imod / 2);
1228 if ( imod > 11 && imod < 20) irowAbs -= (2*24 / 3);
1240 const Int_t nc = cluster->GetNCells();
1242 Int_t absIdList[nc];
1260 const Int_t nCells = cluster->GetNCells();
1268 simuTotWeight/= eCluster;
1278 for(iDigit = 0; iDigit < nCells ; iDigit++)
1280 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit] ;
1281 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1290 idmax = absIdList[iDigit] ;
1297 for(iDigit = 0 ; iDigit < nCells; iDigit++)
1299 if( absIdList[iDigit] >= 0 )
1301 absId1 = cluster->GetCellsAbsId()[iDigit];
1303 Float_t en1 = cells->GetCellAmplitude(absId1);
1311 for(iDigitN = 0; iDigitN < nCells; iDigitN++)
1313 absId2 = cluster->GetCellsAbsId()[iDigitN] ;
1315 if(absId2==-1 || absId2==absId1)
continue;
1319 Float_t en2 = cells->GetCellAmplitude(absId2);
1332 absIdList[iDigitN] = -1 ;
1337 absIdList[iDigit] = -1 ;
1342 absIdList[iDigit] = -1 ;
1347 absIdList[iDigitN] = -1 ;
1358 for(iDigit = 0; iDigit < nCells; iDigit++)
1360 if( absIdList[iDigit] >= 0 )
1362 absIdList[iDigitN] = absIdList[iDigit] ;
1364 Float_t en = cells->GetCellAmplitude(absIdList[iDigit]);
1372 maxEList[iDigitN] = en ;
1381 AliDebug(1,Form(
"No local maxima found, assign highest energy cell as maxima, id %d, en cell %2.2f, en cluster %2.2f",
1382 idmax,emax,cluster->E()));
1384 maxEList[0] = emax ;
1385 absIdList[0] = idmax ;
1389 AliDebug(1,Form(
"In cluster E %2.2f (wth non lin. %2.2f), M02 %2.2f, M20 %2.2f, N maxima %d",
1390 cluster->E(),eCluster, cluster->GetM02(),cluster->GetM20(), iDigitN));
1405 if (!AliAnalysisManager::GetAnalysisManager()->GetTree())
1407 AliError(
"AliCalorimeterUtils::GetPass() - Pointer to tree = 0, returning null");
1411 if (!AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile())
1413 AliError(
"AliCalorimeterUtils::GetPass() - Null pointer input file, returning null");
1417 TString pass(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());
1418 if (pass.Contains(
"ass1"))
return TString(
"pass1");
1419 else if (pass.Contains(
"ass2"))
return TString(
"pass2");
1420 else if (pass.Contains(
"ass3"))
return TString(
"pass3");
1421 else if (pass.Contains(
"ass4"))
return TString(
"pass4");
1422 else if (pass.Contains(
"ass5"))
return TString(
"pass5");
1423 else if (pass.Contains(
"LHC11c") && pass.Contains(
"spc_calo") )
return TString(
"spc_calo");
1424 else if (pass.Contains(
"calo") || pass.Contains(
"high_lumi"))
1426 AliInfo(
"Path contains <calo> or <high-lumi>, set as <pass1>");
1429 else if (pass.Contains(
"LHC14a1a"))
1431 AliInfo(
"Check that Energy calibration was enabled for this MC production in the tender, clusterizer or here!!");
1437 AliInfo(
"Pass number string not found");
1489 AliDebug(1,
"Init bad channel map");
1492 Bool_t oldStatus = TH1::AddDirectoryStatus();
1493 TH1::AddDirectory(kFALSE);
1496 for (
int i = 0; i < 5; i++)
fPHOSBadChannelMap->Add(
new TH2I(Form(
"PHOS_BadMap_mod%d",i),
1497 Form(
"PHOS_BadMap_mod%d",i),
1498 64, 0, 64, 56, 0, 56));
1504 TH1::AddDirectory(oldStatus);
1512 AliDebug(1,
"Init recalibration map");
1515 Bool_t oldStatus = TH1::AddDirectoryStatus();
1516 TH1::AddDirectory(kFALSE);
1519 for (
int i = 0; i < 5; i++)
1522 Form(
"PHOSRecalFactors_Mod%d",i),
1523 64, 0, 64, 56, 0, 56));
1527 for (
Int_t m = 0; m < 5; m++)
1529 for (
Int_t i = 0; i < 56; i++)
1531 for (
Int_t j = 0; j < 64; j++)
1542 TH1::AddDirectory(oldStatus);
1557 AliInfo(Form(
"Get EMCAL geometry name to <%s> for run %d",
fEMCALGeo->GetName(),
fRunNumber));
1562 AliInfo(Form(
"Set EMCAL geometry name to <%s>",
fEMCALGeoName.Data()));
1581 else if (!gGeoManager) AliInfo(
"Careful!, gGeoManager not loaded, load misalign matrices");
1610 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1626 Int_t icol = -1, irow = -1, iRCU = -1;
1629 if(status > 0) ok = kFALSE;
1648 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1652 Float_t phi = particle->Phi();
1653 if(phi < 0) phi+=TMath::TwoPi();
1659 Double_t vtx[]={ particle->Xv(), particle->Yv(), particle->Zv() } ;
1660 return GetPHOSGeometry()->ImpactOnEmc(vtx, particle->Theta(), phi, mod, z, x) ;
1668 Int_t icol = -1, irow = -1, iRCU = -1;
1671 if(status > 0) ok = kFALSE;
1691 AliFatal(Form(
"Careful Geo Matrix for calo <%d> is not set, use AliFidutialCut instead",calo));
1696 if(phi < 0) phi+=TMath::TwoPi();
1710 Int_t icol = -1, irow = -1, iRCU = -1;
1713 if(status > 0) ok = kFALSE;
1729 if ( iSM%2 ) icol+=48;
1750 printf(
"***** Print: %s %s ******\n", GetName(), GetTitle() ) ;
1752 printf(
"Remove Clusters with max cell at less than %d cells from EMCAL border and %d cells from PHOS border\n",
1754 if(
fEMCALRecoUtils->IsEMCALNoBorderAtEta0()) printf(
"Do not remove EMCAL clusters at Eta = 0\n");
1758 printf(
"Matching criteria: dR < %2.2f[cm], dZ < %2.2f[cm]\n",
fCutR,
fCutZ);
1817 AliVCaloCells * cells)
1826 UShort_t * index = cluster->GetCellsAbsId() ;
1827 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
1829 Int_t ncells = cluster->GetNCells();
1835 for(
Int_t icell = 0; icell < ncells; icell++)
1837 Int_t absId = index[icell];
1839 frac = fraction[icell];
1840 if(frac < 1e-3) frac = 1;
1842 Float_t amp = cells->GetCellAmplitude(absId);
1845 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy: before cal %f; after cal %f",
1846 calo,frac,cells->GetCellAmplitude(absId),amp));
1851 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
1856 AliFatal(
"Cells pointer does not exist!");
1867 AliVCaloCells * cells,
Float_t energyOrg)
1876 UShort_t * index = cluster->GetCellsAbsId() ;
1877 Double_t * fraction = cluster->GetCellsAmplitudeFraction() ;
1879 Int_t ncells = cluster->GetNCells();
1885 for(
Int_t icell = 0; icell < ncells; icell++)
1887 Int_t absId = index[icell];
1889 frac = fraction[icell];
1890 if(frac < 1e-3) frac = 1;
1892 Float_t amp = cells->GetCellAmplitude(absId);
1897 AliDebug(2,Form(
"Recalibrate cell: calo <%d>, cell fraction %f, cell energy %f",
1898 calo,frac,cells->GetCellAmplitude(absId)));
1903 AliDebug(1,Form(
"Energy before %f, after %f",cluster->E(),
energy));
1907 AliFatal(
"Cells pointer does not exist!");
1940 Int_t nClusters =
event->GetNumberOfCaloClusters();
1941 if(clusterArray) nClusters = clusterArray->GetEntriesFast();
1943 AliVCluster * clus = 0;
1945 for (
Int_t iclus = 0; iclus < nClusters ; iclus++)
1947 if ( clusterArray ) clus = (AliVCluster*) clusterArray->At(iclus) ;
1948 else clus =
event->GetCaloCluster(iclus) ;
1950 if (!clus->IsEMCAL())
continue ;
1957 if ( TMath::Abs(clus->GetTrackDx()) < 500 )
1958 AliDebug(2,Form(
"Residuals (Old, New): z (%2.4f,%2.4f), x (%2.4f,%2.4f)\n",
1959 clus->GetTrackDz(),dZ,clus->GetTrackDx(),dR));
1961 clus->SetTrackDistance(dR,dZ);
1966 if(clus->GetNTracksMatched() > 0)
1968 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
1971 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
1975 for(
Int_t iTrack = 0; iTrack < clus->GetNTracksMatched(); iTrack++)
1977 ((AliAODCaloCluster*)clus)->RemoveTrackMatched((
TObject*)((AliAODCaloCluster*)clus)->GetTrackMatched(iTrack));
1986 if ( trackIndex >= 0 )
1988 if(!strcmp(
"AliESDCaloCluster",Form(
"%s",clus->ClassName())))
1991 arrayTrackMatched[0] = trackIndex;
1992 ((AliESDCaloCluster*)clus)->AddTracksMatched(arrayTrackMatched);
1996 ((AliAODCaloCluster*)clus)->AddTrackMatched((
TObject*)event->GetTrack(trackIndex));
2018 AliVCluster* cluster,
2019 AliVCaloCells* cells,
2021 AliAODCaloCluster* cluster1,
2022 AliAODCaloCluster* cluster2,
2025 TH2F* hClusterMap = 0 ;
2026 TH2F* hClusterLocMax = 0 ;
2027 TH2F* hCluster1 = 0 ;
2028 TH2F* hCluster2 = 0 ;
2032 hClusterMap =
new TH2F(
"hClusterMap",
"Cluster Map",48,0,48,24,0,24);
2033 hClusterLocMax =
new TH2F(
"hClusterLocMax",
"Cluster 2 highest local maxima",48,0,48,24,0,24);
2034 hCluster1 =
new TH2F(
"hCluster1",
"Cluster 1",48,0,48,24,0,24);
2035 hCluster2 =
new TH2F(
"hCluster2",
"Cluster 2",48,0,48,24,0,24);
2036 hClusterMap ->SetXTitle(
"column");
2037 hClusterMap ->SetYTitle(
"row");
2038 hClusterLocMax ->SetXTitle(
"column");
2039 hClusterLocMax ->SetYTitle(
"row");
2040 hCluster1 ->SetXTitle(
"column");
2041 hCluster1 ->SetYTitle(
"row");
2042 hCluster2 ->SetXTitle(
"column");
2043 hCluster2 ->SetYTitle(
"row");
2047 if(cluster->IsPHOS())
2050 AliWarning(
"Not supported for PHOS yet");
2054 const Int_t ncells = cluster->GetNCells();
2055 Int_t absIdList[ncells];
2058 Int_t icol = -1, irow = -1, iRCU = -1, sm = -1;
2060 Float_t minCol = 100, minRow = 100, maxCol = -1, maxRow = -1;
2061 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++ )
2063 absIdList[iDigit] = cluster->GetCellsAbsId()[iDigit];
2065 Float_t ec = cells->GetCellAmplitude(absIdList[iDigit]);
2073 if(sm > -1 && sm < 12)
2075 if(icol > maxCol) maxCol = icol;
2076 if(icol < minCol) minCol = icol;
2077 if(irow > maxRow) maxRow = irow;
2078 if(irow < minRow) minRow = irow;
2079 hClusterMap->Fill(icol,irow,ec);
2088 absIdList1[0] = absId1 ;
2089 fracList1 [0] = 1. ;
2091 Float_t ecell1 = cells->GetCellAmplitude(absId1);
2098 absIdList2[0] = absId2 ;
2099 fracList2 [0] = 1. ;
2101 Float_t ecell2 = cells->GetCellAmplitude(absId2);
2107 Int_t icol1 = -1, irow1 = -1, icol2 = -1, irow2 = -1;
2109 hClusterLocMax->Fill(icol1,irow1,ecell1);
2111 hClusterLocMax->Fill(icol2,irow2,ecell2);
2115 Float_t eRemain = (eCluster-ecell1-ecell2)/2;
2116 Float_t shareFraction1 = ecell1/eCluster+eRemain/eCluster;
2117 Float_t shareFraction2 = ecell2/eCluster+eRemain/eCluster;
2119 for(
Int_t iDigit = 0; iDigit < ncells; iDigit++)
2121 Int_t absId = absIdList[iDigit];
2123 if ( absId==absId1 || absId==absId2 || absId < 0 )
continue;
2125 Float_t ecell = cells->GetCellAmplitude(absId);
2130 absIdList1[ncells1]= absId;
2134 fracList1[ncells1] = shareFraction1;
2135 e1 += ecell*shareFraction1;
2139 fracList1[ncells1] = 1.;
2149 absIdList2[ncells2]= absId;
2153 fracList2[ncells2] = shareFraction2;
2154 e2 += ecell*shareFraction2;
2158 fracList2[ncells2] = 1.;
2167 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",
2168 nMax, eCluster,ecell1,ecell2,e1,e2,eCluster-e1-e2,ncells,ncells1,ncells2,shareFraction1,shareFraction2,shareFraction1+shareFraction2));
2173 cluster1->SetNCells(ncells1);
2174 cluster2->SetNCells(ncells2);
2176 cluster1->SetCellsAbsId(absIdList1);
2177 cluster2->SetCellsAbsId(absIdList2);
2179 cluster1->SetCellsAmplitudeFraction(fracList1);
2180 cluster2->SetCellsAmplitudeFraction(fracList2);
2195 for(
Int_t iDigit = 0; iDigit < ncells1; iDigit++ )
2201 Float_t ecell = cells->GetCellAmplitude(absIdList1[iDigit]);
2204 if(
AreNeighbours(calorimeter, absId2,absIdList1[iDigit]) && absId1!=absIdList1[iDigit])
2205 hCluster1->Fill(icol,irow,ecell*shareFraction1);
2207 hCluster1->Fill(icol,irow,ecell);
2213 for(
Int_t iDigit = 0; iDigit < ncells2; iDigit++ )
2219 Float_t ecell = cells->GetCellAmplitude(absIdList2[iDigit]);
2222 if(
AreNeighbours(calorimeter, absId1,absIdList2[iDigit]) && absId2!=absIdList2[iDigit])
2223 hCluster2->Fill(icol,irow,ecell*shareFraction2);
2225 hCluster2->Fill(icol,irow,ecell);
2229 gStyle->SetPadRightMargin(0.1);
2230 gStyle->SetPadLeftMargin(0.1);
2231 gStyle->SetOptStat(0);
2232 gStyle->SetOptFit(000000);
2234 if(maxCol-minCol > maxRow-minRow)
2236 maxRow+= maxCol-minCol;
2240 maxCol+= maxRow-minRow;
2243 TCanvas *
c=
new TCanvas(
"canvas",
"canvas", 4000, 4000) ;
2249 hClusterMap ->SetAxisRange(minCol, maxCol,
"X");
2250 hClusterMap ->SetAxisRange(minRow, maxRow,
"Y");
2251 hClusterMap ->Draw(
"colz TEXT");
2256 hClusterLocMax ->SetAxisRange(minCol, maxCol,
"X");
2257 hClusterLocMax ->SetAxisRange(minRow, maxRow,
"Y");
2258 hClusterLocMax ->Draw(
"colz TEXT");
2263 hCluster1 ->SetAxisRange(minCol, maxCol,
"X");
2264 hCluster1 ->SetAxisRange(minRow, maxRow,
"Y");
2265 hCluster1 ->Draw(
"colz TEXT");
2270 hCluster2 ->SetAxisRange(minCol, maxCol,
"X");
2271 hCluster2 ->SetAxisRange(minRow, maxRow,
"Y");
2272 hCluster2 ->Draw(
"colz TEXT");
2274 if(eCluster > 6 )c->Print(Form(
"clusterFigures/Event%d_E%1.0f_nMax%d_NCell1_%d_NCell2_%d.eps",
2275 eventNumber,cluster->E(),nMax,ncells1,ncells2));
2279 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
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()
void RecalculateClusterTrackMatching(AliVEvent *event, TObjArray *clusterArray=0x0, AliMCEvent *mc=0x0)
AliCalorimeterUtils()
Constructor. Initialize parameters.
virtual void InitParameters()
Initialize the parameters of the analysis.
Int_t fNMaskCellColumns
Number of masked columns.
Bool_t IsClusterSharedByTwoSuperModules(const AliEMCALGeometry *geom, AliVCluster *cluster)
Int_t GetNumberOfLocalMaxima(AliVCluster *cluster, AliVCaloCells *cells)
Find the number of local maxima in cluster.
Float_t fMCECellClusFracCorrParam[4]
Parameters for the function correcting the weight of the cells in the cluster.
Bool_t fEMCALGeoMatrixSet
Check if the transformation matrix is set for EMCAL.
TH2I * GetPHOSChannelStatusMap(Int_t imod) const
void SetEMCALChannelRecalibrationFactor(Int_t iSM, Int_t iCol, Int_t iRow, Double_t c=1)
TString GetPass()
Get passx from filename.
void RecalculateClusterPosition(AliVCaloCells *cells, AliVCluster *clu)
Bool_t fImportGeometryFromFile
Import geometry settings in geometry.root file.
Bool_t fCorrectELinearity
Correct cluster energy linearity.
Bool_t fPHOSGeoMatrixSet
Check if the transformation matrix is set for PHOS.
TString fOADBFilePathPHOS
Default path $ALICE_PHYSICS/OADB/PHOS, if needed change.
void CorrectClusterEnergy(AliVCluster *cl)
Correct cluster energy non linearity.
Float_t fCutZ
dZ cut on matching (EMCAL/PHOS).
Bool_t fLoadPHOSMatrices
Matrices set from configuration, not get from geometry.root or from ESDs/AODs.
void SetPHOSChannelStatusMap(Int_t imod, TH2I *h)
Int_t fNCellsFromPHOSBorder
Number of cells from PHOS border the cell with maximum amplitude has to be.
AliVTrack * GetMatchedTrack(AliVCluster *cluster, AliVEvent *event, Int_t index=-1) const
void RecalibrateCellTimeL1Phase(Double_t &time, Int_t calo, Int_t iSM, Int_t bunchCrossNumber) const
Recalculate time L1 phase shift if time recalibration available for EMCAL.
Bool_t fMCECellClusFracCorrOn
Correct or not the weight of cells in cluster.
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
Int_t fNSuperModulesUsed
Number of supermodules to be used in analysis, can be different than the real geo, to be used at initialization of histograms.
TString fImportGeometryFilePath
Path fo geometry.root file.
Bool_t fPlotCluster
Plot cluster in splitting method.
Int_t fRunNumber
Run number of the data, take it from data itself unless set by user.
void RecalibrateCellAmplitude(Float_t &, Int_t calo, Int_t absId) const
Recalculate cell energy if recalibration factor.
void SetEMCALChannelTimeRecalibrationFactors(TObjArray *map)
Bool_t IsPHOSGeoMatrixSet() const
Bool_t IsTimeRecalibrationOn() const
Bool_t fOADBSet
AODB parameters already set.
TObjArray * fPHOSBadChannelMap
Array of histograms with map of bad channels, PHOS.
TString fPHOSGeoName
Name of geometry to use for PHOS.
Bool_t AreNeighbours(Int_t calo, Int_t absId1, Int_t absId2) const
Int_t GetEMCALChannelStatus(Int_t iSM, Int_t iCol, Int_t iRow) const
Bool_t IsEMCALGeoMatrixSet() const
Class with utils specific to calorimeter clusters/cells.
void AccessGeometry(AliVEvent *inputEvent)
AliEMCALRecoUtils * fEMCALRecoUtils
EMCAL utils for cluster rereconstruction.
void SetEMCALChannelRecalibrationFactors(Int_t iSM, TH2F *h)
void AccessOADB(AliVEvent *event)
TString fOADBFilePathEMCAL
Default path $ALICE_PHYSICS/OADB/EMCAL, if needed change.
void RecalibrateCellTime(Double_t &time, Int_t calo, Int_t absId, Int_t bunchCrossNumber) const
Recalculate time if time recalibration available for EMCAL not ready for PHOS.
Int_t GetMaxEnergyCell(AliVCaloCells *cells, AliVCluster *clu, Float_t &fraction) const
For a given CaloCluster, it gets the absId of the cell with maximum energy deposit.
Float_t fCutR
dR cut on matching (PHOS).
Float_t RecalibrateClusterEnergyWeightCell(AliVCluster *cluster, AliVCaloCells *cells, Float_t energyOrg)
void SplitEnergy(Int_t absId1, Int_t absId2, AliVCluster *cluster, AliVCaloCells *cells, AliAODCaloCluster *cluster1, AliAODCaloCluster *cluster2, Int_t nMax, Int_t eventNumber=0)
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