]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/hfe/AliHFEspectrum.cxx
Yvonne for the TPC-TOF MB pPb analysis
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliHFEspectrum.cxx
1
2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 *                                                                        *
5 * Author: The ALICE Off-line Project.                                    *
6 * Contributors are mentioned in the code where appropriate.              *
7 *                                                                        *
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 **************************************************************************/
16 //
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
25 //
26 //  Author: 
27 //            Raphaelle Bailhache <R.Bailhache@gsi.de>
28 //            Markus Fasel <M.Fasel@gsi.de>
29 //
30
31 #include <TArrayD.h>
32 #include <TH1.h>
33 #include <TList.h>
34 #include <TObjArray.h>
35 #include <TROOT.h>
36 #include <TCanvas.h>
37 #include <TLegend.h>
38 #include <TStyle.h>
39 #include <TMath.h>
40 #include <TAxis.h>
41 #include <TGraphErrors.h>
42 #include <TFile.h>
43 #include <TPad.h>
44 #include <TH2D.h>
45 #include <TF1.h>
46
47 #include "AliPID.h"
48 #include "AliCFContainer.h"
49 #include "AliCFDataGrid.h"
50 #include "AliCFEffGrid.h"
51 #include "AliCFGridSparse.h"
52 #include "AliCFUnfolding.h"
53 #include "AliLog.h"
54
55 #include "AliHFEspectrum.h"
56 #include "AliHFEcuts.h"
57 #include "AliHFEcontainer.h"
58 #include "AliHFEtools.h"
59
60 ClassImp(AliHFEspectrum)
61
62 //____________________________________________________________
63 AliHFEspectrum::AliHFEspectrum(const char *name):
64   TNamed(name, ""),
65   fCFContainers(new TObjArray(kDataContainerV0+1)),
66   fTemporaryObjects(NULL),
67   fCorrelation(NULL),
68   fBackground(NULL),
69   fEfficiencyFunction(NULL),
70   fWeightCharm(NULL),
71   fInclusiveSpectrum(kTRUE),
72   fDumpToFile(kFALSE),
73   fEtaSelected(kFALSE),
74   fUnSetCorrelatedErrors(kTRUE),
75   fSetSmoothing(kFALSE),
76   fIPanaHadronBgSubtract(kFALSE),
77   fIPanaCharmBgSubtract(kFALSE),
78   fIPanaConversionBgSubtract(kFALSE),
79   fIPanaNonHFEBgSubtract(kFALSE),
80   fIPParameterizedEff(kFALSE),
81   fNonHFEsyst(0),
82   fBeauty2ndMethod(kFALSE),
83   fIPEffCombinedSamples(kTRUE),
84   fNbDimensions(1),
85   fNMCEvents(0),
86   fStepMC(-1),
87   fStepTrue(-1),
88   fStepData(-1),
89   fStepBeforeCutsV0(-1),
90   fStepAfterCutsV0(-1),
91   fStepGuessedUnfolding(-1),
92   fNumberOfIterations(5),
93   fChargeChoosen(kAllCharge),
94   fNCentralityBinAtTheEnd(0),
95   fTestCentralityLow(-1),
96   fTestCentralityHigh(-1),
97   fFillMoreCorrelationMatrix(kFALSE),
98   fHadronEffbyIPcut(NULL),
99   fConversionEffbgc(NULL),
100   fNonHFEEffbgc(NULL),      
101   fBSpectrum2ndMethod(NULL),
102   fkBeauty2ndMethodfilename(""),
103   fBeamType(0),
104   fEtaSyst(kTRUE),
105   fDebugLevel(0),
106   fWriteToFile(kFALSE),
107   fUnfoldBG(kFALSE)
108 {
109   //
110   // Default constructor
111   //
112
113   for(Int_t k = 0; k < 20; k++){
114       fNEvents[k] = 0;
115       fNMCbgEvents[k] = 0;
116       fLowBoundaryCentralityBinAtTheEnd[k] = 0;
117       fHighBoundaryCentralityBinAtTheEnd[k] = 0;
118       if(k<kCentrality)
119       {
120           fEfficiencyTOFPIDD[k] = 0;
121           fEfficiencyesdTOFPIDD[k] = 0;
122           fEfficiencyIPCharmD[k] = 0;     
123           fEfficiencyIPBeautyD[k] = 0;    
124           fEfficiencyIPBeautyesdD[k] = 0;
125           fEfficiencyIPConversionD[k] = 0;
126           fEfficiencyIPNonhfeD[k] = 0;   
127
128           fConversionEff[k] = 0;
129           fNonHFEEff[k] = 0;
130           fCharmEff[k] = 0;
131           fBeautyEff[k] = 0;
132           fEfficiencyCharmSigD[k] = 0;
133           fEfficiencyBeautySigD[k] = 0;
134           fEfficiencyBeautySigesdD[k] = 0;
135       }
136   }
137   memset(fEtaRange, 0, sizeof(Double_t) * 2);
138   memset(fEtaRangeNorm, 0, sizeof(Double_t) * 2);
139   memset(fConvSourceContainer, 0, sizeof(AliCFContainer*) * kElecBgSources * kBgLevels);
140   memset(fNonHFESourceContainer, 0, sizeof(AliCFContainer*) * kElecBgSources * kBgLevels);
141 }
142
143 //____________________________________________________________
144 AliHFEspectrum::~AliHFEspectrum(){
145   //
146   // Destructor
147   //
148   if(fCFContainers) delete fCFContainers;
149   if(fTemporaryObjects){
150     fTemporaryObjects->Clear();
151     delete fTemporaryObjects;
152   }
153 }
154 //____________________________________________________________
155 Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *v0hfecontainer, const AliHFEcontainer *bghfecontainer){
156   //
157   // Init what we need for the correction:
158   //
159   // Raw spectrum, hadron contamination
160   // MC efficiency maps, correlation matrix
161   // V0 efficiency if wanted
162   //
163   // This for a given dimension.
164   // If no inclusive spectrum, then take only efficiency map for beauty electron
165   // and the appropriate correlation matrix
166   //
167
168   
169   if(fBeauty2ndMethod) CallInputFileForBeauty2ndMethod();
170
171   Int_t kNdim = 3;
172   Int_t kNcentr =1;
173   Int_t ptpr =0;
174   if(fBeamType==0) kNdim=3;
175   if(fBeamType==1)
176   {
177       kNdim=4;
178       kNcentr=11;
179       ptpr=1;
180   }
181
182   Int_t dims[kNdim];
183   // Get the requested format
184   if(fBeamType==0){
185     // pp analysis
186     switch(fNbDimensions){
187       case 1:   dims[0] = 0;
188                 break;
189       case 2:   for(Int_t i = 0; i < 2; i++) dims[i] = i;
190                 break;
191       case 3:   for(Int_t i = 0; i < 3; i++) dims[i] = i;
192                 break;
193       default:
194                 AliError("Container with this number of dimensions not foreseen (yet)");
195                 return kFALSE;
196     };
197   }
198
199   if(fBeamType==1){
200     // PbPb analysis; centrality as first dimension
201     Int_t nbDimensions = fNbDimensions;
202     fNbDimensions = fNbDimensions + 1;
203     switch(nbDimensions){
204       case 1: dims[0] = 5;
205               dims[1] = 0;
206               break;
207       case 2: dims[0] = 5;
208               for(Int_t i = 0; i < 2; i++) dims[(i+1)] = i;
209               break;
210       case 3: dims[0] = 5;
211               for(Int_t i = 0; i < 3; i++) dims[(i+1)] = i;
212               break;
213       default:
214               AliError("Container with this number of dimensions not foreseen (yet)");
215               return kFALSE;
216     };
217   }
218
219   // Data container: raw spectrum + hadron contamination  
220   AliCFContainer *datacontainer = 0x0; 
221   if(fInclusiveSpectrum) {
222     datacontainer = datahfecontainer->GetCFContainer("recTrackContReco");
223   }
224   else{
225
226       datacontainer = datahfecontainer->MakeMergedCFContainer("sumreco","sumreco","recTrackContReco:recTrackContDEReco");
227   }
228   AliCFContainer *contaminationcontainer = datahfecontainer->GetCFContainer("hadronicBackground");
229   if((!datacontainer) || (!contaminationcontainer)) return kFALSE;
230
231   AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
232   AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, dims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
233   if((!datacontainerD) || (!contaminationcontainerD)) return kFALSE;
234
235   SetContainer(datacontainerD,AliHFEspectrum::kDataContainer);
236   SetContainer(contaminationcontainerD,AliHFEspectrum::kBackgroundData);
237
238   // MC container: ESD/MC efficiency maps + MC/MC efficiency maps 
239   AliCFContainer *mccontaineresd = 0x0;
240   AliCFContainer *mccontaineresdbg = 0x0;
241   AliCFContainer *mccontainermc = 0x0;
242   AliCFContainer *mccontainermcbg = 0x0;
243   AliCFContainer *nonHFEweightedContainer = 0x0;
244   AliCFContainer *convweightedContainer = 0x0;
245   AliCFContainer *nonHFEtempContainer = 0x0;//temporary container to be sliced for the fnonHFESourceContainers
246   AliCFContainer *convtempContainer = 0x0;//temporary container to be sliced for the fConvSourceContainers
247    
248   if(fInclusiveSpectrum) {
249     mccontaineresd = mchfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco");
250     mccontainermc = mchfecontainer->MakeMergedCFContainer("summc","summc","MCTrackCont:recTrackContMC");
251   }
252   else {
253     mccontaineresd = mchfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco:recTrackContDEReco");
254     mccontaineresdbg = bghfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco:recTrackContDEReco");
255     mccontainermc = mchfecontainer->MakeMergedCFContainer("summc","summc","MCTrackCont:recTrackContMC:recTrackContDEMC");
256     mccontainermcbg = bghfecontainer->MakeMergedCFContainer("summcbg","summcbg","MCTrackCont:recTrackContMC:recTrackContDEMC");
257
258     if(fNonHFEsyst){   
259       const Char_t *sourceName[kElecBgSources]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
260       const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
261       for(Int_t iSource = 0; iSource < kElecBgSources; iSource++){
262         for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
263           nonHFEtempContainer =  bghfecontainer->GetCFContainer(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]));
264           convtempContainer =  bghfecontainer->GetCFContainer(Form("conversionElecs%s%s",sourceName[iSource],levelName[iLevel]));
265           for(Int_t icentr=0;icentr<kNcentr;icentr++)
266           {
267               if(fBeamType==0)
268               {
269                   fConvSourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(convtempContainer, fNbDimensions, dims, -1, fChargeChoosen);
270                   fNonHFESourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(nonHFEtempContainer, fNbDimensions, dims, -1, fChargeChoosen);
271               }
272               if(fBeamType==1)
273               {
274               
275                 fConvSourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(convtempContainer, fNbDimensions, dims, -1, fChargeChoosen,icentr,icentr);
276                 fNonHFESourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(nonHFEtempContainer, fNbDimensions, dims, -1, fChargeChoosen,icentr,icentr);
277               }
278 //            if((!fConvSourceContainer[iSource][iLevel][icentr])||(!fNonHFESourceContainer[iSource][iLevel])) return kFALSE;
279           }
280           if(fBeamType == 1)break;
281         }
282       }
283     }
284     // else{      
285       nonHFEweightedContainer = bghfecontainer->GetCFContainer("mesonElecs");
286       convweightedContainer = bghfecontainer->GetCFContainer("conversionElecs");
287       if((!convweightedContainer)||(!nonHFEweightedContainer)) return kFALSE;  
288       //}
289   }
290   if((!mccontaineresd) || (!mccontainermc)) return kFALSE;  
291   
292   Int_t source = -1;
293   if(!fInclusiveSpectrum) source = 1; //beauty
294   AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, dims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
295   AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
296   if((!mccontaineresdD) || (!mccontainermcD)) return kFALSE;
297   SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerMC);
298   SetContainer(mccontaineresdD,AliHFEspectrum::kMCContainerESD);
299
300   // set charm, nonHFE container to estimate BG
301   if(!fInclusiveSpectrum){
302    source = 0; //charm
303    mccontainermcD = GetSlicedContainer(mccontainermcbg, fNbDimensions, dims, source, fChargeChoosen);
304    SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerCharmMC);
305
306    //if(!fNonHFEsyst){
307      AliCFContainer *nonHFEweightedContainerD = GetSlicedContainer(nonHFEweightedContainer, fNbDimensions, dims, -1, fChargeChoosen);
308      SetContainer(nonHFEweightedContainerD,AliHFEspectrum::kMCWeightedContainerNonHFEESD);
309      AliCFContainer *convweightedContainerD = GetSlicedContainer(convweightedContainer, fNbDimensions, dims, -1, fChargeChoosen);
310      SetContainer(convweightedContainerD,AliHFEspectrum::kMCWeightedContainerConversionESD);
311      //}
312
313      SetParameterizedEff(mccontainermc, mccontainermcbg, mccontaineresd, mccontaineresdbg, dims);
314
315   }
316   // MC container: correlation matrix
317   THnSparseF *mccorrelation = 0x0;
318   if(fInclusiveSpectrum) {
319     if(fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 2)) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
320     else if(fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 1)) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
321     else if(fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD)) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
322     else if(fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD - 1)) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
323     else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
324     
325     if(!mccorrelation) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
326   }
327   else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID"); // we confirmed that we get same result by using it instead of correlationstepafterDE
328   //else mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterDE");
329   if(!mccorrelation) return kFALSE;
330   Int_t testCentralityLow = fTestCentralityLow;
331   Int_t testCentralityHigh = fTestCentralityHigh;
332   if(fFillMoreCorrelationMatrix) {
333     testCentralityLow = fTestCentralityLow-1;
334     testCentralityHigh = fTestCentralityHigh+1;
335   }
336   THnSparseF *mccorrelationD = GetSlicedCorrelation(mccorrelation, fNbDimensions, dims,testCentralityLow,testCentralityHigh);
337   if(!mccorrelationD) {
338     printf("No correlation\n");
339     return kFALSE;
340   }
341   SetCorrelation(mccorrelationD);
342
343   // V0 container Electron, pt eta phi
344   if(v0hfecontainer) {
345     AliCFContainer *containerV0 = v0hfecontainer->GetCFContainer("taggedTrackContainerReco");
346     if(!containerV0) return kFALSE;
347     AliCFContainer *containerV0Electron = GetSlicedContainer(containerV0, fNbDimensions, dims, AliPID::kElectron,fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
348     if(!containerV0Electron) return kFALSE;
349     SetContainer(containerV0Electron,AliHFEspectrum::kDataContainerV0);
350   }
351  
352
353   if(fDebugLevel>0){
354    
355     AliCFDataGrid *contaminationspectrum = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(contaminationcontainer,1))->Clone();
356     contaminationspectrum->SetName("contaminationspectrum");
357     TCanvas * ccontaminationspectrum = new TCanvas("contaminationspectrum","contaminationspectrum",1000,700);
358     ccontaminationspectrum->Divide(3,1);
359     ccontaminationspectrum->cd(1);
360     TH2D * contaminationspectrum2dpteta = (TH2D *) contaminationspectrum->Project(1,0);
361     TH2D * contaminationspectrum2dptphi = (TH2D *) contaminationspectrum->Project(2,0);
362     TH2D * contaminationspectrum2detaphi = (TH2D *) contaminationspectrum->Project(1,2);
363     contaminationspectrum2dpteta->SetStats(0);
364     contaminationspectrum2dpteta->SetTitle("");
365     contaminationspectrum2dpteta->GetXaxis()->SetTitle("#eta");
366     contaminationspectrum2dpteta->GetYaxis()->SetTitle("p_{T} [GeV/c]");
367     contaminationspectrum2dptphi->SetStats(0);
368     contaminationspectrum2dptphi->SetTitle("");
369     contaminationspectrum2dptphi->GetXaxis()->SetTitle("#phi [rad]");
370     contaminationspectrum2dptphi->GetYaxis()->SetTitle("p_{T} [GeV/c]");
371     contaminationspectrum2detaphi->SetStats(0);
372     contaminationspectrum2detaphi->SetTitle("");
373     contaminationspectrum2detaphi->GetXaxis()->SetTitle("#eta");
374     contaminationspectrum2detaphi->GetYaxis()->SetTitle("#phi [rad]");
375     contaminationspectrum2dptphi->Draw("colz");
376     ccontaminationspectrum->cd(2);
377     contaminationspectrum2dpteta->Draw("colz");
378     ccontaminationspectrum->cd(3);
379     contaminationspectrum2detaphi->Draw("colz");
380
381     TCanvas * ccorrelation = new TCanvas("ccorrelation","ccorrelation",1000,700);
382     ccorrelation->cd(1);
383     if(mccorrelationD) {
384       if(fBeamType==0){
385         TH2D * ptcorrelation = (TH2D *) mccorrelationD->Projection(fNbDimensions,0);
386         ptcorrelation->Draw("colz");
387       }
388       if(fBeamType==1){
389         TH2D * ptcorrelation = (TH2D *) mccorrelationD->Projection(fNbDimensions+1,1);
390         ptcorrelation->Draw("colz");
391       }
392     }
393     if(fWriteToFile){ 
394       ccontaminationspectrum->SaveAs("contaminationspectrum.eps");
395       ccorrelation->SaveAs("correlationMatrix.eps");
396     }
397   }
398
399   TFile *file = TFile::Open("tests.root","recreate");
400   datacontainerD->Write("data");
401   mccontainermcD->Write("mcefficiency");
402   mccorrelationD->Write("correlationmatrix");
403   file->Close();
404
405   return kTRUE;
406 }
407
408
409 //____________________________________________________________
410 void AliHFEspectrum::CallInputFileForBeauty2ndMethod(){
411   //
412   // get spectrum for beauty 2nd method
413   //
414   //
415     TFile *inputfile2ndmethod=TFile::Open(fkBeauty2ndMethodfilename);
416     fBSpectrum2ndMethod = new TH1D(*static_cast<TH1D*>(inputfile2ndmethod->Get("BSpectrum")));
417 }
418
419
420 //____________________________________________________________
421 Bool_t AliHFEspectrum::Correct(Bool_t subtractcontamination){
422   //
423   // Correct the spectrum for efficiency and unfolding
424   // with both method and compare
425   //
426   
427   gStyle->SetPalette(1);
428   gStyle->SetOptStat(1111);
429   gStyle->SetPadBorderMode(0);
430   gStyle->SetCanvasColor(10);
431   gStyle->SetPadLeftMargin(0.13);
432   gStyle->SetPadRightMargin(0.13);
433
434   printf("Steps are: stepdata %d, stepMC %d, steptrue %d, stepV0after %d, stepV0before %d\n",fStepData,fStepMC,fStepTrue,fStepAfterCutsV0,fStepBeforeCutsV0);
435
436   ///////////////////////////
437   // Check initialization
438   ///////////////////////////
439
440   if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
441     AliInfo("You have to init before");
442     return kFALSE;
443   }
444   
445   if((fStepTrue < 0) && (fStepMC < 0) && (fStepData < 0)) {
446     AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
447     return kFALSE;
448   }
449  
450   SetNumberOfIteration(10);
451   SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
452     
453   AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
454   //////////////////////////////////
455   // Subtract hadron background
456   /////////////////////////////////
457   AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
458   if(subtractcontamination) {
459     dataspectrumaftersubstraction = SubtractBackground(kTRUE);
460     dataGridAfterFirstSteps = dataspectrumaftersubstraction;
461   }
462
463   ////////////////////////////////////////////////
464   // Correct for TPC efficiency from V0
465   ///////////////////////////////////////////////
466   AliCFDataGrid *dataspectrumafterV0efficiencycorrection = 0x0;
467   AliCFContainer *dataContainerV0 = GetContainer(kDataContainerV0);
468   if(dataContainerV0){printf("Got the V0 container\n");
469     dataspectrumafterV0efficiencycorrection = CorrectV0Efficiency(dataspectrumaftersubstraction);
470     dataGridAfterFirstSteps = dataspectrumafterV0efficiencycorrection;  
471   }
472
473   //////////////////////////////////////////////////////////////////////////////
474   // Correct for efficiency parametrized (if TPC efficiency is parametrized)
475   /////////////////////////////////////////////////////////////////////////////
476   AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
477   if(fEfficiencyFunction){
478     dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
479     dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;  
480   }
481     
482   ///////////////
483   // Unfold
484   //////////////
485   TList *listunfolded = Unfold(dataGridAfterFirstSteps);
486   if(!listunfolded){
487     printf("Unfolded failed\n");
488     return kFALSE;
489   }
490   THnSparse *correctedspectrum = (THnSparse *) listunfolded->At(0);
491   THnSparse *residualspectrum = (THnSparse *) listunfolded->At(1);
492   if(!correctedspectrum){
493     AliError("No corrected spectrum\n");
494     return kFALSE;
495   }
496   if(!residualspectrum){
497     AliError("No residul spectrum\n");
498     return kFALSE;
499   }   
500   
501   /////////////////////
502   // Simply correct
503   ////////////////////
504   AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);
505   
506
507   //////////
508   // Plot
509   //////////
510   if(fDebugLevel > 0.0) {
511
512     Int_t ptpr = 0;
513     if(fBeamType==0) ptpr=0;
514     if(fBeamType==1) ptpr=1;
515   
516     TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
517     ccorrected->Divide(2,1);
518     ccorrected->cd(1);
519     gPad->SetLogy();
520     TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
521     correctedspectrumD->SetTitle("");
522     correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
523     correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
524     correctedspectrumD->SetMarkerStyle(26);
525     correctedspectrumD->SetMarkerColor(kBlue);
526     correctedspectrumD->SetLineColor(kBlue);
527     correctedspectrumD->Draw("AP");
528     TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
529     alltogetherspectrumD->SetTitle("");
530     alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
531     alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
532     alltogetherspectrumD->SetMarkerStyle(25);
533     alltogetherspectrumD->SetMarkerColor(kBlack);
534     alltogetherspectrumD->SetLineColor(kBlack);
535     alltogetherspectrumD->Draw("P");
536     TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
537     legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
538     legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
539     legcorrected->Draw("same");
540     ccorrected->cd(2);
541     TH1D *correctedTH1D = correctedspectrum->Projection(ptpr);
542     TH1D *alltogetherTH1D = (TH1D *) alltogetherCorrection->Project(ptpr);
543     TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
544     ratiocorrected->SetName("ratiocorrected");
545     ratiocorrected->SetTitle("");
546     ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
547     ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
548     ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
549     ratiocorrected->SetStats(0);
550     ratiocorrected->Draw();
551     if(fWriteToFile)ccorrected->SaveAs("CorrectedPbPb.eps");
552
553     //TH1D unfoldingspectrac[fNCentralityBinAtTheEnd];
554     //TGraphErrors unfoldingspectracn[fNCentralityBinAtTheEnd];
555     //TH1D correctedspectrac[fNCentralityBinAtTheEnd];
556     //TGraphErrors correctedspectracn[fNCentralityBinAtTheEnd];
557
558     TH1D *unfoldingspectrac = new TH1D[fNCentralityBinAtTheEnd];
559     TGraphErrors *unfoldingspectracn = new TGraphErrors[fNCentralityBinAtTheEnd];
560     TH1D *correctedspectrac = new TH1D[fNCentralityBinAtTheEnd];
561     TGraphErrors *correctedspectracn = new TGraphErrors[fNCentralityBinAtTheEnd];
562
563     if(fBeamType==1) {
564
565       TCanvas * ccorrectedallspectra = new TCanvas("correctedallspectra","correctedallspectra",1000,700);
566       ccorrectedallspectra->Divide(2,1);
567       TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
568       TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
569       
570       THnSparseF* sparsesu = (THnSparseF *) correctedspectrum;
571       TAxis *cenaxisa = sparsesu->GetAxis(0);
572       THnSparseF* sparsed = (THnSparseF *) alltogetherCorrection->GetGrid();
573       TAxis *cenaxisb = sparsed->GetAxis(0);
574       Int_t nbbin = cenaxisb->GetNbins();
575       Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
576       Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
577       for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
578         TString titlee("corrected_centrality_bin_");
579         titlee += "[";
580         titlee += fLowBoundaryCentralityBinAtTheEnd[binc];
581         titlee += "_";
582         titlee += fHighBoundaryCentralityBinAtTheEnd[binc];
583         titlee += "[";
584         TString titleec("corrected_check_projection_bin_");
585         titleec += "[";
586         titleec += fLowBoundaryCentralityBinAtTheEnd[binc];
587         titleec += "_";
588         titleec += fHighBoundaryCentralityBinAtTheEnd[binc];
589         titleec += "[";
590         TString titleenameunotnormalized("Unfolded_Notnormalized_centrality_bin_");
591         titleenameunotnormalized += "[";
592         titleenameunotnormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
593         titleenameunotnormalized += "_";
594         titleenameunotnormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
595         titleenameunotnormalized += "[";
596         TString titleenameunormalized("Unfolded_normalized_centrality_bin_");
597         titleenameunormalized += "[";
598         titleenameunormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
599         titleenameunormalized += "_";
600         titleenameunormalized += fHighBoundaryCentralityBinAtTheEnd[binc];      
601         titleenameunormalized += "[";
602         TString titleenamednotnormalized("Dirrectcorrected_Notnormalized_centrality_bin_");
603         titleenamednotnormalized += "[";
604         titleenamednotnormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
605         titleenamednotnormalized += "_";
606         titleenamednotnormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
607         titleenamednotnormalized += "[";
608         TString titleenamednormalized("Dirrectedcorrected_normalized_centrality_bin_");
609         titleenamednormalized += "[";
610         titleenamednormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
611         titleenamednormalized += "_";
612         titleenamednormalized += fHighBoundaryCentralityBinAtTheEnd[binc];      
613         titleenamednormalized += "[";
614         Int_t nbEvents = 0;
615         for(Int_t k = fLowBoundaryCentralityBinAtTheEnd[binc]; k < fHighBoundaryCentralityBinAtTheEnd[binc]; k++) {
616           printf("Number of events %d in the bin %d added!!!\n",fNEvents[k],k);
617           nbEvents += fNEvents[k];
618         }
619         Double_t lowedgega = cenaxisa->GetBinLowEdge(fLowBoundaryCentralityBinAtTheEnd[binc]+1);
620         Double_t upedgega = cenaxisa->GetBinUpEdge(fHighBoundaryCentralityBinAtTheEnd[binc]);
621         printf("Bin Low edge %f, up edge %f for a\n",lowedgega,upedgega);
622         Double_t lowedgegb = cenaxisb->GetBinLowEdge(fLowBoundaryCentralityBinAtTheEnd[binc]+1);
623         Double_t upedgegb = cenaxisb->GetBinUpEdge(fHighBoundaryCentralityBinAtTheEnd[binc]);
624         printf("Bin Low edge %f, up edge %f for b\n",lowedgegb,upedgegb);
625         cenaxisa->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
626         cenaxisb->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
627         TCanvas * ccorrectedcheck = new TCanvas((const char*) titleec,(const char*) titleec,1000,700);
628         ccorrectedcheck->cd(1);
629         TH1D *aftersuc = (TH1D *) sparsesu->Projection(0);
630         TH1D *aftersdc = (TH1D *) sparsed->Projection(0);
631         aftersuc->Draw();
632         aftersdc->Draw("same");
633         TCanvas * ccorrectede = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
634         ccorrectede->Divide(2,1);
635         ccorrectede->cd(1);
636         gPad->SetLogy();
637         TH1D *aftersu = (TH1D *) sparsesu->Projection(1);
638         CorrectFromTheWidth(aftersu);
639         aftersu->SetName((const char*)titleenameunotnormalized);
640         unfoldingspectrac[binc] = *aftersu;
641         ccorrectede->cd(1);
642         TGraphErrors* aftersun = NormalizeTH1N(aftersu,nbEvents);
643         aftersun->SetTitle("");
644         aftersun->GetYaxis()->SetTitleOffset(1.5);
645         aftersun->GetYaxis()->SetRangeUser(0.000000001,1.0);
646         aftersun->SetMarkerStyle(26);
647         aftersun->SetMarkerColor(kBlue);
648         aftersun->SetLineColor(kBlue);
649         aftersun->Draw("AP");
650         aftersun->SetName((const char*)titleenameunormalized);
651         unfoldingspectracn[binc] = *aftersun;
652         ccorrectede->cd(1);
653         TH1D *aftersd = (TH1D *) sparsed->Projection(1);
654         CorrectFromTheWidth(aftersd);
655         aftersd->SetName((const char*)titleenamednotnormalized);
656         correctedspectrac[binc] = *aftersd;
657         ccorrectede->cd(1);
658         TGraphErrors* aftersdn = NormalizeTH1N(aftersd,nbEvents);
659         aftersdn->SetTitle("");
660         aftersdn->GetYaxis()->SetTitleOffset(1.5);
661         aftersdn->GetYaxis()->SetRangeUser(0.000000001,1.0);
662         aftersdn->SetMarkerStyle(25);
663         aftersdn->SetMarkerColor(kBlack);
664         aftersdn->SetLineColor(kBlack);
665         aftersdn->Draw("P");
666         aftersdn->SetName((const char*)titleenamednormalized);
667         correctedspectracn[binc] = *aftersdn;
668         TLegend *legcorrectedud = new TLegend(0.4,0.6,0.89,0.89);
669         legcorrectedud->AddEntry(aftersun,"Corrected","p");
670         legcorrectedud->AddEntry(aftersdn,"Alltogether","p");
671         legcorrectedud->Draw("same");
672         ccorrectedallspectra->cd(1);
673         gPad->SetLogy();
674         TH1D *aftersunn = (TH1D *) aftersun->Clone();
675         aftersunn->SetMarkerStyle(stylee[binc]);
676         aftersunn->SetMarkerColor(colorr[binc]);
677         if(binc==0) aftersunn->Draw("AP");
678         else aftersunn->Draw("P");
679         legtotal->AddEntry(aftersunn,(const char*) titlee,"p");
680         ccorrectedallspectra->cd(2);
681         gPad->SetLogy();
682         TH1D *aftersdnn = (TH1D *) aftersdn->Clone();
683         aftersdnn->SetMarkerStyle(stylee[binc]);
684         aftersdnn->SetMarkerColor(colorr[binc]);
685         if(binc==0) aftersdnn->Draw("AP");
686         else aftersdnn->Draw("P");
687         legtotalg->AddEntry(aftersdnn,(const char*) titlee,"p");
688         ccorrectede->cd(2);
689         TH1D* ratiocorrectedbinc = (TH1D*)aftersu->Clone();
690         TString titleee("ratiocorrected_bin_");
691         titleee += binc;
692         ratiocorrectedbinc->SetName((const char*) titleee);
693         ratiocorrectedbinc->SetTitle("");
694         ratiocorrectedbinc->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
695         ratiocorrectedbinc->GetXaxis()->SetTitle("p_{T} [GeV/c]");
696         ratiocorrectedbinc->Divide(aftersu,aftersd,1,1);
697         ratiocorrectedbinc->SetStats(0);
698         ratiocorrectedbinc->Draw();
699       }
700
701       ccorrectedallspectra->cd(1);
702       legtotal->Draw("same");
703       ccorrectedallspectra->cd(2);
704       legtotalg->Draw("same");
705       
706       cenaxisa->SetRange(0,nbbin);
707       cenaxisb->SetRange(0,nbbin);
708       if(fWriteToFile) ccorrectedallspectra->SaveAs("CorrectedPbPb.eps");
709     }
710
711     // Dump to file if needed
712     if(fDumpToFile) {
713       TFile *out = new TFile("finalSpectrum.root","recreate");
714       correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
715       correctedspectrumD->Write();
716       alltogetherspectrumD->SetName("AlltogetherSpectrum");
717       alltogetherspectrumD->Write();
718       ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
719       ratiocorrected->Write();
720       correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
721       correctedspectrum->Write();
722       alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
723       alltogetherCorrection->Write();
724       for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
725               unfoldingspectrac[binc].Write();
726               unfoldingspectracn[binc].Write();
727               correctedspectrac[binc].Write();
728               correctedspectracn[binc].Write();
729       }
730       out->Close(); delete out;
731     }
732
733     if (unfoldingspectrac) delete[] unfoldingspectrac;
734     if (unfoldingspectracn)  delete[] unfoldingspectracn;
735     if (correctedspectrac) delete[] correctedspectrac;
736     if (correctedspectracn) delete[] correctedspectracn;
737
738   }
739
740   return kTRUE;
741 }
742
743 //____________________________________________________________
744 Bool_t AliHFEspectrum::CorrectBeauty(Bool_t subtractcontamination){
745   //
746   // Correct the spectrum for efficiency and unfolding for beauty analysis
747   // with both method and compare
748   //
749   
750   gStyle->SetPalette(1);
751   gStyle->SetOptStat(1111);
752   gStyle->SetPadBorderMode(0);
753   gStyle->SetCanvasColor(10);
754   gStyle->SetPadLeftMargin(0.13);
755   gStyle->SetPadRightMargin(0.13);
756
757   ///////////////////////////
758   // Check initialization
759   ///////////////////////////
760
761   if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
762     AliInfo("You have to init before");
763     return kFALSE;
764   }
765   
766   if((fStepTrue == 0) && (fStepMC == 0) && (fStepData == 0)) {
767     AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
768     return kFALSE;
769   }
770  
771   SetNumberOfIteration(10);
772   SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
773     
774   AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
775   //////////////////////////////////
776   // Subtract hadron background
777   /////////////////////////////////
778   AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
779   AliCFDataGrid *unnormalizedRawSpectrum = 0x0;
780   TGraphErrors *gNormalizedRawSpectrum = 0x0;
781   if(subtractcontamination) {
782       if(!fBeauty2ndMethod) dataspectrumaftersubstraction = SubtractBackground(kTRUE);
783       else dataspectrumaftersubstraction = GetRawBspectra2ndMethod();
784       unnormalizedRawSpectrum = (AliCFDataGrid*)dataspectrumaftersubstraction->Clone();
785       dataGridAfterFirstSteps = dataspectrumaftersubstraction;
786       gNormalizedRawSpectrum = Normalize(unnormalizedRawSpectrum);
787   }
788
789   printf("after normalize getting IP \n");
790
791   /////////////////////////////////////////////////////////////////////////////////////////
792   // Correct for IP efficiency for beauty electrons after subtracting all the backgrounds
793   /////////////////////////////////////////////////////////////////////////////////////////
794
795   AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
796   AliCFDataGrid *dataspectrumafterV0efficiencycorrection = 0x0;
797   AliCFContainer *dataContainerV0 = GetContainer(kDataContainerV0);
798
799   if(fEfficiencyFunction){
800     dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
801     dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;
802   }
803   else if(dataContainerV0){
804     dataspectrumafterV0efficiencycorrection = CorrectV0Efficiency(dataspectrumaftersubstraction);
805     dataGridAfterFirstSteps = dataspectrumafterV0efficiencycorrection;  
806   }  
807  
808
809
810   ///////////////
811   // Unfold
812   //////////////
813   TList *listunfolded = Unfold(dataGridAfterFirstSteps);
814   if(!listunfolded){
815     printf("Unfolded failed\n");
816     return kFALSE;
817   }
818   THnSparse *correctedspectrum = (THnSparse *) listunfolded->At(0);
819   THnSparse *residualspectrum = (THnSparse *) listunfolded->At(1);
820   if(!correctedspectrum){
821     AliError("No corrected spectrum\n");
822     return kFALSE;
823   }
824   if(!residualspectrum){
825     AliError("No residual spectrum\n");
826     return kFALSE;
827   }   
828   
829   /////////////////////
830   // Simply correct
831   ////////////////////
832
833   AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);
834   
835
836   //////////
837   // Plot
838   //////////
839
840   if(fDebugLevel > 0.0) {
841
842     Int_t ptpr = 0;
843     if(fBeamType==0) ptpr=0;
844     if(fBeamType==1) ptpr=1;
845   
846     TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
847     ccorrected->Divide(2,1);
848     ccorrected->cd(1);
849     gPad->SetLogy();
850     TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
851     correctedspectrumD->SetTitle("");
852     correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
853     correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
854     correctedspectrumD->SetMarkerStyle(26);
855     correctedspectrumD->SetMarkerColor(kBlue);
856     correctedspectrumD->SetLineColor(kBlue);
857     correctedspectrumD->Draw("AP");
858     TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
859     alltogetherspectrumD->SetTitle("");
860     alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
861     alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
862     alltogetherspectrumD->SetMarkerStyle(25);
863     alltogetherspectrumD->SetMarkerColor(kBlack);
864     alltogetherspectrumD->SetLineColor(kBlack);
865     alltogetherspectrumD->Draw("P");
866     TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
867     legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
868     legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
869     legcorrected->Draw("same");
870     ccorrected->cd(2);
871     TH1D *correctedTH1D = correctedspectrum->Projection(ptpr);
872     TH1D *alltogetherTH1D = (TH1D *) alltogetherCorrection->Project(ptpr);
873     TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
874     ratiocorrected->SetName("ratiocorrected");
875     ratiocorrected->SetTitle("");
876     ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
877     ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
878     ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
879     ratiocorrected->SetStats(0);
880     ratiocorrected->Draw();
881     if(fWriteToFile) ccorrected->SaveAs("CorrectedBeauty.eps");
882
883     if(fBeamType == 0){
884         if(fNonHFEsyst){
885             CalculateNonHFEsyst(0);
886         }
887     }
888
889     // Dump to file if needed
890
891     if(fDumpToFile) {
892         // to do centrality dependent
893
894       TFile *out;
895       out = new TFile("finalSpectrum.root","recreate");
896       out->cd();
897       //
898       correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
899       correctedspectrumD->Write();
900       alltogetherspectrumD->SetName("AlltogetherSpectrum");
901       alltogetherspectrumD->Write();
902       ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
903       ratiocorrected->Write();
904       //
905       correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
906       correctedspectrum->Write();
907       alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
908       alltogetherCorrection->Write();
909       //
910       if(unnormalizedRawSpectrum) {
911       unnormalizedRawSpectrum->SetName("beautyAfterIP");
912       unnormalizedRawSpectrum->Write();
913       }
914
915       if(gNormalizedRawSpectrum){
916         gNormalizedRawSpectrum->SetName("normalizedBeautyAfterIP");
917         gNormalizedRawSpectrum->Write();
918       }
919
920       if(fBeamType==0) {
921           Int_t countpp=0;
922           fEfficiencyCharmSigD[countpp]->SetTitle(Form("IPEfficiencyForCharmSigCent%i",countpp));
923           fEfficiencyCharmSigD[countpp]->SetName(Form("IPEfficiencyForCharmSigCent%i",countpp));
924           fEfficiencyCharmSigD[countpp]->Write();
925           fEfficiencyBeautySigD[countpp]->SetTitle(Form("IPEfficiencyForBeautySigCent%i",countpp));
926           fEfficiencyBeautySigD[countpp]->SetName(Form("IPEfficiencyForBeautySigCent%i",countpp));
927           fEfficiencyBeautySigD[countpp]->Write();
928           fCharmEff[countpp]->SetTitle(Form("IPEfficiencyForCharmCent%i",countpp));
929           fCharmEff[countpp]->SetName(Form("IPEfficiencyForCharmCent%i",countpp));
930           fCharmEff[countpp]->Write();
931           fBeautyEff[countpp]->SetTitle(Form("IPEfficiencyForBeautyCent%i",countpp));
932           fBeautyEff[countpp]->SetName(Form("IPEfficiencyForBeautyCent%i",countpp));
933           fBeautyEff[countpp]->Write();
934           fConversionEff[countpp]->SetTitle(Form("IPEfficiencyForConversionCent%i",countpp));
935           fConversionEff[countpp]->SetName(Form("IPEfficiencyForConversionCent%i",countpp));
936           fConversionEff[countpp]->Write();
937           fNonHFEEff[countpp]->SetTitle(Form("IPEfficiencyForNonHFECent%i",countpp));
938           fNonHFEEff[countpp]->SetName(Form("IPEfficiencyForNonHFECent%i",countpp));
939           fNonHFEEff[countpp]->Write();
940       }
941
942       if(fBeamType==1) {
943
944           TGraphErrors* correctedspectrumDc[kCentrality];
945           TGraphErrors* alltogetherspectrumDc[kCentrality];
946           for(Int_t i=0;i<kCentrality-2;i++)
947           {
948               correctedspectrum->GetAxis(0)->SetRange(i+1,i+1);
949               correctedspectrumDc[i] = Normalize(correctedspectrum,i);
950               if(correctedspectrumDc[i]){
951                 correctedspectrumDc[i]->SetTitle(Form("UnfoldingCorrectedSpectrum_%i",i));
952                 correctedspectrumDc[i]->SetName(Form("UnfoldingCorrectedSpectrum_%i",i));
953                 correctedspectrumDc[i]->Write();
954               }
955               alltogetherCorrection->GetAxis(0)->SetRange(i+1,i+1);
956               alltogetherspectrumDc[i] = Normalize(alltogetherCorrection,i);
957               if(alltogetherspectrumDc[i]){
958                 alltogetherspectrumDc[i]->SetTitle(Form("AlltogetherSpectrum_%i",i));
959                 alltogetherspectrumDc[i]->SetName(Form("AlltogetherSpectrum_%i",i));
960                 alltogetherspectrumDc[i]->Write();
961               }
962             
963               TH1D *centrcrosscheck = correctedspectrum->Projection(0);
964               centrcrosscheck->SetTitle(Form("centrality_%i",i));
965               centrcrosscheck->SetName(Form("centrality_%i",i));
966               centrcrosscheck->Write();
967
968               TH1D *correctedTH1Dc = correctedspectrum->Projection(ptpr);
969               TH1D *alltogetherTH1Dc = (TH1D *) alltogetherCorrection->Project(ptpr);
970
971               TH1D *centrcrosscheck2 =  (TH1D *) alltogetherCorrection->Project(0);
972               centrcrosscheck2->SetTitle(Form("centrality2_%i",i));
973               centrcrosscheck2->SetName(Form("centrality2_%i",i));
974               centrcrosscheck2->Write();
975
976               TH1D* ratiocorrectedc = (TH1D*)correctedTH1D->Clone();
977               ratiocorrectedc->Divide(correctedTH1Dc,alltogetherTH1Dc,1,1);
978               ratiocorrectedc->SetTitle(Form("RatioUnfoldingAlltogetherSpectrum_%i",i));
979               ratiocorrectedc->SetName(Form("RatioUnfoldingAlltogetherSpectrum_%i",i));
980               ratiocorrectedc->Write();
981
982               fEfficiencyCharmSigD[i]->SetTitle(Form("IPEfficiencyForCharmSigCent%i",i));
983               fEfficiencyCharmSigD[i]->SetName(Form("IPEfficiencyForCharmSigCent%i",i));
984               fEfficiencyCharmSigD[i]->Write();
985               fEfficiencyBeautySigD[i]->SetTitle(Form("IPEfficiencyForBeautySigCent%i",i));
986               fEfficiencyBeautySigD[i]->SetName(Form("IPEfficiencyForBeautySigCent%i",i));
987               fEfficiencyBeautySigD[i]->Write();
988               fCharmEff[i]->SetTitle(Form("IPEfficiencyForCharmCent%i",i));
989               fCharmEff[i]->SetName(Form("IPEfficiencyForCharmCent%i",i));
990               fCharmEff[i]->Write();
991               fBeautyEff[i]->SetTitle(Form("IPEfficiencyForBeautyCent%i",i));
992               fBeautyEff[i]->SetName(Form("IPEfficiencyForBeautyCent%i",i));
993               fBeautyEff[i]->Write();
994               fConversionEff[i]->SetTitle(Form("IPEfficiencyForConversionCent%i",i));
995               fConversionEff[i]->SetName(Form("IPEfficiencyForConversionCent%i",i));
996               fConversionEff[i]->Write();
997               fNonHFEEff[i]->SetTitle(Form("IPEfficiencyForNonHFECent%i",i));
998               fNonHFEEff[i]->SetName(Form("IPEfficiencyForNonHFECent%i",i));
999               fNonHFEEff[i]->Write();
1000           }
1001
1002       }
1003
1004       out->Close(); 
1005       delete out;
1006     }
1007   }
1008
1009   return kTRUE;
1010 }
1011
1012 //____________________________________________________________
1013 AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
1014   //
1015   // Apply background subtraction
1016   //
1017
1018     Int_t ptpr = 0;
1019     Int_t nbins=1;
1020     if(fBeamType==0)
1021     {
1022         ptpr=0;
1023         nbins=1;
1024     }
1025     if(fBeamType==1)
1026     {
1027         ptpr=1;
1028         nbins=2;
1029     }
1030
1031   // Raw spectrum
1032   AliCFContainer *dataContainer = GetContainer(kDataContainer);
1033   if(!dataContainer){
1034     AliError("Data Container not available");
1035     return NULL;
1036   }
1037   printf("Step data: %d\n",fStepData);
1038   AliCFDataGrid *spectrumSubtracted = new AliCFDataGrid("spectrumSubtracted", "Data Grid for spectrum after Background subtraction", *dataContainer,fStepData);
1039
1040   AliCFDataGrid *dataspectrumbeforesubstraction = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(GetContainer(kDataContainer),fStepData))->Clone();
1041   dataspectrumbeforesubstraction->SetName("dataspectrumbeforesubstraction"); 
1042  
1043
1044   // Background Estimate
1045   AliCFContainer *backgroundContainer = GetContainer(kBackgroundData);
1046   if(!backgroundContainer){
1047     AliError("MC background container not found");
1048     return NULL;
1049   }
1050  
1051   Int_t stepbackground = 1; // 2 for !fInclusiveSpectrum analysis(old method)
1052   AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ContaminationGrid","ContaminationGrid",*backgroundContainer,stepbackground);
1053
1054   if(!fInclusiveSpectrum){
1055     //Background subtraction for IP analysis
1056
1057     TH1D *incElecCent[kCentrality-1];
1058     TH1D *charmCent[kCentrality-1];
1059     TH1D *convCent[kCentrality-1];
1060     TH1D *nonHFECent[kCentrality-1]; 
1061     TH1D *subtractedCent[kCentrality-1];
1062     TH1D *measuredTH1Draw = (TH1D *) dataspectrumbeforesubstraction->Project(ptpr);
1063     CorrectFromTheWidth(measuredTH1Draw);
1064     if(fBeamType==1){
1065       THnSparseF* sparseIncElec = (THnSparseF *) dataspectrumbeforesubstraction->GetGrid();
1066       for(Int_t icent =  1; icent < kCentrality-1; icent++){
1067         sparseIncElec->GetAxis(0)->SetRange(icent,icent);
1068         incElecCent[icent-1] = (TH1D *) sparseIncElec->Projection(ptpr);
1069         CorrectFromTheWidth(incElecCent[icent-1]);
1070       }
1071     }
1072     TCanvas *rawspectra = new TCanvas("rawspectra","rawspectra",500,400);
1073     rawspectra->cd();
1074     rawspectra->SetLogy();
1075     gStyle->SetOptStat(0);
1076     TLegend *lRaw = new TLegend(0.55,0.55,0.85,0.85);
1077     measuredTH1Draw->SetMarkerStyle(20);
1078     measuredTH1Draw->Draw();
1079     measuredTH1Draw->GetXaxis()->SetRangeUser(0.0,7.9);
1080     lRaw->AddEntry(measuredTH1Draw,"measured raw spectrum");
1081     TH1D* htemp;
1082     Int_t* bins=new Int_t[2];
1083     if(fIPanaHadronBgSubtract){
1084       // Hadron background
1085         printf("Hadron background for IP analysis subtracted!\n");
1086         if(fBeamType==0)
1087         {
1088
1089             htemp  = (TH1D *) fHadronEffbyIPcut->Projection(0);
1090             bins[0]=htemp->GetNbinsX();
1091         }
1092         if(fBeamType==1)
1093         {
1094             htemp  = (TH1D *) fHadronEffbyIPcut->Projection(0);
1095             bins[0]=htemp->GetNbinsX();
1096             htemp  = (TH1D *) fHadronEffbyIPcut->Projection(1);
1097             bins[1]=htemp->GetNbinsX();
1098         }
1099       AliCFDataGrid *hbgContainer = new AliCFDataGrid("hbgContainer","hadron bg after IP cut",nbins,bins);
1100       hbgContainer->SetGrid(fHadronEffbyIPcut);
1101       backgroundGrid->Multiply(hbgContainer,1);
1102       // draw raw hadron bg spectra
1103       TH1D *hadronbg= (TH1D *) backgroundGrid->Project(ptpr);
1104       CorrectFromTheWidth(hadronbg);
1105       hadronbg->SetMarkerColor(7);
1106       hadronbg->SetMarkerStyle(20);
1107       rawspectra->cd();
1108       hadronbg->Draw("samep");
1109       lRaw->AddEntry(hadronbg,"hadrons");
1110       // subtract hadron contamination
1111       spectrumSubtracted->Add(backgroundGrid,-1.0);
1112     }
1113     if(fIPanaCharmBgSubtract){
1114       // Charm background
1115       printf("Charm background for IP analysis subtracted!\n");
1116       AliCFDataGrid *charmbgContainer = (AliCFDataGrid *) GetCharmBackground();
1117       // draw charm bg spectra
1118       TH1D *charmbg= (TH1D *) charmbgContainer->Project(ptpr);
1119       CorrectFromTheWidth(charmbg);
1120       charmbg->SetMarkerColor(3);
1121       charmbg->SetMarkerStyle(20);
1122       rawspectra->cd();
1123       charmbg->Draw("samep");
1124       lRaw->AddEntry(charmbg,"charm elecs");
1125       // subtract charm background
1126       spectrumSubtracted->Add(charmbgContainer,-1.0);
1127       if(fBeamType==1){
1128         THnSparseF* sparseCharmElec = (THnSparseF *) charmbgContainer->GetGrid();
1129         for(Int_t icent =  1; icent < kCentrality-1; icent++){ 
1130           sparseCharmElec->GetAxis(0)->SetRange(icent,icent);
1131           charmCent[icent-1] = (TH1D *) sparseCharmElec->Projection(ptpr);
1132           CorrectFromTheWidth(charmCent[icent-1]);
1133         }
1134       }
1135     }
1136     if(fIPanaConversionBgSubtract){
1137       // Conversion background
1138       AliCFDataGrid *conversionbgContainer = (AliCFDataGrid *) GetConversionBackground(); 
1139       // draw conversion bg spectra
1140       TH1D *conversionbg= (TH1D *) conversionbgContainer->Project(ptpr);
1141       CorrectFromTheWidth(conversionbg);
1142       conversionbg->SetMarkerColor(4);
1143       conversionbg->SetMarkerStyle(20);
1144       rawspectra->cd();
1145       conversionbg->Draw("samep");
1146       lRaw->AddEntry(conversionbg,"conversion elecs");
1147       // subtract conversion background
1148       spectrumSubtracted->Add(conversionbgContainer,-1.0);
1149       if(fBeamType==1){
1150         THnSparseF* sparseconvElec = (THnSparseF *) conversionbgContainer->GetGrid();
1151         for(Int_t icent =  1; icent < kCentrality-1; icent++){
1152           sparseconvElec->GetAxis(0)->SetRange(icent,icent);
1153           convCent[icent-1] = (TH1D *) sparseconvElec->Projection(ptpr);
1154           CorrectFromTheWidth(convCent[icent-1]);
1155         }
1156       }
1157     }
1158     if(fIPanaNonHFEBgSubtract){
1159       // NonHFE background
1160       AliCFDataGrid *nonHFEbgContainer = (AliCFDataGrid *) GetNonHFEBackground();
1161       // draw Dalitz/dielectron bg spectra
1162       TH1D *nonhfebg= (TH1D *) nonHFEbgContainer->Project(ptpr);
1163       CorrectFromTheWidth(nonhfebg);
1164       nonhfebg->SetMarkerColor(6);
1165       nonhfebg->SetMarkerStyle(20);
1166       rawspectra->cd();
1167       nonhfebg->Draw("samep");
1168       lRaw->AddEntry(nonhfebg,"non-HF elecs");
1169       // subtract Dalitz/dielectron background
1170       spectrumSubtracted->Add(nonHFEbgContainer,-1.0);
1171       if(fBeamType==1){
1172         THnSparseF* sparseNonHFEElec = (THnSparseF *) nonHFEbgContainer->GetGrid();
1173         for(Int_t icent =  1; icent < kCentrality-1; icent++){
1174           sparseNonHFEElec->GetAxis(0)->SetRange(icent,icent);
1175           nonHFECent[icent-1] = (TH1D *) sparseNonHFEElec->Projection(ptpr);
1176           CorrectFromTheWidth(nonHFECent[icent-1]);
1177         }
1178       }
1179     }
1180
1181     TH1D *rawbgsubtracted = (TH1D *) spectrumSubtracted->Project(ptpr);
1182     CorrectFromTheWidth(rawbgsubtracted);
1183     rawbgsubtracted->SetMarkerStyle(24);
1184     rawspectra->cd();
1185     lRaw->AddEntry(rawbgsubtracted,"subtracted raw spectrum");
1186     rawbgsubtracted->Draw("samep");
1187     lRaw->Draw("SAME");
1188     gPad->SetGrid();
1189     //rawspectra->SaveAs("rawspectra.eps");
1190     
1191     if(fBeamType==1){
1192       THnSparseF* sparseSubtracted = (THnSparseF *) spectrumSubtracted->GetGrid();
1193       for(Int_t icent =  1; icent < kCentrality-1; icent++){
1194         sparseSubtracted->GetAxis(0)->SetRange(icent,icent);
1195         subtractedCent[icent-1] = (TH1D *) sparseSubtracted->Projection(ptpr);
1196         CorrectFromTheWidth(subtractedCent[icent-1]);
1197       }
1198     
1199       TLegend *lCentRaw = new TLegend(0.55,0.55,0.85,0.85);
1200       TCanvas *centRaw = new TCanvas("centRaw","centRaw",1000,800);
1201       centRaw->Divide(3,3);
1202       for(Int_t icent = 1; icent < kCentrality-1; icent++){
1203         centRaw->cd(icent);
1204         gPad->SetLogx();
1205         gPad->SetLogy();
1206         incElecCent[icent-1]->GetXaxis()->SetRangeUser(0.4,8.);
1207         incElecCent[icent-1]->Draw("p");
1208         incElecCent[icent-1]->SetMarkerColor(1);
1209         incElecCent[icent-1]->SetMarkerStyle(20);
1210         charmCent[icent-1]->Draw("samep");
1211         charmCent[icent-1]->SetMarkerColor(3);
1212         charmCent[icent-1]->SetMarkerStyle(20);
1213         convCent[icent-1]->Draw("samep");
1214         convCent[icent-1]->SetMarkerColor(4);
1215         convCent[icent-1]->SetMarkerStyle(20);
1216         nonHFECent[icent-1]->Draw("samep");
1217         nonHFECent[icent-1]->SetMarkerColor(6);
1218         nonHFECent[icent-1]->SetMarkerStyle(20);
1219         subtractedCent[icent-1]->Draw("samep");
1220         subtractedCent[icent-1]->SetMarkerStyle(24);
1221         if(icent == 1){
1222           lCentRaw->AddEntry(incElecCent[0],"inclusive electron spectrum");
1223           lCentRaw->AddEntry(charmCent[0],"charm elecs");
1224           lCentRaw->AddEntry(convCent[0],"conversion elecs");
1225           lCentRaw->AddEntry(nonHFECent[0],"non-HF elecs");
1226           lCentRaw->AddEntry(subtractedCent[0],"subtracted electron spectrum");
1227           lCentRaw->Draw("SAME");
1228         }
1229       }
1230     }
1231
1232     delete[] bins; 
1233
1234   }
1235   else{
1236     // Subtract 
1237     spectrumSubtracted->Add(backgroundGrid,-1.0);
1238   }
1239
1240   if(setBackground){
1241     if(fBackground) delete fBackground;
1242     fBackground = backgroundGrid;
1243   } else delete backgroundGrid;
1244
1245
1246   if(fDebugLevel > 0) {
1247
1248     Int_t ptprd;
1249     if(fBeamType==0) ptprd=0;
1250     if(fBeamType==1) ptprd=1;
1251     
1252     TCanvas * cbackgroundsubtraction = new TCanvas("backgroundsubtraction","backgroundsubtraction",1000,700);
1253     cbackgroundsubtraction->Divide(3,1);
1254     cbackgroundsubtraction->cd(1);
1255     gPad->SetLogy();
1256     TH1D *measuredTH1Daftersubstraction = (TH1D *) spectrumSubtracted->Project(ptprd);
1257     TH1D *measuredTH1Dbeforesubstraction = (TH1D *) dataspectrumbeforesubstraction->Project(ptprd);
1258     CorrectFromTheWidth(measuredTH1Daftersubstraction);
1259     CorrectFromTheWidth(measuredTH1Dbeforesubstraction);
1260     measuredTH1Daftersubstraction->SetStats(0);
1261     measuredTH1Daftersubstraction->SetTitle("");
1262     measuredTH1Daftersubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1263     measuredTH1Daftersubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1264     measuredTH1Daftersubstraction->SetMarkerStyle(25);
1265     measuredTH1Daftersubstraction->SetMarkerColor(kBlack);
1266     measuredTH1Daftersubstraction->SetLineColor(kBlack);
1267     measuredTH1Dbeforesubstraction->SetStats(0);
1268     measuredTH1Dbeforesubstraction->SetTitle("");
1269     measuredTH1Dbeforesubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1270     measuredTH1Dbeforesubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1271     measuredTH1Dbeforesubstraction->SetMarkerStyle(24);
1272     measuredTH1Dbeforesubstraction->SetMarkerColor(kBlue);
1273     measuredTH1Dbeforesubstraction->SetLineColor(kBlue);
1274     measuredTH1Daftersubstraction->Draw();
1275     measuredTH1Dbeforesubstraction->Draw("same");
1276     TLegend *legsubstraction = new TLegend(0.4,0.6,0.89,0.89);
1277     legsubstraction->AddEntry(measuredTH1Dbeforesubstraction,"With hadron contamination","p");
1278     legsubstraction->AddEntry(measuredTH1Daftersubstraction,"Without hadron contamination ","p");
1279     legsubstraction->Draw("same");
1280     cbackgroundsubtraction->cd(2);
1281     gPad->SetLogy();
1282     TH1D* ratiomeasuredcontamination = (TH1D*)measuredTH1Dbeforesubstraction->Clone();
1283     ratiomeasuredcontamination->SetName("ratiomeasuredcontamination");
1284     ratiomeasuredcontamination->SetTitle("");
1285     ratiomeasuredcontamination->GetYaxis()->SetTitle("(with contamination - without contamination) / with contamination");
1286     ratiomeasuredcontamination->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1287     ratiomeasuredcontamination->Sumw2();
1288     ratiomeasuredcontamination->Add(measuredTH1Daftersubstraction,-1.0);
1289     ratiomeasuredcontamination->Divide(measuredTH1Dbeforesubstraction);
1290     ratiomeasuredcontamination->SetStats(0);
1291     ratiomeasuredcontamination->SetMarkerStyle(26);
1292     ratiomeasuredcontamination->SetMarkerColor(kBlack);
1293     ratiomeasuredcontamination->SetLineColor(kBlack);
1294     for(Int_t k=0; k < ratiomeasuredcontamination->GetNbinsX(); k++){
1295       ratiomeasuredcontamination->SetBinError(k+1,0.0);
1296     }
1297     ratiomeasuredcontamination->Draw("P");
1298     cbackgroundsubtraction->cd(3);
1299     TH1D *measuredTH1background = (TH1D *) backgroundGrid->Project(ptprd);
1300     CorrectFromTheWidth(measuredTH1background);
1301     measuredTH1background->SetStats(0);
1302     measuredTH1background->SetTitle("");
1303     measuredTH1background->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1304     measuredTH1background->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1305     measuredTH1background->SetMarkerStyle(26);
1306     measuredTH1background->SetMarkerColor(kBlack);
1307     measuredTH1background->SetLineColor(kBlack);
1308     measuredTH1background->Draw();
1309     if(fWriteToFile) cbackgroundsubtraction->SaveAs("BackgroundSubtracted.eps");
1310
1311     if(fBeamType==1) {
1312
1313       TCanvas * cbackgrounde = new TCanvas("BackgroundSubtraction_allspectra","BackgroundSubtraction_allspectra",1000,700);
1314       cbackgrounde->Divide(2,1);
1315       TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
1316       TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
1317      
1318       THnSparseF* sparsesubtracted = (THnSparseF *) spectrumSubtracted->GetGrid();
1319       TAxis *cenaxisa = sparsesubtracted->GetAxis(0);
1320       THnSparseF* sparsebefore = (THnSparseF *) dataspectrumbeforesubstraction->GetGrid();
1321       TAxis *cenaxisb = sparsebefore->GetAxis(0);
1322       Int_t nbbin = cenaxisb->GetNbins();
1323       Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
1324       Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
1325       for(Int_t binc = 0; binc < nbbin; binc++){
1326         TString titlee("BackgroundSubtraction_centrality_bin_");
1327         titlee += binc;
1328         TCanvas * cbackground = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
1329         cbackground->Divide(2,1);
1330         cbackground->cd(1);
1331         gPad->SetLogy();
1332         cenaxisa->SetRange(binc+1,binc+1);
1333         cenaxisb->SetRange(binc+1,binc+1);
1334         TH1D *aftersubstraction = (TH1D *) sparsesubtracted->Projection(1);
1335         TH1D *beforesubstraction = (TH1D *) sparsebefore->Projection(1);
1336         CorrectFromTheWidth(aftersubstraction);
1337         CorrectFromTheWidth(beforesubstraction);
1338         aftersubstraction->SetStats(0);
1339         aftersubstraction->SetTitle((const char*)titlee);
1340         aftersubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1341         aftersubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1342         aftersubstraction->SetMarkerStyle(25);
1343         aftersubstraction->SetMarkerColor(kBlack);
1344         aftersubstraction->SetLineColor(kBlack);
1345         beforesubstraction->SetStats(0);
1346         beforesubstraction->SetTitle((const char*)titlee);
1347         beforesubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1348         beforesubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1349         beforesubstraction->SetMarkerStyle(24);
1350         beforesubstraction->SetMarkerColor(kBlue);
1351         beforesubstraction->SetLineColor(kBlue);
1352         aftersubstraction->Draw();
1353         beforesubstraction->Draw("same");
1354         TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
1355         lega->AddEntry(beforesubstraction,"With hadron contamination","p");
1356         lega->AddEntry(aftersubstraction,"Without hadron contamination ","p");
1357         lega->Draw("same");
1358         cbackgrounde->cd(1);
1359         gPad->SetLogy();
1360         TH1D *aftersubtractionn = (TH1D *) aftersubstraction->Clone();
1361         aftersubtractionn->SetMarkerStyle(stylee[binc]);
1362         aftersubtractionn->SetMarkerColor(colorr[binc]);
1363         if(binc==0) aftersubtractionn->Draw();
1364         else aftersubtractionn->Draw("same");
1365         legtotal->AddEntry(aftersubtractionn,(const char*) titlee,"p");
1366         cbackgrounde->cd(2);
1367         gPad->SetLogy();
1368         TH1D *aftersubtractionng = (TH1D *) aftersubstraction->Clone();
1369         aftersubtractionng->SetMarkerStyle(stylee[binc]);
1370         aftersubtractionng->SetMarkerColor(colorr[binc]);
1371         if(fNEvents[binc] > 0.0) aftersubtractionng->Scale(1/(Double_t)fNEvents[binc]);
1372         if(binc==0) aftersubtractionng->Draw();
1373         else aftersubtractionng->Draw("same");
1374         legtotalg->AddEntry(aftersubtractionng,(const char*) titlee,"p");
1375         cbackground->cd(2);
1376         TH1D* ratiocontamination = (TH1D*)beforesubstraction->Clone();
1377         ratiocontamination->SetName("ratiocontamination");
1378         ratiocontamination->SetTitle((const char*)titlee);
1379         ratiocontamination->GetYaxis()->SetTitle("(with contamination - without contamination) / with contamination");
1380         ratiocontamination->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1381         ratiocontamination->Add(aftersubstraction,-1.0);
1382         ratiocontamination->Divide(beforesubstraction);
1383         Int_t totalbin = ratiocontamination->GetXaxis()->GetNbins();
1384         for(Int_t nbinpt = 0; nbinpt < totalbin; nbinpt++) {
1385           ratiocontamination->SetBinError(nbinpt+1,0.0);
1386         }
1387         ratiocontamination->SetStats(0);
1388         ratiocontamination->SetMarkerStyle(26);
1389         ratiocontamination->SetMarkerColor(kBlack);
1390         ratiocontamination->SetLineColor(kBlack);
1391         ratiocontamination->Draw("P");
1392       }
1393      
1394       cbackgrounde->cd(1);
1395       legtotal->Draw("same");
1396       cbackgrounde->cd(2);
1397       legtotalg->Draw("same");
1398
1399       cenaxisa->SetRange(0,nbbin);
1400       cenaxisb->SetRange(0,nbbin);
1401       if(fWriteToFile) cbackgrounde->SaveAs("BackgroundSubtractedPbPb.eps");
1402     }
1403   }
1404   
1405   return spectrumSubtracted;
1406 }
1407
1408 //____________________________________________________________
1409 AliCFDataGrid* AliHFEspectrum::GetCharmBackground(){
1410   //
1411   // calculate charm background
1412   //
1413     Int_t ptpr = 0;
1414     Int_t nDim = 1;
1415     if(fBeamType==0)
1416     {
1417         ptpr=0;
1418     }
1419     if(fBeamType==1)
1420     {
1421         ptpr=1;
1422         nDim=2;
1423     }
1424
1425   Double_t evtnorm=0;
1426   if(fNMCbgEvents[0]) evtnorm= double(fNEvents[0])/double(fNMCbgEvents[0]);
1427
1428   AliCFContainer *mcContainer = GetContainer(kMCContainerCharmMC);
1429   if(!mcContainer){
1430     AliError("MC Container not available");
1431     return NULL;
1432   }
1433
1434   if(!fCorrelation){
1435     AliError("No Correlation map available");
1436     return NULL;
1437   }
1438
1439   AliCFDataGrid *charmBackgroundGrid= 0x0;
1440   charmBackgroundGrid = new AliCFDataGrid("charmBackgroundGrid","charmBackgroundGrid",*mcContainer, fStepMC-1); // use MC eff. up to right before PID
1441
1442   TH1D *charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(0);
1443   Int_t* bins=new Int_t[2];
1444   bins[0]=charmbgaftertofpid->GetNbinsX();
1445
1446   if(fBeamType==1)
1447   {
1448       bins[0]=12;
1449       charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(1);
1450       bins[1]=charmbgaftertofpid->GetNbinsX();
1451
1452   }
1453
1454   AliCFDataGrid *ipWeightedCharmContainer = new AliCFDataGrid("ipWeightedCharmContainer","ipWeightedCharmContainer",nDim,bins);
1455   ipWeightedCharmContainer->SetGrid(GetPIDxIPEff(0)); // get charm efficiency
1456   TH1D* parametrizedcharmpidipeff = (TH1D*)ipWeightedCharmContainer->Project(ptpr);
1457
1458   charmBackgroundGrid->Multiply(ipWeightedCharmContainer,1.);
1459
1460   Int_t *nBinpp=new Int_t[1];
1461   Int_t* binspp=new Int_t[1];
1462   binspp[0]=charmbgaftertofpid->GetNbinsX();  // number of pt bins
1463
1464   Int_t *nBinPbPb=new Int_t[2];
1465   Int_t* binsPbPb=new Int_t[2];
1466   binsPbPb[1]=charmbgaftertofpid->GetNbinsX();  // number of pt bins
1467   binsPbPb[0]=12;
1468
1469   Int_t looppt=binspp[0];
1470   if(fBeamType==1) looppt=binsPbPb[1];
1471
1472   for(Long_t iBin=1; iBin<= looppt;iBin++){
1473       if(fBeamType==0)
1474       {
1475           nBinpp[0]=iBin;
1476           charmBackgroundGrid->SetElementError(nBinpp, charmBackgroundGrid->GetElementError(nBinpp)*evtnorm);
1477           charmBackgroundGrid->SetElement(nBinpp,charmBackgroundGrid->GetElement(nBinpp)*evtnorm);
1478       }
1479       if(fBeamType==1)
1480       {
1481           // loop over centrality
1482           for(Long_t iiBin=1; iiBin<= binsPbPb[0];iiBin++){
1483               nBinPbPb[0]=iiBin;
1484               nBinPbPb[1]=iBin;
1485               Double_t evtnormPbPb=0;
1486               if(fNMCbgEvents[iiBin-1]) evtnormPbPb= double(fNEvents[iiBin-1])/double(fNMCbgEvents[iiBin-1]);
1487               charmBackgroundGrid->SetElementError(nBinPbPb, charmBackgroundGrid->GetElementError(nBinPbPb)*evtnormPbPb);
1488               charmBackgroundGrid->SetElement(nBinPbPb,charmBackgroundGrid->GetElement(nBinPbPb)*evtnormPbPb);
1489           }
1490       }
1491   }
1492
1493   TH1D* charmbgafteripcut = (TH1D*)charmBackgroundGrid->Project(ptpr);
1494
1495   AliCFDataGrid *weightedCharmContainer = new AliCFDataGrid("weightedCharmContainer","weightedCharmContainer",nDim,bins);
1496   weightedCharmContainer->SetGrid(GetCharmWeights()); // get charm weighting factors
1497   TH1D* charmweightingfc = (TH1D*)weightedCharmContainer->Project(ptpr);
1498   charmBackgroundGrid->Multiply(weightedCharmContainer,1.);
1499   TH1D* charmbgafterweight = (TH1D*)charmBackgroundGrid->Project(ptpr);
1500
1501   // Efficiency (set efficiency to 1 for only folding) 
1502   AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
1503   efficiencyD->CalculateEfficiency(0,0);
1504
1505   // Folding
1506   if(fBeamType==0)nDim = 1;
1507   if(fBeamType==1)nDim = 2;
1508   AliCFUnfolding folding("unfolding","",nDim,fCorrelation,efficiencyD->GetGrid(),charmBackgroundGrid->GetGrid(),charmBackgroundGrid->GetGrid());
1509   folding.SetMaxNumberOfIterations(1);
1510   folding.Unfold();
1511
1512   // Results
1513   THnSparse* result1= folding.GetEstMeasured(); // folded spectra
1514   THnSparse* result=(THnSparse*)result1->Clone();
1515   charmBackgroundGrid->SetGrid(result);
1516   TH1D* charmbgafterfolding = (TH1D*)charmBackgroundGrid->Project(ptpr);
1517
1518   //Charm background evaluation plots
1519
1520   TCanvas *cCharmBgEval = new TCanvas("cCharmBgEval","cCharmBgEval",1000,600);
1521   cCharmBgEval->Divide(3,1);
1522
1523   cCharmBgEval->cd(1);
1524
1525   if(fBeamType==0)charmbgaftertofpid->Scale(evtnorm);
1526   if(fBeamType==1)
1527   {
1528       Double_t evtnormPbPb=0;
1529       for(Int_t kCentr=0;kCentr<bins[0];kCentr++)
1530       {
1531           if(fNMCbgEvents[kCentr]) evtnormPbPb= evtnormPbPb+double(fNEvents[kCentr])/double(fNMCbgEvents[kCentr]);
1532       }
1533       charmbgaftertofpid->Scale(evtnormPbPb);
1534   }
1535
1536   CorrectFromTheWidth(charmbgaftertofpid);
1537   charmbgaftertofpid->SetMarkerStyle(25);
1538   charmbgaftertofpid->Draw("p");
1539   charmbgaftertofpid->GetYaxis()->SetTitle("yield normalized by # of data events");
1540   charmbgaftertofpid->GetXaxis()->SetTitle("p_{T} (GeV/c)");
1541   gPad->SetLogy();
1542
1543   CorrectFromTheWidth(charmbgafteripcut);
1544   charmbgafteripcut->SetMarkerStyle(24);
1545   charmbgafteripcut->Draw("samep");
1546
1547   CorrectFromTheWidth(charmbgafterweight);
1548   charmbgafterweight->SetMarkerStyle(24);
1549   charmbgafterweight->SetMarkerColor(4);
1550   charmbgafterweight->Draw("samep");
1551
1552   CorrectFromTheWidth(charmbgafterfolding);
1553   charmbgafterfolding->SetMarkerStyle(24);
1554   charmbgafterfolding->SetMarkerColor(2);
1555   charmbgafterfolding->Draw("samep");
1556
1557   cCharmBgEval->cd(2);
1558   parametrizedcharmpidipeff->SetMarkerStyle(24);
1559   parametrizedcharmpidipeff->Draw("p");
1560   parametrizedcharmpidipeff->GetXaxis()->SetTitle("p_{T} (GeV/c)");
1561
1562   cCharmBgEval->cd(3);
1563   charmweightingfc->SetMarkerStyle(24);
1564   charmweightingfc->Draw("p");
1565   charmweightingfc->GetYaxis()->SetTitle("weighting factor for charm electron");
1566   charmweightingfc->GetXaxis()->SetTitle("p_{T} (GeV/c)");
1567
1568   cCharmBgEval->cd(1);
1569   TLegend *legcharmbg = new TLegend(0.3,0.7,0.89,0.89);
1570   legcharmbg->AddEntry(charmbgaftertofpid,"After TOF PID","p");
1571   legcharmbg->AddEntry(charmbgafteripcut,"After IP cut","p");
1572   legcharmbg->AddEntry(charmbgafterweight,"After Weighting","p");
1573   legcharmbg->AddEntry(charmbgafterfolding,"After Folding","p");
1574   legcharmbg->Draw("same");
1575
1576   cCharmBgEval->cd(2);
1577   TLegend *legcharmbg2 = new TLegend(0.3,0.7,0.89,0.89);
1578   legcharmbg2->AddEntry(parametrizedcharmpidipeff,"PID + IP cut eff.","p");
1579   legcharmbg2->Draw("same");
1580
1581   CorrectStatErr(charmBackgroundGrid);
1582   if(fWriteToFile) cCharmBgEval->SaveAs("CharmBackground.eps");
1583
1584   delete[] bins;
1585   delete[] nBinpp;
1586   delete[] binspp;
1587   delete[] nBinPbPb;
1588   delete[] binsPbPb;
1589
1590   if(fUnfoldBG) UnfoldBG(charmBackgroundGrid);
1591
1592   return charmBackgroundGrid;
1593 }
1594
1595 //____________________________________________________________
1596 AliCFDataGrid* AliHFEspectrum::GetConversionBackground(){
1597   //
1598   // calculate conversion background
1599   //
1600   
1601   Double_t evtnorm[1] = {0.0};
1602   if(fNMCbgEvents[0]) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents[0]);
1603   printf("check event!!! %lf \n",evtnorm[0]);
1604   
1605   AliCFContainer *backgroundContainer = 0x0;
1606   
1607   if(fNonHFEsyst){
1608     backgroundContainer = (AliCFContainer*)fConvSourceContainer[0][0][0]->Clone();
1609     for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
1610       backgroundContainer->Add(fConvSourceContainer[iSource][0][0]); // make centrality dependent
1611     }  
1612   }
1613   else{    
1614     // Background Estimate
1615     backgroundContainer = GetContainer(kMCWeightedContainerConversionESD);    
1616   } 
1617   if(!backgroundContainer){
1618     AliError("MC background container not found");
1619     return NULL;
1620   }
1621   
1622   Int_t stepbackground = 3;
1623
1624   AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ConversionBgGrid","ConversionBgGrid",*backgroundContainer,stepbackground);
1625   Int_t *nBinpp=new Int_t[1];
1626   Int_t* binspp=new Int_t[1];
1627   binspp[0]=fConversionEff[0]->GetNbinsX();  // number of pt bins
1628
1629   Int_t *nBinPbPb=new Int_t[2];
1630   Int_t* binsPbPb=new Int_t[2];
1631   binsPbPb[1]=fConversionEff[0]->GetNbinsX();  // number of pt bins
1632   binsPbPb[0]=12;
1633
1634   Int_t looppt=binspp[0];
1635   if(fBeamType==1) looppt=binsPbPb[1];
1636
1637   for(Long_t iBin=1; iBin<= looppt;iBin++){
1638       if(fBeamType==0)
1639       {
1640           nBinpp[0]=iBin;
1641           backgroundGrid->SetElementError(nBinpp, backgroundGrid->GetElementError(nBinpp)*evtnorm[0]);
1642           backgroundGrid->SetElement(nBinpp,backgroundGrid->GetElement(nBinpp)*evtnorm[0]);
1643       }
1644       if(fBeamType==1)
1645       {
1646           // loop over centrality
1647           for(Long_t iiBin=1; iiBin<= binsPbPb[0];iiBin++){
1648               nBinPbPb[0]=iiBin;
1649               nBinPbPb[1]=iBin;
1650               Double_t evtnormPbPb=0;
1651               if(fNMCbgEvents[iiBin-1]) evtnormPbPb= double(fNEvents[iiBin-1])/double(fNMCbgEvents[iiBin-1]);
1652               backgroundGrid->SetElementError(nBinPbPb, backgroundGrid->GetElementError(nBinPbPb)*evtnormPbPb);
1653               backgroundGrid->SetElement(nBinPbPb,backgroundGrid->GetElement(nBinPbPb)*evtnormPbPb);
1654           }
1655       }
1656   }
1657   //end of workaround for statistical errors
1658
1659   AliCFDataGrid *weightedConversionContainer;
1660   if(fBeamType==0) weightedConversionContainer = new AliCFDataGrid("weightedConversionContainer","weightedConversionContainer",1,binspp);
1661   else weightedConversionContainer = new AliCFDataGrid("weightedConversionContainer","weightedConversionContainer",2,binsPbPb);
1662   weightedConversionContainer->SetGrid(GetPIDxIPEff(2));
1663   backgroundGrid->Multiply(weightedConversionContainer,1.0);
1664
1665   delete[] nBinpp;
1666   delete[] binspp;
1667   delete[] nBinPbPb;
1668   delete[] binsPbPb; 
1669
1670   return backgroundGrid;
1671 }
1672
1673
1674 //____________________________________________________________
1675 AliCFDataGrid* AliHFEspectrum::GetNonHFEBackground(){
1676   //
1677   // calculate non-HFE background
1678   //
1679
1680   Double_t evtnorm[1] = {0.0};
1681   if(fNMCbgEvents[0]) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents[0]);
1682   printf("check event!!! %lf \n",evtnorm[0]);
1683   
1684   AliCFContainer *backgroundContainer = 0x0;
1685   if(fNonHFEsyst){
1686     backgroundContainer = (AliCFContainer*)fNonHFESourceContainer[0][0][0]->Clone();
1687     for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
1688       backgroundContainer->Add(fNonHFESourceContainer[iSource][0][0]);
1689     } 
1690   }
1691   else{    
1692     // Background Estimate 
1693     backgroundContainer = GetContainer(kMCWeightedContainerNonHFEESD);
1694   }
1695   if(!backgroundContainer){
1696     AliError("MC background container not found");
1697     return NULL;
1698   }
1699   
1700   
1701   Int_t stepbackground = 3;
1702
1703   AliCFDataGrid *backgroundGrid = new AliCFDataGrid("NonHFEBgGrid","NonHFEBgGrid",*backgroundContainer,stepbackground);
1704   Int_t *nBinpp=new Int_t[1];
1705   Int_t* binspp=new Int_t[1];
1706   binspp[0]=fConversionEff[0]->GetNbinsX();  // number of pt bins
1707
1708   Int_t *nBinPbPb=new Int_t[2];
1709   Int_t* binsPbPb=new Int_t[2];
1710   binsPbPb[1]=fConversionEff[0]->GetNbinsX();  // number of pt bins
1711   binsPbPb[0]=12;
1712
1713   Int_t looppt=binspp[0];
1714   if(fBeamType==1) looppt=binsPbPb[1];
1715
1716
1717   for(Long_t iBin=1; iBin<= looppt;iBin++){
1718       if(fBeamType==0)
1719       {
1720           nBinpp[0]=iBin;
1721           backgroundGrid->SetElementError(nBinpp, backgroundGrid->GetElementError(nBinpp)*evtnorm[0]);
1722           backgroundGrid->SetElement(nBinpp,backgroundGrid->GetElement(nBinpp)*evtnorm[0]);
1723       }
1724       if(fBeamType==1)
1725       {
1726           for(Long_t iiBin=1; iiBin<=binsPbPb[0];iiBin++){
1727               nBinPbPb[0]=iiBin;
1728               nBinPbPb[1]=iBin;
1729               Double_t evtnormPbPb=0;
1730               if(fNMCbgEvents[iiBin-1]) evtnormPbPb= double(fNEvents[iiBin-1])/double(fNMCbgEvents[iiBin-1]);
1731               backgroundGrid->SetElementError(nBinPbPb, backgroundGrid->GetElementError(nBinPbPb)*evtnormPbPb);
1732               backgroundGrid->SetElement(nBinPbPb,backgroundGrid->GetElement(nBinPbPb)*evtnormPbPb);
1733           }
1734       }
1735   }
1736   //end of workaround for statistical errors
1737   AliCFDataGrid *weightedNonHFEContainer;
1738   if(fBeamType==0) weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",1,binspp);
1739   else weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",2,binsPbPb);
1740   weightedNonHFEContainer->SetGrid(GetPIDxIPEff(3));
1741   backgroundGrid->Multiply(weightedNonHFEContainer,1.0);
1742
1743   delete[] nBinpp;
1744   delete[] binspp;
1745   delete[] nBinPbPb;
1746   delete[] binsPbPb; 
1747
1748   return backgroundGrid;
1749 }
1750
1751 //____________________________________________________________
1752 AliCFDataGrid *AliHFEspectrum::CorrectParametrizedEfficiency(AliCFDataGrid* const bgsubpectrum){
1753   
1754   //
1755   // Apply TPC pid efficiency correction from parametrisation
1756   //
1757
1758   // Data in the right format
1759   AliCFDataGrid *dataGrid = 0x0;  
1760   if(bgsubpectrum) {
1761     dataGrid = bgsubpectrum;
1762   }
1763   else {
1764     
1765     AliCFContainer *dataContainer = GetContainer(kDataContainer);
1766     if(!dataContainer){
1767       AliError("Data Container not available");
1768       return NULL;
1769     }
1770     dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
1771   } 
1772   AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
1773   result->SetName("ParametrizedEfficiencyBefore");
1774   THnSparse *h = result->GetGrid();
1775   Int_t nbdimensions = h->GetNdimensions();
1776   //printf("CorrectParametrizedEfficiency::We have dimensions %d\n",nbdimensions);
1777   AliCFContainer *dataContainer = GetContainer(kDataContainer);
1778   if(!dataContainer){
1779     AliError("Data Container not available");
1780     return NULL;
1781   }
1782   AliCFContainer *dataContainerbis = (AliCFContainer *) dataContainer->Clone();
1783   dataContainerbis->Add(dataContainerbis,-1.0);
1784
1785
1786   Int_t* coord = new Int_t[nbdimensions];
1787   memset(coord, 0, sizeof(Int_t) * nbdimensions);
1788   Double_t* points = new Double_t[nbdimensions];
1789
1790   ULong64_t nEntries = h->GetNbins();
1791   for (ULong64_t i = 0; i < nEntries; ++i) {
1792     
1793     Double_t value = h->GetBinContent(i, coord);
1794     //Double_t valuecontainer = dataContainerbis->GetBinContent(coord,fStepData);
1795     //printf("Value %f, and valuecontainer %f\n",value,valuecontainer);
1796     
1797     // Get the bin co-ordinates given an coord
1798     for (Int_t j = 0; j < nbdimensions; ++j)
1799       points[j] = h->GetAxis(j)->GetBinCenter(coord[j]);
1800
1801     if (!fEfficiencyFunction->IsInside(points))
1802          continue;
1803     TF1::RejectPoint(kFALSE);
1804
1805     // Evaulate function at points
1806     Double_t valueEfficiency = fEfficiencyFunction->EvalPar(points, NULL);
1807     //printf("Value efficiency is %f\n",valueEfficiency);
1808
1809     if(valueEfficiency > 0.0) {
1810       h->SetBinContent(coord,value/valueEfficiency);
1811       dataContainerbis->SetBinContent(coord,fStepData,value/valueEfficiency);
1812     }
1813     Double_t error = h->GetBinError(i);
1814     h->SetBinError(coord,error/valueEfficiency);
1815     dataContainerbis->SetBinError(coord,fStepData,error/valueEfficiency);
1816
1817    
1818   } 
1819
1820   delete[] coord;
1821   delete[] points;
1822
1823   AliCFDataGrid *resultt = new AliCFDataGrid("spectrumEfficiencyParametrized", "Data Grid for spectrum after Efficiency parametrized", *dataContainerbis,fStepData);
1824
1825   if(fDebugLevel > 0) {
1826
1827     TCanvas * cEfficiencyParametrized = new TCanvas("EfficiencyParametrized","EfficiencyParametrized",1000,700);
1828     cEfficiencyParametrized->Divide(2,1);
1829     cEfficiencyParametrized->cd(1);
1830     TH1D *afterE = (TH1D *) resultt->Project(0);
1831     TH1D *beforeE = (TH1D *) dataGrid->Project(0);
1832     CorrectFromTheWidth(afterE);
1833     CorrectFromTheWidth(beforeE);
1834     afterE->SetStats(0);
1835     afterE->SetTitle("");
1836     afterE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1837     afterE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1838     afterE->SetMarkerStyle(25);
1839     afterE->SetMarkerColor(kBlack);
1840     afterE->SetLineColor(kBlack);
1841     beforeE->SetStats(0);
1842     beforeE->SetTitle("");
1843     beforeE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1844     beforeE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1845     beforeE->SetMarkerStyle(24);
1846     beforeE->SetMarkerColor(kBlue);
1847     beforeE->SetLineColor(kBlue);
1848     gPad->SetLogy();
1849     afterE->Draw();
1850     beforeE->Draw("same");
1851     TLegend *legefficiencyparametrized = new TLegend(0.4,0.6,0.89,0.89);
1852     legefficiencyparametrized->AddEntry(beforeE,"Before Efficiency correction","p");
1853     legefficiencyparametrized->AddEntry(afterE,"After Efficiency correction","p");
1854     legefficiencyparametrized->Draw("same");
1855     cEfficiencyParametrized->cd(2);
1856     fEfficiencyFunction->Draw();
1857     //cEfficiencyParametrized->cd(3);
1858     //TH1D *ratioefficiency = (TH1D *) beforeE->Clone();
1859     //ratioefficiency->Divide(afterE);
1860     //ratioefficiency->Draw();
1861
1862     if(fWriteToFile) cEfficiencyParametrized->SaveAs("efficiency.eps");
1863
1864   }
1865
1866   return resultt;
1867
1868 }
1869 //____________________________________________________________
1870 AliCFDataGrid *AliHFEspectrum::CorrectV0Efficiency(AliCFDataGrid* const bgsubpectrum){
1871   
1872   //
1873   // Apply TPC pid efficiency correction from V0
1874   //
1875
1876   AliCFContainer *v0Container = GetContainer(kDataContainerV0);
1877   if(!v0Container){
1878     AliError("V0 Container not available");
1879     return NULL;
1880   }
1881
1882   // Efficiency
1883   AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*v0Container);
1884   efficiencyD->CalculateEfficiency(fStepAfterCutsV0,fStepBeforeCutsV0);
1885
1886   // Data in the right format
1887   AliCFDataGrid *dataGrid = 0x0;  
1888   if(bgsubpectrum) {
1889     dataGrid = bgsubpectrum;
1890   }
1891   else {
1892     
1893     AliCFContainer *dataContainer = GetContainer(kDataContainer);
1894     if(!dataContainer){
1895       AliError("Data Container not available");
1896       return NULL;
1897     }
1898
1899     dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
1900   } 
1901
1902   // Correct
1903   AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
1904   result->ApplyEffCorrection(*efficiencyD);
1905
1906   if(fDebugLevel > 0) {
1907
1908     Int_t ptpr;
1909     if(fBeamType==0) ptpr=0;
1910     if(fBeamType==1) ptpr=1;
1911     
1912     TCanvas * cV0Efficiency = new TCanvas("V0Efficiency","V0Efficiency",1000,700);
1913     cV0Efficiency->Divide(2,1);
1914     cV0Efficiency->cd(1);
1915     TH1D *afterE = (TH1D *) result->Project(ptpr);
1916     TH1D *beforeE = (TH1D *) dataGrid->Project(ptpr);
1917     afterE->SetStats(0);
1918     afterE->SetTitle("");
1919     afterE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1920     afterE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1921     afterE->SetMarkerStyle(25);
1922     afterE->SetMarkerColor(kBlack);
1923     afterE->SetLineColor(kBlack);
1924     beforeE->SetStats(0);
1925     beforeE->SetTitle("");
1926     beforeE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1927     beforeE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1928     beforeE->SetMarkerStyle(24);
1929     beforeE->SetMarkerColor(kBlue);
1930     beforeE->SetLineColor(kBlue);
1931     afterE->Draw();
1932     beforeE->Draw("same");
1933     TLegend *legV0efficiency = new TLegend(0.4,0.6,0.89,0.89);
1934     legV0efficiency->AddEntry(beforeE,"Before Efficiency correction","p");
1935     legV0efficiency->AddEntry(afterE,"After Efficiency correction","p");
1936     legV0efficiency->Draw("same");
1937     cV0Efficiency->cd(2);
1938     TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(ptpr);
1939     efficiencyDproj->SetTitle("");
1940     efficiencyDproj->SetStats(0);
1941     efficiencyDproj->SetMarkerStyle(25);
1942     efficiencyDproj->Draw();
1943
1944     if(fBeamType==1) {
1945
1946       TCanvas * cV0Efficiencye = new TCanvas("V0Efficiency_allspectra","V0Efficiency_allspectra",1000,700);
1947       cV0Efficiencye->Divide(2,1);
1948       TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
1949       TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
1950      
1951       THnSparseF* sparseafter = (THnSparseF *) result->GetGrid();
1952       TAxis *cenaxisa = sparseafter->GetAxis(0);
1953       THnSparseF* sparsebefore = (THnSparseF *) dataGrid->GetGrid();
1954       TAxis *cenaxisb = sparsebefore->GetAxis(0);
1955       THnSparseF* efficiencya = (THnSparseF *) efficiencyD->GetGrid();
1956       TAxis *cenaxisc = efficiencya->GetAxis(0);
1957       Int_t nbbin = cenaxisb->GetNbins();
1958       Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
1959       Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
1960       for(Int_t binc = 0; binc < nbbin; binc++){
1961         TString titlee("V0Efficiency_centrality_bin_");
1962         titlee += binc;
1963         TCanvas * ccV0Efficiency = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
1964         ccV0Efficiency->Divide(2,1);
1965         ccV0Efficiency->cd(1);
1966         gPad->SetLogy();
1967         cenaxisa->SetRange(binc+1,binc+1);
1968         cenaxisb->SetRange(binc+1,binc+1);
1969         cenaxisc->SetRange(binc+1,binc+1);
1970         TH1D *aftere = (TH1D *) sparseafter->Projection(1);
1971         TH1D *beforee = (TH1D *) sparsebefore->Projection(1);
1972         CorrectFromTheWidth(aftere);
1973         CorrectFromTheWidth(beforee);
1974         aftere->SetStats(0);
1975         aftere->SetTitle((const char*)titlee);
1976         aftere->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1977         aftere->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1978         aftere->SetMarkerStyle(25);
1979         aftere->SetMarkerColor(kBlack);
1980         aftere->SetLineColor(kBlack);
1981         beforee->SetStats(0);
1982         beforee->SetTitle((const char*)titlee);
1983         beforee->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1984         beforee->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1985         beforee->SetMarkerStyle(24);
1986         beforee->SetMarkerColor(kBlue);
1987         beforee->SetLineColor(kBlue);
1988         aftere->Draw();
1989         beforee->Draw("same");
1990         TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
1991         lega->AddEntry(beforee,"Before correction","p");
1992         lega->AddEntry(aftere,"After correction","p");
1993         lega->Draw("same");
1994         cV0Efficiencye->cd(1);
1995         gPad->SetLogy();
1996         TH1D *afteree = (TH1D *) aftere->Clone();
1997         afteree->SetMarkerStyle(stylee[binc]);
1998         afteree->SetMarkerColor(colorr[binc]);
1999         if(binc==0) afteree->Draw();
2000         else afteree->Draw("same");
2001         legtotal->AddEntry(afteree,(const char*) titlee,"p");
2002         cV0Efficiencye->cd(2);
2003         gPad->SetLogy();
2004         TH1D *aftereeu = (TH1D *) aftere->Clone();
2005         aftereeu->SetMarkerStyle(stylee[binc]);
2006         aftereeu->SetMarkerColor(colorr[binc]);
2007         if(fNEvents[binc] > 0.0) aftereeu->Scale(1/(Double_t)fNEvents[binc]);
2008         if(binc==0) aftereeu->Draw();
2009         else aftereeu->Draw("same");
2010         legtotalg->AddEntry(aftereeu,(const char*) titlee,"p");
2011         ccV0Efficiency->cd(2);
2012         TH1D* efficiencyDDproj = (TH1D *) efficiencya->Projection(1);
2013         efficiencyDDproj->SetTitle("");
2014         efficiencyDDproj->SetStats(0);
2015         efficiencyDDproj->SetMarkerStyle(25);
2016         efficiencyDDproj->Draw();
2017       }
2018      
2019       cV0Efficiencye->cd(1);
2020       legtotal->Draw("same");
2021       cV0Efficiencye->cd(2);
2022       legtotalg->Draw("same");
2023
2024       cenaxisa->SetRange(0,nbbin);
2025       cenaxisb->SetRange(0,nbbin);
2026       cenaxisc->SetRange(0,nbbin);
2027
2028       if(fWriteToFile) cV0Efficiencye->SaveAs("V0efficiency.eps");
2029     }
2030
2031   }
2032
2033   
2034   return result;
2035
2036 }
2037 //____________________________________________________________
2038 TList *AliHFEspectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
2039   
2040   //
2041   // Unfold and eventually correct for efficiency the bgsubspectrum
2042   //
2043
2044   AliCFContainer *mcContainer = GetContainer(kMCContainerMC);
2045   if(!mcContainer){
2046     AliError("MC Container not available");
2047     return NULL;
2048   }
2049
2050   if(!fCorrelation){
2051     AliError("No Correlation map available");
2052     return NULL;
2053   }
2054
2055   // Data 
2056   AliCFDataGrid *dataGrid = 0x0;  
2057   if(bgsubpectrum) {
2058     dataGrid = bgsubpectrum;
2059   }
2060   else {
2061
2062     AliCFContainer *dataContainer = GetContainer(kDataContainer);
2063     if(!dataContainer){
2064       AliError("Data Container not available");
2065       return NULL;
2066     }
2067
2068     dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
2069   } 
2070   
2071   // Guessed
2072   AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainer, fStepGuessedUnfolding);
2073   THnSparse* guessedTHnSparse = ((AliCFGridSparse*)guessedGrid->GetData())->GetGrid();
2074
2075   // Efficiency
2076   AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
2077   efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
2078
2079   if(!fBeauty2ndMethod)
2080   {
2081       // Consider parameterized IP cut efficiency
2082       if(!fInclusiveSpectrum){
2083           Int_t* bins=new Int_t[1];
2084           bins[0]=35;
2085
2086           AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
2087           beffContainer->SetGrid(GetBeautyIPEff(kTRUE));
2088           efficiencyD->Multiply(beffContainer,1);
2089       }
2090   }
2091   
2092
2093   // Unfold 
2094   
2095   AliCFUnfolding unfolding("unfolding","",fNbDimensions,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse);
2096   if(fUnSetCorrelatedErrors) unfolding.UnsetCorrelatedErrors();
2097   unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
2098   if(fSetSmoothing) unfolding.UseSmoothing();
2099   unfolding.Unfold();
2100
2101   // Results
2102   THnSparse* result = unfolding.GetUnfolded();
2103   THnSparse* residual = unfolding.GetEstMeasured();
2104   TList *listofresults = new TList;
2105   listofresults->SetOwner();
2106   listofresults->AddAt((THnSparse*)result->Clone(),0);
2107   listofresults->AddAt((THnSparse*)residual->Clone(),1);
2108
2109   if(fDebugLevel > 0) {
2110
2111     Int_t ptpr;
2112     if(fBeamType==0) ptpr=0;
2113     if(fBeamType==1) ptpr=1;
2114     
2115     TCanvas * cresidual = new TCanvas("residual","residual",1000,700);
2116     cresidual->Divide(2,1);
2117     cresidual->cd(1);
2118     gPad->SetLogy();
2119     TGraphErrors* residualspectrumD = Normalize(residual);
2120     if(!residualspectrumD) {
2121       AliError("Number of Events not set for the normalization");
2122       return NULL;
2123     }
2124     residualspectrumD->SetTitle("");
2125     residualspectrumD->GetYaxis()->SetTitleOffset(1.5);
2126     residualspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
2127     residualspectrumD->SetMarkerStyle(26);
2128     residualspectrumD->SetMarkerColor(kBlue);
2129     residualspectrumD->SetLineColor(kBlue);
2130     residualspectrumD->Draw("AP");
2131     AliCFDataGrid *dataGridBis = (AliCFDataGrid *) (dataGrid->Clone());
2132     dataGridBis->SetName("dataGridBis"); 
2133     TGraphErrors* measuredspectrumD = Normalize(dataGridBis);
2134     measuredspectrumD->SetTitle("");  
2135     measuredspectrumD->GetYaxis()->SetTitleOffset(1.5);
2136     measuredspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
2137     measuredspectrumD->SetMarkerStyle(25);
2138     measuredspectrumD->SetMarkerColor(kBlack);
2139     measuredspectrumD->SetLineColor(kBlack);
2140     measuredspectrumD->Draw("P");
2141     TLegend *legres = new TLegend(0.4,0.6,0.89,0.89);
2142     legres->AddEntry(residualspectrumD,"Residual","p");
2143     legres->AddEntry(measuredspectrumD,"Measured","p");
2144     legres->Draw("same");
2145     cresidual->cd(2);
2146     TH1D *residualTH1D = residual->Projection(ptpr);
2147     TH1D *measuredTH1D = (TH1D *) dataGridBis->Project(ptpr);
2148     TH1D* ratioresidual = (TH1D*)residualTH1D->Clone();
2149     ratioresidual->SetName("ratioresidual");
2150     ratioresidual->SetTitle("");
2151     ratioresidual->GetYaxis()->SetTitle("Folded/Measured");
2152     ratioresidual->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2153     ratioresidual->Divide(residualTH1D,measuredTH1D,1,1);
2154     ratioresidual->SetStats(0);
2155     ratioresidual->Draw();
2156
2157     if(fWriteToFile) cresidual->SaveAs("Unfolding.eps");
2158   }
2159
2160   return listofresults;
2161
2162 }
2163
2164 //____________________________________________________________
2165 AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpectrum){
2166   
2167   //
2168   // Apply unfolding and efficiency correction together to bgsubspectrum
2169   //
2170
2171   AliCFContainer *mcContainer = GetContainer(kMCContainerESD);
2172   if(!mcContainer){
2173     AliError("MC Container not available");
2174     return NULL;
2175   }
2176
2177   // Efficiency
2178   AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
2179   efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
2180
2181
2182   if(!fBeauty2ndMethod)
2183   {
2184       // Consider parameterized IP cut efficiency
2185       if(!fInclusiveSpectrum){
2186           Int_t* bins=new Int_t[1];
2187           bins[0]=35;
2188
2189           AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
2190           beffContainer->SetGrid(GetBeautyIPEff(kFALSE));
2191           efficiencyD->Multiply(beffContainer,1);
2192       }
2193   }
2194
2195   // Data in the right format
2196   AliCFDataGrid *dataGrid = 0x0;  
2197   if(bgsubpectrum) {
2198     dataGrid = bgsubpectrum;
2199   }
2200   else {
2201     
2202     AliCFContainer *dataContainer = GetContainer(kDataContainer);
2203     if(!dataContainer){
2204       AliError("Data Container not available");
2205       return NULL;
2206     }
2207
2208     dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
2209   } 
2210
2211   // Correct
2212   AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
2213   result->ApplyEffCorrection(*efficiencyD);
2214
2215   if(fDebugLevel > 0) {
2216
2217     Int_t ptpr;
2218     if(fBeamType==0) ptpr=0;
2219     if(fBeamType==1) ptpr=1;
2220     
2221     printf("Step MC: %d\n",fStepMC);
2222     printf("Step tracking: %d\n",AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack);
2223     printf("Step MC true: %d\n",fStepTrue);
2224     AliCFEffGrid  *efficiencymcPID = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCContainerMC),fStepMC,AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack);
2225     AliCFEffGrid  *efficiencymctrackinggeo = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCContainerMC),AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack,fStepTrue);
2226     AliCFEffGrid  *efficiencymcall = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCContainerMC),fStepMC,fStepTrue);
2227     
2228     AliCFEffGrid  *efficiencyesdall = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCContainerESD),fStepMC,fStepTrue);
2229     
2230     TCanvas * cefficiency = new TCanvas("efficiency","efficiency",1000,700);
2231     cefficiency->cd(1);
2232     TH1D* efficiencymcPIDD = (TH1D *) efficiencymcPID->Project(ptpr);
2233     efficiencymcPIDD->SetTitle("");
2234     efficiencymcPIDD->SetStats(0);
2235     efficiencymcPIDD->SetMarkerStyle(25);
2236     efficiencymcPIDD->Draw();
2237     TH1D* efficiencymctrackinggeoD = (TH1D *) efficiencymctrackinggeo->Project(ptpr);
2238     efficiencymctrackinggeoD->SetTitle("");
2239     efficiencymctrackinggeoD->SetStats(0);
2240     efficiencymctrackinggeoD->SetMarkerStyle(26);
2241     efficiencymctrackinggeoD->Draw("same");
2242     TH1D* efficiencymcallD = (TH1D *) efficiencymcall->Project(ptpr);
2243     efficiencymcallD->SetTitle("");
2244     efficiencymcallD->SetStats(0);
2245     efficiencymcallD->SetMarkerStyle(27);
2246     efficiencymcallD->Draw("same");
2247     TH1D* efficiencyesdallD = (TH1D *) efficiencyesdall->Project(ptpr);
2248     efficiencyesdallD->SetTitle("");
2249     efficiencyesdallD->SetStats(0);
2250     efficiencyesdallD->SetMarkerStyle(24);
2251     efficiencyesdallD->Draw("same");
2252     TLegend *legeff = new TLegend(0.4,0.6,0.89,0.89);
2253     legeff->AddEntry(efficiencymcPIDD,"PID efficiency","p");
2254     legeff->AddEntry(efficiencymctrackinggeoD,"Tracking geometry efficiency","p");
2255     legeff->AddEntry(efficiencymcallD,"Overall efficiency","p");
2256     legeff->AddEntry(efficiencyesdallD,"Overall efficiency ESD","p");
2257     legeff->Draw("same");
2258
2259     if(fBeamType==1) {
2260
2261       THnSparseF* sparseafter = (THnSparseF *) result->GetGrid();
2262       TAxis *cenaxisa = sparseafter->GetAxis(0);
2263       THnSparseF* sparsebefore = (THnSparseF *) dataGrid->GetGrid();
2264       TAxis *cenaxisb = sparsebefore->GetAxis(0);
2265       THnSparseF* efficiencya = (THnSparseF *) efficiencyD->GetGrid();
2266       TAxis *cenaxisc = efficiencya->GetAxis(0);
2267       //Int_t nbbin = cenaxisb->GetNbins();
2268       //Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
2269       //Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
2270       for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
2271         TString titlee("Efficiency_centrality_bin_");
2272         titlee += fLowBoundaryCentralityBinAtTheEnd[binc];
2273         titlee += "_";
2274         titlee += fHighBoundaryCentralityBinAtTheEnd[binc];
2275         TCanvas * cefficiencye = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
2276         cefficiencye->Divide(2,1);
2277         cefficiencye->cd(1);
2278         gPad->SetLogy();
2279         cenaxisa->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
2280         cenaxisb->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
2281         TH1D *afterefficiency = (TH1D *) sparseafter->Projection(ptpr);
2282         TH1D *beforeefficiency = (TH1D *) sparsebefore->Projection(ptpr);
2283         CorrectFromTheWidth(afterefficiency);
2284         CorrectFromTheWidth(beforeefficiency);
2285         afterefficiency->SetStats(0);
2286         afterefficiency->SetTitle((const char*)titlee);
2287         afterefficiency->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
2288         afterefficiency->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2289         afterefficiency->SetMarkerStyle(25);
2290         afterefficiency->SetMarkerColor(kBlack);
2291         afterefficiency->SetLineColor(kBlack);
2292         beforeefficiency->SetStats(0);
2293         beforeefficiency->SetTitle((const char*)titlee);
2294         beforeefficiency->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
2295         beforeefficiency->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2296         beforeefficiency->SetMarkerStyle(24);
2297         beforeefficiency->SetMarkerColor(kBlue);
2298         beforeefficiency->SetLineColor(kBlue);
2299         afterefficiency->Draw();
2300         beforeefficiency->Draw("same");
2301         TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
2302         lega->AddEntry(beforeefficiency,"Before efficiency correction","p");
2303         lega->AddEntry(afterefficiency,"After efficiency correction","p");
2304         lega->Draw("same");
2305         cefficiencye->cd(2);
2306         cenaxisc->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fLowBoundaryCentralityBinAtTheEnd[binc]+1);
2307         TH1D* efficiencyDDproj = (TH1D *) efficiencya->Projection(ptpr);
2308         efficiencyDDproj->SetTitle("");
2309         efficiencyDDproj->SetStats(0);
2310         efficiencyDDproj->SetMarkerStyle(25);
2311         efficiencyDDproj->SetMarkerColor(2);
2312         efficiencyDDproj->Draw();
2313         cenaxisc->SetRange(fHighBoundaryCentralityBinAtTheEnd[binc],fHighBoundaryCentralityBinAtTheEnd[binc]);
2314         TH1D* efficiencyDDproja = (TH1D *) efficiencya->Projection(ptpr);
2315         efficiencyDDproja->SetTitle("");
2316         efficiencyDDproja->SetStats(0);
2317         efficiencyDDproja->SetMarkerStyle(26);
2318         efficiencyDDproja->SetMarkerColor(4);
2319         efficiencyDDproja->Draw("same");
2320       }
2321     }
2322
2323     if(fWriteToFile) cefficiency->SaveAs("efficiencyCorrected.eps");
2324   }
2325   
2326   return result;
2327
2328 }
2329
2330 //__________________________________________________________________________________
2331 TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum,Int_t i) const {
2332   //
2333   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
2334   // Give the final pt spectrum to be compared
2335   //
2336
2337   if(fNEvents[i] > 0) {
2338
2339     Int_t ptpr = 0;
2340     if(fBeamType==0) ptpr=0;
2341     if(fBeamType==1) ptpr=1;
2342     
2343     TH1D* projection = spectrum->Projection(ptpr);
2344     CorrectFromTheWidth(projection);
2345     TGraphErrors *graphError = NormalizeTH1(projection,i);
2346     return graphError;
2347   
2348   }
2349     
2350   return 0x0;
2351   
2352
2353 }
2354 //__________________________________________________________________________________
2355 TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum,Int_t i) const {
2356   //
2357   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
2358   // Give the final pt spectrum to be compared
2359   //
2360   if(fNEvents[i] > 0) {
2361
2362     Int_t ptpr=0;
2363     if(fBeamType==0) ptpr=0;
2364     if(fBeamType==1) ptpr=1;
2365     
2366     TH1D* projection = (TH1D *) spectrum->Project(ptpr);
2367     CorrectFromTheWidth(projection);
2368     TGraphErrors *graphError = NormalizeTH1(projection,i);
2369
2370     return graphError;
2371     
2372   }
2373
2374   return 0x0;
2375   
2376
2377 }
2378 //__________________________________________________________________________________
2379 TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input,Int_t i) const {
2380   //
2381   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
2382   // Give the final pt spectrum to be compared
2383   //
2384   Double_t chargecoefficient = 0.5;
2385   if(fChargeChoosen != 0) chargecoefficient = 1.0;
2386
2387   Double_t etarange = fEtaSelected ? fEtaRangeNorm[1] - fEtaRangeNorm[0] : 1.6;
2388   printf("Normalizing Eta Range %f\n", etarange);
2389   if(fNEvents[i] > 0) {
2390
2391     TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
2392     Double_t p = 0, dp = 0; Int_t point = 1;
2393     Double_t n = 0, dN = 0;
2394     Double_t nCorr = 0, dNcorr = 0;
2395     //Double_t errdN = 0, errdp = 0;
2396     Double_t errdN = 0;
2397     for(Int_t ibin = input->GetXaxis()->GetFirst(); ibin <= input->GetXaxis()->GetLast(); ibin++){
2398       point = ibin - input->GetXaxis()->GetFirst();
2399       p = input->GetXaxis()->GetBinCenter(ibin);
2400       //dp = input->GetXaxis()->GetBinWidth(ibin)/2.;
2401       n = input->GetBinContent(ibin);
2402       dN = input->GetBinError(ibin);
2403       // New point
2404       nCorr = chargecoefficient * 1./etarange * 1./(Double_t)(fNEvents[i]) * 1./(2. * TMath::Pi() * p) * n;
2405       errdN = 1./(2. * TMath::Pi() * p);
2406       //errdp = 1./(2. * TMath::Pi() * p*p) * n;
2407       //dNcorr = chargecoefficient * 1./etarange * 1./(Double_t)(fNEvents[i]) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
2408       dNcorr = chargecoefficient * 1./etarange * 1./(Double_t)(fNEvents[i]) * TMath::Sqrt(errdN * errdN * dN *dN);
2409       
2410       spectrumNormalized->SetPoint(point, p, nCorr);
2411       spectrumNormalized->SetPointError(point, dp, dNcorr);
2412     }
2413     spectrumNormalized->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2414     spectrumNormalized->GetYaxis()->SetTitle("#frac{1}{2 #pi p_{T}} #frac{dN}{dp_{T}} / [GeV/c]^{-2}");
2415     spectrumNormalized->SetMarkerStyle(22);
2416     spectrumNormalized->SetMarkerColor(kBlue);
2417     spectrumNormalized->SetLineColor(kBlue);
2418
2419     return spectrumNormalized;
2420     
2421   }
2422
2423   return 0x0;
2424   
2425
2426 }
2427 //__________________________________________________________________________________
2428 TGraphErrors *AliHFEspectrum::NormalizeTH1N(TH1 *input,Int_t normalization) const {
2429   //
2430   // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
2431   // Give the final pt spectrum to be compared
2432   //
2433   Double_t chargecoefficient = 0.5;
2434   if(fChargeChoosen != kAllCharge) chargecoefficient = 1.0;
2435
2436   Double_t etarange = fEtaSelected ? fEtaRangeNorm[1] - fEtaRangeNorm[0] : 1.6;
2437   printf("Normalizing Eta Range %f\n", etarange);
2438   if(normalization > 0) {
2439
2440     TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
2441     Double_t p = 0, dp = 0; Int_t point = 1;
2442     Double_t n = 0, dN = 0;
2443     Double_t nCorr = 0, dNcorr = 0;
2444     //Double_t errdN = 0, errdp = 0;
2445     Double_t errdN = 0;
2446     for(Int_t ibin = input->GetXaxis()->GetFirst(); ibin <= input->GetXaxis()->GetLast(); ibin++){
2447       point = ibin - input->GetXaxis()->GetFirst();
2448       p = input->GetXaxis()->GetBinCenter(ibin);
2449       //dp = input->GetXaxis()->GetBinWidth(ibin)/2.;
2450       n = input->GetBinContent(ibin);
2451       dN = input->GetBinError(ibin);
2452       // New point
2453       nCorr = chargecoefficient * 1./etarange * 1./(Double_t)(normalization) * 1./(2. * TMath::Pi() * p) * n;
2454       errdN = 1./(2. * TMath::Pi() * p);
2455       //errdp = 1./(2. * TMath::Pi() * p*p) * n;
2456       //dNcorr = chargecoefficient * 1./etarange * 1./(Double_t)(normalization) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
2457       dNcorr = chargecoefficient * 1./etarange * 1./(Double_t)(normalization) * TMath::Sqrt(errdN * errdN * dN *dN);
2458       
2459       spectrumNormalized->SetPoint(point, p, nCorr);
2460       spectrumNormalized->SetPointError(point, dp, dNcorr);
2461     }
2462     spectrumNormalized->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2463     spectrumNormalized->GetYaxis()->SetTitle("#frac{1}{2 #pi p_{T}} #frac{dN}{dp_{T}} / [GeV/c]^{-2}");
2464     spectrumNormalized->SetMarkerStyle(22);
2465     spectrumNormalized->SetMarkerColor(kBlue);
2466     spectrumNormalized->SetLineColor(kBlue);
2467     
2468     return spectrumNormalized;
2469     
2470   }
2471
2472   return 0x0;
2473   
2474
2475 }
2476 //____________________________________________________________
2477 void AliHFEspectrum::SetContainer(AliCFContainer *cont, AliHFEspectrum::CFContainer_t type){
2478   //
2479   // Set the container for a given step to the 
2480   //
2481   if(!fCFContainers) fCFContainers = new TObjArray(kDataContainerV0+1);
2482   fCFContainers->AddAt(cont, type);
2483 }
2484
2485 //____________________________________________________________
2486 AliCFContainer *AliHFEspectrum::GetContainer(AliHFEspectrum::CFContainer_t type){
2487   //
2488   // Get Correction Framework Container for given type
2489   //
2490   if(!fCFContainers) return NULL;
2491   return dynamic_cast<AliCFContainer *>(fCFContainers->At(type));
2492 }
2493 //____________________________________________________________
2494 AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions,Int_t source,Chargetype_t charge, Int_t centralitylow, Int_t centralityhigh) {
2495   //
2496   // Slice bin for a given source of electron
2497   // nDim is the number of dimension the corrections are done
2498   // dimensions are the definition of the dimensions
2499   // source is if we want to keep only one MC source (-1 means we don't cut on the MC source)
2500   // positivenegative if we want to keep positive (1) or negative (0) or both (-1)
2501   // centrality (-1 means we do not cut on centrality)
2502   //
2503   
2504   Double_t *varMin = new Double_t[container->GetNVar()],
2505            *varMax = new Double_t[container->GetNVar()];
2506
2507   Double_t *binLimits;
2508   for(Int_t ivar = 0; ivar < container->GetNVar(); ivar++){
2509     
2510     binLimits = new Double_t[container->GetNBins(ivar)+1];
2511     container->GetBinLimits(ivar,binLimits);
2512     varMin[ivar] = binLimits[0];
2513     varMax[ivar] = binLimits[container->GetNBins(ivar)];
2514     // source
2515     if(ivar == 4){
2516       if((source>= 0) && (source<container->GetNBins(ivar))) {
2517               varMin[ivar] = binLimits[source];
2518               varMax[ivar] = binLimits[source];
2519       }     
2520     }
2521     // charge
2522     if(ivar == 3) {
2523       if(charge != kAllCharge) varMin[ivar] = varMax[ivar] = charge;
2524     }
2525     // eta
2526     if(ivar == 1){
2527       for(Int_t ic = 1; ic <= container->GetAxis(1,0)->GetLast(); ic++) 
2528         AliDebug(1, Form("eta bin %d, min %f, max %f\n", ic, container->GetAxis(1,0)->GetBinLowEdge(ic), container->GetAxis(1,0)->GetBinUpEdge(ic))); 
2529       if(fEtaSelected){
2530         varMin[ivar] = fEtaRange[0];
2531         varMax[ivar] = fEtaRange[1];
2532       }
2533     }
2534     if(fEtaSelected){
2535       fEtaRangeNorm[0] = container->GetAxis(1,0)->GetBinLowEdge(container->GetAxis(1,0)->FindBin(fEtaRange[0]));
2536       fEtaRangeNorm[1] = container->GetAxis(1,0)->GetBinUpEdge(container->GetAxis(1,0)->FindBin(fEtaRange[1]));
2537       AliInfo(Form("Normalization done in eta range [%f,%f]\n", fEtaRangeNorm[0], fEtaRangeNorm[0]));
2538     }
2539     if(ivar == 5){
2540         if((centralitylow>= 0) && (centralitylow<container->GetNBins(ivar)) && (centralityhigh>= 0) && (centralityhigh<container->GetNBins(ivar))) {
2541             varMin[ivar] = binLimits[centralitylow];
2542             varMax[ivar] = binLimits[centralityhigh];
2543
2544             TAxis *axistest = container->GetAxis(5,0);
2545             printf("GetSlicedContainer: Number of bin in centrality direction %d\n",axistest->GetNbins());
2546             printf("Project from %f to %f\n",binLimits[centralitylow],binLimits[centralityhigh]);
2547             Double_t lowcentrality = axistest->GetBinLowEdge(axistest->FindBin(binLimits[centralitylow]));
2548             Double_t highcentrality = axistest->GetBinUpEdge(axistest->FindBin(binLimits[centralityhigh]));
2549             printf("GetSlicedContainer: Low centrality %f and high centrality %f\n",lowcentrality,highcentrality);
2550         
2551         }
2552
2553     }
2554
2555
2556     delete[] binLimits;
2557   }
2558   
2559   AliCFContainer *k = container->MakeSlice(nDim, dimensions, varMin, varMax);
2560   AddTemporaryObject(k);
2561   delete[] varMin; delete[] varMax;
2562
2563   return k;
2564
2565 }
2566
2567 //_________________________________________________________________________
2568 THnSparseF *AliHFEspectrum::GetSlicedCorrelation(THnSparseF *correlationmatrix, Int_t nDim, Int_t *dimensions, Int_t centralitylow, Int_t centralityhigh) const {
2569   //
2570   // Slice correlation
2571   //
2572
2573   Int_t ndimensions = correlationmatrix->GetNdimensions();
2574   //printf("Number of dimension %d correlation map\n",ndimensions);
2575   if(ndimensions < (2*nDim)) {
2576     AliError("Problem in the dimensions");
2577     return NULL;
2578   }
2579   
2580   // Cut in centrality is centrality > -1
2581   if((centralitylow >=0) && (centralityhigh >=0)) {
2582
2583     TAxis *axiscentrality0 = correlationmatrix->GetAxis(5);
2584     TAxis *axiscentrality1 = correlationmatrix->GetAxis(5+((Int_t)(ndimensions/2.)));
2585
2586     Int_t bins0 = axiscentrality0->GetNbins();
2587     Int_t bins1 = axiscentrality1->GetNbins();
2588     
2589     printf("Number of centrality bins: %d and %d\n",bins0,bins1);
2590     if(bins0 != bins1) {
2591       AliError("Problem in the dimensions");
2592       return NULL;
2593     }
2594     
2595     if((centralitylow>= 0) && (centralitylow<bins0) && (centralityhigh>= 0) && (centralityhigh<bins0)) {
2596       axiscentrality0->SetRangeUser(centralitylow,centralityhigh);
2597       axiscentrality1->SetRangeUser(centralitylow,centralityhigh);
2598
2599       Double_t lowcentrality0 = axiscentrality0->GetBinLowEdge(axiscentrality0->FindBin(centralitylow));
2600       Double_t highcentrality0 = axiscentrality0->GetBinUpEdge(axiscentrality0->FindBin(centralityhigh));
2601       Double_t lowcentrality1 = axiscentrality1->GetBinLowEdge(axiscentrality1->FindBin(centralitylow));
2602       Double_t highcentrality1 = axiscentrality1->GetBinUpEdge(axiscentrality1->FindBin(centralityhigh));
2603       printf("GetCorrelation0: Low centrality %f and high centrality %f\n",lowcentrality0,highcentrality0);
2604       printf("GetCorrelation1: Low centrality %f and high centrality %f\n",lowcentrality1,highcentrality1);
2605
2606       TCanvas * ctestcorrelation = new TCanvas("testcorrelationprojection","testcorrelationprojection",1000,700);
2607       ctestcorrelation->cd(1);
2608       TH2D* projection = (TH2D *) correlationmatrix->Projection(5,5+((Int_t)(ndimensions/2.)));
2609       projection->Draw("colz");
2610
2611     }
2612     
2613   }
2614
2615
2616   Int_t ndimensionsContainer = (Int_t) ndimensions/2;
2617   //printf("Number of dimension %d container\n",ndimensionsContainer);
2618
2619   Int_t *dim = new Int_t[nDim*2];
2620   for(Int_t iter=0; iter < nDim; iter++){
2621     dim[iter] = dimensions[iter];
2622     dim[iter+nDim] = ndimensionsContainer + dimensions[iter];
2623     //printf("For iter %d: %d and iter+nDim %d: %d\n",iter,dimensions[iter],iter+nDim,ndimensionsContainer + dimensions[iter]);
2624   }
2625     
2626   THnSparseF *k = (THnSparseF *) correlationmatrix->Projection(nDim*2,dim);
2627
2628   delete[] dim; 
2629   return k;
2630   
2631 }
2632 //___________________________________________________________________________
2633 void AliHFEspectrum::CorrectFromTheWidth(TH1D *h1) const {
2634   //
2635   // Correct from the width of the bins --> dN/dp_{T} (GeV/c)^{-1}
2636   //
2637
2638   TAxis *axis = h1->GetXaxis();
2639   Int_t nbinX = h1->GetNbinsX();
2640
2641   for(Int_t i = 1; i <= nbinX; i++) {
2642
2643     Double_t width = axis->GetBinWidth(i);
2644     Double_t content = h1->GetBinContent(i);
2645     Double_t error = h1->GetBinError(i); 
2646     h1->SetBinContent(i,content/width); 
2647     h1->SetBinError(i,error/width);
2648   }
2649
2650 }
2651
2652 //___________________________________________________________________________
2653 void AliHFEspectrum::CorrectStatErr(AliCFDataGrid *backgroundGrid) const { 
2654   //
2655   // Correct statistical error
2656   //
2657
2658   TH1D *h1 = (TH1D*)backgroundGrid->Project(0);
2659   Int_t nbinX = h1->GetNbinsX();
2660   Int_t bins[1];
2661   for(Long_t i = 1; i <= nbinX; i++) {
2662     bins[0] = i;
2663     Float_t content = h1->GetBinContent(i);
2664     if(content>0){
2665       Float_t error = TMath::Sqrt(content);
2666       backgroundGrid->SetElementError(bins, error);
2667     }
2668   }
2669 }
2670
2671 //____________________________________________________________
2672 void AliHFEspectrum::AddTemporaryObject(TObject *o){
2673   // 
2674   // Emulate garbage collection on class level
2675   // 
2676   if(!fTemporaryObjects) {
2677     fTemporaryObjects= new TList;
2678     fTemporaryObjects->SetOwner();
2679   }
2680   fTemporaryObjects->Add(o);
2681 }
2682
2683 //____________________________________________________________
2684 void AliHFEspectrum::ClearObject(TObject *o){
2685   //
2686   // Do a safe deletion
2687   //
2688   if(fTemporaryObjects){
2689     if(fTemporaryObjects->FindObject(o)) fTemporaryObjects->Remove(o);
2690     delete o;
2691   } else{
2692     // just delete
2693     delete o;
2694   }
2695 }
2696 //_________________________________________________________________________
2697 TObject* AliHFEspectrum::GetSpectrum(const AliCFContainer * const c, Int_t step) {
2698   AliCFDataGrid* data = new AliCFDataGrid("data","",*c, step);
2699   return data;
2700 }
2701 //_________________________________________________________________________
2702 TObject* AliHFEspectrum::GetEfficiency(const AliCFContainer * const c, Int_t step, Int_t step0){
2703   // 
2704   // Create efficiency grid and calculate efficiency
2705   // of step to step0
2706   //
2707   TString name("eff");
2708   name += step;
2709   name+= step0;
2710   AliCFEffGrid* eff = new AliCFEffGrid((const char*)name,"",*c);
2711   eff->CalculateEfficiency(step,step0);
2712   return eff;
2713 }
2714
2715 //____________________________________________________________________________
2716 THnSparse* AliHFEspectrum::GetCharmWeights(){
2717   
2718   //
2719   // Measured D->e based weighting factors
2720   //
2721
2722   const Int_t nDimpp=1;
2723   Int_t nBinpp[nDimpp] = {35};
2724   Double_t ptbinning1[36] = {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.};
2725   const Int_t nDimPbPb=2;
2726   Int_t nBinPbPb[nDimPbPb] = {11,35};
2727   Double_t kCentralityRange[12] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
2728   Int_t loopcentr=1;
2729   Int_t looppt=nBinpp[0];
2730   if(fBeamType==0)
2731   {
2732       fWeightCharm = new THnSparseF("weightHisto", "weighting factor; pt[GeV/c]", nDimpp, nBinpp);
2733       fWeightCharm->SetBinEdges(0, ptbinning1);
2734   }
2735   if(fBeamType==1)
2736   {
2737       fWeightCharm = new THnSparseF("weightHisto", "weighting factor; centrality bin; pt[GeV/c]", nDimPbPb, nBinPbPb);
2738       fWeightCharm->SetBinEdges(1, ptbinning1);
2739       fWeightCharm->SetBinEdges(0, kCentralityRange);
2740       loopcentr=nBinPbPb[0];
2741   }
2742
2743   // Weighting factor for pp
2744   Double_t weight[35]={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};
2745   
2746   // Weighting factor for PbPb (0-20%)
2747   //Double_t weight[35]={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};
2748
2749   // Weighting factor for PbPb (40-80%)
2750   //Double_t weight[35]={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};
2751
2752   //points
2753   Double_t pt[1];
2754   Double_t contents[2];
2755
2756   for(int icentr=0; icentr<loopcentr; icentr++)
2757   {
2758       for(int i=0; i<looppt; i++){
2759           pt[0]=(ptbinning1[i]+ptbinning1[i+1])/2.;
2760           if(fBeamType==1)
2761           {
2762               contents[0]=icentr;
2763               contents[1]=pt[0];
2764           }
2765           if(fBeamType==0)
2766           {
2767               contents[0]=pt[0];
2768           }
2769
2770           fWeightCharm->Fill(contents,weight[i]);
2771       }
2772   }
2773
2774   Int_t nDimSparse = fWeightCharm->GetNdimensions();
2775   Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
2776   Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
2777
2778   for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
2779       binsvar[iVar] = fWeightCharm->GetAxis(iVar)->GetNbins();
2780       nBins *= binsvar[iVar];
2781   }
2782
2783   Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
2784   // loop that sets 0 error in each bin
2785   for (Long_t iBin=0; iBin<nBins; iBin++) {
2786     Long_t bintmp = iBin ;
2787     for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
2788       binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
2789       bintmp /= binsvar[iVar] ;
2790     }
2791     fWeightCharm->SetBinError(binfill,0.); // put 0 everywhere
2792   }
2793
2794   delete[] binsvar;
2795   delete[] binfill;
2796
2797   return fWeightCharm;
2798 }
2799
2800 //____________________________________________________________________________
2801 void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContainer *containermb, AliCFContainer *containeresd, AliCFContainer *containeresdmb, Int_t *dimensions){
2802
2803    // TOF PID efficiencies
2804    Int_t ptpr;
2805    if(fBeamType==0) ptpr=0;
2806    if(fBeamType==1) ptpr=1;
2807
2808    Int_t loopcentr=1;
2809    const Int_t nCentralitybinning=11; //number of centrality bins
2810    if(fBeamType==1)
2811    {
2812      loopcentr=nCentralitybinning;
2813    }
2814
2815    TF1 *fittofpid = new TF1("fittofpid","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.9,8.);
2816    TF1 *fipfit = new TF1("fipfit","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.9,8.);
2817    TF1 *fipfitnonhfe = new TF1("fipfitnonhfe","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.3,10.0);
2818
2819    TCanvas * cefficiencyParamtof = new TCanvas("efficiencyParamtof","efficiencyParamtof",600,600);
2820    cefficiencyParamtof->cd();
2821
2822    AliCFContainer *mccontainermcD = 0x0;
2823    AliCFContainer *mccontaineresdD = 0x0;
2824    TH1D* efficiencysigTOFPIDD[nCentralitybinning];
2825    TH1D* efficiencyTOFPIDD[nCentralitybinning];
2826    TH1D* efficiencysigesdTOFPIDD[nCentralitybinning];
2827    TH1D* efficiencyesdTOFPIDD[nCentralitybinning];
2828    Int_t source = -1; //get parameterized TOF PID efficiencies
2829
2830    for(int icentr=0; icentr<loopcentr; icentr++) {
2831       // signal sample
2832       if(fBeamType==0) mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen);
2833       else mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen,icentr+1);
2834       AliCFEffGrid* efficiencymcsigParamTOFPID= new AliCFEffGrid("efficiencymcsigParamTOFPID","",*mccontainermcD);
2835       efficiencymcsigParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
2836
2837       // mb sample for double check
2838       if(fBeamType==0)  mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2839       else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen,icentr+1);
2840       AliCFEffGrid* efficiencymcParamTOFPID= new AliCFEffGrid("efficiencymcParamTOFPID","",*mccontainermcD);
2841       efficiencymcParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
2842
2843       // mb sample with reconstructed variables
2844       if(fBeamType==0)  mccontainermcD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen);
2845       else mccontainermcD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen,icentr+1);
2846       AliCFEffGrid* efficiencyesdParamTOFPID= new AliCFEffGrid("efficiencyesdParamTOFPID","",*mccontainermcD);
2847       efficiencyesdParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
2848
2849       // mb sample with reconstructed variables
2850       if(fBeamType==0)  mccontainermcD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen);
2851       else mccontainermcD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen,icentr+1);
2852       AliCFEffGrid* efficiencysigesdParamTOFPID= new AliCFEffGrid("efficiencysigesdParamTOFPID","",*mccontainermcD);
2853       efficiencysigesdParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
2854
2855       //fill histo
2856       efficiencysigTOFPIDD[icentr] = (TH1D *) efficiencymcsigParamTOFPID->Project(ptpr);
2857       efficiencyTOFPIDD[icentr] = (TH1D *) efficiencymcParamTOFPID->Project(ptpr);
2858       efficiencysigesdTOFPIDD[icentr] = (TH1D *) efficiencysigesdParamTOFPID->Project(ptpr);
2859       efficiencyesdTOFPIDD[icentr] = (TH1D *) efficiencyesdParamTOFPID->Project(ptpr);
2860       efficiencysigTOFPIDD[icentr]->SetName(Form("efficiencysigTOFPIDD%d",icentr));
2861       efficiencyTOFPIDD[icentr]->SetName(Form("efficiencyTOFPIDD%d",icentr));
2862       efficiencysigesdTOFPIDD[icentr]->SetName(Form("efficiencysigesdTOFPIDD%d",icentr));
2863       efficiencyesdTOFPIDD[icentr]->SetName(Form("efficiencyesdTOFPIDD%d",icentr));
2864
2865       //fit (mc enhenced sample)
2866       fittofpid->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
2867       efficiencysigTOFPIDD[icentr]->Fit(fittofpid,"R");
2868       efficiencysigTOFPIDD[icentr]->GetYaxis()->SetTitle("Efficiency");
2869       fEfficiencyTOFPIDD[icentr] = efficiencysigTOFPIDD[icentr]->GetFunction("fittofpid");
2870
2871       //fit (esd enhenced sample)
2872       efficiencysigesdTOFPIDD[icentr]->Fit(fittofpid,"R");
2873       efficiencysigesdTOFPIDD[icentr]->GetYaxis()->SetTitle("Efficiency");
2874       fEfficiencyesdTOFPIDD[icentr] = efficiencysigesdTOFPIDD[icentr]->GetFunction("fittofpid");
2875
2876    }
2877
2878    // draw (for PbPb, only 1st bin)
2879    //sig mc
2880    efficiencysigTOFPIDD[0]->SetTitle("");
2881    efficiencysigTOFPIDD[0]->SetStats(0);
2882    efficiencysigTOFPIDD[0]->SetMarkerStyle(25);
2883    efficiencysigTOFPIDD[0]->SetMarkerColor(2);
2884    efficiencysigTOFPIDD[0]->SetLineColor(2);
2885    efficiencysigTOFPIDD[0]->Draw();
2886
2887    //mb mc
2888    efficiencyTOFPIDD[0]->SetTitle("");
2889    efficiencyTOFPIDD[0]->SetStats(0);
2890    efficiencyTOFPIDD[0]->SetMarkerStyle(24);
2891    efficiencyTOFPIDD[0]->SetMarkerColor(4);
2892    efficiencyTOFPIDD[0]->SetLineColor(4);
2893    efficiencyTOFPIDD[0]->Draw("same");
2894
2895    //sig esd
2896    efficiencysigesdTOFPIDD[0]->SetTitle("");
2897    efficiencysigesdTOFPIDD[0]->SetStats(0);
2898    efficiencysigesdTOFPIDD[0]->SetMarkerStyle(25);
2899    efficiencysigesdTOFPIDD[0]->SetMarkerColor(3);
2900    efficiencysigesdTOFPIDD[0]->SetLineColor(3);
2901    efficiencysigesdTOFPIDD[0]->Draw("same");
2902
2903    //mb esd
2904    efficiencyesdTOFPIDD[0]->SetTitle("");
2905    efficiencyesdTOFPIDD[0]->SetStats(0);
2906    efficiencyesdTOFPIDD[0]->SetMarkerStyle(25);
2907    efficiencyesdTOFPIDD[0]->SetMarkerColor(1);
2908    efficiencyesdTOFPIDD[0]->SetLineColor(1);
2909    efficiencyesdTOFPIDD[0]->Draw("same");
2910
2911    //signal mc fit
2912    if(fEfficiencyTOFPIDD[0]){
2913      fEfficiencyTOFPIDD[0]->SetLineColor(2);
2914      fEfficiencyTOFPIDD[0]->Draw("same");
2915    }
2916    //mb esd fit
2917    if(fEfficiencyesdTOFPIDD[0]){
2918        fEfficiencyesdTOFPIDD[0]->SetLineColor(3);
2919        fEfficiencyesdTOFPIDD[0]->Draw("same");
2920      }
2921
2922    TLegend *legtofeff = new TLegend(0.3,0.15,0.79,0.44);
2923    legtofeff->AddEntry(efficiencysigTOFPIDD[0],"TOF PID Step Efficiency","");
2924    legtofeff->AddEntry(efficiencysigTOFPIDD[0],"vs MC p_{t} for enhenced samples","p");
2925    legtofeff->AddEntry(efficiencyTOFPIDD[0],"vs MC p_{t} for mb samples","p");
2926    legtofeff->AddEntry(efficiencysigesdTOFPIDD[0],"vs esd p_{t} for enhenced samples","p");
2927    legtofeff->AddEntry(efficiencyesdTOFPIDD[0],"vs esd p_{t} for mb samples","p");
2928    legtofeff->Draw("same");
2929
2930
2931    TCanvas * cefficiencyParamIP = new TCanvas("efficiencyParamIP","efficiencyParamIP",500,500);
2932    cefficiencyParamIP->cd();
2933    gStyle->SetOptStat(0);
2934
2935    // IP cut efficiencies
2936    for(int icentr=0; icentr<loopcentr; icentr++)  {
2937
2938      AliCFContainer *charmCombined = 0x0; 
2939      AliCFContainer *beautyCombined = 0x0;
2940      AliCFContainer *beautyCombinedesd = 0x0;
2941
2942      printf("centrality printing %i \n",icentr);
2943
2944      source = 0; //charm enhenced
2945      if(fBeamType==0) mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen);
2946      else mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2947      AliCFEffGrid* efficiencyCharmSig = new AliCFEffGrid("efficiencyCharmSig","",*mccontainermcD);
2948      efficiencyCharmSig->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency. 
2949
2950      charmCombined= (AliCFContainer*)mccontainermcD->Clone("charmCombined");  
2951
2952      source = 1; //beauty enhenced
2953      if(fBeamType==0) mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen);
2954      else mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2955      AliCFEffGrid* efficiencyBeautySig = new AliCFEffGrid("efficiencyBeautySig","",*mccontainermcD);
2956      efficiencyBeautySig->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency. 
2957
2958      beautyCombined = (AliCFContainer*)mccontainermcD->Clone("beautyCombined"); 
2959
2960      if(fBeamType==0) mccontaineresdD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen);
2961      else mccontaineresdD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2962      AliCFEffGrid* efficiencyBeautySigesd = new AliCFEffGrid("efficiencyBeautySigesd","",*mccontaineresdD);
2963      efficiencyBeautySigesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
2964
2965      beautyCombinedesd = (AliCFContainer*)mccontaineresdD->Clone("beautyCombinedesd");
2966
2967      source = 0; //charm mb
2968      if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2969      else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2970      AliCFEffGrid* efficiencyCharm = new AliCFEffGrid("efficiencyCharm","",*mccontainermcD);
2971      efficiencyCharm->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency. 
2972
2973      charmCombined->Add(mccontainermcD); 
2974      AliCFEffGrid* efficiencyCharmCombined = new AliCFEffGrid("efficiencyCharmCombined","",*charmCombined); 
2975      efficiencyCharmCombined->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); 
2976
2977      source = 1; //beauty mb
2978      if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2979      else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2980      AliCFEffGrid* efficiencyBeauty = new AliCFEffGrid("efficiencyBeauty","",*mccontainermcD);
2981      efficiencyBeauty->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency. 
2982
2983      beautyCombined->Add(mccontainermcD);
2984      AliCFEffGrid* efficiencyBeautyCombined = new AliCFEffGrid("efficiencyBeautyCombined","",*beautyCombined); 
2985      efficiencyBeautyCombined->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); 
2986
2987      if(fBeamType==0) mccontaineresdD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen);
2988      else mccontaineresdD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2989      AliCFEffGrid* efficiencyBeautyesd = new AliCFEffGrid("efficiencyBeautyesd","",*mccontaineresdD);
2990      efficiencyBeautyesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
2991
2992      beautyCombinedesd->Add(mccontaineresdD);
2993      AliCFEffGrid* efficiencyBeautyCombinedesd = new AliCFEffGrid("efficiencyBeautyCombinedesd","",*beautyCombinedesd);
2994      efficiencyBeautyCombinedesd->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1);
2995
2996      source = 2; //conversion mb
2997      if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2998      else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2999      AliCFEffGrid* efficiencyConv = new AliCFEffGrid("efficiencyConv","",*mccontainermcD);
3000      efficiencyConv->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency. 
3001
3002      source = 3; //non HFE except for the conversion mb
3003      if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
3004      else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
3005      AliCFEffGrid* efficiencyNonhfe= new AliCFEffGrid("efficiencyNonhfe","",*mccontainermcD);
3006      efficiencyNonhfe->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
3007
3008      if(fIPEffCombinedSamples){
3009        fEfficiencyCharmSigD[icentr] = (TH1D*)efficiencyCharmCombined->Project(ptpr); //signal enhenced + mb 
3010        fEfficiencyBeautySigD[icentr] = (TH1D*)efficiencyBeautyCombined->Project(ptpr); //signal enhenced + mb
3011        fEfficiencyBeautySigesdD[icentr] = (TH1D*)efficiencyBeautyCombinedesd->Project(ptpr); //signal enhenced + mb
3012      }
3013      else{
3014        fEfficiencyCharmSigD[icentr] = (TH1D*)efficiencyCharmSig->Project(ptpr); //signal enhenced only
3015        fEfficiencyBeautySigD[icentr] = (TH1D*)efficiencyBeautySig->Project(ptpr); //signal enhenced only
3016        fEfficiencyBeautySigesdD[icentr] = (TH1D*)efficiencyBeautySigesd->Project(ptpr); //signal enhenced only
3017      }
3018      fCharmEff[icentr] = (TH1D*)efficiencyCharm->Project(ptpr); //mb only
3019      fBeautyEff[icentr] = (TH1D*)efficiencyBeauty->Project(ptpr); //mb only
3020      fConversionEff[icentr] = (TH1D*)efficiencyConv->Project(ptpr); //mb only
3021      fNonHFEEff[icentr] = (TH1D*)efficiencyNonhfe->Project(ptpr); //mb only
3022
3023    }
3024
3025    if(fBeamType==0){
3026      AliCFEffGrid  *nonHFEEffGrid = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCWeightedContainerNonHFEESD),1,0);
3027      fNonHFEEffbgc = (TH1D *) nonHFEEffGrid->Project(0);
3028
3029      AliCFEffGrid  *conversionEffGrid = (AliCFEffGrid*)  GetEfficiency(GetContainer(kMCWeightedContainerConversionESD),1,0);
3030      fConversionEffbgc = (TH1D *) conversionEffGrid->Project(0);
3031    }
3032
3033    for(int icentr=0; icentr<loopcentr; icentr++)  {
3034      fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
3035      fipfit->SetLineColor(2);
3036      fEfficiencyBeautySigD[icentr]->Fit(fipfit,"R");
3037      fEfficiencyBeautySigD[icentr]->GetYaxis()->SetTitle("Efficiency");
3038      if(fBeauty2ndMethod)fEfficiencyIPBeautyD[icentr] = fEfficiencyBeautySigD[0]->GetFunction("fipfit"); //why do we need this line?
3039      else fEfficiencyIPBeautyD[icentr] = fEfficiencyBeautySigD[icentr]->GetFunction("fipfit");
3040
3041      fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
3042      fipfit->SetLineColor(6);
3043      fEfficiencyBeautySigesdD[icentr]->Fit(fipfit,"R");
3044      fEfficiencyBeautySigesdD[icentr]->GetYaxis()->SetTitle("Efficiency");
3045      if(fBeauty2ndMethod)fEfficiencyIPBeautyesdD[icentr] = fEfficiencyBeautySigesdD[0]->GetFunction("fipfit"); //why do we need this line?
3046      else fEfficiencyIPBeautyesdD[icentr] = fEfficiencyBeautySigesdD[icentr]->GetFunction("fipfit");
3047
3048      fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
3049      fipfit->SetLineColor(1);
3050      fEfficiencyCharmSigD[icentr]->Fit(fipfit,"R");
3051      fEfficiencyCharmSigD[icentr]->GetYaxis()->SetTitle("Efficiency");
3052      fEfficiencyIPCharmD[icentr] = fEfficiencyCharmSigD[icentr]->GetFunction("fipfit");
3053      
3054      if(fIPParameterizedEff){
3055        fipfitnonhfe->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
3056        fipfitnonhfe->SetLineColor(3);
3057        fConversionEff[icentr]->Fit(fipfitnonhfe,"R");
3058        fConversionEff[icentr]->GetYaxis()->SetTitle("Efficiency");
3059        fEfficiencyIPConversionD[icentr] = fConversionEff[icentr]->GetFunction("fipfitnonhfe");
3060
3061        fipfitnonhfe->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
3062        fipfitnonhfe->SetLineColor(4);
3063        fNonHFEEff[icentr]->Fit(fipfitnonhfe,"R");
3064        fNonHFEEff[icentr]->GetYaxis()->SetTitle("Efficiency");
3065        fEfficiencyIPNonhfeD[icentr] = fNonHFEEff[icentr]->GetFunction("fipfitnonhfe");
3066      }
3067    }
3068
3069    // draw (for PbPb, only 1st bin)
3070    fEfficiencyCharmSigD[0]->SetMarkerStyle(21);
3071    fEfficiencyCharmSigD[0]->SetMarkerColor(1);
3072    fEfficiencyCharmSigD[0]->SetLineColor(1);
3073    fEfficiencyBeautySigD[0]->SetMarkerStyle(21);
3074    fEfficiencyBeautySigD[0]->SetMarkerColor(2);
3075    fEfficiencyBeautySigD[0]->SetLineColor(2);
3076    fEfficiencyBeautySigesdD[0]->SetStats(0);
3077    fEfficiencyBeautySigesdD[0]->SetMarkerStyle(21);
3078    fEfficiencyBeautySigesdD[0]->SetMarkerColor(6);
3079    fEfficiencyBeautySigesdD[0]->SetLineColor(6);
3080    fCharmEff[0]->SetMarkerStyle(24);
3081    fCharmEff[0]->SetMarkerColor(1);
3082    fCharmEff[0]->SetLineColor(1);
3083    fBeautyEff[0]->SetMarkerStyle(24);
3084    fBeautyEff[0]->SetMarkerColor(2);
3085    fBeautyEff[0]->SetLineColor(2);
3086    fConversionEff[0]->SetMarkerStyle(24);
3087    fConversionEff[0]->SetMarkerColor(3);
3088    fConversionEff[0]->SetLineColor(3);
3089    fNonHFEEff[0]->SetMarkerStyle(24);
3090    fNonHFEEff[0]->SetMarkerColor(4);
3091    fNonHFEEff[0]->SetLineColor(4);
3092
3093    fEfficiencyCharmSigD[0]->Draw();
3094    fEfficiencyCharmSigD[0]->GetXaxis()->SetRangeUser(0.0,7.9);
3095    fEfficiencyCharmSigD[0]->GetYaxis()->SetRangeUser(0.0,0.5);
3096
3097    fEfficiencyBeautySigD[0]->Draw("same");
3098    fEfficiencyBeautySigesdD[0]->Draw("same");
3099    //fCharmEff[0]->Draw("same");
3100    //fBeautyEff[0]->Draw("same");
3101
3102    if(fBeamType==0){
3103      fConversionEffbgc->SetMarkerStyle(25);
3104      fConversionEffbgc->SetMarkerColor(3);
3105      fConversionEffbgc->SetLineColor(3);
3106      fNonHFEEffbgc->SetMarkerStyle(25);
3107      fNonHFEEffbgc->SetMarkerColor(4);
3108      fNonHFEEffbgc->SetLineColor(4);
3109      fConversionEffbgc->Draw("same");
3110      fNonHFEEffbgc->Draw("same");
3111    }
3112    else{
3113      fConversionEff[0]->Draw("same");
3114      fNonHFEEff[0]->Draw("same");
3115    }
3116    if(fEfficiencyIPBeautyD[0])
3117       fEfficiencyIPBeautyD[0]->Draw("same");
3118    if(fEfficiencyIPBeautyesdD[0])
3119      fEfficiencyIPBeautyesdD[0]->Draw("same");
3120    if( fEfficiencyIPCharmD[0])
3121      fEfficiencyIPCharmD[0]->Draw("same");
3122    if(fIPParameterizedEff){
3123      fEfficiencyIPConversionD[0]->Draw("same");
3124      fEfficiencyIPNonhfeD[0]->Draw("same");
3125    }
3126    TLegend *legipeff = new TLegend(0.58,0.2,0.88,0.39);
3127    legipeff->AddEntry(fEfficiencyBeautySigD[0],"IP Step Efficiency","");
3128    legipeff->AddEntry(fEfficiencyBeautySigD[0],"beauty e","p");
3129    legipeff->AddEntry(fEfficiencyBeautySigesdD[0],"beauty e(esd pt)","p");
3130    legipeff->AddEntry(fEfficiencyCharmSigD[0],"charm e","p");
3131    legipeff->AddEntry(fConversionEffbgc,"conversion e(esd pt)","p");
3132    legipeff->AddEntry(fNonHFEEffbgc,"Dalitz e(esd pt)","p");
3133    //legipeff->AddEntry(fConversionEff[0],"conversion e","p");
3134    //legipeff->AddEntry(fNonHFEEff[0],"Dalitz e","p");
3135    legipeff->Draw("same");
3136    gPad->SetGrid();
3137    //cefficiencyParamIP->SaveAs("efficiencyParamIP.eps");
3138 }
3139
3140 //____________________________________________________________________________
3141 THnSparse* AliHFEspectrum::GetBeautyIPEff(Bool_t isMCpt){
3142   //
3143   // Return beauty electron IP cut efficiency
3144   //
3145
3146   const Int_t nPtbinning1 = 35;//number of pt bins, according to new binning
3147   const Int_t nCentralitybinning=11;//number of centrality bins
3148   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
3149   Double_t kCentralityRange[nCentralitybinning+1] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
3150   Int_t ptpr = 0;
3151   Int_t nDim=1;  //dimensions of the efficiency weighting grid
3152   if(fBeamType==1)
3153   {
3154     ptpr=1;
3155     nDim=2; //dimensions of the efficiency weighting grid
3156   }
3157   Int_t nBin[1] = {nPtbinning1};
3158   Int_t nBinPbPb[2] = {nCentralitybinning,nPtbinning1};
3159
3160
3161   THnSparseF *ipcut;
3162   if(fBeamType==0) ipcut = new THnSparseF("beff", "b IP efficiency; p_{t}(GeV/c)", nDim, nBin);
3163   else ipcut = new THnSparseF("beff", "b IP efficiency; centrality bin; p_{t}(GeV/c)", nDim, nBinPbPb);
3164  
3165   for(Int_t idim = 0; idim < nDim; idim++)
3166   {
3167     if(nDim==1) ipcut->SetBinEdges(idim, kPtRange);
3168     if(nDim==2)
3169       {
3170         ipcut->SetBinEdges(0, kCentralityRange);
3171         ipcut->SetBinEdges(1, kPtRange);
3172       }
3173   }
3174   Double_t pt[1];
3175   Double_t weight[nCentralitybinning];
3176   Double_t weightErr[nCentralitybinning];
3177   Double_t contents[2];
3178
3179   for(Int_t a=0;a<11;a++)
3180   {
3181       weight[a] = 1.0;
3182       weightErr[a] = 1.0;
3183   }
3184
3185
3186   Int_t looppt=nBin[0];
3187   Int_t loopcentr=1;
3188   Int_t ibin[2];
3189   if(fBeamType==1)
3190   {
3191       loopcentr=nBinPbPb[0];
3192   }
3193
3194
3195   for(int icentr=0; icentr<loopcentr; icentr++)
3196   {
3197       for(int i=0; i<looppt; i++)
3198       {
3199           pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
3200           if(isMCpt){
3201             if(fEfficiencyIPBeautyD[icentr]){
3202               weight[icentr]=fEfficiencyIPBeautyD[icentr]->Eval(pt[0]);
3203               weightErr[icentr] = 0;
3204             }
3205             else{
3206               printf("Fit failed on beauty IP cut efficiency for centrality %d. Contents in histo used!\n",icentr);
3207               weight[icentr] = fEfficiencyBeautySigD[icentr]->GetBinContent(i+1); 
3208               weightErr[icentr] = fEfficiencyBeautySigD[icentr]->GetBinError(i+1);
3209             }
3210           }
3211           else{
3212             if(fEfficiencyIPBeautyesdD[icentr]){
3213               weight[icentr]=fEfficiencyIPBeautyesdD[icentr]->Eval(pt[0]);
3214               weightErr[icentr] = 0;
3215             }
3216             else{
3217               printf("Fit failed on beauty IP cut efficiency for centrality %d. Contents in histo used!\n",icentr);
3218               weight[icentr] = fEfficiencyBeautySigesdD[icentr]->GetBinContent(i+1);
3219               weightErr[icentr] = fEfficiencyBeautySigD[icentr]->GetBinError(i+1);
3220             }
3221           }
3222
3223           if(fBeamType==1){
3224               contents[0]=icentr;
3225               contents[1]=pt[0];
3226               ibin[0]=icentr;
3227               ibin[1]=i+1;
3228           }
3229           if(fBeamType==0){
3230               contents[0]=pt[0];
3231               ibin[0]=i+1;
3232           }
3233           ipcut->Fill(contents,weight[icentr]);
3234           ipcut->SetBinError(ibin,weightErr[icentr]);
3235       }
3236   } 
3237
3238   Int_t nDimSparse = ipcut->GetNdimensions();
3239   Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
3240   Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
3241
3242   for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3243       binsvar[iVar] = ipcut->GetAxis(iVar)->GetNbins();
3244       nBins *= binsvar[iVar];
3245   }
3246
3247   Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
3248   // loop that sets 0 error in each bin
3249   for (Long_t iBin=0; iBin<nBins; iBin++) {
3250     Long_t bintmp = iBin ;
3251     for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3252       binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
3253       bintmp /= binsvar[iVar] ;
3254     }
3255     //ipcut->SetBinError(binfill,0.); // put 0 everywhere
3256   }
3257
3258   delete[] binsvar;
3259   delete[] binfill;
3260
3261   return ipcut;
3262 }
3263
3264 //____________________________________________________________________________
3265 THnSparse* AliHFEspectrum::GetPIDxIPEff(Int_t source){
3266   //
3267   // Return PID x IP cut efficiency
3268   //
3269     const Int_t nPtbinning1 = 35;//number of pt bins, according to new binning
3270     const Int_t nCentralitybinning=11;//number of centrality bins
3271     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
3272     Double_t kCentralityRange[nCentralitybinning+1] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
3273     Int_t ptpr = 0;
3274     Int_t nDim=1;  //dimensions of the efficiency weighting grid
3275     if(fBeamType==1)
3276     {
3277         ptpr=1;
3278         nDim=2; //dimensions of the efficiency weighting grid
3279     }
3280     Int_t nBin[1] = {nPtbinning1};
3281     Int_t nBinPbPb[2] = {nCentralitybinning,nPtbinning1};
3282
3283     THnSparseF *pideff;
3284     if(fBeamType==0) pideff = new THnSparseF("pideff", "PID efficiency; p_{t}(GeV/c)", nDim, nBin);
3285     else pideff = new THnSparseF("pideff", "PID efficiency; centrality bin; p_{t}(GeV/c)", nDim, nBinPbPb);
3286     for(Int_t idim = 0; idim < nDim; idim++)
3287     {
3288
3289         if(nDim==1) pideff->SetBinEdges(idim, kPtRange);
3290         if(nDim==2)
3291         {
3292             pideff->SetBinEdges(0, kCentralityRange);
3293             pideff->SetBinEdges(1, kPtRange);
3294         }
3295     }
3296
3297   Double_t pt[1];
3298   Double_t weight[nCentralitybinning];
3299   Double_t weightErr[nCentralitybinning];
3300   Double_t contents[2];
3301
3302   for(Int_t a=0;a<nCentralitybinning;a++)
3303   {
3304       weight[a] = 1.0;
3305       weightErr[a] = 1.0;
3306   }
3307
3308   Int_t looppt=nBin[0];
3309   Int_t loopcentr=1;
3310   Int_t ibin[2];
3311   if(fBeamType==1)
3312   {
3313       loopcentr=nBinPbPb[0];
3314   }
3315
3316   for(int icentr=0; icentr<loopcentr; icentr++)
3317   {
3318       Double_t trdtpcPidEfficiency = fEfficiencyFunction->Eval(0); // assume we have constant TRD+TPC PID efficiency
3319       for(int i=0; i<looppt; i++)
3320       {
3321           pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
3322
3323           Double_t tofpideff = 0.;
3324           Double_t tofpideffesd = 0.;
3325           if(fEfficiencyTOFPIDD[icentr])
3326             tofpideff = fEfficiencyTOFPIDD[icentr]->Eval(pt[0]); 
3327           else{
3328             printf("TOF PID fit failed on conversion for centrality %d. The result is wrong!\n",icentr);
3329           }  
3330           if(fEfficiencyesdTOFPIDD[icentr])
3331             tofpideffesd = fEfficiencyesdTOFPIDD[icentr]->Eval(pt[0]);
3332           else{
3333             printf("TOF PID fit failed on conversion for centrality %d. The result is wrong!\n",icentr);
3334           }
3335
3336           //tof pid eff x tpc pid eff x ip cut eff
3337           if(fIPParameterizedEff){
3338             if(source==0) {
3339               if(fEfficiencyIPCharmD[icentr]){
3340                 weight[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyIPCharmD[icentr]->Eval(pt[0]);
3341                 weightErr[icentr] = 0; 
3342               }
3343               else{
3344                 printf("Fit failed on charm IP cut efficiency for centrality %d\n",icentr);
3345                 weight[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD[icentr]->GetBinContent(i+1);
3346                 weightErr[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD[icentr]->GetBinError(i+1); 
3347               }
3348             } 
3349             else if(source==2) {
3350               if(fEfficiencyIPConversionD[icentr]){
3351                 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fEfficiencyIPConversionD[icentr]->Eval(pt[0]); 
3352                 weightErr[icentr] = 0; 
3353               }
3354               else{
3355                 printf("Fit failed on conversion IP cut efficiency for centrality %d\n",icentr);
3356                 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEff[icentr]->GetBinContent(i+1);
3357                 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEff[icentr]->GetBinError(i+1);
3358               }
3359             }
3360             else if(source==3) {
3361               if(fEfficiencyIPNonhfeD[icentr]){
3362                 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fEfficiencyIPNonhfeD[icentr]->Eval(pt[0]); 
3363                 weightErr[icentr] = 0; 
3364               }
3365               else{
3366                 printf("Fit failed on dalitz IP cut efficiency for centrality %d\n",icentr);
3367                 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff[icentr]->GetBinContent(i+1);
3368                 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff[icentr]->GetBinError(i+1);
3369               }  
3370             }
3371           }
3372           else{
3373             if(source==0){ 
3374               if(fEfficiencyIPCharmD[icentr]){
3375                 weight[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyIPCharmD[icentr]->Eval(pt[0]);
3376                 weightErr[icentr] = 0;
3377               }
3378               else{
3379                 printf("Fit failed on charm IP cut efficiency for centrality %d\n",icentr);
3380                 weight[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD[icentr]->GetBinContent(i+1);
3381                 weightErr[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD[icentr]->GetBinError(i+1);
3382               }
3383             }
3384             else if(source==2){
3385               if(fBeamType==0){
3386                 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEffbgc->GetBinContent(i+1); // conversion
3387                 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEffbgc->GetBinError(i+1);
3388               }
3389               else{
3390                 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEff[icentr]->GetBinContent(i+1); // conversion
3391                 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEff[icentr]->GetBinError(i+1);
3392               }
3393             }
3394             else if(source==3){
3395               if(fBeamType==0){
3396                 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEffbgc->GetBinContent(i+1); // conversion
3397                 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEffbgc->GetBinError(i+1);
3398               }
3399               else{ 
3400                 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff[icentr]->GetBinContent(i+1); // Dalitz
3401                 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff[icentr]->GetBinError(i+1);
3402               }
3403             }
3404           }
3405
3406           if(fBeamType==1){
3407               contents[0]=icentr;
3408               contents[1]=pt[0];
3409               ibin[0]=icentr;
3410               ibin[1]=i+1;
3411           }
3412           if(fBeamType==0){
3413               contents[0]=pt[0];
3414               ibin[0]=i+1;
3415           }
3416
3417           pideff->Fill(contents,weight[icentr]);
3418           pideff->SetBinError(ibin,weightErr[icentr]);
3419       }
3420   }
3421
3422   Int_t nDimSparse = pideff->GetNdimensions();
3423   Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
3424   Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
3425
3426   for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3427       binsvar[iVar] = pideff->GetAxis(iVar)->GetNbins();
3428       nBins *= binsvar[iVar];
3429   }
3430
3431   Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
3432   // loop that sets 0 error in each bin
3433   for (Long_t iBin=0; iBin<nBins; iBin++) {
3434     Long_t bintmp = iBin ;
3435     for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3436       binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
3437       bintmp /= binsvar[iVar] ;
3438     }
3439   }
3440
3441   delete[] binsvar;
3442   delete[] binfill;
3443
3444
3445   return pideff;
3446 }
3447
3448 //__________________________________________________________________________
3449 AliCFDataGrid *AliHFEspectrum::GetRawBspectra2ndMethod(){
3450  //
3451  // retrieve AliCFDataGrid for raw beauty spectra obtained from fit method
3452     //
3453     Int_t ptpr = 0;
3454     Int_t nDim = 1;
3455     if(fBeamType==0)
3456     {
3457         ptpr=0;
3458     }
3459     if(fBeamType==1)
3460     {
3461         ptpr=1;
3462         nDim=2;
3463     }
3464
3465     const Int_t nPtbinning1 = 18;//number of pt bins, according to new binning
3466     const Int_t nCentralitybinning=11;//number of centrality bins
3467     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};
3468    
3469     Double_t kCentralityRange[nCentralitybinning+1] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
3470     Int_t nBin[1] = {nPtbinning1};
3471     Int_t nBinPbPb[2] = {nCentralitybinning,nPtbinning1};
3472
3473     AliCFDataGrid *rawBeautyContainer;
3474     if(fBeamType==0)  rawBeautyContainer = new AliCFDataGrid("rawBeautyContainer","rawBeautyContainer",nDim,nBin);
3475     else rawBeautyContainer = new AliCFDataGrid("rawBeautyContainer","rawBeautyContainer",nDim,nBinPbPb);
3476     //  printf("number of bins= %d\n",bins[0]);
3477
3478
3479     
3480     
3481     THnSparseF *brawspectra;
3482     if(fBeamType==0) brawspectra= new THnSparseF("brawspectra", "beauty yields ; p_{t}(GeV/c)", nDim, nBin);
3483     else brawspectra= new THnSparseF("brawspectra", "beauty yields ; p_{t}(GeV/c)", nDim, nBinPbPb);
3484     if(fBeamType==0) brawspectra->SetBinEdges(0, kPtRange);
3485     if(fBeamType==1)
3486       {
3487         //      brawspectra->SetBinEdges(0, centralityBins);
3488         brawspectra->SetBinEdges(0, kCentralityRange);
3489         brawspectra->SetBinEdges(1, kPtRange);
3490       }
3491     
3492     Double_t pt[1];
3493     Double_t yields= 0.;
3494     Double_t valuesb[2];
3495     
3496     //Int_t looppt=nBin[0];
3497     Int_t loopcentr=1;
3498     if(fBeamType==1)
3499       {
3500         loopcentr=nBinPbPb[0];
3501       }
3502     
3503     for(int icentr=0; icentr<loopcentr; icentr++)
3504       {
3505         
3506         for(int i=0; i<fBSpectrum2ndMethod->GetNbinsX(); i++){
3507           pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
3508           
3509           yields = fBSpectrum2ndMethod->GetBinContent(i+1);
3510           
3511           if(fBeamType==1)
3512             {
3513               valuesb[0]=icentr;
3514               valuesb[1]=pt[0];
3515             }
3516           if(fBeamType==0) valuesb[0]=pt[0];
3517           brawspectra->Fill(valuesb,yields);
3518         }
3519       }
3520     
3521     
3522     
3523     Int_t nDimSparse = brawspectra->GetNdimensions();
3524     Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
3525     Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
3526     
3527     for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3528       binsvar[iVar] = brawspectra->GetAxis(iVar)->GetNbins();
3529       nBins *= binsvar[iVar];
3530     }
3531     
3532     Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
3533     // loop that sets 0 error in each bin
3534     for (Long_t iBin=0; iBin<nBins; iBin++) {
3535       Long_t bintmp = iBin ;
3536       for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3537         binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
3538         bintmp /= binsvar[iVar] ;
3539       }
3540       brawspectra->SetBinError(binfill,0.); // put 0 everywhere
3541     }
3542     
3543     
3544     rawBeautyContainer->SetGrid(brawspectra); // get charm efficiency
3545     TH1D* hRawBeautySpectra = (TH1D*)rawBeautyContainer->Project(ptpr);
3546     
3547     new TCanvas;
3548     fBSpectrum2ndMethod->SetMarkerStyle(24);
3549     fBSpectrum2ndMethod->Draw("p");
3550     hRawBeautySpectra->SetMarkerStyle(25);
3551     hRawBeautySpectra->Draw("samep");
3552
3553     delete[] binfill;
3554     delete[] binsvar; 
3555
3556     return rawBeautyContainer;
3557 }
3558
3559 //__________________________________________________________________________
3560 void AliHFEspectrum::CalculateNonHFEsyst(Int_t centrality){
3561   //
3562   // Calculate non HFE sys
3563   //
3564   //
3565
3566   if(!fNonHFEsyst)
3567     return;
3568
3569   Double_t evtnorm[1] = {0.0};
3570   if(fNMCbgEvents[0]>0) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents[0]);
3571   
3572   AliCFDataGrid *convSourceGrid[kElecBgSources][kBgLevels];
3573   AliCFDataGrid *nonHFESourceGrid[kElecBgSources][kBgLevels];
3574
3575   AliCFDataGrid *bgLevelGrid[2][kBgLevels];//for pi0 and eta based errors
3576   AliCFDataGrid *bgNonHFEGrid[kBgLevels];
3577   AliCFDataGrid *bgConvGrid[kBgLevels];
3578
3579   Int_t stepbackground = 3;
3580   Int_t* bins=new Int_t[1];
3581   const Char_t *bgBase[2] = {"pi0","eta"};
3582  
3583   bins[0]=fConversionEff[centrality]->GetNbinsX();
3584    
3585   AliCFDataGrid *weightedConversionContainer = new AliCFDataGrid("weightedConversionContainer","weightedConversionContainer",1,bins);
3586   AliCFDataGrid *weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",1,bins);
3587
3588   for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){   
3589     for(Int_t iSource = 0; iSource < kElecBgSources; iSource++){
3590       convSourceGrid[iSource][iLevel] = new AliCFDataGrid(Form("convGrid_%d_%d_%d",iSource,iLevel,centrality),Form("convGrid_%d_%d_%d",iSource,iLevel,centrality),*fConvSourceContainer[iSource][iLevel][centrality],stepbackground);
3591       weightedConversionContainer->SetGrid(GetPIDxIPEff(2));
3592       convSourceGrid[iSource][iLevel]->Multiply(weightedConversionContainer,1.0);
3593       
3594       nonHFESourceGrid[iSource][iLevel] = new AliCFDataGrid(Form("nonHFEGrid_%d_%d_%d",iSource,iLevel,centrality),Form("nonHFEGrid_%d_%d_%d",iSource,iLevel,centrality),*fNonHFESourceContainer[iSource][iLevel][centrality],stepbackground);
3595       weightedNonHFEContainer->SetGrid(GetPIDxIPEff(3));
3596       nonHFESourceGrid[iSource][iLevel]->Multiply(weightedNonHFEContainer,1.0);
3597     }
3598     
3599     bgConvGrid[iLevel] = (AliCFDataGrid*)convSourceGrid[0][iLevel]->Clone();
3600     for(Int_t iSource = 2; iSource < kElecBgSources; iSource++){
3601       bgConvGrid[iLevel]->Add(convSourceGrid[iSource][iLevel]);
3602     }
3603     if(!fEtaSyst)
3604       bgConvGrid[iLevel]->Add(convSourceGrid[1][iLevel]);
3605     
3606     bgNonHFEGrid[iLevel] = (AliCFDataGrid*)nonHFESourceGrid[0][iLevel]->Clone(); 
3607     for(Int_t iSource = 2; iSource < kElecBgSources; iSource++){//add other sources to pi0, to get overall background from all meson decays, exception: eta (independent error calculation)
3608       bgNonHFEGrid[iLevel]->Add(nonHFESourceGrid[iSource][iLevel]);
3609     }
3610     if(!fEtaSyst)
3611       bgNonHFEGrid[iLevel]->Add(nonHFESourceGrid[1][iLevel]);
3612     
3613     bgLevelGrid[0][iLevel] = (AliCFDataGrid*)bgConvGrid[iLevel]->Clone();
3614     bgLevelGrid[0][iLevel]->Add(bgNonHFEGrid[iLevel]);
3615     if(fEtaSyst){
3616       bgLevelGrid[1][iLevel] = (AliCFDataGrid*)nonHFESourceGrid[1][iLevel]->Clone();//background for eta source
3617       bgLevelGrid[1][iLevel]->Add(convSourceGrid[1][iLevel]);
3618     }
3619   }
3620  
3621   
3622   //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) 
3623   AliCFDataGrid *bgErrorGrid[2][2];//for pions/eta error base, for lower/upper
3624   TH1D* hBaseErrors[2][2];//pi0/eta and lower/upper
3625   for(Int_t iErr = 0; iErr < 2; iErr++){//errors for pi0 and eta base
3626     bgErrorGrid[iErr][0] = (AliCFDataGrid*)bgLevelGrid[iErr][1]->Clone();
3627     bgErrorGrid[iErr][0]->Add(bgLevelGrid[iErr][0],-1.);
3628     bgErrorGrid[iErr][1] = (AliCFDataGrid*)bgLevelGrid[iErr][2]->Clone();    
3629     bgErrorGrid[iErr][1]->Add(bgLevelGrid[iErr][0],-1.);
3630
3631   //plot absolute differences between limit yields (upper/lower limit, based on pi0 and eta errors) and best estimate
3632  
3633     hBaseErrors[iErr][0] = (TH1D*)bgErrorGrid[iErr][0]->Project(0);
3634     hBaseErrors[iErr][0]->Scale(-1.);
3635     hBaseErrors[iErr][0]->SetTitle(Form("Absolute %s-based systematic errors from non-HF meson decays and conversions",bgBase[iErr]));
3636     hBaseErrors[iErr][1] = (TH1D*)bgErrorGrid[iErr][1]->Project(0);
3637     if(!fEtaSyst)break;
3638   }
3639   
3640  
3641   //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
3642   TH1D *hSpeciesErrors[kElecBgSources-1];
3643   for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
3644     if(fEtaSyst && (iSource == 1))continue;
3645     hSpeciesErrors[iSource-1] = (TH1D*)convSourceGrid[iSource][0]->Project(0);
3646     TH1D *hNonHFEtemp = (TH1D*)nonHFESourceGrid[iSource][0]->Project(0);
3647     hSpeciesErrors[iSource-1]->Add(hNonHFEtemp);
3648     hSpeciesErrors[iSource-1]->Scale(0.3);   
3649   }
3650   
3651   //Int_t firstBgSource = 0;//if eta systematics are not from scaling
3652   //if(fEtaSyst){firstBgSource = 1;}//source 0 histograms are not filled if eta errors are independently determined!
3653   TH1D *hOverallSystErrLow = (TH1D*)hSpeciesErrors[1]->Clone();
3654   TH1D *hOverallSystErrUp = (TH1D*)hSpeciesErrors[1]->Clone();
3655   TH1D *hScalingErrors = (TH1D*)hSpeciesErrors[1]->Clone();
3656
3657   TH1D *hOverallBinScaledErrsUp = (TH1D*)hOverallSystErrUp->Clone();
3658   TH1D *hOverallBinScaledErrsLow = (TH1D*)hOverallSystErrLow->Clone();
3659
3660   for(Int_t iBin = 1; iBin <= kBgPtBins; iBin++){
3661     Double_t pi0basedErrLow,pi0basedErrUp,etaErrLow,etaErrUp;    
3662     pi0basedErrLow = hBaseErrors[0][0]->GetBinContent(iBin); 
3663     pi0basedErrUp = hBaseErrors[0][1]->GetBinContent(iBin);
3664     if(fEtaSyst){
3665       etaErrLow = hBaseErrors[1][0]->GetBinContent(iBin); 
3666       etaErrUp = hBaseErrors[1][1]->GetBinContent(iBin);
3667     }
3668     else{ etaErrLow = etaErrUp = 0.;}
3669
3670     Double_t sqrsumErrs= 0;
3671     for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
3672       if(fEtaSyst && (iSource == 1))continue;
3673       Double_t scalingErr=hSpeciesErrors[iSource-1]->GetBinContent(iBin);
3674       sqrsumErrs+=(scalingErr*scalingErr);
3675     }
3676     for(Int_t iErr = 0; iErr < 2; iErr++){
3677       for(Int_t iLevel = 0; iLevel < 2; iLevel++){
3678         hBaseErrors[iErr][iLevel]->SetBinContent(iBin,hBaseErrors[iErr][iLevel]->GetBinContent(iBin)/hBaseErrors[iErr][iLevel]->GetBinWidth(iBin));
3679       }
3680       if(!fEtaSyst)break;
3681     }
3682     hOverallSystErrUp->SetBinContent(iBin, TMath::Sqrt((pi0basedErrUp*pi0basedErrUp)+(etaErrUp*etaErrUp)+sqrsumErrs));
3683     hOverallSystErrLow->SetBinContent(iBin, TMath::Sqrt((pi0basedErrLow*pi0basedErrLow)+(etaErrLow*etaErrLow)+sqrsumErrs));
3684     hScalingErrors->SetBinContent(iBin, TMath::Sqrt(sqrsumErrs)/hScalingErrors->GetBinWidth(iBin));
3685
3686     hOverallBinScaledErrsUp->SetBinContent(iBin,hOverallSystErrUp->GetBinContent(iBin)/hOverallBinScaledErrsUp->GetBinWidth(iBin));
3687     hOverallBinScaledErrsLow->SetBinContent(iBin,hOverallSystErrLow->GetBinContent(iBin)/hOverallBinScaledErrsLow->GetBinWidth(iBin));            
3688   }
3689    
3690   
3691   TCanvas *cPiErrors = new TCanvas("cPiErrors","cPiErrors",1000,600);
3692   cPiErrors->cd();
3693   cPiErrors->SetLogx();
3694   cPiErrors->SetLogy();
3695   hBaseErrors[0][0]->Draw();
3696   //hBaseErrors[0][1]->SetMarkerColor(kBlack);
3697   //hBaseErrors[0][1]->SetLineColor(kBlack);
3698   //hBaseErrors[0][1]->Draw("SAME");
3699   if(fEtaSyst){
3700     hBaseErrors[1][0]->Draw("SAME");
3701     hBaseErrors[1][0]->SetMarkerColor(kBlack);
3702     hBaseErrors[1][0]->SetLineColor(kBlack);
3703   //hBaseErrors[1][1]->SetMarkerColor(13);
3704   //hBaseErrors[1][1]->SetLineColor(13);
3705   //hBaseErrors[1][1]->Draw("SAME");
3706   }
3707   //hOverallBinScaledErrsUp->SetMarkerColor(kBlue);
3708   //hOverallBinScaledErrsUp->SetLineColor(kBlue);
3709   //hOverallBinScaledErrsUp->Draw("SAME");
3710   hOverallBinScaledErrsLow->SetMarkerColor(kGreen);
3711   hOverallBinScaledErrsLow->SetLineColor(kGreen);
3712   hOverallBinScaledErrsLow->Draw("SAME");
3713   hScalingErrors->SetLineColor(kBlue);
3714   hScalingErrors->Draw("SAME");
3715
3716   TLegend *lPiErr = new TLegend(0.6,0.6, 0.95,0.95);
3717   lPiErr->AddEntry(hBaseErrors[0][0],"Lower error from pion error");
3718   //lPiErr->AddEntry(hBaseErrors[0][1],"Upper error from pion error");
3719   if(fEtaSyst){
3720   lPiErr->AddEntry(hBaseErrors[1][0],"Lower error from eta error");
3721   //lPiErr->AddEntry(hBaseErrors[1][1],"Upper error from eta error");
3722   }
3723   lPiErr->AddEntry(hScalingErrors, "scaling error");
3724   lPiErr->AddEntry(hOverallBinScaledErrsLow, "overall lower systematics");
3725   //lPiErr->AddEntry(hOverallBinScaledErrsUp, "overall upper systematics");
3726   lPiErr->Draw("SAME");
3727
3728   //Normalize errors
3729   TH1D *hUpSystScaled = (TH1D*)hOverallSystErrUp->Clone();
3730   TH1D *hLowSystScaled = (TH1D*)hOverallSystErrLow->Clone();
3731   hUpSystScaled->Scale(evtnorm[0]);//scale by N(data)/N(MC), to make data sets comparable to saved subtracted spectrum (calculations in separate macro!)
3732   hLowSystScaled->Scale(evtnorm[0]);
3733   TH1D *hNormAllSystErrUp = (TH1D*)hUpSystScaled->Clone();
3734   TH1D *hNormAllSystErrLow = (TH1D*)hLowSystScaled->Clone();
3735   //histograms to be normalized to TGraphErrors
3736   CorrectFromTheWidth(hNormAllSystErrUp);
3737   CorrectFromTheWidth(hNormAllSystErrLow);
3738
3739   TCanvas *cNormOvErrs = new TCanvas("cNormOvErrs","cNormOvErrs");
3740   cNormOvErrs->cd();
3741   cNormOvErrs->SetLogx();
3742   cNormOvErrs->SetLogy();
3743
3744   TGraphErrors* gOverallSystErrUp = NormalizeTH1(hNormAllSystErrUp);
3745   TGraphErrors* gOverallSystErrLow = NormalizeTH1(hNormAllSystErrLow);
3746   gOverallSystErrUp->SetTitle("Overall Systematic non-HFE Errors");
3747   gOverallSystErrUp->SetMarkerColor(kBlack);
3748   gOverallSystErrUp->SetLineColor(kBlack);
3749   gOverallSystErrLow->SetMarkerColor(kRed);
3750   gOverallSystErrLow->SetLineColor(kRed);
3751   gOverallSystErrUp->Draw("AP");
3752   gOverallSystErrLow->Draw("PSAME");
3753   TLegend *lAllSys = new TLegend(0.4,0.6,0.89,0.89);
3754   lAllSys->AddEntry(gOverallSystErrLow,"lower","p");
3755   lAllSys->AddEntry(gOverallSystErrUp,"upper","p");
3756   lAllSys->Draw("same");
3757
3758
3759   AliCFDataGrid *bgYieldGrid;
3760   if(fEtaSyst){
3761     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.
3762   }
3763   bgYieldGrid = (AliCFDataGrid*)bgLevelGrid[0][0]->Clone();
3764
3765   TH1D *hBgYield = (TH1D*)bgYieldGrid->Project(0);
3766   TH1D* hRelErrUp = (TH1D*)hOverallSystErrUp->Clone();
3767   hRelErrUp->Divide(hBgYield);
3768   TH1D* hRelErrLow = (TH1D*)hOverallSystErrLow->Clone();
3769   hRelErrLow->Divide(hBgYield);
3770
3771   TCanvas *cRelErrs = new TCanvas("cRelErrs","cRelErrs");
3772   cRelErrs->cd();
3773   cRelErrs->SetLogx();
3774   hRelErrUp->SetTitle("Relative error of non-HFE background yield");
3775   hRelErrUp->Draw();
3776   hRelErrLow->SetLineColor(kBlack);
3777   hRelErrLow->Draw("SAME");
3778
3779   TLegend *lRel = new TLegend(0.6,0.6,0.95,0.95);
3780   lRel->AddEntry(hRelErrUp, "upper");
3781   lRel->AddEntry(hRelErrLow, "lower");
3782   lRel->Draw("SAME");
3783
3784   //CorrectFromTheWidth(hBgYield);
3785   //hBgYield->Scale(evtnorm[0]);
3786  
3787  
3788   //write histograms/TGraphs to file
3789   TFile *output = new TFile("systHists.root","recreate");
3790
3791   hBgYield->SetName("hBgYield");  
3792   hBgYield->Write();
3793   hRelErrUp->SetName("hRelErrUp");
3794   hRelErrUp->Write();
3795   hRelErrLow->SetName("hRelErrLow");
3796   hRelErrLow->Write();
3797   hUpSystScaled->SetName("hOverallSystErrUp");
3798   hUpSystScaled->Write();
3799   hLowSystScaled->SetName("hOverallSystErrLow");
3800   hLowSystScaled->Write();
3801   gOverallSystErrUp->SetName("gOverallSystErrUp");
3802   gOverallSystErrUp->Write();
3803   gOverallSystErrLow->SetName("gOverallSystErrLow");
3804   gOverallSystErrLow->Write(); 
3805
3806   output->Close(); 
3807   delete output;
3808   
3809 }
3810
3811 //____________________________________________________________
3812 void AliHFEspectrum::UnfoldBG(AliCFDataGrid* const bgsubpectrum){
3813
3814   //
3815   // Unfold backgrounds to check its sanity
3816   //
3817
3818   AliCFContainer *mcContainer = GetContainer(kMCContainerCharmMC);
3819   //AliCFContainer *mcContainer = GetContainer(kMCContainerMC);
3820   if(!mcContainer){
3821     AliError("MC Container not available");
3822     return;
3823   }
3824
3825   if(!fCorrelation){
3826     AliError("No Correlation map available");
3827     return;
3828   }
3829
3830   // Data 
3831   AliCFDataGrid *dataGrid = 0x0;
3832   dataGrid = bgsubpectrum;
3833
3834   // Guessed
3835   AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainer, fStepGuessedUnfolding);
3836   THnSparse* guessedTHnSparse = ((AliCFGridSparse*)guessedGrid->GetData())->GetGrid();
3837
3838   // Efficiency
3839   AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
3840   efficiencyD->CalculateEfficiency(fStepMC+2,fStepTrue);
3841
3842   // Unfold background spectra
3843   Int_t nDim=1;
3844   if(fBeamType==0)nDim = 1;
3845   if(fBeamType==1)nDim = 2;
3846   AliCFUnfolding unfolding("unfolding","",nDim,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse);
3847   if(fUnSetCorrelatedErrors) unfolding.UnsetCorrelatedErrors();
3848   unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
3849   if(fSetSmoothing) unfolding.UseSmoothing();
3850   unfolding.Unfold();
3851
3852   // Results
3853   THnSparse* result = unfolding.GetUnfolded();
3854   TCanvas *ctest = new TCanvas("yvonnetest","yvonnetest",1000,600);
3855   if(fBeamType==1)
3856   {
3857       ctest->Divide(2,2);
3858       ctest->cd(1);
3859       result->GetAxis(0)->SetRange(1,1);
3860       TH1D* htest1=(TH1D*)result->Projection(0);
3861       htest1->Draw();
3862       ctest->cd(2);
3863       result->GetAxis(0)->SetRange(1,1);
3864       TH1D* htest2=(TH1D*)result->Projection(1);
3865       htest2->Draw();
3866       ctest->cd(3);
3867       result->GetAxis(0)->SetRange(6,6);
3868       TH1D* htest3=(TH1D*)result->Projection(0);
3869       htest3->Draw();
3870       ctest->cd(4);
3871       result->GetAxis(0)->SetRange(6,6);
3872       TH1D* htest4=(TH1D*)result->Projection(1);
3873       htest4->Draw();
3874
3875   }
3876
3877
3878
3879
3880
3881   TGraphErrors* unfoldedbgspectrumD = Normalize(result);
3882   if(!unfoldedbgspectrumD) {
3883     AliError("Unfolded background spectrum doesn't exist");
3884   }
3885   else{
3886     TFile *file = TFile::Open("unfoldedbgspectrum.root","recreate");
3887     if(fBeamType==0)unfoldedbgspectrumD->Write("unfoldedbgspectrum");
3888
3889     if(fBeamType==1)
3890     {
3891         Int_t centr=1;
3892         result->GetAxis(0)->SetRange(centr,centr);
3893         unfoldedbgspectrumD = Normalize(result,centr-1);
3894         unfoldedbgspectrumD->Write("unfoldedbgspectrum_centr0_20");
3895         centr=6;
3896         result->GetAxis(0)->SetRange(centr,centr);
3897         unfoldedbgspectrumD = Normalize(result,centr-1);
3898         unfoldedbgspectrumD->Write("unfoldedbgspectrum_centr40_80");
3899     }
3900
3901     file->Close();
3902   }
3903 }