1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 // Class for spectrum correction
17 // Subtraction of hadronic background, Unfolding of the data and
18 // Renormalization done here
19 // The following containers have to be set:
20 // - Correction framework container for real data
21 // - Correction framework container for MC (Efficiency Map)
22 // - Correction framework container for background coming from data
23 // - Correction framework container for background coming from MC
26 // Raphaelle Bailhache <R.Bailhache@gsi.de>
27 // Markus Fasel <M.Fasel@gsi.de>
33 #include <TObjArray.h>
40 #include <TGraphErrors.h>
45 #include "AliCFContainer.h"
46 #include "AliCFDataGrid.h"
47 #include "AliCFEffGrid.h"
48 #include "AliCFGridSparse.h"
49 #include "AliCFUnfolding.h"
52 #include "AliHFEspectrum.h"
54 ClassImp(AliHFEspectrum)
56 //____________________________________________________________
57 AliHFEspectrum::AliHFEspectrum(const char *name):
60 fTemporaryObjects(NULL),
63 fBackgroundSource(kMCbackground),
69 fStepGuessedUnfolding(-1),
70 fNumberOfIterations(5)
73 // Default constructor
77 //____________________________________________________________
78 AliHFEspectrum::~AliHFEspectrum(){
82 if(fCFContainers) delete fCFContainers;
83 if(fTemporaryObjects){
84 fTemporaryObjects->Clear();
85 delete fTemporaryObjects;
89 //____________________________________________________________
90 void AliHFEspectrum::Correct(AliCFContainer *datacontainer,AliCFContainer *mccontainer,THnSparseF *mccorrelation){
92 // Correct the spectrum for efficiency and unfolding
93 // with both method and compare
96 gStyle->SetPalette(1);
97 gStyle->SetOptStat(1111);
98 gStyle->SetPadBorderMode(0);
99 gStyle->SetCanvasColor(10);
100 gStyle->SetPadLeftMargin(0.13);
101 gStyle->SetPadRightMargin(0.13);
107 AliCFDataGrid *dataspectrum = (AliCFDataGrid *)GetSpectrum(datacontainer,20);
111 SetCorrelation(mccorrelation);
112 SetContainer(datacontainer,AliHFEspectrum::kDataContainer);
113 SetContainer(mccontainer,AliHFEspectrum::kMCContainer);
117 SetNumberOfIteration(5);
118 SetStepGuessedUnfolding(16);
119 SetNumberOfIteration(5);
120 SetStepToCorrect(20);
124 TList *listunfolded = Unfold(1);
126 printf("Unfolded failed\n");
129 THnSparse *correctedspectrum = (THnSparse *) listunfolded->At(0);
130 THnSparse *residualspectrum = (THnSparse *) listunfolded->At(1);
131 if(!correctedspectrum){
132 AliError("No corrected spectrum\n");
135 if(!residualspectrum){
136 AliError("No residul spectrum\n");
142 AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(1);
148 TCanvas * cresidual = new TCanvas("residual","residual",1000,700);
149 cresidual->Divide(2,1);
152 TGraphErrors* residualspectrumD = Normalize(residualspectrum);
153 if(!residualspectrumD) {
154 AliError("Number of Events not set for the normalization");
157 residualspectrumD->SetTitle("");
158 residualspectrumD->GetYaxis()->SetTitleOffset(1.5);
159 residualspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
160 residualspectrumD->SetMarkerStyle(26);
161 residualspectrumD->SetMarkerColor(kBlue);
162 residualspectrumD->SetLineColor(kBlue);
163 residualspectrumD->Draw("AP");
164 TGraphErrors* measuredspectrumD = Normalize(dataspectrum);
165 measuredspectrumD->SetTitle("");
166 measuredspectrumD->GetYaxis()->SetTitleOffset(1.5);
167 measuredspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
168 measuredspectrumD->SetMarkerStyle(25);
169 measuredspectrumD->SetMarkerColor(kBlack);
170 measuredspectrumD->SetLineColor(kBlack);
171 measuredspectrumD->Draw("P");
172 TLegend *legres = new TLegend(0.4,0.6,0.89,0.89);
173 legres->AddEntry(residualspectrumD,"Residual","p");
174 legres->AddEntry(measuredspectrumD,"Measured","p");
175 legres->Draw("same");
177 TH1D *residualTH1D = residualspectrum->Projection(0);
178 TH1D *measuredTH1D = dataspectrum->Project(0);
179 TH1D* ratioresidual = (TH1D*)residualTH1D->Clone();
180 ratioresidual->SetName("ratioresidual");
181 ratioresidual->SetTitle("");
182 ratioresidual->GetYaxis()->SetTitle("Folded/Measured");
183 ratioresidual->GetXaxis()->SetTitle("p_{T} [GeV/c]");
184 ratioresidual->Divide(residualTH1D,measuredTH1D,1,1);
185 ratioresidual->SetStats(0);
186 ratioresidual->Draw();
191 TCanvas * ccorrected = new TCanvas("corrected","corrected",1000,700);
192 ccorrected->Divide(2,1);
195 TGraphErrors* correctedspectrumD = Normalize(correctedspectrum);
196 correctedspectrumD->SetTitle("");
197 correctedspectrumD->GetYaxis()->SetTitleOffset(1.5);
198 correctedspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
199 correctedspectrumD->SetMarkerStyle(26);
200 correctedspectrumD->SetMarkerColor(kBlue);
201 correctedspectrumD->SetLineColor(kBlue);
202 correctedspectrumD->Draw("AP");
203 TGraphErrors* alltogetherspectrumD = Normalize(alltogetherCorrection);
204 alltogetherspectrumD->SetTitle("");
205 alltogetherspectrumD->GetYaxis()->SetTitleOffset(1.5);
206 alltogetherspectrumD->GetYaxis()->SetRangeUser(0.000000001,1.0);
207 alltogetherspectrumD->SetMarkerStyle(25);
208 alltogetherspectrumD->SetMarkerColor(kBlack);
209 alltogetherspectrumD->SetLineColor(kBlack);
210 alltogetherspectrumD->Draw("P");
211 TLegend *legcorrected = new TLegend(0.4,0.6,0.89,0.89);
212 legcorrected->AddEntry(correctedspectrumD,"Corrected","p");
213 legcorrected->AddEntry(alltogetherspectrumD,"Alltogether","p");
214 legcorrected->Draw("same");
216 TH1D *correctedTH1D = correctedspectrum->Projection(0);
217 TH1D *alltogetherTH1D = alltogetherCorrection->Project(0);
218 TH1D* ratiocorrected = (TH1D*)correctedTH1D->Clone();
219 ratiocorrected->SetName("ratiocorrected");
220 ratiocorrected->SetTitle("");
221 ratiocorrected->GetYaxis()->SetTitle("Unfolded/DirectCorrected");
222 ratiocorrected->GetXaxis()->SetTitle("p_{T} [GeV/c]");
223 ratiocorrected->Divide(correctedTH1D,alltogetherTH1D,1,1);
224 ratiocorrected->SetStats(0);
225 ratiocorrected->Draw();
227 // Efficiency correction
229 AliCFEffGrid *efficiencymcPID = (AliCFEffGrid*) GetEfficiency(mccontainer,8,7);
230 AliCFEffGrid *efficiencymctrackinggeo = (AliCFEffGrid*) GetEfficiency(mccontainer,7,0);
231 AliCFEffGrid *efficiencymcall = (AliCFEffGrid*) GetEfficiency(mccontainer,8,0);
233 AliCFEffGrid *efficiencyesdall = (AliCFEffGrid*) GetEfficiency(mccontainer,20,0);
235 TCanvas * cefficiency = new TCanvas("efficiency","efficiency",1000,700);
237 TH1D* efficiencymcPIDD = efficiencymcPID->Project(0);
238 efficiencymcPIDD->SetTitle("");
239 efficiencymcPIDD->SetStats(0);
240 efficiencymcPIDD->SetMarkerStyle(25);
241 efficiencymcPIDD->Draw();
242 TH1D* efficiencymctrackinggeoD = efficiencymctrackinggeo->Project(0);
243 efficiencymctrackinggeoD->SetTitle("");
244 efficiencymctrackinggeoD->SetStats(0);
245 efficiencymctrackinggeoD->SetMarkerStyle(26);
246 efficiencymctrackinggeoD->Draw("same");
247 TH1D* efficiencymcallD = efficiencymcall->Project(0);
248 efficiencymcallD->SetTitle("");
249 efficiencymcallD->SetStats(0);
250 efficiencymcallD->SetMarkerStyle(27);
251 efficiencymcallD->Draw("same");
252 TH1D* efficiencyesdallD = efficiencyesdall->Project(0);
253 efficiencyesdallD->SetTitle("");
254 efficiencyesdallD->SetStats(0);
255 efficiencyesdallD->SetMarkerStyle(24);
256 efficiencyesdallD->Draw("same");
257 TLegend *legeff = new TLegend(0.4,0.6,0.89,0.89);
258 legeff->AddEntry(efficiencymcPIDD,"PID efficiency","p");
259 legeff->AddEntry(efficiencymctrackinggeoD,"Tracking geometry efficiency","p");
260 legeff->AddEntry(efficiencymcallD,"Overall efficiency","p");
261 legeff->AddEntry(efficiencyesdallD,"Overall efficiency ESD","p");
262 legeff->Draw("same");
264 // Dump to file if needed
268 TFile *out = new TFile("finalSpectrum.root","recreate");
271 residualspectrumD->SetName("UnfoldingResidualSpectrum");
272 residualspectrumD->Write();
273 measuredspectrumD->SetName("MeasuredSpectrum");
274 measuredspectrumD->Write();
275 ratioresidual->SetName("RatioResidualSpectrum");
276 ratioresidual->Write();
278 correctedspectrumD->SetName("UnfoldingCorrectedSpectrum");
279 correctedspectrumD->Write();
280 alltogetherspectrumD->SetName("AlltogetherSpectrum");
281 alltogetherspectrumD->Write();
282 ratiocorrected->SetName("RatioUnfoldingAlltogetherSpectrum");
283 ratiocorrected->Write();
285 correctedspectrum->SetName("UnfoldingCorrectedNotNormalizedSpectrum");
286 correctedspectrum->Write();
287 alltogetherCorrection->SetName("AlltogetherCorrectedNotNormalizedSpectrum");
288 alltogetherCorrection->Write();
290 out->Close(); delete out;
297 //____________________________________________________________
298 AliCFDataGrid* AliHFEspectrum::SubtractBackground(Int_t dimensions, Bool_t setBackground){
300 // Apply background subtraction
303 AliCFContainer *dataContainer = GetContainer(kDataContainer);
305 AliError("Data Container not available");
309 // Get the data grid in the requested format
310 Bool_t initContainer = kFALSE;
314 initContainer = kTRUE;
316 case 3: for(Int_t i = 0; i < 3; i++) dims[i] = i;
317 initContainer = kTRUE;
320 AliError("Container with this number of dimensions not foreseen (yet)");
323 AliError("Creation of the sliced containers failed. Background estimation not possible");
326 AliCFContainer *spectrumSliced = GetSlicedContainer(dataContainer, dimensions, dims);
328 // Make Background Estimate
329 AliCFDataGrid *backgroundGrid = NULL;
330 if(fBackgroundSource == kDataBackground)
331 backgroundGrid = MakeBackgroundEstimateFromData(dimensions);
333 backgroundGrid = MakeBackgroundEstimateFromMC(dimensions);
335 AliError("Background Estimate not created");
336 ClearObject(spectrumSliced);
341 AliCFDataGrid *spectrumSubtracted = new AliCFDataGrid("spectrumSubtracted", "Data Grid for spectrum after Background subtraction", *spectrumSliced);
343 spectrumSubtracted->ApplyBGCorrection(*backgroundGrid);
345 if(fBackground) delete fBackground;
346 fBackground = backgroundGrid;
347 } else delete backgroundGrid;
349 return spectrumSubtracted;
352 //____________________________________________________________
353 TList *AliHFEspectrum::Unfold(Int_t dimensions,AliCFDataGrid* const bgsubpectrum){
356 // Unfold and eventually correct for efficiency the bgsubspectrum
359 AliCFContainer *mcContainer = GetContainer(kMCContainer);
361 AliError("MC Container not available");
366 AliError("No Correlation map available");
370 // Get the mc grid in the requested format
371 Bool_t initContainer = kFALSE;
375 initContainer = kTRUE;
377 case 3: for(Int_t i = 0; i < 3; i++) dims[i] = i;
378 initContainer = kTRUE;
381 AliError("Container with this number of dimensions not foreseen (yet)");
384 AliError("Creation of the sliced containers failed. Background estimation not possible");
387 AliCFContainer *mcContainerD = GetSlicedContainer(mcContainer, dimensions, dims);
388 THnSparse *correlationD = GetSlicedCorrelation(dimensions, dims);
390 // Data in the right format
391 AliCFDataGrid *dataGrid = 0x0;
393 if(bgsubpectrum->GetNVar()!= dimensions) {
394 AliError("Not the expected number of dimensions for the AliCFDataGrid\n");
397 dataGrid = bgsubpectrum;
402 AliCFContainer *dataContainer = GetContainer(kDataContainer);
404 AliError("Data Container not available");
408 AliCFContainer *dataContainerD = GetSlicedContainer(dataContainer, dimensions, dims);
409 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainerD, fStepData);
415 AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainerD, fStepGuessedUnfolding);
416 THnSparse* guessedTHnSparse = ((AliCFGridSparse*)guessedGrid->GetData())->GetGrid();
419 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainerD);
420 efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
424 AliCFUnfolding unfolding("unfolding","",dimensions,correlationD,efficiencyD->GetGrid(),((AliCFGridSparse*)dataGrid->GetData())->GetGrid(),guessedTHnSparse);
425 unfolding.SetMaxNumberOfIterations(fNumberOfIterations);
426 unfolding.UseSmoothing();
430 THnSparse* result = unfolding.GetUnfolded();
431 THnSparse* residual = unfolding.GetEstMeasured();
432 TList *listofresults = new TList;
433 listofresults->SetOwner();
434 listofresults->AddAt((THnSparse*)result->Clone(),0);
435 listofresults->AddAt((THnSparse*)residual->Clone(),1);
437 return listofresults;
441 //____________________________________________________________
442 AliCFDataGrid *AliHFEspectrum::CorrectForEfficiency(Int_t dimensions,AliCFDataGrid* const bgsubpectrum){
445 // Apply unfolding and efficiency correction together to bgsubspectrum
448 AliCFContainer *mcContainer = GetContainer(kMCContainer);
450 AliError("MC Container not available");
454 // Get the data grid in the requested format
455 Bool_t initContainer = kFALSE;
459 initContainer = kTRUE;
461 case 3: for(Int_t i = 0; i < 3; i++) dims[i] = i;
462 initContainer = kTRUE;
465 AliError("Container with this number of dimensions not foreseen (yet)");
468 AliError("Creation of the sliced containers failed. Background estimation not possible");
471 AliCFContainer *mcContainerD = GetSlicedContainer(mcContainer, dimensions, dims);
474 AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainerD);
475 efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);
477 // Data in the right format
478 AliCFDataGrid *dataGrid = 0x0;
480 if(bgsubpectrum->GetNVar()!= dimensions) {
481 AliError("Not the expected number of dimensions for the AliCFDataGrid\n");
484 dataGrid = bgsubpectrum;
489 AliCFContainer *dataContainer = GetContainer(kDataContainer);
491 AliError("Data Container not available");
495 AliCFContainer *dataContainerD = GetSlicedContainer(dataContainer, dimensions, dims);
496 dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainerD, fStepData);
501 AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
502 result->ApplyEffCorrection(*efficiencyD);
508 //__________________________________________________________________________________
509 TGraphErrors *AliHFEspectrum::Normalize(THnSparse * const spectrum) const {
511 // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
512 // Give the final pt spectrum to be compared
517 TH1D* projection = spectrum->Projection(0);
518 CorrectFromTheWidth(projection);
519 TGraphErrors *graphError = NormalizeTH1(projection);
528 //__________________________________________________________________________________
529 TGraphErrors *AliHFEspectrum::Normalize(AliCFDataGrid * const spectrum) const {
531 // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
532 // Give the final pt spectrum to be compared
536 TH1D* projection = spectrum->Project(0);
537 CorrectFromTheWidth(projection);
538 TGraphErrors *graphError = NormalizeTH1(projection);
547 //__________________________________________________________________________________
548 TGraphErrors *AliHFEspectrum::NormalizeTH1(TH1 *input) const {
550 // Normalize the spectrum to 1/(2*Pi*p_{T})*dN/dp_{T} (GeV/c)^{-2}
551 // Give the final pt spectrum to be compared
555 TGraphErrors *spectrumNormalized = new TGraphErrors(input->GetNbinsX());
556 Double_t p = 0, dp = 0; Int_t point = 1;
557 Double_t n = 0, dN = 0;
558 Double_t nCorr = 0, dNcorr = 0;
559 Double_t errdN = 0, errdp = 0;
560 for(Int_t ibin = input->GetXaxis()->GetFirst(); ibin <= input->GetXaxis()->GetLast(); ibin++){
561 point = ibin - input->GetXaxis()->GetFirst();
562 p = input->GetXaxis()->GetBinCenter(ibin);
563 dp = input->GetXaxis()->GetBinWidth(ibin)/2.;
564 n = input->GetBinContent(ibin);
565 dN = input->GetBinError(ibin);
568 nCorr = 0.5 * 1/1.6 * 1./(Double_t)(fNEvents) * 1/(2. * TMath::Pi() * p) * n;
569 errdN = 1./(2. * TMath::Pi() * p);
570 errdp = 1./(2. * TMath::Pi() * p*p) * n;
571 dNcorr = 0.5 * 1/1.6 * 1./(Double_t)(fNEvents) * TMath::Sqrt(errdN * errdN * dN *dN + errdp *errdp * dp *dp);
573 spectrumNormalized->SetPoint(point, p, nCorr);
574 spectrumNormalized->SetPointError(point, dp, dNcorr);
576 spectrumNormalized->GetXaxis()->SetTitle("p_{T} [GeV/c]");
577 spectrumNormalized->GetYaxis()->SetTitle("#frac{1}{2 #pi p_{T}} #frac{dN}{dp_{T}} / [GeV/c]^{-2}");
578 spectrumNormalized->SetMarkerStyle(22);
579 spectrumNormalized->SetMarkerColor(kBlue);
580 spectrumNormalized->SetLineColor(kBlue);
582 return spectrumNormalized;
590 //____________________________________________________________
591 void AliHFEspectrum::SetContainer(AliCFContainer *cont, AliHFEspectrum::CFContainer_t type){
593 // Set the container for a given step to the
595 if(!fCFContainers) fCFContainers = new TList;
596 fCFContainers->AddAt(cont, type);
599 //____________________________________________________________
600 AliCFContainer *AliHFEspectrum::GetContainer(AliHFEspectrum::CFContainer_t type){
602 // Get Correction Framework Container for given type
604 if(!fCFContainers) return NULL;
605 return dynamic_cast<AliCFContainer *>(fCFContainers->At(type));
608 //____________________________________________________________
609 AliCFDataGrid *AliHFEspectrum::MakeBackgroundEstimateFromData(Int_t nDim){
611 // Make Background Estimate from Data
612 // Container having background source from
613 // Correction has to be done for background selection Efficiency
616 AliCFContainer *backgroundContainer = GetContainer(kBackgroundMC);
617 AliCFContainer *dataContainer = GetContainer(kBackgroundData);
618 if(!backgroundContainer){
619 AliError("MC background container not found");
623 AliError("Data container not found");
626 AliInfo(Form("Making background Estimate from Data in %d Dimensions", nDim));
628 Bool_t initContainer = kFALSE;
631 case 1: dimensions[0] = 1;
632 initContainer = kTRUE;
634 case 3: for(Int_t i = 0; i < 3; i++) dimensions[i] = i;
635 initContainer = kTRUE;
638 AliError("Container with this number of dimensions not foreseen (yet)");
641 AliError("Creation of the sliced containers failed. Background estimation not possible");
644 AliCFContainer *slicedBackground = GetSlicedContainer(backgroundContainer, nDim, dimensions);
645 AliCFContainer *slicedData = GetSlicedContainer(dataContainer, nDim, dimensions);
647 // Create Efficiency Grid and data grid
648 AliCFEffGrid backgroundRatio("backgroundRatio", "BackgroundRatio", *slicedBackground);
649 backgroundRatio.CalculateEfficiency(2, 1);
650 AliCFDataGrid *backgroundEstimate = new AliCFDataGrid("backgroundEstimate", "Grid for Background Estimate", *slicedData, fStepData);
651 backgroundEstimate->ApplyEffCorrection(backgroundRatio);
653 return backgroundEstimate;
656 //____________________________________________________________
657 AliCFDataGrid *AliHFEspectrum::MakeBackgroundEstimateFromMC(Int_t nDim){
659 // Make Background Estimate using MC
660 // Calculate ratio of hadronic background from MC and
661 // apply this on data
663 AliCFContainer *backgroundContainer = GetContainer(kBackgroundMC);
664 AliCFContainer *dataContainer = GetContainer(kDataContainer);
665 if(!backgroundContainer){
666 AliError("MC background container not found");
670 AliError("Data container not found");
673 AliInfo(Form("Making background Estimate from MC in %d Dimensions", nDim));
675 Bool_t initContainer = kFALSE;
678 case 1: dimensions[0] = 1;
679 initContainer = kTRUE;
681 case 3: for(Int_t i = 0; i < 3; i++) dimensions[i] = i;
682 initContainer = kTRUE;
685 AliError("Container with this number of dimensions not foreseen (yet)");
688 AliError("Creation of the sliced containers failed. Background estimation not possible");
691 AliCFContainer *slicedBackground = GetSlicedContainer(backgroundContainer, nDim, dimensions);
692 AliCFContainer *slicedData = GetSlicedContainer(dataContainer, nDim, dimensions);
694 // Create Efficiency Grid and data grid
695 AliCFEffGrid backgroundRatio("backgroundRatio", "BackgroundRatio", *slicedBackground);
696 backgroundRatio.CalculateEfficiency(1, 0);
697 AliCFDataGrid *backgroundEstimate = new AliCFDataGrid("backgroundEstimate", "Grid for Background Estimate", *slicedData, fStepData);
698 backgroundEstimate->ApplyEffCorrection(backgroundRatio);
700 return backgroundEstimate;
703 //____________________________________________________________
704 AliCFContainer *AliHFEspectrum::GetSlicedContainer(AliCFContainer *container, Int_t nDim, Int_t *dimensions) {
709 Double_t *varMin = new Double_t[container->GetNVar()],
710 *varMax = new Double_t[container->GetNVar()];
713 for(Int_t ivar = 0; ivar < container->GetNVar(); ivar++){
715 binLimits = new Double_t[container->GetNBins(ivar)+1];
716 container->GetBinLimits(ivar,binLimits);
717 varMin[ivar] = binLimits[0];
718 varMax[ivar] = binLimits[container->GetNBins(ivar)];
722 AliCFContainer *k = container->MakeSlice(nDim, dimensions, varMin, varMax);
723 AddTemporaryObject(k);
724 delete[] varMin; delete[] varMax;
730 //_________________________________________________________________________
731 THnSparse *AliHFEspectrum::GetSlicedCorrelation(Int_t nDim, Int_t *dimensions) const {
733 // Slice Pt correlation
736 Int_t ndimensions = fCorrelation->GetNdimensions();
737 printf("Number of dimension %d correlation map\n",ndimensions);
738 if(ndimensions < (2*nDim)) {
739 AliError("Problem in the dimensions");
742 Int_t ndimensionsContainer = (Int_t) ndimensions/2;
743 printf("Number of dimension %d container\n",ndimensionsContainer);
745 Int_t *dim = new Int_t[nDim*2];
746 for(Int_t iter=0; iter < nDim; iter++){
747 dim[iter] = dimensions[iter];
748 dim[iter+nDim] = ndimensionsContainer + dimensions[iter];
749 printf("For iter %d: %d and iter+nDim %d: %d\n",iter,dimensions[iter],iter+nDim,ndimensionsContainer + dimensions[iter]);
752 THnSparse *k = fCorrelation->Projection(nDim*2,dim);
758 //___________________________________________________________________________
759 void AliHFEspectrum::CorrectFromTheWidth(TH1D *h1) const {
761 // Correct from the width of the bins --> dN/dp_{T} (GeV/c)^{-1}
764 TAxis *axis = h1->GetXaxis();
765 Int_t nbinX = h1->GetNbinsX();
767 for(Int_t i = 1; i <= nbinX; i++) {
769 Double_t width = axis->GetBinWidth(i);
770 Double_t content = h1->GetBinContent(i);
771 Double_t error = h1->GetBinError(i);
772 h1->SetBinContent(i,content/width);
773 h1->SetBinError(i,error/width);
777 //____________________________________________________________
778 void AliHFEspectrum::AddTemporaryObject(TObject *o){
780 // Emulate garbage collection on class level
782 if(!fTemporaryObjects) {
783 fTemporaryObjects= new TList;
784 fTemporaryObjects->SetOwner();
786 fTemporaryObjects->Add(o);
789 //____________________________________________________________
790 void AliHFEspectrum::ClearObject(TObject *o){
792 // Do a safe deletion
794 if(fTemporaryObjects){
795 if(fTemporaryObjects->FindObject(o)) fTemporaryObjects->Remove(o);
802 //_________________________________________________________________________
803 TObject* AliHFEspectrum::GetSpectrum(AliCFContainer * const c, Int_t step) {
804 AliCFDataGrid* data = new AliCFDataGrid("data","",*c, step);
807 //_________________________________________________________________________
808 TObject* AliHFEspectrum::GetEfficiency(AliCFContainer * const c, Int_t step, Int_t step0) {
810 // Create efficiency grid and calculate efficiency
816 AliCFEffGrid* eff = new AliCFEffGrid((const char*)name,"",*c);
817 eff->CalculateEfficiency(step,step0);