27 #include "TObjArray.h"
28 #include "AliAnalysisTaskSE.h"
29 #include "AliAnalysisManager.h"
30 #include "AliAODEvent.h"
31 #include "AliAODInputHandler.h"
32 #include "AliCentrality.h"
35 #include "AliPIDCombined.h"
36 #include "AliMCEvent.h"
45 #include "AliAODVZERO.h"
46 #include "AliPIDResponse.h"
47 #include "AliTPCPIDResponse.h"
48 #include "AliAODMCParticle.h"
50 #include "AliEventPoolManager.h"
51 #include "AliMultSelection.h"
52 #include "TMatrixDSym.h"
53 #include "AliVVertex.h"
54 #include "AliAODVertex.h"
65 fDebug(0), fIsMC(0), fEventMixing(0), fTypeMixing(0),
fQA(0),
fV0(0), fMassBins(1), fMinMass(-1.), fMaxMass(0.), fCutsRP(NULL), fNullCuts(0),
fPIDResponse(0), fFlowEvent(0),
fBayesianResponse(0), fCandidates(0), fCandidateEtaPtCut(0), fCandidateMinEta(0), fCandidateMaxEta(0), fCandidateMinPt(0), fCandidateMaxPt(0), fCandidateYCut(kFALSE), fCandidateMinY(-.5), fCandidateMaxY(.5), fNPtBins(18), fCentrality(999), fVertex(999), fAOD(0), fPoolManager(0), fOutputList(0), fEventStats(0), fCentralityPass(0), fCentralityNoPass(0), fNOPID(0), fPIDk(0),fNOPIDTOF(0), fPIDTOF(0), fPtP(0), fPtN(0), fPtKP(0), fPtKN(0), fMultCorAfterCuts(0), fMultvsCentr(0), fCentralityMin(0), fCentralityMax(100), fkCentralityMethodA(0), fkCentralityMethodB(0), fCentralityCut2010(0), fCentralityCut2011(0), fCentralityEstimator("V0M"), fPOICuts(0), fVertexRange(10.), fPhi(0), fPt(0), fEta(0), fVZEROA(0), fVZEROC(0), fTPCM(0), fDCAAll(0), fDCAXYQA(0), fDCAZQA(0), fDCAPrim(0), fDCASecondaryWeak(0), fDCAMaterial(0), fSubEventDPhiv2(0), fSkipEventSelection(0), fUsePidResponse(0), fPIDCombined(0), fPileUp(kTRUE), fMultESDTPCdif(15000), fLowCut(0), fHighCut(0), fMultTOFLowCut(0), fMultTOFHighCut(0), fHistCentralityWeights(0x0), fCentralityWeight(1.), fVertexZ(0), fHarmonic(2)
68 for(
Int_t i(0); i < 7; i++) fPIDConfig[i] = 1000.;
69 for(
Int_t i(0); i < 5; i++) fDCAConfig[i] = 0.;
70 for(
Int_t i(0); i < 20; i++) {
71 fVertexMixingBins[i] = 0;
72 fCentralityMixingBins[i] = 0;
74 fMixingParameters[0] = 1000; fMixingParameters[1] = 50000; fMixingParameters[2] = 5;
75 for(
Int_t i(0); i < 18; i++) {
76 for(
Int_t j(0); j < 2; j++) fV0Data[i][j] = 0;
77 fInvMNP[i] = 0; fInvMNN[i] = 0; fInvMPP[i] = 0; fPtSpectra[i] = 0; fPtBins[i] = 0.;
82 fDebug(0), fIsMC(0), fEventMixing(0), fTypeMixing(0),
fQA(0),
fV0(0), fMassBins(1), fMinMass(-1.), fMaxMass(0.), fCutsRP(NULL), fNullCuts(0),
fPIDResponse(0), fFlowEvent(0),
fBayesianResponse(0), fCandidates(0), fCandidateEtaPtCut(0), fCandidateMinEta(0), fCandidateMaxEta(0), fCandidateMinPt(0), fCandidateMaxPt(0), fCandidateYCut(kFALSE), fCandidateMinY(-.5), fCandidateMaxY(.5), fNPtBins(18), fCentrality(999), fVertex(999), fAOD(0), fPoolManager(0), fOutputList(0), fEventStats(0), fCentralityPass(0), fCentralityNoPass(0), fNOPID(0), fPIDk(0), fNOPIDTOF(0), fPIDTOF(0), fPtP(0), fPtN(0), fPtKP(0), fPtKN(0), fMultCorAfterCuts(0), fMultvsCentr(0), fCentralityMin(0), fCentralityMax(100), fkCentralityMethodA(0), fkCentralityMethodB(0), fCentralityCut2010(0), fCentralityCut2011(0), fCentralityEstimator(
"V0M"), fPOICuts(0), fVertexRange(10.), fPhi(0), fPt(0), fEta(0), fVZEROA(0), fVZEROC(0), fTPCM(0), fDCAAll(0), fDCAXYQA(0), fDCAZQA(0), fDCAPrim(0), fDCASecondaryWeak(0), fDCAMaterial(0), fSubEventDPhiv2(0), fSkipEventSelection(0), fUsePidResponse(0), fPIDCombined(0), fMultESDTPCdif(15000), fPileUp(kTRUE), fLowCut(0), fHighCut(0), fMultTOFLowCut(0), fMultTOFHighCut(0), fHistCentralityWeights(0x0), fCentralityWeight(1.), fVertexZ(0), fHarmonic(2)
87 for(
Int_t i(0); i < 20; i++) {
92 for(
Int_t i(0); i < 18; i++) {
96 DefineInput(0, TChain::Class());
97 DefineOutput(1, TList::Class());
98 DefineOutput(2, AliFlowEventSimple::Class());
99 if(
fDebug > 0) cout <<
" === Created instance of AliAnaysisTaskPhiFlow === " << endl;
112 if (
fDebug > 0) cout <<
" === Deleted instance of AliAnalysisTaskPhiFlow === " << endl;
118 if(
fDebug > 0) cout <<
" *** BookHistogram() *** " << name << endl;
119 TH1F *hist =
new TH1F(name, Form(
"M_{INV} (%s)", name), 60, .99, 1.092);
120 hist->GetXaxis()->SetTitle(
"M_{INV} (GeV / c^{2})");
121 hist->GetYaxis()->SetTitle(
"No. of pairs");
122 hist->SetMarkerStyle(kFullCircle);
131 if(
fDebug > 0) cout <<
" *** BookPIDHisotgram() *** " << endl;
134 hist =
new TH2F(name, Form(
"PID (%s)", name), 100, 0, 5, 100, 0, 1000);
135 hist->GetYaxis()->SetTitle(
"dE/dx (a.u.)");
138 hist =
new TH2F(name, Form(
"PID (%s)", name), 100, 0, 5, 100, 0, 1.5);
139 hist->GetYaxis()->SetTitle(
"#beta");
141 hist->GetXaxis()->SetTitle(
"P (GeV / c)");
149 if(
fDebug > 0) cout <<
" *** InitPtSpectraHistograms() *** " << endl;
150 TH1F* hist =
new TH1F(Form(
"%4.2f p_{t} %4.2f", nmin, nmax), Form(
"%f p_{t} %f", nmin, nmax), 60, nmin, nmax);
151 hist->GetXaxis()->SetTitle(
"p_{T} GeV / c");
159 if(
fDebug > 0) cout <<
" *** BookPtHistogram() *** " << endl;
160 TH1F* ratio =
new TH1F(name, name, 100, 0, 7);
161 ratio->GetXaxis()->SetTitle(
"p_{T} ( GeV / c^{2} )");
162 ratio->GetYaxis()->SetTitle(
"No. of events");
171 if(
fDebug > 0) cout <<
" ** AddPhiIdentificationOutputObjects() *** " << endl;
173 fEventStats =
new TH1F(
"fHistStats",
"Event Statistics", 18, -.25, 4.25);
174 fEventStats->GetXaxis()->SetTitle(
"No. of events");
178 fCentralityPass =
new TH1F(
"fCentralityPass",
"Centrality Pass", 101, -1, 100);
181 fCentralityNoPass =
new TH1F(
"fCentralityNoPass",
"Centrality No Pass", 101, -1, 100);
199 fPhi =
new TH1F(
"fPhi",
"#phi distribution", 100, -.5, 7);
201 fPt =
new TH1F(
"fPt",
"p_{T}", 100, 0, 5.5);
203 fEta =
new TH1F(
"fEta",
"#eta distribution", 100, -1.1, 1.1);
205 fVZEROA =
new TH1F(
"fVZEROA",
"VZERO A Multiplicity", 1000, 0, 10000);
207 fVZEROC =
new TH1F(
"fVZEROC",
"VZERO C Multiplicity", 1000, 0, 10000);
209 fTPCM =
new TH1F(
"fTPCM",
"TPC multiplicity", 1000, 0, 10000);
211 fDCAXYQA =
new TH1F(
"fDCAXYQA",
"fDCAXYQA", 1000, -5, 5);
213 fDCAZQA =
new TH1F(
"fDCAZQA",
"fDCAZQA", 1000, -5, 5);
215 fMultCorAfterCuts =
new TH2F(
"fMultCorAfterCuts",
"centrality correlations;V0 centrality;CL0 centrality", 100, 0, 100, 100, 0, 100);
217 fMultvsCentr =
new TH2F(
"fMultvsCentr",
"multiplicty centrality;TPC multiplicity;V0 centrality", 250, 0, 5000, 100, 0, 100);
221 fDCAAll =
new TH2F(
"fDCAAll",
"fDCAAll", 1000, 0, 10, 1000, -5, 5);
223 fDCAPrim =
new TH2F(
"fDCAprim",
"fDCAprim", 1000, 0, 10, 1000, -5, 5);
227 fDCAMaterial =
new TH2F(
"fDCAMaterial",
"fDCAMaterial", 1000, 0, 10, 1000, -5, 5);
231 fSubEventDPhiv2 =
new TProfile(
"fSubEventDPhiv2",
"fSubEventDPhiv2", 5, 0, 5);
235 fSubEventDPhiv2->GetXaxis()->SetBinLabel(4,
"#sqrt{#frac{<#Psi_{a} - #Psi_{b}><#Psi_{a} - #Psi_{c}>}{<#Psi_{b} - #Psi_{c}>}}");
236 fSubEventDPhiv2->GetXaxis()->SetBinLabel(5,
"#sqrt{#frac{<#Psi_{a} - #Psi_{c}><#Psi_{b} - #Psi_{c}>}{<#Psi_{a} - #Psi_{b}>}}");
238 const char* V0[] = {
"V0A",
"V0C"};
240 for(
Int_t iV0(0); iV0 < 2; iV0++) {
241 fV0Data[ptbin][iV0] =
new TProfile(Form(
"%s v2 %4.2f < p_{T} < %4.2f GeV", V0[iV0],
fPtBins[ptbin],
fPtBins[ptbin+1]), Form(
"%s v2 %4.2f < p_{T} < %4.2f GeV", V0[iV0],
fPtBins[ptbin],
fPtBins[ptbin+1]),
fMassBins,
fMinMass,
fMaxMass);
250 if(
fDebug > 0) cout <<
" *** UserCreateOutputObjects() *** " << endl;
256 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
262 if(t < 0.1) AliFatal(
"No valid PID procedure recognized -- terminating analysis !!!");
263 if(
fNPtBins > 18) AliFatal(
"Invalid number of pt bins initialied ( > 18 ) -- terminating analysis !!!");
274 AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());
275 if (inputHandler)
fPIDResponse = inputHandler->GetPIDResponse();
291 fLowCut =
new TF1(
"fLowCut",
"[0]+[1]*x - 5.*([2]+[3]*x+[4]*x*x+[5]*x*x*x)", 0, 100);
292 fHighCut =
new TF1(
"fHighCut",
"[0]+[1]*x + 5.5*([2]+[3]*x+[4]*x*x+[5]*x*x*x)", 0, 100);
296 fMultTOFLowCut =
new TF1(
"fMultTOFLowCut",
"[0]+[1]*x+[2]*x*x+[3]*x*x*x - 4.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x+[9]*x*x*x*x*x)", 0, 10000);
298 fMultTOFHighCut =
new TF1(
"fMultTOFHighCut",
"[0]+[1]*x+[2]*x*x+[3]*x*x*x + 4.*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x+[9]*x*x*x*x*x)", 0, 10000);
301 fLowCut->SetParameters(0.0157497, 0.973488, 0.673612, 0.0290718, -0.000546728, 5.82749e-06);
302 fHighCut->SetParameters(0.0157497, 0.973488, 0.673612, 0.0290718, -0.000546728, 5.82749e-06);
304 fMultTOFLowCut->SetParameters(-1.0178, 0.333132, 9.10282e-05, -1.61861e-08, 1.47848, 0.0385923, -5.06153e-05, 4.37641e-08, -1.69082e-11, 2.35085e-15);
305 fMultTOFHighCut->SetParameters(-1.0178, 0.333132, 9.10282e-05, -1.61861e-08, 1.47848, 0.0385923, -5.06153e-05, 4.37641e-08, -1.69082e-11, 2.35085e-15);
312 for(
Int_t i(0); i < temp->GetNbinsX(); i++) {
313 temp->SetBinError(1+i, 0.);
320 fVertexZ =
new TH1F(
"fVertexZ",
"vertex Z position:vertex Z position", 60, -15., 15.);
327 if(
fDebug > 0) cout <<
" *** InitializeEventMixing() *** " << endl;
329 for(
Int_t i(0); i < 19; i++) {
333 for(
Int_t i(0); i < 19; i++) {
337 if(
fDebug > 0 ) cout << Form(
" --> found %d centrality bins for mixing, %d vertex bins for mixing", _c, _v) << endl;
349 if ((!track2) || (!track1))
return 0.;
350 Double_t masss = TMath::Power(4.93676999999999977e-01, 2);
351 Double_t pxs = TMath::Power((track1->Px() + track2->Px()), 2);
352 Double_t pys = TMath::Power((track1->Py() + track2->Py()), 2);
353 Double_t pzs = TMath::Power((track1->Pz() + track2->Pz()), 2);
354 Double_t e1 = TMath::Sqrt(track1->P() * track1->P() + masss);
355 Double_t e2 = TMath::Sqrt(track2->P() * track2->P() + masss);
356 Double_t es = TMath::Power((e1 + e2), 2);
357 if ((es - (pxs + pys + pzs)) < 0)
return 0.;
358 return TMath::Sqrt((es - (pxs + pys + pzs)));
384 TVector3 a(track1->Px(), track1->Py(), track1->Pz());
385 TVector3 b(track2->Px(), track2->Py(), track2->Pz());
395 if (!event)
return kFALSE;
405 if(
fDebug > 1) cout <<
" *** PlotMultiplcities() *** " << endl;
415 if (!event->GetPrimaryVertex())
return 0x0;
416 fVertex =
event->GetPrimaryVertex()->GetZ();
431 AliMultSelection *multSelection = 0x0;
432 multSelection =
static_cast<AliMultSelection*
>(
event->FindListObject(
"MultSelection"));
435 if(
fCentrality >
fCentralityMin && fCentrality < fCentralityMax && multSelection->GetMultiplicityPercentile(
"CL1") < 90) {
451 if (TMath::Abs(
fCentrality-cenB) > 5 || cenB >= 80 || cenB < 0 || fCentrality <= fCentralityMin || fCentrality >
fCentralityMax) {
455 const Int_t nGoodTracks =
event->GetNumberOfTracks();
459 for(
Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) {
460 AliAODTrack* trackAOD =
dynamic_cast<AliAODTrack*
>(
event->GetTrack(iTracks));
461 if(!trackAOD) AliFatal(
"Not a standard AOD");
462 if (!trackAOD)
continue;
463 if (!(trackAOD->TestFilterBit(1)))
continue;
464 if ((trackAOD->Pt() < .2) || (trackAOD->Pt() > 5.0) || (TMath::Abs(trackAOD->Eta()) > .8) || (trackAOD->GetTPCNcls() < 70) || (trackAOD->GetDetPid()->GetTPCsignal() < 10.0) || (trackAOD->Chi2perNDF() < 0.2))
continue;
467 for(
Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) {
468 AliAODTrack* trackAOD =
dynamic_cast<AliAODTrack*
>(
event->GetTrack(iTracks));
469 if(!trackAOD) AliFatal(
"Not a standard AOD");
470 if (!trackAOD)
continue;
471 if (!(trackAOD->TestFilterBit(16)))
continue;
472 if ((trackAOD->Pt() < .2) || (trackAOD->Pt() > 5.0) || (TMath::Abs(trackAOD->Eta()) > .8) || (trackAOD->GetTPCNcls() < 70) || (trackAOD->GetDetPid()->GetTPCsignal() < 10.0) || (trackAOD->Chi2perNDF() < 0.1))
continue;
474 Double_t bCov[3] = {-99., -99., -99.};
475 AliAODTrack copy(*trackAOD);
476 if (!(copy.PropagateToDCA(event->GetPrimaryVertex(),
event->GetMagneticField(), 100., b, bCov)))
continue;
477 if ((TMath::Abs(b[0]) > 0.3) || (TMath::Abs(b[1]) > 0.3))
continue;
481 if(! (multTPC > (-40.3+1.22*multGlob) && multTPC < (32.1+1.59*multGlob)))
return kFALSE;
491 for(
Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) {
492 AliAODTrack* trackAOD =
dynamic_cast<AliAODTrack*
>(
event->GetTrack(iTracks));
493 if(!trackAOD) AliFatal(
"Not a standard AOD");
494 if (!trackAOD)
continue;
495 if (!(trackAOD->TestFilterBit(1)))
continue;
496 if ((trackAOD->Pt() < .2) || (trackAOD->Pt() > 5.0) || (TMath::Abs(trackAOD->Eta()) > .8) || (trackAOD->GetTPCNcls() < 70) || (trackAOD->GetDetPid()->GetTPCsignal() < 10.0) || (trackAOD->Chi2perNDF() < 0.2))
continue;
499 for(
Int_t iTracks = 0; iTracks < nGoodTracks; iTracks++) {
500 AliAODTrack* trackAOD =
dynamic_cast<AliAODTrack*
>(
event->GetTrack(iTracks));
501 if(!trackAOD) AliFatal(
"Not a standard AOD");
502 if (!trackAOD)
continue;
503 if (!(trackAOD->TestFilterBit(16)))
continue;
504 if ((trackAOD->Pt() < .2) || (trackAOD->Pt() > 5.0) || (TMath::Abs(trackAOD->Eta()) > .8) || (trackAOD->GetTPCNcls() < 70) || (trackAOD->GetDetPid()->GetTPCsignal() < 10.0) || (trackAOD->Chi2perNDF() < 0.1))
continue;
506 Double_t bCov[3] = {-99., -99., -99.};
507 AliAODTrack copy(*trackAOD);
508 if (!(copy.PropagateToDCA(event->GetPrimaryVertex(),
event->GetMagneticField(), 100., b, bCov)))
continue;
509 if ((TMath::Abs(b[0]) > 0.3) || (TMath::Abs(b[1]) > 0.3))
continue;
513 if(! (multTPC > (-36.73 + 1.48*multGlob) && multTPC < (62.87 + 1.78*multGlob)))
return kFALSE;
527 if(
fDebug > 0) cout <<
" *** InitializeBayesianPID() *** " << endl;
534 if(
fDebug > 1) cout <<
" *** PassesTPCbayesianCut() *** " << endl;
539 if(
fQA) {
fPhi->Fill(track->Phi());
fPt->Fill(track->Pt());
fEta->Fill(track->Eta());}
554 AliAODTrack copy(*track);
558 Double_t bCov[3] = { -99., -99., -99.};
559 if(copy.PropagateToDCA(
fAOD->GetPrimaryVertex(),
fAOD->GetMagneticField(), 100., b, bCov)) {
568 Double_t bCov[3] = { -99., -99., -99.};
569 if(!copy.PropagateToDCA(
fAOD->GetPrimaryVertex(),
fAOD->GetMagneticField(), 100., b, bCov))
return kFALSE;
573 if(
fDCAConfig[4] < TMath::Abs(b[1]))
return kFALSE;
575 if( denom < 0.0000001 )
return kFALSE;
637 Float_t length = track->GetIntegratedLength();
638 Float_t time = track->GetTOFsignal();
641 if((length > 0) && (time > 0)) beta = length / 2.99792458e-2 / time;
655 if(track->Pt() > .4) {
656 nSigmaK = TMath::Sqrt(nSigKTPC*nSigKTPC+nSigKTOF*nSigKTOF);
658 if(track->GetTPCsignal() > 110) nSigmaK = TMath::Abs(nSigKTPC);
666 if(track->Pt() > .4) {
667 nSigmaPi = TMath::Sqrt(nSigPiTPC*nSigPiTPC+nSigPiTOF*nSigPiTOF);
669 if(track->GetTPCsignal() < 60) nSigmaPi = TMath::Abs(nSigPiTPC);
678 if(track->Pt() > .4) {
679 nSigmaP = TMath::Sqrt(nSigPTPC*nSigPTPC+nSigPTOF*nSigPTOF);
681 if(track->GetTPCsignal() > 110) nSigmaP = TMath::Abs(nSigPTPC);
688 if(minSigma == 0)
return kFALSE;
689 if((nSigmaK == nSigmaPi) && ( nSigmaK == nSigmaP))
return kFALSE;
694 Float_t length = track->GetIntegratedLength();
695 Float_t time = track->GetTOFsignal();
698 if((length > 0) && (time > 0)) beta = length / 2.99792458e-2 / time;
701 if(beta < 0.4)
return kFALSE;
717 TVector3 a(track1->Px(), track1->Py(), track1->Pz());
718 TVector3 b(track2->Px(), track2->Py(), track2->Pz());
727 if (tracktype == 0) {
735 if (tracktype == 1) {
742 if (tracktype == 2) {
754 if(!track)
return kFALSE;
786 MixingCandidates->SetOwner(kTRUE);
789 if(
fDebug > 0 ) cout <<
" Could not get PID response " << endl;
810 AliMultSelection* MultSelection = 0x0;
811 MultSelection = (AliMultSelection*)
fAOD->FindListObject(
"MultSelection");
812 if( !MultSelection) {
813 AliWarning(
"AliMultSelection object not found!");
816 v0Centr = MultSelection->GetMultiplicityPercentile(
"V0M");
817 cl1Centr = MultSelection->GetMultiplicityPercentile(
"CL1");
818 cl0Centr = MultSelection->GetMultiplicityPercentile(
"CL0");
821 if (v0Centr >= 90. || v0Centr < 0)
825 const Int_t nTracks =
fAOD->GetNumberOfTracks();
826 Int_t multEsd = ((AliAODHeader*)
fAOD->GetHeader())->GetNumberOfESDTracks();
829 Int_t multTrkBefC = 0;
830 Int_t multTrkTOFBefC = 0;
833 for (
Int_t it = 0; it < nTracks; it++) {
835 AliAODTrack* aodTrk = (AliAODTrack*)
fAOD->GetTrack(it);
842 if (aodTrk->TestFilterBit(32)){
846 if ( TMath::Abs(aodTrk->GetTOFsignalDz()) <= 10 && aodTrk->GetTOFsignal() >= 12000 && aodTrk->GetTOFsignal() <= 25000)
849 if ((TMath::Abs(aodTrk->Eta()) < TMath::Abs(
fCandidateMinEta)) && (aodTrk->GetTPCNcls() >= 70) && (aodTrk->Pt() >= .2) && (aodTrk->Pt() < 20))
854 if (aodTrk->TestFilterBit(32))
862 Float_t multESDTPCDif = multEsdn - multTPCn*3.38;
866 if (cl0Centr < fLowCut->Eval(v0Centr))
869 if (cl0Centr >
fHighCut->Eval(v0Centr))
877 if (multTrkTOFBefC < fMultTOFLowCut->Eval(
Float_t(multTrkBefC)))
891 if (((AliAODHeader*)
fAOD->GetHeader())->GetRefMultiplicityComb08() < 0)
906 AliAODVertex* vtTrc =
fAOD->GetPrimaryVertex();
907 AliAODVertex* vtSPD =
fAOD->GetPrimaryVertexSPD();
908 if (vtTrc->GetNContributors()<2 || vtSPD->GetNContributors()<1)
return;
909 double covTrc[6],covSPD[6];
910 vtTrc->GetCovarianceMatrix(covTrc);
911 vtSPD->GetCovarianceMatrix(covSPD);
912 double dz = vtTrc->GetZ()-vtSPD->GetZ();
913 double errTot = TMath::Sqrt(covTrc[5]+covSPD[5]);
914 double errTrc = TMath::Sqrt(covTrc[5]);
915 double nsigTot = TMath::Abs(dz)/errTot, nsigTrc = TMath::Abs(dz)/errTrc;
916 if (TMath::Abs(dz)>0.2 || TMath::Abs(nsigTot)>10 || TMath::Abs(nsigTrc)>20)
return;
928 if (
fAOD->IsIncompleteDAQ())
return;
946 Int_t unTracks =
fAOD->GetNumberOfTracks();
947 AliAODTrack* un[unTracks];
948 AliAODTrack* up[unTracks];
952 for (
Int_t iTracks = 0; iTracks < unTracks; iTracks++) {
953 AliAODTrack* track =
dynamic_cast<AliAODTrack*
>(
fAOD->GetTrack(iTracks));
954 if(!track) AliFatal(
"Not a standard AOD");
964 track->Px(), track->Py(), track->Pz(),
965 track->Pt(), track->Charge()));
966 if (track->Charge() > 0) {
971 else if (track->Charge() < 0) {
978 for (
Int_t pTracks = 0; pTracks < unp ; pTracks++) {
979 for (
Int_t nTracks = 0; nTracks < unn ; nTracks++) {
985 TVector3 a(up[pTracks]->Px(), up[pTracks]->Py(), up[pTracks]->Pz());
986 TVector3 b(un[nTracks]->Px(), un[nTracks]->Py(), up[pTracks]->Pz());
990 Double_t p = TMath::Sqrt(c.Px()*c.Px()+c.Py()*c.Py()+c.Pz()*c.Pz());
992 nIDs[0] = up[pTracks]->GetID();
993 nIDs[1] = un[nTracks]->GetID();
994 MakeTrack(mass, pt, phi, eta, 2, nIDs, p, c.Pz());
998 for (
int iCand = 0; iCand !=
fCandidates->GetEntriesFast(); ++iCand) {
1000 if (!cand)
continue;
1003 if (
fDebug>1) printf(
" *** Daughter %d with fID %d ***", iDau, cand->
GetIDDaughter(iDau));
1021 for (
Int_t pTracks = 0; pTracks < unp ; pTracks++) {
1022 for (
Int_t nTracks = pTracks + 1; nTracks < unp ; nTracks++) {
1028 for (
Int_t nTracks = 0; nTracks < unn ; nTracks++) {
1029 for (
Int_t pTracks = nTracks + 1; pTracks < unn ; pTracks++) {
1055 else AliAnalysisTaskSE::Exec(c);
1063 if(!pool) AliFatal(Form(
"No pool found for centrality = %f, zVtx = %f",
fCentrality,
fVertex));
1068 TObjArray* mixed_candidates = pool->GetEvent(iEvent);
1069 if(!mixed_candidates)
continue;
1070 Int_t bufferTracks = mixed_candidates->GetEntriesFast();
1071 Int_t candidates = MixingCandidates->GetEntriesFast();
1075 Int_t buffer_unp(0);
1076 Int_t buffer_unn(0);
1081 for (
Int_t iTracks = 0; iTracks < candidates; iTracks++) {
1083 if(!track)
continue;
1084 if (track->
Charge() > 0) {
1085 mix_up[mix_unp] = track;
1088 else if (track->
Charge() < 0 ) {
1089 mix_un[mix_unn] = track;
1093 for (
Int_t iTracks = 0; iTracks < bufferTracks; iTracks++) {
1095 if(!track)
continue;
1096 if (track->
Charge() > 0) {
1097 buffer_up[buffer_unp] = track;
1100 else if (track->
Charge() < 0 ) {
1101 buffer_un[buffer_unn] = track;
1105 for (
Int_t pMix = 0; pMix < mix_unp; pMix++) {
1108 for(
Int_t pBuf = 0; pBuf < buffer_unp; pBuf++) {
1112 PtSelector(1, mix_up[pMix], buffer_up[pBuf]);
1116 for(
Int_t nBuf = 0; nBuf < buffer_unn; nBuf++) {
1120 PtSelector(2, mix_up[pMix], buffer_un[nBuf]);
1124 for (
Int_t nMix = 0; nMix < mix_unn; nMix++) {
1127 for(
Int_t nBuf = 0; nBuf < buffer_unn; nBuf++) {
1131 PtSelector(2, mix_un[nMix], buffer_un[nBuf]);
1135 for(
Int_t pBuf = 0; pBuf < buffer_unp; pBuf++) {
1139 PtSelector(1, mix_un[nMix], buffer_up[pBuf]);
1145 pool->UpdatePool(MixingCandidates);
1152 if(
fDebug > 0) cout <<
" *** Terminate() *** " << endl;
1161 Double_t y = 0.5*TMath::Log((TMath::Sqrt(mass*mass+p*p)+pz)/(TMath::Sqrt(mass*mass+p*p)-pz));
1164 Bool_t overwrite = kTRUE;
1186 TClonesArray *arrayMC = 0;
1187 if(
fDebug > 0) cout <<
" -> Switching to MC mode <- " << endl;
1189 arrayMC = (TClonesArray*)
fAOD->GetList()->FindObject(AliAODMCParticle::StdBranchName());
1190 if (!arrayMC) AliFatal(
"Error: MC particles branch not found!\n");
1191 for (
Int_t iTracks = 0; iTracks <
fAOD->GetNumberOfTracks(); iTracks++) {
1192 AliAODTrack* track =
dynamic_cast<AliAODTrack*
>(
fAOD->GetTrack(iTracks));
1193 if(!track) AliFatal(
"Not a standard AOD");
1195 if(
fDebug>1) cout <<
" Rejected track" << endl;
1198 if (
fDebug>1) cout <<
" Received MC kaon " << endl;
1200 Double_t bCov[3] = { -99., -99., -99.};
1201 AliAODTrack copy(*track);
1202 if(!copy.PropagateToDCA(
fAOD->GetPrimaryVertex(),
fAOD->GetMagneticField(), 100., b, bCov))
return;
1204 AliAODMCParticle *partMC = (AliAODMCParticle*) arrayMC->At(TMath::Abs(track->GetLabel()));
1206 if(
fDebug > 1) cout <<
"Cannot get MC particle" << endl;
1210 Bool_t isPrimary = partMC->IsPhysicalPrimary();
1211 Bool_t isSecondaryMaterial = kFALSE;
1212 Bool_t isSecondaryWeak = kFALSE;
1214 Int_t mfl = -999, codemoth = -999;
1215 Int_t indexMoth = partMC->GetMother();
1216 if (indexMoth >= 0) {
1217 AliAODMCParticle* moth = (AliAODMCParticle*) arrayMC->At(indexMoth);
1218 codemoth = TMath::Abs(moth->GetPdgCode());
1219 mfl =
Int_t(codemoth / TMath::Power(10,
Int_t(TMath::Log10(codemoth))));
1221 if (mfl == 3) isSecondaryWeak = kTRUE;
1222 else isSecondaryMaterial = kTRUE;
1230 if (isSecondaryMaterial)
fDCAMaterial->Fill(track->Pt(), b[0]);
1242 printf(
"One of vertices is not valid\n");
1245 static TMatrixDSym vVb(3);
1247 double dx = v0->GetX()-v1->GetX();
1248 double dy = v0->GetY()-v1->GetY();
1249 double dz = v0->GetZ()-v1->GetZ();
1250 double cov0[6],cov1[6];
1251 v0->GetCovarianceMatrix(cov0);
1252 v1->GetCovarianceMatrix(cov1);
1262 vVb(1,1) = cov0[2]+cov1[2];
1263 vVb(2,2) = cov0[5]+cov1[5];
1264 vVb(1,0) = vVb(0,1) = cov0[1]+cov1[1];
1265 vVb(0,2) = vVb(1,2) = vVb(2,0) = vVb(2,1) = 0.;
1267 if (!vVb.IsValid()) {printf(
"Singular Matrix\n");
return dist;}
1268 dist = vVb(0,0)*dx*dx + vVb(1,1)*dy*dy + vVb(2,2)*dz*dz
1269 + 2*vVb(0,1)*dx*dy + 2*vVb(0,2)*dx*dz + 2*vVb(1,2)*dy*dz;
1270 return dist>0 ? TMath::Sqrt(dist) : -1;
1282 const int kMinPlpContrib = 5;
1283 const double kMaxPlpChi2 = 5.0;
1284 const double kMinWDist = 15;
1286 const AliVVertex* vtPrm = 0;
1287 const AliVVertex* vtPlp = 0;
1290 if ( !(nPlp=aod->GetNumberOfPileupVerticesTracks()) )
return kFALSE;
1291 vtPrm = aod->GetPrimaryVertex();
1292 if (vtPrm == aod->GetPrimaryVertexSPD())
return kTRUE;
1296 for (
int ipl=0;ipl<nPlp;ipl++) {
1297 vtPlp = (
const AliVVertex*)aod->GetPileupVertexTracks(ipl);
1299 if (vtPlp->GetNContributors() < kMinPlpContrib)
continue;
1300 if (vtPlp->GetChi2perNDF() > kMaxPlpChi2)
continue;
1304 double wDst =
GetWDist(vtPrm,vtPlp);
1305 if (wDst<kMinWDist)
continue;
1321 if((nSk == nSpi) && (nSk == nSp))
1323 if((nSk < nSpi) && (nSk < nSp) && (nSk <
fPIDConfig[0]))
1326 if((nSpi < nSk) && (nSpi < nSp) && (nSpi <
fPIDConfig[0]))
1329 if((nSp < nSk) && (nSp < nSpi) && (nSp <
fPIDConfig[0]))
void SetMassMin(Double_t i)
TH1F * fEta
QA plot of p_t sectrum of tracks used for event plane estimation.
Bool_t plpMV(const AliAODEvent *aod)
TH1F * fVZEROA
QA plot of eta distribution of tracks used for event plane estimation.
Bool_t PassesTPCbayesianCut(T *track) const
TH1 * fHistCentralityWeights
virtual ~AliAnalysisTaskPhiFlow()
Double_t fCentralityMin
QA profile of centralty vs multiplicity.
Bool_t CheckVertex(const T *event)
void SetEta(Double_t eta)
Int_t fCentralityMixingBins[20]
TH2F * fDCAAll
QA plot TPC multiplicity (tracks used for event plane estimation)
AliFlowTrackCuts * fPOICuts
Bool_t fCandidateEtaPtCut
TH1F * fPtSpectra[18]
like-sign kaon pairs
void ReconstructionWithEventMixing(TObjArray *MixingCandidates) const
Double_t PhiPt(const T *track_1, const T *track_2) const
Int_t GetNumberOfRPs() const
TH1F * fInvMNP[18]
QA histo of TOF response kaons.
AliFlowTrackCuts * fNullCuts
void SetNbinsPhi(Int_t i)
void AddPhiIdentificationOutputObjects()
void SetPhiMin(Double_t i)
void AddDaughter(Int_t value)
void PlotMultiplcities(const T *event) const
void ComputeProb(const AliESDtrack *t, Float_t)
virtual void UserCreateOutputObjects()
AliFlowEvent * fFlowEvent
pid response object
TH2F * fPIDk
QA histogram of TPC response of all charged particles.
TH1F * fDCAXYQA
qa dca of all charged particles
void SetMass(Double_t mass)
TH2F * fDCASecondaryWeak
dca of primaries (mc) or kaons (data)
Double_t InvariantMass(const T *track1, const T *track2) const
void SetEtaMax(Double_t i)
virtual Bool_t IsSelected(TObject *obj, Int_t id=-666)
void SetParamType(trackParameterType paramType)
void SetDetResponse(AliESDEvent *esd, Float_t centrality=-1.0, EStartTimeType_t flagStart=AliESDpid::kTOF_T0, Bool_t=kFALSE)
void SetReferenceMultiplicity(Int_t m)
TH1F * fPtN
QA histogram of p_t distribution of positive particles.
AliESDv0 * fV0
placeholder for the current kink
Bool_t EventCut(T *event)
Double_t GetWDist(const AliVVertex *v0, const AliVVertex *v1)
Bool_t InRPSelection() const
AliPIDResponse * fPIDResponse
AliFlowBayesianPID * fBayesianResponse
TH2F * fNOPIDTOF
QA histogram of TPC response of kaons.
AliFlowTrack * GetTrack(Int_t i)
TList * fOutputList
event pool manager
UShort_t T(UShort_t m, UShort_t t)
TH1F * fInvMNN[18]
unlike sign kaon pairs
TH2F * fNOPID
QA histogram of events that do not pass centrality cut.
Bool_t fSkipEventSelection
profiles for vzero vn(minv)
void SetPsi5(Double_t gPsi5)
void SetForRPSelection(Bool_t b=kTRUE)
void SetPtRange(Float_t r1, Float_t r2)
Int_t GetNDaughters(void) const
Int_t fVertexMixingBins[20]
virtual void Exec(Option_t *)
void SetNumberOfRPs(Int_t nr)
void Fill(AliFlowTrackCuts *rpCuts, AliFlowTrackCuts *poiCuts)
const char * fkCentralityMethodA
Bool_t PassesDCACut(AliAODTrack *track) const
void PrepareFlowEvent(Int_t iMulti)
Bool_t GetCurrentMask(Int_t idet) const
void SetNbinsEta(Int_t i)
const char * fkCentralityMethodB
void SetNbinsMult(Int_t i)
TH2F * fPIDTOF
QA histo of TOF repsonse charged particles.
void SetMassMax(Double_t i)
static AliFlowCommonConstants * GetMaster()
Double_t fCandidateMaxEta
void SetNbinsMass(Int_t i)
AliFlowBayesianPID * fBayesianResponse
flow events (one for each inv mass band)
TProfile * fSubEventDPhiv2
dca material (mc) all (data)
AliEventPoolManager * InitializeEventMixing()
AliFlowTrackCuts * fCutsRP
void SetPsi2(Double_t gPsi2)
Bool_t PhiTrack(T *track) const
TH2F * fMultvsCentr
QA profile global and tpc multiplicity after outlier cut.
Bool_t fCentralityCut2011
AliPIDResponse * fPIDResponse
TH1F * fTPCM
QA plot vzeroc multiplicity (all tracks in event)
void SetPhi(Double_t phi)
void DefineDeadZone(Double_t etaMin, Double_t etaMax, Double_t phiMin, Double_t phiMax)
void SetMultMax(Double_t i)
Double_t fCandidateMinEta
TH2F * fDCAPrim
qa plot of dca z
Int_t GetIDDaughter(Int_t value) const
ClassImp(AliAnalysisTaskPhiFlow) ClassImp(AliPhiMesonHelperTrack) AliAnalysisTaskPhiFlow
void SetPtMax(Double_t i)
Bool_t CheckCandidateEtaPtCut(const T *track1, const T *track2) const
Bool_t CheckCentrality(T *event)
TObjArray * fCandidates
PID response object.
void SetEvent(AliVEvent *event, AliMCEvent *mcEvent=NULL)
Float_t fHarmonic
z vertex position
void InitializeBayesianPID(AliAODEvent *event)
void SetPsi3(Double_t gPsi3)
Float_t nEvents[nProd]
Input train file.
TH1F * fPtKN
QA histogram of p_t distribution of positive kaons.
TH1F * BookHistogram(const char *name)
Bool_t GetDoubleCountingK(Double_t nSk, Short_t minNSigma) const
void SetPhiMax(Double_t i)
void SetEtaMin(Double_t i)
void SetNewTrackParam(Bool_t flag=kTRUE)
TString fCentralityEstimator
Float_t fCentralityWeight
TH1F * fDCAZQA
qa plot of dca xz
TH1F * InitPtSpectraHistograms(Float_t nmin, Float_t nmax)
void SetForPOISelection(Bool_t b=kTRUE)
AliEventPoolManager * fPoolManager
AOD oject.
TH1F * fInvMPP[18]
like-sign kaon pairs
TH2F * fDCAMaterial
dca of weak (mc)
Int_t fMixingParameters[3]
TH2F * fMultCorAfterCuts
QA histogram of p_t distribution of negative kaons.
virtual Int_t Charge() const
void SetMultMin(Double_t i)
Bool_t IsKaon(AliAODTrack *track) const
virtual void Terminate(Option_t *)
void SetPtMin(Double_t i)
TH1F * fVZEROC
QA plot vzeroa multiplicity (all tracks in event)
TH1F * BookPtHistogram(const char *name)
Short_t FindMinNSigma(Double_t nSpi, Double_t nSk, Double_t nSp) const
TH2F * BookPIDHistogram(const char *name, Bool_t TPC)
AliPIDCombined * fPIDCombined
TH1F * fPtKP
QA histogram of p_t distribution of negative particles.
TProfile * fV0Data[18][2]
subevent resolution info for v2
virtual void UserExec(Option_t *option)
Bool_t fCentralityCut2010
void InsertTrack(AliFlowTrack *)
TH1F * fPt
QA plot of azimuthal distribution of tracks used for event plane estimation.
void PtSelector(Int_t _track_type, const T *track_1, const T *track_2) const
void MakeTrack(Double_t, Double_t, Double_t, Double_t, Int_t, Int_t[], Double_t p=0., Double_t pz=0.) const
void SetEtaRange(Float_t r1, Float_t r2)
Int_t NumberOfTracks() const