1 /*************************************************************************
2 * Copyright(c) 1998-2009, 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 ///////////////////////////////////////////////////////////////////////////
17 // Dielectron SignalBase //
21 Base class for signal extraction from a histogram or an array of histograms
22 The histogram is assumed to be an inv. mass spectrum,
23 the array of histograms is assumed to be an array with inv. mass histograms
24 resulting from single and mixed events, as defined in AliDielectron.cxx
28 ///////////////////////////////////////////////////////////////////////////
32 #include <TPaveText.h>
35 #include <TDatabasePDG.h>
37 #include "AliDielectronSignalFunc.h"
38 #include "AliDielectronSignalBase.h"
40 ClassImp(AliDielectronSignalBase)
42 TH1F* AliDielectronSignalBase::fgHistSimPM=0x0;
43 TObject* AliDielectronSignalBase::fgPeakShape=0x0;
44 const char* AliDielectronSignalBase::fgkValueNames[6] = {
45 "Signal","Background","Significance","Signal/Background","Mass","MassWidth"};
47 AliDielectronSignalBase::AliDielectronSignalBase() :
70 fPeakMethod(kBinCounting),
75 // Default Constructor
79 //______________________________________________
80 AliDielectronSignalBase::AliDielectronSignalBase(const char* name, const char* title) :
103 fPeakMethod(kBinCounting),
112 //______________________________________________
113 AliDielectronSignalBase::~AliDielectronSignalBase()
116 // Default Destructor
118 if(fHistSignal) delete fHistSignal;
119 if(fHistBackground) delete fHistBackground;
120 if (fHistDataPP) delete fHistDataPP;
121 if (fHistDataPM) delete fHistDataPM;
122 if (fHistDataMM) delete fHistDataMM;
123 if (fHistDataME) delete fHistDataME;
124 if (fHistRfactor)delete fHistRfactor;
127 //______________________________________________
128 TPaveText* AliDielectronSignalBase::DrawStats(Double_t x1/*=0.*/, Double_t y1/*=0.*/, Double_t x2/*=0.*/, Double_t y2/*=0.*/)
131 // Draw extracted values in a TPaveText
132 // with the corners x1,y2,x2,y2
134 if (TMath::Abs(x1)<1e-20&&TMath::Abs(x2)<1e-20){
140 TPaveText *t=new TPaveText(x1,y1,x2,y2,"brNDC");
141 t->SetFillColor(kWhite);
144 t->AddText(Form("Range : %.2f - %.2f GeV/c^{2}", fIntMin, fIntMax));
145 t->AddText(Form("Signal : %.1f #pm %.1f", fValues(0), fErrors(0)));
146 t->AddText(Form("Backgnd: %.1f #pm %.1f", fValues(1), fErrors(1)));
147 t->AddText(Form("Signif.: %.2f #pm %.2f", fValues(2), fErrors(2)));
148 t->AddText(Form("S/B : %.2f #pm %.2f", fValues(3), fErrors(3)));
150 t->AddText(Form("Mass: %.2f #pm %.2f GeV/c^{2}", fValues(4), fErrors(4)));
152 t->AddText(Form("Mass res.: %.1f #pm %.1f MeV/c^{2}", 1000*fValues(5), 1000*fErrors(5)));
158 //______________________________________________
159 void AliDielectronSignalBase::Print(Option_t */*option*/) const
162 // Print the statistics
164 printf("Signal : %.5g #pm %.5g\n",fValues(0), fErrors(0));
165 printf("Backgnd: %.5g #pm %.5g\n",fValues(1), fErrors(1));
166 printf("Signif.: %.5g #pm %.5g\n",fValues(2), fErrors(2));
167 printf("SoB : %.5g #pm %.5g\n",fValues(3), fErrors(3));
169 printf("Mass: %.5g #pm %.5g\n", fValues(4), fErrors(4));
171 printf("Mass res.: %.5g #pm %.5g\n", fValues(5), fErrors(5));
174 //______________________________________________
175 Double_t AliDielectronSignalBase::ScaleHistograms(TH1* histRaw, TH1* histBackground, Double_t intMin, Double_t intMax)
178 // scale histBackground to match the integral of histRaw in the interval intMin, intMax
181 //protect using over and underflow bins in normalisation calculation
182 if (intMin<histRaw->GetXaxis()->GetXmin()) intMin=histRaw->GetXaxis()->GetXmin();
183 if (intMin<histBackground->GetXaxis()->GetXmin()) intMin=histBackground->GetXaxis()->GetXmin();
185 if (intMax>histRaw->GetXaxis()->GetXmax())
186 intMax=histRaw->GetXaxis()->GetXmax()-histRaw->GetBinWidth(histRaw->GetNbinsX())/2.;
187 if (intMax>histBackground->GetXaxis()->GetXmax())
188 intMax=histBackground->GetXaxis()->GetXmax()-histBackground->GetBinWidth(histBackground->GetNbinsX())/2.;
190 Double_t intRaw = histRaw->Integral(histRaw->FindBin(intMin),histRaw->FindBin(intMax));
191 Double_t intBack = histBackground->Integral(histBackground->FindBin(intMin),histBackground->FindBin(intMax));
192 Double_t scaleFactor=intBack>0?intRaw/intBack:0.;
194 histBackground->Sumw2();
195 histBackground->Scale(scaleFactor);
200 //______________________________________________
201 Double_t AliDielectronSignalBase::ScaleHistograms(TH1* histRaw, TH1* histBackground, Double_t intMin, Double_t intMax, Double_t intMin2, Double_t intMax2)
204 // scale histBackground to match the integral of histRaw in the interval intMin, intMax and intMin2, intMax2
207 if(intMin2==intMax2) return (ScaleHistograms(histRaw, histBackground, intMin, intMax));
209 //protect using over and underflow bins in normalisation calculation
210 if (intMin<histRaw->GetXaxis()->GetXmin()) intMin=histRaw->GetXaxis()->GetXmin();
211 if (intMin<histBackground->GetXaxis()->GetXmin()) intMin=histBackground->GetXaxis()->GetXmin();
213 if (intMax2>histRaw->GetXaxis()->GetXmax())
214 intMax2=histRaw->GetXaxis()->GetXmax()-histRaw->GetBinWidth(histRaw->GetNbinsX())/2.;
215 if (intMax2>histBackground->GetXaxis()->GetXmax())
216 intMax2=histBackground->GetXaxis()->GetXmax()-histBackground->GetBinWidth(histBackground->GetNbinsX())/2.;
218 Double_t intRaw = histRaw->Integral(histRaw->FindBin(intMin),histRaw->FindBin(intMax));
219 Double_t intBack = histBackground->Integral(histBackground->FindBin(intMin),histBackground->FindBin(intMax));
220 intRaw += histRaw->Integral(histRaw->FindBin(intMin2),histRaw->FindBin(intMax2));
221 intBack += histBackground->Integral(histBackground->FindBin(intMin2),histBackground->FindBin(intMax2));
223 Double_t scaleFactor=intBack>0?intRaw/intBack:0.;
225 histBackground->Sumw2();
226 histBackground->Scale(scaleFactor);
232 TObject* AliDielectronSignalBase::DescribePeakShape(ESignalExtractionMethod method, Bool_t replaceValErr, TH1F *mcShape) {
234 // Describe the extracted peak by the selected method and overwrite signal etc if needed
240 Double_t massPOI=TDatabasePDG::Instance()->GetParticle(fPOIpdg)->Mass();
241 Double_t nPOI = fHistSignal->GetBinContent(fHistSignal->FindBin(massPOI));
242 Double_t binWidth = fHistSignal->GetBinWidth( fHistSignal->FindBin(massPOI));
247 // do the scaling/fitting
248 switch(fPeakMethod) {
249 case kBinCounting: /*nothing needs to be done*/
253 if(!mcShape) { printf(" ERROR: No MC histogram passed. Returning. \n"); return 0x0; }
254 data = fHistSignal->GetBinContent(fHistSignal->FindBin(massPOI));
255 mc = mcShape->GetBinContent(fHistSignal->FindBin(massPOI));
256 mcShape->Scale(data / mc );
260 if(!mcShape) { printf(" ERROR: No MC histogram passed. Returning. \n"); return 0x0; }
261 if(mcShape->GetBinWidth(1)!=fHistSignal->GetBinWidth(1))
262 printf(" WARNING: MC and signal histogram have different bin widths. \n");
263 data = fHistSignal->Integral(fHistSignal->FindBin(fIntMin),fHistSignal->FindBin(fIntMax));
264 mc = mcShape->Integral(mcShape->FindBin(fIntMin),mcShape->FindBin(fIntMax));
265 mcShape->Scale(data / mc );
269 if(!mcShape && !fgHistSimPM) { printf(" ERROR: No MC histogram passed or set. Returning. \n"); return 0x0; }
270 if(!fgHistSimPM) fgHistSimPM=mcShape;
271 fit = new TF1("fitMC",AliDielectronSignalFunc::PeakFunMC,fFitMin,fFitMax,1);
272 fit->SetParNames("N");
273 fHistSignal->Fit(fit,"RNI0");
277 fit = new TF1("fitCB",AliDielectronSignalFunc::PeakFunCB,fFitMin,fFitMax,5);
278 fit->SetParNames("alpha","n","meanx","sigma","N");
279 // fit->SetParameters(-.2,5.,gMjpsi,.06,20);
280 // fit->SetParameters(1.,3.6,gMjpsi,.08,700);
281 fit->SetParameters(0.4, 4.0, massPOI, 0.025, 1.3*nPOI);
282 fit->SetParLimits(0, 0.0, 1. );
283 fit->SetParLimits(1, 0.01, 10. );
284 fit->SetParLimits(2, massPOI-0.02, massPOI+0.02 );
285 fit->SetParLimits(3, 0.001, 0.2 );
286 fit->SetParLimits(4, 0.2*nPOI, 2.0*nPOI );
289 fHistSignal->Fit(fit,"RNI0");
293 fit = new TF1("fitGaus",AliDielectronSignalFunc::PeakFunGaus,fFitMin,fFitMax,3);
294 //fit = new TF1("fitGaus","gaus",fFitMin,fFitMax);
295 fit->SetParNames("N","meanx","sigma");
296 fit->SetParameters(1.3*nPOI, massPOI, 0.025);
297 fit->SetParLimits(0, 0.2*nPOI, 2.0*nPOI );
298 fit->SetParLimits(1, massPOI-0.02, massPOI+0.02);
299 fit->SetParLimits(2, 0.001, 1. );
302 fHistSignal->Fit(fit,"RNI0");
307 // overwrite values and errors if requested
309 switch(fPeakMethod) {
311 fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin), fHistSignal->FindBin(fIntMax), fErrors(0));
312 SetSignificanceAndSOB();
316 fValues(0) = mcShape->IntegralAndError(mcShape->FindBin(fIntMin), mcShape->FindBin(fIntMax), fErrors(0));
317 SetSignificanceAndSOB();
323 fValues(0) = fit->Integral(fIntMin, fIntMax)/binWidth;
324 fErrors(0) = fit->IntegralError(fIntMin, fIntMax)/binWidth;
325 SetSignificanceAndSOB();
328 // set mass position and width
330 fValues(4) = fit->GetParameter(parMass);
331 fErrors(4) = fit->GetParError(parMass);
334 fValues(5) = fit->GetParameter(parSigma);
335 fErrors(5) = fit->GetParError(parSigma);
343 // set the peak method obj
344 switch(fPeakMethod) {
346 fgPeakShape=(TH1F*)fHistSignal->Clone("BinCount");