10 #include "AliESDtrackCuts.h"
11 #include "AliESDpid.h"
12 #include "AliESDVertex.h"
15 #include "AliAnalysisTask.h"
16 #include "AliAnalysisManager.h"
17 #include "AliCentrality.h"
18 #include "AliESDEvent.h"
19 #include "AliESDInputHandler.h"
21 #include "AliMCEventHandler.h"
22 #include "AliMCEvent.h"
25 #include "AliAnalysisTaskAntiHe4.h"
30 ///////////////////////////////////////////////////////////
32 // Analysis for the observation of anti-alpha particles. //
34 ///////////////////////////////////////////////////////////
37 ClassImp(AliAnalysisTaskAntiHe4)
39 //________________________________________________________________________
40 AliAnalysisTaskAntiHe4::AliAnalysisTaskAntiHe4()
41 : AliAnalysisTaskSE(),
44 fHistCentralityClass10(0),
45 fHistCentralityPercentile(0),
47 fHistTriggerStatAfterEventSelection(0),
60 fBBParametersLightParticles(),
61 fBBParametersNuclei(),
65 fESDtrackCutsSharp(0),
69 fHistHelium4PtGenPrim(0),
70 fHistHelium4PtGenSec(0),
71 fHistHelium4PtGenEta(0),
72 fHistHelium4PtGenPrimEta(0),
73 fHistAntiHelium4PtGen(0),
74 fHistAntiHelium4PtGenPrim(0),
75 fHistAntiHelium4PtGenSec(0),
76 fHistAntiHelium4PtGenEta(0),
78 fHistHelium4PtAsoPrim(0),
79 fHistHelium4PtAsoSec(0),
80 fHistAntiHelium4PtAso(0),
86 // default Constructor
89 // Define input and output slots here
92 //________________________________________________________________________
93 AliAnalysisTaskAntiHe4::AliAnalysisTaskAntiHe4(const char *name)
94 : AliAnalysisTaskSE(name),
97 fHistCentralityClass10(0),
98 fHistCentralityPercentile(0),
100 fHistTriggerStatAfterEventSelection(0),
105 fGraphAlphaSignal(0),
113 fBBParametersLightParticles(),
114 fBBParametersNuclei(),
118 fESDtrackCutsSharp(0),
121 fHistHelium4PtGen(0),
122 fHistHelium4PtGenPrim(0),
123 fHistHelium4PtGenSec(0),
124 fHistHelium4PtGenEta(0),
125 fHistHelium4PtGenPrimEta(0),
126 fHistAntiHelium4PtGen(0),
127 fHistAntiHelium4PtGenPrim(0),
128 fHistAntiHelium4PtGenSec(0),
129 fHistAntiHelium4PtGenEta(0),
130 fHistHelium4PtAso(0),
131 fHistHelium4PtAsoPrim(0),
132 fHistHelium4PtAsoSec(0),
133 fHistAntiHelium4PtAso(0),
141 // Define input and output slots here
142 // Input slot #0 works with a TChain
143 DefineInput(0, TChain::Class());
144 // Output slot #0 writes into a TH1 container
145 DefineOutput(1, TObjArray::Class());
146 DefineOutput(2, TTree::Class());
148 // cuts for candidates
150 fESDtrackCuts = new AliESDtrackCuts("AliESDtrackCuts","AliESDtrackCuts");
152 fESDtrackCuts->SetAcceptKinkDaughters(kFALSE);
153 fESDtrackCuts->SetMinNClustersTPC(70);
154 fESDtrackCuts->SetMaxChi2PerClusterTPC(5);
155 fESDtrackCuts->SetMaxDCAToVertexXY(3);
156 fESDtrackCuts->SetMaxDCAToVertexZ(2);
157 fESDtrackCuts->SetRequireTPCRefit(kTRUE);
158 //fESDtrackCuts->SetRequireITSRefit(kTRUE);
159 fESDtrackCuts->SetMinNClustersITS(2);
160 fESDtrackCuts->SetEtaRange(-1.0,1.0);
162 // cuts for final plots
164 fESDtrackCutsSharp = new AliESDtrackCuts("AliESDtrackCuts","AliESDtrackCuts");
165 fESDtrackCutsSharp->SetAcceptKinkDaughters(kFALSE);
166 fESDtrackCutsSharp->SetMinNClustersTPC(80);
167 fESDtrackCutsSharp->SetMaxChi2PerClusterITS(10);// TO BE INVESTIGATED !!!!!!!!!!!!!!
168 fESDtrackCutsSharp->SetMaxChi2PerClusterTPC(5);
169 fESDtrackCutsSharp->SetRequireTPCRefit(kTRUE);
170 fESDtrackCutsSharp->SetRequireITSRefit(kTRUE);
171 fESDtrackCutsSharp->SetMinNClustersITS(2);
172 fESDtrackCutsSharp->SetMaxDCAToVertexXY(0.1);
173 fESDtrackCutsSharp->SetMaxDCAToVertexZ(0.5);
174 fESDtrackCutsSharp->SetEtaRange(-0.8,0.8);
176 //ESD Track cuts from TestFilterRawTask
177 /* fESDtrackCuts = new AliESDtrackCuts("AliESDtrackCuts","AliESDtrackCuts");
178 fESDtrackCuts->SetMinNClustersTPC(80);
179 fESDtrackCuts->SetMinNClustersITS(2);
180 fESDtrackCuts->SetAcceptKinkDaughters(kFALSE);
181 fESDtrackCuts->SetMaxChi2PerClusterTPC(5);
182 fESDtrackCuts->SetRequireTPCRefit(kTRUE);
183 fESDtrackCuts->SetRequireITSRefit(kTRUE);
184 fESDtrackCuts->SetEtaRange(-1,1);
185 fESDtrackCuts->SetMaxDCAToVertexXY(1);
186 fESDtrackCuts->SetMaxDCAToVertexZ(2);
187 //test strickter cuts
188 //fESDtrackCuts->SetMaxDCAToVertexXY(0.1);
189 //fESDtrackCuts->SetMaxDCAToVertexZ(0.5);
190 //fESDtrackCuts->SetEtaRange(-0.8,0.8);
197 //________________________________________________________________________
198 void AliAnalysisTaskAntiHe4::UserCreateOutputObjects()
203 //histogram to count number of events
205 fHistCentralityClass10 = new TH1F("fHistCentralityClass10", "centrality with class10", 11, -0.5, 10.5);
206 fHistCentralityClass10->GetXaxis()->SetTitle("Centrality");
207 fHistCentralityClass10->GetYaxis()->SetTitle("Entries");
209 fHistCentralityPercentile = new TH1F("fHistCentralityPercentile", "centrality with percentile", 101, -0.1, 100.1);
210 fHistCentralityPercentile->GetXaxis()->SetTitle("Centrality");
211 fHistCentralityPercentile->GetYaxis()->SetTitle("Entries");
213 //trigger statitics histogram
215 fHistTriggerStat = new TH1F("fHistTriggerStat","Trigger statistics", fNTriggers,-0.5,fNTriggers-0.5);
216 const Char_t* aTriggerNames[] = { "kMB", "kCentral", "kSemiCentral", "kEMCEJE", "kEMCEGA" };
217 for ( Int_t ii=0; ii < fNTriggers; ii++ )
218 fHistTriggerStat->GetXaxis()->SetBinLabel(ii+1, aTriggerNames[ii]);
220 fHistTriggerStatAfterEventSelection = new TH1F("fHistTriggerStatAfterEventSelection","Trigger statistics after event selection", fNTriggers,-0.5,fNTriggers-0.5);
221 for ( Int_t ii=0; ii < fNTriggers; ii++ )
222 fHistTriggerStatAfterEventSelection->GetXaxis()->SetBinLabel(ii+1, aTriggerNames[ii]);
225 fHistDEDx= new TH3F("fHistDEDx","DEDx",1000,0.01,100,1000,1,2000,2,-2,2);
226 BinLogAxis(fHistDEDx, 0);
227 BinLogAxis(fHistDEDx, 1);
228 fHistDEDx->GetXaxis()->SetTitle("p_{tot}/sign");
229 fHistDEDx->GetYaxis()->SetTitle("TPC signal");
231 fHistDeDx = new TH2F("fHistDeDx", "dE/dx", 1000, 0.1, 6.0, 1000, 0.0, 1000);
232 fHistDeDx->GetYaxis()->SetTitle("TPC dE/dx signal (a.u.)");
233 fHistDeDx->GetXaxis()->SetTitle("#frac{p}{z} (GeV/c)");
234 BinLogAxis(fHistDeDx);
236 fHistDeDxRegion = new TH3F("fHistDeDxRegion", "dE/dx", 400, 0., 6.0, 300, 0., 3., 4, -0.5, 3.5);
237 fHistDeDxRegion->GetYaxis()->SetTitle("TPC dE/dx signal (a.u.)");
238 fHistDeDxRegion->GetXaxis()->SetTitle("#frac{p}{z} (GeV/c)");
240 fHistDeDxSharp = new TH2F("fHistDeDxSharp", "dE/dx", 1000, 0.1, 6.0, 1000, 0.0, 1000);
241 fHistDeDxSharp->GetYaxis()->SetTitle("TPC dE/dx signal (a.u.)");
242 fHistDeDxSharp->GetXaxis()->SetTitle("#frac{p}{z} (GeV/c)");
243 BinLogAxis(fHistDeDxSharp);
246 fHistTOF3D = new TH3F("fHistTOF3D","mass determination from TOF",400,0.25,4.5,2,-0.5,1.5,2,-1,1);
248 fHistTOF2D = new TH2F("fHistTOF2D", "TOF2D", 500, 0.0, 10., 2250, 0.2, 1.1);
249 fHistTOF2D->GetYaxis()->SetTitle("#beta");
250 fHistTOF2D->GetXaxis()->SetTitle("p (GeV/c)");
252 fHistTOFnuclei = new TH2F("fHistTOFnuclei", "TOF", 500, 0.0, 10., 2250, 0.7, 1.);
253 fHistTOFnuclei->GetYaxis()->SetTitle("#beta");
254 fHistTOFnuclei->GetXaxis()->SetTitle("#frac{p}{z} (GeV/c)");
257 fHistAlpha = new TH1F("fHistAlpha", "Anti-Alpha", 22, 1.12, 4.31);
258 fHistAlpha->GetYaxis()->SetTitle("Counts");
259 fHistAlpha->GetXaxis()->SetTitle("#frac{m^{2}}{z^{2}} (GeV^{2}/c^{4})");
261 fHistAlphaSignal = new TH1F("fHistAlphaSignal", "Anti-Alpha", 22, 1.12, 4.31);
262 fHistAlphaSignal->GetYaxis()->SetTitle("Counts");
263 fHistAlphaSignal->GetXaxis()->SetTitle("#frac{m^{2}}{z^{2}} (GeV^{2}/c^{4})");
265 fGraphAlphaSignal = new TGraph(20);
268 // (0.) dca, (1.) sign, (2.) particle Type, (3.) p_tot
270 TString axisNameMult[4]={"dca","sign","particleType","ptot"};
271 TString axisTitleMult[4]={"dca","sign","particleType","ptot"};
272 const Int_t kDcaBins = 76;
273 Double_t binsDca[kDcaBins+1] = {-3,-2.85,-2.7,-2.55,-2.4,-2.25,-2.1,-1.95,-1.8,-1.65,-1.5,-1.35,-1.2,-1.05,-0.9,-0.75,-0.6,-0.45,-0.3,-0.285,-0.27,-0.255,-0.24,-0.225,-0.21,-0.195,-0.18,-0.165,-0.15,-0.135,-0.12,-0.105,-0.09,-0.075,-0.06,-0.045,-0.03,-0.015,0,0.015,0.03,0.045,0.06,0.075,0.09,0.105,0.12,0.135,0.15,0.165,0.18,0.195,0.21,0.225,0.24,0.255,0.27,0.285,0.3,0.45,0.6,0.75,0.9,1.05,1.2,1.35,1.5,1.65,1.8,1.95,2.1,2.25,2.4,2.55,2.7,2.85,3};
275 // (0.) dca, (1.) sign, (2.) particle Type, (3.) p_tot
276 Int_t binsAntiAlpha[4] = {77, 2, 4, 100};
277 Double_t xminAntiAlpha[4] = {-3, -2, -0.5, 0};
278 Double_t xmaxAntiAlpha[4] = { 3, 2, 3.5, 6};
280 fAntiAlpha = new THnF("fAntiAlpha", "AntiAlpha; (0.) dca, (1.) sign, (2.) particle Type, (3.) p_tot", 4, binsAntiAlpha, xminAntiAlpha, xmaxAntiAlpha);
282 fAntiAlpha->GetAxis(0)->Set(kDcaBins, binsDca);
283 for (Int_t iaxis=0; iaxis<4;iaxis++){
284 fAntiAlpha->GetAxis(iaxis)->SetName(axisNameMult[iaxis]);
285 fAntiAlpha->GetAxis(iaxis)->SetTitle(axisTitleMult[iaxis]);
289 //Create histograms for MC
290 //generated histogramms
291 fHistHelium4PtGen = new TH1F("fHistHelium4PtGen", "Generated ^{4}He", 200, 0.0, 10.0);
292 fHistHelium4PtGen->GetYaxis()->SetTitle("Counts");
293 fHistHelium4PtGen->GetXaxis()->SetTitle("p_{T} (GeV/c)");
295 fHistHelium4PtGenPrim = new TH1F("fHistHelium4PtGenPrim", "Primary generated ^{4}He", 200, 0.0, 10.0);
296 fHistHelium4PtGenPrim->GetYaxis()->SetTitle("Counts");
297 fHistHelium4PtGenPrim->GetXaxis()->SetTitle("p_{T} (GeV/c)");
299 fHistHelium4PtGenSec = new TH1F("fHistHelium4PtGenSec", "Secondary generated ^{4}He", 200, 0.0, 10.0);
300 fHistHelium4PtGenSec->GetYaxis()->SetTitle("Counts");
301 fHistHelium4PtGenSec->GetXaxis()->SetTitle("p_{T} (GeV/c)");
303 fHistHelium4PtGenEta = new TH1F("fHistHelium4PtGenEta", "Generated ^{4}He in #eta < 0.8", 200, 0.0, 10.0);
304 fHistHelium4PtGenEta->GetYaxis()->SetTitle("Counts");
305 fHistHelium4PtGenEta->GetXaxis()->SetTitle("p_{T} (GeV/c)");
307 fHistHelium4PtGenPrimEta = new TH1F("fHistHelium4PtGenPrimEta", "Primary generated ^{4}He in #eta < 0.8", 200, 0.0, 10.0);
308 fHistHelium4PtGenPrimEta->GetYaxis()->SetTitle("Counts");
309 fHistHelium4PtGenPrimEta->GetXaxis()->SetTitle("p_{T} (GeV/c)");
311 fHistAntiHelium4PtGen = new TH1F("fHistAntiHelium4PtGen", "Generated #bar{^{4}He}", 200, 0.0, 10.0);
312 fHistAntiHelium4PtGen->GetYaxis()->SetTitle("Counts");
313 fHistAntiHelium4PtGen->GetXaxis()->SetTitle("p_{T} (GeV/c)");
315 fHistAntiHelium4PtGenPrim = new TH1F("fHistAntiHelium4PtGenPrim", "Primary generated #bar{^{4}He}", 200, 0.0, 10.0);
316 fHistAntiHelium4PtGenPrim->GetYaxis()->SetTitle("Counts");
317 fHistAntiHelium4PtGenPrim->GetXaxis()->SetTitle("p_{T} (GeV/c)");
319 fHistAntiHelium4PtGenSec = new TH1F("fHistAntiHelium4PtGenSec", "Secondary generated #bar{^{4}He}", 200, 0.0, 10.0);
320 fHistAntiHelium4PtGenSec->GetYaxis()->SetTitle("Counts");
321 fHistAntiHelium4PtGenSec->GetXaxis()->SetTitle("p_{T} (GeV/c)");
323 fHistAntiHelium4PtGenEta = new TH1F("fHistAntiHelium4PtGenEta", "Generated #bar{^{4}He} in #eta < 0.8", 200, 0.0, 10.0);
324 fHistAntiHelium4PtGenEta->GetYaxis()->SetTitle("Counts");
325 fHistAntiHelium4PtGenEta->GetXaxis()->SetTitle("p_{T} (GeV/c)");
327 //associated histograms
328 fHistHelium4PtAso = new TH1F("fHistHelium4PtAso", "Associated ^{4}He", 200, 0.0, 10.0);
329 fHistHelium4PtAso->GetYaxis()->SetTitle("Counts");
330 fHistHelium4PtAso->GetXaxis()->SetTitle("p_{T} (GeV/c)");
332 fHistHelium4PtAsoPrim = new TH1F("fHistHelium4PtAsoPrim", "Associated prim ^{4}He", 200, 0.0, 10.0);
333 fHistHelium4PtAsoPrim->GetYaxis()->SetTitle("Counts");
334 fHistHelium4PtAsoPrim->GetXaxis()->SetTitle("p_{T} (GeV/c)");
336 fHistHelium4PtAsoSec = new TH1F("fHistHelium4PtAsoSec", "Associated sec ^{4}He", 200, 0.0, 10.0);
337 fHistHelium4PtAsoSec->GetYaxis()->SetTitle("Counts");
338 fHistHelium4PtAsoSec->GetXaxis()->SetTitle("p_{T} (GeV/c)");
340 fHistAntiHelium4PtAso = new TH1F("fHistAntiHelium4PtAso", "Associated #bar{^{4}He}", 200, 0.0, 10.0);
341 fHistAntiHelium4PtAso->GetYaxis()->SetTitle("Counts");
342 fHistAntiHelium4PtAso->GetXaxis()->SetTitle("p_{T} (GeV/c)");
346 fOutputContainer = new TObjArray(1);
347 fOutputContainer->SetOwner(kTRUE);
348 fOutputContainer->SetName(GetName());
349 fOutputContainer->Add(fHistCentralityClass10);
350 fOutputContainer->Add(fHistCentralityPercentile);
351 fOutputContainer->Add(fHistTriggerStat);
352 fOutputContainer->Add(fHistTriggerStatAfterEventSelection);
353 fOutputContainer->Add(fHistDEDx);
354 fOutputContainer->Add(fHistDeDx);
355 fOutputContainer->Add(fHistDeDxRegion);
356 fOutputContainer->Add(fHistDeDxSharp);
357 fOutputContainer->Add(fAntiAlpha);
358 fOutputContainer->Add(fHistAlpha);
359 fOutputContainer->Add(fHistAlphaSignal);
360 fOutputContainer->Add(fGraphAlphaSignal);
361 fOutputContainer->Add(fHistTOF3D);
362 fOutputContainer->Add(fHistTOF2D);
363 fOutputContainer->Add(fHistTOFnuclei);
364 fOutputContainer->Add(fHistHelium4PtGen);
365 fOutputContainer->Add(fHistHelium4PtGenPrim);
366 fOutputContainer->Add(fHistHelium4PtGenSec);
367 fOutputContainer->Add(fHistHelium4PtGenEta);
368 fOutputContainer->Add(fHistHelium4PtGenPrimEta);
369 fOutputContainer->Add(fHistAntiHelium4PtGen);
370 fOutputContainer->Add(fHistAntiHelium4PtGenPrim);
371 fOutputContainer->Add(fHistAntiHelium4PtGenSec);
372 fOutputContainer->Add(fHistAntiHelium4PtGenEta);
373 fOutputContainer->Add(fHistHelium4PtAso);
374 fOutputContainer->Add(fHistHelium4PtAsoPrim);
375 fOutputContainer->Add(fHistHelium4PtAsoSec);
376 fOutputContainer->Add(fHistAntiHelium4PtAso);
379 //------------ Tree and branch definitions ----------------//
380 fTree = new TTree("tree", "alpha tree");
381 //------------ Event variables ------------//
382 fTree->Branch("fName",fName,"fName/C");
383 fTree->Branch("fEvnt",&fEvnt, "fEvnt/I");
384 fTree->Branch("fFileName",fFileName,"fFileName/C");
385 fTree->Branch("fEventNumber",fEventNumber,"fEventNumber/I");
386 fTree->Branch("fItrk",&fItrk, "fItrk/I");
387 //-------------------------------------------//
388 //----------- Track variables --------------//
389 fTree->Branch("fEta",fEta,"fEta[fItrk]/D");
390 fTree->Branch("fKinkIndex",fKinkIndex,"fKinkIndex[fItrk]/I");
391 fTree->Branch("fCentrality",fCentrality,"fCentrality[fItrk]/F");
393 fTree->Branch("fTPCnCluster",fTPCnCluster,"fTPCnCluster[fItrk]/s");
394 fTree->Branch("fTPCNsignal",fTPCNsignal,"fTPCNsignal[fItrk]/s");
395 fTree->Branch("fChi2PerClusterTPC",fChi2PerClusterTPC,"fChi2PerClusterTPC[fItrk]/D");
396 fTree->Branch("fTPCRefit",fTPCRefit,"fTPCRefit[fItrk]/O");
397 fTree->Branch("fTPCsignal0",fTPCsignal0,"fTPCsignal0[fItrk]/D");
398 fTree->Branch("fTPCsignal1",fTPCsignal1,"fTPCsignal1[fItrk]/D");
399 fTree->Branch("fTPCsignal2",fTPCsignal2,"fTPCsignal2[fItrk]/D");
400 fTree->Branch("fTPCsignal3",fTPCsignal3,"fTPCsignal3[fItrk]/D");
401 fTree->Branch("fTPCSharedClusters",fTPCSharedClusters,"fTPCSharedClusters[fItrk]/I");
402 fTree->Branch("fTPCNclsIter1",fTPCNclsIter1,"fTPCNclsIter1[fItrk]/s");
404 fTree->Branch("fITSsignal",fITSsignal,"fITSsignal[fItrk]/D");
405 fTree->Branch("fITSnCluster",fITSnCluster,"fITSnCluster[fItrk]/I");
406 fTree->Branch("fChi2PerClusterITS",fChi2PerClusterITS,"fChi2PerClusterITS[fItrk]/D");
407 fTree->Branch("fITSRefit",fITSRefit,"fITSRefit[fItrk]/O");
409 fTree->Branch("fTOFtime",fTOFtime,"fTOFtime[fItrk]/O");
410 fTree->Branch("fTOFRefit",fTOFRefit,"fTOFRefit[fItrk]/O");
411 fTree->Branch("fTOFout",fTOFout,"fTOFout[fItrk]/O");
412 fTree->Branch("fTOFsignalDz",fTOFsignalDz,"fTOFsignalDz[fItrk]/D");
413 fTree->Branch("fTOFsignalDx",fTOFsignalDx,"fTOFsignalDx[fItrk]/D");
415 fTree->Branch("fTRDin",fTRDin,"fTRDin[fItrk]/O");
417 fTree->Branch("fDCAXY",fDCAXY,"fDCAXY[fItrk]/F");
418 fTree->Branch("fDCAZ",fDCAZ,"fDCAZ[fItrk]/F");
420 fTree->Branch("fTrkPtot",fTrkPtot,"fTrkPtot[fItrk]/D");
421 fTree->Branch("fTPCPtot",fTPCPtot,"fTPCPtot[fItrk]/D");
422 fTree->Branch("fTrackPt",fTrackPt,"fTrackPt[fItrk]/D");
423 fTree->Branch("fDeDx",fDeDx,"fDeDx[fItrk]/D");
424 fTree->Branch("fSign",fSign,"fSign[fItrk]/D");
425 fTree->Branch("fMass",fMass,"Mass[fItrk]/F");
427 fTree->Branch("fAssociated",fAssociated,"fAssociated[fItrk]/O");
431 //________________________________________________________________________
432 void AliAnalysisTaskAntiHe4::UserExec(Option_t *)
435 // Called for each event
437 //get Event-Handler for the trigger information
438 fEventHandler= dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
439 if (!fEventHandler) {
440 AliError("Could not get InputHandler");
446 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
448 //Printf("ERROR: Could not retrieve MC event handler");
452 AliMCEvent* mcEvent = 0x0;
453 AliStack* stack = 0x0;
454 if (eventHandler) mcEvent = eventHandler->MCEvent();
456 //Printf("ERROR: Could not retrieve MC event");
461 stack = mcEvent->Stack();
465 //look for the generated particles
468 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
470 //Printf("ERROR: fESD not available");
474 if (SetupEvent() < 0) {
475 PostData(1, fOutputContainer);
479 const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();
480 if(vertex->GetNContributors()<1) {
482 vertex = fESD->GetPrimaryVertexSPD();
483 if(vertex->GetNContributors()<1) {
484 PostData(1, fOutputContainer);
489 // check if event is selected by physics selection class
491 Bool_t isSelected = kFALSE;
492 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
493 if (!isSelected || TMath::Abs(vertex->GetZv()) > 10) {
494 PostData(1, fOutputContainer);
499 //centrality selection in PbPb
501 Int_t centralityClass10 = -1;
502 Float_t centralityPercentile = -1;
504 if (fESD->GetEventSpecie() == 4) { //species == 4 == PbPb
506 AliCentrality *esdCentrality = fESD->GetCentrality();
507 centralityClass10 = esdCentrality->GetCentralityClass10("V0M"); // centrality percentile determined with V0
508 centralityPercentile = esdCentrality->GetCentralityPercentile("V0M"); // centrality percentile determined with V0
510 if (centralityPercentile < 0. || centralityPercentile > 80. ) return; //select only events with centralities between 0 and 80 %
514 if (!fTriggerFired[0] && !fTriggerFired[1] && !fTriggerFired[2]) return; // select only events which pass kMB, kCentral, kSemiCentral
516 fHistCentralityClass10->Fill(centralityClass10);
517 fHistCentralityPercentile->Fill(centralityPercentile);
519 if(fTriggerFired[0] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(0);
520 if(fTriggerFired[1] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(1);
521 if(fTriggerFired[2] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(2);
522 if(fTriggerFired[3] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(3);
523 if(fTriggerFired[4] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(4);
526 if (!fESDpid) fESDpid = ((AliESDInputHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetESDpid();
528 fESDpid = new AliESDpid(); // HACK FOR MC PBPB --> PLEASE REMOVE AS SOON AS POSSIBLE
529 fESDpid->GetTPCResponse().SetBetheBlochParameters(1.28778e+00/50., 3.13539e+01, TMath::Exp(-3.16327e+01), 1.87901e+00, 6.41583e+00);
532 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z for th // for Anti-Alpha
533 fEvnt = fESD->GetEventNumberInFile();
534 sscanf(fInputHandler->GetTree()->GetCurrentFile()->GetName(),"%s", fName);
538 runNumber = fESD->GetRunNumber();
540 Bool_t fillTree = kFALSE;
541 // Track loop to fill the spectram
542 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
544 fEventNumber[fItrk] = -1;
547 fCentrality[fItrk] = -1;
548 fTPCNsignal[fItrk] = -1;
549 fTPCnCluster[fItrk] = -1;
550 fChi2PerClusterTPC[fItrk] = -1;
551 fTPCRefit[fItrk] = kFALSE;
552 fTPCsignal0[fItrk] = -1;
553 fTPCsignal1[fItrk] = -1;
554 fTPCsignal2[fItrk] = -1;
555 fTPCsignal3[fItrk] = -1;
556 fTPCSharedClusters[fItrk] = -1;
557 fTPCNclsIter1[fItrk] = -1;
559 fITSsignal[fItrk] = -1;
560 fITSnCluster[fItrk] = -1;
561 fChi2PerClusterITS[fItrk] = -1;
562 fITSRefit[fItrk] = kFALSE;
564 fTOFRefit[fItrk] = kFALSE;
565 fTOFtime[fItrk] = kFALSE;
566 fTOFout[fItrk] = kFALSE;
567 fTOFsignalDz[fItrk] = -1;
568 fTOFsignalDx[fItrk] = -1;
570 fTRDin[fItrk] = kFALSE;
575 fTrkPtot[fItrk] = -1;
576 fTPCPtot[fItrk] = -1;
577 fTrackPt[fItrk] = -1;
582 fAssociated[fItrk] = kFALSE;
584 AliESDtrack* track = dynamic_cast<AliESDtrack*>(fESD->GetTrack(iTracks));
585 if (!fESDtrackCuts->AcceptTrack(track)) continue;
587 Double_t nClustersTPCPID=track->GetTPCsignalN();
588 if(nClustersTPCPID < 60) continue;
590 if (!track->GetInnerParam()) continue;
592 Double32_t signal[4] = {0,0,0,0};
595 if (track->GetTPCdEdxInfo()) {
596 track->GetTPCdEdxInfo()->GetTPCSignalRegionInfo(signal,ncl,nrows);
599 Double_t ptot = track->GetInnerParam()->GetP();
600 Double_t ptotInc = track->GetP(); // total momentum of the incoming particle
601 Double_t sign = track->GetSign();
603 Double_t eta = TMath::Abs(track->Eta());
604 TBits shared = track->GetTPCSharedMap();
606 track->GetImpactParameters(dca, cov);
607 Float_t dcaXY = TMath::Sqrt(dca[0]*dca[0]);
608 Float_t dcaXYsign = dca[0];
609 Float_t dcaZ = TMath::Sqrt(dca[1]*dca[1]);
612 Double_t tpcSignal = track->GetTPCsignal();
614 //PID via specific energy loss in the TPC
615 //define the arrays for the Bethe-Bloch-Parameters
618 SetBBParameters(runNumber);
620 //define expected signals for the various species
621 Double_t expSignalProton = AliExternalTrackParam::BetheBlochAleph(ptot/0.93827,fBBParametersLightParticles[0],fBBParametersLightParticles[1],fBBParametersLightParticles[2],fBBParametersLightParticles[3],fBBParametersLightParticles[4]);
622 Double_t expSignalDeuteron = AliExternalTrackParam::BetheBlochAleph(ptot/1.875612,fBBParametersLightParticles[0],fBBParametersLightParticles[1],fBBParametersLightParticles[2],fBBParametersLightParticles[3],fBBParametersLightParticles[4]);
623 Double_t expSignalTriton = AliExternalTrackParam::BetheBlochAleph(ptot/2.808921,fBBParametersLightParticles[0],fBBParametersLightParticles[1],fBBParametersLightParticles[2],fBBParametersLightParticles[3],fBBParametersLightParticles[4]);
625 Double_t expSignalHelium3 = 4*AliExternalTrackParam::BetheBlochAleph(2*ptot/2.80941,fBBParametersNuclei[0],fBBParametersNuclei[1],fBBParametersNuclei[2],fBBParametersNuclei[3],fBBParametersNuclei[4]);
626 Double_t expSignalHelium4 = 4*AliExternalTrackParam::BetheBlochAleph(2*ptot/3.728401,fBBParametersNuclei[0],fBBParametersNuclei[1],fBBParametersNuclei[2],fBBParametersNuclei[3],fBBParametersNuclei[4]);
633 Bool_t hasTOFout = kFALSE;
634 Bool_t hasTOFtime = kFALSE;
635 Float_t length = track->GetIntegratedLength();
636 UInt_t status = track->GetStatus();
637 Bool_t isAssociated = kFALSE;
640 time = track->GetTOFsignal() - fESDpid->GetTOFResponse().GetStartTime(track->P());
642 beta = length / (2.99792457999999984e-02 * time);
643 gamma = 1/TMath::Sqrt(1 - beta*beta);
644 mass = ptot/TMath::Sqrt(gamma*gamma - 1); // using inner TPC mom. as approx.
648 // fill tree and print candidates (for short list)
650 Float_t cut = 4*AliExternalTrackParam::BetheBlochAleph(2*ptot/(0.938*3),1.1931,
655 if (fMCtrue) cut = 4*AliExternalTrackParam::BetheBlochAleph(2*ptot/(0.938*3),0.9931,
660 if (eta < 1.0 && tpcSignal > 120 && tpcSignal > cut && tpcSignal < 1000 && track->GetTPCsignalN() > 60 && dcaZ < 15 && dcaXY < 15 && ptot > 1.0 && ptot < 20) {
662 cout << "AntiAlphaEvent" << " "
663 << AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetCurrentFile()->GetName() << " "
664 << "event number in file: " << fESD->GetEventNumberInFile()
665 << " Index " << iTracks
667 << " sig: " << tpcSignal <<endl;
672 sscanf(fInputHandler->GetTree()->GetCurrentFile()->GetName(),"%s", fFileName);
673 fEventNumber[fItrk] = fESD->GetEventNumberInFile();
676 fKinkIndex[fItrk] = track->GetKinkIndex(0);
677 fCentrality[fItrk] = centralityPercentile;
679 fTPCNsignal[fItrk] = track->GetTPCsignalN();
680 fTPCnCluster[fItrk] = track->GetTPCNcls();
681 fChi2PerClusterTPC[fItrk] = track->GetTPCchi2()/fTPCnCluster[fItrk];
682 if(status&AliESDtrack::kTPCrefit)
683 fTPCRefit[fItrk] = kTRUE;
684 else fTPCRefit[fItrk] = kFALSE;
685 fTPCsignal0[fItrk] = signal[0];
686 fTPCsignal1[fItrk] = signal[1];
687 fTPCsignal2[fItrk] = signal[2];
688 fTPCsignal3[fItrk] = signal[3];
689 fTPCSharedClusters[fItrk] = shared.CountBits();
690 fTPCNclsIter1[fItrk] = track->GetTPCNclsIter1();
692 fITSsignal[fItrk] = track->GetITSsignal();
693 fITSnCluster[fItrk] = track->GetNcls(0);
694 fChi2PerClusterITS[fItrk] = track->GetITSchi2()/fITSnCluster[fItrk];
695 if(status&AliESDtrack::kITSrefit)
696 fITSRefit[fItrk] = kTRUE;
697 else fITSRefit[fItrk] = kFALSE;
700 if(status&AliESDtrack::kITSrefit)
701 fITSRefit[fItrk] = kTRUE;
702 else fITSRefit[fItrk] = kFALSE;
703 hasTOFout = status&AliESDtrack::kTOFout;
704 hasTOFtime = status&AliESDtrack::kTIME;
705 fTOFtime[fItrk] = hasTOFtime;
706 fTOFout[fItrk] = hasTOFout;
707 fTOFsignalDz[fItrk] = track->GetTOFsignalDz();
708 fTOFsignalDx[fItrk] = track->GetTOFsignalDx();
710 fTRDin[fItrk] = status&AliESDtrack::kTRDin;
712 fDCAZ[fItrk] = dcaXY;
713 fDCAXY[fItrk] = dcaZ;
715 fTrkPtot[fItrk] = track->P();
716 fTPCPtot[fItrk] = ptot;
717 fTrackPt[fItrk] = track->Pt();
718 fDeDx[fItrk] = tpcSignal;
722 if (fMCtrue){ //associated
724 Int_t label = track->GetLabel();
725 TParticle *tparticle = stack->Particle(TMath::Abs(label));
727 Bool_t isPrimary = stack->IsPhysicalPrimary(TMath::Abs(label));
728 Bool_t isSecondary = stack->IsSecondaryFromMaterial(TMath::Abs(label));
730 Long_t pdgCode = tparticle->GetPdgCode();
731 Double_t pT =(track->Pt())*2;
733 if(pdgCode == 1000020040)
735 fHistHelium4PtAso->Fill(pT);
736 if(isPrimary) fHistHelium4PtAsoPrim->Fill(pT);
737 if(isSecondary) fHistHelium4PtAsoSec->Fill(pT);
738 isAssociated = kTRUE;
741 if(pdgCode == -1000020040)
743 fHistAntiHelium4PtAso->Fill(pT);
744 isAssociated = kTRUE;
749 fAssociated[fItrk] = isAssociated;
754 // do pid fill histogram for raw ratios
756 // (0.) dca, (1.) sign, (2.) particle Type, (3.) p_tot
758 if (ptot > 0.2 && TMath::Abs(tpcSignal - expSignalProton)/expSignalProton < 0.2) id = 0;
759 if (ptot > 0.3 && TMath::Abs(tpcSignal - expSignalDeuteron)/expSignalDeuteron < 0.2) id = 1;
760 if (ptot > 0.7 && TMath::Abs(tpcSignal - expSignalTriton)/expSignalTriton < 0.2) id = 2;
761 if (ptot > 0.5 && (tpcSignal - expSignalHelium3)/expSignalHelium3 > -0.1 && (tpcSignal - expSignalHelium3)/expSignalHelium3 < 0.2) id = 3;
763 Double_t vecAntiAlpha[4] = {dcaXYsign, sign, static_cast<Double_t>(id), ptotInc};
764 if (id != -1 && tpcSignal > 120) fAntiAlpha->Fill(vecAntiAlpha);
766 // fill final histograms
768 if (!fESDtrackCutsSharp->AcceptTrack(track) || shared.CountBits() > 1 || track->GetTPCsignalN() < 80 || track->GetKinkIndex(0) != 0 || track->GetTPCNclsIter1() < 80) continue;
770 fHistDEDx->Fill(ptot,track->GetTPCsignal(), sign);
771 if (TMath::Abs(tpcSignal - expSignalHelium4)/expSignalHelium4 < 0.2 && time < 99998) fHistTOF3D->Fill(mass,1,sign);
773 // remove overlapping tracks with special dE/dx cut
775 //if (signal[1] < 6) continue;
776 //if (signal[0]/signal[1] > 1.6 || signal[2]/signal[1] > 1.6 || signal[3]/signal[1] > 1.3) continue;
779 fHistDeDx->Fill(ptot, track->GetTPCsignal());
780 if (track->GetTPCsignalN() > 100 &&
781 TMath::Abs(track->Eta()) < 1.0 &&
782 signal[3]/signal[1] > 0.6 &&
783 signal[0]/signal[1] > 0.5 &&
784 signal[3]/signal[1] < 1.2 &&
785 track->GetTPCNclsIter1() > 70 &&
786 track->GetTPCnclsS() < 10) {
787 fHistDeDxSharp->Fill(ptot, track->GetTPCsignal());
791 // dE/dx for specific regions
793 for(Int_t iSig = 0; iSig < 4; iSig++) {
794 if (signal[1] > 6) fHistDeDxRegion->Fill(ptot,signal[iSig]/signal[1],iSig);
799 if((track->GetTPCsignal()-expSignalHelium4)/expSignalHelium4 > -0.15 && (track->GetTPCsignal()-expSignalHelium4)/expSignalHelium4 < 0.15) {
801 hasTOFout = status&AliESDtrack::kTOFout;
802 hasTOFtime = status&AliESDtrack::kTIME;
803 Bool_t hasTOF = kFALSE;
805 if (hasTOFout && hasTOFtime) hasTOF = kTRUE;
807 if (length < 350.) hasTOF = kFALSE;
809 Float_t time0 = fESDpid->GetTOFResponse().GetStartTime(track->P());//fESDpid->GetTOFResponse().GetTimeZero();
811 if (length > 350. && hasTOF == kTRUE && ptot < 4) {
812 time = track->GetTOFsignal() - time0;
814 beta = length / (2.99792457999999984e-02 * time);
816 gamma = 1/TMath::Sqrt(1 - beta*beta);
817 mass = ptot/TMath::Sqrt(gamma*gamma - 1); // using inner TPC mom. as approx.
818 if (TMath::Sqrt(track->GetTOFsignalDz()*track->GetTOFsignalDz() + track->GetTOFsignalDx()*track->GetTOFsignalDx()) < 5.) {
819 fHistAlpha->Fill(mass*mass);
820 if (mass*mass > 3. && mass*mass < 4.) {
821 fHistAlphaSignal->Fill(mass*mass);
822 fGraphAlphaSignal->SetPoint(fNCounter, ptot, track->GetTPCsignal());
825 fHistTOFnuclei->Fill(ptot,beta);
832 }//end loop over tracks
834 if (fillTree) fTree->Fill();
837 PostData(1, fOutputContainer);
841 //________________________________________________________________________
842 void AliAnalysisTaskAntiHe4::Terminate(const Option_t *)
844 // Draw result to the screen
845 // Called once at the end of the query
847 //get output data and darw 'fHistPt'
848 if (!GetOutputData(0)) return;
853 //________________________________________________________________________
854 void AliAnalysisTaskAntiHe4::BinLogAxis(const THn *h, Int_t axisNumber) {
856 // Method for the correct logarithmic binning of histograms
858 TAxis *axis = h->GetAxis(axisNumber);
859 int bins = axis->GetNbins();
861 Double_t from = axis->GetXmin();
862 Double_t to = axis->GetXmax();
863 Double_t *newBins = new Double_t[bins + 1];
866 Double_t factor = pow(to/from, 1./bins);
868 for (int i = 1; i <= bins; i++) {
869 newBins[i] = factor * newBins[i-1];
871 axis->Set(bins, newBins);
876 //________________________________________________________________________
877 void AliAnalysisTaskAntiHe4::BinLogAxis(const TH3 *h, Int_t axisNumber) {
879 // Method for the correct logarithmic binning of histograms
881 TAxis *axis = h->GetXaxis();
882 if (axisNumber == 1) axis = h->GetYaxis();
883 if (axisNumber == 2) axis = h->GetZaxis();
884 int bins = axis->GetNbins();
886 Double_t from = axis->GetXmin();
887 Double_t to = axis->GetXmax();
888 Double_t *newBins = new Double_t[bins + 1];
891 Double_t factor = pow(to/from, 1./bins);
893 for (int i = 1; i <= bins; i++) {
894 newBins[i] = factor * newBins[i-1];
896 axis->Set(bins, newBins);
900 //________________________________________________________________________
901 void AliAnalysisTaskAntiHe4::BinLogAxis(const TH1 *h) {
903 // Method for the correct logarithmic binning of histograms
905 TAxis *axis = h->GetXaxis();
906 int bins = axis->GetNbins();
908 Double_t from = axis->GetXmin();
909 Double_t to = axis->GetXmax();
910 Double_t *newBins = new Double_t[bins + 1];
913 Double_t factor = pow(to/from, 1./bins);
915 for (int i = 1; i <= bins; i++) {
916 newBins[i] = factor * newBins[i-1];
918 axis->Set(bins, newBins);
922 //_____________________________________________________________________________
923 Int_t AliAnalysisTaskAntiHe4::Initialize() {
932 //________________________________________________________________________
933 Int_t AliAnalysisTaskAntiHe4::SetupEvent() {
934 // Setup Reading of event
937 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
939 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
941 //Bool_t isTriggered = IsTriggered();
945 //_____________________________________________________________________________
946 void AliAnalysisTaskAntiHe4::ResetEvent() {
949 for (Int_t ii = 0; ii < fNTriggers; ++ii)
950 fTriggerFired[ii] = kFALSE;
954 //________________________________________________________________________
955 Bool_t AliAnalysisTaskAntiHe4::IsTriggered() {
956 // Check if Event is triggered and fill Trigger Histogram
958 if ((fEventHandler->IsEventSelected() & AliVEvent::kMB)) fTriggerFired[0] = kTRUE;
959 if ((fEventHandler->IsEventSelected() & AliVEvent::kCentral)) fTriggerFired[1] = kTRUE;
960 if ((fEventHandler->IsEventSelected() & AliVEvent::kSemiCentral)) fTriggerFired[2] = kTRUE;
961 if ((fEventHandler->IsEventSelected() & AliVEvent::kEMCEJE)) fTriggerFired[3] = kTRUE;
962 if ((fEventHandler->IsEventSelected() & AliVEvent::kEMCEGA)) fTriggerFired[4] = kTRUE;
964 Bool_t isTriggered = kFALSE;
966 for (Int_t ii=0; ii<fNTriggers; ++ii) {
967 if(fTriggerFired[ii]) {
969 fHistTriggerStat->Fill(ii);
975 //________________________________________________________________________
976 void AliAnalysisTaskAntiHe4::SetBBParameters(Int_t runNumber){
978 if(runNumber < 166500){ //LHC10h
980 fBBParametersLightParticles[0] = 1.45802;
981 fBBParametersLightParticles[1] = 27.4992;
982 fBBParametersLightParticles[2] = 4.00313e-15;
983 fBBParametersLightParticles[3] = 2.48485;
984 fBBParametersLightParticles[4] = 8.31768;
986 fBBParametersNuclei[0] = 1.69155;
987 fBBParametersNuclei[1] = 27.4992;
988 fBBParametersNuclei[2] = 4.00313e-15;
989 fBBParametersNuclei[3] = 2.48485;
990 fBBParametersNuclei[4] = 8.31768;
994 if(runNumber > 166500){ //LHC11h
996 fBBParametersLightParticles[0] = 4.69637;//1.11243;
997 fBBParametersLightParticles[1] = 7.51827;//26.1144;
998 fBBParametersLightParticles[2] = 0.0183746;//4.00313e-15;
999 fBBParametersLightParticles[3] = 2.60;//2.72969;
1000 fBBParametersLightParticles[4] = 2.7;//9.15038;
1002 fBBParametersNuclei[0] = 1.4906;
1003 fBBParametersNuclei[1] = 27.9758;
1004 fBBParametersNuclei[2] = 4.00313e-15;
1005 fBBParametersNuclei[3] = 2.50804;
1006 fBBParametersNuclei[4] = 8.31768;
1010 //______________________________________________________________________________
1011 void AliAnalysisTaskAntiHe4::MCGenerated(AliStack* stack)
1014 // Monte Carlo for genenerated particles
1015 if (fMCtrue) //MC loop
1020 for(stackN = 0; stackN < stack->GetNtrack(); stackN++) //loop over stack
1023 Bool_t isPrimary = stack->IsPhysicalPrimary(stackN);
1024 Bool_t isSecondary = stack->IsSecondaryFromMaterial(stackN);
1026 const TParticle *tparticle = stack->Particle(stackN);
1027 Long_t pdgCode = tparticle->GetPdgCode();
1029 Double_t pTGen = tparticle->Pt();
1030 Double_t eta = tparticle->Eta();
1031 //check which particle it is
1034 if(pdgCode == 1000020040)
1036 fHistHelium4PtGen->Fill(pTGen);
1037 if(isPrimary) fHistHelium4PtGenPrim->Fill(pTGen);
1038 if(isSecondary) fHistHelium4PtGenSec->Fill(pTGen);
1039 if(TMath::Abs(eta) < 1.0)fHistHelium4PtGenEta->Fill(pTGen);
1040 if(isPrimary && TMath::Abs(eta) < 1.0)fHistHelium4PtGenPrimEta->Fill(pTGen);
1044 if(pdgCode == -1000020040)
1046 fHistAntiHelium4PtGen->Fill(pTGen);
1047 if(isPrimary) fHistAntiHelium4PtGenPrim->Fill(pTGen);
1048 if(isSecondary) fHistAntiHelium4PtGenSec->Fill(pTGen);
1049 if(TMath::Abs(eta) < 1.0)fHistAntiHelium4PtGenEta->Fill(pTGen);
1053 }//end loop over stack