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" , 12 , -0.5, 11.5);
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");
399 fHistEventMultiplicity->GetXaxis()->SetBinLabel(10,"Any Events");
400 fHistEventMultiplicity->GetXaxis()->SetBinLabel(11,"Any Events w/|Vz|<10cm");
402 fListHist->Add(fHistEventMultiplicity);
405 if(! fHistTrackMultiplicity ){
406 fHistTrackMultiplicity = new TH2F( "fHistTrackMultiplicity" , "Nb of Tracks", 2500,0, 25000,210,-1,104);
407 fHistTrackMultiplicity->GetXaxis()->SetTitle("Number of tracks");
408 fHistTrackMultiplicity->GetYaxis()->SetTitle("Percentile");
409 fListHist->Add(fHistTrackMultiplicity);
412 if(! fHistTrackMultiplicityCent ){
413 fHistTrackMultiplicityCent = new TH2F( "fHistTrackMultiplicityCent", "Nb of Tracks Central Events", 2500,0, 25000,210,-1,104 );
414 fHistTrackMultiplicityCent->GetXaxis()->SetTitle("Number of tracks");
415 fHistTrackMultiplicityCent->GetYaxis()->SetTitle("Percentile");
416 fListHist->Add(fHistTrackMultiplicityCent);
419 if(! fHistTrackMultiplicitySemiCent ){
420 fHistTrackMultiplicitySemiCent = new TH2F( "fHistTrackMultiplicitySemiCent" , "Nb of Tracks SemiCentral Events", 2500,0, 25000 ,210,-1,104);
421 fHistTrackMultiplicitySemiCent->GetXaxis()->SetTitle("Number of tracks");
422 fHistTrackMultiplicitySemiCent->GetYaxis()->SetTitle("Percentile");
423 fListHist->Add(fHistTrackMultiplicitySemiCent);
426 if(! fHistTrackMultiplicityMB ){
427 fHistTrackMultiplicityMB = new TH2F( "fHistTrackMultiplicityMB" , "Nb of Tracks MBral Events", 2500,0, 25000,210,-1,104 );
428 fHistTrackMultiplicityMB->GetXaxis()->SetTitle("Number of tracks");
429 fHistTrackMultiplicityMB->GetYaxis()->SetTitle("Percentile");
430 fListHist->Add(fHistTrackMultiplicityMB);
433 if(! fHistTrackMultiplicityPVCent ){
434 fHistTrackMultiplicityPVCent = new TH2F( "fHistTrackMultiplicityPVCent" , "Nb of Tracks Central Events", 2500,0, 25000,210,-1,104 );
435 fHistTrackMultiplicityPVCent->GetXaxis()->SetTitle("Number of tracks");
436 fHistTrackMultiplicityPVCent->GetYaxis()->SetTitle("Percentile");
437 fListHist->Add(fHistTrackMultiplicityPVCent);
440 if(! fHistTrackMultiplicityPVSemiCent ){
441 fHistTrackMultiplicityPVSemiCent = new TH2F( "fHistTrackMultiplicityPVSemiCent" , "Nb of Tracks SemiCentral Events", 2500,0, 25000 ,210,-1,104);
442 fHistTrackMultiplicityPVSemiCent->GetXaxis()->SetTitle("Number of tracks");
443 fHistTrackMultiplicityPVSemiCent->GetYaxis()->SetTitle("Percentile");
444 fListHist->Add(fHistTrackMultiplicityPVSemiCent);
447 if(! fHistTrackMultiplicityPVMB ){
448 fHistTrackMultiplicityPVMB = new TH2F( "fHistTrackMultiplicityPVMB" , "Nb of Tracks MBral Events", 2500,0, 25000,210,-1,104 );
449 fHistTrackMultiplicityPVMB->GetXaxis()->SetTitle("Number of tracks");
450 fHistTrackMultiplicityPVMB->GetYaxis()->SetTitle("Percentile");
451 fListHist->Add(fHistTrackMultiplicityPVMB);
455 fhBB = new TH2F( "fhBB" , "BetheBlochTPC" , 120,-6,6,150,0,1500);
456 fhBB->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
457 fhBB->GetYaxis()->SetTitle("TPC Signal");
458 fListHist->Add(fhBB);
462 fhTOF = new TH2F( "fhTOF" , "Scatter Plot TOF" , 120,-6,6,100,0,1.2);
463 fhTOF->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
464 fhTOF->GetYaxis()->SetTitle("#beta");
465 fListHist->Add(fhTOF);
469 fhMassTOF=new TH1F ("fhMassTOF","Particle Mass - TOF", 300,0 ,5);
470 fhMassTOF->GetXaxis()->SetTitle("Mass (GeV/#it{c}^{2})");
471 fListHist->Add(fhMassTOF);
475 fhBBPions = new TH2F( "fhBBPions" , "Bethe-Bloch TPC Pions" , 120,-6,6,150,0,1500);
476 fhBBPions->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
477 fhBBPions->GetYaxis()->SetTitle("TPC Signal");
478 fListHist->Add(fhBBPions);
482 fhBBHe = new TH2F( "fhBBHe" , "Bethe-Bloch TPC He" , 120,-6,6,150,0,1500);
483 fhBBHe->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
484 fhBBHe->GetYaxis()->SetTitle("TPC Signal");
485 fListHist->Add(fhBBHe);
489 fhNaPos = new TH2F( "fhNaPos" , "Distribution Pos" , 500,0,5,40,-10,10);
490 fhNaPos->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
491 fhNaPos->GetYaxis()->SetTitle("(TPCSignal-bbtheo)/bbtheo (He)");
492 fListHist->Add(fhNaPos);
496 fhNaNeg = new TH2F( "fhNaNeg" , "Distribution Neg" , 500,0,5,40,-10,10);
497 fhNaNeg->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
498 fhNaNeg->GetYaxis()->SetTitle("(TPCSignal-bbtheo)/bbtheo (He)");
499 fListHist->Add(fhNaNeg);
502 if(! fBetavsTPCsignalPos ){
503 fBetavsTPCsignalPos = new TH2F("fBetavsTPCsignalPos","fBetavsTPCsignalPos",100,0,1.2,150,0,1500);
504 fBetavsTPCsignalPos->GetXaxis()->SetTitle("#beta");
505 fBetavsTPCsignalPos->GetYaxis()->SetTitle("TPC Signal");
506 fListHist->Add(fBetavsTPCsignalPos);
509 if(! fBetavsTPCsignalNeg ){
510 fBetavsTPCsignalNeg = new TH2F("fBetavsTPCsignalNeg","fBetavsTPCsignalNeg",100,0,1.2,150,0,1500);
511 fBetavsTPCsignalNeg->GetXaxis()->SetTitle("#beta");
512 fBetavsTPCsignalNeg->GetYaxis()->SetTitle("TPC Signal");
513 fListHist->Add(fBetavsTPCsignalNeg);
520 fNtuple1 = new TTree("fNtuple1","fNtuple1");
522 fNtuple1->Branch("trunNumber" ,&trunNumber ,"trunNumber/F");
523 fNtuple1->Branch("tbunchcross" ,&tbunchcross ,"tbunchcross/F");
524 fNtuple1->Branch("torbit" ,&torbit ,"torbit/F");
525 fNtuple1->Branch("tperiod" ,&tperiod ,"tperiod/F");
526 fNtuple1->Branch("teventtype" ,&teventtype ,"teventtype/F");
527 fNtuple1->Branch("tTrackNumber" ,&tTrackNumber ,"tTrackNumber/F");
528 fNtuple1->Branch("tpercentile" ,&tpercentile ,"tpercentile/F") ;
529 fNtuple1->Branch("txPrimaryVertex" ,&txPrimaryVertex ,"txPrimaryVertex/F");
530 fNtuple1->Branch("tyPrimaryVertex" ,&tyPrimaryVertex ,"tyPrimaryVertex/F");
531 fNtuple1->Branch("tzPrimaryVertex" ,&tzPrimaryVertex ,"tzPrimaryVertex/F");
532 fNtuple1->Branch("txSecondaryVertex" ,&txSecondaryVertex ,"txSecondaryVertex/F");
533 fNtuple1->Branch("tySecondaryVertex" ,&tySecondaryVertex ,"tySecondaryVertex/F");
534 fNtuple1->Branch("tzSecondaryVertex" ,&tzSecondaryVertex ,"tzSecondaryVertex/F");
535 fNtuple1->Branch("tdcaTracks" ,&tdcaTracks ,"tdcaTracks/F");
536 fNtuple1->Branch("tCosPointingAngle" ,&tCosPointingAngle ,"tCosPointingAngle/F");
537 fNtuple1->Branch("tDCAV0toPrimaryVertex",&tDCAV0toPrimaryVertex,"tDCAV0toPrimaryVertex/F");
538 fNtuple1->Branch("tHeSign" ,&tHeSign ,"tHeSign/F");
539 fNtuple1->Branch("tHepInTPC" ,&tHepInTPC ,"tHepInTPC/F");
540 fNtuple1->Branch("tHeTPCsignal" ,&tHeTPCsignal ,"tHeTPCsignal/F");
541 fNtuple1->Branch("tDcaHeToPrimVertex" ,&tDcaHeToPrimVertex ,"tDcaHeToPrimVertex/F");
542 fNtuple1->Branch("tHeEta" ,&tHeEta ,"tHeEta/F");
543 fNtuple1->Branch("tmomHex" ,&tmomHex ,"tmomHex/F");
544 fNtuple1->Branch("tmomHey" ,&tmomHey ,"tmomHey/F");
545 fNtuple1->Branch("tmomHez" ,&tmomHez ,"tmomHez/F");
546 fNtuple1->Branch("tmomHeAtSVx" ,&tmomHeAtSVx ,"tmomHeAtSVx/F");
547 fNtuple1->Branch("tmomHeAtSVy" ,&tmomHeAtSVy ,"tmomHeAtSVy/F");
548 fNtuple1->Branch("tmomHeAtSVz" ,&tmomHeAtSVz ,"tmomHeAtSVz/F");
549 fNtuple1->Branch("tHeTPCNcls" ,&tHeTPCNcls ,"tHeTPCNcls/F");
550 fNtuple1->Branch("tHeimpactXY" ,&tHeimpactXY ,"tHeimpactXY/F");
551 fNtuple1->Branch("tHeimpactZ" ,&tHeimpactZ ,"tHeimpactZ/F");
552 fNtuple1->Branch("tHeITSClusterMap" ,&tHeITSClusterMap ,"tHeITSClusterMap/F");
553 fNtuple1->Branch("tIsHeITSRefit" ,&tIsHeITSRefit ,"tIsHeITSRefit/F");
554 fNtuple1->Branch("tPionSign" ,&tPionSign ,"tPionSign/F");
555 fNtuple1->Branch("tPionpInTPC" ,&tPionpInTPC ,"tPionpInTPC/F");
556 fNtuple1->Branch("tPionTPCsignal" ,&tPionTPCsignal ,"tPionTPCsignal/F");
557 fNtuple1->Branch("tDcaPionToPrimVertex" ,&tDcaPionToPrimVertex ,"tDcaPionToPrimVertex/F");
558 fNtuple1->Branch("tPionEta" ,&tPionEta ,"tPionEta/F");
559 fNtuple1->Branch("tmomPionx" ,&tmomPionx ,"tmomPionx/F");
560 fNtuple1->Branch("tmomPiony" ,&tmomPiony ,"tmomPiony/F");
561 fNtuple1->Branch("tmomPionz" ,&tmomPionz ,"tmomPionz/F");
562 fNtuple1->Branch("tmomNegPionAtSVx" ,&tmomNegPionAtSVx ,"tmomNegPionAtSVx/F");
563 fNtuple1->Branch("tmomNegPionAtSVy" ,&tmomNegPionAtSVy ,"tmomNegPionAtSVy/F");
564 fNtuple1->Branch("tmomNegPionAtSVz" ,&tmomNegPionAtSVz ,"tmomNegPionAtSVz/F");
565 fNtuple1->Branch("tPionTPCNcls" ,&tPionTPCNcls ,"tPionTPCNcls/F");
566 fNtuple1->Branch("tPionimpactXY" ,&tPionimpactXY ,"tPionimpactXY/F");
567 fNtuple1->Branch("tPionimpactZ" ,&tPionimpactZ ,"tPionimpactZ/F");
568 fNtuple1->Branch("tPionITSClusterMap" ,&tPionITSClusterMap ,"tPionITSClusterMap/F");
569 fNtuple1->Branch("tIsPiITSRefit" ,&tIsPiITSRefit ,"tIsPiITSRefit/F");
570 fNtuple1->Branch("txn" ,&txn ,"txn/F");
571 fNtuple1->Branch("txp" ,&txp ,"txp/F");
572 fNtuple1->Branch("tchi2He" ,&tchi2He ,"tchi2He/F");
573 fNtuple1->Branch("tchi2Pi" ,&tchi2Pi ,"tchi2Pi/F");
579 fNtuple4 = new TTree("fNtuple4","fNtuple4");
581 fNtuple4->Branch("tHelrunNumber" ,&tHelrunNumber ,"tHelrunNumber/F");
582 fNtuple4->Branch("tHelBCNumber" ,&tHelBCNumber ,"tHelBCNumber/F");
583 fNtuple4->Branch("tHelOrbitNumber" ,&tHelOrbitNumber ,"tHelOrbitNumber/F");
584 fNtuple4->Branch("tHelPeriodNumber" ,&tHelPeriodNumber ,"tHelPeriodNumber/F");
585 fNtuple4->Branch("tHeleventtype" ,&tHeleventtype ,"tHeleventtype/F");
586 fNtuple4->Branch("tHelisHeITSrefit" ,&tHelisHeITSrefit ,"tHelisHeITSrefit/F");
587 fNtuple4->Branch("tHelpercentile" ,&tHelpercentile ,"tHelpercentile/F");
588 fNtuple4->Branch("tHelSign" ,&tHelSign ,"tHelSign/F");
589 fNtuple4->Branch("tHelpinTPC" ,&tHelpinTPC ,"tHelpinTPC/F");
590 fNtuple4->Branch("tHelGetTPCsignal" ,&tHelGetTPCsignal ,"tHelGetTPCsignal/F");
591 fNtuple4->Branch("tHelPx" ,&tHelPx ,"tHelPx/F");
592 fNtuple4->Branch("tHelPy" ,&tHelPy ,"tHelPy/F");
593 fNtuple4->Branch("tHelPz" ,&tHelPz ,"tHelPz/F");
594 fNtuple4->Branch("tHelEta" ,&tHelEta ,"tHelEta/F");
595 fNtuple4->Branch("tHelisTOF" ,&tHelisTOF ,"tHelisTOF/F");
596 fNtuple4->Branch("tHelpoutTPC" ,&tHelpoutTPC ,"tHelpoutTPC/F");
597 fNtuple4->Branch("tHeltimeTOF" ,&tHeltimeTOF ,"tHeltimeTOF/F");
598 fNtuple4->Branch("tHeltrackLenghtTOF" ,&tHeltrackLenghtTOF ,"tHeltrackLenghtTOF/F");
599 fNtuple4->Branch("tHelimpactXY" ,&tHelimpactXY ,"tHelimpactXY/F");
600 fNtuple4->Branch("tHelimpactZ" ,&tHelimpactZ ,"tHelimpactZ/F");
601 fNtuple4->Branch("tHelmapITS" ,&tHelmapITS ,"tHelmapITS/F");
602 fNtuple4->Branch("tHelTPCNcls" ,&tHelTPCNcls ,"tHelTPCNcls/F");
603 fNtuple4->Branch("tHelTRDsignal" ,&tHelTRDsignal ,"tHelTRDsignal/F");
604 fNtuple4->Branch("tHelxPrimaryVertex" ,&tHelxPrimaryVertex ,"tHelxPrimaryVertex/F");
605 fNtuple4->Branch("tHelyPrimaryVertex" ,&tHelyPrimaryVertex ,"tHelyPrimaryVertex/F");
606 fNtuple4->Branch("tHelzPrimaryVertex" ,&tHelzPrimaryVertex ,"tHelzPrimaryVertex/F");
607 fNtuple4->Branch("tHelchi2PerClusterTPC",&tHelchi2PerClusterTPC,"tHelchi2PerClusterTPC/F");
612 PostData(1, fListHist);
613 PostData(2, fNtuple1);
614 PostData(3, fNtuple4);
615 }// end UserCreateOutputObjects
618 //====================== USER EXEC ========================
620 void AliAnalysisTaskHelium3Pi::UserExec(Option_t *)
622 //_______________________________________________________________________
624 //!*********************!//
625 //! Define variables !//
626 //!*********************!//
628 Double_t pinTPC=0.,poutTPC=0.,TPCSignal=0.;
629 Double_t xPrimaryVertex=0.,yPrimaryVertex=0.,zPrimaryVertex=0.;
630 Double_t massTOF=0.,timeTOF=0.,trackLenghtTOF=0.,betaTOF=0.;
633 // ULong_t statusT=0;
636 Bool_t isTPC=kFALSE,isTOF=kFALSE,IsHeITSRefit=kFALSE,IsPiITSRefit=kFALSE ;
638 Float_t nSigmaNegPion=0.;
640 Double_t cutNSigma = 3;
641 Double_t bbtheoM=0.,bbtheo=0.;
642 Double_t zNathashaNeg=0;
643 Double_t zNathashaPos=0;
644 Double_t fPos[3]={0.,0.,0.};
645 Double_t runNumber=0.;
646 // Double_t evNumber=0.;
648 Double_t BCNumber=0.;
649 Double_t OrbitNumber=0.;
650 Double_t PeriodNumber=0.;
652 Double_t Helium3Mass = 2.80839;
653 Double_t PionMass = 0.13957;
656 TLorentzVector vPion,vHelium,vSum;
658 //!----------------------------------------------------------------
660 //! A set of very loose parameters for cuts
662 Double_t fgChi2max=33.; //! max chi2
663 Double_t fgDNmin=0.05; //! min imp parameter for the 1st daughter = 500um
664 Double_t fgDCAmax=1.0; //! max DCA between the daughter tracks in cm
665 Double_t fgCPAmin=0.99; //! min cosine of V0's pointing angle
666 // Double_t fgRmin=0.2; //! min radius of the fiducial volume //original
667 Double_t fgRmin=0.1; //! min radius of the fiducial volume = 1 mm
668 Double_t fgRmax=200.; //! max radius of the fiducial volume = 2 m
670 //------------------------------------------
673 // Called for EACH event
675 AliVEvent *event = InputEvent();
676 if (!event) { Printf("ERROR: Could not retrieve event"); return; }
678 Info("AliAnalysisTaskHelium3Pi","Starting UserExec");
682 // create pointer to event
683 AliESDEvent* lESDevent = dynamic_cast<AliESDEvent*>(event);
685 AliError("Cannot get the ESD event");
689 fHistEventMultiplicity->Fill(0);
691 Double_t lMagneticField=lESDevent->GetMagneticField();
692 Int_t TrackNumber = -1;
695 //*****************//
697 //*****************//
699 AliCentrality *centrality = lESDevent->GetCentrality();
700 Float_t percentile=centrality->GetCentralityPercentile("V0M");
702 TrackNumber = lESDevent->GetNumberOfTracks();
703 if (TrackNumber<2) return;
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);
720 Bool_t isSelectedAny = (inputHandler->IsEventSelected() & AliVEvent::kAny);
722 if(isSelectedCentral){
723 fHistEventMultiplicity->Fill(3);
724 fHistTrackMultiplicityCent->Fill(TrackNumber,percentile);
728 if(isSelectedSemiCentral){
729 fHistEventMultiplicity->Fill(4);
730 fHistTrackMultiplicitySemiCent->Fill(TrackNumber,percentile);
735 fHistEventMultiplicity->Fill(5);
736 fHistTrackMultiplicityMB->Fill(TrackNumber,percentile);
740 if(!isSelectedCentral && !isSelectedSemiCentral && !isSelectedMB && isSelectedAny){
741 fHistEventMultiplicity->Fill(9);
742 fHistTrackMultiplicity->Fill(TrackNumber,percentile); //tracce per evento
746 //if(isSelectedCentral || isSelectedSemiCentral || isSelectedMB || isSelectedAny){
747 if(eventtype ==1 || eventtype ==2 || eventtype==3 || eventtype==4){
751 // Primary vertex cut
753 const AliESDVertex *vtx = lESDevent->GetPrimaryVertexTracks();
755 if(vtx->GetNContributors()<1) {
758 vtx = lESDevent->GetPrimaryVertexSPD();
760 if(vtx->GetNContributors()<1) {
761 Info("AliAnalysisTaskHelium3Pi","No good vertex, skip event");
762 return; // NO GOOD VERTEX, SKIP EVENT
766 fHistEventMultiplicity->Fill(1); // analyzed events with PV
768 xPrimaryVertex=vtx->GetX();
769 yPrimaryVertex=vtx->GetY();
770 zPrimaryVertex=vtx->GetZ();
772 if(TMath::Abs(zPrimaryVertex)>10) return;
775 fHistTrackMultiplicityPVCent->Fill(TrackNumber,percentile);
776 fHistEventMultiplicity->Fill(6);
780 fHistTrackMultiplicityPVSemiCent->Fill(TrackNumber,percentile);
781 fHistEventMultiplicity->Fill(7);
785 fHistTrackMultiplicityPVMB->Fill(TrackNumber,percentile);
786 fHistEventMultiplicity->Fill(8);
790 fHistEventMultiplicity->Fill(10);
794 fHistEventMultiplicity->Fill(2);
796 //Find Pair candidates
798 TArrayI PionsTPC(TrackNumber); //Neg pions
801 TArrayI HeTPC(TrackNumber); //helium3
804 const Double_t speedOfLight = TMath::C()*1E2*1E-12; // cm/ps
806 Float_t impactXY=-999, impactZ=-999;
807 Float_t impactXYpi=-999, impactZpi=-999;
810 //*************************************************************
812 runNumber = lESDevent->GetRunNumber();
813 BCNumber = lESDevent->GetBunchCrossNumber();
814 OrbitNumber = lESDevent->GetOrbitNumber();
815 PeriodNumber= lESDevent->GetPeriodNumber();
817 //*************************************************************
819 for (Int_t j=0; j<TrackNumber; j++) { //loop on tracks
821 AliESDtrack *esdtrack=lESDevent->GetTrack(j);
822 // AliVTrack* esdtrack= (AliVTrack *) fEvent->GetTrack(iT);
826 AliError(Form("ERROR: Could not retrieve esdtrack %d",j));
830 // ************** Track cuts ****************
832 if (!fESDtrackCuts->AcceptTrack(esdtrack)) continue;
835 status = (ULong_t)esdtrack->GetStatus();
836 isTPC = (((status) & AliESDtrack::kTPCin) != 0);
837 isTOF = ((((status) & AliESDtrack::kTOFout) != 0) && (((status) & AliESDtrack::kTIME) != 0));
839 UInt_t mapITS=esdtrack->GetITSClusterMap();
841 //----------------------------------------------
843 //****** Cuts from AliV0Vertex.cxx *************
845 Double_t d=esdtrack->GetD(xPrimaryVertex,yPrimaryVertex,lMagneticField);
846 // if (TMath::Abs(d)<fgDPmin) continue;
847 if (TMath::Abs(d)>fgRmax) continue;
849 //---- (Usefull) Stuff
851 TPCSignal=esdtrack->GetTPCsignal();
853 if (TPCSignal<10)continue;
854 if (TPCSignal>1000)continue;
857 if(!esdtrack->GetTPCInnerParam())continue;
859 AliExternalTrackParam trackIn(*esdtrack->GetInnerParam());
860 pinTPC= trackIn.GetP();
862 //pinTPC= esdtrack->GetTPCMomentum();
867 if((status) & (AliESDtrack::kITSrefit!=0)){
868 fhBB->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
871 timeTOF=esdtrack->GetTOFsignal(); // ps
872 trackLenghtTOF= esdtrack->GetIntegratedLength(); // cm
876 if(!esdtrack->GetOuterParam())continue;
878 AliExternalTrackParam trackOut(*esdtrack->GetOuterParam());
880 poutTPC = trackOut.GetP();
882 betaTOF= (trackLenghtTOF/timeTOF)/2.99792458e-2;
884 fhTOF->Fill(poutTPC*esdtrack->GetSign(),betaTOF);
886 Double_t mass2=(poutTPC*poutTPC)*((((speedOfLight*speedOfLight)*(timeTOF*timeTOF))-(trackLenghtTOF*trackLenghtTOF))/(trackLenghtTOF*trackLenghtTOF));
887 if(mass2>0) massTOF=TMath::Sqrt(mass2);
888 fhMassTOF->Fill(massTOF);
890 if(esdtrack->GetSign() < 0.)fBetavsTPCsignalNeg->Fill(betaTOF,TPCSignal);
891 if(esdtrack->GetSign() > 0.)fBetavsTPCsignalPos->Fill(betaTOF,TPCSignal);
897 // bbtheo =BetheBloch((2*pinTPC)/3.,2,kTRUE); //! OK
898 // bbtheoM=(1 - 0.08*5)*bbtheo; //! OK
899 // bbtheoP=(1 + 0.08*5)*bbtheo; //! OK
902 bbtheo = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 7);
904 if(esdtrack->GetSign()<0){
905 zNathashaNeg=bbtheo;//(TPCSignal-bbtheo)/bbtheo;
906 // cout<<"BBtheo 1 :"<<zNathashaNeg<<endl;
907 fhNaNeg->Fill(pinTPC,zNathashaNeg);
910 if(esdtrack->GetSign() > 0.){
911 zNathashaPos=bbtheo;//(TPCSignal-bbtheo)/bbtheo;
912 fhNaPos->Fill(pinTPC,zNathashaPos);
915 nSigmaNegPion=TMath::Abs(fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 2));
918 if ( (nSigmaNegPion < cutNSigma)){
920 // cout<<"Nsigma pi: "<<nSigmaNegPion<<endl;
922 fhBBPions->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
925 PionsTPC[nPionsTPC++]=j;
929 // nSigmaNegPion=(fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 2));
931 bbtheoM = TMath::Abs((fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 7)));
933 // if( TPCSignal > bbtheoM ) {
934 // if( bbtheoM > -3.) {
939 fhBBHe->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
942 Bool_t isHeITSrefit=((status) & (AliESDtrack::kITSrefit));
944 esdtrack->GetImpactParameters(impactXY, impactZ);
946 Int_t fIdxInt[200]; //dummy array
947 Int_t nClustersTPC = esdtrack->GetTPCclusters(fIdxInt);
949 Float_t chi2PerClusterTPC = esdtrack->GetTPCchi2()/(Float_t)(nClustersTPC);
951 tHelrunNumber =(Float_t)runNumber;
952 tHelBCNumber =(Float_t)BCNumber;
953 tHelOrbitNumber =(Float_t)OrbitNumber;
954 tHelPeriodNumber =(Float_t)PeriodNumber;
955 tHeleventtype =(Float_t)eventtype;
956 tHelisHeITSrefit =(Float_t)isHeITSrefit;
957 tHelpercentile =(Float_t)percentile;
958 tHelSign =(Float_t)esdtrack->GetSign();
959 tHelpinTPC =(Float_t)pinTPC;
960 tHelGetTPCsignal =(Float_t)esdtrack->GetTPCsignal();
961 tHelPx =(Float_t)esdtrack->Px();
962 tHelPy =(Float_t)esdtrack->Py();
963 tHelPz =(Float_t)esdtrack->Pz();
964 tHelEta =(Float_t)esdtrack->Eta();
965 tHelisTOF =(Float_t)isTOF;
966 tHelpoutTPC =(Float_t)poutTPC;
967 tHeltimeTOF =(Float_t)timeTOF;
968 tHeltrackLenghtTOF =(Float_t)trackLenghtTOF;
969 tHelimpactXY =(Float_t)impactXY;
970 tHelimpactZ =(Float_t)impactZ;
971 tHelmapITS =(Float_t)mapITS;
972 tHelTPCNcls =(Float_t)esdtrack->GetTPCNcls();
973 tHelTRDsignal =(Float_t)esdtrack->GetTRDsignal();
974 tHelxPrimaryVertex =(Float_t)xPrimaryVertex;
975 tHelyPrimaryVertex =(Float_t)yPrimaryVertex;
976 tHelzPrimaryVertex =(Float_t)zPrimaryVertex;
977 tHelchi2PerClusterTPC =(Float_t)chi2PerClusterTPC;
984 PionsTPC.Set(nPionsTPC);
987 Double_t DcaHeToPrimVertex=0;
988 Double_t DcaPionToPrimVertex=0;
990 impactXY=-999, impactZ=-999;
991 impactXYpi=-999, impactZpi=-999;
995 // Vettors for il PxPyPz
997 Double_t momPionVett[3];
998 for(Int_t i=0;i<3;i++)momPionVett[i]=0;
1000 Double_t momHeVett[3];
1001 for(Int_t i=0;i<3;i++)momHeVett[i]=0;
1005 Double_t momPionVettAt[3];
1006 for(Int_t i=0;i<3;i++)momPionVettAt[i]=0;
1008 Double_t momHeVettAt[3];
1009 for(Int_t i=0;i<3;i++)momHeVettAt[i]=0;
1011 //--------------- LOOP PAIRS ----------------
1013 for (Int_t k=0; k < nPionsTPC; k++) { //! Pions Loop
1015 DcaPionToPrimVertex=0.;
1016 DcaHeToPrimVertex=0;
1018 Int_t PionIdx=PionsTPC[k];
1020 AliESDtrack *PionTrack=lESDevent->GetTrack(PionIdx);
1022 statusPi = (ULong_t)PionTrack->GetStatus();
1023 // isTOFPi = ((((statusPi) & (AliESDtrack::kTOFout)) != 0) && (((statusPi) & (AliESDtrack::kTIME)) != 0));
1024 IsPiITSRefit = ((statusPi) & (AliESDtrack::kITSrefit));
1027 DcaPionToPrimVertex = TMath::Abs(PionTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
1029 if(DcaPionToPrimVertex<0.2)continue;
1031 AliExternalTrackParam trackInPion(*PionTrack);
1033 for (Int_t i=0; i<nHeTPC; i++){ //! Helium Loop
1035 Int_t HeIdx=HeTPC[i];
1037 AliESDtrack *HeTrack=lESDevent->GetTrack(HeIdx);
1039 // statusT= (ULong_t)HeTrack->GetStatus();
1040 // isTOFHe = (((statusT & AliESDtrack::kTOFout) != 0) && ((statusT & AliESDtrack::kTIME) != 0));
1041 IsHeITSRefit = (status & AliESDtrack::kITSrefit);
1044 DcaHeToPrimVertex = TMath::Abs(HeTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
1046 AliExternalTrackParam trackInHe(*HeTrack);
1048 if ( DcaPionToPrimVertex < fgDNmin) //OK
1049 if ( DcaHeToPrimVertex < fgDNmin) continue; //OK
1054 dca= PionTrack->GetDCA(HeTrack,lMagneticField,xn,xp); //!dca (Neg to Pos)
1056 if (dca > fgDCAmax) continue;
1057 if ((xn+xp) > 2*fgRmax) continue;
1058 if ((xn+xp) < 2*fgRmin) continue;
1060 //CORRECTION from AliV0Vertex
1062 Bool_t corrected=kFALSE;
1063 if ((trackInPion.GetX() > 3.) && (xn < 3.)) {
1064 //correct for the beam pipe material
1067 if ((trackInHe.GetX() > 3.) && (xp < 3.)) {
1068 //correct for the beam pipe material
1072 dca=trackInPion.GetDCA(&trackInHe,lMagneticField,xn,xp);
1073 if (dca > fgDCAmax) continue;
1074 if ((xn+xp) > 2*fgRmax) continue;
1075 if ((xn+xp) < 2*fgRmin) continue;
1078 //=============================================//
1079 // Make "V0" with found tracks //
1080 //=============================================//
1082 trackInPion.PropagateTo(xn,lMagneticField);
1083 trackInHe.PropagateTo(xp,lMagneticField);
1085 AliESDv0 vertex(trackInPion,PionIdx,trackInHe,HeIdx);
1086 if (vertex.GetChi2V0() > fgChi2max) continue;
1088 Float_t CosPointingAngle=vertex.GetV0CosineOfPointingAngle(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex); //PointingAngle
1089 if (CosPointingAngle < fgCPAmin) continue;
1091 vertex.SetDcaV0Daughters(dca);
1092 vertex.SetV0CosineOfPointingAngle(CosPointingAngle);
1094 fPos[0]=vertex.Xv();
1095 fPos[1]=vertex.Yv();
1096 fPos[2]=vertex.Zv();
1098 HeTrack->PxPyPz(momHeVett);
1099 PionTrack->PxPyPz(momPionVett);
1101 Double_t raggio=TMath::Sqrt(fPos[0]*fPos[0]+fPos[1]*fPos[1]+fPos[2]*fPos[2]);
1102 HeTrack->GetPxPyPzAt(raggio,lMagneticField,momHeVettAt);
1103 PionTrack->GetPxPyPzAt(raggio,lMagneticField,momPionVettAt);
1105 //------------------------------------------------------------------------//
1107 HeTrack->GetImpactParameters(impactXY, impactZ);
1109 PionTrack->GetImpactParameters(impactXYpi, impactZpi);
1111 if(vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex)>3) continue;
1113 //salvo solo fino a 3.1 GeV/c2
1115 vHelium.SetXYZM(2*momHeVettAt[0],2*momHeVettAt[1],2*momHeVettAt[2],Helium3Mass);
1116 vPion.SetXYZM(momPionVettAt[0],momPionVettAt[1],momPionVettAt[2],PionMass);
1122 Int_t fIdxInt[200]; //dummy array
1123 Int_t nClustersTPCHe = HeTrack->GetTPCclusters(fIdxInt);
1124 Int_t nClustersTPCPi = PionTrack->GetTPCclusters(fIdxInt);
1126 //----------------------------------------------------------------------//
1128 trunNumber =(Float_t)runNumber;
1129 tbunchcross =(Float_t)BCNumber;
1130 torbit =(Float_t)OrbitNumber;
1131 tperiod =(Float_t)PeriodNumber;
1132 teventtype =(Float_t)eventtype;
1133 tTrackNumber =(Float_t)TrackNumber;
1134 tpercentile =(Float_t)percentile;
1135 txPrimaryVertex =(Float_t)xPrimaryVertex; //PRIMARY
1136 tyPrimaryVertex =(Float_t)yPrimaryVertex;
1137 tzPrimaryVertex =(Float_t)zPrimaryVertex;
1138 txSecondaryVertex =(Float_t)fPos[0]; //SECONDARY
1139 tySecondaryVertex =(Float_t)fPos[1];
1140 tzSecondaryVertex =(Float_t)fPos[2];
1141 tdcaTracks =(Float_t)dca; //between 2 tracks
1142 tCosPointingAngle =(Float_t)CosPointingAngle; //cosPointingAngle da V0
1143 tDCAV0toPrimaryVertex =(Float_t)vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex);
1144 tHeSign =(Float_t)HeTrack->GetSign(); //He
1145 tHepInTPC =(Float_t)trackInHe.GetP();
1146 tHeTPCsignal =(Float_t)HeTrack->GetTPCsignal();
1147 tDcaHeToPrimVertex =(Float_t)DcaHeToPrimVertex;
1148 tHeEta =(Float_t)HeTrack->Eta();
1149 tmomHex =(Float_t)momHeVett[0];
1150 tmomHey =(Float_t)momHeVett[1];
1151 tmomHez =(Float_t)momHeVett[2];
1152 tmomHeAtSVx =(Float_t)momHeVettAt[0];
1153 tmomHeAtSVy =(Float_t)momHeVettAt[1];
1154 tmomHeAtSVz =(Float_t)momHeVettAt[2];
1155 tHeTPCNcls =(Float_t)HeTrack->GetTPCNcls();
1156 tHeimpactXY =(Float_t)impactXY;
1157 tHeimpactZ =(Float_t)impactZ;
1158 tHeITSClusterMap =(Float_t)HeTrack->GetITSClusterMap();
1159 tIsHeITSRefit =(Float_t)IsHeITSRefit;
1160 tPionSign =(Float_t)PionTrack->GetSign(); //Pion
1161 tPionpInTPC =(Float_t)trackInPion.GetP();
1162 tPionTPCsignal =(Float_t)PionTrack->GetTPCsignal();
1163 tDcaPionToPrimVertex =(Float_t)DcaPionToPrimVertex;
1164 tPionEta =(Float_t)PionTrack->Eta();
1165 tmomPionx =(Float_t)momPionVett[0];
1166 tmomPiony =(Float_t)momPionVett[1];
1167 tmomPionz =(Float_t)momPionVett[2];
1168 tmomNegPionAtSVx =(Float_t)momPionVettAt[0];
1169 tmomNegPionAtSVy =(Float_t)momPionVettAt[1];
1170 tmomNegPionAtSVz =(Float_t)momPionVettAt[2];
1171 tPionTPCNcls =(Float_t)PionTrack->GetTPCNcls();
1172 tPionimpactXY =(Float_t)impactXYpi;
1173 tPionimpactZ =(Float_t)impactZpi;
1174 tPionITSClusterMap =(Float_t)PionTrack->GetITSClusterMap();
1175 tIsPiITSRefit =(Float_t)IsPiITSRefit;
1178 tchi2He =(Float_t)HeTrack->GetTPCchi2()/(Float_t)(nClustersTPCHe);
1179 tchi2Pi =(Float_t)PionTrack->GetTPCchi2()/(Float_t)(nClustersTPCPi);
1190 PostData(1,fListHist);
1191 PostData(2,fNtuple1);
1192 PostData(3,fNtuple4);
1197 //________________________________________________________________________
1199 void AliAnalysisTaskHelium3Pi::Terminate(Option_t *)
1201 // Draw result to the screen
1202 // Called once at the end of the query