12 #include "AliVEvent.h"
13 #include "AliVParticle.h"
15 #include "AliESDEvent.h"
16 #include "AliESDtrack.h"
17 #include "AliMultiplicity.h"
18 #include "AliESDtrackCuts.h"
20 #include "AliAODEvent.h"
21 #include "AliAODTrack.h"
22 #include "AliAODMCParticle.h"
23 #include "AliAODMCHeader.h"
26 #include "AliMCEvent.h"
27 #include "AliMCParticle.h"
28 #include "AliGenEventHeader.h"
29 #include "AliCentrality.h"
31 #include "AliAnalysisManager.h"
32 #include "AliInputEventHandler.h"
39 #include "AliAnalysisTaskMinijet.h"
41 // Analysis task for two-particle correlations using all particles over pt threshold
42 // pt_trig threshold for trigger particle (event axis) and pt_assoc for possible associated particles.
43 // Extract mini-jet yield and fragmentation properties via Delta-Phi histograms of these correlations
44 // post processing of analysis output via macro plot3and2Gaus.C
45 // Can use ESD or AOD, reconstructed and Monte Carlo data as input
46 // Author: Eva Sicking, modifications by Emilia Leogrande
49 ClassImp(AliAnalysisTaskMinijet)
51 //________________________________________________________________________
52 AliAnalysisTaskMinijet::AliAnalysisTaskMinijet(const char *name)
53 : AliAnalysisTaskSE(name),
57 fAnalysePrimOnly(kFALSE),// not used
70 fSelectParticlesAssoc(1),
73 fCorrStrangeness(true),
74 fThreeParticleCorr(false),
81 fNRecAcceptStrangeCorr(0),
82 fNMcPrimAcceptTracklet(0),
83 fNRecAcceptTracklet(0),
95 fCorruptedChunksAfter(0),
99 fNmcNchVtxStrangeCorr(0),
103 fNmcNchVtxTracklet(0),
104 fPNmcNchVtxTracklet(0),
108 fCentralityMethod("")
113 for(Int_t i = 0;i< 8;i++){
114 fMapSingleTrig[i] = 0;
140 fDPhiDEtaEventAxis[i] = 0;
141 fDPhiDEtaEventAxisSeeds[i]= 0;
144 fTriggerNchSeeds[i] = 0;
145 fTriggerTracklet[i] = 0;
150 fNch07Tracklet[i] = 0;
152 fPNch07Tracklet[i] = 0;
153 fDPhiEventAxis[i] = 0;
156 DefineOutput(1, TList::Class());
159 //________________________________________________________________________
160 AliAnalysisTaskMinijet::~AliAnalysisTaskMinijet()
164 if (fHists && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fHists;
167 //________________________________________________________________________
168 void AliAnalysisTaskMinijet::UserCreateOutputObjects()
172 if(fDebug) Printf("In User Create Output Objects.");
174 Int_t nbinsCentr = 0;
175 Float_t minbinCentr=0, maxbinCentr=0;
177 if (fCentralityMethod.Length() > 0)
190 fStep = new TH1F("fStep", "fStep", 10, -0.5, 9.5);
191 fEventStat = new TH1F("fEventStat", "fEventStat", 10, -0.5, 9.5);
192 fHistPt = new TH1F("fHistPt", "P_{T} distribution REC", 150, 0.1, 3.1);
193 fHistPt->GetXaxis()->SetTitle("P_{T} (GeV/c)");
194 fHistPt->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
195 fHistPt->SetMarkerStyle(kFullCircle);
196 fNContrNtracklets = new TH2F ("fNContrNtracklets", ";N_{tracklets};N_{vtx contrib}", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
197 fNContrNtracks = new TH2F ("fNContrNtracks", ";N_{tracks};N_{vtx contrib}", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
198 fCorruptedChunks = new TH2F ("fCorruptedChunks",
199 ";N_{tracks,TPC};N_{tracks,ITS-TPC}", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
200 fCorruptedChunksAfter = new TH2F ("fCorruptedChunksAfter",
201 ";N_{tracks,TPC};N_{tracks,ITS-TPC}", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
207 fHistPtMC = new TH1F("fHistPtMC", "P_{T} distribution MC", 150, 0.1, 3.1);
208 fHistPtMC->GetXaxis()->SetTitle("P_{T} (GeV/c)");
209 fHistPtMC->GetYaxis()->SetTitle("dN/dP_{T} (c/GeV)");
210 fHistPtMC->SetMarkerStyle(kFullCircle);
212 fNmcNch = new TH2F("fNmcNch", "fNmcNch", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
213 fPNmcNch = new TProfile("pNmcNch", "pNmcNch", nbinsCentr,minbinCentr,maxbinCentr);
214 fNmcNchVtx = new TH2F("fNmcNchVtx", "fNmcNchVtx", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
215 fNmcNchVtxStrangeCorr = new TH2F("fNmcNchVtxStrangeCorr", "fNmcNchVtxStrangeCorr", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
216 fPNmcNchVtx = new TProfile("pNmcNchVtx", "pNmcNchVtx", nbinsCentr,minbinCentr,maxbinCentr);
218 fNmcNchTracklet = new TH2F("fNmcNchTracklet", "fNmcNchTracklet", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
219 fPNmcNchTracklet = new TProfile("pNmcNchTracklet", "pNmcNchTracklet", nbinsCentr,minbinCentr,maxbinCentr);
220 fNmcNchVtxTracklet = new TH2F("fNmcNchVtxTracklet", "fNmcNchVtxTracklet", nbinsCentr,minbinCentr,maxbinCentr,nbinsCentr,minbinCentr,maxbinCentr);
221 fPNmcNchVtxTracklet = new TProfile("pNmcNchVtxTracklet", "pNmcNchVtxTracklet", nbinsCentr,minbinCentr,maxbinCentr);
227 fChargedPi0 = new TH2F("fChargedPi0", "fChargedPi0", 200, -0.5, 199.5, 200, -0.5, 199.5);
228 fVertexCheck = new TH1F("fVertexCheck", "fVertexCheck", 100, -0.5, 99.5);
229 fPropagateDca = new TH1F("fPropagateDca", "fPropagateDca", 2, -0.5, 1.5);
231 //----------------------
232 //bins for pt in THnSpare
233 Double_t ptMin = 0.0, ptMax = 100.;
235 Double_t binsPt[] = {0.0, 0.1, 0.2, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8,
236 0.9, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0,
237 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0, 100.0};
239 //Int_t nPtBinsAll = 100;
240 //Double_t ptMinAll = 1.e-2, ptMaxAll = 100.;
241 //Double_t *binsPtAll = 0;
242 //binsPtAll = (Double_t*)CreateLogAxis(nPtBinsAll,ptMinAll,ptMaxAll);
245 // Double_t ptMin2 = 0.0, ptMax2 = 100.;
246 // Int_t nPtBins2 = 9;
247 // Double_t binsPt2[] = {0.1, 0.4, 0.7, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0, 100.0};
249 // Int_t nPtBins2 = 10;
250 // Double_t ptMin2 = 0.4, ptMax2 = 100.;
251 // Double_t *binsPt2 = 0;
252 // binsPt2 = CreateLogAxis(nPtBins2,ptMin2,ptMax2);
255 Int_t binsEffHisto[3] = {Int_t(fEtaCut*20), nPtBins, nbinsCentr };
256 Double_t minEffHisto[3] = {-fEtaCut, ptMin, minbinCentr };
257 Double_t maxEffHisto[3] = {fEtaCut, ptMax, maxbinCentr};
260 Int_t binsEffHisto5[6] = { nPtBins, nPtBins, 1, 90, nbinsCentr , 2 };
261 Double_t minEffHisto5[6] = { ptMin, ptMin, -2*fEtaCut, -0.5*TMath::Pi(), minbinCentr , -0.5 };
262 Double_t maxEffHisto5[6] = { ptMax, ptMax, 2*fEtaCut, 1.5*TMath::Pi(), maxbinCentr , 1.5 };
266 Int_t binsEvent[4] = { nbinsCentr, 20, 50, nPtBins };
267 Double_t minEvent[4] = { minbinCentr, -10, 0, ptMin };
268 Double_t maxEvent[4] = { maxbinCentr, 10, 10, ptMax };
271 Int_t binsAll[3] = {Int_t(fEtaCut*20), nPtBins, nbinsCentr };
272 Double_t minAll[3] = {-fEtaCut, ptMin, minbinCentr };
273 Double_t maxAll[3] = {fEtaCut, ptMax, maxbinCentr };
276 Int_t binsThree[3] = { 90, 90, nbinsCentr};
277 Double_t minThree[3] = {-0.5*TMath::Pi(), -0.5*TMath::Pi(), minbinCentr};
278 Double_t maxThree[3] = { 1.5*TMath::Pi(), 1.5*TMath::Pi(), maxbinCentr};
284 //--------------------
285 TString dataType[2] ={"ESD", "AOD"};
286 TString labels[8]={Form("%sAllAllMcNmc",dataType[fMode].Data()),
287 Form("%sTrigAllMcNmc",dataType[fMode].Data()),
288 Form("%sTrigVtxMcNmc",dataType[fMode].Data()),
289 Form("%sTrigVtxMcNrec",dataType[fMode].Data()),
290 Form("%sTrigVtxRecMcPropNrec",dataType[fMode].Data()),
291 Form("%sTrigVtxRecNrec",dataType[fMode].Data()),
292 Form("%sTrigVtxRecMcPropNrecStrangeCorr",dataType[fMode].Data()),
293 Form("%sTrigVtxRecNrecStrangeCorr",dataType[fMode].Data())};
296 for(Int_t i=0;i<8;i++){
298 fMapSingleTrig[i] = new THnSparseD(Form("fMapSingleTrig%s", labels[i].Data()),"eta:pt:Nrec",
299 3,binsEffHisto,minEffHisto,maxEffHisto);
300 fMapSingleTrig[i]->SetBinEdges(1,binsPt);
301 fMapSingleTrig[i]->GetAxis(0)->SetTitle("#eta");
302 fMapSingleTrig[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
303 fMapSingleTrig[i]->GetAxis(2)->SetTitle("N_{rec}");
304 fMapSingleTrig[i]->Sumw2();
306 fMapPair[i] = new THnSparseD(Form("fMapPair%s", labels[i].Data()),"pt_trig:pt_assoc:DeltaEta:DeltaPhi:Nrec:likesign",
307 6,binsEffHisto5,minEffHisto5,maxEffHisto5);
308 fMapPair[i]->SetBinEdges(0,binsPt);
309 fMapPair[i]->SetBinEdges(1,binsPt);
310 fMapPair[i]->GetAxis(0)->SetTitle("p_{T, trig} (GeV/c)");
311 fMapPair[i]->GetAxis(1)->SetTitle("p_{T, assoc} (GeV/c)");
312 fMapPair[i]->GetAxis(2)->SetTitle("#Delta #eta");
313 fMapPair[i]->GetAxis(3)->SetTitle("#Delta #phi");
314 fMapPair[i]->GetAxis(4)->SetTitle("N_{rec}");
315 fMapPair[i]->GetAxis(5)->SetTitle("Like-sign or Unlike-sign");
316 fMapPair[i]->Sumw2();
319 fMapEvent[i] = new THnSparseD(Form("fMapEvent%s", labels[i].Data()),"Nrec:vertexZ:meanPt:leadingPt",
320 4,binsEvent,minEvent,maxEvent);
321 fMapEvent[i]->GetAxis(0)->SetTitle("N_{rec}");
322 fMapEvent[i]->GetAxis(1)->SetTitle("z_{vertex} (cm)");
323 fMapEvent[i]->GetAxis(2)->SetTitle("meanPt");
324 fMapEvent[i]->SetBinEdges(3,binsPt);
325 fMapEvent[i]->GetAxis(3)->SetTitle("leadingPt");
326 fMapEvent[i]->Sumw2();
328 fMapAll[i] = new THnSparseD(Form("fMapAll%s", labels[i].Data()),"eta:pt:Nrec",
329 3,binsAll,minAll,maxAll);
330 fMapAll[i]->SetBinEdges(1,binsPt);
331 fMapAll[i]->GetAxis(0)->SetTitle("#eta");
332 fMapAll[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
333 fMapAll[i]->GetAxis(2)->SetTitle("N_{rec}");
337 fMapThree[i] = new THnSparseD(Form("fMapThree%s", labels[i].Data()),"dphi1:dphi2:Nrec",
338 3,binsThree,minThree,maxThree);
339 fMapThree[i]->GetAxis(0)->SetTitle("#Delta#varphi_{1}");
340 fMapThree[i]->GetAxis(1)->SetTitle("#Delta#varphi_{2}");
341 fMapThree[i]->GetAxis(2)->SetTitle("N_{rec}");
342 fMapThree[i]->Sumw2();
345 fVertexZ[i] = new TH1F(Form("fVertexZ%s",labels[i].Data()),
346 Form("fVertexZ%s",labels[i].Data()) ,
348 fPt[i] = new TH1F(Form("fPt%s",labels[i].Data()),
349 Form("fPt%s",labels[i].Data()) ,
351 fNcharge[i] = new TH1F(Form("fNcharge%s",labels[i].Data()),
352 Form("fNcharge%s",labels[i].Data()) ,
354 fEta[i] = new TH1F (Form("fEta%s",labels[i].Data()),
355 Form("fEta%s",labels[i].Data()) ,
357 fPhi[i] = new TH1F(Form("fPhi%s",labels[i].Data()),
358 Form("fPhi%s",labels[i].Data()) ,
359 360, 0.,2*TMath::Pi());
360 fDcaXY[i] = new TH1F(Form("fDcaXY%s",labels[i].Data()),
361 Form("fDcaXY%s",labels[i].Data()) ,
363 fDcaZ[i] = new TH1F(Form("fDcaZ%s",labels[i].Data()),
364 Form("fDcaZ%s",labels[i].Data()) ,
366 fPtSeed[i] = new TH1F(Form("fPSeedt%s",labels[i].Data()),
367 Form("fPtSeed%s",labels[i].Data()) ,
369 fEtaSeed[i] = new TH1F (Form("fEtaSeed%s",labels[i].Data()),
370 Form("fEtaSeed%s",labels[i].Data()) ,
372 fPhiSeed[i] = new TH1F(Form("fPhiSeed%s",labels[i].Data()),
373 Form("fPhiSeed%s",labels[i].Data()) ,
374 360, 0.,2*TMath::Pi());
376 fPtOthers[i] = new TH1F(Form("fPOtherst%s",labels[i].Data()),
377 Form("fPtOthers%s",labels[i].Data()) ,
379 fEtaOthers[i] = new TH1F (Form("fEtaOthers%s",labels[i].Data()),
380 Form("fEtaOthers%s",labels[i].Data()) ,
382 fPhiOthers[i] = new TH1F(Form("fPhiOthers%s",labels[i].Data()),
383 Form("fPhiOthers%s",labels[i].Data()) ,
384 360, 0.,2*TMath::Pi());
385 fPtEtaOthers[i] = new TH2F(Form("fPtEtaOthers%s",labels[i].Data()),
386 Form("fPtEtaOthers%s",labels[i].Data()) ,
387 500, 0., 50, 100, -1., 1);
388 fPhiEta[i] = new TH2F(Form("fPhiEta%s",labels[i].Data()),
389 Form("fPhiEta%s",labels[i].Data()) ,
390 180, 0., 2*TMath::Pi(), 100, -1.,1.);
391 fDPhiDEtaEventAxis[i] = new TH2F(Form("fDPhiDEtaEventAxis%s",labels[i].Data()),
392 Form("fDPhiDEtaEventAxis%s",labels[i].Data()) ,
393 180, -0.5* TMath::Pi(), 1.5*TMath::Pi(), 9, -1.8,1.8);
394 fTriggerNch[i] = new TH1F(Form("fTriggerNch%s",labels[i].Data()),
395 Form("fTriggerNch%s",labels[i].Data()) ,
397 fTriggerNchSeeds[i] = new TH2F(Form("fTriggerNchSeeds%s",labels[i].Data()),
398 Form("fTriggerNchSeeds%s",labels[i].Data()) ,
399 250, -0.5, 249.5, 100, -0.5, 99.5);
400 fTriggerTracklet[i] = new TH1F(Form("fTriggerTracklet%s",labels[i].Data()),
401 Form("fTriggerTracklet%s",labels[i].Data()) ,
403 fNch07Nch[i] = new TH2F(Form("fNch07Nch%s",labels[i].Data()),
404 Form("fNch07Nch%s",labels[i].Data()) ,
405 250, -2.5, 247.5,250, -2.5, 247.5);
406 fPNch07Nch[i] = new TProfile(Form("pNch07Nch%s",labels[i].Data()),
407 Form("pNch07Nch%s",labels[i].Data()) ,
409 fNch07Tracklet[i] = new TH2F(Form("fNch07Tracklet%s",labels[i].Data()),
410 Form("fNch07Tracklet%s",labels[i].Data()) ,
411 250, -2.5, 247.5,250, -2.5, 247.5);
412 fNchTracklet[i] = new TH2F(Form("fNchTracklet%s",labels[i].Data()),
413 Form("fNchTracklet%s",labels[i].Data()) ,
414 250, -2.5, 247.5,250, -2.5, 247.5);
415 fPNch07Tracklet[i] = new TProfile(Form("pNch07Tracklet%s",labels[i].Data()),
416 Form("pNch07Tracklet%s",labels[i].Data()) ,
418 fDPhiEventAxis[i] = new TH1F(Form("fDPhiEventAxis%s",
420 Form("fDPhiEventAxis%s",
422 180, -0.5*TMath::Pi(), 1.5*TMath::Pi());
423 fDPhi1DPhi2[i] = new TH2F(Form("fDPhi1DPhi2%s",labels[i].Data()),
424 Form("fDPhi1DPhi2%s",labels[i].Data()),
425 180, -0.5* TMath::Pi(), 1.5*TMath::Pi(),
426 180, -0.5* TMath::Pi(), 1.5*TMath::Pi());
429 fHists = new TList();
433 fHists->Add(fEventStat);
434 fHists->Add(fHistPt);
435 fHists->Add(fNContrNtracklets);
436 fHists->Add(fNContrNtracks);
437 fHists->Add(fCorruptedChunks);
438 fHists->Add(fCorruptedChunksAfter);
441 fHists->Add(fHistPtMC);
443 fHists->Add(fNmcNch);
444 fHists->Add(fPNmcNch);
445 fHists->Add(fNmcNchVtx);
446 fHists->Add(fNmcNchVtxStrangeCorr);
447 fHists->Add(fPNmcNchVtx);
449 fHists->Add(fNmcNchTracklet);
450 fHists->Add(fPNmcNchTracklet);
451 fHists->Add(fNmcNchVtxTracklet);
452 fHists->Add(fPNmcNchVtxTracklet);
454 fHists->Add(fChargedPi0);
455 fHists->Add(fVertexCheck);
456 fHists->Add(fPropagateDca);
458 for(Int_t i=0;i<8;i++){
459 fHists->Add(fMapSingleTrig[i]);
460 fHists->Add(fMapPair[i]);
461 fHists->Add(fMapEvent[i]);
462 fHists->Add(fMapAll[i]);
463 fHists->Add(fMapThree[i]);
464 fHists->Add(fVertexZ[i]);
466 fHists->Add(fNcharge[i]);
467 fHists->Add(fEta[i]);
468 fHists->Add(fPhi[i]);
469 fHists->Add(fDcaXY[i]);
470 fHists->Add(fDcaZ[i]);
471 fHists->Add(fPtSeed[i]);
472 fHists->Add(fEtaSeed[i]);
473 fHists->Add(fPhiSeed[i]);
474 fHists->Add(fPtOthers[i]);
475 fHists->Add(fEtaOthers[i]);
476 fHists->Add(fPhiOthers[i]);
477 fHists->Add(fPtEtaOthers[i]);
478 fHists->Add(fPhiEta[i]);
479 fHists->Add(fDPhiDEtaEventAxis[i]);
480 fHists->Add(fTriggerNch[i]);
481 fHists->Add(fTriggerNchSeeds[i]);
482 fHists->Add(fTriggerTracklet[i]);
483 fHists->Add(fNch07Nch[i]);
484 fHists->Add(fPNch07Nch[i]);
485 fHists->Add(fNch07Tracklet[i]);
486 fHists->Add(fNchTracklet[i]);
487 fHists->Add(fPNch07Tracklet[i]);
488 fHists->Add(fDPhiEventAxis[i]);
489 fHists->Add(fDPhi1DPhi2[i]);
496 //________________________________________________________________________
497 void AliAnalysisTaskMinijet::UserExec(Option_t *)
499 // Main function, called for each event
500 // Kinematics-only, ESD and AOD can be processed.
501 // Data is read (ReadEventESD, ReadEventAOD...) and then analysed (Analyse).
502 // - in case of MC with full detector simulation, all correction steps(0-5) can be processed
503 // - for Data, only step 5 is performed
504 // - for kinematics-only, only step 0 is processed
506 // - trigger - - vertex - - tracks - - multiplicity -
507 // step 7 = Triggered events, reconstructed accepted vertex, reconstructed tracks + strangness corr, reconstructed multiplicity+strangeCorr
508 // step 6 = Triggered events, reconstructed accepted vertex, reconstructed tracks with MC prop + stangess corr, reconstructed multiplicity+strangeCorr
509 // step 5 = Triggered events, reconstructed accepted vertex, reconstructed tracks, reconstructed multiplicity
510 // step 4 = Triggered events, reconstructed accepted vertex, reconstructed tracks with MC properties, reconstructed multiplicity
511 // step 3 = Triggered events, reconstructed accepted vertex, mc primary particles, reconstructed multiplicity
512 // step 2 = Triggered events, reconstructed accepted vertex, mc primary particles, true multiplicity
513 // step 1 = Triggered events, all mc primary particles, true multiplicity
514 // step 0 = All events, all mc primary particles, true multiplicity
517 if(fDebug) Printf("UserExec: Event starts");
519 AliVEvent *event = InputEvent();
521 Error("UserExec", "Could not retrieve event");
524 fBSign= event->GetMagneticField();
526 //get events, either ESD or AOD
527 fESDEvent = dynamic_cast<AliESDEvent*> (InputEvent());
528 fAODEvent = dynamic_cast<AliAODEvent*> (InputEvent());
533 vector<Short_t> charge;
534 vector<Float_t> strangenessWeight;
538 vector<Float_t> theta;
541 //number of accepted tracks and tracklets
542 Double_t ntracks = 0; //return value for reading functions for ESD and AOD
543 //Int_t ntracksRemove = 0; //return value for reading functions for ESD and AOD
544 vector<Double_t> nTracksTracklets; // [0]=nAccepted,1=ntracklets,2=nall(also neutral in case of mc,
545 //for real nall=ncharged)
547 if(!fAODEvent && !fESDEvent)return;
550 Double_t centrality = 0;
551 if (fCentralityMethod.Length() > 0)
553 AliCentrality *centralityObj = 0;
555 centralityObj = ((AliVAODHeader*)fAODEvent->GetHeader())->GetCentralityP();
557 centralityObj = fESDEvent->GetCentrality();
560 centrality = centralityObj->GetCentralityPercentile(fCentralityMethod);
561 AliInfo(Form("Centrality is %f", centrality));
565 Printf("WARNING: Centrality object is 0");
570 // SDD check for LHC11a
576 const AliMultiplicity *mul = fESDEvent->GetMultiplicity();
577 Int_t nClu3 = mul->GetNumberOfITSClusters(2);
578 Int_t nClu4 = mul->GetNumberOfITSClusters(3);
579 if(nClu3==0 && nClu4==0) return;
581 else if (fSelOption==1){
582 TString trcl = fESDEvent->GetFiredTriggerClasses().Data();
583 if (!(trcl.Contains("CINT1-B-NOPF-ALLNOTRD"))) return;
590 Bool_t useEvent = false;
591 Int_t nTracks = fAODEvent->GetNumberOfTracks();
592 for(Int_t itrack=0; itrack<nTracks; itrack++) {
593 AliAODTrack * track = dynamic_cast<AliAODTrack*>(fAODEvent->GetTrack(itrack));
594 if(!track) AliFatal("Not a standard AOD");
595 if(TESTBIT(track->GetITSClusterMap(),2) || TESTBIT(track->GetITSClusterMap(),3) ){
600 if (!useEvent) return;
602 else if(fSelOption==1){
603 TString trcl = fAODEvent->GetFiredTriggerClasses().Data();
604 if (!(trcl.Contains("CINT1-B-NOPF-ALLNOTRD"))) return;
610 fNMcPrimAccept=0;// number of accepted primaries
611 fNRecAccept=0; // number of accepted tracks
612 fNRecAcceptStrangeCorr=0; // number of accepted tracks + strangeness correction
613 fNMcPrimAcceptTracklet=0;// number of accepted primaries (no pt cut)
614 fNRecAcceptTracklet=0; // number of accepted tracklets
616 // instead of task->SelectCollisionCandidate(mask) in AddTask macro
617 Bool_t isSelected = (((AliInputEventHandler*)
618 (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))
619 ->IsEventSelected() & fTriggerType);
623 Printf("IsSelected = %d", isSelected);
624 Printf("CheckEvent(true)= %d", CheckEvent(true));
625 Printf("CheckEvent(false)= %d", CheckEvent(false));
628 fEventStat->Fill(0);//all events
631 if(isSelected){ // has offline trigger
633 fEventStat->Fill(1);//triggered event
635 if(CheckEvent(true)){//step 5 = TrigVtxRecNrec, step 4 = TrigVtxRecMcPropNrec ,step 3 = TrigVtxMcNrec
637 fEventStat->Fill(2);//triggered event with vertex
640 //step 5 = TrigVtxRecNrec
643 if(fESDEvent) ntracks = ReadEventESD(pt, eta, phi, charge,strangenessWeight, nTracksTracklets, 5);
644 else if(fAODEvent)ntracks = ReadEventAOD(pt, eta, phi, charge,strangenessWeight, nTracksTracklets, 5);
645 else AliInfo("Fatal Error");
647 if (fCentralityMethod.Length() > 0)
648 ntracks = centrality;
651 if(pt.size()){ //(internally ntracks=fNRecAccept)
652 fEventStat->Fill(3);//triggered event with vertex and one reconstructed track in acceptance
653 Analyse(pt, eta, phi, charge, strangenessWeight, ntracks, nTracksTracklets[1], nTracksTracklets[2], 5);//step 5 = TrigVtxRecNrec
656 if(fCorrStrangeness){
657 //step 7 = TrigVtxRecNrecStrangeCorr
660 if(fESDEvent) ntracks = ReadEventESD(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 7);//stagness version not yet implemented
661 else if(fAODEvent)ntracks = ReadEventAOD(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 7);
662 else AliInfo("Fatal Error");
664 if (fCentralityMethod.Length() > 0)
665 ntracks = centrality;
668 if(pt.size()){ //(internally ntracks=fNRecAccept)
669 Analyse(pt, eta, phi, charge, strangenessWeight, fNRecAcceptStrangeCorr, nTracksTracklets[1], nTracksTracklets[2], 7);//step 7 = TrigVtxRecNrecStrangeCorr
674 // step 4 = TrigVtxRecMcPropNrec
677 if(fESDEvent) ntracks = ReadEventESDRecMcProp(pt, eta, phi, charge,strangenessWeight, nTracksTracklets, 4);
678 else if(fAODEvent) ntracks = ReadEventAODRecMcProp(pt, eta, phi, charge,strangenessWeight, nTracksTracklets, 4);
679 else AliInfo("Fatal Error");
681 if (fCentralityMethod.Length() > 0)
682 ntracks = centrality;
685 if(pt.size()){//(internally ntracks=fNRecAccept)
686 Analyse(pt, eta, phi, charge,strangenessWeight, ntracks, nTracksTracklets[1], nTracksTracklets[2], 4); //step 4 = TrigVtxRecMcPropNrec
690 if(fCorrStrangeness){
691 // step 6 = TrigVtxRecMcPropNrecStrangeCorr
694 if(fESDEvent) ntracks = ReadEventESDRecMcProp(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 6);//stagness version not yet implemented
695 else if(fAODEvent) ntracks = ReadEventAODRecMcProp(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 6);
696 else AliInfo("Fatal Error");
698 if (fCentralityMethod.Length() > 0)
699 ntracks = centrality;
702 if(pt.size()){//(internally ntracks=fNRecAccept)
703 Analyse(pt, eta, phi, charge, strangenessWeight, fNRecAcceptStrangeCorr, nTracksTracklets[1], nTracksTracklets[2], 6); //step 6 = TrigVtxRecMcPropNrecStrangeCorr
706 // step 3 = TrigVtxMcNrec
709 if(fESDEvent) ntracks = ReadEventESDMC(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 3);
710 else if(fAODEvent) ntracks = ReadEventAODMC(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 3);
711 else AliInfo("Fatal Error");
713 if (fCentralityMethod.Length() > 0){
714 fNRecAccept = centrality;
715 fNMcPrimAccept = centrality;
720 Analyse(pt, eta, phi, charge, strangenessWeight, fNRecAccept, nTracksTracklets[1],nTracksTracklets[2], 3); //step 3 = TrigVtxMcNrec
721 Analyse(pt, eta, phi, charge, strangenessWeight, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 2); //step 2 = TrigVtxMcNmc
727 }//check event (true)
730 if(fUseMC && !fMcOnly){
732 fNMcPrimAccept=0;// number of accepted primaries
733 fNRecAccept=0; // number of accepted tracks
734 fNMcPrimAcceptTracklet=0;// number of accepted primaries (no pt cut)
735 fNRecAcceptTracklet=0; // number of accepted tracklets
737 if(CheckEvent(false)){// all events, with and without reconstucted vertex
738 if(fESDEvent) ntracks = ReadEventESDMC(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 1);//read tracks
739 else if(fAODEvent) ntracks = ReadEventAODMC(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 1);//read tracks
740 else AliInfo("Fatal Error");
742 if (fCentralityMethod.Length() > 0)
743 fNMcPrimAccept = centrality;
748 Analyse(pt, eta, phi, charge, strangenessWeight, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 1); // step 1 = TrigAllMcNmc
750 Analyse(pt, eta, phi, charge, strangenessWeight, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); //first part of step 0 // step 0 = AllAllMcNmc
758 else { // not selected by physics selection task = not triggered
759 if(fUseMC && !fMcOnly){
760 if(CheckEvent(false)){
763 if(fESDEvent) ntracks = ReadEventESDMC(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 0);
764 else if(fAODEvent) ntracks = ReadEventAODMC(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 0);
765 else AliInfo("Fatal Error");
767 if (fCentralityMethod.Length() > 0)
768 fNMcPrimAccept = centrality;
772 Analyse(pt, eta, phi, charge, strangenessWeight, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0); //second part of step 0 // step 0 = AllAllMcNmc
780 if(fMode==0) ntracks = ReadEventESDMC(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 0);
781 else if (fMode==1) ntracks = ReadEventAODMC(pt, eta, phi, charge, strangenessWeight, nTracksTracklets, 0);
783 if (fCentralityMethod.Length() > 0)
784 fNMcPrimAccept = centrality;
788 Analyse(pt, eta, phi, charge, strangenessWeight, fNMcPrimAccept, nTracksTracklets[1],nTracksTracklets[2], 0);
794 //________________________________________________________________________
795 Double_t AliAnalysisTaskMinijet::ReadEventESD( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
796 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
797 vector<Float_t> &strangeArray,
798 vector<Double_t> &nTracksTracklets, const Int_t step)
800 // gives back the number of esd tracks and pointer to arrays with track
801 // properties (pt, eta, phi)
802 // Uses TPC tracks with SPD vertex from now on
808 strangeArray.clear();
809 nTracksTracklets.clear();
811 const AliESDVertex* vtxSPD = fESDEvent->GetPrimaryVertexSPD(); // uses track or SPD vertexer
812 fVertexZ[step]->Fill(vtxSPD->GetZ());
814 // Retreive the number of all tracks for this event.
815 Int_t ntracks = fESDEvent->GetNumberOfTracks();
816 if(fDebug>1) Printf("all ESD tracks: %d", ntracks);
818 //first loop to check how many tracks are accepted
820 Double_t nAcceptedTracks=0;
821 //Float_t nAcceptedTracksStrange=0;
822 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
824 AliESDtrack *esdTrack = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
826 Error("ReadEventESD", "Could not receive track %d", iTracks);
830 // use TPC only tracks with non default SPD vertex
831 AliESDtrack *track = AliESDtrackCuts::
832 GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(fESDEvent),esdTrack->GetID());
834 if(!fCuts->AcceptTrack(track)) {
836 continue;// apply TPC track cuts before constrain to SPD vertex
839 // only constrain tracks above threshold
840 AliExternalTrackParam exParam;
841 // take the B-field from the ESD, no 3D fieldMap available at this point
842 Bool_t relate = false;
843 relate = track->RelateToVertexTPC(vtxSPD,fESDEvent->GetMagneticField(),
849 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),
850 exParam.GetCovariance());
854 continue;// only if tracks have pt<=0
857 if (TMath::Abs(track->Eta())<fEtaCut && track->Pt()>fPtMin && track->Pt()<fPtMax) {
858 ptArray.push_back(track->Pt());
859 etaArray.push_back(track->Eta());
860 phiArray.push_back(track->Phi());
861 chargeArray.push_back(track->Charge());
862 strangeArray.push_back(1);
864 fHistPt->Fill(track->Pt());
867 // TPC only track memory needs to be cleaned up
874 if(nAcceptedTracks==0) return 0;
877 Int_t ntrackletsAccept=0;
878 AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity());
879 Int_t ntracklets = mult->GetNumberOfTracklets();
880 for(Int_t i=0;i< ntracklets;i++){
881 if(mult->GetDeltaPhi(i)<0.05 && TMath::Abs(mult->GetEta(i))<fEtaCut){
885 nTracksTracklets.push_back(nAcceptedTracks);
886 nTracksTracklets.push_back(ntrackletsAccept);
887 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
888 //where here also neutral particles are counted.
891 fVzEvent=vtxSPD->GetZ(); // needed for correction map
892 if(step==5 || step ==2) {
893 fNRecAccept=nAcceptedTracks;
894 fNRecAcceptTracklet=ntrackletsAccept;
901 //________________________________________________________________________
902 Double_t AliAnalysisTaskMinijet::ReadEventESDRecMcProp( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
903 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
904 vector<Float_t> &strangeArray,
905 vector<Double_t> &nTracksTracklets, const Int_t step)
907 // gives back the number of esd tracks and pointer to arrays with track
908 // properties (pt, eta, phi) of mc particles if available
909 // Uses TPC tracks with SPD vertex from now on
915 strangeArray.clear();
916 nTracksTracklets.clear();
919 AliMCEvent *mcEvent = (AliMCEvent*) MCEvent();
921 Error("ReadEventESDRecMcProp", "Could not retrieve MC event");
924 AliStack* stack = MCEvent()->Stack();
928 // Retreive the number of all tracks for this event.
929 Int_t ntracks = fESDEvent->GetNumberOfTracks();
930 if(fDebug>1)Printf("all ESD tracks: %d", ntracks);
932 const AliESDVertex *vtxSPD = fESDEvent->GetPrimaryVertexSPD();
933 fVertexZ[step]->Fill(vtxSPD->GetZ());
936 Double_t nAcceptedTracks=0;
937 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
939 AliVParticle *vtrack = fESDEvent->GetTrack(iTracks);
940 AliESDtrack *esdTrack = (AliESDtrack *)fESDEvent->GetTrack(iTracks);
942 Error("ReadEventESDRecMcProp", "Could not receive track %d", iTracks);
946 // use TPC only tracks with non default SPD vertex
947 AliESDtrack *track = AliESDtrackCuts::
948 GetTPCOnlyTrack(dynamic_cast<AliESDEvent*>(fESDEvent),esdTrack->GetID());
950 if(!fCuts->AcceptTrack(track)) {
952 continue;// apply TPC track cuts before constrain to SPD vertex
955 // only constrain tracks above threshold
956 AliExternalTrackParam exParam;
957 // take the B-field from the ESD, no 3D fieldMap available at this point
958 Bool_t relate = false;
959 relate = track->RelateToVertexTPC(vtxSPD,fESDEvent->GetMagneticField(),
965 track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),
966 exParam.GetCovariance());
970 continue;// only if tracks have pt<=0
973 //count tracks, if available, use mc particle properties
974 if(vtrack->GetLabel()<=0){
975 if (TMath::Abs(track->Eta())<fEtaCut && track->Pt()>fPtMin && track->Pt()<fPtMax){
976 ptArray.push_back(track->Pt());
977 etaArray.push_back(track->Eta());
978 phiArray.push_back(track->Phi());
979 chargeArray.push_back(track->Charge());
980 strangeArray.push_back(1);
985 TParticle *partOfTrack = stack->Particle(vtrack->GetLabel());
986 if (TMath::Abs(partOfTrack->Eta())<fEtaCut && partOfTrack->Pt()>fPtMin && partOfTrack->Pt()<fPtMax) {
987 ptArray.push_back(partOfTrack->Pt());
988 etaArray.push_back(partOfTrack->Eta());
989 phiArray.push_back(partOfTrack->Phi());
990 chargeArray.push_back(vtrack->Charge());
991 strangeArray.push_back(1);
996 // TPC only track memory needs to be cleaned up
1002 if(nAcceptedTracks==0) return 0;
1005 Int_t ntrackletsAccept=0;
1006 AliMultiplicity * mult = (AliMultiplicity*)(fESDEvent->GetMultiplicity());
1007 Int_t ntracklets = mult->GetNumberOfTracklets();
1008 for(Int_t i=0;i< ntracklets;i++){
1009 if(mult->GetDeltaPhi(i)<0.05 && TMath::Abs(mult->GetEta(i))<fEtaCut){
1014 nTracksTracklets.push_back(nAcceptedTracks);
1015 nTracksTracklets.push_back(ntrackletsAccept);
1016 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
1017 //where here also neutral particles are counted.
1020 //get mc vertex for correction maps
1021 AliGenEventHeader* header = MCEvent()->GenEventHeader();
1023 header->PrimaryVertex(mcV);
1026 return fNRecAccept; // give back reconstructed value
1034 //________________________________________________________________________
1035 Double_t AliAnalysisTaskMinijet::ReadEventESDMC(vector<Float_t> &ptArray, vector<Float_t> &etaArray,
1036 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
1037 vector<Float_t> &strangeArray,
1038 vector<Double_t> &nTracksTracklets, const Int_t step)
1040 // gives back the number of charged prim MC particle and pointer to arrays
1041 // with particle properties (pt, eta, phi)
1046 chargeArray.clear();
1047 strangeArray.clear();
1048 nTracksTracklets.clear();
1052 AliMCEvent *mcEvent = (AliMCEvent*) MCEvent();
1054 Error("ReadEventESDMC", "Could not retrieve MC event");
1058 AliStack* stack = MCEvent()->Stack();
1059 if(!stack) return 0;
1061 Int_t ntracks = mcEvent->GetNumberOfTracks();
1062 if(fDebug>1)Printf("MC particles: %d", ntracks);
1065 AliGenEventHeader* header = MCEvent()->GenEventHeader();
1069 header->PrimaryVertex(mcV);
1072 fVertexZ[0]->Fill(vzMC);
1074 fVertexZ[step]->Fill(vzMC);
1077 //----------------------------------
1078 //first track loop to check how many chared primary tracks are available
1079 Double_t nChargedPrimaries=0;
1080 Double_t nAllPrimaries=0;
1082 Double_t nPseudoTracklets=0;
1083 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
1084 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
1086 Error("ReadEventESDMC", "Could not receive track %d", iTracks);
1091 if(//count also charged particles in case of fSelectParticles==2 (only neutral)
1092 !SelectParticlePlusCharged(
1095 stack->IsPhysicalPrimary(track->Label())
1100 //count number of pseudo tracklets
1101 if(TMath::Abs(track->Eta())<=fEtaCut && track->Pt()>0.0) ++nPseudoTracklets; //0.035
1102 //same cuts as on ESDtracks
1103 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
1105 //count all primaries
1107 //count charged primaries
1108 if (track->Charge() != 0) ++nChargedPrimaries;
1110 if(fDebug>2) Printf("PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
1114 //----------------------------------
1117 Printf("All in acceptance=%f",nAllPrimaries);
1118 Printf("Charged in acceptance =%f",nChargedPrimaries);
1121 fChargedPi0->Fill(nAllPrimaries,nChargedPrimaries);
1123 if(nAllPrimaries==0) return 0;
1124 if(nChargedPrimaries==0) return 0;
1127 //Int_t iChargedPiK=0;
1128 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
1129 AliMCParticle *track = dynamic_cast<AliMCParticle*>(mcEvent->GetTrack(iTracks));
1131 Error("ReadEventESDMC", "Could not receive track %d", iTracks);
1138 stack->IsPhysicalPrimary(track->Label())
1144 //same cuts as on ESDtracks
1145 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
1147 if(fDebug>2) Printf("After: PDG=%d, IsPrim=%d", track->PdgCode(),stack->IsPhysicalPrimary(track->Label()) );
1150 fHistPtMC->Fill(track->Pt());
1151 //fills arrays with track properties
1152 ptArray.push_back(track->Pt());
1153 etaArray.push_back(track->Eta());
1154 phiArray.push_back(track->Phi());
1155 chargeArray.push_back(track->Charge());
1156 strangeArray.push_back(1);
1160 nTracksTracklets.push_back(nChargedPrimaries);
1161 nTracksTracklets.push_back(nPseudoTracklets);
1162 if(fSelectParticles!=2){
1163 nTracksTracklets.push_back(nAllPrimaries);
1166 nTracksTracklets.push_back(nAllPrimaries-nChargedPrimaries); // only neutral
1169 fNMcPrimAccept = nChargedPrimaries;
1170 fNMcPrimAcceptTracklet = nPseudoTracklets;
1173 fNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
1174 fPNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
1175 fNmcNchTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet);
1176 fPNmcNchTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet);
1179 fNmcNchVtx->Fill(fNMcPrimAccept,fNRecAccept);
1180 fPNmcNchVtx->Fill(fNMcPrimAccept,fNRecAccept);
1181 fNmcNchVtxTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet);
1182 fPNmcNchVtxTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet);
1190 //________________________________________________________________________
1191 Double_t AliAnalysisTaskMinijet::ReadEventAOD( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
1192 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
1193 vector<Float_t> &strangeArray,
1194 vector<Double_t> &nTracksTracklets, const Int_t step)
1196 // gives back the number of AOD tracks and pointer to arrays with track
1197 // properties (pt, eta, phi)
1202 chargeArray.clear();
1203 strangeArray.clear();
1204 nTracksTracklets.clear();
1206 TClonesArray *mcArray=0x0;
1207 if(fAnalysePrimOnly || (fCorrStrangeness && fUseMC)){
1208 mcArray = (TClonesArray*)fAODEvent->FindListObject(AliAODMCParticle::StdBranchName());
1212 AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();//GetPrimaryVertex()
1213 Double_t vzAOD=vertex->GetZ();
1214 fVertexZ[step]->Fill(vzAOD);
1216 // Retreive the number of tracks for this event.
1217 Int_t ntracks = fAODEvent->GetNumberOfTracks();
1218 if(fDebug>1) Printf("AOD tracks: %d", ntracks);
1221 Double_t nAcceptedTracks=0;
1222 Float_t nAcceptedTracksStrange=0;
1223 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
1224 AliAODTrack *track = dynamic_cast<AliAODTrack*>(fAODEvent->GetTrack(iTracks));
1225 if(!track) AliFatal("Not a standard AOD");
1227 Error("ReadEventAOD", "Could not receive track %d", iTracks);
1231 AliVParticle *vtrack = fAODEvent->GetTrack(iTracks);
1233 //use only tracks from primaries
1234 if(fAnalysePrimOnly){
1235 if(vtrack->GetLabel()<=0)continue;
1236 if(!(static_cast<AliAODMCParticle*>(mcArray->At(vtrack->GetLabel()))->IsPhysicalPrimary()))continue;
1239 Double_t save= track->Pt();
1240 Double_t d0rphiz[2],covd0[3];
1242 AliAODTrack* clone = (AliAODTrack*) track->Clone("trk_clone"); //need clone, in order not to change track parameters
1243 Bool_t isDca= clone->PropagateToDCA(fAODEvent->GetPrimaryVertex(),fAODEvent->GetMagneticField(),9999.,d0rphiz,covd0);
1245 fPropagateDca->Fill(Int_t(isDca));
1246 if(TMath::Abs(save - track->Pt())>1e-6) Printf("Before pt=%f, After pt=%f",save, track->Pt());
1248 if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut
1249 && track->Pt()>fPtMin && track->Pt()<fPtMax){
1253 // Printf("dca= %f", track->DCA());
1254 //save track properties in vector
1255 ptArray.push_back(track->Pt());
1256 etaArray.push_back(track->Eta());
1257 phiArray.push_back(track->Phi());
1258 chargeArray.push_back(track->Charge());
1259 fHistPt->Fill(track->Pt());
1262 //correction for underestimation of strangeness in Monte Carlos -> underestimation of contamination
1264 if(fUseMC && fCorrStrangeness && step==7){
1265 if(vtrack->GetLabel()>0){
1266 AliAODMCParticle* mcprong =(AliAODMCParticle*)mcArray->At(vtrack->GetLabel());
1268 Int_t labmom = mcprong->GetMother();
1270 AliAODMCParticle* mcmother=(AliAODMCParticle*)mcArray->At(labmom);
1273 pdgMother = mcmother->GetPdgCode();
1274 if(TMath::Abs(pdgMother)==310 || TMath::Abs(pdgMother)==130 || TMath::Abs(pdgMother)==321){ //K^0_S, K^0_L, K^+-
1275 if(track->Pt()<=1)factor=1./0.7; // values from strangeness publication
1276 else factor=1./0.6;// values from strangeness publication
1278 if(TMath::Abs(pdgMother)==3122) { //Lambda
1279 factor=1./0.25; // values from strangeness publication
1286 nAcceptedTracksStrange+=factor;
1287 strangeArray.push_back(factor);
1288 fDcaXY[step]->Fill(d0rphiz[0], factor);
1289 fDcaZ[step]->Fill(d0rphiz[0], factor);
1293 //need to check this option for MC
1294 if(nAcceptedTracks==0) return 0;
1298 Int_t ntrackletsAccept=0;
1299 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
1300 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
1301 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut){
1307 nTracksTracklets.push_back(nAcceptedTracks);
1308 nTracksTracklets.push_back(ntrackletsAccept);
1309 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
1310 //where here also neutral particles are counted.
1314 if(step==5 || step==2){
1315 fNRecAccept = nAcceptedTracks; // needed for MC case //step5 = TrigVtxRecNrec
1316 fNRecAcceptTracklet = ntrackletsAccept; // needed for MC case //step5 = TrigVtxRecNrec
1318 if(step==7)fNRecAcceptStrangeCorr = nAcceptedTracksStrange;
1320 return fNRecAccept; // at the moment, always return reconstructed multiplicity
1324 //________________________________________________________________________
1325 Double_t AliAnalysisTaskMinijet::ReadEventAODRecMcProp( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
1326 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
1327 vector<Float_t> &strangeArray,
1328 vector<Double_t> &nTracksTracklets, const Int_t step)
1330 // gives back the number of AOD tracks and pointer to arrays with track
1331 // properties (pt, eta, phi)
1337 chargeArray.clear();
1338 strangeArray.clear();
1339 nTracksTracklets.clear();
1342 // Retreive the number of tracks for this event.
1343 Int_t ntracks = fAODEvent->GetNumberOfTracks();
1344 if(fDebug>1) Printf("AOD tracks: %d", ntracks);
1347 //get array of mc particles
1348 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1349 FindListObject(AliAODMCParticle::StdBranchName());
1351 AliInfo("No MC particle branch found");
1355 AliAODVertex* vtx= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();//GetPrimaryVertex()
1356 Double_t vzAOD=vtx->GetZ();
1357 fVertexZ[step]->Fill(vzAOD);
1359 Double_t nAcceptedTracks=0;
1360 for (Int_t iTracks = 0; iTracks < ntracks; iTracks++) {
1361 AliAODTrack *track = dynamic_cast<AliAODTrack*>(fAODEvent->GetTrack(iTracks));
1362 if(!track) AliFatal("Not a standard AOD");
1364 AliVParticle *vtrack = fAODEvent->GetTrack(iTracks);
1367 Error("ReadEventAODRecMcProp", "Could not receive track %d", iTracks);
1371 //use only tracks from primaries
1372 if(fAnalysePrimOnly){
1373 if(vtrack->GetLabel()<=0)continue;
1374 if(!(static_cast<AliAODMCParticle*>(mcArray->At(vtrack->GetLabel()))->IsPhysicalPrimary()))continue;
1377 if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut &&
1378 track->Pt()>fPtMin && track->Pt()<fPtMax){
1383 //save track properties in vector
1384 if(vtrack->GetLabel()<=0){ //fake tracks before "label<0", but crash in AOD079 // what is the meaning of label 0
1385 // Printf("Fake track");
1387 ptArray.push_back(track->Pt());
1388 etaArray.push_back(track->Eta());
1389 phiArray.push_back(track->Phi());
1390 chargeArray.push_back(track->Charge());
1393 else{//mc properties
1394 AliAODMCParticle *partOfTrack = (AliAODMCParticle*)mcArray->At(vtrack->GetLabel());
1395 if(!partOfTrack) Printf("label=%d", vtrack->GetLabel());
1397 ptArray.push_back(partOfTrack->Pt());
1398 etaArray.push_back(partOfTrack->Eta());
1399 phiArray.push_back(partOfTrack->Phi());
1400 chargeArray.push_back(vtrack->Charge());//partOfTrack?
1402 //correction for underestimation of strangeness in Monte Carlos -> underestimation of contamination
1403 if(fUseMC && fCorrStrangeness && step==6){
1404 Int_t labmom = partOfTrack->GetMother();
1406 AliAODMCParticle* mcmother=(AliAODMCParticle*)mcArray->At(labmom);
1409 pdgMother = mcmother->GetPdgCode();
1410 if(TMath::Abs(pdgMother)==310 || TMath::Abs(pdgMother)==130 || TMath::Abs(pdgMother)==321){ //K^0_S, K^0_L, K^+-
1411 if(track->Pt()<=1)factor=1./0.7; // values from strangeness publication
1412 else factor=1./0.6;// values from strangeness publication
1414 if(TMath::Abs(pdgMother)==3122) { //Lambda
1415 factor=1./0.25; // values from strangeness publication
1422 strangeArray.push_back(factor);
1426 //need to check this option for MC
1427 if(nAcceptedTracks==0) return 0;
1430 Int_t ntrackletsAccept=0;
1431 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
1432 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
1433 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 && TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut ){
1439 nTracksTracklets.push_back(nAcceptedTracks);
1440 nTracksTracklets.push_back(ntrackletsAccept);
1441 nTracksTracklets.push_back(nAcceptedTracks);//in order to be compatible with mc analysis
1442 //where here also neutral particles are counted.
1446 AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
1447 FindListObject(AliAODMCHeader::StdBranchName());
1448 Float_t vzMC = aodMCheader->GetVtxZ();
1451 return fNRecAccept;//this is the rec value from step 5
1457 //________________________________________________________________________
1458 Double_t AliAnalysisTaskMinijet::ReadEventAODMC( vector<Float_t> &ptArray, vector<Float_t> &etaArray,
1459 vector<Float_t> &phiArray, vector<Short_t> &chargeArray,
1460 vector<Float_t> &strangeArray,
1461 vector<Double_t> &nTracksTracklets, const Int_t step)
1463 // gives back the number of AOD MC particles and pointer to arrays with particle
1464 // properties (pt, eta, phi)
1469 chargeArray.clear();
1470 strangeArray.clear();
1471 nTracksTracklets.clear();
1474 AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
1475 FindListObject(AliAODMCHeader::StdBranchName());
1476 Float_t vzMC = aodMCheader->GetVtxZ();
1478 fVertexZ[0]->Fill(vzMC);
1480 fVertexZ[step]->Fill(vzMC);
1482 //retreive MC particles from event
1483 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1484 FindListObject(AliAODMCParticle::StdBranchName());
1486 AliInfo("No MC particle branch found");
1490 Int_t ntracks = mcArray->GetEntriesFast();
1491 if(fDebug>1)Printf("MC particles: %d", ntracks);
1494 // Track loop: chek how many particles will be accepted
1496 Double_t nChargedPrim=0;
1497 Double_t nAllPrim=0;
1498 Double_t nPseudoTracklets=0;
1499 for (Int_t it = 0; it < ntracks; it++) {
1500 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
1502 Error("ReadEventAODMC", "Could not receive particle %d", it);
1506 if(!SelectParticlePlusCharged(
1509 track->IsPhysicalPrimary()
1514 if(TMath::Abs(track->Eta())<fEtaCut && track->Pt()>0.0)++nPseudoTracklets; //0.035
1515 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
1518 if(track->Charge()!=0) nChargedPrim++;
1523 if(nAllPrim==0) return 0;
1524 if(nChargedPrim==0) return 0;
1526 //generate array with size of number of accepted tracks
1527 fChargedPi0->Fill(nAllPrim,nChargedPrim);
1530 // Track loop: fill arrays for accepted tracks
1531 // Int_t iChargedPrim=0;
1532 for (Int_t it = 0; it < ntracks; it++) {
1533 AliAODMCParticle *track = (AliAODMCParticle*)mcArray->At(it);
1535 Error("ReadEventAODMC", "Could not receive particle %d", it);
1542 track->IsPhysicalPrimary()
1547 if(TMath::Abs(track->Eta())>fEtaCut || track->Pt()<fPtMin || track->Pt()>fPtMax) continue;
1549 fHistPtMC->Fill(track->Pt());
1550 ptArray.push_back(track->Pt());
1551 etaArray.push_back(track->Eta());
1552 phiArray.push_back(track->Phi());
1553 chargeArray.push_back(track->Charge());
1554 strangeArray.push_back(1);
1557 nTracksTracklets.push_back(nChargedPrim);
1558 nTracksTracklets.push_back(nPseudoTracklets);
1559 if(fSelectParticles!=2){
1560 nTracksTracklets.push_back(nAllPrim);
1563 nTracksTracklets.push_back(nAllPrim-nChargedPrim); // only neutral
1569 fNMcPrimAccept = nChargedPrim;
1570 fNMcPrimAcceptTracklet = nPseudoTracklets;
1572 if(step==1){ // step 1 = Trig All Mc Nmc
1573 fNmcNch->Fill( fNMcPrimAccept,fNRecAccept);
1574 fPNmcNch->Fill(fNMcPrimAccept,fNRecAccept);
1575 fNmcNchTracklet->Fill( fNMcPrimAcceptTracklet,fNRecAcceptTracklet);
1576 fPNmcNchTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet);
1578 if(step==3){ // step 3 = Trig vtx Mc
1579 fNmcNchVtx->Fill( fNMcPrimAccept,fNRecAccept);
1580 fNmcNchVtxStrangeCorr->Fill( fNMcPrimAccept,fNRecAcceptStrangeCorr);
1581 fPNmcNchVtx->Fill(fNMcPrimAccept,fNRecAccept);
1582 fNmcNchVtxTracklet->Fill( fNMcPrimAcceptTracklet,fNRecAcceptTracklet);
1583 fPNmcNchVtxTracklet->Fill(fNMcPrimAcceptTracklet,fNRecAcceptTracklet);
1585 return fNRecAccept; // rec value from step 5 or step 2
1590 //________________________________________________________________________
1591 void AliAnalysisTaskMinijet::Analyse(const vector<Float_t> &pt,
1592 const vector<Float_t> &eta,
1593 const vector<Float_t> &phi,
1594 const vector<Short_t> &charge,
1595 const vector<Float_t> &strangeWeight,
1596 const Double_t ntracksCharged,
1597 const Int_t ntracklets,
1602 // analyse track properties (comming from either ESDs or AODs) in order to compute
1603 // mini jet activity (chared tracks) as function of charged multiplicity
1608 Printf("Analysis Step=%d", step);
1610 Printf("nAll=%d",nAll);
1611 Printf("nCharged=%f",ntracksCharged);
1612 for (Int_t i = 0; i < nAll; i++) {
1613 Printf("pt[%d]=%f",i,pt[i]);
1618 //calculation of mean pt for all tracks in case of step==0
1619 if(step==5 || step ==2){ // rec step
1621 Double_t leadingPt=0.;
1622 for (Int_t i = 0; i < nAll; i++) {
1623 if(pt[i]<0.01)continue;
1625 if(leadingPt<pt[i])leadingPt=pt[i];
1629 fLeadingPtRec=leadingPt;
1632 Double_t propEvent[4] = {ntracksCharged,fVzEvent,fMeanPtRec, fLeadingPtRec}; //vz: {rec, mc, mc}, meanPt and Nrec is always rec value
1633 fMapEvent[step]->Fill(propEvent);
1635 fNcharge[step]->Fill(ntracksCharged);
1637 Float_t ptEventAxis=0; // pt event axis
1638 Float_t etaEventAxis=0; // eta event axis
1639 Float_t phiEventAxis=0; // phi event axis
1640 Short_t chargeEventAxis=0; // charge event axis
1641 Float_t strangeWeightEventAxis=0; // strange weight event axis
1643 Float_t ptOthers = 0; // pt others // for all other tracks around event axis -> see loop
1644 Float_t etaOthers = 0; // eta others
1645 Float_t phiOthers = 0; // phi others
1646 Short_t chargeOthers = 0; // charge others
1647 Float_t strangeWeightOthers = 0; // strange weight others
1649 Int_t *pindexInnerEta = new Int_t [nAll+1];
1650 Float_t *ptInnerEta = new Float_t[nAll+1];
1654 for (Int_t i = 0; i < nAll; i++) {
1656 if(pt[i]<0.01)continue;
1658 //fill single particle correction for first step of pair correction
1659 Double_t propAll[3] = {eta[i],pt[i],ntracksCharged };
1660 fMapAll[step]->Fill(propAll, strangeWeight[i]);
1663 //filling of simple check plots
1664 if(pt[i]<0.7) continue;
1665 fPt[step] -> Fill( pt[i]);
1666 fEta[step] -> Fill(eta[i]);
1667 fPhi[step] -> Fill(phi[i]);
1668 fPhiEta[step]-> Fill(phi[i], eta[i]);
1670 pindexInnerEta[i]=0; //set all values to zero
1671 //fill new array for eta check
1672 ptInnerEta[i]= pt[i];
1678 // define event axis: leading or random track (with pt>fTriggerPtCut)
1679 // ---------------------------------------
1680 Int_t highPtTracks=0;
1681 Int_t highPtTracksInnerEta=0;
1682 // Double_t highPtTracksInnerEtaCorr=0;
1685 //count high pt tracks and high pt tracks in acceptance for seeds
1686 for(Int_t i=0;i<nAll;i++){
1688 if(pt[i]<0.01)continue;
1690 if(TMath::Abs(eta[i])<0.9){
1694 if(pt[i]>fTriggerPtCut) {
1698 // seed should be place in middle of acceptance, that complete cone is in acceptance
1699 if(pt[i]>fTriggerPtCut && TMath::Abs(eta[i])<fEtaCutSeed && charge[i]!=0){
1701 // Printf("eta=%f", eta[i]);
1702 highPtTracksInnerEta++;
1711 //sort array in order to get highest pt tracks first
1712 //index can be computed with pindexInnerEta[number]
1713 if(nAll) TMath::Sort(nAll, ptInnerEta, pindexInnerEta, kTRUE);
1715 // plot of multiplicity distributions
1716 fNch07Nch[step]->Fill(ntracksCharged, highPtTracksInnerEta);
1717 fPNch07Nch[step]->Fill(ntracksCharged, highPtTracksInnerEta);
1720 fNch07Tracklet[step]->Fill(ntracklets, highPtTracksInnerEta);//only counts tracks which can be used as seeds
1721 fNchTracklet[step]->Fill(ntracklets, ntracksCharged);
1722 fPNch07Tracklet[step]->Fill(ntracklets, highPtTracksInnerEta);//only counts tracks which can be used as seeds
1725 //analysis can only be performed with event axis, defined by high pt track
1728 if(highPtTracks>0 && highPtTracksInnerEta>0){
1730 // build pairs in two track loops
1731 // loop over all possible trigger particles (defined by pt_trig and eta_acceptance)
1732 for(Int_t axis=0;(axis<nAll) && (pt[pindexInnerEta[axis]]>=fTriggerPtCut); axis++){
1734 //EventAxisRandom track properties
1735 ptEventAxis = pt [pindexInnerEta[axis]];
1736 etaEventAxis = eta[pindexInnerEta[axis]];
1737 phiEventAxis = phi[pindexInnerEta[axis]];
1738 chargeEventAxis = charge[pindexInnerEta[axis]];
1739 strangeWeightEventAxis = strangeWeight[pindexInnerEta[axis]];
1740 fPtSeed[step] -> Fill( ptEventAxis);
1741 fEtaSeed[step] -> Fill(etaEventAxis);
1742 fPhiSeed[step] -> Fill(phiEventAxis);
1745 Double_t prop[3] = {etaEventAxis,ptEventAxis,ntracksCharged };
1746 fMapSingleTrig[step]->Fill(prop, strangeWeightEventAxis);
1749 for (Int_t iTrack = axis+1; iTrack < nAll; iTrack++) {
1751 if(pt[pindexInnerEta[iTrack]]<fAssociatePtCut) continue;
1753 if(fSelectParticlesAssoc==1){
1754 if(charge[pindexInnerEta[iTrack]]==0)continue;
1756 if(fSelectParticlesAssoc==2){
1757 if(charge[pindexInnerEta[iTrack]]!=0)continue;
1761 ptOthers = pt [pindexInnerEta[iTrack]];
1762 etaOthers = eta[pindexInnerEta[iTrack]];
1763 phiOthers = phi[pindexInnerEta[iTrack]];
1764 chargeOthers = charge[pindexInnerEta[iTrack]];
1765 strangeWeightOthers = strangeWeight[pindexInnerEta[iTrack]];
1768 //plot only properties of tracks with pt>ptassoc
1769 fPtOthers[step] -> Fill( ptOthers);
1770 fEtaOthers[step] -> Fill(etaOthers);
1771 fPhiOthers[step] -> Fill(phiOthers);
1772 fPtEtaOthers[step] -> Fill(ptOthers, etaOthers);
1774 // if(fDebug>2)Printf("%f, %f", pt[pindexInnerEta[axis]], pt[pindexInnerEta[iTrack]]);
1776 Float_t dPhi = phiOthers-phiEventAxis;
1777 if(dPhi>1.5*TMath::Pi()) dPhi = dPhi-2*TMath::Pi();
1778 else if(dPhi<-0.5*TMath::Pi())dPhi=dPhi+2*TMath::Pi();
1779 Float_t dEta=etaOthers-etaEventAxis;
1782 fDPhiDEtaEventAxis[step]->Fill(dPhi, dEta, strangeWeightEventAxis*strangeWeightOthers);
1783 fDPhiEventAxis[step]->Fill(dPhi, strangeWeightEventAxis*strangeWeightOthers);
1786 if(ptEventAxis< 0.4 || ptEventAxis > 100) AliInfo("particles out of range pt");
1787 if(ntracksCharged<-1 || ntracksCharged>1500) AliInfo("particles out of range ncharge");
1788 if(TMath::Abs(dEta)>2*fEtaCut) {
1789 AliInfo("particles out of range dEta");
1790 AliInfo(Form("eta1=%f, eta2=%f", etaOthers, etaEventAxis));
1791 AliInfo(Form("step=%d",step));
1793 if(dPhi<-0.5*TMath::Pi() || dPhi>1.5*TMath::Pi()){
1794 AliInfo(Form("particles out of range dPhi"));
1795 AliInfo(Form("phi1=%f, phi2=%f", phiOthers, phiEventAxis));
1798 Bool_t isLikeSign = CheckLikeSign(chargeEventAxis, chargeOthers);
1800 Double_t prop6[6] = {ptEventAxis,ptOthers,dEta,dPhi,ntracksCharged, static_cast<Double_t>(isLikeSign) };
1801 fMapPair[step]->Fill(prop6, strangeWeightEventAxis*strangeWeightOthers);
1803 //thrid track loop (Andreas: three particle auto-correlations)
1804 if(fThreeParticleCorr){
1805 for (Int_t third = iTrack+1; third < nAll; third++) {
1806 if(pt[pindexInnerEta[iTrack]]<fTriggerPtCut) continue;
1807 if(pt[pindexInnerEta[third]]<fTriggerPtCut) continue;
1810 Float_t dPhi1 = phiEventAxis - phiOthers;
1811 if(dPhi1>1.5*TMath::Pi()) dPhi1 = dPhi1-2*TMath::Pi();
1812 else if(dPhi1<-0.5*TMath::Pi())dPhi1=dPhi1+2*TMath::Pi();
1814 Float_t phiThird = phi[pindexInnerEta[third]];
1815 Float_t strangeWeightThird = strangeWeight[pindexInnerEta[third]];
1818 Float_t dPhi2 = phiEventAxis - phiThird;
1819 if(dPhi2>1.5*TMath::Pi()) dPhi2 = dPhi2-2*TMath::Pi();
1820 else if(dPhi2<-0.5*TMath::Pi())dPhi2=dPhi2+2*TMath::Pi();
1822 fDPhi1DPhi2[step]-> Fill(dPhi1, dPhi2, strangeWeightEventAxis*strangeWeightOthers*strangeWeightThird);
1823 Double_t propThree[3] = {dPhi1,dPhi2,ntracksCharged};
1824 fMapThree[step]->Fill(propThree,strangeWeightEventAxis*strangeWeightOthers*strangeWeightThird );
1827 }// end of three particle correlation loop
1829 }// if fThreeParticleCorr is set to true
1831 }// end of inner track loop
1833 } //end of outer track loop
1835 fTriggerNch[step]->Fill(ntracksCharged,highPtTracksInnerEta);
1836 fTriggerNchSeeds[step]->Fill(ntracksCharged,highPtTracksInnerEta);
1837 fTriggerTracklet[step]->Fill(ntracklets);
1840 }//if there is at least one high pt track
1843 if(pindexInnerEta){// clean up array memory used for TMath::Sort
1844 delete[] pindexInnerEta;
1848 if(ptInnerEta){// clean up array memory used for TMath::Sort
1849 delete[] ptInnerEta;
1857 //________________________________________________________________________
1858 void AliAnalysisTaskMinijet::Terminate(Option_t*)
1860 //terminate function is called at the end
1861 //can be used to draw histograms etc.
1866 //________________________________________________________________________
1867 Bool_t AliAnalysisTaskMinijet::SelectParticlePlusCharged(const Short_t charge, const Int_t pdg, Bool_t prim)
1869 //selection of mc particle
1870 //fSelectParticles=0: use charged primaries and pi0 and k0
1871 //fSelectParticles=1: use only charged primaries
1872 //fSelectParticles=2: use only pi0 and k0
1874 if(fSelectParticles==0 || fSelectParticles==2){ // in case of 2: need to count also charged particles
1876 if(!(pdg==111||pdg==130||pdg==310))
1885 else if(fSelectParticles==1){
1886 if (charge==0 || !prim){
1892 AliInfo("Error: wrong selection of charged/pi0/k0");
1900 //________________________________________________________________________
1901 Bool_t AliAnalysisTaskMinijet::SelectParticle(const Short_t charge, const Int_t pdg, const Bool_t prim)
1903 //selection of mc particle
1904 //fSelectParticles=0: use charged primaries and pi0 and k0
1905 //fSelectParticles=1: use only charged primaries
1906 //fSelectParticles=2: use only pi0 and k0
1908 if(fSelectParticles==0){
1910 if(!(pdg==111||pdg==130||pdg==310))
1918 else if (fSelectParticles==1){
1919 if (charge==0 || !prim){
1923 else if(fSelectParticles==2){
1924 if(!(pdg==111||pdg==130||pdg==310))
1932 //________________________________________________________________________
1933 Bool_t AliAnalysisTaskMinijet::CheckEvent(const Bool_t recVertex)
1935 // This function tests the quality of an event (ESD/AOD) (rec and/or mc part)
1936 // recVertex=false: check if Mc events and stack is there, Nmc>0
1937 // recVertex=false: " + check if there is a good, reconstructed SPD vertex
1938 // defined by |z|<fVertexCut(10cm), Contributer>0, no PileUpFromSPD(3,0,8)
1946 AliMCEvent *mcEvente = (AliMCEvent*) MCEvent();
1948 Error("CheckEvent", "Could not retrieve MC event");
1953 AliStack* stackg = MCEvent()->Stack();
1954 if(!stackg) return false;
1955 Int_t ntracksg = mcEvente->GetNumberOfTracks();
1956 if(ntracksg<0) return false;
1959 AliGenEventHeader* headerg = MCEvent()->GenEventHeader();
1961 headerg->PrimaryVertex(mcVg);
1962 //if(TMath::Abs(mcVg[0])<1e-8 && TMath::Abs(mcVg[0])<1e-8 &&
1963 // TMath::Abs(mcVg[0])<1e-8) return false;
1964 Float_t vzMCg = mcVg[2];
1965 if(TMath::Abs(vzMCg)>fVertexZCut) return false;
1970 if(recVertex==true){
1971 if(fESDEvent->IsPileupFromSPD(3,0,8))return false;
1974 const AliESDVertex* vertexESDg = fESDEvent->GetPrimaryVertex(); // uses track or SPD vertexer
1975 if(!vertexESDg) return false;
1976 fVertexCheck->Fill(vertexESDg->GetNContributors());
1977 if(vertexESDg->GetNContributors()<=0)return false;
1978 Float_t fVzg= vertexESDg->GetZ();
1979 if(TMath::Abs(fVzg)>fVertexZCut) return false;
1982 const AliESDVertex *vtxSPD = fESDEvent->GetPrimaryVertexSPD();
1983 if(!vtxSPD) return false;
1984 if(vtxSPD->GetNContributors()<=0)return false;
1985 Float_t fVzSPD= vtxSPD->GetZ();
1986 if(TMath::Abs(fVzSPD)>fVertexZCut) return false;
1993 else if(fMode==1){ //aod
1997 //retreive MC particles from event
1998 TClonesArray *mcArray = (TClonesArray*)fAODEvent->
1999 FindListObject(AliAODMCParticle::StdBranchName());
2001 AliInfo("No MC particle branch found");
2006 AliAODMCHeader *aodMCheader = (AliAODMCHeader *) fAODEvent->
2007 FindListObject(AliAODMCHeader::StdBranchName());
2008 Float_t vzMC = aodMCheader->GetVtxZ();
2009 if(TMath::Abs(vzMC)>fVertexZCut) return false;
2015 if(recVertex==true){
2016 //if(fAODEvent->IsPileupFromSPD(3,0.8)) return false;
2018 AliAODVertex* vertex= (AliAODVertex*)fAODEvent->GetPrimaryVertex();
2019 if(!vertex) return false;
2020 TString vtxTitle(vertex->GetTitle());// only allow vertex from tracks, no vertexer z
2021 // Printf("vtxTitle: %s",vtxTitle.Data());
2022 //if (!(vtxTitle.Contains("VertexerTracksWithConstraint"))) return false;
2023 fVertexCheck->Fill(vertex->GetNContributors());
2024 if(vertex->GetNContributors()<=0) return false;
2025 Double_t vzAOD=vertex->GetZ();
2026 // if(TMath::Abs(vzAOD)<1e-9) return false;
2027 if(TMath::Abs(vzAOD)>fVertexZCut) return false;
2029 AliAODVertex* vertexSPD= (AliAODVertex*)fAODEvent->GetPrimaryVertexSPD();
2030 if(!vertexSPD) return false;
2031 if(vertexSPD->GetNContributors()<=0) return false;
2032 Double_t vzSPD=vertexSPD->GetZ();
2033 //if(TMath::Abs(vzSPD)<1e-9) return false;
2034 if(TMath::Abs(vzSPD)>fVertexZCut) return false;
2036 //check TPC reconstruction: check for corrupted chunks
2037 //better: check TPCvertex, but this is not available yet in AODs
2038 Int_t nAcceptedTracksTPC=0;
2039 Int_t nAcceptedTracksITSTPC=0;
2040 for (Int_t iTracks = 0; iTracks < fAODEvent->GetNumberOfTracks(); iTracks++) {
2041 AliAODTrack *track = dynamic_cast<AliAODTrack*>(fAODEvent->GetTrack(iTracks));
2042 if(!track) AliFatal("Not a standard AOD");
2043 if (!track) continue;
2044 if(track->TestFilterBit(128) && TMath::Abs(track->Eta())<fEtaCut &&
2045 track->Pt()>fPtMin && track->Pt()<fPtMax)
2046 nAcceptedTracksTPC++;
2047 if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut &&
2048 track->Pt()>fPtMin && track->Pt()<fPtMax)
2049 nAcceptedTracksITSTPC++;
2051 fCorruptedChunks->Fill(nAcceptedTracksTPC,nAcceptedTracksITSTPC);
2053 if(nAcceptedTracksTPC>fNTPC && nAcceptedTracksITSTPC==0)
2054 return false;//most likely corrupted chunk. No ITS tracks are reconstructed
2056 fCorruptedChunksAfter->Fill(nAcceptedTracksTPC,nAcceptedTracksITSTPC);
2058 //control histograms=================
2060 Int_t ntrackletsAccept=0;
2061 AliAODTracklets * mult= (AliAODTracklets*)fAODEvent->GetTracklets();
2062 for(Int_t i=0;i<mult->GetNumberOfTracklets();++i){
2063 if(TMath::Abs(mult->GetDeltaPhi(i))<0.05 &&
2064 TMath::Abs(TMath::Log(TMath::Tan(0.5 * mult->GetTheta(i))))<fEtaCut) ++ntrackletsAccept;
2066 Int_t nAcceptedTracks=0;
2067 for (Int_t iTracks = 0; iTracks < fAODEvent->GetNumberOfTracks(); iTracks++) {
2068 AliAODTrack *track = dynamic_cast<AliAODTrack*>(fAODEvent->GetTrack(iTracks));
2069 if(!track) AliFatal("Not a standard AOD");
2070 if (!track) continue;
2071 if(track->TestFilterBit(fFilterBit) && TMath::Abs(track->Eta())<fEtaCut
2072 && track->Pt()>fPtMin && track->Pt()<fPtMax) nAcceptedTracks++;
2074 fNContrNtracklets->Fill(ntrackletsAccept,vertexSPD->GetNContributors());
2075 fNContrNtracks->Fill(nAcceptedTracks,vertexSPD->GetNContributors());
2076 //====================================
2083 Printf("Wrong mode!");
2089 //_____________________________________________________________________________
2090 const Double_t * AliAnalysisTaskMinijet::CreateLogAxis(const Int_t nbins,
2091 const Double_t xmin,
2092 const Double_t xmax)
2094 // returns pointer to an array with can be used to build a logarithmic axis
2095 // it is user responsibility to delete the array
2097 Double_t logxmin = TMath::Log10(xmin);
2098 Double_t logxmax = TMath::Log10(xmax);
2099 Double_t binwidth = (logxmax-logxmin)/nbins;
2101 Double_t *xbins = new Double_t[nbins+1];
2104 for (Int_t i=1;i<=nbins;i++) {
2105 xbins[i] = xmin + TMath::Power(10,logxmin+i*binwidth);
2111 //_____________________________________________________________________________
2112 Bool_t AliAnalysisTaskMinijet::CheckLikeSign(const Short_t chargeEventAxis,
2113 const Short_t chargeOthers)
2115 // compute if charge of two particles/tracks has same sign or different sign
2117 if(fDebug>2) Printf("Charge1=%d, Charge2=%d",chargeEventAxis,chargeOthers);
2119 if(chargeEventAxis<0){
2123 else if(chargeOthers>0){
2128 else if(chargeEventAxis>0){
2132 else if(chargeOthers<0){
2138 AliInfo("Error: Charge not lower nor higher as zero");
2142 AliInfo("Error: Check values of Charge");