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.),
51 fIsTMClusterInConeRejected(1),
62 Float_t phiUEptsumCluster, Float_t etaUEptsumCluster,
63 Float_t & phiUEptsumClusterNorm, Float_t & etaUEptsumClusterNorm,
64 Float_t & excessFracEta, Float_t & excessFracPhi )
const
69 Float_t emcEtaSize = 0.7*2;
70 Float_t emcPhiSize = TMath::DegToRad()*100.;
78 if((2*
fConeSize*emcPhiSize-coneA)!=0) phiUEptsumClusterNorm = phiUEptsumCluster*(coneA / (((2*
fConeSize*emcPhiSize)-coneA)));
79 if((2*
fConeSize*emcEtaSize-coneA)!=0) etaUEptsumClusterNorm = etaUEptsumCluster*(coneA / (((2*
fConeSize*emcEtaSize)-coneA)));
85 if(TMath::Abs(etaC)+
fConeSize > emcEtaSize/2.)
87 Float_t excess = TMath::Abs(etaC) +
fConeSize - emcEtaSize/2.;
90 if ( excessFracEta != 0) coneA /= excessFracEta;
93 if(((2*
fConeSize-excess)*emcPhiSize-coneA) != 0 ) phiUEptsumClusterNorm = phiUEptsumCluster*(coneA / ((((2*
fConeSize-excess)*emcPhiSize)-coneA)));
94 if(( 2*
fConeSize *emcEtaSize-coneA) != 0 ) etaUEptsumClusterNorm = etaUEptsumCluster*(coneA / ((( 2*
fConeSize *emcEtaSize)-coneA)));
102 Float_t phiUEptsumTrack, Float_t etaUEptsumTrack,
103 Float_t & phiUEptsumTrackNorm, Float_t & etaUEptsumTrackNorm,
104 Float_t & excessFracEta, Float_t & excessFracPhi )
const
112 Float_t tpcPhiSize = TMath::TwoPi();
126 if((2*
fConeSize*tpcPhiSize-coneA)!=0) phiUEptsumTrackNorm = phiUEptsumTrack*(coneA / (((2*
fConeSize*tpcPhiSize)-coneA)));
127 if((2*
fConeSize*tpcEtaSize-coneA)!=0) etaUEptsumTrackNorm = etaUEptsumTrack*(coneA / (((2*
fConeSize*tpcEtaSize)-coneA)));
129 if(TMath::Abs(etaC)+
fConeSize > tpcEtaSize/2.)
131 Float_t excess = TMath::Abs(etaC) +
fConeSize - tpcEtaSize/2.;
133 if (excessFracEta != 0) coneA /= excessFracEta;
136 if(((2*
fConeSize-excess)*tpcPhiSize - coneA) !=0 ) phiUEptsumTrackNorm = phiUEptsumTrack*(coneA / ((((2*
fConeSize-excess)*tpcPhiSize)-coneA)));
137 if(( 2*
fConeSize *tpcEtaSize - coneA) !=0 ) etaUEptsumTrackNorm = etaUEptsumTrack*(coneA / ((( 2*
fConeSize *tpcEtaSize)-coneA)));
154 if(coneA > excessA)
return coneA / (coneA-excessA);
157 AliWarning(Form(
"Please Check : Excess Track %2.3f, coneA %2.2f, excessA %2.2f, angle %2.2f,factor %2.2f",
158 excess,coneA, excessA, angle*TMath::RadToDeg(), coneA / (coneA-excessA)));
169 Double_t coneCells = 0.;
170 Double_t coneCellsBad = 0.;
171 Double_t cellDensity = 1.;
173 Float_t phiC = pCandidate->Phi() ;
174 if(phiC<0) phiC+=TMath::TwoPi();
175 Float_t etaC = pCandidate->Eta() ;
179 AliEMCALGeometry* eGeom = AliEMCALGeometry::GetInstance();
183 if (eGeom->GetAbsCellIdFromEtaPhi(etaC,phiC,absId))
186 Int_t iEta=-1, iPhi=-1, iRCU = -1;
190 if (nSupMod % 2) colC = AliEMCALGeoParams::fgkEMCALCols + iEta ;
191 Int_t rowC = iPhi + AliEMCALGeoParams::fgkEMCALRows*int(nSupMod/2);
195 for(Int_t icol = colC-sqrSize; icol < colC+sqrSize;icol++)
197 for(Int_t irow = rowC-sqrSize; irow < rowC+sqrSize; irow++)
199 if (
Radius(colC, rowC, icol, irow) < sqrSize)
204 Int_t cellEta = -999;
205 Int_t cellPhi = -999;
206 if(icol > AliEMCALGeoParams::fgkEMCALCols-1)
208 cellSM = 0+int(irow/AliEMCALGeoParams::fgkEMCALRows)*2;
209 cellEta = icol-AliEMCALGeoParams::fgkEMCALCols;
210 cellPhi = irow-AliEMCALGeoParams::fgkEMCALRows*int(cellSM/2);
212 if(icol < AliEMCALGeoParams::fgkEMCALCols)
214 cellSM = 1+int(irow/AliEMCALGeoParams::fgkEMCALRows)*2;
216 cellPhi = irow-AliEMCALGeoParams::fgkEMCALRows*int(cellSM/2);
220 if(icol < 0 || icol > AliEMCALGeoParams::fgkEMCALCols*2 ||
221 irow < 0 || irow > AliEMCALGeoParams::fgkEMCALRows*16./3)
234 else AliWarning(
"Cluster with bad (eta,phi) in EMCal for energy density calculation");
238 cellDensity = (coneCells-coneCellsBad)/coneCells;
251 Float_t & coneBadCellsCoeff,
252 Float_t & etaBandBadCellsCoeff,
253 Float_t & phiBandBadCellsCoeff)
255 Double_t coneCells = 0.;
256 Double_t phiBandCells = 0.;
257 Double_t etaBandCells = 0.;
259 Float_t phiC = pCandidate->Phi() ;
260 if(phiC<0) phiC+=TMath::TwoPi();
261 Float_t etaC = pCandidate->Eta() ;
265 AliEMCALGeometry* eGeom = AliEMCALGeometry::GetInstance();
269 if (eGeom->GetAbsCellIdFromEtaPhi(etaC,phiC,absId))
272 Int_t iEta=-1, iPhi=-1, iRCU = -1;
277 if (nSupMod % 2) colC = AliEMCALGeoParams::fgkEMCALCols + iEta ;
278 Int_t rowC = iPhi + AliEMCALGeoParams::fgkEMCALRows*int(nSupMod/2);
281 for(Int_t icol = 0; icol < 2*AliEMCALGeoParams::fgkEMCALCols-1;icol++)
283 for(Int_t irow = 0; irow < 5*AliEMCALGeoParams::fgkEMCALRows -1; irow++)
286 if (
Radius(colC, rowC, icol, irow) < sqrSize ) { coneCells += 1.; }
287 else if( icol>colC-sqrSize && icol<colC+sqrSize ) { phiBandCells += 1 ; }
288 else if( irow>rowC-sqrSize && irow<rowC+sqrSize ) { etaBandCells += 1 ; }
291 Int_t cellEta = -999;
292 Int_t cellPhi = -999;
293 if(icol > AliEMCALGeoParams::fgkEMCALCols-1)
295 cellSM = 0+int(irow/AliEMCALGeoParams::fgkEMCALRows)*2;
296 cellEta = icol-AliEMCALGeoParams::fgkEMCALCols;
297 cellPhi = irow-AliEMCALGeoParams::fgkEMCALRows*int(cellSM/2);
299 if(icol < AliEMCALGeoParams::fgkEMCALCols)
301 cellSM = 1+int(irow/AliEMCALGeoParams::fgkEMCALRows)*2;
303 cellPhi = irow-AliEMCALGeoParams::fgkEMCALRows*int(cellSM/2);
306 if( (icol < 0 || icol > AliEMCALGeoParams::fgkEMCALCols*2-1 ||
307 irow < 0 || irow > AliEMCALGeoParams::fgkEMCALRows*5 - 1)
310 if (
Radius(colC, rowC, icol, irow) < sqrSize ) coneBadCellsCoeff += 1.;
311 else if( icol>colC-sqrSize && icol<colC+sqrSize ) phiBandBadCellsCoeff += 1 ;
312 else if( irow>rowC-sqrSize && irow<rowC+sqrSize ) etaBandBadCellsCoeff += 1 ;
317 else AliWarning(
"Cluster with bad (eta,phi) in EMCal for energy density coeff calculation");
322 coneBadCellsCoeff = (coneCells-coneBadCellsCoeff)/coneCells;
325 if (phiBandCells > 0.)
328 phiBandBadCellsCoeff = (phiBandCells-phiBandBadCellsCoeff)/phiBandCells;
331 if (etaBandCells > 0.)
334 etaBandBadCellsCoeff = (etaBandCells-etaBandBadCellsCoeff)/etaBandCells;
347 const Int_t buffersize = 255;
348 char onePar[buffersize] ;
350 snprintf(onePar,buffersize,
"--- AliIsolationCut ---\n") ;
352 snprintf(onePar,buffersize,
"fConeSize: (isolation cone size) %1.2f\n",
fConeSize) ;
358 snprintf(onePar,buffersize,
"fPtFraction=%2.2f (isolation pt threshold fraction) \n",
fPtFraction) ;
360 snprintf(onePar,buffersize,
"fICMethod=%d (isolation cut case) \n",
fICMethod) ;
362 snprintf(onePar,buffersize,
"fPartInCone=%d \n",
fPartInCone) ;
364 snprintf(onePar,buffersize,
"fFracIsThresh=%i \n",
fFracIsThresh) ;
409 AliAODPWG4ParticleCorrelation *pCandidate,
410 TString aodArrayRefName,
413 Float_t & coneptsum, Float_t & ptLead,
416 Float_t ptC = pCandidate->Pt() ;
417 Float_t phiC = pCandidate->Phi() ;
418 if(phiC<0) phiC+=TMath::TwoPi();
419 Float_t etaC = pCandidate->Eta() ;
422 Float_t eta = -100. ;
423 Float_t phi = -100. ;
424 Float_t rad = -100. ;
426 Float_t coneptsumCluster = 0;
427 Float_t coneptsumTrack = 0;
429 Float_t etaBandPtSumTrack = 0;
430 Float_t phiBandPtSumTrack = 0;
431 Float_t etaBandPtSumCluster = 0;
432 Float_t phiBandPtSumCluster = 0;
438 AliDebug(1,Form(
"Candidate pT %2.2f, eta %2.2f, phi %2.2f, cone %1.2f, thres %2.2f, Fill AOD? %d",
439 pCandidate->Pt(), pCandidate->Eta(), pCandidate->Phi()*TMath::RadToDeg(),
fConeSize,
fPtThreshold,bFillAOD));
442 TObjArray * refclusters = 0x0;
443 TObjArray * reftracks = 0x0;
444 Int_t ntrackrefs = 0;
445 Int_t nclusterrefs = 0;
451 for(Int_t ipr = 0;ipr < plCTS->GetEntries() ; ipr ++ )
453 AliVTrack* track =
dynamic_cast<AliVTrack*
>(plCTS->At(ipr)) ;
458 if(track->GetID() == pCandidate->GetTrackLabel(0) || track->GetID() == pCandidate->GetTrackLabel(1) ||
459 track->GetID() == pCandidate->GetTrackLabel(2) || track->GetID() == pCandidate->GetTrackLabel(3) )
continue ;
461 fTrackVector.SetXYZ(track->Px(),track->Py(),track->Pz());
468 AliAODPWG4Particle * trackmix =
dynamic_cast<AliAODPWG4Particle*
>(plCTS->At(ipr)) ;
471 AliWarning(
"Wrong track data type, continue");
476 eta = trackmix->Eta();
477 phi = trackmix->Phi() ;
480 if( phi < 0 ) phi+=TMath::TwoPi();
482 rad =
Radius(etaC, phiC, eta, phi);
495 if(TMath::Abs(phi-phiC) > TMath::PiOver2()) continue ;
520 AliDebug(2,Form(
"\t Track %d, pT %2.2f, eta %1.2f, phi %2.2f, R candidate %2.2f", ipr,pt,eta,phi,rad));
524 AliDebug(2,
"Inside candidate cone");
531 reftracks =
new TObjArray(0);
533 TString tempo(aodArrayRefName) ;
535 reftracks->SetName(tempo);
536 reftracks->SetOwner(kFALSE);
538 reftracks->Add(track);
543 if( ptLead < pt ) ptLead = pt;
577 for(Int_t ipr = 0;ipr < plNe->GetEntries() ; ipr ++ )
579 AliVCluster * calo =
dynamic_cast<AliVCluster *
>(plNe->At(ipr)) ;
586 evtIndex=reader->
GetMixedEvent()->EventIndexForCaloCluster(calo->GetID()) ;
590 if(calo->GetID() == pCandidate->GetCaloLabel(0) ||
591 calo->GetID() == pCandidate->GetCaloLabel(1) )
continue ;
610 AliAODPWG4Particle * calomix =
dynamic_cast<AliAODPWG4Particle*
>(plNe->At(ipr)) ;
613 AliWarning(
"Wrong calo data type, continue");
618 eta = calomix->Eta();
619 phi = calomix->Phi() ;
622 if( phi < 0 ) phi+=TMath::TwoPi();
624 rad =
Radius(etaC, phiC, eta, phi);
637 if(TMath::Abs(phi-phiC)>TMath::PiOver2()) continue ;
669 AliDebug(2,Form(
"\t Cluster %d, pT %2.2f, eta %1.2f, phi %2.2f, R candidate %2.2f", ipr,pt,eta,phi,rad));
673 AliDebug(2,
"Inside candidate cone");
680 refclusters =
new TObjArray(0);
682 TString tempo(aodArrayRefName) ;
683 tempo +=
"Clusters" ;
684 refclusters->SetName(tempo);
685 refclusters->SetOwner(kFALSE);
687 refclusters->Add(calo);
690 coneptsumCluster+=pt;
692 if( ptLead < pt ) ptLead = pt;
723 if(refclusters) pCandidate->AddObjArray(refclusters);
724 if(reftracks) pCandidate->AddObjArray(reftracks);
727 coneptsum = coneptsumCluster + coneptsumTrack;
737 if( ptLead > fPtThreshold ) nfrac = 1 ;
754 if( n == 0 ) isolated = kTRUE ;
756 AliDebug(1,Form(
"pT Cand %2.2f, pT Lead %2.2f, %2.2f<pT Lead< %2.2f, isolated %d",
767 AliDebug(1,Form(
"pT Cand %2.2f, SumPt %2.2f, %2.2f<Sum pT< %2.2f, isolated %d",
772 if(nfrac == 0 ) isolated = kTRUE ;
785 if( coneptsum <
fPtFraction*ptC ) isolated = kTRUE ;
800 Double_t coneptsumBkg = 0.;
801 Float_t etaBandPtSumTrackNorm = 0;
802 Float_t phiBandPtSumTrackNorm = 0;
803 Float_t etaBandPtSumClusterNorm = 0;
804 Float_t phiBandPtSumClusterNorm = 0;
806 Float_t excessFracEtaTrack = 1;
807 Float_t excessFracPhiTrack = 1;
808 Float_t excessFracEtaCluster = 1;
809 Float_t excessFracPhiCluster = 1;
814 phiBandPtSumCluster , etaBandPtSumCluster,
815 phiBandPtSumClusterNorm, etaBandPtSumClusterNorm,
816 excessFracEtaCluster , excessFracPhiCluster );
819 phiBandPtSumTrack , etaBandPtSumTrack ,
820 phiBandPtSumTrackNorm, etaBandPtSumTrackNorm,
821 excessFracEtaTrack , excessFracPhiTrack );
830 coneptsum = coneptsumCluster+coneptsumTrack;
832 coneptsum -= coneptsumBkg;
850 printf(
"**** Print %s %s **** \n", GetName(), GetTitle() ) ;
853 printf(
"Cone Size = %1.2f\n",
fConeSize ) ;
857 printf(
"particle type in cone = %d\n",
fPartInCone ) ;
858 printf(
"using fraction for high pt leading instead of frac ? %i\n",
fFracIsThresh);
870 Float_t eta , Float_t phi)
const
872 Float_t dEta = etaC-eta;
873 Float_t dPhi = phiC-phi;
875 if(TMath::Abs(dPhi) >= TMath::Pi())
876 dPhi = TMath::TwoPi()-TMath::Abs(dPhi);
878 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...
Bool_t fIsTMClusterInConeRejected
Enable to remove the Track matching removal of clusters in cone sum pt calculation in case of kNeutra...
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/DDL number that corresponds to this absId...