17 #include <TObjArray.h>
21 #include "AliAODPWG4ParticleCorrelation.h"
22 #include "AliEMCALGeometry.h"
23 #include "AliEMCALGeoParams.h"
25 #include "AliAODTrack.h"
26 #include "AliVCluster.h"
28 #include "AliMixedEvent.h"
43 fPtThresholdMax(10000.),
45 fSumPtThresholdMax(10000.),
61 Float_t phiUEptsumCluster, Float_t etaUEptsumCluster,
62 Float_t & phiUEptsumClusterNorm, Float_t & etaUEptsumClusterNorm,
63 Float_t & excessFracEta, Float_t & excessFracPhi )
const
68 Float_t emcEtaSize = 0.7*2;
69 Float_t emcPhiSize = TMath::DegToRad()*100.;
77 if((2*
fConeSize*emcPhiSize-coneA)!=0) phiUEptsumClusterNorm = phiUEptsumCluster*(coneA / (((2*
fConeSize*emcPhiSize)-coneA)));
78 if((2*
fConeSize*emcEtaSize-coneA)!=0) etaUEptsumClusterNorm = etaUEptsumCluster*(coneA / (((2*
fConeSize*emcEtaSize)-coneA)));
84 if(TMath::Abs(etaC)+
fConeSize > emcEtaSize/2.)
86 Float_t excess = TMath::Abs(etaC) +
fConeSize - emcEtaSize/2.;
89 if ( excessFracEta != 0) coneA /= excessFracEta;
92 if(((2*
fConeSize-excess)*emcPhiSize-coneA) != 0 ) phiUEptsumClusterNorm = phiUEptsumCluster*(coneA / ((((2*
fConeSize-excess)*emcPhiSize)-coneA)));
93 if(( 2*
fConeSize *emcEtaSize-coneA) != 0 ) etaUEptsumClusterNorm = etaUEptsumCluster*(coneA / ((( 2*
fConeSize *emcEtaSize)-coneA)));
101 Float_t phiUEptsumTrack, Float_t etaUEptsumTrack,
102 Float_t & phiUEptsumTrackNorm, Float_t & etaUEptsumTrackNorm,
103 Float_t & excessFracEta, Float_t & excessFracPhi )
const
111 Float_t tpcPhiSize = TMath::TwoPi();
125 if((2*
fConeSize*tpcPhiSize-coneA)!=0) phiUEptsumTrackNorm = phiUEptsumTrack*(coneA / (((2*
fConeSize*tpcPhiSize)-coneA)));
126 if((2*
fConeSize*tpcEtaSize-coneA)!=0) etaUEptsumTrackNorm = etaUEptsumTrack*(coneA / (((2*
fConeSize*tpcEtaSize)-coneA)));
128 if(TMath::Abs(etaC)+
fConeSize > tpcEtaSize/2.)
130 Float_t excess = TMath::Abs(etaC) +
fConeSize - tpcEtaSize/2.;
132 if (excessFracEta != 0) coneA /= excessFracEta;
135 if(((2*
fConeSize-excess)*tpcPhiSize - coneA) !=0 ) phiUEptsumTrackNorm = phiUEptsumTrack*(coneA / ((((2*
fConeSize-excess)*tpcPhiSize)-coneA)));
136 if(( 2*
fConeSize *tpcEtaSize - coneA) !=0 ) etaUEptsumTrackNorm = etaUEptsumTrack*(coneA / ((( 2*
fConeSize *tpcEtaSize)-coneA)));
153 if(coneA > excessA)
return coneA / (coneA-excessA);
156 AliWarning(Form(
"Please Check : Excess Track %2.3f, coneA %2.2f, excessA %2.2f, angle %2.2f,factor %2.2f",
157 excess,coneA, excessA, angle*TMath::RadToDeg(), coneA / (coneA-excessA)));
168 Double_t coneCells = 0.;
169 Double_t coneCellsBad = 0.;
170 Double_t cellDensity = 1.;
172 Float_t phiC = pCandidate->Phi() ;
173 if(phiC<0) phiC+=TMath::TwoPi();
174 Float_t etaC = pCandidate->Eta() ;
178 AliEMCALGeometry* eGeom = AliEMCALGeometry::GetInstance();
182 if (eGeom->GetAbsCellIdFromEtaPhi(etaC,phiC,absId))
185 Int_t iEta=-1, iPhi=-1, iRCU = -1;
189 if (nSupMod % 2) colC = AliEMCALGeoParams::fgkEMCALCols + iEta ;
190 Int_t rowC = iPhi + AliEMCALGeoParams::fgkEMCALRows*int(nSupMod/2);
194 for(Int_t icol = colC-sqrSize; icol < colC+sqrSize;icol++)
196 for(Int_t irow = rowC-sqrSize; irow < rowC+sqrSize; irow++)
198 if (
Radius(colC, rowC, icol, irow) < sqrSize)
203 Int_t cellEta = -999;
204 Int_t cellPhi = -999;
205 if(icol > AliEMCALGeoParams::fgkEMCALCols-1)
207 cellSM = 0+int(irow/AliEMCALGeoParams::fgkEMCALRows)*2;
208 cellEta = icol-AliEMCALGeoParams::fgkEMCALCols;
209 cellPhi = irow-AliEMCALGeoParams::fgkEMCALRows*int(cellSM/2);
211 if(icol < AliEMCALGeoParams::fgkEMCALCols)
213 cellSM = 1+int(irow/AliEMCALGeoParams::fgkEMCALRows)*2;
215 cellPhi = irow-AliEMCALGeoParams::fgkEMCALRows*int(cellSM/2);
219 if(icol < 0 || icol > AliEMCALGeoParams::fgkEMCALCols*2 ||
220 irow < 0 || irow > AliEMCALGeoParams::fgkEMCALRows*16./3)
233 else AliWarning(
"Cluster with bad (eta,phi) in EMCal for energy density calculation");
237 cellDensity = (coneCells-coneCellsBad)/coneCells;
250 Float_t & coneBadCellsCoeff,
251 Float_t & etaBandBadCellsCoeff,
252 Float_t & phiBandBadCellsCoeff)
254 Double_t coneCells = 0.;
255 Double_t phiBandCells = 0.;
256 Double_t etaBandCells = 0.;
258 Float_t phiC = pCandidate->Phi() ;
259 if(phiC<0) phiC+=TMath::TwoPi();
260 Float_t etaC = pCandidate->Eta() ;
264 AliEMCALGeometry* eGeom = AliEMCALGeometry::GetInstance();
268 if (eGeom->GetAbsCellIdFromEtaPhi(etaC,phiC,absId))
271 Int_t iEta=-1, iPhi=-1, iRCU = -1;
276 if (nSupMod % 2) colC = AliEMCALGeoParams::fgkEMCALCols + iEta ;
277 Int_t rowC = iPhi + AliEMCALGeoParams::fgkEMCALRows*int(nSupMod/2);
280 for(Int_t icol = 0; icol < 2*AliEMCALGeoParams::fgkEMCALCols-1;icol++)
282 for(Int_t irow = 0; irow < 5*AliEMCALGeoParams::fgkEMCALRows -1; irow++)
285 if (
Radius(colC, rowC, icol, irow) < sqrSize ) { coneCells += 1.; }
286 else if( icol>colC-sqrSize && icol<colC+sqrSize ) { phiBandCells += 1 ; }
287 else if( irow>rowC-sqrSize && irow<rowC+sqrSize ) { etaBandCells += 1 ; }
290 Int_t cellEta = -999;
291 Int_t cellPhi = -999;
292 if(icol > AliEMCALGeoParams::fgkEMCALCols-1)
294 cellSM = 0+int(irow/AliEMCALGeoParams::fgkEMCALRows)*2;
295 cellEta = icol-AliEMCALGeoParams::fgkEMCALCols;
296 cellPhi = irow-AliEMCALGeoParams::fgkEMCALRows*int(cellSM/2);
298 if(icol < AliEMCALGeoParams::fgkEMCALCols)
300 cellSM = 1+int(irow/AliEMCALGeoParams::fgkEMCALRows)*2;
302 cellPhi = irow-AliEMCALGeoParams::fgkEMCALRows*int(cellSM/2);
305 if( (icol < 0 || icol > AliEMCALGeoParams::fgkEMCALCols*2-1 ||
306 irow < 0 || irow > AliEMCALGeoParams::fgkEMCALRows*5 - 1)
309 if (
Radius(colC, rowC, icol, irow) < sqrSize ) coneBadCellsCoeff += 1.;
310 else if( icol>colC-sqrSize && icol<colC+sqrSize ) phiBandBadCellsCoeff += 1 ;
311 else if( irow>rowC-sqrSize && irow<rowC+sqrSize ) etaBandBadCellsCoeff += 1 ;
316 else AliWarning(
"Cluster with bad (eta,phi) in EMCal for energy density coeff calculation");
321 coneBadCellsCoeff = (coneCells-coneBadCellsCoeff)/coneCells;
324 if (phiBandCells > 0.)
327 phiBandBadCellsCoeff = (phiBandCells-phiBandBadCellsCoeff)/phiBandCells;
330 if (etaBandCells > 0.)
333 etaBandBadCellsCoeff = (etaBandCells-etaBandBadCellsCoeff)/etaBandCells;
346 const Int_t buffersize = 255;
347 char onePar[buffersize] ;
349 snprintf(onePar,buffersize,
"--- AliIsolationCut ---\n") ;
351 snprintf(onePar,buffersize,
"fConeSize: (isolation cone size) %1.2f\n",
fConeSize) ;
357 snprintf(onePar,buffersize,
"fPtFraction=%2.2f (isolation pt threshold fraction) \n",
fPtFraction) ;
359 snprintf(onePar,buffersize,
"fICMethod=%d (isolation cut case) \n",
fICMethod) ;
361 snprintf(onePar,buffersize,
"fPartInCone=%d \n",
fPartInCone) ;
363 snprintf(onePar,buffersize,
"fFracIsThresh=%i \n",
fFracIsThresh) ;
408 AliAODPWG4ParticleCorrelation *pCandidate,
409 TString aodArrayRefName,
412 Float_t & coneptsum, Float_t & ptLead,
415 Float_t ptC = pCandidate->Pt() ;
416 Float_t phiC = pCandidate->Phi() ;
417 if(phiC<0) phiC+=TMath::TwoPi();
418 Float_t etaC = pCandidate->Eta() ;
421 Float_t eta = -100. ;
422 Float_t phi = -100. ;
423 Float_t rad = -100. ;
425 Float_t coneptsumCluster = 0;
426 Float_t coneptsumTrack = 0;
428 Float_t etaBandPtSumTrack = 0;
429 Float_t phiBandPtSumTrack = 0;
430 Float_t etaBandPtSumCluster = 0;
431 Float_t phiBandPtSumCluster = 0;
437 AliDebug(1,Form(
"Candidate pT %2.2f, eta %2.2f, phi %2.2f, cone %1.2f, thres %2.2f, Fill AOD? %d",
438 pCandidate->Pt(), pCandidate->Eta(), pCandidate->Phi()*TMath::RadToDeg(),
fConeSize,
fPtThreshold,bFillAOD));
441 TObjArray * refclusters = 0x0;
442 TObjArray * reftracks = 0x0;
443 Int_t ntrackrefs = 0;
444 Int_t nclusterrefs = 0;
450 for(Int_t ipr = 0;ipr < plCTS->GetEntries() ; ipr ++ )
452 AliVTrack* track =
dynamic_cast<AliVTrack*
>(plCTS->At(ipr)) ;
457 if(track->GetID() == pCandidate->GetTrackLabel(0) || track->GetID() == pCandidate->GetTrackLabel(1) ||
458 track->GetID() == pCandidate->GetTrackLabel(2) || track->GetID() == pCandidate->GetTrackLabel(3) )
continue ;
460 fTrackVector.SetXYZ(track->Px(),track->Py(),track->Pz());
467 AliAODPWG4Particle * trackmix =
dynamic_cast<AliAODPWG4Particle*
>(plCTS->At(ipr)) ;
470 AliWarning(
"Wrong track data type, continue");
475 eta = trackmix->Eta();
476 phi = trackmix->Phi() ;
479 if( phi < 0 ) phi+=TMath::TwoPi();
481 rad =
Radius(etaC, phiC, eta, phi);
494 if(TMath::Abs(phi-phiC) > TMath::PiOver2()) continue ;
519 AliDebug(2,Form(
"\t Track %d, pT %2.2f, eta %1.2f, phi %2.2f, R candidate %2.2f", ipr,pt,eta,phi,rad));
523 AliDebug(2,
"Inside candidate cone");
530 reftracks =
new TObjArray(0);
532 TString tempo(aodArrayRefName) ;
534 reftracks->SetName(tempo);
535 reftracks->SetOwner(kFALSE);
537 reftracks->Add(track);
542 if( ptLead < pt ) ptLead = pt;
576 for(Int_t ipr = 0;ipr < plNe->GetEntries() ; ipr ++ )
578 AliVCluster * calo =
dynamic_cast<AliVCluster *
>(plNe->At(ipr)) ;
585 evtIndex=reader->
GetMixedEvent()->EventIndexForCaloCluster(calo->GetID()) ;
589 if(calo->GetID() == pCandidate->GetCaloLabel(0) ||
590 calo->GetID() == pCandidate->GetCaloLabel(1) )
continue ;
605 AliAODPWG4Particle * calomix =
dynamic_cast<AliAODPWG4Particle*
>(plNe->At(ipr)) ;
608 AliWarning(
"Wrong calo data type, continue");
613 eta = calomix->Eta();
614 phi = calomix->Phi() ;
617 if( phi < 0 ) phi+=TMath::TwoPi();
619 rad =
Radius(etaC, phiC, eta, phi);
632 if(TMath::Abs(phi-phiC)>TMath::PiOver2()) continue ;
664 AliDebug(2,Form(
"\t Cluster %d, pT %2.2f, eta %1.2f, phi %2.2f, R candidate %2.2f", ipr,pt,eta,phi,rad));
668 AliDebug(2,
"Inside candidate cone");
675 refclusters =
new TObjArray(0);
677 TString tempo(aodArrayRefName) ;
678 tempo +=
"Clusters" ;
679 refclusters->SetName(tempo);
680 refclusters->SetOwner(kFALSE);
682 refclusters->Add(calo);
685 coneptsumCluster+=pt;
687 if( ptLead < pt ) ptLead = pt;
718 if(refclusters) pCandidate->AddObjArray(refclusters);
719 if(reftracks) pCandidate->AddObjArray(reftracks);
722 coneptsum = coneptsumCluster + coneptsumTrack;
732 if( ptLead > fPtThreshold ) nfrac = 1 ;
749 if( n == 0 ) isolated = kTRUE ;
751 AliDebug(1,Form(
"pT Cand %2.2f, pT Lead %2.2f, %2.2f<pT Lead< %2.2f, isolated %d",
762 AliDebug(1,Form(
"pT Cand %2.2f, SumPt %2.2f, %2.2f<Sum pT< %2.2f, isolated %d",
767 if(nfrac == 0 ) isolated = kTRUE ;
780 if( coneptsum <
fPtFraction*ptC ) isolated = kTRUE ;
795 Double_t coneptsumBkg = 0.;
796 Float_t etaBandPtSumTrackNorm = 0;
797 Float_t phiBandPtSumTrackNorm = 0;
798 Float_t etaBandPtSumClusterNorm = 0;
799 Float_t phiBandPtSumClusterNorm = 0;
801 Float_t excessFracEtaTrack = 1;
802 Float_t excessFracPhiTrack = 1;
803 Float_t excessFracEtaCluster = 1;
804 Float_t excessFracPhiCluster = 1;
809 phiBandPtSumCluster , etaBandPtSumCluster,
810 phiBandPtSumClusterNorm, etaBandPtSumClusterNorm,
811 excessFracEtaCluster , excessFracPhiCluster );
814 phiBandPtSumTrack , etaBandPtSumTrack ,
815 phiBandPtSumTrackNorm, etaBandPtSumTrackNorm,
816 excessFracEtaTrack , excessFracPhiTrack );
825 coneptsum = coneptsumCluster+coneptsumTrack;
827 coneptsum -= coneptsumBkg;
845 printf(
"**** Print %s %s **** \n", GetName(), GetTitle() ) ;
848 printf(
"Cone Size = %1.2f\n",
fConeSize ) ;
852 printf(
"particle type in cone = %d\n",
fPartInCone ) ;
853 printf(
"using fraction for high pt leading instead of frac ? %i\n",
fFracIsThresh);
865 Float_t eta , Float_t phi)
const
867 Float_t dEta = etaC-eta;
868 Float_t dPhi = phiC-phi;
870 if(TMath::Abs(dPhi) >= TMath::Pi())
871 dPhi = TMath::TwoPi()-TMath::Abs(dPhi);
873 return TMath::Sqrt( dEta*dEta + dPhi*dPhi );
void MakeIsolationCut(TObjArray *plCTS, TObjArray *plNe, AliCaloTrackReader *reader, AliCaloPID *pid, Bool_t bFillAOD, AliAODPWG4ParticleCorrelation *pCandidate, TString aodObjArrayName, Int_t &n, Int_t &nfrac, Float_t &ptSum, Float_t &ptLead, Bool_t &isolated)
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
AliCalorimeterUtils * GetCaloUtils() const
TArrayF * GetCTSFidCutMaxEtaArray() const
Bool_t fFracIsThresh
Use threshold instead of fraction when pt leading is small.
TLorentzVector fMomentum
! Momentum of cluster, temporal object.
Class with utils to perform Isolation Cuts.
virtual AliVEvent * GetInputEvent() const
Int_t fICMethod
Isolation cut method to be used: kPtIC, kSumPtIC, kPtFracIC, kSumPtFracIC.
Float_t fPtThreshold
Minimum pt of the particles in the cone or sum in cone (UE pt mean in the forward region cone) ...
virtual AliMixedEvent * GetMixedEvent() const
virtual void GetVertex(Double_t v[3]) const
Int_t fPartInCone
Type of particles inside cone: kNeutralAndCharged, kOnlyNeutral, kOnlyCharged.
TString GetICParametersList()
TVector3 fTrackVector
! Track moment, temporal object.
Float_t fSumPtThresholdMax
Maximum of sum pt of the particles in the cone (UE sum in the forward region cone) ...
virtual AliFiducialCut * GetFiducialCut()
Float_t GetCellDensity(AliAODPWG4ParticleCorrelation *pCandidate, AliCaloTrackReader *reader) const
Get good cell density (number of active cells over all cells in cone).
Float_t fConeSize
Size of the isolation cone.
void CalculateUEBandClusterNormalization(AliCaloTrackReader *reader, Float_t etaC, Float_t phiC, Float_t phiUEptsumCluster, Float_t etaUEptsumCluster, Float_t &phiUEptsumClusterNorm, Float_t &etaUEptsumClusterNorm, Float_t &excessFracEta, Float_t &excessFracPhi) const
Get normalization of cluster background band.
Base class for event, clusters and tracks filtering and preparation for the analysis.
void Print(const Option_t *opt) const
Print some relevant parameters set for the analysis.
void CalculateUEBandTrackNormalization(AliCaloTrackReader *reader, Float_t etaC, Float_t phiC, Float_t phiUEptsumTrack, Float_t etaUEptsumTrack, Float_t &phiUEptsumTrackNorm, Float_t &etaUEptsumTrackNorm, Float_t &excessFracEta, Float_t &excessFracPhi) const
Get normalization of track background band.
Float_t fPtThresholdMax
Maximum pt of the particles outside the cone (needed to fit shower distribution isolated/non-isolated...
Float_t fSumPtThreshold
Minimum of sum pt of the particles in the cone (UE sum in the forward region cone) ...
Float_t fPtFraction
Fraction of the momentum of particles in cone or sum in cone.
Int_t GetEMCALChannelStatus(Int_t iSM, Int_t iCol, Int_t iRow) const
Class for PID selection with calorimeters.
Class with utils specific to calorimeter clusters/cells.
AliIsolationCut()
Default constructor. Initialize parameters.
Float_t Radius(Float_t etaCandidate, Float_t phiCandidate, Float_t eta, Float_t phi) const
Float_t CalculateExcessAreaFraction(Float_t excess) const
TArrayF * GetCTSFidCutMinEtaArray() const
void GetCoeffNormBadCell(AliAODPWG4ParticleCorrelation *pCandidate, AliCaloTrackReader *reader, Float_t &coneBadCellsCoeff, Float_t &etaBandBadCellsCoeff, Float_t &phiBandBadCellsCoeff)
Get good cell density (number of active cells over all cells in cone).
Bool_t IsTrackMatched(AliVCluster *cluster, AliCalorimeterUtils *cu, AliVEvent *event) const
Int_t GetModuleNumberCellIndexes(Int_t absId, Int_t calo, Int_t &icol, Int_t &irow, Int_t &iRCU) const
Get the EMCAL/PHOS module, columns, row and RCU number that corresponds to this absId.