1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15 //------------------------------------------------------------------------------
16 // AlidNdPtAnalysisPbPb class.
19 // - fills analysis control histograms
20 // - fills generic correction matrices
21 // - generates correction matrices
24 // - generic correction matrices
25 // - control histograms
27 // Author: J.Otwinowski 04/11/2008
28 // last change: 2011-04-04 by M.Knichel
29 //------------------------------------------------------------------------------
34 #include "THnSparse.h"
36 #include "AliHeader.h"
37 #include "AliGenEventHeader.h"
38 #include "AliInputEventHandler.h"
39 #include "AliAnalysisManager.h"
41 #include "AliESDEvent.h"
42 #include "AliMCEvent.h"
43 #include "AliESDtrackCuts.h"
45 #include "AliMultiplicity.h"
46 #include "AliTracker.h"
48 #include "AliCentrality.h"
50 #include "AlidNdPtEventCuts.h"
51 #include "AlidNdPtAcceptanceCuts.h"
52 #include "AliPhysicsSelection.h"
53 #include "AliTriggerAnalysis.h"
55 #include "AliPWG0Helper.h"
56 #include "AlidNdPtHelper.h"
57 #include "AlidNdPtAnalysisPbPb.h"
62 ClassImp(AlidNdPtAnalysisPbPb)
64 //_____________________________________________________________________________
65 AlidNdPtAnalysisPbPb::AlidNdPtAnalysisPbPb(): AlidNdPt(),
67 fHistogramsOn(kFALSE),
69 // rec. track pt vs true track pt correlation matrix
70 fTrackPtCorrelationMatrix(0),
72 // event level correction
74 fTriggerEventMatrix(0),
78 // track-event level correction
80 fGenTrackEventMatrix(0),
82 fTriggerTrackEventMatrix(0),
84 fRecTrackEventMatrix(0),
86 // track rec. efficiency correction (fRecPrimTrackMatrix / fGenPrimTrackMatrix)
88 fGenPrimTrackMatrix(0),
89 fRecPrimTrackMatrix(0),
91 // secondary track contamination correction (fRecSecTrackMatrix / fRecTrackMatrix)
93 fRecSecTrackMatrix(0),
95 // multiple rec. track contamination corrections (fRecMultTrackMatrix / fRecTrackMatrix)
96 fRecMultTrackMatrix(0),
98 // event control histograms
105 // rec. pt and eta resolution w.r.t MC
108 //multple reconstructed tracks
109 fMCMultRecTrackHist1(0),
111 // rec. track control histograms
116 fCentralityEstimator(0),
133 // default constructor
134 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) {
136 fMCPrimTrackHist1[i]=0;
137 fMCPrimTrackHist2[i]=0;
138 fMCSecTrackHist1[i]=0;
141 fRecTrackMultHist1[i]=0;
144 SetCentralityEstimator();
147 //_____________________________________________________________________________
148 AlidNdPtAnalysisPbPb::AlidNdPtAnalysisPbPb(Char_t* name, Char_t* title): AlidNdPt(name,title),
150 fHistogramsOn(kFALSE),
152 // rec. track pt vs true track pt correlation matrix
153 fTrackPtCorrelationMatrix(0),
155 // event level correction
157 fTriggerEventMatrix(0),
161 // track-event level correction
163 fGenTrackEventMatrix(0),
165 fTriggerTrackEventMatrix(0),
167 fRecTrackEventMatrix(0),
169 // track rec. efficiency correction (fRecPrimTrackMatrix / fGenPrimTrackMatrix)
171 fGenPrimTrackMatrix(0),
172 fRecPrimTrackMatrix(0),
174 // secondary track contamination correction (fRecTrackMatrix - fRecSecTrackMatrix)
176 fRecSecTrackMatrix(0),
178 // multiple rec. track contamination corrections (fRecTrackMatrix - fRecMultTrackMatrix)
179 fRecMultTrackMatrix(0),
184 // event control histograms
191 // rec. pt and eta resolution w.r.t MC
194 //multiple reconstructed tracks
195 fMCMultRecTrackHist1(0),
197 // rec. track control histograms
202 fCentralityEstimator(0),
223 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) {
225 fMCPrimTrackHist1[i]=0;
226 fMCPrimTrackHist2[i]=0;
227 fMCSecTrackHist1[i]=0;
230 fRecTrackMultHist1[i]=0;
234 SetCentralityEstimator();
237 //_____________________________________________________________________________
238 AlidNdPtAnalysisPbPb::~AlidNdPtAnalysisPbPb() {
242 if(fTrackPtCorrelationMatrix) delete fTrackPtCorrelationMatrix; fTrackPtCorrelationMatrix=0;
244 if(fGenEventMatrix) delete fGenEventMatrix; fGenEventMatrix=0;
245 if(fTriggerEventMatrix) delete fTriggerEventMatrix; fTriggerEventMatrix=0;
246 if(fRecEventMatrix) delete fRecEventMatrix; fRecEventMatrix=0;
249 if(fGenTrackEventMatrix) delete fGenTrackEventMatrix; fGenTrackEventMatrix=0;
250 if(fTriggerEventMatrix) delete fTriggerEventMatrix; fTriggerEventMatrix=0;
251 if(fRecTrackEventMatrix) delete fRecTrackEventMatrix; fRecTrackEventMatrix=0;
254 if(fGenTrackMatrix) delete fGenTrackMatrix; fGenTrackMatrix=0;
255 if(fGenPrimTrackMatrix) delete fGenPrimTrackMatrix; fGenPrimTrackMatrix=0;
256 if(fRecPrimTrackMatrix) delete fRecPrimTrackMatrix; fRecPrimTrackMatrix=0;
258 if(fRecTrackMatrix) delete fRecTrackMatrix; fRecTrackMatrix=0;
259 if(fRecSecTrackMatrix) delete fRecSecTrackMatrix; fRecSecTrackMatrix=0;
261 if(fRecMultTrackMatrix) delete fRecMultTrackMatrix; fRecMultTrackMatrix=0;
263 // Control histograms
265 if(fMCEventHist1) delete fMCEventHist1; fMCEventHist1=0;
266 if(fRecEventHist1) delete fRecEventHist1; fRecEventHist1=0;
267 if(fRecEventHist2) delete fRecEventHist2; fRecEventHist2=0;
268 if(fRecMCEventHist1) delete fRecMCEventHist1; fRecMCEventHist1=0;
269 if(fRecMCEventHist2) delete fRecMCEventHist2; fRecMCEventHist2=0;
272 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) {
273 if(fMCTrackHist1[i]) delete fMCTrackHist1[i]; fMCTrackHist1[i]=0;
274 if(fMCPrimTrackHist1[i]) delete fMCPrimTrackHist1[i]; fMCPrimTrackHist1[i]=0;
275 if(fMCPrimTrackHist2[i]) delete fMCPrimTrackHist2[i]; fMCPrimTrackHist2[i]=0;
276 if(fMCSecTrackHist1[i]) delete fMCSecTrackHist1[i]; fMCSecTrackHist1[i]=0;
277 if(fRecTrackHist1[i]) delete fRecTrackHist1[i]; fRecTrackHist1[i]=0;
278 if(fRecTrackHist2[i]) delete fRecTrackHist2[i]; fRecTrackHist2[i]=0;
279 if(fRecTrackMultHist1[i]) delete fRecTrackMultHist1[i]; fRecTrackMultHist1[i]=0;
281 if(fRecMCTrackHist1) delete fRecMCTrackHist1; fRecMCTrackHist1=0;
282 if(fMCMultRecTrackHist1) delete fMCMultRecTrackHist1; fMCMultRecTrackHist1=0;
283 if(fRecTrackHist3) delete fRecTrackHist3; fRecTrackHist3=0;
285 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
287 if (fTriggerAnalysis) delete fTriggerAnalysis; fTriggerAnalysis = 0;
290 //_____________________________________________________________________________
291 void AlidNdPtAnalysisPbPb::Init() {
293 Int_t multNbins = 47;
294 Int_t ptNbinsTrackEventCorr = 37;
298 Int_t centralityBins = 11;
300 Double_t binsMultDefault[48] = {
301 -0.5, 0.5 , 1.5 , 2.5 , 3.5 , 4.5 , 5.5 , 6.5 , 7.5 , 8.5,
302 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5,
303 19.5, 20.5, 30.5, 40.5 , 50.5 , 60.5 , 70.5 , 80.5 , 90.5 , 100.5,
304 200.5, 300.5, 400.5, 500.5, 600.5, 700.5, 800.5, 900.5, 1000.5, 2000.5,
305 3000.5, 4000.5, 5000.5, 6000.5, 7000.5, 8000.5, 9000.5, 10000.5 }; // forPbPb
306 Double_t binsPtTrackEventCorrDefault[38] = {0.,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,3.0,4.0,20.0,50.0};
307 Double_t binsPtDefault[69] = {
308 0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45,
309 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95,
310 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9,
311 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8,
312 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0,
313 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0,
314 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 40.0, 45.0, 50.0 };
316 Double_t binsEtaDefault[31] = {
317 -1.5, -1.4, -1.3, -1.2, -1.1, -1.0, -0.9, -0.8, -0.7, -0.6,
318 -0.5, -0.4, -0.3, -0.2, -0.1, 0.0, 0.1, 0.2, 0.3, 0.4,
319 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4,
322 Double_t binsZvDefault[13] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};
324 Double_t binsCentralityDefault[12] = {0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.};
326 Double_t* binsMult = binsMultDefault;
327 Double_t* binsPtTrackEventCorr = binsPtTrackEventCorrDefault;
328 Double_t* binsPt = binsPtDefault;
329 Double_t* binsEta = binsEtaDefault;
330 Double_t* binsZv = binsZvDefault;
331 Double_t* binsCentrality = binsCentralityDefault;
333 if (fMultNbins > 0) { multNbins = fMultNbins; binsMult = fBinsMult; }
334 if (fPtNbins > 0) { ptNbins = fPtNbins; binsPt = fBinsPt; }
335 if (fPtCorrNbins > 0) { ptNbinsTrackEventCorr = fPtCorrNbins; binsPtTrackEventCorr = fBinsPtCorr; }
336 if (fEtaNbins > 0) { etaNbins = fEtaNbins; binsEta = fBinsEta; }
337 if (fZvNbins > 0) { zvNbins = fZvNbins; binsZv = fBinsZv; }
338 if (fCentralityNbins > 0) { centralityBins = fCentralityNbins; binsCentrality = fBinsCentrality; }
340 Int_t binsTrackEventCorrMatrix[4]={zvNbins,ptNbinsTrackEventCorr,etaNbins,centralityBins};
341 Int_t binsTrackEvent[4]={zvNbins,ptNbins,etaNbins,centralityBins};
342 Int_t binsTrackPtCorrelationMatrix[4]={ptNbins,ptNbins,etaNbins,centralityBins};
345 fTrackPtCorrelationMatrix = new THnSparseF("fTrackPtCorrelationMatrix","Pt:mcPt:mcEta:Centrality",4,binsTrackPtCorrelationMatrix);
346 fTrackPtCorrelationMatrix->SetBinEdges(0,binsPt);
347 fTrackPtCorrelationMatrix->SetBinEdges(1,binsPt);
348 fTrackPtCorrelationMatrix->SetBinEdges(2,binsEta);
349 fTrackPtCorrelationMatrix->SetBinEdges(3,binsCentrality);
350 fTrackPtCorrelationMatrix->GetAxis(0)->SetTitle("Pt (GeV/c)");
351 fTrackPtCorrelationMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
352 fTrackPtCorrelationMatrix->GetAxis(2)->SetTitle("mcEta");
353 fTrackPtCorrelationMatrix->GetAxis(3)->SetTitle("Centrality");
354 fTrackPtCorrelationMatrix->Sumw2();
357 // Efficiency and contamination correction matrices
359 Int_t binsEventMatrix[3]={zvNbins,multNbins,centralityBins};
360 Double_t minEventMatrix[3]={-30.,-0.5,0.};
361 Double_t maxEventMatrix[3]={30.,10000.5,100.};
363 fGenEventMatrix = new THnSparseF("fGenEventMatrix","mcZv:multMB:Centrality",3,binsEventMatrix,minEventMatrix,maxEventMatrix);
364 fGenEventMatrix->SetBinEdges(0,binsZv);
365 fGenEventMatrix->SetBinEdges(1,binsMult);
366 fGenEventMatrix->SetBinEdges(2,binsCentrality);
367 fGenEventMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
368 fGenEventMatrix->GetAxis(1)->SetTitle("multiplicity MB");
369 fGenEventMatrix->GetAxis(2)->SetTitle("Centrality");
370 fGenEventMatrix->Sumw2();
372 fTriggerEventMatrix = new THnSparseF("fTriggerEventMatrix","mcZv:multMB:Centrality",3,binsEventMatrix,minEventMatrix,maxEventMatrix);
373 fTriggerEventMatrix->SetBinEdges(0,binsZv);
374 fTriggerEventMatrix->SetBinEdges(1,binsMult);
375 fTriggerEventMatrix->SetBinEdges(2,binsCentrality);
376 fTriggerEventMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
377 fTriggerEventMatrix->GetAxis(1)->SetTitle("multiplicity MB");
378 fTriggerEventMatrix->GetAxis(2)->SetTitle("Centrality");
379 fTriggerEventMatrix->Sumw2();
381 fRecEventMatrix = new THnSparseF("fRecEventMatrix","mcZv:multMB:Centrality",3,binsEventMatrix,minEventMatrix,maxEventMatrix);
382 fRecEventMatrix->SetBinEdges(0,binsZv);
383 fRecEventMatrix->SetBinEdges(1,binsMult);
384 fRecEventMatrix->SetBinEdges(2,binsCentrality);
385 fRecEventMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
386 fRecEventMatrix->GetAxis(1)->SetTitle("multiplicity MB");
387 fRecEventMatrix->GetAxis(2)->SetTitle("Centrality");
388 fRecEventMatrix->Sumw2();
391 // track to event corrections
393 fGenTrackEventMatrix = new THnSparseF("fGenTrackEventMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
394 fGenTrackEventMatrix->SetBinEdges(0,binsZv);
395 fGenTrackEventMatrix->SetBinEdges(1,binsPtTrackEventCorr);
396 fGenTrackEventMatrix->SetBinEdges(2,binsEta);
397 fGenTrackEventMatrix->SetBinEdges(3,binsCentrality);
398 fGenTrackEventMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
399 fGenTrackEventMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
400 fGenTrackEventMatrix->GetAxis(2)->SetTitle("mcEta");
401 fGenTrackEventMatrix->GetAxis(3)->SetTitle("Centrality");
402 fGenTrackEventMatrix->Sumw2();
404 fTriggerTrackEventMatrix = new THnSparseF("fTriggerTrackEventMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
405 fTriggerTrackEventMatrix->SetBinEdges(0,binsZv);
406 fTriggerTrackEventMatrix->SetBinEdges(1,binsPtTrackEventCorr);
407 fTriggerTrackEventMatrix->SetBinEdges(2,binsEta);
408 fTriggerTrackEventMatrix->SetBinEdges(3,binsCentrality);
409 fTriggerTrackEventMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
410 fTriggerTrackEventMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
411 fTriggerTrackEventMatrix->GetAxis(2)->SetTitle("mcEta");
412 fTriggerTrackEventMatrix->GetAxis(3)->SetTitle("Centrality");
413 fTriggerTrackEventMatrix->Sumw2();
415 fRecTrackEventMatrix = new THnSparseF("fRecTrackEventMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
416 fRecTrackEventMatrix->SetBinEdges(0,binsZv);
417 fRecTrackEventMatrix->SetBinEdges(1,binsPtTrackEventCorr);
418 fRecTrackEventMatrix->SetBinEdges(2,binsEta);
419 fRecTrackEventMatrix->SetBinEdges(3,binsCentrality);
420 fRecTrackEventMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
421 fRecTrackEventMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
422 fRecTrackEventMatrix->GetAxis(2)->SetTitle("mcEta");
423 fRecTrackEventMatrix->GetAxis(3)->SetTitle("Centrality");
424 fRecTrackEventMatrix->Sumw2();
427 // tracks correction matrices
429 fGenTrackMatrix = new THnSparseF("fGenTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
430 fGenTrackMatrix->SetBinEdges(0,binsZv);
431 fGenTrackMatrix->SetBinEdges(1,binsPtTrackEventCorr);
432 fGenTrackMatrix->SetBinEdges(2,binsEta);
433 fGenTrackMatrix->SetBinEdges(3,binsCentrality);
434 fGenTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
435 fGenTrackMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
436 fGenTrackMatrix->GetAxis(2)->SetTitle("mcEta");
437 fGenTrackMatrix->GetAxis(3)->SetTitle("Centrality");
438 fGenTrackMatrix->Sumw2();
440 fGenPrimTrackMatrix = new THnSparseF("fGenPrimTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
441 fGenPrimTrackMatrix->SetBinEdges(0,binsZv);
442 fGenPrimTrackMatrix->SetBinEdges(1,binsPtTrackEventCorr);
443 fGenPrimTrackMatrix->SetBinEdges(2,binsEta);
444 fGenPrimTrackMatrix->SetBinEdges(3,binsCentrality);
445 fGenPrimTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
446 fGenPrimTrackMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
447 fGenPrimTrackMatrix->GetAxis(2)->SetTitle("mcEta");
448 fGenPrimTrackMatrix->GetAxis(3)->SetTitle("Centrality");
449 fGenPrimTrackMatrix->Sumw2();
452 fRecPrimTrackMatrix = new THnSparseF("fRecPrimTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
453 fRecPrimTrackMatrix->SetBinEdges(0,binsZv);
454 fRecPrimTrackMatrix->SetBinEdges(1,binsPtTrackEventCorr);
455 fRecPrimTrackMatrix->SetBinEdges(2,binsEta);
456 fRecPrimTrackMatrix->SetBinEdges(3,binsCentrality);
457 fRecPrimTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
458 fRecPrimTrackMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
459 fRecPrimTrackMatrix->GetAxis(2)->SetTitle("mcEta");
460 fRecPrimTrackMatrix->GetAxis(3)->SetTitle("Centrality");
461 fRecPrimTrackMatrix->Sumw2();
464 fRecTrackMatrix = new THnSparseF("fRecTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
465 fRecTrackMatrix->SetBinEdges(0,binsZv);
466 fRecTrackMatrix->SetBinEdges(1,binsPtTrackEventCorr);
467 fRecTrackMatrix->SetBinEdges(2,binsEta);
468 fRecTrackMatrix->SetBinEdges(3,binsCentrality);
469 fRecTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
470 fRecTrackMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
471 fRecTrackMatrix->GetAxis(2)->SetTitle("mcEta");
472 fRecTrackMatrix->GetAxis(3)->SetTitle("Centrality");
473 fRecTrackMatrix->Sumw2();
475 fRecSecTrackMatrix = new THnSparseF("fRecSecTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
476 fRecSecTrackMatrix->SetBinEdges(0,binsZv);
477 fRecSecTrackMatrix->SetBinEdges(1,binsPtTrackEventCorr);
478 fRecSecTrackMatrix->SetBinEdges(2,binsEta);
479 fRecSecTrackMatrix->SetBinEdges(3,binsCentrality);
480 fRecSecTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
481 fRecSecTrackMatrix->GetAxis(1)->SetTitle("Pt (GeV/c)");
482 fRecSecTrackMatrix->GetAxis(2)->SetTitle("Eta");
483 fRecSecTrackMatrix->GetAxis(3)->SetTitle("Centrality");
484 fRecSecTrackMatrix->Sumw2();
487 fRecMultTrackMatrix = new THnSparseF("fRecMultTrackMatrix","mcZv:mcPt:mcEta:Centrality",4,binsTrackEventCorrMatrix);
488 fRecMultTrackMatrix->SetBinEdges(0,binsZv);
489 fRecMultTrackMatrix->SetBinEdges(1,binsPtTrackEventCorr);
490 fRecMultTrackMatrix->SetBinEdges(2,binsEta);
491 fRecMultTrackMatrix->SetBinEdges(3,binsCentrality);
492 fRecMultTrackMatrix->GetAxis(0)->SetTitle("mcZv (cm)");
493 fRecMultTrackMatrix->GetAxis(1)->SetTitle("mcPt (GeV/c)");
494 fRecMultTrackMatrix->GetAxis(2)->SetTitle("mcEta");
495 fRecMultTrackMatrix->GetAxis(3)->SetTitle("Centrality");
496 fRecMultTrackMatrix->Sumw2();
499 // Control analysis histograms
501 Int_t binsMCEventHist1[4]={100,100,zvNbins,centralityBins};
502 Double_t minMCEventHist1[4]={-0.1,-0.1,-30.,0.};
503 Double_t maxMCEventHist1[4]={0.1,0.1,30.,100.};
504 fMCEventHist1 = new THnSparseF("fMCEventHist1","mcXv:mcYv:mcZv:Centrality",4,binsMCEventHist1,minMCEventHist1,maxMCEventHist1);
505 fMCEventHist1->SetBinEdges(2,binsZv);
506 fMCEventHist1->SetBinEdges(3,binsCentrality);
507 fMCEventHist1->GetAxis(0)->SetTitle("mcXv (cm)");
508 fMCEventHist1->GetAxis(1)->SetTitle("mcYv (cm)");
509 fMCEventHist1->GetAxis(2)->SetTitle("mcZv (cm)");
510 fMCEventHist1->GetAxis(3)->SetTitle("Centrality");
511 fMCEventHist1->Sumw2();
514 Int_t binsRecEventHist1[4]={100,100,zvNbins,centralityBins};
515 Double_t minRecEventHist1[4]={-3.,-3.,-30.,0.};
516 Double_t maxRecEventHist1[4]={3.,3.,30.,100.};
518 fRecEventHist1 = new THnSparseF("fRecEventHist1","Xv:Yv:Zv:Centrality",4,binsRecEventHist1,minRecEventHist1,maxRecEventHist1);
519 fRecEventHist1->SetBinEdges(2,binsZv);
520 fRecEventHist1->SetBinEdges(3,binsCentrality);
521 fRecEventHist1->GetAxis(0)->SetTitle("Xv (cm)");
522 fRecEventHist1->GetAxis(1)->SetTitle("Yv (cm)");
523 fRecEventHist1->GetAxis(2)->SetTitle("Zv (cm)");
524 fRecEventHist1->GetAxis(3)->SetTitle("Centrality");
525 fRecEventHist1->Sumw2();
528 Int_t binsRecEventHist2[3]={zvNbins, multNbins, centralityBins};
529 Double_t minRecEventHist2[3]={-30., -0.5, 0.};
530 Double_t maxRecEventHist2[3]={30., 10000.5, 100.};
532 fRecEventHist2 = new THnSparseF("fRecEventHist2","Zv:multMB:Centrality",3,binsRecEventHist2,minRecEventHist2,maxRecEventHist2);
533 fRecEventHist2->SetBinEdges(0,binsZv);
534 fRecEventHist2->SetBinEdges(1,binsMult);
535 fRecEventHist2->SetBinEdges(2,binsCentrality);
536 fRecEventHist2->GetAxis(0)->SetTitle("Zv (cm)");
537 fRecEventHist2->GetAxis(1)->SetTitle("multiplicity MB");
538 fRecEventHist2->GetAxis(2)->SetTitle("Centrality");
539 fRecEventHist2->Sumw2();
542 Double_t kFact = 0.1;
543 Int_t binsRecMCEventHist1[4]={100,100,100, centralityBins};
544 Double_t minRecMCEventHist1[4]={-10.0*kFact,-10.0*kFact,-10.0*kFact, 0.};
545 Double_t maxRecMCEventHist1[4]={10.0*kFact,10.0*kFact,10.0*kFact, 100.};
547 fRecMCEventHist1 = new THnSparseF("fRecMCEventHist1","Xv-mcXv:Yv-mcYv:Zv-mcZv:Centrality",4,binsRecMCEventHist1,minRecMCEventHist1,maxRecMCEventHist1);
548 fRecMCEventHist1->SetBinEdges(3,binsCentrality);
549 fRecMCEventHist1->GetAxis(0)->SetTitle("Xv-mcXv (cm)");
550 fRecMCEventHist1->GetAxis(1)->SetTitle("Yv-mcYv (cm)");
551 fRecMCEventHist1->GetAxis(2)->SetTitle("Zv-mcZv (cm)");
552 fRecMCEventHist1->GetAxis(3)->SetTitle("Centrality");
554 fRecMCEventHist1->Sumw2();
557 Int_t binsRecMCEventHist2[4]={100,100,multNbins, centralityBins};
558 Double_t minRecMCEventHist2[4]={-10.0*kFact,-10.0*kFact,-0.5, 0.};
559 Double_t maxRecMCEventHist2[4]={10.0*kFact,10.0*kFact,10000.5, 100.};
561 fRecMCEventHist2 = new THnSparseF("fRecMCEventHist2","Xv-mcXv:Zv-mcZv:mult:Centrality",4,binsRecMCEventHist2,minRecMCEventHist2,maxRecMCEventHist2);
562 fRecMCEventHist2->SetBinEdges(2,binsMult);
563 fRecMCEventHist2->SetBinEdges(3,binsCentrality);
564 fRecMCEventHist2->GetAxis(0)->SetTitle("Xv-mcXv (cm)");
565 fRecMCEventHist2->GetAxis(1)->SetTitle("Zv-mcZv (cm)");
566 fRecMCEventHist2->GetAxis(2)->SetTitle("multiplicity");
567 fRecMCEventHist2->GetAxis(3)->SetTitle("Centrality");
568 fRecMCEventHist2->Sumw2();
572 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++)
574 // THnSparse track histograms
576 Int_t binsMCTrackHist1[4]= {ptNbins, etaNbins, 90, centralityBins};
577 Double_t minMCTrackHist1[4]={0.,-1.5,0., 0.};
578 Double_t maxMCTrackHist1[4]={50,1.5,2.*TMath::Pi(), 100.};
579 sprintf(name,"fMCTrackHist1_%d",i);
580 sprintf(title,"mcPt:mcEta:mcPhi:Centrality");
582 fMCTrackHist1[i] = new THnSparseF(name,title,4,binsMCTrackHist1,minMCTrackHist1,maxMCTrackHist1);
583 fMCTrackHist1[i]->SetBinEdges(0,binsPt);
584 fMCTrackHist1[i]->SetBinEdges(1,binsEta);
585 fMCTrackHist1[i]->SetBinEdges(3,binsCentrality);
586 fMCTrackHist1[i]->GetAxis(0)->SetTitle("mcPt (GeV/c)");
587 fMCTrackHist1[i]->GetAxis(1)->SetTitle("mcEta");
588 fMCTrackHist1[i]->GetAxis(2)->SetTitle("mcPhi (rad)");
589 fMCTrackHist1[i]->GetAxis(3)->SetTitle("Centrality");
590 fMCTrackHist1[i]->Sumw2();
592 Int_t binsMCPrimTrackHist1[6]= {ptNbins,etaNbins,6,20,4000, centralityBins};
593 Double_t minMCPrimTrackHist1[6]={0.,-1.5,0.,0.,0., 0.};
594 Double_t maxMCPrimTrackHist1[6]={50.,1.5,6.,20.,4000., 100.};
595 sprintf(name,"fMCPrimTrackHist1_%d",i);
596 sprintf(title,"mcPt:mcEta:pid:mech:mother:Centrality");
598 fMCPrimTrackHist1[i] = new THnSparseF(name,title,6,binsMCPrimTrackHist1,minMCPrimTrackHist1,maxMCPrimTrackHist1);
599 fMCPrimTrackHist1[i]->SetBinEdges(0,binsPt);
600 fMCPrimTrackHist1[i]->SetBinEdges(1,binsEta);
601 fMCPrimTrackHist1[i]->SetBinEdges(5,binsCentrality);
602 fMCPrimTrackHist1[i]->GetAxis(0)->SetTitle("mcPt (GeV/c)");
603 fMCPrimTrackHist1[i]->GetAxis(1)->SetTitle("mcEta");
604 fMCPrimTrackHist1[i]->GetAxis(2)->SetTitle("pid");
605 fMCPrimTrackHist1[i]->GetAxis(3)->SetTitle("mech");
606 fMCPrimTrackHist1[i]->GetAxis(4)->SetTitle("mother");
607 fMCPrimTrackHist1[i]->GetAxis(5)->SetTitle("Centrality");
608 fMCPrimTrackHist1[i]->Sumw2();
610 Int_t binsMCPrimTrackHist2[4]= {4000,20,4000,centralityBins};
611 Double_t minMCPrimTrackHist2[4]={0.,0.,0., 0.};
612 Double_t maxMCPrimTrackHist2[4]={4000.,20.,4000., 100.};
613 sprintf(name,"fMCPrimTrackHist2_%d",i);
614 sprintf(title,"pdg:mech:mother:Centrality");
616 fMCPrimTrackHist2[i] = new THnSparseF(name,title,4,binsMCPrimTrackHist2,minMCPrimTrackHist2,maxMCPrimTrackHist2);
617 fMCPrimTrackHist2[i]->SetBinEdges(3,binsCentrality);
618 fMCPrimTrackHist2[i]->GetAxis(0)->SetTitle("pdg");
619 fMCPrimTrackHist2[i]->GetAxis(1)->SetTitle("mech");
620 fMCPrimTrackHist2[i]->GetAxis(2)->SetTitle("mother");
621 fMCPrimTrackHist2[i]->GetAxis(3)->SetTitle("Centrality");
622 fMCPrimTrackHist2[i]->Sumw2();
624 Int_t binsMCSecTrackHist1[6]= {ptNbins,etaNbins,6,20,4000, centralityBins};
625 Double_t minMCSecTrackHist1[6]={0.,-1.5,0.,0.,0., 0.};
626 Double_t maxMCSecTrackHist1[6]={50.,1.5,6.,20.,4000., 100.};
627 sprintf(name,"fMCSecTrackHist1_%d",i);
628 sprintf(title,"mcPt:mcEta:pid:mech:mother:Centrality");
630 fMCSecTrackHist1[i] = new THnSparseF(name,title,6,binsMCSecTrackHist1,minMCSecTrackHist1,maxMCSecTrackHist1);
631 fMCSecTrackHist1[i]->SetBinEdges(0,binsPt);
632 fMCSecTrackHist1[i]->SetBinEdges(1,binsEta);
633 fMCSecTrackHist1[i]->SetBinEdges(5,binsCentrality);
634 fMCSecTrackHist1[i]->GetAxis(0)->SetTitle("mcPt (GeV/c)");
635 fMCSecTrackHist1[i]->GetAxis(1)->SetTitle("mcEta");
636 fMCSecTrackHist1[i]->GetAxis(2)->SetTitle("pid");
637 fMCSecTrackHist1[i]->GetAxis(3)->SetTitle("mech");
638 fMCSecTrackHist1[i]->GetAxis(4)->SetTitle("mother");
639 fMCSecTrackHist1[i]->GetAxis(5)->SetTitle("Centrality");
640 fMCSecTrackHist1[i]->Sumw2();
642 Int_t binsRecTrackHist1[4]={ptNbins,etaNbins,90, centralityBins};
643 Double_t minRecTrackHist1[4]={0.,-1.5,0., 0.};
644 Double_t maxRecTrackHist1[4]={50.,1.5,2.*TMath::Pi(), 100.};
645 sprintf(name,"fRecTrackHist1_%d",i);
646 sprintf(title,"Pt:Eta:Phi:Centrality");
647 fRecTrackHist1[i] = new THnSparseF(name,title,4,binsRecTrackHist1,minRecTrackHist1,maxRecTrackHist1);
648 fRecTrackHist1[i]->SetBinEdges(0,binsPt);
649 fRecTrackHist1[i]->SetBinEdges(1,binsEta);
650 fRecTrackHist1[i]->SetBinEdges(3,binsCentrality);
651 fRecTrackHist1[i]->GetAxis(0)->SetTitle("p_{T} (GeV/c)");
652 fRecTrackHist1[i]->GetAxis(1)->SetTitle("#eta");
653 fRecTrackHist1[i]->GetAxis(2)->SetTitle("#phi (rad)");
654 fRecTrackHist1[i]->GetAxis(3)->SetTitle("Centrality");
655 fRecTrackHist1[i]->Sumw2();
657 sprintf(name,"fRecTrackHist2_%d",i);
658 sprintf(title,"Zv:Pt:Eta:Centrality");
659 fRecTrackHist2[i] = new THnSparseF(name,title,4,binsTrackEvent);
660 fRecTrackHist2[i]->SetBinEdges(0,binsZv);
661 fRecTrackHist2[i]->SetBinEdges(1,binsPt);
662 fRecTrackHist2[i]->SetBinEdges(2,binsEta);
663 fRecTrackHist2[i]->SetBinEdges(3,binsCentrality);
664 fRecTrackHist2[i]->GetAxis(0)->SetTitle("Zv (cm)");
665 fRecTrackHist2[i]->GetAxis(1)->SetTitle("p_{T} (GeV/c)");
666 fRecTrackHist2[i]->GetAxis(2)->SetTitle("#eta");
667 fRecTrackHist2[i]->GetAxis(3)->SetTitle("Centrality");
668 fRecTrackHist2[i]->Sumw2();
671 Int_t binsRecTrackMultHist1[3]={ptNbins,multNbins, centralityBins};
672 Double_t minRecTrackMultHist1[3]={0.,-0.5, -0.};
673 Double_t maxRecTrackMultHist1[3]={50.,10000.5, 100.};
674 sprintf(name,"fRecTrackMultHist_%d",i);
675 sprintf(title,"Pt:Mult:Centrality");
676 fRecTrackMultHist1[i] = new THnSparseF(name,title,3,binsRecTrackMultHist1,minRecTrackMultHist1,maxRecTrackMultHist1);
677 fRecTrackMultHist1[i]->SetBinEdges(0,binsPt);
678 fRecTrackMultHist1[i]->SetBinEdges(1,binsMult);
679 fRecTrackMultHist1[i]->SetBinEdges(2,binsCentrality);
680 fRecTrackMultHist1[i]->GetAxis(0)->SetTitle("Pt (GeV/c)");
681 fRecTrackMultHist1[i]->GetAxis(1)->SetTitle("multiplicity");
682 fRecTrackMultHist1[i]->GetAxis(2)->SetTitle("Centrality");
683 fRecTrackMultHist1[i]->Sumw2();
686 Int_t binsRecMCTrackHist1[5] = {ptNbins,etaNbins,100,100, centralityBins};
687 Double_t minRecMCTrackHist1[5]={0.,-1.5,-0.5,-0.5, 0.};
688 Double_t maxRecMCTrackHist1[5]={50.,1.5,0.5,0.5, 100.};
690 sprintf(name,"fRecMCTrackHist1");
691 sprintf(title,"mcPt:mcEta:(Pt-mcPt)/mcPt:(Eta-mcEta):Centrality");
692 fRecMCTrackHist1 = new THnSparseF(name,title,5,binsRecMCTrackHist1,minRecMCTrackHist1,maxRecMCTrackHist1);
693 fRecMCTrackHist1->SetBinEdges(0,binsPt);
694 fRecMCTrackHist1->SetBinEdges(1,binsEta);
695 fRecMCTrackHist1->SetBinEdges(4,binsCentrality);
696 fRecMCTrackHist1->GetAxis(0)->SetTitle("mcPt (GeV/c)");
697 fRecMCTrackHist1->GetAxis(1)->SetTitle("mcEta");
698 fRecMCTrackHist1->GetAxis(2)->SetTitle("(Pt-mcPt)/mcPt");
699 fRecMCTrackHist1->GetAxis(3)->SetTitle("Eta-mcEta");
700 fRecMCTrackHist1->GetAxis(4)->SetTitle("Centrality");
702 Int_t binsMCMultRecTrackHist1[4] = {ptNbins,etaNbins,6, centralityBins};
703 Double_t minMCMultRecTrackHist1[4]={0.,-1.5,0., 0.};
704 Double_t maxMCMultRecTrackHist1[4]={50.,1.5,6., 100.};
705 sprintf(name,"fMCMultRecTrackHist1");
706 sprintf(title,"mcPt:mcEta:pid:Centrality");
707 fMCMultRecTrackHist1 = new THnSparseF(name,title,4,binsMCMultRecTrackHist1,minMCMultRecTrackHist1,maxMCMultRecTrackHist1);
708 fMCMultRecTrackHist1->SetBinEdges(0,binsPt);
709 fMCMultRecTrackHist1->SetBinEdges(1,binsEta);
710 fMCMultRecTrackHist1->SetBinEdges(3,binsCentrality);
711 fMCMultRecTrackHist1->GetAxis(0)->SetTitle("mcPt (GeV/c)");
712 fMCMultRecTrackHist1->GetAxis(1)->SetTitle("mcEta");
713 fMCMultRecTrackHist1->GetAxis(2)->SetTitle("pid");
714 fMCMultRecTrackHist1->GetAxis(3)->SetTitle("Centrality");
716 //nClust:chi2PerClust:pt:eta:phi:Centrality
717 Int_t binsRecTrackHist3[6]={160,100,ptNbins,etaNbins,90, centralityBins};
718 Double_t minRecTrackHist3[6]={0., 0., 0., -1.5, 0., 0.};
719 Double_t maxRecRecTrackHist3[6]={160.,10., 50., 1.5, 2.*TMath::Pi(), 100.};
721 fRecTrackHist3 = new THnSparseF("fRecTrackHist3","nClust:chi2PerClust:pt:eta:phi:Centrality",6,binsRecTrackHist3,minRecTrackHist3,maxRecRecTrackHist3);
722 fRecTrackHist3->SetBinEdges(2,binsPt);
723 fRecTrackHist3->SetBinEdges(3,binsEta);
724 fRecTrackHist3->SetBinEdges(5,binsCentrality);
725 fRecTrackHist3->GetAxis(0)->SetTitle("nClust");
726 fRecTrackHist3->GetAxis(1)->SetTitle("chi2PerClust");
727 fRecTrackHist3->GetAxis(2)->SetTitle("p_{T} (GeV/c)");
728 fRecTrackHist3->GetAxis(3)->SetTitle("#eta");
729 fRecTrackHist3->GetAxis(4)->SetTitle("#phi (rad)");
730 fRecTrackHist3->GetAxis(5)->SetTitle("Centrality");
731 fRecTrackHist3->Sumw2();
735 fAnalysisFolder = CreateFolder("folderdNdPt","Analysis dNdPt Folder");
737 // init trigger analysis (for zdc cut)
738 fTriggerAnalysis = new AliTriggerAnalysis;
744 //_____________________________________________________________________________
745 void AlidNdPtAnalysisPbPb::Process(AliESDEvent *const esdEvent, AliMCEvent *const mcEvent)
747 // init if not done already
748 if (!fIsInit) { Init(); }
750 // Process real and/or simulated events
753 AliDebug(AliLog::kError, "esdEvent not available");
757 // get selection cuts
758 AlidNdPtEventCuts *evtCuts = GetEventCuts();
759 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
760 AlidNdPtAcceptanceCuts *recCuts = GetRecAcceptanceCuts();
761 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
763 if(!evtCuts || !accCuts || !esdTrackCuts) {
764 AliDebug(AliLog::kError, "cuts not available");
767 if (0 == recCuts) { recCuts = accCuts;}
770 Bool_t isEventTriggered = kTRUE;
771 AliPhysicsSelection *physicsSelection = NULL;
772 AliTriggerAnalysis* triggerAnalysis = NULL;
775 AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
778 Printf("ERROR: Could not receive input handler");
782 if(evtCuts->IsTriggerRequired())
785 isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
787 physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
788 if(!physicsSelection) return;
789 //SetPhysicsTriggerSelection(physicsSelection);
791 if (isEventTriggered) {
792 // set trigger (V0AND)
793 triggerAnalysis = physicsSelection->GetTriggerAnalysis();
794 if(!triggerAnalysis) return;
795 isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
801 Bool_t isEventTriggered = kTRUE;
802 AliPhysicsSelection *trigSel = NULL;
803 AliTriggerAnalysis *trigAna = NULL;
805 if(evtCuts->IsTriggerRequired())
808 trigSel = GetPhysicsTriggerSelection();
810 printf("cannot get trigSel \n");
817 trigSel->SetAnalyzeMC();
820 isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);
822 if(GetTrigger() == AliTriggerAnalysis::kV0AND)
824 trigAna = trigSel->GetTriggerAnalysis();
828 isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());
829 }//if(GetTrigger() == AliTriggerAnalysis::kV0AND)
831 }//if(evtCuts->IsTriggerRequired())
834 // centrality determination
835 Float_t centralityF = 0;
836 AliCentrality *esdCentrality = esdEvent->GetCentrality();
837 centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
838 if (centralityF == 0.) {
843 // use MC information
844 AliHeader* header = 0;
845 AliGenEventHeader* genHeader = 0;
849 Int_t multMCTrueTracks = 0;
854 AliDebug(AliLog::kError, "mcEvent not available");
857 // get MC event header
858 header = mcEvent->Header();
860 AliDebug(AliLog::kError, "Header not available");
864 stack = mcEvent->Stack();
866 AliDebug(AliLog::kError, "Stack not available");
871 genHeader = header->GenEventHeader();
873 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
876 genHeader->PrimaryVertex(vtxMC);
878 Double_t vMCEventHist1[4]={vtxMC[0],vtxMC[1],vtxMC[2],centralityF};
879 fMCEventHist1->Fill(vMCEventHist1);
881 // multipliticy of all MC primary tracks
882 // in Zv, pt and eta ranges)
883 multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
887 // get reconstructed vertex
888 const AliESDVertex* vtxESD = 0;
889 if(evtCuts->IsRecVertexRequired())
891 if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
892 vtxESD = esdEvent->GetPrimaryVertexTPC();
894 else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
895 vtxESD = esdEvent->GetPrimaryVertexTracks();
902 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD);
903 //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
904 //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
906 // vertex contributors
907 Int_t multMBTracks = 0;
908 if(GetAnalysisMode() == AlidNdPtHelper::kTPC)
910 if(vtxESD->GetStatus()) {
911 multMBTracks = vtxESD->GetNContributors();
914 else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
915 if(vtxESD->GetStatus()) {
916 multMBTracks = vtxESD->GetNContributors();
920 AliDebug(AliLog::kError, Form("Found analysis type %d", GetAnalysisMode()));
924 TObjArray *allChargedTracks=0;
925 //Int_t multAll=0, multAcc=0, multRec=0;
926 Int_t multAll=0, multRec=0;
927 Int_t *labelsAll=0, *labelsAcc=0, *labelsRec=0;
930 if(isEventOK && isEventTriggered)
933 // get all charged tracks
934 allChargedTracks = AlidNdPtHelper::GetAllChargedTracks(esdEvent,GetAnalysisMode());
935 if(!allChargedTracks) return;
937 Int_t entries = allChargedTracks->GetEntries();
939 labelsAll = new Int_t[entries];
940 labelsAcc = new Int_t[entries];
941 labelsRec = new Int_t[entries];
942 for(Int_t i=0; i<entries;++i)
944 AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);
947 if(track->Charge()==0) continue;
950 // only postive charged
951 if(GetParticleMode() == AlidNdPtHelper::kPlus && track->Charge() < 0)
954 // only negative charged
955 if(GetParticleMode() == AlidNdPtHelper::kMinus && track->Charge() > 0)
959 Double_t values[4] = {vtxESD->GetZv(),track->Pt(),track->Eta(), centralityF};
961 fRecTrackHist2[AlidNdPtHelper::kAllTracks]->Fill(values);
962 FillHistograms(track,stack,AlidNdPtHelper::kAllTracks,centralityF);
963 labelsAll[multAll] = TMath::Abs(track->GetLabel());
966 if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track) && recCuts->AcceptTrack(track)) {
968 fRecTrackHist2[AlidNdPtHelper::kRecTracks]->Fill(values);
969 FillHistograms(track,stack,AlidNdPtHelper::kRecTracks,centralityF);
970 labelsRec[multRec] = TMath::Abs(track->GetLabel());
978 // fill track multiplicity histograms
979 //FillHistograms(allChargedTracks,labelsAll,multAll,labelsAcc,multAcc,labelsRec,multRec);
981 Double_t vRecEventHist1[4] = {vtxESD->GetXv(),vtxESD->GetYv(),vtxESD->GetZv(),centralityF};
982 fRecEventHist1->Fill(vRecEventHist1);
984 Double_t vRecEventHist2[3] = {vtxESD->GetZv(),multMBTracks,centralityF};
985 fRecEventHist2->Fill(vRecEventHist2);
987 } // triggered and event vertex
992 //Double_t vMultTrueEventMatrix[2] = { multRec, multMCTrueTracks };
995 // event level corrections (zv,N_MB)
998 Double_t vEventMatrix[3] = {vtxMC[2],multMBTracks,centralityF};
999 fGenEventMatrix->Fill(vEventMatrix);
1000 if(isEventTriggered) fTriggerEventMatrix->Fill(vEventMatrix);
1001 if(isEventOK && isEventTriggered) fRecEventMatrix->Fill(vEventMatrix);
1004 // track-event level corrections (zv,pt,eta)
1006 for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc)
1008 TParticle* particle = stack->Particle(iMc);
1012 // only charged particles
1013 if(!particle->GetPDG()) continue;
1014 Double_t charge = particle->GetPDG()->Charge()/3.;
1015 if ( TMath::Abs(charge) < 0.001 )
1018 // only postive charged
1019 if(GetParticleMode() == AlidNdPtHelper::kPlus && charge < 0.)
1022 // only negative charged
1023 if(GetParticleMode() == AlidNdPtHelper::kMinus && charge > 0.)
1027 Bool_t prim = stack->IsPhysicalPrimary(iMc);
1031 if(accCuts->AcceptTrack(particle))
1033 Double_t vTrackEventMatrix[4] = {vtxMC[2], particle->Pt(), particle->Eta(), centralityF};
1034 fGenTrackEventMatrix->Fill(vTrackEventMatrix);
1036 if(!isEventTriggered) continue;
1037 fTriggerTrackEventMatrix->Fill(vTrackEventMatrix);
1039 if(!isEventOK) continue;
1040 fRecTrackEventMatrix->Fill(vTrackEventMatrix);
1042 }// if(accCuts->AcceptTrack(particle))
1043 }// for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc)
1046 // track-level corrections (zv,pt,eta)
1048 if(isEventOK && isEventTriggered)
1051 // fill MC and rec event control histograms
1053 Double_t vRecMCEventHist1[4] = {vtxESD->GetXv()-vtxMC[0],vtxESD->GetYv()-vtxMC[1],vtxESD->GetZv()-vtxMC[2], centralityF};
1054 fRecMCEventHist1->Fill(vRecMCEventHist1);//
1056 Double_t vRecMCEventHist2[4] = {vtxESD->GetXv()-vtxMC[0],vtxESD->GetZv()-vtxMC[2],multMBTracks, centralityF};
1057 fRecMCEventHist2->Fill(vRecMCEventHist2);
1062 // MC histograms for track efficiency studies
1064 for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc)
1066 TParticle* particle = stack->Particle(iMc);
1070 Double_t vTrackMatrix[4] = {vtxMC[2],particle->Pt(),particle->Eta(),centralityF};
1072 // only charged particles
1073 if(!particle->GetPDG()) continue;
1074 Double_t charge = particle->GetPDG()->Charge()/3.;
1075 if (TMath::Abs(charge) < 0.001)
1078 // only postive charged
1079 if(GetParticleMode() == AlidNdPtHelper::kPlus && charge < 0.)
1082 // only negative charged
1083 if(GetParticleMode() == AlidNdPtHelper::kMinus && charge > 0.)
1087 Bool_t prim = stack->IsPhysicalPrimary(iMc);
1090 if(accCuts->AcceptTrack(particle))
1093 if( AlidNdPtHelper::IsPrimaryParticle(stack, iMc, GetParticleMode()) )
1094 fGenPrimTrackMatrix->Fill(vTrackMatrix);
1096 // fill control histograms
1098 FillHistograms(stack,iMc,AlidNdPtHelper::kAccTracks, centralityF);
1100 // check multiple found tracks
1101 Int_t multCount = 0;
1102 for(Int_t iRec=0; iRec<multRec; ++iRec)
1104 if(iMc == labelsRec[iRec])
1109 fRecMultTrackMatrix->Fill(vTrackMatrix);
1111 // fill control histogram
1113 Int_t pid = AlidNdPtHelper::ConvertPdgToPid(particle);
1114 Double_t vMCMultRecTrackHist1[4] = {particle->Pt(), particle->Eta(), pid, centralityF};
1115 fMCMultRecTrackHist1->Fill(vMCMultRecTrackHist1);
1121 // check reconstructed
1122 for(Int_t iRec=0; iRec<multRec; ++iRec)
1124 if(iMc == labelsRec[iRec])
1126 fRecTrackMatrix->Fill(vTrackMatrix);
1128 if( AlidNdPtHelper::IsPrimaryParticle(stack, iMc, GetParticleMode()) ) {
1129 fRecPrimTrackMatrix->Fill(vTrackMatrix);
1131 if(!prim) fRecSecTrackMatrix->Fill(vTrackMatrix);
1133 // fill control histograms
1135 FillHistograms(stack,iMc,AlidNdPtHelper::kRecTracks, centralityF);
1138 }//if(iMc == labelsRec[iRec])
1145 if(allChargedTracks) delete allChargedTracks; allChargedTracks = 0;
1146 if(labelsAll) delete [] labelsAll; labelsAll = 0;
1147 if(labelsAcc) delete [] labelsAcc; labelsAcc = 0;
1148 if(labelsRec) delete [] labelsRec; labelsRec = 0;
1150 if(!evtCuts->IsRecVertexRequired() && vtxESD != NULL) delete vtxESD;
1154 //_____________________________________________________________________________
1155 void AlidNdPtAnalysisPbPb::FillHistograms(TObjArray *const allChargedTracks,Int_t *const labelsAll,Int_t multAll,Int_t *const labelsAcc,Int_t multAcc,Int_t *const labelsRec,Int_t multRec, Float_t centralityF) {
1156 // multiplicity histograms
1159 if(!allChargedTracks) return;
1160 if(!labelsAll) return;
1161 if(!labelsAcc) return;
1162 if(!labelsRec) return;
1164 Int_t entries = allChargedTracks->GetEntries();
1165 for(Int_t i=0; i<entries; ++i)
1167 AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);
1168 if(!track) continue;
1169 if(track->Charge() == 0) continue;
1171 Int_t label = TMath::Abs(track->GetLabel());
1172 for(Int_t iAll=0; iAll<multAll; ++iAll) {
1173 if(label == labelsAll[iAll]) {
1174 Double_t v1[3] = {track->Pt(), multAll, centralityF};
1175 fRecTrackMultHist1[AlidNdPtHelper::kAllTracks]->Fill(v1);
1178 for(Int_t iAcc=0; iAcc<multAcc; ++iAcc) {
1179 if(label == labelsAcc[iAcc]) {
1180 Double_t v2[3] = {track->Pt(), multAcc, centralityF};
1181 fRecTrackMultHist1[AlidNdPtHelper::kAccTracks]->Fill(v2);
1184 for(Int_t iRec=0; iRec<multRec; ++iRec) {
1185 if(label == labelsRec[iRec]) {
1186 Double_t v3[3] = {track->Pt(), multRec, centralityF};
1187 fRecTrackMultHist1[AlidNdPtHelper::kRecTracks]->Fill(v3);
1193 //_____________________________________________________________________________
1194 void AlidNdPtAnalysisPbPb::FillHistograms(AliESDtrack *const esdTrack, AliStack *const stack, AlidNdPtHelper::TrackObject trackObj, Float_t centralityF)
1198 // Fill ESD track and MC histograms
1200 if(!esdTrack) return;
1202 Float_t q = esdTrack->Charge();
1203 if(TMath::Abs(q) < 0.001) return;
1205 Float_t pt = esdTrack->Pt();
1206 Float_t eta = esdTrack->Eta();
1207 Float_t phi = esdTrack->Phi();
1209 Float_t dca[2], bCov[3];
1210 esdTrack->GetImpactParameters(dca,bCov);
1212 Int_t nClust = esdTrack->GetTPCclusters(0);
1213 Float_t chi2PerCluster = 0.;
1214 if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2()/Float_t(nClust);
1218 Double_t values[4] = {pt,eta,phi,centralityF};
1219 fRecTrackHist1[trackObj]->Fill(values);
1222 // Fill rec vs MC information
1226 Int_t label = TMath::Abs(esdTrack->GetLabel());
1227 //if(label == 0) return;
1229 TParticle* particle = stack->Particle(label);
1230 if(!particle) return;
1232 Int_t motherPdg = -1;
1233 TParticle* mother = 0;
1235 //TParticle* prim_mother = AlidNdPtHelper::FindPrimaryMother(stack,label);
1236 Int_t motherLabel = particle->GetMother(0);
1237 if(motherLabel>0) mother = stack->Particle(motherLabel);
1238 if(mother) motherPdg = TMath::Abs(mother->GetPdgCode()); // take abs for visualisation only
1239 //Int_t mech = particle->GetUniqueID(); // production mechanism
1241 if(!particle->GetPDG()) return;
1242 Double_t gq = particle->GetPDG()->Charge()/3.0; // Charge units |e|/3
1243 if(TMath::Abs(gq)<0.001) return;
1244 Float_t gpt = particle->Pt();
1245 Float_t geta = particle->Eta();
1248 //printf("pt %f, gpt %f \n",pt,gpt);
1249 if(gpt) dpt = (pt-gpt)/gpt;
1250 Double_t deta = (eta-geta);
1253 if(trackObj == AlidNdPtHelper::kRecTracks) //RecTracks???
1255 Double_t vTrackPtCorrelationMatrix[4]={pt,gpt,geta,centralityF};
1256 fTrackPtCorrelationMatrix->Fill(vTrackPtCorrelationMatrix);
1258 Double_t vRecMCTrackHist1[5]={gpt,geta,dpt,deta,centralityF};
1259 fRecMCTrackHist1->Fill(vRecMCTrackHist1);
1263 //_____________________________________________________________________________
1264 void AlidNdPtAnalysisPbPb::FillHistograms(AliStack *const stack, Int_t label, AlidNdPtHelper::TrackObject trackObj, Float_t centralityF)
1267 // Fill MC histograms
1270 TParticle* particle = stack->Particle(label);
1271 if(!particle) return;
1273 Int_t motherPdg = -1;
1274 TParticle* mother = 0;
1276 //TParticle* prim_mother = AlidNdPtHelper::FindPrimaryMother(stack,label);
1277 Int_t motherLabel = particle->GetMother(0);
1278 if(motherLabel>0) mother = stack->Particle(motherLabel);
1279 if(mother) motherPdg = TMath::Abs(mother->GetPdgCode()); // take abs for visualisation only
1280 Int_t mech = particle->GetUniqueID(); // production mechanism
1282 if(!particle->GetPDG()) return;
1283 Double_t gq = particle->GetPDG()->Charge()/3.0; // Charge units |e|/3
1284 if(TMath::Abs(gq) < 0.001) return;
1286 Float_t gpt = particle->Pt();
1287 //Float_t qgpt = particle->Pt() * gq;
1288 Float_t geta = particle->Eta();
1289 Float_t gphi = particle->Phi();
1290 //Float_t gpz = particle->Pz();
1292 Bool_t prim = stack->IsPhysicalPrimary(label);
1293 //Float_t vx = particle->Vx(); Float_t vy = particle->Vy(); Float_t vz = particle->Vz();
1295 Int_t pid = AlidNdPtHelper::ConvertPdgToPid(particle);
1297 //if(prim&&pid==5) printf("pdgcode %d, production mech %d \n",particle->GetPdgCode(),mech);
1298 //if(!prim) printf("motherPdg %d, particle %d, production mech %d\n",motherPdg, particle->GetPdgCode(),mech);
1303 Double_t vMCTrackHist1[4] = {gpt,geta,gphi,centralityF};
1304 fMCTrackHist1[trackObj]->Fill(vMCTrackHist1);
1306 Double_t vMCPrimTrackHist1[6] = {gpt,geta,pid,mech,motherPdg,centralityF};
1307 Double_t vMCPrimTrackHist2[4] = {TMath::Abs(particle->GetPdgCode()),mech,motherPdg,centralityF};
1309 //if(prim && AliPWG0Helper::IsPrimaryCharged(particle, label)) fMCPrimTrackHist1[trackObj]->Fill(vMCPrimTrackHist1);
1312 fMCPrimTrackHist1[trackObj]->Fill(vMCPrimTrackHist1);
1313 if(pid == 5) fMCPrimTrackHist2[trackObj]->Fill(vMCPrimTrackHist2);
1316 fMCSecTrackHist1[trackObj]->Fill(vMCPrimTrackHist1);
1321 //_____________________________________________________________________________
1322 Long64_t AlidNdPtAnalysisPbPb::Merge(TCollection* const list)
1324 // Merge list of objects (needed by PROOF)
1326 // init if not done already
1327 if (!fIsInit) { Init(); }
1332 if (list->IsEmpty())
1335 TIterator* iter = list->MakeIterator();
1339 //TList *collPhysSelection = new TList;
1341 // collection of generated histograms
1344 while((obj = iter->Next()) != 0) {
1345 AlidNdPtAnalysisPbPb* entry = dynamic_cast<AlidNdPtAnalysisPbPb*>(obj);
1346 if (entry == 0) continue;
1348 // physics selection
1349 //printf("entry->GetPhysicsTriggerSelection() %p \n", entry->GetPhysicsTriggerSelection());
1350 //AliPhysicsSelection *physSel = entry->GetPhysicsTriggerSelection();
1351 //if( physSel ) collPhysSelection->Add(physSel);
1354 fTrackPtCorrelationMatrix->Add(entry->fTrackPtCorrelationMatrix);
1357 fGenEventMatrix->Add(entry->fGenEventMatrix);
1359 fTriggerEventMatrix->Add(entry->fTriggerEventMatrix);
1361 fRecEventMatrix->Add(entry->fRecEventMatrix);
1363 fGenTrackEventMatrix->Add(entry->fGenTrackEventMatrix);
1365 fTriggerTrackEventMatrix->Add(entry->fTriggerTrackEventMatrix);
1367 fRecTrackEventMatrix->Add(entry->fRecTrackEventMatrix);
1370 fGenTrackMatrix->Add(entry->fGenTrackMatrix);
1371 fGenPrimTrackMatrix->Add(entry->fGenPrimTrackMatrix);
1372 fRecPrimTrackMatrix->Add(entry->fRecPrimTrackMatrix);
1374 fRecTrackMatrix->Add(entry->fRecTrackMatrix);
1375 fRecSecTrackMatrix->Add(entry->fRecSecTrackMatrix);
1377 fRecMultTrackMatrix->Add(entry->fRecMultTrackMatrix);
1380 // control analysis histograms
1382 fMCEventHist1->Add(entry->fMCEventHist1);
1383 fRecEventHist1->Add(entry->fRecEventHist1);
1384 fRecEventHist2->Add(entry->fRecEventHist2);
1385 fRecMCEventHist1->Add(entry->fRecMCEventHist1);
1386 fRecMCEventHist2->Add(entry->fRecMCEventHist2);
1389 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) {
1390 fMCTrackHist1[i]->Add(entry->fMCTrackHist1[i]);
1392 fMCPrimTrackHist1[i]->Add(entry->fMCPrimTrackHist1[i]);
1393 fMCPrimTrackHist2[i]->Add(entry->fMCPrimTrackHist2[i]);
1394 fMCSecTrackHist1[i]->Add(entry->fMCSecTrackHist1[i]);
1396 fRecTrackHist1[i]->Add(entry->fRecTrackHist1[i]);
1397 fRecTrackHist2[i]->Add(entry->fRecTrackHist2[i]);
1398 fRecTrackMultHist1[i]->Add(entry->fRecTrackMultHist1[i]);
1400 fRecMCTrackHist1->Add(entry->fRecMCTrackHist1);
1401 fMCMultRecTrackHist1->Add(entry->fMCMultRecTrackHist1);
1402 fRecTrackHist3->Add(entry->fRecTrackHist3);
1407 //AliPhysicsSelection *trigSelection = GetPhysicsTriggerSelection();
1408 //if( trigSelection ) trigSelection->Merge(collPhysSelection);
1409 //if(collPhysSelection) delete collPhysSelection;
1416 //_____________________________________________________________________________
1417 void AlidNdPtAnalysisPbPb::Analyse()
1420 // init if not done already
1421 if (!fIsInit) { Init(); }
1423 // Analyse histograms
1425 TH1::AddDirectory(kFALSE);
1426 TH1 *h=0, *h1=0, *h2=0, *h2c = 0;
1431 TObjArray *aFolderObj = new TObjArray;
1434 // LHC backgraund in all and 0-bins
1436 //AliPhysicsSelection *trigSel = GetPhysicsTriggerSelection();
1437 //trigSel->SaveHistograms("physics_selection");
1440 // Reconstructed event vertex
1442 h = fRecEventHist1->Projection(0);
1446 h = fRecEventHist1->Projection(1);
1450 h = fRecEventHist1->Projection(2);
1457 h = fRecEventHist2->Projection(1);
1458 h->SetName("multMB");
1461 h2D = fRecEventHist2->Projection(0,1);
1462 h2D->SetName("Zv_vs_multiplicity_MB");
1463 aFolderObj->Add(h2D);
1466 // reconstructed pt histograms
1468 h = fRecTrackHist1[0]->Projection(0);
1469 h->Scale(1.,"width");
1470 h->SetName("pt_all_ch");
1473 h = fRecTrackHist1[1]->Projection(0);
1474 h->Scale(1.,"width");
1475 h->SetName("pt_acc");
1478 h = fRecTrackHist1[2]->Projection(0);
1479 h->Scale(1.,"width");
1480 h->SetName("pt_rec");
1484 // reconstructed eta histograms
1486 h = fRecTrackHist1[0]->Projection(1);
1487 h->SetName("eta_all_ch");
1490 h = fRecTrackHist1[1]->Projection(1);
1491 h->SetName("eta_acc");
1494 h = fRecTrackHist1[2]->Projection(1);
1495 h->SetName("eta_rec");
1499 // reconstructed phi histograms
1501 h = fRecTrackHist1[0]->Projection(2);
1502 h->SetName("phi_all_ch");
1505 h = fRecTrackHist1[1]->Projection(2);
1506 h->SetName("phi_acc");
1509 h = fRecTrackHist1[2]->Projection(2);
1510 h->SetName("phi_rec");
1514 // reconstructed eta:pt histograms
1516 h2D = fRecTrackHist1[0]->Projection(1,0);
1517 h2D->SetName("pt_eta_all_ch");
1518 aFolderObj->Add(h2D);
1520 h2D = fRecTrackHist1[1]->Projection(1,0);
1521 h2D->SetName("pt_eta_acc");
1522 aFolderObj->Add(h2D);
1524 h2D = fRecTrackHist1[2]->Projection(1,0);
1525 h2D->SetName("pt_eta_rec");
1526 aFolderObj->Add(h2D);
1529 // reconstructed phi:pt histograms
1531 h2D = fRecTrackHist1[0]->Projection(2,0);
1532 h2D->SetName("pt_phi_all_ch");
1533 aFolderObj->Add(h2D);
1535 h2D = fRecTrackHist1[1]->Projection(2,0);
1536 h2D->SetName("pt_phi_acc");
1537 aFolderObj->Add(h2D);
1539 h2D = fRecTrackHist1[2]->Projection(2,0);
1540 h2D->SetName("pt_phi_rec");
1541 aFolderObj->Add(h2D);
1544 // reconstructed phi:eta histograms
1546 h2D = fRecTrackHist1[0]->Projection(2,1);
1547 h2D->SetName("eta_phi_all_ch");
1548 aFolderObj->Add(h2D);
1550 h2D = fRecTrackHist1[1]->Projection(2,1);
1551 h2D->SetName("eta_phi_acc");
1552 aFolderObj->Add(h2D);
1554 h2D = fRecTrackHist1[2]->Projection(2,1);
1555 h2D->SetName("eta_phi_rec");
1556 aFolderObj->Add(h2D);
1559 // reconstructed nClust, chi2 vs pt, eta, phi
1563 h2D = fRecTrackHist3->Projection(0,1);
1564 h2D->SetName("nClust_chi2_rec");
1565 aFolderObj->Add(h2D);
1567 h2D = fRecTrackHist3->Projection(0,2);
1568 h2D->SetName("nClust_pt_rec");
1569 aFolderObj->Add(h2D);
1571 h2D = fRecTrackHist3->Projection(0,3);
1572 h2D->SetName("nClust_eta_rec");
1573 aFolderObj->Add(h2D);
1575 h2D = fRecTrackHist3->Projection(0,4);
1576 h2D->SetName("nClust_phi_rec");
1577 aFolderObj->Add(h2D);
1579 h2D = fRecTrackHist3->Projection(1,2);
1580 h2D->SetName("chi2_pt_rec");
1581 aFolderObj->Add(h2D);
1583 h2D = fRecTrackHist3->Projection(1,3);
1584 h2D->SetName("chi2_eta_rec");
1585 aFolderObj->Add(h2D);
1587 h2D = fRecTrackHist3->Projection(1,4);
1588 h2D->SetName("chi2_phi_rec");
1589 aFolderObj->Add(h2D);
1594 // calculate corrections for empty events
1599 // normalised zv to generate zv for triggered events
1601 h = fRecEventHist2->Projection(0);
1602 if( h->Integral() ) h->Scale(1./h->Integral());
1603 h->SetName("zv_distribution_norm");
1612 // Event vertex resolution
1614 h2D = fRecMCEventHist2->Projection(0,2);
1615 h2D->SetName("DeltaXv_vs_mult");
1616 aFolderObj->Add(h2D);
1618 h2D = fRecMCEventHist2->Projection(1,2);
1619 h2D->SetName("DeltaZv_vs_mult");
1620 aFolderObj->Add(h2D);
1623 // normalised zv to get trigger/trigger+vertex event differences
1624 // F(zv) = E_trig(zv,0)/Int(E_trig(zv,0) / Sum(E_trigvtx(zv,n))/Sum(Int(E_trigvtx(zv,n))dzv)
1626 fTriggerEventMatrix->GetAxis(1)->SetRangeUser(0.,0.);
1627 h = fTriggerEventMatrix->Projection(0);
1628 h2D = fTriggerEventMatrix->Projection(0,1);
1629 if(h2D->Integral()) h->Scale(1./h2D->Integral());
1631 h1 = fRecEventMatrix->Projection(0);
1632 h2D = fRecEventMatrix->Projection(0,1);
1633 if(h2D->Integral()) h1->Scale(1./h2D->Integral());
1636 h->SetName("zv_empty_events_norm");
1639 fTriggerEventMatrix->GetAxis(1)->SetRange(1,fTriggerEventMatrix->GetAxis(1)->GetNbins());
1642 // rec. vs true track pt correlation matrix
1644 hs = (THnSparse*)fTrackPtCorrelationMatrix->Clone("track_pt_correlation_matrix");
1645 aFolderObj->Add(hs);
1648 // trigger efficiency for INEL
1650 h = AlidNdPtHelper::GenerateCorrMatrix(fTriggerEventMatrix->Projection(0),fGenEventMatrix->Projection(0),"zv_trig_INEL_eff_matrix");
1655 // trigger bias correction (MB to INEL)
1657 hs = AlidNdPtHelper::GenerateCorrMatrix(fGenEventMatrix,fTriggerEventMatrix,"zv_mult_trig_MBtoInel_corr_matrix");
1658 aFolderObj->Add(hs);
1660 h = AlidNdPtHelper::GenerateCorrMatrix(fGenEventMatrix->Projection(0),fTriggerEventMatrix->Projection(0),"zv_trig_MBtoInel_corr_matrix");
1663 h2D = AlidNdPtHelper::GenerateCorrMatrix(fGenEventMatrix->Projection(0,1),fTriggerEventMatrix->Projection(0,1),"zv_mult_trig_MBtoInel_corr_matrix_2D");
1664 aFolderObj->Add(h2D);
1667 h = AlidNdPtHelper::GenerateCorrMatrix(fGenEventMatrix->Projection(1),fTriggerEventMatrix->Projection(1),"mult_trig_MBtoInel_corr_matrix");
1672 // event vertex reconstruction correction (MB)
1674 hs = AlidNdPtHelper::GenerateCorrMatrix(fTriggerEventMatrix,fRecEventMatrix,"zv_mult_event_corr_matrix");
1675 aFolderObj->Add(hs);
1677 h2D = AlidNdPtHelper::GenerateCorrMatrix(fTriggerEventMatrix->Projection(0,1),fRecEventMatrix->Projection(0,1),"zv_mult_event_corr_matrix_2D");
1678 aFolderObj->Add(h2D);
1681 h = AlidNdPtHelper::GenerateCorrMatrix(fTriggerEventMatrix->Projection(1),fRecEventMatrix->Projection(1),"mult_event_corr_matrix");
1685 h = AlidNdPtHelper::GenerateCorrMatrix(fTriggerEventMatrix->Projection(0),fRecEventMatrix->Projection(0),"zv_event_corr_matrix");
1691 // track-event trigger bias correction (MB to INEL)
1693 hs = AlidNdPtHelper::GenerateCorrMatrix(fGenTrackEventMatrix,fTriggerTrackEventMatrix,"zv_pt_eta_track_trig_MBtoInel_corr_matrix");
1694 aFolderObj->Add(hs);
1696 h2D = AlidNdPtHelper::GenerateCorrMatrix(fGenTrackEventMatrix->Projection(1,2),fTriggerTrackEventMatrix->Projection(1,2),"eta_pt_track_trig_MBtoInel_corr_matrix");
1697 aFolderObj->Add(h2D);
1699 h2D = AlidNdPtHelper::GenerateCorrMatrix(fGenTrackEventMatrix->Projection(1,0),fTriggerTrackEventMatrix->Projection(1,0),"pt_zv_track_trig_MBtoInel_corr_matrix");
1700 aFolderObj->Add(h2D);
1702 h2D = AlidNdPtHelper::GenerateCorrMatrix(fGenTrackEventMatrix->Projection(2,0),fTriggerTrackEventMatrix->Projection(2,0),"zv_eta_track_trig_MBtoInel_corr_matrix");
1703 aFolderObj->Add(h2D);
1707 h = AlidNdPtHelper::GenerateCorrMatrix(fTriggerTrackEventMatrix->Projection(1),fGenTrackEventMatrix->Projection(1),"pt_track_trig_MBtoInel_eff_matrix");
1712 // track-event vertex reconstruction correction (MB)
1714 hs = AlidNdPtHelper::GenerateCorrMatrix(fTriggerTrackEventMatrix,fRecTrackEventMatrix,"zv_pt_eta_track_event_corr_matrix");
1715 aFolderObj->Add(hs);
1717 h2D = AlidNdPtHelper::GenerateCorrMatrix(fTriggerTrackEventMatrix->Projection(1,2),fRecTrackEventMatrix->Projection(1,2),"eta_pt_track_event_corr_matrix");
1718 aFolderObj->Add(h2D);
1720 h2D = AlidNdPtHelper::GenerateCorrMatrix(fTriggerTrackEventMatrix->Projection(1,0),fRecTrackEventMatrix->Projection(1,0),"pt_zv_track_event_corr_matrix");
1721 aFolderObj->Add(h2D);
1723 h2D = AlidNdPtHelper::GenerateCorrMatrix(fTriggerTrackEventMatrix->Projection(2,0),fRecTrackEventMatrix->Projection(2,0),"zv_eta_track_event_corr_matrix");
1724 aFolderObj->Add(h2D);
1728 h = AlidNdPtHelper::GenerateCorrMatrix(fRecTrackEventMatrix->Projection(1),fTriggerTrackEventMatrix->Projection(1),"pt_track_event_eff_matrix");
1733 // track rec. efficiency correction
1735 hs = AlidNdPtHelper::GenerateCorrMatrix(fGenPrimTrackMatrix,fRecPrimTrackMatrix,"zv_pt_eta_track_corr_matrix");
1736 aFolderObj->Add(hs);
1738 h2D = AlidNdPtHelper::GenerateCorrMatrix(fGenPrimTrackMatrix->Projection(1,2),fRecPrimTrackMatrix->Projection(1,2),"eta_pt_track_corr_matrix");
1739 aFolderObj->Add(h2D);
1741 h2D = AlidNdPtHelper::GenerateCorrMatrix(fGenPrimTrackMatrix->Projection(1,0),fRecPrimTrackMatrix->Projection(1,0),"pt_zv_track_corr_matrix");
1742 aFolderObj->Add(h2D);
1744 h2D = AlidNdPtHelper::GenerateCorrMatrix(fGenPrimTrackMatrix->Projection(2,0),fRecPrimTrackMatrix->Projection(2,0),"zv_eta_track_corr_matrix");
1745 aFolderObj->Add(h2D);
1748 h = AlidNdPtHelper::GenerateCorrMatrix(fGenPrimTrackMatrix->Projection(0),fRecPrimTrackMatrix->Projection(0),"zv_track_corr_matrix");
1751 h = AlidNdPtHelper::GenerateCorrMatrix(fGenPrimTrackMatrix->Projection(1),fRecPrimTrackMatrix->Projection(1),"pt_track_corr_matrix");
1756 h = AlidNdPtHelper::GenerateCorrMatrix(fRecPrimTrackMatrix->Projection(1), fGenPrimTrackMatrix->Projection(1),"pt_track_eff_matrix");
1759 h = AlidNdPtHelper::GenerateCorrMatrix(fGenPrimTrackMatrix->Projection(2),fRecPrimTrackMatrix->Projection(2),"eta_track_corr_matrix");
1763 // secondary track contamination correction
1765 //hs = AlidNdPtHelper::GenerateContCorrMatrix(fRecSecTrackMatrix,fRecTrackMatrix,"zv_pt_eta_track_cont_matrix");
1766 hs = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix,fRecTrackMatrix,"zv_pt_eta_track_cont_matrix");
1767 aFolderObj->Add(hs);
1769 h2D = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix->Projection(1,2),fRecTrackMatrix->Projection(1,2),"eta_pt_track_cont_matrix");
1770 aFolderObj->Add(h2D);
1772 h2D = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix->Projection(1,0),fRecTrackMatrix->Projection(1,0),"pt_zv_track_cont_matrix");
1773 aFolderObj->Add(h2D);
1775 h2D = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix->Projection(2,0),fRecTrackMatrix->Projection(2,0),"zv_eta_track_cont_matrix");
1776 aFolderObj->Add(h2D);
1778 h = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix->Projection(0),fRecTrackMatrix->Projection(0),"zv_track_cont_matrix");
1782 h = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix->Projection(1),fRecTrackMatrix->Projection(1),"pt_track_cont_matrix");
1785 h = AlidNdPtHelper::GenerateCorrMatrix(fRecSecTrackMatrix->Projection(2),fRecTrackMatrix->Projection(2),"eta_track_cont_matrix");
1789 // multiple track reconstruction correction
1791 //hs = AlidNdPtHelper::GenerateContCorrMatrix(fRecMultTrackMatrix,fRecTrackMatrix,"zv_pt_eta_mult_track_cont_matrix");
1792 hs = AlidNdPtHelper::GenerateCorrMatrix(fRecMultTrackMatrix,fRecTrackMatrix,"zv_pt_eta_mult_track_cont_matrix");
1793 aFolderObj->Add(hs);
1795 h2D = AlidNdPtHelper::GenerateCorrMatrix(fRecMultTrackMatrix->Projection(1,2),fRecTrackMatrix->Projection(1,2),"eta_pt_mult_track_cont_matrix");
1796 aFolderObj->Add(h2D);
1798 h2D = AlidNdPtHelper::GenerateCorrMatrix(fRecMultTrackMatrix->Projection(1,0),fRecTrackMatrix->Projection(1,0),"pt_zv_mult_track_cont_matrix");
1799 aFolderObj->Add(h2D);
1801 h2D = AlidNdPtHelper::GenerateCorrMatrix(fRecMultTrackMatrix->Projection(2,0),fRecTrackMatrix->Projection(2,0),"zv_eta_mult_track_cont_matrix");
1802 aFolderObj->Add(h2D);
1804 h = AlidNdPtHelper::GenerateCorrMatrix(fRecMultTrackMatrix->Projection(0),fRecTrackMatrix->Projection(0),"zv_mult_track_cont_matrix");
1807 h = AlidNdPtHelper::GenerateCorrMatrix(fRecMultTrackMatrix->Projection(1),fRecTrackMatrix->Projection(1),"pt_mult_track_cont_matrix");
1810 h = AlidNdPtHelper::GenerateCorrMatrix(fRecMultTrackMatrix->Projection(2),fRecTrackMatrix->Projection(2),"eta_mult_track_cont_matrix");
1814 // Control histograms
1819 // Efficiency electrons, muons, pions, kaons, protons, all
1820 fMCPrimTrackHist1[1]->GetAxis(2)->SetRange(1,1);
1821 fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(1,1);
1822 h1 = fMCPrimTrackHist1[1]->Projection(0);
1823 h2 = fMCPrimTrackHist1[2]->Projection(0);
1824 h2c = (TH1D *)h2->Clone();
1826 h2c->SetName("eff_pt_electrons");
1827 aFolderObj->Add(h2c);
1829 fMCPrimTrackHist1[1]->GetAxis(2)->SetRange(2,2);
1830 fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(2,2);
1831 h1 = fMCPrimTrackHist1[1]->Projection(0);
1832 h2 = fMCPrimTrackHist1[2]->Projection(0);
1833 h2c = (TH1D *)h2->Clone();
1835 h2c->SetName("eff_pt_muons");
1836 aFolderObj->Add(h2c);
1838 fMCPrimTrackHist1[1]->GetAxis(2)->SetRange(3,3);
1839 fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(3,3);
1840 h1 = fMCPrimTrackHist1[1]->Projection(0);
1841 h2 = fMCPrimTrackHist1[2]->Projection(0);
1842 h2c = (TH1D *)h2->Clone();
1844 h2c->SetName("eff_pt_pions");
1845 aFolderObj->Add(h2c);
1847 fMCPrimTrackHist1[1]->GetAxis(2)->SetRange(4,4);
1848 fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(4,4);
1849 h1 = fMCPrimTrackHist1[1]->Projection(0);
1850 h2 = fMCPrimTrackHist1[2]->Projection(0);
1851 h2c = (TH1D *)h2->Clone();
1853 h2c->SetName("eff_pt_kaons");
1854 aFolderObj->Add(h2c);
1856 fMCPrimTrackHist1[1]->GetAxis(2)->SetRange(5,5);
1857 fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(5,5);
1858 h1 = fMCPrimTrackHist1[1]->Projection(0);
1859 h2 = fMCPrimTrackHist1[2]->Projection(0);
1860 h2c = (TH1D *)h2->Clone();
1862 h2c->SetName("eff_pt_protons");
1863 aFolderObj->Add(h2c);
1865 fMCPrimTrackHist1[1]->GetAxis(2)->SetRange(1,5);
1866 fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(1,5);
1867 h1 = fMCPrimTrackHist1[1]->Projection(0);
1868 h2 = fMCPrimTrackHist1[2]->Projection(0);
1869 h2c = (TH1D *)h2->Clone();
1871 h2c->SetName("eff_pt_selected");
1872 aFolderObj->Add(h2c);
1874 fMCPrimTrackHist1[1]->GetAxis(2)->SetRange(1,6);
1875 fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(1,6);
1876 h1 = fMCPrimTrackHist1[1]->Projection(0);
1877 h2 = fMCPrimTrackHist1[2]->Projection(0);
1878 h2c = (TH1D *)h2->Clone();
1880 h2c->SetName("eff_pt_all");
1881 aFolderObj->Add(h2c);
1883 fMCPrimTrackHist1[1]->GetAxis(1)->SetRange(1,fMCPrimTrackHist1[1]->GetAxis(1)->GetNbins());
1884 fMCPrimTrackHist1[2]->GetAxis(1)->SetRange(1,fMCPrimTrackHist1[2]->GetAxis(1)->GetNbins());
1887 // - rec, primaries, secondaries
1888 // - primaries (pid)
1889 // - secondaries (pid)
1890 // - secondaries (mech)
1891 // - secondaries (mother)
1894 TH1D *mcPtAccall = fMCTrackHist1[1]->Projection(0);
1895 mcPtAccall->SetName("mc_pt_acc_all");
1896 aFolderObj->Add(mcPtAccall);
1898 TH1D *mcPtAccprim = fMCPrimTrackHist1[1]->Projection(0);
1899 mcPtAccprim->SetName("mc_pt_acc_prim");
1900 aFolderObj->Add(mcPtAccprim);
1902 TH1D *mcPtRecall = fMCTrackHist1[2]->Projection(0);
1903 mcPtRecall->SetName("mc_pt_rec_all");
1904 aFolderObj->Add(mcPtRecall);
1906 TH1D *mcPtRecprim = fMCPrimTrackHist1[2]->Projection(0);
1907 mcPtRecprim->SetName("mc_pt_rec_prim");
1908 aFolderObj->Add(mcPtRecprim);
1910 TH1D *mcPtRecsec = fMCSecTrackHist1[2]->Projection(0);
1911 mcPtRecsec->SetName("mc_pt_rec_sec");
1912 aFolderObj->Add(mcPtRecsec);
1914 for(Int_t i = 0; i<6; i++)
1916 sprintf(name,"mc_pt_rec_prim_pid_%d",i);
1917 fMCPrimTrackHist1[2]->GetAxis(2)->SetRange(i+1,i+1);
1918 h = fMCPrimTrackHist1[2]->Projection(0);
1922 sprintf(name,"mc_pt_rec_sec_pid_%d",i);
1923 fMCSecTrackHist1[2]->GetAxis(2)->SetRange(i+1,i+1);
1924 h = fMCSecTrackHist1[2]->Projection(0);
1928 // production mechanisms for given pid
1929 fMCSecTrackHist1[2]->GetAxis(2)->SetRange(i+1,i+1);
1931 for(Int_t j=0; j<20; j++) {
1935 sprintf(name,"mc_pt_rec_sec_pid_%d_decay",i);
1936 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1937 h = fMCSecTrackHist1[2]->Projection(0);
1941 sprintf(name,"mc_eta_rec_sec_pid_%d_decay",i);
1942 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1943 h = fMCSecTrackHist1[2]->Projection(1);
1947 sprintf(name,"mc_mother_rec_sec_pid_%d_decay",i);
1948 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1949 h = fMCSecTrackHist1[2]->Projection(4);
1953 } else if (j == 5) {
1956 sprintf(name,"mc_pt_rec_sec_pid_%d_conv",i);
1957 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1958 h = fMCSecTrackHist1[2]->Projection(0);
1962 sprintf(name,"mc_eta_rec_sec_pid_%d_conv",i);
1963 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1964 h = fMCSecTrackHist1[2]->Projection(1);
1968 sprintf(name,"mc_mother_rec_sec_pid_%d_conv",i);
1969 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1970 h = fMCSecTrackHist1[2]->Projection(4);
1974 } else if (j == 13) {
1977 sprintf(name,"mc_pt_rec_sec_pid_%d_mat",i);
1978 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1979 h = fMCSecTrackHist1[2]->Projection(0);
1983 sprintf(name,"mc_eta_rec_sec_pid_%d_mat",i);
1984 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1985 h = fMCSecTrackHist1[2]->Projection(1);
1989 sprintf(name,"mc_eta_mother_rec_sec_pid_%d_mat",i);
1990 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1991 h = fMCSecTrackHist1[2]->Projection(4,1);
1995 sprintf(name,"mc_mother_rec_sec_pid_%d_mat",i);
1996 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
1997 h = fMCSecTrackHist1[2]->Projection(4);
2001 sprintf(name,"mc_pt_mother_rec_sec_pid_%d_mat",i);
2002 fMCSecTrackHist1[2]->GetAxis(3)->SetRange(j+1,j+1);
2003 h = fMCSecTrackHist1[2]->Projection(4,0);
2013 } // end fHistogramOn
2016 // resolution histograms
2017 // only for reconstructed tracks
2021 TCanvas * c = new TCanvas("resol","resol");
2025 fRecMCTrackHist1->GetAxis(1)->SetRangeUser(-0.8,0.79);
2027 h2F = (TH2F*)fRecMCTrackHist1->Projection(2,0);
2028 h = AlidNdPtHelper::MakeResol(h2F,1,0,kTRUE,10);
2029 h->SetXTitle("p_{tmc} (GeV/c)");
2030 h->SetYTitle("(p_{t}-p_{tmc})/p_{tmc} resolution");
2032 h->SetName("pt_resolution_vs_mcpt");
2035 h2F = (TH2F*)fRecMCTrackHist1->Projection(2,0);
2036 h = AlidNdPtHelper::MakeResol(h2F,1,1,kTRUE,10);
2037 h->SetXTitle("p_{tmc} (GeV/c)");
2038 h->SetYTitle("(p_{t}-p_{tmc})/p_{tmc} mean");
2040 h->SetName("dpt_mean_vs_mcpt");
2044 h2F = (TH2F*)fRecMCTrackHist1->Projection(3,0);
2045 h = AlidNdPtHelper::MakeResol(h2F,1,0,kTRUE,10);
2046 h->SetXTitle("p_{tmc} (GeV/c)");
2047 h->SetYTitle("(#eta-#eta_{mc}) resolution");
2049 h->SetName("eta_resolution_vs_mcpt");
2052 h2F = (TH2F*)fRecMCTrackHist1->Projection(3,0);
2053 h = AlidNdPtHelper::MakeResol(h2F,1,1,kTRUE,10);
2054 h->SetXTitle("p_{tmc} (GeV/c)");
2055 h->SetYTitle("(#eta-mc#eta) mean");
2057 h->SetName("deta_mean_vs_mcpt");
2061 fRecMCTrackHist1->GetAxis(1)->SetRange(1,fRecMCTrackHist1->GetAxis(1)->GetNbins());
2063 h2F = (TH2F*)fRecMCTrackHist1->Projection(2,1);
2064 h = AlidNdPtHelper::MakeResol(h2F,1,0,kTRUE,10);
2065 h->SetXTitle("#eta_{mc}");
2066 h->SetYTitle("(p_{t}-p_{tmc})/p_{tmc} resolution");
2068 h->SetName("pt_resolution_vs_mceta");
2071 h2F = (TH2F*)fRecMCTrackHist1->Projection(2,1);
2072 h = AlidNdPtHelper::MakeResol(h2F,1,1,kTRUE,10);
2073 h->SetXTitle("#eta_{mc}");
2074 h->SetYTitle("(p_{t}-p_{tmc})/p_{tmc} mean");
2076 h->SetName("dpt_mean_vs_mceta");
2080 h2F = (TH2F*)fRecMCTrackHist1->Projection(3,1);
2081 h = AlidNdPtHelper::MakeResol(h2F,1,0,kTRUE,10);
2082 h->SetXTitle("#eta_{mc}");
2083 h->SetYTitle("(#eta-#eta_{mc}) resolution");
2085 h->SetName("eta_resolution_vs_mceta");
2088 h2F = (TH2F*)fRecMCTrackHist1->Projection(3,1);
2089 h = AlidNdPtHelper::MakeResol(h2F,1,1,kTRUE,10);
2090 h->SetXTitle("#eta_{mc}");
2091 h->SetYTitle("(#eta-mc#eta) mean");
2093 h->SetName("deta_mean_vs_mceta");
2096 fRecMCTrackHist1->GetAxis(0)->SetRange(1,fRecMCTrackHist1->GetAxis(0)->GetNbins());
2098 } // end use MC info
2100 // export objects to analysis folder
2101 fAnalysisFolder = ExportToFolder(aFolderObj);
2103 // delete only TObjArray
2104 if(aFolderObj) delete aFolderObj;
2107 //_____________________________________________________________________________
2108 TFolder* AlidNdPtAnalysisPbPb::ExportToFolder(TObjArray * const array)
2110 // recreate folder avery time and export objects to new one
2112 AlidNdPtAnalysisPbPb * comp=this;
2113 TFolder *folder = comp->GetAnalysisFolder();
2115 TString name, title;
2116 TFolder *newFolder = 0;
2118 Int_t size = array->GetSize();
2121 // get name and title from old folder
2122 name = folder->GetName();
2123 title = folder->GetTitle();
2129 newFolder = CreateFolder(name.Data(),title.Data());
2130 newFolder->SetOwner();
2132 // add objects to folder
2134 newFolder->Add(array->At(i));
2142 //_____________________________________________________________________________
2143 TFolder* AlidNdPtAnalysisPbPb::CreateFolder(TString name,TString title) {
2144 // create folder for analysed histograms
2146 TFolder *folder = 0;
2147 folder = new TFolder(name.Data(),title.Data());