1 // *************************************************************************
3 // * corrections to Fragmentation Functions *
5 // *************************************************************************
8 /**************************************************************************
9 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
11 * Author: The ALICE Off-line Project. *
12 * Contributors are mentioned in the code where appropriate. *
14 * Permission to use, copy, modify and distribute this software and its *
15 * documentation strictly for non-commercial purposes is hereby granted *
16 * without fee, provided that the above copyright notice appears in all *
17 * copies and that both the copyright notice and this permission notice *
18 * appear in the supporting documentation. The authors make no claims *
19 * about the suitability of this software for any purpose. It is *
20 * provided "as is" without express or implied warranty. *
21 **************************************************************************/
27 #include "THnSparse.h"
29 #include "TDirectory.h"
30 #include "AliCFUnfolding.h"
31 #include "AliFragmentationFunctionCorrections.h"
33 ///////////////////////////////////////////////////////////////////////////////
35 // correction class for ouput of AliAnalysisTaskFragmentationFunction //
37 // corrections for: reconstruction efficiency, momentum resolution, //
38 // secondaries, UE / HI background, fluctuations //
39 // back-correction on jet energy on dN/dxi //
41 // read MC ouput and write out efficiency histos, response matrices etc. //
42 // read measured distributions and apply efficiency, response matrices etc. //
44 // contact: o.busch@gsi.de //
46 ///////////////////////////////////////////////////////////////////////////////
49 ClassImp(AliFragmentationFunctionCorrections)
51 //________________________________________________________________________
52 AliFragmentationFunctionCorrections::AliFragmentationFunctionCorrections()
59 ,fNHistoBinsSinglePt(0)
60 ,fHistoBinsSinglePt(0)
67 ,fNCorrectionLevels(0)
69 ,fNCorrectionLevelsBgr(0)
71 ,fNCorrectionLevelsSinglePt(0)
81 ,fh1FFTrackPtBackFolded(0)
84 ,fh1FFRatioTrackPtFolded(0)
86 ,fh1FFRatioXiFolded(0)
87 ,fh1FFRatioTrackPtBackFolded(0)
88 ,fh1FFRatioZBackFolded(0)
89 ,fh1FFRatioXiBackFolded(0)
90 ,fh1SingleTrackPtBackFolded(0)
91 ,fh1RatioSingleTrackPtFolded(0)
92 ,fh1RatioSingleTrackPtBackFolded(0)
93 ,fhnResponseSinglePt(0)
100 ,fh1SecCorrSinglePt(0)
102 // default constructor
105 //________________________________________________________________________________________________________________________
106 AliFragmentationFunctionCorrections::AliFragmentationFunctionCorrections(const AliFragmentationFunctionCorrections ©)
109 ,fNJetPtSlices(copy.fNJetPtSlices)
110 ,fJetPtSlices(copy.fJetPtSlices)
112 ,fNJetsBgr(copy.fNJetsBgr)
113 ,fNHistoBinsSinglePt(copy.fNHistoBinsSinglePt)
114 ,fHistoBinsSinglePt(copy.fHistoBinsSinglePt)
115 ,fNHistoBinsPt(copy.fNHistoBinsPt)
116 ,fNHistoBinsZ(copy.fNHistoBinsZ)
117 ,fNHistoBinsXi(copy.fNHistoBinsXi)
118 ,fHistoBinsPt(copy.fHistoBinsPt)
119 ,fHistoBinsZ(copy.fHistoBinsZ)
120 ,fHistoBinsXi(copy.fHistoBinsXi)
121 ,fNCorrectionLevels(copy.fNCorrectionLevels)
122 ,fCorrFF(copy.fCorrFF)
123 ,fNCorrectionLevelsBgr(copy.fNCorrectionLevelsBgr)
124 ,fCorrBgr(copy.fCorrBgr)
125 ,fNCorrectionLevelsSinglePt(copy.fNCorrectionLevelsSinglePt)
126 ,fCorrSinglePt(copy.fCorrSinglePt)
127 ,fh1FFXiShift(copy.fh1FFXiShift)
128 ,fh1EffSinglePt(copy.fh1EffSinglePt)
129 ,fh1EffPt(copy.fh1EffPt)
130 ,fh1EffZ(copy.fh1EffZ)
131 ,fh1EffXi(copy.fh1EffXi)
132 ,fh1EffBgrPt(copy.fh1EffBgrPt)
133 ,fh1EffBgrZ(copy.fh1EffBgrZ)
134 ,fh1EffBgrXi(copy.fh1EffBgrXi)
135 ,fh1FFTrackPtBackFolded(copy.fh1FFTrackPtBackFolded)
136 ,fh1FFZBackFolded(copy.fh1FFZBackFolded)
137 ,fh1FFXiBackFolded(copy.fh1FFXiBackFolded)
138 ,fh1FFRatioTrackPtFolded(copy.fh1FFRatioTrackPtFolded)
139 ,fh1FFRatioZFolded(copy.fh1FFRatioZFolded)
140 ,fh1FFRatioXiFolded(copy.fh1FFRatioXiFolded)
141 ,fh1FFRatioTrackPtBackFolded(copy.fh1FFRatioTrackPtBackFolded)
142 ,fh1FFRatioZBackFolded(copy.fh1FFRatioZBackFolded)
143 ,fh1FFRatioXiBackFolded(copy.fh1FFRatioXiBackFolded)
144 ,fh1SingleTrackPtBackFolded(copy.fh1SingleTrackPtBackFolded)
145 ,fh1RatioSingleTrackPtFolded(copy.fh1RatioSingleTrackPtFolded)
146 ,fh1RatioSingleTrackPtBackFolded(copy.fh1RatioSingleTrackPtBackFolded)
147 ,fhnResponseSinglePt(copy.fhnResponseSinglePt)
148 ,fhnResponsePt(copy.fhnResponsePt)
149 ,fhnResponseZ(copy.fhnResponseZ)
150 ,fhnResponseXi(copy.fhnResponseXi)
151 ,fh1FFTrackPtPrior(copy.fh1FFTrackPtPrior)
152 ,fh1FFZPrior(copy.fh1FFZPrior)
153 ,fh1FFXiPrior(copy.fh1FFXiPrior)
154 ,fh1SecCorrSinglePt(copy.fh1SecCorrSinglePt)
160 // ______________________________________________________________________________________________________________________________
161 AliFragmentationFunctionCorrections& AliFragmentationFunctionCorrections::operator=(const AliFragmentationFunctionCorrections& o)
166 TObject::operator=(o);
168 fNJetPtSlices = o.fNJetPtSlices;
169 fJetPtSlices = o.fJetPtSlices;
171 fNJetsBgr = o.fNJetsBgr;
172 fNHistoBinsSinglePt = o.fNHistoBinsSinglePt;
173 fHistoBinsSinglePt = o.fHistoBinsSinglePt;
174 fNHistoBinsPt = o.fNHistoBinsPt;
175 fNHistoBinsZ = o.fNHistoBinsZ;
176 fNHistoBinsXi = o.fNHistoBinsXi;
177 fHistoBinsPt = o.fHistoBinsPt;
178 fHistoBinsZ = o.fHistoBinsZ;
179 fHistoBinsXi = o.fHistoBinsXi;
180 fNCorrectionLevels = o.fNCorrectionLevels;
182 fNCorrectionLevelsBgr = o.fNCorrectionLevelsBgr;
183 fCorrBgr = o.fCorrBgr;
184 fNCorrectionLevelsSinglePt = o.fNCorrectionLevelsSinglePt;
185 fCorrSinglePt = o.fCorrSinglePt;
186 fh1FFXiShift = o.fh1FFXiShift;
187 fh1EffSinglePt = o.fh1EffSinglePt;
188 fh1EffPt = o.fh1EffPt;
190 fh1EffXi = o.fh1EffXi;
191 fh1EffBgrPt = o.fh1EffBgrPt;
192 fh1EffBgrZ = o.fh1EffBgrZ;
193 fh1EffBgrXi = o.fh1EffBgrXi;
194 fh1FFTrackPtBackFolded = o.fh1FFTrackPtBackFolded;
195 fh1FFZBackFolded = o.fh1FFZBackFolded;
196 fh1FFXiBackFolded = o.fh1FFXiBackFolded;
197 fh1FFRatioTrackPtFolded = o.fh1FFRatioTrackPtFolded;
198 fh1FFRatioZFolded = o.fh1FFRatioZFolded;
199 fh1FFRatioXiFolded = o.fh1FFRatioXiFolded;
200 fh1FFRatioTrackPtBackFolded = o.fh1FFRatioTrackPtBackFolded;
201 fh1FFRatioZBackFolded = o.fh1FFRatioZBackFolded;
202 fh1FFRatioXiBackFolded = o.fh1FFRatioXiBackFolded;
203 fh1SingleTrackPtBackFolded = o.fh1SingleTrackPtBackFolded;
204 fh1RatioSingleTrackPtFolded = o.fh1RatioSingleTrackPtFolded;
205 fh1RatioSingleTrackPtBackFolded = o.fh1RatioSingleTrackPtBackFolded;
206 fhnResponseSinglePt = o.fhnResponseSinglePt;
207 fhnResponsePt = o.fhnResponsePt;
208 fhnResponseZ = o.fhnResponseZ;
209 fhnResponseXi = o.fhnResponseXi;
210 fh1FFTrackPtPrior = o.fh1FFTrackPtPrior;
211 fh1FFZPrior = o.fh1FFZPrior;
212 fh1FFXiPrior = o.fh1FFXiPrior;
213 fh1SecCorrSinglePt = o.fh1SecCorrSinglePt;
219 //_________________________________________________________________________
220 AliFragmentationFunctionCorrections::~AliFragmentationFunctionCorrections()
224 if(fJetPtSlices) delete fJetPtSlices;
225 if(fNJets) delete fNJets;
226 if(fNJetsBgr) delete fNJetsBgr;
228 DeleteHistoArray(fh1FFXiShift);
230 DeleteHistoArray(fh1EffPt);
231 DeleteHistoArray(fh1EffXi);
232 DeleteHistoArray(fh1EffZ );
234 DeleteHistoArray(fh1EffBgrPt);
235 DeleteHistoArray(fh1EffBgrXi);
236 DeleteHistoArray(fh1EffBgrZ);
240 DeleteHistoArray(fh1FFTrackPtBackFolded);
241 DeleteHistoArray(fh1FFZBackFolded);
242 DeleteHistoArray(fh1FFXiBackFolded);
244 DeleteHistoArray(fh1FFRatioTrackPtFolded);
245 DeleteHistoArray(fh1FFRatioZFolded);
246 DeleteHistoArray(fh1FFRatioXiFolded);
248 DeleteHistoArray(fh1FFRatioTrackPtBackFolded);
249 DeleteHistoArray(fh1FFRatioZBackFolded);
250 DeleteHistoArray(fh1FFRatioXiBackFolded);
252 DeleteTHnSparseArray(fhnResponsePt);
253 DeleteTHnSparseArray(fhnResponseZ);
254 DeleteTHnSparseArray(fhnResponseXi);
256 DeleteHistoArray(fh1FFTrackPtPrior);
257 DeleteHistoArray(fh1FFZPrior);
258 DeleteHistoArray(fh1FFXiPrior);
261 // clean up corrected FF
263 for(Int_t c=0; c<fNCorrectionLevels; c++) delete fCorrFF[c];
268 for(Int_t c=0; c<fNCorrectionLevelsBgr; c++) delete fCorrBgr[c];
271 // clean up inclusive pt
272 for(Int_t c=0; c<fNCorrectionLevelsSinglePt; c++) delete fCorrSinglePt[c];
273 delete[] fCorrSinglePt;
275 delete[] fNHistoBinsPt;
276 delete[] fNHistoBinsZ;
277 delete[] fNHistoBinsXi;
279 // clean up histo bins
281 if(fHistoBinsSinglePt) delete fHistoBinsSinglePt;
283 for(Int_t i=0; i<fNJetPtSlices; i++) delete fHistoBinsPt[i];
284 for(Int_t i=0; i<fNJetPtSlices; i++) delete fHistoBinsZ[i];
285 for(Int_t i=0; i<fNJetPtSlices; i++) delete fHistoBinsXi[i];
287 delete[] fHistoBinsPt;
288 delete[] fHistoBinsZ;
289 delete[] fHistoBinsXi;
292 //_________________________________________________________________________________
293 AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::AliFragFuncCorrHistos()
301 // default constructor
305 //__________________________________________________________________________________________________________________
306 AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::AliFragFuncCorrHistos(const AliFragmentationFunctionCorrections::AliFragFuncCorrHistos& copy)
308 ,fArraySize(copy.fArraySize)
312 ,fCorrLabel(copy.fCorrLabel)
316 fh1CorrFFTrackPt = new TH1F*[copy.fArraySize];
317 fh1CorrFFZ = new TH1F*[copy.fArraySize];
318 fh1CorrFFXi = new TH1F*[copy.fArraySize];
320 for(Int_t i=0; i<copy.fArraySize; i++){
321 fh1CorrFFTrackPt[i] = new TH1F(*(copy.fh1CorrFFTrackPt[i]));
322 fh1CorrFFZ[i] = new TH1F(*(copy.fh1CorrFFZ[i]));
323 fh1CorrFFXi[i] = new TH1F(*(copy.fh1CorrFFXi[i]));
327 //_______________________________________________________________________________________________________________________________________________________________
328 AliFragmentationFunctionCorrections::AliFragFuncCorrHistos& AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::operator=(const AliFragmentationFunctionCorrections::AliFragFuncCorrHistos& o)
333 TObject::operator=(o);
334 Int_t fArraySize_new = o.fArraySize;
335 fCorrLabel = o.fCorrLabel;
337 TH1F** fh1CorrFFTrackPt_new = new TH1F*[fArraySize_new];
338 TH1F** fh1CorrFFZ_new = new TH1F*[fArraySize_new];
339 TH1F** fh1CorrFFXi_new = new TH1F*[fArraySize_new];
341 for(Int_t i=0; i<fArraySize_new; i++){
342 fh1CorrFFTrackPt_new[i] = new TH1F(*(o.fh1CorrFFTrackPt[i]));
343 fh1CorrFFZ_new[i] = new TH1F(*(o.fh1CorrFFZ[i]));
344 fh1CorrFFXi_new[i] = new TH1F(*(o.fh1CorrFFXi[i]));
350 for(int i=0; i<fArraySize; i++) delete fh1CorrFFTrackPt[i];
351 for(int i=0; i<fArraySize; i++) delete fh1CorrFFZ[i];
352 for(int i=0; i<fArraySize; i++) delete fh1CorrFFXi[i];
355 if(fh1CorrFFTrackPt) delete[] fh1CorrFFTrackPt;
356 if(fh1CorrFFZ) delete[] fh1CorrFFZ;
357 if(fh1CorrFFXi) delete[] fh1CorrFFXi;
361 fArraySize = fArraySize_new;
363 fh1CorrFFTrackPt = fh1CorrFFTrackPt_new;
364 fh1CorrFFZ = fh1CorrFFZ_new;
365 fh1CorrFFXi = fh1CorrFFXi_new;
367 for(Int_t i=0; i<fArraySize; i++){
368 fh1CorrFFTrackPt[i] = fh1CorrFFTrackPt_new[i];
369 fh1CorrFFZ[i] = fh1CorrFFZ_new[i];
370 fh1CorrFFXi[i] = fh1CorrFFXi_new[i];
377 //__________________________________________________________________________________
378 AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::~AliFragFuncCorrHistos()
383 for(int i=0; i<fArraySize; i++) delete fh1CorrFFTrackPt[i];
384 for(int i=0; i<fArraySize; i++) delete fh1CorrFFZ[i];
385 for(int i=0; i<fArraySize; i++) delete fh1CorrFFXi[i];
388 if(fh1CorrFFTrackPt) delete[] fh1CorrFFTrackPt;
389 if(fh1CorrFFZ) delete[] fh1CorrFFZ;
390 if(fh1CorrFFXi) delete[] fh1CorrFFXi;
394 //___________________________________________________________________________________________________________________
395 AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::AliFragFuncCorrHistos(const char* label, Int_t arraySize)
405 fArraySize = arraySize;
406 fh1CorrFFTrackPt = new TH1F*[arraySize];
407 fh1CorrFFZ = new TH1F*[arraySize];
408 fh1CorrFFXi = new TH1F*[arraySize];
410 for(int i=0; i<arraySize; i++) fh1CorrFFTrackPt[i] = new TH1F;
411 for(int i=0; i<arraySize; i++) fh1CorrFFZ[i] = new TH1F;
412 for(int i=0; i<arraySize; i++) fh1CorrFFXi[i] = new TH1F;
415 //_______________________________________________________________________________________________________________________________
416 void AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::AddCorrHistos(Int_t slice,TH1F* histPt,TH1F* histZ,TH1F* histXi)
418 // place histo in array, add corrLabel to histo name
420 if(slice>=fArraySize){
421 Printf("%s:%d -- slice > array size", (char*)__FILE__,__LINE__);
426 TString name = histPt->GetName();
427 if(fCorrLabel.Length()>0) name += "_"+fCorrLabel;
428 histPt->SetName(name);
430 if(!(histPt->GetSumw2())) histPt->Sumw2();
432 new(fh1CorrFFTrackPt[slice]) TH1F(*histPt);
436 TString name = histZ->GetName();
437 if(fCorrLabel.Length()>0) name += "_"+fCorrLabel;
438 histZ->SetName(name);
440 if(!(histZ->GetSumw2())) histZ->Sumw2();
442 new(fh1CorrFFZ[slice]) TH1F(*histZ);
446 TString name = histXi->GetName();
447 if(fCorrLabel.Length()>0) name += "_"+fCorrLabel;
448 histXi->SetName(name);
450 if(!(histXi->GetSumw2())) histXi->Sumw2();
452 new(fh1CorrFFXi[slice]) TH1F(*histXi);
456 //___________________________________________________________________________________________________________________________________
457 void AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::ReplaceCorrHistos(Int_t slice,TH1F* histPt,TH1F* histZ,TH1F* histXi)
459 // replace histo in array
461 if(slice>=fArraySize){
462 Printf("%s:%d -- slice > array size", (char*)__FILE__,__LINE__);
467 if(!(histPt->GetSumw2())) histPt->Sumw2();
469 TString name = histPt->GetName();
470 histPt->SetName(name);
472 delete fh1CorrFFTrackPt[slice];
473 fh1CorrFFTrackPt[slice] = new TH1F;
474 new(fh1CorrFFTrackPt[slice]) TH1F(*histPt);
478 if(!(histZ->GetSumw2())) histZ->Sumw2();
480 TString name = histZ->GetName();
481 histZ->SetName(name);
483 delete fh1CorrFFZ[slice];
484 fh1CorrFFZ[slice] = new TH1F;
485 new(fh1CorrFFZ[slice]) TH1F(*histZ);
489 if(!(histXi->GetSumw2())) histXi->Sumw2();
491 TString name = histXi->GetName();
492 histXi->SetName(name);
494 delete fh1CorrFFXi[slice];
495 fh1CorrFFXi[slice] = new TH1F;
496 new(fh1CorrFFXi[slice]) TH1F(*histXi);
500 // ___________________________________________________________________________________________
501 TH1F* AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::GetTrackPt(const Int_t slice)
505 if(slice>=fArraySize){
506 Printf("%s:%d -- slice > array size", (char*)__FILE__,__LINE__);
510 return fh1CorrFFTrackPt[slice];
514 // ______________________________________________________________________________________
515 TH1F* AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::GetZ(const Int_t slice)
519 if(slice>=fArraySize){
520 Printf("%s:%d -- slice > array size", (char*)__FILE__,__LINE__);
524 return fh1CorrFFZ[slice];
527 // ________________________________________________________________________________________
528 TH1F* AliFragmentationFunctionCorrections::AliFragFuncCorrHistos::GetXi(const Int_t slice)
532 if(slice>=fArraySize){
533 Printf("%s:%d -- slice > array size", (char*)__FILE__,__LINE__);
537 return fh1CorrFFXi[slice];
540 // __________________________________________________________________________
541 void AliFragmentationFunctionCorrections::DeleteHistoArray(TH1F** hist) const
543 // delete array of TH1
546 for(Int_t i=0; i<fNJetPtSlices; i++) delete hist[i];
551 // ____________________________________________________________________________________
552 void AliFragmentationFunctionCorrections::DeleteTHnSparseArray(THnSparse** hist) const
554 // delete array of THnSparse
557 for(Int_t i=0; i<fNJetPtSlices; i++) delete hist[i];
562 // _________________________________________________________
563 TH1F** AliFragmentationFunctionCorrections::BookHistoArray()
568 Printf("%s:%d -- jetPtSlices not defined", (char*)__FILE__,__LINE__);
572 TH1F** hist = new TH1F*[fNJetPtSlices];
573 for(Int_t i=0; i<fNJetPtSlices; i++) hist[i] = new TH1F();
578 //__________________________________________________________________
579 THnSparse** AliFragmentationFunctionCorrections::BookTHnSparseArray()
581 // book array of THnSparse
584 Printf("%s:%d -- jetPtSlices not defined", (char*)__FILE__,__LINE__);
588 THnSparse** hist = new THnSparse*[fNJetPtSlices];
589 for(Int_t i=0; i<fNJetPtSlices; i++) hist[i] = new THnSparseF();
594 //_____________________________________________________________________________
595 void AliFragmentationFunctionCorrections::AddCorrectionLevel(const char* label)
597 // increase corr level
600 Printf("%s:%d -- jetPtSlices not defined", (char*)__FILE__,__LINE__);
604 if(fNCorrectionLevels >= fgMaxNCorrectionLevels){
605 Printf("%s:%d -- max correction level exceeded", (char*)__FILE__,__LINE__);
609 fCorrFF[fNCorrectionLevels] = new AliFragFuncCorrHistos(label,fNJetPtSlices);
610 fNCorrectionLevels++;
614 //________________________________________________________________________________
615 void AliFragmentationFunctionCorrections::AddCorrectionLevelBgr(const char* label)
617 // increase corr level for bgr FF
620 if(fDebug>0) Printf("%s:%d -- jetPtSlices not defined", (char*)__FILE__,__LINE__);
624 if(fNCorrectionLevelsBgr >= fgMaxNCorrectionLevels){
625 Printf("%s:%d -- max correction level exceeded", (char*)__FILE__,__LINE__);
629 fCorrBgr[fNCorrectionLevelsBgr] = new AliFragFuncCorrHistos(label,fNJetPtSlices);
630 fNCorrectionLevelsBgr++;
633 //_____________________________________________________________________________________
634 void AliFragmentationFunctionCorrections::AddCorrectionLevelSinglePt(const char* label)
636 // increase corr level single pt spec
638 Int_t nJetPtSlicesSingle = 1; // pro forma
640 if(fNCorrectionLevelsSinglePt >= fgMaxNCorrectionLevels){
641 Printf("%s:%d -- max correction level exceeded", (char*)__FILE__,__LINE__);
645 fCorrSinglePt[fNCorrectionLevelsSinglePt] = new AliFragFuncCorrHistos(label,nJetPtSlicesSingle);
646 fNCorrectionLevelsSinglePt++;
649 //_____________________________________________________________________________________________
650 void AliFragmentationFunctionCorrections::SetJetPtSlices(Float_t* bins, const Int_t nJetPtSlices)
653 // once slices are known, can book all other histos
655 fNJetPtSlices = nJetPtSlices;
657 const Int_t size = nJetPtSlices+1;
658 fJetPtSlices = new TArrayF(size,bins);
662 fNJets = new TArrayF(size);
665 fNJetsBgr = new TArrayF(size);
670 fNCorrectionLevels = 0;
671 fCorrFF = new AliFragFuncCorrHistos*[fgMaxNCorrectionLevels];
672 AddCorrectionLevel(); // first 'correction' level = raw FF
674 fNCorrectionLevelsBgr = 0;
675 fCorrBgr = new AliFragFuncCorrHistos*[fgMaxNCorrectionLevels];
676 AddCorrectionLevelBgr(); // first 'correction' level = raw bgr dist
678 fh1FFXiShift = BookHistoArray();
682 fh1EffPt = BookHistoArray();
683 fh1EffXi = BookHistoArray();
684 fh1EffZ = BookHistoArray();
686 fh1EffBgrPt = BookHistoArray();
687 fh1EffBgrXi = BookHistoArray();
688 fh1EffBgrZ = BookHistoArray();
693 fh1FFTrackPtBackFolded = BookHistoArray();
694 fh1FFXiBackFolded = BookHistoArray();
695 fh1FFZBackFolded = BookHistoArray();
697 fh1FFRatioTrackPtFolded = BookHistoArray();
698 fh1FFRatioXiFolded = BookHistoArray();
699 fh1FFRatioZFolded = BookHistoArray();
701 fh1FFRatioTrackPtBackFolded = BookHistoArray();
702 fh1FFRatioXiBackFolded = BookHistoArray();
703 fh1FFRatioZBackFolded = BookHistoArray();
707 fhnResponsePt = BookTHnSparseArray();
708 fhnResponseZ = BookTHnSparseArray();
709 fhnResponseXi = BookTHnSparseArray();
711 fh1FFTrackPtPrior = BookHistoArray();
712 fh1FFZPrior = BookHistoArray();
713 fh1FFXiPrior = BookHistoArray();
718 fNHistoBinsPt = new Int_t[fNJetPtSlices];
719 fNHistoBinsXi = new Int_t[fNJetPtSlices];
720 fNHistoBinsZ = new Int_t[fNJetPtSlices];
722 for(Int_t i=0; i<fNJetPtSlices; i++) fNHistoBinsPt[i] = 0;
723 for(Int_t i=0; i<fNJetPtSlices; i++) fNHistoBinsXi[i] = 0;
724 for(Int_t i=0; i<fNJetPtSlices; i++) fNHistoBinsZ[i] = 0;
726 fHistoBinsPt = new TArrayD*[fNJetPtSlices];
727 fHistoBinsXi = new TArrayD*[fNJetPtSlices];
728 fHistoBinsZ = new TArrayD*[fNJetPtSlices];
730 for(Int_t i=0; i<fNJetPtSlices; i++) fHistoBinsPt[i] = new TArrayD(0);
731 for(Int_t i=0; i<fNJetPtSlices; i++) fHistoBinsXi[i] = new TArrayD(0);
732 for(Int_t i=0; i<fNJetPtSlices; i++) fHistoBinsZ[i] = new TArrayD(0);
735 //_____________________________________________________________________________________________________________________________________
736 void AliFragmentationFunctionCorrections::SetHistoBins(const Int_t jetPtSlice, const Int_t sizeBins, Double_t* bins, const Int_t type)
738 // set histo bins for jet pt slice
739 // if binning undefined for any slice, original binning will be used
742 Printf("%s:%d -- jetPtSlices not defined", (char*)__FILE__,__LINE__);
746 if(jetPtSlice>=fNJetPtSlices){
747 Printf("%s:%d -- jetPtSlice %d exceeds max",(char*)__FILE__,__LINE__,jetPtSlice);
752 fNHistoBinsPt[jetPtSlice] = sizeBins-1;
753 fHistoBinsPt[jetPtSlice]->Set(sizeBins,bins);
755 else if(type==kFlagZ){
756 fNHistoBinsZ[jetPtSlice] = sizeBins-1;
757 fHistoBinsZ[jetPtSlice]->Set(sizeBins,bins);
760 else if(type==kFlagXi){
761 fNHistoBinsXi[jetPtSlice] = sizeBins-1;
762 fHistoBinsXi[jetPtSlice]->Set(sizeBins,bins);
766 //__________________________________________________________________________________________________________________________________________________________________
767 void AliFragmentationFunctionCorrections::SetHistoBins(const Int_t jetPtSlice, const Int_t nBinsLimits, Double_t* binsLimits, Double_t* binsWidth, const Int_t type)
769 // set histo bins for jet pt slice
770 // function takes array of limits and widths (e.g. 1 GeV bins up to 10 GeV, 2 GeV width up to 20 GeV, ...)
771 // array size of binsLimits: nBinsLimits
772 // array size of binsWidth: nBinsLimits-1
773 // binsLimits have to be in increasing order
774 // if binning undefined for any slice, original binning will be used
777 Printf("%s:%d -- jetPtSlices not defined", (char*)__FILE__,__LINE__);
781 if(jetPtSlice>=fNJetPtSlices){
782 Printf("%s:%d -- jetPtSlice %d exceeds max",(char*)__FILE__,__LINE__,jetPtSlice);
787 Double_t binLimitMin = binsLimits[0];
788 Double_t binLimitMax = binsLimits[nBinsLimits-1];
790 Double_t binLimit = binLimitMin; // start value
792 Int_t sizeUpperLim = 10000; //static_cast<Int_t>(binLimitMax/binsWidth[0])+1;
793 TArrayD binsArray(sizeUpperLim);
795 binsArray.SetAt(binLimitMin,nBins++);
797 while(binLimit<binLimitMax && nBins<sizeUpperLim){
799 Int_t currentSlice = -1;
800 for(Int_t i=0; i<nBinsLimits; i++){
801 if(binLimit >= 0.999*binsLimits[i]) currentSlice = i; // 0.999 numerical saftey factor
804 Double_t currentBinWidth = binsWidth[currentSlice];
805 binLimit += currentBinWidth;
807 binsArray.SetAt(binLimit,nBins++);
810 Double_t* bins = binsArray.GetArray();
812 SetHistoBins(jetPtSlice,nBins,bins,type);
815 //__________________________________________________________________________________________________
816 void AliFragmentationFunctionCorrections::SetHistoBinsSinglePt(const Int_t sizeBins, Double_t* bins)
818 // set histo bins for inclusive pt spectra
819 // if binning undefined, original binning will be used
821 fNHistoBinsSinglePt = sizeBins-1;
823 fHistoBinsSinglePt = new TArrayD(sizeBins);
824 fHistoBinsSinglePt->Set(sizeBins,bins);
827 //__________________________________________________________________________________________________________________________________________________________________
828 void AliFragmentationFunctionCorrections::SetHistoBinsSinglePt(const Int_t nBinsLimits, Double_t* binsLimits, Double_t* binsWidth)
830 // set histo bins for inclusive pt spectra
831 // function takes array of limits and widths (e.g. 1 GeV bins up to 10 GeV, 2 GeV width up to 20 GeV, ...)
832 // array size of binsLimits: nBinsLimits
833 // array size of binsWidth: nBinsLimits-1
834 // binsLimits have to be in increasing order
835 // if binning undefined for any slice, original binning will be used
838 Double_t binLimitMin = binsLimits[0];
839 Double_t binLimitMax = binsLimits[nBinsLimits-1];
841 Double_t binLimit = binLimitMin; // start value
843 Int_t sizeUpperLim = 10000; //static_cast<Int_t>(binLimitMax/binsWidth[0])+1;
844 TArrayD binsArray(sizeUpperLim);
846 binsArray.SetAt(binLimitMin,nBins++);
848 while(binLimit<binLimitMax && nBins<sizeUpperLim){
850 Int_t currentSlice = -1;
851 for(Int_t i=0; i<nBinsLimits; i++){
852 if(binLimit >= 0.999*binsLimits[i]) currentSlice = i; // 0.999 numerical saftey factor
855 Double_t currentBinWidth = binsWidth[currentSlice];
856 binLimit += currentBinWidth;
858 binsArray.SetAt(binLimit,nBins++);
861 Double_t* bins = binsArray.GetArray();
863 SetHistoBinsSinglePt(nBins,bins);
866 //____________________________________________________________________________________
867 void AliFragmentationFunctionCorrections::NormalizeTH1(TH1* hist, const Float_t nJets)
869 // FF normalization: divide by bin width and normalize to entries/jets
870 // should also work for TH2, but to be tested !!!
872 if(nJets == 0){ // nothing to do
873 if(fDebug>0) Printf("%s:%d -- normalize: nJets = 0, do nothing", (char*)__FILE__,__LINE__);
877 Int_t nBins = hist->GetNbinsX()*hist->GetNbinsY()*hist->GetNbinsZ();
879 for(Int_t bin=0; bin<=nBins; bin++){ // include under-/overflow (?)
881 Double_t binWidth = hist->GetBinWidth(bin);
882 Double_t binCont = hist->GetBinContent(bin);
883 Double_t binErr = hist->GetBinError(bin);
888 hist->SetBinContent(bin,binCont);
889 hist->SetBinError(bin,binErr);
892 hist->Scale(1/nJets);
895 //_____________________________________________________
896 void AliFragmentationFunctionCorrections::NormalizeFF()
900 if(fNCorrectionLevels>1){
901 Printf("%s:%d -- FF normalization should be done BEFORE any correction !!!", (char*)__FILE__,__LINE__);
904 for(Int_t i=0; i<fNJetPtSlices; i++){
906 if(fDebug>0) Printf(" normalizeFF: i %d, nJets %f",i,fNJets->At(i));
908 NormalizeTH1(fCorrFF[0]->GetTrackPt(i),fNJets->At(i)); // always normalize corr level 0 = raw FF
909 NormalizeTH1(fCorrFF[0]->GetZ(i),fNJets->At(i));
910 NormalizeTH1(fCorrFF[0]->GetXi(i),fNJets->At(i));
914 //______________________________________________________
915 void AliFragmentationFunctionCorrections::NormalizeBgr()
917 // normalize bgr/UE FF
919 if(fNCorrectionLevelsBgr>1){
920 Printf("%s:%d -- FF normalization should be done BEFORE any correction !!!", (char*)__FILE__,__LINE__);
923 for(Int_t i=0; i<fNJetPtSlices; i++){
924 NormalizeTH1(fCorrBgr[0]->GetTrackPt(i), fNJetsBgr->At(i)); // always normalize corr level 0 = raw FF
925 NormalizeTH1(fCorrBgr[0]->GetZ(i), fNJetsBgr->At(i));
926 NormalizeTH1(fCorrBgr[0]->GetXi(i),fNJetsBgr->At(i));
931 //__________________________________________________________________________________________________
932 void AliFragmentationFunctionCorrections::ReadRawFF(TString strfile, TString strID, TString strFFID)
934 // read raw FF - standard dir/list name
936 TString strdir = "PWG4_FragmentationFunction_" + strID;
937 TString strlist = "fracfunc_" + strID;
939 ReadRawFF(strfile,strdir,strlist,strFFID);
942 //____________________________________________________________________________________________________________________
943 void AliFragmentationFunctionCorrections::ReadRawFF(TString strfile, TString strdir, TString strlist, TString strFFID)
945 // get raw FF from input file, project in jet pt slice
946 // normalization done separately
948 TFile f(strfile,"READ");
951 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
955 if(fDebug>0) Printf("%s:%d -- read FF from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
957 gDirectory->cd(strdir);
961 if(!(list = (TList*) gDirectory->Get(strlist))){
962 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
966 TString hnameJetPt(Form("fh1FFJetPt%s",strFFID.Data()));
967 TString hnameTrackPt(Form("fh2FFTrackPt%s",strFFID.Data()));
968 TString hnameZ(Form("fh2FFZ%s",strFFID.Data()));
969 TString hnameXi(Form("fh2FFXi%s",strFFID.Data()));
971 TH1F* fh1FFJetPt = (TH1F*) list->FindObject(hnameJetPt);
972 TH2F* fh2FFTrackPt = (TH2F*) list->FindObject(hnameTrackPt);
973 TH2F* fh2FFZ = (TH2F*) list->FindObject(hnameZ);
974 TH2F* fh2FFXi = (TH2F*) list->FindObject(hnameXi);
976 if(!fh1FFJetPt) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameJetPt.Data()); return; }
977 if(!fh2FFTrackPt){ Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameTrackPt.Data()); return; }
978 if(!fh2FFZ) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameZ.Data()); return; }
979 if(!fh2FFXi) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameXi.Data()); return; }
981 fh1FFJetPt->SetDirectory(0);
982 fh2FFTrackPt->SetDirectory(0);
983 fh2FFZ->SetDirectory(0);
984 fh2FFXi->SetDirectory(0);
991 for(Int_t i=0; i<fNJetPtSlices; i++){
993 Float_t jetPtLoLim = fJetPtSlices->At(i);
994 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
996 Int_t binLo = static_cast<Int_t>(fh1FFJetPt->FindBin(jetPtLoLim));
997 Int_t binUp = static_cast<Int_t>(fh1FFJetPt->FindBin(jetPtUpLim)) - 1;
999 Float_t nJetsBin = fh1FFJetPt->Integral(binLo,binUp);
1001 fNJets->SetAt(nJetsBin,i);
1003 if(fDebug>0) Printf("jet pt %d to %d: nJets %f",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim),fNJets->At(i));
1008 for(Int_t i=0; i<fNJetPtSlices; i++){
1010 Float_t jetPtLoLim = fJetPtSlices->At(i);
1011 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
1013 Int_t binLo = static_cast<Int_t>(fh2FFTrackPt->GetXaxis()->FindBin(jetPtLoLim));
1014 Int_t binUp = static_cast<Int_t>(fh2FFTrackPt->GetXaxis()->FindBin(jetPtUpLim))-1;
1016 if(binUp > fh2FFTrackPt->GetNbinsX()){
1017 Printf("%s:%d -- jet pt range %0.3f exceeds histo limits",(char*)__FILE__,__LINE__,jetPtUpLim);
1021 TString strNameFFPt(Form("fh1FFTrackPt%s_%02d_%02d",strFFID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1022 TString strNameFFZ(Form("fh1FFZ%s_%02d_%02d",strFFID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1023 TString strNameFFXi(Form("fh1FFXi%s_%02d_%02d",strFFID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1025 // appendix 'unbinned' to avoid histos with same name after rebinning
1026 TH1F* projPt = (TH1F*) fh2FFTrackPt->ProjectionY(strNameFFPt+"_unBinned",binLo,binUp,"o"); // option "o": original axis range
1027 TH1F* projZ = (TH1F*) fh2FFZ->ProjectionY(strNameFFZ+"_unBinned",binLo,binUp,"o");
1028 TH1F* projXi = (TH1F*) fh2FFXi->ProjectionY(strNameFFXi+"_unBinned",binLo,binUp,"o");
1030 if(fNHistoBinsPt[i]) projPt = (TH1F*) projPt->Rebin(fNHistoBinsPt[i],strNameFFPt,fHistoBinsPt[i]->GetArray());
1031 if(fNHistoBinsZ[i]) projZ = (TH1F*) projZ->Rebin(fNHistoBinsZ[i],strNameFFZ,fHistoBinsZ[i]->GetArray());
1032 if(fNHistoBinsXi[i]) projXi = (TH1F*) projXi->Rebin(fNHistoBinsXi[i],strNameFFXi,fHistoBinsXi[i]->GetArray());
1034 projPt->SetNameTitle(strNameFFPt,"");
1035 projZ->SetNameTitle(strNameFFZ,"");
1036 projXi->SetNameTitle(strNameFFXi,"");
1038 // raw FF = corr level 0
1039 fCorrFF[0]->AddCorrHistos(i,projPt,projZ,projXi);
1043 //_____________________________________________________________________________________________________________________
1044 void AliFragmentationFunctionCorrections::ReadRawBgr(TString strfile, TString strID, TString strBgrID, TString strFFID)
1046 // read raw FF - standard dir/list name
1048 TString strdir = "PWG4_FragmentationFunction_" + strID;
1049 TString strlist = "fracfunc_" + strID;
1051 ReadRawBgr(strfile,strdir,strlist,strBgrID,strFFID);
1054 //_______________________________________________________________________________________________________________________________________
1055 void AliFragmentationFunctionCorrections::ReadRawBgr(TString strfile, TString strdir, TString strlist, TString strBgrID, TString strFFID)
1057 // get raw FF from input file, project in jet pt slice
1058 // use jet dN/dpt corresponding to strFFID, bgr FF to strBgrID+strFFID
1059 // e.g. "fh1FFJetPtRecCuts", "fh2FFXiBgrPerpRecCuts"
1060 // normalization done separately
1062 TString strID = strBgrID + strFFID;
1064 TFile f(strfile,"READ");
1067 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
1071 if(fDebug>0) Printf("%s:%d -- read Bgr %s from file %s ",(char*)__FILE__,__LINE__,strBgrID.Data(),strfile.Data());
1073 gDirectory->cd(strdir);
1077 if(!(list = (TList*) gDirectory->Get(strlist))){
1078 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
1082 TString hnameNJets = "fh1nRecJetsCuts";
1083 TString hnameJetPt(Form("fh1FFJetPt%s",strFFID.Data())); // not: strID.Data() !!! would not be proper normalization
1084 TString hnameBgrTrackPt(Form("fh2FFTrackPt%s",strID.Data()));
1085 TString hnameBgrZ(Form("fh2FFZ%s",strID.Data()));
1086 TString hnameBgrXi(Form("fh2FFXi%s",strID.Data()));
1088 TH1F* fh1NJets = (TH1F*) list->FindObject(hnameNJets); // needed for normalization of bgr out of 2 jets
1089 TH1F* fh1FFJetPtBgr = (TH1F*) list->FindObject(hnameJetPt);
1090 TH2F* fh2FFTrackPtBgr = (TH2F*) list->FindObject(hnameBgrTrackPt);
1091 TH2F* fh2FFZBgr = (TH2F*) list->FindObject(hnameBgrZ);
1092 TH2F* fh2FFXiBgr = (TH2F*) list->FindObject(hnameBgrXi);
1094 if(!fh1FFJetPtBgr) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameJetPt.Data()); return; }
1095 if(!fh1NJets) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameNJets.Data()); return; }
1096 if(!fh2FFTrackPtBgr){ Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameBgrTrackPt.Data()); return; }
1097 if(!fh2FFZBgr) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameBgrZ.Data()); return; }
1098 if(!fh2FFXiBgr) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameBgrXi.Data()); return; }
1100 fh1FFJetPtBgr->SetDirectory(0);
1101 fh1NJets->SetDirectory(0);
1102 fh2FFTrackPtBgr->SetDirectory(0);
1103 fh2FFZBgr->SetDirectory(0);
1104 fh2FFXiBgr->SetDirectory(0);
1110 for(Int_t i=0; i<fNJetPtSlices; i++){
1112 Float_t jetPtLoLim = fJetPtSlices->At(i);
1113 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
1115 Int_t binLo = static_cast<Int_t>(fh1FFJetPtBgr->FindBin(jetPtLoLim));
1116 Int_t binUp = static_cast<Int_t>(fh1FFJetPtBgr->FindBin(jetPtUpLim)) - 1;
1118 Float_t nJetsBin = fh1FFJetPtBgr->Integral(binLo,binUp);
1119 Double_t scaleF = 1;
1121 //if(strBgrID.Contains("Out2Jets")){ // scale by ratio 2 jets events / all events
1122 // scaleF = fh1NJets->Integral(fh1NJets->FindBin(2),fh1NJets->GetNbinsX())
1123 // / fh1NJets->Integral(fh1NJets->FindBin(1),fh1NJets->GetNbinsX());}
1126 if(strBgrID.Contains("OutAllJets")){ // scale by ratio >3 jets events / all events
1127 scaleF = fh1NJets->Integral(fh1NJets->FindBin(4),fh1NJets->GetNbinsX())
1128 / fh1NJets->Integral(fh1NJets->FindBin(1),fh1NJets->GetNbinsX());
1131 fNJetsBgr->SetAt(nJetsBin*scaleF,i);
1133 if(fDebug>0) Printf("bgr jet pt %d to %d: nJets %f, scaleF %.2f",
1134 static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim),nJetsBin,scaleF);
1140 for(Int_t i=0; i<fNJetPtSlices; i++){
1142 Float_t jetPtLoLim = fJetPtSlices->At(i);
1143 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
1145 Int_t binLo = static_cast<Int_t>(fh2FFTrackPtBgr->GetXaxis()->FindBin(jetPtLoLim));
1146 Int_t binUp = static_cast<Int_t>(fh2FFTrackPtBgr->GetXaxis()->FindBin(jetPtUpLim))-1;
1148 if(binUp > fh2FFTrackPtBgr->GetNbinsX()){
1149 Printf("%s:%d -- jet pt range %0.3f exceeds histo limits",(char*)__FILE__,__LINE__,jetPtUpLim);
1153 TString strNameBgrPt(Form("fh1BgrTrackPt%s_%02d_%02d",strID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1154 TString strNameBgrZ(Form("fh1BgrZ%s_%02d_%02d",strID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1155 TString strNameBgrXi(Form("fh1BgrXi%s_%02d_%02d",strID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1157 // appendix 'unbinned' to avoid histos with same name after rebinning
1158 TH1F* projPt = (TH1F*) fh2FFTrackPtBgr->ProjectionY(strNameBgrPt+"_unBinned",binLo,binUp,"o"); // option "o": original axis range
1159 TH1F* projZ = (TH1F*) fh2FFZBgr->ProjectionY(strNameBgrZ+"_unBinned",binLo,binUp,"o");
1160 TH1F* projXi = (TH1F*) fh2FFXiBgr->ProjectionY(strNameBgrXi+"_unBinned",binLo,binUp,"o");
1162 if(fNHistoBinsPt[i]) projPt = (TH1F*) projPt->Rebin(fNHistoBinsPt[i],strNameBgrPt,fHistoBinsPt[i]->GetArray());
1163 if(fNHistoBinsZ[i]) projZ = (TH1F*) projZ->Rebin(fNHistoBinsZ[i],strNameBgrZ,fHistoBinsZ[i]->GetArray());
1164 if(fNHistoBinsXi[i]) projXi = (TH1F*) projXi->Rebin(fNHistoBinsXi[i],strNameBgrXi,fHistoBinsXi[i]->GetArray());
1166 projPt->SetNameTitle(strNameBgrPt,"");
1167 projZ->SetNameTitle(strNameBgrZ,"");
1168 projXi->SetNameTitle(strNameBgrXi,"");
1170 // raw bgr = corr level 0
1171 fCorrBgr[0]->AddCorrHistos(i,projPt,projZ,projXi);
1175 //_____________________________________________________________________________________________________________________
1176 void AliFragmentationFunctionCorrections::ReadRawBgrEmbedding(TString strfile, TString strID, TString strFFID)
1178 // read raw FF - standard dir/list name
1180 TString strdir = "PWG4_FragmentationFunction_" + strID;
1181 TString strlist = "fracfunc_" + strID;
1183 ReadRawBgrEmbedding(strfile,strdir,strlist,strFFID);
1186 //_______________________________________________________________________________________________________________________________________
1187 void AliFragmentationFunctionCorrections::ReadRawBgrEmbedding(TString strfile, TString strdir, TString strlist, TString strFFID)
1189 // get raw FF from input file, project in jet pt slice
1190 // for embedding, the bgr FF are taken from histos "fh1FFJetPtRecCuts", "fh2FFXiRecCuts"
1191 // normalization done separately
1193 TString strBgrID = "BckgEmbed";
1194 TString strID = strBgrID + strFFID;
1196 TFile f(strfile,"READ");
1199 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
1203 if(fDebug>0) Printf("%s:%d -- read Bgr %s from file %s ",(char*)__FILE__,__LINE__,strFFID.Data(),strfile.Data());
1205 gDirectory->cd(strdir);
1209 if(!(list = (TList*) gDirectory->Get(strlist))){
1210 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
1214 TString hnameNJets = "fh1nRecJetsCuts";
1215 TString hnameJetPt(Form("fh1FFJetPt%s",strFFID.Data()));
1216 TString hnameBgrTrackPt(Form("fh2FFTrackPt%s",strFFID.Data()));
1217 TString hnameBgrZ(Form("fh2FFZ%s",strFFID.Data()));
1218 TString hnameBgrXi(Form("fh2FFXi%s",strFFID.Data()));
1220 TH1F* fh1NJets = (TH1F*) list->FindObject(hnameNJets); // needed for normalization of bgr out of 2 jets
1221 TH1F* fh1FFJetPtBgr = (TH1F*) list->FindObject(hnameJetPt);
1222 TH2F* fh2FFTrackPtBgr = (TH2F*) list->FindObject(hnameBgrTrackPt);
1223 TH2F* fh2FFZBgr = (TH2F*) list->FindObject(hnameBgrZ);
1224 TH2F* fh2FFXiBgr = (TH2F*) list->FindObject(hnameBgrXi);
1226 if(!fh1FFJetPtBgr) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameJetPt.Data()); return; }
1227 if(!fh1NJets) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameNJets.Data()); return; }
1228 if(!fh2FFTrackPtBgr){ Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameBgrTrackPt.Data()); return; }
1229 if(!fh2FFZBgr) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameBgrZ.Data()); return; }
1230 if(!fh2FFXiBgr) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameBgrXi.Data()); return; }
1232 fh1FFJetPtBgr->SetDirectory(0);
1233 fh1NJets->SetDirectory(0);
1234 fh2FFTrackPtBgr->SetDirectory(0);
1235 fh2FFZBgr->SetDirectory(0);
1236 fh2FFXiBgr->SetDirectory(0);
1242 for(Int_t i=0; i<fNJetPtSlices; i++){
1244 Float_t jetPtLoLim = fJetPtSlices->At(i);
1245 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
1247 Int_t binLo = static_cast<Int_t>(fh1FFJetPtBgr->FindBin(jetPtLoLim));
1248 Int_t binUp = static_cast<Int_t>(fh1FFJetPtBgr->FindBin(jetPtUpLim)) - 1;
1250 Float_t nJetsBin = fh1FFJetPtBgr->Integral(binLo,binUp);
1251 Double_t scaleF = 1;
1253 fNJetsBgr->SetAt(nJetsBin*scaleF,i);
1255 if(fDebug>0) Printf("bgr jet pt %d to %d: nJets %f, scaleF %.2f",
1256 static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim),nJetsBin,scaleF);
1262 for(Int_t i=0; i<fNJetPtSlices; i++){
1264 Float_t jetPtLoLim = fJetPtSlices->At(i);
1265 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
1267 Int_t binLo = static_cast<Int_t>(fh2FFTrackPtBgr->GetXaxis()->FindBin(jetPtLoLim));
1268 Int_t binUp = static_cast<Int_t>(fh2FFTrackPtBgr->GetXaxis()->FindBin(jetPtUpLim))-1;
1270 if(binUp > fh2FFTrackPtBgr->GetNbinsX()){
1271 Printf("%s:%d -- jet pt range %0.3f exceeds histo limits",(char*)__FILE__,__LINE__,jetPtUpLim);
1275 TString strNameBgrPt(Form("fh1BgrTrackPt%s_%02d_%02d",strID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1276 TString strNameBgrZ(Form("fh1BgrZ%s_%02d_%02d",strID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1277 TString strNameBgrXi(Form("fh1BgrXi%s_%02d_%02d",strID.Data(),static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
1279 // appendix 'unbinned' to avoid histos with same name after rebinning
1280 TH1F* projPt = (TH1F*) fh2FFTrackPtBgr->ProjectionY(strNameBgrPt+"_unBinned",binLo,binUp,"o"); // option "o": original axis range
1281 TH1F* projZ = (TH1F*) fh2FFZBgr->ProjectionY(strNameBgrZ+"_unBinned",binLo,binUp,"o");
1282 TH1F* projXi = (TH1F*) fh2FFXiBgr->ProjectionY(strNameBgrXi+"_unBinned",binLo,binUp,"o");
1284 if(fNHistoBinsPt[i]) projPt = (TH1F*) projPt->Rebin(fNHistoBinsPt[i],strNameBgrPt,fHistoBinsPt[i]->GetArray());
1285 if(fNHistoBinsZ[i]) projZ = (TH1F*) projZ->Rebin(fNHistoBinsZ[i],strNameBgrZ,fHistoBinsZ[i]->GetArray());
1286 if(fNHistoBinsXi[i]) projXi = (TH1F*) projXi->Rebin(fNHistoBinsXi[i],strNameBgrXi,fHistoBinsXi[i]->GetArray());
1288 projPt->SetNameTitle(strNameBgrPt,"");
1289 projZ->SetNameTitle(strNameBgrZ,"");
1290 projXi->SetNameTitle(strNameBgrXi,"");
1292 // raw bgr = corr level 0
1293 fCorrBgr[0]->AddCorrHistos(i,projPt,projZ,projXi);
1298 //__________________________________________________________________________________________________________
1299 void AliFragmentationFunctionCorrections::WriteOutput(TString strfile, TString strdir, Bool_t updateOutfile)
1301 // write histos to file
1302 // skip histos with 0 entries
1304 TString outfileOption = "RECREATE";
1305 if(updateOutfile) outfileOption = "UPDATE";
1307 TFile f(strfile,outfileOption);
1310 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
1314 if(fDebug>0) Printf("%s:%d -- write FF to file %s ",(char*)__FILE__,__LINE__,strfile.Data());
1316 if(strdir && strdir.Length()){
1317 TDirectory* dir = f.mkdir(strdir);
1321 for(Int_t i=0; i<fNJetPtSlices; i++){
1323 for(Int_t c=0; c<fNCorrectionLevels; c++) if(fCorrFF[c]->GetTrackPt(i)->GetEntries()) fCorrFF[c]->GetTrackPt(i)->Write();
1324 for(Int_t c=0; c<fNCorrectionLevels; c++) if(fCorrFF[c]->GetZ(i)->GetEntries()) fCorrFF[c]->GetZ(i)->Write();
1325 for(Int_t c=0; c<fNCorrectionLevels; c++) if(fCorrFF[c]->GetXi(i)->GetEntries()) fCorrFF[c]->GetXi(i)->Write();
1327 if(fh1FFXiShift[i]->GetEntries()) fh1FFXiShift[i]->Write();
1329 for(Int_t c=0; c<fNCorrectionLevelsBgr; c++) if(fCorrBgr[c]->GetTrackPt(i)->GetEntries()) fCorrBgr[c]->GetTrackPt(i)->Write();
1330 for(Int_t c=0; c<fNCorrectionLevelsBgr; c++) if(fCorrBgr[c]->GetZ(i)->GetEntries()) fCorrBgr[c]->GetZ(i)->Write();
1331 for(Int_t c=0; c<fNCorrectionLevelsBgr; c++) if(fCorrBgr[c]->GetXi(i)->GetEntries()) fCorrBgr[c]->GetXi(i)->Write();
1334 if(fh1FFTrackPtBackFolded[i] && fh1FFTrackPtBackFolded[i]->GetEntries()) fh1FFTrackPtBackFolded[i]->Write();
1335 if(fh1FFZBackFolded[i] && fh1FFZBackFolded[i]->GetEntries()) fh1FFZBackFolded[i]->Write();
1336 if(fh1FFXiBackFolded[i] && fh1FFXiBackFolded[i]->GetEntries()) fh1FFXiBackFolded[i]->Write();
1339 if(fh1FFRatioTrackPtFolded[i] && fh1FFRatioTrackPtFolded[i]->GetEntries()) fh1FFRatioTrackPtFolded[i]->Write();
1340 if(fh1FFRatioZFolded[i] && fh1FFRatioZFolded[i]->GetEntries()) fh1FFRatioZFolded[i]->Write();
1341 if(fh1FFRatioXiFolded[i] && fh1FFRatioXiFolded[i]->GetEntries()) fh1FFRatioXiFolded[i]->Write();
1343 if(fh1FFRatioTrackPtBackFolded[i] && fh1FFRatioTrackPtBackFolded[i]->GetEntries()) fh1FFRatioTrackPtBackFolded[i]->Write();
1344 if(fh1FFRatioZBackFolded[i] && fh1FFRatioZBackFolded[i]->GetEntries()) fh1FFRatioZBackFolded[i]->Write();
1345 if(fh1FFRatioXiBackFolded[i] &&fh1FFRatioXiBackFolded[i]->GetEntries()) fh1FFRatioXiBackFolded[i]->Write();
1349 // inclusive track pt
1351 for(Int_t c=0; c<fNCorrectionLevelsSinglePt; c++) if(fCorrSinglePt[c]->GetTrackPt(0)->GetEntries()) fCorrSinglePt[c]->GetTrackPt(0)->Write();
1352 if(fh1SingleTrackPtBackFolded) fh1SingleTrackPtBackFolded->Write();
1353 if(fh1RatioSingleTrackPtFolded) fh1RatioSingleTrackPtFolded->Write();
1354 if(fh1RatioSingleTrackPtBackFolded) fh1RatioSingleTrackPtBackFolded->Write();
1359 //____________________________________________________________________________________________________________________________________
1360 THnSparse* AliFragmentationFunctionCorrections::TH1toSparse(const TH1F* hist, TString strName, TString strTit, const Bool_t fillConst)
1362 // copy 1-dimensional histo to THnSparse
1363 // if fillConst TRUE, create THnSparse with same binning as hist but all entries = 1
1364 // histos with variable bin size are supported
1366 // note: function returns pointer to 'new' THnSparse on heap, object needs to be deleted by user
1368 THnSparseF* fhnHist;
1370 Int_t nBins = hist->GetXaxis()->GetNbins();
1371 Int_t nBinsVec[1] = { nBins };
1373 const Double_t* binsVec = hist->GetXaxis()->GetXbins()->GetArray();
1375 if(binsVec){ // binsVec only neq NULL if histo was rebinned before
1377 fhnHist = new THnSparseF(strName,strTit,1,nBinsVec/*,binMinVec,binMaxVec*/);
1378 fhnHist->SetBinEdges(0,binsVec);
1380 else{ // uniform bin size
1382 Double_t xMin = hist->GetXaxis()->GetXmin();
1383 Double_t xMax = hist->GetXaxis()->GetXmax();
1385 Double_t binMinVec[1] = { xMin };
1386 Double_t binMaxVec[1] = { xMax };
1388 fhnHist = new THnSparseF(strName,strTit,1,nBinsVec,binMinVec,binMaxVec);
1392 for(Int_t bin=1; bin<=nBins; bin++){
1394 Double_t binCenter = fhnHist->GetAxis(0)->GetBinCenter(bin);
1396 Double_t binCoord[] = {binCenter};
1397 fhnHist->Fill(binCoord,1); // initially need to create the bin
1399 Long64_t binIndex = fhnHist->GetBin(binCoord);
1401 Double_t cont = hist->GetBinContent(bin);
1402 Double_t err = hist->GetBinError(bin);
1409 fhnHist->SetBinContent(binIndex,cont);
1410 fhnHist->SetBinError(binIndex,err);
1416 //______________________________________________________________________________________________________________________________________________
1417 THnSparse* AliFragmentationFunctionCorrections::Unfold(THnSparse* hnHist, const THnSparse* hnResponse, const THnSparse* hnEff, const Int_t nIter,
1418 const Bool_t useCorrelatedErrors, const THnSparse* hnPrior)
1420 // unfold input histo
1422 AliCFUnfolding unfolding("unfolding","",1,hnResponse,hnEff,hnHist,hnPrior); // arg3: nVar; hnEff required, hnPrior not (defaults to 0x0)
1423 unfolding.SetMaxNumberOfIterations(nIter);
1424 // unfolding.SetMaxChi2PerDOF(1.e-07); // OBSOLETE !!!
1425 // if(useSmoothing) unfolding.UseSmoothing();
1427 if(useCorrelatedErrors) unfolding.SetUseCorrelatedErrors();
1430 THnSparse* unfolded = unfolding.GetUnfolded();
1432 TString hnameUnf = hnHist->GetName();
1433 hnameUnf.Append("_unf");
1434 unfolded->SetNameTitle(hnameUnf,hnHist->GetTitle());
1439 //___________________________________________________________________________________________________________________________
1440 void AliFragmentationFunctionCorrections::UnfoldHistos(const Int_t nIter, const Bool_t useCorrelatedErrors, const Int_t type)
1442 // loop over jet pt slices and unfold dN/dpt spectra
1444 TString labelCorr = fCorrFF[fNCorrectionLevels-1]->GetLabel();
1445 if(!labelCorr.Contains("unfold")) AddCorrectionLevel("unfold");
1447 for(Int_t i=0; i<fNJetPtSlices; i++){
1450 if(type == kFlagPt) hist = fCorrFF[fNCorrectionLevels-2]->GetTrackPt(i); // level -2: before unfolding, level -1: unfolded
1451 else if(type == kFlagZ) hist = fCorrFF[fNCorrectionLevels-2]->GetZ(i); // level -2: before unfolding, level -1: unfolded
1452 else if(type == kFlagXi) hist = fCorrFF[fNCorrectionLevels-2]->GetXi(i); // level -2: before unfolding, level -1: unfolded
1454 Printf("%s%d unknown type",(char*)__FILE__,__LINE__);
1458 THnSparse* hnResponse = 0;
1459 if(type == kFlagPt) hnResponse = fhnResponsePt[i];
1460 else if(type == kFlagZ) hnResponse = fhnResponseZ[i];
1461 else if(type == kFlagXi) hnResponse = fhnResponseXi[i];
1463 Printf("%s%d unknown type",(char*)__FILE__,__LINE__);
1468 if(type == kFlagPt && fh1FFTrackPtPrior[i] && ((TString(fh1FFTrackPtPrior[i]->GetName())).Length() > 0) ) hPrior = fh1FFTrackPtPrior[i];
1469 else if(type == kFlagZ && fh1FFZPrior[i] && ((TString(fh1FFZPrior[i]->GetName())).Length() > 0) ) hPrior = fh1FFZPrior[i];
1470 else if(type == kFlagXi && fh1FFXiPrior[i] && ((TString(fh1FFXiPrior[i]->GetName())).Length() > 0) ) hPrior = fh1FFXiPrior[i];
1473 TString histNameTHn = hist->GetName();
1474 histNameTHn.ReplaceAll("TH1","THn");
1476 TString priorNameTHn;
1478 priorNameTHn = hPrior->GetName();
1479 priorNameTHn.ReplaceAll("TH1","THn");
1482 TString histNameBackFolded = hist->GetName();
1483 histNameBackFolded.Append("_backfold");
1485 TString histNameRatioFolded = hist->GetName();
1486 histNameRatioFolded.ReplaceAll("fh1FF","hRatioFF");
1487 histNameRatioFolded.Append("_unfold");
1489 TString histNameRatioBackFolded = hist->GetName();
1490 histNameRatioBackFolded.ReplaceAll("fh1FF","hRatioFF");
1491 histNameRatioBackFolded.Append("_backfold");
1493 THnSparse* hnHist = TH1toSparse(hist,histNameTHn,hist->GetTitle());
1494 THnSparse* hnFlatEfficiency = TH1toSparse(hist,"fhnEfficiency","eff",kTRUE); // could optionally also use real eff
1495 THnSparse* hnPrior = 0;
1496 if(hPrior) hnPrior = TH1toSparse(hPrior,priorNameTHn,hPrior->GetTitle());
1498 THnSparse* hnUnfolded
1499 = Unfold(hnHist,hnResponse,hnFlatEfficiency,nIter,useCorrelatedErrors,hnPrior);
1501 TH1F* hUnfolded = (TH1F*) hnUnfolded->Projection(0);
1503 hUnfolded->SetNameTitle(hist->GetName(),hist->GetTitle());
1505 if(type == kFlagPt) fCorrFF[fNCorrectionLevels-1]->AddCorrHistos(i,hUnfolded,0,0);
1506 if(type == kFlagZ) fCorrFF[fNCorrectionLevels-1]->AddCorrHistos(i,0,hUnfolded,0);
1507 if(type == kFlagXi) fCorrFF[fNCorrectionLevels-1]->AddCorrHistos(i,0,0,hUnfolded);
1509 // backfolding: apply response matrix to unfolded spectrum
1510 TH1F* hBackFolded = ApplyResponse(hUnfolded,hnResponse);
1512 hBackFolded->SetNameTitle(histNameBackFolded,hist->GetTitle());
1514 if(type == kFlagPt) fh1FFTrackPtBackFolded[i] = hBackFolded;
1515 if(type == kFlagZ) fh1FFZBackFolded[i] = hBackFolded;
1516 if(type == kFlagXi) fh1FFXiBackFolded[i] = hBackFolded;
1518 // ratio unfolded to original histo
1519 TH1F* hRatioUnfolded = (TH1F*) hUnfolded->Clone(histNameRatioFolded);
1520 hRatioUnfolded->Reset();
1522 hRatioUnfolded->Divide(hUnfolded,hist,1,1,"B");
1524 if(type == kFlagPt) fh1FFRatioTrackPtFolded[i] = hRatioUnfolded;
1525 if(type == kFlagZ) fh1FFRatioZFolded[i] = hRatioUnfolded;
1526 if(type == kFlagXi) fh1FFRatioXiFolded[i] = hRatioUnfolded;
1529 // ratio backfolded to original histo
1530 TH1F* hRatioBackFolded = (TH1F*) hBackFolded->Clone(histNameRatioBackFolded);
1531 hRatioBackFolded->Reset();
1532 hRatioBackFolded->Divide(hBackFolded,hist,1,1,"B");
1534 if(type == kFlagPt) fh1FFRatioTrackPtBackFolded[i] = hRatioBackFolded;
1535 if(type == kFlagZ) fh1FFRatioZBackFolded[i] = hRatioBackFolded;
1536 if(type == kFlagXi) fh1FFRatioXiBackFolded[i] = hRatioBackFolded;
1539 delete hnFlatEfficiency;
1544 //_____________________________________________________________________________________________________
1545 void AliFragmentationFunctionCorrections::UnfoldPt(const Int_t nIter, const Bool_t useCorrelatedErrors)
1548 Int_t type = kFlagPt;
1549 UnfoldHistos(nIter, useCorrelatedErrors, type);
1552 //_____________________________________________________________________________________________________
1553 void AliFragmentationFunctionCorrections::UnfoldZ(const Int_t nIter, const Bool_t useCorrelatedErrors)
1556 Int_t type = kFlagZ;
1557 UnfoldHistos(nIter, useCorrelatedErrors, type);
1560 //_____________________________________________________________________________________________________
1561 void AliFragmentationFunctionCorrections::UnfoldXi(const Int_t nIter, const Bool_t useCorrelatedErrors)
1564 Int_t type = kFlagXi;
1565 UnfoldHistos(nIter, useCorrelatedErrors, type);
1568 //______________________________________________________________________________________________
1569 TH1F* AliFragmentationFunctionCorrections::ApplyResponse(const TH1F* hist, THnSparse* hnResponse)
1571 // apply (multiply) response matrix to hist
1573 TH1F* hOut = new TH1F(*hist);
1576 const Int_t axisM = 0;
1577 const Int_t axisT = 1;
1579 Int_t nBinsM = hnResponse->GetAxis(axisM)->GetNbins();
1580 Int_t nBinsT = hnResponse->GetAxis(axisT)->GetNbins();
1582 // response matrix normalization
1583 // do it in this function and not when reading response, since for 'proper' normalization errors are difficult to assign
1584 // so for unfolding proper we leave it to CORRFW ...
1586 Double_t normFacResponse[nBinsT];
1588 for(Int_t iT=1; iT<=nBinsT; iT++){
1590 Double_t sumResp = 0;
1592 for(Int_t iM=1; iM<=nBinsM; iM++){
1594 Double_t coordM = hnResponse->GetAxis(axisM)->GetBinCenter(iM);
1595 Double_t coordT = hnResponse->GetAxis(axisT)->GetBinCenter(iT);
1597 Double_t binCoord[] = {coordM,coordT};
1599 Long64_t binIndex = hnResponse->GetBin(binCoord);
1601 Double_t resp = hnResponse->GetBinContent(binIndex);
1606 normFacResponse[iT] = 0;
1607 if(sumResp) normFacResponse[iT] = 1/sumResp;
1612 for(Int_t iM=1; iM<=nBinsM; iM++){
1616 for(Int_t iT=1; iT<=nBinsT; iT++){
1618 Double_t contT = hist->GetBinContent(iT);
1620 Double_t coordM = hnResponse->GetAxis(axisM)->GetBinCenter(iM);
1621 Double_t coordT = hnResponse->GetAxis(axisT)->GetBinCenter(iT);
1623 Double_t binCoord[] = {coordM,coordT};
1625 Long64_t binIndex = hnResponse->GetBin(binCoord);
1627 Double_t resp = hnResponse->GetBinContent(binIndex);
1629 contM += resp*normFacResponse[iT]*contT;
1632 hOut->SetBinContent(iM,contM);
1638 //_______________________________________________________________________________________________________
1639 void AliFragmentationFunctionCorrections::ReadEfficiency(TString strfile, TString strdir, TString strlist)
1641 // read reconstruction efficiency from file
1642 // argument strlist optional - read from directory strdir if not specified
1644 // temporary histos to hold histos from file
1645 TH1F* hEffPt[fNJetPtSlices];
1646 TH1F* hEffZ[fNJetPtSlices];
1647 TH1F* hEffXi[fNJetPtSlices];
1649 for(Int_t i=0; i<fNJetPtSlices; i++) hEffPt[i] = 0;
1650 for(Int_t i=0; i<fNJetPtSlices; i++) hEffZ[i] = 0;
1651 for(Int_t i=0; i<fNJetPtSlices; i++) hEffXi[i] = 0;
1653 TFile f(strfile,"READ");
1656 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
1660 if(fDebug>0) Printf("%s:%d -- read efficiencies from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
1662 if(strdir && strdir.Length()) gDirectory->cd(strdir);
1666 if(strlist && strlist.Length()){
1668 if(!(list = (TList*) gDirectory->Get(strlist))){
1669 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
1674 for(Int_t i=0; i<fNJetPtSlices; i++){
1676 Int_t jetPtLoLim = static_cast<Int_t> (fJetPtSlices->At(i));
1677 Int_t jetPtUpLim = static_cast<Int_t> (fJetPtSlices->At(i+1));
1679 TString strNameEffPt(Form("hEffPt_%02d_%02d",jetPtLoLim,jetPtUpLim));
1680 TString strNameEffZ(Form("hEffZ_%02d_%02d",jetPtLoLim,jetPtUpLim));
1681 TString strNameEffXi(Form("hEffXi_%02d_%02d",jetPtLoLim,jetPtUpLim));
1685 hEffPt[i] = (TH1F*) list->FindObject(strNameEffPt);
1686 hEffZ[i] = (TH1F*) list->FindObject(strNameEffZ);
1687 hEffXi[i] = (TH1F*) list->FindObject(strNameEffXi);
1690 hEffPt[i] = (TH1F*) gDirectory->Get(strNameEffPt);
1691 hEffZ[i] = (TH1F*) gDirectory->Get(strNameEffZ);
1692 hEffXi[i] = (TH1F*) gDirectory->Get(strNameEffXi);
1696 Printf("%s:%d -- error retrieving efficiency %s", (char*)__FILE__,__LINE__,strNameEffPt.Data());
1700 Printf("%s:%d -- error retrieving efficiency %s", (char*)__FILE__,__LINE__,strNameEffZ.Data());
1704 Printf("%s:%d -- error retrieving efficiency %s", (char*)__FILE__,__LINE__,strNameEffXi.Data());
1708 if(fNHistoBinsPt[i]) hEffPt[i] = (TH1F*) hEffPt[i]->Rebin(fNHistoBinsPt[i],strNameEffPt+"_rebin",fHistoBinsPt[i]->GetArray());
1709 if(fNHistoBinsZ[i]) hEffZ[i] = (TH1F*) hEffZ[i]->Rebin(fNHistoBinsZ[i],strNameEffZ+"_rebin",fHistoBinsZ[i]->GetArray());
1710 if(fNHistoBinsXi[i]) hEffXi[i] = (TH1F*) hEffXi[i]->Rebin(fNHistoBinsXi[i],strNameEffXi+"_rebin",fHistoBinsXi[i]->GetArray());
1712 if(hEffPt[i]) hEffPt[i]->SetDirectory(0);
1713 if(hEffZ[i]) hEffZ[i]->SetDirectory(0);
1714 if(hEffXi[i]) hEffXi[i]->SetDirectory(0);
1716 } // jet slices loop
1720 for(Int_t i=0; i<fNJetPtSlices; i++){ // 2nd loop: need to close input file before placing histos
1721 if(hEffPt[i]) new(fh1EffPt[i]) TH1F(*hEffPt[i]);
1722 if(hEffZ[i]) new(fh1EffZ[i]) TH1F(*hEffZ[i]);
1723 if(hEffXi[i]) new(fh1EffXi[i]) TH1F(*hEffXi[i]);
1727 //___________________________________________________________________________________________________________
1728 void AliFragmentationFunctionCorrections::ReadBgrEfficiency(TString strfile, TString strdir, TString strlist)
1730 // read bgr eff from file
1731 // argument strlist optional - read from directory strdir if not specified
1733 TH1F* hEffPtBgr[fNJetPtSlices];
1734 TH1F* hEffZBgr [fNJetPtSlices];
1735 TH1F* hEffXiBgr[fNJetPtSlices];
1737 for(Int_t i=0; i<fNJetPtSlices; i++) hEffPtBgr[i] = 0;
1738 for(Int_t i=0; i<fNJetPtSlices; i++) hEffZBgr[i] = 0;
1739 for(Int_t i=0; i<fNJetPtSlices; i++) hEffXiBgr[i] = 0;
1742 TFile f(strfile,"READ");
1745 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
1749 if(fDebug>0) Printf("%s:%d -- read bgr efficiencies from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
1751 if(strdir && strdir.Length()) gDirectory->cd(strdir);
1755 if(strlist && strlist.Length()){
1757 if(!(list = (TList*) gDirectory->Get(strlist))){
1758 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
1763 for(Int_t i=0; i<fNJetPtSlices; i++){
1765 Int_t jetPtLoLim = static_cast<Int_t> (fJetPtSlices->At(i));
1766 Int_t jetPtUpLim = static_cast<Int_t> (fJetPtSlices->At(i+1));
1768 TString strNameEffPtBgr(Form("hEffPtBgr%02dto%02d",jetPtLoLim,jetPtUpLim));
1769 TString strNameEffZBgr(Form("hEffZBgr%02dto%02d",jetPtLoLim,jetPtUpLim));
1770 TString strNameEffXiBgr(Form("hEffXiBgr%02dto%02d",jetPtLoLim,jetPtUpLim));
1774 hEffPtBgr[i] = (TH1F*) list->FindObject(strNameEffPtBgr);
1775 hEffZBgr[i] = (TH1F*) list->FindObject(strNameEffZBgr);
1776 hEffXiBgr[i] = (TH1F*) list->FindObject(strNameEffXiBgr);
1779 hEffPtBgr[i] = (TH1F*) gDirectory->Get(strNameEffPtBgr);
1780 hEffZBgr[i] = (TH1F*) gDirectory->Get(strNameEffZBgr);
1781 hEffXiBgr[i] = (TH1F*) gDirectory->Get(strNameEffXiBgr);
1785 Printf("%s:%d -- error retrieving efficiency %s", (char*)__FILE__,__LINE__,strNameEffPtBgr.Data());
1789 Printf("%s:%d -- error retrieving efficiency %s", (char*)__FILE__,__LINE__,strNameEffZBgr.Data());
1793 Printf("%s:%d -- error retrieving efficiency %s", (char*)__FILE__,__LINE__,strNameEffXiBgr.Data());
1797 if(fNHistoBinsPt[i]) hEffPtBgr[i] = (TH1F*) hEffPtBgr[i]->Rebin(fNHistoBinsPt[i],strNameEffPtBgr+"_rebin",fHistoBinsPt[i]->GetArray());
1798 if(fNHistoBinsZ[i]) hEffZBgr[i] = (TH1F*) hEffZBgr[i]->Rebin(fNHistoBinsZ[i],strNameEffZBgr+"_rebin",fHistoBinsZ[i]->GetArray());
1799 if(fNHistoBinsXi[i]) hEffXiBgr[i] = (TH1F*) hEffXiBgr[i]->Rebin(fNHistoBinsXi[i],strNameEffXiBgr+"_rebin",fHistoBinsXi[i]->GetArray());
1801 if(hEffPtBgr[i]) hEffPtBgr[i]->SetDirectory(0);
1802 if(hEffZBgr[i]) hEffZBgr[i]->SetDirectory(0);
1803 if(hEffXiBgr[i]) hEffXiBgr[i]->SetDirectory(0);
1805 } // jet slices loop
1809 for(Int_t i=0; i<fNJetPtSlices; i++){ // 2nd loop: need to close input file before placing histos
1810 if(hEffPtBgr[i]) new(fh1EffBgrPt[i]) TH1F(*hEffPtBgr[i]);
1811 if(hEffZBgr[i]) new(fh1EffBgrZ[i]) TH1F(*hEffZBgr[i]);
1812 if(hEffXiBgr[i]) new(fh1EffBgrXi[i]) TH1F(*hEffXiBgr[i]);
1816 // ________________________________________________
1817 void AliFragmentationFunctionCorrections::EffCorr()
1819 // apply efficiency correction
1821 AddCorrectionLevel("eff");
1823 for(Int_t i=0; i<fNJetPtSlices; i++){
1825 TH1F* histPt = fCorrFF[fNCorrectionLevels-2]->GetTrackPt(i);
1826 TH1F* histZ = fCorrFF[fNCorrectionLevels-2]->GetZ(i);
1827 TH1F* histXi = fCorrFF[fNCorrectionLevels-2]->GetXi(i);
1829 TString histNamePt = histPt->GetName();
1830 TString histNameZ = histZ->GetName();
1831 TString histNameXi = histXi->GetName();
1834 TH1F* hFFTrackPtEffCorr = (TH1F*) histPt->Clone(histNamePt);
1835 hFFTrackPtEffCorr->Divide(histPt,fh1EffPt[i],1,1,"");
1837 TH1F* hFFZEffCorr = (TH1F*) histZ->Clone(histNameZ);
1838 hFFZEffCorr->Divide(histZ,fh1EffZ[i],1,1,"");
1840 TH1F* hFFXiEffCorr = (TH1F*) histXi->Clone(histNameXi);
1841 hFFXiEffCorr->Divide(histXi,fh1EffXi[i],1,1,"");
1843 fCorrFF[fNCorrectionLevels-1]->AddCorrHistos(i,hFFTrackPtEffCorr,hFFZEffCorr,hFFXiEffCorr);
1847 //___________________________________________________
1848 void AliFragmentationFunctionCorrections::EffCorrBgr()
1850 // apply efficiency correction to bgr distributions
1852 AddCorrectionLevelBgr("eff");
1854 Printf("%s:%d -- apply efficiency correction, corrLevel %d",(char*)__FILE__,__LINE__,fNCorrectionLevels-1);
1856 for(Int_t i=0; i<fNJetPtSlices; i++){
1858 TH1F* histPt = fCorrBgr[fNCorrectionLevelsBgr-2]->GetTrackPt(i);
1859 TH1F* histZ = fCorrBgr[fNCorrectionLevelsBgr-2]->GetZ(i);
1860 TH1F* histXi = fCorrBgr[fNCorrectionLevelsBgr-2]->GetXi(i);
1862 TString histNamePt = histPt->GetName();
1863 TString histNameZ = histZ->GetName();
1864 TString histNameXi = histXi->GetName();
1867 TH1F* hFFTrackPtEffCorr = (TH1F*) histPt->Clone(histNamePt);
1868 hFFTrackPtEffCorr->Divide(histPt,fh1EffPt[i],1,1,"");
1870 TH1F* hFFZEffCorr = (TH1F*) histZ->Clone(histNameZ);
1871 hFFZEffCorr->Divide(histZ,fh1EffZ[i],1,1,"");
1873 TH1F* hFFXiEffCorr = (TH1F*) histXi->Clone(histNameXi);
1874 hFFXiEffCorr->Divide(histXi,fh1EffXi[i],1,1,"");
1876 fCorrBgr[fNCorrectionLevelsBgr-1]->AddCorrHistos(i,hFFTrackPtEffCorr,hFFZEffCorr,hFFXiEffCorr);
1880 //______________________________________________________________________
1881 void AliFragmentationFunctionCorrections::XiShift(const Int_t corrLevel)
1883 // re-evaluate jet energy after FF corrections from dN/dpt distribution
1884 // apply correction (shift) to dN/dxi distribution: xi = ln (pt/E) -> xi' = ln (pt/E') = ln (pt/E x E/E') = xi + ln E/E'
1885 // argument corrlevel: which level of correction to be corrected/shifted to
1887 if(corrLevel>=fNCorrectionLevels){
1888 Printf(" calc xi shift: corrLevel exceeded - do nothing");
1892 Double_t* jetPtUncorr = new Double_t[fNJetPtSlices];
1893 Double_t* jetPtCorr = new Double_t[fNJetPtSlices];
1894 Double_t* deltaXi = new Double_t[fNJetPtSlices];
1896 for(Int_t i=0; i<fNJetPtSlices; i++){
1898 TH1F* histPtRaw = fCorrFF[0]->GetTrackPt(i);
1899 TH1F* histPt = fCorrFF[corrLevel]->GetTrackPt(i);
1901 Double_t ptUncorr = 0;
1902 Double_t ptCorr = 0;
1904 for(Int_t bin = 1; bin<=histPtRaw->GetNbinsX(); bin++){
1906 Double_t cont = histPtRaw->GetBinContent(bin);
1907 Double_t width = histPtRaw->GetBinWidth(bin);
1908 Double_t meanPt = histPtRaw->GetBinCenter(bin);
1910 ptUncorr += meanPt*cont*width;
1913 for(Int_t bin = 1; bin<=histPt->GetNbinsX(); bin++){
1915 Double_t cont = histPt->GetBinContent(bin);
1916 Double_t width = histPt->GetBinWidth(bin);
1917 Double_t meanPt = histPt->GetBinCenter(bin);
1919 ptCorr += meanPt*cont*width;
1922 jetPtUncorr[i] = ptUncorr;
1923 jetPtCorr[i] = ptCorr;
1926 // calc dXi from dN/dpt distribution :
1927 // sum over track pt for raw and corrected FF is equivalent to raw/corrected jet pt
1929 for(Int_t i=0; i<fNJetPtSlices; i++){
1931 Float_t jetPtLoLim = fJetPtSlices->At(i);
1932 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
1934 Double_t meanJetPt = 0.5*(jetPtUpLim+jetPtLoLim);
1936 Double_t ptUncorr = jetPtUncorr[i];
1937 Double_t ptCorr = jetPtCorr[i];
1939 Double_t dXi = TMath::Log(ptCorr/ptUncorr);
1941 Printf(" calc xi shift: jet pt slice %d, mean jet pt %f, ptUncorr %f, ptCorr %f, ratio corr/uncorr %f, dXi %f "
1942 ,i,meanJetPt,ptUncorr,ptCorr,ptCorr/ptUncorr,dXi);
1947 // book & fill new dN/dxi histos
1949 for(Int_t i=0; i<fNJetPtSlices; i++){
1951 TH1F* histXi = fCorrFF[corrLevel]->GetXi(i);
1953 Double_t dXi = deltaXi[i];
1955 Int_t nBins = histXi->GetNbinsX();
1956 const Double_t* binsVec = histXi->GetXaxis()->GetXbins()->GetArray();
1957 Float_t binsVecNew[nBins+1];
1959 TString strName = histXi->GetName();
1960 strName.Append("_shift");
1961 TString strTit = histXi->GetTitle();
1965 // create shifted histo ...
1967 if(binsVec){ // binsVec only neq NULL if histo was rebinned before
1969 for(Int_t bin=0; bin<nBins+1; bin++) binsVecNew[bin] = binsVec[bin] + dXi;
1970 hXiCorr = new TH1F(strName,strTit,nBins,binsVecNew);
1972 else{ // uniform bin size
1974 Double_t xMin = histXi->GetXaxis()->GetXmin();
1975 Double_t xMax = histXi->GetXaxis()->GetXmax();
1980 hXiCorr = new TH1F(strName,strTit,nBins,xMin,xMax);
1985 for(Int_t bin=1; bin<nBins+1; bin++){
1986 Double_t cont = histXi->GetBinContent(bin);
1987 Double_t err = histXi->GetBinError(bin);
1989 hXiCorr->SetBinContent(bin,cont);
1990 hXiCorr->SetBinError(bin,err);
1993 new(fh1FFXiShift[i]) TH1F(*hXiCorr);
1997 delete[] jetPtUncorr;
2002 //_____________________________________________________
2003 void AliFragmentationFunctionCorrections::SubtractBgr()
2005 // subtract bgr distribution from FF
2006 // the current corr level is used for both
2008 AddCorrectionLevel("bgrSub");
2010 for(Int_t i=0; i<fNJetPtSlices; i++){
2012 TH1F* histPt = fCorrFF[fNCorrectionLevels-2]->GetTrackPt(i);
2013 TH1F* histZ = fCorrFF[fNCorrectionLevels-2]->GetZ(i);
2014 TH1F* histXi = fCorrFF[fNCorrectionLevels-2]->GetXi(i);
2016 TH1F* histPtBgr = fCorrBgr[fNCorrectionLevelsBgr-1]->GetTrackPt(i);
2017 TH1F* histZBgr = fCorrBgr[fNCorrectionLevelsBgr-1]->GetZ(i);
2018 TH1F* histXiBgr = fCorrBgr[fNCorrectionLevelsBgr-1]->GetXi(i);
2020 TString histNamePt = histPt->GetName();
2021 TString histNameZ = histZ->GetName();
2022 TString histNameXi = histXi->GetName();
2025 TH1F* hFFTrackPtBgrSub = (TH1F*) histPt->Clone(histNamePt);
2026 hFFTrackPtBgrSub->Add(histPtBgr,-1);
2028 TH1F* hFFZBgrSub = (TH1F*) histZ->Clone(histNameZ);
2029 hFFZBgrSub->Add(histZBgr,-1);
2031 TH1F* hFFXiBgrSub = (TH1F*) histXi->Clone(histNameXi);
2032 hFFXiBgrSub->Add(histXiBgr,-1);
2034 fCorrFF[fNCorrectionLevels-1]->AddCorrHistos(i,hFFTrackPtBgrSub,hFFZBgrSub,hFFXiBgrSub);
2038 //________________________________________________________________________________________________________________
2039 void AliFragmentationFunctionCorrections::WriteSingleTrackEff(TString strInfile, TString strID, TString strOutfile,
2040 Bool_t updateOutfile, TString strOutDir,TString strPostfix)
2042 // read task ouput from MC and write single track eff - standard dir/list
2044 TString strdir = "PWG4_FragmentationFunction_" + strID;
2045 TString strlist = "fracfunc_" + strID;
2047 WriteSingleTrackEff(strInfile,strdir,strlist,strOutfile,updateOutfile,strOutDir,strPostfix);
2050 //___________________________________________________________________________________________________________________________________
2051 void AliFragmentationFunctionCorrections::WriteSingleTrackEff(TString strInfile, TString strdir, TString strlist,
2052 TString strOutfile, Bool_t updateOutfile, TString strOutDir,TString strPostfix)
2054 // read task output from MC and write single track eff as function of pt, eta, phi
2055 // argument strlist optional - read from directory strdir if not specified
2056 // write eff to file stroutfile - by default only 'update' file (don't overwrite)
2059 TH1D* hdNdptTracksMCPrimGen;
2060 TH2D* hdNdetadphiTracksMCPrimGen;
2062 TH1D* hdNdptTracksMCPrimRec;
2063 TH2D* hdNdetadphiTracksMCPrimRec;
2066 TFile f(strInfile,"READ");
2069 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strInfile.Data());
2073 if(fDebug>0) Printf("%s:%d -- writeSingleTrackEff: open task ouput file %s ",(char*)__FILE__,__LINE__,strInfile.Data());
2075 if(strdir && strdir.Length()){
2076 if(fDebug>0) Printf("%s:%d -- writeSingleTrackEff: change dir to %s",(char*)__FILE__,__LINE__,strdir.Data());
2077 gDirectory->cd(strdir);
2082 if(strlist && strlist.Length()){
2084 if(!(list = (TList*) gDirectory->Get(strlist))){
2085 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
2091 TString hnamePtRecEffGen = "fh1TrackQAPtRecEffGen";
2092 if(strPostfix.Length()) hnamePtRecEffGen.Form("fh1TrackQAPtRecEffGen_%s",strPostfix.Data());
2094 TString hnamePtRecEffRec = "fh1TrackQAPtRecEffRec";
2095 if(strPostfix.Length()) hnamePtRecEffRec.Form("fh1TrackQAPtRecEffRec_%s",strPostfix.Data());
2097 TString hnameEtaPhiRecEffGen = "fh2TrackQAEtaPhiRecEffGen";
2098 if(strPostfix.Length()) hnameEtaPhiRecEffGen.Form("fh2TrackQAEtaPhiRecEffGen_%s",strPostfix.Data());
2100 TString hnameEtaPhiRecEffRec = "fh2TrackQAEtaPhiRecEffRec";
2101 if(strPostfix.Length()) hnameEtaPhiRecEffRec.Form("fh2TrackQAEtaPhiRecEffRec_%s",strPostfix.Data());
2105 hdNdptTracksMCPrimGen = (TH1D*) list->FindObject(hnamePtRecEffGen);
2106 hdNdetadphiTracksMCPrimGen = (TH2D*) list->FindObject(hnameEtaPhiRecEffGen);
2108 hdNdptTracksMCPrimRec = (TH1D*) list->FindObject(hnamePtRecEffRec);
2109 hdNdetadphiTracksMCPrimRec = (TH2D*) list->FindObject(hnameEtaPhiRecEffRec);
2112 hdNdptTracksMCPrimGen = (TH1D*) gDirectory->Get(hnamePtRecEffGen);
2113 hdNdetadphiTracksMCPrimGen = (TH2D*) gDirectory->Get(hnameEtaPhiRecEffGen);
2115 hdNdptTracksMCPrimRec = (TH1D*) gDirectory->Get(hnamePtRecEffRec);
2116 hdNdetadphiTracksMCPrimRec = (TH2D*) gDirectory->Get(hnameEtaPhiRecEffRec);
2119 hdNdptTracksMCPrimGen->SetDirectory(0);
2120 hdNdetadphiTracksMCPrimGen->SetDirectory(0);
2121 hdNdptTracksMCPrimRec->SetDirectory(0);
2122 hdNdetadphiTracksMCPrimRec->SetDirectory(0);
2126 // projections: dN/deta, dN/dphi
2128 TH1D* hdNdetaTracksMCPrimGen = (TH1D*) hdNdetadphiTracksMCPrimGen->ProjectionX("hdNdetaTracksMcPrimGen");
2129 TH1D* hdNdphiTracksMCPrimGen = (TH1D*) hdNdetadphiTracksMCPrimGen->ProjectionY("hdNdphiTracksMcPrimGen");
2131 TH1D* hdNdetaTracksMCPrimRec = (TH1D*) hdNdetadphiTracksMCPrimRec->ProjectionX("hdNdetaTracksMcPrimRec");
2132 TH1D* hdNdphiTracksMCPrimRec = (TH1D*) hdNdetadphiTracksMCPrimRec->ProjectionY("hdNdphiTracksMcPrimRec");
2136 TString strNamePtGen = "hTrackPtGenPrim";
2137 TString strNamePtRec = "hTrackPtRecPrim";
2139 if(fNHistoBinsSinglePt) hdNdptTracksMCPrimGen = (TH1D*) hdNdptTracksMCPrimGen->Rebin(fNHistoBinsSinglePt,strNamePtGen,fHistoBinsSinglePt->GetArray());
2140 if(fNHistoBinsSinglePt) hdNdptTracksMCPrimRec = (TH1D*) hdNdptTracksMCPrimRec->Rebin(fNHistoBinsSinglePt,strNamePtRec,fHistoBinsSinglePt->GetArray());
2142 // efficiency: divide
2144 TString hNameTrackEffPt = "hSingleTrackEffPt";
2145 if(strPostfix.Length()) hNameTrackEffPt.Form("hSingleTrackEffPt_%s",strPostfix.Data());
2147 TString hNameTrackEffEta = "hSingleTrackEffEta";
2148 if(strPostfix.Length()) hNameTrackEffEta.Form("hSingleTrackEffEta_%s",strPostfix.Data());
2150 TString hNameTrackEffPhi = "hSingleTrackEffPhi";
2151 if(strPostfix.Length()) hNameTrackEffPhi.Form("hSingleTrackEffPhi_%s",strPostfix.Data());
2154 TH1F* hSingleTrackEffPt = (TH1F*) hdNdptTracksMCPrimRec->Clone(hNameTrackEffPt);
2155 hSingleTrackEffPt->Divide(hdNdptTracksMCPrimRec,hdNdptTracksMCPrimGen,1,1,"B"); // binominal errors
2157 TH1F* hSingleTrackEffEta = (TH1F*) hdNdetaTracksMCPrimRec->Clone(hNameTrackEffEta);
2158 hSingleTrackEffEta->Divide(hdNdetaTracksMCPrimRec,hdNdetaTracksMCPrimGen,1,1,"B"); // binominal errors
2160 TH1F* hSingleTrackEffPhi = (TH1F*) hdNdphiTracksMCPrimRec->Clone(hNameTrackEffPhi);
2161 hSingleTrackEffPhi->Divide(hdNdphiTracksMCPrimRec,hdNdphiTracksMCPrimGen,1,1,"B"); // binominal errors
2164 TString outfileOption = "RECREATE";
2165 if(updateOutfile) outfileOption = "UPDATE";
2167 TFile out(strOutfile,outfileOption);
2170 Printf("%s:%d -- error opening efficiency output file %s", (char*)__FILE__,__LINE__,strOutfile.Data());
2174 if(fDebug>0) Printf("%s:%d -- write efficiency to file %s ",(char*)__FILE__,__LINE__,strOutfile.Data());
2176 if(strOutDir && strOutDir.Length()){
2179 if((dir = ((TDirectory*) gDirectory->Get(strOutDir)))) dir->cd();
2181 dir = out.mkdir(strOutDir);
2186 hSingleTrackEffPt->Write();
2187 hSingleTrackEffEta->Write();
2188 hSingleTrackEffPhi->Write();
2193 //________________________________________________________________________________________________________________
2194 void AliFragmentationFunctionCorrections::WriteSingleTrackSecCorr(TString strInfile, TString strID, TString strOutfile,
2195 Bool_t updateOutfile, TString strOutDir)
2197 // read task ouput from MC and write single track eff - standard dir/list
2199 TString strdir = "PWG4_FragmentationFunction_" + strID;
2200 TString strlist = "fracfunc_" + strID;
2202 WriteSingleTrackSecCorr(strInfile,strdir,strlist,strOutfile,updateOutfile,strOutDir);
2205 //___________________________________________________________________________________________________________________________________
2206 void AliFragmentationFunctionCorrections::WriteSingleTrackSecCorr(TString strInfile, TString strdir, TString strlist,
2207 TString strOutfile, Bool_t updateOutfile, TString strOutDir)
2209 // read task output from MC and write single track secondaries contamination correction as function of pt, eta, phi
2210 // argument strlist optional - read from directory strdir if not specified
2211 // write corr factor to file stroutfile - by default only 'update' file (don't overwrite)
2213 TH1D* hdNdptTracksMCPrimRec;
2214 TH2D* hdNdetadphiTracksMCPrimRec;
2216 TH1D* hdNdptTracksMCSecRec;
2217 TH2D* hdNdetadphiTracksMCSecRec;
2219 TFile f(strInfile,"READ");
2222 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strInfile.Data());
2226 if(fDebug>0) Printf("%s:%d -- writeSingleTrackEff: open task ouput file %s",(char*)__FILE__,__LINE__,strInfile.Data());
2228 if(strdir && strdir.Length()) gDirectory->cd(strdir);
2232 if(strlist && strlist.Length()){
2234 if(!(list = (TList*) gDirectory->Get(strlist))){
2235 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
2242 hdNdptTracksMCPrimRec = (TH1D*) list->FindObject("fh1TrackQAPtRecEffGen");
2243 hdNdetadphiTracksMCPrimRec = (TH2D*) list->FindObject("fh2TrackQAEtaPhiRecEffGen");
2245 hdNdptTracksMCSecRec = (TH1D*) list->FindObject("fh1TrackQAPtSecRec");
2246 hdNdetadphiTracksMCSecRec = (TH2D*) list->FindObject("fh2TrackQAEtaPhiSecRec");
2249 hdNdptTracksMCPrimRec = (TH1D*) gDirectory->Get("fh1TrackQAPtRecEffGen");
2250 hdNdetadphiTracksMCPrimRec = (TH2D*) gDirectory->Get("fh2TrackQAEtaPhiRecEffGen");
2252 hdNdptTracksMCSecRec = (TH1D*) gDirectory->Get("fh1TrackQAPtSecRec");
2253 hdNdetadphiTracksMCSecRec = (TH2D*) gDirectory->Get("fh2TrackQAEtaPhiSecRec");
2256 hdNdptTracksMCPrimRec->SetDirectory(0);
2257 hdNdetadphiTracksMCPrimRec->SetDirectory(0);
2258 hdNdptTracksMCSecRec->SetDirectory(0);
2259 hdNdetadphiTracksMCSecRec->SetDirectory(0);
2263 // projections: dN/deta, dN/dphi
2265 TH1D* hdNdetaTracksMCPrimRec = (TH1D*) hdNdetadphiTracksMCPrimRec->ProjectionX("hdNdetaTracksMcPrimRec");
2266 TH1D* hdNdphiTracksMCPrimRec = (TH1D*) hdNdetadphiTracksMCPrimRec->ProjectionY("hdNdphiTracksMcPrimRec");
2268 TH1D* hdNdetaTracksMCSecRec = (TH1D*) hdNdetadphiTracksMCSecRec->ProjectionX("hdNdetaTracksMcSecRec");
2269 TH1D* hdNdphiTracksMCSecRec = (TH1D*) hdNdetadphiTracksMCSecRec->ProjectionY("hdNdphiTracksMcSecRec");
2274 TString strNamePtPrim = "hTrackPtPrim";
2275 TString strNamePtSec = "hTrackPtSec";
2277 if(fNHistoBinsSinglePt) hdNdptTracksMCPrimRec = (TH1D*) hdNdptTracksMCPrimRec->Rebin(fNHistoBinsSinglePt,strNamePtPrim,fHistoBinsSinglePt->GetArray());
2278 if(fNHistoBinsSinglePt) hdNdptTracksMCSecRec = (TH1D*) hdNdptTracksMCSecRec->Rebin(fNHistoBinsSinglePt,strNamePtSec,fHistoBinsSinglePt->GetArray());
2281 // secondary correction factor: divide prim/(prim+sec)
2283 TH1F* hSingleTrackSecCorrPt = (TH1F*) hdNdptTracksMCSecRec->Clone("hSingleTrackSecCorrPt");
2284 TH1F* hSumPrimSecPt = (TH1F*) hdNdptTracksMCSecRec->Clone("hSumPrimSecPt");
2285 hSumPrimSecPt->Add(hdNdptTracksMCPrimRec);
2286 hSingleTrackSecCorrPt->Divide(hdNdptTracksMCPrimRec,hSumPrimSecPt,1,1,"B"); // binominal errors
2288 TH1F* hSingleTrackSecCorrEta = (TH1F*) hdNdetaTracksMCSecRec->Clone("hSingleTrackSecCorrEta");
2289 TH1F* hSumPrimSecEta = (TH1F*) hdNdetaTracksMCSecRec->Clone("hSumPrimSecEta");
2290 hSumPrimSecEta->Add(hdNdetaTracksMCPrimRec);
2291 hSingleTrackSecCorrEta->Divide(hdNdetaTracksMCPrimRec,hSumPrimSecEta,1,1,"B"); // binominal errors
2293 TH1F* hSingleTrackSecCorrPhi = (TH1F*) hdNdphiTracksMCSecRec->Clone("hSingleTrackSecCorrPhi");
2294 TH1F* hSumPrimSecPhi = (TH1F*) hdNdphiTracksMCSecRec->Clone("hSumPrimSecPhi");
2295 hSumPrimSecPhi->Add(hdNdphiTracksMCPrimRec);
2296 hSingleTrackSecCorrPhi->Divide(hdNdphiTracksMCPrimRec,hSumPrimSecPhi,1,1,"B"); // binominal errors
2299 TString outfileOption = "RECREATE";
2300 if(updateOutfile) outfileOption = "UPDATE";
2302 TFile out(strOutfile,outfileOption);
2305 Printf("%s:%d -- error opening secCorr output file %s", (char*)__FILE__,__LINE__,strOutfile.Data());
2309 if(fDebug>0) Printf("%s:%d -- write secCorr to file %s ",(char*)__FILE__,__LINE__,strOutfile.Data());
2311 if(strOutDir && strOutDir.Length()){
2314 if((dir = ((TDirectory*) gDirectory->Get(strOutDir)))) dir->cd();
2316 dir = out.mkdir(strOutDir);
2321 hdNdptTracksMCSecRec->Write();
2322 hdNdetaTracksMCSecRec->Write();
2323 hdNdphiTracksMCSecRec->Write();
2325 hSingleTrackSecCorrPt->Write();
2326 hSingleTrackSecCorrEta->Write();
2327 hSingleTrackSecCorrPhi->Write();
2332 //________________________________________________________________________________________________________________
2333 void AliFragmentationFunctionCorrections::WriteSingleResponse(TString strInfile, TString strID, TString strOutfile,
2334 Bool_t updateOutfile, TString strOutDir)
2336 // read task ouput from MC and write single track eff - standard dir/list
2338 TString strdir = "PWG4_FragmentationFunction_" + strID;
2339 TString strlist = "fracfunc_" + strID;
2341 WriteSingleResponse(strInfile,strdir,strlist,strOutfile,updateOutfile,strOutDir);
2345 //_____________________________________________________________________________________________________________________________________
2346 void AliFragmentationFunctionCorrections::WriteSingleResponse(TString strInfile, TString strdir, TString strlist,
2347 TString strOutfile, Bool_t updateOutfile, TString strOutDir)
2349 // read 2d THnSparse response matrices in pt from file
2351 // write to strOutfile
2353 THnSparse* hnResponseSinglePt;
2354 TH2F* h2ResponseSinglePt;
2356 TFile f(strInfile,"READ");
2359 Printf("%s:%d -- error opening file %s", (char*)__FILE__,__LINE__,strInfile.Data());
2363 if(fDebug>0) Printf("%s:%d -- read response matrices from file %s ",(char*)__FILE__,__LINE__,strInfile.Data());
2365 if(strdir && strdir.Length()) gDirectory->cd(strdir);
2369 if(strlist && strlist.Length()){
2371 if(!(list = (TList*) gDirectory->Get(strlist))){
2372 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
2377 if(list) hnResponseSinglePt = (THnSparse*) list->FindObject("fhnResponseSinglePt");
2378 else hnResponseSinglePt = (THnSparse*) gDirectory->Get("fhnResponseSinglePt");
2381 if(!hnResponseSinglePt){
2382 Printf("%s:%d -- error retrieving response matrix fhnResponseSinglePt",(char*)__FILE__,__LINE__);
2390 h2ResponseSinglePt = (TH2F*) hnResponseSinglePt->Projection(1,0);// note convention: yDim,xDim
2391 h2ResponseSinglePt->SetNameTitle("h2ResponseSinglePt","");
2396 TString outfileOption = "RECREATE";
2397 if(updateOutfile) outfileOption = "UPDATE";
2399 TFile out(strOutfile,outfileOption);
2402 Printf("%s:%d -- error opening response matrix output file %s", (char*)__FILE__,__LINE__,strOutfile.Data());
2406 if(fDebug>0) Printf("%s:%d -- write response matrices to file %s ",(char*)__FILE__,__LINE__,strOutfile.Data());
2408 if(strOutDir && strOutDir.Length()){
2411 if((dir = ((TDirectory*) gDirectory->Get(strOutDir)))) dir->cd();
2413 dir = out.mkdir(strOutDir);
2418 hnResponseSinglePt->Write();
2419 h2ResponseSinglePt->Write();
2424 //________________________________________________________________________________________________________________
2425 void AliFragmentationFunctionCorrections::WriteJetTrackEff(TString strInfile, TString strID, TString strOutfile,
2426 Bool_t updateOutfile)
2428 // read task ouput from MC and write single track eff - standard dir/list
2430 TString strdir = "PWG4_FragmentationFunction_" + strID;
2431 TString strlist = "fracfunc_" + strID;
2433 WriteJetTrackEff(strInfile,strdir,strlist,strOutfile,updateOutfile);
2436 //___________________________________________________________________________________________________________________________________
2437 void AliFragmentationFunctionCorrections::WriteJetTrackEff(TString strInfile, TString strdir, TString strlist,
2438 TString strOutfile, Bool_t updateOutfile)
2440 // read task output from MC and write track eff in jet pt slices as function of pt, z, xi
2441 // argument strlist optional - read from directory strdir if not specified
2442 // write eff to file strOutfile - by default only 'update' file (don't overwrite)
2444 TH1F* hEffPt[fNJetPtSlices];
2445 TH1F* hEffXi[fNJetPtSlices];
2446 TH1F* hEffZ[fNJetPtSlices];
2448 TH1F* hdNdptTracksMCPrimGen[fNJetPtSlices];
2449 TH1F* hdNdxiMCPrimGen[fNJetPtSlices];
2450 TH1F* hdNdzMCPrimGen[fNJetPtSlices];
2452 TH1F* hdNdptTracksMCPrimRec[fNJetPtSlices];
2453 TH1F* hdNdxiMCPrimRec[fNJetPtSlices];
2454 TH1F* hdNdzMCPrimRec[fNJetPtSlices];
2457 TH1F* fh1FFJetPtRecEffGen;
2459 TH2F* fh2FFTrackPtRecEffGen;
2460 TH2F* fh2FFZRecEffGen;
2461 TH2F* fh2FFXiRecEffGen;
2463 TH2F* fh2FFTrackPtRecEffRec;
2464 TH2F* fh2FFZRecEffRec;
2465 TH2F* fh2FFXiRecEffRec;
2468 TFile f(strInfile,"READ");
2471 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strInfile.Data());
2475 if(fDebug>0) Printf("%s:%d -- writeJetTrackEff: open task ouput file %s",(char*)__FILE__,__LINE__,strInfile.Data());
2477 if(strdir && strdir.Length()) gDirectory->cd(strdir);
2481 if(strlist && strlist.Length()){
2483 if(!(list = (TList*) gDirectory->Get(strlist))){
2484 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
2490 fh1FFJetPtRecEffGen = (TH1F*) list->FindObject("fh1FFJetPtRecEffGen");
2492 fh2FFTrackPtRecEffGen = (TH2F*) list->FindObject("fh2FFTrackPtRecEffGen");
2493 fh2FFZRecEffGen = (TH2F*) list->FindObject("fh2FFZRecEffGen");
2494 fh2FFXiRecEffGen = (TH2F*) list->FindObject("fh2FFXiRecEffGen");
2496 fh2FFTrackPtRecEffRec = (TH2F*) list->FindObject("fh2FFTrackPtRecEffRec");
2497 fh2FFZRecEffRec = (TH2F*) list->FindObject("fh2FFZRecEffRec");
2498 fh2FFXiRecEffRec = (TH2F*) list->FindObject("fh2FFXiRecEffRec");
2501 fh1FFJetPtRecEffGen = (TH1F*) gDirectory->FindObject("fh1FFJetPtRecEffGen");
2503 fh2FFTrackPtRecEffGen = (TH2F*) gDirectory->FindObject("fh2FFTrackPtRecEffGen");
2504 fh2FFZRecEffGen = (TH2F*) gDirectory->FindObject("fh2FFZRecEffGen");
2505 fh2FFXiRecEffGen = (TH2F*) gDirectory->FindObject("fh2FFXiRecEffGen");
2507 fh2FFTrackPtRecEffRec = (TH2F*) gDirectory->FindObject("fh2FFTrackPtRecEffRec");
2508 fh2FFZRecEffRec = (TH2F*) gDirectory->FindObject("fh2FFZRecEffRec");
2509 fh2FFXiRecEffRec = (TH2F*) gDirectory->FindObject("fh2FFXiRecEffRec");
2512 fh1FFJetPtRecEffGen->SetDirectory(0);
2514 fh2FFTrackPtRecEffGen->SetDirectory(0);
2515 fh2FFZRecEffGen->SetDirectory(0);
2516 fh2FFXiRecEffGen->SetDirectory(0);
2518 fh2FFTrackPtRecEffRec->SetDirectory(0);
2519 fh2FFZRecEffRec->SetDirectory(0);
2520 fh2FFXiRecEffRec->SetDirectory(0);
2525 // projections: FF for generated and reconstructed primaries
2527 for(Int_t i=0; i<fNJetPtSlices; i++){
2529 Float_t jetPtLoLim = fJetPtSlices->At(i);
2530 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
2532 Int_t binLo = static_cast<Int_t>(fh2FFTrackPtRecEffGen->GetXaxis()->FindBin(jetPtLoLim));
2533 Int_t binUp = static_cast<Int_t>(fh2FFTrackPtRecEffGen->GetXaxis()->FindBin(jetPtUpLim))-1;
2535 if(binUp > fh2FFTrackPtRecEffGen->GetNbinsX()){
2536 Printf("%s:%d -- jet pt range %0.3f exceeds histo limits",(char*)__FILE__,__LINE__,jetPtUpLim);
2540 TString strNameFFPtGen(Form("fh1FFTrackPtGenPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2541 TString strNameFFZGen(Form("fh1FFZGenPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2542 TString strNameFFXiGen(Form("fh1FFXiGenPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2544 TString strNameFFPtRec(Form("fh1FFTrackPtRecPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2545 TString strNameFFZRec(Form("fh1FFZRecPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2546 TString strNameFFXiRec(Form("fh1FFXiRecPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2549 // appendix 'unbinned' to avoid histos with same name after rebinning
2551 hdNdptTracksMCPrimGen[i] = (TH1F*) fh2FFTrackPtRecEffGen->ProjectionY(strNameFFPtGen+"_unBinned",binLo,binUp,"o"); // option "o": original axis range
2552 hdNdzMCPrimGen[i] = (TH1F*) fh2FFZRecEffGen->ProjectionY(strNameFFZGen+"_unBinned",binLo,binUp,"o");
2553 hdNdxiMCPrimGen[i] = (TH1F*) fh2FFXiRecEffGen->ProjectionY(strNameFFXiGen+"_unBinned",binLo,binUp,"o");
2555 hdNdptTracksMCPrimRec[i] = (TH1F*) fh2FFTrackPtRecEffRec->ProjectionY(strNameFFPtRec+"_unBinned",binLo,binUp,"o"); // option "o": original axis range
2556 hdNdzMCPrimRec[i] = (TH1F*) fh2FFZRecEffRec->ProjectionY(strNameFFZRec+"_unBinned",binLo,binUp,"o");
2557 hdNdxiMCPrimRec[i] = (TH1F*) fh2FFXiRecEffRec->ProjectionY(strNameFFXiRec+"_unBinned",binLo,binUp,"o");
2561 if(fNHistoBinsPt[i]) hdNdptTracksMCPrimGen[i] = (TH1F*) hdNdptTracksMCPrimGen[i]->Rebin(fNHistoBinsPt[i],strNameFFPtGen,fHistoBinsPt[i]->GetArray());
2562 if(fNHistoBinsZ[i]) hdNdzMCPrimGen[i] = (TH1F*) hdNdzMCPrimGen[i]->Rebin(fNHistoBinsZ[i],strNameFFZGen,fHistoBinsZ[i]->GetArray());
2563 if(fNHistoBinsXi[i]) hdNdxiMCPrimGen[i] = (TH1F*) hdNdxiMCPrimGen[i]->Rebin(fNHistoBinsXi[i],strNameFFXiGen,fHistoBinsXi[i]->GetArray());
2565 if(fNHistoBinsPt[i]) hdNdptTracksMCPrimRec[i] = (TH1F*) hdNdptTracksMCPrimRec[i]->Rebin(fNHistoBinsPt[i],strNameFFPtRec,fHistoBinsPt[i]->GetArray());
2566 if(fNHistoBinsZ[i]) hdNdzMCPrimRec[i] = (TH1F*) hdNdzMCPrimRec[i]->Rebin(fNHistoBinsZ[i],strNameFFZRec,fHistoBinsZ[i]->GetArray());
2567 if(fNHistoBinsXi[i]) hdNdxiMCPrimRec[i] = (TH1F*) hdNdxiMCPrimRec[i]->Rebin(fNHistoBinsXi[i],strNameFFXiRec,fHistoBinsXi[i]->GetArray());
2569 hdNdptTracksMCPrimGen[i]->SetNameTitle(strNameFFPtGen,"");
2570 hdNdzMCPrimGen[i]->SetNameTitle(strNameFFZGen,"");
2571 hdNdxiMCPrimGen[i]->SetNameTitle(strNameFFXiGen,"");
2573 hdNdptTracksMCPrimRec[i]->SetNameTitle(strNameFFPtRec,"");
2574 hdNdzMCPrimRec[i]->SetNameTitle(strNameFFZRec,"");
2575 hdNdxiMCPrimRec[i]->SetNameTitle(strNameFFXiRec,"");
2579 Double_t nJetsBin = fh1FFJetPtRecEffGen->Integral(binLo,binUp);
2581 NormalizeTH1(hdNdptTracksMCPrimGen[i],nJetsBin);
2582 NormalizeTH1(hdNdzMCPrimGen[i],nJetsBin);
2583 NormalizeTH1(hdNdxiMCPrimGen[i],nJetsBin);
2585 NormalizeTH1(hdNdptTracksMCPrimRec[i],nJetsBin);
2586 NormalizeTH1(hdNdzMCPrimRec[i],nJetsBin);
2587 NormalizeTH1(hdNdxiMCPrimRec[i],nJetsBin);
2589 // divide rec/gen : efficiency
2591 TString strNameEffPt(Form("hEffPt_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
2592 TString strNameEffZ(Form("hEffZ_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
2593 TString strNameEffXi(Form("hEffXi_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
2595 hEffPt[i] = (TH1F*) hdNdptTracksMCPrimRec[i]->Clone(strNameEffPt);
2596 hEffPt[i]->Divide(hdNdptTracksMCPrimRec[i],hdNdptTracksMCPrimGen[i],1,1,"B"); // binominal errors
2598 hEffXi[i] = (TH1F*) hdNdxiMCPrimRec[i]->Clone(strNameEffXi);
2599 hEffXi[i]->Divide(hdNdxiMCPrimRec[i],hdNdxiMCPrimGen[i],1,1,"B"); // binominal errors
2601 hEffZ[i] = (TH1F*) hdNdzMCPrimRec[i]->Clone(strNameEffZ);
2602 hEffZ[i]->Divide(hdNdzMCPrimRec[i],hdNdzMCPrimGen[i],1,1,"B"); // binominal errors
2607 TString outfileOption = "RECREATE";
2608 if(updateOutfile) outfileOption = "UPDATE";
2610 TFile out(strOutfile,outfileOption);
2613 Printf("%s:%d -- error opening efficiency output file %s", (char*)__FILE__,__LINE__,strOutfile.Data());
2617 if(fDebug>0) Printf("%s:%d -- write efficiency to file %s ",(char*)__FILE__,__LINE__,strOutfile.Data());
2619 // if(strdir && strdir.Length()){
2620 // TDirectory* dir = out.mkdir(strdir);
2624 for(Int_t i=0; i<fNJetPtSlices; i++){
2626 hdNdptTracksMCPrimGen[i]->Write();
2627 hdNdxiMCPrimGen[i]->Write();
2628 hdNdzMCPrimGen[i]->Write();
2630 hdNdptTracksMCPrimRec[i]->Write();
2631 hdNdxiMCPrimRec[i]->Write();
2632 hdNdzMCPrimRec[i]->Write();
2643 //________________________________________________________________________________________________________________
2644 void AliFragmentationFunctionCorrections::WriteJetSecCorr(TString strInfile, TString strID, TString strOutfile,
2645 Bool_t updateOutfile)
2647 // read task ouput from MC and write secondary correction - standard dir/list
2649 TString strdir = "PWG4_FragmentationFunction_" + strID;
2650 TString strlist = "fracfunc_" + strID;
2652 WriteJetSecCorr(strInfile,strdir,strlist,strOutfile,updateOutfile);
2655 //___________________________________________________________________________________________________________________________________
2656 void AliFragmentationFunctionCorrections::WriteJetSecCorr(TString strInfile, TString strdir, TString strlist,
2657 TString strOutfile, Bool_t updateOutfile)
2659 // read task output from MC and write secondary correction in jet pt slices as function of pt, z, xi
2660 // argument strlist optional - read from directory strdir if not specified
2661 // write eff to file strOutfile - by default only 'update' file (don't overwrite)
2663 TH1F* hSecCorrPt[fNJetPtSlices];
2664 TH1F* hSecCorrXi[fNJetPtSlices];
2665 TH1F* hSecCorrZ[fNJetPtSlices];
2667 TH1F* hdNdptTracksMCPrimRec[fNJetPtSlices];
2668 TH1F* hdNdxiMCPrimRec[fNJetPtSlices];
2669 TH1F* hdNdzMCPrimRec[fNJetPtSlices];
2671 TH1F* hdNdptTracksMCSecRec[fNJetPtSlices];
2672 TH1F* hdNdxiMCSecRec[fNJetPtSlices];
2673 TH1F* hdNdzMCSecRec[fNJetPtSlices];
2675 TH1F* fh1FFJetPtRecEffGen;
2677 TH2F* fh2FFTrackPtRecEffRec;
2678 TH2F* fh2FFZRecEffRec;
2679 TH2F* fh2FFXiRecEffRec;
2681 TH2F* fh2FFTrackPtSecRec;
2683 TH2F* fh2FFXiSecRec;
2685 TFile f(strInfile,"READ");
2688 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strInfile.Data());
2692 if(fDebug>0) Printf("%s:%d -- writeJetTrackEff: open task ouput file %s",(char*)__FILE__,__LINE__,strInfile.Data());
2694 if(strdir && strdir.Length()) gDirectory->cd(strdir);
2698 if(strlist && strlist.Length()){
2700 if(!(list = (TList*) gDirectory->Get(strlist))){
2701 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
2707 fh1FFJetPtRecEffGen = (TH1F*) list->FindObject("fh1FFJetPtRecEffGen");
2709 fh2FFTrackPtRecEffRec = (TH2F*) list->FindObject("fh2FFTrackPtRecEffRec");
2710 fh2FFZRecEffRec = (TH2F*) list->FindObject("fh2FFZRecEffRec");
2711 fh2FFXiRecEffRec = (TH2F*) list->FindObject("fh2FFXiRecEffRec");
2713 fh2FFTrackPtSecRec = (TH2F*) list->FindObject("fh2FFTrackPtSecRec");
2714 fh2FFZSecRec = (TH2F*) list->FindObject("fh2FFZSecRec");
2715 fh2FFXiSecRec = (TH2F*) list->FindObject("fh2FFXiSecRec");
2718 fh1FFJetPtRecEffGen = (TH1F*) gDirectory->FindObject("fh1FFJetPtRecEffGen");
2720 fh2FFTrackPtRecEffRec = (TH2F*) gDirectory->FindObject("fh2FFTrackPtRecEffRec");
2721 fh2FFZRecEffRec = (TH2F*) gDirectory->FindObject("fh2FFZRecEffRec");
2722 fh2FFXiRecEffRec = (TH2F*) gDirectory->FindObject("fh2FFXiRecEffRec");
2724 fh2FFTrackPtSecRec = (TH2F*) gDirectory->FindObject("fh2FFTrackPtSecRec");
2725 fh2FFZSecRec = (TH2F*) gDirectory->FindObject("fh2FFZSecRec");
2726 fh2FFXiSecRec = (TH2F*) gDirectory->FindObject("fh2FFXiSecRec");
2729 fh1FFJetPtRecEffGen->SetDirectory(0);
2731 fh2FFTrackPtRecEffRec->SetDirectory(0);
2732 fh2FFZRecEffRec->SetDirectory(0);
2733 fh2FFXiRecEffRec->SetDirectory(0);
2735 fh2FFTrackPtSecRec->SetDirectory(0);
2736 fh2FFZSecRec->SetDirectory(0);
2737 fh2FFXiSecRec->SetDirectory(0);
2742 // projections: FF for generated and reconstructed primaries
2744 for(Int_t i=0; i<fNJetPtSlices; i++){
2746 Float_t jetPtLoLim = fJetPtSlices->At(i);
2747 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
2749 Int_t binLo = static_cast<Int_t>(fh2FFTrackPtRecEffRec->GetXaxis()->FindBin(jetPtLoLim));
2750 Int_t binUp = static_cast<Int_t>(fh2FFTrackPtRecEffRec->GetXaxis()->FindBin(jetPtUpLim))-1;
2752 if(binUp > fh2FFTrackPtRecEffRec->GetNbinsX()){
2753 Printf("%s:%d -- jet pt range %0.3f exceeds histo limits",(char*)__FILE__,__LINE__,jetPtUpLim);
2757 TString strNameFFPtPrimRec(Form("fh1FFTrackPtRecPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2758 TString strNameFFZPrimRec(Form("fh1FFZRecPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2759 TString strNameFFXiPrimRec(Form("fh1FFXiRecPrim_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2761 TString strNameFFPtSecRec(Form("fh1FFTrackPtRecSec_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2762 TString strNameFFZSecRec(Form("fh1FFZRecSec_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2763 TString strNameFFXiSecRec(Form("fh1FFXiRecSec_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
2766 // appendix 'unbinned' to avoid histos with same name after rebinning
2768 hdNdptTracksMCPrimRec[i] = (TH1F*) fh2FFTrackPtRecEffRec->ProjectionY(strNameFFPtPrimRec+"_unBinned",binLo,binUp,"o"); // option "o": original axis range
2769 hdNdzMCPrimRec[i] = (TH1F*) fh2FFZRecEffRec->ProjectionY(strNameFFZPrimRec+"_unBinned",binLo,binUp,"o");
2770 hdNdxiMCPrimRec[i] = (TH1F*) fh2FFXiRecEffRec->ProjectionY(strNameFFXiPrimRec+"_unBinned",binLo,binUp,"o");
2772 hdNdptTracksMCSecRec[i] = (TH1F*) fh2FFTrackPtSecRec->ProjectionY(strNameFFPtSecRec+"_unBinned",binLo,binUp,"o"); // option "o": original axis range
2773 hdNdzMCSecRec[i] = (TH1F*) fh2FFZSecRec->ProjectionY(strNameFFZSecRec+"_unBinned",binLo,binUp,"o");
2774 hdNdxiMCSecRec[i] = (TH1F*) fh2FFXiSecRec->ProjectionY(strNameFFXiSecRec+"_unBinned",binLo,binUp,"o");
2778 if(fNHistoBinsPt[i]) hdNdptTracksMCPrimRec[i] = (TH1F*) hdNdptTracksMCPrimRec[i]->Rebin(fNHistoBinsPt[i],strNameFFPtPrimRec,fHistoBinsPt[i]->GetArray());
2779 if(fNHistoBinsZ[i]) hdNdzMCPrimRec[i] = (TH1F*) hdNdzMCPrimRec[i]->Rebin(fNHistoBinsZ[i],strNameFFZPrimRec,fHistoBinsZ[i]->GetArray());
2780 if(fNHistoBinsXi[i]) hdNdxiMCPrimRec[i] = (TH1F*) hdNdxiMCPrimRec[i]->Rebin(fNHistoBinsXi[i],strNameFFXiPrimRec,fHistoBinsXi[i]->GetArray());
2782 if(fNHistoBinsPt[i]) hdNdptTracksMCSecRec[i] = (TH1F*) hdNdptTracksMCSecRec[i]->Rebin(fNHistoBinsPt[i],strNameFFPtSecRec,fHistoBinsPt[i]->GetArray());
2783 if(fNHistoBinsZ[i]) hdNdzMCSecRec[i] = (TH1F*) hdNdzMCSecRec[i]->Rebin(fNHistoBinsZ[i],strNameFFZSecRec,fHistoBinsZ[i]->GetArray());
2784 if(fNHistoBinsXi[i]) hdNdxiMCSecRec[i] = (TH1F*) hdNdxiMCSecRec[i]->Rebin(fNHistoBinsXi[i],strNameFFXiSecRec,fHistoBinsXi[i]->GetArray());
2786 hdNdptTracksMCPrimRec[i]->SetNameTitle(strNameFFPtPrimRec,"");
2787 hdNdzMCPrimRec[i]->SetNameTitle(strNameFFZPrimRec,"");
2788 hdNdxiMCPrimRec[i]->SetNameTitle(strNameFFXiPrimRec,"");
2790 hdNdptTracksMCSecRec[i]->SetNameTitle(strNameFFPtSecRec,"");
2791 hdNdzMCSecRec[i]->SetNameTitle(strNameFFZSecRec,"");
2792 hdNdxiMCSecRec[i]->SetNameTitle(strNameFFXiSecRec,"");
2796 Double_t nJetsBin = fh1FFJetPtRecEffGen->Integral(binLo,binUp);
2798 NormalizeTH1(hdNdptTracksMCPrimRec[i],nJetsBin);
2799 NormalizeTH1(hdNdzMCPrimRec[i],nJetsBin);
2800 NormalizeTH1(hdNdxiMCPrimRec[i],nJetsBin);
2802 NormalizeTH1(hdNdptTracksMCSecRec[i],nJetsBin);
2803 NormalizeTH1(hdNdzMCSecRec[i],nJetsBin);
2804 NormalizeTH1(hdNdxiMCSecRec[i],nJetsBin);
2806 // divide rec/gen : efficiency
2808 TString strNameSecCorrPt(Form("hSecCorrPt_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
2809 TString strNameSecCorrZ(Form("hSecCorrZ_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
2810 TString strNameSecCorrXi(Form("hSecCorrXi_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
2812 hSecCorrPt[i] = (TH1F*) hdNdptTracksMCSecRec[i]->Clone(strNameSecCorrPt);
2813 TH1F* hSumPrimSecPt = (TH1F*) hdNdptTracksMCSecRec[i]->Clone("hSumPrimSecPt");
2814 hSumPrimSecPt->Add(hdNdptTracksMCPrimRec[i]);
2815 hSecCorrPt[i]->Divide(hdNdptTracksMCPrimRec[i],hSumPrimSecPt,1,1,"B"); // binominal errors
2817 hSecCorrXi[i] = (TH1F*) hdNdxiMCSecRec[i]->Clone(strNameSecCorrXi);
2818 TH1F* hSumPrimSecXi = (TH1F*) hdNdxiMCSecRec[i]->Clone("hSumPrimSecXi");
2819 hSumPrimSecXi->Add(hdNdxiMCPrimRec[i]);
2820 hSecCorrXi[i]->Divide(hdNdxiMCPrimRec[i],hSumPrimSecXi,1,1,"B"); // binominal errors
2822 hSecCorrZ[i] = (TH1F*) hdNdzMCSecRec[i]->Clone(strNameSecCorrZ);
2823 TH1F* hSumPrimSecZ = (TH1F*) hdNdzMCSecRec[i]->Clone("hSumPrimSecZ");
2824 hSumPrimSecZ->Add(hdNdzMCPrimRec[i]);
2825 hSecCorrZ[i]->Divide(hdNdzMCPrimRec[i],hSumPrimSecZ,1,1,"B"); // binominal errors
2830 TString outfileOption = "RECREATE";
2831 if(updateOutfile) outfileOption = "UPDATE";
2833 TFile out(strOutfile,outfileOption);
2836 Printf("%s:%d -- error opening efficiency output file %s", (char*)__FILE__,__LINE__,strOutfile.Data());
2840 if(fDebug>0) Printf("%s:%d -- write efficiency to file %s ",(char*)__FILE__,__LINE__,strOutfile.Data());
2842 for(Int_t i=0; i<fNJetPtSlices; i++){
2844 // hdNdptTracksMCSecRec[i]->Write();
2845 // hdNdxiMCSecRec[i]->Write();
2846 // hdNdzMCSecRec[i]->Write();
2848 hSecCorrPt[i]->Write();
2849 hSecCorrXi[i]->Write();
2850 hSecCorrZ[i]->Write();
2856 //________________________________________________________________________________________________________________
2857 void AliFragmentationFunctionCorrections::WriteJetResponse(TString strInfile, TString strID, TString strOutfile,
2858 Bool_t updateOutfile)
2860 // read task ouput from MC and write single track eff - standard dir/list
2862 TString strdir = "PWG4_FragmentationFunction_" + strID;
2863 TString strlist = "fracfunc_" + strID;
2865 WriteJetResponse(strInfile,strdir,strlist,strOutfile,updateOutfile);
2868 //_____________________________________________________________________________________________________________________________________
2869 void AliFragmentationFunctionCorrections::WriteJetResponse(TString strInfile, TString strdir, TString strlist,
2870 TString strOutfile, Bool_t updateOutfile)
2872 // read 3d THnSparse response matrices in pt,z,xi vs jet pt from file
2873 // project THnSparse + TH2 in jet pt slices
2874 // write to strOutfile
2876 THnSparse* hn3ResponseJetPt;
2877 THnSparse* hn3ResponseJetZ;
2878 THnSparse* hn3ResponseJetXi;
2880 // 2D response matrices
2882 THnSparse* hnResponsePt[fNJetPtSlices];
2883 THnSparse* hnResponseZ[fNJetPtSlices];
2884 THnSparse* hnResponseXi[fNJetPtSlices];
2886 TH2F* h2ResponsePt[fNJetPtSlices];
2887 TH2F* h2ResponseZ[fNJetPtSlices];
2888 TH2F* h2ResponseXi[fNJetPtSlices];
2890 // 1D projections on gen pt / rec pt axes
2892 TH1F* h1FFPtRec[fNJetPtSlices];
2893 TH1F* h1FFZRec[fNJetPtSlices];
2894 TH1F* h1FFXiRec[fNJetPtSlices];
2896 TH1F* h1FFPtGen[fNJetPtSlices];
2897 TH1F* h1FFZGen[fNJetPtSlices];
2898 TH1F* h1FFXiGen[fNJetPtSlices];
2900 TH1F* h1RatioPt[fNJetPtSlices];
2901 TH1F* h1RatioZ[fNJetPtSlices];
2902 TH1F* h1RatioXi[fNJetPtSlices];
2906 TFile f(strInfile,"READ");
2909 Printf("%s:%d -- error opening file %s", (char*)__FILE__,__LINE__,strInfile.Data());
2913 if(fDebug>0) Printf("%s:%d -- read response matrices from file %s ",(char*)__FILE__,__LINE__,strInfile.Data());
2915 if(strdir && strdir.Length()) gDirectory->cd(strdir);
2919 if(strlist && strlist.Length()){
2921 if(!(list = (TList*) gDirectory->Get(strlist))){
2922 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
2928 hn3ResponseJetPt = (THnSparse*) list->FindObject("fhnResponseJetTrackPt");
2929 hn3ResponseJetZ = (THnSparse*) list->FindObject("fhnResponseJetZ");
2930 hn3ResponseJetXi = (THnSparse*) list->FindObject("fhnResponseJetXi");
2933 hn3ResponseJetPt = (THnSparse*) gDirectory->Get("fhnResponseJetTrackPt");
2934 hn3ResponseJetZ = (THnSparse*) gDirectory->Get("fhnResponseJetZ");
2935 hn3ResponseJetXi = (THnSparse*) gDirectory->Get("fhnResponseJetXi");
2939 if(!hn3ResponseJetPt){
2940 Printf("%s:%d -- error retrieving response matrix fhnResponseJetTrackPt",(char*)__FILE__,__LINE__);
2944 if(!hn3ResponseJetZ){
2945 Printf("%s:%d -- error retrieving response matrix fhnResponseJetZ",(char*)__FILE__,__LINE__);
2949 if(!hn3ResponseJetXi){
2950 Printf("%s:%d -- error retrieving response matrix fhnResponseJetXi",(char*)__FILE__,__LINE__);
2958 Int_t axisJetPtTHn3 = -1;
2959 Int_t axisGenPtTHn3 = -1;
2960 Int_t axisRecPtTHn3 = -1;
2962 for(Int_t i=0; i<hn3ResponseJetPt->GetNdimensions(); i++){
2964 TString title = hn3ResponseJetPt->GetAxis(i)->GetTitle();
2966 if(title.Contains("jet p_{T}")) axisJetPtTHn3 = i;
2967 if(title.Contains("gen p_{T}")) axisGenPtTHn3 = i;
2968 if(title.Contains("rec p_{T}")) axisRecPtTHn3 = i;
2971 if(axisJetPtTHn3 == -1){
2972 Printf("%s:%d -- error axisJetPtTHn3",(char*)__FILE__,__LINE__);
2976 if(axisGenPtTHn3 == -1){
2977 Printf("%s:%d -- error axisGenPtTHn3",(char*)__FILE__,__LINE__);
2981 if(axisRecPtTHn3 == -1){
2982 Printf("%s:%d -- error axisRecPtTHn3",(char*)__FILE__,__LINE__);
2986 for(Int_t i=0; i<fNJetPtSlices; i++){
2988 Float_t jetPtLoLim = fJetPtSlices->At(i);
2989 Float_t jetPtUpLim = fJetPtSlices->At(i+1);
2991 Int_t binLo = static_cast<Int_t>(hn3ResponseJetPt->GetAxis(axisJetPtTHn3)->FindBin(jetPtLoLim));
2992 Int_t binUp = static_cast<Int_t>(hn3ResponseJetPt->GetAxis(axisJetPtTHn3)->FindBin(jetPtUpLim))-1;
2994 if(binUp > hn3ResponseJetPt->GetAxis(axisJetPtTHn3)->GetNbins()){
2995 Printf("%s:%d -- jet pt range %0.3f exceeds histo limits",(char*)__FILE__,__LINE__,jetPtUpLim);
2999 TString strNameRespPt(Form("hnResponsePt_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
3000 TString strNameRespZ(Form("hnResponseZ_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
3001 TString strNameRespXi(Form("hnResponseXi_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
3003 TString strNameTH2RespPt(Form("h2ResponsePt_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
3004 TString strNameTH2RespZ(Form("h2ResponseZ_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
3005 TString strNameTH2RespXi(Form("h2ResponseXi_%02d_%02d",static_cast<Int_t> (jetPtLoLim),static_cast<Int_t> (jetPtUpLim)));
3007 TString strNameRecPt(Form("h1FFTrackPtRecPrim_recPt_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3008 TString strNameRecZ(Form("h1FFZRecPrim_recPt_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3009 TString strNameRecXi(Form("h1FFXiRecPrim_recPt_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3011 TString strNameGenPt(Form("h1FFTrackPtRecPrim_genPt_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3012 TString strNameGenZ(Form("h1FFZRecPrim_genPt_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3013 TString strNameGenXi(Form("h1FFXiRecPrim_genPt_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3015 TString strNameRatioPt(Form("h1RatioTrackPtRecPrim_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3016 TString strNameRatioZ(Form("h1RatioZRecPrim_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3017 TString strNameRatioXi(Form("h1RatioXiRecPrim_%02d_%02d",static_cast<Int_t>(jetPtLoLim),static_cast<Int_t>(jetPtUpLim)));
3020 // 2D projections in jet pt range
3022 hn3ResponseJetPt->GetAxis(axisJetPtTHn3)->SetRange(binLo,binUp);
3023 hn3ResponseJetZ->GetAxis(axisJetPtTHn3)->SetRange(binLo,binUp);
3024 hn3ResponseJetXi->GetAxis(axisJetPtTHn3)->SetRange(binLo,binUp);
3026 Int_t axesProj[2] = {axisRecPtTHn3,axisGenPtTHn3};
3028 hnResponsePt[i] = hn3ResponseJetPt->Projection(2,axesProj);
3029 hnResponseZ[i] = hn3ResponseJetZ->Projection(2,axesProj);
3030 hnResponseXi[i] = hn3ResponseJetXi->Projection(2,axesProj);
3032 hnResponsePt[i]->SetNameTitle(strNameRespPt,"");
3033 hnResponseZ[i]->SetNameTitle(strNameRespZ,"");
3034 hnResponseXi[i]->SetNameTitle(strNameRespXi,"");
3036 h2ResponsePt[i] = (TH2F*) hnResponsePt[i]->Projection(1,0);// note convention: yDim,xDim
3037 h2ResponseZ[i] = (TH2F*) hnResponseZ[i]->Projection(1,0); // note convention: yDim,xDim
3038 h2ResponseXi[i] = (TH2F*) hnResponseXi[i]->Projection(1,0);// note convention: yDim,xDim
3040 h2ResponsePt[i]->SetNameTitle(strNameTH2RespPt,"");
3041 h2ResponseZ[i]->SetNameTitle(strNameTH2RespZ,"");
3042 h2ResponseXi[i]->SetNameTitle(strNameTH2RespXi,"");
3047 Int_t axisGenPtTHn2 = -1;
3048 Int_t axisRecPtTHn2 = -1;
3050 for(Int_t d=0; d<hnResponsePt[i]->GetNdimensions(); d++){
3052 TString title = hnResponsePt[i]->GetAxis(d)->GetTitle();
3054 if(title.Contains("gen p_{T}")) axisGenPtTHn2 = d;
3055 if(title.Contains("rec p_{T}")) axisRecPtTHn2 = d;
3059 if(axisGenPtTHn2 == -1){
3060 Printf("%s:%d -- error axisGenPtTHn2",(char*)__FILE__,__LINE__);
3064 if(axisRecPtTHn2 == -1){
3065 Printf("%s:%d -- error axisRecPtTHn2",(char*)__FILE__,__LINE__);
3070 h1FFPtRec[i] = (TH1F*) hnResponsePt[i]->Projection(axisRecPtTHn2);// note convention: yDim,xDim
3071 h1FFZRec[i] = (TH1F*) hnResponseZ[i]->Projection(axisRecPtTHn2);// note convention: yDim,xDim
3072 h1FFXiRec[i] = (TH1F*) hnResponseXi[i]->Projection(axisRecPtTHn2);// note convention: yDim,xDim
3074 h1FFPtRec[i]->SetNameTitle(strNameRecPt,"");
3075 h1FFZRec[i]->SetNameTitle(strNameRecZ,"");
3076 h1FFXiRec[i]->SetNameTitle(strNameRecXi,"");
3078 h1FFPtGen[i] = (TH1F*) hnResponsePt[i]->Projection(axisGenPtTHn2);// note convention: yDim,xDim
3079 h1FFZGen[i] = (TH1F*) hnResponseZ[i]->Projection(axisGenPtTHn2);// note convention: yDim,xDim
3080 h1FFXiGen[i] = (TH1F*) hnResponseXi[i]->Projection(axisGenPtTHn2);// note convention: yDim,xDim
3082 h1FFPtGen[i]->SetNameTitle(strNameGenPt,"");
3083 h1FFZGen[i]->SetNameTitle(strNameGenZ,"");
3084 h1FFXiGen[i]->SetNameTitle(strNameGenXi,"");
3086 // normalize 1D projections
3088 if(fNHistoBinsPt[i]) h1FFPtRec[i] = (TH1F*) h1FFPtRec[i]->Rebin(fNHistoBinsPt[i],"",fHistoBinsPt[i]->GetArray());
3089 if(fNHistoBinsZ[i]) h1FFZRec[i] = (TH1F*) h1FFZRec[i]->Rebin(fNHistoBinsZ[i],"",fHistoBinsZ[i]->GetArray());
3090 if(fNHistoBinsXi[i]) h1FFXiRec[i] = (TH1F*) h1FFXiRec[i]->Rebin(fNHistoBinsXi[i],"",fHistoBinsXi[i]->GetArray());
3092 if(fNHistoBinsPt[i]) h1FFPtGen[i] = (TH1F*) h1FFPtGen[i]->Rebin(fNHistoBinsPt[i],"",fHistoBinsPt[i]->GetArray());
3093 if(fNHistoBinsZ[i]) h1FFZGen[i] = (TH1F*) h1FFZGen[i]->Rebin(fNHistoBinsZ[i],"",fHistoBinsZ[i]->GetArray());
3094 if(fNHistoBinsXi[i]) h1FFXiGen[i] = (TH1F*) h1FFXiGen[i]->Rebin(fNHistoBinsXi[i],"",fHistoBinsXi[i]->GetArray());
3096 NormalizeTH1(h1FFPtRec[i],fNJets->At(i));
3097 NormalizeTH1(h1FFZRec[i],fNJets->At(i));
3098 NormalizeTH1(h1FFXiRec[i],fNJets->At(i));
3100 NormalizeTH1(h1FFPtGen[i],fNJets->At(i));
3101 NormalizeTH1(h1FFZGen[i],fNJets->At(i));
3102 NormalizeTH1(h1FFXiGen[i],fNJets->At(i));
3104 // ratios 1D projections
3106 h1RatioPt[i] = (TH1F*) h1FFPtRec[i]->Clone(strNameRatioPt);
3107 h1RatioPt[i]->Reset();
3108 h1RatioPt[i]->Divide(h1FFPtRec[i],h1FFPtGen[i],1,1,"B");
3110 h1RatioZ[i] = (TH1F*) h1FFZRec[i]->Clone(strNameRatioZ);
3111 h1RatioZ[i]->Reset();
3112 h1RatioZ[i]->Divide(h1FFZRec[i],h1FFZGen[i],1,1,"B");
3114 h1RatioXi[i] = (TH1F*) h1FFXiRec[i]->Clone(strNameRatioXi);
3115 h1RatioXi[i]->Reset();
3116 h1RatioXi[i]->Divide(h1FFXiRec[i],h1FFXiGen[i],1,1,"B");
3122 TString outfileOption = "RECREATE";
3123 if(updateOutfile) outfileOption = "UPDATE";
3125 TFile out(strOutfile,outfileOption);
3128 Printf("%s:%d -- error opening response matrix output file %s", (char*)__FILE__,__LINE__,strOutfile.Data());
3132 if(fDebug>0) Printf("%s:%d -- write response matrices to file %s ",(char*)__FILE__,__LINE__,strOutfile.Data());
3134 //if(strdir && strdir.Length()){
3135 // TDirectory* dir = out.mkdir(strdir);
3139 for(Int_t i=0; i<fNJetPtSlices; i++){
3141 hnResponsePt[i]->Write();
3142 hnResponseXi[i]->Write();
3143 hnResponseZ[i]->Write();
3145 h2ResponsePt[i]->Write();
3146 h2ResponseXi[i]->Write();
3147 h2ResponseZ[i]->Write();
3149 h1FFPtRec[i]->Write();
3150 h1FFZRec[i]->Write();
3151 h1FFXiRec[i]->Write();
3153 h1FFPtGen[i]->Write();
3154 h1FFZGen[i]->Write();
3155 h1FFXiGen[i]->Write();
3157 h1RatioPt[i]->Write();
3158 h1RatioZ[i]->Write();
3159 h1RatioXi[i]->Write();
3166 //______________________________________________________________________________________________________
3167 void AliFragmentationFunctionCorrections::ReadResponse(TString strfile, TString strdir, TString strlist)
3169 // read response matrices from file
3170 // argument strlist optional - read from directory strdir if not specified
3171 // note: THnSparse are not rebinned
3173 THnSparse* hRespPt[fNJetPtSlices];
3174 THnSparse* hRespZ[fNJetPtSlices];
3175 THnSparse* hRespXi[fNJetPtSlices];
3177 for(Int_t i=0; i<fNJetPtSlices; i++) hRespPt[i] = 0;
3178 for(Int_t i=0; i<fNJetPtSlices; i++) hRespZ[i] = 0;
3179 for(Int_t i=0; i<fNJetPtSlices; i++) hRespXi[i] = 0;
3181 TFile f(strfile,"READ");
3184 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
3188 if(fDebug>0) Printf("%s:%d -- read response matrices from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
3190 if(strdir && strdir.Length()) gDirectory->cd(strdir);
3194 if(strlist && strlist.Length()){
3196 if(!(list = (TList*) gDirectory->Get(strlist))){
3197 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
3202 for(Int_t i=0; i<fNJetPtSlices; i++){
3204 Int_t jetPtLoLim = static_cast<Int_t> (fJetPtSlices->At(i));
3205 Int_t jetPtUpLim = static_cast<Int_t> (fJetPtSlices->At(i+1));
3207 TString strNameRespPt(Form("hnResponsePt_%02d_%02d",jetPtLoLim,jetPtUpLim));
3208 TString strNameRespZ(Form("hnResponseZ_%02d_%02d",jetPtLoLim,jetPtUpLim));
3209 TString strNameRespXi(Form("hnResponseXi_%02d_%02d",jetPtLoLim,jetPtUpLim));
3212 hRespPt[i] = (THnSparse*) list->FindObject(strNameRespPt);
3213 hRespZ[i] = (THnSparse*) list->FindObject(strNameRespZ);
3214 hRespXi[i] = (THnSparse*) list->FindObject(strNameRespXi);
3217 hRespPt[i] = (THnSparse*) gDirectory->Get(strNameRespPt);
3218 hRespZ[i] = (THnSparse*) gDirectory->Get(strNameRespZ);
3219 hRespXi[i] = (THnSparse*) gDirectory->Get(strNameRespXi);
3223 Printf("%s:%d -- error retrieving response %s", (char*)__FILE__,__LINE__,strNameRespPt.Data());
3227 Printf("%s:%d -- error retrieving response %s", (char*)__FILE__,__LINE__,strNameRespZ.Data());
3231 Printf("%s:%d -- error retrieving response %s", (char*)__FILE__,__LINE__,strNameRespXi.Data());
3234 // if(0){ // can't rebin THnSparse ...
3235 // if(fNHistoBinsPt[i]) hRespPt[i]->SetBinEdges(0,fHistoBinsPt[i]->GetArray());
3236 // if(fNHistoBinsPt[i]) hRespPt[i]->SetBinEdges(1,fHistoBinsPt[i]->GetArray());
3238 // if(fNHistoBinsZ[i]) hRespZ[i]->SetBinEdges(0,fHistoBinsZ[i]->GetArray());
3239 // if(fNHistoBinsZ[i]) hRespZ[i]->SetBinEdges(1,fHistoBinsZ[i]->GetArray());
3241 // if(fNHistoBinsXi[i]) hRespXi[i]->SetBinEdges(0,fHistoBinsXi[i]->GetArray());
3242 // if(fNHistoBinsXi[i]) hRespXi[i]->SetBinEdges(1,fHistoBinsXi[i]->GetArray());
3246 } // jet slices loop
3248 f.Close(); // THnSparse pointers still valid even if file closed
3250 // for(Int_t i=0; i<fNJetPtSlices; i++){ // no copy c'tor ...
3251 // if(hRespPt[i]) new(fhnResponsePt[i]) THnSparseF(*hRespPt[i]);
3252 // if(hRespZ[i]) new(fhnResponseZ[i]) THnSparseF(*hRespZ[i]);
3253 // if(hRespXi[i]) new(fhnResponseXi[i]) THnSparseF(*hRespXi[i]);
3256 for(Int_t i=0; i<fNJetPtSlices; i++){
3257 fhnResponsePt[i] = hRespPt[i];
3258 fhnResponseZ[i] = hRespZ[i];
3259 fhnResponseXi[i] = hRespXi[i];
3263 //______________________________________________________________________________________________________________________
3264 void AliFragmentationFunctionCorrections::ReadPriors(TString strfile,const Int_t type)
3266 // read priors from file: rec primaries, gen pt dist
3268 if(fDebug>0) Printf("%s:%d -- read priors from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
3270 // temporary histos to store pointers from file
3271 TH1F* hist[fNJetPtSlices];
3273 for(Int_t i=0; i<fNJetPtSlices; i++) hist[i] = 0;
3275 TFile f(strfile,"READ");
3278 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
3282 for(Int_t i=0; i<fNJetPtSlices; i++){
3284 Int_t jetPtLoLim = static_cast<Int_t> (fJetPtSlices->At(i));
3285 Int_t jetPtUpLim = static_cast<Int_t> (fJetPtSlices->At(i+1));
3289 if(type == kFlagPt) strName.Form("h1FFTrackPtRecPrim_genPt_%02d_%02d",jetPtLoLim,jetPtUpLim);
3290 if(type == kFlagZ) strName.Form("h1FFZRecPrim_genPt_%02d_%02d",jetPtLoLim,jetPtUpLim);
3291 if(type == kFlagXi) strName.Form("h1FFXiRecPrim_genPt_%02d_%02d",jetPtLoLim,jetPtUpLim);
3293 hist[i] = (TH1F*) gDirectory->Get(strName);
3296 Printf("%s:%d -- error retrieving prior %s", (char*)__FILE__,__LINE__,strName.Data());
3300 //if(fNHistoBinsPt[i]) hist[i] = (TH1F*) hist[i]->Rebin(fNHistoBinsPt[i],hist[i]->GetName()+"_rebin",fHistoBinsPt[i]->GetArray());
3302 if(hist[i]) hist[i]->SetDirectory(0);
3304 } // jet slices loop
3309 for(Int_t i=0; i<fNJetPtSlices; i++){ // 2nd loop: need to close input file before placing histos
3310 if(hist[i] && type == kFlagPt) new(fh1FFTrackPtPrior[i]) TH1F(*hist[i]);
3311 if(hist[i] && type == kFlagZ) new(fh1FFZPrior[i]) TH1F(*hist[i]);
3312 if(hist[i] && type == kFlagXi) new(fh1FFXiPrior[i]) TH1F(*hist[i]);
3316 //_____________________________________________________
3317 // void AliFragmentationFunctionCorrections::RatioRecGen()
3319 // // create ratio reconstructed over generated FF
3320 // // use current highest corrLevel
3322 // Printf("%s:%d -- build ratio rec.gen, corrLevel %d",(char*)__FILE__,__LINE__,fNCorrectionLevels-1);
3324 // for(Int_t i=0; i<fNJetPtSlices; i++){
3326 // TH1F* histPtRec = fCorrFF[fNCorrectionLevels-1]->GetTrackPt(i); // levels -1: latest corr level
3327 // TH1F* histZRec = fCorrFF[fNCorrectionLevels-1]->GetZ(i); // levels -1: latest corr level
3328 // TH1F* histXiRec = fCorrFF[fNCorrectionLevels-1]->GetXi(i); // levels -1: latest corr level
3330 // TH1F* histPtGen = fh1FFTrackPtGenPrim[i];
3331 // TH1F* histZGen = fh1FFZGenPrim[i];
3332 // TH1F* histXiGen = fh1FFXiGenPrim[i];
3334 // TString histNamePt = histPtRec->GetName();
3335 // TString histNameZ = histZRec->GetName();
3336 // TString histNameXi = histXiRec->GetName();
3338 // histNamePt.ReplaceAll("fh1FF","fh1FFRatioRecGen");
3339 // histNameZ.ReplaceAll("fh1FF","fh1FFRatioRecGen");
3340 // histNameXi.ReplaceAll("fh1FF","fh1FFRatioRecGen");
3343 // TH1F* hRatioRecGenPt = (TH1F*) histPtRec->Clone(histNamePt);
3344 // hRatioRecGenPt->Reset();
3345 // hRatioRecGenPt->Divide(histPtRec,histPtGen,1,1,"B");
3347 // TH1F* hRatioRecGenZ = (TH1F*) histZRec->Clone(histNameZ);
3348 // hRatioRecGenZ->Reset();
3349 // hRatioRecGenZ->Divide(histZRec,histZGen,1,1,"B");
3351 // TH1F* hRatioRecGenXi = (TH1F*) histXiRec->Clone(histNameXi);
3352 // hRatioRecGenXi->Reset();
3353 // hRatioRecGenXi->Divide(histXiRec,histXiGen,1,1,"B");
3355 // new(fh1FFRatioRecGenPt[i]) TH1F(*hRatioRecGenPt);
3356 // new(fh1FFRatioRecGenZ[i]) TH1F(*hRatioRecGenZ);
3357 // new(fh1FFRatioRecGenXi[i]) TH1F(*hRatioRecGenXi);
3361 // //___________________________________________________________
3362 // void AliFragmentationFunctionCorrections::RatioRecPrimaries()
3364 // // create ratio reconstructed tracks over reconstructed primaries
3365 // // use raw FF (corrLevel 0)
3367 // Printf("%s:%d -- build ratio rec tracks /rec primaries",(char*)__FILE__,__LINE__);
3369 // for(Int_t i=0; i<fNJetPtSlices; i++){
3371 // const Int_t corrLevel = 0;
3373 // TH1F* histPtRec = fCorrFF[corrLevel]->GetTrackPt(i); // levels -1: latest corr level
3374 // TH1F* histZRec = fCorrFF[corrLevel]->GetZ(i); // levels -1: latest corr level
3375 // TH1F* histXiRec = fCorrFF[corrLevel]->GetXi(i); // levels -1: latest corr level
3377 // TH1F* histPtRecPrim = fh1FFTrackPtRecPrim[i];
3378 // TH1F* histZRecPrim = fh1FFZRecPrim[i];
3379 // TH1F* histXiRecPrim = fh1FFXiRecPrim[i];
3381 // TString histNamePt = histPtRec->GetName();
3382 // TString histNameZ = histZRec->GetName();
3383 // TString histNameXi = histXiRec->GetName();
3385 // histNamePt.ReplaceAll("fh1FF","fh1FFRatioRecPrim");
3386 // histNameZ.ReplaceAll("fh1FF","fh1FFRatioRecPrim");
3387 // histNameXi.ReplaceAll("fh1FF","fh1FFRatioRecPrim");
3390 // TH1F* hRatioRecPrimPt = (TH1F*) histPtRec->Clone(histNamePt);
3391 // hRatioRecPrimPt->Reset();
3392 // hRatioRecPrimPt->Divide(histPtRec,histPtRecPrim,1,1,"B");
3394 // TH1F* hRatioRecPrimZ = (TH1F*) histZRec->Clone(histNameZ);
3395 // hRatioRecPrimZ->Reset();
3396 // hRatioRecPrimZ->Divide(histZRec,histZRecPrim,1,1,"B");
3398 // TH1F* hRatioRecPrimXi = (TH1F*) histXiRec->Clone(histNameXi);
3399 // hRatioRecPrimXi->Reset();
3400 // hRatioRecPrimXi->Divide(histXiRec,histXiRecPrim,1,1,"B");
3403 // new(fh1FFRatioRecPrimPt[i]) TH1F(*hRatioRecPrimPt);
3404 // new(fh1FFRatioRecPrimZ[i]) TH1F(*hRatioRecPrimZ);
3405 // new(fh1FFRatioRecPrimXi[i]) TH1F(*hRatioRecPrimXi);
3409 // __________________________________________________________________________________
3410 void AliFragmentationFunctionCorrections::ProjectJetResponseMatrices(TString strOutfile)
3413 // project response matrices on both axes:
3414 // FF for rec primaries, in terms of generated and reconstructed momentum
3415 // write FF and ratios to outFile
3417 Printf("%s:%d -- project response matrices, write to %s",(char*)__FILE__,__LINE__,strOutfile.Data());
3419 TH1F* hFFPtRec[fNJetPtSlices];
3420 TH1F* hFFZRec[fNJetPtSlices];
3421 TH1F* hFFXiRec[fNJetPtSlices];
3423 TH1F* hFFPtGen[fNJetPtSlices];
3424 TH1F* hFFZGen[fNJetPtSlices];
3425 TH1F* hFFXiGen[fNJetPtSlices];
3427 TH1F* hRatioPt[fNJetPtSlices];
3428 TH1F* hRatioZ[fNJetPtSlices];
3429 TH1F* hRatioXi[fNJetPtSlices];
3432 Int_t axisGenPt = 1;
3433 Int_t axisRecPt = 0;
3435 for(Int_t i=0; i<fNJetPtSlices; i++){
3437 Int_t jetPtLoLim = static_cast<Int_t> (fJetPtSlices->At(i));
3438 Int_t jetPtUpLim = static_cast<Int_t> (fJetPtSlices->At(i+1));
3440 TString strNameRecPt(Form("h1FFTrackPtRecPrim_recPt_%02d_%02d",jetPtLoLim,jetPtUpLim));
3441 TString strNameRecZ(Form("h1FFZRecPrim_recPt_%02d_%02d",jetPtLoLim,jetPtUpLim));
3442 TString strNameRecXi(Form("h1FFXiRecPrim_recPt_%02d_%02d",jetPtLoLim,jetPtUpLim));
3444 TString strNameGenPt(Form("h1FFTrackPtRecPrim_genPt_%02d_%02d",jetPtLoLim,jetPtUpLim));
3445 TString strNameGenZ(Form("h1FFZRecPrim_genPt_%02d_%02d",jetPtLoLim,jetPtUpLim));
3446 TString strNameGenXi(Form("h1FFXiRecPrim_genPt_%02d_%02d",jetPtLoLim,jetPtUpLim));
3448 TString strNameRatioPt(Form("h1RatioTrackPtRecPrim_%02d_%02d",jetPtLoLim,jetPtUpLim));
3449 TString strNameRatioZ(Form("h1RatioZRecPrim_%02d_%02d",jetPtLoLim,jetPtUpLim));
3450 TString strNameRatioXi(Form("h1RatioXiRecPrim_%02d_%02d",jetPtLoLim,jetPtUpLim));
3453 hFFPtRec[i] = (TH1F*) fhnResponsePt[i]->Projection(axisRecPt);// note convention: yDim,xDim
3454 hFFZRec[i] = (TH1F*) fhnResponseZ[i]->Projection(axisRecPt);// note convention: yDim,xDim
3455 hFFXiRec[i] = (TH1F*) fhnResponseXi[i]->Projection(axisRecPt);// note convention: yDim,xDim
3457 hFFPtRec[i]->SetNameTitle(strNameRecPt,"");
3458 hFFZRec[i]->SetNameTitle(strNameRecZ,"");
3459 hFFXiRec[i]->SetNameTitle(strNameRecXi,"");
3462 hFFPtGen[i] = (TH1F*) fhnResponsePt[i]->Projection(axisGenPt);// note convention: yDim,xDim
3463 hFFZGen[i] = (TH1F*) fhnResponseZ[i]->Projection(axisGenPt);// note convention: yDim,xDim
3464 hFFXiGen[i] = (TH1F*) fhnResponseXi[i]->Projection(axisGenPt);// note convention: yDim,xDim
3466 hFFPtGen[i]->SetNameTitle(strNameGenPt,"");
3467 hFFZGen[i]->SetNameTitle(strNameGenZ,"");
3468 hFFXiGen[i]->SetNameTitle(strNameGenXi,"");
3471 if(fNHistoBinsPt[i]) hFFPtRec[i] = (TH1F*) hFFPtRec[i]->Rebin(fNHistoBinsPt[i],"",fHistoBinsPt[i]->GetArray());
3472 if(fNHistoBinsZ[i]) hFFZRec[i] = (TH1F*) hFFZRec[i]->Rebin(fNHistoBinsZ[i],"",fHistoBinsZ[i]->GetArray());
3473 if(fNHistoBinsXi[i]) hFFXiRec[i] = (TH1F*) hFFXiRec[i]->Rebin(fNHistoBinsXi[i],"",fHistoBinsXi[i]->GetArray());
3475 if(fNHistoBinsPt[i]) hFFPtGen[i] = (TH1F*) hFFPtGen[i]->Rebin(fNHistoBinsPt[i],"",fHistoBinsPt[i]->GetArray());
3476 if(fNHistoBinsZ[i]) hFFZGen[i] = (TH1F*) hFFZGen[i]->Rebin(fNHistoBinsZ[i],"",fHistoBinsZ[i]->GetArray());
3477 if(fNHistoBinsXi[i]) hFFXiGen[i] = (TH1F*) hFFXiGen[i]->Rebin(fNHistoBinsXi[i],"",fHistoBinsXi[i]->GetArray());
3479 NormalizeTH1(hFFPtGen[i],fNJets->At(i));
3480 NormalizeTH1(hFFZGen[i],fNJets->At(i));
3481 NormalizeTH1(hFFXiGen[i],fNJets->At(i));
3483 NormalizeTH1(hFFPtRec[i],fNJets->At(i));
3484 NormalizeTH1(hFFZRec[i],fNJets->At(i));
3485 NormalizeTH1(hFFXiRec[i],fNJets->At(i));
3488 hRatioPt[i] = (TH1F*) hFFPtRec[i]->Clone(strNameRatioPt);
3489 hRatioPt[i]->Reset();
3490 hRatioPt[i]->Divide(hFFPtRec[i],hFFPtGen[i],1,1,"B");
3492 hRatioZ[i] = (TH1F*) hFFZRec[i]->Clone(strNameRatioZ);
3493 hRatioZ[i]->Reset();
3494 hRatioZ[i]->Divide(hFFZRec[i],hFFZGen[i],1,1,"B");
3496 hRatioXi[i] = (TH1F*) hFFXiRec[i]->Clone(strNameRatioXi);
3497 hRatioXi[i]->Reset();
3498 hRatioXi[i]->Divide(hFFXiRec[i],hFFXiGen[i],1,1,"B");
3505 TFile out(strOutfile,"RECREATE");
3508 Printf("%s:%d -- error opening response matrix output file %s", (char*)__FILE__,__LINE__,strOutfile.Data());
3512 for(Int_t i=0; i<fNJetPtSlices; i++){
3514 hFFPtRec[i]->Write();
3515 hFFZRec[i]->Write();
3516 hFFXiRec[i]->Write();
3518 hFFPtGen[i]->Write();
3519 hFFZGen[i]->Write();
3520 hFFXiGen[i]->Write();
3522 hRatioPt[i]->Write();
3523 hRatioZ[i]->Write();
3524 hRatioXi[i]->Write();
3530 // ____________________________________________________________________________________________________________________________
3531 void AliFragmentationFunctionCorrections::ProjectSingleResponseMatrix(TString strOutfile, Bool_t updateOutfile, TString strOutDir )
3533 // project response matrix on both axes:
3534 // pt spec for rec primaries, in terms of generated and reconstructed momentum
3535 // write spec and ratios to outFile
3537 Printf("%s:%d -- project single pt response matrix, write to %s",(char*)__FILE__,__LINE__,strOutfile.Data());
3543 Int_t axisGenPt = 1;
3544 Int_t axisRecPt = 0;
3546 TString strNameRecPt = "h1SpecTrackPtRecPrim_recPt";
3547 TString strNameGenPt = "h1SpecTrackPtRecPrim_genPt";
3548 TString strNameRatioPt = "h1RatioTrackPtRecPrim";
3550 hSpecPtRec = (TH1F*) fhnResponseSinglePt->Projection(axisRecPt);// note convention: yDim,xDim
3551 hSpecPtRec->SetNameTitle(strNameRecPt,"");
3553 hSpecPtGen = (TH1F*) fhnResponseSinglePt->Projection(axisGenPt);// note convention: yDim,xDim
3554 hSpecPtGen->SetNameTitle(strNameGenPt,"");
3556 hRatioPt = (TH1F*) hSpecPtRec->Clone(strNameRatioPt);
3558 hRatioPt->Divide(hSpecPtRec,hSpecPtGen,1,1,"B");
3560 TString outfileOption = "RECREATE";
3561 if(updateOutfile) outfileOption = "UPDATE";
3563 TFile out(strOutfile,outfileOption);
3566 Printf("%s:%d -- error opening reponse matrix projections output file %s", (char*)__FILE__,__LINE__,strOutfile.Data());
3571 if(strOutDir && strOutDir.Length()){
3574 if((dir = ((TDirectory*) gDirectory->Get(strOutDir)))) dir->cd();
3576 dir = out.mkdir(strOutDir);
3581 hSpecPtRec->Write();
3582 hSpecPtGen->Write();
3589 //__________________________________________________________________________________________________________________________________________________________________
3590 void AliFragmentationFunctionCorrections::RebinHisto(const Int_t jetPtSlice, const Int_t nBinsLimits, Double_t* binsLimits, Double_t* binsWidth, const Int_t type)
3592 // rebin histo, rescale bins according to new width
3593 // only correct for input histos with equal bin size
3595 // args: jetPtSlice, type, use current corr level
3597 // function takes array of limits and widths (e.g. 1 GeV bins up to 10 GeV, 2 GeV width up to 20 GeV, ...)
3598 // array size of binsLimits: nBinsLimits
3599 // array size of binsWidth: nBinsLimits-1
3600 // binsLimits have to be in increasing order
3601 // if binning undefined for any slice, original binning will be kept
3604 Printf("%s:%d -- jetPtSlices not defined", (char*)__FILE__,__LINE__);
3608 if(jetPtSlice>=fNJetPtSlices){
3609 Printf("%s:%d -- jetPtSlice %d exceeds max",(char*)__FILE__,__LINE__,jetPtSlice);
3614 Double_t binLimitMin = binsLimits[0];
3615 Double_t binLimitMax = binsLimits[nBinsLimits-1];
3617 Double_t binLimit = binLimitMin; // start value
3619 Int_t sizeUpperLim = 1000; //static_cast<Int_t>(binLimitMax/binsWidth[0])+1; - only if first bin has smallest width, but not case for dN/dxi ...
3620 TArrayD binsArray(sizeUpperLim);
3622 binsArray.SetAt(binLimitMin,nBins++);
3624 while(binLimit<binLimitMax && nBins<sizeUpperLim){
3626 Int_t currentSlice = -1;
3627 for(Int_t i=0; i<nBinsLimits; i++){
3628 if(binLimit >= 0.999*binsLimits[i]) currentSlice = i; // 0.999 numerical saftey factor
3631 Double_t currentBinWidth = binsWidth[currentSlice];
3632 binLimit += currentBinWidth;
3634 binsArray.SetAt(binLimit,nBins++);
3639 if(type == kFlagPt) hist = fCorrFF[fNCorrectionLevels-1]->GetTrackPt(jetPtSlice);
3640 else if(type == kFlagZ) hist = fCorrFF[fNCorrectionLevels-1]->GetZ(jetPtSlice);
3641 else if(type == kFlagXi) hist = fCorrFF[fNCorrectionLevels-1]->GetXi(jetPtSlice);
3642 else if(type == kFlagSinglePt) hist = fCorrSinglePt[fNCorrectionLevelsSinglePt-1]->GetTrackPt(0);
3644 Printf("%s%d unknown type",(char*)__FILE__,__LINE__);
3648 Double_t binWidthNoRebin = hist->GetBinWidth(1);
3650 Double_t* bins = binsArray.GetArray();
3652 hist = (TH1F*) hist->Rebin(nBins-1,"",bins);
3654 for(Int_t bin=0; bin <= hist->GetNbinsX(); bin++){
3656 Double_t binWidthRebin = hist->GetBinWidth(bin);
3657 Double_t scaleF = binWidthNoRebin / binWidthRebin;
3659 Double_t binCont = hist->GetBinContent(bin);
3660 Double_t binErr = hist->GetBinError(bin);
3665 hist->SetBinContent(bin,binCont);
3666 hist->SetBinError(bin,binErr);
3671 TH1F* temp = new TH1F(*hist);
3673 if(type == kFlagPt) fCorrFF[fNCorrectionLevels-1]->ReplaceCorrHistos(jetPtSlice,temp,0,0);
3674 if(type == kFlagZ) fCorrFF[fNCorrectionLevels-1]->ReplaceCorrHistos(jetPtSlice,0,temp,0);
3675 if(type == kFlagXi) fCorrFF[fNCorrectionLevels-1]->ReplaceCorrHistos(jetPtSlice,0,0,temp);
3676 if(type == kFlagSinglePt) fCorrSinglePt[fNCorrectionLevelsSinglePt-1]->ReplaceCorrHistos(0,temp,0,0);
3681 //__________________________________________________________________________________________________________________________________________________________________
3682 void AliFragmentationFunctionCorrections::WriteJetSpecResponse(TString strInfile, TString strdir, TString strlist/*, TString strOutfile*/)
3685 if(fDebug>0) Printf("%s:%d -- read jet spectrum response matrix from file %s ",(char*)__FILE__,__LINE__,strInfile.Data());
3687 if(strdir && strdir.Length()) gDirectory->cd(strdir);
3691 if(strlist && strlist.Length()){
3693 if(!(list = (TList*) gDirectory->Get(strlist))){
3694 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
3699 THnSparse* hn6ResponseJetPt = (THnSparse*) list->FindObject("fhnCorrelation");
3701 Int_t axis6RecJetPt = 0;
3702 Int_t axis6GenJetPt = 3;
3704 hn6ResponseJetPt->GetAxis(axis6RecJetPt)->SetTitle("rec jet p_{T} (GeV/c)");
3705 hn6ResponseJetPt->GetAxis(axis6GenJetPt)->SetTitle("gen jet p_{T} (GeV/c)");
3707 Int_t nBinsRecPt = hn6ResponseJetPt->GetAxis(axis6RecJetPt)->GetNbins();
3708 Double_t loLimRecPt = hn6ResponseJetPt->GetAxis(axis6RecJetPt)->GetBinLowEdge(1);
3709 Double_t upLimRecPt = hn6ResponseJetPt->GetAxis(axis6RecJetPt)->GetBinUpEdge(nBinsRecPt);
3711 Int_t nBinsGenPt = hn6ResponseJetPt->GetAxis(axis6GenJetPt)->GetNbins();
3712 Double_t loLimGenPt = hn6ResponseJetPt->GetAxis(axis6GenJetPt)->GetBinLowEdge(1);
3713 Double_t upLimGenPt = hn6ResponseJetPt->GetAxis(axis6GenJetPt)->GetBinUpEdge(nBinsGenPt);
3715 Int_t nBinsTrackPt = 200;
3716 Int_t loLimTrackPt = 0;
3717 Int_t upLimTrackPt = 200;
3720 Int_t nBinsResponse[4] = {nBinsRecPt,nBinsTrackPt,nBinsGenPt,nBinsTrackPt};
3721 Double_t binMinResponse[4] = {loLimRecPt,loLimTrackPt,loLimGenPt,loLimTrackPt};
3722 Double_t binMaxResponse[4] = {upLimRecPt,upLimTrackPt,upLimGenPt,upLimTrackPt};
3724 const char* labelsResponseSinglePt[4] = {"rec jet p_{T} (GeV/c)", "rec track p_{T} (GeV/c)", "gen jet p_{T} (GeV/c)", "gen track p_{T} (GeV/c)"};
3726 THnSparseD* hn4ResponseTrackPtJetPt = new THnSparseD("hn4ResponseTrackPtJetPt","",4,nBinsResponse,binMinResponse,binMaxResponse);
3728 for(Int_t i=0; i<4; i++){
3729 hn4ResponseTrackPtJetPt->GetAxis(i)->SetTitle(labelsResponseSinglePt[i]);
3738 //_____________________________________________________________________________________________________________________________________
3739 void AliFragmentationFunctionCorrections::ReadSingleTrackEfficiency(TString strfile, TString strdir, TString strlist, TString strname)
3742 ReadSingleTrackCorrection(strfile,strdir,strlist,strname,kFlagEfficiency);
3746 //_____________________________________________________________________________________________________________________________________
3747 void AliFragmentationFunctionCorrections::ReadSingleTrackResponse(TString strfile, TString strdir, TString strlist, TString strname)
3750 ReadSingleTrackCorrection(strfile,strdir,strlist,strname,kFlagResponse);
3754 //_____________________________________________________________________________________________________________________________________
3755 void AliFragmentationFunctionCorrections::ReadSingleTrackSecCorr(TString strfile, TString strdir, TString strlist, TString strname)
3758 ReadSingleTrackCorrection(strfile,strdir,strlist,strname,kFlagSecondaries);
3762 //______________________________________________________________________________________________________________________________________________________
3763 void AliFragmentationFunctionCorrections::ReadSingleTrackCorrection(TString strfile, TString strdir, TString strlist, TString strname, const Int_t type)
3765 // read single track correction (pt) from file
3766 // type: efficiency / response / secondaries correction
3768 if(!((type == kFlagEfficiency) || (type == kFlagResponse) || (type == kFlagSecondaries))){
3769 Printf("%s:%d -- no such correction ",(char*)__FILE__,__LINE__);
3773 TFile f(strfile,"READ");
3776 Printf("%s:%d -- error opening file %s", (char*)__FILE__,__LINE__,strfile.Data());
3780 if(fDebug>0 && type==kFlagEfficiency) Printf("%s:%d -- read single track corr from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
3781 if(fDebug>0 && type==kFlagResponse) Printf("%s:%d -- read single track response from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
3782 if(fDebug>0 && type==kFlagSecondaries) Printf("%s:%d -- read single track secondaries corr from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
3784 if(strdir && strdir.Length()) gDirectory->cd(strdir);
3788 if(strlist && strlist.Length()){
3790 if(!(list = (TList*) gDirectory->Get(strlist))){
3791 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
3796 TH1F* h1CorrHist = 0; // common TObject pointer not possible, need SetDirectory() later
3797 THnSparse* hnCorrHist = 0;
3799 if(type == kFlagEfficiency || type == kFlagSecondaries){
3801 if(list) h1CorrHist = (TH1F*) list->FindObject(strname);
3802 else h1CorrHist = (TH1F*) gDirectory->Get(strname);
3805 Printf("%s:%d -- error retrieving histo %s", (char*)__FILE__,__LINE__,strname.Data());
3810 else if(type == kFlagResponse){
3812 if(list) hnCorrHist = (THnSparse*) list->FindObject(strname);
3813 else hnCorrHist = (THnSparse*) gDirectory->Get(strname);
3816 Printf("%s:%d -- error retrieving histo %s", (char*)__FILE__,__LINE__,strname.Data());
3822 if(h1CorrHist) h1CorrHist->SetDirectory(0);
3823 //if(hnCorrHist) hnCorrHist->SetDirectory(0);
3827 if(type == kFlagEfficiency) fh1EffSinglePt = h1CorrHist;
3828 else if(type == kFlagResponse) fhnResponseSinglePt = hnCorrHist;
3829 else if(type == kFlagSecondaries) fh1SecCorrSinglePt = h1CorrHist;
3833 //________________________________________________________________________________________________________________
3834 void AliFragmentationFunctionCorrections::ReadRawPtSpec(TString strInfile, TString strID)
3836 // read track pt spec from task ouput - standard dir/list
3838 TString strdir = "PWG4_FragmentationFunction_" + strID;
3839 TString strlist = "fracfunc_" + strID;
3841 ReadRawPtSpec(strInfile,strdir,strlist);
3844 //_______________________________________________________________________________________________________
3845 void AliFragmentationFunctionCorrections::ReadRawPtSpec(TString strfile, TString strdir, TString strlist)
3847 // get raw pt spectra from file
3851 fNCorrectionLevelsSinglePt = 0;
3852 fCorrSinglePt = new AliFragFuncCorrHistos*[fgMaxNCorrectionLevels];
3853 AddCorrectionLevelSinglePt(); // first 'correction' level = raw spectrum
3855 // get raw pt spec from input file, normalize
3857 TFile f(strfile,"READ");
3860 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
3864 if(fDebug>0) Printf("%s:%d -- read raw spectra from file %s ",(char*)__FILE__,__LINE__,strfile.Data());
3866 gDirectory->cd(strdir);
3870 if(!(list = (TList*) gDirectory->Get(strlist))){
3871 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
3875 TString hnameTrackPt("fh1TrackQAPtRecCuts");
3876 TString hnameEvtSel("fh1EvtSelection");
3878 TH1F* fh1TrackPt = (TH1F*) list->FindObject(hnameTrackPt);
3879 TH1F* fh1EvtSel = (TH1F*) list->FindObject(hnameEvtSel);
3881 if(!fh1TrackPt){ Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameTrackPt.Data()); return; }
3882 if(!fh1EvtSel) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameEvtSel.Data()); return; }
3885 //Float_t nEvents = fh1EvtSel->GetBinContent(fh1EvtSel->FindBin(0));
3887 // evts after physics selection
3888 Float_t nEvents = fh1EvtSel->GetEntries()
3889 - fh1EvtSel->GetBinContent(fh1EvtSel->FindBin(1)) // evts rejected by trigger selection ( = PhysicsSelection
3890 - fh1EvtSel->GetBinContent(fh1EvtSel->FindBin(2)); // evts with wrong centrality class
3893 fh1TrackPt->SetDirectory(0);
3898 NormalizeTH1(fh1TrackPt,nEvents);
3900 // raw FF = corr level 0
3901 fCorrSinglePt[0]->AddCorrHistos(0,fh1TrackPt);
3905 //_______________________________________________________________________________________________________
3906 void AliFragmentationFunctionCorrections::ReadRawPtSpecQATask(TString strfile, TString strdir, TString strlist)
3908 // get raw pt spectra from file
3909 // for output from Martas QA task
3913 fNCorrectionLevelsSinglePt = 0;
3914 fCorrSinglePt = new AliFragFuncCorrHistos*[fgMaxNCorrectionLevels];
3915 AddCorrectionLevelSinglePt(); // first 'correction' level = raw spectrum
3917 // get raw pt spec from input file, normalize
3919 TFile f(strfile,"READ");
3922 Printf("%s:%d -- error opening raw data file %s", (char*)__FILE__,__LINE__,strfile.Data());
3926 if(fDebug>0) Printf("%s:%d -- read raw pt spec from QA task output file %s ",(char*)__FILE__,__LINE__,strfile.Data());
3928 gDirectory->cd(strdir);
3932 if(!(list = (TList*) gDirectory->Get(strlist))){
3933 Printf("%s:%d -- error retrieving list %s from directory %s", (char*)__FILE__,__LINE__,strlist.Data(),strdir.Data());
3937 TString hnameTrackPt("fPtSel");
3938 TString hnameEvtSel("fNEventAll");
3940 TH1F* fh1TrackPt = (TH1F*) list->FindObject(hnameTrackPt);
3941 TH1F* fh1EvtSel = (TH1F*) list->FindObject(hnameEvtSel);
3943 if(!fh1TrackPt){ Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameTrackPt.Data()); return; }
3944 if(!fh1EvtSel) { Printf("%s:%d -- histo %s not found",(char*)__FILE__,__LINE__,hnameEvtSel.Data()); return; }
3947 // evts after physics selection
3948 Float_t nEvents = fh1EvtSel->GetEntries();
3950 fh1TrackPt->SetDirectory(0);
3955 NormalizeTH1(fh1TrackPt,nEvents);
3957 // raw FF = corr level 0
3958 fCorrSinglePt[0]->AddCorrHistos(0,fh1TrackPt);
3961 // ________________________________________________________
3962 void AliFragmentationFunctionCorrections::EffCorrSinglePt()
3964 // apply efficiency correction to inclusive track pt spec
3966 AddCorrectionLevelSinglePt("eff");
3968 TH1F* histPt = fCorrSinglePt[fNCorrectionLevelsSinglePt-2]->GetTrackPt(0);
3970 if(histPt->GetNbinsX() != fh1EffSinglePt->GetNbinsX()) Printf("%s:%d: inconsistency pt spec and eff corr bins - rebin effCorr ...", (char*)__FILE__,__LINE__);
3972 TString histNamePt = histPt->GetName();
3973 TH1F* hTrackPtEffCorr = (TH1F*) histPt->Clone(histNamePt);
3974 hTrackPtEffCorr->Divide(histPt,fh1EffSinglePt,1,1,"");
3976 fCorrSinglePt[fNCorrectionLevelsSinglePt-1]->AddCorrHistos(0,hTrackPtEffCorr);
3979 //___________________________________________________________________________________________________________________________
3980 void AliFragmentationFunctionCorrections::UnfoldSinglePt(const Int_t nIter, const Bool_t useCorrelatedErrors)
3982 // unfolde inclusive dN/dpt spectra
3984 AddCorrectionLevelSinglePt("unfold");
3986 TH1F* hist = fCorrSinglePt[fNCorrectionLevelsSinglePt-2]->GetTrackPt(0); // level -2: before unfolding, level -1: unfolded
3987 THnSparse* hnResponse = fhnResponseSinglePt;
3989 TString histNameTHn = hist->GetName();
3990 if(histNameTHn.Contains("TH1")) histNameTHn.ReplaceAll("TH1","THn");
3991 if(histNameTHn.Contains("fPt")) histNameTHn.ReplaceAll("fPt","fhnPt");
3994 TString histNameBackFolded = hist->GetName();
3995 histNameBackFolded.Append("_backfold");
3997 TString histNameRatioFolded = hist->GetName();
3998 if(histNameRatioFolded.Contains("fh1")) histNameRatioFolded.ReplaceAll("fh1","hRatio");
3999 if(histNameRatioFolded.Contains("fPt")) histNameRatioFolded.ReplaceAll("fPt","hRatioPt");
4000 histNameRatioFolded.Append("_unfold");
4002 TString histNameRatioBackFolded = hist->GetName();
4003 if(histNameRatioBackFolded.Contains("fh1")) histNameRatioBackFolded.ReplaceAll("fh1","hRatio");
4004 if(histNameRatioBackFolded.Contains("fPt")) histNameRatioBackFolded.ReplaceAll("fPt","hRatioPt");
4005 histNameRatioBackFolded.Append("_backfold");
4007 THnSparse* hnHist = TH1toSparse(hist,histNameTHn,hist->GetTitle());
4008 THnSparse* hnFlatEfficiency = TH1toSparse(hist,"fhnEfficiency","eff",kTRUE); // could optionally also use real eff
4010 THnSparse* hnUnfolded
4011 = Unfold(hnHist,hnResponse,hnFlatEfficiency,nIter,useCorrelatedErrors);
4013 TH1F* hUnfolded = (TH1F*) hnUnfolded->Projection(0);
4014 hUnfolded->SetNameTitle(hist->GetName(),hist->GetTitle());
4016 fCorrSinglePt[fNCorrectionLevelsSinglePt-1]->AddCorrHistos(0,hUnfolded);
4018 // backfolding: apply response matrix to unfolded spectrum
4019 TH1F* hBackFolded = ApplyResponse(hUnfolded,hnResponse);
4020 hBackFolded->SetNameTitle(histNameBackFolded,hist->GetTitle());
4022 fh1SingleTrackPtBackFolded = hBackFolded;
4025 // ratio unfolded to original histo
4026 TH1F* hRatioUnfolded = (TH1F*) hUnfolded->Clone(histNameRatioFolded);
4027 hRatioUnfolded->Reset();
4028 hRatioUnfolded->Divide(hUnfolded,hist,1,1,"B");
4030 fh1RatioSingleTrackPtFolded = hRatioUnfolded;
4033 // ratio backfolded to original histo
4034 TH1F* hRatioBackFolded = (TH1F*) hBackFolded->Clone(histNameRatioBackFolded);
4035 hRatioBackFolded->Reset();
4036 hRatioBackFolded->Divide(hBackFolded,hist,1,1,"B");
4038 fh1RatioSingleTrackPtBackFolded = hRatioBackFolded;
4041 delete hnFlatEfficiency;
4045 // ________________________________________________________
4046 void AliFragmentationFunctionCorrections::SecCorrSinglePt()
4048 // apply efficiency correction to inclusive track pt spec
4050 AddCorrectionLevelSinglePt("secCorr");
4052 TH1F* histPt = fCorrSinglePt[fNCorrectionLevelsSinglePt-2]->GetTrackPt(0);
4054 if(histPt->GetNbinsX() != fh1SecCorrSinglePt->GetNbinsX())
4055 Printf("%s:%d: inconsistency pt spec and secondaries corr bins - rebin effCorr ...", (char*)__FILE__,__LINE__);
4057 TString histNamePt = histPt->GetName();
4058 TH1F* hTrackPtSecCorr = (TH1F*) histPt->Clone(histNamePt);
4060 hTrackPtSecCorr->Multiply(histPt,fh1SecCorrSinglePt,1,1,"");
4062 fCorrSinglePt[fNCorrectionLevelsSinglePt-1]->AddCorrHistos(0,hTrackPtSecCorr);