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 "AliAnalysisTaskHelium3Pi.h"
57 #include "AliESDtrackCuts.h"
58 #include "AliCentrality.h"
62 #include <TLorentzVector.h>
63 //#include <AliVTrack.h>
65 const Int_t AliAnalysisTaskHelium3Pi::fgNrot = 15;
67 ClassImp(AliAnalysisTaskHelium3Pi)
69 //________________________________________________________________________
70 AliAnalysisTaskHelium3Pi::AliAnalysisTaskHelium3Pi()
71 : AliAnalysisTaskSE(),
77 fHistEventMultiplicity(0),
78 fHistTrackMultiplicity(0),
79 fHistTrackMultiplicityCent(0),
80 fHistTrackMultiplicitySemiCent(0),
81 fHistTrackMultiplicityMB(0),
82 fHistTrackMultiplicityPVCent(0),
83 fHistTrackMultiplicityPVSemiCent(0),
84 fHistTrackMultiplicityPVMB(0),
92 fBetavsTPCsignalPos(0),
93 fBetavsTPCsignalNeg(0),
105 txSecondaryVertex(0),
106 tySecondaryVertex(0),
107 tzSecondaryVertex(0),
109 tCosPointingAngle(0),
110 tDCAV0toPrimaryVertex(0),
114 tDcaHeToPrimVertex(0),
130 tDcaPionToPrimVertex(0),
141 tPionITSClusterMap(0),
165 tHeltrackLenghtTOF(0),
171 tHelxPrimaryVertex(0),
172 tHelyPrimaryVertex(0),
173 tHelzPrimaryVertex(0),
174 tHelchi2PerClusterTPC(0),
180 // printf("Dummy Constructor");
182 fESDtrackCuts = new AliESDtrackCuts("fESDtrackCuts");
183 fESDtrackCuts->SetRequireITSStandAlone(kFALSE);
184 fESDtrackCuts->SetRequireITSPureStandAlone(kFALSE);
186 fESDtrackCuts->SetRequireTPCRefit(kTRUE);
187 fESDtrackCuts->SetAcceptKinkDaughters(kFALSE);
188 fESDtrackCuts->SetMinNClustersTPC(60);
189 fESDtrackCuts->SetMaxChi2PerClusterTPC(5);
190 fESDtrackCuts->SetEtaRange(-0.9,0.9);
194 //________________________________________________________________________
195 AliAnalysisTaskHelium3Pi::AliAnalysisTaskHelium3Pi(const char *name)
196 : AliAnalysisTaskSE(name),
197 fAnalysisType("ESD"),
198 fCollidingSystems(0),
202 fHistEventMultiplicity(0),
203 fHistTrackMultiplicity(0),
204 fHistTrackMultiplicityCent(0),
205 fHistTrackMultiplicitySemiCent(0),
206 fHistTrackMultiplicityMB(0),
207 fHistTrackMultiplicityPVCent(0),
208 fHistTrackMultiplicityPVSemiCent(0),
209 fHistTrackMultiplicityPVMB(0),
217 fBetavsTPCsignalPos(0),
218 fBetavsTPCsignalNeg(0),
230 txSecondaryVertex(0),
231 tySecondaryVertex(0),
232 tzSecondaryVertex(0),
234 tCosPointingAngle(0),
235 tDCAV0toPrimaryVertex(0),
239 tDcaHeToPrimVertex(0),
255 tDcaPionToPrimVertex(0),
266 tPionITSClusterMap(0),
290 tHeltrackLenghtTOF(0),
296 tHelxPrimaryVertex(0),
297 tHelyPrimaryVertex(0),
298 tHelzPrimaryVertex(0),
299 tHelchi2PerClusterTPC(0),
303 // Define input and output slots here
304 // Input slot #0 works with a TChain
305 //DefineInput(0, TChain::Class());
306 // Output slot #0 writes into a TList container ()
308 DefineInput(0, TChain::Class());
310 DefineOutput(1, TList::Class());
311 DefineOutput(2, TTree::Class());
312 DefineOutput(3, TTree::Class());
314 fESDtrackCuts = new AliESDtrackCuts("fESDtrackCuts");
315 fESDtrackCuts->SetRequireITSStandAlone(kFALSE);
316 fESDtrackCuts->SetRequireITSPureStandAlone(kFALSE);
318 fESDtrackCuts->SetRequireTPCRefit(kTRUE);
319 fESDtrackCuts->SetAcceptKinkDaughters(kFALSE);
320 fESDtrackCuts->SetMinNClustersTPC(60);
321 fESDtrackCuts->SetMaxChi2PerClusterTPC(5);
322 fESDtrackCuts->SetEtaRange(-0.9,0.9);
325 //_______________________________________________________
326 AliAnalysisTaskHelium3Pi::~AliAnalysisTaskHelium3Pi()
334 if (fESDtrackCuts) delete fESDtrackCuts;
335 if(fNtuple1) delete fNtuple1;
336 if(fNtuple4) delete fNtuple4;
338 //=================DEFINITION BETHE BLOCH==============================
340 Double_t AliAnalysisTaskHelium3Pi::BetheBloch(Double_t betaGamma,Double_t charge,Bool_t isPbPb) {
342 Double_t kp1, kp2, kp3, kp4, kp5;
347 kp1 = 4.7*charge*charge;
348 kp2 = 8.98482806165147636e+00;
349 kp3 = 1.54000000000000005e-05;
350 kp4 = 2.30445734159456084e+00;
351 kp5 = 2.25624744086878559e+00;
359 kp1 = 4.7*charge*charge;
360 kp2 = 8.98482806165147636e+00;
361 kp3 = 1.54000000000000005e-05;
362 kp4 = 2.30445734159456084e+00;
363 kp5 = 2.25624744086878559e+00;
367 Double_t beta = betaGamma / TMath::Sqrt(1.0 + betaGamma * betaGamma);
369 Double_t aa = TMath::Power(beta, kp4);
370 Double_t bb = TMath::Power(1.0 / betaGamma, kp5);
372 bb = TMath::Log(kp3 + bb);
374 Double_t out = (kp2 - aa - bb) * kp1 / aa;
380 //==================DEFINITION OF OUTPUT OBJECTS==============================
382 void AliAnalysisTaskHelium3Pi::UserCreateOutputObjects()
385 fListHist = new TList();
386 fListHist->SetOwner(); // IMPORTANT!
388 if(! fHistEventMultiplicity ){
389 fHistEventMultiplicity = new TH1F( "fHistEventMultiplicity" , "Nb of Events" , 10 , 0, 10);
390 fHistEventMultiplicity->GetXaxis()->SetBinLabel(1,"All Events");
391 fHistEventMultiplicity->GetXaxis()->SetBinLabel(2,"Events w/PV");
392 fHistEventMultiplicity->GetXaxis()->SetBinLabel(3,"Events w/|Vz|<10cm");
393 fHistEventMultiplicity->GetXaxis()->SetBinLabel(4,"Central Events");
394 fHistEventMultiplicity->GetXaxis()->SetBinLabel(5,"SemiCentral Events");
395 fHistEventMultiplicity->GetXaxis()->SetBinLabel(6,"MB Events");
396 fHistEventMultiplicity->GetXaxis()->SetBinLabel(7,"Central Events w/|Vz|<10cm");
397 fHistEventMultiplicity->GetXaxis()->SetBinLabel(8,"SemiCentral Events w/|Vz|<10cm");
398 fHistEventMultiplicity->GetXaxis()->SetBinLabel(9,"MB Events w/|Vz|<10cm");
400 fListHist->Add(fHistEventMultiplicity);
403 if(! fHistTrackMultiplicity ){
404 fHistTrackMultiplicity = new TH2F( "fHistTrackMultiplicity" , "Nb of Tracks", 2500,0, 25000,210,-1,104);
405 fHistTrackMultiplicity->GetXaxis()->SetTitle("Number of tracks");
406 fHistTrackMultiplicity->GetYaxis()->SetTitle("Percentile");
407 fListHist->Add(fHistTrackMultiplicity);
410 if(! fHistTrackMultiplicityCent ){
411 fHistTrackMultiplicityCent = new TH2F( "fHistTrackMultiplicityCent", "Nb of Tracks Central Events", 2500,0, 25000,210,-1,104 );
412 fHistTrackMultiplicityCent->GetXaxis()->SetTitle("Number of tracks");
413 fHistTrackMultiplicityCent->GetYaxis()->SetTitle("Percentile");
414 fListHist->Add(fHistTrackMultiplicityCent);
417 if(! fHistTrackMultiplicitySemiCent ){
418 fHistTrackMultiplicitySemiCent = new TH2F( "fHistTrackMultiplicitySemiCent" , "Nb of Tracks SemiCentral Events", 2500,0, 25000 ,210,-1,104);
419 fHistTrackMultiplicitySemiCent->GetXaxis()->SetTitle("Number of tracks");
420 fHistTrackMultiplicitySemiCent->GetYaxis()->SetTitle("Percentile");
421 fListHist->Add(fHistTrackMultiplicitySemiCent);
424 if(! fHistTrackMultiplicityMB ){
425 fHistTrackMultiplicityMB = new TH2F( "fHistTrackMultiplicityMB" , "Nb of Tracks MBral Events", 2500,0, 25000,210,-1,104 );
426 fHistTrackMultiplicityMB->GetXaxis()->SetTitle("Number of tracks");
427 fHistTrackMultiplicityMB->GetYaxis()->SetTitle("Percentile");
428 fListHist->Add(fHistTrackMultiplicityMB);
431 if(! fHistTrackMultiplicityPVCent ){
432 fHistTrackMultiplicityPVCent = new TH2F( "fHistTrackMultiplicityPVCent" , "Nb of Tracks Central Events", 2500,0, 25000,210,-1,104 );
433 fHistTrackMultiplicityPVCent->GetXaxis()->SetTitle("Number of tracks");
434 fHistTrackMultiplicityPVCent->GetYaxis()->SetTitle("Percentile");
435 fListHist->Add(fHistTrackMultiplicityPVCent);
438 if(! fHistTrackMultiplicityPVSemiCent ){
439 fHistTrackMultiplicityPVSemiCent = new TH2F( "fHistTrackMultiplicityPVSemiCent" , "Nb of Tracks SemiCentral Events", 2500,0, 25000 ,210,-1,104);
440 fHistTrackMultiplicityPVSemiCent->GetXaxis()->SetTitle("Number of tracks");
441 fHistTrackMultiplicityPVSemiCent->GetYaxis()->SetTitle("Percentile");
442 fListHist->Add(fHistTrackMultiplicityPVSemiCent);
445 if(! fHistTrackMultiplicityPVMB ){
446 fHistTrackMultiplicityPVMB = new TH2F( "fHistTrackMultiplicityPVMB" , "Nb of Tracks MBral Events", 2500,0, 25000,210,-1,104 );
447 fHistTrackMultiplicityPVMB->GetXaxis()->SetTitle("Number of tracks");
448 fHistTrackMultiplicityPVMB->GetYaxis()->SetTitle("Percentile");
449 fListHist->Add(fHistTrackMultiplicityPVMB);
453 fhBB = new TH2F( "fhBB" , "BetheBlochTPC" , 120,-6,6,150,0,1500);
454 fhBB->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
455 fhBB->GetYaxis()->SetTitle("TPC Signal");
456 fListHist->Add(fhBB);
460 fhTOF = new TH2F( "fhTOF" , "Scatter Plot TOF" , 120,-6,6,100,0,1.2);
461 fhTOF->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
462 fhTOF->GetYaxis()->SetTitle("#beta");
463 fListHist->Add(fhTOF);
467 fhMassTOF=new TH1F ("fhMassTOF","Particle Mass - TOF", 300,0 ,5);
468 fhMassTOF->GetXaxis()->SetTitle("Mass (GeV/#it{c}^{2})");
469 fListHist->Add(fhMassTOF);
473 fhBBPions = new TH2F( "fhBBPions" , "Bethe-Bloch TPC Pions" , 120,-6,6,150,0,1500);
474 fhBBPions->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
475 fhBBPions->GetYaxis()->SetTitle("TPC Signal");
476 fListHist->Add(fhBBPions);
480 fhBBHe = new TH2F( "fhBBHe" , "Bethe-Bloch TPC He" , 120,-6,6,150,0,1500);
481 fhBBHe->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
482 fhBBHe->GetYaxis()->SetTitle("TPC Signal");
483 fListHist->Add(fhBBHe);
487 fhNaPos = new TH2F( "fhNaPos" , "Distribution Pos" , 500,0,5,40,-10,10);
488 fhNaPos->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
489 fhNaPos->GetYaxis()->SetTitle("(TPCSignal-bbtheo)/bbtheo (He)");
490 fListHist->Add(fhNaPos);
494 fhNaNeg = new TH2F( "fhNaNeg" , "Distribution Neg" , 500,0,5,40,-10,10);
495 fhNaNeg->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
496 fhNaNeg->GetYaxis()->SetTitle("(TPCSignal-bbtheo)/bbtheo (He)");
497 fListHist->Add(fhNaNeg);
500 if(! fBetavsTPCsignalPos ){
501 fBetavsTPCsignalPos = new TH2F("fBetavsTPCsignalPos","fBetavsTPCsignalPos",100,0,1.2,150,0,1500);
502 fBetavsTPCsignalPos->GetXaxis()->SetTitle("#beta");
503 fBetavsTPCsignalPos->GetYaxis()->SetTitle("TPC Signal");
504 fListHist->Add(fBetavsTPCsignalPos);
507 if(! fBetavsTPCsignalNeg ){
508 fBetavsTPCsignalNeg = new TH2F("fBetavsTPCsignalNeg","fBetavsTPCsignalNeg",100,0,1.2,150,0,1500);
509 fBetavsTPCsignalNeg->GetXaxis()->SetTitle("#beta");
510 fBetavsTPCsignalNeg->GetYaxis()->SetTitle("TPC Signal");
511 fListHist->Add(fBetavsTPCsignalNeg);
518 fNtuple1 = new TTree("fNtuple1","fNtuple1");
520 fNtuple1->Branch("trunNumber" ,&trunNumber ,"trunNumber/F");
521 fNtuple1->Branch("tbunchcross" ,&tbunchcross ,"tbunchcross/F");
522 fNtuple1->Branch("torbit" ,&torbit ,"torbit/F");
523 fNtuple1->Branch("tperiod" ,&tperiod ,"tperiod/F");
524 fNtuple1->Branch("teventtype" ,&teventtype ,"teventtype/F");
525 fNtuple1->Branch("tTrackNumber" ,&tTrackNumber ,"tTrackNumber/F");
526 fNtuple1->Branch("tpercentile" ,&tpercentile ,"tpercentile/F") ;
527 fNtuple1->Branch("txPrimaryVertex" ,&txPrimaryVertex ,"txPrimaryVertex/F");
528 fNtuple1->Branch("tyPrimaryVertex" ,&tyPrimaryVertex ,"tyPrimaryVertex/F");
529 fNtuple1->Branch("tzPrimaryVertex" ,&tzPrimaryVertex ,"tzPrimaryVertex/F");
530 fNtuple1->Branch("txSecondaryVertex" ,&txSecondaryVertex ,"txSecondaryVertex/F");
531 fNtuple1->Branch("tySecondaryVertex" ,&tySecondaryVertex ,"tySecondaryVertex/F");
532 fNtuple1->Branch("tzSecondaryVertex" ,&tzSecondaryVertex ,"tzSecondaryVertex/F");
533 fNtuple1->Branch("tdcaTracks" ,&tdcaTracks ,"tdcaTracks/F");
534 fNtuple1->Branch("tCosPointingAngle" ,&tCosPointingAngle ,"tCosPointingAngle/F");
535 fNtuple1->Branch("tDCAV0toPrimaryVertex",&tDCAV0toPrimaryVertex,"tDCAV0toPrimaryVertex/F");
536 fNtuple1->Branch("tHeSign" ,&tHeSign ,"tHeSign/F");
537 fNtuple1->Branch("tHepInTPC" ,&tHepInTPC ,"tHepInTPC/F");
538 fNtuple1->Branch("tHeTPCsignal" ,&tHeTPCsignal ,"tHeTPCsignal/F");
539 fNtuple1->Branch("tDcaHeToPrimVertex" ,&tDcaHeToPrimVertex ,"tDcaHeToPrimVertex/F");
540 fNtuple1->Branch("tHeEta" ,&tHeEta ,"tHeEta/F");
541 fNtuple1->Branch("tmomHex" ,&tmomHex ,"tmomHex/F");
542 fNtuple1->Branch("tmomHey" ,&tmomHey ,"tmomHey/F");
543 fNtuple1->Branch("tmomHez" ,&tmomHez ,"tmomHez/F");
544 fNtuple1->Branch("tmomHeAtSVx" ,&tmomHeAtSVx ,"tmomHeAtSVx/F");
545 fNtuple1->Branch("tmomHeAtSVy" ,&tmomHeAtSVy ,"tmomHeAtSVy/F");
546 fNtuple1->Branch("tmomHeAtSVz" ,&tmomHeAtSVz ,"tmomHeAtSVz/F");
547 fNtuple1->Branch("tHeTPCNcls" ,&tHeTPCNcls ,"tHeTPCNcls/F");
548 fNtuple1->Branch("tHeimpactXY" ,&tHeimpactXY ,"tHeimpactXY/F");
549 fNtuple1->Branch("tHeimpactZ" ,&tHeimpactZ ,"tHeimpactZ/F");
550 fNtuple1->Branch("tHeITSClusterMap" ,&tHeITSClusterMap ,"tHeITSClusterMap/F");
551 fNtuple1->Branch("tIsHeITSRefit" ,&tIsHeITSRefit ,"tIsHeITSRefit/F");
552 fNtuple1->Branch("tPionSign" ,&tPionSign ,"tPionSign/F");
553 fNtuple1->Branch("tPionpInTPC" ,&tPionpInTPC ,"tPionpInTPC/F");
554 fNtuple1->Branch("tPionTPCsignal" ,&tPionTPCsignal ,"tPionTPCsignal/F");
555 fNtuple1->Branch("tDcaPionToPrimVertex" ,&tDcaPionToPrimVertex ,"tDcaPionToPrimVertex/F");
556 fNtuple1->Branch("tPionEta" ,&tPionEta ,"tPionEta/F");
557 fNtuple1->Branch("tmomPionx" ,&tmomPionx ,"tmomPionx/F");
558 fNtuple1->Branch("tmomPiony" ,&tmomPiony ,"tmomPiony/F");
559 fNtuple1->Branch("tmomPionz" ,&tmomPionz ,"tmomPionz/F");
560 fNtuple1->Branch("tmomNegPionAtSVx" ,&tmomNegPionAtSVx ,"tmomNegPionAtSVx/F");
561 fNtuple1->Branch("tmomNegPionAtSVy" ,&tmomNegPionAtSVy ,"tmomNegPionAtSVy/F");
562 fNtuple1->Branch("tmomNegPionAtSVz" ,&tmomNegPionAtSVz ,"tmomNegPionAtSVz/F");
563 fNtuple1->Branch("tPionTPCNcls" ,&tPionTPCNcls ,"tPionTPCNcls/F");
564 fNtuple1->Branch("tPionimpactXY" ,&tPionimpactXY ,"tPionimpactXY/F");
565 fNtuple1->Branch("tPionimpactZ" ,&tPionimpactZ ,"tPionimpactZ/F");
566 fNtuple1->Branch("tPionITSClusterMap" ,&tPionITSClusterMap ,"tPionITSClusterMap/F");
567 fNtuple1->Branch("tIsPiITSRefit" ,&tIsPiITSRefit ,"tIsPiITSRefit/F");
568 fNtuple1->Branch("txn" ,&txn ,"txn/F");
569 fNtuple1->Branch("txp" ,&txp ,"txp/F");
570 fNtuple1->Branch("tchi2He" ,&tchi2He ,"tchi2He/F");
571 fNtuple1->Branch("tchi2Pi" ,&tchi2Pi ,"tchi2Pi/F");
577 fNtuple4 = new TTree("fNtuple4","fNtuple4");
579 fNtuple4->Branch("tHelrunNumber" ,&tHelrunNumber ,"tHelrunNumber/F");
580 fNtuple4->Branch("tHelBCNumber" ,&tHelBCNumber ,"tHelBCNumber/F");
581 fNtuple4->Branch("tHelOrbitNumber" ,&tHelOrbitNumber ,"tHelOrbitNumber/F");
582 fNtuple4->Branch("tHelPeriodNumber" ,&tHelPeriodNumber ,"tHelPeriodNumber/F");
583 fNtuple4->Branch("tHeleventtype" ,&tHeleventtype ,"tHeleventtype/F");
584 fNtuple4->Branch("tHelisHeITSrefit" ,&tHelisHeITSrefit ,"tHelisHeITSrefit/F");
585 fNtuple4->Branch("tHelpercentile" ,&tHelpercentile ,"tHelpercentile/F");
586 fNtuple4->Branch("tHelSign" ,&tHelSign ,"tHelSign/F");
587 fNtuple4->Branch("tHelpinTPC" ,&tHelpinTPC ,"tHelpinTPC/F");
588 fNtuple4->Branch("tHelGetTPCsignal" ,&tHelGetTPCsignal ,"tHelGetTPCsignal/F");
589 fNtuple4->Branch("tHelPx" ,&tHelPx ,"tHelPx/F");
590 fNtuple4->Branch("tHelPy" ,&tHelPy ,"tHelPy/F");
591 fNtuple4->Branch("tHelPz" ,&tHelPz ,"tHelPz/F");
592 fNtuple4->Branch("tHelEta" ,&tHelEta ,"tHelEta/F");
593 fNtuple4->Branch("tHelisTOF" ,&tHelisTOF ,"tHelisTOF/F");
594 fNtuple4->Branch("tHelpoutTPC" ,&tHelpoutTPC ,"tHelpoutTPC/F");
595 fNtuple4->Branch("tHeltimeTOF" ,&tHeltimeTOF ,"tHeltimeTOF/F");
596 fNtuple4->Branch("tHeltrackLenghtTOF" ,&tHeltrackLenghtTOF ,"tHeltrackLenghtTOF/F");
597 fNtuple4->Branch("tHelimpactXY" ,&tHelimpactXY ,"tHelimpactXY/F");
598 fNtuple4->Branch("tHelimpactZ" ,&tHelimpactZ ,"tHelimpactZ/F");
599 fNtuple4->Branch("tHelmapITS" ,&tHelmapITS ,"tHelmapITS/F");
600 fNtuple4->Branch("tHelTPCNcls" ,&tHelTPCNcls ,"tHelTPCNcls/F");
601 fNtuple4->Branch("tHelTRDsignal" ,&tHelTRDsignal ,"tHelTRDsignal/F");
602 fNtuple4->Branch("tHelxPrimaryVertex" ,&tHelxPrimaryVertex ,"tHelxPrimaryVertex/F");
603 fNtuple4->Branch("tHelyPrimaryVertex" ,&tHelyPrimaryVertex ,"tHelyPrimaryVertex/F");
604 fNtuple4->Branch("tHelzPrimaryVertex" ,&tHelzPrimaryVertex ,"tHelzPrimaryVertex/F");
605 fNtuple4->Branch("tHelchi2PerClusterTPC",&tHelchi2PerClusterTPC,"tHelchi2PerClusterTPC/F");
610 PostData(1, fListHist);
611 PostData(2, fNtuple1);
612 PostData(3, fNtuple4);
613 }// end UserCreateOutputObjects
616 //====================== USER EXEC ========================
618 void AliAnalysisTaskHelium3Pi::UserExec(Option_t *)
620 //_______________________________________________________________________
622 //!*********************!//
623 //! Define variables !//
624 //!*********************!//
626 Double_t pinTPC=0.,poutTPC=0.,TPCSignal=0.;
627 Double_t xPrimaryVertex=0.,yPrimaryVertex=0.,zPrimaryVertex=0.;
628 Double_t massTOF=0.,timeTOF=0.,trackLenghtTOF=0.,betaTOF=0.;
631 // ULong_t statusT=0;
634 Bool_t isTPC=kFALSE,isTOF=kFALSE,IsHeITSRefit=kFALSE,IsPiITSRefit=kFALSE ;
636 Float_t nSigmaNegPion=0.;
638 Double_t cutNSigma = 3;
639 Double_t bbtheoM=0.,bbtheo=0.;
640 Double_t zNathashaNeg=0;
641 Double_t zNathashaPos=0;
642 Double_t fPos[3]={0.,0.,0.};
643 Double_t runNumber=0.;
644 // Double_t evNumber=0.;
646 Double_t BCNumber=0.;
647 Double_t OrbitNumber=0.;
648 Double_t PeriodNumber=0.;
650 Double_t Helium3Mass = 2.80839;
651 Double_t PionMass = 0.13957;
654 TLorentzVector vPion,vHelium,vSum;
656 //!----------------------------------------------------------------
658 //! A set of very loose parameters for cuts
660 Double_t fgChi2max=33.; //! max chi2
661 Double_t fgDNmin=0.05; //! min imp parameter for the 1st daughter = 500um
662 Double_t fgDCAmax=1.0; //! max DCA between the daughter tracks in cm
663 Double_t fgCPAmin=0.99; //! min cosine of V0's pointing angle
664 // Double_t fgRmin=0.2; //! min radius of the fiducial volume //original
665 Double_t fgRmin=0.1; //! min radius of the fiducial volume = 1 mm
666 Double_t fgRmax=200.; //! max radius of the fiducial volume = 2 m
668 //------------------------------------------
671 // Called for EACH event
673 AliVEvent *event = InputEvent();
674 if (!event) { Printf("ERROR: Could not retrieve event"); return; }
676 Info("AliAnalysisTaskHelium3Pi","Starting UserExec");
680 // create pointer to event
681 AliESDEvent* lESDevent = dynamic_cast<AliESDEvent*>(event);
683 AliError("Cannot get the ESD event");
687 fHistEventMultiplicity->Fill(0);
689 Double_t lMagneticField=lESDevent->GetMagneticField();
690 Int_t TrackNumber = -1;
693 //*****************//
695 //*****************//
697 AliCentrality *centrality = lESDevent->GetCentrality();
698 Float_t percentile=centrality->GetCentralityPercentile("V0M");
700 TrackNumber = lESDevent->GetNumberOfTracks();
701 if (TrackNumber<2) return;
703 fHistTrackMultiplicity->Fill(TrackNumber,percentile); //tracce per evento
705 //****************************************
709 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
710 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
711 fPIDResponse=inputHandler->GetPIDResponse(); // data member di tipo "const AliPIDResponse *fPIDResponse;"
712 // cout<<"fPIDResponse "<<fPIDResponse<<endl;
713 //===========================================
717 Bool_t isSelectedCentral = (inputHandler->IsEventSelected() & AliVEvent::kCentral);
718 Bool_t isSelectedSemiCentral = (inputHandler->IsEventSelected() & AliVEvent::kSemiCentral);
719 Bool_t isSelectedMB = (inputHandler->IsEventSelected() & AliVEvent::kMB);
721 if(isSelectedCentral){
722 fHistEventMultiplicity->Fill(3);
723 fHistTrackMultiplicityCent->Fill(TrackNumber,percentile);
727 if(isSelectedSemiCentral){
728 fHistEventMultiplicity->Fill(4);
729 fHistTrackMultiplicitySemiCent->Fill(TrackNumber,percentile);
734 fHistEventMultiplicity->Fill(5);
735 fHistTrackMultiplicityMB->Fill(TrackNumber,percentile);
739 if(isSelectedCentral || isSelectedSemiCentral || isSelectedMB){
743 // Primary vertex cut
745 const AliESDVertex *vtx = lESDevent->GetPrimaryVertexTracks();
747 if(vtx->GetNContributors()<1) {
750 vtx = lESDevent->GetPrimaryVertexSPD();
752 if(vtx->GetNContributors()<1) {
753 Info("AliAnalysisTaskHelium3Pi","No good vertex, skip event");
754 return; // NO GOOD VERTEX, SKIP EVENT
758 fHistEventMultiplicity->Fill(1); // analyzed events with PV
760 xPrimaryVertex=vtx->GetXv();
761 yPrimaryVertex=vtx->GetYv();
762 zPrimaryVertex=vtx->GetZv();
764 if(TMath::Abs(zPrimaryVertex)>10) return;
767 fHistTrackMultiplicityPVCent->Fill(TrackNumber,percentile);
768 fHistEventMultiplicity->Fill(6);
772 fHistTrackMultiplicityPVSemiCent->Fill(TrackNumber,percentile);
773 fHistEventMultiplicity->Fill(7);
777 fHistTrackMultiplicityPVMB->Fill(TrackNumber,percentile);
778 fHistEventMultiplicity->Fill(8);
782 fHistEventMultiplicity->Fill(2);
784 //Find Pair candidates
786 TArrayI PionsTPC(TrackNumber); //Neg pions
789 TArrayI HeTPC(TrackNumber); //helium3
792 const Double_t speedOfLight = TMath::C()*1E2*1E-12; // cm/ps
794 Float_t impactXY=-999, impactZ=-999;
795 Float_t impactXYpi=-999, impactZpi=-999;
798 //*************************************************************
800 runNumber = lESDevent->GetRunNumber();
801 BCNumber = lESDevent->GetBunchCrossNumber();
802 OrbitNumber = lESDevent->GetOrbitNumber();
803 PeriodNumber= lESDevent->GetPeriodNumber();
805 //*************************************************************
807 for (Int_t j=0; j<TrackNumber; j++) { //loop on tracks
809 AliESDtrack *esdtrack=lESDevent->GetTrack(j);
810 // AliVTrack* esdtrack= (AliVTrack *) fEvent->GetTrack(iT);
814 AliError(Form("ERROR: Could not retrieve esdtrack %d",j));
818 // ************** Track cuts ****************
820 if (!fESDtrackCuts->AcceptTrack(esdtrack)) continue;
823 status = (ULong_t)esdtrack->GetStatus();
824 isTPC = (((status) & AliESDtrack::kTPCin) != 0);
825 isTOF = ((((status) & AliESDtrack::kTOFout) != 0) && (((status) & AliESDtrack::kTIME) != 0));
828 UInt_t mapITS=esdtrack->GetITSClusterMap();
830 //----------------------------------------------
832 //****** Cuts from AliV0Vertex.cxx *************
834 Double_t d=esdtrack->GetD(xPrimaryVertex,yPrimaryVertex,lMagneticField);
835 // if (TMath::Abs(d)<fgDPmin) continue;
836 if (TMath::Abs(d)>fgRmax) continue;
838 //---- (Usefull) Stuff
840 TPCSignal=esdtrack->GetTPCsignal();
842 if (TPCSignal<10)continue;
843 if (TPCSignal>1000)continue;
846 if(!esdtrack->GetTPCInnerParam())continue;
848 AliExternalTrackParam trackIn(*esdtrack->GetInnerParam());
849 pinTPC= trackIn.GetP();
851 //pinTPC= esdtrack->GetTPCMomentum();
856 if((status) & (AliESDtrack::kITSrefit!=0)){
857 fhBB->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
860 timeTOF=esdtrack->GetTOFsignal(); // ps
861 trackLenghtTOF= esdtrack->GetIntegratedLength(); // cm
865 if(!esdtrack->GetOuterParam())continue;
867 AliExternalTrackParam trackOut(*esdtrack->GetOuterParam());
869 poutTPC = trackOut.GetP();
871 betaTOF= (trackLenghtTOF/timeTOF)/2.99792458e-2;
873 fhTOF->Fill(poutTPC*esdtrack->GetSign(),betaTOF);
875 Double_t mass2=(poutTPC*poutTPC)*((((speedOfLight*speedOfLight)*(timeTOF*timeTOF))-(trackLenghtTOF*trackLenghtTOF))/(trackLenghtTOF*trackLenghtTOF));
876 if(mass2>0) massTOF=TMath::Sqrt(mass2);
877 fhMassTOF->Fill(massTOF);
879 if(esdtrack->GetSign() < 0.)fBetavsTPCsignalNeg->Fill(betaTOF,TPCSignal);
880 if(esdtrack->GetSign() > 0.)fBetavsTPCsignalPos->Fill(betaTOF,TPCSignal);
886 // bbtheo =BetheBloch((2*pinTPC)/3.,2,kTRUE); //! OK
887 // bbtheoM=(1 - 0.08*5)*bbtheo; //! OK
888 // bbtheoP=(1 + 0.08*5)*bbtheo; //! OK
891 bbtheo = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 7);
893 if(esdtrack->GetSign()<0){
894 zNathashaNeg=bbtheo;//(TPCSignal-bbtheo)/bbtheo;
895 // cout<<"BBtheo 1 :"<<zNathashaNeg<<endl;
896 fhNaNeg->Fill(pinTPC,zNathashaNeg);
899 if(esdtrack->GetSign() > 0.){
900 zNathashaPos=bbtheo;//(TPCSignal-bbtheo)/bbtheo;
901 fhNaPos->Fill(pinTPC,zNathashaPos);
904 nSigmaNegPion=TMath::Abs(fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 2));
907 if ( (nSigmaNegPion < cutNSigma)){
909 // cout<<"Nsigma pi: "<<nSigmaNegPion<<endl;
911 fhBBPions->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
914 PionsTPC[nPionsTPC++]=j;
918 // nSigmaNegPion=(fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 2));
920 bbtheoM = TMath::Abs((fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 7)));
922 // if( TPCSignal > bbtheoM ) {
923 // if( bbtheoM > -3.) {
928 fhBBHe->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
931 Bool_t isHeITSrefit=((status) & (AliESDtrack::kITSrefit));
933 esdtrack->GetImpactParameters(impactXY, impactZ);
935 Int_t fIdxInt[200]; //dummy array
936 Int_t nClustersTPC = esdtrack->GetTPCclusters(fIdxInt);
938 Float_t chi2PerClusterTPC = esdtrack->GetTPCchi2()/(Float_t)(nClustersTPC);
940 tHelrunNumber =(Float_t)runNumber;
941 tHelBCNumber =(Float_t)BCNumber;
942 tHelOrbitNumber =(Float_t)OrbitNumber;
943 tHelPeriodNumber =(Float_t)PeriodNumber;
944 tHeleventtype =(Float_t)eventtype;
945 tHelisHeITSrefit =(Float_t)isHeITSrefit;
946 tHelpercentile =(Float_t)percentile;
947 tHelSign =(Float_t)esdtrack->GetSign();
948 tHelpinTPC =(Float_t)pinTPC;
949 tHelGetTPCsignal =(Float_t)esdtrack->GetTPCsignal();
950 tHelPx =(Float_t)esdtrack->Px();
951 tHelPy =(Float_t)esdtrack->Py();
952 tHelPz =(Float_t)esdtrack->Pz();
953 tHelEta =(Float_t)esdtrack->Eta();
954 tHelisTOF =(Float_t)isTOF;
955 tHelpoutTPC =(Float_t)poutTPC;
956 tHeltimeTOF =(Float_t)timeTOF;
957 tHeltrackLenghtTOF =(Float_t)trackLenghtTOF;
958 tHelimpactXY =(Float_t)impactXY;
959 tHelimpactZ =(Float_t)impactZ;
960 tHelmapITS =(Float_t)mapITS;
961 tHelTPCNcls =(Float_t)esdtrack->GetTPCNcls();
962 tHelTRDsignal =(Float_t)esdtrack->GetTRDsignal();
963 tHelxPrimaryVertex =(Float_t)xPrimaryVertex;
964 tHelyPrimaryVertex =(Float_t)yPrimaryVertex;
965 tHelzPrimaryVertex =(Float_t)zPrimaryVertex;
966 tHelchi2PerClusterTPC =(Float_t)chi2PerClusterTPC;
973 PionsTPC.Set(nPionsTPC);
976 Double_t DcaHeToPrimVertex=0;
977 Double_t DcaPionToPrimVertex=0;
979 impactXY=-999, impactZ=-999;
980 impactXYpi=-999, impactZpi=-999;
984 // Vettors for il PxPyPz
986 Double_t momPionVett[3];
987 for(Int_t i=0;i<3;i++)momPionVett[i]=0;
989 Double_t momHeVett[3];
990 for(Int_t i=0;i<3;i++)momHeVett[i]=0;
994 Double_t momPionVettAt[3];
995 for(Int_t i=0;i<3;i++)momPionVettAt[i]=0;
997 Double_t momHeVettAt[3];
998 for(Int_t i=0;i<3;i++)momHeVettAt[i]=0;
1000 //--------------- LOOP PAIRS ----------------
1002 for (Int_t k=0; k < nPionsTPC; k++) { //! Pions Loop
1004 DcaPionToPrimVertex=0.;
1005 DcaHeToPrimVertex=0;
1007 Int_t PionIdx=PionsTPC[k];
1009 AliESDtrack *PionTrack=lESDevent->GetTrack(PionIdx);
1011 statusPi = (ULong_t)PionTrack->GetStatus();
1012 // isTOFPi = ((((statusPi) & (AliESDtrack::kTOFout)) != 0) && (((statusPi) & (AliESDtrack::kTIME)) != 0));
1013 IsPiITSRefit = ((statusPi) & (AliESDtrack::kITSrefit));
1016 DcaPionToPrimVertex = TMath::Abs(PionTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
1018 if(DcaPionToPrimVertex<0.2)continue;
1020 AliExternalTrackParam trackInPion(*PionTrack);
1022 for (Int_t i=0; i<nHeTPC; i++){ //! Helium Loop
1024 Int_t HeIdx=HeTPC[i];
1026 AliESDtrack *HeTrack=lESDevent->GetTrack(HeIdx);
1028 // statusT= (ULong_t)HeTrack->GetStatus();
1029 // isTOFHe = (((statusT & AliESDtrack::kTOFout) != 0) && ((statusT & AliESDtrack::kTIME) != 0));
1030 IsHeITSRefit = (status & AliESDtrack::kITSrefit);
1033 DcaHeToPrimVertex = TMath::Abs(HeTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
1035 AliExternalTrackParam trackInHe(*HeTrack);
1037 if ( DcaPionToPrimVertex < fgDNmin) //OK
1038 if ( DcaHeToPrimVertex < fgDNmin) continue; //OK
1043 dca= PionTrack->GetDCA(HeTrack,lMagneticField,xn,xp); //!dca (Neg to Pos)
1045 if (dca > fgDCAmax) continue;
1046 if ((xn+xp) > 2*fgRmax) continue;
1047 if ((xn+xp) < 2*fgRmin) continue;
1049 //CORRECTION from AliV0Vertex
1051 Bool_t corrected=kFALSE;
1052 if ((trackInPion.GetX() > 3.) && (xn < 3.)) {
1053 //correct for the beam pipe material
1056 if ((trackInHe.GetX() > 3.) && (xp < 3.)) {
1057 //correct for the beam pipe material
1061 dca=trackInPion.GetDCA(&trackInHe,lMagneticField,xn,xp);
1062 if (dca > fgDCAmax) continue;
1063 if ((xn+xp) > 2*fgRmax) continue;
1064 if ((xn+xp) < 2*fgRmin) continue;
1067 //=============================================//
1068 // Make "V0" with found tracks //
1069 //=============================================//
1071 trackInPion.PropagateTo(xn,lMagneticField);
1072 trackInHe.PropagateTo(xp,lMagneticField);
1074 AliESDv0 vertex(trackInPion,PionIdx,trackInHe,HeIdx);
1075 if (vertex.GetChi2V0() > fgChi2max) continue;
1077 Float_t CosPointingAngle=vertex.GetV0CosineOfPointingAngle(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex); //PointingAngle
1078 if (CosPointingAngle < fgCPAmin) continue;
1080 vertex.SetDcaV0Daughters(dca);
1081 vertex.SetV0CosineOfPointingAngle(CosPointingAngle);
1083 fPos[0]=vertex.Xv();
1084 fPos[1]=vertex.Yv();
1085 fPos[2]=vertex.Zv();
1087 HeTrack->PxPyPz(momHeVett);
1088 PionTrack->PxPyPz(momPionVett);
1090 Double_t raggio=TMath::Sqrt(fPos[0]*fPos[0]+fPos[1]*fPos[1]+fPos[2]*fPos[2]);
1091 HeTrack->GetPxPyPzAt(raggio,lMagneticField,momHeVettAt);
1092 PionTrack->GetPxPyPzAt(raggio,lMagneticField,momPionVettAt);
1094 //------------------------------------------------------------------------//
1096 HeTrack->GetImpactParameters(impactXY, impactZ);
1098 PionTrack->GetImpactParameters(impactXYpi, impactZpi);
1100 if(vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex)>3) continue;
1102 //salvo solo fino a 3.1 GeV/c2
1104 vHelium.SetXYZM(2*momHeVettAt[0],2*momHeVettAt[1],2*momHeVettAt[2],Helium3Mass);
1105 vPion.SetXYZM(momPionVettAt[0],momPionVettAt[1],momPionVettAt[2],PionMass);
1111 Int_t fIdxInt[200]; //dummy array
1112 Int_t nClustersTPCHe = HeTrack->GetTPCclusters(fIdxInt);
1113 Int_t nClustersTPCPi = PionTrack->GetTPCclusters(fIdxInt);
1115 //----------------------------------------------------------------------//
1117 trunNumber =(Float_t)runNumber;
1118 tbunchcross =(Float_t)BCNumber;
1119 torbit =(Float_t)OrbitNumber;
1120 tperiod =(Float_t)PeriodNumber;
1121 teventtype =(Float_t)eventtype;
1122 tTrackNumber =(Float_t)TrackNumber;
1123 tpercentile =(Float_t)percentile;
1124 txPrimaryVertex =(Float_t)xPrimaryVertex; //PRIMARY
1125 tyPrimaryVertex =(Float_t)yPrimaryVertex;
1126 tzPrimaryVertex =(Float_t)zPrimaryVertex;
1127 txSecondaryVertex =(Float_t)fPos[0]; //SECONDARY
1128 tySecondaryVertex =(Float_t)fPos[1];
1129 tzSecondaryVertex =(Float_t)fPos[2];
1130 tdcaTracks =(Float_t)dca; //between 2 tracks
1131 tCosPointingAngle =(Float_t)CosPointingAngle; //cosPointingAngle da V0
1132 tDCAV0toPrimaryVertex =(Float_t)vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex);
1133 tHeSign =(Float_t)HeTrack->GetSign(); //He
1134 tHepInTPC =(Float_t)trackInHe.GetP();
1135 tHeTPCsignal =(Float_t)HeTrack->GetTPCsignal();
1136 tDcaHeToPrimVertex =(Float_t)DcaHeToPrimVertex;
1137 tHeEta =(Float_t)HeTrack->Eta();
1138 tmomHex =(Float_t)momHeVett[0];
1139 tmomHey =(Float_t)momHeVett[1];
1140 tmomHez =(Float_t)momHeVett[2];
1141 tmomHeAtSVx =(Float_t)momHeVettAt[0];
1142 tmomHeAtSVy =(Float_t)momHeVettAt[1];
1143 tmomHeAtSVz =(Float_t)momHeVettAt[2];
1144 tHeTPCNcls =(Float_t)HeTrack->GetTPCNcls();
1145 tHeimpactXY =(Float_t)impactXY;
1146 tHeimpactZ =(Float_t)impactZ;
1147 tHeITSClusterMap =(Float_t)HeTrack->GetITSClusterMap();
1148 tIsHeITSRefit =(Float_t)IsHeITSRefit;
1149 tPionSign =(Float_t)PionTrack->GetSign(); //Pion
1150 tPionpInTPC =(Float_t)trackInPion.GetP();
1151 tPionTPCsignal =(Float_t)PionTrack->GetTPCsignal();
1152 tDcaPionToPrimVertex =(Float_t)DcaPionToPrimVertex;
1153 tPionEta =(Float_t)PionTrack->Eta();
1154 tmomPionx =(Float_t)momPionVett[0];
1155 tmomPiony =(Float_t)momPionVett[1];
1156 tmomPionz =(Float_t)momPionVett[2];
1157 tmomNegPionAtSVx =(Float_t)momPionVettAt[0];
1158 tmomNegPionAtSVy =(Float_t)momPionVettAt[1];
1159 tmomNegPionAtSVz =(Float_t)momPionVettAt[2];
1160 tPionTPCNcls =(Float_t)PionTrack->GetTPCNcls();
1161 tPionimpactXY =(Float_t)impactXYpi;
1162 tPionimpactZ =(Float_t)impactZpi;
1163 tPionITSClusterMap =(Float_t)PionTrack->GetITSClusterMap();
1164 tIsPiITSRefit =(Float_t)IsPiITSRefit;
1167 tchi2He =(Float_t)HeTrack->GetTPCchi2()/(Float_t)(nClustersTPCHe);
1168 tchi2Pi =(Float_t)PionTrack->GetTPCchi2()/(Float_t)(nClustersTPCPi);
1179 PostData(1,fListHist);
1180 PostData(2,fNtuple1);
1181 PostData(3,fNtuple4);
1186 //________________________________________________________________________
1188 void AliAnalysisTaskHelium3Pi::Terminate(Option_t *)
1190 // Draw result to the screen
1191 // Called once at the end of the query