15 #include "AliVTrack.h" 32 fDoMomDepMatching(kFALSE),
35 fPlotOversubtractionHistograms(kFALSE),
36 fDoNotOversubtract(kFALSE),
37 fUseM02SubtractionScheme(kFALSE),
38 fUseConstantSubtraction(kFALSE),
39 fConstantSubtractionValue(0.),
40 fClusterContainerIndexMap(),
41 fParticleContainerIndexMap(),
42 fTrackToContainerMap(),
43 fHistMatchEtaPhiAll(0),
44 fHistMatchEtaPhiAllCl(0),
46 fHistNclusMatchvsCent(0),
51 fHistNClusMatchCent(0)
53 for(
Int_t i=0; i<10; i++) {
70 for(
Int_t j=0; j<4; j++)
74 for(
Int_t j=0; j<9; j++) {
75 for(
Int_t k=0; k<2; k++)
131 for(
Int_t icent=0; icent<nCentChBins; ++icent) {
132 for(
Int_t ipt=0; ipt<9; ++ipt) {
133 for(
Int_t ieta=0; ieta<2; ++ieta) {
134 name = Form(
"fHistMatchEtaPhi_%i_%i_%i",icent,ipt,ieta);
142 name = Form(
"fHistEsubPch_%i",icent);
143 temp = Form(
"%s (Nmatches==1)",name.Data());
145 fHistEsubPch[icent]->SetXTitle(
"#sum p (GeV) weighted with E_{sub}");
146 fOutput->Add(fHistEsubPch[icent]);
148 name = Form(
"fHistEsubPchRat_%i",icent);
149 temp = Form(
"%s (Nmatches==1)",name.Data());
151 fHistEsubPchRat[icent]->SetXTitle(
"#Sigma p (GeV)");
152 fHistEsubPchRat[icent]->SetYTitle(
"E_{sub} / #sum p");
153 fOutput->Add(fHistEsubPchRat[icent]);
156 for(
Int_t itrk=0; itrk<4; ++itrk) {
157 name = Form(
"fHistNCellsEnergy_%i_%i",icent,itrk);
158 temp = Form(
"%s (Nmatches==%d);N_{cells};E_{clus} (GeV)",name.Data(),itrk);
160 fOutput->Add(fHistNCellsEnergy[icent][itrk]);
163 name = Form(
"fHistEsubPchRatAll_%i",icent);
164 temp = Form(
"%s (all Nmatches)",name.Data());
166 fHistEsubPchRatAll[icent]->SetXTitle(
"#Sigma p (GeV)");
167 fHistEsubPchRatAll[icent]->SetYTitle(
"E_{sub} / #sum p");
168 fOutput->Add(fHistEsubPchRatAll[icent]);
170 name = Form(
"fHistMatchEvsP_%i",icent);
171 temp = Form(
"%s (all Nmatches)",name.Data());
173 fHistMatchEvsP[icent]->SetXTitle(
"E_{clus} (GeV)");
174 fHistMatchEvsP[icent]->SetYTitle(
"E_{clus} / #sum p");
175 fOutput->Add(fHistMatchEvsP[icent]);
177 name = Form(
"fHistMatchdRvsEP_%i",icent);
178 temp = Form(
"%s (all Nmatches)",name.Data());
180 fHistMatchdRvsEP[icent]->SetXTitle(
"#Delta R between track and cluster");
181 fHistMatchdRvsEP[icent]->SetYTitle(
"E_{clus} / p");
182 fOutput->Add(fHistMatchdRvsEP[icent]);
184 name = Form(
"fHistNMatchEnergy_%i",icent);
192 fHistNclusvsCent =
new TH1F(
"Nclusvscent",
"NclusVsCent; Cent (%)", 100, 0, 100);
193 fHistNclusMatchvsCent =
new TH1F(
"NclusMatchvscent",
"NclusMatchVsCent (all Nmatches); Cent (%)", 100, 0, 100);
194 fHistEbefore =
new TH1F(
"Ebefore",
"Ebefore; Cent (%); E_{clus} (GeV)", 100, 0, 100);
195 fHistEafter =
new TH1F(
"Eafter",
"Eafter; Cent (%); E_{clus} (GeV)", 100, 0, 100);
197 fHistNMatchCent =
new TH2F(
"NMatchesCent",
"NMatchesCent; Cent (%); Nmatches", 100, 0, 100, 11, -0.5, 10.5);
198 fHistNClusMatchCent =
new TH2F(
"NClusMatchesCent",
"NClusMatchesCent; Cent (%); Nmatches", 100, 0, 100, 11, -0.5, 10.5);
210 name = Form(
"fHistEmbTrackMatchesOversub_%d",icent);
216 name = Form(
"fHistNonEmbTrackMatchesOversub_%d",icent);
222 name = Form(
"fHistOversubMCClusters_%d",icent);
228 name = Form(
"fHistOversubNonMCClusters_%d",icent);
234 name = Form(
"fHistOversub_%d",icent);
236 fHistOversub[icent]->GetXaxis()->SetTitle(
"E_{clus}^{raw} (GeV)");
237 fHistOversub[icent]->GetYaxis()->SetTitle(
"E_{oversub} / E_{clus}^{raw}");
269 AliVCluster *cluster = 0;
272 while ((clusCont = static_cast<AliClusterContainer*>(nextClusCont()))) {
275 cluster =
static_cast<AliVCluster *
>(clusIterator->second);
293 energyclus = cluster->GetNonLinCorrEnergy();
296 if (energyclus < 0) energyclus = 0;
298 cluster->SetHadCorrEnergy(energyclus);
326 if (!partCont) { AliErrorStream() <<
"Failed to retrieve particle container at index " << i <<
"\n"; }
329 AliVTrack * track =
static_cast<AliVTrack *
>(partCont->
GetParticle(j));
343 else if (p>=0.5 && p<1.0)
345 else if (p>=1.0 && p<1.5)
347 else if (p>=1.5 && p<2.)
349 else if (p>=2. && p<3.)
351 else if (p>=3. && p<4.)
353 else if (p>=4. && p<5.)
355 else if (p>=5. && p<8.)
368 Double_t EtaSigma[9]={0.0097,0.0075,0.0059,0.0055,0.0053,0.005,0.005,0.0045,0.0042};
369 return 2.0*EtaSigma[pbin];
387 return PhiMean[pbin];
388 }
else if (centbin==1) {
398 return PhiMean[pbin];
399 }
else if (centbin==2) {
409 return PhiMean[pbin];
410 }
else if (centbin==3) {
420 return PhiMean[pbin];
421 }
else if (centbin==4) {
431 return PhiMean[pbin]*(-1.);
432 }
else if (centbin==5) {
442 return PhiMean[pbin]*(-1.);
443 }
else if (centbin==6) {
453 return PhiMean[pbin]*(-1.);
454 }
else if (centbin==7) {
464 return PhiMean[pbin]*(-1.);
485 return 2.*PhiSigma[pbin];
486 }
else if (centbin==1) {
496 return 2.*PhiSigma[pbin];
497 }
else if (centbin==2) {
507 return 2.*PhiSigma[pbin];
508 }
else if (centbin==3) {
518 return 2.*PhiSigma[pbin];
519 }
else if (centbin==4) {
529 return 2.*PhiSigma[pbin];
530 }
else if (centbin==5) {
540 return 2.*PhiSigma[pbin];
541 }
else if (centbin==6) {
551 return 2.*PhiSigma[pbin];
552 }
else if (centbin==7) {
562 return 2.*PhiSigma[pbin];
576 if (!cluster)
return;
581 TF1 funcPtDepEta(
"func",
"[1] + 1 / pow(x + pow(1 / ([0] - [1]), 1 / [2]), [2])");
582 funcPtDepEta.SetParameters(0.04, 0.010, 2.5);
583 TF1 funcPtDepPhi(
"func",
"[1] + 1 / pow(x + pow(1 / ([0] - [1]), 1 / [2]), [2])");
584 funcPtDepPhi.SetParameters(0.09, 0.015, 2.);
587 Int_t Ntrks = cluster->GetNTracksMatched();
588 for (
Int_t i = 0; i < Ntrks; ++i) {
589 AliVTrack* track = 0;
592 Int_t itrack = cluster->GetTrackMatchedIndex(i);
595 track =
static_cast<AliVTrack*
>(res.second->GetAcceptParticle(res.first));
599 track =
static_cast<AliVTrack*
>(cluster->GetTrackMatched(i));
600 UInt_t rejectionReason = 0;
602 if (!partCont) { AliErrorStream() <<
"Requested particle container not available!\n"; }
606 if (!track)
continue;
614 if (
fDoTrackClus && (track->GetEMCALcluster() != icluster))
continue;
620 if (track->Charge() < 0) centbinch +=
fNcentBins;
624 if (track->Eta() > 0) etabin=1;
650 phiCutlo = -funcPtDepPhi.Eval(mom);
651 phiCuthi = +funcPtDepPhi.Eval(mom);
652 etaCut = funcPtDepEta.Eval(mom);
655 if ((phidiff < phiCuthi && phidiff > phiCutlo) && TMath::Abs(etadiff) < etaCut) {
668 Double_t dR = TMath::Sqrt(dphi*dphi + deta*deta);
669 Double_t energyclus = cluster->GetNonLinCorrEnergy();
676 if (totalTrkP > 0) trkPMCfrac /= totalTrkP;
686 Double_t energyclus = cluster->GetNonLinCorrEnergy();
688 AliVTrack* track = 0;
690 if (cluster->GetNTracksMatched() > 0) {
692 Int_t itrack = cluster->GetTrackMatchedIndex(0);
695 track =
static_cast<AliVTrack*
>(res.second->GetAcceptParticle(res.first));
699 track =
static_cast<AliVTrack*
>(cluster->GetTrackMatched(0));
700 UInt_t rejectionReason = 0;
702 if (!partCont) { AliErrorStream() <<
"Requested particle container not available!\n"; }
707 if (!track || track->P() < 1e-6)
return energyclus;
718 Int_t cid = track->GetEMCALcluster();
719 if (
fDoTrackClus && (cid != icluster))
return energyclus;
723 if (track->Charge() < 0) centbinch +=
fNcentBins;
728 if(track->Eta() > 0) etabin = 1;
737 Double_t dRmin = TMath::Sqrt(etadiff*etadiff + phidiff*phidiff);
764 if ((dPhiMin < phiCuthi && dPhiMin > phiCutlo) && TMath::Abs(dEtaMin) < etaCut) {
765 energyclus -= hadCorr * mom;
778 Double_t energyclus = cluster->GetNonLinCorrEnergy();
779 Double_t cNcells = cluster->GetNCells();
785 Int_t NMCmatches = 0;
790 Double_t Esub = hadCorr * totalTrkP;
792 if (Esub > energyclus) Esub = energyclus;
797 if (energyclus < clusEexcl) clusEexcl = energyclus;
798 if ((energyclus - Esub) < clusEexcl) Esub = (energyclus - clusEexcl);
815 EsubMC = hadCorr * totalTrkP * trkPMCfrac;
816 EsubBkg = hadCorr * totalTrkP - EsubMC;
817 EclusMC = energyclus * cluster->GetMCEnergyFraction();
818 EclusBkg = energyclus - EclusMC;
820 if (energyclus > Esub)
821 EclusCorr = energyclus - Esub;
823 if (EclusMC > EsubMC)
824 EclusMCcorr = EclusMC - EsubMC;
826 if (EclusBkg > EsubBkg)
827 EclusBkgcorr = EclusBkg - EsubBkg;
829 overSub = EclusMCcorr + EclusBkgcorr - EclusCorr;
847 Double_t EoP = energyclus / totalTrkP;
854 AliVTrack* track = 0;
856 Int_t itrack = cluster->GetTrackMatchedIndex(0);
859 track =
static_cast<AliVTrack*
>(res.second->GetAcceptParticle(res.first));
863 track =
static_cast<AliVTrack*
>(cluster->GetTrackMatched(0));
864 UInt_t rejectionReason = 0;
866 if (!partCont) { AliErrorStream() <<
"Requested particle container not available!\n"; }
871 if (track->Charge() < 0) centbinchm +=
fNcentBins;
880 if (cluster->GetMCEnergyFraction() > 0.95)
882 else if (cluster->GetMCEnergyFraction() < 0.05)
885 if (trkPMCfrac < 0.05)
887 else if (trkPMCfrac > 0.95)
895 if (EclusBkgcorr + EclusMCcorr > 0) {
896 Double_t newfrac = EclusMCcorr / (EclusBkgcorr + EclusMCcorr);
897 cluster->SetMCEnergyFraction(newfrac);
913 Double_t clusM02 = cluster->GetM02();
918 if (clusM02 > 0.1 && clusM02 < 0.4) {
933 else if (Nmatches == 1) {
938 Esub = hadCorr * totalTrkP;
941 else if (Nmatches > 1) {
Int_t fNcentBins
How many centrality bins (this member copied from AliAnalysisTaskEmcal)
Bool_t fEsdMode
flag for ESD
Double_t fHadCorr
hadronic correction (fraction)
Bool_t fDoMomDepMatching
set the values fPhiMatch and fEtaMatch depending on the track momentum
AliParticleContainer * GetParticleContainer(Int_t i=0) const
TH2 * fHistMatchEtaPhiAll
!deta vs. dphi of matched cluster-track pairs
TH2 * fHistMatchEtaPhi[10][9][2]
!deta vs. dphi of matched cluster-track pairs
const AliClusterIterableMomentumContainer accepted_momentum() const
TH2 * fHistNonEmbTrackMatchesOversub[5]
!Over-subtracted energy / cluster energy with non-embedded track matches (embedded matches < 5%) ...
bidirectional stl iterator over the EMCAL iterable container
TH2 * fHistNMatchEnergy[5]
!n matches vs. cluster energy
std::pair< int, U * > LocalIndexFromGlobalIndex(const int globalIndex) const
TH2 * fHistOversubMCClusters[5]
!Over-subtracted energy / cluster energy (cluster MC energy fraction > 95%)
Int_t GetNParticles() const
Bool_t fUseConstantSubtraction
Flag to perform constant rather than fractional subtract (only applicable if using M02 scheme) ...
static RegisterCorrectionComponent< AliEmcalCorrectionClusterHadronicCorrection > reg
TH2 * fHistOversubNonMCClusters[5]
!Over-subtracted energy / cluster energy (cluster MC energy fraction < 5%)
virtual void UserCreateOutputObjects()
Bool_t fDoNotOversubtract
do not oversubtract energy from cluster (embedding only)
AliEmcalContainerIndexMap< AliClusterContainer, AliVCluster > fClusterContainerIndexMap
! Mapping between index and cluster containers
TH2 * fHistMatchEvsP[5]
!cluster energy vs. track momentum of matched pairs
Int_t fCentBin
! Event centrality bin
int GlobalIndexFromLocalIndex(const U *inputObject, const int localIndex) const
TH1 * fHistEsubPch[10]
!Esub vs. total momentum of matched tracks (only 1 match)
Container for particles within the EMCAL framework.
Double_t fEtaMatch
eta match value (pp=0.025)
TObjArray fParticleCollArray
Particle/track collection array.
Double_t ApplyHadCorrOneTrack(Int_t icluster, Double_t hadCorr)
TObjArray fClusterCollArray
Cluster collection array.
TH1 * fHistEafter
!average energy of clusters after correction vs. centrality
TH2 * fHistEsubPchRatAll[5]
!Esub/momentum of matched tracks vs. total momentum of matched tracks (all number of matches) ...
Double_t ApplyHadCorrAllTracks(Int_t icluster, Double_t hadCorr)
TH2 * fHistNCellsEnergy[5][4]
!n cells vs. cluster energy
Base class for correction components in the EMCal correction framework.
TH2 * fHistEsubPchRat[10]
!Esub/momentum of matched tracks vs. total momentum of matched tracks (only 1 match) ...
virtual AliVParticle * GetParticle(Int_t i=-1) const
Double_t fEexclCell
energy/cell that we cannot subtract from the clusters
TH2 * fHistNMatchCent
!n matches vs. centraity
static const AliEmcalContainerIndexMap< TClonesArray, AliVCluster > & GetEmcalContainerIndexMap()
Get the EMCal container utils associated with particle containers.
std::map< AliVTrack *, AliParticleContainer * > fTrackToContainerMap
! Mapping between AliVTracks and their respective particle containers. Needed for AODs only...
Int_t fMinMCLabel
Minimum MC label value for the tracks/clusters being considered MC particles.
TH2 * fHistEoPCent
!E/P vs. centrality
V * GetObjectFromGlobalIndex(const int globalIndex) const
Double_t fPhiMatch
phi match value (pp=0.050)
virtual Bool_t AcceptParticle(const AliVParticle *vp, UInt_t &rejectionReason) const
AliEmcalCorrectionClusterHadronicCorrection()
Double_t GetPhiSigma(Int_t pbin, Int_t centbin) const
Double_t fMaxBinPt
Max pt in histograms.
Bool_t fPlotOversubtractionHistograms
compute and plot oversubtracted energy from embedded/signal matches (embedding only) ...
TList * fOutput
! List of output histograms
Double_t ComputeM02Subtraction(const AliVCluster *cluster, Double_t energyclus, Int_t Nmatches, Double_t totalTrkP, Double_t hadCorr)
Bool_t fCreateHisto
Flag to make some basic histograms.
Hadronic correction component in the EMCal correction framework.
TH1 * fHistEbefore
!average energy of clusters before correction vs. centrality
Double_t GetEtaSigma(Int_t pbin) const
Double_t fCent
! Event centrality
virtual Bool_t Initialize()
void DoMatchedTracksLoop(Int_t icluster, Double_t &totalTrkP, Int_t &Nmatches, Double_t &trkPMCfrac, Int_t &NMCmatches)
void GenerateTrackToContainerMap()
Double_t fMinBinPt
Min pt in histograms.
void CopyMappingFrom(const AliEmcalContainerIndexMap< U2, V > &map, U *cont)
TH1 * fHistNclusMatchvsCent
!n clusters matched to some track vs. centrality
TH2 * fHistMatchdRvsEP[5]
!matching distance vs. E/P
void GetEtaPhiDiff(const AliVTrack *t, const AliVCluster *v, Double_t &phidiff, Double_t &etadiff)
Bool_t fDoTrackClus
loop over tracks first
Int_t fNbins
No. of pt bins.
AliEmcalContainerIndexMap< AliParticleContainer, AliVParticle > fParticleContainerIndexMap
! Mapping between index and particle containers
Bool_t fUseM02SubtractionScheme
Flag to enable hadronic correction scheme using cluster M02 value.
Container structure for EMCAL clusters.
TH2 * fHistOversub[5]
!Over-subtracted energy / cluster energy
TH2 * fHistEmbTrackMatchesOversub[5]
!Over-subtracted energy / cluster energy with embedded track matches (non-embedded matches < 5%) ...
void UserCreateOutputObjects()
UInt_t GetMomBin(Double_t pt) const
TH1 * fHistNclusvsCent
!n clusters vs. centrality
static const AliEmcalContainerIndexMap< TClonesArray, AliVParticle > & GetEmcalContainerIndexMap()
Get the EMCal container utils associated with particle containers.
TH2 * fHistMatchEtaPhiAllCl
!deta vs. dphi of all cluster-track pairs (cl loop)
virtual ~AliEmcalCorrectionClusterHadronicCorrection()
Double_t GetPhiMean(Int_t pbin, Int_t centbin) const
TH2 * fHistNClusMatchCent
!n clusters macthed to some track (tracks allowed to match more than one cluster) ...
bool GetProperty(std::string propertyName, T &property, bool requiredProperty=true, std::string correctionName="")
Retrieve property.
Double_t fConstantSubtractionValue
Value to be used for constant subtraction (only applicable if using constant subtraction in M02 schem...