1 /**************************************************************************
\r
2 * Contributors are not mentioned at all. *
\r
4 * Permission to use, copy, modify and distribute this software and its *
\r
5 * documentation strictly for non-commercial purposes is hereby granted *
\r
6 * without fee, provided that the above copyright notice appears in all *
\r
7 * copies and that both the copyright notice and this permission notice *
\r
8 * appear in the supporting documentation. The authors make no claims *
\r
9 * about the suitability of this software for any purpose. It is *
\r
10 * provided "as is" without express or implied warranty. *
\r
11 **************************************************************************/
\r
13 //-----------------------------------------------------------------
\r
14 // AliAnalysisTaskHelium3Pi class
\r
15 //-----------------------------------------------------------------
\r
22 #include "AliAnalysisManager.h"
\r
23 #include <AliMCEventHandler.h>
\r
24 #include <AliMCEvent.h>
\r
25 #include <AliStack.h>
\r
31 class AliCascadeVertexer;
\r
34 #include "AliAnalysisTaskSE.h"
\r
39 #include "TNtuple.h"
\r
43 #include "TCanvas.h"
\r
46 #include "Riostream.h"
\r
48 #include "AliCascadeVertexer.h"
\r
49 #include "AliESDEvent.h"
\r
50 #include "AliESDtrack.h"
\r
51 #include "AliExternalTrackParam.h"
\r
52 #include "AliAODEvent.h"
\r
53 #include "AliInputEventHandler.h"
\r
54 #include "AliESDcascade.h"
\r
55 #include "AliAODcascade.h"
\r
56 #include "AliAnalysisTaskHelium3Pi.h"
\r
57 #include "AliESDtrackCuts.h"
\r
58 #include "AliCentrality.h"
\r
59 #include "TString.h"
\r
60 #include <TDatime.h>
\r
61 #include <TRandom3.h>
\r
62 #include <TLorentzVector.h>
\r
64 const Int_t AliAnalysisTaskHelium3Pi::fgNrot = 15;
\r
66 ClassImp(AliAnalysisTaskHelium3Pi)
\r
68 //________________________________________________________________________
\r
69 AliAnalysisTaskHelium3Pi::AliAnalysisTaskHelium3Pi()
\r
70 : AliAnalysisTaskSE(),
\r
71 fAnalysisType("ESD"),
\r
72 fCollidingSystems(0),
\r
74 fListHistCascade(0),
\r
75 fHistEventMultiplicity(0),
\r
76 fHistTrackMultiplicity(0),
\r
77 fHistTrackMultiplicityCent(0),
\r
78 fHistTrackMultiplicitySemiCent(0),
\r
79 fHistTrackMultiplicityMB(0),
\r
80 fHistTrackMultiplicityPVCent(0),
\r
81 fHistTrackMultiplicityPVSemiCent(0),
\r
82 fHistTrackMultiplicityPVMB(0),
\r
91 fBetavsTPCsignalPos(0),
\r
92 fBetavsTPCsignalNeg(0),
\r
98 // Dummy Constructor
\r
101 //________________________________________________________________________
\r
102 AliAnalysisTaskHelium3Pi::AliAnalysisTaskHelium3Pi(const char *name)
\r
103 : AliAnalysisTaskSE(name),
\r
104 fAnalysisType("ESD"),
\r
105 fCollidingSystems(0),
\r
107 fListHistCascade(0),
\r
108 fHistEventMultiplicity(0),
\r
109 fHistTrackMultiplicity(0),
\r
110 fHistTrackMultiplicityCent(0),
\r
111 fHistTrackMultiplicitySemiCent(0),
\r
112 fHistTrackMultiplicityMB(0),
\r
113 fHistTrackMultiplicityPVCent(0),
\r
114 fHistTrackMultiplicityPVSemiCent(0),
\r
115 fHistTrackMultiplicityPVMB(0),
\r
124 fBetavsTPCsignalPos(0),
\r
125 fBetavsTPCsignalNeg(0),
\r
131 // Define input and output slots here
\r
132 // Input slot #0 works with a TChain
\r
133 //DefineInput(0, TChain::Class());
\r
134 // Output slot #0 writes into a TList container (Cascade)
\r
136 DefineOutput(1, TList::Class());
\r
138 //_______________________________________________________
\r
139 AliAnalysisTaskHelium3Pi::~AliAnalysisTaskHelium3Pi()
\r
142 if (fListHistCascade) {
\r
143 delete fListHistCascade;
\r
144 fListHistCascade = 0;
\r
148 //=================DEFINITION BETHE BLOCH==============================
\r
150 Double_t AliAnalysisTaskHelium3Pi::BetheBloch(Double_t betaGamma,Double_t charge,Bool_t isPbPb) {
\r
152 Double_t kp1, kp2, kp3, kp4, kp5;
\r
157 kp1 = 4.7*charge*charge;
\r
158 kp2 = 8.98482806165147636e+00;
\r
159 kp3 = 1.54000000000000005e-05;
\r
160 kp4 = 2.30445734159456084e+00;
\r
161 kp5 = 2.25624744086878559e+00;
\r
167 // to be defined ...
\r
169 kp1 = 4.7*charge*charge;
\r
170 kp2 = 8.98482806165147636e+00;
\r
171 kp3 = 1.54000000000000005e-05;
\r
172 kp4 = 2.30445734159456084e+00;
\r
173 kp5 = 2.25624744086878559e+00;
\r
177 Double_t beta = betaGamma / TMath::Sqrt(1.0 + betaGamma * betaGamma);
\r
179 Double_t aa = TMath::Power(beta, kp4);
\r
180 Double_t bb = TMath::Power(1.0 / betaGamma, kp5);
\r
182 bb = TMath::Log(kp3 + bb);
\r
184 Double_t out = (kp2 - aa - bb) * kp1 / aa;
\r
190 //==================DEFINITION OF OUTPUT OBJECTS==============================
\r
192 void AliAnalysisTaskHelium3Pi::UserCreateOutputObjects()
\r
195 fListHistCascade = new TList();
\r
196 fListHistCascade->SetOwner(); // IMPORTANT!
\r
198 if(! fHistEventMultiplicity ){
\r
199 fHistEventMultiplicity = new TH1F( "fHistEventMultiplicity" , "Nb of Events" , 10 , 0, 10);
\r
200 fHistEventMultiplicity->GetXaxis()->SetBinLabel(1,"All Events");
\r
201 fHistEventMultiplicity->GetXaxis()->SetBinLabel(2,"Events w/PV");
\r
202 fHistEventMultiplicity->GetXaxis()->SetBinLabel(3,"Events w/|Vz|<10cm");
\r
203 fHistEventMultiplicity->GetXaxis()->SetBinLabel(4,"Central Events");
\r
204 fHistEventMultiplicity->GetXaxis()->SetBinLabel(5,"SemiCentral Events");
\r
205 fHistEventMultiplicity->GetXaxis()->SetBinLabel(6,"MB Events");
\r
206 fHistEventMultiplicity->GetXaxis()->SetBinLabel(7,"Central Events w/|Vz|<10cm");
\r
207 fHistEventMultiplicity->GetXaxis()->SetBinLabel(8,"SemiCentral Events w/|Vz|<10cm");
\r
208 fHistEventMultiplicity->GetXaxis()->SetBinLabel(9,"MB Events w/|Vz|<10cm");
\r
210 fListHistCascade->Add(fHistEventMultiplicity);
\r
213 if(! fHistTrackMultiplicity ){
\r
214 fHistTrackMultiplicity = new TH2F( "fHistTrackMultiplicity" , "Nb of Tracks", 25000,0, 25000,105,-1,104);
\r
215 fHistTrackMultiplicity->GetXaxis()->SetTitle("Number of tracks");
\r
216 fHistTrackMultiplicity->GetYaxis()->SetTitle("Percentile");
\r
217 fListHistCascade->Add(fHistTrackMultiplicity);
\r
220 if(! fHistTrackMultiplicityCent ){
\r
221 fHistTrackMultiplicityCent = new TH2F( "fHistTrackMultiplicityCent", "Nb of Tracks Central Events", 25000,0, 25000,105,-1,104 );
\r
222 fHistTrackMultiplicityCent->GetXaxis()->SetTitle("Number of tracks");
\r
223 fHistTrackMultiplicityCent->GetYaxis()->SetTitle("Percentile");
\r
224 fListHistCascade->Add(fHistTrackMultiplicityCent);
\r
227 if(! fHistTrackMultiplicitySemiCent ){
\r
228 fHistTrackMultiplicitySemiCent = new TH2F( "fHistTrackMultiplicitySemiCent" , "Nb of Tracks SemiCentral Events", 25000,0, 25000 ,105,-1,104);
\r
229 fHistTrackMultiplicitySemiCent->GetXaxis()->SetTitle("Number of tracks");
\r
230 fHistTrackMultiplicitySemiCent->GetYaxis()->SetTitle("Percentile");
\r
231 fListHistCascade->Add(fHistTrackMultiplicitySemiCent);
\r
234 if(! fHistTrackMultiplicityMB ){
\r
235 fHistTrackMultiplicityMB = new TH2F( "fHistTrackMultiplicityMB" , "Nb of Tracks MBral Events", 25000,0, 25000,105,-1,104 );
\r
236 fHistTrackMultiplicityMB->GetXaxis()->SetTitle("Number of tracks");
\r
237 fHistTrackMultiplicityMB->GetYaxis()->SetTitle("Percentile");
\r
238 fListHistCascade->Add(fHistTrackMultiplicityMB);
\r
241 if(! fHistTrackMultiplicityPVCent ){
\r
242 fHistTrackMultiplicityPVCent = new TH2F( "fHistTrackMultiplicityPVCent" , "Nb of Tracks Central Events", 25000,0, 25000,105,-1,104 );
\r
243 fHistTrackMultiplicityPVCent->GetXaxis()->SetTitle("Number of tracks");
\r
244 fHistTrackMultiplicityPVCent->GetYaxis()->SetTitle("Percentile");
\r
245 fListHistCascade->Add(fHistTrackMultiplicityPVCent);
\r
248 if(! fHistTrackMultiplicityPVSemiCent ){
\r
249 fHistTrackMultiplicityPVSemiCent = new TH2F( "fHistTrackMultiplicityPVSemiCent" , "Nb of Tracks SemiCentral Events", 25000,0, 25000 ,105,-1,104);
\r
250 fHistTrackMultiplicityPVSemiCent->GetXaxis()->SetTitle("Number of tracks");
\r
251 fHistTrackMultiplicityPVSemiCent->GetYaxis()->SetTitle("Percentile");
\r
252 fListHistCascade->Add(fHistTrackMultiplicityPVSemiCent);
\r
255 if(! fHistTrackMultiplicityPVMB ){
\r
256 fHistTrackMultiplicityPVMB = new TH2F( "fHistTrackMultiplicityPVMB" , "Nb of Tracks MBral Events", 25000,0, 25000,105,-1,104 );
\r
257 fHistTrackMultiplicityPVMB->GetXaxis()->SetTitle("Number of tracks");
\r
258 fHistTrackMultiplicityPVMB->GetYaxis()->SetTitle("Percentile");
\r
259 fListHistCascade->Add(fHistTrackMultiplicityPVMB);
\r
263 fHistMult=new TH1F ("fHistMult","Number neg-pos", 10, -1,9);
\r
264 fHistMult->GetXaxis()->SetTitle("Type of tracks");
\r
265 fListHistCascade->Add(fHistMult);
\r
269 fhBB = new TH2F( "fhBB" , "BetheBlochTPC" , 1000,-6,6,1500,0,5000);
\r
270 fhBB->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
\r
271 fhBB->GetYaxis()->SetTitle("TPC Signal");
\r
272 fListHistCascade->Add(fhBB);
\r
276 fhTOF = new TH2F( "fhTOF" , "Scatter Plot TOF" , 1000,-6,6,1000,0,1.2);
\r
277 fhTOF->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
\r
278 fhTOF->GetYaxis()->SetTitle("#beta");
\r
279 fListHistCascade->Add(fhTOF);
\r
283 fhMassTOF=new TH1F ("fhMassTOF","Particle Mass - TOF", 300,0 ,5);
\r
284 fhMassTOF->GetXaxis()->SetTitle("Mass (GeV/#it{c}^{2})");
\r
285 fListHistCascade->Add(fhMassTOF);
\r
289 fhBBPions = new TH2F( "fhBBPions" , "Bethe-Bloch TPC Pions" , 1000,-6,6,1500,0,5000);
\r
290 fhBBPions->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
\r
291 fhBBPions->GetYaxis()->SetTitle("TPC Signal");
\r
292 fListHistCascade->Add(fhBBPions);
\r
296 fhBBHe = new TH2F( "fhBBHe" , "Bethe-Bloch TPC He" , 1000,-6,6,1500,0,5000);
\r
297 fhBBHe->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
\r
298 fhBBHe->GetYaxis()->SetTitle("TPC Signal");
\r
299 fListHistCascade->Add(fhBBHe);
\r
303 fhNaPos = new TH2F( "fhNaPos" , "Distribution Pos" , 500,0,5,500,-2,2);
\r
304 fhNaPos->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
\r
305 fhNaPos->GetYaxis()->SetTitle("(TPCSignal-bbtheo)/bbtheo (He)");
\r
306 fListHistCascade->Add(fhNaPos);
\r
310 fhNaNeg = new TH2F( "fhNaNeg" , "Distribution Neg" , 500,0,5,500,-2,2);
\r
311 fhNaNeg->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
\r
312 fhNaNeg->GetYaxis()->SetTitle("(TPCSignal-bbtheo)/bbtheo (He)");
\r
313 fListHistCascade->Add(fhNaNeg);
\r
316 if(! fBetavsTPCsignalPos ){
\r
317 fBetavsTPCsignalPos = new TH2F("fBetavsTPCsignalPos","fBetavsTPCsignalPos",1000,0,1.2,1500,0,5000);
\r
318 fBetavsTPCsignalPos->GetXaxis()->SetTitle("#beta");
\r
319 fBetavsTPCsignalPos->GetYaxis()->SetTitle("TPC Signal");
\r
320 fListHistCascade->Add(fBetavsTPCsignalPos);
\r
323 if(! fBetavsTPCsignalNeg ){
\r
324 fBetavsTPCsignalNeg = new TH2F("fBetavsTPCsignalNeg","fBetavsTPCsignalNeg",1000,0,1.2,1500,0,5000);
\r
325 fBetavsTPCsignalNeg->GetXaxis()->SetTitle("#beta");
\r
326 fBetavsTPCsignalNeg->GetYaxis()->SetTitle("TPC Signal");
\r
327 fListHistCascade->Add(fBetavsTPCsignalNeg);
\r
331 fHelium3TOF = new TH2F("fHelium3massTOF","Helium3 beta vs p/z",1000,0,6,1000,0,1.2);
\r
332 fHelium3TOF->GetXaxis()->SetTitle("p/z (GeV/#it{c})");
\r
333 fHelium3TOF->GetYaxis()->SetTitle("#beta");
\r
334 fListHistCascade->Add(fHelium3TOF);
\r
338 fNtuple1 = new TNtuple("fNtuple1","Ntuple1","runNumber:bunchcross:orbit:period:eventtype:TrackNumber:percentile:xPrimaryVertex:yPrimaryVertex:zPrimaryVertex:xSecondaryVertex:ySecondaryVertex:zSecondaryVertex:dcaTracks:CosPointingAngle:DCAV0toPrimaryVertex:HeSign:HepInTPC:HeTPCsignal:DcaHeToPrimVertex:HeEta:momHex:momHey:momHez:momHeAtSVx:momHeAtSVy:momHeAtSVz:HeTPCNcls:HeimpactXY:HeimpactZ:HeITSClusterMap:IsHeITSRefit:PionSign:PionpInTPC:PionTPCsignal:DcaPionToPrimVertex:PionEta:momPionx:momPiony:momPionz:momNegPionAtSVx:momNegPionAtSVy:momNegPionAtSVz:PionTPCNcls:PionimpactXY:PionimpactZ:PionITSClusterMap:IsPiITSRefit:xn:xp");
\r
340 fListHistCascade->Add(fNtuple1);
\r
344 fNtuple4 = new TNtuple("fNtuple4","Ntuple4","runNumber:BCNumber:OrbitNumber:PeriodNumber:eventtype:isHeITSrefit:percentile:Sign:pinTPC:GetTPCsignal:Px:Py:Pz:Eta:isTOF:poutTPC:timeTOF:trackLenghtTOF:impactXY:impactZ:mapITS:TPCNcls:TRDsignal:xPrimaryVertex:yPrimaryVertex:zPrimaryVertex:chi2PerClusterTPC");
\r
345 fListHistCascade->Add(fNtuple4);
\r
348 PostData(1, fListHistCascade);
\r
350 }// end UserCreateOutputObjects
\r
354 //====================== USER EXEC ========================
\r
356 void AliAnalysisTaskHelium3Pi::UserExec(Option_t *)
\r
358 //_______________________________________________________________________
\r
360 //!*********************!//
\r
361 //! Define variables !//
\r
362 //!*********************!//
\r
364 for(Int_t i=0;i<50;i++) vett1[i]=0;
\r
367 for(Int_t i=0;i<40;i++) vett4[i]=0;
\r
369 Double_t ITSsample[4];
\r
370 for(Int_t i=0;i<4;i++)ITSsample[i]=0;
\r
372 Double_t pinTPC=0.,poutTPC=0.,TPCSignal=0.;
\r
373 Double_t xPrimaryVertex=0.,yPrimaryVertex=0.,zPrimaryVertex=0.;
\r
374 Double_t massTOF=0.,timeTOF=0.,trackLenghtTOF=0.,betaTOF=0.;
\r
378 ULong_t statusPi=0;
\r
380 Bool_t isTPC=kFALSE,isTOF=kFALSE,isTOFHe=kFALSE,IsHeITSRefit=kFALSE,isTOFPi=kFALSE,IsPiITSRefit=kFALSE ;
\r
382 Float_t nSigmaNegPion=0.;
\r
383 Float_t nSigmaNegPion1=0.;
\r
384 Float_t nSigmaNegPion2=0.;
\r
386 Double_t cutNSigma = 3;
\r
387 Double_t bbtheoM=0.,bbtheoP=0.,bbtheo=0.;
\r
388 Double_t zNathashaNeg=0;
\r
389 Double_t zNathashaPos=0;
\r
390 Double_t fPos[3]={0.,0.,0.};
\r
391 Double_t runNumber=0.;
\r
392 Double_t evNumber=0.;
\r
394 Double_t BCNumber=0.;
\r
395 Double_t OrbitNumber=0.;
\r
396 Double_t PeriodNumber=0.;
\r
398 Double_t Helium3Mass = 2.80839;
\r
399 Double_t PionMass = 0.13957;
\r
400 // TLORENTZ vectors
\r
402 TLorentzVector vPion,vHelium,vSum;
\r
404 //!----------------------------------------------------------------
\r
406 //! A set of very loose parameters for cuts
\r
408 Double_t fgChi2max=33.; //! max chi2
\r
409 Double_t fgDNmin=0.05; //! min imp parameter for the 1st daughter = 500um
\r
410 Double_t fgDCAmax=1.0; //! max DCA between the daughter tracks in cm
\r
411 Double_t fgCPAmin=0.99; //! min cosine of V0's pointing angle
\r
412 // Double_t fgRmin=0.2; //! min radius of the fiducial volume //original
\r
413 Double_t fgRmin=0.1; //! min radius of the fiducial volume = 1 mm
\r
414 Double_t fgRmax=200.; //! max radius of the fiducial volume = 2 m
\r
416 //------------------------------------------
\r
419 // Called for EACH event
\r
421 AliVEvent *event = InputEvent();
\r
422 if (!event) { Printf("ERROR: Could not retrieve event"); return; }
\r
424 Info("AliAnalysisTaskHelium3Pi","Starting UserExec");
\r
426 SetDataType("REAL");
\r
428 // create pointer to event
\r
429 AliESDEvent* lESDevent = dynamic_cast<AliESDEvent*>(event);
\r
431 AliError("Cannot get the ESD event");
\r
435 fHistEventMultiplicity->Fill(0);
\r
437 Double_t lMagneticField=lESDevent->GetMagneticField();
\r
438 Int_t TrackNumber = -1;
\r
441 //*****************//
\r
443 //*****************//
\r
445 AliCentrality *centrality = lESDevent->GetCentrality();
\r
446 Float_t percentile=centrality->GetCentralityPercentile("V0M");
\r
448 TrackNumber = lESDevent->GetNumberOfTracks();
\r
449 if (TrackNumber<2) return;
\r
451 fHistTrackMultiplicity->Fill(TrackNumber,percentile); //tracce per evento
\r
453 //****************************************
\r
455 Int_t eventtype=-99;
\r
457 Bool_t isSelectedCentral = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
\r
458 Bool_t isSelectedSemiCentral = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
\r
459 Bool_t isSelectedMB = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
\r
461 if(isSelectedCentral){
\r
462 fHistEventMultiplicity->Fill(3);
\r
463 fHistTrackMultiplicityCent->Fill(TrackNumber,percentile);
\r
467 if(isSelectedSemiCentral){
\r
468 fHistEventMultiplicity->Fill(4);
\r
469 fHistTrackMultiplicitySemiCent->Fill(TrackNumber,percentile);
\r
474 fHistEventMultiplicity->Fill(5);
\r
475 fHistTrackMultiplicityMB->Fill(TrackNumber,percentile);
\r
479 if(isSelectedCentral || isSelectedSemiCentral || isSelectedMB){
\r
483 // Primary vertex cut
\r
485 const AliESDVertex *vtx = lESDevent->GetPrimaryVertexTracks();
\r
487 if(vtx->GetNContributors()<1) {
\r
490 vtx = lESDevent->GetPrimaryVertexSPD();
\r
492 if(vtx->GetNContributors()<1) {
\r
493 Info("AliAnalysisTaskHelium3Pi","No good vertex, skip event");
\r
494 return; // NO GOOD VERTEX, SKIP EVENT
\r
498 fHistEventMultiplicity->Fill(1); // analyzed events with PV
\r
500 xPrimaryVertex=vtx->GetXv();
\r
501 yPrimaryVertex=vtx->GetYv();
\r
502 zPrimaryVertex=vtx->GetZv();
\r
504 if(TMath::Abs(zPrimaryVertex)>10) return;
\r
507 fHistTrackMultiplicityPVCent->Fill(TrackNumber,percentile);
\r
508 fHistEventMultiplicity->Fill(6);
\r
512 fHistTrackMultiplicityPVSemiCent->Fill(TrackNumber,percentile);
\r
513 fHistEventMultiplicity->Fill(7);
\r
517 fHistTrackMultiplicityPVMB->Fill(TrackNumber,percentile);
\r
518 fHistEventMultiplicity->Fill(8);
\r
522 fHistEventMultiplicity->Fill(2);
\r
524 //Find Pair candidates
\r
526 TArrayI PionsTPC(TrackNumber); //Neg pions
\r
529 TArrayI HeTPC(TrackNumber); //helium3
\r
532 const Double_t speedOfLight = TMath::C()*1E2*1E-12; // cm/ps
\r
534 Float_t impactXY=-999, impactZ=-999;
\r
535 Float_t impactXYpi=-999, impactZpi=-999;
\r
543 // ******************* Track Cuts Definitions ********************//
\r
547 AliESDtrackCuts* esdtrackCutsITS = new AliESDtrackCuts("esdtrackCutsITS");
\r
548 esdtrackCutsITS->SetRequireITSStandAlone(kFALSE);
\r
549 esdtrackCutsITS->SetRequireITSPureStandAlone(kFALSE);
\r
553 Int_t minclsTPC=60;
\r
554 Double_t maxchi2perTPCcl=5.;
\r
556 AliESDtrackCuts* esdtrackCutsTPC = new AliESDtrackCuts("esdtrackCutsTPC");
\r
557 esdtrackCutsTPC->SetRequireTPCRefit(kTRUE);
\r
558 esdtrackCutsTPC->SetAcceptKinkDaughters(kFALSE);
\r
559 esdtrackCutsTPC->SetMinNClustersTPC(minclsTPC);
\r
560 esdtrackCutsTPC->SetMaxChi2PerClusterTPC(maxchi2perTPCcl);
\r
562 //*********************************************+
\r
564 runNumber = lESDevent->GetRunNumber();
\r
565 evNumber = lESDevent->GetEventNumberInFile();
\r
567 BCNumber = lESDevent->GetBunchCrossNumber();
\r
568 OrbitNumber = lESDevent->GetOrbitNumber();
\r
569 PeriodNumber= lESDevent->GetPeriodNumber();
\r
571 //*************************************************************
\r
573 TF1 *foPion=new TF1("foPion", "[0]*([1]*TMath::Power(TMath::Sqrt(1 + (x/0.13957)*(x/0.13957))/(x/0.13957) , [3]) - 1 - TMath::Power(TMath::Sqrt(1 + (x/0.13957)*(x/0.13957))/(x/0.13957) , [3])*TMath::Log([2] + 1/TMath::Power((x/0.13957), [4])))",0.01,20);
\r
574 foPion->SetParameters(4.1,8.98482806165147636e+00,1.54000000000000005e-05,2.30445734159456084e+00,2.25624744086878559e+00);
\r
576 //--------------------------------------------
\r
578 for (Int_t j=0; j<TrackNumber; j++) { //loop on tracks
\r
580 AliESDtrack *esdtrack=lESDevent->GetTrack(j);
\r
583 AliError(Form("ERROR: Could not retrieve esdtrack %d",j));
\r
587 // ************** Track cuts ****************
\r
589 status = (ULong_t)esdtrack->GetStatus();
\r
591 isTPC = (((status) & AliESDtrack::kTPCin) != 0);
\r
592 isTOF = ((((status) & AliESDtrack::kTOFout) != 0) && (((status) & AliESDtrack::kTIME) != 0));
\r
594 Bool_t IsTrackAcceptedTPC = esdtrackCutsTPC->AcceptTrack(esdtrack);
\r
595 Bool_t IsTrackAcceptedITS = esdtrackCutsITS->AcceptTrack(esdtrack);
\r
597 if (!(IsTrackAcceptedTPC && IsTrackAcceptedITS)) continue;
\r
599 UInt_t mapITS=esdtrack->GetITSClusterMap();
\r
600 // if(mapITS==0) continue;
\r
602 //----------------------------------------------
\r
604 //****** Cuts from AliV0Vertex.cxx *************
\r
606 Double_t d=esdtrack->GetD(xPrimaryVertex,yPrimaryVertex,lMagneticField);
\r
607 // if (TMath::Abs(d)<fgDPmin) continue;
\r
608 if (TMath::Abs(d)>fgRmax) continue;
\r
610 //---- (Usefull) Stuff
\r
612 TPCSignal=esdtrack->GetTPCsignal();
\r
614 if (TPCSignal<10)continue;
\r
616 if(!isTPC)continue;
\r
618 if(!esdtrack->GetTPCInnerParam())continue;
\r
620 AliExternalTrackParam trackIn(*esdtrack->GetInnerParam());
\r
621 pinTPC = trackIn.GetP();
\r
625 fHistMult->Fill(0);
\r
627 if((status) & (AliESDtrack::kITSrefit!=0)){
\r
628 fHistMult->Fill(1);
\r
629 fhBB->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
\r
632 timeTOF=esdtrack->GetTOFsignal(); // ps
\r
633 trackLenghtTOF= esdtrack->GetIntegratedLength(); // cm
\r
637 if(!esdtrack->GetOuterParam())continue;
\r
639 AliExternalTrackParam trackOut(*esdtrack->GetOuterParam());
\r
641 poutTPC = trackOut.GetP();
\r
643 betaTOF= (trackLenghtTOF/timeTOF)/2.99792458e-2;
\r
645 fhTOF->Fill(poutTPC*esdtrack->GetSign(),betaTOF);
\r
647 Double_t mass2=(poutTPC*poutTPC)*((((speedOfLight*speedOfLight)*(timeTOF*timeTOF))-(trackLenghtTOF*trackLenghtTOF))/(trackLenghtTOF*trackLenghtTOF));
\r
648 if(mass2>0) massTOF=TMath::Sqrt(mass2);
\r
649 fhMassTOF->Fill(massTOF);
\r
651 if(esdtrack->GetSign() < 0.)fBetavsTPCsignalNeg->Fill(betaTOF,TPCSignal);
\r
652 if(esdtrack->GetSign() > 0.)fBetavsTPCsignalPos->Fill(betaTOF,TPCSignal);
\r
658 bbtheo =BetheBloch((2*pinTPC)/3.,2,kTRUE); //! OK
\r
659 bbtheoM=(1 - 0.08*5)*bbtheo; //! OK
\r
660 bbtheoP=(1 + 0.08*5)*bbtheo; //! OK
\r
662 fHistMult->Fill(2);
\r
664 if(esdtrack->GetSign()<0){
\r
665 zNathashaNeg=(TPCSignal-bbtheo)/bbtheo;
\r
666 fhNaNeg->Fill(pinTPC,zNathashaNeg);
\r
669 if(esdtrack->GetSign() > 0.){
\r
670 zNathashaPos=(TPCSignal-bbtheo)/bbtheo;
\r
671 fhNaPos->Fill(pinTPC,zNathashaPos);
\r
674 nSigmaNegPion1 = TMath::Abs((TPCSignal - foPion->Eval(pinTPC))/foPion->Eval(pinTPC))/0.07;
\r
675 nSigmaNegPion2 = TMath::Abs((TPCSignal - foPion->Eval(pinTPC))/foPion->Eval(pinTPC))/0.04;
\r
678 nSigmaNegPion=nSigmaNegPion1;
\r
680 nSigmaNegPion=nSigmaNegPion2;
\r
682 if ( (nSigmaNegPion < cutNSigma)){
\r
684 fhBBPions->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
\r
687 PionsTPC[nPionsTPC++]=j;
\r
691 if( TPCSignal > bbtheoM ) {
\r
695 fhBBHe->Fill(pinTPC*esdtrack->GetSign(),TPCSignal);
\r
699 Bool_t isHeITSrefit=((status) & (AliESDtrack::kITSrefit));
\r
701 esdtrack->GetImpactParameters(impactXY, impactZ);
\r
702 esdtrack->GetITSdEdxSamples(ITSsample);
\r
705 Int_t fIdxInt[200]; //dummy array
\r
706 Int_t nClustersTPC = esdtrack->GetTPCclusters(fIdxInt);
\r
708 Float_t chi2PerClusterTPC = esdtrack->GetTPCchi2()/(Float_t)(nClustersTPC);
\r
710 vett4[0] =(Float_t)runNumber;
\r
711 vett4[1] =(Float_t)BCNumber;
\r
712 vett4[2] =(Float_t)OrbitNumber;
\r
713 vett4[3] =(Float_t)PeriodNumber;
\r
714 vett4[4] =(Float_t)eventtype;
\r
715 vett4[5] =(Float_t)isHeITSrefit;
\r
716 vett4[6] =(Float_t)percentile;
\r
717 vett4[7] =(Float_t)esdtrack->GetSign();
\r
718 vett4[8] =(Float_t)pinTPC;
\r
719 vett4[9] =(Float_t)esdtrack->GetTPCsignal();
\r
720 vett4[10]=(Float_t)esdtrack->Px();
\r
721 vett4[11]=(Float_t)esdtrack->Py();
\r
722 vett4[12]=(Float_t)esdtrack->Pz();
\r
723 vett4[13]=(Float_t)esdtrack->Eta();
\r
724 vett4[14]=(Float_t)isTOF;
\r
725 vett4[15]=(Float_t)poutTPC;
\r
726 vett4[16]=(Float_t)timeTOF;
\r
727 vett4[17]=(Float_t)trackLenghtTOF;
\r
728 vett4[18]=(Float_t)impactXY;
\r
729 vett4[19]=(Float_t)impactZ;
\r
730 vett4[20]=(Float_t)mapITS;
\r
731 vett4[21]=(Float_t)esdtrack->GetTPCNcls();
\r
732 vett4[22]=(Float_t)esdtrack->GetTRDsignal();
\r
733 vett4[23]=(Float_t)xPrimaryVertex;
\r
734 vett4[24]=(Float_t)yPrimaryVertex;
\r
735 vett4[25]=(Float_t)zPrimaryVertex;
\r
736 vett4[26]=(Float_t)chi2PerClusterTPC;
\r
738 fNtuple4->Fill(vett4);
\r
744 Double_t DcaHeToPrimVertex=0;
\r
745 Double_t DcaPionToPrimVertex=0;
\r
747 impactXY=-999, impactZ=-999;
\r
748 impactXYpi=-999, impactZpi=-999;
\r
752 AliESDtrack *PionTrack = 0x0;
\r
753 AliESDtrack *HeTrack = 0x0;
\r
755 // Vettors for il PxPyPz
\r
757 Double_t momPionVett[3];
\r
758 for(Int_t i=0;i<3;i++)momPionVett[i]=0;
\r
760 Double_t momHeVett[3];
\r
761 for(Int_t i=0;i<3;i++)momHeVett[i]=0;
\r
765 Double_t momPionVettAt[3];
\r
766 for(Int_t i=0;i<3;i++)momPionVettAt[i]=0;
\r
768 Double_t momHeVettAt[3];
\r
769 for(Int_t i=0;i<3;i++)momHeVettAt[i]=0;
\r
771 //--------------- LOOP PAIRS ----------------
\r
773 for (Int_t k=0; k < nPionsTPC; k++) { //! Pions Loop
\r
775 DcaPionToPrimVertex=0.;
\r
776 DcaHeToPrimVertex=0;
\r
778 Int_t PionIdx=PionsTPC[k];
\r
780 PionTrack=lESDevent->GetTrack(PionIdx);
\r
782 statusPi = (ULong_t)PionTrack->GetStatus();
\r
783 isTOFPi = ((((statusPi) & (AliESDtrack::kTOFout)) != 0) && (((statusPi) & (AliESDtrack::kTIME)) != 0));
\r
784 IsPiITSRefit = ((statusPi) & (AliESDtrack::kITSrefit));
\r
787 DcaPionToPrimVertex = TMath::Abs(PionTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
\r
789 if(DcaPionToPrimVertex<0.2)continue; //qui
\r
791 AliExternalTrackParam trackInPion(*PionTrack);
\r
793 for (Int_t i=0; i<nHeTPC; i++){ //! Helium Loop
\r
795 Int_t HeIdx=HeTPC[i];
\r
797 HeTrack=lESDevent->GetTrack(HeIdx);
\r
799 statusT= (ULong_t)HeTrack->GetStatus();
\r
800 isTOFHe = (((statusT & AliESDtrack::kTOFout) != 0) && ((statusT & AliESDtrack::kTIME) != 0));
\r
801 IsHeITSRefit = (status & AliESDtrack::kITSrefit);
\r
804 DcaHeToPrimVertex = TMath::Abs(HeTrack->GetD(xPrimaryVertex, yPrimaryVertex,lMagneticField)); //OK
\r
806 AliExternalTrackParam trackInHe(*HeTrack);
\r
808 if ( DcaPionToPrimVertex < fgDNmin) //OK
\r
809 if ( DcaHeToPrimVertex < fgDNmin) continue; //OK
\r
814 dca= PionTrack->GetDCA(HeTrack,lMagneticField,xn,xp); //!dca (Neg to Pos)
\r
816 if (dca > fgDCAmax) continue;
\r
817 if ((xn+xp) > 2*fgRmax) continue;
\r
818 if ((xn+xp) < 2*fgRmin) continue;
\r
820 //CORRECTION from AliV0Vertex
\r
822 Bool_t corrected=kFALSE;
\r
823 if ((trackInPion.GetX() > 3.) && (xn < 3.)) {
\r
824 //correct for the beam pipe material
\r
827 if ((trackInHe.GetX() > 3.) && (xp < 3.)) {
\r
828 //correct for the beam pipe material
\r
832 dca=trackInPion.GetDCA(&trackInHe,lMagneticField,xn,xp);
\r
833 if (dca > fgDCAmax) continue;
\r
834 if ((xn+xp) > 2*fgRmax) continue;
\r
835 if ((xn+xp) < 2*fgRmin) continue;
\r
838 //=============================================//
\r
839 // Make "V0" with found tracks //
\r
840 //=============================================//
\r
842 trackInPion.PropagateTo(xn,lMagneticField);
\r
843 trackInHe.PropagateTo(xp,lMagneticField);
\r
845 AliESDv0 vertex(trackInPion,PionIdx,trackInHe,HeIdx);
\r
846 if (vertex.GetChi2V0() > fgChi2max) continue;
\r
848 Float_t CosPointingAngle=vertex.GetV0CosineOfPointingAngle(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex); //PointingAngle
\r
849 if (CosPointingAngle < fgCPAmin) continue;
\r
851 vertex.SetDcaV0Daughters(dca);
\r
852 vertex.SetV0CosineOfPointingAngle(CosPointingAngle);
\r
854 fPos[0]=vertex.Xv();
\r
855 fPos[1]=vertex.Yv();
\r
856 fPos[2]=vertex.Zv();
\r
858 HeTrack->PxPyPz(momHeVett);
\r
859 PionTrack->PxPyPz(momPionVett);
\r
861 Double_t raggio=TMath::Sqrt(fPos[0]*fPos[0]+fPos[1]*fPos[1]+fPos[2]*fPos[2]);
\r
862 HeTrack->GetPxPyPzAt(raggio,lMagneticField,momHeVettAt);
\r
863 PionTrack->GetPxPyPzAt(raggio,lMagneticField,momPionVettAt);
\r
865 //------------------------------------------------------------------------//
\r
867 HeTrack->GetImpactParameters(impactXY, impactZ);
\r
869 PionTrack->GetImpactParameters(impactXYpi, impactZpi);
\r
871 if(vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex)>3) continue;
\r
873 //salvo solo fino a 3.1 GeV/c2
\r
875 vHelium.SetXYZM(2*momHeVettAt[0],2*momHeVettAt[1],2*momHeVettAt[2],Helium3Mass);
\r
876 vPion.SetXYZM(momPionVettAt[0],momPionVettAt[1],momPionVettAt[2],PionMass);
\r
877 vSum=vHelium+vPion;
\r
879 if(vSum.M()>3.1)continue;
\r
881 //----------------------------------------------------------------------//
\r
883 vett1[0]=(Float_t)runNumber;
\r
884 vett1[1]=(Float_t)BCNumber;
\r
885 vett1[2]=(Float_t)OrbitNumber;
\r
886 vett1[3]=(Float_t)PeriodNumber;
\r
887 vett1[4]=(Float_t)eventtype;
\r
888 vett1[5]=(Float_t)TrackNumber;
\r
889 vett1[6]=(Float_t)percentile;
\r
890 vett1[7]=(Float_t)xPrimaryVertex; //PRIMARY
\r
891 vett1[8]=(Float_t)yPrimaryVertex;
\r
892 vett1[9]=(Float_t)zPrimaryVertex;
\r
893 vett1[10]=(Float_t)fPos[0]; //SECONDARY
\r
894 vett1[11]=(Float_t)fPos[1];
\r
895 vett1[12]=(Float_t)fPos[2];
\r
896 vett1[13]=(Float_t)dca; //between 2 tracks
\r
897 vett1[14]=(Float_t)CosPointingAngle; //cosPointingAngle da V0
\r
898 vett1[15]=(Float_t)vertex.GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex);
\r
899 vett1[16]=(Float_t)HeTrack->GetSign(); //He
\r
900 vett1[17]=(Float_t)trackInHe.GetP();
\r
901 vett1[18]=(Float_t)HeTrack->GetTPCsignal();
\r
902 vett1[19]=(Float_t)DcaHeToPrimVertex;
\r
903 vett1[20]=(Float_t)HeTrack->Eta();
\r
904 vett1[21]=(Float_t)momHeVett[0];
\r
905 vett1[22]=(Float_t)momHeVett[1];
\r
906 vett1[23]=(Float_t)momHeVett[2];
\r
907 vett1[24]=(Float_t)momHeVettAt[0];
\r
908 vett1[25]=(Float_t)momHeVettAt[1];
\r
909 vett1[26]=(Float_t)momHeVettAt[2];
\r
910 vett1[27]=(Float_t)HeTrack->GetTPCNcls();
\r
911 vett1[28]=(Float_t)impactXY;
\r
912 vett1[29]=(Float_t)impactZ;
\r
913 vett1[30]=(Float_t)HeTrack->GetITSClusterMap();
\r
914 vett1[31]=(Float_t)IsHeITSRefit;
\r
915 vett1[32]=(Float_t)PionTrack->GetSign(); //Pion
\r
916 vett1[33]=(Float_t)trackInPion.GetP();
\r
917 vett1[34]=(Float_t)PionTrack->GetTPCsignal();
\r
918 vett1[35]=(Float_t)DcaPionToPrimVertex;
\r
919 vett1[36]=(Float_t)PionTrack->Eta();
\r
920 vett1[37]=(Float_t)momPionVett[0];
\r
921 vett1[38]=(Float_t)momPionVett[1];
\r
922 vett1[39]=(Float_t)momPionVett[2];
\r
923 vett1[40]=(Float_t)momPionVettAt[0];
\r
924 vett1[41]=(Float_t)momPionVettAt[1];
\r
925 vett1[42]=(Float_t)momPionVettAt[2];
\r
926 vett1[43]=(Float_t)PionTrack->GetTPCNcls();
\r
927 vett1[44]=(Float_t)impactXYpi;
\r
928 vett1[45]=(Float_t)impactZpi;
\r
929 vett1[46]=(Float_t)PionTrack->GetITSClusterMap();
\r
930 vett1[47]=(Float_t)IsPiITSRefit;
\r
931 vett1[48]=(Float_t)xn;
\r
932 vett1[49]=(Float_t)xp;
\r
934 fNtuple1->Fill(vett1);
\r
942 PostData(1,fListHistCascade);
\r
947 //________________________________________________________________________
\r
949 void AliAnalysisTaskHelium3Pi::Terminate(Option_t *)
\r
951 // Draw result to the screen
\r
952 // Called once at the end of the query
\r