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");
392 fTree->Branch("fTPCnCluster",fTPCnCluster,"fTPCnCluster[fItrk]/s");
393 fTree->Branch("fTPCNsignal",fTPCNsignal,"fTPCNsignal[fItrk]/s");
394 fTree->Branch("fChi2PerClusterTPC",fChi2PerClusterTPC,"fChi2PerClusterTPC[fItrk]/D");
395 fTree->Branch("fTPCRefit",fTPCRefit,"fTPCRefit[fItrk]/O");
396 fTree->Branch("fTPCsignal0",fTPCsignal0,"fTPCsignal0[fItrk]/D");
397 fTree->Branch("fTPCsignal1",fTPCsignal1,"fTPCsignal1[fItrk]/D");
398 fTree->Branch("fTPCsignal2",fTPCsignal2,"fTPCsignal2[fItrk]/D");
399 fTree->Branch("fTPCsignal3",fTPCsignal3,"fTPCsignal3[fItrk]/D");
400 fTree->Branch("fTPCSharedClusters",fTPCSharedClusters,"fTPCSharedClusters[fItrk]/I");
401 fTree->Branch("fTPCNclsIter1",fTPCNclsIter1,"fTPCNclsIter1[fItrk]/s");
403 fTree->Branch("fITSsignal",fITSsignal,"fITSsignal[fItrk]/D");
404 fTree->Branch("fITSnCluster",fITSnCluster,"fITSnCluster[fItrk]/I");
405 fTree->Branch("fChi2PerClusterITS",fChi2PerClusterITS,"fChi2PerClusterITS[fItrk]/D");
406 fTree->Branch("fITSRefit",fITSRefit,"fITSRefit[fItrk]/O");
408 fTree->Branch("fTOFtime",fTOFtime,"fTOFtime[fItrk]/O");
409 fTree->Branch("fTOFRefit",fTOFRefit,"fTOFRefit[fItrk]/O");
410 fTree->Branch("fTOFout",fTOFout,"fTOFout[fItrk]/O");
411 fTree->Branch("fTOFsignalDz",fTOFsignalDz,"fTOFsignalDz[fItrk]/D");
412 fTree->Branch("fTOFsignalDx",fTOFsignalDx,"fTOFsignalDx[fItrk]/D");
414 fTree->Branch("fDCAXY",fDCAXY,"fDCAXY[fItrk]/F");
415 fTree->Branch("fDCAZ",fDCAZ,"fDCAZ[fItrk]/F");
417 fTree->Branch("fTrkPtot",fTrkPtot,"fTrkPtot[fItrk]/D");
418 fTree->Branch("fTPCPtot",fTPCPtot,"fTPCPtot[fItrk]/D");
419 fTree->Branch("fTrackPt",fTrackPt,"fTrackPt[fItrk]/D");
420 fTree->Branch("fDeDx",fDeDx,"fDeDx[fItrk]/D");
421 fTree->Branch("fSign",fSign,"fSign[fItrk]/D");
422 fTree->Branch("fMass",fMass,"Mass[fItrk]/F");
424 fTree->Branch("fAssociated",fAssociated,"fAssociated[fItrk]/O");
428 //________________________________________________________________________
429 void AliAnalysisTaskAntiHe4::UserExec(Option_t *)
432 // Called for each event
434 //get Event-Handler for the trigger information
435 fEventHandler= dynamic_cast<AliInputEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
436 if (!fEventHandler) {
437 AliError("Could not get InputHandler");
443 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
445 //Printf("ERROR: Could not retrieve MC event handler");
449 AliMCEvent* mcEvent = 0x0;
450 AliStack* stack = 0x0;
451 if (eventHandler) mcEvent = eventHandler->MCEvent();
453 //Printf("ERROR: Could not retrieve MC event");
458 stack = mcEvent->Stack();
462 //look for the generated particles
465 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
467 //Printf("ERROR: fESD not available");
471 if (SetupEvent() < 0) {
472 PostData(1, fOutputContainer);
476 const AliESDVertex *vertex = fESD->GetPrimaryVertexTracks();
477 if(vertex->GetNContributors()<1) {
479 vertex = fESD->GetPrimaryVertexSPD();
480 if(vertex->GetNContributors()<1) {
481 PostData(1, fOutputContainer);
486 // check if event is selected by physics selection class
488 Bool_t isSelected = kFALSE;
489 isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
490 if (!isSelected || TMath::Abs(vertex->GetZv()) > 10) {
491 PostData(1, fOutputContainer);
496 //centrality selection in PbPb
498 Int_t centralityClass10 = -1;
499 Int_t centralityPercentile = -1;
501 if (fESD->GetEventSpecie() == 4) { //species == 4 == PbPb
503 AliCentrality *esdCentrality = fESD->GetCentrality();
504 centralityClass10 = esdCentrality->GetCentralityClass10("V0M"); // centrality percentile determined with V0
505 centralityPercentile = esdCentrality->GetCentralityPercentile("V0M"); // centrality percentile determined with V0
507 if (centralityPercentile < 0. || centralityPercentile > 80. ) return; //select only events with centralities between 0 and 80 %
511 fHistCentralityClass10->Fill(centralityClass10);
512 fHistCentralityPercentile->Fill(centralityPercentile);
514 if(fTriggerFired[0] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(0);
515 if(fTriggerFired[1] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(1);
516 if(fTriggerFired[2] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(2);
517 if(fTriggerFired[3] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(3);
518 if(fTriggerFired[4] == kTRUE) fHistTriggerStatAfterEventSelection->Fill(4);
521 if (!fESDpid) fESDpid = ((AliESDInputHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->GetESDpid();
523 fESDpid = new AliESDpid(); // HACK FOR MC PBPB --> PLEASE REMOVE AS SOON AS POSSIBLE
524 fESDpid->GetTPCResponse().SetBetheBlochParameters(1.28778e+00/50., 3.13539e+01, TMath::Exp(-3.16327e+01), 1.87901e+00, 6.41583e+00);
527 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z for th // for Anti-Alpha
528 fEvnt = fESD->GetEventNumberInFile();
529 sscanf(fInputHandler->GetTree()->GetCurrentFile()->GetName(),"%s", fName);
533 runNumber = fESD->GetRunNumber();
535 Bool_t fillTree = kFALSE;
536 // Track loop to fill the spectram
537 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
539 fEventNumber[fItrk] = -1;
542 fTPCNsignal[fItrk] = -1;
543 fTPCnCluster[fItrk] = -1;
544 fChi2PerClusterTPC[fItrk] = -1;
545 fTPCRefit[fItrk] = kFALSE;
546 fTPCsignal0[fItrk] = -1;
547 fTPCsignal1[fItrk] = -1;
548 fTPCsignal2[fItrk] = -1;
549 fTPCsignal3[fItrk] = -1;
550 fTPCSharedClusters[fItrk] = -1;
551 fTPCNclsIter1[fItrk] = -1;
553 fITSsignal[fItrk] = -1;
554 fITSnCluster[fItrk] = -1;
555 fChi2PerClusterITS[fItrk] = -1;
556 fITSRefit[fItrk] = kFALSE;
558 fTOFRefit[fItrk] = kFALSE;
559 fTOFtime[fItrk] = kFALSE;
560 fTOFout[fItrk] = kFALSE;
561 fTOFsignalDz[fItrk] = -1;
562 fTOFsignalDx[fItrk] = -1;
567 fTrkPtot[fItrk] = -1;
568 fTPCPtot[fItrk] = -1;
569 fTrackPt[fItrk] = -1;
574 fAssociated[fItrk] = kFALSE;
576 AliESDtrack* track = dynamic_cast<AliESDtrack*>(fESD->GetTrack(iTracks));
577 if (!fESDtrackCuts->AcceptTrack(track)) continue;
579 Double_t nClustersTPCPID=track->GetTPCsignalN();
580 if(nClustersTPCPID < 60) continue;
582 if (!track->GetInnerParam()) continue;
584 Double32_t signal[4] = {0,0,0,0};
587 if (track->GetTPCdEdxInfo()) {
588 track->GetTPCdEdxInfo()->GetTPCSignalRegionInfo(signal,ncl,nrows);
591 Double_t ptot = track->GetInnerParam()->GetP();
592 Double_t ptotInc = track->GetP(); // total momentum of the incoming particle
593 Double_t sign = track->GetSign();
595 Double_t eta = TMath::Abs(track->Eta());
596 TBits shared = track->GetTPCSharedMap();
598 track->GetImpactParameters(dca, cov);
599 Float_t dcaXY = TMath::Sqrt(dca[0]*dca[0]);
600 Float_t dcaXYsign = dca[0];
601 Float_t dcaZ = TMath::Sqrt(dca[1]*dca[1]);
604 Double_t tpcSignal = track->GetTPCsignal();
606 //PID via specific energy loss in the TPC
607 //define the arrays for the Bethe-Bloch-Parameters
610 SetBBParameters(runNumber);
612 //define expected signals for the various species
613 Double_t expSignalProton = AliExternalTrackParam::BetheBlochAleph(ptot/0.93827,fBBParametersLightParticles[0],fBBParametersLightParticles[1],fBBParametersLightParticles[2],fBBParametersLightParticles[3],fBBParametersLightParticles[4]);
614 Double_t expSignalDeuteron = AliExternalTrackParam::BetheBlochAleph(ptot/1.875612,fBBParametersLightParticles[0],fBBParametersLightParticles[1],fBBParametersLightParticles[2],fBBParametersLightParticles[3],fBBParametersLightParticles[4]);
615 Double_t expSignalTriton = AliExternalTrackParam::BetheBlochAleph(ptot/2.808921,fBBParametersLightParticles[0],fBBParametersLightParticles[1],fBBParametersLightParticles[2],fBBParametersLightParticles[3],fBBParametersLightParticles[4]);
617 Double_t expSignalHelium3 = 4*AliExternalTrackParam::BetheBlochAleph(2*ptot/2.80941,fBBParametersNuclei[0],fBBParametersNuclei[1],fBBParametersNuclei[2],fBBParametersNuclei[3],fBBParametersNuclei[4]);
618 Double_t expSignalHelium4 = 4*AliExternalTrackParam::BetheBlochAleph(2*ptot/3.728401,fBBParametersNuclei[0],fBBParametersNuclei[1],fBBParametersNuclei[2],fBBParametersNuclei[3],fBBParametersNuclei[4]);
625 Bool_t hasTOFout = kFALSE;
626 Bool_t hasTOFtime = kFALSE;
627 Float_t length = track->GetIntegratedLength();
628 UInt_t status = track->GetStatus();
629 Bool_t isAssociated = kFALSE;
632 time = track->GetTOFsignal() - fESDpid->GetTOFResponse().GetStartTime(track->P());
634 beta = length / (2.99792457999999984e-02 * time);
635 gamma = 1/TMath::Sqrt(1 - beta*beta);
636 mass = ptot/TMath::Sqrt(gamma*gamma - 1); // using inner TPC mom. as approx.
640 // fill tree and print candidates (for short list)
642 Float_t cut = 4*AliExternalTrackParam::BetheBlochAleph(2*ptot/(0.938*3),1.1931,
647 if (fMCtrue) cut = 4*AliExternalTrackParam::BetheBlochAleph(2*ptot/(0.938*3),0.9931,
652 if (eta < 1.0 && tpcSignal > 120 && tpcSignal > cut && tpcSignal < 1000 && track->GetTPCsignalN() > 60 && dcaZ < 15 && dcaXY < 15 && ptot > 1.0 && ptot < 20) {
654 cout << "AntiAlphaEvent" << " "
655 << AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->GetTree()->GetCurrentFile()->GetName() << " "
656 << "event number in file: " << fESD->GetEventNumberInFile()
657 << " Index " << iTracks
659 << " sig: " << tpcSignal <<endl;
664 sscanf(fInputHandler->GetTree()->GetCurrentFile()->GetName(),"%s", fFileName);
665 fEventNumber[fItrk] = fESD->GetEventNumberInFile();
668 fKinkIndex[fItrk] = track->GetKinkIndex(0);
670 fTPCNsignal[fItrk] = track->GetTPCsignalN();
671 fTPCnCluster[fItrk] = track->GetTPCNcls();
672 fChi2PerClusterTPC[fItrk] = track->GetTPCchi2()/fTPCnCluster[fItrk];
673 if(status&AliESDtrack::kTPCrefit)
674 fTPCRefit[fItrk] = kTRUE;
675 else fTPCRefit[fItrk] = kFALSE;
676 fTPCsignal0[fItrk] = signal[0];
677 fTPCsignal1[fItrk] = signal[1];
678 fTPCsignal2[fItrk] = signal[2];
679 fTPCsignal3[fItrk] = signal[3];
680 fTPCSharedClusters[fItrk] = shared.CountBits();
681 fTPCNclsIter1[fItrk] = track->GetTPCNclsIter1();
683 fITSsignal[fItrk] = track->GetITSsignal();
684 fITSnCluster[fItrk] = track->GetNcls(0);
685 fChi2PerClusterITS[fItrk] = track->GetITSchi2()/fITSnCluster[fItrk];
686 if(status&AliESDtrack::kITSrefit)
687 fITSRefit[fItrk] = kTRUE;
688 else fITSRefit[fItrk] = kFALSE;
691 if(status&AliESDtrack::kITSrefit)
692 fITSRefit[fItrk] = kTRUE;
693 else fITSRefit[fItrk] = kFALSE;
694 hasTOFout = status&AliESDtrack::kTOFout;
695 hasTOFtime = status&AliESDtrack::kTIME;
696 fTOFtime[fItrk] = hasTOFtime;
697 fTOFout[fItrk] = hasTOFout;
698 fTOFsignalDz[fItrk] = track->GetTOFsignalDz();
699 fTOFsignalDx[fItrk] = track->GetTOFsignalDx();
701 fDCAZ[fItrk] = dcaXY;
702 fDCAXY[fItrk] = dcaZ;
704 fTrkPtot[fItrk] = track->P();
705 fTPCPtot[fItrk] = ptot;
706 fTrackPt[fItrk] = track->Pt();
707 fDeDx[fItrk] = tpcSignal;
711 if (fMCtrue){ //associated
713 Int_t label = track->GetLabel();
714 TParticle *tparticle = stack->Particle(TMath::Abs(label));
716 Bool_t isPrimary = stack->IsPhysicalPrimary(TMath::Abs(label));
717 Bool_t isSecondary = stack->IsSecondaryFromMaterial(TMath::Abs(label));
719 Long_t pdgCode = tparticle->GetPdgCode();
720 Double_t pT =(track->Pt())*2;
722 if(pdgCode == 1000020040)
724 fHistHelium4PtAso->Fill(pT);
725 if(isPrimary) fHistHelium4PtAsoPrim->Fill(pT);
726 if(isSecondary) fHistHelium4PtAsoSec->Fill(pT);
727 isAssociated = kTRUE;
730 if(pdgCode == -1000020040)
732 fHistAntiHelium4PtAso->Fill(pT);
733 isAssociated = kTRUE;
738 fAssociated[fItrk] = isAssociated;
743 // do pid fill histogram for raw ratios
745 // (0.) dca, (1.) sign, (2.) particle Type, (3.) p_tot
747 if (ptot > 0.2 && TMath::Abs(tpcSignal - expSignalProton)/expSignalProton < 0.2) id = 0;
748 if (ptot > 0.3 && TMath::Abs(tpcSignal - expSignalDeuteron)/expSignalDeuteron < 0.2) id = 1;
749 if (ptot > 0.7 && TMath::Abs(tpcSignal - expSignalTriton)/expSignalTriton < 0.2) id = 2;
750 if (ptot > 0.5 && (tpcSignal - expSignalHelium3)/expSignalHelium3 > -0.1 && (tpcSignal - expSignalHelium3)/expSignalHelium3 < 0.2) id = 3;
752 Double_t vecAntiAlpha[4] = {dcaXYsign, sign, id, ptotInc};
753 if (id != -1 && tpcSignal > 120) fAntiAlpha->Fill(vecAntiAlpha);
755 // fill final histograms
757 if (!fESDtrackCutsSharp->AcceptTrack(track) || shared.CountBits() > 1 || track->GetTPCsignalN() < 80 || track->GetKinkIndex(0) != 0 || track->GetTPCNclsIter1() < 80) continue;
759 fHistDEDx->Fill(ptot,track->GetTPCsignal(), sign);
760 if (TMath::Abs(tpcSignal - expSignalHelium4)/expSignalHelium4 < 0.2 && time < 99998) fHistTOF3D->Fill(mass,1,sign);
762 // remove overlapping tracks with special dE/dx cut
764 //if (signal[1] < 6) continue;
765 //if (signal[0]/signal[1] > 1.6 || signal[2]/signal[1] > 1.6 || signal[3]/signal[1] > 1.3) continue;
768 fHistDeDx->Fill(ptot, track->GetTPCsignal());
769 if (track->GetTPCsignalN() > 100 &&
770 TMath::Abs(track->Eta()) < 1.0 &&
771 signal[3]/signal[1] > 0.6 &&
772 signal[0]/signal[1] > 0.5 &&
773 signal[3]/signal[1] < 1.2 &&
774 track->GetTPCNclsIter1() > 70 &&
775 track->GetTPCnclsS() < 10) {
776 fHistDeDxSharp->Fill(ptot, track->GetTPCsignal());
780 // dE/dx for specific regions
782 for(Int_t iSig = 0; iSig < 4; iSig++) {
783 if (signal[1] > 6) fHistDeDxRegion->Fill(ptot,signal[iSig]/signal[1],iSig);
788 if((track->GetTPCsignal()-expSignalHelium4)/expSignalHelium4 > -0.15 && (track->GetTPCsignal()-expSignalHelium4)/expSignalHelium4 < 0.15) {
790 hasTOFout = status&AliESDtrack::kTOFout;
791 hasTOFtime = status&AliESDtrack::kTIME;
792 Bool_t hasTOF = kFALSE;
794 if (hasTOFout && hasTOFtime) hasTOF = kTRUE;
796 if (length < 350.) hasTOF = kFALSE;
798 Float_t time0 = fESDpid->GetTOFResponse().GetStartTime(track->P());//fESDpid->GetTOFResponse().GetTimeZero();
800 if (length > 350. && hasTOF == kTRUE && ptot < 4) {
801 time = track->GetTOFsignal() - time0;
803 beta = length / (2.99792457999999984e-02 * time);
805 gamma = 1/TMath::Sqrt(1 - beta*beta);
806 mass = ptot/TMath::Sqrt(gamma*gamma - 1); // using inner TPC mom. as approx.
807 if (TMath::Sqrt(track->GetTOFsignalDz()*track->GetTOFsignalDz() + track->GetTOFsignalDx()*track->GetTOFsignalDx()) < 5.) {
808 fHistAlpha->Fill(mass*mass);
809 if (mass*mass > 3. && mass*mass < 4.) {
810 fHistAlphaSignal->Fill(mass*mass);
811 fGraphAlphaSignal->SetPoint(fNCounter, ptot, track->GetTPCsignal());
814 fHistTOFnuclei->Fill(ptot,beta);
821 }//end loop over tracks
823 if (fillTree) fTree->Fill();
826 PostData(1, fOutputContainer);
830 //________________________________________________________________________
831 void AliAnalysisTaskAntiHe4::Terminate(const Option_t *)
833 // Draw result to the screen
834 // Called once at the end of the query
836 //get output data and darw 'fHistPt'
837 if (!GetOutputData(0)) return;
842 //________________________________________________________________________
843 void AliAnalysisTaskAntiHe4::BinLogAxis(const THn *h, Int_t axisNumber) {
845 // Method for the correct logarithmic binning of histograms
847 TAxis *axis = h->GetAxis(axisNumber);
848 int bins = axis->GetNbins();
850 Double_t from = axis->GetXmin();
851 Double_t to = axis->GetXmax();
852 Double_t *newBins = new Double_t[bins + 1];
855 Double_t factor = pow(to/from, 1./bins);
857 for (int i = 1; i <= bins; i++) {
858 newBins[i] = factor * newBins[i-1];
860 axis->Set(bins, newBins);
865 //________________________________________________________________________
866 void AliAnalysisTaskAntiHe4::BinLogAxis(const TH3 *h, Int_t axisNumber) {
868 // Method for the correct logarithmic binning of histograms
870 TAxis *axis = h->GetXaxis();
871 if (axisNumber == 1) axis = h->GetYaxis();
872 if (axisNumber == 2) axis = h->GetZaxis();
873 int bins = axis->GetNbins();
875 Double_t from = axis->GetXmin();
876 Double_t to = axis->GetXmax();
877 Double_t *newBins = new Double_t[bins + 1];
880 Double_t factor = pow(to/from, 1./bins);
882 for (int i = 1; i <= bins; i++) {
883 newBins[i] = factor * newBins[i-1];
885 axis->Set(bins, newBins);
889 //________________________________________________________________________
890 void AliAnalysisTaskAntiHe4::BinLogAxis(const TH1 *h) {
892 // Method for the correct logarithmic binning of histograms
894 TAxis *axis = h->GetXaxis();
895 int bins = axis->GetNbins();
897 Double_t from = axis->GetXmin();
898 Double_t to = axis->GetXmax();
899 Double_t *newBins = new Double_t[bins + 1];
902 Double_t factor = pow(to/from, 1./bins);
904 for (int i = 1; i <= bins; i++) {
905 newBins[i] = factor * newBins[i-1];
907 axis->Set(bins, newBins);
911 //_____________________________________________________________________________
912 Int_t AliAnalysisTaskAntiHe4::Initialize() {
921 //________________________________________________________________________
922 Int_t AliAnalysisTaskAntiHe4::SetupEvent() {
923 // Setup Reading of event
926 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
928 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
930 //Bool_t isTriggered = IsTriggered();
934 //_____________________________________________________________________________
935 void AliAnalysisTaskAntiHe4::ResetEvent() {
938 for (Int_t ii = 0; ii < fNTriggers; ++ii)
939 fTriggerFired[ii] = kFALSE;
943 //________________________________________________________________________
944 Bool_t AliAnalysisTaskAntiHe4::IsTriggered() {
945 // Check if Event is triggered and fill Trigger Histogram
947 if ((fEventHandler->IsEventSelected() & AliVEvent::kMB)) fTriggerFired[0] = kTRUE;
948 if ((fEventHandler->IsEventSelected() & AliVEvent::kCentral)) fTriggerFired[1] = kTRUE;
949 if ((fEventHandler->IsEventSelected() & AliVEvent::kSemiCentral)) fTriggerFired[2] = kTRUE;
950 if ((fEventHandler->IsEventSelected() & AliVEvent::kEMCEJE)) fTriggerFired[3] = kTRUE;
951 if ((fEventHandler->IsEventSelected() & AliVEvent::kEMCEGA)) fTriggerFired[4] = kTRUE;
953 Bool_t isTriggered = kFALSE;
955 for (Int_t ii=0; ii<fNTriggers; ++ii) {
956 if(fTriggerFired[ii]) {
958 fHistTriggerStat->Fill(ii);
964 //________________________________________________________________________
965 void AliAnalysisTaskAntiHe4::SetBBParameters(Int_t runNumber){
967 if(runNumber < 166500){ //LHC10h
969 fBBParametersLightParticles[0] = 1.45802;
970 fBBParametersLightParticles[1] = 27.4992;
971 fBBParametersLightParticles[2] = 4.00313e-15;
972 fBBParametersLightParticles[3] = 2.48485;
973 fBBParametersLightParticles[4] = 8.31768;
975 fBBParametersNuclei[0] = 1.69155;
976 fBBParametersNuclei[1] = 27.4992;
977 fBBParametersNuclei[2] = 4.00313e-15;
978 fBBParametersNuclei[3] = 2.48485;
979 fBBParametersNuclei[4] = 8.31768;
983 if(runNumber > 166500){ //LHC11h
985 fBBParametersLightParticles[0] = 4.69637;//1.11243;
986 fBBParametersLightParticles[1] = 7.51827;//26.1144;
987 fBBParametersLightParticles[2] = 0.0183746;//4.00313e-15;
988 fBBParametersLightParticles[3] = 2.60;//2.72969;
989 fBBParametersLightParticles[4] = 2.7;//9.15038;
991 fBBParametersNuclei[0] = 1.4906;
992 fBBParametersNuclei[1] = 27.9758;
993 fBBParametersNuclei[2] = 4.00313e-15;
994 fBBParametersNuclei[3] = 2.50804;
995 fBBParametersNuclei[4] = 8.31768;
999 //______________________________________________________________________________
1000 void AliAnalysisTaskAntiHe4::MCGenerated(AliStack* stack)
1003 // Monte Carlo for genenerated particles
1004 if (fMCtrue) //MC loop
1009 for(stackN = 0; stackN < stack->GetNtrack(); stackN++) //loop over stack
1012 Bool_t isPrimary = stack->IsPhysicalPrimary(stackN);
1013 Bool_t isSecondary = stack->IsSecondaryFromMaterial(stackN);
1015 const TParticle *tparticle = stack->Particle(stackN);
1016 Long_t pdgCode = tparticle->GetPdgCode();
1018 Double_t pTGen = tparticle->Pt();
1019 Double_t eta = tparticle->Eta();
1020 //check which particle it is
1023 if(pdgCode == 1000020040)
1025 fHistHelium4PtGen->Fill(pTGen);
1026 if(isPrimary) fHistHelium4PtGenPrim->Fill(pTGen);
1027 if(isSecondary) fHistHelium4PtGenSec->Fill(pTGen);
1028 if(TMath::Abs(eta) < 1.0)fHistHelium4PtGenEta->Fill(pTGen);
1029 if(isPrimary && TMath::Abs(eta) < 1.0)fHistHelium4PtGenPrimEta->Fill(pTGen);
1033 if(pdgCode == -1000020040)
1035 fHistAntiHelium4PtGen->Fill(pTGen);
1036 if(isPrimary) fHistAntiHelium4PtGenPrim->Fill(pTGen);
1037 if(isSecondary) fHistAntiHelium4PtGenSec->Fill(pTGen);
1038 if(TMath::Abs(eta) < 1.0)fHistAntiHelium4PtGenEta->Fill(pTGen);
1042 }//end loop over stack