1 /**************************************************************************
2 * Contributors are not mentioned at all. *
4 * Permission to use, copy, modify and distribute this software and its *
5 * documentation strictly for non-commercial purposes is hereby granted *
6 * without fee, provided that the above copyright notice appears in all *
7 * copies and that both the copyright notice and this permission notice *
8 * appear in the supporting documentation. The authors make no claims *
9 * about the suitability of this software for any purpose. It is *
10 * provided "as is" without express or implied warranty. *
11 **************************************************************************/
13 //-----------------------------------------------------------------
14 // AliAnalysisTaskHelium3Pi class
15 //-----------------------------------------------------------------
22 #include "AliAnalysisManager.h"
23 #include <AliMCEventHandler.h>
24 #include <AliMCEvent.h>
31 class AliCascadeVertexer;
34 #include "AliAnalysisTaskSE.h"
46 #include "Riostream.h"
48 #include "AliCascadeVertexer.h"
49 #include "AliESDEvent.h"
50 #include "AliESDtrack.h"
51 #include "AliExternalTrackParam.h"
52 #include "AliAODEvent.h"
53 #include "AliInputEventHandler.h"
54 #include "AliESDcascade.h"
55 #include "AliAODcascade.h"
56 #include "AliAnalysisTaskHelium3PiMC.h"
57 #include "AliESDtrackCuts.h"
58 #include "AliCentrality.h"
65 const Int_t AliAnalysisTaskHelium3PiMC::fgNrot = 15;
68 ClassImp(AliAnalysisTaskHelium3PiMC)
70 //________________________________________________________________________
71 AliAnalysisTaskHelium3PiMC::AliAnalysisTaskHelium3PiMC()
72 : AliAnalysisTaskSE(),
77 fHistEventMultiplicity(0),
78 fHistTrackMultiplicity(0),
79 fHistMCMultiplicityTracks(0),
83 fHistMCDecayPosition(0),
85 fhRigidityHevsMomPiMC(0),
86 fhRigidityHevsMomPiRec(0),
101 fhBBTPCNegativePions(0),
102 fhBBTPCPositivePions(0),
105 fHistPercentileVsTrackNumber(0),
115 // Dummy Constructor(0);
118 //________________________________________________________________________
119 AliAnalysisTaskHelium3PiMC::AliAnalysisTaskHelium3PiMC(const char *name)
120 : AliAnalysisTaskSE(name),
121 fAnalysisType("ESD"),
122 fCollidingSystems(0),
125 fHistEventMultiplicity(0),
126 fHistTrackMultiplicity(0),
127 fHistMCMultiplicityTracks(0),
131 fHistMCDecayPosition(0),
133 fhRigidityHevsMomPiMC(0),
134 fhRigidityHevsMomPiRec(0),
149 fhBBTPCNegativePions(0),
150 fhBBTPCPositivePions(0),
153 fHistPercentileVsTrackNumber(0),
164 // Define input and output slots here
165 // Input slot #0 works with a TChain
166 //DefineInput(0, TChain::Class());
167 // Output slot #0 writes into a TList container (Cascade)
168 DefineOutput(1, TList::Class());
170 //_______________________________________________________
171 AliAnalysisTaskHelium3PiMC::~AliAnalysisTaskHelium3PiMC()
174 if (fListHistCascade) {
175 delete fListHistCascade;
176 fListHistCascade = 0;
180 //=================DEFINITION BETHE BLOCH==============================
182 Double_t AliAnalysisTaskHelium3PiMC::BetheBloch(Double_t betaGamma,Double_t charge,Bool_t isPbPb) {
184 Double_t kp1, kp2, kp3, kp4, kp5;
188 //pass2 //to be checked
189 kp1 = 5.2*charge*charge;
190 kp2 = 8.98482806165147636e+00;
191 kp3 = 1.54000000000000005e-05;
192 kp4 = 2.30445734159456084e+00;
193 kp5 = 2.25624744086878559e+00;
200 //pass2 // to be defined
201 kp1 = 5.2*charge*charge;
202 kp2 = 8.98482806165147636e+00;
203 kp3 = 1.54000000000000005e-05;
204 kp4 = 2.30445734159456084e+00;
205 kp5 = 2.25624744086878559e+00;
209 Double_t beta = betaGamma / TMath::Sqrt(1.0 + betaGamma * betaGamma);
211 Double_t aa = TMath::Power(beta, kp4);
212 Double_t bb = TMath::Power(1.0 / betaGamma, kp5);
214 bb = TMath::Log(kp3 + bb);
216 Double_t out = (kp2 - aa - bb) * kp1 / aa;
222 //==================DEFINITION OF OUTPUT OBJECTS==============================
224 void AliAnalysisTaskHelium3PiMC::UserCreateOutputObjects()
226 fListHistCascade = new TList();
227 fListHistCascade->SetOwner(); // IMPORTANT!
229 if(! fHistEventMultiplicity ){
230 fHistEventMultiplicity = new TH1F( "fHistEventMultiplicity" , "Nb of Events" , 6 , -1, 5 );
231 fHistEventMultiplicity->GetXaxis()->SetTitle("Event Type");
232 fListHistCascade->Add(fHistEventMultiplicity);
235 if(! fHistTrackMultiplicity ){
237 fHistTrackMultiplicity = new TH1F( "fHistTrackMultiplicity" , "Nb of Tracks" , 25000,0, 25000 );
238 fHistTrackMultiplicity->GetXaxis()->SetTitle("Number of tracks");
239 fListHistCascade->Add(fHistTrackMultiplicity);
242 if(! fHistMCMultiplicityTracks){
243 fHistMCMultiplicityTracks =new TH1F("fHistMCMultiplicityTracks","MC Multiplicity Tracks",1000,0,1000);
244 fHistMCMultiplicityTracks->GetXaxis()->SetTitle("MC Number of tracks");
245 fListHistCascade->Add(fHistMCMultiplicityTracks);
248 fHistMCEta=new TH1F("fHistMCEta","MC eta",1000,-3,3);
249 fHistMCEta->GetXaxis()->SetTitle("Injected Eta");
250 fListHistCascade->Add(fHistMCEta);
253 fHistMCPt =new TH1F("fHistMCPt","MC pt",1000,0,20);
254 fHistMCPt->GetXaxis()->SetTitle("Injected Pt");
255 fListHistCascade->Add(fHistMCPt);
258 fHistMCTheta=new TH1F("fHistMCTheta","MC theta",1000,-6,6);
259 fHistMCTheta->GetXaxis()->SetTitle("Injected Theta");
260 fListHistCascade->Add(fHistMCTheta);
262 if(!fHistMCDecayPosition){
263 fHistMCDecayPosition =new TH1F("fHistMCDecayPosition","MC Decay Position",10000,0,1000);
264 fHistMCDecayPosition->GetXaxis()->SetTitle("Decay Position");
265 fListHistCascade->Add(fHistMCDecayPosition);
267 if(!fHistMCDecayRho ){
268 fHistMCDecayRho =new TH1F("fHistMCDecayRho","MC decay position 3d",10000,0,1000);
269 fHistMCDecayRho->GetXaxis()->SetTitle("Decay rho");
270 fListHistCascade->Add(fHistMCDecayRho);
273 if(!fhRigidityHevsMomPiMC ){
274 fhRigidityHevsMomPiMC=new TH2F("fhRigidityHevsMomPiMC","Rigidity He vs Mom Pi MC",20,0,10,300,0,30);
275 fhRigidityHevsMomPiMC->GetXaxis()->SetTitle("He3 Rigidity");
276 fhRigidityHevsMomPiMC->GetYaxis()->SetTitle("Pi momentum");
277 fListHistCascade->Add(fhRigidityHevsMomPiMC);
280 if(! fhRigidityHevsMomPiRec){
281 fhRigidityHevsMomPiRec=new TH2F("fhRigidityHevsMomPiRec","Rigidity He vs Mom Pi Rec",20,0,10,300,0,30);
282 fhRigidityHevsMomPiRec->GetXaxis()->SetTitle("He3 Rigidity");
283 fhRigidityHevsMomPiRec->GetYaxis()->SetTitle("Pi momentum");
284 fListHistCascade->Add(fhRigidityHevsMomPiRec);
288 fhInvMassMC=new TH1F("fhInvMassMC","fhInvMassMC",800,2.,6.);
289 fhInvMassMC->GetXaxis()->SetTitle("(He3,#pi) InvMass");
290 fListHistCascade->Add(fhInvMassMC);
294 fhInvMassMum=new TH1F("fhInvMassMum","fhInvMassMum",800,2.,6.);
295 fhInvMassMum->GetXaxis()->SetTitle("(He3,#pi) InvMass");
296 fListHistCascade->Add(fhInvMassMum);
300 fhInvMassRec=new TH1F("fhInvMassRec","fhInvMassRec",800,2.,6.);
301 fhInvMassRec->GetXaxis()->SetTitle("(He3,#pi) InvMass");
302 fListHistCascade->Add(fhInvMassRec);
306 fhInvMassRec1=new TH1F("fhInvMassRec1","No Altri tagli",800,2.,6.);
307 fhInvMassRec1->GetXaxis()->SetTitle("(He3,#pi) InvMass");
308 fListHistCascade->Add(fhInvMassRec1);
311 fhInvMassRec2=new TH1F("fhInvMassRec2","DCA pi > 0.1",800,2.,6.);
312 fhInvMassRec2->GetXaxis()->SetTitle("(He3,#pi) InvMass");
313 fListHistCascade->Add(fhInvMassRec2);
316 fhInvMassRec3=new TH1F("fhInvMassRec3","DCA He > 0.05",800,2.,6.);
317 fhInvMassRec3->GetXaxis()->SetTitle("(He3,#pi) InvMass");
318 fListHistCascade->Add(fhInvMassRec3);
321 fhInvMassRec4=new TH1F("fhInvMassRec4","DCA tracks < 1 cm",800,2.,6.);
322 fhInvMassRec4->GetXaxis()->SetTitle("(He3,#pi) InvMass");
323 fListHistCascade->Add(fhInvMassRec4);
326 fhInvMassRec5=new TH1F("fhInvMassRec5","Condizione xn+xp",800,2.,6.);
327 fhInvMassRec5->GetXaxis()->SetTitle("(He3,#pi) InvMass");
328 fListHistCascade->Add(fhInvMassRec5);
331 fhInvMassRec6=new TH1F("fhInvMassRec6","Ho fatto V0 ",800,2.,6.);
332 fhInvMassRec6->GetXaxis()->SetTitle("(He3,#pi) InvMass");
333 fListHistCascade->Add(fhInvMassRec6);
336 fhInvMassRec7=new TH1F("fhInvMassRec7","V0+Taglio CPA",800,2.,6.);
337 fhInvMassRec7->GetXaxis()->SetTitle("(He3,#pi) InvMass");
338 fListHistCascade->Add(fhInvMassRec7);
341 if(!fhHeMCRigidity ){
342 fhHeMCRigidity=new TH1F("fhHeMCRigidity","He3 rigidity distribution",200,0,20);
343 fhHeMCRigidity->GetXaxis()->SetTitle("He3 rigidity");
344 fListHistCascade->Add(fhHeMCRigidity);
347 fhPioneMC=new TH1F("hPioneMC","Pion mom distribution",200,0,50);
348 fhPioneMC->GetXaxis()->SetTitle("Pion momentum");
349 fListHistCascade->Add(fhPioneMC);
353 hBBTPCnoCuts=new TH2F("hBBTPCnoCuts","scatterPlot TPC no cuts",2000,-10,10,1000,0,3000);
354 hBBTPCnoCuts->GetXaxis()->SetTitle("p/Z (GeV/#it{c})");
355 hBBTPCnoCuts->GetYaxis()->SetTitle("TPC Signal (a.u)");
356 fListHistCascade->Add(hBBTPCnoCuts);
359 fhBBTPC=new TH2F("fhBBTPC","scatterPlot TPC",2000,-10,10,1000,0,3000);
360 fhBBTPC->GetXaxis()->SetTitle("p/Z (GeV/#it{c})");
361 fhBBTPC->GetYaxis()->SetTitle("TPC Signal (a.u)");
362 fListHistCascade->Add(fhBBTPC);
364 if(!fhBBTPCNegativePions ){
365 fhBBTPCNegativePions=new TH2F("fhBBTPCNegativePions","scatterPlot Neg Pions",2000,-10,10,1000,0,3000);
366 fhBBTPCNegativePions->GetXaxis()->SetTitle("p/Z (GeV/#it{c})");
367 fhBBTPCNegativePions->GetYaxis()->SetTitle("TPC Signal (a.u)");
368 fListHistCascade->Add(fhBBTPCNegativePions);
370 if(!fhBBTPCPositivePions ){
371 fhBBTPCPositivePions=new TH2F("fhBBTPCPositivePions","scatterPlot Pos Pions",2000,-10,10,1000,0,3000);
372 fhBBTPCPositivePions->GetXaxis()->SetTitle("p/Z (GeV/#it{c})");
373 fhBBTPCPositivePions->GetYaxis()->SetTitle("TPC Signal (a.u)");
374 fListHistCascade->Add(fhBBTPCPositivePions);
377 fhBBTPCHe3=new TH2F("fhBBTPCHe3","scatterPlot TPC - He3",2000,-10,10,1000,0,3000);
378 fhBBTPCHe3->GetXaxis()->SetTitle("p/Z (GeV/#it{c})");
379 fhBBTPCHe3->GetYaxis()->SetTitle("TPC Signal (a.u)");
380 fListHistCascade->Add(fhBBTPCHe3);
383 fHistProvaDCA=new TH2F("fHistProvaDCA","fHistProvaDCA",1000,-50,50,1000,0,100);
384 fHistProvaDCA->GetXaxis()->SetTitle("xn+xp");
385 fHistProvaDCA->GetYaxis()->SetTitle("dca tracks");
386 fListHistCascade->Add(fHistProvaDCA);
389 if(!hITSClusterMap ){
390 hITSClusterMap=new TH1F("hITSClusterMap","hITSClusterMap",65,-1,64);
391 fListHistCascade->Add(hITSClusterMap);
394 if(!fHistPercentileVsTrackNumber){
395 fHistPercentileVsTrackNumber=new TH2F("fHistPercentileVsTrackNumber","fHistPercentileVsTrackNumber",120,-3,117,2500,0,25000);
396 fHistPercentileVsTrackNumber->GetXaxis()->SetTitle("Percentile");
397 fHistPercentileVsTrackNumber->GetYaxis()->SetTitle("Tracks Number");
398 fListHistCascade->Add(fHistPercentileVsTrackNumber);
402 fhHeDCAXY=new TH1F("fhHeDCAXY","fhHeDCAXY",800,-4,4);
403 fListHistCascade->Add(fhHeDCAXY);
406 fhHeDCAZ=new TH1F("fhHeDCAZ","fhHeDCAZ",800,-30,30);
407 fListHistCascade->Add(fhHeDCAZ);
410 fhPiDCAXY=new TH1F("fhPiDCAXY","fhPiDCAXY",800,-4,4);
411 fListHistCascade->Add(fhPiDCAXY);
414 fhPiDCAZ=new TH1F("fhPiDCAZ","fhPiDCAZ",800,-30,30);
415 fListHistCascade->Add(fhPiDCAZ);
419 fNtuple1 = new TNtuple("fNtuple1","Ntuple1","runNumber:evNumber:TrackNumber:percentile:xPrimaryVertex:yPrimaryVertex:zPrimaryVertex:xSecondaryVertex:ySecondaryVertex:zSecondaryVertex:dcaTracks:CosPointingAngle:DCAV0toPrimaryVertex:HeSign:HepInTPC:HeTPCsignal:DcaHeToPrimVertex:HeEta:momHex:momHey:momHez:momHeAtSVx:momHeAtSVy:momHeAtSVz:HeTPCNcls:HeimpactXY:HeimpactZ:isTOFHe:HeBeta:HeITSClusterMap:IsHeITSRefit:PionSign:PionpInTPC:PionTPCsignal:DcaPionToPrimVertex:PionEta:momPionx:momPiony:momPionz:momNegPionAtSVx:momNegPionAtSVy:momNegPionAtSVz:PionTPCNcls:PionimpactXY:PionimpactZ:isTOFPion:PionBeta:PionITSClusterMap:IsPiITSRefit:PDGCodeNeg:PDCCodePos:motherPDGNeg:motherPDGPos:labelPi:labelHe:mumidNeg:mumidPos");
421 fListHistCascade->Add(fNtuple1);
426 fNtuple2 = new TNtuple("fNtuple2","Ntuple2","run:event:iMC:Centrality:PVx:PVy:PVz:PDGcodeMum:MotherIndex:SVxD0:SVyD0:SVzD0:SVxD1:SVyD1:SVzD1:SV3d:EtaMum:YMum:ThetaMum:PhiMum:PxMum:PyMum:PzMum:PdgDaughter0:PdgDaughter1:PxD0:PyD0:PzD0:PxD1:PyD1:PzD1");
428 fListHistCascade->Add(fNtuple2);
431 PostData(1,fListHistCascade);
433 }// end UserCreateOutputObjects
437 //====================== USER EXEC ========================
439 void AliAnalysisTaskHelium3PiMC::UserExec(Option_t *)
441 //_______________________________________________________________________
443 //!*********************!//
444 //! Define variables !//
445 //!*********************!//
447 for(Int_t i=0;i<60;i++) vett1[i]=0;
450 for(Int_t i=0;i<40;i++) vett2[i]=0;
453 Double_t pinTPC=0.,TPCSignal=0.;
454 Double_t xPrimaryVertex=0.,yPrimaryVertex=0.,zPrimaryVertex=0.;
460 Bool_t isTPC=kFALSE,isTOFHe3=kFALSE,isTOFPi=kFALSE;
462 Double_t fPos[3]={0.,0.,0.};
463 Double_t runNumber=0.;
464 Double_t evNumber=0.;
466 Int_t id0 = 0, id1 = 0;
467 Double_t mcDecayPosXD0 = 0, mcDecayPosYD0 = 0, mcDecayPosR = 0, mcDecayPosZD0 =0, mcDecayPosRho=0.;
468 Double_t mcDecayPosXD1 = 0, mcDecayPosYD1 = 0, mcDecayPosZD1 =0;
470 Double_t lEtaCurrentPart =0., lPtCurrentPart = 0.,lThetaCurrentPart = 0., lPhiCurrentPart = 0.;
471 Int_t iCurrentMother = 0;
472 Double_t mcPosX = 0., mcPosY = 0.,mcPosZ = 0.;
474 Double_t lPdgCurrentDaughter0 = 0, lPdgCurrentDaughter1= 0., /*lPdgCurrentMother=0.,*/lPdgCurrentDaughter =0;
476 Double_t PxD0 = 0, PyD0 = 0,PzD0 = 0;
477 Double_t PxD1 = 0, PyD1 = 0,PzD1 = 0;
480 Int_t lPdgcodeCurrentPart = 0;
481 //!----------------------------------------------------------------
483 //! A set of very loose parameters for cuts
485 Double_t fgChi2max=33.; //! max chi2
486 Double_t fgDNmin=0.05; //! min imp parameter for the 1st daughter = 500um
487 Double_t fgDCAmax=1.; //! max DCA between the daughter tracks in cm
488 Double_t fgCPAmin=0.9; //! min cosine of V0's pointing angle
489 Double_t fgRmin=0.1; //! min radius of the fiducial volume = 1 mm
490 Double_t fgRmax=200.; //! max radius of the fiducial volume = 2 m
492 //------------------------------------------
493 // create pointer to event
495 AliVEvent *event = InputEvent();
496 if (!event) { Printf("ERROR: Could not retrieve event"); return; }
500 // AliVEvent *lESDevent = InputEvent();
502 // Printf("ERROR: Could not retrieve event");
506 Info("AliAnalysisTaskHelium3PiMC","Starting UserExec");
510 if(fDataType == "SIM") {
513 // Called for EACH event
514 AliMCEvent *mcEvent = MCEvent();
516 Printf("ERROR: Could not retrieve MC event");
520 Printf("MC particles: %d", mcEvent->GetNumberOfTracks());
522 // set up a stack for use in check for primary/stable particles
523 stack = mcEvent->Stack();
524 if( !stack ) { Printf( "Stack not available"); return; }
528 Printf( "This Task Works Only on Simulation");
531 AliESDEvent *lESDevent = 0;
533 //********************************** Connect to the InputEvent ******//
535 //Int_t TrackNumber = 0;
536 if(fAnalysisType == "ESD"){
537 lESDevent = dynamic_cast<AliESDEvent*>(event);
539 Printf("ERROR: lESDevent not available \n");
545 Printf("This Analysis Works Only for ESD\n");
549 //*****************//
551 //*****************//
553 AliCentrality *centrality = (AliCentrality*)lESDevent->GetCentrality();
555 Float_t percentile=centrality->GetCentralityPercentile("V0M");
557 //------------------------------
559 runNumber = lESDevent->GetRunNumber();
560 evNumber =lESDevent->GetEventNumberInFile();
562 //---------------------
564 // Int_t primary = stack->GetNprimary();
567 lNbMCPart = stack->GetNtrack();
569 fHistMCMultiplicityTracks->Fill(lNbMCPart); //histo
571 TArrayD MomPionsMC(lNbMCPart); //Neg pions
573 TArrayD MomHeMC(lNbMCPart); //helium3
576 //------ Trimomento pion
577 TArrayD PxPionsMC(lNbMCPart);
579 TArrayD PyPionsMC(lNbMCPart);
581 TArrayD PzPionsMC(lNbMCPart);
583 //------ Trimomento He
584 TArrayD PxHeMC(lNbMCPart);
586 TArrayD PyHeMC(lNbMCPart);
588 TArrayD PzHeMC(lNbMCPart);
593 Double_t Helium3Mass = 2.80839;
594 Double_t PionMass = 0.13957;
596 TLorentzVector vPionMC,vHeliumMC,vSumMC;
597 TLorentzVector vPionMum,vHeliumMum,vSumMum;
598 TLorentzVector vPionRec,vHeliumRec,vSumRec;
599 Bool_t isTwoBody=kFALSE;
601 for (Int_t iMC=0; iMC<stack->GetNtrack(); iMC++)
603 TParticle *p0 = stack->Particle(iMC);
606 //Printf("ERROR: particle with label %d not found in stack (mc loop)", iMc);
610 lPdgcodeCurrentPart = p0->GetPdgCode();
612 if(lPdgcodeCurrentPart == 1000020030 || lPdgcodeCurrentPart == -1000020030 ){
614 MomHeMC[nHeMC++]=p0->P();
616 PxHeMC[nPxHeMC++]=p0->Px();
617 PyHeMC[nPyHeMC++]=p0->Py();
618 PzHeMC[nPzHeMC++]=p0->Pz();
620 fhHeMCRigidity->Fill(p0->P()/2);
623 if(lPdgcodeCurrentPart == 211 || lPdgcodeCurrentPart == -211 ){
625 MomPionsMC[nPionsMC++]=p0->P();
627 PxPionsMC[nPxPionsMC++]=p0->Px();
628 PyPionsMC[nPyPionsMC++]=p0->Py();
629 PzPionsMC[nPzPionsMC++]=p0->Pz();
631 fhPioneMC->Fill(p0->P());
634 if ( lPdgcodeCurrentPart == 1010010030 || lPdgcodeCurrentPart == -1010010030 ){
636 lEtaCurrentPart = p0->Eta();
637 lPtCurrentPart = p0->Pt();
638 lThetaCurrentPart = p0->Theta();
639 lPhiCurrentPart = p0->Phi();
640 iCurrentMother = p0->GetFirstMother();
642 fHistMCEta->Fill(lEtaCurrentPart);
643 fHistMCPt->Fill(lPtCurrentPart);
644 fHistMCTheta->Fill(lThetaCurrentPart);
646 // if (iCurrentMother == -1){lPdgCurrentMother=0; } else {lPdgCurrentMother = stack->Particle(iCurrentMother)->GetPdgCode();}
654 for(Int_t i=p0->GetFirstDaughter(); i<= p0->GetLastDaughter(); i++){
655 TParticle *pDaughter = stack->Particle(i);
656 lPdgCurrentDaughter= pDaughter->GetPdgCode();
657 cout<<lPdgCurrentDaughter<<endl;
658 if(lPdgCurrentDaughter == 1000020030 || lPdgCurrentDaughter ==-1000020030 ){
666 for(Int_t i=p0->GetFirstDaughter(); i<= p0->GetLastDaughter(); i++){
668 TParticle *pDaughter = stack->Particle(i);
670 lPdgCurrentDaughter= pDaughter->GetPdgCode();
672 if(lPdgCurrentDaughter == 211 || lPdgCurrentDaughter == -211 ){
676 if(lPdgCurrentDaughter == 1000020030 || lPdgCurrentDaughter == -1000020030 ){
681 TParticle *pDaughter0 = stack->Particle(id0);
682 TParticle *pDaughter1 = stack->Particle(id1);
683 lPdgCurrentDaughter0 = pDaughter0->GetPdgCode();
684 lPdgCurrentDaughter1 = pDaughter1->GetPdgCode();
686 // Decay Radius and Production Radius
688 if ( id0 <= lNbMCPart && id0 > 0 && id1 <= lNbMCPart && id1 > 0) {
690 lPdgCurrentDaughter0 = pDaughter0->GetPdgCode();
691 lPdgCurrentDaughter1 = pDaughter1->GetPdgCode();
693 PxD0 = pDaughter0->Px();
694 PyD0 = pDaughter0->Py();
695 PzD0 = pDaughter0->Pz();
697 PxD1 = pDaughter1->Px();
698 PyD1 = pDaughter1->Py();
699 PzD1 = pDaughter1->Pz();
701 mcDecayPosXD0 = pDaughter0->Vx();
702 mcDecayPosYD0 = pDaughter0->Vy();
703 mcDecayPosZD0 = pDaughter0->Vz();
705 mcDecayPosXD1 = pDaughter0->Vx();
706 mcDecayPosYD1 = pDaughter0->Vy();
707 mcDecayPosZD1 = pDaughter0->Vz();
709 mcDecayPosR = TMath::Sqrt(mcDecayPosXD0*mcDecayPosXD0+mcDecayPosYD0*mcDecayPosYD0);
710 fHistMCDecayPosition->Fill(mcDecayPosR);
712 mcDecayPosRho = TMath::Sqrt(mcDecayPosXD0*mcDecayPosXD0+mcDecayPosYD0*mcDecayPosYD0+mcDecayPosZD0*mcDecayPosZD0);
713 fHistMCDecayRho->Fill(mcDecayPosRho);
715 //---- Initial mass Test
717 vHeliumMum.SetXYZM(PxD1,PyD1,PzD1,Helium3Mass);
718 vPionMum.SetXYZM(PxD0,PyD0,PzD0,PionMass);
719 vSumMum=vHeliumMum+vPionMum;
721 fhInvMassMum->Fill(vSumMum.M());
723 //Ntupla hyper triton
725 vett2[0]=(Float_t)lESDevent->GetRunNumber();
726 vett2[1]=(Float_t)lESDevent->GetEventNumberInFile();
727 vett2[2]=(Float_t)iMC;
728 vett2[3]=(Float_t)percentile;
729 vett2[4]=(Float_t)mcPosX;
730 vett2[5]=(Float_t)mcPosY;
731 vett2[6]=(Float_t)mcPosZ;
732 vett2[7]=(Float_t)lPdgcodeCurrentPart;
733 vett2[8]=(Float_t)iCurrentMother;
734 vett2[9]=(Float_t)mcDecayPosXD0;
735 vett2[10]=(Float_t)mcDecayPosYD0;
736 vett2[11]=(Float_t)mcDecayPosZD0;
737 vett2[12]=(Float_t)mcDecayPosXD1;
738 vett2[13]=(Float_t)mcDecayPosYD1;
739 vett2[14]=(Float_t)mcDecayPosZD1;
740 vett2[15]=(Float_t)mcDecayPosRho;
741 vett2[16]=(Float_t)lEtaCurrentPart;
742 vett2[17]=(Float_t)p0->Y();
743 vett2[18]=(Float_t)lThetaCurrentPart;
744 vett2[19]=(Float_t)lPhiCurrentPart;
745 vett2[20]=(Float_t)p0->Px();
746 vett2[21]=(Float_t)p0->Py();
747 vett2[22]=(Float_t)p0->Pz();
748 vett2[23]=(Float_t)lPdgCurrentDaughter0;
749 vett2[24]=(Float_t)lPdgCurrentDaughter1;
750 vett2[25]=(Float_t)PxD0; //pion
751 vett2[26]=(Float_t)PyD0;
752 vett2[27]=(Float_t)PzD0;
753 vett2[28]=(Float_t)PxD1; //He3
754 vett2[29]=(Float_t)PyD1;
755 vett2[30]=(Float_t)PzD1;
757 fNtuple2->Fill(vett2);
759 }//if check daughters index
762 } // Kinetic Track loop ends here
764 // Loop phase - space
767 Double_t PionMomMC=0;
768 Double_t PxHeMc=0, PyHeMc=0,PzHeMc=0;
769 Double_t PxPionMc=0, PyPionMc=0,PzPionMc=0;
771 for(Int_t l=0; l < nHeMC; l++){
779 for(Int_t k=0; k < nPionsMC; k++){
781 PionMomMC=MomPionsMC[k];
783 PxPionMc=PxPionsMC[k];
784 PyPionMc=PyPionsMC[k];
785 PzPionMc=PzPionsMC[k];
787 fhRigidityHevsMomPiMC->Fill(HeMomMC/2,PionMomMC);
789 vHeliumMC.SetXYZM(PxHeMc,PyHeMc,PzHeMc,Helium3Mass);
790 vPionMC.SetXYZM(PxPionMc,PyPionMc,PzPionMc,PionMass);
791 vSumMC=vHeliumMC+vPionMC;
793 fhInvMassMC->Fill(vSumMC.M());
797 } // end loop phase space
799 //-------------- RECONSTRUCTION -------------------
801 fHistEventMultiplicity->Fill(0);
803 Double_t lMagneticField=lESDevent->GetMagneticField();
805 Int_t TrackNumber = -1;
807 // ANALISYS reconstructed tracks
809 // Primary vertex cut
811 const AliESDVertex *vtx = lESDevent->GetPrimaryVertexTracks();
813 if(vtx->GetNContributors()<1) {
816 vtx = lESDevent->GetPrimaryVertexSPD();
818 if(vtx->GetNContributors()<1) {
819 Info("AliAnalysisTaskHelium3PiMC","No good vertex, skip event");
820 return; // NO GOOD VERTEX, SKIP EVENT
824 fHistEventMultiplicity->Fill(1); // analyzed events with PV
826 xPrimaryVertex=vtx->GetXv();
827 yPrimaryVertex=vtx->GetYv();
828 zPrimaryVertex=vtx->GetZv();
830 TrackNumber = lESDevent->GetNumberOfTracks();
831 fHistTrackMultiplicity->Fill(TrackNumber); //tracce per evento
833 fHistPercentileVsTrackNumber->Fill(percentile,TrackNumber);
835 if (TrackNumber<2) return;
837 fHistEventMultiplicity->Fill(2);
839 //Find Pair candidates
841 TArrayI PionsTPC(TrackNumber); //Neg pions
844 TArrayI HeTPC(TrackNumber); //helium3
847 // find pairs candidates phase daughter tracks rec
849 TArrayD MomPionsRec(TrackNumber); //Neg pions
852 TArrayD MomHeRec(TrackNumber); //helium3
855 //------ Trimomento pion
856 TArrayD PxPionsRec(TrackNumber);
858 TArrayD PyPionsRec(TrackNumber);
860 TArrayD PzPionsRec(TrackNumber);
863 //------ Trimomento He
864 TArrayD PxHeRec(TrackNumber);
866 TArrayD PyHeRec(TrackNumber);
868 TArrayD PzHeRec(TrackNumber);
871 Float_t impactXY=-999, impactZ=-999;
872 Float_t impactXYpi=-999, impactZpi=-999;
876 Int_t motherPDGNeg=0;
877 Int_t motherPDGPos=0;
885 // ******************* Track Cuts Definitions ********************//
889 AliESDtrackCuts* esdtrackCutsITS = new AliESDtrackCuts("esdtrackCutsITS");
890 esdtrackCutsITS->SetRequireITSStandAlone(kFALSE);
891 esdtrackCutsITS->SetRequireITSPureStandAlone(kFALSE);
896 Double_t maxchi2perTPCcl=5.;
898 AliESDtrackCuts* esdtrackCutsTPC = new AliESDtrackCuts("esdtrackCutsTPC");
899 esdtrackCutsTPC->SetRequireTPCRefit(kTRUE);
900 esdtrackCutsTPC->SetAcceptKinkDaughters(kFALSE);
901 esdtrackCutsTPC->SetMinNClustersTPC(minclsTPC);
902 esdtrackCutsTPC->SetMaxChi2PerClusterTPC(maxchi2perTPCcl);
904 //*************************************************************
906 for (Int_t j=0; j<TrackNumber; j++) { //loop on tracks
908 AliESDtrack *esdtrack=lESDevent->GetTrack(j);
911 AliError(Form("ERROR: Could not retrieve esdtrack %d",j));
915 hBBTPCnoCuts->Fill(esdtrack->GetSign()*esdtrack->P(),esdtrack->GetTPCsignal());
917 // ************** Track cuts ****************
919 status = (ULong_t)esdtrack->GetStatus();
921 isTPC = (((status) & (AliESDtrack::kTPCin)) != 0);
923 Bool_t IsTrackAcceptedTPC = esdtrackCutsTPC->AcceptTrack(esdtrack);
924 Bool_t IsTrackAcceptedITS = esdtrackCutsITS->AcceptTrack(esdtrack);
926 if (!(IsTrackAcceptedTPC && IsTrackAcceptedITS)) continue;
928 //----------------------------------------------
930 //****** Cuts from AliV0Vertex.cxx *************
932 Double_t d=esdtrack->GetD(xPrimaryVertex,yPrimaryVertex,lMagneticField);
933 // if (TMath::Abs(d)<fgDPmin) continue;
934 if (TMath::Abs(d)>fgRmax) continue;
936 //---- (Usefull) Stuff
938 TPCSignal=esdtrack->GetTPCsignal();
940 if (TPCSignal<10)continue;
944 if(!esdtrack->GetTPCInnerParam())continue;
946 AliExternalTrackParam trackIn(*esdtrack->GetInnerParam());
947 pinTPC = trackIn.GetP();
949 fhBBTPC->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
951 d=esdtrack->GetD(xPrimaryVertex,yPrimaryVertex,lMagneticField);
952 // if (TMath::Abs(d)<fgDPmin) continue;
953 if (TMath::Abs(d)>fgRmax) continue;
955 label = TMath::Abs(esdtrack->GetLabel());
957 if (label>=10000000) {
958 // Underlying event. 10000000 is the
959 // value of fkMASKSTEP in AliRunDigitizer
960 cout <<"Strange, there should be no underlying event"<<endl;
964 if (label>=lNbMCPart) {
965 cout <<"Strange, label outside the range"<< endl;
970 TParticle * part = stack->Particle(label);
972 Int_t PDGCode=part->GetPdgCode();
975 fhBBTPCNegativePions->Fill(esdtrack->GetSign()*esdtrack->P(),esdtrack->GetTPCsignal());
978 fhBBTPCPositivePions->Fill(esdtrack->GetSign()*esdtrack->P(),esdtrack->GetTPCsignal());
981 // if(PDGCode == 211){
983 if(PDGCode==-211 || PDGCode==+211){
985 PionsTPC[nPionsTPC++]=j;
987 esdtrack->GetImpactParameters(impactXY, impactZ);
988 fhPiDCAXY->Fill(impactXY);
989 fhPiDCAZ->Fill(impactZ);
991 MomPionsRec[nPionsRec++]=esdtrack->P();
993 PxPionsRec[nPxPionsRec++]=esdtrack->Px();
994 PyPionsRec[nPyPionsRec++]=esdtrack->Py();
995 PzPionsRec[nPzPionsRec++]=esdtrack->Pz();
999 if(PDGCode==1000020030 ||PDGCode==-1000020030 ){
1004 fhBBTPCHe3->Fill(esdtrack->GetSign()*esdtrack->P(),esdtrack->GetTPCsignal());
1006 esdtrack->GetImpactParameters(impactXY, impactZ);
1007 fhHeDCAXY->Fill(impactXY);
1008 fhHeDCAZ->Fill(impactZ);
1010 MomHeRec[nHeRec++]=esdtrack->P();
1012 PxHeRec[nPxHeRec++]=esdtrack->Px();
1013 PyHeRec[nPyHeRec++]=esdtrack->Py();
1014 PzHeRec[nPzHeRec++]=esdtrack->Pz();
1020 //-------------- LOOP pairs 1 -------------
1021 // Fill phase space and inva mass before cuts
1023 Double_t HeMomRec =0;
1024 Double_t PionMomRec=0;
1025 Double_t PxHeReco=0, PyHeReco=0,PzHeReco=0;
1026 Double_t PxPionReco=0, PyPionReco=0,PzPionReco=0;
1028 for(Int_t l=0; l < nHeRec; l++){
1030 HeMomRec=MomHeRec[l];
1032 PxHeReco=PxHeRec[l];
1033 PyHeReco=PyHeRec[l];
1034 PzHeReco=PzHeRec[l];
1036 for(Int_t k=0; k < nPionsRec; k++){
1038 PionMomRec=MomPionsRec[k];
1040 PxPionReco=PxPionsRec[k];
1041 PyPionReco=PyPionsRec[k];
1042 PzPionReco=PzPionsRec[k];
1044 fhRigidityHevsMomPiRec->Fill(HeMomRec,PionMomRec);
1046 vHeliumRec.SetXYZM(2*PxHeReco,2*PyHeReco,2*PzHeReco,Helium3Mass);
1047 vPionRec.SetXYZM(PxPionReco,PyPionReco,PzPionReco,PionMass);
1048 vSumRec=vHeliumRec+vPionRec;
1050 fhInvMassRec->Fill(vSumRec.M());
1053 } // fine loop phase space
1055 //--------------- LOOP PAIRS ----------------------//
1057 Double_t DcaHeToPrimVertex=0;
1058 Double_t DcaPionToPrimVertex=0;
1060 impactXY=-999, impactZ=-999;
1061 impactXYpi=-999, impactZpi=-999;
1064 // Vettori per il PxPyPz
1066 Double_t momPionVett[3];
1067 for(Int_t i=0;i<3;i++)momPionVett[i]=0;
1069 Double_t momHeVett[3];
1070 for(Int_t i=0;i<3;i++)momHeVett[i]=0;
1074 Double_t momPionVettAt[3];
1075 for(Int_t i=0;i<3;i++)momPionVettAt[i]=0;
1077 Double_t momHeVettAt[3];
1078 for(Int_t i=0;i<3;i++)momHeVettAt[i]=0;
1080 Bool_t IsHeITSRefit,IsPiITSRefit ;
1082 //----------- My 2nd Vertex Finder
1084 for (Int_t k=0; k < nPionsTPC; k++) { //! Pions Loop
1086 DcaPionToPrimVertex=0.;
1087 DcaHeToPrimVertex=0;
1089 Int_t PionIdx=PionsTPC[k];
1091 AliESDtrack *PionTrack=lESDevent->GetTrack(PionIdx);
1093 statusPi = (ULong_t)PionTrack->GetStatus();
1094 IsPiITSRefit = ((statusPi) & (AliESDtrack::kITSrefit));
1096 Int_t labelPi = TMath::Abs(PionTrack->GetLabel());
1097 TParticle * partNeg = stack->Particle(labelPi);
1098 PDGCodeNeg=partNeg->GetPdgCode();
1100 Int_t mumidNeg = partNeg->GetFirstMother();
1102 TParticle *motherNeg=(TParticle*)stack->Particle(mumidNeg);
1103 motherPDGNeg = motherNeg->GetPdgCode();
1107 DcaPionToPrimVertex = TMath::Abs(PionTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
1109 if(DcaPionToPrimVertex<0.1)continue;
1111 AliExternalTrackParam trackInPion(*PionTrack);
1113 for (Int_t i=0; i<nHeTPC; i++){ //! Helium Loop
1115 Int_t HeIdx=HeTPC[i];
1117 AliESDtrack *HeTrack=lESDevent->GetTrack(HeIdx);
1119 statusT= (ULong_t)HeTrack->GetStatus();
1120 IsHeITSRefit = ((statusT) & (AliESDtrack::kITSrefit));
1122 Int_t labelHe = TMath::Abs(HeTrack->GetLabel());
1123 TParticle * partPos = stack->Particle(labelHe);
1124 PDGCodePos=partPos->GetPdgCode();
1126 Int_t mumidPos = partPos->GetFirstMother();
1128 TParticle *motherPos=(TParticle*)stack->Particle(mumidPos);
1129 motherPDGPos = motherPos->GetPdgCode();
1133 DcaHeToPrimVertex = TMath::Abs(HeTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
1135 AliExternalTrackParam trackInHe(*HeTrack);
1137 HeTrack->PxPyPz(momHeVett);
1138 PionTrack->PxPyPz(momPionVett);
1140 vHeliumRec.SetXYZM(2*momHeVett[0],2*momHeVett[1],2*momHeVett[2],Helium3Mass);
1141 vPionRec.SetXYZM(momPionVett[0],momPionVett[1],momPionVett[2],PionMass);
1142 vSumRec=vHeliumRec+vPionRec;
1144 fhInvMassRec1->Fill(vSumRec.M());
1146 fhInvMassRec2->Fill(vSumRec.M());
1148 if ( DcaPionToPrimVertex < fgDNmin) //OK
1149 if ( DcaHeToPrimVertex < fgDNmin) continue; //OK
1151 fhInvMassRec3->Fill(vSumRec.M());
1156 dca= PionTrack->GetDCA(HeTrack,lMagneticField,xn,xp); //!distance between two tracks (Neg to Pos)
1157 fHistProvaDCA->Fill(xn-xp,dca);
1158 if (dca > fgDCAmax) continue;
1160 fhInvMassRec4->Fill(vSumRec.M());
1162 if ((xn+xp) > 2*fgRmax) continue;
1163 if ((xn+xp) < 2*fgRmin) continue;
1164 fhInvMassRec5->Fill(vSumRec.M());
1166 //CORREZIONE da AliV0Vertex
1168 Bool_t corrected=kFALSE;
1169 if ((trackInPion.GetX() > 3.) && (xn < 3.)) {
1170 //correct for the beam pipe material
1173 if ((trackInHe.GetX() > 3.) && (xp < 3.)) {
1174 //correct for the beam pipe material
1178 dca=trackInPion.GetDCA(&trackInHe,lMagneticField,xn,xp);
1179 if (dca > fgDCAmax) continue;
1180 if ((xn+xp) > 2*fgRmax) continue;
1181 if ((xn+xp) < 2*fgRmin) continue;
1184 //=============================================//
1185 // Make a "V0" with Tracks //
1186 //=============================================//
1188 trackInPion.PropagateTo(xn,lMagneticField);
1189 trackInHe.PropagateTo(xp,lMagneticField);
1191 AliESDv0 vertex(trackInPion,PionIdx,trackInHe,HeIdx);
1192 if (vertex.GetChi2V0() > fgChi2max) continue;
1193 fhInvMassRec6->Fill(vSumRec.M());
1195 Float_t CosPointingAngle=vertex.GetV0CosineOfPointingAngle(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex); //PointingAngle
1196 if (CosPointingAngle < fgCPAmin) continue;
1198 fhInvMassRec7->Fill(vSumRec.M());
1200 vertex.SetDcaV0Daughters(dca);
1201 vertex.SetV0CosineOfPointingAngle(CosPointingAngle);
1203 fPos[0]=vertex.Xv();
1204 fPos[1]=vertex.Yv();
1205 fPos[2]=vertex.Zv();
1209 Double_t raggio=TMath::Sqrt(fPos[0]*fPos[0]+fPos[1]*fPos[1]+fPos[2]*fPos[2]);
1210 HeTrack->GetPxPyPzAt(raggio,lMagneticField,momHeVettAt);
1211 PionTrack->GetPxPyPzAt(raggio,lMagneticField,momPionVettAt);
1213 //------------------------------------------------------------------------//
1215 HeTrack->GetImpactParameters(impactXY, impactZ);
1217 PionTrack->GetImpactParameters(impactXYpi, impactZpi);
1219 Float_t timeTOFHe= HeTrack->GetTOFsignal(); // ps
1220 Float_t trackLenghtTOFHe= HeTrack->GetIntegratedLength(); // cm
1222 Float_t timeTOFPi= PionTrack->GetTOFsignal(); // ps
1223 Float_t trackLenghtTOFPi= PionTrack->GetIntegratedLength(); // cm
1225 //----------------------------------------------------------------------//
1227 vett1[0]=(Float_t)runNumber;
1228 vett1[1]=(Float_t)evNumber;
1229 vett1[2]=(Float_t)lNbMCPart;
1230 vett1[3]=(Float_t)percentile;
1231 vett1[4]=(Float_t)xPrimaryVertex; //PRIMARY
1232 vett1[5]=(Float_t)yPrimaryVertex;
1233 vett1[6]=(Float_t)zPrimaryVertex;
1234 vett1[7]=(Float_t)fPos[0]; //SECONDARY
1235 vett1[8]=(Float_t)fPos[1];
1236 vett1[9]=(Float_t)fPos[2];
1237 vett1[10]=(Float_t)dca; //between 2 tracks
1238 vett1[11]=(Float_t)CosPointingAngle; //cosPointingAngle da V0
1239 vett1[12]=(Float_t)vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex);
1240 vett1[13]=(Float_t)HeTrack->GetSign(); //He
1241 vett1[14]=(Float_t)trackInHe.GetP();
1242 vett1[15]=(Float_t)HeTrack->GetTPCsignal();
1243 vett1[16]=(Float_t)DcaHeToPrimVertex;
1244 vett1[17]=(Float_t)HeTrack->Eta();
1245 vett1[18]=(Float_t)momHeVett[0];
1246 vett1[19]=(Float_t)momHeVett[1];
1247 vett1[20]=(Float_t)momHeVett[2];
1248 vett1[21]=(Float_t)momHeVettAt[0];
1249 vett1[22]=(Float_t)momHeVettAt[1];
1250 vett1[23]=(Float_t)momHeVettAt[2];
1251 vett1[24]=(Float_t)HeTrack->GetTPCNcls();
1252 vett1[25]=(Float_t)impactXY;
1253 vett1[26]=(Float_t)impactZ;
1254 vett1[27]=(Float_t)isTOFHe3;
1255 vett1[28]=(Float_t)(trackLenghtTOFHe/timeTOFHe)/2.99792458e-2;
1256 vett1[29]=(Float_t)HeTrack->GetITSClusterMap();
1257 vett1[30]=(Float_t)IsHeITSRefit;
1258 vett1[31]=(Float_t)PionTrack->GetSign(); //Pion
1259 vett1[32]=(Float_t)trackInPion.GetP();
1260 vett1[33]=(Float_t)PionTrack->GetTPCsignal();
1261 vett1[34]=(Float_t)DcaPionToPrimVertex;
1262 vett1[35]=(Float_t)PionTrack->Eta();
1263 vett1[36]=(Float_t)momPionVett[0];
1264 vett1[37]=(Float_t)momPionVett[1];
1265 vett1[38]=(Float_t)momPionVett[2];
1266 vett1[39]=(Float_t)momPionVettAt[0];
1267 vett1[40]=(Float_t)momPionVettAt[1];
1268 vett1[41]=(Float_t)momPionVettAt[2];
1269 vett1[42]=(Float_t)PionTrack->GetTPCNcls();
1270 vett1[43]=(Float_t)impactXYpi;
1271 vett1[44]=(Float_t)impactZpi;
1272 vett1[45]=(Float_t)isTOFPi;
1273 vett1[46]=(Float_t)(trackLenghtTOFPi/timeTOFPi)/2.99792458e-2;
1274 vett1[47]=(Float_t)PionTrack->GetITSClusterMap();
1275 vett1[48]=(Float_t)IsPiITSRefit;
1276 vett1[49]=(Float_t)PDGCodeNeg;
1277 vett1[50]=(Float_t)PDGCodePos;
1278 vett1[51]=(Float_t)motherPDGNeg;
1279 vett1[52]=(Float_t)motherPDGPos;
1280 vett1[53]=(Float_t)labelPi;
1281 vett1[54]=(Float_t)labelHe;
1282 vett1[55]=(Float_t)mumidNeg;
1283 vett1[56]=(Float_t)mumidPos;
1285 fNtuple1->Fill(vett1);
1291 PostData(1,fListHistCascade);
1296 //________________________________________________________________________
1298 void AliAnalysisTaskHelium3PiMC::Terminate(Option_t *)
1300 // Draw result to the screen
1301 // Called once at the end of the query