2 /**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 // Class for spectrum correction
18 // Subtraction of hadronic background, Unfolding of the data and
19 // Renormalization done here
20 // The following containers have to be set:
21 // - Correction framework container for real data
22 // - Correction framework container for MC (Efficiency Map)
23 // - Correction framework container for background coming from data
24 // - Correction framework container for background coming from MC
27 // Raphaelle Bailhache <R.Bailhache@gsi.de>
28 // Markus Fasel <M.Fasel@gsi.de>
34 #include <TObjArray.h>
41 #include <TGraphErrors.h>
48 #include "AliCFContainer.h"
49 #include "AliCFDataGrid.h"
50 #include "AliCFEffGrid.h"
51 #include "AliCFGridSparse.h"
52 #include "AliCFUnfolding.h"
55 #include "AliHFEspectrum.h"
56 #include "AliHFEcuts.h"
57 #include "AliHFEcontainer.h"
58 #include "AliHFEtools.h"
60 ClassImp(AliHFEspectrum)
62 //____________________________________________________________
63 AliHFEspectrum::AliHFEspectrum(const char *name):
65 fCFContainers(new TObjArray(kDataContainerV0+1)),
66 fTemporaryObjects(NULL),
69 fEfficiencyFunction(NULL),
71 fInclusiveSpectrum(kTRUE),
74 fUnSetCorrelatedErrors(kTRUE),
75 fSetSmoothing(kFALSE),
76 fIPanaHadronBgSubtract(kFALSE),
77 fIPanaCharmBgSubtract(kFALSE),
78 fIPanaConversionBgSubtract(kFALSE),
79 fIPanaNonHFEBgSubtract(kFALSE),
80 fIPParameterizedEff(kFALSE),
82 fBeauty2ndMethod(kFALSE),
83 fIPEffCombinedSamples(kTRUE),
89 fStepBeforeCutsV0(-1),
91 fStepGuessedUnfolding(-1),
92 fNumberOfIterations(5),
93 fChargeChoosen(kAllCharge),
94 fNCentralityBinAtTheEnd(0),
95 fHadronEffbyIPcut(NULL),
96 fConversionEffbgc(NULL),
98 fBSpectrum2ndMethod(NULL),
99 fkBeauty2ndMethodfilename(""),
105 // Default constructor
108 for(Int_t k = 0; k < 20; k++){
111 fLowBoundaryCentralityBinAtTheEnd[k] = 0;
112 fHighBoundaryCentralityBinAtTheEnd[k] = 0;
115 fEfficiencyTOFPIDD[k] = 0;
116 fEfficiencyesdTOFPIDD[k] = 0;
117 fEfficiencyIPCharmD[k] = 0;
118 fEfficiencyIPBeautyD[k] = 0;
119 fEfficiencyIPConversionD[k] = 0;
120 fEfficiencyIPNonhfeD[k] = 0;
122 fConversionEff[k] = 0;
126 fEfficiencyCharmSigD[k] = 0;
127 fEfficiencyBeautySigD[k] = 0;
130 memset(fEtaRange, 0, sizeof(Double_t) * 2);
131 memset(fEtaRangeNorm, 0, sizeof(Double_t) * 2);
132 memset(fConvSourceContainer, 0, sizeof(AliCFContainer*) * kElecBgSources * kBgLevels);
133 memset(fNonHFESourceContainer, 0, sizeof(AliCFContainer*) * kElecBgSources * kBgLevels);
136 //____________________________________________________________
137 AliHFEspectrum::~AliHFEspectrum(){
141 if(fCFContainers) delete fCFContainers;
142 if(fTemporaryObjects){
143 fTemporaryObjects->Clear();
144 delete fTemporaryObjects;
147 //____________________________________________________________
148 Bool_t AliHFEspectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer *v0hfecontainer, const AliHFEcontainer *bghfecontainer){
150 // Init what we need for the correction:
152 // Raw spectrum, hadron contamination
153 // MC efficiency maps, correlation matrix
154 // V0 efficiency if wanted
156 // This for a given dimension.
157 // If no inclusive spectrum, then take only efficiency map for beauty electron
158 // and the appropriate correlation matrix
162 if(fBeauty2ndMethod) CallInputFileForBeauty2ndMethod();
167 if(fBeamType==0) kNdim=3;
176 // Get the requested format
179 switch(fNbDimensions){
182 case 2: for(Int_t i = 0; i < 2; i++) dims[i] = i;
184 case 3: for(Int_t i = 0; i < 3; i++) dims[i] = i;
187 AliError("Container with this number of dimensions not foreseen (yet)");
193 // PbPb analysis; centrality as first dimension
194 Int_t nbDimensions = fNbDimensions;
195 fNbDimensions = fNbDimensions + 1;
196 switch(nbDimensions){
201 for(Int_t i = 0; i < 2; i++) dims[(i+1)] = i;
204 for(Int_t i = 0; i < 3; i++) dims[(i+1)] = i;
207 AliError("Container with this number of dimensions not foreseen (yet)");
212 // Data container: raw spectrum + hadron contamination
213 AliCFContainer *datacontainer = 0x0;
214 if(fInclusiveSpectrum) {
215 datacontainer = datahfecontainer->GetCFContainer("recTrackContReco");
219 datacontainer = datahfecontainer->MakeMergedCFContainer("sumreco","sumreco","recTrackContReco:recTrackContDEReco");
221 AliCFContainer *contaminationcontainer = datahfecontainer->GetCFContainer("hadronicBackground");
222 if((!datacontainer) || (!contaminationcontainer)) return kFALSE;
224 AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, dims, -1, fChargeChoosen);
225 AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, dims, -1, fChargeChoosen);
226 if((!datacontainerD) || (!contaminationcontainerD)) return kFALSE;
228 SetContainer(datacontainerD,AliHFEspectrum::kDataContainer);
229 SetContainer(contaminationcontainerD,AliHFEspectrum::kBackgroundData);
231 // MC container: ESD/MC efficiency maps + MC/MC efficiency maps
232 AliCFContainer *mccontaineresd = 0x0;
233 AliCFContainer *mccontaineresdbg = 0x0;
234 AliCFContainer *mccontainermc = 0x0;
235 AliCFContainer *mccontainermcbg = 0x0;
236 AliCFContainer *nonHFEweightedContainer = 0x0;
237 AliCFContainer *convweightedContainer = 0x0;
238 AliCFContainer *nonHFEtempContainer = 0x0;//temporary container to be sliced for the fnonHFESourceContainers
239 AliCFContainer *convtempContainer = 0x0;//temporary container to be sliced for the fConvSourceContainers
241 if(fInclusiveSpectrum) {
242 mccontaineresd = mchfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco");
243 mccontainermc = mchfecontainer->MakeMergedCFContainer("summc","summc","MCTrackCont:recTrackContMC");
246 mccontaineresd = mchfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco:recTrackContDEReco");
247 mccontaineresdbg = bghfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco:recTrackContDEReco");
248 mccontainermc = mchfecontainer->MakeMergedCFContainer("summc","summc","MCTrackCont:recTrackContMC:recTrackContDEMC");
249 mccontainermcbg = bghfecontainer->MakeMergedCFContainer("summcbg","summcbg","MCTrackCont:recTrackContMC:recTrackContDEMC");
252 const Char_t *sourceName[kElecBgSources]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
253 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
254 for(Int_t iSource = 0; iSource < kElecBgSources; iSource++){
255 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
256 nonHFEtempContainer = bghfecontainer->GetCFContainer(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]));
257 convtempContainer = bghfecontainer->GetCFContainer(Form("conversionElecs%s%s",sourceName[iSource],levelName[iLevel]));
258 for(Int_t icentr=0;icentr<kNcentr;icentr++)
262 fConvSourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(convtempContainer, fNbDimensions, dims, -1, fChargeChoosen);
263 fNonHFESourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(nonHFEtempContainer, fNbDimensions, dims, -1, fChargeChoosen);
268 fConvSourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(convtempContainer, fNbDimensions, dims, -1, fChargeChoosen,icentr+1);
269 fNonHFESourceContainer[iSource][iLevel][icentr] = GetSlicedContainer(nonHFEtempContainer, fNbDimensions, dims, -1, fChargeChoosen,icentr+1);
271 // if((!fConvSourceContainer[iSource][iLevel][icentr])||(!fNonHFESourceContainer[iSource][iLevel])) return kFALSE;
277 nonHFEweightedContainer = bghfecontainer->GetCFContainer("mesonElecs");
278 convweightedContainer = bghfecontainer->GetCFContainer("conversionElecs");
279 if((!convweightedContainer)||(!nonHFEweightedContainer)) return kFALSE;
282 if((!mccontaineresd) || (!mccontainermc)) return kFALSE;
285 if(!fInclusiveSpectrum) source = 1; //beauty
286 AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, dims, source, fChargeChoosen);
287 AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, dims, source, fChargeChoosen);
288 if((!mccontaineresdD) || (!mccontainermcD)) return kFALSE;
289 SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerMC);
290 SetContainer(mccontaineresdD,AliHFEspectrum::kMCContainerESD);
292 // set charm, nonHFE container to estimate BG
293 if(!fInclusiveSpectrum){
295 mccontainermcD = GetSlicedContainer(mccontainermcbg, fNbDimensions, dims, source, fChargeChoosen);
296 SetContainer(mccontainermcD,AliHFEspectrum::kMCContainerCharmMC);
298 SetParameterizedEff(mccontainermc, mccontainermcbg, mccontaineresd, mccontaineresdbg, dims);
301 AliCFContainer *nonHFEweightedContainerD = GetSlicedContainer(nonHFEweightedContainer, fNbDimensions, dims, -1, fChargeChoosen);
302 SetContainer(nonHFEweightedContainerD,AliHFEspectrum::kMCWeightedContainerNonHFEESD);
303 AliCFContainer *convweightedContainerD = GetSlicedContainer(convweightedContainer, fNbDimensions, dims, -1, fChargeChoosen);
304 SetContainer(convweightedContainerD,AliHFEspectrum::kMCWeightedContainerConversionESD);
307 AliCFEffGrid *nonHFEEffGrid = (AliCFEffGrid*) GetEfficiency(GetContainer(kMCWeightedContainerNonHFEESD),1,0);
308 fNonHFEEffbgc = (TH1D *) nonHFEEffGrid->Project(0);
310 AliCFEffGrid *conversionEffGrid = (AliCFEffGrid*) GetEfficiency(GetContainer(kMCWeightedContainerConversionESD),1,0);
311 fConversionEffbgc = (TH1D *) conversionEffGrid->Project(0);
316 // MC container: correlation matrix
317 THnSparseF *mccorrelation = 0x0;
318 if(fInclusiveSpectrum) {
319 if(fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 2)) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
320 else if(fStepMC==(AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kStepHFEcutsTRD + 1)) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
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");
325 if(!mccorrelation) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
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 THnSparseF *mccorrelationD = GetSlicedCorrelation(mccorrelation, fNbDimensions, dims);
331 if(!mccorrelationD) {
332 printf("No correlation\n");
335 SetCorrelation(mccorrelationD);
337 // V0 container Electron, pt eta phi
339 AliCFContainer *containerV0 = v0hfecontainer->GetCFContainer("taggedTrackContainerReco");
340 if(!containerV0) return kFALSE;
341 AliCFContainer *containerV0Electron = GetSlicedContainer(containerV0, fNbDimensions, dims, AliPID::kElectron);
342 if(!containerV0Electron) return kFALSE;
343 SetContainer(containerV0Electron,AliHFEspectrum::kDataContainerV0);
349 AliCFDataGrid *contaminationspectrum = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(contaminationcontainer,1))->Clone();
350 contaminationspectrum->SetName("contaminationspectrum");
351 TCanvas * ccontaminationspectrum = new TCanvas("contaminationspectrum","contaminationspectrum",1000,700);
352 ccontaminationspectrum->Divide(3,1);
353 ccontaminationspectrum->cd(1);
354 TH2D * contaminationspectrum2dpteta = (TH2D *) contaminationspectrum->Project(1,0);
355 TH2D * contaminationspectrum2dptphi = (TH2D *) contaminationspectrum->Project(2,0);
356 TH2D * contaminationspectrum2detaphi = (TH2D *) contaminationspectrum->Project(1,2);
357 contaminationspectrum2dpteta->SetStats(0);
358 contaminationspectrum2dpteta->SetTitle("");
359 contaminationspectrum2dpteta->GetXaxis()->SetTitle("#eta");
360 contaminationspectrum2dpteta->GetYaxis()->SetTitle("p_{T} [GeV/c]");
361 contaminationspectrum2dptphi->SetStats(0);
362 contaminationspectrum2dptphi->SetTitle("");
363 contaminationspectrum2dptphi->GetXaxis()->SetTitle("#phi [rad]");
364 contaminationspectrum2dptphi->GetYaxis()->SetTitle("p_{T} [GeV/c]");
365 contaminationspectrum2detaphi->SetStats(0);
366 contaminationspectrum2detaphi->SetTitle("");
367 contaminationspectrum2detaphi->GetXaxis()->SetTitle("#eta");
368 contaminationspectrum2detaphi->GetYaxis()->SetTitle("#phi [rad]");
369 contaminationspectrum2dptphi->Draw("colz");
370 ccontaminationspectrum->cd(2);
371 contaminationspectrum2dpteta->Draw("colz");
372 ccontaminationspectrum->cd(3);
373 contaminationspectrum2detaphi->Draw("colz");
375 TCanvas * ccorrelation = new TCanvas("ccorrelation","ccorrelation",1000,700);
379 TH2D * ptcorrelation = (TH2D *) mccorrelationD->Projection(fNbDimensions,0);
380 ptcorrelation->Draw("colz");
383 TH2D * ptcorrelation = (TH2D *) mccorrelationD->Projection(fNbDimensions+1,1);
384 ptcorrelation->Draw("colz");
387 if(fWriteToFile) ccontaminationspectrum->SaveAs("contaminationspectrum.eps");
395 //____________________________________________________________
396 void AliHFEspectrum::CallInputFileForBeauty2ndMethod(){
398 // get spectrum for beauty 2nd method
401 TFile *inputfile2ndmethod=TFile::Open(fkBeauty2ndMethodfilename);
402 fBSpectrum2ndMethod = new TH1D(*static_cast<TH1D*>(inputfile2ndmethod->Get("BSpectrum")));
406 //____________________________________________________________
407 Bool_t AliHFEspectrum::Correct(Bool_t subtractcontamination){
409 // Correct the spectrum for efficiency and unfolding
410 // with both method and compare
413 gStyle->SetPalette(1);
414 gStyle->SetOptStat(1111);
415 gStyle->SetPadBorderMode(0);
416 gStyle->SetCanvasColor(10);
417 gStyle->SetPadLeftMargin(0.13);
418 gStyle->SetPadRightMargin(0.13);
420 printf("Steps are: stepdata %d, stepMC %d, steptrue %d, stepV0after %d, stepV0before %d\n",fStepData,fStepMC,fStepTrue,fStepAfterCutsV0,fStepBeforeCutsV0);
422 ///////////////////////////
423 // Check initialization
424 ///////////////////////////
426 if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
427 AliInfo("You have to init before");
431 if((fStepTrue < 0) && (fStepMC < 0) && (fStepData < 0)) {
432 AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
436 SetNumberOfIteration(10);
437 SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
439 AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
440 //////////////////////////////////
441 // Subtract hadron background
442 /////////////////////////////////
443 AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
444 if(subtractcontamination) {
445 dataspectrumaftersubstraction = SubtractBackground(kTRUE);
446 dataGridAfterFirstSteps = dataspectrumaftersubstraction;
449 ////////////////////////////////////////////////
450 // Correct for TPC efficiency from V0
451 ///////////////////////////////////////////////
452 AliCFDataGrid *dataspectrumafterV0efficiencycorrection = 0x0;
453 AliCFContainer *dataContainerV0 = GetContainer(kDataContainerV0);
454 if(dataContainerV0){printf("Got the V0 container\n");
455 dataspectrumafterV0efficiencycorrection = CorrectV0Efficiency(dataspectrumaftersubstraction);
456 dataGridAfterFirstSteps = dataspectrumafterV0efficiencycorrection;
459 //////////////////////////////////////////////////////////////////////////////
460 // Correct for efficiency parametrized (if TPC efficiency is parametrized)
461 /////////////////////////////////////////////////////////////////////////////
462 AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
463 if(fEfficiencyFunction){
464 dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
465 dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;
471 TList *listunfolded = Unfold(dataGridAfterFirstSteps);
473 printf("Unfolded failed\n");
476 THnSparse *correctedspectrum = (THnSparse *) listunfolded->At(0);
477 THnSparse *residualspectrum = (THnSparse *) listunfolded->At(1);
478 if(!correctedspectrum){
479 AliError("No corrected spectrum\n");
482 if(!residualspectrum){
483 AliError("No residul spectrum\n");
487 /////////////////////
490 AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);
496 if(fDebugLevel > 0.0) {
499 if(fBeamType==0) ptpr=0;
500 if(fBeamType==1) ptpr=1;
502 TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
503 ccorrected->Divide(2,1);
506 TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
507 correctedspectrumD->SetTitle("");
508 correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
509 correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
510 correctedspectrumD->SetMarkerStyle(26);
511 correctedspectrumD->SetMarkerColor(kBlue);
512 correctedspectrumD->SetLineColor(kBlue);
513 correctedspectrumD->Draw("AP");
514 TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
515 alltogetherspectrumD->SetTitle("");
516 alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
517 alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
518 alltogetherspectrumD->SetMarkerStyle(25);
519 alltogetherspectrumD->SetMarkerColor(kBlack);
520 alltogetherspectrumD->SetLineColor(kBlack);
521 alltogetherspectrumD->Draw("P");
522 TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
523 legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
524 legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
525 legcorrected->Draw("same");
527 TH1D *correctedTH1D = correctedspectrum->Projection(ptpr);
528 TH1D *alltogetherTH1D = (TH1D *) alltogetherCorrection->Project(ptpr);
529 TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
530 ratiocorrected->SetName("ratiocorrected");
531 ratiocorrected->SetTitle("");
532 ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
533 ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
534 ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
535 ratiocorrected->SetStats(0);
536 ratiocorrected->Draw();
537 if(fWriteToFile)ccorrected->SaveAs("CorrectedPbPb.eps");
539 //TH1D unfoldingspectrac[fNCentralityBinAtTheEnd];
540 //TGraphErrors unfoldingspectracn[fNCentralityBinAtTheEnd];
541 //TH1D correctedspectrac[fNCentralityBinAtTheEnd];
542 //TGraphErrors correctedspectracn[fNCentralityBinAtTheEnd];
544 TH1D *unfoldingspectrac = new TH1D[fNCentralityBinAtTheEnd];
545 TGraphErrors *unfoldingspectracn = new TGraphErrors[fNCentralityBinAtTheEnd];
546 TH1D *correctedspectrac = new TH1D[fNCentralityBinAtTheEnd];
547 TGraphErrors *correctedspectracn = new TGraphErrors[fNCentralityBinAtTheEnd];
551 TCanvas * ccorrectedallspectra = new TCanvas("correctedallspectra","correctedallspectra",1000,700);
552 ccorrectedallspectra->Divide(2,1);
553 TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
554 TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
556 THnSparseF* sparsesu = (THnSparseF *) correctedspectrum;
557 TAxis *cenaxisa = sparsesu->GetAxis(0);
558 THnSparseF* sparsed = (THnSparseF *) alltogetherCorrection->GetGrid();
559 TAxis *cenaxisb = sparsed->GetAxis(0);
560 Int_t nbbin = cenaxisb->GetNbins();
561 Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
562 Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
563 for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
564 TString titlee("corrected_centrality_bin_");
566 titlee += fLowBoundaryCentralityBinAtTheEnd[binc];
568 titlee += fHighBoundaryCentralityBinAtTheEnd[binc];
570 TString titleec("corrected_check_projection_bin_");
572 titleec += fLowBoundaryCentralityBinAtTheEnd[binc];
574 titleec += fHighBoundaryCentralityBinAtTheEnd[binc];
576 TString titleenameunotnormalized("Unfolded_Notnormalized_centrality_bin_");
577 titleenameunotnormalized += "[";
578 titleenameunotnormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
579 titleenameunotnormalized += "_";
580 titleenameunotnormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
581 titleenameunotnormalized += "[";
582 TString titleenameunormalized("Unfolded_normalized_centrality_bin_");
583 titleenameunormalized += "[";
584 titleenameunormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
585 titleenameunormalized += "_";
586 titleenameunormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
587 titleenameunormalized += "[";
588 TString titleenamednotnormalized("Dirrectcorrected_Notnormalized_centrality_bin_");
589 titleenamednotnormalized += "[";
590 titleenamednotnormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
591 titleenamednotnormalized += "_";
592 titleenamednotnormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
593 titleenamednotnormalized += "[";
594 TString titleenamednormalized("Dirrectedcorrected_normalized_centrality_bin_");
595 titleenamednormalized += "[";
596 titleenamednormalized += fLowBoundaryCentralityBinAtTheEnd[binc];
597 titleenamednormalized += "_";
598 titleenamednormalized += fHighBoundaryCentralityBinAtTheEnd[binc];
599 titleenamednormalized += "[";
601 for(Int_t k = fLowBoundaryCentralityBinAtTheEnd[binc]; k < fHighBoundaryCentralityBinAtTheEnd[binc]; k++) {
602 printf("Number of events %d in the bin %d added!!!\n",fNEvents[k],k);
603 nbEvents += fNEvents[k];
605 Double_t lowedgega = cenaxisa->GetBinLowEdge(fLowBoundaryCentralityBinAtTheEnd[binc]+1);
606 Double_t upedgega = cenaxisa->GetBinUpEdge(fHighBoundaryCentralityBinAtTheEnd[binc]);
607 printf("Bin Low edge %f, up edge %f for a\n",lowedgega,upedgega);
608 Double_t lowedgegb = cenaxisb->GetBinLowEdge(fLowBoundaryCentralityBinAtTheEnd[binc]+1);
609 Double_t upedgegb = cenaxisb->GetBinUpEdge(fHighBoundaryCentralityBinAtTheEnd[binc]);
610 printf("Bin Low edge %f, up edge %f for b\n",lowedgegb,upedgegb);
611 cenaxisa->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
612 cenaxisb->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
613 TCanvas * ccorrectedcheck = new TCanvas((const char*) titleec,(const char*) titleec,1000,700);
614 ccorrectedcheck->cd(1);
615 TH1D *aftersuc = (TH1D *) sparsesu->Projection(0);
616 TH1D *aftersdc = (TH1D *) sparsed->Projection(0);
618 aftersdc->Draw("same");
619 TCanvas * ccorrectede = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
620 ccorrectede->Divide(2,1);
623 TH1D *aftersu = (TH1D *) sparsesu->Projection(1);
624 CorrectFromTheWidth(aftersu);
625 aftersu->SetName((const char*)titleenameunotnormalized);
626 unfoldingspectrac[binc] = *aftersu;
628 TGraphErrors* aftersun = NormalizeTH1N(aftersu,nbEvents);
629 aftersun->SetTitle("");
630 aftersun->GetYaxis()->SetTitleOffset(1.5);
631 aftersun->GetYaxis()->SetRangeUser(0.000000001,1.0);
632 aftersun->SetMarkerStyle(26);
633 aftersun->SetMarkerColor(kBlue);
634 aftersun->SetLineColor(kBlue);
635 aftersun->Draw("AP");
636 aftersun->SetName((const char*)titleenameunormalized);
637 unfoldingspectracn[binc] = *aftersun;
639 TH1D *aftersd = (TH1D *) sparsed->Projection(1);
640 CorrectFromTheWidth(aftersd);
641 aftersd->SetName((const char*)titleenamednotnormalized);
642 correctedspectrac[binc] = *aftersd;
644 TGraphErrors* aftersdn = NormalizeTH1N(aftersd,nbEvents);
645 aftersdn->SetTitle("");
646 aftersdn->GetYaxis()->SetTitleOffset(1.5);
647 aftersdn->GetYaxis()->SetRangeUser(0.000000001,1.0);
648 aftersdn->SetMarkerStyle(25);
649 aftersdn->SetMarkerColor(kBlack);
650 aftersdn->SetLineColor(kBlack);
652 aftersdn->SetName((const char*)titleenamednormalized);
653 correctedspectracn[binc] = *aftersdn;
654 TLegend *legcorrectedud = new TLegend(0.4,0.6,0.89,0.89);
655 legcorrectedud->AddEntry(aftersun,"Corrected","p");
656 legcorrectedud->AddEntry(aftersdn,"Alltogether","p");
657 legcorrectedud->Draw("same");
658 ccorrectedallspectra->cd(1);
660 TH1D *aftersunn = (TH1D *) aftersun->Clone();
661 aftersunn->SetMarkerStyle(stylee[binc]);
662 aftersunn->SetMarkerColor(colorr[binc]);
663 if(binc==0) aftersunn->Draw("AP");
664 else aftersunn->Draw("P");
665 legtotal->AddEntry(aftersunn,(const char*) titlee,"p");
666 ccorrectedallspectra->cd(2);
668 TH1D *aftersdnn = (TH1D *) aftersdn->Clone();
669 aftersdnn->SetMarkerStyle(stylee[binc]);
670 aftersdnn->SetMarkerColor(colorr[binc]);
671 if(binc==0) aftersdnn->Draw("AP");
672 else aftersdnn->Draw("P");
673 legtotalg->AddEntry(aftersdnn,(const char*) titlee,"p");
675 TH1D* ratiocorrectedbinc = (TH1D*)aftersu->Clone();
676 TString titleee("ratiocorrected_bin_");
678 ratiocorrectedbinc->SetName((const char*) titleee);
679 ratiocorrectedbinc->SetTitle("");
680 ratiocorrectedbinc->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
681 ratiocorrectedbinc->GetXaxis()->SetTitle("p_{T} [GeV/c]");
682 ratiocorrectedbinc->Divide(aftersu,aftersd,1,1);
683 ratiocorrectedbinc->SetStats(0);
684 ratiocorrectedbinc->Draw();
687 ccorrectedallspectra->cd(1);
688 legtotal->Draw("same");
689 ccorrectedallspectra->cd(2);
690 legtotalg->Draw("same");
692 cenaxisa->SetRange(0,nbbin);
693 cenaxisb->SetRange(0,nbbin);
694 if(fWriteToFile) ccorrectedallspectra->SaveAs("CorrectedPbPb.eps");
697 // Dump to file if needed
699 TFile *out = new TFile("finalSpectrum.root","recreate");
700 correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
701 correctedspectrumD->Write();
702 alltogetherspectrumD->SetName("AlltogetherSpectrum");
703 alltogetherspectrumD->Write();
704 ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
705 ratiocorrected->Write();
706 correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
707 correctedspectrum->Write();
708 alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
709 alltogetherCorrection->Write();
710 for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
711 unfoldingspectrac[binc].Write();
712 unfoldingspectracn[binc].Write();
713 correctedspectrac[binc].Write();
714 correctedspectracn[binc].Write();
716 out->Close(); delete out;
719 if (unfoldingspectrac) delete[] unfoldingspectrac;
720 if (unfoldingspectracn) delete[] unfoldingspectracn;
721 if (correctedspectrac) delete[] correctedspectrac;
722 if (correctedspectracn) delete[] correctedspectracn;
729 //____________________________________________________________
730 Bool_t AliHFEspectrum::CorrectBeauty(Bool_t subtractcontamination){
732 // Correct the spectrum for efficiency and unfolding for beauty analysis
733 // with both method and compare
736 gStyle->SetPalette(1);
737 gStyle->SetOptStat(1111);
738 gStyle->SetPadBorderMode(0);
739 gStyle->SetCanvasColor(10);
740 gStyle->SetPadLeftMargin(0.13);
741 gStyle->SetPadRightMargin(0.13);
743 ///////////////////////////
744 // Check initialization
745 ///////////////////////////
747 if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
748 AliInfo("You have to init before");
752 if((fStepTrue == 0) && (fStepMC == 0) && (fStepData == 0)) {
753 AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
757 SetNumberOfIteration(10);
758 SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);
760 AliCFDataGrid *dataGridAfterFirstSteps = 0x0;
761 //////////////////////////////////
762 // Subtract hadron background
763 /////////////////////////////////
764 AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
765 AliCFDataGrid *unnormalizedRawSpectrum = 0x0;
766 TGraphErrors *gNormalizedRawSpectrum = 0x0;
767 if(subtractcontamination) {
768 if(!fBeauty2ndMethod) dataspectrumaftersubstraction = SubtractBackground(kTRUE);
769 else dataspectrumaftersubstraction = GetRawBspectra2ndMethod();
770 unnormalizedRawSpectrum = (AliCFDataGrid*)dataspectrumaftersubstraction->Clone();
771 dataGridAfterFirstSteps = dataspectrumaftersubstraction;
772 gNormalizedRawSpectrum = Normalize(unnormalizedRawSpectrum);
775 printf("after normalize getting IP \n");
777 /////////////////////////////////////////////////////////////////////////////////////////
778 // Correct for IP efficiency for beauty electrons after subtracting all the backgrounds
779 /////////////////////////////////////////////////////////////////////////////////////////
781 AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
782 AliCFDataGrid *dataspectrumafterV0efficiencycorrection = 0x0;
783 AliCFContainer *dataContainerV0 = GetContainer(kDataContainerV0);
785 if(fEfficiencyFunction){
786 dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
787 dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;
789 else if(dataContainerV0){
790 dataspectrumafterV0efficiencycorrection = CorrectV0Efficiency(dataspectrumaftersubstraction);
791 dataGridAfterFirstSteps = dataspectrumafterV0efficiencycorrection;
799 TList *listunfolded = Unfold(dataGridAfterFirstSteps);
801 printf("Unfolded failed\n");
804 THnSparse *correctedspectrum = (THnSparse *) listunfolded->At(0);
805 THnSparse *residualspectrum = (THnSparse *) listunfolded->At(1);
806 if(!correctedspectrum){
807 AliError("No corrected spectrum\n");
810 if(!residualspectrum){
811 AliError("No residual spectrum\n");
815 /////////////////////
819 AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);
826 if(fDebugLevel > 0.0) {
829 if(fBeamType==0) ptpr=0;
830 if(fBeamType==1) ptpr=1;
832 TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
833 ccorrected->Divide(2,1);
836 TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
837 correctedspectrumD->SetTitle("");
838 correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
839 correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
840 correctedspectrumD->SetMarkerStyle(26);
841 correctedspectrumD->SetMarkerColor(kBlue);
842 correctedspectrumD->SetLineColor(kBlue);
843 correctedspectrumD->Draw("AP");
844 TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
845 alltogetherspectrumD->SetTitle("");
846 alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
847 alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
848 alltogetherspectrumD->SetMarkerStyle(25);
849 alltogetherspectrumD->SetMarkerColor(kBlack);
850 alltogetherspectrumD->SetLineColor(kBlack);
851 alltogetherspectrumD->Draw("P");
852 TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
853 legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
854 legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
855 legcorrected->Draw("same");
857 TH1D *correctedTH1D = correctedspectrum->Projection(ptpr);
858 TH1D *alltogetherTH1D = (TH1D *) alltogetherCorrection->Project(ptpr);
859 TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
860 ratiocorrected->SetName("ratiocorrected");
861 ratiocorrected->SetTitle("");
862 ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
863 ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
864 ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
865 ratiocorrected->SetStats(0);
866 ratiocorrected->Draw();
867 if(fWriteToFile) ccorrected->SaveAs("CorrectedBeauty.eps");
871 CalculateNonHFEsyst(0);
875 // Dump to file if needed
878 // to do centrality dependent
881 out = new TFile("finalSpectrum.root","recreate");
884 correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
885 correctedspectrumD->Write();
886 alltogetherspectrumD->SetName("AlltogetherSpectrum");
887 alltogetherspectrumD->Write();
888 ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
889 ratiocorrected->Write();
891 correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
892 correctedspectrum->Write();
893 alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
894 alltogetherCorrection->Write();
896 if(unnormalizedRawSpectrum) {
897 unnormalizedRawSpectrum->SetName("beautyAfterIP");
898 unnormalizedRawSpectrum->Write();
901 if(gNormalizedRawSpectrum){
902 gNormalizedRawSpectrum->SetName("normalizedBeautyAfterIP");
903 gNormalizedRawSpectrum->Write();
908 fEfficiencyCharmSigD[countpp]->SetTitle(Form("IPEfficiencyForCharmSigCent%i",countpp));
909 fEfficiencyCharmSigD[countpp]->SetName(Form("IPEfficiencyForCharmSigCent%i",countpp));
910 fEfficiencyCharmSigD[countpp]->Write();
911 fEfficiencyBeautySigD[countpp]->SetTitle(Form("IPEfficiencyForBeautySigCent%i",countpp));
912 fEfficiencyBeautySigD[countpp]->SetName(Form("IPEfficiencyForBeautySigCent%i",countpp));
913 fEfficiencyBeautySigD[countpp]->Write();
914 fCharmEff[countpp]->SetTitle(Form("IPEfficiencyForCharmCent%i",countpp));
915 fCharmEff[countpp]->SetName(Form("IPEfficiencyForCharmCent%i",countpp));
916 fCharmEff[countpp]->Write();
917 fBeautyEff[countpp]->SetTitle(Form("IPEfficiencyForBeautyCent%i",countpp));
918 fBeautyEff[countpp]->SetName(Form("IPEfficiencyForBeautyCent%i",countpp));
919 fBeautyEff[countpp]->Write();
920 fConversionEff[countpp]->SetTitle(Form("IPEfficiencyForConversionCent%i",countpp));
921 fConversionEff[countpp]->SetName(Form("IPEfficiencyForConversionCent%i",countpp));
922 fConversionEff[countpp]->Write();
923 fNonHFEEff[countpp]->SetTitle(Form("IPEfficiencyForNonHFECent%i",countpp));
924 fNonHFEEff[countpp]->SetName(Form("IPEfficiencyForNonHFECent%i",countpp));
925 fNonHFEEff[countpp]->Write();
930 TGraphErrors* correctedspectrumDc[kCentrality];
931 TGraphErrors* alltogetherspectrumDc[kCentrality];
932 for(Int_t i=0;i<kCentrality-2;i++)
934 correctedspectrum->GetAxis(0)->SetRange(i+1,i+1);
935 correctedspectrumDc[i] = Normalize(correctedspectrum,i);
936 correctedspectrumDc[i]->SetTitle(Form("UnfoldingCorrectedSpectrum_%i",i));
937 correctedspectrumDc[i]->SetName(Form("UnfoldingCorrectedSpectrum_%i",i));
938 alltogetherCorrection->GetAxis(0)->SetRange(i+1,i+1);
939 alltogetherspectrumDc[i] = Normalize(alltogetherCorrection,i);
940 alltogetherspectrumDc[i]->SetTitle(Form("AlltogetherSpectrum_%i",i));
941 alltogetherspectrumDc[i]->SetName(Form("AlltogetherSpectrum_%i",i));
942 correctedspectrumDc[i]->Write();
943 alltogetherspectrumDc[i]->Write();
946 TH1D *centrcrosscheck = correctedspectrum->Projection(0);
947 centrcrosscheck->SetTitle(Form("centrality_%i",i));
948 centrcrosscheck->SetName(Form("centrality_%i",i));
949 centrcrosscheck->Write();
951 TH1D *correctedTH1Dc = correctedspectrum->Projection(ptpr);
952 TH1D *alltogetherTH1Dc = (TH1D *) alltogetherCorrection->Project(ptpr);
954 TH1D *centrcrosscheck2 = (TH1D *) alltogetherCorrection->Project(0);
955 centrcrosscheck2->SetTitle(Form("centrality2_%i",i));
956 centrcrosscheck2->SetName(Form("centrality2_%i",i));
957 centrcrosscheck2->Write();
959 TH1D* ratiocorrectedc = (TH1D*)correctedTH1D->Clone();
960 ratiocorrectedc->Divide(correctedTH1Dc,alltogetherTH1Dc,1,1);
961 ratiocorrectedc->SetTitle(Form("RatioUnfoldingAlltogetherSpectrum_%i",i));
962 ratiocorrectedc->SetName(Form("RatioUnfoldingAlltogetherSpectrum_%i",i));
963 ratiocorrectedc->Write();
965 fEfficiencyCharmSigD[i]->SetTitle(Form("IPEfficiencyForCharmSigCent%i",i));
966 fEfficiencyCharmSigD[i]->SetName(Form("IPEfficiencyForCharmSigCent%i",i));
967 fEfficiencyCharmSigD[i]->Write();
968 fEfficiencyBeautySigD[i]->SetTitle(Form("IPEfficiencyForBeautySigCent%i",i));
969 fEfficiencyBeautySigD[i]->SetName(Form("IPEfficiencyForBeautySigCent%i",i));
970 fEfficiencyBeautySigD[i]->Write();
971 fCharmEff[i]->SetTitle(Form("IPEfficiencyForCharmCent%i",i));
972 fCharmEff[i]->SetName(Form("IPEfficiencyForCharmCent%i",i));
973 fCharmEff[i]->Write();
974 fBeautyEff[i]->SetTitle(Form("IPEfficiencyForBeautyCent%i",i));
975 fBeautyEff[i]->SetName(Form("IPEfficiencyForBeautyCent%i",i));
976 fBeautyEff[i]->Write();
977 fConversionEff[i]->SetTitle(Form("IPEfficiencyForConversionCent%i",i));
978 fConversionEff[i]->SetName(Form("IPEfficiencyForConversionCent%i",i));
979 fConversionEff[i]->Write();
980 fNonHFEEff[i]->SetTitle(Form("IPEfficiencyForNonHFECent%i",i));
981 fNonHFEEff[i]->SetName(Form("IPEfficiencyForNonHFECent%i",i));
982 fNonHFEEff[i]->Write();
995 //____________________________________________________________
996 AliCFDataGrid* AliHFEspectrum::SubtractBackground(Bool_t setBackground){
998 // Apply background subtraction
1015 AliCFContainer *dataContainer = GetContainer(kDataContainer);
1017 AliError("Data Container not available");
1020 printf("Step data: %d\n",fStepData);
1021 AliCFDataGrid *spectrumSubtracted = new AliCFDataGrid("spectrumSubtracted", "Data Grid for spectrum after Background subtraction", *dataContainer,fStepData);
1023 AliCFDataGrid *dataspectrumbeforesubstraction = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(GetContainer(kDataContainer),fStepData))->Clone();
1024 dataspectrumbeforesubstraction->SetName("dataspectrumbeforesubstraction");
1026 // Background Estimate
1027 AliCFContainer *backgroundContainer = GetContainer(kBackgroundData);
1028 if(!backgroundContainer){
1029 AliError("MC background container not found");
1033 Int_t stepbackground = 1; // 2 for !fInclusiveSpectrum analysis(old method)
1034 AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ContaminationGrid","ContaminationGrid",*backgroundContainer,stepbackground);
1036 if(!fInclusiveSpectrum){
1037 //Background subtraction for IP analysis
1038 TH1D *measuredTH1Draw = (TH1D *) dataspectrumbeforesubstraction->Project(ptpr);
1039 CorrectFromTheWidth(measuredTH1Draw);
1040 TCanvas *rawspectra = new TCanvas("rawspectra","rawspectra",600,500);
1042 rawspectra->SetLogy();
1043 TLegend *lRaw = new TLegend(0.65,0.65,0.95,0.95);
1044 measuredTH1Draw->SetMarkerStyle(20);
1045 measuredTH1Draw->Draw();
1046 lRaw->AddEntry(measuredTH1Draw,"measured raw spectrum");
1048 Int_t* bins=new Int_t[2];
1049 if(fIPanaHadronBgSubtract){
1050 // Hadron background
1051 printf("Hadron background for IP analysis subtracted!\n");
1055 htemp = (TH1D *) fHadronEffbyIPcut->Projection(0);
1056 bins[0]=htemp->GetNbinsX();
1060 htemp = (TH1D *) fHadronEffbyIPcut->Projection(0);
1061 bins[0]=htemp->GetNbinsX();
1062 htemp = (TH1D *) fHadronEffbyIPcut->Projection(1);
1063 bins[1]=htemp->GetNbinsX();
1065 AliCFDataGrid *hbgContainer = new AliCFDataGrid("hbgContainer","hadron bg after IP cut",nbins,bins);
1066 hbgContainer->SetGrid(fHadronEffbyIPcut);
1067 backgroundGrid->Multiply(hbgContainer,1);
1068 // draw raw hadron bg spectra
1069 TH1D *hadronbg= (TH1D *) backgroundGrid->Project(ptpr);
1070 CorrectFromTheWidth(hadronbg);
1071 hadronbg->SetMarkerColor(7);
1072 hadronbg->SetMarkerStyle(20);
1074 hadronbg->Draw("samep");
1075 lRaw->AddEntry(hadronbg,"hadrons");
1076 // subtract hadron contamination
1077 spectrumSubtracted->Add(backgroundGrid,-1.0);
1079 if(fIPanaCharmBgSubtract){
1081 printf("Charm background for IP analysis subtracted!\n");
1082 AliCFDataGrid *charmbgContainer = (AliCFDataGrid *) GetCharmBackground();
1083 // draw charm bg spectra
1084 TH1D *charmbg= (TH1D *) charmbgContainer->Project(ptpr);
1085 CorrectFromTheWidth(charmbg);
1086 charmbg->SetMarkerColor(3);
1087 charmbg->SetMarkerStyle(20);
1089 charmbg->Draw("samep");
1090 lRaw->AddEntry(charmbg,"charm elecs");
1091 // subtract charm background
1092 spectrumSubtracted->Add(charmbgContainer,-1.0);
1094 if(fIPanaConversionBgSubtract){
1095 // Conversion background
1096 AliCFDataGrid *conversionbgContainer = (AliCFDataGrid *) GetConversionBackground();
1097 // draw conversion bg spectra
1098 TH1D *conversionbg= (TH1D *) conversionbgContainer->Project(ptpr);
1099 CorrectFromTheWidth(conversionbg);
1100 conversionbg->SetMarkerColor(4);
1101 conversionbg->SetMarkerStyle(20);
1103 conversionbg->Draw("samep");
1104 lRaw->AddEntry(conversionbg,"conversion elecs");
1105 // subtract conversion background
1106 spectrumSubtracted->Add(conversionbgContainer,-1.0);
1107 printf("Conversion background subtraction is preliminary!\n");
1109 if(fIPanaNonHFEBgSubtract){
1110 // NonHFE background
1111 AliCFDataGrid *nonHFEbgContainer = (AliCFDataGrid *) GetNonHFEBackground();
1112 // draw Dalitz/dielectron bg spectra
1113 TH1D *nonhfebg= (TH1D *) nonHFEbgContainer->Project(ptpr);
1114 CorrectFromTheWidth(nonhfebg);
1115 nonhfebg->SetMarkerColor(6);
1116 nonhfebg->SetMarkerStyle(20);
1118 nonhfebg->Draw("samep");
1119 lRaw->AddEntry(nonhfebg,"non-HF elecs");
1120 // subtract Dalitz/dielectron background
1121 spectrumSubtracted->Add(nonHFEbgContainer,-1.0);
1122 printf("Non HFE background subtraction is preliminary!\n");
1124 TH1D *rawbgsubtracted = (TH1D *) spectrumSubtracted->Project(ptpr);
1125 CorrectFromTheWidth(rawbgsubtracted);
1126 rawbgsubtracted->SetMarkerStyle(24);
1128 lRaw->AddEntry(rawbgsubtracted,"subtracted raw spectrum");
1129 rawbgsubtracted->Draw("samep");
1137 spectrumSubtracted->Add(backgroundGrid,-1.0);
1141 if(fBackground) delete fBackground;
1142 fBackground = backgroundGrid;
1143 } else delete backgroundGrid;
1146 if(fDebugLevel > 0) {
1149 if(fBeamType==0) ptprd=0;
1150 if(fBeamType==1) ptprd=1;
1152 TCanvas * cbackgroundsubtraction = new TCanvas("backgroundsubtraction","backgroundsubtraction",1000,700);
1153 cbackgroundsubtraction->Divide(3,1);
1154 cbackgroundsubtraction->cd(1);
1156 TH1D *measuredTH1Daftersubstraction = (TH1D *) spectrumSubtracted->Project(ptprd);
1157 TH1D *measuredTH1Dbeforesubstraction = (TH1D *) dataspectrumbeforesubstraction->Project(ptprd);
1158 CorrectFromTheWidth(measuredTH1Daftersubstraction);
1159 CorrectFromTheWidth(measuredTH1Dbeforesubstraction);
1160 measuredTH1Daftersubstraction->SetStats(0);
1161 measuredTH1Daftersubstraction->SetTitle("");
1162 measuredTH1Daftersubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1163 measuredTH1Daftersubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1164 measuredTH1Daftersubstraction->SetMarkerStyle(25);
1165 measuredTH1Daftersubstraction->SetMarkerColor(kBlack);
1166 measuredTH1Daftersubstraction->SetLineColor(kBlack);
1167 measuredTH1Dbeforesubstraction->SetStats(0);
1168 measuredTH1Dbeforesubstraction->SetTitle("");
1169 measuredTH1Dbeforesubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1170 measuredTH1Dbeforesubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1171 measuredTH1Dbeforesubstraction->SetMarkerStyle(24);
1172 measuredTH1Dbeforesubstraction->SetMarkerColor(kBlue);
1173 measuredTH1Dbeforesubstraction->SetLineColor(kBlue);
1174 measuredTH1Daftersubstraction->Draw();
1175 measuredTH1Dbeforesubstraction->Draw("same");
1176 TLegend *legsubstraction = new TLegend(0.4,0.6,0.89,0.89);
1177 legsubstraction->AddEntry(measuredTH1Dbeforesubstraction,"With hadron contamination","p");
1178 legsubstraction->AddEntry(measuredTH1Daftersubstraction,"Without hadron contamination ","p");
1179 legsubstraction->Draw("same");
1180 cbackgroundsubtraction->cd(2);
1182 TH1D* ratiomeasuredcontamination = (TH1D*)measuredTH1Dbeforesubstraction->Clone();
1183 ratiomeasuredcontamination->SetName("ratiomeasuredcontamination");
1184 ratiomeasuredcontamination->SetTitle("");
1185 ratiomeasuredcontamination->GetYaxis()->SetTitle("(with contamination - without contamination) / with contamination");
1186 ratiomeasuredcontamination->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1187 ratiomeasuredcontamination->Sumw2();
1188 ratiomeasuredcontamination->Add(measuredTH1Daftersubstraction,-1.0);
1189 ratiomeasuredcontamination->Divide(measuredTH1Dbeforesubstraction);
1190 ratiomeasuredcontamination->SetStats(0);
1191 ratiomeasuredcontamination->SetMarkerStyle(26);
1192 ratiomeasuredcontamination->SetMarkerColor(kBlack);
1193 ratiomeasuredcontamination->SetLineColor(kBlack);
1194 for(Int_t k=0; k < ratiomeasuredcontamination->GetNbinsX(); k++){
1195 ratiomeasuredcontamination->SetBinError(k+1,0.0);
1197 ratiomeasuredcontamination->Draw("P");
1198 cbackgroundsubtraction->cd(3);
1199 TH1D *measuredTH1background = (TH1D *) backgroundGrid->Project(ptprd);
1200 CorrectFromTheWidth(measuredTH1background);
1201 measuredTH1background->SetStats(0);
1202 measuredTH1background->SetTitle("");
1203 measuredTH1background->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1204 measuredTH1background->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1205 measuredTH1background->SetMarkerStyle(26);
1206 measuredTH1background->SetMarkerColor(kBlack);
1207 measuredTH1background->SetLineColor(kBlack);
1208 measuredTH1background->Draw();
1209 if(fWriteToFile) cbackgroundsubtraction->SaveAs("BackgroundSubtracted.eps");
1213 TCanvas * cbackgrounde = new TCanvas("BackgroundSubtraction_allspectra","BackgroundSubtraction_allspectra",1000,700);
1214 cbackgrounde->Divide(2,1);
1215 TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
1216 TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
1218 THnSparseF* sparsesubtracted = (THnSparseF *) spectrumSubtracted->GetGrid();
1219 TAxis *cenaxisa = sparsesubtracted->GetAxis(0);
1220 THnSparseF* sparsebefore = (THnSparseF *) dataspectrumbeforesubstraction->GetGrid();
1221 TAxis *cenaxisb = sparsebefore->GetAxis(0);
1222 Int_t nbbin = cenaxisb->GetNbins();
1223 Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
1224 Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
1225 for(Int_t binc = 0; binc < nbbin; binc++){
1226 TString titlee("BackgroundSubtraction_centrality_bin_");
1228 TCanvas * cbackground = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
1229 cbackground->Divide(2,1);
1232 cenaxisa->SetRange(binc+1,binc+1);
1233 cenaxisb->SetRange(binc+1,binc+1);
1234 TH1D *aftersubstraction = (TH1D *) sparsesubtracted->Projection(1);
1235 TH1D *beforesubstraction = (TH1D *) sparsebefore->Projection(1);
1236 CorrectFromTheWidth(aftersubstraction);
1237 CorrectFromTheWidth(beforesubstraction);
1238 aftersubstraction->SetStats(0);
1239 aftersubstraction->SetTitle((const char*)titlee);
1240 aftersubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1241 aftersubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1242 aftersubstraction->SetMarkerStyle(25);
1243 aftersubstraction->SetMarkerColor(kBlack);
1244 aftersubstraction->SetLineColor(kBlack);
1245 beforesubstraction->SetStats(0);
1246 beforesubstraction->SetTitle((const char*)titlee);
1247 beforesubstraction->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1248 beforesubstraction->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1249 beforesubstraction->SetMarkerStyle(24);
1250 beforesubstraction->SetMarkerColor(kBlue);
1251 beforesubstraction->SetLineColor(kBlue);
1252 aftersubstraction->Draw();
1253 beforesubstraction->Draw("same");
1254 TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
1255 lega->AddEntry(beforesubstraction,"With hadron contamination","p");
1256 lega->AddEntry(aftersubstraction,"Without hadron contamination ","p");
1258 cbackgrounde->cd(1);
1260 TH1D *aftersubtractionn = (TH1D *) aftersubstraction->Clone();
1261 aftersubtractionn->SetMarkerStyle(stylee[binc]);
1262 aftersubtractionn->SetMarkerColor(colorr[binc]);
1263 if(binc==0) aftersubtractionn->Draw();
1264 else aftersubtractionn->Draw("same");
1265 legtotal->AddEntry(aftersubtractionn,(const char*) titlee,"p");
1266 cbackgrounde->cd(2);
1268 TH1D *aftersubtractionng = (TH1D *) aftersubstraction->Clone();
1269 aftersubtractionng->SetMarkerStyle(stylee[binc]);
1270 aftersubtractionng->SetMarkerColor(colorr[binc]);
1271 if(fNEvents[binc] > 0.0) aftersubtractionng->Scale(1/(Double_t)fNEvents[binc]);
1272 if(binc==0) aftersubtractionng->Draw();
1273 else aftersubtractionng->Draw("same");
1274 legtotalg->AddEntry(aftersubtractionng,(const char*) titlee,"p");
1276 TH1D* ratiocontamination = (TH1D*)beforesubstraction->Clone();
1277 ratiocontamination->SetName("ratiocontamination");
1278 ratiocontamination->SetTitle((const char*)titlee);
1279 ratiocontamination->GetYaxis()->SetTitle("(with contamination - without contamination) / with contamination");
1280 ratiocontamination->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1281 ratiocontamination->Add(aftersubstraction,-1.0);
1282 ratiocontamination->Divide(beforesubstraction);
1283 Int_t totalbin = ratiocontamination->GetXaxis()->GetNbins();
1284 for(Int_t nbinpt = 0; nbinpt < totalbin; nbinpt++) {
1285 ratiocontamination->SetBinError(nbinpt+1,0.0);
1287 ratiocontamination->SetStats(0);
1288 ratiocontamination->SetMarkerStyle(26);
1289 ratiocontamination->SetMarkerColor(kBlack);
1290 ratiocontamination->SetLineColor(kBlack);
1291 ratiocontamination->Draw("P");
1294 cbackgrounde->cd(1);
1295 legtotal->Draw("same");
1296 cbackgrounde->cd(2);
1297 legtotalg->Draw("same");
1299 cenaxisa->SetRange(0,nbbin);
1300 cenaxisb->SetRange(0,nbbin);
1301 if(fWriteToFile) cbackgrounde->SaveAs("BackgroundSubtractedPbPb.eps");
1305 return spectrumSubtracted;
1308 //____________________________________________________________
1309 AliCFDataGrid* AliHFEspectrum::GetCharmBackground(){
1311 // calculate charm background
1326 if(fNMCbgEvents[0]) evtnorm= double(fNEvents[0])/double(fNMCbgEvents[0]);
1328 AliCFContainer *mcContainer = GetContainer(kMCContainerCharmMC);
1330 AliError("MC Container not available");
1335 AliError("No Correlation map available");
1339 AliCFDataGrid *charmBackgroundGrid= 0x0;
1340 charmBackgroundGrid = new AliCFDataGrid("charmBackgroundGrid","charmBackgroundGrid",*mcContainer, fStepMC-1); // use MC eff. up to right before PID
1342 TH1D *charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(0);
1343 Int_t* bins=new Int_t[2];
1344 bins[0]=charmbgaftertofpid->GetNbinsX();
1348 //charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(0);
1350 charmbgaftertofpid = (TH1D *) charmBackgroundGrid->Project(1);
1351 bins[1]=charmbgaftertofpid->GetNbinsX();
1355 AliCFDataGrid *ipWeightedCharmContainer = new AliCFDataGrid("ipWeightedCharmContainer","ipWeightedCharmContainer",nDim,bins);
1356 ipWeightedCharmContainer->SetGrid(GetPIDxIPEff(0)); // get charm efficiency
1357 TH1D* parametrizedcharmpidipeff = (TH1D*)ipWeightedCharmContainer->Project(ptpr);
1359 if(fBeamType==0)charmBackgroundGrid->Multiply(ipWeightedCharmContainer,evtnorm);
1360 Double_t contents[2];
1361 AliCFDataGrid *eventTemp = new AliCFDataGrid("eventTemp","eventTemp",nDim,bins);
1364 for(Int_t kCentr=0;kCentr<bins[0];kCentr++)
1366 for(Int_t kpt=0;kpt<bins[1];kpt++)
1368 Double_t evtnormPbPb=0;
1369 if(fNMCbgEvents[kCentr]) evtnormPbPb= double(fNEvents[kCentr])/double(fNMCbgEvents[kCentr]);
1372 eventTemp->Fill(contents,evtnormPbPb);
1375 charmBackgroundGrid->Multiply(eventTemp,1);
1377 TH1D* charmbgafteripcut = (TH1D*)charmBackgroundGrid->Project(ptpr);
1379 AliCFDataGrid *weightedCharmContainer = new AliCFDataGrid("weightedCharmContainer","weightedCharmContainer",nDim,bins);
1380 weightedCharmContainer->SetGrid(GetCharmWeights()); // get charm weighting factors
1381 TH1D* charmweightingfc = (TH1D*)weightedCharmContainer->Project(ptpr);
1382 charmBackgroundGrid->Multiply(weightedCharmContainer,1.);
1383 TH1D* charmbgafterweight = (TH1D*)charmBackgroundGrid->Project(ptpr);
1385 // Efficiency (set efficiency to 1 for only folding)
1386 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
1387 efficiencyD->CalculateEfficiency(0,0);
1390 if(fBeamType==0)nDim = 1;
1391 if(fBeamType==1)nDim = 2;
1392 AliCFUnfolding folding("unfolding","",nDim,fCorrelation,efficiencyD->GetGrid(),charmBackgroundGrid->GetGrid(),charmBackgroundGrid->GetGrid());
1393 folding.SetMaxNumberOfIterations(1);
1397 THnSparse* result1= folding.GetEstMeasured(); // folded spectra
1398 THnSparse* result=(THnSparse*)result1->Clone();
1399 charmBackgroundGrid->SetGrid(result);
1400 TH1D* charmbgafterfolding = (TH1D*)charmBackgroundGrid->Project(ptpr);
1402 //Charm background evaluation plots
1404 TCanvas *cCharmBgEval = new TCanvas("cCharmBgEval","cCharmBgEval",1000,600);
1405 cCharmBgEval->Divide(3,1);
1407 cCharmBgEval->cd(1);
1409 if(fBeamType==0)charmbgaftertofpid->Scale(evtnorm);
1412 Double_t evtnormPbPb=0;
1413 for(Int_t kCentr=0;kCentr<bins[0];kCentr++)
1415 if(fNMCbgEvents[kCentr]) evtnormPbPb= evtnormPbPb+double(fNEvents[kCentr])/double(fNMCbgEvents[kCentr]);
1417 charmbgaftertofpid->Scale(evtnormPbPb);
1420 CorrectFromTheWidth(charmbgaftertofpid);
1421 charmbgaftertofpid->SetMarkerStyle(25);
1422 charmbgaftertofpid->Draw("p");
1423 charmbgaftertofpid->GetYaxis()->SetTitle("yield normalized by # of data events");
1424 charmbgaftertofpid->GetXaxis()->SetTitle("p_{T} (GeV/c)");
1427 CorrectFromTheWidth(charmbgafteripcut);
1428 charmbgafteripcut->SetMarkerStyle(24);
1429 charmbgafteripcut->Draw("samep");
1431 CorrectFromTheWidth(charmbgafterweight);
1432 charmbgafterweight->SetMarkerStyle(24);
1433 charmbgafterweight->SetMarkerColor(4);
1434 charmbgafterweight->Draw("samep");
1436 CorrectFromTheWidth(charmbgafterfolding);
1437 charmbgafterfolding->SetMarkerStyle(24);
1438 charmbgafterfolding->SetMarkerColor(2);
1439 charmbgafterfolding->Draw("samep");
1441 cCharmBgEval->cd(2);
1442 parametrizedcharmpidipeff->SetMarkerStyle(24);
1443 parametrizedcharmpidipeff->Draw("p");
1444 parametrizedcharmpidipeff->GetXaxis()->SetTitle("p_{T} (GeV/c)");
1446 cCharmBgEval->cd(3);
1447 charmweightingfc->SetMarkerStyle(24);
1448 charmweightingfc->Draw("p");
1449 charmweightingfc->GetYaxis()->SetTitle("weighting factor for charm electron");
1450 charmweightingfc->GetXaxis()->SetTitle("p_{T} (GeV/c)");
1452 cCharmBgEval->cd(1);
1453 TLegend *legcharmbg = new TLegend(0.3,0.7,0.89,0.89);
1454 legcharmbg->AddEntry(charmbgaftertofpid,"After TOF PID","p");
1455 legcharmbg->AddEntry(charmbgafteripcut,"After IP cut","p");
1456 legcharmbg->AddEntry(charmbgafterweight,"After Weighting","p");
1457 legcharmbg->AddEntry(charmbgafterfolding,"After Folding","p");
1458 legcharmbg->Draw("same");
1460 cCharmBgEval->cd(2);
1461 TLegend *legcharmbg2 = new TLegend(0.3,0.7,0.89,0.89);
1462 legcharmbg2->AddEntry(parametrizedcharmpidipeff,"PID + IP cut eff.","p");
1463 legcharmbg2->Draw("same");
1465 CorrectStatErr(charmBackgroundGrid);
1466 if(fWriteToFile) cCharmBgEval->SaveAs("CharmBackground.eps");
1470 return charmBackgroundGrid;
1473 //____________________________________________________________
1474 AliCFDataGrid* AliHFEspectrum::GetConversionBackground(){
1476 // calculate conversion background
1479 Double_t evtnorm[1] = {0.0};
1480 if(fNMCbgEvents[0]) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents[0]);
1481 printf("check event!!! %lf \n",evtnorm[0]);
1483 AliCFContainer *backgroundContainer = 0x0;
1486 backgroundContainer = (AliCFContainer*)fConvSourceContainer[0][0][0]->Clone();
1487 for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
1488 backgroundContainer->Add(fConvSourceContainer[iSource][0][0]); // make centrality dependent
1492 // Background Estimate
1493 backgroundContainer = GetContainer(kMCWeightedContainerConversionESD);
1495 if(!backgroundContainer){
1496 AliError("MC background container not found");
1500 Int_t stepbackground = 3;
1501 if(TMath::Abs(fEtaRange[0]) < 0.5) stepbackground = 4;
1503 AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ConversionBgGrid","ConversionBgGrid",*backgroundContainer,stepbackground);
1504 Int_t *nBinpp=new Int_t[1];
1505 Int_t* binspp=new Int_t[1];
1506 binspp[0]=fConversionEff[0]->GetNbinsX(); // number of pt bins
1508 Int_t *nBinPbPb=new Int_t[2];
1509 Int_t* binsPbPb=new Int_t[2];
1510 binsPbPb[1]=fConversionEff[0]->GetNbinsX(); // number of pt bins
1513 Int_t looppt=binspp[0];
1514 if(fBeamType==1) looppt=binsPbPb[1];
1516 for(Long_t iBin=1; iBin<= looppt;iBin++){
1520 backgroundGrid->SetElementError(nBinpp, backgroundGrid->GetElementError(nBinpp)*evtnorm[0]);
1521 backgroundGrid->SetElement(nBinpp,backgroundGrid->GetElement(nBinpp)*evtnorm[0]);
1525 // loop over centrality
1526 for(Long_t iiBin=1; iiBin<= binsPbPb[0];iiBin++){
1529 Double_t evtnormPbPb=0;
1530 if(fNMCbgEvents[iiBin-1]) evtnormPbPb= double(fNEvents[iiBin-1])/double(fNMCbgEvents[iiBin-1]);
1531 backgroundGrid->SetElementError(nBinPbPb, backgroundGrid->GetElementError(nBinPbPb)*evtnormPbPb);
1532 backgroundGrid->SetElement(nBinPbPb,backgroundGrid->GetElement(nBinPbPb)*evtnormPbPb);
1536 //end of workaround for statistical errors
1538 AliCFDataGrid *weightedConversionContainer;
1539 if(fBeamType==0) weightedConversionContainer = new AliCFDataGrid("weightedConversionContainer","weightedConversionContainer",1,binspp);
1540 else weightedConversionContainer = new AliCFDataGrid("weightedConversionContainer","weightedConversionContainer",2,binsPbPb);
1541 weightedConversionContainer->SetGrid(GetPIDxIPEff(2));
1542 backgroundGrid->Multiply(weightedConversionContainer,1.0);
1549 return backgroundGrid;
1553 //____________________________________________________________
1554 AliCFDataGrid* AliHFEspectrum::GetNonHFEBackground(){
1556 // calculate non-HFE background
1559 Double_t evtnorm[1] = {0.0};
1560 if(fNMCbgEvents[0]) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents[0]);
1561 printf("check event!!! %lf \n",evtnorm[0]);
1563 AliCFContainer *backgroundContainer = 0x0;
1565 backgroundContainer = (AliCFContainer*)fNonHFESourceContainer[0][0][0]->Clone();
1566 for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
1567 backgroundContainer->Add(fNonHFESourceContainer[iSource][0][0]);
1571 // Background Estimate
1572 backgroundContainer = GetContainer(kMCWeightedContainerNonHFEESD);
1574 if(!backgroundContainer){
1575 AliError("MC background container not found");
1580 Int_t stepbackground = 3;
1581 if(TMath::Abs(fEtaRange[0]) < 0.5) stepbackground = 4;
1583 AliCFDataGrid *backgroundGrid = new AliCFDataGrid("NonHFEBgGrid","NonHFEBgGrid",*backgroundContainer,stepbackground);
1584 Int_t *nBinpp=new Int_t[1];
1585 Int_t* binspp=new Int_t[1];
1586 binspp[0]=fConversionEff[0]->GetNbinsX(); // number of pt bins
1588 Int_t *nBinPbPb=new Int_t[2];
1589 Int_t* binsPbPb=new Int_t[2];
1590 binsPbPb[1]=fConversionEff[0]->GetNbinsX(); // number of pt bins
1593 Int_t looppt=binspp[0];
1594 if(fBeamType==1) looppt=binsPbPb[1];
1597 for(Long_t iBin=1; iBin<= looppt;iBin++){
1601 backgroundGrid->SetElementError(nBinpp, backgroundGrid->GetElementError(nBinpp)*evtnorm[0]);
1602 backgroundGrid->SetElement(nBinpp,backgroundGrid->GetElement(nBinpp)*evtnorm[0]);
1606 for(Long_t iiBin=1; iiBin<=binsPbPb[0];iiBin++){
1609 Double_t evtnormPbPb=0;
1610 if(fNMCbgEvents[iiBin-1]) evtnormPbPb= double(fNEvents[iiBin-1])/double(fNMCbgEvents[iiBin-1]);
1611 backgroundGrid->SetElementError(nBinPbPb, backgroundGrid->GetElementError(nBinPbPb)*evtnormPbPb);
1612 backgroundGrid->SetElement(nBinPbPb,backgroundGrid->GetElement(nBinPbPb)*evtnormPbPb);
1616 //end of workaround for statistical errors
1617 AliCFDataGrid *weightedNonHFEContainer;
1618 if(fBeamType==0) weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",1,binspp);
1619 else weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",2,binsPbPb);
1620 weightedNonHFEContainer->SetGrid(GetPIDxIPEff(3));
1621 backgroundGrid->Multiply(weightedNonHFEContainer,1.0);
1628 return backgroundGrid;
1631 //____________________________________________________________
1632 AliCFDataGrid *AliHFEspectrum::CorrectParametrizedEfficiency(AliCFDataGrid* const bgsubpectrum){
1635 // Apply TPC pid efficiency correction from parametrisation
1638 // Data in the right format
1639 AliCFDataGrid *dataGrid = 0x0;
1641 dataGrid = bgsubpectrum;
1645 AliCFContainer *dataContainer = GetContainer(kDataContainer);
1647 AliError("Data Container not available");
1650 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
1652 AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
1653 result->SetName("ParametrizedEfficiencyBefore");
1654 THnSparse *h = result->GetGrid();
1655 Int_t nbdimensions = h->GetNdimensions();
1656 //printf("CorrectParametrizedEfficiency::We have dimensions %d\n",nbdimensions);
1657 AliCFContainer *dataContainer = GetContainer(kDataContainer);
1659 AliError("Data Container not available");
1662 AliCFContainer *dataContainerbis = (AliCFContainer *) dataContainer->Clone();
1663 dataContainerbis->Add(dataContainerbis,-1.0);
1666 Int_t* coord = new Int_t[nbdimensions];
1667 memset(coord, 0, sizeof(Int_t) * nbdimensions);
1668 Double_t* points = new Double_t[nbdimensions];
1670 ULong64_t nEntries = h->GetNbins();
1671 for (ULong64_t i = 0; i < nEntries; ++i) {
1673 Double_t value = h->GetBinContent(i, coord);
1674 //Double_t valuecontainer = dataContainerbis->GetBinContent(coord,fStepData);
1675 //printf("Value %f, and valuecontainer %f\n",value,valuecontainer);
1677 // Get the bin co-ordinates given an coord
1678 for (Int_t j = 0; j < nbdimensions; ++j)
1679 points[j] = h->GetAxis(j)->GetBinCenter(coord[j]);
1681 if (!fEfficiencyFunction->IsInside(points))
1683 TF1::RejectPoint(kFALSE);
1685 // Evaulate function at points
1686 Double_t valueEfficiency = fEfficiencyFunction->EvalPar(points, NULL);
1687 //printf("Value efficiency is %f\n",valueEfficiency);
1689 if(valueEfficiency > 0.0) {
1690 h->SetBinContent(coord,value/valueEfficiency);
1691 dataContainerbis->SetBinContent(coord,fStepData,value/valueEfficiency);
1693 Double_t error = h->GetBinError(i);
1694 h->SetBinError(coord,error/valueEfficiency);
1695 dataContainerbis->SetBinError(coord,fStepData,error/valueEfficiency);
1703 AliCFDataGrid *resultt = new AliCFDataGrid("spectrumEfficiencyParametrized", "Data Grid for spectrum after Efficiency parametrized", *dataContainerbis,fStepData);
1705 if(fDebugLevel > 0) {
1707 TCanvas * cEfficiencyParametrized = new TCanvas("EfficiencyParametrized","EfficiencyParametrized",1000,700);
1708 cEfficiencyParametrized->Divide(2,1);
1709 cEfficiencyParametrized->cd(1);
1710 TH1D *afterE = (TH1D *) resultt->Project(0);
1711 TH1D *beforeE = (TH1D *) dataGrid->Project(0);
1712 CorrectFromTheWidth(afterE);
1713 CorrectFromTheWidth(beforeE);
1714 afterE->SetStats(0);
1715 afterE->SetTitle("");
1716 afterE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1717 afterE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1718 afterE->SetMarkerStyle(25);
1719 afterE->SetMarkerColor(kBlack);
1720 afterE->SetLineColor(kBlack);
1721 beforeE->SetStats(0);
1722 beforeE->SetTitle("");
1723 beforeE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1724 beforeE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1725 beforeE->SetMarkerStyle(24);
1726 beforeE->SetMarkerColor(kBlue);
1727 beforeE->SetLineColor(kBlue);
1730 beforeE->Draw("same");
1731 TLegend *legefficiencyparametrized = new TLegend(0.4,0.6,0.89,0.89);
1732 legefficiencyparametrized->AddEntry(beforeE,"Before Efficiency correction","p");
1733 legefficiencyparametrized->AddEntry(afterE,"After Efficiency correction","p");
1734 legefficiencyparametrized->Draw("same");
1735 cEfficiencyParametrized->cd(2);
1736 fEfficiencyFunction->Draw();
1737 //cEfficiencyParametrized->cd(3);
1738 //TH1D *ratioefficiency = (TH1D *) beforeE->Clone();
1739 //ratioefficiency->Divide(afterE);
1740 //ratioefficiency->Draw();
1742 if(fWriteToFile) cEfficiencyParametrized->SaveAs("efficiency.eps");
1749 //____________________________________________________________
1750 AliCFDataGrid *AliHFEspectrum::CorrectV0Efficiency(AliCFDataGrid* const bgsubpectrum){
1753 // Apply TPC pid efficiency correction from V0
1756 AliCFContainer *v0Container = GetContainer(kDataContainerV0);
1758 AliError("V0 Container not available");
1763 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*v0Container);
1764 efficiencyD->CalculateEfficiency(fStepAfterCutsV0,fStepBeforeCutsV0);
1766 // Data in the right format
1767 AliCFDataGrid *dataGrid = 0x0;
1769 dataGrid = bgsubpectrum;
1773 AliCFContainer *dataContainer = GetContainer(kDataContainer);
1775 AliError("Data Container not available");
1779 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
1783 AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
1784 result->ApplyEffCorrection(*efficiencyD);
1786 if(fDebugLevel > 0) {
1789 if(fBeamType==0) ptpr=0;
1790 if(fBeamType==1) ptpr=1;
1792 TCanvas * cV0Efficiency = new TCanvas("V0Efficiency","V0Efficiency",1000,700);
1793 cV0Efficiency->Divide(2,1);
1794 cV0Efficiency->cd(1);
1795 TH1D *afterE = (TH1D *) result->Project(ptpr);
1796 TH1D *beforeE = (TH1D *) dataGrid->Project(ptpr);
1797 afterE->SetStats(0);
1798 afterE->SetTitle("");
1799 afterE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1800 afterE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1801 afterE->SetMarkerStyle(25);
1802 afterE->SetMarkerColor(kBlack);
1803 afterE->SetLineColor(kBlack);
1804 beforeE->SetStats(0);
1805 beforeE->SetTitle("");
1806 beforeE->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1807 beforeE->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1808 beforeE->SetMarkerStyle(24);
1809 beforeE->SetMarkerColor(kBlue);
1810 beforeE->SetLineColor(kBlue);
1812 beforeE->Draw("same");
1813 TLegend *legV0efficiency = new TLegend(0.4,0.6,0.89,0.89);
1814 legV0efficiency->AddEntry(beforeE,"Before Efficiency correction","p");
1815 legV0efficiency->AddEntry(afterE,"After Efficiency correction","p");
1816 legV0efficiency->Draw("same");
1817 cV0Efficiency->cd(2);
1818 TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(ptpr);
1819 efficiencyDproj->SetTitle("");
1820 efficiencyDproj->SetStats(0);
1821 efficiencyDproj->SetMarkerStyle(25);
1822 efficiencyDproj->Draw();
1826 TCanvas * cV0Efficiencye = new TCanvas("V0Efficiency_allspectra","V0Efficiency_allspectra",1000,700);
1827 cV0Efficiencye->Divide(2,1);
1828 TLegend *legtotal = new TLegend(0.4,0.6,0.89,0.89);
1829 TLegend *legtotalg = new TLegend(0.4,0.6,0.89,0.89);
1831 THnSparseF* sparseafter = (THnSparseF *) result->GetGrid();
1832 TAxis *cenaxisa = sparseafter->GetAxis(0);
1833 THnSparseF* sparsebefore = (THnSparseF *) dataGrid->GetGrid();
1834 TAxis *cenaxisb = sparsebefore->GetAxis(0);
1835 THnSparseF* efficiencya = (THnSparseF *) efficiencyD->GetGrid();
1836 TAxis *cenaxisc = efficiencya->GetAxis(0);
1837 Int_t nbbin = cenaxisb->GetNbins();
1838 Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
1839 Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
1840 for(Int_t binc = 0; binc < nbbin; binc++){
1841 TString titlee("V0Efficiency_centrality_bin_");
1843 TCanvas * ccV0Efficiency = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
1844 ccV0Efficiency->Divide(2,1);
1845 ccV0Efficiency->cd(1);
1847 cenaxisa->SetRange(binc+1,binc+1);
1848 cenaxisb->SetRange(binc+1,binc+1);
1849 cenaxisc->SetRange(binc+1,binc+1);
1850 TH1D *aftere = (TH1D *) sparseafter->Projection(1);
1851 TH1D *beforee = (TH1D *) sparsebefore->Projection(1);
1852 CorrectFromTheWidth(aftere);
1853 CorrectFromTheWidth(beforee);
1854 aftere->SetStats(0);
1855 aftere->SetTitle((const char*)titlee);
1856 aftere->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1857 aftere->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1858 aftere->SetMarkerStyle(25);
1859 aftere->SetMarkerColor(kBlack);
1860 aftere->SetLineColor(kBlack);
1861 beforee->SetStats(0);
1862 beforee->SetTitle((const char*)titlee);
1863 beforee->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
1864 beforee->GetXaxis()->SetTitle("p_{T} [GeV/c]");
1865 beforee->SetMarkerStyle(24);
1866 beforee->SetMarkerColor(kBlue);
1867 beforee->SetLineColor(kBlue);
1869 beforee->Draw("same");
1870 TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
1871 lega->AddEntry(beforee,"Before correction","p");
1872 lega->AddEntry(aftere,"After correction","p");
1874 cV0Efficiencye->cd(1);
1876 TH1D *afteree = (TH1D *) aftere->Clone();
1877 afteree->SetMarkerStyle(stylee[binc]);
1878 afteree->SetMarkerColor(colorr[binc]);
1879 if(binc==0) afteree->Draw();
1880 else afteree->Draw("same");
1881 legtotal->AddEntry(afteree,(const char*) titlee,"p");
1882 cV0Efficiencye->cd(2);
1884 TH1D *aftereeu = (TH1D *) aftere->Clone();
1885 aftereeu->SetMarkerStyle(stylee[binc]);
1886 aftereeu->SetMarkerColor(colorr[binc]);
1887 if(fNEvents[binc] > 0.0) aftereeu->Scale(1/(Double_t)fNEvents[binc]);
1888 if(binc==0) aftereeu->Draw();
1889 else aftereeu->Draw("same");
1890 legtotalg->AddEntry(aftereeu,(const char*) titlee,"p");
1891 ccV0Efficiency->cd(2);
1892 TH1D* efficiencyDDproj = (TH1D *) efficiencya->Projection(1);
1893 efficiencyDDproj->SetTitle("");
1894 efficiencyDDproj->SetStats(0);
1895 efficiencyDDproj->SetMarkerStyle(25);
1896 efficiencyDDproj->Draw();
1899 cV0Efficiencye->cd(1);
1900 legtotal->Draw("same");
1901 cV0Efficiencye->cd(2);
1902 legtotalg->Draw("same");
1904 cenaxisa->SetRange(0,nbbin);
1905 cenaxisb->SetRange(0,nbbin);
1906 cenaxisc->SetRange(0,nbbin);
1908 if(fWriteToFile) cV0Efficiencye->SaveAs("V0efficiency.eps");
1917 //____________________________________________________________
1918 TList *AliHFEspectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
1921 // Unfold and eventually correct for efficiency the bgsubspectrum
1924 AliCFContainer *mcContainer = GetContainer(kMCContainerMC);
1926 AliError("MC Container not available");
1931 AliError("No Correlation map available");
1936 AliCFDataGrid *dataGrid = 0x0;
1938 dataGrid = bgsubpectrum;
1942 AliCFContainer *dataContainer = GetContainer(kDataContainer);
1944 AliError("Data Container not available");
1948 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
1952 AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainer, fStepGuessedUnfolding);
1953 THnSparse* guessedTHnSparse = ((AliCFGridSparse*)guessedGrid->GetData())->GetGrid();
1956 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
1957 efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
1959 if(!fBeauty2ndMethod)
1961 // Consider parameterized IP cut efficiency
1962 if(!fInclusiveSpectrum){
1963 Int_t* bins=new Int_t[1];
1966 AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
1967 beffContainer->SetGrid(GetBeautyIPEff());
1968 efficiencyD->Multiply(beffContainer,1);
1975 AliCFUnfolding unfolding("unfolding","",fNbDimensions,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse);
1976 //unfolding.SetUseCorrelatedErrors();
1977 if(fUnSetCorrelatedErrors) unfolding.UnsetCorrelatedErrors();
1978 unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
1979 if(fSetSmoothing) unfolding.UseSmoothing();
1983 THnSparse* result = unfolding.GetUnfolded();
1984 THnSparse* residual = unfolding.GetEstMeasured();
1985 TList *listofresults = new TList;
1986 listofresults->SetOwner();
1987 listofresults->AddAt((THnSparse*)result->Clone(),0);
1988 listofresults->AddAt((THnSparse*)residual->Clone(),1);
1990 if(fDebugLevel > 0) {
1993 if(fBeamType==0) ptpr=0;
1994 if(fBeamType==1) ptpr=1;
1996 TCanvas * cresidual = new TCanvas("residual","residual",1000,700);
1997 cresidual->Divide(2,1);
2000 TGraphErrors* residualspectrumD = Normalize(residual);
2001 if(!residualspectrumD) {
2002 AliError("Number of Events not set for the normalization");
2005 residualspectrumD->SetTitle("");
2006 residualspectrumD->GetYaxis()->SetTitleOffset(1.5);
2007 residualspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
2008 residualspectrumD->SetMarkerStyle(26);
2009 residualspectrumD->SetMarkerColor(kBlue);
2010 residualspectrumD->SetLineColor(kBlue);
2011 residualspectrumD->Draw("AP");
2012 AliCFDataGrid *dataGridBis = (AliCFDataGrid *) (dataGrid->Clone());
2013 dataGridBis->SetName("dataGridBis");
2014 TGraphErrors* measuredspectrumD = Normalize(dataGridBis);
2015 measuredspectrumD->SetTitle("");
2016 measuredspectrumD->GetYaxis()->SetTitleOffset(1.5);
2017 measuredspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
2018 measuredspectrumD->SetMarkerStyle(25);
2019 measuredspectrumD->SetMarkerColor(kBlack);
2020 measuredspectrumD->SetLineColor(kBlack);
2021 measuredspectrumD->Draw("P");
2022 TLegend *legres = new TLegend(0.4,0.6,0.89,0.89);
2023 legres->AddEntry(residualspectrumD,"Residual","p");
2024 legres->AddEntry(measuredspectrumD,"Measured","p");
2025 legres->Draw("same");
2027 TH1D *residualTH1D = residual->Projection(ptpr);
2028 TH1D *measuredTH1D = (TH1D *) dataGridBis->Project(ptpr);
2029 TH1D* ratioresidual = (TH1D*)residualTH1D->Clone();
2030 ratioresidual->SetName("ratioresidual");
2031 ratioresidual->SetTitle("");
2032 ratioresidual->GetYaxis()->SetTitle("Folded/Measured");
2033 ratioresidual->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2034 ratioresidual->Divide(residualTH1D,measuredTH1D,1,1);
2035 ratioresidual->SetStats(0);
2036 ratioresidual->Draw();
2038 if(fWriteToFile) cresidual->SaveAs("Unfolding.eps");
2041 return listofresults;
2045 //____________________________________________________________
2046 AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpectrum){
2049 // Apply unfolding and efficiency correction together to bgsubspectrum
2052 AliCFContainer *mcContainer = GetContainer(kMCContainerESD);
2054 AliError("MC Container not available");
2059 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
2060 efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
2063 if(!fBeauty2ndMethod)
2065 // Consider parameterized IP cut efficiency
2066 if(!fInclusiveSpectrum){
2067 Int_t* bins=new Int_t[1];
2070 AliCFEffGrid *beffContainer = new AliCFEffGrid("beffContainer","beffContainer",1,bins);
2071 beffContainer->SetGrid(GetBeautyIPEff());
2072 efficiencyD->Multiply(beffContainer,1);
2076 // Data in the right format
2077 AliCFDataGrid *dataGrid = 0x0;
2079 dataGrid = bgsubpectrum;
2083 AliCFContainer *dataContainer = GetContainer(kDataContainer);
2085 AliError("Data Container not available");
2089 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
2093 AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
2094 result->ApplyEffCorrection(*efficiencyD);
2096 if(fDebugLevel > 0) {
2099 if(fBeamType==0) ptpr=0;
2100 if(fBeamType==1) ptpr=1;
2102 printf("Step MC: %d\n",fStepMC);
2103 printf("Step tracking: %d\n",AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack);
2104 printf("Step MC true: %d\n",fStepTrue);
2105 AliCFEffGrid *efficiencymcPID = (AliCFEffGrid*) GetEfficiency(GetContainer(kMCContainerMC),fStepMC,AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack);
2106 AliCFEffGrid *efficiencymctrackinggeo = (AliCFEffGrid*) GetEfficiency(GetContainer(kMCContainerMC),AliHFEcuts::kStepHFEcutsTRD + AliHFEcuts::kNcutStepsMCTrack,fStepTrue);
2107 AliCFEffGrid *efficiencymcall = (AliCFEffGrid*) GetEfficiency(GetContainer(kMCContainerMC),fStepMC,fStepTrue);
2109 AliCFEffGrid *efficiencyesdall = (AliCFEffGrid*) GetEfficiency(GetContainer(kMCContainerESD),fStepMC,fStepTrue);
2111 TCanvas * cefficiency = new TCanvas("efficiency","efficiency",1000,700);
2113 TH1D* efficiencymcPIDD = (TH1D *) efficiencymcPID->Project(ptpr);
2114 efficiencymcPIDD->SetTitle("");
2115 efficiencymcPIDD->SetStats(0);
2116 efficiencymcPIDD->SetMarkerStyle(25);
2117 efficiencymcPIDD->Draw();
2118 TH1D* efficiencymctrackinggeoD = (TH1D *) efficiencymctrackinggeo->Project(ptpr);
2119 efficiencymctrackinggeoD->SetTitle("");
2120 efficiencymctrackinggeoD->SetStats(0);
2121 efficiencymctrackinggeoD->SetMarkerStyle(26);
2122 efficiencymctrackinggeoD->Draw("same");
2123 TH1D* efficiencymcallD = (TH1D *) efficiencymcall->Project(ptpr);
2124 efficiencymcallD->SetTitle("");
2125 efficiencymcallD->SetStats(0);
2126 efficiencymcallD->SetMarkerStyle(27);
2127 efficiencymcallD->Draw("same");
2128 TH1D* efficiencyesdallD = (TH1D *) efficiencyesdall->Project(ptpr);
2129 efficiencyesdallD->SetTitle("");
2130 efficiencyesdallD->SetStats(0);
2131 efficiencyesdallD->SetMarkerStyle(24);
2132 efficiencyesdallD->Draw("same");
2133 TLegend *legeff = new TLegend(0.4,0.6,0.89,0.89);
2134 legeff->AddEntry(efficiencymcPIDD,"PID efficiency","p");
2135 legeff->AddEntry(efficiencymctrackinggeoD,"Tracking geometry efficiency","p");
2136 legeff->AddEntry(efficiencymcallD,"Overall efficiency","p");
2137 legeff->AddEntry(efficiencyesdallD,"Overall efficiency ESD","p");
2138 legeff->Draw("same");
2142 THnSparseF* sparseafter = (THnSparseF *) result->GetGrid();
2143 TAxis *cenaxisa = sparseafter->GetAxis(0);
2144 THnSparseF* sparsebefore = (THnSparseF *) dataGrid->GetGrid();
2145 TAxis *cenaxisb = sparsebefore->GetAxis(0);
2146 THnSparseF* efficiencya = (THnSparseF *) efficiencyD->GetGrid();
2147 TAxis *cenaxisc = efficiencya->GetAxis(0);
2148 //Int_t nbbin = cenaxisb->GetNbins();
2149 //Int_t stylee[20] = {20,21,22,23,24,25,26,27,28,30,4,5,7,29,29,29,29,29,29,29};
2150 //Int_t colorr[20] = {2,3,4,5,6,7,8,9,46,38,29,30,31,32,33,34,35,37,38,20};
2151 for(Int_t binc = 0; binc < fNCentralityBinAtTheEnd; binc++){
2152 TString titlee("Efficiency_centrality_bin_");
2153 titlee += fLowBoundaryCentralityBinAtTheEnd[binc];
2155 titlee += fHighBoundaryCentralityBinAtTheEnd[binc];
2156 TCanvas * cefficiencye = new TCanvas((const char*) titlee,(const char*) titlee,1000,700);
2157 cefficiencye->Divide(2,1);
2158 cefficiencye->cd(1);
2160 cenaxisa->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
2161 cenaxisb->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fHighBoundaryCentralityBinAtTheEnd[binc]);
2162 TH1D *afterefficiency = (TH1D *) sparseafter->Projection(ptpr);
2163 TH1D *beforeefficiency = (TH1D *) sparsebefore->Projection(ptpr);
2164 CorrectFromTheWidth(afterefficiency);
2165 CorrectFromTheWidth(beforeefficiency);
2166 afterefficiency->SetStats(0);
2167 afterefficiency->SetTitle((const char*)titlee);
2168 afterefficiency->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
2169 afterefficiency->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2170 afterefficiency->SetMarkerStyle(25);
2171 afterefficiency->SetMarkerColor(kBlack);
2172 afterefficiency->SetLineColor(kBlack);
2173 beforeefficiency->SetStats(0);
2174 beforeefficiency->SetTitle((const char*)titlee);
2175 beforeefficiency->GetYaxis()->SetTitle("dN/dp_{T} [(GeV/c)^{-1}]");
2176 beforeefficiency->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2177 beforeefficiency->SetMarkerStyle(24);
2178 beforeefficiency->SetMarkerColor(kBlue);
2179 beforeefficiency->SetLineColor(kBlue);
2180 afterefficiency->Draw();
2181 beforeefficiency->Draw("same");
2182 TLegend *lega = new TLegend(0.4,0.6,0.89,0.89);
2183 lega->AddEntry(beforeefficiency,"Before efficiency correction","p");
2184 lega->AddEntry(afterefficiency,"After efficiency correction","p");
2186 cefficiencye->cd(2);
2187 cenaxisc->SetRange(fLowBoundaryCentralityBinAtTheEnd[binc]+1,fLowBoundaryCentralityBinAtTheEnd[binc]+1);
2188 TH1D* efficiencyDDproj = (TH1D *) efficiencya->Projection(ptpr);
2189 efficiencyDDproj->SetTitle("");
2190 efficiencyDDproj->SetStats(0);
2191 efficiencyDDproj->SetMarkerStyle(25);
2192 efficiencyDDproj->SetMarkerColor(2);
2193 efficiencyDDproj->Draw();
2194 cenaxisc->SetRange(fHighBoundaryCentralityBinAtTheEnd[binc],fHighBoundaryCentralityBinAtTheEnd[binc]);
2195 TH1D* efficiencyDDproja = (TH1D *) efficiencya->Projection(ptpr);
2196 efficiencyDDproja->SetTitle("");
2197 efficiencyDDproja->SetStats(0);
2198 efficiencyDDproja->SetMarkerStyle(26);
2199 efficiencyDDproja->SetMarkerColor(4);
2200 efficiencyDDproja->Draw("same");
2204 if(fWriteToFile) cefficiency->SaveAs("efficiencyCorrected.eps");
2211 //__________________________________________________________________________________
2212 TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum,Int_t i) const {
2214 // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
2215 // Give the final pt spectrum to be compared
2218 if(fNEvents[i] > 0) {
2221 if(fBeamType==0) ptpr=0;
2222 if(fBeamType==1) ptpr=1;
2224 TH1D* projection = spectrum->Projection(ptpr);
2225 CorrectFromTheWidth(projection);
2226 TGraphErrors *graphError = NormalizeTH1(projection,i);
2235 //__________________________________________________________________________________
2236 TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum,Int_t i) const {
2238 // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
2239 // Give the final pt spectrum to be compared
2241 if(fNEvents[i] > 0) {
2244 if(fBeamType==0) ptpr=0;
2245 if(fBeamType==1) ptpr=1;
2247 TH1D* projection = (TH1D *) spectrum->Project(ptpr);
2248 CorrectFromTheWidth(projection);
2249 TGraphErrors *graphError = NormalizeTH1(projection,i);
2259 //__________________________________________________________________________________
2260 TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input,Int_t i) const {
2262 // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
2263 // Give the final pt spectrum to be compared
2265 Double_t chargecoefficient = 0.5;
2266 if(fChargeChoosen != 0) chargecoefficient = 1.0;
2268 Double_t etarange = fEtaSelected ? fEtaRangeNorm[1] - fEtaRangeNorm[0] : 1.6;
2269 printf("Normalizing Eta Range %f\n", etarange);
2270 if(fNEvents[i] > 0) {
2272 TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
2273 Double_t p = 0, dp = 0; Int_t point = 1;
2274 Double_t n = 0, dN = 0;
2275 Double_t nCorr = 0, dNcorr = 0;
2276 Double_t errdN = 0, errdp = 0;
2277 for(Int_t ibin = input->GetXaxis()->GetFirst(); ibin <= input->GetXaxis()->GetLast(); ibin++){
2278 point = ibin - input->GetXaxis()->GetFirst();
2279 p = input->GetXaxis()->GetBinCenter(ibin);
2280 dp = input->GetXaxis()->GetBinWidth(ibin)/2.;
2281 n = input->GetBinContent(ibin);
2282 dN = input->GetBinError(ibin);
2284 nCorr = chargecoefficient * 1./etarange * 1./(Double_t)(fNEvents[i]) * 1./(2. * TMath::Pi() * p) * n;
2285 errdN = 1./(2. * TMath::Pi() * p);
2286 errdp = 1./(2. * TMath::Pi() * p*p) * n;
2287 dNcorr = chargecoefficient * 1./etarange * 1./(Double_t)(fNEvents[i]) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
2289 spectrumNormalized->SetPoint(point, p, nCorr);
2290 spectrumNormalized->SetPointError(point, dp, dNcorr);
2292 spectrumNormalized->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2293 spectrumNormalized->GetYaxis()->SetTitle("#frac{1}{2 #pi p_{T}} #frac{dN}{dp_{T}} / [GeV/c]^{-2}");
2294 spectrumNormalized->SetMarkerStyle(22);
2295 spectrumNormalized->SetMarkerColor(kBlue);
2296 spectrumNormalized->SetLineColor(kBlue);
2298 return spectrumNormalized;
2306 //__________________________________________________________________________________
2307 TGraphErrors *AliHFEspectrum::NormalizeTH1N(TH1 *input,Int_t normalization) const {
2309 // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
2310 // Give the final pt spectrum to be compared
2312 Double_t chargecoefficient = 0.5;
2313 if(fChargeChoosen != kAllCharge) chargecoefficient = 1.0;
2315 Double_t etarange = fEtaSelected ? fEtaRangeNorm[1] - fEtaRangeNorm[0] : 1.6;
2316 printf("Normalizing Eta Range %f\n", etarange);
2317 if(normalization > 0) {
2319 TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
2320 Double_t p = 0, dp = 0; Int_t point = 1;
2321 Double_t n = 0, dN = 0;
2322 Double_t nCorr = 0, dNcorr = 0;
2323 Double_t errdN = 0, errdp = 0;
2324 for(Int_t ibin = input->GetXaxis()->GetFirst(); ibin <= input->GetXaxis()->GetLast(); ibin++){
2325 point = ibin - input->GetXaxis()->GetFirst();
2326 p = input->GetXaxis()->GetBinCenter(ibin);
2327 dp = input->GetXaxis()->GetBinWidth(ibin)/2.;
2328 n = input->GetBinContent(ibin);
2329 dN = input->GetBinError(ibin);
2331 nCorr = chargecoefficient * 1./etarange * 1./(Double_t)(normalization) * 1./(2. * TMath::Pi() * p) * n;
2332 errdN = 1./(2. * TMath::Pi() * p);
2333 errdp = 1./(2. * TMath::Pi() * p*p) * n;
2334 dNcorr = chargecoefficient * 1./etarange * 1./(Double_t)(normalization) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
2336 spectrumNormalized->SetPoint(point, p, nCorr);
2337 spectrumNormalized->SetPointError(point, dp, dNcorr);
2339 spectrumNormalized->GetXaxis()->SetTitle("p_{T} [GeV/c]");
2340 spectrumNormalized->GetYaxis()->SetTitle("#frac{1}{2 #pi p_{T}} #frac{dN}{dp_{T}} / [GeV/c]^{-2}");
2341 spectrumNormalized->SetMarkerStyle(22);
2342 spectrumNormalized->SetMarkerColor(kBlue);
2343 spectrumNormalized->SetLineColor(kBlue);
2345 return spectrumNormalized;
2353 //____________________________________________________________
2354 void AliHFEspectrum::SetContainer(AliCFContainer *cont, AliHFEspectrum::CFContainer_t type){
2356 // Set the container for a given step to the
2358 if(!fCFContainers) fCFContainers = new TObjArray(kDataContainerV0+1);
2359 fCFContainers->AddAt(cont, type);
2362 //____________________________________________________________
2363 AliCFContainer *AliHFEspectrum::GetContainer(AliHFEspectrum::CFContainer_t type){
2365 // Get Correction Framework Container for given type
2367 if(!fCFContainers) return NULL;
2368 return dynamic_cast<AliCFContainer *>(fCFContainers->At(type));
2370 //____________________________________________________________
2371 AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions,Int_t source,Chargetype_t charge, Int_t centrality) {
2373 // Slice bin for a given source of electron
2374 // nDim is the number of dimension the corrections are done
2375 // dimensions are the definition of the dimensions
2376 // source is if we want to keep only one MC source (-1 means we don't cut on the MC source)
2377 // positivenegative if we want to keep positive (1) or negative (0) or both (-1)
2378 // centrality (-1 means we do not cut on centrality)
2381 Double_t *varMin = new Double_t[container->GetNVar()],
2382 *varMax = new Double_t[container->GetNVar()];
2384 Double_t *binLimits;
2385 for(Int_t ivar = 0; ivar < container->GetNVar(); ivar++){
2387 binLimits = new Double_t[container->GetNBins(ivar)+1];
2388 container->GetBinLimits(ivar,binLimits);
2389 varMin[ivar] = binLimits[0];
2390 varMax[ivar] = binLimits[container->GetNBins(ivar)];
2393 if((source>= 0) && (source<container->GetNBins(ivar))) {
2394 varMin[ivar] = binLimits[source];
2395 varMax[ivar] = binLimits[source];
2400 if(charge != kAllCharge) varMin[ivar] = varMax[ivar] = charge;
2404 for(Int_t ic = 1; ic <= container->GetAxis(1,0)->GetLast(); ic++)
2405 AliDebug(1, Form("eta bin %d, min %f, max %f\n", ic, container->GetAxis(1,0)->GetBinLowEdge(ic), container->GetAxis(1,0)->GetBinUpEdge(ic)));
2407 varMin[ivar] = fEtaRange[0];
2408 varMax[ivar] = fEtaRange[1];
2412 fEtaRangeNorm[0] = container->GetAxis(1,0)->GetBinLowEdge(container->GetAxis(1,0)->FindBin(fEtaRange[0]));
2413 fEtaRangeNorm[1] = container->GetAxis(1,0)->GetBinUpEdge(container->GetAxis(1,0)->FindBin(fEtaRange[1]));
2414 AliInfo(Form("Normalization done in eta range [%f,%f]\n", fEtaRangeNorm[0], fEtaRangeNorm[0]));
2417 if((centrality>= 0) && (centrality<container->GetNBins(ivar))) {
2418 varMin[ivar] = binLimits[centrality];
2419 varMax[ivar] = binLimits[centrality];
2427 AliCFContainer *k = container->MakeSlice(nDim, dimensions, varMin, varMax);
2428 AddTemporaryObject(k);
2429 delete[] varMin; delete[] varMax;
2435 //_________________________________________________________________________
2436 THnSparseF *AliHFEspectrum::GetSlicedCorrelation(THnSparseF *correlationmatrix, Int_t nDim, Int_t *dimensions) const {
2438 // Slice correlation
2441 Int_t ndimensions = correlationmatrix->GetNdimensions();
2442 //printf("Number of dimension %d correlation map\n",ndimensions);
2443 if(ndimensions < (2*nDim)) {
2444 AliError("Problem in the dimensions");
2447 Int_t ndimensionsContainer = (Int_t) ndimensions/2;
2448 //printf("Number of dimension %d container\n",ndimensionsContainer);
2450 Int_t *dim = new Int_t[nDim*2];
2451 for(Int_t iter=0; iter < nDim; iter++){
2452 dim[iter] = dimensions[iter];
2453 dim[iter+nDim] = ndimensionsContainer + dimensions[iter];
2454 //printf("For iter %d: %d and iter+nDim %d: %d\n",iter,dimensions[iter],iter+nDim,ndimensionsContainer + dimensions[iter]);
2457 THnSparseF *k = (THnSparseF *) correlationmatrix->Projection(nDim*2,dim);
2463 //___________________________________________________________________________
2464 void AliHFEspectrum::CorrectFromTheWidth(TH1D *h1) const {
2466 // Correct from the width of the bins --> dN/dp_{T} (GeV/c)^{-1}
2469 TAxis *axis = h1->GetXaxis();
2470 Int_t nbinX = h1->GetNbinsX();
2472 for(Int_t i = 1; i <= nbinX; i++) {
2474 Double_t width = axis->GetBinWidth(i);
2475 Double_t content = h1->GetBinContent(i);
2476 Double_t error = h1->GetBinError(i);
2477 h1->SetBinContent(i,content/width);
2478 h1->SetBinError(i,error/width);
2483 //___________________________________________________________________________
2484 void AliHFEspectrum::CorrectStatErr(AliCFDataGrid *backgroundGrid) const {
2486 // Correct statistical error
2489 TH1D *h1 = (TH1D*)backgroundGrid->Project(0);
2490 Int_t nbinX = h1->GetNbinsX();
2492 for(Long_t i = 1; i <= nbinX; i++) {
2494 Float_t content = h1->GetBinContent(i);
2496 Float_t error = TMath::Sqrt(content);
2497 backgroundGrid->SetElementError(bins, error);
2502 //____________________________________________________________
2503 void AliHFEspectrum::AddTemporaryObject(TObject *o){
2505 // Emulate garbage collection on class level
2507 if(!fTemporaryObjects) {
2508 fTemporaryObjects= new TList;
2509 fTemporaryObjects->SetOwner();
2511 fTemporaryObjects->Add(o);
2514 //____________________________________________________________
2515 void AliHFEspectrum::ClearObject(TObject *o){
2517 // Do a safe deletion
2519 if(fTemporaryObjects){
2520 if(fTemporaryObjects->FindObject(o)) fTemporaryObjects->Remove(o);
2527 //_________________________________________________________________________
2528 TObject* AliHFEspectrum::GetSpectrum(const AliCFContainer * const c, Int_t step) {
2529 AliCFDataGrid* data = new AliCFDataGrid("data","",*c, step);
2532 //_________________________________________________________________________
2533 TObject* AliHFEspectrum::GetEfficiency(const AliCFContainer * const c, Int_t step, Int_t step0){
2535 // Create efficiency grid and calculate efficiency
2538 TString name("eff");
2541 AliCFEffGrid* eff = new AliCFEffGrid((const char*)name,"",*c);
2542 eff->CalculateEfficiency(step,step0);
2546 //____________________________________________________________________________
2547 THnSparse* AliHFEspectrum::GetCharmWeights(){
2550 // Measured D->e based weighting factors
2553 const Int_t nDimpp=1;
2554 Int_t nBinpp[nDimpp] = {35};
2555 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.};
2556 const Int_t nDimPbPb=2;
2557 Int_t nBinPbPb[nDimPbPb] = {11,35};
2558 Double_t kCentralityRange[12] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
2560 Int_t looppt=nBinpp[0];
2563 fWeightCharm = new THnSparseF("weightHisto", "weighting factor; pt[GeV/c]", nDimpp, nBinpp);
2564 fWeightCharm->SetBinEdges(0, ptbinning1);
2568 fWeightCharm = new THnSparseF("weightHisto", "weighting factor; centrality bin; pt[GeV/c]", nDimPbPb, nBinPbPb);
2569 fWeightCharm->SetBinEdges(1, ptbinning1);
2570 fWeightCharm->SetBinEdges(0, kCentralityRange);
2571 loopcentr=nBinPbPb[0];
2574 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};
2576 // Weighting factor for PbPb
2577 //Double_t weight[35]={0.645016, 0.643397, 0.617149, 0.641176, 0.752285, 0.838097, 0.996226, 1.152757, 1.243257, 1.441421, 1.526796, 1.755632, 1.731234, 1.900269, 1.859628, 1.945138, 1.943707, 1.739451, 1.640120, 1.318674, 1.041654, 0.826493, 0.704605, 0.662040, 0.572361, 0.644030, 0.479850, 0.559513, 0.504044, 0.449495, 0.227605, 0.186836, 0.038681, 0.000000, 0.000000};
2581 Double_t contents[2];
2583 for(int icentr=0; icentr<loopcentr; icentr++)
2585 for(int i=0; i<looppt; i++){
2586 pt[0]=(ptbinning1[i]+ptbinning1[i+1])/2.;
2597 fWeightCharm->Fill(contents,weight[i]);
2601 Int_t nDimSparse = fWeightCharm->GetNdimensions();
2602 Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
2603 Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
2605 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
2606 binsvar[iVar] = fWeightCharm->GetAxis(iVar)->GetNbins();
2607 nBins *= binsvar[iVar];
2610 Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
2611 // loop that sets 0 error in each bin
2612 for (Long_t iBin=0; iBin<nBins; iBin++) {
2613 Long_t bintmp = iBin ;
2614 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
2615 binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
2616 bintmp /= binsvar[iVar] ;
2618 fWeightCharm->SetBinError(binfill,0.); // put 0 everywhere
2624 return fWeightCharm;
2627 //____________________________________________________________________________
2628 void AliHFEspectrum::SetParameterizedEff(AliCFContainer *container, AliCFContainer *containermb, AliCFContainer *containeresd, AliCFContainer *containeresdmb, Int_t *dimensions){
2630 // TOF PID efficiencies
2632 if(fBeamType==0) ptpr=0;
2633 if(fBeamType==1) ptpr=1;
2636 const Int_t nCentralitybinning=11; //number of centrality bins
2639 loopcentr=nCentralitybinning;
2642 TF1 *fittofpid = new TF1("fittofpid","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,8.);
2643 TF1 *fipfit = new TF1("fipfit","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,8.);
2644 TF1 *fipfit2 = new TF1("fipfit2","[0]*([1]+[2]*log(x)+[3]*log(x)*log(x))*tanh([4]*x-[5])",0.5,10.0);
2646 TCanvas * cefficiencyParam = new TCanvas("efficiencyParam","efficiencyParam",1200,600);
2647 cefficiencyParam->Divide(2,1);
2648 cefficiencyParam->cd(1);
2650 AliCFContainer *mccontainermcD = 0x0;
2651 TH1D* efficiencysigTOFPIDD[nCentralitybinning];
2652 TH1D* efficiencyTOFPIDD[nCentralitybinning];
2653 TH1D* efficiencysigesdTOFPIDD[nCentralitybinning];
2654 TH1D* efficiencyesdTOFPIDD[nCentralitybinning];
2655 Int_t source = -1; //get parameterized TOF PID efficiencies
2657 for(int icentr=0; icentr<loopcentr; icentr++) {
2659 if(fBeamType==0) mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen);
2660 else mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen,icentr+1);
2661 AliCFEffGrid* efficiencymcsigParamTOFPID= new AliCFEffGrid("efficiencymcsigParamTOFPID","",*mccontainermcD);
2662 efficiencymcsigParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
2664 // mb sample for double check
2665 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2666 else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen,icentr+1);
2667 AliCFEffGrid* efficiencymcParamTOFPID= new AliCFEffGrid("efficiencymcParamTOFPID","",*mccontainermcD);
2668 efficiencymcParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
2670 // mb sample with reconstructed variables
2671 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen);
2672 else mccontainermcD = GetSlicedContainer(containeresdmb, fNbDimensions, dimensions, source, fChargeChoosen,icentr+1);
2673 AliCFEffGrid* efficiencyesdParamTOFPID= new AliCFEffGrid("efficiencyesdParamTOFPID","",*mccontainermcD);
2674 efficiencyesdParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
2676 // mb sample with reconstructed variables
2677 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen);
2678 else mccontainermcD = GetSlicedContainer(containeresd, fNbDimensions, dimensions, source, fChargeChoosen,icentr+1);
2679 AliCFEffGrid* efficiencysigesdParamTOFPID= new AliCFEffGrid("efficiencysigesdParamTOFPID","",*mccontainermcD);
2680 efficiencysigesdParamTOFPID->CalculateEfficiency(fStepMC,fStepMC-1); // TOF PID efficiencies
2683 efficiencysigTOFPIDD[icentr] = (TH1D *) efficiencymcsigParamTOFPID->Project(ptpr);
2684 efficiencyTOFPIDD[icentr] = (TH1D *) efficiencymcParamTOFPID->Project(ptpr);
2685 efficiencysigesdTOFPIDD[icentr] = (TH1D *) efficiencysigesdParamTOFPID->Project(ptpr);
2686 efficiencyesdTOFPIDD[icentr] = (TH1D *) efficiencyesdParamTOFPID->Project(ptpr);
2687 efficiencysigTOFPIDD[icentr]->SetName(Form("efficiencysigTOFPIDD%d",icentr));
2688 efficiencyTOFPIDD[icentr]->SetName(Form("efficiencyTOFPIDD%d",icentr));
2689 efficiencysigesdTOFPIDD[icentr]->SetName(Form("efficiencysigesdTOFPIDD%d",icentr));
2690 efficiencyesdTOFPIDD[icentr]->SetName(Form("efficiencyesdTOFPIDD%d",icentr));
2692 //fit (mc enhenced sample)
2693 fittofpid->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
2694 efficiencysigTOFPIDD[icentr]->Fit(fittofpid,"R");
2695 efficiencysigTOFPIDD[icentr]->GetYaxis()->SetTitle("Efficiency");
2696 fEfficiencyTOFPIDD[icentr] = efficiencysigTOFPIDD[icentr]->GetFunction("fittofpid");
2698 //fit (esd enhenced sample)
2699 efficiencysigesdTOFPIDD[icentr]->Fit(fittofpid,"R");
2700 efficiencysigesdTOFPIDD[icentr]->GetYaxis()->SetTitle("Efficiency");
2701 fEfficiencyesdTOFPIDD[icentr] = efficiencysigesdTOFPIDD[icentr]->GetFunction("fittofpid");
2705 // draw (for PbPb, only 1st bin)
2707 efficiencysigTOFPIDD[0]->SetTitle("");
2708 efficiencysigTOFPIDD[0]->SetStats(0);
2709 efficiencysigTOFPIDD[0]->SetMarkerStyle(25);
2710 efficiencysigTOFPIDD[0]->SetMarkerColor(2);
2711 efficiencysigTOFPIDD[0]->SetLineColor(2);
2712 efficiencysigTOFPIDD[0]->Draw();
2715 efficiencyTOFPIDD[0]->SetTitle("");
2716 efficiencyTOFPIDD[0]->SetStats(0);
2717 efficiencyTOFPIDD[0]->SetMarkerStyle(24);
2718 efficiencyTOFPIDD[0]->SetMarkerColor(4);
2719 efficiencyTOFPIDD[0]->SetLineColor(4);
2720 efficiencyTOFPIDD[0]->Draw("same");
2723 efficiencysigesdTOFPIDD[0]->SetTitle("");
2724 efficiencysigesdTOFPIDD[0]->SetStats(0);
2725 efficiencysigesdTOFPIDD[0]->SetMarkerStyle(25);
2726 efficiencysigesdTOFPIDD[0]->SetMarkerColor(3);
2727 efficiencysigesdTOFPIDD[0]->SetLineColor(3);
2728 efficiencysigesdTOFPIDD[0]->Draw("same");
2731 efficiencyesdTOFPIDD[0]->SetTitle("");
2732 efficiencyesdTOFPIDD[0]->SetStats(0);
2733 efficiencyesdTOFPIDD[0]->SetMarkerStyle(25);
2734 efficiencyesdTOFPIDD[0]->SetMarkerColor(1);
2735 efficiencyesdTOFPIDD[0]->SetLineColor(1);
2736 efficiencyesdTOFPIDD[0]->Draw("same");
2739 fEfficiencyTOFPIDD[0]->SetLineColor(2);
2740 fEfficiencyTOFPIDD[0]->Draw("same");
2742 fEfficiencyesdTOFPIDD[0]->SetLineColor(3);
2743 fEfficiencyesdTOFPIDD[0]->Draw("same");
2745 TLegend *legtofeff = new TLegend(0.3,0.15,0.79,0.44);
2746 legtofeff->AddEntry(efficiencysigTOFPIDD[0],"TOF PID Step Efficiency","");
2747 legtofeff->AddEntry(efficiencysigTOFPIDD[0],"vs MC p_{t} for enhenced samples","p");
2748 legtofeff->AddEntry(efficiencyTOFPIDD[0],"vs MC p_{t} for mb samples","p");
2749 legtofeff->AddEntry(efficiencysigesdTOFPIDD[0],"vs esd p_{t} for enhenced samples","p");
2750 legtofeff->AddEntry(efficiencyesdTOFPIDD[0],"vs esd p_{t} for mb samples","p");
2751 legtofeff->Draw("same");
2754 cefficiencyParam->cd(2);
2755 // IP cut efficiencies
2757 for(int icentr=0; icentr<loopcentr; icentr++) {
2759 AliCFContainer *charmCombined = 0x0;
2760 AliCFContainer *beautyCombined = 0x0;
2762 printf("centrality printing %i \n",icentr);
2764 source = 0; //charm enhenced
2765 if(fBeamType==0) mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen);
2766 else mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2767 AliCFEffGrid* efficiencyCharmSig = new AliCFEffGrid("efficiencyCharmSig","",*mccontainermcD);
2768 efficiencyCharmSig->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
2770 charmCombined= (AliCFContainer*)mccontainermcD->Clone("charmCombined");
2772 source = 1; //beauty enhenced
2773 if(fBeamType==0) mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen);
2774 else mccontainermcD = GetSlicedContainer(container, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2775 AliCFEffGrid* efficiencyBeautySig = new AliCFEffGrid("efficiencyBeautySig","",*mccontainermcD);
2776 efficiencyBeautySig->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
2778 beautyCombined = (AliCFContainer*)mccontainermcD->Clone("beautyCombined");
2780 source = 0; //charm mb
2781 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2782 else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2783 AliCFEffGrid* efficiencyCharm = new AliCFEffGrid("efficiencyCharm","",*mccontainermcD);
2784 efficiencyCharm->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
2786 charmCombined->Add(mccontainermcD);
2787 AliCFEffGrid* efficiencyCharmCombined = new AliCFEffGrid("efficiencyCharmCombined","",*charmCombined);
2788 efficiencyCharmCombined->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1);
2790 source = 1; //beauty mb
2791 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2792 else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2793 AliCFEffGrid* efficiencyBeauty = new AliCFEffGrid("efficiencyBeauty","",*mccontainermcD);
2794 efficiencyBeauty->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
2796 beautyCombined->Add(mccontainermcD);
2797 AliCFEffGrid* efficiencyBeautyCombined = new AliCFEffGrid("efficiencyBeautyCombined","",*beautyCombined);
2798 efficiencyBeautyCombined->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1);
2800 source = 2; //conversion mb
2801 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2802 else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2803 AliCFEffGrid* efficiencyConv = new AliCFEffGrid("efficiencyConv","",*mccontainermcD);
2804 efficiencyConv->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
2806 source = 3; //non HFE except for the conversion mb
2807 if(fBeamType==0) mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen);
2808 else mccontainermcD = GetSlicedContainer(containermb, fNbDimensions, dimensions, source, fChargeChoosen, icentr+1);
2809 AliCFEffGrid* efficiencyNonhfe= new AliCFEffGrid("efficiencyNonhfe","",*mccontainermcD);
2810 efficiencyNonhfe->CalculateEfficiency(AliHFEcuts::kNcutStepsMCTrack + fStepData,AliHFEcuts::kNcutStepsMCTrack + fStepData-1); // ip cut efficiency.
2812 if(fIPEffCombinedSamples){
2813 fEfficiencyCharmSigD[icentr] = (TH1D*)efficiencyCharmCombined->Project(ptpr); //signal enhenced + mb
2814 fEfficiencyBeautySigD[icentr] = (TH1D*)efficiencyBeautyCombined->Project(ptpr); //signal enhenced + mb
2817 fEfficiencyCharmSigD[icentr] = (TH1D*)efficiencyCharmSig->Project(ptpr); //signal enhenced only
2818 fEfficiencyBeautySigD[icentr] = (TH1D*)efficiencyBeautySig->Project(ptpr); //signal enhenced only
2820 fCharmEff[icentr] = (TH1D*)efficiencyCharm->Project(ptpr); //mb only
2821 fBeautyEff[icentr] = (TH1D*)efficiencyBeauty->Project(ptpr); //mb only
2822 fConversionEff[icentr] = (TH1D*)efficiencyConv->Project(ptpr); //mb only
2823 fNonHFEEff[icentr] = (TH1D*)efficiencyNonhfe->Project(ptpr); //mb only
2827 for(int icentr=0; icentr<loopcentr; icentr++) {
2828 fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
2829 fipfit->SetLineColor(2);
2830 fEfficiencyBeautySigD[icentr]->Fit(fipfit,"R");
2831 fEfficiencyBeautySigD[icentr]->GetYaxis()->SetTitle("Efficiency");
2832 if(fBeauty2ndMethod)fEfficiencyIPBeautyD[icentr] = fEfficiencyBeautySigD[0]->GetFunction("fipfit"); //why do we need this line?
2833 else fEfficiencyIPBeautyD[icentr] = fEfficiencyBeautySigD[icentr]->GetFunction("fipfit");
2835 fipfit->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
2836 fipfit->SetLineColor(1);
2837 fEfficiencyCharmSigD[icentr]->Fit(fipfit,"R");
2838 fEfficiencyCharmSigD[icentr]->GetYaxis()->SetTitle("Efficiency");
2839 fEfficiencyIPCharmD[icentr] = fEfficiencyCharmSigD[icentr]->GetFunction("fipfit");
2841 if(fIPParameterizedEff){
2842 fipfit2->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
2843 fipfit2->SetLineColor(3);
2844 fConversionEff[icentr]->Fit(fipfit2,"R");
2845 fConversionEff[icentr]->GetYaxis()->SetTitle("Efficiency");
2846 fEfficiencyIPConversionD[icentr] = fConversionEff[icentr]->GetFunction("fipfit2");
2848 fipfit2->SetParameters(0.5,0.319,0.0157,0.00664,6.77,2.08);
2849 fipfit2->SetLineColor(4);
2850 fNonHFEEff[icentr]->Fit(fipfit2,"R");
2851 fNonHFEEff[icentr]->GetYaxis()->SetTitle("Efficiency");
2852 fEfficiencyIPNonhfeD[icentr] = fNonHFEEff[icentr]->GetFunction("fipfit2");
2856 // draw (for PbPb, only 1st bin)
2857 fEfficiencyCharmSigD[0]->SetMarkerStyle(21);
2858 fEfficiencyCharmSigD[0]->SetMarkerColor(1);
2859 fEfficiencyCharmSigD[0]->SetLineColor(1);
2860 fEfficiencyBeautySigD[0]->SetMarkerStyle(21);
2861 fEfficiencyBeautySigD[0]->SetMarkerColor(2);
2862 fEfficiencyBeautySigD[0]->SetLineColor(2);
2863 fCharmEff[0]->SetMarkerStyle(24);
2864 fCharmEff[0]->SetMarkerColor(1);
2865 fCharmEff[0]->SetLineColor(1);
2866 fBeautyEff[0]->SetMarkerStyle(24);
2867 fBeautyEff[0]->SetMarkerColor(2);
2868 fBeautyEff[0]->SetLineColor(2);
2869 fConversionEff[0]->SetMarkerStyle(24);
2870 fConversionEff[0]->SetMarkerColor(3);
2871 fConversionEff[0]->SetLineColor(3);
2872 fNonHFEEff[0]->SetMarkerStyle(24);
2873 fNonHFEEff[0]->SetMarkerColor(4);
2874 fNonHFEEff[0]->SetLineColor(4);
2876 fEfficiencyCharmSigD[0]->Draw();
2877 fEfficiencyBeautySigD[0]->Draw("same");
2878 //fCharmEff[0]->Draw("same");
2879 //fBeautyEff[0]->Draw("same");
2880 fConversionEff[0]->Draw("same");
2881 fNonHFEEff[0]->Draw("same");
2883 fEfficiencyIPBeautyD[0]->Draw("same");
2884 fEfficiencyIPCharmD[0]->Draw("same");
2885 if(fIPParameterizedEff){
2886 fEfficiencyIPConversionD[0]->Draw("same");
2887 fEfficiencyIPNonhfeD[0]->Draw("same");
2889 TLegend *legipeff = new TLegend(0.55,0.2,0.85,0.39);
2890 legipeff->AddEntry(fEfficiencyBeautySigD[0],"IP Step Efficiency","");
2891 legipeff->AddEntry(fEfficiencyBeautySigD[0],"beauty e","p");
2892 legipeff->AddEntry(fEfficiencyCharmSigD[0],"charm e","p");
2893 legipeff->AddEntry(fConversionEff[0],"conversion e","p");
2894 legipeff->AddEntry(fNonHFEEff[0],"Dalitz e","p");
2895 legipeff->Draw("same");
2898 //____________________________________________________________________________
2899 THnSparse* AliHFEspectrum::GetBeautyIPEff(){
2901 // Return beauty electron IP cut efficiency
2904 const Int_t nPtbinning1 = 35;//number of pt bins, according to new binning
2905 const Int_t nCentralitybinning=11;//number of centrality bins
2906 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
2907 Double_t kCentralityRange[nCentralitybinning+1] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
2909 Int_t nDim=1; //dimensions of the efficiency weighting grid
2913 nDim=2; //dimensions of the efficiency weighting grid
2915 Int_t nBin[1] = {nPtbinning1};
2916 Int_t nBinPbPb[2] = {nCentralitybinning,nPtbinning1};
2920 if(fBeamType==0) ipcut = new THnSparseF("beff", "b IP efficiency; p_{t}(GeV/c)", nDim, nBin);
2921 else ipcut = new THnSparseF("beff", "b IP efficiency; centrality bin; p_{t}(GeV/c)", nDim, nBinPbPb);
2923 for(Int_t idim = 0; idim < nDim; idim++)
2925 if(nDim==1) ipcut->SetBinEdges(idim, kPtRange);
2928 ipcut->SetBinEdges(0, kCentralityRange);
2929 ipcut->SetBinEdges(1, kPtRange);
2933 Double_t weight[nCentralitybinning];
2934 Double_t contents[2];
2936 for(Int_t a=0;a<11;a++)
2942 Int_t looppt=nBin[0];
2946 loopcentr=nBinPbPb[0];
2950 for(int icentr=0; icentr<loopcentr; icentr++)
2952 for(int i=0; i<looppt; i++)
2954 pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
2955 if(fEfficiencyIPBeautyD[icentr])
2956 weight[icentr]=fEfficiencyIPBeautyD[icentr]->Eval(pt[0]);
2958 printf("Fit failed on beauty IP cut efficiency for centrality %d. Contents in histo used!\n",icentr);
2959 weight[icentr] = fEfficiencyBeautySigD[icentr]->GetBinContent(i+1);
2969 ipcut->Fill(contents,weight[icentr]);
2974 Int_t nDimSparse = ipcut->GetNdimensions();
2975 Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
2976 Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
2978 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
2979 binsvar[iVar] = ipcut->GetAxis(iVar)->GetNbins();
2980 nBins *= binsvar[iVar];
2983 Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
2984 // loop that sets 0 error in each bin
2985 for (Long_t iBin=0; iBin<nBins; iBin++) {
2986 Long_t bintmp = iBin ;
2987 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
2988 binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
2989 bintmp /= binsvar[iVar] ;
2991 ipcut->SetBinError(binfill,0.); // put 0 everywhere
3000 //____________________________________________________________________________
3001 THnSparse* AliHFEspectrum::GetPIDxIPEff(Int_t source){
3003 // Return PID x IP cut efficiency
3005 const Int_t nPtbinning1 = 35;//number of pt bins, according to new binning
3006 const Int_t nCentralitybinning=11;//number of centrality bins
3007 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
3008 Double_t kCentralityRange[nCentralitybinning+1] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
3010 Int_t nDim=1; //dimensions of the efficiency weighting grid
3014 nDim=2; //dimensions of the efficiency weighting grid
3016 Int_t nBin[1] = {nPtbinning1};
3017 Int_t nBinPbPb[2] = {nCentralitybinning,nPtbinning1};
3020 if(fBeamType==0) pideff = new THnSparseF("pideff", "PID efficiency; p_{t}(GeV/c)", nDim, nBin);
3021 else pideff = new THnSparseF("pideff", "PID efficiency; centrality bin; p_{t}(GeV/c)", nDim, nBinPbPb);
3022 for(Int_t idim = 0; idim < nDim; idim++)
3025 if(nDim==1) pideff->SetBinEdges(idim, kPtRange);
3028 pideff->SetBinEdges(0, kCentralityRange);
3029 pideff->SetBinEdges(1, kPtRange);
3034 Double_t weight[nCentralitybinning];
3035 Double_t weightErr[nCentralitybinning];
3036 Double_t contents[2];
3038 for(Int_t a=0;a<nCentralitybinning;a++)
3045 Int_t looppt=nBin[0];
3050 loopcentr=nBinPbPb[0];
3053 for(int icentr=0; icentr<loopcentr; icentr++)
3055 Double_t trdtpcPidEfficiency = fEfficiencyFunction->Eval(0); // assume we have constant TRD+TPC PID efficiency
3056 for(int i=0; i<looppt; i++)
3058 pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
3060 Double_t tofpideff = 0.;
3061 Double_t tofpideffesd = 0.;
3062 if(fEfficiencyTOFPIDD[icentr])
3063 tofpideff = fEfficiencyTOFPIDD[icentr]->Eval(pt[0]);
3065 printf("TOF PID fit failed on conversion for centrality %d. The result is wrong!\n",icentr);
3067 if(fEfficiencyesdTOFPIDD[icentr])
3068 tofpideffesd = fEfficiencyesdTOFPIDD[icentr]->Eval(pt[0]);
3070 printf("TOF PID fit failed on conversion for centrality %d. The result is wrong!\n",icentr);
3073 //tof pid eff x tpc pid eff x ip cut eff
3074 if(fIPParameterizedEff){
3076 if(fEfficiencyIPCharmD[icentr]){
3077 weight[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyIPCharmD[icentr]->Eval(pt[0]);
3078 weightErr[icentr] = 0;
3081 printf("Fit failed on charm IP cut efficiency for centrality %d\n",icentr);
3082 weight[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD[icentr]->GetBinContent(i+1);
3083 weightErr[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD[icentr]->GetBinError(i+1);
3086 else if(source==2) {
3087 if(fEfficiencyIPConversionD[icentr]){
3088 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fEfficiencyIPConversionD[icentr]->Eval(pt[0]);
3089 weightErr[icentr] = 0;
3092 printf("Fit failed on conversion IP cut efficiency for centrality %d\n",icentr);
3093 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEff[icentr]->GetBinContent(i+1);
3094 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEff[icentr]->GetBinError(i+1);
3097 else if(source==3) {
3098 if(fEfficiencyIPNonhfeD[icentr]){
3099 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fEfficiencyIPNonhfeD[icentr]->Eval(pt[0]);
3100 weightErr[icentr] = 0;
3103 printf("Fit failed on dalitz IP cut efficiency for centrality %d\n",icentr);
3104 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff[icentr]->GetBinContent(i+1);
3105 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff[icentr]->GetBinError(i+1);
3111 if(fEfficiencyIPCharmD[icentr]){
3112 weight[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyIPCharmD[icentr]->Eval(pt[0]);
3113 weightErr[icentr] = 0;
3116 printf("Fit failed on charm IP cut efficiency for centrality %d\n",icentr);
3117 weight[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD[icentr]->GetBinContent(i+1);
3118 weightErr[icentr] = tofpideff*trdtpcPidEfficiency*fEfficiencyCharmSigD[icentr]->GetBinError(i+1);
3123 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEffbgc->GetBinContent(i+1); // conversion
3124 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEffbgc->GetBinError(i+1);
3127 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEff[icentr]->GetBinContent(i+1); // conversion
3128 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fConversionEff[icentr]->GetBinError(i+1);
3133 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEffbgc->GetBinContent(i+1); // conversion
3134 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEffbgc->GetBinError(i+1);
3137 weight[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff[icentr]->GetBinContent(i+1); // Dalitz
3138 weightErr[icentr] = tofpideffesd*trdtpcPidEfficiency*fNonHFEEff[icentr]->GetBinError(i+1);
3154 pideff->Fill(contents,weight[icentr]);
3155 pideff->SetBinError(ibin,weightErr[icentr]);
3159 Int_t nDimSparse = pideff->GetNdimensions();
3160 Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
3161 Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
3163 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3164 binsvar[iVar] = pideff->GetAxis(iVar)->GetNbins();
3165 nBins *= binsvar[iVar];
3168 Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
3169 // loop that sets 0 error in each bin
3170 for (Long_t iBin=0; iBin<nBins; iBin++) {
3171 Long_t bintmp = iBin ;
3172 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3173 binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
3174 bintmp /= binsvar[iVar] ;
3185 //__________________________________________________________________________
3186 AliCFDataGrid *AliHFEspectrum::GetRawBspectra2ndMethod(){
3188 // retrieve AliCFDataGrid for raw beauty spectra obtained from fit method
3202 // const Int_t nPtbinning1 = 35;//number of pt bins, according to new binning
3203 const Int_t nPtbinning1 = 18;//number of pt bins, according to new binning
3204 const Int_t nCentralitybinning=11;//number of centrality bins
3205 // 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
3206 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};
3208 Double_t kCentralityRange[nCentralitybinning+1] = {0.,1.,2., 3., 4., 5., 6., 7.,8.,9., 10., 11.};
3209 Int_t nBin[1] = {nPtbinning1};
3210 Int_t nBinPbPb[2] = {nCentralitybinning,nPtbinning1};
3211 //fBSpectrum2ndMethod->GetNbinsX()
3213 AliCFDataGrid *rawBeautyContainer;
3214 if(fBeamType==0) rawBeautyContainer = new AliCFDataGrid("rawBeautyContainer","rawBeautyContainer",nDim,nBin);
3215 else rawBeautyContainer = new AliCFDataGrid("rawBeautyContainer","rawBeautyContainer",nDim,nBinPbPb);
3216 // printf("number of bins= %d\n",bins[0]);
3221 THnSparseF *brawspectra;
3222 if(fBeamType==0) brawspectra= new THnSparseF("brawspectra", "beauty yields ; p_{t}(GeV/c)", nDim, nBin);
3223 else brawspectra= new THnSparseF("brawspectra", "beauty yields ; p_{t}(GeV/c)", nDim, nBinPbPb);
3224 if(fBeamType==0) brawspectra->SetBinEdges(0, kPtRange);
3227 // brawspectra->SetBinEdges(0, centralityBins);
3228 brawspectra->SetBinEdges(0, kCentralityRange);
3229 brawspectra->SetBinEdges(1, kPtRange);
3233 Double_t yields= 0.;
3234 Double_t valuesb[2];
3236 //Int_t looppt=nBin[0];
3240 loopcentr=nBinPbPb[0];
3243 for(int icentr=0; icentr<loopcentr; icentr++)
3246 for(int i=0; i<fBSpectrum2ndMethod->GetNbinsX(); i++){
3247 pt[0]=(kPtRange[i]+kPtRange[i+1])/2.;
3249 yields = fBSpectrum2ndMethod->GetBinContent(i+1);
3256 if(fBeamType==0) valuesb[0]=pt[0];
3257 brawspectra->Fill(valuesb,yields);
3263 Int_t nDimSparse = brawspectra->GetNdimensions();
3264 Int_t* binsvar = new Int_t[nDimSparse]; // number of bins for each variable
3265 Long_t nBins = 1; // used to calculate the total number of bins in the THnSparse
3267 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3268 binsvar[iVar] = brawspectra->GetAxis(iVar)->GetNbins();
3269 nBins *= binsvar[iVar];
3272 Int_t *binfill = new Int_t[nDimSparse]; // bin to fill the THnSparse (holding the bin coordinates)
3273 // loop that sets 0 error in each bin
3274 for (Long_t iBin=0; iBin<nBins; iBin++) {
3275 Long_t bintmp = iBin ;
3276 for (Int_t iVar=0; iVar<nDimSparse; iVar++) {
3277 binfill[iVar] = 1 + bintmp % binsvar[iVar] ;
3278 bintmp /= binsvar[iVar] ;
3280 brawspectra->SetBinError(binfill,0.); // put 0 everywhere
3284 rawBeautyContainer->SetGrid(brawspectra); // get charm efficiency
3285 TH1D* hRawBeautySpectra = (TH1D*)rawBeautyContainer->Project(ptpr);
3288 fBSpectrum2ndMethod->SetMarkerStyle(24);
3289 fBSpectrum2ndMethod->Draw("p");
3290 hRawBeautySpectra->SetMarkerStyle(25);
3291 hRawBeautySpectra->Draw("samep");
3296 return rawBeautyContainer;
3299 //__________________________________________________________________________
3300 void AliHFEspectrum::CalculateNonHFEsyst(Int_t centrality){
3302 // Calculate non HFE sys
3309 Double_t evtnorm[1] = {0.0};
3310 if(fNMCbgEvents[0]>0) evtnorm[0]= double(fNEvents[0])/double(fNMCbgEvents[0]);
3312 AliCFDataGrid *convSourceGrid[kElecBgSources][kBgLevels];
3313 AliCFDataGrid *nonHFESourceGrid[kElecBgSources][kBgLevels];
3315 AliCFDataGrid *bgLevelGrid[kBgLevels];
3316 AliCFDataGrid *bgNonHFEGrid[kBgLevels];
3317 AliCFDataGrid *bgConvGrid[kBgLevels];
3319 Int_t stepbackground = 3;
3320 Int_t* bins=new Int_t[1];
3322 bins[0]=fConversionEff[centrality]->GetNbinsX();
3324 AliCFDataGrid *weightedConversionContainer = new AliCFDataGrid("weightedConversionContainer","weightedConversionContainer",1,bins);
3325 AliCFDataGrid *weightedNonHFEContainer = new AliCFDataGrid("weightedNonHFEContainer","weightedNonHFEContainer",1,bins);
3327 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
3328 for(Int_t iSource = 0; iSource < kElecBgSources; iSource++){
3329 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);
3330 weightedConversionContainer->SetGrid(GetPIDxIPEff(2));
3331 convSourceGrid[iSource][iLevel]->Multiply(weightedConversionContainer,1.0);
3333 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);
3334 weightedNonHFEContainer->SetGrid(GetPIDxIPEff(3));
3335 nonHFESourceGrid[iSource][iLevel]->Multiply(weightedNonHFEContainer,1.0);
3338 bgConvGrid[iLevel] = (AliCFDataGrid*)convSourceGrid[0][iLevel]->Clone();
3339 for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
3340 bgConvGrid[iLevel]->Add(convSourceGrid[iSource][iLevel]);
3343 bgNonHFEGrid[iLevel] = (AliCFDataGrid*)nonHFESourceGrid[0][iLevel]->Clone();
3344 for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){//add other sources to get overall background from all meson decays
3345 bgNonHFEGrid[iLevel]->Add(nonHFESourceGrid[iSource][iLevel]);
3348 bgLevelGrid[iLevel] = (AliCFDataGrid*)bgConvGrid[iLevel]->Clone();
3349 bgLevelGrid[iLevel]->Add(bgNonHFEGrid[iLevel]);
3353 //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)
3354 AliCFDataGrid *bgErrorGrid[2];
3355 bgErrorGrid[0] = (AliCFDataGrid*)bgLevelGrid[1]->Clone();
3356 bgErrorGrid[1] = (AliCFDataGrid*)bgLevelGrid[2]->Clone();
3357 bgErrorGrid[0]->Add(bgLevelGrid[0],-1.);
3358 bgErrorGrid[1]->Add(bgLevelGrid[0],-1.);
3360 //plot absolute differences between limit yields (upper/lower limit, based on pi0 errors) and best estimate
3362 hpiErrors[0] = (TH1D*)bgErrorGrid[0]->Project(0);
3363 hpiErrors[0]->Scale(-1.);
3364 hpiErrors[0]->SetTitle("Absolute systematic errors from non-HF meson decays and conversions");
3365 hpiErrors[1] = (TH1D*)bgErrorGrid[1]->Project(0);
3369 //Calculate the scaling errors for electrons from all mesons except for pions: square sum of (0.3 * best yield estimate), where 0.3 is the error generally assumed for m_t scaling
3370 TH1D *hSpeciesErrors[kElecBgSources-1];
3371 for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
3372 hSpeciesErrors[iSource-1] = (TH1D*)convSourceGrid[iSource][0]->Project(0);
3373 TH1D *hNonHFEtemp = (TH1D*)nonHFESourceGrid[iSource][0]->Project(0);
3374 hSpeciesErrors[iSource-1]->Add(hNonHFEtemp);
3375 hSpeciesErrors[iSource-1]->Scale(0.3);
3378 TH1D *hOverallSystErrLow = (TH1D*)hSpeciesErrors[0]->Clone();
3379 TH1D *hOverallSystErrUp = (TH1D*)hSpeciesErrors[0]->Clone();
3380 TH1D *hScalingErrors = (TH1D*)hSpeciesErrors[0]->Clone();
3382 TH1D *hOverallBinScaledErrsUp = (TH1D*)hOverallSystErrUp->Clone();
3383 TH1D *hOverallBinScaledErrsLow = (TH1D*)hOverallSystErrLow->Clone();
3385 for(Int_t iBin = 1; iBin <= kBgPtBins; iBin++){
3386 Double_t pi0basedErrLow = hpiErrors[0]->GetBinContent(iBin);
3387 Double_t pi0basedErrUp = hpiErrors[1]->GetBinContent(iBin);
3389 Double_t sqrsumErrs= 0;
3390 for(Int_t iSource = 1; iSource < kElecBgSources; iSource++){
3391 Double_t scalingErr=hSpeciesErrors[iSource-1]->GetBinContent(iBin);
3392 sqrsumErrs+=(scalingErr*scalingErr);
3394 for(Int_t iErr = 0; iErr < 2; iErr++){
3395 hpiErrors[iErr]->SetBinContent(iBin,hpiErrors[iErr]->GetBinContent(iBin)/hpiErrors[iErr]->GetBinWidth(iBin));
3397 hOverallSystErrUp->SetBinContent(iBin, TMath::Sqrt((pi0basedErrUp*pi0basedErrUp)+sqrsumErrs));
3398 hOverallSystErrLow->SetBinContent(iBin, TMath::Sqrt((pi0basedErrLow*pi0basedErrLow)+sqrsumErrs));
3399 hScalingErrors->SetBinContent(iBin, TMath::Sqrt(sqrsumErrs)/hScalingErrors->GetBinWidth(iBin));
3401 hOverallBinScaledErrsUp->SetBinContent(iBin,hOverallSystErrUp->GetBinContent(iBin)/hOverallBinScaledErrsUp->GetBinWidth(iBin));
3402 hOverallBinScaledErrsLow->SetBinContent(iBin,hOverallSystErrLow->GetBinContent(iBin)/hOverallBinScaledErrsLow->GetBinWidth(iBin));
3406 // /hOverallSystErrUp->GetBinWidth(iBin))
3408 TCanvas *cPiErrors = new TCanvas("cPiErrors","cPiErrors",1000,600);
3410 cPiErrors->SetLogx();
3411 cPiErrors->SetLogy();
3412 hpiErrors[0]->Draw();
3413 hpiErrors[1]->SetMarkerColor(kBlack);
3414 hpiErrors[1]->SetLineColor(kBlack);
3415 hpiErrors[1]->Draw("SAME");
3416 hOverallBinScaledErrsUp->SetMarkerColor(kBlue);
3417 hOverallBinScaledErrsUp->SetLineColor(kBlue);
3418 hOverallBinScaledErrsUp->Draw("SAME");
3419 hOverallBinScaledErrsLow->SetMarkerColor(kGreen);
3420 hOverallBinScaledErrsLow->SetLineColor(kGreen);
3421 hOverallBinScaledErrsLow->Draw("SAME");
3422 hScalingErrors->SetLineColor(11);
3423 hScalingErrors->Draw("SAME");
3425 TLegend *lPiErr = new TLegend(0.6,0.6, 0.95,0.95);
3426 lPiErr->AddEntry(hpiErrors[0],"Lower error from pion error");
3427 lPiErr->AddEntry(hpiErrors[1],"Upper error from pion error");
3428 lPiErr->AddEntry(hScalingErrors, "scaling error");
3429 lPiErr->AddEntry(hOverallBinScaledErrsLow, "overall lower systematics");
3430 lPiErr->AddEntry(hOverallBinScaledErrsUp, "overall upper systematics");
3431 lPiErr->Draw("SAME");
3434 TH1D *hUpSystScaled = (TH1D*)hOverallSystErrUp->Clone();
3435 TH1D *hLowSystScaled = (TH1D*)hOverallSystErrLow->Clone();
3436 hUpSystScaled->Scale(evtnorm[0]);//scale by N(data)/N(MC), to make data sets comparable to saved subtracted spectrum (calculations in separate macro!)
3437 hLowSystScaled->Scale(evtnorm[0]);
3438 TH1D *hNormAllSystErrUp = (TH1D*)hUpSystScaled->Clone();
3439 TH1D *hNormAllSystErrLow = (TH1D*)hLowSystScaled->Clone();
3440 //histograms to be normalized to TGraphErrors
3441 CorrectFromTheWidth(hNormAllSystErrUp);
3442 CorrectFromTheWidth(hNormAllSystErrLow);
3444 TCanvas *cNormOvErrs = new TCanvas("cNormOvErrs","cNormOvErrs");
3446 cNormOvErrs->SetLogx();
3447 cNormOvErrs->SetLogy();
3449 TGraphErrors* gOverallSystErrUp = NormalizeTH1(hNormAllSystErrUp);
3450 TGraphErrors* gOverallSystErrLow = NormalizeTH1(hNormAllSystErrLow);
3451 gOverallSystErrUp->SetTitle("Overall Systematic non-HFE Errors");
3452 gOverallSystErrUp->SetMarkerColor(kBlack);
3453 gOverallSystErrUp->SetLineColor(kBlack);
3454 gOverallSystErrLow->SetMarkerColor(kRed);
3455 gOverallSystErrLow->SetLineColor(kRed);
3456 gOverallSystErrUp->Draw("AP");
3457 gOverallSystErrLow->Draw("PSAME");
3458 TLegend *lAllSys = new TLegend(0.4,0.6,0.89,0.89);
3459 lAllSys->AddEntry(gOverallSystErrLow,"lower","p");
3460 lAllSys->AddEntry(gOverallSystErrUp,"upper","p");
3461 lAllSys->Draw("same");
3464 AliCFDataGrid *bgYieldGrid;
3465 bgYieldGrid = (AliCFDataGrid*)bgLevelGrid[0]->Clone();
3467 TH1D *hBgYield = (TH1D*)bgYieldGrid->Project(0);
3468 TH1D* hRelErrUp = (TH1D*)hOverallSystErrUp->Clone();
3469 hRelErrUp->Divide(hBgYield);
3470 TH1D* hRelErrLow = (TH1D*)hOverallSystErrLow->Clone();
3471 hRelErrLow->Divide(hBgYield);
3473 TCanvas *cRelErrs = new TCanvas("cRelErrs","cRelErrs");
3475 cRelErrs->SetLogx();
3476 hRelErrUp->SetTitle("Relative error of non-HFE background yield");
3478 hRelErrLow->SetLineColor(kBlack);
3479 hRelErrLow->Draw("SAME");
3481 TLegend *lRel = new TLegend(0.6,0.6,0.95,0.95);
3482 lRel->AddEntry(hRelErrUp, "upper");
3483 lRel->AddEntry(hRelErrLow, "lower");
3486 //CorrectFromTheWidth(hBgYield);
3487 //hBgYield->Scale(evtnorm[0]);
3490 //write histograms/TGraphs to file
3491 TFile *output = new TFile("systHists.root","recreate");
3493 hBgYield->SetName("hBgYield");
3495 hRelErrUp->SetName("hRelErrUp");
3497 hRelErrLow->SetName("hRelErrLow");
3498 hRelErrLow->Write();
3499 hUpSystScaled->SetName("hOverallSystErrUp");
3500 hUpSystScaled->Write();
3501 hLowSystScaled->SetName("hOverallSystErrLow");
3502 hLowSystScaled->Write();
3503 gOverallSystErrUp->SetName("gOverallSystErrUp");
3504 gOverallSystErrUp->Write();
3505 gOverallSystErrLow->SetName("gOverallSystErrLow");
3506 gOverallSystErrLow->Write();