5 #include "AliMCParticle.h"
7 #include "AliAnalysisTask.h"
8 #include "AliAnalysisManager.h"
10 #include "AliVEvent.h"
11 #include "AliESDEvent.h"
12 #include "AliAODEvent.h"
13 #include "AliMCEvent.h"
14 #include "AliESDInputHandler.h"
15 #include "AliInputEventHandler.h"
16 #include "AliVTrack.h"
17 #include "AliExternalTrackParam.h"
18 #include "AliVVertex.h"
19 #include "AliAnalysisFilter.h"
21 #include "AliPIDResponse.h"
22 #include "AliESDv0KineCuts.h"
54 , fRunMode(kJetPIDMode)
55 , fPileUpRejectionType(kPileUpRejectionOff)
56 , fMinPlpContribSPD(3)
68 , fStoreMotherIndex(kFALSE)
73 fRandom =
new TRandom3(0);
79 fPhiCutLow =
new TF1(
"StdPhiCutLow",
"0.1/x/x+pi/18.0-0.025", 0, 100);
80 fPhiCutHigh =
new TF1(
"StandardPhiCutHigh",
"0.12/x+pi/18.0+0.035", 0, 100);
92 , fRunMode(kJetPIDMode)
93 , fPileUpRejectionType(kPileUpRejectionOff)
94 , fMinPlpContribSPD(3)
106 , fStoreMotherIndex(kFALSE)
107 , fV0motherIndex(0x0)
117 fPhiCutLow =
new TF1(
"StdPhiCutLow",
"0.1/x/x+pi/18.0-0.025", 0, 100);
118 fPhiCutHigh =
new TF1(
"StandardPhiCutHigh",
"0.12/x+pi/18.0+0.035", 0, 100);
120 DefineInput (0, TChain::Class());
121 DefineOutput(0, TTree::Class());
165 AliInputEventHandler* inputHandler =
dynamic_cast<AliInputEventHandler*
>(man->GetInputEventHandler());
168 AliFatal(
"Input handler needed");
177 AliError(
"PIDResponse object was not created");
183 Float_t gammaProdVertexRadiusCuts[2] = { 3.0, 45. };
184 fV0KineCuts->SetGammaCutVertexR(&gammaProdVertexRadiusCuts[0]);
217 phi = TMath::TwoPi() - phi;
220 phi = TMath::TwoPi() - phi;
222 phi += TMath::Pi() / 18.0;
223 phi = fmod(phi, TMath::Pi() / 9.0);
238 if (phiPrime < fPhiCutHigh->Eval(trackPt) && phiPrime >
fPhiCutLow->Eval(trackPt))
248 return PhiPrimeCut(track->Pt(), track->Phi(), track->Charge(), magField);
266 AliError(
"Event seems to be neither AOD nor ESD!");
274 const AliVVertex* trkVtx =
event->GetPrimaryVertex();
276 if (!trkVtx || !(trkVtx->GetStatus()))
279 TString vtxTtl = trkVtx->GetTitle();
280 if (!vtxTtl.Contains(
"VertexerTracks"))
284 const AliVVertex* spdVtx =
event->GetPrimaryVertexSPD();
286 if (!spdVtx || !(spdVtx->GetStatus()))
289 TString vtxTyp = spdVtx->GetTitle();
291 spdVtx->GetCovarianceMatrix(cov);
292 Double_t zRes = TMath::Sqrt(cov[5]);
293 if (vtxTyp.Contains(
"vertexer:Z") && (zRes > 0.25))
296 if (TMath::Abs(spdVtx->GetZ() - trkVtx->GetZ()) > 0.5)
308 const AliVVertex* primaryVertex = 0x0;
310 primaryVertex =
dynamic_cast<const AliVVertex*
>(aod->GetPrimaryVertex());
311 if (!primaryVertex || primaryVertex->GetNContributors() <= 0)
315 TString primVtxTitle(primaryVertex->GetTitle());
316 if (primVtxTitle.Contains(
"TPCVertex",TString::kIgnoreCase))
320 primaryVertex =
dynamic_cast<const AliVVertex*
>(esd->GetPrimaryVertexTracks());
324 if (primaryVertex->GetNContributors() <= 0) {
326 primaryVertex =
dynamic_cast<const AliVVertex*
>(esd->GetPrimaryVertexSPD());
327 if (!primaryVertex || primaryVertex->GetNContributors() <= 0)
340 const AliESDVertex *trkVertex = esd->GetPrimaryVertexTracks();
341 const AliESDVertex *spdVertex = esd->GetPrimaryVertexSPD();
343 Bool_t hasSPD = spdVertex->GetStatus();
344 Bool_t hasTrk = trkVertex->GetStatus();
349 if (spdVertex->IsFromVertexerZ() && !(spdVertex->GetDispersion()<0.04 && spdVertex->GetZRes()<0.25))
352 if (TMath::Abs(spdVertex->GetZ() - trkVertex->GetZ())>0.5)
356 const AliVVertex *vertex =
event->GetPrimaryVertex();
376 functionPURejectionType == pileUpRejection;
382 AliError(
"No event!");
387 AliError(
"AnalysisUtils object not available!");
414 AliError(
"Failed to retrieve ESD event. No V0's processed (only works for ESDs by now).");
419 AliError(
"V0KineCuts not available!");
423 TString beamType(event->GetBeamType());
425 if (beamType.CompareTo(
"Pb-Pb") == 0 || beamType.CompareTo(
"A-A") == 0) {
426 fV0KineCuts->SetMode(AliESDv0KineCuts::kPurity, AliESDv0KineCuts::kPbPb);
429 fV0KineCuts->SetMode(AliESDv0KineCuts::kPurity, AliESDv0KineCuts::kPP);
436 const Int_t numTracks =
event->GetNumberOfTracks();
438 for (
Int_t i = 0; i < numTracks; i++)
443 for (
Int_t i = 0; i < numTracks; i++)
450 for (
Int_t iv0 = 0; iv0 <
event->GetNumberOfV0s(); iv0++) {
451 AliESDv0* v0 = (AliESDv0*)event->GetV0(iv0);
457 if (v0->GetOnFlyStatus())
462 Int_t pdgV0 = 0, pdgP = 0, pdgN = 0;
464 foundV0 =
fV0KineCuts->ProcessV0(v0, pdgV0, pdgP, pdgN);
468 Int_t iTrackP = v0->GetPindex();
469 Int_t iTrackN = v0->GetNindex();
477 else if (pdgP == 211) {
480 else if(pdgP == 2212) {
491 else if( pdgN == -211){
494 else if( pdgN == -2212){
559 const Short_t sign = track->Charge();
565 track->GetPxPyPz(pxpypz);
567 AliExternalTrackParam* par =
new AliExternalTrackParam(xyz, pxpypz, cv, sign);
568 const AliESDtrack dummy;
570 const Double_t magField = evt->GetMagneticField();
571 Double_t varGeom = dummy.GetLengthInActiveZone(par, 3, 236, magField, 0, 0);
572 Double_t varNcr = track->GetTPCClusterInfo(3, 1);
573 Double_t varNcls = track->GetTPCsignalN();
575 const Double_t varEval = 130. - 5. * TMath::Abs(1. / track->Pt());
580 Bool_t kout = cutGeom && cutNcr && cutNcls;
583 Double_t dedx = track->GetTPCsignal();
585 (*streamer)<<
"tree"<<
587 "varGeom="<<varGeom<<
589 "varNcls="<<varNcls<<
591 "cutGeom="<<cutGeom<<
593 "cutNcls="<<cutNcls<<
virtual void Terminate(const Option_t *)
virtual Double_t GetZvtxCutEvent() const
virtual Int_t GetMinPlpContribSPD() const
AliAnalysisFilter * fTrackFilter
Can be used to statistically determine the shape in the pt bins e.g.
PileUpRejectionType GetPileUpRejectionType() const
static Bool_t TPCCutMIGeo(const AliVTrack *track, const AliVEvent *evt, TTreeStream *streamer=0x0)
Bool_t fStoreMotherIndex
Pointer to array with tags for identified particles from V0 decays.
virtual Double_t GetPhiPrime(Double_t phi, Double_t magField, Int_t charge) const
static UShort_t fgCutPureNcl
virtual Bool_t GetIsPileUp(AliVEvent *event, PileUpRejectionType pileUpRejection=kPileUpRejectionClass) const
virtual Bool_t PhiPrimeCut(const AliVTrack *track, Double_t magField) const
AliPIDResponse * fPIDResponse
MC object.
virtual Int_t GetV0motherIndex(Int_t trackIndex) const
AliAnalysisTaskPIDV0base()
AliESDv0KineCuts * fV0KineCuts
PID response Handler.
AliAnalysisUtils * fAnaUtils
ESD V0 kine cuts.
virtual void UserExec(Option_t *option)
static Bool_t TPCnclCut(const AliVTrack *track)
virtual void UserCreateOutputObjects()
virtual Char_t GetV0tag(Int_t trackIndex) const
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
virtual Bool_t GetVertexIsOk(AliVEvent *event, Bool_t doVtxZcut=kTRUE) const
virtual ~AliAnalysisTaskPIDV0base()
RunMode GetRunMode() const
void FillV0PIDlist(AliESDEvent *esdEvent=0x0)