1 /**************************************************************************
2 * Author: Panos Christakoglou. *
3 * Contributors are mentioned in the code where appropriate. *
5 * Permission to use, copy, modify and distribute this software and its *
6 * documentation strictly for non-commercial purposes is hereby granted *
7 * without fee, provided that the above copyright notice appears in all *
8 * copies and that both the copyright notice and this permission notice *
9 * appear in the supporting documentation. The authors make no claims *
10 * about the suitability of this software for any purpose. It is *
11 * provided "as is" without express or implied warranty. *
12 **************************************************************************/
14 /* $Id: AliProtonAnalysisBase.cxx 31056 2009-02-16 14:31:41Z pchrist $ */
16 //-----------------------------------------------------------------
17 // AliProtonAnalysisBase class
18 // This is the class to deal with the proton analysis
19 // Origin: Panos Christakoglou | Panos.Christakoglou@cern.ch
20 //-----------------------------------------------------------------
21 #include <Riostream.h>
28 #include <AliExternalTrackParam.h>
29 #include <AliESDEvent.h>
31 #include <AliVertexerTracks.h>
32 #include <AliESDpid.h>
33 #include <AliTPCPIDResponse.h>
37 #include "AliProtonAnalysisBase.h"
39 ClassImp(AliProtonAnalysisBase)
41 //____________________________________________________________________//
42 AliProtonAnalysisBase::AliProtonAnalysisBase() :
43 TObject(), fProtonAnalysisLevel("ESD"), fAnalysisMC(kFALSE),
44 fTriggerMode(kMB2), kUseOnlineTrigger(kFALSE), kUseOfflineTrigger(kFALSE),
46 fProtonAnalysisMode(kTPC), fProtonPIDMode(kBayesian),
47 fAnalysisEtaMode(kFALSE),
48 fRunQAAnalysis(kFALSE),
49 fVxMax(100.), fVyMax(100.), fVzMax(100.), fMinNumOfContributors(0),
50 fNBinsX(0), fMinX(0.), fMaxX(0.),
51 fNBinsY(0), fMinY(0.), fMaxY(0.),
52 fMinTPCClusters(0), fMinITSClusters(0),
53 fMaxChi2PerTPCCluster(0.), fMaxChi2PerITSCluster(0.),
54 fMaxCov11(0.), fMaxCov22(0.), fMaxCov33(0.), fMaxCov44(0.), fMaxCov55(0.),
55 fMaxSigmaToVertex(0.), fMaxSigmaToVertexTPC(0.),
56 fMaxDCAXY(0.), fMaxDCAXYTPC(0.),
57 fMaxDCAZ(0.), fMaxDCAZTPC(0.),
58 fMaxDCA3D(0.), fMaxDCA3DTPC(0.),
59 fMaxConstrainChi2(0.), fMinTPCdEdxPoints(0),
60 fMinTPCClustersFlag(kFALSE), fMinITSClustersFlag(kFALSE),
61 fMaxChi2PerTPCClusterFlag(kFALSE), fMaxChi2PerITSClusterFlag(kFALSE),
62 fMaxCov11Flag(kFALSE), fMaxCov22Flag(kFALSE),
63 fMaxCov33Flag(kFALSE), fMaxCov44Flag(kFALSE), fMaxCov55Flag(kFALSE),
64 fMaxSigmaToVertexFlag(kFALSE), fMaxSigmaToVertexTPCFlag(kFALSE),
65 fMaxDCAXYFlag(kFALSE), fMaxDCAXYTPCFlag(kFALSE),
66 fMaxDCAZFlag(kFALSE), fMaxDCAZTPCFlag(kFALSE),
67 fMaxDCA3DFlag(kFALSE), fMaxDCA3DTPCFlag(kFALSE),
68 fMaxConstrainChi2Flag(kFALSE),
69 fITSRefitFlag(kFALSE), fTPCRefitFlag(kFALSE),
70 fESDpidFlag(kFALSE), fTPCpidFlag(kFALSE), fTOFpidFlag(kFALSE),
71 fPointOnSPDLayersFlag(0), fPointOnSDDLayersFlag(0), fPointOnSSDLayersFlag(0),
72 fPointOnITSLayer1Flag(0), fPointOnITSLayer2Flag(0),
73 fPointOnITSLayer3Flag(0), fPointOnITSLayer4Flag(0),
74 fPointOnITSLayer5Flag(0), fPointOnITSLayer6Flag(0),
75 fMinTPCdEdxPointsFlag(kFALSE),
76 fPtDependentDcaXY(0), fPtDependentDcaXYFlag(kFALSE), fNSigmaDCAXY(0),
77 fFunctionProbabilityFlag(kFALSE),
78 fNSigma(0), fNRatio(0.),
79 fElectronFunction(0), fMuonFunction(0),
80 fPionFunction(0), fKaonFunction(0), fProtonFunction(0),
81 fDebugMode(kFALSE), fListVertexQA(0) {
83 for(Int_t i = 0; i < 5; i++) fPartFrac[i] = 0.0;
84 /*for(Int_t i = 0; i < 24; i++) {
89 fListVertexQA = new TList();
90 fListVertexQA->SetName("fListVertexQA");
91 TH1F *gHistVx = new TH1F("gHistVx",
92 "Vx distribution;V_{x} [cm];Entries",
94 gHistVx->SetFillColor(kRed-2);
95 fListVertexQA->Add(gHistVx);
96 TH1F *gHistVxAccepted = new TH1F("gHistVxaccepted",
97 "Vx distribution;V_{x} [cm];Entries",
99 fListVertexQA->Add(gHistVxAccepted);
100 TH1F *gHistVy = new TH1F("gHistVy",
101 "Vy distribution;V_{y} [cm];Entries",
103 gHistVy->SetFillColor(kRed-2);
104 fListVertexQA->Add(gHistVy);
105 TH1F *gHistVyAccepted = new TH1F("gHistVyaccepted",
106 "Vy distribution;V_{y} [cm];Entries",
108 fListVertexQA->Add(gHistVyAccepted);
109 TH1F *gHistVz = new TH1F("gHistVz",
110 "Vz distribution;V_{z} [cm];Entries",
112 gHistVz->SetFillColor(kRed-2);
113 fListVertexQA->Add(gHistVz);
114 TH1F *gHistVzAccepted = new TH1F("gHistVzaccepted",
115 "Vz distribution;V_{z} [cm];Entries",
117 fListVertexQA->Add(gHistVzAccepted);
119 TH1F *gHistNumberOfContributors = new TH1F("gHistNumberOfContributors",
120 "Number of contributors;N_{contr.};Entries",
122 fListVertexQA->Add(gHistNumberOfContributors);
127 //____________________________________________________________________//
128 AliProtonAnalysisBase::~AliProtonAnalysisBase() {
130 if(fElectronFunction) delete fElectronFunction;
131 if(fMuonFunction) delete fMuonFunction;
132 if(fPionFunction) delete fPionFunction;
133 if(fKaonFunction) delete fKaonFunction;
134 if(fProtonFunction) delete fProtonFunction;
135 if(fListVertexQA) delete fListVertexQA;
136 if(fPtDependentDcaXY) delete fPtDependentDcaXY;
137 if(fPhysicsSelection) delete fPhysicsSelection;
140 //____________________________________________________________________//
141 Double_t AliProtonAnalysisBase::GetParticleFraction(Int_t i, Double_t p) {
142 //Return the a priori probs
144 if(fFunctionProbabilityFlag) {
145 if(i == 0) partFrac = fElectronFunction->Eval(p);
146 if(i == 1) partFrac = fMuonFunction->Eval(p);
147 if(i == 2) partFrac = fPionFunction->Eval(p);
148 if(i == 3) partFrac = fKaonFunction->Eval(p);
149 if(i == 4) partFrac = fProtonFunction->Eval(p);
151 else partFrac = fPartFrac[i];
156 //____________________________________________________________________//
157 Bool_t AliProtonAnalysisBase::IsInPhaseSpace(AliESDtrack* const track) {
158 // Checks if the track is outside the analyzed y-Pt phase space
159 Double_t gP = 0.0, gPt = 0.0, gPx = 0.0, gPy = 0.0, gPz = 0.0;
162 if((fProtonAnalysisMode == kTPC) || (fProtonAnalysisMode == kHybrid) || (fProtonAnalysisMode == kFullHybrid)) {
163 AliExternalTrackParam *tpcTrack = (AliExternalTrackParam *)track->GetTPCInnerParam();
165 gP = 0.0; gPt = 0.0; gPx = 0.0; gPy = 0.0; gPz = 0.0; eta = -10.0;
169 gPt = tpcTrack->Pt();
170 gPx = tpcTrack->Px();
171 gPy = tpcTrack->Py();
172 gPz = tpcTrack->Pz();
173 eta = tpcTrack->Eta();
175 }//standalone TPC or Hybrid TPC approaches
185 if((gPt < fMinY) || (gPt > fMaxY)) {
187 Printf("IsInPhaseSpace: Track rejected because it has a Pt value of %lf (accepted interval: %lf - %lf)",gPt,fMinY,fMaxY);
190 if((gP < fMinY) || (gP > fMaxY)) {
192 Printf("IsInPhaseSpace: Track rejected because it has a P value of %lf (accepted interval: %lf - %lf)",gP,fMinY,fMaxY);
195 if(fAnalysisEtaMode) {
196 if((eta < fMinX) || (eta > fMaxX)) {
198 Printf("IsInPhaseSpace: Track rejected because it has an eta value of %lf (accepted interval: %lf - %lf)",eta,fMinX,fMaxX);
203 if((Rapidity(gPx,gPy,gPz) < fMinX) || (Rapidity(gPx,gPy,gPz) > fMaxX)) {
205 Printf("IsInPhaseSpace: Track rejected because it has a y value of %lf (accepted interval: %lf - %lf)",Rapidity(gPx,gPy,gPz),fMinX,fMaxX);
213 //____________________________________________________________________//
214 Bool_t AliProtonAnalysisBase::IsAccepted(AliESDtrack* track) {
215 // Checks if the track is excluded from the cuts
216 //Int_t fIdxInt[200];
217 //Int_t nClustersITS = track->GetITSclusters(fIdxInt);
218 //Int_t nClustersTPC = track->GetTPCclusters(fIdxInt);
219 Int_t nClustersITS = track->GetITSclusters(0x0);
220 Int_t nClustersTPC = track->GetTPCclusters(0x0);
222 Float_t chi2PerClusterITS = -1;
224 chi2PerClusterITS = track->GetITSchi2()/Float_t(nClustersITS);
225 Float_t chi2PerClusterTPC = -1;
227 chi2PerClusterTPC = track->GetTPCchi2()/Float_t(nClustersTPC);
230 track->GetExternalCovariance(extCov);
232 if(fPointOnSPDLayersFlag) {
233 if((!track->HasPointOnITSLayer(0))&&(!track->HasPointOnITSLayer(1))) {
235 Printf("IsAccepted: Track rejected because it doesn't have a point on either SPD layers");
239 if(fPointOnSDDLayersFlag) {
240 if((!track->HasPointOnITSLayer(2))&&(!track->HasPointOnITSLayer(3))) {
242 Printf("IsAccepted: Track rejected because it doesn't have a point on either SDD layers");
246 if(fPointOnSSDLayersFlag) {
247 if((!track->HasPointOnITSLayer(4))&&(!track->HasPointOnITSLayer(5))) {
249 Printf("IsAccepted: Track rejected because it doesn't have a point on either SSD layers");
253 if(fPointOnITSLayer1Flag) {
254 if(!track->HasPointOnITSLayer(0)) {
256 Printf("IsAccepted: Track rejected because it doesn't have a point on the 1st ITS layer");
260 if(fPointOnITSLayer2Flag) {
261 if(!track->HasPointOnITSLayer(1)) {
263 Printf("IsAccepted: Track rejected because it doesn't have a point on the 2nd ITS layer");
267 if(fPointOnITSLayer3Flag) {
268 if(!track->HasPointOnITSLayer(2)) {
270 Printf("IsAccepted: Track rejected because it doesn't have a point on the 3rd ITS layer");
274 if(fPointOnITSLayer4Flag) {
275 if(!track->HasPointOnITSLayer(3)) {
277 Printf("IsAccepted: Track rejected because it doesn't have a point on the 4th ITS layer");
281 if(fPointOnITSLayer5Flag) {
282 if(!track->HasPointOnITSLayer(4)) {
284 Printf("IsAccepted: Track rejected because it doesn't have a point on the 5th ITS layer");
288 if(fPointOnITSLayer6Flag) {
289 if(!track->HasPointOnITSLayer(5)) {
291 Printf("IsAccepted: Track rejected because it doesn't have a point on the 6th ITS layer");
295 if(fMinITSClustersFlag) {
296 if(nClustersITS < fMinITSClusters) {
298 Printf("IsAccepted: Track rejected because it has %d ITS points (min. requested: %d)",nClustersITS,fMinITSClusters);
302 if(fMaxChi2PerITSClusterFlag) {
303 if(chi2PerClusterITS > fMaxChi2PerITSCluster) {
305 Printf("IsAccepted: Track rejected because it has a chi2 per ITS cluster %lf (max. requested: %lf)",chi2PerClusterITS,fMaxChi2PerITSCluster);
309 if(fMinTPCClustersFlag) {
310 if(nClustersTPC < fMinTPCClusters) {
312 Printf("IsAccepted: Track rejected because it has %d TPC clusters (min. requested: %d)",nClustersTPC,fMinTPCClusters);
316 if(fMaxChi2PerTPCClusterFlag) {
317 if(chi2PerClusterTPC > fMaxChi2PerTPCCluster) {
319 Printf("IsAccepted: Track rejected because it has a chi2 per TPC cluster %lf (max. requested: %lf)",chi2PerClusterTPC,fMaxChi2PerTPCCluster);
324 if(extCov[0] > fMaxCov11) {
326 Printf("IsAccepted: Track rejected because it has a cov11 value of %lf (max. requested: %lf)",extCov[0],fMaxCov11);
331 if(extCov[2] > fMaxCov22) {
333 Printf("IsAccepted: Track rejected because it has a cov22 value of %lf (max. requested: %lf)",extCov[2],fMaxCov22);
338 if(extCov[5] > fMaxCov33) {
340 Printf("IsAccepted: Track rejected because it has a cov33 value of %lf (max. requested: %lf)",extCov[5],fMaxCov33);
345 if(extCov[9] > fMaxCov44) {
347 Printf("IsAccepted: Track rejected because it has a cov44 value of %lf (max. requested: %lf)",extCov[9],fMaxCov44);
352 if(extCov[14] > fMaxCov55) {
354 Printf("IsAccepted: Track rejected because it has a cov55 value of %lf (max. requested: %lf)",extCov[14],fMaxCov55);
358 if(fMinTPCdEdxPointsFlag) {
359 if(track->GetTPCsignalN() < fMinTPCdEdxPoints) {
361 Printf("IsAccepted: Track rejected because it has %d TPC points for the calculation of the energy loss (min. requested: %d)",track->GetTPCsignalN(),fMinTPCdEdxPoints);
366 if ((track->GetStatus() & AliESDtrack::kITSrefit) == 0) {
368 Printf("IsAccepted: Track rejected because it has no ITS refit flag");
373 if ((track->GetStatus() & AliESDtrack::kTPCrefit) == 0) {
375 Printf("IsAccepted: Track rejected because it has no TPC refit flag");
380 if ((track->GetStatus() & AliESDtrack::kESDpid) == 0) {
382 Printf("IsAccepted: Track rejected because it has no ESD pid flag");
387 if ((track->GetStatus() & AliESDtrack::kTPCpid) == 0) {
389 Printf("IsAccepted: Track rejected because it has no TPC pid flag");
394 if ((track->GetStatus() & AliESDtrack::kTOFpid) == 0) {
396 Printf("IsAccepted: Track rejected because it has no TOF pid flag");
404 //____________________________________________________________________//
405 void AliProtonAnalysisBase::SetPtDependentDCAxy(Int_t nSigma,
409 //Pt dependent dca cut in xy
410 fNSigmaDCAXY = nSigma;
411 fPtDependentDcaXY = new TF1("fPtDependentDcaXY","[0]+[1]/x^[2]",0.1,10.1);
412 fPtDependentDcaXY->SetParameter(0,p0);
413 fPtDependentDcaXY->SetParameter(1,p1);
414 fPtDependentDcaXY->SetParameter(2,p2);
415 fPtDependentDcaXYFlag = kTRUE;
418 //____________________________________________________________________//
419 Bool_t AliProtonAnalysisBase::IsPrimary(AliESDEvent *esd,
420 const AliESDVertex *vertex,
421 AliESDtrack* track) {
422 // Checks if the track is a primary-like candidate
423 const Double_t kMicrometer2Centimeter = 0.0001;
424 Double_t gPt = 0.0, gPx = 0.0, gPy = 0.0, gPz = 0.0;
425 Double_t dca[2] = {0.0,0.0}, cov[3] = {0.0,0.0,0.0}; //The impact parameters and their covariance.
426 Double_t dca3D = 0.0;
427 Float_t dcaXY = 0.0, dcaZ = 0.0;
429 if((fProtonAnalysisMode == kTPC)||(fProtonAnalysisMode == kHybrid)) {
430 AliExternalTrackParam *tpcTrack = (AliExternalTrackParam *)track->GetTPCInnerParam();
432 gPt = 0.0; gPx = 0.0; gPy = 0.0; gPz = 0.0;
433 dca[0] = -100.; dca[1] = -100.; dca3D = -100.;
434 cov[0] = -100.; cov[1] = -100.; cov[2] = -100.;
437 gPt = tpcTrack->Pt();
438 gPx = tpcTrack->Px();
439 gPy = tpcTrack->Py();
440 gPz = tpcTrack->Pz();
441 tpcTrack->PropagateToDCA(vertex,
442 esd->GetMagneticField(),
445 }//standalone TPC or hybrid TPC approaches
446 if(fProtonAnalysisMode == kFullHybrid) {
447 AliExternalTrackParam *tpcTrack = (AliExternalTrackParam *)track->GetTPCInnerParam();
448 AliExternalTrackParam cParam;
450 gPt = 0.0; gPx = 0.0; gPy = 0.0; gPz = 0.0;
451 dca[0] = -100.; dca[1] = -100.; dca3D = -100.;
452 cov[0] = -100.; cov[1] = -100.; cov[2] = -100.;
455 gPt = tpcTrack->Pt();
456 gPx = tpcTrack->Px();
457 gPy = tpcTrack->Py();
458 gPz = tpcTrack->Pz();
459 track->RelateToVertex(vertex,
460 esd->GetMagneticField(),
462 track->GetImpactParameters(dcaXY,dcaZ);
463 dca[0] = dcaXY; dca[1] = dcaZ;
465 }//standalone TPC or hybrid TPC approaches
471 track->PropagateToDCA(vertex,
472 esd->GetMagneticField(),
475 dca3D = TMath::Sqrt(TMath::Power(dca[0],2) +
476 TMath::Power(dca[1],2));
478 if(fMaxSigmaToVertexFlag) {
479 if(GetSigmaToVertex(track) > fMaxSigmaToVertex) {
481 Printf("IsPrimary: Track rejected because it has a %lf sigmas to vertex (max. requested: %lf)",GetSigmaToVertex(track),fMaxSigmaToVertex);
485 if(fMaxSigmaToVertexTPCFlag) {
486 if(GetSigmaToVertex(track) > fMaxSigmaToVertexTPC) {
488 Printf("IsPrimary: Track rejected because it has a %lf sigmas to vertex TPC (max. requested: %lf)",GetSigmaToVertex(track),fMaxSigmaToVertexTPC);
493 if(TMath::Abs(dca[0]) > fMaxDCAXY) {
495 Printf("IsPrimary: Track rejected because it has a value of dca(xy) of %lf (max. requested: %lf)",TMath::Abs(dca[0]),fMaxDCAXY);
499 if(fMaxDCAXYTPCFlag) {
500 if(TMath::Abs(dca[0]) > fMaxDCAXYTPC) {
502 Printf("IsPrimary: Track rejected because it has a value of dca(xy) (TPC) of %lf (max. requested: %lf)",TMath::Abs(dca[0]),fMaxDCAXYTPC);
507 if(TMath::Abs(dca[1]) > fMaxDCAZ) {
509 Printf("IsPrimary: Track rejected because it has a value of dca(z) of %lf (max. requested: %lf)",TMath::Abs(dca[1]),fMaxDCAZ);
513 if(fMaxDCAZTPCFlag) {
514 if(TMath::Abs(dca[1]) > fMaxDCAZTPC) {
516 Printf("IsPrimary: Track rejected because it has a value of dca(z) (TPC) of %lf (max. requested: %lf)",TMath::Abs(dca[1]),fMaxDCAZTPC);
521 if(TMath::Abs(dca3D) > fMaxDCA3D) {
523 Printf("IsPrimary: Track rejected because it has a value of dca(3D) of %lf (max. requested: %lf)",TMath::Abs(dca3D),fMaxDCA3D);
527 if(fMaxDCA3DTPCFlag) {
528 if(TMath::Abs(dca3D) > fMaxDCA3DTPC) {
530 Printf("IsPrimary: Track rejected because it has a value of dca(3D) (TPC) of %lf (max. requested: %lf)",TMath::Abs(dca3D),fMaxDCA3DTPC);
534 if(fMaxConstrainChi2Flag) {
535 if(track->GetConstrainedChi2() > 0)
536 if(TMath::Log(track->GetConstrainedChi2()) > fMaxConstrainChi2) {
538 Printf("IsPrimary: Track rejected because it has a value of the constrained chi2 to the vertex of %lf (max. requested: %lf)",TMath::Log(track->GetConstrainedChi2()),fMaxConstrainChi2);
542 if(fPtDependentDcaXYFlag) {
543 if(TMath::Abs(dca[0]) > kMicrometer2Centimeter*fNSigmaDCAXY*fPtDependentDcaXY->Eval(gPt)) {
545 Printf("IsPrimary: Track rejected because it has a value of the dca(xy) higher than the %d sigma pt dependent cut: %lf (max. requested: %lf)",fNSigmaDCAXY,TMath::Abs(dca[0]),fNSigmaDCAXY*fPtDependentDcaXY->Eval(gPt));
553 //____________________________________________________________________//
554 Float_t AliProtonAnalysisBase::GetSigmaToVertex(AliESDtrack* esdTrack) const {
555 // Calculates the number of sigma to the vertex.
559 if((fProtonAnalysisMode == kTPC)&&(fProtonAnalysisMode != kHybrid)&&(fProtonAnalysisMode != kFullHybrid))
560 esdTrack->GetImpactParametersTPC(b,bCov);
562 esdTrack->GetImpactParameters(b,bCov);
564 if (bCov[0]<=0 || bCov[2]<=0) {
565 //AliDebug(1, "Estimated b resolution lower or equal zero!");
566 bCov[0]=0; bCov[2]=0;
568 bRes[0] = TMath::Sqrt(bCov[0]);
569 bRes[1] = TMath::Sqrt(bCov[2]);
571 if (bRes[0] == 0 || bRes[1] ==0) return -1;
573 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
575 if (TMath::Exp(-d * d / 2) < 1e-10) return 1000;
577 d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
582 //____________________________________________________________________//
583 Double_t AliProtonAnalysisBase::Rapidity(Double_t gPx,
585 Double_t gPz) const {
586 //returns the rapidity of the proton - to be removed
587 Double_t fMass = 9.38270000000000048e-01;
589 Double_t gP = TMath::Sqrt(TMath::Power(gPx,2) +
590 TMath::Power(gPy,2) +
591 TMath::Power(gPz,2));
592 Double_t energy = TMath::Sqrt(gP*gP + fMass*fMass);
595 y = 0.5*TMath::Log((energy + gPz)/(energy - gPz));
600 //________________________________________________________________________
601 const AliESDVertex* AliProtonAnalysisBase::GetVertex(AliESDEvent* esd,
606 // Get the vertex from the ESD and returns it if the vertex is valid
607 // Second argument decides which vertex is used (this selects
608 // also the quality criteria that are applied)
609 const AliESDVertex* vertex = 0;
610 if((mode == kHybrid)||(mode == kFullHybrid))
611 vertex = esd->GetPrimaryVertexSPD();
612 else if(mode == kTPC){
613 Double_t kBz = esd->GetMagneticField();
614 AliVertexerTracks vertexer(kBz);
615 vertexer.SetTPCMode();
616 AliESDVertex *vTPC = vertexer.FindPrimaryVertex(esd);
617 esd->SetPrimaryVertexTPC(vTPC);
618 for (Int_t i=0; i<esd->GetNumberOfTracks(); i++) {
619 AliESDtrack *t = esd->GetTrack(i);
620 t->RelateToVertexTPC(vTPC, kBz, kVeryBig);
623 vertex = esd->GetPrimaryVertexTPC();
625 else if(mode == kGlobal)
626 vertex = esd->GetPrimaryVertex();
628 Printf("GetVertex: ERROR: Invalid second argument %d", mode);
632 Printf("GetVertex: Event rejected because there is no valid vertex object");
636 // check Ncontributors
637 if(vertex->GetNContributors() <= 0) {
639 Printf("GetVertex: Event rejected because the number of contributors for the vertex determination is <= 0");
644 Double_t zRes = vertex->GetZRes();
647 Printf("GetVertex: Event rejected because the value of the vertex resolution in z is 0");
650 ((TH1F *)(fListVertexQA->At(0)))->Fill(vertex->GetXv());
651 ((TH1F *)(fListVertexQA->At(2)))->Fill(vertex->GetYv());
652 ((TH1F *)(fListVertexQA->At(4)))->Fill(vertex->GetZv());
655 if(TMath::Abs(vertex->GetXv()) > gVxMax) {
657 Printf("GetVertex: Event rejected because it has a Vx value of %lf cm (accepted interval: -%lf - %lf)",TMath::Abs(vertex->GetXv()),gVxMax,gVxMax);
660 if(TMath::Abs(vertex->GetYv()) > gVyMax) {
662 Printf("GetVertex: Event rejected because it has a Vy value of %lf cm (accepted interval: -%lf - %lf)",TMath::Abs(vertex->GetYv()),gVyMax,gVyMax);
665 if(TMath::Abs(vertex->GetZv()) > gVzMax) {
667 Printf("GetVertex: Event rejected because it has a Vz value of %lf cm (accepted interval: -%lf - %lf)",TMath::Abs(vertex->GetZv()),gVzMax,gVzMax);
670 ((TH1F *)(fListVertexQA->At(1)))->Fill(vertex->GetXv());
671 ((TH1F *)(fListVertexQA->At(3)))->Fill(vertex->GetYv());
672 ((TH1F *)(fListVertexQA->At(5)))->Fill(vertex->GetZv());
673 ((TH1F *)(fListVertexQA->At(6)))->Fill(vertex->GetNContributors());
675 //check number of contributors
676 if(fMinNumOfContributors > 0) {
677 if(fMinNumOfContributors > vertex->GetNContributors()) {
679 Printf("GetVertex: Event rejected because it has %d number of contributors (requested minimum: %d)",vertex->GetNContributors(),fMinNumOfContributors);
688 //________________________________________________________________________
689 Bool_t AliProtonAnalysisBase::IsEventTriggered(const AliESDEvent *esd,
690 TriggerMode trigger) {
691 // check if the event was triggered
692 ULong64_t triggerMask = esd->GetTriggerMask();
693 TString firedTriggerClass = esd->GetFiredTriggerClasses();
696 // definitions from p-p.cfg
697 ULong64_t spdFO = (1 << 14);
698 ULong64_t v0left = (1 << 11);
699 ULong64_t v0right = (1 << 12);
703 if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
708 if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
713 if (triggerMask & spdFO)
720 if(kUseOnlineTrigger) {
721 if(firedTriggerClass.Contains("CINT1B-ABCE-NOPF-ALL"))
724 else if(!kUseOnlineTrigger)
731 //________________________________________________________________________
732 TCanvas *AliProtonAnalysisBase::GetListOfCuts() {
733 // return the list of cuts and their cut values for reference
740 TCanvas *c = new TCanvas("cListOfCuts","List of cuts",0,0,900,600);
741 c->SetFillColor(10); c->SetHighLightColor(41);
744 c->cd(1)->SetFillColor(10);
745 l.DrawLatex(0.3,0.9,"Analysis details: List of cuts\n\n");
747 listOfCuts = "Analysis level: "; listOfCuts += fProtonAnalysisLevel;
748 l.DrawLatex(0.1,0.82,listOfCuts.Data());
749 listOfCuts = "Analysis mode: ";
750 if(fProtonAnalysisMode == kTPC) listOfCuts += "TPC standalone";
751 if(fProtonAnalysisMode == kHybrid) listOfCuts += "Hybrid TPC";
752 if(fProtonAnalysisMode == kFullHybrid) listOfCuts += "Full Hybrid TPC";
753 if(fProtonAnalysisMode == kGlobal) listOfCuts += "Global tracking";
754 l.DrawLatex(0.1,0.74,listOfCuts.Data());
755 listOfCuts = "Trigger mode: ";
756 if(fTriggerMode == kMB1) listOfCuts += "Minimum bias 1";
757 if(fTriggerMode == kMB2) listOfCuts += "Minimum bias 2";
758 if(fTriggerMode == kSPDFASTOR) listOfCuts += "FastOR (SPD)";
759 l.DrawLatex(0.1,0.66,listOfCuts.Data());
760 listOfCuts = "PID mode: ";
761 if(fProtonPIDMode == kBayesian) listOfCuts += "Bayesian PID";
762 if(fProtonPIDMode == kRatio) {
763 listOfCuts += "Z = ln((dE/dx)_{exp.}/(dE/dx)_{theor.}) > ";
764 listOfCuts += fNRatio;
766 if(fProtonPIDMode == kSigma) {
767 listOfCuts += "N_{#sigma} area: "; listOfCuts += fNSigma;
768 listOfCuts += " #sigma";
770 //if(fProtonPIDMode == kSigma2) {
771 //listOfCuts += "N_{#sigma}(2) area: "; listOfCuts += fNSigma;
772 //listOfCuts += " #sigma";
774 l.DrawLatex(0.1,0.58,listOfCuts.Data());
775 listOfCuts = "Accepted vertex diamond: ";
776 l.DrawLatex(0.1,0.52,listOfCuts.Data());
777 listOfCuts = "|V_{x}| < "; listOfCuts += fVxMax; listOfCuts += " [cm]";
778 l.DrawLatex(0.6,0.52,listOfCuts.Data());
779 listOfCuts = "|V_{y}| < "; listOfCuts += fVyMax; listOfCuts += " [cm]";
780 l.DrawLatex(0.6,0.45,listOfCuts.Data());
781 listOfCuts = "|V_{z}| < "; listOfCuts += fVzMax; listOfCuts += " [cm]";
782 l.DrawLatex(0.6,0.38,listOfCuts.Data());
783 listOfCuts = "N_{contributors} > "; listOfCuts += fMinNumOfContributors;
784 l.DrawLatex(0.6,0.31,listOfCuts.Data());
785 listOfCuts = "Phase space: ";
786 l.DrawLatex(0.1,0.2,listOfCuts.Data());
787 if(fAnalysisEtaMode) listOfCuts = "|#eta| < ";
788 else listOfCuts = "|y| < ";
789 listOfCuts += TMath::Abs(fMinX);
790 l.DrawLatex(0.35,0.2,listOfCuts.Data());
791 listOfCuts = "N_{bins} = ";
792 listOfCuts += fNBinsX; listOfCuts += " (binning: ";
793 listOfCuts += (fMaxX-fMinX)/fNBinsX; listOfCuts += ")";
794 l.DrawLatex(0.35,0.15,listOfCuts.Data());
795 listOfCuts = ""; listOfCuts += fMinY; listOfCuts += " < P_{T} < ";
796 listOfCuts += fMaxY; listOfCuts += "GeV/c";
797 l.DrawLatex(0.35,0.1,listOfCuts.Data());
798 listOfCuts = "N_{bins} = ";
799 listOfCuts += fNBinsY; listOfCuts += " (binning: ";
800 listOfCuts += (fMaxY-fMinY)/fNBinsY; listOfCuts += ")";
801 l.DrawLatex(0.35,0.05,listOfCuts.Data());
803 c->cd(2)->SetFillColor(2);
804 l.DrawLatex(0.3,0.95,"ITS related cuts");
805 listOfCuts = "Request a cluster on either of the SPD layers: ";
806 listOfCuts += fPointOnSPDLayersFlag;
807 l.DrawLatex(0.1,0.9,listOfCuts.Data());
808 listOfCuts = "Request a cluster on either of the SDD layers: ";
809 listOfCuts += fPointOnSDDLayersFlag;
810 l.DrawLatex(0.1,0.83,listOfCuts.Data());
811 listOfCuts = "Request a cluster on either of the SSD layers: ";
812 listOfCuts += fPointOnSSDLayersFlag;
813 l.DrawLatex(0.1,0.76,listOfCuts.Data());
815 listOfCuts = "Request a cluster on SPD1: ";
816 listOfCuts += fPointOnITSLayer1Flag;
817 l.DrawLatex(0.1,0.69,listOfCuts.Data());
818 listOfCuts = "Request a cluster on SPD2: ";
819 listOfCuts += fPointOnITSLayer2Flag;
820 l.DrawLatex(0.1,0.62,listOfCuts.Data());
821 listOfCuts = "Request a cluster on SDD1: ";
822 listOfCuts += fPointOnITSLayer3Flag;
823 l.DrawLatex(0.1,0.55,listOfCuts.Data());
824 listOfCuts = "Request a cluster on SDD2: ";
825 listOfCuts += fPointOnITSLayer4Flag;
826 l.DrawLatex(0.1,0.48,listOfCuts.Data());
827 listOfCuts = "Request a cluster on SSD1: ";
828 listOfCuts += fPointOnITSLayer5Flag;
829 l.DrawLatex(0.1,0.41,listOfCuts.Data());
830 listOfCuts = "Request a cluster on SSD2: ";
831 listOfCuts += fPointOnITSLayer6Flag;
832 l.DrawLatex(0.1,0.34,listOfCuts.Data());
833 listOfCuts = "Minimum number of ITS clusters: ";
834 if(fMinITSClustersFlag) listOfCuts += fMinITSClusters;
835 else listOfCuts += "Not used";
836 l.DrawLatex(0.1,0.27,listOfCuts.Data());
837 listOfCuts = "Maximum #chi^{2} per ITS cluster: ";
838 if(fMaxChi2PerITSClusterFlag) listOfCuts += fMaxChi2PerITSCluster;
839 else listOfCuts += "Not used";
840 l.DrawLatex(0.1,0.2,listOfCuts.Data());
842 c->cd(3)->SetFillColor(3);
843 l.DrawLatex(0.3,0.9,"TPC related cuts");
844 listOfCuts = "Minimum number of TPC clusters: ";
845 if(fMinTPCClustersFlag) listOfCuts += fMinTPCClusters;
846 else listOfCuts += "Not used";
847 l.DrawLatex(0.1,0.7,listOfCuts.Data());
848 listOfCuts = "Maximum #chi^{2} per TPC cluster: ";
849 if(fMaxChi2PerTPCClusterFlag) listOfCuts += fMaxChi2PerTPCCluster;
850 else listOfCuts += "Not used";
851 l.DrawLatex(0.1,0.5,listOfCuts.Data());
852 listOfCuts = "Minimum number of TPC points for the dE/dx: ";
853 if(fMinTPCdEdxPointsFlag) listOfCuts += fMinTPCdEdxPoints;
854 else listOfCuts += "Not used";
855 l.DrawLatex(0.1,0.3,listOfCuts.Data());
857 c->cd(4)->SetFillColor(4);
858 l.DrawLatex(0.3,0.9,"Tracking related cuts");
859 listOfCuts = "Maximum cov11: ";
860 if(fMaxCov11Flag) listOfCuts += fMaxCov11;
861 else listOfCuts += "Not used";
862 l.DrawLatex(0.1,0.75,listOfCuts.Data());
863 listOfCuts = "Maximum cov22: ";
864 if(fMaxCov22Flag) listOfCuts += fMaxCov22;
865 else listOfCuts += "Not used";
866 l.DrawLatex(0.1,0.6,listOfCuts.Data());
867 listOfCuts = "Maximum cov33: ";
868 if(fMaxCov33Flag) listOfCuts += fMaxCov33;
869 else listOfCuts += "Not used";
870 l.DrawLatex(0.1,0.45,listOfCuts.Data());
871 listOfCuts = "Maximum cov44: ";
872 if(fMaxCov44Flag) listOfCuts += fMaxCov44;
873 else listOfCuts += "Not used";
874 l.DrawLatex(0.1,0.3,listOfCuts.Data());
875 listOfCuts = "Maximum cov55: ";
876 if(fMaxCov55Flag) listOfCuts += fMaxCov55;
877 else listOfCuts += "Not used";
878 l.DrawLatex(0.1,0.15,listOfCuts.Data());
880 c->cd(5)->SetFillColor(5);
881 l.DrawLatex(0.3,0.9,"DCA related cuts");
882 listOfCuts = "Maximum sigma to vertex: ";
883 if(fMaxSigmaToVertexFlag) listOfCuts += fMaxSigmaToVertex;
884 else listOfCuts += "Not used";
885 l.DrawLatex(0.1,0.8,listOfCuts.Data());
886 listOfCuts = "Maximum sigma to vertex (TPC): ";
887 if(fMaxSigmaToVertexTPCFlag) listOfCuts += fMaxSigmaToVertexTPC;
888 else listOfCuts += "Not used";
889 l.DrawLatex(0.1,0.72,listOfCuts.Data());
890 listOfCuts = "Maximum DCA in xy: ";
891 if(fMaxDCAXYFlag) listOfCuts += fMaxDCAXY;
892 else listOfCuts += "Not used";
893 l.DrawLatex(0.1,0.64,listOfCuts.Data());
894 listOfCuts = "Maximum DCA in z: ";
895 if(fMaxDCAZFlag) listOfCuts += fMaxDCAZ;
896 else listOfCuts += "Not used";
897 l.DrawLatex(0.1,0.56,listOfCuts.Data());
898 listOfCuts = "Maximum DCA in 3D: ";
899 if(fMaxDCA3DFlag) listOfCuts += fMaxDCA3D;
900 else listOfCuts += "Not used";
901 l.DrawLatex(0.1,0.48,listOfCuts.Data());
902 listOfCuts = "Maximum DCA in xy (TPC): ";
903 if(fMaxDCAXYFlag) listOfCuts += fMaxDCAXYTPC;
904 else listOfCuts += "Not used";
905 l.DrawLatex(0.1,0.4,listOfCuts.Data());
906 listOfCuts = "Maximum DCA in z (TPC): ";
907 if(fMaxDCAZFlag) listOfCuts += fMaxDCAZTPC;
908 else listOfCuts += "Not used";
909 l.DrawLatex(0.1,0.32,listOfCuts.Data());
910 listOfCuts = "Maximum DCA in 3D (TPC): ";
911 if(fMaxDCA3DFlag) listOfCuts += fMaxDCA3DTPC;
912 else listOfCuts += "Not used";
913 l.DrawLatex(0.1,0.24,listOfCuts.Data());
914 listOfCuts = "Maximum constrained #chi^{2} (vertex): ";
915 if(fMaxConstrainChi2Flag) listOfCuts += fMaxConstrainChi2;
916 else listOfCuts += "Not used";
917 l.DrawLatex(0.1,0.16,listOfCuts.Data());
919 c->cd(6)->SetFillColor(6);
920 l.DrawLatex(0.3,0.9,"Tracking bits related cuts");
921 listOfCuts = "Request the ITS refit bit: "; listOfCuts += fITSRefitFlag;
922 l.DrawLatex(0.1,0.7,listOfCuts.Data());
923 listOfCuts = "Request the TPC refit bit: "; listOfCuts += fTPCRefitFlag;
924 l.DrawLatex(0.1,0.5,listOfCuts.Data());
925 listOfCuts = "Request the TPC pid bit: "; listOfCuts += fTPCpidFlag;
926 l.DrawLatex(0.1,0.3,listOfCuts.Data());
927 listOfCuts = "Request the ESD pid bit: "; listOfCuts += fESDpidFlag;
928 l.DrawLatex(0.1,0.1,listOfCuts.Data());
933 //________________________________________________________________________
934 Bool_t AliProtonAnalysisBase::IsProton(AliESDtrack *track) {
935 //Function that checks if a track is a proton
936 Double_t probability[5] = {0.,0.,0.,0.,0.};
937 Double_t gPt = 0.0, gP = 0.0, gEta = 0.0;
938 Long64_t fParticleType = 0;
940 //Bayesian approach for the PID
941 if(fProtonPIDMode == kBayesian) {
942 if((fProtonAnalysisMode == kTPC)||(fProtonAnalysisMode == kHybrid)||(fProtonAnalysisMode == kFullHybrid)) {
943 AliExternalTrackParam *tpcTrack = (AliExternalTrackParam *)track->GetTPCInnerParam();
945 gPt = tpcTrack->Pt();
947 track->GetTPCpid(probability);
950 }//TPC standalone or Hybrid TPC
951 else if(fProtonAnalysisMode == kGlobal) {
954 track->GetESDpid(probability);
958 for(Int_t i = 0; i < AliPID::kSPECIES; i++)
959 rcc += probability[i]*GetParticleFraction(i,gP);
962 for(Int_t i = 0; i < AliPID::kSPECIES; i++)
963 w[i] = probability[i]*GetParticleFraction(i,gP)/rcc;
964 fParticleType = TMath::LocMax(AliPID::kSPECIES,w);
966 if(fParticleType == 4)
969 //Ratio of the measured over the theoretical dE/dx a la STAR
970 else if(fProtonPIDMode == kRatio) {
971 AliExternalTrackParam *tpcTrack = (AliExternalTrackParam *)track->GetTPCInnerParam();
973 gPt = tpcTrack->Pt();
974 gP = track->GetInnerParam()->P();
975 gEta = tpcTrack->Eta();
977 Double_t fAlephParameters[5] = {0.,0.,0.,0.,0.};
979 fAlephParameters[0] = 2.15898e+00/50.;
980 fAlephParameters[1] = 1.75295e+01;
981 fAlephParameters[2] = 3.40030e-09;
982 fAlephParameters[3] = 1.96178e+00;
983 fAlephParameters[4] = 3.91720e+00;
986 fAlephParameters[0] = 0.0283086;
987 fAlephParameters[1] = 2.63394e+01;
988 fAlephParameters[2] = 5.04114e-11;
989 fAlephParameters[3] = 2.12543e+00;
990 fAlephParameters[4] = 4.88663e+00;
993 AliTPCPIDResponse *tpcResponse = new AliTPCPIDResponse();
994 tpcResponse->SetBetheBlochParameters(fAlephParameters[0],fAlephParameters[1],fAlephParameters[2],fAlephParameters[3],fAlephParameters[4]);
996 Double_t normalizeddEdx = -10.;
997 if((track->GetTPCsignal() > 0.0) && (tpcResponse->GetExpectedSignal(gP,AliPID::kProton) > 0.0))
998 normalizeddEdx = TMath::Log(track->GetTPCsignal()/tpcResponse->GetExpectedSignal(gP,AliPID::kProton));
1002 if(normalizeddEdx >= fNRatio)
1005 //Definition of an N-sigma area around the dE/dx vs P band
1006 else if(fProtonPIDMode == kSigma) {
1007 Double_t fAlephParameters[5];
1009 fAlephParameters[0] = 2.15898e+00/50.;
1010 fAlephParameters[1] = 1.75295e+01;
1011 fAlephParameters[2] = 3.40030e-09;
1012 fAlephParameters[3] = 1.96178e+00;
1013 fAlephParameters[4] = 3.91720e+00;
1016 fAlephParameters[0] = 0.0283086;
1017 fAlephParameters[1] = 2.63394e+01;
1018 fAlephParameters[2] = 5.04114e-11;
1019 fAlephParameters[3] = 2.12543e+00;
1020 fAlephParameters[4] = 4.88663e+00;
1023 Double_t nsigma = 100.0;
1024 AliTPCPIDResponse *tpcResponse = new AliTPCPIDResponse();
1025 tpcResponse->SetBetheBlochParameters(fAlephParameters[0],fAlephParameters[1],fAlephParameters[2],fAlephParameters[3],fAlephParameters[4]);
1027 Double_t mom = track->GetP();
1028 const AliExternalTrackParam *in = track->GetInnerParam();
1032 nsigma = TMath::Abs(tpcResponse->GetNumberOfSigmas(mom,track->GetTPCsignal(),track->GetTPCsignalN(),AliPID::kProton));
1035 if(nsigma <= fNSigma)
1037 }//kSigma PID method