11 #include <TParticle.h>
12 #include <TClonesArray.h>
17 #include "AliAnalysisManager.h"
18 #include "AliCentrality.h"
20 #include "AliTPCPIDResponse.h"
21 #include "AliTOFPIDResponse.h"
22 #include "AliVTrack.h"
23 #include "AliVVertex.h"
24 #include "AliVEvent.h"
25 #include "AliPIDResponse.h"
26 #include "AliVParticle.h"
27 #include "AliMCEvent.h"
28 #include "AliInputEventHandler.h"
29 #include "AliVEventHandler.h"
31 #include "AliAODTrack.h"
32 #include "AliAODMCParticle.h"
33 #include "AliAODVertex.h"
35 #define LIGHT_SPEED 2.99792457999999984e-02 // in the units that TOF likes
49 TAxis *axis =
const_cast<TAxis*
>(h->GetXaxis());
50 const Int_t bins = axis->GetNbins();
52 const Double_t from = axis->GetXmin();
53 const Double_t to = axis->GetXmax();
54 Double_t *newBins =
new Double_t[bins + 1];
57 Double_t factor = pow(to / from, 1. / bins);
59 for (Int_t i = 1; i <= bins; i++) {
60 newBins[i] = factor * newBins[i - 1];
62 axis->Set(bins, newBins);
72 :AliAnalysisTaskSE(taskname.Data())
87 ,fTOFlowBoundary(-2.4)
88 ,fTOFhighBoundary(3.6)
90 ,fDisableITSatHighPt(100.f)
91 ,fDisableTPCpidAtHighPt(100.f)
92 ,fEnablePerformance(kFALSE)
93 ,fEnablePtCorrection(kTRUE)
94 ,fRequireITSrefit(kTRUE)
95 ,fRequireTPCrefit(kTRUE)
96 ,fRequireNoKinks(kTRUE)
97 ,fRequireITSrecPoints(2u)
98 ,fRequireITSsignal(0u)
99 ,fRequireSDDrecPoints(0u)
100 ,fRequireSPDrecPoints(1u)
101 ,fRequireTPCrecPoints(70u)
102 ,fRequireTPCsignal(70u)
103 ,fRequireEtaMin(-0.8f)
104 ,fRequireEtaMax(0.8f)
107 ,fRequireMaxChi2(4.f)
108 ,fRequireMaxDCAxy(0.5f)
109 ,fRequireMaxDCAz(1.f)
110 ,fRequireTPCpidSigmas(3.f)
111 ,fRequireITSpidSigmas(-1.f)
112 ,fRequireMinEnergyLoss(0.)
113 ,fRequireMagneticField(0)
114 ,fRequireVetoSPD(kFALSE)
115 ,fParticle(AliPID::kUnknown)
122 ,fFlattenedCentrality(0x0)
123 ,fCentralityClasses(0x0)
133 ,fMDCAPrimaryTPC(0x0)
134 ,fMDCASecondaryTPC(0x0)
135 ,fMDCAPrimaryTOF(0x0)
136 ,fMDCASecondaryTOF(0x0)
152 Float_t aCorrection[3] = {-2.10154e-03,-4.53472e-01,-3.01246e+00};
153 Float_t mCorrection[3] = {-2.00277e-03,-4.93461e-01,-3.05463e+00};
156 DefineInput(0, TChain::Class());
157 DefineOutput(1, TList::Class());
165 if (AliAnalysisManager::GetAnalysisManager()->IsProofMode())
return;
174 fList->SetOwner(kTRUE);
176 const Int_t nPtBins =
fPtBins.GetSize() - 1;
177 const Int_t nCentBins =
fCentBins.GetSize() - 1;
178 const Int_t nDCAbins =
fDCABins.GetSize() - 1;
179 const Float_t *pTbins =
fPtBins.GetArray();
180 const Float_t *centBins =
fCentBins.GetArray();
181 const Float_t *dcaBins =
fDCABins.GetArray();
183 fCentrality =
new TH1F(
"fCentrality",
";Centrality (%);Events / 1%;",100,0.,100.);
184 fCentralityClasses =
new TH1F(
"fCentralityClasses",
";Centrality classes(%);Events / Class;",
187 Events / 1%;",100,0.,100.);
193 fMTotal =
new TH2F(
"fMTotal",
";Centrality (%);p_{T} (GeV/c); Counts",
194 nCentBins,centBins,nPtBins,pTbins);
195 fATotal =
new TH2F(
"fATotal",
";Centrality (%);p_{T} (GeV/c); Counts",
196 nCentBins,centBins,nPtBins,pTbins);
197 fMITS_TPC =
new TH2F(
"fMITS_TPC",
";Centrality (%);p_{T} (GeV/c); Counts",
198 nCentBins,centBins,nPtBins,pTbins);
199 fAITS_TPC =
new TH2F(
"fAITS_TPC",
";Centrality (%);p_{T} (GeV/c); Counts",
200 nCentBins,centBins,nPtBins,pTbins);
201 fMITS_TPC_TOF =
new TH2F(
"fMITS_TPC_TOF",
";Centrality (%);p_{T} (GeV/c); Counts",
202 nCentBins,centBins,nPtBins,pTbins);
203 fAITS_TPC_TOF =
new TH2F(
"fAITS_TPC_TOF",
";Centrality (%);p_{T} (GeV/c); Counts",
204 nCentBins,centBins,nPtBins,pTbins);
205 fMDCAPrimaryTPC =
new TH3F(
"fMDCAPrimaryTPC",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
206 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
207 fMDCASecondaryTPC =
new TH3F(
"fMDCASecondaryTPC",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
208 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
209 fMDCAPrimaryTOF =
new TH3F(
"fMDCAPrimaryTOF",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
210 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
211 fMDCASecondaryTOF =
new TH3F(
"fMDCASecondaryTOF",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
212 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
214 ";p_{T}^{rec} (GeV/c);p_{T}^{MC}-p_{T}^{rec} (GeV/c);Entries",
215 160,0.4,6.,80,-1.,1.);
217 ";p_{T}^{rec} (GeV/c);p_{T}^{MC}-p_{T}^{rec} (GeV/c);Entries",
218 160,0.4,6.,80,-1.,1.);
219 fProduction =
new TH1F(
"fProduction",
";p (GeV/c);Entries",100,-10,10);
245 const int nTpcBins = 40;
246 float tpcBins[nTpcBins + 1];
247 for (
int i = 0; i <= nTpcBins; ++i) {
248 tpcBins[i] = -4.f + i * 0.2f;
252 ";Centrality (%);p_{T} (GeV/c);m_{TOF}^{2}-m_{PDG}^{2} (GeV/c^{2})^{2}",
253 nCentBins,centBins,nPtBins,pTbins,
fTOFnBins,tofBins);
254 fATPCcounts =
new TH2F(
"fATPCcounts",
";Centrality (%);p_{T} (GeV/c); Entries",
255 nCentBins,centBins,nPtBins,pTbins);
257 ";#phi;p_{T} (GeV/c);m_{TOF}^{2}-m_{PDG}^{2} (GeV/c^{2})^{2}",
258 64,0.,TMath::TwoPi(),36,0.2,2.,
260 fATPCphiCounts =
new TH2F(
"fATPCphiCounts",
";#phi;p_{T} (GeV/c);Counts",64,0.,TMath::TwoPi(),
262 fATPCeLoss =
new TH2F(
"fATPCeLoss",
";p (GeV/c);TPC dE/dx (a.u.);Entries",200,0.2,10.,
264 fMDCAxyTPC =
new TH3F(
"fMDCAxyTPC",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
265 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
266 fMDCAzTPC =
new TH3F(
"fMDCAzTPC",
";Centrality (%);p_{T} (GeV/c); DCA_{z} (cm)",
267 nCentBins,centBins,nPtBins,pTbins,
fDCAzNbins,dcazBins);
268 fMDCAxyTOF =
new TH3F(
"fMDCAxyTOF",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
269 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
270 fMDCAzTOF =
new TH3F(
"fMDCAzTOF",
";Centrality (%);p_{T} (GeV/c); DCA_{z} (cm)",
271 nCentBins,centBins,nPtBins,pTbins,
fDCAzNbins,dcazBins);
273 ";Centrality (%);p_{T} (GeV/c);m_{TOF}^{2}-m_{PDG}^{2} (GeV/c^{2})^{2}",
274 nCentBins,centBins,nPtBins,pTbins,
fTOFnBins,tofBins);
275 fMTPCcounts =
new TH2F(
"fMTPCcounts",
";Centrality (%);p_{T} (GeV/c); Entries",
276 nCentBins,centBins,nPtBins,pTbins);
277 fMTPCeLoss =
new TH2F(
"fMTPCeLoss",
";p (GeV/c);TPC dE/dx (a.u.);Entries",200,0.2,10.,
280 ";#phi;p_{T} (GeV/c);m_{TOF}^{2}-m_{PDG}^{2} (GeV/c^{2})^{2}",
281 64,0.,TMath::TwoPi(),36,0.2,2.,
283 fMTPCphiCounts =
new TH2F(
"fMTPCphiCounts",
";#phi;p_{T} (GeV/c);Counts",64,0.,TMath::TwoPi(),
317 ::Error(
"AliAnalysisTaskNucleiYield::UserExec",
"No particle type set");
324 AliVEvent *ev =
dynamic_cast<AliVEvent*
> (InputEvent());
325 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
326 AliInputEventHandler* handl = (AliInputEventHandler*)mgr->GetInputEventHandler();
330 UInt_t mask = handl->IsEventSelected();
331 if (!(mask & 0xffffffff)) {
338 if (!((mask & AliVEvent::kMB) || (mask & AliVEvent::kCentral) ||
339 (mask & AliVEvent::kSemiCentral))) {
346 fPID = handl->GetPIDResponse();
349 AliCentrality *centr = ev->GetCentrality();
350 float centrality = centr->GetCentralityPercentile(
"V0M");
352 if (centrality < 0. || centrality > 80.) {
385 TClonesArray *stack = 0x0;
388 stack = (TClonesArray*)ev->GetList()->FindObject(AliAODMCParticle::StdBranchName());
395 fMmc.SetOwner(kFALSE);
396 fAmc.SetOwner(kFALSE);
397 for (
int iMC = 0; iMC < stack->GetEntriesFast(); ++iMC) {
398 AliAODMCParticle *part = (AliAODMCParticle*)stack->UncheckedAt(iMC);
399 const int pdg = part->GetPdgCode();
404 if (part->IsPhysicalPrimary())
fMTotal->Fill(centrality,part->Pt());
406 }
else if (pdg == -
fPDG) {
407 if (part->IsPhysicalPrimary())
fATotal->Fill(centrality,part->Pt());
414 for (Int_t iT = 0; iT < (Int_t)ev->GetNumberOfTracks(); ++iT) {
415 AliAODTrack *track =
dynamic_cast<AliAODTrack*
>(ev->GetTrack(iT));
416 if (track->GetID() <= 0)
continue;
419 const float beta =
HasTOF(track);
420 float pT = track->Pt();
423 AliAODMCParticle *part = (AliAODMCParticle*)stack->At(TMath::Abs(track->GetLabel()));
425 if (part->GetPdgCode() ==
fPDG) {
426 if (part->IsPhysicalPrimary()) {
432 if (part->IsPhysicalPrimary()) {
439 }
else if (part->GetPdgCode() == -
fPDG) {
441 if (part->IsPhysicalPrimary()) {
447 if (track->Charge() > 0) {
448 fMTPCeLoss->Fill(track->GetTPCmomentum(),track->GetTPCsignal());
450 fATPCeLoss->Fill(track->GetTPCmomentum(),track->GetTPCsignal());
453 if (track->Charge() > 0) {
462 if (beta < 0)
continue;
464 const float m = track->GetTPCmomentum() * (TMath::Sqrt(1.f - beta * beta) / beta);
465 if (track->Charge() > 0) {
501 ULong_t status = track->GetStatus();
505 AliAODVertex *vtx1 = (AliAODVertex*)track->GetProdVertex();
506 if(Int_t(vtx1->GetType()) == AliAODVertex::kKink &&
fRequireNoKinks)
return kFALSE;
514 unsigned int nSPD = 0, nITS = 0, nSDD = 0;
515 for (
int i = 0; i < 6; ++i) {
516 if (track->HasPointOnITSLayer(i)) {
518 else if (i < 4) nSDD++;
542 Bool_t hasTOFout = track->GetStatus() & AliVTrack::kTOFout;
543 Bool_t hasTOFtime = track->GetStatus() & AliVTrack::kTIME;
544 const float len = track->GetIntegratedLength();
545 Bool_t hasTOF = Bool_t(hasTOFout & hasTOFtime) && len > 350.f;
547 if (!hasTOF)
return -1.;
548 const float p = track->GetTPCmomentum();
549 const float tim = track->GetTOFsignal() -
fPID->GetTOFResponse().GetStartTime(p);
553 if (beta < EPS || beta > (1. -
EPS))
577 const float delta = (max - min) / nbins;
579 for (
int iB = 0; iB < nbins; ++iB) {
602 if (par == 0x0 && sigma <= 0) {
606 for (
int i = 0; i < 5; ++i)
619 bool itsPID = kTRUE, tpcPID = kTRUE;
621 AliITSPIDResponse &itsPidResp =
fPID->GetITSResponse();
627 AliTPCPIDResponse &tpcPidResp =
fPID->GetTPCResponse();
638 return itsPID && tpcPID;
672 fPDGMass = AliPID::ParticleMass(part);
688 0.839266,0.822364,0.807522,0.804727,0.806675,
689 0.828297,0.820842,0.834088,0.861455,1.,
690 0.38112,0.661154,0.953928
699 return (cent < 1) && gRandom->Rndm() > 0.35;
711 const Float_t correction = par[0] + par[1] * TMath::Exp(par[2] * pt);
TH3F * fMDCASecondaryTPC
! *(MC only)* distribution of secondaries for ITS+TPC tracks
void SetPtBins(Int_t nbins, Float_t *bins)
TArrayF fPtBins
Transverse momentum bins.
Float_t fPDGMassOverZ
PDG mass over z.
TH1F * fFlattenedCentrality
! Events centrality distribution after the flattening
AliPIDResponse * fPID
! PID response class
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
TH3F * fATOFsignal
! *(Data only)* TOF signal for anti-matter
TH1F * fCentrality
! Events centrality distribution
UShort_t fRequireITSrecPoints
Cut on tracks: minimum number of required ITS recpoints.
TH3F * fMDCAPrimaryTOF
! *(MC only)* distribution of primaries for ITS+TPC+TOF tracks
TList fMmc
*(MC only)* List of matter particles
Int_t fRequireMagneticField
{0 : any magnetic field is fine, -1 : only negative magnetic field, 1 : only positive} ...
TList * fList
Output list.
virtual void UserCreateOutputObjects()
Float_t HasTOF(AliAODTrack *t)
Int_t fPDG
PDG code of the particle of interest.
TH3F * fMDCAxyTOF
! *(Data only)* distribution for ITS+TPC+TOF tracks
TH2F * fATotal
! *(MC only)* Particles in acceptance (anti-matter)
Float_t fRequireMinEnergyLoss
Cut on the minimum energy loss counts in TPC.
UShort_t fRequireSDDrecPoints
Cut on tracks: minimum number of required SDD recpoints.
TH2F * fMPtCorrection
! *(MC only)* as a function of for matter
TH3F * fMDCAxyTPC
! *(Data only)* distribution for ITS+TPC tracks
Bool_t fRequireNoKinks
Cut on tracks: set true to exclude tracks from kink vertices.
Bool_t AcceptTrack(AliAODTrack *t, Double_t dca[2])
TH2F * fATPCeLoss
! *(Data only)* TPC dE/dx for anti-matter
TH1F * fCentralityClasses
! Events statistics per centrality classes
static void BinLogAxis(const TH1 *h)
TList fAmc
*(MC only)* List of anti-matter particles
TH3F * fMDCAPrimaryTPC
! *(MC only)* distribution of primaries for ITS+TPC tracks
void SetDCAzBins(Int_t nbins, Float_t limit)
Float_t fMagField
Magnetic field value for the current event.
TH2F * fMITS_TPC
! *(MC only)* Tracks reconstructed in ITS-TPC acceptance (matter)
Bool_t fRequireVetoSPD
Cut away all the tracks with at least 1 SPD cluster.
Int_t fTOFnBins
Number of bins used for the TOF mass spectra.
Bool_t Flatten(float cent)
TArrayF fDCABins
DCA bins.
TH2F * fAPtCorrection
! *(MC only)* as a function of for anti-matter
void SetParticleType(AliPID::EParticleType part)
TH2F * fMTPCcounts
! *(Data only)* TPC counts for matter
Float_t fDisableTPCpidAtHighPt
threshold for TPC pid cut
TArrayF fCustomTPCpid
Custom parametrisation of the Bethe-Bloch.
TH2F * fAITS_TPC_TOF
! *(MC only)* Tracks reconstructed in ITS-TPC-TOF acceptance (anti-matter)
Int_t fDCAzNbins
Number of bins used for distributions.
Bool_t fRequireITSrefit
Cut on tracks: set true to require ITS refit.
TH3F * fATOFphiSignal
! *(Data only)* TOF signal for anti-matter as a function of
Bool_t PassesPIDSelection(AliAODTrack *t)
Float_t fRequireMaxChi2
Cut on tracks: maximum TPC .
Bool_t fEnablePtCorrection
If true enables the MC based correction.
TArrayF fPtCorrectionM
Array containing the parametrisation of the.
TH3F * fMDCAzTOF
! *(Data only)* distribution for ITS+TPC+TOF tracks
virtual ~AliAnalysisTaskNucleiYield()
UShort_t fRequireSPDrecPoints
Cut on tracks: minimum number of required SPD recpoints.
Float_t fTOFhighBoundary
Upper limit for the TOF mass spectra histograms.
Float_t fTOFlowBoundary
Lower limit for the TOF mass spectra histograms.
TH3F * fMDCAzTPC
! *(Data only)* distribution for ITS+TPC tracks
TH3F * fMTOFsignal
! *(Data only)* TOF signal for matter
Float_t fPDGMass
PDG mass.
AliVVertex * fPrimaryVertex
! Primary vertex of the current event
TArrayF fPtCorrectionA
Array containing the parametrisation of the.
virtual void UserExec(Option_t *)
TH2F * fMTPCeLoss
! *(Data only)* TPC dE/dx for matter
Bool_t fEnablePerformance
If true enables the task saves in the output the performance plots.
TH2F * fATPCcounts
! *(Data only)* TPC counts for anti-matter
TH2F * fMTotal
! *(MC only)* Particles in acceptance (matter)
void PtCorrection(float &pt, bool positiveCharge)
void SetCustomTPCpid(Float_t *par, Float_t sigma)
void SetCentBins(Int_t nbins, Float_t *bins)
AliPID::EParticleType fParticle
Particle specie.
AliAnalysisTaskNucleiYield(TString taskname="NucleiYieldTask")
TArrayF fFlatteningProbs
Flattening probabilities.
void SetTOFBins(Int_t nbins, Float_t min, Float_t max)
TH2F * fMITS_TPC_TOF
! *(MC only)* Tracks reconstructed in ITS-TPC-TOF acceptance (matter)
This task fills histograms required to perform the analysis on the light nuclei yield.
Bool_t fRequireTPCrefit
Cut on tracks: set true to require TPC refit.
Float_t fRequireEtaMin
Cut on tracks: minimum eta for the track.
TH3F * fMDCASecondaryTOF
! *(MC only)* distribution of secondaries for ITS+TPC+TOF tracks
Float_t fRequireYmin
Cut on tracks: mimimum y for the track (using PDG mass)
Float_t fDCAzLimit
Limits of the histograms.
Float_t fRequireTPCpidSigmas
Cut on TPC PID number of sigmas.
TH3F * fMTOFphiSignal
! *(Data only)* TOF signal for matter as a function of
TH2F * fATPCphiCounts
! *(Data only)* TPC counts for anti-matter as a function of
Bool_t fIsMC
Switch between MC and data.
TH1F * fProduction
! *(MC only)* Total number of produced particles
Float_t fDisableITSatHighPt
threshold for ITS cuts
Float_t fRequireYmax
Cut on tracks: maximum y for the track (using PDG mass)
TH2F * fMTPCphiCounts
! *(Data only)* TPC counts for matter as a function of
TArrayF fCentBins
Centrality bins.
void SetDCABins(Int_t nbins, Float_t min, Float_t max)
Float_t fRequireITSpidSigmas
Cut on ITS PID number of sigmas.
Float_t fRequireMaxDCAxy
Cut on tracks: maximum for the track.
Float_t fRequireMaxDCAz
Cut on tracks: maximum for the track.
Float_t fRequireEtaMax
Cut on tracks: maximum eta for the track.
TH2F * fAITS_TPC
! *(MC only)* Tracks reconstructed in ITS-TPC acceptance (anti-matter)
virtual void Terminate(Option_t *)