2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 // Class for spectrum correction
18 // Subtraction of hadronic background, Unfolding of the data and
19 // Renormalization done here
20 // The following containers have to be set:
21 // - Correction framework container for real data
22 // - Correction framework container for MC (Efficiency Map)
23 // - Correction framework container for background coming from data
24 // - Correction framework container for background coming from MC
27 // Raphaelle Bailhache <R.Bailhache@gsi.de>
28 // Markus Fasel <M.Fasel@gsi.de>
33 #include <TObjArray.h>
40 #include <TGraphErrors.h>
47 #include "AliCFContainer.h"
48 #include "AliCFDataGrid.h"
49 #include "AliCFEffGrid.h"
50 #include "AliCFGridSparse.h"
51 #include "AliCFUnfolding.h"
54 #include "AliHFEBeautySpectrum.h"
55 #include "AliHFEBeautySpectrumQA.h"
56 #include "AliHFEcuts.h"
57 #include "AliHFEcontainer.h"
58 #include "AliHFEtools.h"
60 ClassImp(AliHFEBeautySpectrum)
62 //____________________________________________________________
63 AliHFEBeautySpectrum::AliHFEBeautySpectrum(const char *name):
64 AliHFECorrectSpectrumBase(name),
66 fTemporaryObjects(NULL),
68 fEfficiencyTOFPIDD(NULL),
69 fEfficiencyesdTOFPIDD(NULL),
70 fEfficiencyIPCharmD(NULL),
71 fEfficiencyIPBeautyD(NULL),
72 fEfficiencyIPBeautyesdD(NULL),
73 fEfficiencyIPConversionD(NULL),
74 fEfficiencyIPNonhfeD(NULL),
77 fInclusiveSpectrum(kFALSE),
79 fUnSetCorrelatedErrors(kTRUE),
80 fIPanaHadronBgSubtract(kFALSE),
81 fIPanaCharmBgSubtract(kFALSE),
82 fIPanaNonHFEBgSubtract(kFALSE),
83 fIPParameterizedEff(kFALSE),
85 fBeauty2ndMethod(kFALSE),
86 fIPEffCombinedSamples(kTRUE),
89 fNCentralityBinAtTheEnd(0),
90 fFillMoreCorrelationMatrix(kFALSE),
91 fHadronEffbyIPcut(NULL),
92 fEfficiencyCharmSigD(NULL),
93 fEfficiencyBeautySigD(NULL),
94 fEfficiencyBeautySigesdD(NULL),
99 fConversionEffbgc(NULL),
101 fBSpectrum2ndMethod(NULL),
102 fkBeauty2ndMethodfilename(""),
106 fWriteToFile(kFALSE),
110 // Default constructor
113 fQA = new AliHFEBeautySpectrumQA("AliHFEBeautySpectrumQA");
115 for(Int_t k = 0; k < 20; k++){
116 fLowBoundaryCentralityBinAtTheEnd[k] = 0;
117 fHighBoundaryCentralityBinAtTheEnd[k] = 0;
120 fEfficiencyTOFPIDD = 0;
121 fEfficiencyesdTOFPIDD = 0;
122 fEfficiencyIPCharmD = 0;
123 fEfficiencyIPBeautyD = 0;
124 fEfficiencyIPBeautyesdD = 0;
125 fEfficiencyIPConversionD = 0;
126 fEfficiencyIPNonhfeD = 0;
132 fEfficiencyCharmSigD = 0;
133 fEfficiencyBeautySigD = 0;
134 fEfficiencyBeautySigesdD = 0;
137 memset(fConvSourceContainer, 0, sizeof(AliCFContainer*) * kElecBgSources * kBgLevels);
138 memset(fNonHFESourceContainer, 0, sizeof(AliCFContainer*) * kElecBgSources * kBgLevels);
140 //____________________________________________________________
141 AliHFEBeautySpectrum::AliHFEBeautySpectrum(const AliHFEBeautySpectrum &ref):
142 AliHFECorrectSpectrumBase(ref),
144 fTemporaryObjects(ref.fTemporaryObjects),
145 fBackground(ref.fBackground),
146 fEfficiencyTOFPIDD(ref.fEfficiencyTOFPIDD),
147 fEfficiencyesdTOFPIDD(ref.fEfficiencyesdTOFPIDD),
148 fEfficiencyIPCharmD(ref.fEfficiencyIPCharmD),
149 fEfficiencyIPBeautyD(ref.fEfficiencyIPBeautyD),
150 fEfficiencyIPBeautyesdD(ref.fEfficiencyIPBeautyesdD),
151 fEfficiencyIPConversionD(ref.fEfficiencyIPConversionD),
152 fEfficiencyIPNonhfeD(ref.fEfficiencyIPNonhfeD),
153 fNonHFEbg(ref.fNonHFEbg),
154 fWeightCharm(ref.fWeightCharm),
155 fInclusiveSpectrum(ref.fInclusiveSpectrum),
156 fDumpToFile(ref.fDumpToFile),
157 fUnSetCorrelatedErrors(ref.fUnSetCorrelatedErrors),
158 fIPanaHadronBgSubtract(ref.fIPanaHadronBgSubtract),
159 fIPanaCharmBgSubtract(ref.fIPanaCharmBgSubtract),
160 fIPanaNonHFEBgSubtract(ref.fIPanaNonHFEBgSubtract),
161 fIPParameterizedEff(ref.fIPParameterizedEff),
162 fNonHFEsyst(ref.fNonHFEsyst),
163 fBeauty2ndMethod(ref.fBeauty2ndMethod),
164 fIPEffCombinedSamples(ref.fIPEffCombinedSamples),
165 fNMCEvents(ref.fNMCEvents),
166 fNMCbgEvents(ref.fNMCbgEvents),
167 fNCentralityBinAtTheEnd(ref.fNCentralityBinAtTheEnd),
168 fFillMoreCorrelationMatrix(ref.fFillMoreCorrelationMatrix),
169 fHadronEffbyIPcut(ref.fHadronEffbyIPcut),
170 fEfficiencyCharmSigD(ref.fEfficiencyCharmSigD),
171 fEfficiencyBeautySigD(ref.fEfficiencyBeautySigD),
172 fEfficiencyBeautySigesdD(ref.fEfficiencyBeautySigesdD),
173 fConversionEff(ref.fConversionEff),
174 fNonHFEEff(ref.fNonHFEEff),
175 fCharmEff(ref.fCharmEff),
176 fBeautyEff(ref.fBeautyEff),
177 fConversionEffbgc(ref.fConversionEffbgc),
178 fNonHFEEffbgc(ref.fNonHFEEffbgc),
179 fBSpectrum2ndMethod(ref.fBSpectrum2ndMethod),
180 fkBeauty2ndMethodfilename(ref.fkBeauty2ndMethodfilename),
181 fBeamType(ref.fBeamType),
182 fEtaSyst(ref.fEtaSyst),
183 fDebugLevel(ref.fDebugLevel),
184 fWriteToFile(ref.fWriteToFile),
185 fUnfoldBG(ref.fUnfoldBG)
193 //____________________________________________________________
194 AliHFEBeautySpectrum &AliHFEBeautySpectrum::operator=(const AliHFEBeautySpectrum &ref){
196 // Assignment operator
202 //____________________________________________________________
203 void AliHFEBeautySpectrum::Copy(TObject &o) const {
205 // Copy into object o
207 AliHFEBeautySpectrum &target = dynamic_cast<AliHFEBeautySpectrum &>(o);
211 target.fTemporaryObjects = fTemporaryObjects;
212 target.fBackground = fBackground;
213 target.fWeightCharm = fWeightCharm;
214 target.fDumpToFile = fDumpToFile;
215 target.fUnSetCorrelatedErrors = fUnSetCorrelatedErrors;
216 target.fIPanaHadronBgSubtract = fIPanaHadronBgSubtract;
217 target.fIPanaCharmBgSubtract = fIPanaCharmBgSubtract;
218 target.fIPanaNonHFEBgSubtract = fIPanaNonHFEBgSubtract;
219 target.fIPParameterizedEff = fIPParameterizedEff;
220 target.fNonHFEsyst = fNonHFEsyst;
221 target.fBeauty2ndMethod = fBeauty2ndMethod;
222 target.fIPEffCombinedSamples = fIPEffCombinedSamples;
223 target.fNMCEvents = fNMCEvents;
224 target.fNCentralityBinAtTheEnd = fNCentralityBinAtTheEnd;
225 target.fFillMoreCorrelationMatrix = fFillMoreCorrelationMatrix;
226 target.fHadronEffbyIPcut = fHadronEffbyIPcut;
227 target.fConversionEffbgc = fConversionEffbgc;
228 target.fNonHFEEffbgc = fNonHFEEffbgc;
229 target.fBSpectrum2ndMethod = fBSpectrum2ndMethod;
230 target.fkBeauty2ndMethodfilename = fkBeauty2ndMethodfilename;
231 target.fBeamType = fBeamType;
232 target.fEtaSyst = fEtaSyst;
233 target.fDebugLevel = fDebugLevel;
234 target.fWriteToFile = fWriteToFile;
235 target.fUnfoldBG = fUnfoldBG;
237 //____________________________________________________________
238 AliHFEBeautySpectrum::~AliHFEBeautySpectrum(){
242 if(fTemporaryObjects){
243 fTemporaryObjects->Clear();
244 delete fTemporaryObjects;
248 //____________________________________________________________
249 Bool_t AliHFEBeautySpectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *bghfecontainer, const AliHFEcontainer */*v0hfecontainer*/,AliCFContainer */*photoniccontainerD*/){
251 // Init what we need for the correction:
253 // Raw spectrum, hadron contamination
254 // MC efficiency maps, correlation matrix
256 // This for a given dimension.
257 // If no inclusive spectrum, then take only efficiency map for beauty electron
258 // and the appropriate correlation matrix
262 if(fBeauty2ndMethod) CallInputFileForBeauty2ndMethod();
268 switch(fNbDimensions){
271 case 2: for(Int_t i = 0; i < 2; i++) dims[i] = i;
273 case 3: for(Int_t i = 0; i < 3; i++) dims[i] = i;
276 AliError("Container with this number of dimensions not foreseen (yet)");
281 // Data container: raw spectrum + hadron contamination
283 AliCFContainer *datacontainer = datahfecontainer->MakeMergedCFContainer("sumreco","sumreco","recTrackContReco:recTrackContDEReco");
284 AliCFContainer *contaminationcontainer = datahfecontainer->GetCFContainer("hadronicBackground");
285 if((!datacontainer) || (!contaminationcontainer)) return kFALSE;
286 AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
287 AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
288 if((!datacontainerD) || (!contaminationcontainerD)) return kFALSE;
289 SetContainer(datacontainerD,AliHFECorrectSpectrumBase::kDataContainer);
290 SetContainer(contaminationcontainerD,AliHFECorrectSpectrumBase::kBackgroundData);
292 // QA : see with MJ if it is necessary for Beauty
293 Int_t dimqa = datacontainer->GetNVar();
295 for(Int_t i = 0; i < dimqa; i++) dimsqa[i] = i;
296 AliCFContainer *datacontainerDQA = GetSlicedContainer(datacontainer, dimqa, dimsqa, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
297 fQA->AddResultAt(datacontainerDQA,AliHFEBeautySpectrumQA::kDataProjection);
300 // MC container: ESD/MC efficiency maps + MC/MC efficiency maps
302 AliCFContainer *mccontaineresd = 0x0;
303 AliCFContainer *mccontaineresdbg = 0x0;
304 AliCFContainer *mccontainermc = 0x0;
305 AliCFContainer *mccontainermcbg = 0x0;
306 AliCFContainer *nonHFEweightedContainer = 0x0;
307 AliCFContainer *convweightedContainer = 0x0;
308 AliCFContainer *nonHFEweightedContainerSig = 0x0;//mjmj
309 AliCFContainer *convweightedContainerSig = 0x0;//mjmj
310 AliCFContainer *nonHFEtempContainer = 0x0;//temporary container to be sliced for the fnonHFESourceContainers
311 AliCFContainer *convtempContainer = 0x0;//temporary container to be sliced for the fConvSourceContainers
313 mccontaineresd = mchfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco:recTrackContDEReco");
314 mccontaineresdbg = bghfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco:recTrackContDEReco");
315 mccontainermc = mchfecontainer->MakeMergedCFContainer("summc","summc","MCTrackCont:recTrackContMC:recTrackContDEMC");
316 mccontainermcbg = bghfecontainer->MakeMergedCFContainer("summcbg","summcbg","MCTrackCont:recTrackContMC:recTrackContDEMC");
319 const Char_t *sourceName[kElecBgSources]={"Pion","Eta","Omega","Phi","EtaPrime","Rho","K0sSec","OtherSecPi0","Else"};
320 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
321 for(Int_t iSource = 0; iSource < kElecBgSources; iSource++){
322 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
323 if(!(nonHFEtempContainer = bghfecontainer->GetCFContainer(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]))))continue;
324 convtempContainer = bghfecontainer->GetCFContainer(Form("conversionElecs%s%s",sourceName[iSource],levelName[iLevel]));
325 if(!(fConvSourceContainer[iSource][iLevel] = GetSlicedContainer(convtempContainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh)))continue;
326 if(!(fNonHFESourceContainer[iSource][iLevel] = GetSlicedContainer(nonHFEtempContainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh)))continue;
327 // if((!fConvSourceContainer[iSource][iLevel][icentr])||(!fNonHFESourceContainer[iSource][iLevel])) return kFALSE;
328 if(fBeamType == 1)break;//no systematics yet for PbPb non-HFE backgrounds
333 nonHFEweightedContainer = bghfecontainer->GetCFContainer("mesonElecs");
334 convweightedContainer = bghfecontainer->GetCFContainer("conversionElecs");
335 if((!convweightedContainer)||(!nonHFEweightedContainer)) return kFALSE;
336 nonHFEweightedContainerSig = mchfecontainer->GetCFContainer("mesonElecs");//mjmj
337 convweightedContainerSig = mchfecontainer->GetCFContainer("conversionElecs");//mjmj
338 if((!convweightedContainerSig)||(!nonHFEweightedContainerSig)) return kFALSE;
341 if((!mccontaineresd) || (!mccontainermc)) return kFALSE;
343 Int_t source = 1; //beauty
344 AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, dims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
345 AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
346 if((!mccontaineresdD) || (!mccontainermcD)) return kFALSE;
347 SetContainer(mccontainermcD,AliHFECorrectSpectrumBase::kMCContainerMC);
348 SetContainer(mccontaineresdD,AliHFECorrectSpectrumBase::kMCContainerESD);
350 // set charm, nonHFE container to estimate BG
352 mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh); //mjmjmj
353 //mccontainermcD = GetSlicedContainer(mccontainermcbg, fNbDimensions, dims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
354 SetContainer(mccontainermcD,AliHFECorrectSpectrumBase::kMCContainerCharmMC);
357 AliCFContainer *nonHFEweightedContainerD = GetSlicedContainer(nonHFEweightedContainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
358 SetContainer(nonHFEweightedContainerD,AliHFECorrectSpectrumBase::kMCWeightedContainerNonHFEESD);
359 AliCFContainer *convweightedContainerD = GetSlicedContainer(convweightedContainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
360 SetContainer(convweightedContainerD,AliHFECorrectSpectrumBase::kMCWeightedContainerConversionESD);
363 AliCFContainer *nonHFEweightedContainerSigD = GetSlicedContainer(nonHFEweightedContainerSig, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
364 SetContainer(nonHFEweightedContainerSigD,AliHFECorrectSpectrumBase::kMCWeightedContainerNonHFEESDSig);
365 if(!GetContainer(AliHFECorrectSpectrumBase::kMCWeightedContainerNonHFEESDSig)){printf("merged non-HFE container not found!\n");return kFALSE;};
366 AliCFContainer *convweightedContainerSigD = GetSlicedContainer(convweightedContainerSig, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
367 SetContainer(convweightedContainerSigD,AliHFECorrectSpectrumBase::kMCWeightedContainerConversionESDSig);
368 if(!GetContainer(AliHFECorrectSpectrumBase::kMCWeightedContainerConversionESDSig)){printf(" merged conversion container not found!\n");return kFALSE;};
371 SetParameterizedEff(mccontainermc, mccontainermcbg, mccontaineresd, mccontaineresdbg, dims);
374 // MC container: correlation matrix
376 THnSparseF *mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID"); // we confirmed that we get same result by using it instead of correlationstepafterDE
377 //mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterDE");
378 if(!mccorrelation) return kFALSE;
379 Int_t testCentralityLow = fTestCentralityLow;
380 Int_t testCentralityHigh = fTestCentralityHigh;
381 if(fFillMoreCorrelationMatrix) {
382 testCentralityLow = fTestCentralityLow-1;
383 testCentralityHigh = fTestCentralityHigh+1;
385 THnSparseF *mccorrelationD = GetSlicedCorrelation(mccorrelation, fNbDimensions, dims, fChargeChoosen, testCentralityLow,testCentralityHigh);
386 if(!mccorrelationD) {
387 printf("No correlation\n");
390 SetCorrelation(mccorrelationD);
393 fQA->AddResultAt(mccorrelation,AliHFEBeautySpectrumQA::kCMProjection);
395 fQA->DrawProjections();
402 //____________________________________________________________
403 void AliHFEBeautySpectrum::CallInputFileForBeauty2ndMethod(){
405 // get spectrum for beauty 2nd method
408 TFile *inputfile2ndmethod=TFile::Open(fkBeauty2ndMethodfilename);
409 fBSpectrum2ndMethod = new TH1D(*static_cast<TH1D*>(inputfile2ndmethod->Get("BSpectrum")));
412 //____________________________________________________________
413 Bool_t AliHFEBeautySpectrum::Correct(Bool_t subtractcontamination, Bool_t /*subtractphotonic*/){
415 // Correct the spectrum for efficiency and unfolding for beauty analysis
416 // with both method and compare
419 gStyle->SetPalette(1);
420 gStyle->SetOptStat(1111);
421 gStyle->SetPadBorderMode(0);
422 gStyle->SetCanvasColor(10);
423 gStyle->SetPadLeftMargin(0.13);
424 gStyle->SetPadRightMargin(0.13);
426 printf("Steps are: stepdata %d, stepMC %d, steptrue %d\n",fStepData,fStepMC,fStepTrue);
428 ///////////////////////////
429 // Check initialization
430 ///////////////////////////
432 if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
433 AliInfo("You have to init before");
437 if((fStepTrue <= 0) && (fStepMC <= 0) && (fStepData <= 0)) {
438 AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
442 SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
444 AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
445 //////////////////////////////////
446 // Subtract hadron background
447 /////////////////////////////////
448 AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
449 AliCFDataGrid *unnormalizedRawSpectrum = 0x0;
450 TGraphErrors *gNormalizedRawSpectrum = 0x0;
451 if(subtractcontamination) {
452 if(!fBeauty2ndMethod) dataspectrumaftersubstraction = SubtractBackground(kTRUE);
453 else dataspectrumaftersubstraction = GetRawBspectra2ndMethod();
454 unnormalizedRawSpectrum = (AliCFDataGrid*)dataspectrumaftersubstraction->Clone();
455 dataGridAfterFirstSteps = dataspectrumaftersubstraction;
456 gNormalizedRawSpectrum = Normalize(unnormalizedRawSpectrum);
459 /////////////////////////////////////////////////////////////////////////////////////////
460 // Correct for IP efficiency for beauty electrons after subtracting all the backgrounds
461 /////////////////////////////////////////////////////////////////////////////////////////
463 AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
465 if(fEfficiencyFunction){
466 dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
467 dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;
473 THnSparse *correctedspectrum = Unfold(dataGridAfterFirstSteps);
474 if(!correctedspectrum){
475 AliError("No corrected spectrum\n");
479 /////////////////////
483 AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);
491 TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
492 TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
493 fQA->AddResultAt(correctedspectrumD,AliHFEBeautySpectrumQA::kFinalResultUnfolded);
494 fQA->AddResultAt(alltogetherspectrumD,AliHFEBeautySpectrumQA::kFinalResultDirectEfficiency);
495 fQA->AddResultAt(correctedspectrum,AliHFEBeautySpectrumQA::kFinalResultUnfSparse);
496 fQA->AddResultAt(alltogetherCorrection,AliHFEBeautySpectrumQA::kFinalResultDirectEffSparse);
502 CalculateNonHFEsyst();
506 // Dump to file if needed
510 out = new TFile("finalSpectrum.root","update");
512 // to do centrality dependent
513 correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
514 correctedspectrum->Write();
515 alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
516 alltogetherCorrection->Write();
518 if(unnormalizedRawSpectrum) {
519 unnormalizedRawSpectrum->SetName("beautyAfterIP");
520 unnormalizedRawSpectrum->Write();
523 if(gNormalizedRawSpectrum){
524 gNormalizedRawSpectrum->SetName("normalizedBeautyAfterIP");
525 gNormalizedRawSpectrum->Write();
528 fEfficiencyCharmSigD->SetTitle("IPEfficiencyForCharmSig");
529 fEfficiencyCharmSigD->SetName("IPEfficiencyForCharmSig");
530 fEfficiencyCharmSigD->Write();
531 fEfficiencyBeautySigD->SetTitle("IPEfficiencyForBeautySig");
532 fEfficiencyBeautySigD->SetName("IPEfficiencyForBeautySig");
533 fEfficiencyBeautySigD->Write();
534 fCharmEff->SetTitle("IPEfficiencyForCharm");
535 fCharmEff->SetName("IPEfficiencyForCharm");
537 fBeautyEff->SetTitle("IPEfficiencyForBeauty");
538 fBeautyEff->SetName("IPEfficiencyForBeauty");
540 fConversionEff->SetTitle("IPEfficiencyForConversion");
541 fConversionEff->SetName("IPEfficiencyForConversion");
542 fConversionEff->Write();
543 fNonHFEEff->SetTitle("IPEfficiencyForNonHFE");
544 fNonHFEEff->SetName("IPEfficiencyForNonHFE");
553 //____________________________________________________________
554 AliCFDataGrid* AliHFEBeautySpectrum::SubtractBackground(Bool_t setBackground){
556 // Apply background subtraction for IP analysis
560 printf("subtracting background\n");
562 AliCFContainer *dataContainer = GetContainer(kDataContainer);
564 AliError("Data Container not available");
567 printf("Step data: %d\n",fStepData);
568 AliCFDataGrid *spectrumSubtracted = new AliCFDataGrid("spectrumSubtracted", "Data Grid for spectrum after Background subtraction", *dataContainer,fStepData);
570 AliCFDataGrid *dataspectrumbeforesubstraction = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(GetContainer(kDataContainer),fStepData))->Clone();
571 dataspectrumbeforesubstraction->SetName("dataspectrumbeforesubstraction");
573 // Background Estimate
574 AliCFContainer *backgroundContainer = GetContainer(kBackgroundData);
575 if(!backgroundContainer){
576 AliError("MC background container not found");
580 Int_t stepbackground = 1;
581 AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ContaminationGrid","ContaminationGrid",*backgroundContainer,stepbackground);
583 const Int_t bgPlots = 8;
587 TH1D *nonHFE[bgPlots];
588 TH1D *subtracted = 0x0;
590 THnSparseF* sparseIncElec = (THnSparseF *) dataspectrumbeforesubstraction->GetGrid();
591 incElec = (TH1D *) sparseIncElec->Projection(0);
592 CorrectFromTheWidth(incElec);
595 Int_t* bins=new Int_t[2];
597 if(fIPanaHadronBgSubtract){
599 printf("Hadron background for IP analysis subtracted!\n");
600 htemp = (TH1D *) fHadronEffbyIPcut->Projection(0);
601 bins[0]=htemp->GetNbinsX();
603 AliCFDataGrid *hbgContainer = new AliCFDataGrid("hbgContainer","hadron bg after IP cut",nbins,bins);
604 hbgContainer->SetGrid(fHadronEffbyIPcut);
605 backgroundGrid->Multiply(hbgContainer,1);
606 // subtract hadron contamination
607 spectrumSubtracted->Add(backgroundGrid,-1.0);
608 // draw raw hadron bg spectra
609 THnSparseF* sparseHbg = (THnSparseF *) hbgContainer->GetGrid();
610 hadron = (TH1D *) sparseHbg->Projection(0);
611 CorrectFromTheWidth(hadron);
614 if(fIPanaCharmBgSubtract){
616 printf("Charm background for IP analysis subtracted!\n");
617 AliCFDataGrid *charmbgContainer = (AliCFDataGrid *) GetCharmBackground();
618 spectrumSubtracted->Add(charmbgContainer,-1.0);
619 THnSparseF *sparseCharmElec = (THnSparseF *) charmbgContainer->GetGrid();
620 charm = (TH1D *) sparseCharmElec->Projection(0);
621 CorrectFromTheWidth(charm);
624 const Char_t *sourceName[bgPlots]={"Conversion","Dalitz","K0s secondary pion Dalitz","K0s secondary pion conversions","Other secondary pion Dalitz","Other secondary pion Dalitz conversions","Other Dalitz", "Other conversions"};
625 const Int_t style[2] = {21,22};
626 const Int_t color[3] = {7,12,8};
627 if(fIPanaNonHFEBgSubtract){
629 for(Int_t iSource = 0; iSource < kElecBgSources; iSource++){
630 if((iSource>0)&&(iSource<6))continue;//standard sources are summed up in case of iSource == 0; not treated separately in plots
631 for(Int_t decay = 0; decay < 2; decay++){
632 AliCFDataGrid *nonHFEbgContainer = (AliCFDataGrid *) GetNonHFEBackground(decay,iSource);//conversions/Dalitz decays from different sources
634 spectrumSubtracted->Add(nonHFEbgContainer,-1.0);
635 THnSparseF* sparseNonHFEelecs = (THnSparseF *) nonHFEbgContainer->GetGrid();
636 nonHFE[iPlot] = (TH1D *) sparseNonHFEelecs->Projection(0);
637 CorrectFromTheWidth(nonHFE[iPlot]);
640 if(!(fNonHFEsyst && (fBeamType == 1)))break;
644 TLegend *lRaw = new TLegend(0.55,0.55,0.85,0.85);
645 TCanvas *cRaw = new TCanvas("cRaw","cRaw",1000,800);
649 incElec->GetXaxis()->SetRangeUser(0.4,8.);
651 incElec->SetMarkerColor(1);
652 incElec->SetMarkerStyle(20);
653 lRaw->AddEntry(incElec,"inclusive electron spectrum");
655 if(fIPanaCharmBgSubtract){
656 charm->Draw("samep");
657 charm->SetMarkerColor(3);
658 charm->SetMarkerStyle(20);
659 charm->GetXaxis()->SetRangeUser(0.4,8.);
660 lRaw->AddEntry(charm,"charm elecs");
663 if(fIPanaNonHFEBgSubtract){
665 for(Int_t iSource = 0; iSource < kElecBgSources; iSource++){
666 if((iSource>0)&&(iSource<6))continue;//standard sources are summed up in case of iSource == 0; not treated separately in plots
667 for(Int_t decay = 0; decay < 2; decay++){
668 nonHFE[iPlot]->Draw("samep");
670 nonHFE[iPlot]->SetMarkerStyle(20);
672 nonHFE[iPlot]->SetMarkerColor(4);
674 nonHFE[iPlot]->SetMarkerColor(6);
677 nonHFE[iPlot]->SetMarkerColor(color[iSource-6]);
678 nonHFE[iPlot]->SetMarkerStyle(style[decay]);
680 nonHFE[iPlot]->GetXaxis()->SetRangeUser(0.4,8.);
681 lRaw->AddEntry(nonHFE[iPlot],sourceName[iPlot]);
684 if(!(fNonHFEsyst && (fBeamType == 1)))break;//only draw standard sources
688 THnSparseF* sparseSubtracted = (THnSparseF *) spectrumSubtracted->GetGrid();
689 subtracted = (TH1D *) sparseSubtracted->Projection(0);
690 CorrectFromTheWidth(subtracted);
691 subtracted->Draw("samep");
692 subtracted->SetMarkerStyle(24);
693 lRaw->AddEntry(subtracted,"subtracted electron spectrum");
698 TH1D *measuredTH1background = (TH1D *) backgroundGrid->Project(0);
699 CorrectFromTheWidth(measuredTH1background);
702 if(fBackground) delete fBackground;
703 fBackground = backgroundGrid;
704 } else delete backgroundGrid;
706 fQA->AddResultAt(subtracted,AliHFEBeautySpectrumQA::kAfterSC);
707 fQA->AddResultAt(incElec,AliHFEBeautySpectrumQA::kBeforeSC);
708 fQA->AddResultAt(measuredTH1background, AliHFEBeautySpectrumQA::kMeasBG);
709 fQA->DrawSubtractContamination();
711 return spectrumSubtracted;
713 //____________________________________________________________________________________________
714 AliCFDataGrid* AliHFEBeautySpectrum::GetNonHFEBackground(Int_t decay, Int_t source){
716 // calculate non-HF electron background
717 // Arguments: decay = 0 for conversions, decay = 1 for meson decays to electrons
718 // source: gives mother either of the electron (for meson->electron) or of the gamma (conversions);
719 // source numbers as given by array in AliAnalysisTaskHFE:
720 // {"Pion","Eta","Omega","Phi","EtaPrime","Rho","K0sSec","OtherSecPi0","Else"};
723 Double_t evtnorm[1] = {1.};
724 if(fNMCbgEvents) evtnorm[0]= double(fNEvents)/double(fNMCbgEvents);
726 Int_t stepbackground = 1;//for non-standard background, step after IP cut is taken directly
727 if(source == 0) stepbackground = 3;//for standard sources, take step before PID -> correction of PID x IP efficiencies from enhanced samples
728 AliCFContainer *backgroundContainer = 0x0;
730 if(decay == 0){//conversions
731 backgroundContainer = (AliCFContainer*)fConvSourceContainer[source][0]->Clone();
732 if(source == 0)//standard conversion containers
733 for(Int_t iSource = 1; iSource < kElecBgSources-3; iSource++){//add all standard sources
734 backgroundContainer->Add(fConvSourceContainer[iSource][0]);
737 else if(decay == 1){//Dalitz decays, same procedure as above
738 backgroundContainer = (AliCFContainer*)fNonHFESourceContainer[source][0]->Clone();
740 for(Int_t iSource = 1; iSource < kElecBgSources-3; iSource++){
741 backgroundContainer->Add(fNonHFESourceContainer[iSource][0]);
745 else{//careful: these containers include the non-standard electron sources (K0s, etc.). If necessary, use SetRange in species axis to fix it?
747 // Background Estimate
749 backgroundContainer = GetContainer(kMCWeightedContainerConversionESD);
751 backgroundContainer = GetContainer(kMCWeightedContainerNonHFEESD);
754 if(!backgroundContainer){
755 AliError("MC background container not found");
758 AliCFDataGrid *backgroundGrid = new AliCFDataGrid("backgroundGrid","backgroundGrid",*backgroundContainer,stepbackground);
760 Double_t rangelow = 1.;
761 Double_t rangeup = 6.;
762 if(decay == 1) rangelow = 0.9;
765 const Char_t *dmode[2]={"Conversions","Dalitz decays"};
766 TF1 *fitHagedorn = new TF1("fitHagedorn", "[0]/TMath::Power(([1]+x/[2]), [3])", rangelow, rangeup);
768 TH1D *h1 = (TH1D*)backgroundGrid->Project(0);
769 TAxis *axis = h1->GetXaxis();
770 CorrectFromTheWidth(h1);
772 fitHagedorn->SetParameter(0, 0.15);
773 fitHagedorn->SetParameter(1, 0.09);
774 fitHagedorn->SetParameter(2, 8.4);
775 fitHagedorn->SetParameter(3, 6.3);
776 // TCanvas *ch1conversion = new TCanvas("ch1conversion","ch1conversion",500,400);
777 // ch1conversion->cd();
778 //fHagedorn->SetLineColor(2);
779 h1->Fit(fitHagedorn,"R");
781 if(!(fNonHFEbg = h1->GetFunction("fitHagedorn")))printf("electron background fit failed for %s\n",dmode[decay]);
784 Int_t *nBinpp=new Int_t[1];
785 Int_t *binspp=new Int_t[1];
786 binspp[0]=kSignalPtBins;// number of pt bins
788 Int_t looppt=binspp[0];
790 for(Long_t iBin=1; iBin<= looppt;iBin++){
791 Double_t iipt= h1->GetBinCenter(iBin);
792 Double_t iiwidth= axis->GetBinWidth(iBin);
794 Double_t fitFactor = backgroundGrid->GetElement(nBinpp);//if no fit available, just take bin-by-bin information
795 if(fNonHFEbg)fitFactor = fNonHFEbg->Eval(iipt)*iiwidth;
796 backgroundGrid->SetElementError(nBinpp, backgroundGrid->GetElementError(nBinpp)*evtnorm[0]);
797 backgroundGrid->SetElement(nBinpp,fitFactor*evtnorm[0]);
799 //end of workaround for statistical errors
801 AliCFDataGrid *weightedBGContainer = 0x0;
802 weightedBGContainer = new AliCFDataGrid("weightedBGContainer","weightedBGContainer",1,binspp);
804 weightedBGContainer->SetGrid(GetPIDxIPEff(2));
806 weightedBGContainer->SetGrid(GetPIDxIPEff(3));
807 if(stepbackground == 3){
808 backgroundGrid->Multiply(weightedBGContainer,1.0);
813 return backgroundGrid;
815 //____________________________________________________________
816 AliCFDataGrid* AliHFEBeautySpectrum::GetCharmBackground(){
818 // calculate charm background; when using centrality binning 2: centBin = 0 for 0-20%, centBin = 5 for 40-80%
824 if(fNMCEvents) evtnorm= double(fNEvents)/double(fNMCEvents); //mjmjmj
825 //if(fNMCbgEvents) evtnorm= double(fNEvents)/double(fNMCbgEvents);
826 printf("events for data: %d",fNEvents);
827 printf("events for MC: %d",fNMCEvents);
828 printf("normalization factor for charm: %f",evtnorm);
830 AliCFContainer *mcContainer = GetContainer(kMCContainerCharmMC);
832 AliError("MC Container not available");
837 AliError("No Correlation map available");
841 AliCFDataGrid *charmBackgroundGrid= 0x0;
842 charmBackgroundGrid = new AliCFDataGrid("charmBackgroundGrid","charmBackgroundGrid",*mcContainer, fStepMC-1); // use MC eff. up to right before PID
843 TH1D *charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(0);
844 Int_t* bins=new Int_t[2];
845 bins[0]=charmbgaftertofpid->GetNbinsX();
847 AliCFDataGrid *ipWeightedCharmContainer = new AliCFDataGrid("ipWeightedCharmContainer","ipWeightedCharmContainer",nDim,bins);
848 ipWeightedCharmContainer->SetGrid(GetPIDxIPEff(0)); // get charm efficiency
849 TH1D* parametrizedcharmpidipeff = (TH1D*)ipWeightedCharmContainer->Project(0);
851 charmBackgroundGrid->Multiply(ipWeightedCharmContainer,1.);
852 Int_t *nBinpp=new Int_t[1];
853 Int_t* binspp=new Int_t[1];
854 binspp[0]=charmbgaftertofpid->GetNbinsX(); // number of pt bins
856 Int_t looppt=binspp[0];
858 for(Long_t iBin=1; iBin<= looppt;iBin++){
860 charmBackgroundGrid->SetElementError(nBinpp, charmBackgroundGrid->GetElementError(nBinpp)*evtnorm);
861 charmBackgroundGrid->SetElement(nBinpp,charmBackgroundGrid->GetElement(nBinpp)*evtnorm);
864 TH1D* charmbgafteripcut = (TH1D*)charmBackgroundGrid->Project(0);
866 AliCFDataGrid *weightedCharmContainer = new AliCFDataGrid("weightedCharmContainer","weightedCharmContainer",nDim,bins);
867 weightedCharmContainer->SetGrid(GetCharmWeights(fTestCentralityLow)); // get charm weighting factors
868 TH1D* charmweightingfc = (TH1D*)weightedCharmContainer->Project(0);
869 charmBackgroundGrid->Multiply(weightedCharmContainer,1.);
870 TH1D* charmbgafterweight = (TH1D*)charmBackgroundGrid->Project(0);
872 // Efficiency (set efficiency to 1 for only folding)
873 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
874 efficiencyD->CalculateEfficiency(0,0);
877 if(fBeamType==0)nDim = 1;
878 AliCFUnfolding folding("unfolding","",nDim,fCorrelation,efficiencyD->GetGrid(),charmBackgroundGrid->GetGrid(),charmBackgroundGrid->GetGrid());
879 folding.SetMaxNumberOfIterations(1);
883 THnSparse* result1= folding.GetEstMeasured(); // folded spectra
884 THnSparse* result=(THnSparse*)result1->Clone();
885 charmBackgroundGrid->SetGrid(result);
886 TH1D* charmbgafterfolding = (TH1D*)charmBackgroundGrid->Project(0);
888 //Charm background evaluation plots
890 TCanvas *cCharmBgEval = new TCanvas("cCharmBgEval","cCharmBgEval",1000,600);
891 cCharmBgEval->Divide(3,1);
895 if(fBeamType==0)charmbgaftertofpid->Scale(evtnorm);
897 CorrectFromTheWidth(charmbgaftertofpid);
898 charmbgaftertofpid->SetMarkerStyle(25);
899 charmbgaftertofpid->Draw("p");
900 charmbgaftertofpid->GetYaxis()->SetTitle("yield normalized by # of data events");
901 charmbgaftertofpid->GetXaxis()->SetTitle("p_{T} (GeV/c)");
904 CorrectFromTheWidth(charmbgafteripcut);
905 charmbgafteripcut->SetMarkerStyle(24);
906 charmbgafteripcut->Draw("samep");
908 CorrectFromTheWidth(charmbgafterweight);
909 charmbgafterweight->SetMarkerStyle(24);
910 charmbgafterweight->SetMarkerColor(4);
911 charmbgafterweight->Draw("samep");
913 CorrectFromTheWidth(charmbgafterfolding);
914 charmbgafterfolding->SetMarkerStyle(24);
915 charmbgafterfolding->SetMarkerColor(2);
916 charmbgafterfolding->Draw("samep");
919 parametrizedcharmpidipeff->SetMarkerStyle(24);
920 parametrizedcharmpidipeff->Draw("p");
921 parametrizedcharmpidipeff->GetXaxis()->SetTitle("p_{T} (GeV/c)");
924 charmweightingfc->SetMarkerStyle(24);
925 charmweightingfc->Draw("p");
926 charmweightingfc->GetYaxis()->SetTitle("weighting factor for charm electron");
927 charmweightingfc->GetXaxis()->SetTitle("p_{T} (GeV/c)");
930 TLegend *legcharmbg = new TLegend(0.3,0.7,0.89,0.89);
931 legcharmbg->AddEntry(charmbgaftertofpid,"After TOF PID","p");
932 legcharmbg->AddEntry(charmbgafteripcut,"After IP cut","p");
933 legcharmbg->AddEntry(charmbgafterweight,"After Weighting","p");
934 legcharmbg->AddEntry(charmbgafterfolding,"After Folding","p");
935 legcharmbg->Draw("same");
938 TLegend *legcharmbg2 = new TLegend(0.3,0.7,0.89,0.89);
939 legcharmbg2->AddEntry(parametrizedcharmpidipeff,"PID + IP cut eff.","p");
940 legcharmbg2->Draw("same");
942 CorrectStatErr(charmBackgroundGrid);
943 if(fWriteToFile) cCharmBgEval->SaveAs("CharmBackground.eps");
949 if(fUnfoldBG) UnfoldBG(charmBackgroundGrid);
951 return charmBackgroundGrid;
953 //____________________________________________________________
954 AliCFDataGrid *AliHFEBeautySpectrum::CorrectParametrizedEfficiency(AliCFDataGrid* const bgsubpectrum){
956 // Apply TPC pid efficiency correction from parametrisation
959 // Data in the right format
960 AliCFDataGrid *dataGrid = 0x0;
962 dataGrid = bgsubpectrum;
966 AliCFContainer *dataContainer = GetContainer(kDataContainer);
968 AliError("Data Container not available");
971 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
973 AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
974 result->SetName("ParametrizedEfficiencyBefore");
975 THnSparse *h = result->GetGrid();
976 Int_t nbdimensions = h->GetNdimensions();
977 //printf("CorrectParametrizedEfficiency::We have dimensions %d\n",nbdimensions);
978 AliCFContainer *dataContainer = GetContainer(kDataContainer);
980 AliError("Data Container not available");
983 AliCFContainer *dataContainerbis = (AliCFContainer *) dataContainer->Clone();
984 dataContainerbis->Add(dataContainerbis,-1.0);
986 Int_t* coord = new Int_t[nbdimensions];
987 memset(coord, 0, sizeof(Int_t) * nbdimensions);
988 Double_t* points = new Double_t[nbdimensions];
990 ULong64_t nEntries = h->GetNbins();
991 for (ULong64_t i = 0; i < nEntries; ++i) {
992 Double_t value = h->GetBinContent(i, coord);
993 //Double_t valuecontainer = dataContainerbis->GetBinContent(coord,fStepData);
994 //printf("Value %f, and valuecontainer %f\n",value,valuecontainer);
996 // Get the bin co-ordinates given an coord
997 for (Int_t j = 0; j < nbdimensions; ++j)
998 points[j] = h->GetAxis(j)->GetBinCenter(coord[j]);
1000 if (!fEfficiencyFunction->IsInside(points))
1002 TF1::RejectPoint(kFALSE);
1004 // Evaulate function at points
1005 Double_t valueEfficiency = fEfficiencyFunction->EvalPar(points, NULL);
1006 //printf("Value efficiency is %f\n",valueEfficiency);
1008 if(valueEfficiency > 0.0) {
1009 h->SetBinContent(coord,value/valueEfficiency);
1010 dataContainerbis->SetBinContent(coord,fStepData,value/valueEfficiency);
1012 Double_t error = h->GetBinError(i);
1013 h->SetBinError(coord,error/valueEfficiency);
1014 dataContainerbis->SetBinError(coord,fStepData,error/valueEfficiency);
1020 AliCFDataGrid *resultt = new AliCFDataGrid("spectrumEfficiencyParametrized", "Data Grid for spectrum after Efficiency parametrized", *dataContainerbis,fStepData);
1023 TH1D *afterE = (TH1D *) resultt->Project(0);
1024 CorrectFromTheWidth(afterE);
1025 TH1D *beforeE = (TH1D *) dataGrid->Project(0);
1026 CorrectFromTheWidth(beforeE);
1027 fQA->AddResultAt(afterE,AliHFEBeautySpectrumQA::kAfterPE);
1028 fQA->AddResultAt(beforeE,AliHFEBeautySpectrumQA::kBeforePE);
1029 fQA->AddResultAt(fEfficiencyFunction,AliHFEBeautySpectrumQA::kPEfficiency);
1030 fQA->DrawCorrectWithEfficiency(AliHFEBeautySpectrumQA::kParametrized);
1034 //____________________________________________________________
1035 THnSparse *AliHFEBeautySpectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
1038 // Unfold and eventually correct for efficiency the bgsubspectrum
1041 AliCFContainer *mcContainer = GetContainer(kMCContainerMC);
1043 AliError("MC Container not available");
1048 AliError("No Correlation map available");
1053 AliCFDataGrid *dataGrid = 0x0;
1055 dataGrid = bgsubpectrum;
1059 AliCFContainer *dataContainer = GetContainer(kDataContainer);
1061 AliError("Data Container not available");
1065 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
1069 AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainer, fStepGuessedUnfolding);
1070 THnSparse* guessedTHnSparse = ((AliCFGridSparse*)guessedGrid->GetData())->GetGrid();
1073 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
1074 efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
1076 if(!fBeauty2ndMethod)
1078 // Consider parameterized IP cut efficiency
1079 Int_t* bins=new Int_t[1];
1080 bins[0]=kSignalPtBins;
1082 AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
1083 beffContainer->SetGrid(GetBeautyIPEff(kTRUE));
1084 efficiencyD->Multiply(beffContainer,1);
1090 AliCFUnfolding unfolding("unfolding","",fNbDimensions,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse,1.e-06,0,fNumberOfIterations);//check with MinJung if last arguments are correct (taken from inclusive analysis...
1091 if(fUnSetCorrelatedErrors) unfolding.UnsetCorrelatedErrors();
1092 unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
1093 if(fSetSmoothing) unfolding.UseSmoothing();
1097 THnSparse* result = unfolding.GetUnfolded();
1098 THnSparse* residual = unfolding.GetEstMeasured();
1101 TH1D *residualh = (TH1D *) residual->Projection(0);
1102 TH1D *beforeE = (TH1D *) dataGrid->Project(0);
1103 TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(0);
1104 TH1D *afterE = (TH1D *) result->Projection(0);
1106 CorrectFromTheWidth(residualh);
1107 CorrectFromTheWidth(beforeE);
1108 CorrectFromTheWidth(afterE);
1109 fQA->AddResultAt(residualh,AliHFEBeautySpectrumQA::kResidualU);
1110 fQA->AddResultAt(afterE,AliHFEBeautySpectrumQA::kAfterU);
1111 fQA->AddResultAt(beforeE,AliHFEBeautySpectrumQA::kBeforeU);
1112 fQA->AddResultAt(efficiencyDproj,AliHFEBeautySpectrumQA::kUEfficiency);
1113 fQA->DrawUnfolding();
1115 return (THnSparse *) result->Clone();
1118 //____________________________________________________________
1119 AliCFDataGrid *AliHFEBeautySpectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpectrum){
1122 // Apply unfolding and efficiency correction together to bgsubspectrum
1125 AliCFContainer *mcContainer = GetContainer(kMCContainerESD);
1127 AliError("MC Container not available");
1132 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
1133 efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
1136 if(!fBeauty2ndMethod)
1138 // Consider parameterized IP cut efficiency
1139 Int_t* bins=new Int_t[1];
1140 bins[0]=kSignalPtBins;
1142 AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
1143 beffContainer->SetGrid(GetBeautyIPEff(kFALSE));
1144 efficiencyD->Multiply(beffContainer,1);
1147 // Data in the right format
1148 AliCFDataGrid *dataGrid = 0x0;
1150 dataGrid = bgsubpectrum;
1154 AliCFContainer *dataContainer = GetContainer(kDataContainer);
1156 AliError("Data Container not available");
1160 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
1164 AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
1165 result->ApplyEffCorrection(*efficiencyD);
1168 TH1D *afterE = (TH1D *) result->Project(0);
1169 CorrectFromTheWidth(afterE);
1170 TH1D *beforeE = (TH1D *) dataGrid->Project(0);
1171 CorrectFromTheWidth(beforeE);
1172 TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(0);
1173 fQA->AddResultAt(afterE,AliHFEBeautySpectrumQA::kAfterMCE);
1174 fQA->AddResultAt(beforeE,AliHFEBeautySpectrumQA::kBeforeMCE);
1175 fQA->AddResultAt(efficiencyDproj,AliHFEBeautySpectrumQA::kMCEfficiency);
1176 fQA->DrawCorrectWithEfficiency(AliHFEBeautySpectrumQA::kMC);
1181 //____________________________________________________________
1182 void AliHFEBeautySpectrum::AddTemporaryObject(TObject *o){
1184 // Emulate garbage collection on class level
1186 if(!fTemporaryObjects) {
1187 fTemporaryObjects= new TList;
1188 fTemporaryObjects->SetOwner();
1190 fTemporaryObjects->Add(o);
1193 //____________________________________________________________
1194 void AliHFEBeautySpectrum::ClearObject(TObject *o){
1196 // Do a safe deletion
1198 if(fTemporaryObjects){
1199 if(fTemporaryObjects->FindObject(o)) fTemporaryObjects->Remove(o);
1206 //_________________________________________________________________________
1207 THnSparse* AliHFEBeautySpectrum::GetCharmWeights(Int_t centBin){
1210 // Measured D->e based weighting factors
1213 const Int_t nDimpp=1;
1214 Int_t nBinpp[nDimpp] = {kSignalPtBins};
1215 Double_t ptbinning1[kSignalPtBins+1] = {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5., 5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.};
1216 Int_t looppt=nBinpp[0];
1218 fWeightCharm = new THnSparseF("weightHisto", "weighting factor; pt[GeV/c]", nDimpp, nBinpp);
1219 fWeightCharm->SetBinEdges(0, ptbinning1);
1221 // //if(fBeamType == 0){// Weighting factor for pp
1222 //Double_t weightpp[kSignalPtBins]={0.859260, 0.872552, 0.847475, 0.823631, 0.839386, 0.874024, 0.916755, 0.942801, 0.965856, 0.933905, 0.933414, 0.931936, 0.847826, 0.810902, 0.796608, 0.727002, 0.659227, 0.583610, 0.549956, 0.512633, 0.472254, 0.412364, 0.353191, 0.319145, 0.305412, 0.290334, 0.269863, 0.254646, 0.230245, 0.200859, 0.275953, 0.276271, 0.227332, 0.197004, 0.474385};
1223 //TPC+TOF standard cut 4800
1224 Double_t weightpp[kSignalPtBins]={0.050326, 0.045826, 0.042043, 0.039641, 0.039872, 0.041796, 0.044320, 0.046273, 0.047376, 0.047657, 0.047973, 0.048307, 0.045325, 0.044067, 0.043367, 0.040417, 0.037048, 0.033695, 0.032192, 0.029270, 0.027270, 0.024451, 0.020846, 0.019032, 0.018210, 0.017554, 0.015604, 0.015194, 0.013542, 0.013447, 0.015160, 0.015507, 0.014989, 0.012533, 0.025603};
1228 // Weighting factor for PbPb (0-20%)
1229 Double_t weightPbPb1[kSignalPtBins]={0.641897, 0.640472, 0.615228, 0.650469, 0.737762, 0.847867, 1.009317, 1.158594, 1.307482, 1.476973, 1.551131, 1.677131, 1.785478, 1.888933, 2.017957, 2.074757, 1.926700, 1.869495, 1.546558, 1.222873, 1.160313, 0.903375, 0.799642, 0.706244, 0.705449, 0.599947, 0.719570, 0.499422, 0.703978, 0.477452, 0.325057, 0.093391, 0.096675, 0.000000, 0.000000};
1232 // Weighting factor for PbPb (40-80%)
1233 Double_t weightPbPb2[kSignalPtBins]={0.181953, 0.173248, 0.166799, 0.182558, 0.206581, 0.236955, 0.279390, 0.329129, 0.365260, 0.423059, 0.452057, 0.482726, 0.462627, 0.537770, 0.584663, 0.579452, 0.587194, 0.499498, 0.443299, 0.398596, 0.376695, 0.322331, 0.260890, 0.374834, 0.249114, 0.310330, 0.287326, 0.243174, 0.758945, 0.138867, 0.170576, 0.107797, 0.011390, 0.000000, 0.000000};
1236 Double_t weight[kSignalPtBins];
1237 for(Int_t ipt = 0; ipt < kSignalPtBins; ipt++){
1238 if(fBeamType == 0)weight[ipt] = weightpp[ipt];
1239 else if(centBin == 0)weight[ipt] = weightPbPb1[ipt];
1240 else weight[ipt] = weightPbPb2[ipt];
1245 Double_t contents[2];
1247 for(int i=0; i<looppt; i++){
1248 pt[0]=(ptbinning1[i]+ptbinning1[i+1])/2.;
1250 fWeightCharm->Fill(contents,weight[i]);
1254 Int_t nDimSparse = fWeightCharm->GetNdimensions();
1255 Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
1256 Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
1258 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
1259 binsvar[iVar] = fWeightCharm->GetAxis(iVar)->GetNbins();
1260 nBins *= binsvar[iVar];
1263 Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
1264 // loop that sets 0 error in each bin
1265 for (Long_t iBin=0; iBin<nBins; iBin++) {
1266 Long_t bintmp = iBin ;
1267 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
1268 binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
1269 bintmp /= binsvar[iVar] ;
1271 fWeightCharm->SetBinError(binfill,0.); // put 0 everywhere
1276 return fWeightCharm;
1278 //____________________________________________________________________________
1279 void AliHFEBeautySpectrum::SetParameterizedEff(AliCFContainer *container, AliCFContainer *containermb, AliCFContainer *containeresd, AliCFContainer *containeresdmb, Int_t *dimensions){
1281 // TOF PID efficiencies
1283 TF1 *fittofpid = new TF1("fittofpid","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.95,8.);
1284 TF1 *fipfit = new TF1("fipfit","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.95,6.);
1285 TF1 *fipfitnonhfe = new TF1("fipfitnonhfe","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,8.0);
1287 if(fBeamType == 1){//not in use yet - adapt as soon as possible!
1288 fittofpid = new TF1("fittofpid","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.95,8.);
1289 fipfit = new TF1("fipfit","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.95,8.);
1290 fipfitnonhfe = new TF1("fipfitnonhfe","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,8.);
1293 TCanvas * cefficiencyParamtof = new TCanvas("efficiencyParamtof","efficiencyParamtof",600,600);
1294 cefficiencyParamtof->cd();
1296 AliCFContainer *mccontainermcD = 0x0;
1297 AliCFContainer *mccontaineresdD = 0x0;
1298 TH1D* efficiencysigTOFPIDD;
1299 TH1D* efficiencyTOFPIDD;
1300 TH1D* efficiencysigesdTOFPIDD;
1301 TH1D* efficiencyesdTOFPIDD;
1302 Int_t source = -1; //get parameterized TOF PID efficiencies
1305 mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1306 AliCFEffGrid* efficiencymcsigParamTOFPID= new AliCFEffGrid("efficiencymcsigParamTOFPID","",*mccontainermcD);
1307 efficiencymcsigParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
1309 // mb sample for double check
1310 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1311 AliCFEffGrid* efficiencymcParamTOFPID= new AliCFEffGrid("efficiencymcParamTOFPID","",*mccontainermcD);
1312 efficiencymcParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
1314 // mb sample with reconstructed variables
1315 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1316 AliCFEffGrid* efficiencyesdParamTOFPID= new AliCFEffGrid("efficiencyesdParamTOFPID","",*mccontainermcD);
1317 efficiencyesdParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
1319 // mb sample with reconstructed variables
1320 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1321 AliCFEffGrid* efficiencysigesdParamTOFPID= new AliCFEffGrid("efficiencysigesdParamTOFPID","",*mccontainermcD);
1322 efficiencysigesdParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
1325 efficiencysigTOFPIDD = (TH1D *) efficiencymcsigParamTOFPID->Project(0);
1326 efficiencyTOFPIDD = (TH1D *) efficiencymcParamTOFPID->Project(0);
1327 efficiencysigesdTOFPIDD = (TH1D *) efficiencysigesdParamTOFPID->Project(0);
1328 efficiencyesdTOFPIDD = (TH1D *) efficiencyesdParamTOFPID->Project(0);
1329 efficiencysigTOFPIDD->SetName("efficiencysigTOFPIDD");
1330 efficiencyTOFPIDD->SetName("efficiencyTOFPIDD");
1331 efficiencysigesdTOFPIDD->SetName("efficiencysigesdTOFPIDD");
1332 efficiencyesdTOFPIDD->SetName("efficiencyesdTOFPIDD");
1334 //fit (mc enhenced sample)
1335 fittofpid->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
1336 efficiencysigTOFPIDD->Fit(fittofpid,"R");
1337 efficiencysigTOFPIDD->GetYaxis()->SetTitle("Efficiency");
1338 fEfficiencyTOFPIDD = efficiencysigTOFPIDD->GetFunction("fittofpid");
1340 //fit (esd enhenced sample)
1341 efficiencysigesdTOFPIDD->Fit(fittofpid,"R");
1342 efficiencysigesdTOFPIDD->GetYaxis()->SetTitle("Efficiency");
1343 fEfficiencyesdTOFPIDD = efficiencysigesdTOFPIDD->GetFunction("fittofpid");
1345 // draw (for PbPb, only 1st bin)
1347 efficiencysigTOFPIDD->SetTitle("");
1348 efficiencysigTOFPIDD->SetStats(0);
1349 efficiencysigTOFPIDD->SetMarkerStyle(25);
1350 efficiencysigTOFPIDD->SetMarkerColor(2);
1351 efficiencysigTOFPIDD->SetLineColor(2);
1352 efficiencysigTOFPIDD->Draw();
1355 efficiencyTOFPIDD->SetTitle("");
1356 efficiencyTOFPIDD->SetStats(0);
1357 efficiencyTOFPIDD->SetMarkerStyle(24);
1358 efficiencyTOFPIDD->SetMarkerColor(4);
1359 efficiencyTOFPIDD->SetLineColor(4);
1360 efficiencyTOFPIDD->Draw("same");
1363 efficiencysigesdTOFPIDD->SetTitle("");
1364 efficiencysigesdTOFPIDD->SetStats(0);
1365 efficiencysigesdTOFPIDD->SetMarkerStyle(25);
1366 efficiencysigesdTOFPIDD->SetMarkerColor(3);
1367 efficiencysigesdTOFPIDD->SetLineColor(3);
1368 efficiencysigesdTOFPIDD->Draw("same");
1371 efficiencyesdTOFPIDD->SetTitle("");
1372 efficiencyesdTOFPIDD->SetStats(0);
1373 efficiencyesdTOFPIDD->SetMarkerStyle(25);
1374 efficiencyesdTOFPIDD->SetMarkerColor(1);
1375 efficiencyesdTOFPIDD->SetLineColor(1);
1376 efficiencyesdTOFPIDD->Draw("same");
1379 if(fEfficiencyTOFPIDD){
1380 fEfficiencyTOFPIDD->SetLineColor(2);
1381 fEfficiencyTOFPIDD->Draw("same");
1384 if(fEfficiencyesdTOFPIDD){
1385 fEfficiencyesdTOFPIDD->SetLineColor(3);
1386 fEfficiencyesdTOFPIDD->Draw("same");
1389 TLegend *legtofeff = new TLegend(0.3,0.15,0.79,0.44);
1390 legtofeff->AddEntry(efficiencysigTOFPIDD,"TOF PID Step Efficiency","");
1391 legtofeff->AddEntry(efficiencysigTOFPIDD,"vs MC p_{t} for enhenced samples","p");
1392 legtofeff->AddEntry(efficiencyTOFPIDD,"vs MC p_{t} for mb samples","p");
1393 legtofeff->AddEntry(efficiencysigesdTOFPIDD,"vs esd p_{t} for enhenced samples","p");
1394 legtofeff->AddEntry(efficiencyesdTOFPIDD,"vs esd p_{t} for mb samples","p");
1395 legtofeff->Draw("same");
1398 TCanvas * cefficiencyParamIP = new TCanvas("efficiencyParamIP","efficiencyParamIP",500,500);
1399 cefficiencyParamIP->cd();
1400 gStyle->SetOptStat(0);
1402 // IP cut efficiencies
1403 AliCFContainer *charmCombined = 0x0;
1404 AliCFContainer *beautyCombined = 0x0;
1405 AliCFContainer *beautyCombinedesd = 0x0;
1407 source = 0; //charm enhenced
1408 mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1409 AliCFEffGrid* efficiencyCharmSig = new AliCFEffGrid("efficiencyCharmSig","",*mccontainermcD);
1410 efficiencyCharmSig->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
1412 charmCombined= (AliCFContainer*)mccontainermcD->Clone("charmCombined");
1414 source = 1; //beauty enhenced
1415 mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1416 AliCFEffGrid* efficiencyBeautySig = new AliCFEffGrid("efficiencyBeautySig","",*mccontainermcD);
1417 efficiencyBeautySig->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
1419 beautyCombined = (AliCFContainer*)mccontainermcD->Clone("beautyCombined");
1421 mccontaineresdD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1422 AliCFEffGrid* efficiencyBeautySigesd = new AliCFEffGrid("efficiencyBeautySigesd","",*mccontaineresdD);
1423 efficiencyBeautySigesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
1425 beautyCombinedesd = (AliCFContainer*)mccontaineresdD->Clone("beautyCombinedesd");
1427 source = 0; //charm mb
1428 mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1429 AliCFEffGrid* efficiencyCharm = new AliCFEffGrid("efficiencyCharm","",*mccontainermcD);
1430 efficiencyCharm->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
1432 charmCombined->Add(mccontainermcD);
1433 AliCFEffGrid* efficiencyCharmCombined = new AliCFEffGrid("efficiencyCharmCombined","",*charmCombined);
1434 efficiencyCharmCombined->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1);
1436 source = 1; //beauty mb
1437 mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1438 AliCFEffGrid* efficiencyBeauty = new AliCFEffGrid("efficiencyBeauty","",*mccontainermcD);
1439 efficiencyBeauty->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
1441 beautyCombined->Add(mccontainermcD);
1442 AliCFEffGrid* efficiencyBeautyCombined = new AliCFEffGrid("efficiencyBeautyCombined","",*beautyCombined);
1443 efficiencyBeautyCombined->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1);
1445 mccontaineresdD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1446 AliCFEffGrid* efficiencyBeautyesd = new AliCFEffGrid("efficiencyBeautyesd","",*mccontaineresdD);
1447 efficiencyBeautyesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
1449 beautyCombinedesd->Add(mccontaineresdD);
1450 AliCFEffGrid* efficiencyBeautyCombinedesd = new AliCFEffGrid("efficiencyBeautyCombinedesd","",*beautyCombinedesd);
1451 efficiencyBeautyCombinedesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1);
1453 source = 2; //conversion mb
1454 mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1455 AliCFEffGrid* efficiencyConv = new AliCFEffGrid("efficiencyConv","",*mccontainermcD);
1456 efficiencyConv->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
1458 source = 3; //non HFE except for the conversion mb
1459 mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
1460 AliCFEffGrid* efficiencyNonhfe= new AliCFEffGrid("efficiencyNonhfe","",*mccontainermcD);
1461 efficiencyNonhfe->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
1463 if(fIPEffCombinedSamples){printf("combined samples taken for beauty and charm\n");
1464 fEfficiencyCharmSigD = (TH1D*)efficiencyCharmCombined->Project(0); //signal enhenced + mb
1465 fEfficiencyBeautySigD = (TH1D*)efficiencyBeautyCombined->Project(0); //signal enhenced + mb
1466 fEfficiencyBeautySigesdD = (TH1D*)efficiencyBeautyCombinedesd->Project(0); //signal enhenced + mb
1468 else{printf("signal enhanced samples taken for beauty and charm\n");
1469 fEfficiencyCharmSigD = (TH1D*)efficiencyCharmSig->Project(0); //signal enhenced only
1470 fEfficiencyBeautySigD = (TH1D*)efficiencyBeautySig->Project(0); //signal enhenced only
1471 fEfficiencyBeautySigesdD = (TH1D*)efficiencyBeautySigesd->Project(0); //signal enhenced only
1473 fCharmEff = (TH1D*)efficiencyCharm->Project(0); //mb only
1474 fBeautyEff = (TH1D*)efficiencyBeauty->Project(0); //mb only
1475 fConversionEff = (TH1D*)efficiencyConv->Project(0); //mb only
1476 fNonHFEEff = (TH1D*)efficiencyNonhfe->Project(0); //mb only
1479 //AliCFEffGrid *nonHFEEffGrid = (AliCFEffGrid*) GetEfficiency(GetContainer(kMCWeightedContainerNonHFEESD),1,0);
1480 AliCFContainer *cfcontainer = GetContainer(AliHFECorrectSpectrumBase::kMCWeightedContainerNonHFEESDSig);
1481 if(!cfcontainer) return;
1482 AliCFEffGrid *nonHFEEffGrid = (AliCFEffGrid*) GetEfficiency(cfcontainer,1,0); //mjmj
1483 fNonHFEEffbgc = (TH1D *) nonHFEEffGrid->Project(0);
1485 //AliCFEffGrid *conversionEffGrid = (AliCFEffGrid*) GetEfficiency(GetContainer(kMCWeightedContainerConversionESD),1,0);
1486 AliCFContainer *cfcontainerr = GetContainer(AliHFECorrectSpectrumBase::kMCWeightedContainerConversionESDSig);
1487 if(!cfcontainerr) return;
1488 AliCFEffGrid *conversionEffGrid = (AliCFEffGrid*) GetEfficiency(cfcontainerr,1,0); //mjmj
1489 fConversionEffbgc = (TH1D *) conversionEffGrid->Project(0);
1493 fipfitnonhfe->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
1494 fNonHFEEffbgc->Fit(fipfitnonhfe,"R");
1495 fEfficiencyIPNonhfeD = fNonHFEEffbgc->GetFunction("fipfitnonhfe");
1497 fipfitnonhfe = new TF1("fipfitnonhfe","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,8.);
1498 fipfitnonhfe->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
1499 fConversionEffbgc->Fit(fipfitnonhfe,"R");
1500 fEfficiencyIPConversionD = fConversionEffbgc->GetFunction("fipfitnonhfe");
1505 fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
1506 fipfit->SetLineColor(2);
1507 fEfficiencyBeautySigD->Fit(fipfit,"R");
1508 fEfficiencyBeautySigD->GetYaxis()->SetTitle("Efficiency");
1509 fEfficiencyIPBeautyD = fEfficiencyBeautySigD->GetFunction("fipfit");
1511 fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
1512 fipfit->SetLineColor(6);
1513 fEfficiencyBeautySigesdD->Fit(fipfit,"R");
1514 fEfficiencyBeautySigesdD->GetYaxis()->SetTitle("Efficiency");
1515 fEfficiencyIPBeautyesdD = fEfficiencyBeautySigesdD->GetFunction("fipfit");
1517 fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
1518 fipfit->SetLineColor(1);
1519 fEfficiencyCharmSigD->Fit(fipfit,"R");
1520 fEfficiencyCharmSigD->GetYaxis()->SetTitle("Efficiency");
1521 fEfficiencyIPCharmD = fEfficiencyCharmSigD->GetFunction("fipfit");
1524 if(fIPParameterizedEff){
1525 // fipfitnonhfe->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
1526 fipfitnonhfe->SetLineColor(3);
1528 fConversionEff->Fit(fipfitnonhfe,"R");
1529 fConversionEff->GetYaxis()->SetTitle("Efficiency");
1530 fEfficiencyIPConversionD = fConversionEff->GetFunction("fipfitnonhfe");
1533 fConversionEffbgc->Fit(fipfitnonhfe,"R");
1534 fConversionEffbgc->GetYaxis()->SetTitle("Efficiency");
1535 fEfficiencyIPConversionD = fConversionEffbgc->GetFunction("fipfitnonhfe");
1537 // fipfitnonhfe->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
1538 fipfitnonhfe->SetLineColor(4);
1540 fNonHFEEff->Fit(fipfitnonhfe,"R");
1541 fNonHFEEff->GetYaxis()->SetTitle("Efficiency");
1542 fEfficiencyIPNonhfeD = fNonHFEEff->GetFunction("fipfitnonhfe");
1545 fNonHFEEffbgc->Fit(fipfitnonhfe,"R");
1546 fNonHFEEffbgc->GetYaxis()->SetTitle("Efficiency");
1547 fEfficiencyIPNonhfeD = fNonHFEEffbgc->GetFunction("fipfitnonhfe");
1552 fEfficiencyCharmSigD->SetMarkerStyle(21);
1553 fEfficiencyCharmSigD->SetMarkerColor(1);
1554 fEfficiencyCharmSigD->SetLineColor(1);
1555 fEfficiencyBeautySigD->SetMarkerStyle(21);
1556 fEfficiencyBeautySigD->SetMarkerColor(2);
1557 fEfficiencyBeautySigD->SetLineColor(2);
1558 fEfficiencyBeautySigesdD->SetStats(0);
1559 fEfficiencyBeautySigesdD->SetMarkerStyle(21);
1560 fEfficiencyBeautySigesdD->SetMarkerColor(6);
1561 fEfficiencyBeautySigesdD->SetLineColor(6);
1562 fCharmEff->SetMarkerStyle(24);
1563 fCharmEff->SetMarkerColor(1);
1564 fCharmEff->SetLineColor(1);
1565 fBeautyEff->SetMarkerStyle(24);
1566 fBeautyEff->SetMarkerColor(2);
1567 fBeautyEff->SetLineColor(2);
1568 fConversionEff->SetMarkerStyle(24);
1569 fConversionEff->SetMarkerColor(3);
1570 fConversionEff->SetLineColor(3);
1571 fNonHFEEff->SetMarkerStyle(24);
1572 fNonHFEEff->SetMarkerColor(4);
1573 fNonHFEEff->SetLineColor(4);
1575 fEfficiencyCharmSigD->Draw();
1576 fEfficiencyCharmSigD->GetXaxis()->SetRangeUser(0.0,7.9);
1577 fEfficiencyCharmSigD->GetYaxis()->SetRangeUser(0.0,0.5);
1579 fEfficiencyBeautySigD->Draw("same");
1580 fEfficiencyBeautySigesdD->Draw("same");
1582 fNonHFEEff->Draw("same");
1583 fConversionEff->Draw("same");
1585 //fCharmEff->Draw("same");
1586 //fBeautyEff->Draw("same");
1589 fConversionEffbgc->SetMarkerStyle(25);
1590 fConversionEffbgc->SetMarkerColor(3);
1591 fConversionEffbgc->SetLineColor(3);
1592 fNonHFEEffbgc->SetMarkerStyle(25);
1593 fNonHFEEffbgc->SetMarkerColor(4);
1594 fNonHFEEffbgc->SetLineColor(4);
1595 fConversionEffbgc->Draw("same");
1596 fNonHFEEffbgc->Draw("same");
1599 if(fEfficiencyIPBeautyD)
1600 fEfficiencyIPBeautyD->Draw("same");
1601 if(fEfficiencyIPBeautyesdD)
1602 fEfficiencyIPBeautyesdD->Draw("same");
1603 if( fEfficiencyIPCharmD)
1604 fEfficiencyIPCharmD->Draw("same");
1605 if(fIPParameterizedEff){
1606 if(fEfficiencyIPConversionD)
1607 fEfficiencyIPConversionD->Draw("same");
1608 if(fEfficiencyIPNonhfeD)
1609 fEfficiencyIPNonhfeD->Draw("same");
1611 TLegend *legipeff = new TLegend(0.58,0.2,0.88,0.39);
1612 legipeff->AddEntry(fEfficiencyBeautySigD,"IP Step Efficiency","");
1613 legipeff->AddEntry(fEfficiencyBeautySigD,"beauty e","p");
1614 legipeff->AddEntry(fEfficiencyBeautySigesdD,"beauty e(esd pt)","p");
1615 legipeff->AddEntry(fEfficiencyCharmSigD,"charm e","p");
1617 legipeff->AddEntry(fConversionEffbgc,"conversion e(esd pt)","p");
1618 legipeff->AddEntry(fNonHFEEffbgc,"Dalitz e(esd pt)","p");
1621 legipeff->AddEntry(fConversionEff,"conversion e","p");
1622 legipeff->AddEntry(fNonHFEEff,"Dalitz e","p");
1624 legipeff->Draw("same");
1626 //cefficiencyParamIP->SaveAs("efficiencyParamIP.eps");
1629 //____________________________________________________________________________
1630 THnSparse* AliHFEBeautySpectrum::GetBeautyIPEff(Bool_t isMCpt){
1632 // Return beauty electron IP cut efficiency
1635 const Int_t nPtbinning1 = kSignalPtBins;//number of pt bins, according to new binning
1636 Double_t kPtRange[nPtbinning1+1] = { 0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5., 5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.};//pt bin limits
1638 Int_t nDim=1; //dimensions of the efficiency weighting grid
1640 Int_t nBin[1] = {nPtbinning1};
1642 THnSparseF *ipcut = new THnSparseF("beff", "b IP efficiency; p_{t}(GeV/c)", nDim, nBin);
1644 ipcut->SetBinEdges(0, kPtRange);
1649 Double_t contents[2];
1654 Int_t looppt=nBin[0];
1658 for(int i=0; i<looppt; i++)
1660 pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
1662 if(fEfficiencyIPBeautyD){
1663 weight=fEfficiencyIPBeautyD->Eval(pt[0]);
1667 printf("Fit failed on beauty IP cut efficiency. Contents in histo used!\n");
1668 weight = fEfficiencyBeautySigD->GetBinContent(i+1);
1669 weightErr = fEfficiencyBeautySigD->GetBinError(i+1);
1673 if(fEfficiencyIPBeautyesdD){
1674 weight=fEfficiencyIPBeautyesdD->Eval(pt[0]);
1678 printf("Fit failed on beauty IP cut efficiency. Contents in histo used!\n");
1679 weight = fEfficiencyBeautySigesdD->GetBinContent(i+1);
1680 weightErr = fEfficiencyBeautySigD->GetBinError(i+1);
1687 ipcut->Fill(contents,weight);
1688 ipcut->SetBinError(ibin,weightErr);
1691 Int_t nDimSparse = ipcut->GetNdimensions();
1692 Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
1693 Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
1695 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
1696 binsvar[iVar] = ipcut->GetAxis(iVar)->GetNbins();
1697 nBins *= binsvar[iVar];
1700 Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
1701 // loop that sets 0 error in each bin
1702 for (Long_t iBin=0; iBin<nBins; iBin++) {
1703 Long_t bintmp = iBin ;
1704 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
1705 binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
1706 bintmp /= binsvar[iVar] ;
1708 //ipcut->SetBinError(binfill,0.); // put 0 everywhere
1717 //____________________________________________________________________________
1718 THnSparse* AliHFEBeautySpectrum::GetPIDxIPEff(Int_t source){
1720 // Return PID x IP cut efficiency
1722 const Int_t nPtbinning1 = kSignalPtBins;//number of pt bins, according to new binning
1723 Double_t kPtRange[nPtbinning1+1] = { 0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1., 1.1, 1.2, 1.3, 1.4, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.5, 4., 4.5, 5., 5.5, 6., 7., 8., 10., 12., 14., 16., 18., 20.};//pt bin limits
1724 Int_t nDim=1; //dimensions of the efficiency weighting grid
1726 Int_t nBin[1] = {nPtbinning1};
1729 pideff = new THnSparseF("pideff", "PID efficiency; p_{t}(GeV/c)", nDim, nBin);
1730 pideff->SetBinEdges(0, kPtRange);
1735 Double_t contents[2];
1740 Int_t looppt=nBin[0];
1743 Double_t trdtpcPidEfficiency = fEfficiencyFunction->Eval(0); // assume we have constant TRD+TPC PID efficiency
1744 for(int i=0; i<looppt; i++)
1746 pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
1748 Double_t tofpideff = 1.;
1749 Double_t tofpideffesd = 1.;
1750 if(fEfficiencyTOFPIDD)
1751 tofpideff = fEfficiencyTOFPIDD->Eval(pt[0]);
1753 printf("TOF PID fit failed on conversion. The result is wrong!\n");
1755 if(fEfficiencyesdTOFPIDD)
1756 tofpideffesd = fEfficiencyesdTOFPIDD->Eval(pt[0]);
1758 printf("TOF esd PID fit failed on conversion. The result is wrong!\n");
1761 //tof pid eff x tpc pid eff x ip cut eff
1762 if(fIPParameterizedEff){
1764 if(fEfficiencyIPCharmD){
1765 weight = tofpideff*trdtpcPidEfficiency*fEfficiencyIPCharmD->Eval(pt[0]);
1769 printf("Fit failed on charm IP cut efficiency\n");
1770 weight = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD->GetBinContent(i+1);
1771 weightErr = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD->GetBinError(i+1);
1774 else if(source==2) {
1775 if(fEfficiencyIPConversionD){
1776 weight = tofpideffesd*trdtpcPidEfficiency*fEfficiencyIPConversionD->Eval(pt[0]);
1780 printf("Fit failed on conversion IP cut efficiency\n");
1781 weight = tofpideffesd*trdtpcPidEfficiency*fConversionEff->GetBinContent(i+1);
1782 weightErr = tofpideffesd*trdtpcPidEfficiency*fConversionEff->GetBinError(i+1);
1785 else if(source==3) {
1786 if(fEfficiencyIPNonhfeD){
1787 weight = tofpideffesd*trdtpcPidEfficiency*fEfficiencyIPNonhfeD->Eval(pt[0]);
1791 printf("Fit failed on dalitz IP cut efficiency\n");
1792 weight = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff->GetBinContent(i+1);
1793 weightErr = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff->GetBinError(i+1);
1799 if(fEfficiencyIPCharmD){
1800 weight = tofpideff*trdtpcPidEfficiency*fEfficiencyIPCharmD->Eval(pt[0]);
1804 printf("Fit failed on charm IP cut efficiency\n");
1805 weight = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD->GetBinContent(i+1);
1806 weightErr = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD->GetBinError(i+1);
1811 weight = tofpideffesd*trdtpcPidEfficiency*fConversionEffbgc->GetBinContent(i+1); // conversion
1812 weightErr = tofpideffesd*trdtpcPidEfficiency*fConversionEffbgc->GetBinError(i+1);
1815 weight = tofpideffesd*trdtpcPidEfficiency*fConversionEff->GetBinContent(i+1); // conversion
1816 weightErr = tofpideffesd*trdtpcPidEfficiency*fConversionEff->GetBinError(i+1);
1821 weight = tofpideffesd*trdtpcPidEfficiency*fNonHFEEffbgc->GetBinContent(i+1); // conversion
1822 weightErr = tofpideffesd*trdtpcPidEfficiency*fNonHFEEffbgc->GetBinError(i+1);
1825 weight = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff->GetBinContent(i+1); // Dalitz
1826 weightErr = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff->GetBinError(i+1);
1834 pideff->Fill(contents,weight);
1835 pideff->SetBinError(ibin,weightErr);
1838 Int_t nDimSparse = pideff->GetNdimensions();
1839 Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
1840 Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
1842 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
1843 binsvar[iVar] = pideff->GetAxis(iVar)->GetNbins();
1844 nBins *= binsvar[iVar];
1847 Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
1848 // loop that sets 0 error in each bin
1849 for (Long_t iBin=0; iBin<nBins; iBin++) {
1850 Long_t bintmp = iBin ;
1851 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
1852 binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
1853 bintmp /= binsvar[iVar] ;
1864 //__________________________________________________________________________
1865 AliCFDataGrid *AliHFEBeautySpectrum::GetRawBspectra2ndMethod(){
1867 // retrieve AliCFDataGrid for raw beauty spectra obtained from fit method
1871 const Int_t nPtbinning1 = 18;//number of pt bins, according to new binning
1872 Double_t kPtRange[19] = {0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 12, 16, 20};
1874 Int_t nBin[1] = {nPtbinning1};
1876 AliCFDataGrid *rawBeautyContainer = new AliCFDataGrid("rawBeautyContainer","rawBeautyContainer",nDim,nBin);
1878 THnSparseF *brawspectra;
1879 brawspectra= new THnSparseF("brawspectra", "beauty yields ; p_{t}(GeV/c)", nDim, nBin);
1881 brawspectra->SetBinEdges(0, kPtRange);
1884 Double_t yields= 0.;
1885 Double_t valuesb[2];
1887 for(int i=0; i<fBSpectrum2ndMethod->GetNbinsX(); i++){
1888 pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
1890 yields = fBSpectrum2ndMethod->GetBinContent(i+1);
1893 brawspectra->Fill(valuesb,yields);
1898 Int_t nDimSparse = brawspectra->GetNdimensions();
1899 Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
1900 Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
1902 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
1903 binsvar[iVar] = brawspectra->GetAxis(iVar)->GetNbins();
1904 nBins *= binsvar[iVar];
1907 Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
1908 // loop that sets 0 error in each bin
1909 for (Long_t iBin=0; iBin<nBins; iBin++) {
1910 Long_t bintmp = iBin ;
1911 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
1912 binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
1913 bintmp /= binsvar[iVar] ;
1915 brawspectra->SetBinError(binfill,0.); // put 0 everywhere
1919 rawBeautyContainer->SetGrid(brawspectra); // get charm efficiency
1920 TH1D* hRawBeautySpectra = (TH1D*)rawBeautyContainer->Project(0);
1923 fBSpectrum2ndMethod->SetMarkerStyle(24);
1924 fBSpectrum2ndMethod->Draw("p");
1925 hRawBeautySpectra->SetMarkerStyle(25);
1926 hRawBeautySpectra->Draw("samep");
1931 return rawBeautyContainer;
1933 //__________________________________________________________________________
1934 void AliHFEBeautySpectrum::CalculateNonHFEsyst(){
1936 // Calculate non HFE sys
1943 Double_t evtnorm[1] = {0.0};
1944 if(fNMCbgEvents>0) evtnorm[0]= double(fNEvents)/double(fNMCbgEvents);
1946 AliCFDataGrid *convSourceGrid[kElecBgSources-3][kBgLevels];
1947 AliCFDataGrid *nonHFESourceGrid[kElecBgSources-3][kBgLevels];
1949 AliCFDataGrid *bgLevelGrid[2][kBgLevels];//for pi0 and eta based errors
1950 AliCFDataGrid *bgNonHFEGrid[kBgLevels];
1951 AliCFDataGrid *bgConvGrid[kBgLevels];
1953 Int_t stepbackground = 3;
1954 Int_t* bins=new Int_t[1];
1955 const Char_t *bgBase[2] = {"pi0","eta"};
1957 bins[0]=kSignalPtBins;//fConversionEff[centrality]->GetNbinsX();
1959 AliCFDataGrid *weightedConversionContainer = new AliCFDataGrid("weightedConversionContainer","weightedConversionContainer",1,bins);
1960 AliCFDataGrid *weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",1,bins);
1962 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1963 for(Int_t iSource = 0; iSource < kElecBgSources-3; iSource++){
1964 convSourceGrid[iSource][iLevel] = new AliCFDataGrid(Form("convGrid_%d_%d",iSource,iLevel),Form("convGrid_%d_%d",iSource,iLevel),*fConvSourceContainer[iSource][iLevel],stepbackground);
1965 weightedConversionContainer->SetGrid(GetPIDxIPEff(2));
1966 convSourceGrid[iSource][iLevel]->Multiply(weightedConversionContainer,1.0);
1968 nonHFESourceGrid[iSource][iLevel] = new AliCFDataGrid(Form("nonHFEGrid_%d_%d",iSource,iLevel),Form("nonHFEGrid_%d_%d",iSource,iLevel),*fNonHFESourceContainer[iSource][iLevel],stepbackground);
1969 weightedNonHFEContainer->SetGrid(GetPIDxIPEff(3));
1970 nonHFESourceGrid[iSource][iLevel]->Multiply(weightedNonHFEContainer,1.0);
1973 bgConvGrid[iLevel] = (AliCFDataGrid*)convSourceGrid[0][iLevel]->Clone();
1974 for(Int_t iSource = 2; iSource < kElecBgSources-3; iSource++){
1975 bgConvGrid[iLevel]->Add(convSourceGrid[iSource][iLevel]);
1978 bgConvGrid[iLevel]->Add(convSourceGrid[1][iLevel]);
1980 bgNonHFEGrid[iLevel] = (AliCFDataGrid*)nonHFESourceGrid[0][iLevel]->Clone();
1981 for(Int_t iSource = 2; iSource < kElecBgSources-3; iSource++){//add other sources to pi0, to get overall background from all meson decays, exception: eta (independent error calculation)
1982 bgNonHFEGrid[iLevel]->Add(nonHFESourceGrid[iSource][iLevel]);
1985 bgNonHFEGrid[iLevel]->Add(nonHFESourceGrid[1][iLevel]);
1987 bgLevelGrid[0][iLevel] = (AliCFDataGrid*)bgConvGrid[iLevel]->Clone();
1988 bgLevelGrid[0][iLevel]->Add(bgNonHFEGrid[iLevel]);
1990 bgLevelGrid[1][iLevel] = (AliCFDataGrid*)nonHFESourceGrid[1][iLevel]->Clone();//background for eta source
1991 bgLevelGrid[1][iLevel]->Add(convSourceGrid[1][iLevel]);
1995 //Now subtract the mean from upper, and lower from mean container to get the error based on the pion yield uncertainty (-> this error sums linearly, since its contribution to all meson yields is correlated; exception: eta errors in pp 7 TeV sum with others the gaussian way, as they are independent from pi0)
1996 AliCFDataGrid *bgErrorGrid[2][2];//for pions/eta error base, for lower/upper
1997 TH1D* hBaseErrors[2][2];//pi0/eta and lower/upper
1998 for(Int_t iErr = 0; iErr < 2; iErr++){//errors for pi0 and eta base
1999 bgErrorGrid[iErr][0] = (AliCFDataGrid*)bgLevelGrid[iErr][1]->Clone();
2000 bgErrorGrid[iErr][0]->Add(bgLevelGrid[iErr][0],-1.);
2001 bgErrorGrid[iErr][1] = (AliCFDataGrid*)bgLevelGrid[iErr][2]->Clone();
2002 bgErrorGrid[iErr][1]->Add(bgLevelGrid[iErr][0],-1.);
2004 //plot absolute differences between limit yields (upper/lower limit, based on pi0 and eta errors) and best estimate
2006 hBaseErrors[iErr][0] = (TH1D*)bgErrorGrid[iErr][0]->Project(0);
2007 hBaseErrors[iErr][0]->Scale(-1.);
2008 hBaseErrors[iErr][0]->SetTitle(Form("Absolute %s-based systematic errors from non-HF meson decays and conversions",bgBase[iErr]));
2009 hBaseErrors[iErr][1] = (TH1D*)bgErrorGrid[iErr][1]->Project(0);
2013 //Calculate the scaling errors for electrons from all mesons except for pions (and in pp 7 TeV case eta): square sum of (0.3 * best yield estimate), where 0.3 is the error generally assumed for m_t scaling
2014 TH1D *hSpeciesErrors[kElecBgSources-4];
2015 for(Int_t iSource = 1; iSource < kElecBgSources-3; iSource++){
2016 if(fEtaSyst && (iSource == 1))continue;
2017 hSpeciesErrors[iSource-1] = (TH1D*)convSourceGrid[iSource][0]->Project(0);
2018 TH1D *hNonHFEtemp = (TH1D*)nonHFESourceGrid[iSource][0]->Project(0);
2019 hSpeciesErrors[iSource-1]->Add(hNonHFEtemp);
2020 hSpeciesErrors[iSource-1]->Scale(0.3);
2023 //Int_t firstBgSource = 0;//if eta systematics are not from scaling
2024 //if(fEtaSyst){firstBgSource = 1;}//source 0 histograms are not filled if eta errors are independently determined!
2025 TH1D *hOverallSystErrLow = (TH1D*)hSpeciesErrors[1]->Clone();
2026 TH1D *hOverallSystErrUp = (TH1D*)hSpeciesErrors[1]->Clone();
2027 TH1D *hScalingErrors = (TH1D*)hSpeciesErrors[1]->Clone();
2029 TH1D *hOverallBinScaledErrsUp = (TH1D*)hOverallSystErrUp->Clone();
2030 TH1D *hOverallBinScaledErrsLow = (TH1D*)hOverallSystErrLow->Clone();
2032 for(Int_t iBin = 1; iBin <= kBgPtBins; iBin++){
2033 Double_t pi0basedErrLow,pi0basedErrUp,etaErrLow,etaErrUp;
2034 pi0basedErrLow = hBaseErrors[0][0]->GetBinContent(iBin);
2035 pi0basedErrUp = hBaseErrors[0][1]->GetBinContent(iBin);
2037 etaErrLow = hBaseErrors[1][0]->GetBinContent(iBin);
2038 etaErrUp = hBaseErrors[1][1]->GetBinContent(iBin);
2040 else{ etaErrLow = etaErrUp = 0.;}
2042 Double_t sqrsumErrs= 0;
2043 for(Int_t iSource = 1; iSource < kElecBgSources-3; iSource++){
2044 if(fEtaSyst && (iSource == 1))continue;
2045 Double_t scalingErr=hSpeciesErrors[iSource-1]->GetBinContent(iBin);
2046 sqrsumErrs+=(scalingErr*scalingErr);
2048 for(Int_t iErr = 0; iErr < 2; iErr++){
2049 for(Int_t iLevel = 0; iLevel < 2; iLevel++){
2050 hBaseErrors[iErr][iLevel]->SetBinContent(iBin,hBaseErrors[iErr][iLevel]->GetBinContent(iBin)/hBaseErrors[iErr][iLevel]->GetBinWidth(iBin));
2054 hOverallSystErrUp->SetBinContent(iBin, TMath::Sqrt((pi0basedErrUp*pi0basedErrUp)+(etaErrUp*etaErrUp)+sqrsumErrs));
2055 hOverallSystErrLow->SetBinContent(iBin, TMath::Sqrt((pi0basedErrLow*pi0basedErrLow)+(etaErrLow*etaErrLow)+sqrsumErrs));
2056 hScalingErrors->SetBinContent(iBin, TMath::Sqrt(sqrsumErrs)/hScalingErrors->GetBinWidth(iBin));
2058 hOverallBinScaledErrsUp->SetBinContent(iBin,hOverallSystErrUp->GetBinContent(iBin)/hOverallBinScaledErrsUp->GetBinWidth(iBin));
2059 hOverallBinScaledErrsLow->SetBinContent(iBin,hOverallSystErrLow->GetBinContent(iBin)/hOverallBinScaledErrsLow->GetBinWidth(iBin));
2062 TCanvas *cPiErrors = new TCanvas("cPiErrors","cPiErrors",1000,600);
2064 cPiErrors->SetLogx();
2065 cPiErrors->SetLogy();
2066 hBaseErrors[0][0]->Draw();
2067 //hBaseErrors[0][1]->SetMarkerColor(kBlack);
2068 //hBaseErrors[0][1]->SetLineColor(kBlack);
2069 //hBaseErrors[0][1]->Draw("SAME");
2071 hBaseErrors[1][0]->Draw("SAME");
2072 hBaseErrors[1][0]->SetMarkerColor(kBlack);
2073 hBaseErrors[1][0]->SetLineColor(kBlack);
2074 //hBaseErrors[1][1]->SetMarkerColor(13);
2075 //hBaseErrors[1][1]->SetLineColor(13);
2076 //hBaseErrors[1][1]->Draw("SAME");
2078 //hOverallBinScaledErrsUp->SetMarkerColor(kBlue);
2079 //hOverallBinScaledErrsUp->SetLineColor(kBlue);
2080 //hOverallBinScaledErrsUp->Draw("SAME");
2081 hOverallBinScaledErrsLow->SetMarkerColor(kGreen);
2082 hOverallBinScaledErrsLow->SetLineColor(kGreen);
2083 hOverallBinScaledErrsLow->Draw("SAME");
2084 hScalingErrors->SetLineColor(kBlue);
2085 hScalingErrors->Draw("SAME");
2087 TLegend *lPiErr = new TLegend(0.6,0.6, 0.95,0.95);
2088 lPiErr->AddEntry(hBaseErrors[0][0],"Lower error from pion error");
2089 //lPiErr->AddEntry(hBaseErrors[0][1],"Upper error from pion error");
2091 lPiErr->AddEntry(hBaseErrors[1][0],"Lower error from eta error");
2092 //lPiErr->AddEntry(hBaseErrors[1][1],"Upper error from eta error");
2094 lPiErr->AddEntry(hScalingErrors, "scaling error");
2095 lPiErr->AddEntry(hOverallBinScaledErrsLow, "overall lower systematics");
2096 //lPiErr->AddEntry(hOverallBinScaledErrsUp, "overall upper systematics");
2097 lPiErr->Draw("SAME");
2100 TH1D *hUpSystScaled = (TH1D*)hOverallSystErrUp->Clone();
2101 TH1D *hLowSystScaled = (TH1D*)hOverallSystErrLow->Clone();
2102 hUpSystScaled->Scale(evtnorm[0]);//scale by N(data)/N(MC), to make data sets comparable to saved subtracted spectrum (calculations in separate macro!)
2103 hLowSystScaled->Scale(evtnorm[0]);
2104 TH1D *hNormAllSystErrUp = (TH1D*)hUpSystScaled->Clone();
2105 TH1D *hNormAllSystErrLow = (TH1D*)hLowSystScaled->Clone();
2106 //histograms to be normalized to TGraphErrors
2107 CorrectFromTheWidth(hNormAllSystErrUp);
2108 CorrectFromTheWidth(hNormAllSystErrLow);
2110 TCanvas *cNormOvErrs = new TCanvas("cNormOvErrs","cNormOvErrs");
2112 cNormOvErrs->SetLogx();
2113 cNormOvErrs->SetLogy();
2115 TGraphErrors* gOverallSystErrUp = NormalizeTH1(hNormAllSystErrUp);
2116 TGraphErrors* gOverallSystErrLow = NormalizeTH1(hNormAllSystErrLow);
2117 gOverallSystErrUp->SetTitle("Overall Systematic non-HFE Errors");
2118 gOverallSystErrUp->SetMarkerColor(kBlack);
2119 gOverallSystErrUp->SetLineColor(kBlack);
2120 gOverallSystErrLow->SetMarkerColor(kRed);
2121 gOverallSystErrLow->SetLineColor(kRed);
2122 gOverallSystErrUp->Draw("AP");
2123 gOverallSystErrLow->Draw("PSAME");
2124 TLegend *lAllSys = new TLegend(0.4,0.6,0.89,0.89);
2125 lAllSys->AddEntry(gOverallSystErrLow,"lower","p");
2126 lAllSys->AddEntry(gOverallSystErrUp,"upper","p");
2127 lAllSys->Draw("same");
2130 AliCFDataGrid *bgYieldGrid;
2132 bgLevelGrid[0][0]->Add(bgLevelGrid[1][0]);//Addition of the eta background best estimate to the rest. Needed to be separated for error treatment - now overall background necessary! If no separate eta systematics exist, the corresponding grid has already been added before.
2134 bgYieldGrid = (AliCFDataGrid*)bgLevelGrid[0][0]->Clone();
2136 TH1D *hBgYield = (TH1D*)bgYieldGrid->Project(0);
2137 TH1D* hRelErrUp = (TH1D*)hOverallSystErrUp->Clone();
2138 hRelErrUp->Divide(hBgYield);
2139 TH1D* hRelErrLow = (TH1D*)hOverallSystErrLow->Clone();
2140 hRelErrLow->Divide(hBgYield);
2142 TCanvas *cRelErrs = new TCanvas("cRelErrs","cRelErrs");
2144 cRelErrs->SetLogx();
2145 hRelErrUp->SetTitle("Relative error of non-HFE background yield");
2147 hRelErrLow->SetLineColor(kBlack);
2148 hRelErrLow->Draw("SAME");
2150 TLegend *lRel = new TLegend(0.6,0.6,0.95,0.95);
2151 lRel->AddEntry(hRelErrUp, "upper");
2152 lRel->AddEntry(hRelErrLow, "lower");
2155 //CorrectFromTheWidth(hBgYield);
2156 //hBgYield->Scale(evtnorm[0]);
2159 //write histograms/TGraphs to file
2160 TFile *output = new TFile("systHists.root","recreate");
2162 hBgYield->SetName("hBgYield");
2164 hRelErrUp->SetName("hRelErrUp");
2166 hRelErrLow->SetName("hRelErrLow");
2167 hRelErrLow->Write();
2168 hUpSystScaled->SetName("hOverallSystErrUp");
2169 hUpSystScaled->Write();
2170 hLowSystScaled->SetName("hOverallSystErrLow");
2171 hLowSystScaled->Write();
2172 gOverallSystErrUp->SetName("gOverallSystErrUp");
2173 gOverallSystErrUp->Write();
2174 gOverallSystErrLow->SetName("gOverallSystErrLow");
2175 gOverallSystErrLow->Write();
2180 //____________________________________________________________
2181 void AliHFEBeautySpectrum::UnfoldBG(AliCFDataGrid* const bgsubpectrum){
2183 // Unfold backgrounds to check its sanity
2186 AliCFContainer *mcContainer = GetContainer(kMCContainerCharmMC);
2187 //AliCFContainer *mcContainer = GetContainer(kMCContainerMC);
2189 AliError("MC Container not available");
2194 AliError("No Correlation map available");
2199 AliCFDataGrid *dataGrid = 0x0;
2200 dataGrid = bgsubpectrum;
2203 AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainer, fStepGuessedUnfolding);
2204 THnSparse* guessedTHnSparse = ((AliCFGridSparse*)guessedGrid->GetData())->GetGrid();
2207 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
2208 efficiencyD->CalculateEfficiency(fStepMC+2,fStepTrue);
2210 // Unfold background spectra
2212 AliCFUnfolding unfolding("unfolding","",nDim,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse);
2213 if(fUnSetCorrelatedErrors) unfolding.UnsetCorrelatedErrors();
2214 unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
2215 if(fSetSmoothing) unfolding.UseSmoothing();
2219 THnSparse* result = unfolding.GetUnfolded();
2220 TCanvas *ctest = new TCanvas("yvonnetest","yvonnetest",1000,600);
2225 TH1D* htest1=(TH1D*)result->Projection(0);
2228 TH1D* htest2=(TH1D*)result->Projection(1);
2233 TGraphErrors* unfoldedbgspectrumD = Normalize(result);
2234 if(!unfoldedbgspectrumD) {
2235 AliError("Unfolded background spectrum doesn't exist");
2238 TFile *file = TFile::Open("unfoldedbgspectrum.root","recreate");
2239 if(fBeamType==0)unfoldedbgspectrumD->Write("unfoldedbgspectrum");