2 // Implementation file for implementation of data analysis aft 900 GeV
4 // Author: A. Pulvirenti
12 #include "TParticle.h"
14 #include "TLorentzVector.h"
17 #include "AliESDpid.h"
18 #include "AliESDEvent.h"
19 #include "AliESDVertex.h"
20 #include "AliESDtrack.h"
22 #include "AliMCEvent.h"
23 #include "AliTOFT0maker.h"
24 #include "AliTOFcalib.h"
25 #include "AliCDBManager.h"
26 #include "AliITSPIDResponse.h"
28 #include "AliRsnAnalysisPhi7TeVNoPID.h"
30 //__________________________________________________________________________________________________
31 AliRsnAnalysisPhi7TeVNoPID::AliRsnAnalysisPhi7TeVNoPID(const char *name) :
32 AliAnalysisTaskSE(name),
54 fTOFcalibrateESD(kFALSE),
55 fTOFcorrectTExp(kFALSE),
65 DefineOutput(1, TTree::Class());
66 DefineOutput(2, TTree::Class());
67 DefineOutput(3, TList::Class());
70 //__________________________________________________________________________________________________
71 AliRsnAnalysisPhi7TeVNoPID::AliRsnAnalysisPhi7TeVNoPID(const AliRsnAnalysisPhi7TeVNoPID& copy) :
72 AliAnalysisTaskSE(copy),
81 fMaxITSband(copy.fMaxITSband),
82 fTPCpLimit(copy.fTPCpLimit),
83 fMinTPCband(copy.fMinTPCband),
84 fMaxTPCband(copy.fMaxTPCband),
89 fESDtrackCutsTPC(copy.fESDtrackCutsTPC),
90 fESDtrackCutsITS(copy.fESDtrackCutsITS),
94 fTOFcalibrateESD(kFALSE),
95 fTOFcorrectTExp(kFALSE),
105 //__________________________________________________________________________________________________
106 AliRsnAnalysisPhi7TeVNoPID& AliRsnAnalysisPhi7TeVNoPID::operator=(const AliRsnAnalysisPhi7TeVNoPID& copy)
109 // Assignment operator
112 fUseMC = copy.fUseMC;
114 fMaxVz = copy.fMaxVz;
115 fMaxITSband = copy.fMaxITSband;
117 fTPCpLimit = copy.fTPCpLimit;
118 fMinTPCband = copy.fMinTPCband;
119 fMaxTPCband = copy.fMaxTPCband;
121 fESDtrackCutsTPC = copy.fESDtrackCutsTPC;
122 fESDtrackCutsITS = copy.fESDtrackCutsITS;
124 fTOFcalibrateESD = copy.fTOFcalibrateESD;
125 fTOFcorrectTExp = copy.fTOFcorrectTExp;
126 fTOFuseT0 = copy.fTOFuseT0;
127 fTOFtuneMC = copy.fTOFtuneMC;
128 fTOFresolution = copy.fTOFresolution;
133 //__________________________________________________________________________________________________
134 AliRsnAnalysisPhi7TeVNoPID::~AliRsnAnalysisPhi7TeVNoPID()
140 if (fRsnTreeComp) delete fRsnTreeComp;
141 if (fRsnTreeTrue) delete fRsnTreeTrue;
142 if (fHEvents) delete fHEvents;
143 if (fESDpid) delete fESDpid;
146 //__________________________________________________________________________________________________
147 void AliRsnAnalysisPhi7TeVNoPID::UserCreateOutputObjects()
150 // Create the output data container
153 // setup TPC response
154 fESDpid = new AliESDpid;
155 fESDpid->GetTPCResponse().SetBetheBlochParameters(fTPCpar[0],fTPCpar[1],fTPCpar[2],fTPCpar[3],fTPCpar[4]);
157 // setup TOF maker & calibration
158 fTOFcalib = new AliTOFcalib;
159 fTOFmaker = new AliTOFT0maker(fESDpid, fTOFcalib);
160 fTOFmaker->SetTimeResolution(fTOFresolution);
165 // create output trees
167 fRsnTreeComp = new TTree("rsnTree", "Pairs");
169 fRsnTreeComp->Branch("pdg", &fPDG, "pdg/S" );
170 fRsnTreeComp->Branch("ch" , &fCh , "ch/S" );
171 fRsnTreeComp->Branch("im" , &fIM , "im/F" );
172 fRsnTreeComp->Branch("y" , &fY , "y/F" );
173 fRsnTreeComp->Branch("pt" , &fPt , "pt/F" );
174 fRsnTreeComp->Branch("eta", &fEta, "eta/F" );
175 fRsnTreeComp->Branch("its", &fITS, "its[2]/S");
177 fRsnTreeComp->Branch("p" , &fP , "p[2]/F");
178 fRsnTreeComp->Branch("ptpc" , &fPTPC , "ptpc[2]/F");
179 fRsnTreeComp->Branch("tpcpid", &fTPCnsigma, "tpcpid[2]/F");
180 fRsnTreeComp->Branch("itspid", &fITSnsigma, "itspid[2]/F");
181 fRsnTreeComp->Branch("tofpid", &fTOFdiff , "tofpid[2]/F");
184 fRsnTreeTrue = new TTree("rsnTrue", "True pairs");
186 fRsnTreeTrue->Branch("im" , &fIM , "im/F" );
187 fRsnTreeTrue->Branch("y" , &fY , "y/F" );
188 fRsnTreeTrue->Branch("pt" , &fPt , "pt/F" );
189 fRsnTreeTrue->Branch("eta", &fEta, "eta/F");
192 fOutList = new TList;
193 fHEvents = new TH1I("hEvents", "Event details", 5, 0, 5);
194 fVertexX[0] = new TH1F("hVertexTracksX", "X position of primary vertex (tracks)", 200, -2, 2);
195 fVertexY[0] = new TH1F("hVertexTracksY", "Y position of primary vertex (tracks)", 200, -2, 2);
196 fVertexZ[0] = new TH1F("hVertexTracksZ", "Z position of primary vertex (tracks)", 400, -40, 40);
197 fVertexX[1] = new TH1F("hVertexSPDX", "X position of primary vertex (SPD)", 200, -2, 2);
198 fVertexY[1] = new TH1F("hVertexSPDY", "Y position of primary vertex (SPD)", 200, -2, 2);
199 fVertexZ[1] = new TH1F("hVertexSPDZ", "Z position of primary vertex (SPD)", 400, -40, 40);
201 fHEvents->GetXaxis()->SetBinLabel(1, "Good vertex with tracks");
202 fHEvents->GetXaxis()->SetBinLabel(2, "Good vertex with SPD");
203 fHEvents->GetXaxis()->SetBinLabel(3, "Far vertex with tracks");
204 fHEvents->GetXaxis()->SetBinLabel(4, "Far vertex with SPD");
205 fHEvents->GetXaxis()->SetBinLabel(5, "No good vertex");
207 fOutList->Add(fHEvents);
208 fOutList->Add(fVertexX[0]);
209 fOutList->Add(fVertexY[0]);
210 fOutList->Add(fVertexZ[0]);
211 fOutList->Add(fVertexX[1]);
212 fOutList->Add(fVertexY[1]);
213 fOutList->Add(fVertexZ[1]);
216 //__________________________________________________________________________________________________
217 void AliRsnAnalysisPhi7TeVNoPID::UserExec(Option_t *)
220 // Main execution function.
221 // Fills the fHEvents data member with the following legenda:
222 // 0 -- event OK, prim vertex with tracks
223 // 1 -- event OK, prim vertex with SPD
224 // 2 -- event OK but vz large
228 static Int_t evNum = 0;
231 // retrieve ESD event and related stack (if available)
232 AliESDEvent *esd = dynamic_cast<AliESDEvent*>(fInputEvent);
233 AliStack *stack = (fMCEvent ? fMCEvent->Stack() : 0x0);
236 Int_t eval = EventEval(esd);
237 fHEvents->Fill(eval);
239 // if the event is good for analysis, process it
240 if (eval == kGoodTracksPrimaryVertex || eval == kGoodSPDPrimaryVertex)
242 ProcessESD(esd, stack);
246 // update histogram container
247 PostData(3, fOutList);
250 //__________________________________________________________________________________________________
251 void AliRsnAnalysisPhi7TeVNoPID::Terminate(Option_t *)
258 //__________________________________________________________________________________________________
259 Int_t AliRsnAnalysisPhi7TeVNoPID::EventEval(AliESDEvent *esd)
262 // Checks if the event is good for analysis.
263 // Returns one of the flag values defined in the header
266 static Int_t evNum = 0;
270 AliDebug(AliLog::kDebug + 1, Form("Event %d -- number of tracks = %d", evNum, esd->GetNumberOfTracks()));
272 // get the best primary vertex:
273 // first try the one with tracks
274 const AliESDVertex *vTrk = esd->GetPrimaryVertexTracks();
275 const AliESDVertex *vSPD = esd->GetPrimaryVertexSPD();
276 Double_t vzTrk = 1000.0;
277 Double_t vzSPD = 1000.0;
278 if (vTrk) vzTrk = TMath::Abs(vTrk->GetZv());
279 if (vSPD) vzSPD = TMath::Abs(vSPD->GetZv());
280 AliDebug(AliLog::kDebug + 1, Form("Event %d -- vertex with tracks: contributors = %d, abs(vz) = %f", evNum, vTrk->GetNContributors(), vzTrk));
281 AliDebug(AliLog::kDebug + 1, Form("Event %d -- vertex with SPD, contributors = %d, abs(vz) = %f", evNum, vSPD->GetNContributors(), vzSPD));
282 if(vTrk->GetNContributors() > 0)
284 // fill the histograms
285 fVertexX[0]->Fill(vTrk->GetXv());
286 fVertexY[0]->Fill(vTrk->GetYv());
287 fVertexZ[0]->Fill(vTrk->GetZv());
291 return kGoodTracksPrimaryVertex;
293 return kFarTracksPrimaryVertex;
295 else if (vSPD->GetNContributors() > 0)
297 // fill the histograms
298 fVertexX[1]->Fill(vSPD->GetXv());
299 fVertexY[1]->Fill(vSPD->GetYv());
300 fVertexZ[1]->Fill(vSPD->GetZv());
304 return kGoodSPDPrimaryVertex;
306 return kFarSPDPrimaryVertex;
309 return kNoGoodPrimaryVertex;
312 //__________________________________________________________________________________________________
313 void AliRsnAnalysisPhi7TeVNoPID::ProcessESD
314 (AliESDEvent *esd, AliStack *stack)
317 // This function works with the ESD object
320 // ITS stuff #1 create the response function
321 Bool_t isMC = (stack != 0x0);
322 AliITSPIDResponse itsrsp(isMC);
324 // TOF stuff #1: init OCDB
325 Int_t run = esd->GetRunNumber();
326 AliCDBManager *cdb = AliCDBManager::Instance();
327 cdb->SetDefaultStorage("raw://");
329 // TOF stuff #2: init calibration
330 fTOFcalib->SetCorrectTExp(fTOFcorrectTExp);
332 // TOF stuff #3: calibrate
333 if (fTOFcalibrateESD) fTOFcalib->CalibrateESD(esd);
334 if (fTOFtuneMC) fTOFmaker->TuneForMC(esd);
337 fTOFmaker->ComputeT0TOF(esd);
338 fTOFmaker->ApplyT0TOF(esd);
339 fESDpid->MakePID(esd, kFALSE, 0.);
342 // prepare to look on all tracks to select the ones
343 // which pass all the cuts
344 Int_t ntracks = esd->GetNumberOfTracks();
345 TArrayI pos(ntracks);
346 TArrayI neg(ntracks);
347 TArrayI itspos(ntracks);
348 TArrayI itsneg(ntracks);
350 // loop on all tracks
352 Int_t i, k, charge, npos = 0, nneg = 0, nITS;
353 Double_t times[10], itsSignal, mom, tofTime, tofRef;
354 Bool_t isTPC, isITSSA;
356 for (i = 0; i < ntracks; i++)
358 AliESDtrack *track = esd->GetTrack(i);
359 if (!track) continue;
361 // get commonly used variables
362 status = (ULong_t)track->GetStatus();
364 isTPC = ((status & AliESDtrack::kTPCin) != 0);
365 isITSSA = ((status & AliESDtrack::kTPCin) == 0 && (status & AliESDtrack::kITSrefit) != 0 && (status & AliESDtrack::kITSpureSA) == 0 && (status & AliESDtrack::kITSpid) != 0);
367 // accept only tracks which are TPC+ITS or ITS standalone
368 if (!isTPC && !isITSSA) continue;
370 // check specific cuts for TPC and ITS-SA tracks
373 if (!fESDtrackCutsTPC.IsSelected(track)) continue;
377 if (!fESDtrackCutsITS.IsSelected(track)) continue;
378 itsCluMap = track->GetITSClusterMap();
380 for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS;
381 if (nITS < 3) continue;
384 // if all checks are passed, add the track index in one of the
385 // charged tracks arrays
386 charge = (Int_t)track->Charge();
390 if (isITSSA) itspos[npos] = 1; else itspos[npos] = 0;
396 if (isITSSA) itsneg[nneg] = 1; else itsneg[nneg] = 0;
401 // resize arrays accordingly
407 // loop on unlike-sign pairs to compute invariant mass signal
408 Int_t ip, in, lp, ln;
410 Double_t kmass = pid.ParticleMass(AliPID::kKaon);
411 Double_t phimass = 1.019455;
412 TParticle *partp = 0x0, *partn = 0x0;
413 AliESDtrack *tp = 0x0, *tn = 0x0;
414 TLorentzVector vp, vn, vsum, vref;
415 for (ip = 0; ip < npos; ip++)
417 tp = esd->GetTrack(pos[ip]);
418 lp = TMath::Abs(tp->GetLabel());
419 if (stack) partp = stack->Particle(lp);
421 for (in = 0; in < nneg; in++)
423 if (pos[ip] == neg[in])
425 AliError("POS = NEG");
428 tn = esd->GetTrack(neg[in]);
429 ln = TMath::Abs(tn->GetLabel());
430 if (stack) partn = stack->Particle(ln);
435 if (partp->GetFirstMother() == partn->GetFirstMother())
437 if (partp->GetFirstMother() > 0)
439 TParticle *mum = stack->Particle(partp->GetFirstMother());
440 fPDG = mum->GetPdgCode();
444 fPDG = TMath::Abs(fPDG);
446 vp.SetXYZM(tp->Px(), tp->Py(), tp->Pz(), kmass);
447 vn.SetXYZM(tn->Px(), tn->Py(), tn->Pz(), kmass);
449 vref.SetXYZM(vsum.X(), vsum.Y(), vsum.Z(), phimass);
452 fIM = (Float_t)vsum.M();
453 fPt = (Float_t)vsum.Perp();
454 fEta = (Float_t)vsum.Eta();
455 fY = (Float_t)vref.Rapidity();
456 fITS[0] = itspos[ip];
457 fITS[1] = itsneg[in];
459 if (fIM < 0.9 || fIM > 5.0) continue;
460 if (fPt < 0.0 || fPt > 20.0) continue;
462 // PID signal for track #1
463 // here it is enough to check if it is a TPC track
464 // since we excluded the case that it is neither a TPC+ITS nor an ITS-SA
465 if ((tp->GetStatus() & AliESDtrack::kTPCin) != 0)
468 fPTPC [0] = tp->GetInnerParam()->P();
469 fTPCnsigma[0] = TMath::Abs(fESDpid->NumberOfSigmasTPC(tp, AliPID::kKaon));
472 // check TOF (only if momentum is large than function asymptote and flags are OK)
473 if (((tp->GetStatus() & AliESDtrack::kTOFout) != 0) && ((tp->GetStatus() & AliESDtrack::kTIME) != 0))
475 tp->GetIntegratedTimes(times);
476 tofTime = (Double_t)tp->GetTOFsignal();
477 tofRef = times[AliPID::kKaon];
478 if (tofRef > 0.0) fTOFdiff[0] = (tofTime - tofRef) / tofRef;
488 itsSignal = tp->GetITSsignal();
489 itsCluMap = tp->GetITSClusterMap();
491 for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS;
492 fITSnsigma[0] = itsrsp.GetNumberOfSigmas(fP[0], itsSignal, AliPID::kKaon, nITS, kTRUE);
495 // PID signal for track #2
496 // here it is enough to check if it is a TPC track
497 // since we excluded the case that it is neither a TPC+ITS nor an ITS-SA
498 if ((tp->GetStatus() & AliESDtrack::kTPCin) != 0)
501 fPTPC [1] = tn->GetInnerParam()->P();
502 fTPCnsigma[1] = TMath::Abs(fESDpid->NumberOfSigmasTPC(tn, AliPID::kKaon));
505 // check TOF (only if momentum is large than function asymptote and flags are OK)
506 if (((tn->GetStatus() & AliESDtrack::kTOFout) != 0) && ((tn->GetStatus() & AliESDtrack::kTIME) != 0))
508 tn->GetIntegratedTimes(times);
509 tofTime = (Double_t)tn->GetTOFsignal();
510 tofRef = times[AliPID::kKaon];
511 if (tofRef > 0.0) fTOFdiff[1] = (tofTime - tofRef) / tofRef;
521 itsSignal = tn->GetITSsignal();
522 itsCluMap = tn->GetITSClusterMap();
524 for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS;
525 fITSnsigma[1] = itsrsp.GetNumberOfSigmas(fP[1], itsSignal, AliPID::kKaon, nITS, kTRUE);
528 fRsnTreeComp->Fill();
532 // loop on like-sign pairs to compute invariant mass background
534 AliESDtrack *t1 = 0x0, *t2 = 0x0;
535 TLorentzVector v1, v2;
538 for (i1 = 0; i1 < npos; i1++)
540 t1 = esd->GetTrack(pos[i1]);
542 for (i2 = i1+1; i2 < npos; i2++)
544 t2 = esd->GetTrack(pos[i2]);
546 v1.SetXYZM(t1->Px(), t1->Py(), t1->Pz(), kmass);
547 v2.SetXYZM(t2->Px(), t2->Py(), t2->Pz(), kmass);
549 vref.SetXYZM(vsum.X(), vsum.Y(), vsum.Z(), phimass);
553 fIM = (Float_t)vsum.M();
554 fPt = (Float_t)vsum.Perp();
555 fEta = (Float_t)vsum.Eta();
556 fY = (Float_t)vref.Rapidity();
557 fITS[0] = itspos[i1];
558 fITS[1] = itspos[i2];
560 if (fIM < 0.9 || fIM > 5.0) continue;
561 if (fPt < 0.0 || fPt > 20.0) continue;
563 // PID signal for track #1
564 // here it is enough to check if it is a TPC track
565 // since we excluded the case that it is neither a TPC+ITS nor an ITS-SA
566 if ((t1->GetStatus() & AliESDtrack::kTPCin) != 0)
569 fPTPC [0] = t1->GetInnerParam()->P();
570 fTPCnsigma[0] = TMath::Abs(fESDpid->NumberOfSigmasTPC(t1, AliPID::kKaon));
573 // check TOF (only if momentum is large than function asymptote and flags are OK)
574 if (((t1->GetStatus() & AliESDtrack::kTOFout) != 0) && ((t1->GetStatus() & AliESDtrack::kTIME) != 0))
576 t1->GetIntegratedTimes(times);
577 tofTime = (Double_t)t1->GetTOFsignal();
578 tofRef = times[AliPID::kKaon];
579 if (tofRef > 0.0) fTOFdiff[0] = (tofTime - tofRef) / tofRef;
589 itsSignal = t1->GetITSsignal();
590 itsCluMap = t1->GetITSClusterMap();
592 for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS;
593 fITSnsigma[0] = itsrsp.GetNumberOfSigmas(fP[0], itsSignal, AliPID::kKaon, nITS, kTRUE);
596 // PID signal for track #2
597 // here it is enough to check if it is a TPC track
598 // since we excluded the case that it is neither a TPC+ITS nor an ITS-SA
599 if ((t1->GetStatus() & AliESDtrack::kTPCin) != 0)
602 fPTPC [1] = t2->GetInnerParam()->P();
603 fTPCnsigma[1] = TMath::Abs(fESDpid->NumberOfSigmasTPC(t2, AliPID::kKaon));
606 // check TOF (only if momentum is large than function asymptote and flags are OK)
607 if (((t2->GetStatus() & AliESDtrack::kTOFout) != 0) && ((t2->GetStatus() & AliESDtrack::kTIME) != 0))
609 t2->GetIntegratedTimes(times);
610 tofTime = (Double_t)t2->GetTOFsignal();
611 tofRef = times[AliPID::kKaon];
612 if (tofRef > 0.0) fTOFdiff[1] = (tofTime - tofRef) / tofRef;
622 itsSignal = t2->GetITSsignal();
623 itsCluMap = t2->GetITSClusterMap();
625 for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS;
626 fITSnsigma[1] = itsrsp.GetNumberOfSigmas(fP[1], itsSignal, AliPID::kKaon, nITS, kTRUE);
629 //fRsnTreeComp->Fill();
633 for (i1 = 0; i1 < nneg; i1++)
635 t1 = esd->GetTrack(neg[i1]);
637 for (i2 = i1+1; i2 < nneg; i2++)
639 t2 = esd->GetTrack(neg[i2]);
641 v1.SetXYZM(t1->Px(), t1->Py(), t1->Pz(), kmass);
642 v2.SetXYZM(t2->Px(), t2->Py(), t2->Pz(), kmass);
644 vref.SetXYZM(vsum.X(), vsum.Y(), vsum.Z(), phimass);
648 fIM = (Float_t)vsum.M();
649 fPt = (Float_t)vsum.Perp();
650 fEta = (Float_t)vsum.Eta();
651 fY = (Float_t)vref.Rapidity();
652 fITS[0] = itsneg[i1];
653 fITS[1] = itsneg[i2];
655 if (fIM < 0.9 || fIM > 5.0) continue;
656 if (fPt < 0.0 || fPt > 20.0) continue;
658 // PID signal for track #1
659 // here it is enough to check if it is a TPC track
660 // since we excluded the case that it is neither a TPC+ITS nor an ITS-SA
661 if ((t1->GetStatus() & AliESDtrack::kTPCin) != 0)
664 fPTPC [0] = t1->GetInnerParam()->P();
665 fTPCnsigma[0] = TMath::Abs(fESDpid->NumberOfSigmasTPC(t1, AliPID::kKaon));
668 // check TOF (only if momentum is large than function asymptote and flags are OK)
669 if (((t1->GetStatus() & AliESDtrack::kTOFout) != 0) && ((t1->GetStatus() & AliESDtrack::kTIME) != 0))
671 t1->GetIntegratedTimes(times);
672 tofTime = (Double_t)t1->GetTOFsignal();
673 tofRef = times[AliPID::kKaon];
674 if (tofRef > 0.0) fTOFdiff[0] = (tofTime - tofRef) / tofRef;
684 itsSignal = t1->GetITSsignal();
685 itsCluMap = t1->GetITSClusterMap();
687 for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS;
688 fITSnsigma[0] = itsrsp.GetNumberOfSigmas(fP[0], itsSignal, AliPID::kKaon, nITS, kTRUE);
691 // PID signal for track #2
692 // here it is enough to check if it is a TPC track
693 // since we excluded the case that it is neither a TPC+ITS nor an ITS-SA
694 if ((t1->GetStatus() & AliESDtrack::kTPCin) != 0)
697 fPTPC [1] = t2->GetInnerParam()->P();
698 fTPCnsigma[1] = TMath::Abs(fESDpid->NumberOfSigmasTPC(t2, AliPID::kKaon));
701 // check TOF (only if momentum is large than function asymptote and flags are OK)
702 if (((t2->GetStatus() & AliESDtrack::kTOFout) != 0) && ((t2->GetStatus() & AliESDtrack::kTIME) != 0))
704 t2->GetIntegratedTimes(times);
705 tofTime = (Double_t)t2->GetTOFsignal();
706 tofRef = times[AliPID::kKaon];
707 if (tofRef > 0.0) fTOFdiff[1] = (tofTime - tofRef) / tofRef;
717 itsSignal = t2->GetITSsignal();
718 itsCluMap = t2->GetITSClusterMap();
720 for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITS;
721 fITSnsigma[1] = itsrsp.GetNumberOfSigmas(fP[1], itsSignal, AliPID::kKaon, nITS, kTRUE);
724 //fRsnTreeComp->Fill();
728 PostData(1, fRsnTreeComp);
731 //__________________________________________________________________________________________________
732 void AliRsnAnalysisPhi7TeVNoPID::ProcessMC(AliStack *stack)
735 // Function to process stack only
739 Int_t nPart = stack->GetNtrack();
741 // loop to compute invariant mass
744 Double_t kmass = pid.ParticleMass(AliPID::kKaon);
745 Double_t phimass = 1.019455;
746 TParticle *partp = 0x0, *partn = 0x0;
747 TLorentzVector vp, vn, vsum, vref;
749 for (ip = 0; ip < nPart; ip++)
751 partp = stack->Particle(ip);
752 if (partp->GetPdgCode() != 321) continue;
754 for (in = 0; in < nPart; in++)
756 partn = stack->Particle(in);
757 if (partn->GetPdgCode() != -321) continue;
760 if (partp->GetFirstMother() == partn->GetFirstMother())
762 if (partp->GetFirstMother() > 0)
764 TParticle *mum = stack->Particle(partp->GetFirstMother());
765 fPDG = mum->GetPdgCode();
768 fPDG = TMath::Abs(fPDG);
769 if (fPDG != 333) continue;
771 vp.SetXYZM(partp->Px(), partp->Py(), partp->Pz(), kmass);
772 vn.SetXYZM(partn->Px(), partn->Py(), partn->Pz(), kmass);
774 vref.SetXYZM(vsum.X(), vsum.Y(), vsum.Z(), phimass);
776 fIM = (Float_t)vsum.M();
777 fPt = (Float_t)vsum.Perp();
778 fEta = (Float_t)vsum.Eta();
779 fY = (Float_t)vref.Rapidity();
781 fRsnTreeTrue->Fill();
785 PostData(2, fRsnTreeTrue);