]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGDQ/dielectron/AliDielectronSignalFunc.cxx
including add task macro and link/builder changes for libPWGGAEMCALTask
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronSignalFunc.cxx
CommitLineData
572b0139 1/*************************************************************************
2* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
15
16///////////////////////////////////////////////////////////////////////////
17// Dielectron SignalFunc //
18// //
19// //
20/*
21Dielectron signal extraction class using functions as input.
22
23A function to describe the signal as well as one to describe the background
24has to be deployed by the user. Alternatively on of the default implementaions
25can be used.
26
27*/
28// //
29///////////////////////////////////////////////////////////////////////////
30
31#include <TF1.h>
32#include <TH1.h>
33#include <TGraph.h>
34#include <TMath.h>
35#include <TString.h>
36#include <TPaveText.h>
bc75eeb5 37#include <TList.h>
38#include <TFitResult.h>
cafdf10b 39//#include <../hist/hist/src/TF1Helper.h>
572b0139 40
41#include <AliLog.h>
42
43#include "AliDielectronSignalFunc.h"
44
45ClassImp(AliDielectronSignalFunc)
46
47AliDielectronSignalFunc::AliDielectronSignalFunc() :
3505bfad 48AliDielectronSignalBase(),
49fFuncSignal(0x0),
50fFuncBackground(0x0),
51fFuncSigBack(0x0),
52fParMass(1),
53fParMassWidth(2),
54fFitOpt("SMNQE"),
55fUseIntegral(kFALSE)
572b0139 56{
57 //
58 // Default Constructor
59 //
60
61}
62
63//______________________________________________
64AliDielectronSignalFunc::AliDielectronSignalFunc(const char* name, const char* title) :
3505bfad 65AliDielectronSignalBase(name, title),
66fFuncSignal(0x0),
67fFuncBackground(0x0),
68fFuncSigBack(0x0),
69fParMass(1),
70fParMassWidth(2),
71fFitOpt("SMNQE"),
72fUseIntegral(kFALSE)
572b0139 73{
74 //
75 // Named Constructor
76 //
77}
78
79//______________________________________________
80AliDielectronSignalFunc::~AliDielectronSignalFunc()
81{
82 //
83 // Default Destructor
84 //
bc75eeb5 85 if(fFuncSignal) delete fFuncSignal;
86 if(fFuncBackground) delete fFuncBackground;
87 if(fFuncSigBack) delete fFuncSigBack;
572b0139 88}
89
90
91//______________________________________________
bc75eeb5 92void AliDielectronSignalFunc::Process(TObjArray * const arrhist)
572b0139 93{
94 //
bc75eeb5 95 // Fit the invariant mass histograms and retrieve the signal and background
572b0139 96 //
bc75eeb5 97 switch(fMethod) {
98 case kFitted :
99 ProcessFit(arrhist);
100 break;
3505bfad 101
bc75eeb5 102 case kLikeSign :
103 ProcessLS(arrhist);
104 break;
3505bfad 105
bc75eeb5 106 case kEventMixing :
3505bfad 107 ProcessEM(arrhist);
bc75eeb5 108 break;
3505bfad 109
bc75eeb5 110 default :
111 AliError("Background substraction method not known!");
572b0139 112 }
bc75eeb5 113}
572b0139 114
572b0139 115
bc75eeb5 116//______________________________________________
117void AliDielectronSignalFunc::ProcessFit(TObjArray * const arrhist) {
118 //
119 // Fit the +- invariant mass distribution only
120 // Here we assume that the combined fit function is a sum of the signal and background functions
121 // and that the signal function is always the first term of this sum
122 //
3505bfad 123
bc75eeb5 124 fHistDataPM = (TH1F*)(arrhist->At(1))->Clone("histPM"); // +- SE
125 fHistDataPM->Sumw2();
126 if(fRebin>1)
127 fHistDataPM->Rebin(fRebin);
572b0139 128
3505bfad 129 fHistSignal = new TH1F("HistSignal", "Like-Sign substracted signal",
130 fHistDataPM->GetXaxis()->GetNbins(),
131 fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
132 fHistBackground = new TH1F("HistBackground", "Like-sign contribution",
133 fHistDataPM->GetXaxis()->GetNbins(),
134 fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
135
136 // the starting parameters of the fit function and their limits can be tuned
bc75eeb5 137 // by the user in its macro
138 fHistDataPM->Fit(fFuncSigBack, fFitOpt.Data(), "", fFitMin, fFitMax);
139 TFitResultPtr pmFitPtr = fHistDataPM->Fit(fFuncSigBack, fFitOpt.Data(), "", fFitMin, fFitMax);
cafdf10b 140 //TFitResult *pmFitResult = pmFitPtr.Get(); // used only with TF1Helper
bc75eeb5 141 fFuncSignal->SetParameters(fFuncSigBack->GetParameters());
142 fFuncBackground->SetParameters(fFuncSigBack->GetParameters()+fFuncSignal->GetNpar());
572b0139 143
bc75eeb5 144 for(Int_t iBin=1; iBin<=fHistDataPM->GetXaxis()->GetNbins(); iBin++) {
145 Double_t m = fHistDataPM->GetBinCenter(iBin);
146 Double_t pm = fHistDataPM->GetBinContent(iBin);
147 Double_t epm = fHistDataPM->GetBinError(iBin);
148 Double_t bknd = fFuncBackground->Eval(m);
149 Double_t ebknd = 0;
150 for(Int_t iPar=fFuncSignal->GetNpar(); iPar<fFuncSigBack->GetNpar(); iPar++) {
cafdf10b 151/* TF1Helper problem on alien compilation
bc75eeb5 152 for(Int_t jPar=iPar; jPar<fFuncSigBack->GetNpar(); jPar++) {
153 TF1 gradientIpar("gradientIpar",
3505bfad 154 ROOT::TF1Helper::TGradientParFunction(iPar-fFuncSignal->GetNpar(),fFuncBackground),0,0,0);
bc75eeb5 155 TF1 gradientJpar("gradientJpar",
3505bfad 156 ROOT::TF1Helper::TGradientParFunction(jPar-fFuncSignal->GetNpar(),fFuncBackground),0,0,0);
157 ebknd += pmFitResult->CovMatrix(iPar,jPar)*
158 gradientIpar.Eval(m)*gradientJpar.Eval(m)*
159 (iPar==jPar ? 1.0 : 2.0);
bc75eeb5 160 }
cafdf10b 161*/
bc75eeb5 162 }
163 Double_t signal = pm-bknd;
164 Double_t error = TMath::Sqrt(epm*epm+ebknd);
165 fHistSignal->SetBinContent(iBin, signal);
166 fHistSignal->SetBinError(iBin, error);
167 fHistBackground->SetBinContent(iBin, bknd);
168 fHistBackground->SetBinError(iBin, TMath::Sqrt(ebknd));
169 }
3505bfad 170
bc75eeb5 171 if(fUseIntegral) {
172 // signal
173 fValues(0) = fFuncSignal->Integral(fIntMin, fIntMax)/fHistDataPM->GetBinWidth(1);
174 fErrors(0) = 0;
175 for(Int_t iPar=0; iPar<fFuncSignal->GetNpar(); iPar++) {
cafdf10b 176/* TF1Helper problem on alien compilation
bc75eeb5 177 for(Int_t jPar=iPar; jPar<fFuncSignal->GetNpar(); jPar++) {
178 TF1 gradientIpar("gradientIpar",
3505bfad 179 ROOT::TF1Helper::TGradientParFunction(iPar,fFuncSignal),0,0,0);
bc75eeb5 180 TF1 gradientJpar("gradientJpar",
3505bfad 181 ROOT::TF1Helper::TGradientParFunction(jPar,fFuncSignal),0,0,0);
182 fErrors(0) += pmFitResult->CovMatrix(iPar,jPar)*
183 gradientIpar.Integral(fIntMin,fIntMax)*gradientJpar.Integral(fIntMin,fIntMax)*
184 (iPar==jPar ? 1.0 : 2.0);
bc75eeb5 185 }
cafdf10b 186*/
3505bfad 187 }
bc75eeb5 188 // background
189 fValues(1) = fFuncBackground->Integral(fIntMin, fIntMax)/fHistDataPM->GetBinWidth(1);
190 fErrors(1) = 0;
191 for(Int_t iPar=fFuncSignal->GetNpar(); iPar<fFuncSigBack->GetNpar(); iPar++) {
cafdf10b 192/* TF1Helper problem on alien compilation
bc75eeb5 193 for(Int_t jPar=iPar; jPar<fFuncSigBack->GetNpar(); jPar++) {
194 TF1 gradientIpar("gradientIpar",
3505bfad 195 ROOT::TF1Helper::TGradientParFunction(iPar-fFuncSignal->GetNpar(),fFuncBackground),0,0,0);
bc75eeb5 196 TF1 gradientJpar("gradientJpar",
3505bfad 197 ROOT::TF1Helper::TGradientParFunction(jPar-fFuncSignal->GetNpar(),fFuncBackground),0,0,0);
198 fErrors(1) += pmFitResult->CovMatrix(iPar,jPar)*
199 gradientIpar.Integral(fIntMin, fIntMax)*gradientJpar.Integral(fIntMin, fIntMax)*
200 (iPar==jPar ? 1.0 : 2.0);
bc75eeb5 201 }
cafdf10b 202*/
bc75eeb5 203 }
572b0139 204 }
bc75eeb5 205 else {
206 // signal
207 fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin),
3505bfad 208 fHistSignal->FindBin(fIntMax), fErrors(0));
bc75eeb5 209 // background
210 fValues(1) = fHistBackground->IntegralAndError(fHistBackground->FindBin(fIntMin),
3505bfad 211 fHistBackground->FindBin(fIntMax),
212 fErrors(1));
8df8e382 213 }
bc75eeb5 214 // S/B and significance
215 SetSignificanceAndSOB();
216 fValues(4) = fFuncSigBack->GetParameter(fParMass);
217 fErrors(4) = fFuncSigBack->GetParError(fParMass);
218 fValues(5) = fFuncSigBack->GetParameter(fParMassWidth);
219 fErrors(5) = fFuncSigBack->GetParError(fParMassWidth);
3505bfad 220
bc75eeb5 221 fProcessed = kTRUE;
572b0139 222}
223
224//______________________________________________
bc75eeb5 225void AliDielectronSignalFunc::ProcessLS(TObjArray * const arrhist) {
572b0139 226 //
bc75eeb5 227 // Substract background using the like-sign spectrum
572b0139 228 //
bc75eeb5 229 fHistDataPP = (TH1F*)(arrhist->At(0))->Clone("histPP"); // ++ SE
230 fHistDataPM = (TH1F*)(arrhist->At(1))->Clone("histPM"); // +- SE
3505bfad 231 fHistDataMM = (TH1F*)(arrhist->At(2))->Clone("histMM"); // -- SE
232 if (fRebin>1) {
bc75eeb5 233 fHistDataPP->Rebin(fRebin);
234 fHistDataPM->Rebin(fRebin);
235 fHistDataMM->Rebin(fRebin);
3505bfad 236 }
bc75eeb5 237 fHistDataPP->Sumw2();
238 fHistDataPM->Sumw2();
239 fHistDataMM->Sumw2();
3505bfad 240
241 fHistSignal = new TH1F("HistSignal", "Like-Sign substracted signal",
242 fHistDataPM->GetXaxis()->GetNbins(),
243 fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
244 fHistBackground = new TH1F("HistBackground", "Like-sign contribution",
245 fHistDataPM->GetXaxis()->GetNbins(),
246 fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
247
bc75eeb5 248 // fit the +- mass distribution
249 fHistDataPM->Fit(fFuncSigBack, fFitOpt.Data(), "", fFitMin, fFitMax);
250 fHistDataPM->Fit(fFuncSigBack, fFitOpt.Data(), "", fFitMin, fFitMax);
251 // declare the variables where the like-sign fit results will be stored
45b2b1b8 252// TFitResult *ppFitResult = 0x0;
253// TFitResult *mmFitResult = 0x0;
bc75eeb5 254 // fit the like sign background
255 TF1 *funcClonePP = (TF1*)fFuncBackground->Clone("funcClonePP");
256 TF1 *funcCloneMM = (TF1*)fFuncBackground->Clone("funcCloneMM");
257 fHistDataPP->Fit(funcClonePP, fFitOpt.Data(), "", fFitMin, fFitMax);
45b2b1b8 258 fHistDataPP->Fit(funcClonePP, fFitOpt.Data(), "", fFitMin, fFitMax);
259// TFitResultPtr ppFitPtr = fHistDataPP->Fit(funcClonePP, fFitOpt.Data(), "", fFitMin, fFitMax);
260// ppFitResult = ppFitPtr.Get();
261 fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax);
bc75eeb5 262 fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax);
45b2b1b8 263// TFitResultPtr mmFitPtr = fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax);
264// mmFitResult = mmFitPtr.Get();
3505bfad 265
bc75eeb5 266 for(Int_t iBin=1; iBin<=fHistDataPM->GetXaxis()->GetNbins(); iBin++) {
267 Double_t m = fHistDataPM->GetBinCenter(iBin);
268 Double_t pm = fHistDataPM->GetBinContent(iBin);
269 Double_t pp = funcClonePP->Eval(m);
270 Double_t mm = funcCloneMM->Eval(m);
271 Double_t epm = fHistDataPM->GetBinError(iBin);
272 Double_t epp = 0;
273 for(Int_t iPar=0; iPar<funcClonePP->GetNpar(); iPar++) {
cafdf10b 274/* TF1Helper problem on alien compilation
bc75eeb5 275 for(Int_t jPar=iPar; jPar<funcClonePP->GetNpar(); jPar++) {
276 TF1 gradientIpar("gradientIpar",
3505bfad 277 ROOT::TF1Helper::TGradientParFunction(iPar,funcClonePP),0,0,0);
bc75eeb5 278 TF1 gradientJpar("gradientJpar",
3505bfad 279 ROOT::TF1Helper::TGradientParFunction(jPar,funcClonePP),0,0,0);
280 epp += ppFitResult->CovMatrix(iPar,jPar)*
281 gradientIpar.Eval(m)*gradientJpar.Eval(m)*
282 (iPar==jPar ? 1.0 : 2.0);
bc75eeb5 283 }
cafdf10b 284*/
bc75eeb5 285 }
286 Double_t emm = 0;
287 for(Int_t iPar=0; iPar<funcCloneMM->GetNpar(); iPar++) {
cafdf10b 288/* TF1Helper problem on alien compilation
bc75eeb5 289 for(Int_t jPar=iPar; jPar<funcCloneMM->GetNpar(); jPar++) {
290 TF1 gradientIpar("gradientIpar",
3505bfad 291 ROOT::TF1Helper::TGradientParFunction(iPar,funcCloneMM),0,0,0);
bc75eeb5 292 TF1 gradientJpar("gradientJpar",
3505bfad 293 ROOT::TF1Helper::TGradientParFunction(jPar,funcCloneMM),0,0,0);
294 emm += mmFitResult->CovMatrix(iPar,jPar)*
295 gradientIpar.Eval(m)*gradientJpar.Eval(m)*
296 (iPar==jPar ? 1.0 : 2.0);
bc75eeb5 297 }
cafdf10b 298*/
bc75eeb5 299 }
3505bfad 300
bc75eeb5 301 Double_t signal = pm-2.0*TMath::Sqrt(pp*mm);
302 Double_t background = 2.0*TMath::Sqrt(pp*mm);
303 // error propagation on the signal calculation above
304 Double_t esignal = TMath::Sqrt(epm*epm+(mm/pp)*epp+(pp/mm)*emm);
305 Double_t ebackground = TMath::Sqrt((mm/pp)*epp+(pp/mm)*emm);
306 fHistSignal->SetBinContent(iBin, signal);
307 fHistSignal->SetBinError(iBin, esignal);
308 fHistBackground->SetBinContent(iBin, background);
309 fHistBackground->SetBinError(iBin, ebackground);
310 }
2a14a7b1 311
bc75eeb5 312 // signal
313 fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin),
3505bfad 314 fHistSignal->FindBin(fIntMax), fErrors(0));
bc75eeb5 315 // background
316 fValues(1) = fHistBackground->IntegralAndError(fHistBackground->FindBin(fIntMin),
3505bfad 317 fHistBackground->FindBin(fIntMax),
318 fErrors(1));
bc75eeb5 319 // S/B and significance
320 SetSignificanceAndSOB();
321 fValues(4) = fFuncSigBack->GetParameter(fParMass);
322 fErrors(4) = fFuncSigBack->GetParError(fParMass);
323 fValues(5) = fFuncSigBack->GetParameter(fParMassWidth);
324 fErrors(5) = fFuncSigBack->GetParError(fParMassWidth);
3505bfad 325
bc75eeb5 326 fProcessed = kTRUE;
572b0139 327}
bc75eeb5 328
329//______________________________________________
3505bfad 330void AliDielectronSignalFunc::ProcessEM(TObjArray * const arrhist) {
bc75eeb5 331 //
332 // Substract background with the event mixing technique
333 //
3505bfad 334 arrhist->GetEntries(); // just to avoid the unused parameter warning
335 AliError("Event mixing for background substraction method not implemented!");
336}
bc75eeb5 337
572b0139 338//______________________________________________
bc75eeb5 339void AliDielectronSignalFunc::SetFunctions(TF1 * const combined, TF1 * const sig, TF1 * const back,
572b0139 340 Int_t parM, Int_t parMres)
341{
342 //
343 // Set the signal, background functions and combined fit function
344 // Note: The process method assumes that the first n parameters in the
345 // combined fit function correspond to the n parameters of the signal function
346 // and the n+1 to n+m parameters to the m parameters of the background function!!!
bc75eeb5 347
572b0139 348 if (!sig||!back||!combined) {
349 AliError("Both, signal and background function need to be set!");
61d106d3 350 return;
572b0139 351 }
bc75eeb5 352 fFuncSignal=sig;
353 fFuncBackground=back;
354 fFuncSigBack=combined;
355 fParMass=parM;
356 fParMassWidth=parMres;
572b0139 357}
358
359//______________________________________________
360void AliDielectronSignalFunc::SetDefaults(Int_t type)
361{
362 //
363 // Setup some default functions:
364 // type = 0: gaus signal + linear background in 2.5 - 4 GeV inv. mass
365 // type = 1: gaus signal + exponential background in 2.5 - 4 GeV inv. mass
366 // type = 2: half gaussian, half exponential signal function
367 // type = 3: Crystal-Ball function
368 // type = 4: Crystal-Ball signal + exponential background
369 //
572b0139 370
371 if (type==0){
bc75eeb5 372 fFuncSignal=new TF1("DieleSignal","gaus",2.5,4);
373 fFuncBackground=new TF1("DieleBackground","pol1",2.5,4);
374 fFuncSigBack=new TF1("DieleCombined","gaus+pol1(3)",2.5,4);
572b0139 375
bc75eeb5 376 fFuncSigBack->SetParameters(1,3.1,.05,2.5,1);
377 fFuncSigBack->SetParLimits(0,0,10000000);
378 fFuncSigBack->SetParLimits(1,3.05,3.15);
379 fFuncSigBack->SetParLimits(2,.02,.1);
3505bfad 380 }
bc75eeb5 381 else if (type==1){
382 fFuncSignal=new TF1("DieleSignal","gaus",2.5,4);
383 fFuncBackground=new TF1("DieleBackground","[0]*exp(-(x-[1])/[2])",2.5,4);
384 fFuncSigBack=new TF1("DieleCombined","gaus+[3]*exp(-(x-[4])/[5])",2.5,4);
572b0139 385
bc75eeb5 386 fFuncSigBack->SetParameters(1,3.1,.05,1,2.5,1);
387 fFuncSigBack->SetParLimits(0,0,10000000);
388 fFuncSigBack->SetParLimits(1,3.05,3.15);
389 fFuncSigBack->SetParLimits(2,.02,.1);
3505bfad 390 }
bc75eeb5 391 else if (type==2){
572b0139 392 // half gaussian, half exponential signal function
393 // exponential background
bc75eeb5 394 fFuncSignal = new TF1("DieleSignal","(x<[1])*([0]*(exp(-0.5*((x-[1])/[2])^2)+exp((x-[1])/[3])*(1-exp(-0.5*((x-[1])/[2])^2))))+(x>=[1])*([0]*exp(-0.5*((x-[1])/[2])^2))",2.5,4);
395 fFuncBackground = new TF1("DieleBackground","[0]*exp(-(x-[1])/[2])+[3]",2.5,4);
396 fFuncSigBack = new TF1("DieleCombined","(x<[1])*([0]*(exp(-0.5*((x-[1])/[2])^2)+exp((x-[1])/[3])*(1-exp(-0.5*((x-[1])/[2])^2))))+(x>=[1])*([0]*exp(-0.5*((x-[1])/[2])^2))+[4]*exp(-(x-[5])/[6])+[7]",2.5,4);
397 fFuncSigBack->SetParameters(1.,3.1,.05,.1,1,2.5,1,0);
572b0139 398
bc75eeb5 399 fFuncSigBack->SetParLimits(0,0,10000000);
400 fFuncSigBack->SetParLimits(1,3.05,3.15);
401 fFuncSigBack->SetParLimits(2,.02,.1);
402 fFuncSigBack->FixParameter(6,2.5);
403 fFuncSigBack->FixParameter(7,0);
572b0139 404 }
405}
406
407
408//______________________________________________
409void AliDielectronSignalFunc::Draw(const Option_t* option)
410{
411 //
412 // Draw the fitted function
413 //
bc75eeb5 414
572b0139 415 TString drawOpt(option);
416 drawOpt.ToLower();
3505bfad 417
572b0139 418 Bool_t optStat=drawOpt.Contains("stat");
419
bc75eeb5 420 fFuncSigBack->SetNpx(200);
421 fFuncSigBack->SetRange(fIntMin,fIntMax);
422 fFuncBackground->SetNpx(200);
423 fFuncBackground->SetRange(fIntMin,fIntMax);
572b0139 424
bc75eeb5 425 TGraph *grSig=new TGraph(fFuncSigBack);
572b0139 426 grSig->SetFillColor(kGreen);
427 grSig->SetFillStyle(3001);
3505bfad 428
bc75eeb5 429 TGraph *grBack=new TGraph(fFuncBackground);
572b0139 430 grBack->SetFillColor(kRed);
431 grBack->SetFillStyle(3001);
3505bfad 432
572b0139 433 grSig->SetPoint(0,grBack->GetX()[0],grBack->GetY()[0]);
434 grSig->SetPoint(grSig->GetN()-1,grBack->GetX()[grBack->GetN()-1],grBack->GetY()[grBack->GetN()-1]);
435
436 grBack->SetPoint(0,grBack->GetX()[0],0.);
437 grBack->SetPoint(grBack->GetN()-1,grBack->GetX()[grBack->GetN()-1],0.);
438
bc75eeb5 439 fFuncSigBack->SetRange(fFitMin,fFitMax);
440 fFuncBackground->SetRange(fFitMin,fFitMax);
572b0139 441
442 if (!drawOpt.Contains("same")){
bc75eeb5 443 if (fHistDataPM){
444 fHistDataPM->Draw();
8df8e382 445 grSig->Draw("f");
446 } else {
447 grSig->Draw("af");
448 }
572b0139 449 } else {
450 grSig->Draw("f");
451 }
bc75eeb5 452 if(fMethod==kFitted) grBack->Draw("f");
453 fFuncSigBack->Draw("same");
454 fFuncSigBack->SetLineWidth(2);
455 if(fMethod==kLikeSign) {
456 fHistDataPP->SetLineWidth(2);
457 fHistDataPP->SetLineColor(6);
458 fHistDataPP->Draw("same");
459 fHistDataMM->SetLineWidth(2);
3505bfad 460 fHistDataMM->SetLineColor(8);
bc75eeb5 461 fHistDataMM->Draw("same");
462 }
3505bfad 463
464 if(fMethod==kFitted)
bc75eeb5 465 fFuncBackground->Draw("same");
3505bfad 466
8df8e382 467 if (optStat) DrawStats();
bc75eeb5 468
572b0139 469}