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 ,fEnablePerformance(kFALSE)
91 ,fEnablePtCorrection(kTRUE)
92 ,fRequireITSrefit(kTRUE)
93 ,fRequireTPCrefit(kTRUE)
94 ,fRequireNoKinks(kTRUE)
95 ,fRequireITSrecPoints(2u)
96 ,fRequireITSsignal(0u)
97 ,fRequireSDDrecPoints(0u)
98 ,fRequireSPDrecPoints(1u)
99 ,fRequireTPCrecPoints(70u)
100 ,fRequireTPCsignal(70u)
101 ,fRequireEtaMin(-0.8f)
102 ,fRequireEtaMax(0.8f)
105 ,fRequireMaxChi2(4.f)
106 ,fRequireMaxDCAxy(0.5f)
107 ,fRequireMaxDCAz(1.f)
108 ,fRequireTPCpidSigmas(3.f)
109 ,fRequireITSpidSigmas(-1.f)
110 ,fRequireMinEnergyLoss(0.)
111 ,fRequireMagneticField(0)
112 ,fRequireVetoSPD(kFALSE)
113 ,fParticle(AliPID::kUnknown)
120 ,fFlattenedCentrality(0x0)
121 ,fCentralityClasses(0x0)
131 ,fMDCAPrimaryTPC(0x0)
132 ,fMDCASecondaryTPC(0x0)
133 ,fMDCAPrimaryTOF(0x0)
134 ,fMDCASecondaryTOF(0x0)
150 Float_t aCorrection[3] = {-2.10154e-03,-4.53472e-01,-3.01246e+00};
151 Float_t mCorrection[3] = {-2.00277e-03,-4.93461e-01,-3.05463e+00};
154 DefineInput(0, TChain::Class());
155 DefineOutput(1, TList::Class());
163 if (AliAnalysisManager::GetAnalysisManager()->IsProofMode())
return;
172 fList->SetOwner(kTRUE);
174 const Int_t nPtBins =
fPtBins.GetSize() - 1;
175 const Int_t nCentBins =
fCentBins.GetSize() - 1;
176 const Int_t nDCAbins =
fDCABins.GetSize() - 1;
177 const Float_t *pTbins =
fPtBins.GetArray();
178 const Float_t *centBins =
fCentBins.GetArray();
179 const Float_t *dcaBins =
fDCABins.GetArray();
181 fCentrality =
new TH1F(
"fCentrality",
";Centrality (%);Events / 1%;",100,0.,100.);
182 fCentralityClasses =
new TH1F(
"fCentralityClasses",
";Centrality classes(%);Events / Class;",
185 Events / 1%;",100,0.,100.);
191 fMTotal =
new TH2F(
"fMTotal",
";Centrality (%);p_{T} (GeV/c); Counts",
192 nCentBins,centBins,nPtBins,pTbins);
193 fATotal =
new TH2F(
"fATotal",
";Centrality (%);p_{T} (GeV/c); Counts",
194 nCentBins,centBins,nPtBins,pTbins);
195 fMITS_TPC =
new TH2F(
"fMITS_TPC",
";Centrality (%);p_{T} (GeV/c); Counts",
196 nCentBins,centBins,nPtBins,pTbins);
197 fAITS_TPC =
new TH2F(
"fAITS_TPC",
";Centrality (%);p_{T} (GeV/c); Counts",
198 nCentBins,centBins,nPtBins,pTbins);
199 fMITS_TPC_TOF =
new TH2F(
"fMITS_TPC_TOF",
";Centrality (%);p_{T} (GeV/c); Counts",
200 nCentBins,centBins,nPtBins,pTbins);
201 fAITS_TPC_TOF =
new TH2F(
"fAITS_TPC_TOF",
";Centrality (%);p_{T} (GeV/c); Counts",
202 nCentBins,centBins,nPtBins,pTbins);
203 fMDCAPrimaryTPC =
new TH3F(
"fMDCAPrimaryTPC",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
204 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
205 fMDCASecondaryTPC =
new TH3F(
"fMDCASecondaryTPC",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
206 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
207 fMDCAPrimaryTOF =
new TH3F(
"fMDCAPrimaryTOF",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
208 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
209 fMDCASecondaryTOF =
new TH3F(
"fMDCASecondaryTOF",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
210 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
212 ";p_{T}^{rec} (GeV/c);p_{T}^{MC}-p_{T}^{rec} (GeV/c);Entries",
213 160,0.4,6.,80,-1.,1.);
215 ";p_{T}^{rec} (GeV/c);p_{T}^{MC}-p_{T}^{rec} (GeV/c);Entries",
216 160,0.4,6.,80,-1.,1.);
217 fProduction =
new TH1F(
"fProduction",
";p (GeV/c);Entries",100,-10,10);
243 const int nTpcBins = 40;
244 float tpcBins[nTpcBins + 1];
245 for (
int i = 0; i <= nTpcBins; ++i) {
246 tpcBins[i] = -4.f + i * 0.2f;
250 ";Centrality (%);p_{T} (GeV/c);m_{TOF}^{2}-m_{PDG}^{2} (GeV/c^{2})^{2}",
251 nCentBins,centBins,nPtBins,pTbins,
fTOFnBins,tofBins);
252 fATPCcounts =
new TH2F(
"fATPCcounts",
";Centrality (%);p_{T} (GeV/c); Entries",
253 nCentBins,centBins,nPtBins,pTbins);
255 ";#phi;p_{T} (GeV/c);m_{TOF}^{2}-m_{PDG}^{2} (GeV/c^{2})^{2}",
256 64,0.,TMath::TwoPi(),36,0.2,2.,
258 fATPCphiCounts =
new TH2F(
"fATPCphiCounts",
";#phi;p_{T} (GeV/c);Counts",64,0.,TMath::TwoPi(),
260 fATPCeLoss =
new TH2F(
"fATPCeLoss",
";p (GeV/c);TPC dE/dx (a.u.);Entries",200,0.2,10.,
262 fMDCAxyTPC =
new TH3F(
"fMDCAxyTPC",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
263 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
264 fMDCAzTPC =
new TH3F(
"fMDCAzTPC",
";Centrality (%);p_{T} (GeV/c); DCA_{z} (cm)",
265 nCentBins,centBins,nPtBins,pTbins,
fDCAzNbins,dcazBins);
266 fMDCAxyTOF =
new TH3F(
"fMDCAxyTOF",
";Centrality (%);p_{T} (GeV/c); DCA_{xy} (cm)",
267 nCentBins,centBins,nPtBins,pTbins,nDCAbins,dcaBins);
268 fMDCAzTOF =
new TH3F(
"fMDCAzTOF",
";Centrality (%);p_{T} (GeV/c); DCA_{z} (cm)",
269 nCentBins,centBins,nPtBins,pTbins,
fDCAzNbins,dcazBins);
271 ";Centrality (%);p_{T} (GeV/c);m_{TOF}^{2}-m_{PDG}^{2} (GeV/c^{2})^{2}",
272 nCentBins,centBins,nPtBins,pTbins,
fTOFnBins,tofBins);
273 fMTPCcounts =
new TH2F(
"fMTPCcounts",
";Centrality (%);p_{T} (GeV/c); Entries",
274 nCentBins,centBins,nPtBins,pTbins);
275 fMTPCeLoss =
new TH2F(
"fMTPCeLoss",
";p (GeV/c);TPC dE/dx (a.u.);Entries",200,0.2,10.,
278 ";#phi;p_{T} (GeV/c);m_{TOF}^{2}-m_{PDG}^{2} (GeV/c^{2})^{2}",
279 64,0.,TMath::TwoPi(),36,0.2,2.,
281 fMTPCphiCounts =
new TH2F(
"fMTPCphiCounts",
";#phi;p_{T} (GeV/c);Counts",64,0.,TMath::TwoPi(),
315 ::Error(
"AliAnalysisTaskNucleiYield::UserExec",
"No particle type set");
322 AliVEvent *ev =
dynamic_cast<AliVEvent*
> (InputEvent());
323 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
324 AliInputEventHandler* handl = (AliInputEventHandler*)mgr->GetInputEventHandler();
328 UInt_t mask = handl->IsEventSelected();
329 if (!(mask & 0xffffffff)) {
336 if (!((mask & AliVEvent::kMB) || (mask & AliVEvent::kCentral) ||
337 (mask & AliVEvent::kSemiCentral))) {
344 fPID = handl->GetPIDResponse();
347 AliCentrality *centr = ev->GetCentrality();
348 float centrality = centr->GetCentralityPercentile(
"V0M");
350 if (centrality < 0. || centrality > 80.) {
383 TClonesArray *stack = 0x0;
386 stack = (TClonesArray*)ev->GetList()->FindObject(AliAODMCParticle::StdBranchName());
393 fMmc.SetOwner(kFALSE);
394 fAmc.SetOwner(kFALSE);
395 for (
int iMC = 0; iMC < stack->GetEntriesFast(); ++iMC) {
396 AliAODMCParticle *part = (AliAODMCParticle*)stack->UncheckedAt(iMC);
397 const int pdg = part->GetPdgCode();
402 if (part->IsPhysicalPrimary())
fMTotal->Fill(centrality,part->Pt());
404 }
else if (pdg == -
fPDG) {
405 if (part->IsPhysicalPrimary())
fATotal->Fill(centrality,part->Pt());
412 for (Int_t iT = 0; iT < (Int_t)ev->GetNumberOfTracks(); ++iT) {
413 AliAODTrack *track =
dynamic_cast<AliAODTrack*
>(ev->GetTrack(iT));
414 if (track->GetID() <= 0)
continue;
417 const float beta =
HasTOF(track);
418 float pT = track->Pt();
421 AliAODMCParticle *part = (AliAODMCParticle*)stack->At(TMath::Abs(track->GetLabel()));
423 if (part->GetPdgCode() ==
fPDG) {
424 if (part->IsPhysicalPrimary()) {
430 if (part->IsPhysicalPrimary()) {
437 }
else if (part->GetPdgCode() == -
fPDG) {
439 if (part->IsPhysicalPrimary()) {
445 if (track->Charge() > 0) {
446 fMTPCeLoss->Fill(track->GetTPCmomentum(),track->GetTPCsignal());
448 fATPCeLoss->Fill(track->GetTPCmomentum(),track->GetTPCsignal());
451 if (track->Charge() > 0) {
460 if (beta < 0)
continue;
462 const float m = track->GetTPCmomentum() * (TMath::Sqrt(1.f - beta * beta) / beta);
463 if (track->Charge() > 0) {
499 ULong_t status = track->GetStatus();
504 AliAODVertex *vtx1 = (AliAODVertex*)track->GetProdVertex();
505 if(Int_t(vtx1->GetType()) == AliAODVertex::kKink &&
fRequireNoKinks)
return kFALSE;
506 unsigned int nSPD = 0, nITS = 0, nSDD = 0;
507 for (
int i = 0; i < 6; ++i) {
508 if (track->HasPointOnITSLayer(i)) {
510 else if (i < 4) nSDD++;
533 Bool_t hasTOFout = track->GetStatus() & AliVTrack::kTOFout;
534 Bool_t hasTOFtime = track->GetStatus() & AliVTrack::kTIME;
535 const float len = track->GetIntegratedLength();
536 Bool_t hasTOF = Bool_t(hasTOFout & hasTOFtime) && len > 350.f;
538 if (!hasTOF)
return -1.;
539 const float p = track->GetTPCmomentum();
540 const float tim = track->GetTOFsignal() -
fPID->GetTOFResponse().GetStartTime(p);
544 if (beta < EPS || beta > (1. -
EPS))
568 const float delta = (max - min) / nbins;
570 for (
int iB = 0; iB < nbins; ++iB) {
593 if (par == 0x0 && sigma <= 0) {
597 for (
int i = 0; i < 5; ++i)
612 AliITSPIDResponse &itsPidResp =
fPID->GetITSResponse();
617 AliTPCPIDResponse &tpcPidResp =
fPID->GetTPCResponse();
660 fPDGMass = AliPID::ParticleMass(part);
676 0.839266,0.822364,0.807522,0.804727,0.806675,
677 0.828297,0.820842,0.834088,0.861455,1.,
678 0.38112,0.661154,0.953928
687 return (cent < 1) && gRandom->Rndm() > 0.35;
699 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
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 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 *)