1 /**************************************************************************
\r
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
23 #include "AliHeader.h"
\r
24 #include "AliGenEventHeader.h"
\r
25 #include "AliStack.h"
\r
26 #include "AliESDEvent.h"
\r
27 #include "AliMCEvent.h"
\r
28 #include "AliESDtrackCuts.h"
\r
29 #include "AliLog.h"
\r
31 #include "AlidNdPtEventCuts.h"
\r
32 #include "AlidNdPtAcceptanceCuts.h"
\r
34 #include "AliPWG0Helper.h"
\r
35 #include "AlidNdPtHelper.h"
\r
36 #include "AlidNdPtCorrection.h"
\r
38 using namespace std;
\r
40 ClassImp(AlidNdPtCorrection)
\r
42 //_____________________________________________________________________________
\r
43 //AlidNdPtCorrection::AlidNdPtCorrection(): TNamed(),
\r
44 AlidNdPtCorrection::AlidNdPtCorrection(): AlidNdPt(),
\r
45 fCorrectionFolder(0),
\r
48 fMCAllEventMultHist1(0),
\r
49 fMCAllNDEventMultHist1(0),
\r
50 fMCAllNSDEventMultHist1(0),
\r
51 fMCTriggerMultHist1(0),
\r
52 fMCEventMultHist1(0),
\r
53 fMCAllPrimTrackMultHist1(0),
\r
54 fMCNDEventAllPrimTrackMultHist1(0),
\r
55 fMCNSDEventAllPrimTrackMultHist1(0),
\r
56 fMCTriggerPrimTrackMultHist1(0),
\r
57 fMCEventPrimTrackMultHist1(0),
\r
58 fEventMultCorrelationMatrix(0),
\r
60 fZvEmptyEventsNorm(0),
\r
61 fCorrTriggerMBtoInelEventMatrix(0),
\r
62 fCorrTriggerMBtoNDEventMatrix(0),
\r
63 fCorrTriggerMBtoNSDEventMatrix(0),
\r
64 fCorrEventMatrix(0),
\r
65 fCorrTriggerMBtoInelTrackEventMatrix(0),
\r
66 fCorrTriggerMBtoNDTrackEventMatrix(0),
\r
67 fCorrTriggerMBtoNSDTrackEventMatrix(0),
\r
68 fCorrTrackEventMatrix(0),
\r
69 fCorrTrackMatrix(0),
\r
70 fContTrackMatrix(0),
\r
71 fContMultTrackMatrix(0),
\r
72 fCorrMatrixFileName("")
\r
74 // default constructor
\r
75 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) {
\r
76 fRecTrackHist1[i]=0;
\r
79 for(Int_t i=0; i<8; i++) {
\r
80 fCorrRecTrackMultHist1[i] = 0;
\r
83 for(Int_t i=0; i<5; i++) {
\r
84 fCorrRecEventHist1[i] = 0;
\r
85 fCorrRecEventHist2[i] = 0;
\r
91 //_____________________________________________________________________________
\r
92 AlidNdPtCorrection::AlidNdPtCorrection(Char_t* name, Char_t* title, TString corrMatrixFileName): AlidNdPt(name,title),
\r
93 fCorrectionFolder(0),
\r
96 fMCAllEventMultHist1(0),
\r
97 fMCAllNDEventMultHist1(0),
\r
98 fMCAllNSDEventMultHist1(0),
\r
99 fMCTriggerMultHist1(0),
\r
100 fMCEventMultHist1(0),
\r
101 fMCAllPrimTrackMultHist1(0),
\r
102 fMCNDEventAllPrimTrackMultHist1(0),
\r
103 fMCNSDEventAllPrimTrackMultHist1(0),
\r
104 fMCTriggerPrimTrackMultHist1(0),
\r
105 fMCEventPrimTrackMultHist1(0),
\r
106 fEventMultCorrelationMatrix(0),
\r
108 fZvEmptyEventsNorm(0),
\r
109 fCorrTriggerMBtoInelEventMatrix(0),
\r
110 fCorrTriggerMBtoNDEventMatrix(0),
\r
111 fCorrTriggerMBtoNSDEventMatrix(0),
\r
112 fCorrEventMatrix(0),
\r
113 fCorrTriggerMBtoInelTrackEventMatrix(0),
\r
114 fCorrTriggerMBtoNDTrackEventMatrix(0),
\r
115 fCorrTriggerMBtoNSDTrackEventMatrix(0),
\r
116 fCorrTrackEventMatrix(0),
\r
117 fCorrTrackMatrix(0),
\r
118 fContTrackMatrix(0),
\r
119 fContMultTrackMatrix(0),
\r
120 fCorrMatrixFileName(corrMatrixFileName)
\r
123 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) {
\r
124 fRecTrackHist1[i]=0;
\r
127 for(Int_t i=0; i<8; i++) {
\r
128 fCorrRecTrackMultHist1[i] = 0;
\r
132 for(Int_t i=0; i<5; i++) {
\r
133 fCorrRecEventHist1[i] = 0;
\r
134 fCorrRecEventHist2[i] = 0;
\r
140 //_____________________________________________________________________________
\r
141 AlidNdPtCorrection::~AlidNdPtCorrection() {
\r
145 if(fMCEventHist1) delete fMCEventHist1; fMCEventHist1=0;
\r
146 if(fRecEventHist1) delete fRecEventHist1; fRecEventHist1=0;
\r
148 if(fMCAllEventMultHist1) delete fMCAllEventMultHist1; fMCAllEventMultHist1=0;
\r
149 if(fMCAllNDEventMultHist1) delete fMCAllNDEventMultHist1; fMCAllNDEventMultHist1=0;
\r
150 if(fMCAllNSDEventMultHist1) delete fMCAllNSDEventMultHist1; fMCAllNSDEventMultHist1=0;
\r
151 if(fMCTriggerMultHist1) delete fMCTriggerMultHist1; fMCTriggerMultHist1=0;
\r
152 if(fMCEventMultHist1) delete fMCEventMultHist1; fMCEventMultHist1=0;
\r
154 if(fMCAllPrimTrackMultHist1) delete fMCAllPrimTrackMultHist1; fMCAllPrimTrackMultHist1=0;
\r
155 if(fMCNDEventAllPrimTrackMultHist1) delete fMCNDEventAllPrimTrackMultHist1; fMCNDEventAllPrimTrackMultHist1=0;
\r
156 if(fMCNSDEventAllPrimTrackMultHist1) delete fMCNSDEventAllPrimTrackMultHist1; fMCNSDEventAllPrimTrackMultHist1=0;
\r
157 if(fMCTriggerPrimTrackMultHist1) delete fMCTriggerPrimTrackMultHist1; fMCTriggerPrimTrackMultHist1=0;
\r
158 if(fMCEventPrimTrackMultHist1) delete fMCEventPrimTrackMultHist1; fMCEventPrimTrackMultHist1=0;
\r
160 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) {
\r
161 if(fRecTrackHist1[i]) delete fRecTrackHist1[i]; fRecTrackHist1[i]=0;
\r
164 for(Int_t i=0; i<8; i++) {
\r
165 if(fCorrRecTrackMultHist1[i]) delete fCorrRecTrackMultHist1[i]; fCorrRecTrackMultHist1[i]=0;
\r
166 if(fPtvsPt[i]) delete fPtvsPt[i]; fPtvsPt[i]=0;
\r
169 for(Int_t i=0; i<5; i++) {
\r
170 if(fCorrRecEventHist1[i]) delete fCorrRecEventHist1[i]; fCorrRecEventHist1[i]=0;
\r
171 if(fCorrRecEventHist2[i]) delete fCorrRecEventHist2[i]; fCorrRecEventHist2[i]=0;
\r
174 if(fCorrectionFolder) delete fCorrectionFolder; fCorrectionFolder=0;
\r
177 //_____________________________________________________________________________
\r
178 void AlidNdPtCorrection::Init(){
\r
182 const Int_t etaNbins = 30;
\r
183 const Int_t zvNbins = 12;
\r
186 //const Int_t ptNbins = 52;
\r
187 //Double_t binsPt[ptNbins+1] = { 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00, 5.20, 5.40, 5.60, 5.80, 6.00, 7.00, 7.60, 8.80, 9.60 };
\r
189 const Int_t ptNbins = 56;
\r
190 Double_t binsPt[ptNbins+1] = {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,2.8,3.0,3.2,3.4,3.6,3.8,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0};
\r
191 Double_t binsEta[etaNbins+1] = {-1.5,-1.4,-1.3,-1.2,-1.1,-1.0,-0.9,-0.8,-0.7,-0.6,-0.5,-0.4,-0.3,-0.2,-0.1,0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5};
\r
192 Double_t binsZv[zvNbins+1] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};
\r
196 Int_t binsMCEventHist1[3]={100,100,140};
\r
197 Double_t minMCEventHist1[3]={-0.1,-0.1,-35.};
\r
198 Double_t maxMCEventHist1[3]={0.1,0.1,35.};
\r
199 fMCEventHist1 = new THnSparseF("fMCEventHist1","mcXv:mcYv:mcZv",3,binsMCEventHist1,minMCEventHist1,maxMCEventHist1);
\r
200 fMCEventHist1->GetAxis(0)->SetTitle("mcXv (cm)");
\r
201 fMCEventHist1->GetAxis(1)->SetTitle("mcYv (cm)");
\r
202 fMCEventHist1->GetAxis(2)->SetTitle("mcZv (cm)");
\r
203 fMCEventHist1->Sumw2();
\r
206 Int_t binsRecEventHist1[3]={100,100,140};
\r
207 Double_t minRecEventHist1[3]={-3.,-3.,-35.};
\r
208 Double_t maxRecEventHist1[3]={3.,3.,35.};
\r
209 fRecEventHist1 = new THnSparseF("fRecEventHist1","Xv:Yv:Zv",3,binsRecEventHist1,minRecEventHist1,maxRecEventHist1);
\r
210 fRecEventHist1->GetAxis(0)->SetTitle("Xv (cm)");
\r
211 fRecEventHist1->GetAxis(1)->SetTitle("Yv (cm)");
\r
212 fRecEventHist1->GetAxis(2)->SetTitle("Zv (cm)");
\r
213 fRecEventHist1->Sumw2();
\r
219 Int_t binsMCAllPrimTrackMultHist1[3]={ptNbins,etaNbins,150};
\r
220 Double_t minMCAllPrimTrackMultHist1[3]={0.,-1.,-0.5};
\r
221 Double_t maxMCAllPrimTrackMultHist1[3]={20.,1.,149.5};
\r
222 sprintf(name,"fMCAllPrimTrackMultHist1");
\r
223 sprintf(title,"mcPt:mcEta:multiplicity");
\r
225 fMCAllPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCAllPrimTrackMultHist1,minMCAllPrimTrackMultHist1,maxMCAllPrimTrackMultHist1);
\r
226 fMCAllPrimTrackMultHist1->SetBinEdges(0,binsPt);
\r
227 fMCAllPrimTrackMultHist1->SetBinEdges(1,binsEta);
\r
228 fMCAllPrimTrackMultHist1->GetAxis(0)->SetTitle("mcPt (GeV/c)");
\r
229 fMCAllPrimTrackMultHist1->GetAxis(1)->SetTitle("mcEta");
\r
230 fMCAllPrimTrackMultHist1->GetAxis(2)->SetTitle("multiplicity");
\r
231 fMCAllPrimTrackMultHist1->Sumw2();
\r
233 Int_t binsMCNDEventAllPrimTrackMultHist1[3]={ptNbins,etaNbins,150};
\r
234 Double_t minMCNDEventAllPrimTrackMultHist1[3]={0.,-1.,-0.5};
\r
235 Double_t maxMCNDEventAllPrimTrackMultHist1[3]={20.,1.,149.5};
\r
236 sprintf(name,"fMCNDEventAllPrimTrackMultHist1");
\r
237 sprintf(title,"mcPt:mcEta:multiplicity");
\r
239 fMCNDEventAllPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCNDEventAllPrimTrackMultHist1,minMCNDEventAllPrimTrackMultHist1,maxMCNDEventAllPrimTrackMultHist1);
\r
240 fMCNDEventAllPrimTrackMultHist1->SetBinEdges(0,binsPt);
\r
241 fMCNDEventAllPrimTrackMultHist1->SetBinEdges(1,binsEta);
\r
242 fMCNDEventAllPrimTrackMultHist1->GetAxis(0)->SetTitle("mcPt (GeV/c)");
\r
243 fMCNDEventAllPrimTrackMultHist1->GetAxis(1)->SetTitle("mcEta");
\r
244 fMCNDEventAllPrimTrackMultHist1->GetAxis(2)->SetTitle("multiplicity");
\r
245 fMCNDEventAllPrimTrackMultHist1->Sumw2();
\r
247 Int_t binsMCNSDEventAllPrimTrackMultHist1[3]={ptNbins,etaNbins,150};
\r
248 Double_t minMCNSDEventAllPrimTrackMultHist1[3]={0.,-1.,-0.5};
\r
249 Double_t maxMCNSDEventAllPrimTrackMultHist1[3]={20.,1.,140.9};
\r
250 sprintf(name,"fMCNSDEventAllPrimTrackMultHist1");
\r
251 sprintf(title,"mcPt:mcEta:multiplicity");
\r
253 fMCNSDEventAllPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCNSDEventAllPrimTrackMultHist1,minMCNSDEventAllPrimTrackMultHist1,maxMCNSDEventAllPrimTrackMultHist1);
\r
254 fMCNSDEventAllPrimTrackMultHist1->SetBinEdges(0,binsPt);
\r
255 fMCNSDEventAllPrimTrackMultHist1->SetBinEdges(1,binsEta);
\r
256 fMCNSDEventAllPrimTrackMultHist1->GetAxis(0)->SetTitle("mcPt (GeV/c)");
\r
257 fMCNSDEventAllPrimTrackMultHist1->GetAxis(1)->SetTitle("mcEta");
\r
258 fMCNSDEventAllPrimTrackMultHist1->GetAxis(2)->SetTitle("multiplicity");
\r
259 fMCNSDEventAllPrimTrackMultHist1->Sumw2();
\r
261 Int_t binsMCEventTriggerPrimTrackMultHist1[3]={ptNbins,etaNbins,150};
\r
262 Double_t minMCEventTriggerPrimTrackMultHist1[3]={0.,-1.,-0.5};
\r
263 Double_t maxMCEventTriggerPrimTrackMultHist1[3]={20.,1.,149.5};
\r
264 sprintf(name,"fMCTriggerPrimTrackMultHist1");
\r
265 sprintf(title,"mcPt:mcEta:multiplicity");
\r
267 fMCTriggerPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCEventTriggerPrimTrackMultHist1,minMCEventTriggerPrimTrackMultHist1,maxMCEventTriggerPrimTrackMultHist1);
\r
268 fMCTriggerPrimTrackMultHist1->SetBinEdges(0,binsPt);
\r
269 fMCTriggerPrimTrackMultHist1->SetBinEdges(1,binsEta);
\r
270 fMCTriggerPrimTrackMultHist1->GetAxis(0)->SetTitle("mcPt (GeV/c)");
\r
271 fMCTriggerPrimTrackMultHist1->GetAxis(1)->SetTitle("mcEta");
\r
272 fMCTriggerPrimTrackMultHist1->GetAxis(2)->SetTitle("multiplicity");
\r
273 fMCTriggerPrimTrackMultHist1->Sumw2();
\r
275 Int_t binsMCEventPrimTrackMultHist1[3]={ptNbins,etaNbins,150};
\r
276 Double_t minMCEventPrimTrackMultHist1[3]={0.,-1.,-0.5};
\r
277 Double_t maxMCEventPrimTrackMultHist1[3]={20.,1.,149.5};
\r
278 sprintf(name,"fMCEventPrimTrackMultHist1");
\r
279 sprintf(title,"mcPt:mcEta:multiplicity");
\r
281 fMCEventPrimTrackMultHist1 = new THnSparseF(name,title,3,binsMCEventPrimTrackMultHist1,minMCEventPrimTrackMultHist1,maxMCEventPrimTrackMultHist1);
\r
282 fMCEventPrimTrackMultHist1->SetBinEdges(0,binsPt);
\r
283 fMCEventPrimTrackMultHist1->SetBinEdges(1,binsEta);
\r
284 fMCEventPrimTrackMultHist1->GetAxis(0)->SetTitle("mcPt (GeV/c)");
\r
285 fMCEventPrimTrackMultHist1->GetAxis(1)->SetTitle("mcEta");
\r
286 fMCEventPrimTrackMultHist1->GetAxis(2)->SetTitle("multiplicity");
\r
287 fMCEventPrimTrackMultHist1->Sumw2();
\r
289 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++)
\r
291 // THnSparse track histograms
\r
293 Int_t binsRecTrackHist1[3]={ptNbins,etaNbins,90};
\r
294 Double_t minRecTrackHist1[3]={0.,-1.,0.};
\r
295 Double_t maxRecTrackHist1[3]={10.,1.,2.*TMath::Pi()};
\r
296 sprintf(name,"fRecTrackHist1_%d",i);
\r
297 sprintf(title,"Pt:Eta:Phi");
\r
299 fRecTrackHist1[i] = new THnSparseF(name,title,3,binsRecTrackHist1,minRecTrackHist1,maxRecTrackHist1);
\r
300 fRecTrackHist1[i]->SetBinEdges(0,binsPt);
\r
301 fRecTrackHist1[i]->SetBinEdges(1,binsEta);
\r
302 fRecTrackHist1[i]->GetAxis(0)->SetTitle("Pt (GeV/c)");
\r
303 fRecTrackHist1[i]->GetAxis(1)->SetTitle("Eta");
\r
304 fRecTrackHist1[i]->GetAxis(2)->SetTitle("Phi (rad)");
\r
305 fRecTrackHist1[i]->Sumw2();
\r
308 Int_t binsCorrRecTrackMultHist1[3]={ptNbins,etaNbins,150};
\r
309 Double_t minCorrRecTrackMultHist1[3]={0.,-1.,-0.5};
\r
310 Double_t maxCorrRecTrackMultHist1[3]={20.,1.,149.5};
\r
312 Int_t binsPtvsPt[3]={ptNbins,320};
\r
313 Double_t minPtvsPt[3]={0.,0.};
\r
314 Double_t maxPtvsPt[3]={20.,16.};
\r
316 for(Int_t i=0; i<8; i++)
\r
318 // THnSparse track histograms
\r
319 sprintf(name,"fCorrRecTrackMultHist1_%d",i);
\r
320 sprintf(title,"Pt:Eta:mult");
\r
321 fCorrRecTrackMultHist1[i] = new THnSparseF(name,title,3,binsCorrRecTrackMultHist1,minCorrRecTrackMultHist1,maxCorrRecTrackMultHist1);
\r
322 fCorrRecTrackMultHist1[i]->SetBinEdges(0,binsPt);
\r
323 fCorrRecTrackMultHist1[i]->SetBinEdges(1,binsEta);
\r
324 fCorrRecTrackMultHist1[i]->GetAxis(0)->SetTitle("Pt (GeV/c)");
\r
325 fCorrRecTrackMultHist1[i]->GetAxis(1)->SetTitle("Eta");
\r
326 fCorrRecTrackMultHist1[i]->GetAxis(2)->SetTitle("multiplicity");
\r
327 fCorrRecTrackMultHist1[i]->Sumw2();
\r
329 sprintf(name,"fPtvsPt_%d",i);
\r
330 sprintf(title,"Pt:Pt");
\r
331 fPtvsPt[i] = new THnSparseF(name,title,2,binsPtvsPt,minPtvsPt,maxPtvsPt);
\r
332 fPtvsPt[i]->SetBinEdges(0,binsPt);
\r
333 fPtvsPt[i]->GetAxis(0)->SetTitle("Pt (GeV/c)");
\r
334 fPtvsPt[i]->GetAxis(1)->SetTitle("Pt (GeV/c)");
\r
335 fPtvsPt[i]->Sumw2();
\r
338 Int_t binsEventMatrix[2]={zvNbins,150};
\r
339 Double_t minEventMatrix[2]={-25.,-0.5};
\r
340 Double_t maxEventMatrix[2]={25.,149.5};
\r
342 fMCAllEventMultHist1 = new THnSparseF("fMCAllEventMultHist1","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);
\r
343 fMCAllEventMultHist1->SetBinEdges(0,binsZv);
\r
344 fMCAllEventMultHist1->GetAxis(0)->SetTitle("mcZv (cm)");
\r
345 fMCAllEventMultHist1->GetAxis(1)->SetTitle("multiplicity");
\r
346 fMCAllEventMultHist1->Sumw2();
\r
348 fMCAllNDEventMultHist1 = new THnSparseF("fMCAllNDEventMultHist1","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);
\r
349 fMCAllNDEventMultHist1->SetBinEdges(0,binsZv);
\r
350 fMCAllNDEventMultHist1->GetAxis(0)->SetTitle("mcZv (cm)");
\r
351 fMCAllNDEventMultHist1->GetAxis(1)->SetTitle("multiplicity");
\r
352 fMCAllNDEventMultHist1->Sumw2();
\r
354 fMCAllNSDEventMultHist1 = new THnSparseF("fMCAllNSDEventMultHist1","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);
\r
355 fMCAllNSDEventMultHist1->SetBinEdges(0,binsZv);
\r
356 fMCAllNSDEventMultHist1->GetAxis(0)->SetTitle("mcZv (cm)");
\r
357 fMCAllNSDEventMultHist1->GetAxis(1)->SetTitle("multiplicity");
\r
358 fMCAllNSDEventMultHist1->Sumw2();
\r
360 fMCTriggerMultHist1 = new THnSparseF("fMCTriggerMultHist1","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);
\r
361 fMCTriggerMultHist1->SetBinEdges(0,binsZv);
\r
362 fMCTriggerMultHist1->GetAxis(0)->SetTitle("mcZv (cm)");
\r
363 fMCTriggerMultHist1->GetAxis(1)->SetTitle("multiplicity");
\r
364 fMCTriggerMultHist1->Sumw2();
\r
366 fMCEventMultHist1 = new THnSparseF("fMCEventMultHist1","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);
\r
367 fMCEventMultHist1->SetBinEdges(0,binsZv);
\r
368 fMCEventMultHist1->GetAxis(0)->SetTitle("mcZv (cm)");
\r
369 fMCEventMultHist1->GetAxis(1)->SetTitle("multiplicity");
\r
370 fMCEventMultHist1->Sumw2();
\r
372 for(Int_t i=0; i<5; i++)
\r
374 // event corrected histograms
\r
375 sprintf(name,"fCorrRecEventHist1_%d",i);
\r
376 sprintf(title,"mcZv:mult");
\r
377 fCorrRecEventHist1[i] = new THnSparseF("fCorrRecEventHist1","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);
\r
378 fCorrRecEventHist1[i]->SetBinEdges(0,binsZv);
\r
379 fCorrRecEventHist1[i]->GetAxis(0)->SetTitle("Zv (cm)");
\r
380 fCorrRecEventHist1[i]->GetAxis(1)->SetTitle("multiplicity");
\r
381 fCorrRecEventHist1[i]->Sumw2();
\r
383 // empty event corrected histograms
\r
384 sprintf(name,"fCorrRecEventHist2_%d",i);
\r
385 sprintf(title,"mcZv:mult");
\r
386 fCorrRecEventHist2[i] = new THnSparseF("fCorrRecEventHist2","mcZv:mult",2,binsEventMatrix,minEventMatrix,maxEventMatrix);
\r
387 fCorrRecEventHist2[i]->SetBinEdges(0,binsZv);
\r
388 fCorrRecEventHist2[i]->GetAxis(0)->SetTitle("Zv (cm)");
\r
389 fCorrRecEventHist2[i]->GetAxis(1)->SetTitle("multiplicity");
\r
390 fCorrRecEventHist2[i]->Sumw2();
\r
393 // init output folder
\r
394 fCorrectionFolder = CreateFolder("folderdNdPt","Correction dNdPt Folder");
\r
396 // init correction matrices
\r
397 TFile *file = (TFile *)TFile::Open(fCorrMatrixFileName.Data());
\r
399 AliDebug(AliLog::kError, "file with efficiency matrices not available");
\r
400 printf("file with efficiency matrices not available \n");
\r
402 TFolder *folder = (TFolder *)file->FindObjectAny("folderdNdPt");
\r
404 AliDebug(AliLog::kError, "file without folderdNdPt");
\r
405 printf("file without folderdNdPt \n");
\r
407 // rec. event mult vs true multiplicity
\r
408 fEventMultCorrelationMatrix = (THnSparseF*)folder->FindObject("event_mult_correlation_matrix");
\r
409 if(!fEventMultCorrelationMatrix) {
\r
410 Printf("No %s matrix \n", "event_mult_correlation_matrix");
\r
414 // event level corrections (zv,mult_MB)
\r
417 // trigger bias correction (MBtoND)
\r
418 fCorrTriggerMBtoNDEventMatrix = (THnSparseF*)folder->FindObject("zv_mult_trig_MBtoND_corr_matrix");
\r
419 if(!fCorrTriggerMBtoNDEventMatrix) {
\r
420 Printf("No %s matrix \n", "zv_mult_trig_MBtoND_corr_matrix");
\r
423 // trigger bias correction (MBtoNSD)
\r
424 fCorrTriggerMBtoNSDEventMatrix = (THnSparseF*)folder->FindObject("zv_mult_trig_MBtoNSD_corr_matrix");
\r
425 if(!fCorrTriggerMBtoNSDEventMatrix) {
\r
426 Printf("No %s matrix \n", "zv_mult_trig_MBtoNSD_corr_matrix");
\r
429 // trigger bias correction (MBtoInel)
\r
430 fCorrTriggerMBtoInelEventMatrix = (THnSparseF*)folder->FindObject("zv_mult_trig_MBtoInel_corr_matrix");
\r
431 if(!fCorrTriggerMBtoInelEventMatrix) {
\r
432 Printf("No %s matrix \n", "zv_mult_trig_MBtoInel_corr_matrix");
\r
435 // vertex reconstruction efficiency correction
\r
436 fCorrEventMatrix = (THnSparseF*)folder->FindObject("zv_mult_event_corr_matrix");
\r
437 if(!fCorrEventMatrix) {
\r
438 Printf("No %s matrix \n", "zv_mult_event_corr_matrix");
\r
442 // histogram needed for empty events corrections
\r
444 fZvNorm = (TH1D*)folder->FindObject("zv_distribution_norm");
\r
446 Printf("No %s matrix \n", "fZvNorm");
\r
449 fZvEmptyEventsNorm = (TH1D*)folder->FindObject("zv_empty_events_norm");
\r
450 if(!fZvEmptyEventsNorm) {
\r
451 Printf("No %s matrix \n", "fZvEmptyEventsNorm");
\r
455 // track-event level corrections (zv,pt,eta)
\r
458 // trigger bias correction (MBtoND)
\r
459 fCorrTriggerMBtoNDTrackEventMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_trig_MBtoND_corr_matrix");
\r
460 if(!fCorrTriggerMBtoNDTrackEventMatrix) {
\r
461 Printf("No %s matrix \n", "zv_pt_eta_track_trig_MBtoND_corr_matrix");
\r
464 // trigger bias correction (MBtoNSD)
\r
465 fCorrTriggerMBtoNSDTrackEventMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_trig_MBtoNSD_corr_matrix");
\r
466 if(!fCorrTriggerMBtoNSDTrackEventMatrix) {
\r
467 Printf("No %s matrix \n", "zv_pt_eta_track_trig_MBtoNSD_corr_matrix");
\r
470 // trigger bias correction (MBtoInel)
\r
471 fCorrTriggerMBtoInelTrackEventMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_trig_MBtoInel_corr_matrix");
\r
472 if(!fCorrTriggerMBtoInelTrackEventMatrix) {
\r
473 Printf("No %s matrix \n", "zv_pt_eta_track_trig_MBtoInel_corr_matrix");
\r
476 // vertex reconstruction efficiency correction (zv,pt,eta)
\r
477 fCorrTrackEventMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_event_corr_matrix");
\r
478 if(!fCorrTrackEventMatrix) {
\r
479 Printf("No %s matrix \n", "zv_pt_eta_track_event_corr_matrix");
\r
482 // track reconstruction efficiency correction (zv,pt,eta)
\r
483 fCorrTrackMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_corr_matrix");
\r
484 if(!fCorrTrackMatrix) {
\r
485 Printf("No %s matrix \n", "zv_pt_eta_track_corr_matrix");
\r
488 // secondary tracks contamination correction (zv,pt,eta)
\r
489 fContTrackMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_cont_matrix");
\r
490 if(!fContTrackMatrix) {
\r
491 Printf("No %s matrix \n", "zv_pt_eta_track_cont_matrix");
\r
494 // multiply reconstructed tracks correction
\r
495 fContMultTrackMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_mult_track_cont_matrix");
\r
496 if(!fContMultTrackMatrix) {
\r
497 Printf("No %s matrix \n", "zv_pt_eta_mult_track_cont_matrix");
\r
504 //_____________________________________________________________________________
\r
505 void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
\r
508 // Process real and/or simulated events
\r
511 AliDebug(AliLog::kError, "esdEvent not available");
\r
515 // get selection cuts
\r
516 AlidNdPtEventCuts *evtCuts = GetEventCuts();
\r
517 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
\r
518 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
\r
520 if(!evtCuts || !accCuts || !esdTrackCuts) {
\r
521 AliDebug(AliLog::kError, "cuts not available");
\r
525 // trigger selection
\r
526 Bool_t isEventTriggered = kTRUE;
\r
527 if(evtCuts->IsTriggerRequired()) {
\r
528 static AliTriggerAnalysis* triggerAnalysis = new AliTriggerAnalysis;
\r
529 isEventTriggered = triggerAnalysis->IsTriggerFired(esdEvent, GetTrigger());
\r
532 // use MC information
\r
533 AliHeader* header = 0;
\r
534 AliGenEventHeader* genHeader = 0;
\r
535 AliStack* stack = 0;
\r
537 AliPWG0Helper::MCProcessType evtType = AliPWG0Helper::kInvalidProcess;
\r
538 Int_t multMCTrueTracks = 0;
\r
543 AliDebug(AliLog::kError, "mcEvent not available");
\r
547 // get MC event header
\r
548 header = mcEvent->Header();
\r
550 AliDebug(AliLog::kError, "Header not available");
\r
553 // MC particle stack
\r
554 stack = mcEvent->Stack();
\r
556 AliDebug(AliLog::kError, "Stack not available");
\r
560 // get event type (ND=0x1, DD=0x2, SD=0x4)
\r
561 evtType = AliPWG0Helper::GetEventProcessType(header);
\r
562 //Printf("evtType %d \n", evtType);
\r
563 AliDebug(AliLog::kDebug+1, Form("Found process type %d", evtType));
\r
566 genHeader = header->GenEventHeader();
\r
568 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
\r
571 genHeader->PrimaryVertex(vtxMC);
\r
573 // Fill MC event histogram
\r
574 Double_t vMCEventHist1[3]={vtxMC[0],vtxMC[1],vtxMC[2]};
\r
575 fMCEventHist1->Fill(vMCEventHist1);
\r
577 // multipliticy of all MC primary tracks
\r
578 // in Zvtx, pt and eta ranges
\r
579 multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
\r
583 // get reconstructed vertex
\r
584 const AliESDVertex* vtxESD = 0;
\r
585 Bool_t isRecVertex = kFALSE;
\r
586 if(evtCuts->IsRecVertexRequired())
\r
588 Bool_t bRedoTPCVertex = evtCuts->IsRedoTPCVertex();
\r
589 Bool_t bUseConstraints = evtCuts->IsUseBeamSpotConstraint();
\r
590 vtxESD = AlidNdPtHelper::GetVertex(esdEvent,evtCuts,accCuts,esdTrackCuts,GetAnalysisMode(),kFALSE,bRedoTPCVertex,bUseConstraints);
\r
591 isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, GetAnalysisMode(), kFALSE); // should be moved to AcceptEvent
\r
593 if( IsUseMCInfo() && !evtCuts->IsRecVertexRequired() ) {
\r
594 vtxESD = new AliESDVertex(vtxMC[2],10.,genHeader->NProduced());
\r
595 isRecVertex = kTRUE;
\r
597 Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD) && isRecVertex;
\r
598 //printf("isEventOK %d \n",isEventOK);
\r
601 // get multiplicity of min. bias tracks
\r
603 Int_t multMBTracks = 0;
\r
604 if(GetAnalysisMode() == AlidNdPtHelper::kTPC || GetAnalysisMode() == AlidNdPtHelper::kMCRec) {
\r
605 multMBTracks = AlidNdPtHelper::GetTPCMBTrackMult(esdEvent,evtCuts,accCuts,esdTrackCuts);
\r
607 else if(GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kMCRec) {
\r
608 multMBTracks = AlidNdPtHelper::GetSPDMBTrackMult(esdEvent,0.0);
\r
611 AliDebug(AliLog::kError, Form("Found analysis type %s", GetAnalysisMode()));
\r
616 // correct event and track histograms
\r
618 TObjArray *allChargedTracks=0;
\r
619 Int_t multRec=0, multRecTemp=0;
\r
620 Int_t *labelsRec=0;
\r
622 if(isEventOK && isEventTriggered)
\r
624 // get all charged tracks
\r
625 //allChargedTracks = AlidNdPtHelper::GetAllChargedTracks(esdEvent,vtxESD,GetAnalysisMode());
\r
626 allChargedTracks = AlidNdPtHelper::GetAllChargedTracks(esdEvent,GetAnalysisMode());
\r
627 if(!allChargedTracks) return;
\r
629 Int_t entries = allChargedTracks->GetEntries();
\r
630 labelsRec = new Int_t[entries];
\r
632 // calculate mult of reconstructed tracks
\r
633 for(Int_t i=0; i<entries;++i)
\r
635 AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);
\r
636 if(!track) continue;
\r
637 if(accCuts->AcceptTrack(track))
\r
639 if(esdTrackCuts->AcceptTrack(track))
\r
646 for(Int_t i=0; i<entries;++i)
\r
648 AliESDtrack *track = (AliESDtrack*)allChargedTracks->At(i);
\r
649 if(!track) continue;
\r
651 if(accCuts->AcceptTrack(track))
\r
653 if(esdTrackCuts->AcceptTrack(track))
\r
655 // track-level corrections
\r
656 if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) {
\r
657 FillHistograms(track,stack,AlidNdPtHelper::kRecTracks,vtxMC[2],multRecTemp);
\r
659 FillHistograms(track,stack,AlidNdPtHelper::kRecTracks,vtxESD->GetZv(),multRecTemp);
\r
661 labelsRec[multRec] = TMath::Abs(track->GetLabel());
\r
666 // event-level corrections
\r
667 if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) {
\r
668 FillHistograms(AlidNdPtHelper::kRecEvents,vtxMC[2],multMBTracks);
\r
671 FillHistograms(AlidNdPtHelper::kRecEvents,vtxESD->GetZv(),multMBTracks);
\r
674 // control event histograms
\r
675 Double_t vRecEventHist1[3] = {vtxESD->GetXv(),vtxESD->GetYv(),vtxESD->GetZv()};
\r
676 fRecEventHist1->Fill(vRecEventHist1);
\r
679 // empty events corrections
\r
680 // no reconstructed zv
\r
681 if(isEventTriggered && multMBTracks==0) {
\r
682 if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) {
\r
683 FillHistograms(AlidNdPtHelper::kTriggeredEvents,vtxMC[2],multMBTracks);
\r
686 Double_t zv = fZvNorm->GetRandom();
\r
687 FillHistograms(AlidNdPtHelper::kTriggeredEvents,zv,multMBTracks);
\r
693 // select MC events
\r
694 if(evtCuts->AcceptMCEvent(mcEvent))
\r
697 // event histograms
\r
699 Double_t vMCEventMatrix[2] = {vtxMC[2],multMBTracks};
\r
700 fMCAllEventMultHist1->Fill(vMCEventMatrix);
\r
701 if(evtType == AliPWG0Helper::kND) {
\r
702 fMCAllNDEventMultHist1->Fill(vMCEventMatrix);
\r
704 if(evtType != AliPWG0Helper::kSD) {
\r
705 fMCAllNSDEventMultHist1->Fill(vMCEventMatrix);
\r
707 if(isEventTriggered) fMCTriggerMultHist1->Fill(vMCEventMatrix);
\r
708 if(isEventTriggered && isEventOK) fMCEventMultHist1->Fill(vMCEventMatrix);
\r
711 // MC histograms for efficiency studies
\r
713 Int_t nPart = stack->GetNtrack();
\r
714 for (Int_t iMc = 0; iMc < nPart; ++iMc)
\r
716 // print MC stack info
\r
717 //AlidNdPtHelper::PrintMCInfo(stack,iMc);
\r
719 TParticle* particle = stack->Particle(iMc);
\r
723 // only charged particles
\r
724 Double_t charge = particle->GetPDG()->Charge()/3.;
\r
728 // physical primary
\r
729 Bool_t prim = stack->IsPhysicalPrimary(iMc);
\r
731 // all primaries in acceptance
\r
732 if(!accCuts->AcceptTrack(particle)) continue;
\r
733 if(!prim) continue;
\r
735 Double_t gpt = particle->Pt();
\r
736 Double_t geta = particle->Eta();
\r
738 Double_t valMCAllTrackMultHist1[3] = {gpt,geta,multRec};
\r
739 fMCAllPrimTrackMultHist1->Fill(valMCAllTrackMultHist1);
\r
740 if(evtType == AliPWG0Helper::kND) {
\r
741 fMCNDEventAllPrimTrackMultHist1->Fill(valMCAllTrackMultHist1);
\r
743 if(evtType != AliPWG0Helper::kSD) {
\r
744 fMCNSDEventAllPrimTrackMultHist1->Fill(valMCAllTrackMultHist1);
\r
746 if(isEventTriggered) fMCTriggerPrimTrackMultHist1->Fill(valMCAllTrackMultHist1);
\r
747 if(isEventTriggered && isEventOK) fMCEventPrimTrackMultHist1->Fill(valMCAllTrackMultHist1);
\r
752 if(allChargedTracks) delete allChargedTracks; allChargedTracks = 0;
\r
753 if(labelsRec) delete [] labelsRec; labelsRec = 0;
\r
755 if(!evtCuts->IsRecVertexRequired() && vtxESD != NULL)
\r
759 //_____________________________________________________________________________
\r
760 void AlidNdPtCorrection::FillHistograms(AlidNdPtHelper::EventObject eventObj, Double_t zv, Int_t multMBTracks)
\r
763 // Fill corrected histograms
\r
766 Double_t vEventMatrix[2] = {zv,multMBTracks};
\r
768 // Correct for efficiency
\r
770 if(eventObj == AlidNdPtHelper::kRecEvents && multMBTracks>0)
\r
772 Double_t corrToMBF = GetCorrFactZvMult(fCorrEventMatrix,zv,multMBTracks);
\r
773 Double_t corrToInelF = GetCorrFactZvMult(fCorrTriggerMBtoInelEventMatrix,zv,multMBTracks);
\r
774 Double_t corrToNDF = GetCorrFactZvMult(fCorrTriggerMBtoNDEventMatrix,zv,multMBTracks);
\r
775 Double_t corrToNSDF = GetCorrFactZvMult(fCorrTriggerMBtoNSDEventMatrix,zv,multMBTracks);
\r
776 //printf("corrToMBF %f, corrToInelF %f, corrToNDF %f corrToNSDF %f \n",corrToMBF,corrToInelF,corrToNDF,corrToNSDF);
\r
778 fCorrRecEventHist1[0]->Fill(vEventMatrix);
\r
779 fCorrRecEventHist1[1]->Fill(vEventMatrix,corrToMBF);
\r
780 fCorrRecEventHist1[2]->Fill(vEventMatrix,corrToMBF*corrToInelF);
\r
781 fCorrRecEventHist1[3]->Fill(vEventMatrix,corrToMBF*corrToNDF);
\r
782 fCorrRecEventHist1[4]->Fill(vEventMatrix,corrToMBF*corrToNSDF);
\r
785 if(eventObj==AlidNdPtHelper::kTriggeredEvents && multMBTracks==0) // empty triggered events
\r
787 Int_t bin = fZvEmptyEventsNorm->FindBin(zv);
\r
788 Double_t Fz = fZvEmptyEventsNorm->GetBinContent(bin);
\r
789 Double_t corrToInelF0 = GetCorrFactZvMult(fCorrTriggerMBtoInelEventMatrix,zv,multMBTracks);
\r
790 Double_t corrToNDF0 = GetCorrFactZvMult(fCorrTriggerMBtoNDEventMatrix,zv,multMBTracks);
\r
791 Double_t corrToNSDF0 = GetCorrFactZvMult(fCorrTriggerMBtoNSDEventMatrix,zv,multMBTracks);
\r
792 //printf("Fz %f, corrToInelF0 %f, corrToNDF0 %f, corrToNSDF0 %f \n",Fz,corrToInelF0,corrToNDF0,corrToNSDF0);
\r
794 fCorrRecEventHist2[0]->Fill(vEventMatrix);
\r
795 fCorrRecEventHist2[1]->Fill(vEventMatrix,Fz);
\r
796 fCorrRecEventHist2[2]->Fill(vEventMatrix,Fz*corrToInelF0);
\r
797 fCorrRecEventHist2[3]->Fill(vEventMatrix,Fz*corrToNDF0);
\r
798 fCorrRecEventHist2[4]->Fill(vEventMatrix,Fz*corrToNSDF0);
\r
802 //_____________________________________________________________________________
\r
803 void AlidNdPtCorrection::FillHistograms(AliESDtrack *esdTrack, AliStack *stack, AlidNdPtHelper::TrackObject trackObj, Double_t zv, Int_t mult)
\r
806 // Fill ESD track and MC histograms
\r
808 if(!esdTrack) return;
\r
810 //Float_t q = esdTrack->Charge();
\r
811 Float_t pt = esdTrack->Pt();
\r
812 Float_t eta = esdTrack->Eta();
\r
813 Float_t phi = esdTrack->Phi();
\r
815 if(stack && GetAnalysisMode() == AlidNdPtHelper::kMCRec)
\r
817 Int_t label = TMath::Abs(esdTrack->GetLabel());
\r
819 TParticle* particle = stack->Particle(label);
\r
820 if(!particle) return;
\r
822 Double_t gq = particle->GetPDG()->Charge()/3.0; // Charge units |e|/3
\r
824 Float_t gpt = particle->Pt();
\r
825 Float_t geta = particle->Eta();
\r
826 Float_t gphi = particle->Phi();
\r
828 // replace reconstructed values with MC
\r
837 Double_t values[3] = {pt,eta,phi};
\r
838 fRecTrackHist1[trackObj]->Fill(values);
\r
841 // Correct for contamination and efficiency
\r
843 if(trackObj == AlidNdPtHelper::kRecTracks || GetAnalysisMode() == AlidNdPtHelper::kMCRec)
\r
845 // track level corrections
\r
846 Double_t trackEffF = GetCorrFactZvPtEta(fCorrTrackMatrix,zv,pt,eta);
\r
847 Double_t trackContF = GetContFactZvPtEta(fContTrackMatrix,zv,pt,eta);
\r
848 Double_t multTrackContF = GetContFactZvPtEta(fContMultTrackMatrix,zv,pt,eta);
\r
849 //printf("zv %f, pt %f, eta %f \n",zv,pt,eta);
\r
850 //printf("trackEffF %f, trackContF %f, multTrackContF %f \n", trackEffF, trackContF, multTrackContF);
\r
852 // track-event level corrections
\r
853 Double_t vertexEffF = GetCorrFactZvPtEta(fCorrTrackEventMatrix,zv,pt,eta);
\r
854 Double_t trigMBToInel = GetCorrFactZvPtEta(fCorrTriggerMBtoInelTrackEventMatrix,zv,pt,eta);
\r
855 Double_t trigMBToND = GetCorrFactZvPtEta(fCorrTriggerMBtoNDTrackEventMatrix,zv,pt,eta);
\r
856 Double_t trigMBToNSD = GetCorrFactZvPtEta(fCorrTriggerMBtoNSDTrackEventMatrix,zv,pt,eta);
\r
857 //printf("vertexEffF %f, trigMBToInel %f, trigMBToNSD %f \n", vertexEffF, trigMBToInel, trigMBToNSD);
\r
859 Double_t corrF[8] = { 1.0,
\r
861 trackContF*trackEffF,
\r
862 trackContF*trackEffF*multTrackContF,
\r
863 trackContF*trackEffF*multTrackContF*vertexEffF,
\r
864 trackContF*trackEffF*multTrackContF*vertexEffF*trigMBToInel,
\r
865 trackContF*trackEffF*multTrackContF*vertexEffF*trigMBToND,
\r
866 trackContF*trackEffF*multTrackContF*vertexEffF*trigMBToNSD
\r
870 Double_t valCorrRecTrackMultHist1[3] = {pt,eta,mult};
\r
871 Double_t valPtvsPt[2] = {pt,pt};
\r
872 for(Int_t i=0; i<8; i++) {
\r
873 fCorrRecTrackMultHist1[i]->Fill(valCorrRecTrackMultHist1,corrF[i]);
\r
874 fPtvsPt[i]->Fill(valPtvsPt,corrF[i]);
\r
879 //_____________________________________________________________________________
\r
880 void AlidNdPtCorrection::FillHistograms(AliStack *stack, Int_t /*label*/, AlidNdPtHelper::TrackObject /*trackObj*/, Int_t /*mult*/)
\r
882 // Fill MC histograms
\r
886 TParticle* particle = stack->Particle(label);
\r
887 if(!particle) return;
\r
889 Int_t mother_pdg = -1;
\r
890 TParticle* mother = 0;
\r
892 //TParticle* prim_mother = AlidNdPtHelper::FindPrimaryMother(stack,label);
\r
893 Int_t motherLabel = particle->GetMother(0);
\r
894 if(motherLabel>0) mother = stack->Particle(motherLabel);
\r
895 if(mother) mother_pdg = TMath::Abs(mother->GetPdgCode()); // take abs for visualisation only
\r
896 Int_t mech = particle->GetUniqueID(); // production mechanism
\r
898 Double_t gq = particle->GetPDG()->Charge()/3.0; // Charge units |e|/3
\r
899 Float_t gpt = particle->Pt();
\r
900 Float_t qgpt = particle->Pt() * gq;
\r
901 Float_t geta = particle->Eta();
\r
902 Float_t gphi = particle->Phi();
\r
903 Float_t gpz = particle->Pz();
\r
905 Bool_t prim = stack->IsPhysicalPrimary(label);
\r
906 Float_t vx = particle->Vx(); Float_t vy = particle->Vy(); Float_t vz = particle->Vz();
\r
909 if (TMath::Abs(particle->GetPdgCode()) == kElectron) { pid = 0; }
\r
910 else if (TMath::Abs(particle->GetPdgCode()) == kMuonMinus) { pid = 1; }
\r
911 else if (TMath::Abs(particle->GetPdgCode()) == kPiPlus) { pid = 2; }
\r
912 else if (TMath::Abs(particle->GetPdgCode()) == kKPlus) { pid = 3; }
\r
913 else if (TMath::Abs(particle->GetPdgCode()) == kProton) { pid = 4; }
\r
917 //if(!prim) printf("prim_mother %d, mother %d, particle %d, production mech %d\n",prim_mother->GetPdgCode(),mother->GetPdgCode(), particle->GetPdgCode(),mech);
\r
921 //_____________________________________________________________________________
\r
922 Double_t AlidNdPtCorrection::GetCorrFactZvPtEta(THnSparse *hist, Double_t zv, Double_t pt, Double_t eta) const {
\r
923 // return correction factor F(zv,pt,eta)
\r
925 if(!hist) return 1.;
\r
928 TAxis *ax = hist->GetAxis(0);
\r
929 TAxis *ay = hist->GetAxis(1);
\r
930 TAxis *az = hist->GetAxis(2);
\r
932 Int_t binx = ax->FindBin(zv);
\r
933 Int_t biny = ay->FindBin(pt);
\r
934 Int_t binz = az->FindBin(eta);
\r
935 Int_t dim[3] = {binx,biny,binz};
\r
937 Double_t fact = hist->GetBinContent(dim);
\r
942 //_____________________________________________________________________________
\r
943 Double_t AlidNdPtCorrection::GetContFactZvPtEta(THnSparse *hist, Double_t zv, Double_t pt, Double_t eta) const {
\r
944 // return contamination correction factor F(zv,pt,eta)
\r
946 if(!hist) return 1.0;
\r
949 TAxis *ax = hist->GetAxis(0);
\r
950 TAxis *ay = hist->GetAxis(1);
\r
951 TAxis *az = hist->GetAxis(2);
\r
953 Int_t binx = ax->FindBin(zv);
\r
954 Int_t biny = ay->FindBin(pt);
\r
955 Int_t binz = az->FindBin(eta);
\r
956 Int_t dim[3] = {binx,biny,binz};
\r
958 Double_t fact = 1.0-hist->GetBinContent(dim);
\r
959 //Double_t fact = hist->GetBinContent(dim);
\r
964 //_____________________________________________________________________________
\r
965 Double_t AlidNdPtCorrection::GetCorrFactZvMult(THnSparse *hist, Double_t zv, Int_t mult) const {
\r
966 // return correction factor F(zv,mult)
\r
968 if(!hist) return 1.;
\r
970 TAxis *ax = hist->GetAxis(0);
\r
971 TAxis *ay = hist->GetAxis(1);
\r
972 Int_t binx = ax->FindBin(zv);
\r
973 Int_t biny = ay->FindBin(mult);
\r
974 Int_t dim[2] = {binx,biny};
\r
976 Double_t fact = hist->GetBinContent(dim);
\r
982 //_____________________________________________________________________________
\r
983 Double_t AlidNdPtCorrection::GetContFactZvMult(THnSparse *hist, Double_t zv, Int_t mult) const {
\r
984 // return contamination correction factor F(zv,mult)
\r
986 if(!hist) return 1.;
\r
988 TAxis *ax = hist->GetAxis(0);
\r
989 TAxis *ay = hist->GetAxis(1);
\r
990 Int_t binx = ax->FindBin(zv);
\r
991 Int_t biny = ay->FindBin(mult);
\r
992 Int_t dim[2] = {binx,biny};
\r
993 Double_t fact = 1.0-hist->GetBinContent(dim);
\r
998 //_____________________________________________________________________________
\r
999 Long64_t AlidNdPtCorrection::Merge(TCollection* list)
\r
1001 // Merge list of objects (needed by PROOF)
\r
1006 if (list->IsEmpty())
\r
1009 TIterator* iter = list->MakeIterator();
\r
1012 // collection of generated histograms
\r
1015 while((obj = iter->Next()) != 0) {
\r
1016 AlidNdPtCorrection* entry = dynamic_cast<AlidNdPtCorrection*>(obj);
\r
1017 if (entry == 0) continue;
\r
1019 fMCEventHist1->Add(entry->fMCEventHist1);
\r
1020 fRecEventHist1->Add(entry->fRecEventHist1);
\r
1022 fMCAllEventMultHist1->Add(entry->fMCAllEventMultHist1);
\r
1023 fMCAllNDEventMultHist1->Add(entry->fMCAllNDEventMultHist1);
\r
1024 fMCAllNSDEventMultHist1->Add(entry->fMCAllNSDEventMultHist1);
\r
1025 fMCTriggerMultHist1->Add(entry->fMCTriggerMultHist1);
\r
1026 fMCEventMultHist1->Add(entry->fMCEventMultHist1);
\r
1028 fMCAllPrimTrackMultHist1->Add(entry->fMCAllPrimTrackMultHist1);
\r
1029 fMCNDEventAllPrimTrackMultHist1->Add(entry->fMCNDEventAllPrimTrackMultHist1);
\r
1030 fMCNSDEventAllPrimTrackMultHist1->Add(entry->fMCNSDEventAllPrimTrackMultHist1);
\r
1031 fMCTriggerPrimTrackMultHist1->Add(entry->fMCTriggerPrimTrackMultHist1);
\r
1032 fMCEventPrimTrackMultHist1->Add(entry->fMCEventPrimTrackMultHist1);
\r
1034 for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) {
\r
1035 fRecTrackHist1[i]->Add(entry->fRecTrackHist1[i]);
\r
1038 for(Int_t i=0; i<8; i++) {
\r
1039 fCorrRecTrackMultHist1[i]->Add(entry->fCorrRecTrackMultHist1[i]);
\r
1040 fPtvsPt[i]->Add(entry->fPtvsPt[i]);
\r
1043 for(Int_t i=0; i<5; i++) {
\r
1044 fCorrRecEventHist1[i]->Add(entry->fCorrRecEventHist1[i]);
\r
1045 fCorrRecEventHist2[i]->Add(entry->fCorrRecEventHist2[i]);
\r
1054 Int_t AlidNdPtCorrection::GetTrueMult(THnSparse *hist, Int_t mult)
\r
1056 if(!hist) return 0;
\r
1057 Int_t true_mult = 0;
\r
1060 TAxis *ax = hist->GetAxis(0);
\r
1061 TAxis *ay = hist->GetAxis(1);
\r
1062 ax->SetRange(1,ax->GetNbins());
\r
1063 ay->SetRange(1,ay->GetNbins());
\r
1066 ax->SetRangeUser((Float_t)mult,(Float_t)mult);
\r
1068 // get true multiplicity
\r
1069 TH1D *h1 = (TH1D *)hist->Projection(1);
\r
1070 true_mult = (Int_t)h1->GetMean();
\r
1075 //_____________________________________________________________________________
\r
1076 void AlidNdPtCorrection::Analyse()
\r
1078 // Analyse histograms
\r
1080 TH1::AddDirectory(kFALSE);
\r
1081 TH1 *h = 0, *hs=0, *hsc=0;
\r
1084 TObjArray *aFolderObj = new TObjArray;
\r
1089 AlidNdPtEventCuts *evtCuts = GetEventCuts();
\r
1090 AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts();
\r
1091 AliESDtrackCuts *esdTrackCuts = GetTrackCuts();
\r
1093 if(!evtCuts || !accCuts || !esdTrackCuts) {
\r
1094 Error("AlidNdPtCutAnalysis::Analyse()", "cuts not available");
\r
1099 // set min and max values
\r
1101 Double_t minPt = accCuts->GetMinPt();
\r
1102 Double_t maxPt = accCuts->GetMaxPt();
\r
1103 Double_t minEta = accCuts->GetMinEta();
\r
1104 Double_t maxEta = accCuts->GetMaxEta()-0.00001;
\r
1110 for(Int_t i=0; i<8; i++) {
\r
1111 h2D = fPtvsPt[i]->Projection(1,0);
\r
1112 sprintf(name,"PtvsMeanPt_%d",i);
\r
1113 aFolderObj->Add(h2D);
\r
1119 h = fCorrRecEventHist1[0]->Projection(1);
\r
1120 h->SetName("mult_event_not_corrected");
\r
1121 aFolderObj->Add(h);
\r
1123 h = fCorrRecEventHist1[1]->Projection(1);
\r
1124 h->SetName("mult_event_vertex_corrected");
\r
1125 aFolderObj->Add(h);
\r
1127 h = fCorrRecEventHist1[2]->Projection(1);
\r
1128 h->SetName("mult_trigger_vertex_corrected");
\r
1129 aFolderObj->Add(h);
\r
1131 h = fCorrRecEventHist1[3]->Projection(1);
\r
1132 h->SetName("mult_ND_trigger_vertex_corrected");
\r
1133 aFolderObj->Add(h);
\r
1135 h = fCorrRecEventHist1[4]->Projection(1);
\r
1136 h->SetName("mult_NSD_trigger_vertex_corrected");
\r
1137 aFolderObj->Add(h);
\r
1140 h = fCorrRecEventHist2[0]->Projection(1);
\r
1141 h->SetName("mult_empty_event_not_corrected");
\r
1142 aFolderObj->Add(h);
\r
1144 h = fCorrRecEventHist2[1]->Projection(1);
\r
1145 h->SetName("mult_empty_event_vertex_corrected");
\r
1146 aFolderObj->Add(h);
\r
1148 h = fCorrRecEventHist2[2]->Projection(1);
\r
1149 h->SetName("mult_empty_trigger_vertex_corrected");
\r
1150 aFolderObj->Add(h);
\r
1152 h = fCorrRecEventHist2[3]->Projection(1);
\r
1153 h->SetName("mult_empty_ND_trigger_vertex_corrected");
\r
1154 aFolderObj->Add(h);
\r
1156 h = fCorrRecEventHist2[4]->Projection(1);
\r
1157 h->SetName("mult_empty_NSD_trigger_vertex_corrected");
\r
1158 aFolderObj->Add(h);
\r
1163 if(IsUseMCInfo()) {
\r
1166 h = fMCAllEventMultHist1->Projection(1);
\r
1167 h->SetName("mc_mult_event_acc_prim");
\r
1168 aFolderObj->Add(h);
\r
1170 h = fMCAllNDEventMultHist1->Projection(1);
\r
1171 h->SetName("mc_mult_ND_event_acc_prim");
\r
1172 aFolderObj->Add(h);
\r
1174 h = fMCAllNSDEventMultHist1->Projection(1);
\r
1175 h->SetName("mc_mult_NSD_event_acc_prim");
\r
1176 aFolderObj->Add(h);
\r
1178 h = fMCTriggerMultHist1->Projection(1);
\r
1179 h->SetName("mc_mult_trigger_acc_prim");
\r
1180 aFolderObj->Add(h);
\r
1182 h = fMCEventMultHist1->Projection(1);
\r
1183 h->SetName("mc_mult_trigger_event_acc_prim");
\r
1184 aFolderObj->Add(h);
\r
1191 // limit eta range
\r
1192 for(Int_t i=0;i<8;i++) {
\r
1193 fCorrRecTrackMultHist1[i]->GetAxis(0)->SetRangeUser(minPt,maxPt);
\r
1194 fCorrRecTrackMultHist1[i]->GetAxis(1)->SetRangeUser(minEta,maxEta);
\r
1196 fMCAllPrimTrackMultHist1->GetAxis(0)->SetRangeUser(minPt,maxPt);
\r
1197 fMCAllPrimTrackMultHist1->GetAxis(1)->SetRangeUser(minEta,maxEta);
\r
1199 fMCNDEventAllPrimTrackMultHist1->GetAxis(0)->SetRangeUser(minPt,maxPt);
\r
1200 fMCNDEventAllPrimTrackMultHist1->GetAxis(1)->SetRangeUser(minEta,maxEta);
\r
1202 fMCNSDEventAllPrimTrackMultHist1->GetAxis(0)->SetRangeUser(minPt,maxPt);
\r
1203 fMCNSDEventAllPrimTrackMultHist1->GetAxis(1)->SetRangeUser(minEta,maxEta);
\r
1205 fMCTriggerPrimTrackMultHist1->GetAxis(0)->SetRangeUser(minPt,maxPt);
\r
1206 fMCTriggerPrimTrackMultHist1->GetAxis(1)->SetRangeUser(minEta,maxEta);
\r
1208 fMCEventPrimTrackMultHist1->GetAxis(0)->SetRangeUser(minPt,maxPt);
\r
1209 fMCEventPrimTrackMultHist1->GetAxis(1)->SetRangeUser(minEta,maxEta);
\r
1211 } // end use MC info
\r
1214 h2D = fCorrRecTrackMultHist1[3]->Projection(1,0);
\r
1215 h2D->SetName("pt_eta_rec_track_mult_eff_cont_corrected");
\r
1216 aFolderObj->Add(h2D);
\r
1218 h2D = fCorrRecTrackMultHist1[4]->Projection(1,0);
\r
1219 h2D->SetName("pt_eta_rec_event_track_mult_eff_cont_corrected");
\r
1220 aFolderObj->Add(h2D);
\r
1222 h2D = fCorrRecTrackMultHist1[5]->Projection(1,0);
\r
1223 h2D->SetName("pt_eta_rec_trig_event_track_mult_eff_cont_corrected");
\r
1224 aFolderObj->Add(h2D);
\r
1226 h2D = fCorrRecTrackMultHist1[6]->Projection(1,0);
\r
1227 h2D->SetName("pt_eta_rec_ND_trig_event_track_mult_eff_cont_corrected");
\r
1228 aFolderObj->Add(h2D);
\r
1230 h2D = fCorrRecTrackMultHist1[7]->Projection(1,0);
\r
1231 h2D->SetName("pt_eta_rec_NSD_trig_event_track_mult_eff_cont_corrected");
\r
1232 aFolderObj->Add(h2D);
\r
1236 h2D = fCorrRecTrackMultHist1[3]->Projection(2,0);
\r
1237 h2D->SetName("pt_mult_rec_track_mult_eff_cont_corrected");
\r
1238 aFolderObj->Add(h2D);
\r
1240 h2D = fCorrRecTrackMultHist1[4]->Projection(2,0);
\r
1241 h2D->SetName("pt_mult_rec_event_track_mult_eff_cont_corrected");
\r
1242 aFolderObj->Add(h2D);
\r
1244 h2D = fCorrRecTrackMultHist1[5]->Projection(2,0);
\r
1245 h2D->SetName("pt_mult_rec_trig_event_track_mult_eff_cont_corrected");
\r
1246 aFolderObj->Add(h2D);
\r
1248 h2D = fCorrRecTrackMultHist1[6]->Projection(2,0);
\r
1249 h2D->SetName("pt_mult_rec_ND_trig_event_track_mult_eff_cont_corrected");
\r
1250 aFolderObj->Add(h2D);
\r
1252 h2D = fCorrRecTrackMultHist1[7]->Projection(2,0);
\r
1253 h2D->SetName("pt_mult_rec_NSD_trig_event_track_mult_eff_cont_corrected");
\r
1254 aFolderObj->Add(h2D);
\r
1258 h = fCorrRecTrackMultHist1[0]->Projection(0);
\r
1259 h->SetName("pt_rec_track_not_corrected");
\r
1260 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1261 hs->SetName("pt_rec_track_not_corrected_s");
\r
1262 aFolderObj->Add(hs);
\r
1265 h = fCorrRecTrackMultHist1[1]->Projection(0);
\r
1266 h->SetName("pt_rec_track_cont_corrected");
\r
1267 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1268 hs->SetName("pt_rec_track_cont_corrected_s");
\r
1269 aFolderObj->Add(hs);
\r
1271 hsc = (TH1D*)hs->Clone("pt_rec_track_cont_corr_fact");
\r
1272 hsc->Divide((TH1D*)aFolderObj->FindObject("pt_rec_track_not_corrected_s"));
\r
1273 aFolderObj->Add(hsc);
\r
1276 h = fCorrRecTrackMultHist1[2]->Projection(0);
\r
1277 h->SetName("pt_rec_track_eff_cont_corrected");
\r
1278 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1279 hs->SetName("pt_rec_track_eff_cont_corrected_s");
\r
1280 aFolderObj->Add(hs);
\r
1282 hsc = (TH1D*)hs->Clone("pt_rec_track_eff_corr_fact");
\r
1283 hsc->Divide((TH1D*)aFolderObj->FindObject("pt_rec_track_cont_corrected_s"));
\r
1284 aFolderObj->Add(hsc);
\r
1287 h = fCorrRecTrackMultHist1[3]->Projection(0);
\r
1288 h->SetName("pt_rec_track_mult_eff_cont_corrected");
\r
1289 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1290 hs->SetName("pt_rec_track_mult_eff_cont_corrected_s");
\r
1291 aFolderObj->Add(hs);
\r
1293 hsc = (TH1D*)hs->Clone("pt_rec_track_mult_corr_fact");
\r
1294 hsc->Divide((TH1D*)aFolderObj->FindObject("pt_rec_track_eff_cont_corrected_s"));
\r
1295 aFolderObj->Add(hsc);
\r
1297 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1298 hsc = (TH1D*)hs->Clone("pt_rec_track_mult_eff_cont_corr_fact");
\r
1299 hsc->Divide((TH1D*)aFolderObj->FindObject("pt_rec_track_not_corrected_s"));
\r
1300 aFolderObj->Add(hsc);
\r
1302 hsc = (TH1D*)hs->Clone();
\r
1303 hsc->SetName("pt_rec_track_mult_eff_cont_corrected_s_norm");
\r
1304 hsc->Scale(1./(fCorrRecEventHist1[0]->Projection(1)->Integral()));
\r
1305 aFolderObj->Add(hsc);
\r
1308 h = fCorrRecTrackMultHist1[4]->Projection(0);
\r
1309 h->SetName("pt_rec_event_track_mult_eff_cont_corrected");
\r
1310 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1311 hs->SetName("pt_rec_event_track_mult_eff_cont_corrected_s");
\r
1312 aFolderObj->Add(hs);
\r
1314 hsc = (TH1D*)hs->Clone();
\r
1315 hsc->SetName("pt_rec_event_track_mult_eff_cont_corrected_s_norm");
\r
1316 hsc->Scale(1./(fCorrRecEventHist1[1]->Projection(1)->Integral()+fCorrRecEventHist2[1]->Projection(1)->Integral()));
\r
1317 aFolderObj->Add(hsc);
\r
1320 h = fCorrRecTrackMultHist1[5]->Projection(0);
\r
1321 h->SetName("pt_rec_trig_event_track_mult_eff_cont_corrected");
\r
1322 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1323 hs->SetName("pt_rec_trig_event_track_mult_eff_cont_corrected_s");
\r
1324 aFolderObj->Add(hs);
\r
1326 hsc = (TH1D*)hs->Clone();
\r
1327 hsc->SetName("pt_rec_trig_event_track_mult_eff_cont_corrected_s_norm");
\r
1328 hsc->Scale(1./(fCorrRecEventHist1[2]->Projection(1)->Integral() + fCorrRecEventHist2[2]->Projection(1)->Integral()));
\r
1329 aFolderObj->Add(hsc);
\r
1332 h = fCorrRecTrackMultHist1[6]->Projection(0);
\r
1333 h->SetName("pt_rec_ND_trig_event_track_mult_eff_cont_corrected");
\r
1334 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1335 hs->SetName("pt_rec_ND_trig_event_track_mult_eff_cont_corrected_s");
\r
1336 aFolderObj->Add(hs);
\r
1338 hsc = (TH1D*)hs->Clone();
\r
1339 hsc->SetName("pt_rec_ND_trig_event_track_mult_eff_cont_corrected_s_norm");
\r
1340 hsc->Scale(1./(fCorrRecEventHist1[3]->Projection(1)->Integral()+fCorrRecEventHist2[3]->Projection(1)->Integral()));
\r
1341 aFolderObj->Add(hsc);
\r
1344 h = fCorrRecTrackMultHist1[7]->Projection(0);
\r
1345 h->SetName("pt_rec_NSD_trig_event_track_mult_eff_cont_corrected");
\r
1346 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1347 hs->SetName("pt_rec_NSD_trig_event_track_mult_eff_cont_corrected_s");
\r
1348 aFolderObj->Add(hs);
\r
1350 hsc = (TH1D*)hs->Clone();
\r
1351 hsc->SetName("pt_rec_NSD_trig_event_track_mult_eff_cont_corrected_s_norm");
\r
1352 hsc->Scale(1./(fCorrRecEventHist1[4]->Projection(1)->Integral()+fCorrRecEventHist2[4]->Projection(1)->Integral()));
\r
1353 aFolderObj->Add(hsc);
\r
1356 h = fCorrRecTrackMultHist1[0]->Projection(1);
\r
1357 h->SetName("eta_rec_track_not_corrected");
\r
1358 aFolderObj->Add(h);
\r
1360 h = fCorrRecTrackMultHist1[1]->Projection(1);
\r
1361 h->SetName("eta_rec_track_cont_corrected");
\r
1362 aFolderObj->Add(h);
\r
1364 h = fCorrRecTrackMultHist1[2]->Projection(1);
\r
1365 h->SetName("eta_rec_track_eff_cont_corrected");
\r
1366 aFolderObj->Add(h);
\r
1368 h = fCorrRecTrackMultHist1[3]->Projection(1);
\r
1369 h->SetName("eta_rec_track_mult_eff_cont_corrected");
\r
1370 aFolderObj->Add(h);
\r
1372 h = fCorrRecTrackMultHist1[4]->Projection(1);
\r
1373 h->SetName("eta_rec_event_track_mult_eff_cont_corrected");
\r
1374 aFolderObj->Add(h);
\r
1376 h = fCorrRecTrackMultHist1[5]->Projection(1);
\r
1377 h->SetName("eta_rec_trig_event_track_mult_eff_cont_corrected");
\r
1378 aFolderObj->Add(h);
\r
1380 h = fCorrRecTrackMultHist1[6]->Projection(1);
\r
1381 h->SetName("eta_rec_ND_trig_event_track_mult_eff_cont_corrected");
\r
1382 aFolderObj->Add(h);
\r
1384 h = fCorrRecTrackMultHist1[7]->Projection(1);
\r
1385 h->SetName("eta_rec_NSD_trig_event_track_mult_eff_cont_corrected");
\r
1386 aFolderObj->Add(h);
\r
1392 if(IsUseMCInfo()) {
\r
1395 h2D = fMCAllPrimTrackMultHist1->Projection(2,0);
\r
1396 h2D->SetName("mc_all_pt_mult_acc_prim");
\r
1397 aFolderObj->Add(h2D);
\r
1399 h2D = fMCAllPrimTrackMultHist1->Projection(1,0);
\r
1400 h2D->SetName("mc_all_eta_pt_acc_prim");
\r
1401 aFolderObj->Add(h2D);
\r
1403 h2D = fMCNDEventAllPrimTrackMultHist1->Projection(2,0);
\r
1404 h2D->SetName("mc_ND_all_pt_mult_acc_prim");
\r
1405 aFolderObj->Add(h2D);
\r
1407 h2D = fMCNDEventAllPrimTrackMultHist1->Projection(1,0);
\r
1408 h2D->SetName("mc_ND_all_eta_pt_acc_prim");
\r
1409 aFolderObj->Add(h2D);
\r
1411 h2D = fMCNSDEventAllPrimTrackMultHist1->Projection(2,0);
\r
1412 h2D->SetName("mc_NSD_all_pt_mult_acc_prim");
\r
1413 aFolderObj->Add(h2D);
\r
1415 h2D = fMCNSDEventAllPrimTrackMultHist1->Projection(1,0);
\r
1416 h2D->SetName("mc_NSD_all_eta_pt_acc_prim");
\r
1417 aFolderObj->Add(h2D);
\r
1421 h = fMCAllPrimTrackMultHist1->Projection(0);
\r
1422 h->SetName("mc_all_pt_acc_prim");
\r
1423 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1424 hs->SetName("mc_all_pt_acc_prim_s");
\r
1425 aFolderObj->Add(hs);
\r
1427 hsc = (TH1D*)hs->Clone();
\r
1428 hsc->SetName("mc_all_pt_acc_prim_s_norm");
\r
1429 hsc->Scale(1./fMCAllEventMultHist1->Projection(1)->Integral());
\r
1430 aFolderObj->Add(hsc);
\r
1432 h = fMCNDEventAllPrimTrackMultHist1->Projection(0);
\r
1433 h->SetName("mc_ND_all_pt_acc_prim");
\r
1434 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1435 hs->SetName("mc_ND_all_pt_acc_prim_s");
\r
1436 aFolderObj->Add(hs);
\r
1438 hsc = (TH1D*)hs->Clone();
\r
1439 hsc->SetName("mc_ND_all_pt_acc_prim_s_norm");
\r
1440 hsc->Scale(1./fMCAllNDEventMultHist1->Projection(1)->Integral());
\r
1441 aFolderObj->Add(hsc);
\r
1443 h = fMCNSDEventAllPrimTrackMultHist1->Projection(0);
\r
1444 h->SetName("mc_NSD_all_pt_acc_prim");
\r
1445 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1446 hs->SetName("mc_NSD_all_pt_acc_prim_s");
\r
1447 aFolderObj->Add(hs);
\r
1449 hsc = (TH1D*)hs->Clone();
\r
1450 hsc->SetName("mc_NSD_all_pt_acc_prim_s_norm");
\r
1451 hsc->Scale(1./fMCAllNSDEventMultHist1->Projection(1)->Integral());
\r
1452 aFolderObj->Add(hsc);
\r
1454 h = fMCTriggerPrimTrackMultHist1->Projection(0);
\r
1455 h->SetName("mc_trigger_all_pt_acc_prim");
\r
1456 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1457 hs->SetName("mc_trigger_all_pt_acc_prim_s");
\r
1458 aFolderObj->Add(hs);
\r
1460 hsc = (TH1D*)hs->Clone();
\r
1461 hsc->SetName("mc_trigger_all_pt_acc_prim_s_norm");
\r
1462 hsc->Scale(1./fMCTriggerMultHist1->Projection(1)->Integral());
\r
1463 aFolderObj->Add(hsc);
\r
1465 h = fMCEventPrimTrackMultHist1->Projection(0);
\r
1466 h->SetName("mc_all_pt_acc_trig_event_prim");
\r
1467 hs = AlidNdPtHelper::ScaleByBinWidth(h);
\r
1468 hs->SetName("mc_all_pt_acc_trig_event_prim_s");
\r
1469 aFolderObj->Add(hs);
\r
1471 hsc = (TH1D*)hs->Clone();
\r
1472 hsc->SetName("mc_all_pt_acc_trig_event_prim_s_norm");
\r
1473 hsc->Scale(1./fMCEventMultHist1->Projection(1)->Integral());
\r
1474 aFolderObj->Add(hsc);
\r
1478 h = fMCAllPrimTrackMultHist1->Projection(1);
\r
1479 h->SetName("mc_all_eta_acc_prim");
\r
1480 aFolderObj->Add(h);
\r
1482 h = fMCNDEventAllPrimTrackMultHist1->Projection(1);
\r
1483 h->SetName("mc_ND_all_eta_acc_prim");
\r
1484 aFolderObj->Add(h);
\r
1486 h = fMCNSDEventAllPrimTrackMultHist1->Projection(1);
\r
1487 h->SetName("mc_NSD_all_eta_acc_prim");
\r
1488 aFolderObj->Add(h);
\r
1490 h = fMCTriggerPrimTrackMultHist1->Projection(1);
\r
1491 h->SetName("mc_trigger_all_eta_acc_prim");
\r
1492 aFolderObj->Add(h);
\r
1494 h = fMCEventPrimTrackMultHist1->Projection(1);
\r
1495 h->SetName("mc_all_eta_acc_trig_event_prim");
\r
1496 aFolderObj->Add(h);
\r
1499 // calculate ratios (rec / mc)
\r
1502 hs = (TH1*)aFolderObj->FindObject("pt_rec_trig_event_track_mult_eff_cont_corrected_s_norm");
\r
1503 hsc = (TH1D*)hs->Clone("ratio_pt_rec_to_mc_trig_event_track_mult_eff_cont_corrected");
\r
1505 hsc->Divide((TH1*)aFolderObj->FindObject("mc_all_pt_acc_prim_s_norm"));
\r
1506 aFolderObj->Add(hsc);
\r
1508 hs = (TH1*)aFolderObj->FindObject("eta_rec_trig_event_track_mult_eff_cont_corrected");
\r
1509 hsc = (TH1D*)hs->Clone("ratio_eta_rec_to_mc_trig_event_track_mult_eff_cont_corrected");
\r
1511 hsc->Divide((TH1*)aFolderObj->FindObject("mc_all_eta_acc_prim"));
\r
1512 aFolderObj->Add(hsc);
\r
1515 hs = (TH1*)aFolderObj->FindObject("pt_rec_ND_trig_event_track_mult_eff_cont_corrected_s_norm");
\r
1516 hsc = (TH1D*)hs->Clone("ratio_pt_rec_to_mc_ND_trig_event_track_mult_eff_cont_corrected");
\r
1518 hsc->Divide((TH1*)aFolderObj->FindObject("mc_ND_all_pt_acc_prim_s_norm"));
\r
1519 aFolderObj->Add(hsc);
\r
1521 hs = (TH1*)aFolderObj->FindObject("eta_rec_ND_trig_event_track_mult_eff_cont_corrected");
\r
1522 hsc = (TH1D*)hs->Clone("ratio_eta_rec_to_mc_ND_trig_event_track_mult_eff_cont_corrected");
\r
1524 hsc->Divide((TH1*)aFolderObj->FindObject("mc_ND_all_eta_acc_prim"));
\r
1525 aFolderObj->Add(hsc);
\r
1528 hs = (TH1*)aFolderObj->FindObject("pt_rec_NSD_trig_event_track_mult_eff_cont_corrected_s_norm");
\r
1529 hsc = (TH1D*)hs->Clone("ratio_pt_rec_to_mc_NSD_trig_event_track_mult_eff_cont_corrected");
\r
1531 hsc->Divide((TH1*)aFolderObj->FindObject("mc_NSD_all_pt_acc_prim_s_norm"));
\r
1532 aFolderObj->Add(hsc);
\r
1534 hs = (TH1*)aFolderObj->FindObject("eta_rec_NSD_trig_event_track_mult_eff_cont_corrected");
\r
1535 hsc = (TH1D*)hs->Clone("ratio_eta_rec_to_mc_NSD_trig_event_track_mult_eff_cont_corrected");
\r
1537 hsc->Divide((TH1*)aFolderObj->FindObject("mc_NSD_all_eta_acc_prim"));
\r
1538 aFolderObj->Add(hsc);
\r
1541 hs = (TH1*)aFolderObj->FindObject("pt_rec_event_track_mult_eff_cont_corrected_s_norm");
\r
1542 hsc = (TH1D*)hs->Clone("ratio_pt_rec_to_mc_event_track_mult_eff_cont_corrected");
\r
1544 hsc->Divide((TH1*)aFolderObj->FindObject("mc_trigger_all_pt_acc_prim_s_norm"));
\r
1545 aFolderObj->Add(hsc);
\r
1547 hs = (TH1*)aFolderObj->FindObject("eta_rec_event_track_mult_eff_cont_corrected");
\r
1548 hsc = (TH1D*)hs->Clone("ratio_eta_rec_to_mc_event_track_mult_eff_cont_corrected");
\r
1550 hsc->Divide((TH1*)aFolderObj->FindObject("mc_trigger_all_eta_acc_prim"));
\r
1551 aFolderObj->Add(hsc);
\r
1554 hs = (TH1*)aFolderObj->FindObject("pt_rec_track_mult_eff_cont_corrected_s_norm");
\r
1555 hsc = (TH1D*)hs->Clone("ratio_pt_rec_to_mc_track_mult_eff_cont_corrected");
\r
1557 hsc->Divide((TH1*)aFolderObj->FindObject("mc_all_pt_acc_trig_event_prim_s_norm"));
\r
1558 aFolderObj->Add(hsc);
\r
1560 hs = (TH1*)aFolderObj->FindObject("eta_rec_track_mult_eff_cont_corrected");
\r
1561 hsc = (TH1D*)hs->Clone("ratio_eta_rec_to_mc_track_mult_eff_cont_corrected");
\r
1563 hsc->Divide((TH1*)aFolderObj->FindObject("mc_all_eta_acc_trig_event_prim"));
\r
1564 aFolderObj->Add(hsc);
\r
1566 } // end MC infor available
\r
1568 // export objects to analysis folder
\r
1569 fCorrectionFolder = ExportToFolder(aFolderObj);
\r
1571 // delete only TObjArray
\r
1572 if(aFolderObj) delete aFolderObj;
\r
1575 //_____________________________________________________________________________
\r
1576 TFolder* AlidNdPtCorrection::ExportToFolder(TObjArray * array)
\r
1578 // recreate folder avery time and export objects to new one
\r
1580 AlidNdPtCorrection * comp=this;
\r
1581 TFolder *folder = comp->GetCorrectionFolder();
\r
1583 TString name, title;
\r
1584 TFolder *newFolder = 0;
\r
1586 Int_t size = array->GetSize();
\r
1589 // get name and title from old folder
\r
1590 name = folder->GetName();
\r
1591 title = folder->GetTitle();
\r
1597 newFolder = CreateFolder(name.Data(),title.Data());
\r
1598 newFolder->SetOwner();
\r
1600 // add objects to folder
\r
1602 newFolder->Add(array->At(i));
\r
1610 //_____________________________________________________________________________
\r
1611 TFolder* AlidNdPtCorrection::CreateFolder(TString name,TString title) {
\r
1612 // create folder for analysed histograms
\r
1614 TFolder *folder = 0;
\r
1615 folder = new TFolder(name.Data(),title.Data());
\r