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 // AliAnalysisTaskHelium3PiAOD 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 "AliAnalysisTaskHelium3PiAOD.h"
57 #include "AliESDtrackCuts.h"
58 #include "AliCentrality.h"
62 #include <TLorentzVector.h>
63 #include <AliVTrack.h>
68 ClassImp(AliAnalysisTaskHelium3PiAOD)
70 //________________________________________________________________________
71 AliAnalysisTaskHelium3PiAOD::AliAnalysisTaskHelium3PiAOD()
72 : AliAnalysisTaskSE(),
78 fHistEventMultiplicity(0),
79 fHistTrackMultiplicity(0),
80 fHistTrackMultiplicityCent(0),
81 fHistTrackMultiplicitySemiCent(0),
82 fHistTrackMultiplicityMB(0),
83 fHistTrackMultiplicityPVCent(0),
84 fHistTrackMultiplicityPVSemiCent(0),
85 fHistTrackMultiplicityPVMB(0),
93 fBetavsTPCsignalPos(0),
94 fBetavsTPCsignalNeg(0),
106 txSecondaryVertex(0),
107 tySecondaryVertex(0),
108 tzSecondaryVertex(0),
110 tCosPointingAngle(0),
111 tDCAV0toPrimaryVertex(0),
115 tDcaHeToPrimVertex(0),
131 tDcaPionToPrimVertex(0),
142 tPionITSClusterMap(0),
166 tHeltrackLenghtTOF(0),
172 tHelxPrimaryVertex(0),
173 tHelyPrimaryVertex(0),
174 tHelzPrimaryVertex(0),
175 tHelchi2PerClusterTPC(0),
181 // printf("Dummy Constructor");
183 fESDtrackCuts = new AliESDtrackCuts("fESDtrackCuts");
184 fESDtrackCuts->SetRequireITSStandAlone(kFALSE);
185 fESDtrackCuts->SetRequireITSPureStandAlone(kFALSE);
187 fESDtrackCuts->SetRequireTPCRefit(kTRUE);
188 fESDtrackCuts->SetAcceptKinkDaughters(kFALSE);
189 fESDtrackCuts->SetMinNClustersTPC(60);
190 fESDtrackCuts->SetMaxChi2PerClusterTPC(5);
191 fESDtrackCuts->SetEtaRange(-0.9,0.9);
195 //________________________________________________________________________
196 AliAnalysisTaskHelium3PiAOD::AliAnalysisTaskHelium3PiAOD(const char *name)
197 : AliAnalysisTaskSE(name),
198 fAnalysisType("AOD"),
199 fCollidingSystems(0),
203 fHistEventMultiplicity(0),
204 fHistTrackMultiplicity(0),
205 fHistTrackMultiplicityCent(0),
206 fHistTrackMultiplicitySemiCent(0),
207 fHistTrackMultiplicityMB(0),
208 fHistTrackMultiplicityPVCent(0),
209 fHistTrackMultiplicityPVSemiCent(0),
210 fHistTrackMultiplicityPVMB(0),
218 fBetavsTPCsignalPos(0),
219 fBetavsTPCsignalNeg(0),
231 txSecondaryVertex(0),
232 tySecondaryVertex(0),
233 tzSecondaryVertex(0),
235 tCosPointingAngle(0),
236 tDCAV0toPrimaryVertex(0),
240 tDcaHeToPrimVertex(0),
256 tDcaPionToPrimVertex(0),
267 tPionITSClusterMap(0),
291 tHeltrackLenghtTOF(0),
297 tHelxPrimaryVertex(0),
298 tHelyPrimaryVertex(0),
299 tHelzPrimaryVertex(0),
300 tHelchi2PerClusterTPC(0),
304 // Define input and output slots here
305 // Input slot #0 works with a TChain
306 //DefineInput(0, TChain::Class());
307 // Output slot #0 writes into a TList container ()
309 DefineInput(0, TChain::Class());
311 DefineOutput(1, TList::Class());
312 DefineOutput(2, TTree::Class());
313 DefineOutput(3, TTree::Class());
315 fESDtrackCuts = new AliESDtrackCuts("fESDtrackCuts");
316 fESDtrackCuts->SetRequireITSStandAlone(kFALSE);
317 fESDtrackCuts->SetRequireITSPureStandAlone(kFALSE);
319 fESDtrackCuts->SetRequireTPCRefit(kTRUE);
320 fESDtrackCuts->SetAcceptKinkDaughters(kFALSE);
321 fESDtrackCuts->SetMinNClustersTPC(60);
322 fESDtrackCuts->SetMaxChi2PerClusterTPC(5);
323 fESDtrackCuts->SetEtaRange(-0.9,0.9);
326 //_______________________________________________________
327 AliAnalysisTaskHelium3PiAOD::~AliAnalysisTaskHelium3PiAOD()
335 if (fESDtrackCuts) delete fESDtrackCuts;
336 if(fNtuple1) delete fNtuple1;
337 if(fNtuple4) delete fNtuple4;
339 //=================DEFINITION BETHE BLOCH==============================
341 Double_t AliAnalysisTaskHelium3PiAOD::BetheBloch(Double_t betaGamma,Double_t charge,Bool_t isPbPb) {
343 Double_t kp1, kp2, kp3, kp4, kp5;
348 kp1 = 4.7*charge*charge;
349 kp2 = 8.98482806165147636e+00;
350 kp3 = 1.54000000000000005e-05;
351 kp4 = 2.30445734159456084e+00;
352 kp5 = 2.25624744086878559e+00;
360 kp1 = 4.7*charge*charge;
361 kp2 = 8.98482806165147636e+00;
362 kp3 = 1.54000000000000005e-05;
363 kp4 = 2.30445734159456084e+00;
364 kp5 = 2.25624744086878559e+00;
368 Double_t beta = betaGamma / TMath::Sqrt(1.0 + betaGamma * betaGamma);
370 Double_t aa = TMath::Power(beta, kp4);
371 Double_t bb = TMath::Power(1.0 / betaGamma, kp5);
373 bb = TMath::Log(kp3 + bb);
375 Double_t out = (kp2 - aa - bb) * kp1 / aa;
381 //==================DEFINITION OF OUTPUT OBJECTS==============================
383 void AliAnalysisTaskHelium3PiAOD::UserCreateOutputObjects()
386 fListHist = new TList();
387 fListHist->SetOwner(); // IMPORTANT!
389 if(! fHistEventMultiplicity ){
390 fHistEventMultiplicity = new TH1F( "fHistEventMultiplicity" , "Nb of Events" , 10 , -0.5, 9.5);
391 fHistEventMultiplicity->GetXaxis()->SetBinLabel(1,"All Events");
392 fHistEventMultiplicity->GetXaxis()->SetBinLabel(2,"Events w/PV");
393 fHistEventMultiplicity->GetXaxis()->SetBinLabel(3,"Events w/|Vz|<10cm");
394 fHistEventMultiplicity->GetXaxis()->SetBinLabel(4,"Central Events");
395 fHistEventMultiplicity->GetXaxis()->SetBinLabel(5,"SemiCentral Events");
396 fHistEventMultiplicity->GetXaxis()->SetBinLabel(6,"MB Events");
397 fHistEventMultiplicity->GetXaxis()->SetBinLabel(7,"Central Events w/|Vz|<10cm");
398 fHistEventMultiplicity->GetXaxis()->SetBinLabel(8,"SemiCentral Events w/|Vz|<10cm");
399 fHistEventMultiplicity->GetXaxis()->SetBinLabel(9,"MB Events w/|Vz|<10cm");
401 fListHist->Add(fHistEventMultiplicity);
404 if(! fHistTrackMultiplicity ){
405 fHistTrackMultiplicity = new TH2F( "fHistTrackMultiplicity" , "Nb of Tracks", 2500,0, 25000,210,-1,104);
406 fHistTrackMultiplicity->GetXaxis()->SetTitle("Number of tracks");
407 fHistTrackMultiplicity->GetYaxis()->SetTitle("Percentile");
408 fListHist->Add(fHistTrackMultiplicity);
411 if(! fHistTrackMultiplicityCent ){
412 fHistTrackMultiplicityCent = new TH2F( "fHistTrackMultiplicityCent", "Nb of Tracks Central Events", 2500,0, 25000,210,-1,104 );
413 fHistTrackMultiplicityCent->GetXaxis()->SetTitle("Number of tracks");
414 fHistTrackMultiplicityCent->GetYaxis()->SetTitle("Percentile");
415 fListHist->Add(fHistTrackMultiplicityCent);
418 if(! fHistTrackMultiplicitySemiCent ){
419 fHistTrackMultiplicitySemiCent = new TH2F( "fHistTrackMultiplicitySemiCent" , "Nb of Tracks SemiCentral Events", 2500,0, 25000 ,210,-1,104);
420 fHistTrackMultiplicitySemiCent->GetXaxis()->SetTitle("Number of tracks");
421 fHistTrackMultiplicitySemiCent->GetYaxis()->SetTitle("Percentile");
422 fListHist->Add(fHistTrackMultiplicitySemiCent);
425 if(! fHistTrackMultiplicityMB ){
426 fHistTrackMultiplicityMB = new TH2F( "fHistTrackMultiplicityMB" , "Nb of Tracks MBral Events", 2500,0, 25000,210,-1,104 );
427 fHistTrackMultiplicityMB->GetXaxis()->SetTitle("Number of tracks");
428 fHistTrackMultiplicityMB->GetYaxis()->SetTitle("Percentile");
429 fListHist->Add(fHistTrackMultiplicityMB);
432 if(! fHistTrackMultiplicityPVCent ){
433 fHistTrackMultiplicityPVCent = new TH2F( "fHistTrackMultiplicityPVCent" , "Nb of Tracks Central Events", 2500,0, 25000,210,-1,104 );
434 fHistTrackMultiplicityPVCent->GetXaxis()->SetTitle("Number of tracks");
435 fHistTrackMultiplicityPVCent->GetYaxis()->SetTitle("Percentile");
436 fListHist->Add(fHistTrackMultiplicityPVCent);
439 if(! fHistTrackMultiplicityPVSemiCent ){
440 fHistTrackMultiplicityPVSemiCent = new TH2F( "fHistTrackMultiplicityPVSemiCent" , "Nb of Tracks SemiCentral Events", 2500,0, 25000 ,210,-1,104);
441 fHistTrackMultiplicityPVSemiCent->GetXaxis()->SetTitle("Number of tracks");
442 fHistTrackMultiplicityPVSemiCent->GetYaxis()->SetTitle("Percentile");
443 fListHist->Add(fHistTrackMultiplicityPVSemiCent);
446 if(! fHistTrackMultiplicityPVMB ){
447 fHistTrackMultiplicityPVMB = new TH2F( "fHistTrackMultiplicityPVMB" , "Nb of Tracks MBral Events", 2500,0, 25000,210,-1,104 );
448 fHistTrackMultiplicityPVMB->GetXaxis()->SetTitle("Number of tracks");
449 fHistTrackMultiplicityPVMB->GetYaxis()->SetTitle("Percentile");
450 fListHist->Add(fHistTrackMultiplicityPVMB);
454 fhBB = new TH2F( "fhBB" , "BetheBlochTPC" , 120,-6,6,150,0,1500);
455 fhBB->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
456 fhBB->GetYaxis()->SetTitle("TPC Signal");
457 fListHist->Add(fhBB);
461 fhTOF = new TH2F( "fhTOF" , "Scatter Plot TOF" , 120,-6,6,100,0,1.2);
462 fhTOF->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
463 fhTOF->GetYaxis()->SetTitle("#beta");
464 fListHist->Add(fhTOF);
468 fhMassTOF=new TH1F ("fhMassTOF","Particle Mass - TOF", 300,0 ,5);
469 fhMassTOF->GetXaxis()->SetTitle("Mass (GeV/#it{c}^{2})");
470 fListHist->Add(fhMassTOF);
474 fhBBPions = new TH2F( "fhBBPions" , "Bethe-Bloch TPC Pions" , 120,-6,6,150,0,1500);
475 fhBBPions->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
476 fhBBPions->GetYaxis()->SetTitle("TPC Signal");
477 fListHist->Add(fhBBPions);
481 fhBBHe = new TH2F( "fhBBHe" , "Bethe-Bloch TPC He" , 120,-6,6,150,0,1500);
482 fhBBHe->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
483 fhBBHe->GetYaxis()->SetTitle("TPC Signal");
484 fListHist->Add(fhBBHe);
488 fhNaPos = new TH2F( "fhNaPos" , "Distribution Pos" , 500,0,5,40,-10,10);
489 fhNaPos->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
490 fhNaPos->GetYaxis()->SetTitle("(TPCSignal-bbtheo)/bbtheo (He)");
491 fListHist->Add(fhNaPos);
495 fhNaNeg = new TH2F( "fhNaNeg" , "Distribution Neg" , 500,0,5,40,-10,10);
496 fhNaNeg->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
497 fhNaNeg->GetYaxis()->SetTitle("(TPCSignal-bbtheo)/bbtheo (He)");
498 fListHist->Add(fhNaNeg);
501 if(! fBetavsTPCsignalPos ){
502 fBetavsTPCsignalPos = new TH2F("fBetavsTPCsignalPos","fBetavsTPCsignalPos",100,0,1.2,150,0,1500);
503 fBetavsTPCsignalPos->GetXaxis()->SetTitle("#beta");
504 fBetavsTPCsignalPos->GetYaxis()->SetTitle("TPC Signal");
505 fListHist->Add(fBetavsTPCsignalPos);
508 if(! fBetavsTPCsignalNeg ){
509 fBetavsTPCsignalNeg = new TH2F("fBetavsTPCsignalNeg","fBetavsTPCsignalNeg",100,0,1.2,150,0,1500);
510 fBetavsTPCsignalNeg->GetXaxis()->SetTitle("#beta");
511 fBetavsTPCsignalNeg->GetYaxis()->SetTitle("TPC Signal");
512 fListHist->Add(fBetavsTPCsignalNeg);
519 fNtuple1 = new TTree("fNtuple1","fNtuple1");
521 fNtuple1->Branch("trunNumber" ,&trunNumber ,"trunNumber/F");
522 fNtuple1->Branch("tbunchcross" ,&tbunchcross ,"tbunchcross/F");
523 fNtuple1->Branch("torbit" ,&torbit ,"torbit/F");
524 fNtuple1->Branch("tperiod" ,&tperiod ,"tperiod/F");
525 fNtuple1->Branch("teventtype" ,&teventtype ,"teventtype/F");
526 fNtuple1->Branch("tTrackNumber" ,&tTrackNumber ,"tTrackNumber/F");
527 fNtuple1->Branch("tpercentile" ,&tpercentile ,"tpercentile/F") ;
528 fNtuple1->Branch("txPrimaryVertex" ,&txPrimaryVertex ,"txPrimaryVertex/F");
529 fNtuple1->Branch("tyPrimaryVertex" ,&tyPrimaryVertex ,"tyPrimaryVertex/F");
530 fNtuple1->Branch("tzPrimaryVertex" ,&tzPrimaryVertex ,"tzPrimaryVertex/F");
531 fNtuple1->Branch("txSecondaryVertex" ,&txSecondaryVertex ,"txSecondaryVertex/F");
532 fNtuple1->Branch("tySecondaryVertex" ,&tySecondaryVertex ,"tySecondaryVertex/F");
533 fNtuple1->Branch("tzSecondaryVertex" ,&tzSecondaryVertex ,"tzSecondaryVertex/F");
534 fNtuple1->Branch("tdcaTracks" ,&tdcaTracks ,"tdcaTracks/F");
535 fNtuple1->Branch("tCosPointingAngle" ,&tCosPointingAngle ,"tCosPointingAngle/F");
536 fNtuple1->Branch("tDCAV0toPrimaryVertex",&tDCAV0toPrimaryVertex,"tDCAV0toPrimaryVertex/F");
537 fNtuple1->Branch("tHeSign" ,&tHeSign ,"tHeSign/F");
538 fNtuple1->Branch("tHepInTPC" ,&tHepInTPC ,"tHepInTPC/F");
539 fNtuple1->Branch("tHeTPCsignal" ,&tHeTPCsignal ,"tHeTPCsignal/F");
540 fNtuple1->Branch("tDcaHeToPrimVertex" ,&tDcaHeToPrimVertex ,"tDcaHeToPrimVertex/F");
541 fNtuple1->Branch("tHeEta" ,&tHeEta ,"tHeEta/F");
542 fNtuple1->Branch("tmomHex" ,&tmomHex ,"tmomHex/F");
543 fNtuple1->Branch("tmomHey" ,&tmomHey ,"tmomHey/F");
544 fNtuple1->Branch("tmomHez" ,&tmomHez ,"tmomHez/F");
545 fNtuple1->Branch("tmomHeAtSVx" ,&tmomHeAtSVx ,"tmomHeAtSVx/F");
546 fNtuple1->Branch("tmomHeAtSVy" ,&tmomHeAtSVy ,"tmomHeAtSVy/F");
547 fNtuple1->Branch("tmomHeAtSVz" ,&tmomHeAtSVz ,"tmomHeAtSVz/F");
548 fNtuple1->Branch("tHeTPCNcls" ,&tHeTPCNcls ,"tHeTPCNcls/F");
549 fNtuple1->Branch("tHeimpactXY" ,&tHeimpactXY ,"tHeimpactXY/F");
550 fNtuple1->Branch("tHeimpactZ" ,&tHeimpactZ ,"tHeimpactZ/F");
551 fNtuple1->Branch("tHeITSClusterMap" ,&tHeITSClusterMap ,"tHeITSClusterMap/F");
552 fNtuple1->Branch("tIsHeITSRefit" ,&tIsHeITSRefit ,"tIsHeITSRefit/F");
553 fNtuple1->Branch("tPionSign" ,&tPionSign ,"tPionSign/F");
554 fNtuple1->Branch("tPionpInTPC" ,&tPionpInTPC ,"tPionpInTPC/F");
555 fNtuple1->Branch("tPionTPCsignal" ,&tPionTPCsignal ,"tPionTPCsignal/F");
556 fNtuple1->Branch("tDcaPionToPrimVertex" ,&tDcaPionToPrimVertex ,"tDcaPionToPrimVertex/F");
557 fNtuple1->Branch("tPionEta" ,&tPionEta ,"tPionEta/F");
558 fNtuple1->Branch("tmomPionx" ,&tmomPionx ,"tmomPionx/F");
559 fNtuple1->Branch("tmomPiony" ,&tmomPiony ,"tmomPiony/F");
560 fNtuple1->Branch("tmomPionz" ,&tmomPionz ,"tmomPionz/F");
561 fNtuple1->Branch("tmomNegPionAtSVx" ,&tmomNegPionAtSVx ,"tmomNegPionAtSVx/F");
562 fNtuple1->Branch("tmomNegPionAtSVy" ,&tmomNegPionAtSVy ,"tmomNegPionAtSVy/F");
563 fNtuple1->Branch("tmomNegPionAtSVz" ,&tmomNegPionAtSVz ,"tmomNegPionAtSVz/F");
564 fNtuple1->Branch("tPionTPCNcls" ,&tPionTPCNcls ,"tPionTPCNcls/F");
565 fNtuple1->Branch("tPionimpactXY" ,&tPionimpactXY ,"tPionimpactXY/F");
566 fNtuple1->Branch("tPionimpactZ" ,&tPionimpactZ ,"tPionimpactZ/F");
567 fNtuple1->Branch("tPionITSClusterMap" ,&tPionITSClusterMap ,"tPionITSClusterMap/F");
568 fNtuple1->Branch("tIsPiITSRefit" ,&tIsPiITSRefit ,"tIsPiITSRefit/F");
569 fNtuple1->Branch("txn" ,&txn ,"txn/F");
570 fNtuple1->Branch("txp" ,&txp ,"txp/F");
571 fNtuple1->Branch("tchi2He" ,&tchi2He ,"tchi2He/F");
572 fNtuple1->Branch("tchi2Pi" ,&tchi2Pi ,"tchi2Pi/F");
578 fNtuple4 = new TTree("fNtuple4","fNtuple4");
580 fNtuple4->Branch("tHelrunNumber" ,&tHelrunNumber ,"tHelrunNumber/F");
581 fNtuple4->Branch("tHelBCNumber" ,&tHelBCNumber ,"tHelBCNumber/F");
582 fNtuple4->Branch("tHelOrbitNumber" ,&tHelOrbitNumber ,"tHelOrbitNumber/F");
583 fNtuple4->Branch("tHelPeriodNumber" ,&tHelPeriodNumber ,"tHelPeriodNumber/F");
584 fNtuple4->Branch("tHeleventtype" ,&tHeleventtype ,"tHeleventtype/F");
585 fNtuple4->Branch("tHelisHeITSrefit" ,&tHelisHeITSrefit ,"tHelisHeITSrefit/F");
586 fNtuple4->Branch("tHelpercentile" ,&tHelpercentile ,"tHelpercentile/F");
587 fNtuple4->Branch("tHelSign" ,&tHelSign ,"tHelSign/F");
588 fNtuple4->Branch("tHelpinTPC" ,&tHelpinTPC ,"tHelpinTPC/F");
589 fNtuple4->Branch("tHelGetTPCsignal" ,&tHelGetTPCsignal ,"tHelGetTPCsignal/F");
590 fNtuple4->Branch("tHelPx" ,&tHelPx ,"tHelPx/F");
591 fNtuple4->Branch("tHelPy" ,&tHelPy ,"tHelPy/F");
592 fNtuple4->Branch("tHelPz" ,&tHelPz ,"tHelPz/F");
593 fNtuple4->Branch("tHelEta" ,&tHelEta ,"tHelEta/F");
594 fNtuple4->Branch("tHelisTOF" ,&tHelisTOF ,"tHelisTOF/F");
595 fNtuple4->Branch("tHelpoutTPC" ,&tHelpoutTPC ,"tHelpoutTPC/F");
596 fNtuple4->Branch("tHeltimeTOF" ,&tHeltimeTOF ,"tHeltimeTOF/F");
597 fNtuple4->Branch("tHeltrackLenghtTOF" ,&tHeltrackLenghtTOF ,"tHeltrackLenghtTOF/F");
598 fNtuple4->Branch("tHelimpactXY" ,&tHelimpactXY ,"tHelimpactXY/F");
599 fNtuple4->Branch("tHelimpactZ" ,&tHelimpactZ ,"tHelimpactZ/F");
600 fNtuple4->Branch("tHelmapITS" ,&tHelmapITS ,"tHelmapITS/F");
601 fNtuple4->Branch("tHelTPCNcls" ,&tHelTPCNcls ,"tHelTPCNcls/F");
602 fNtuple4->Branch("tHelTRDsignal" ,&tHelTRDsignal ,"tHelTRDsignal/F");
603 fNtuple4->Branch("tHelxPrimaryVertex" ,&tHelxPrimaryVertex ,"tHelxPrimaryVertex/F");
604 fNtuple4->Branch("tHelyPrimaryVertex" ,&tHelyPrimaryVertex ,"tHelyPrimaryVertex/F");
605 fNtuple4->Branch("tHelzPrimaryVertex" ,&tHelzPrimaryVertex ,"tHelzPrimaryVertex/F");
606 fNtuple4->Branch("tHelchi2PerClusterTPC",&tHelchi2PerClusterTPC,"tHelchi2PerClusterTPC/F");
611 PostData(1, fListHist);
612 PostData(2, fNtuple1);
613 PostData(3, fNtuple4);
614 }// end UserCreateOutputObjects
617 //====================== USER EXEC ========================
619 void AliAnalysisTaskHelium3PiAOD::UserExec(Option_t *)
621 //_______________________________________________________________________
623 //!*********************!//
624 //! Define variables !//
625 //!*********************!//
627 Double_t pinTPC=0.,poutTPC=0.,TPCSignal=0.;
628 Double_t xPrimaryVertex=0.,yPrimaryVertex=0.,zPrimaryVertex=0.;
629 Double_t massTOF=0.,timeTOF=0.,trackLenghtTOF=0.,betaTOF=0.;
632 // ULong_t statusT=0;
635 Bool_t isTPC=kFALSE,isTOF=kFALSE,IsHeITSRefit=kFALSE,IsPiITSRefit=kFALSE ;
637 Float_t nSigmaNegPion=0.;
639 Double_t cutNSigma = 3;
640 Double_t bbtheoM=0.,bbtheo=0.;
641 Double_t zNathashaNeg=0;
642 Double_t zNathashaPos=0;
643 Double_t fPos[3]={0.,0.,0.};
644 Double_t runNumber=0.;
645 // Double_t evNumber=0.;
647 Double_t BCNumber=0.;
648 Double_t OrbitNumber=0.;
649 Double_t PeriodNumber=0.;
651 Double_t Helium3Mass = 2.80839;
652 Double_t PionMass = 0.13957;
655 TLorentzVector vPion,vHelium,vSum;
657 //!----------------------------------------------------------------
659 //! A set of very loose parameters for cuts
661 Double_t fgChi2max=33.; //! max chi2
662 Double_t fgDNmin=0.05; //! min imp parameter for the 1st daughter = 500um
663 Double_t fgDCAmax=1.0; //! max DCA between the daughter tracks in cm
664 Double_t fgCPAmin=0.99; //! min cosine of V0's pointing angle
665 // Double_t fgRmin=0.2; //! min radius of the fiducial volume //original
666 Double_t fgRmin=0.1; //! min radius of the fiducial volume = 1 mm
667 Double_t fgRmax=200.; //! max radius of the fiducial volume = 2 m
669 //------------------------------------------
672 // Called for EACH event
674 AliVEvent *event = InputEvent();
675 if (!event) { Printf("ERROR: Could not retrieve event"); return; }
677 Info("AliAnalysisTaskHelium3PiAOD","Starting UserExec");
681 // create pointer to event
683 AliAODEvent *lAODevent=(AliAODEvent *)InputEvent();
685 Printf("ERROR: aod not available");
686 // fHistLog->Fill(98);
690 fHistEventMultiplicity->Fill(0);
692 Double_t lMagneticField=lAODevent->GetMagneticField();
693 Int_t TrackNumber = -1;
696 //*****************//
698 //*****************//
700 AliCentrality *centrality = lAODevent->GetCentrality();
701 Float_t percentile=centrality->GetCentralityPercentile("V0M");
703 TrackNumber = lAODevent->GetNumberOfTracks();
704 if (TrackNumber<2) return;
706 fHistTrackMultiplicity->Fill(TrackNumber,percentile); //tracce per evento
708 //****************************************
712 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
713 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
714 fPIDResponse=inputHandler->GetPIDResponse(); // data member di tipo "const AliPIDResponse *fPIDResponse;"
715 // cout<<"fPIDResponse "<<fPIDResponse<<endl;
716 //===========================================
720 Bool_t isSelectedCentral = (inputHandler->IsEventSelected() & AliVEvent::kCentral);
721 Bool_t isSelectedSemiCentral = (inputHandler->IsEventSelected() & AliVEvent::kSemiCentral);
722 Bool_t isSelectedMB = (inputHandler->IsEventSelected() & AliVEvent::kMB);
724 if(isSelectedCentral){
725 fHistEventMultiplicity->Fill(3);
726 fHistTrackMultiplicityCent->Fill(TrackNumber,percentile);
730 if(isSelectedSemiCentral){
731 fHistEventMultiplicity->Fill(4);
732 fHistTrackMultiplicitySemiCent->Fill(TrackNumber,percentile);
737 fHistEventMultiplicity->Fill(5);
738 fHistTrackMultiplicityMB->Fill(TrackNumber,percentile);
742 if(isSelectedCentral || isSelectedSemiCentral || isSelectedMB){
746 // Primary vertex cut
748 Double_t lBestPrimaryVtxPos[3] = {-100.0, -100.0, -100.0};
750 AliAODVertex* vtx= lAODevent->GetPrimaryVertex();
756 vtx->GetXYZ( lBestPrimaryVtxPos );
758 fHistEventMultiplicity->Fill(1); // analyzed events with PV
760 xPrimaryVertex=lBestPrimaryVtxPos[0];
761 yPrimaryVertex=lBestPrimaryVtxPos[1];
762 zPrimaryVertex=lBestPrimaryVtxPos[2];
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 = lAODevent->GetRunNumber();
801 BCNumber = lAODevent->GetBunchCrossNumber();
802 OrbitNumber = lAODevent->GetOrbitNumber();
803 PeriodNumber= lAODevent->GetPeriodNumber();
805 //*************************************************************
807 for (Int_t j=0; j<TrackNumber; j++) { //loop on tracks
809 AliVTrack *track = lAODevent->GetTrack(j);
810 AliESDtrack *esdtrack=new AliESDtrack(track);
812 // AliVTrack* esdtrack= (AliVTrack *) fEvent->GetTrack(iT);
816 AliError(Form("ERROR: Could not retrieve esdtrack %d",j));
820 // ************** Track cuts ****************
822 if (!fESDtrackCuts->AcceptTrack(esdtrack)) continue;
825 status = (ULong_t)esdtrack->GetStatus();
826 isTPC = (((status) & AliESDtrack::kTPCin) != 0);
827 isTOF = ((((status) & AliESDtrack::kTOFout) != 0) && (((status) & AliESDtrack::kTIME) != 0));
830 UInt_t mapITS=esdtrack->GetITSClusterMap();
832 //----------------------------------------------
834 //****** Cuts from AliV0Vertex.cxx *************
836 Double_t d=esdtrack->GetD(xPrimaryVertex,yPrimaryVertex,lMagneticField);
837 // if (TMath::Abs(d)<fgDPmin) continue;
838 if (TMath::Abs(d)>fgRmax) continue;
840 //---- (Usefull) Stuff
842 TPCSignal=esdtrack->GetTPCsignal();
844 if (TPCSignal<10)continue;
845 if (TPCSignal>1000)continue;
848 if(!esdtrack->GetTPCInnerParam())continue;
850 AliExternalTrackParam trackIn(*esdtrack->GetInnerParam());
851 pinTPC= trackIn.GetP();
853 //pinTPC= esdtrack->GetTPCMomentum();
858 if((status) & (AliESDtrack::kITSrefit!=0)){
859 fhBB->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
862 timeTOF=esdtrack->GetTOFsignal(); // ps
863 trackLenghtTOF= esdtrack->GetIntegratedLength(); // cm
867 if(!esdtrack->GetOuterParam())continue;
869 AliExternalTrackParam trackOut(*esdtrack->GetOuterParam());
871 poutTPC = trackOut.GetP();
873 betaTOF= (trackLenghtTOF/timeTOF)/2.99792458e-2;
875 fhTOF->Fill(poutTPC*esdtrack->GetSign(),betaTOF);
877 Double_t mass2=(poutTPC*poutTPC)*((((speedOfLight*speedOfLight)*(timeTOF*timeTOF))-(trackLenghtTOF*trackLenghtTOF))/(trackLenghtTOF*trackLenghtTOF));
878 if(mass2>0) massTOF=TMath::Sqrt(mass2);
879 fhMassTOF->Fill(massTOF);
881 if(esdtrack->GetSign() < 0.)fBetavsTPCsignalNeg->Fill(betaTOF,TPCSignal);
882 if(esdtrack->GetSign() > 0.)fBetavsTPCsignalPos->Fill(betaTOF,TPCSignal);
888 // bbtheo =BetheBloch((2*pinTPC)/3.,2,kTRUE); //! OK
889 // bbtheoM=(1 - 0.08*5)*bbtheo; //! OK
890 // bbtheoP=(1 + 0.08*5)*bbtheo; //! OK
893 bbtheo = fPIDResponse->NumberOfSigmas((AliPIDResponse::EDetector)0,esdtrack,(AliPID::EParticleType) 7);
895 if(esdtrack->GetSign()<0){
896 zNathashaNeg=bbtheo;//(TPCSignal-bbtheo)/bbtheo;
897 // cout<<"BBtheo 1 :"<<zNathashaNeg<<endl;
898 fhNaNeg->Fill(pinTPC,zNathashaNeg);
901 if(esdtrack->GetSign() > 0.){
902 zNathashaPos=bbtheo;//(TPCSignal-bbtheo)/bbtheo;
903 fhNaPos->Fill(pinTPC,zNathashaPos);
906 nSigmaNegPion=TMath::Abs(fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 2));
909 if ( (nSigmaNegPion < cutNSigma)){
911 // cout<<"Nsigma pi: "<<nSigmaNegPion<<endl;
913 fhBBPions->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
916 PionsTPC[nPionsTPC++]=j;
920 // nSigmaNegPion=(fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 2));
922 bbtheoM = TMath::Abs((fPIDResponse->NumberOfSigmasTPC(esdtrack,(AliPID::EParticleType) 7)));
924 // if( TPCSignal > bbtheoM ) {
925 // if( bbtheoM > -3.) {
930 fhBBHe->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
933 Bool_t isHeITSrefit=((status) & (AliESDtrack::kITSrefit));
935 esdtrack->GetImpactParameters(impactXY, impactZ);
937 Int_t fIdxInt[200]; //dummy array
938 Int_t nClustersTPC = esdtrack->GetTPCclusters(fIdxInt);
940 Float_t chi2PerClusterTPC = esdtrack->GetTPCchi2()/(Float_t)(nClustersTPC);
942 tHelrunNumber =(Float_t)runNumber;
943 tHelBCNumber =(Float_t)BCNumber;
944 tHelOrbitNumber =(Float_t)OrbitNumber;
945 tHelPeriodNumber =(Float_t)PeriodNumber;
946 tHeleventtype =(Float_t)eventtype;
947 tHelisHeITSrefit =(Float_t)isHeITSrefit;
948 tHelpercentile =(Float_t)percentile;
949 tHelSign =(Float_t)esdtrack->GetSign();
950 tHelpinTPC =(Float_t)pinTPC;
951 tHelGetTPCsignal =(Float_t)esdtrack->GetTPCsignal();
952 tHelPx =(Float_t)esdtrack->Px();
953 tHelPy =(Float_t)esdtrack->Py();
954 tHelPz =(Float_t)esdtrack->Pz();
955 tHelEta =(Float_t)esdtrack->Eta();
956 tHelisTOF =(Float_t)isTOF;
957 tHelpoutTPC =(Float_t)poutTPC;
958 tHeltimeTOF =(Float_t)timeTOF;
959 tHeltrackLenghtTOF =(Float_t)trackLenghtTOF;
960 tHelimpactXY =(Float_t)impactXY;
961 tHelimpactZ =(Float_t)impactZ;
962 tHelmapITS =(Float_t)mapITS;
963 tHelTPCNcls =(Float_t)esdtrack->GetTPCNcls();
964 tHelTRDsignal =(Float_t)esdtrack->GetTRDsignal();
965 tHelxPrimaryVertex =(Float_t)xPrimaryVertex;
966 tHelyPrimaryVertex =(Float_t)yPrimaryVertex;
967 tHelzPrimaryVertex =(Float_t)zPrimaryVertex;
968 tHelchi2PerClusterTPC =(Float_t)chi2PerClusterTPC;
975 PionsTPC.Set(nPionsTPC);
978 Double_t DcaHeToPrimVertex=0;
979 Double_t DcaPionToPrimVertex=0;
981 impactXY=-999, impactZ=-999;
982 impactXYpi=-999, impactZpi=-999;
986 // Vettors for il PxPyPz
988 Double_t momPionVett[3];
989 for(Int_t i=0;i<3;i++)momPionVett[i]=0;
991 Double_t momHeVett[3];
992 for(Int_t i=0;i<3;i++)momHeVett[i]=0;
996 Double_t momPionVettAt[3];
997 for(Int_t i=0;i<3;i++)momPionVettAt[i]=0;
999 Double_t momHeVettAt[3];
1000 for(Int_t i=0;i<3;i++)momHeVettAt[i]=0;
1002 //--------------- LOOP PAIRS ----------------
1004 for (Int_t k=0; k < nPionsTPC; k++) { //! Pions Loop
1006 DcaPionToPrimVertex=0.;
1007 DcaHeToPrimVertex=0;
1009 Int_t PionIdx=PionsTPC[k];
1011 AliVTrack *trackpi = (AliVTrack*)lAODevent->GetTrack(PionIdx);
1012 AliESDtrack *PionTrack = new AliESDtrack(trackpi);
1014 statusPi = (ULong_t)PionTrack->GetStatus();
1015 // isTOFPi = ((((statusPi) & (AliESDtrack::kTOFout)) != 0) && (((statusPi) & (AliESDtrack::kTIME)) != 0));
1016 IsPiITSRefit = ((statusPi) & (AliESDtrack::kITSrefit));
1019 DcaPionToPrimVertex = TMath::Abs(PionTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
1021 if(DcaPionToPrimVertex<0.2)continue;
1023 AliExternalTrackParam trackInPion(*PionTrack);
1025 for (Int_t i=0; i<nHeTPC; i++){ //! Helium Loop
1027 Int_t HeIdx=HeTPC[i];
1029 AliVTrack *trackhe = (AliVTrack*)lAODevent->GetTrack(HeIdx);
1030 AliESDtrack *HeTrack = new AliESDtrack(trackhe);
1032 // statusT= (ULong_t)HeTrack->GetStatus();
1033 // isTOFHe = (((statusT & AliESDtrack::kTOFout) != 0) && ((statusT & AliESDtrack::kTIME) != 0));
1034 IsHeITSRefit = (status & AliESDtrack::kITSrefit);
1037 DcaHeToPrimVertex = TMath::Abs(HeTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
1039 AliExternalTrackParam trackInHe(*HeTrack);
1041 if ( DcaPionToPrimVertex < fgDNmin) //OK
1042 if ( DcaHeToPrimVertex < fgDNmin) continue; //OK
1047 dca= PionTrack->GetDCA(HeTrack,lMagneticField,xn,xp); //!dca (Neg to Pos)
1049 if (dca > fgDCAmax) continue;
1050 if ((xn+xp) > 2*fgRmax) continue;
1051 if ((xn+xp) < 2*fgRmin) continue;
1053 //CORRECTION from AliV0Vertex
1055 Bool_t corrected=kFALSE;
1056 if ((trackInPion.GetX() > 3.) && (xn < 3.)) {
1057 //correct for the beam pipe material
1060 if ((trackInHe.GetX() > 3.) && (xp < 3.)) {
1061 //correct for the beam pipe material
1065 dca=trackInPion.GetDCA(&trackInHe,lMagneticField,xn,xp);
1066 if (dca > fgDCAmax) continue;
1067 if ((xn+xp) > 2*fgRmax) continue;
1068 if ((xn+xp) < 2*fgRmin) continue;
1071 //=============================================//
1072 // Make "V0" with found tracks //
1073 //=============================================//
1075 trackInPion.PropagateTo(xn,lMagneticField);
1076 trackInHe.PropagateTo(xp,lMagneticField);
1078 AliESDv0 vertex(trackInPion,PionIdx,trackInHe,HeIdx);
1079 if (vertex.GetChi2V0() > fgChi2max) continue;
1081 Float_t CosPointingAngle=vertex.GetV0CosineOfPointingAngle(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex); //PointingAngle
1082 if (CosPointingAngle < fgCPAmin) continue;
1084 vertex.SetDcaV0Daughters(dca);
1085 vertex.SetV0CosineOfPointingAngle(CosPointingAngle);
1087 fPos[0]=vertex.Xv();
1088 fPos[1]=vertex.Yv();
1089 fPos[2]=vertex.Zv();
1091 HeTrack->PxPyPz(momHeVett);
1092 PionTrack->PxPyPz(momPionVett);
1094 Double_t raggio=TMath::Sqrt(fPos[0]*fPos[0]+fPos[1]*fPos[1]+fPos[2]*fPos[2]);
1095 HeTrack->GetPxPyPzAt(raggio,lMagneticField,momHeVettAt);
1096 PionTrack->GetPxPyPzAt(raggio,lMagneticField,momPionVettAt);
1098 //------------------------------------------------------------------------//
1100 HeTrack->GetImpactParameters(impactXY, impactZ);
1102 PionTrack->GetImpactParameters(impactXYpi, impactZpi);
1104 if(vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex)>3) continue;
1106 //salvo solo fino a 3.1 GeV/c2
1108 vHelium.SetXYZM(2*momHeVettAt[0],2*momHeVettAt[1],2*momHeVettAt[2],Helium3Mass);
1109 vPion.SetXYZM(momPionVettAt[0],momPionVettAt[1],momPionVettAt[2],PionMass);
1115 Int_t fIdxInt[200]; //dummy array
1116 Int_t nClustersTPCHe = HeTrack->GetTPCclusters(fIdxInt);
1117 Int_t nClustersTPCPi = PionTrack->GetTPCclusters(fIdxInt);
1119 //----------------------------------------------------------------------//
1121 trunNumber =(Float_t)runNumber;
1122 tbunchcross =(Float_t)BCNumber;
1123 torbit =(Float_t)OrbitNumber;
1124 tperiod =(Float_t)PeriodNumber;
1125 teventtype =(Float_t)eventtype;
1126 tTrackNumber =(Float_t)TrackNumber;
1127 tpercentile =(Float_t)percentile;
1128 txPrimaryVertex =(Float_t)xPrimaryVertex; //PRIMARY
1129 tyPrimaryVertex =(Float_t)yPrimaryVertex;
1130 tzPrimaryVertex =(Float_t)zPrimaryVertex;
1131 txSecondaryVertex =(Float_t)fPos[0]; //SECONDARY
1132 tySecondaryVertex =(Float_t)fPos[1];
1133 tzSecondaryVertex =(Float_t)fPos[2];
1134 tdcaTracks =(Float_t)dca; //between 2 tracks
1135 tCosPointingAngle =(Float_t)CosPointingAngle; //cosPointingAngle da V0
1136 tDCAV0toPrimaryVertex =(Float_t)vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex);
1137 tHeSign =(Float_t)HeTrack->GetSign(); //He
1138 tHepInTPC =(Float_t)trackInHe.GetP();
1139 tHeTPCsignal =(Float_t)HeTrack->GetTPCsignal();
1140 tDcaHeToPrimVertex =(Float_t)DcaHeToPrimVertex;
1141 tHeEta =(Float_t)HeTrack->Eta();
1142 tmomHex =(Float_t)momHeVett[0];
1143 tmomHey =(Float_t)momHeVett[1];
1144 tmomHez =(Float_t)momHeVett[2];
1145 tmomHeAtSVx =(Float_t)momHeVettAt[0];
1146 tmomHeAtSVy =(Float_t)momHeVettAt[1];
1147 tmomHeAtSVz =(Float_t)momHeVettAt[2];
1148 tHeTPCNcls =(Float_t)HeTrack->GetTPCNcls();
1149 tHeimpactXY =(Float_t)impactXY;
1150 tHeimpactZ =(Float_t)impactZ;
1151 tHeITSClusterMap =(Float_t)HeTrack->GetITSClusterMap();
1152 tIsHeITSRefit =(Float_t)IsHeITSRefit;
1153 tPionSign =(Float_t)PionTrack->GetSign(); //Pion
1154 tPionpInTPC =(Float_t)trackInPion.GetP();
1155 tPionTPCsignal =(Float_t)PionTrack->GetTPCsignal();
1156 tDcaPionToPrimVertex =(Float_t)DcaPionToPrimVertex;
1157 tPionEta =(Float_t)PionTrack->Eta();
1158 tmomPionx =(Float_t)momPionVett[0];
1159 tmomPiony =(Float_t)momPionVett[1];
1160 tmomPionz =(Float_t)momPionVett[2];
1161 tmomNegPionAtSVx =(Float_t)momPionVettAt[0];
1162 tmomNegPionAtSVy =(Float_t)momPionVettAt[1];
1163 tmomNegPionAtSVz =(Float_t)momPionVettAt[2];
1164 tPionTPCNcls =(Float_t)PionTrack->GetTPCNcls();
1165 tPionimpactXY =(Float_t)impactXYpi;
1166 tPionimpactZ =(Float_t)impactZpi;
1167 tPionITSClusterMap =(Float_t)PionTrack->GetITSClusterMap();
1168 tIsPiITSRefit =(Float_t)IsPiITSRefit;
1171 tchi2He =(Float_t)HeTrack->GetTPCchi2()/(Float_t)(nClustersTPCHe);
1172 tchi2Pi =(Float_t)PionTrack->GetTPCchi2()/(Float_t)(nClustersTPCPi);
1183 PostData(1,fListHist);
1184 PostData(2,fNtuple1);
1185 PostData(3,fNtuple4);
1190 //________________________________________________________________________
1192 void AliAnalysisTaskHelium3PiAOD::Terminate(Option_t *)
1194 // Draw result to the screen
1195 // Called once at the end of the query