]>
Commit | Line | Data |
---|---|---|
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 | /* | |
21 | Dielectron signal extraction class using functions as input. | |
22 | ||
23 | A function to describe the signal as well as one to describe the background | |
24 | has to be deployed by the user. Alternatively on of the default implementaions | |
25 | can 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 | ||
45 | ClassImp(AliDielectronSignalFunc) | |
46 | ||
47 | AliDielectronSignalFunc::AliDielectronSignalFunc() : | |
3505bfad | 48 | AliDielectronSignalBase(), |
49 | fFuncSignal(0x0), | |
50 | fFuncBackground(0x0), | |
51 | fFuncSigBack(0x0), | |
52 | fParMass(1), | |
53 | fParMassWidth(2), | |
54 | fFitOpt("SMNQE"), | |
55 | fUseIntegral(kFALSE) | |
572b0139 | 56 | { |
57 | // | |
58 | // Default Constructor | |
59 | // | |
60 | ||
61 | } | |
62 | ||
63 | //______________________________________________ | |
64 | AliDielectronSignalFunc::AliDielectronSignalFunc(const char* name, const char* title) : | |
3505bfad | 65 | AliDielectronSignalBase(name, title), |
66 | fFuncSignal(0x0), | |
67 | fFuncBackground(0x0), | |
68 | fFuncSigBack(0x0), | |
69 | fParMass(1), | |
70 | fParMassWidth(2), | |
71 | fFitOpt("SMNQE"), | |
72 | fUseIntegral(kFALSE) | |
572b0139 | 73 | { |
74 | // | |
75 | // Named Constructor | |
76 | // | |
77 | } | |
78 | ||
79 | //______________________________________________ | |
80 | AliDielectronSignalFunc::~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 | 92 | void 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 | //______________________________________________ |
117 | void 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 | 225 | void 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 | |
252 | TFitResult *ppFitResult = 0x0; | |
253 | TFitResult *mmFitResult = 0x0; | |
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); | |
258 | TFitResultPtr ppFitPtr = fHistDataPP->Fit(funcClonePP, fFitOpt.Data(), "", fFitMin, fFitMax); | |
259 | ppFitResult = ppFitPtr.Get(); | |
260 | fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax); | |
261 | TFitResultPtr mmFitPtr = fHistDataMM->Fit(funcCloneMM, fFitOpt.Data(), "", fFitMin, fFitMax); | |
262 | mmFitResult = mmFitPtr.Get(); | |
3505bfad | 263 | |
bc75eeb5 | 264 | for(Int_t iBin=1; iBin<=fHistDataPM->GetXaxis()->GetNbins(); iBin++) { |
265 | Double_t m = fHistDataPM->GetBinCenter(iBin); | |
266 | Double_t pm = fHistDataPM->GetBinContent(iBin); | |
267 | Double_t pp = funcClonePP->Eval(m); | |
268 | Double_t mm = funcCloneMM->Eval(m); | |
269 | Double_t epm = fHistDataPM->GetBinError(iBin); | |
270 | Double_t epp = 0; | |
271 | for(Int_t iPar=0; iPar<funcClonePP->GetNpar(); iPar++) { | |
cafdf10b | 272 | /* TF1Helper problem on alien compilation |
bc75eeb5 | 273 | for(Int_t jPar=iPar; jPar<funcClonePP->GetNpar(); jPar++) { |
274 | TF1 gradientIpar("gradientIpar", | |
3505bfad | 275 | ROOT::TF1Helper::TGradientParFunction(iPar,funcClonePP),0,0,0); |
bc75eeb5 | 276 | TF1 gradientJpar("gradientJpar", |
3505bfad | 277 | ROOT::TF1Helper::TGradientParFunction(jPar,funcClonePP),0,0,0); |
278 | epp += ppFitResult->CovMatrix(iPar,jPar)* | |
279 | gradientIpar.Eval(m)*gradientJpar.Eval(m)* | |
280 | (iPar==jPar ? 1.0 : 2.0); | |
bc75eeb5 | 281 | } |
cafdf10b | 282 | */ |
bc75eeb5 | 283 | } |
284 | Double_t emm = 0; | |
285 | for(Int_t iPar=0; iPar<funcCloneMM->GetNpar(); iPar++) { | |
cafdf10b | 286 | /* TF1Helper problem on alien compilation |
bc75eeb5 | 287 | for(Int_t jPar=iPar; jPar<funcCloneMM->GetNpar(); jPar++) { |
288 | TF1 gradientIpar("gradientIpar", | |
3505bfad | 289 | ROOT::TF1Helper::TGradientParFunction(iPar,funcCloneMM),0,0,0); |
bc75eeb5 | 290 | TF1 gradientJpar("gradientJpar", |
3505bfad | 291 | ROOT::TF1Helper::TGradientParFunction(jPar,funcCloneMM),0,0,0); |
292 | emm += mmFitResult->CovMatrix(iPar,jPar)* | |
293 | gradientIpar.Eval(m)*gradientJpar.Eval(m)* | |
294 | (iPar==jPar ? 1.0 : 2.0); | |
bc75eeb5 | 295 | } |
cafdf10b | 296 | */ |
bc75eeb5 | 297 | } |
3505bfad | 298 | |
bc75eeb5 | 299 | Double_t signal = pm-2.0*TMath::Sqrt(pp*mm); |
300 | Double_t background = 2.0*TMath::Sqrt(pp*mm); | |
301 | // error propagation on the signal calculation above | |
302 | Double_t esignal = TMath::Sqrt(epm*epm+(mm/pp)*epp+(pp/mm)*emm); | |
303 | Double_t ebackground = TMath::Sqrt((mm/pp)*epp+(pp/mm)*emm); | |
304 | fHistSignal->SetBinContent(iBin, signal); | |
305 | fHistSignal->SetBinError(iBin, esignal); | |
306 | fHistBackground->SetBinContent(iBin, background); | |
307 | fHistBackground->SetBinError(iBin, ebackground); | |
308 | } | |
2a14a7b1 | 309 | |
bc75eeb5 | 310 | // signal |
311 | fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin), | |
3505bfad | 312 | fHistSignal->FindBin(fIntMax), fErrors(0)); |
bc75eeb5 | 313 | // background |
314 | fValues(1) = fHistBackground->IntegralAndError(fHistBackground->FindBin(fIntMin), | |
3505bfad | 315 | fHistBackground->FindBin(fIntMax), |
316 | fErrors(1)); | |
bc75eeb5 | 317 | // S/B and significance |
318 | SetSignificanceAndSOB(); | |
319 | fValues(4) = fFuncSigBack->GetParameter(fParMass); | |
320 | fErrors(4) = fFuncSigBack->GetParError(fParMass); | |
321 | fValues(5) = fFuncSigBack->GetParameter(fParMassWidth); | |
322 | fErrors(5) = fFuncSigBack->GetParError(fParMassWidth); | |
3505bfad | 323 | |
bc75eeb5 | 324 | fProcessed = kTRUE; |
572b0139 | 325 | } |
bc75eeb5 | 326 | |
327 | //______________________________________________ | |
3505bfad | 328 | void AliDielectronSignalFunc::ProcessEM(TObjArray * const arrhist) { |
bc75eeb5 | 329 | // |
330 | // Substract background with the event mixing technique | |
331 | // | |
3505bfad | 332 | arrhist->GetEntries(); // just to avoid the unused parameter warning |
333 | AliError("Event mixing for background substraction method not implemented!"); | |
334 | } | |
bc75eeb5 | 335 | |
572b0139 | 336 | //______________________________________________ |
bc75eeb5 | 337 | void AliDielectronSignalFunc::SetFunctions(TF1 * const combined, TF1 * const sig, TF1 * const back, |
572b0139 | 338 | Int_t parM, Int_t parMres) |
339 | { | |
340 | // | |
341 | // Set the signal, background functions and combined fit function | |
342 | // Note: The process method assumes that the first n parameters in the | |
343 | // combined fit function correspond to the n parameters of the signal function | |
344 | // and the n+1 to n+m parameters to the m parameters of the background function!!! | |
bc75eeb5 | 345 | |
572b0139 | 346 | if (!sig||!back||!combined) { |
347 | AliError("Both, signal and background function need to be set!"); | |
61d106d3 | 348 | return; |
572b0139 | 349 | } |
bc75eeb5 | 350 | fFuncSignal=sig; |
351 | fFuncBackground=back; | |
352 | fFuncSigBack=combined; | |
353 | fParMass=parM; | |
354 | fParMassWidth=parMres; | |
572b0139 | 355 | } |
356 | ||
357 | //______________________________________________ | |
358 | void AliDielectronSignalFunc::SetDefaults(Int_t type) | |
359 | { | |
360 | // | |
361 | // Setup some default functions: | |
362 | // type = 0: gaus signal + linear background in 2.5 - 4 GeV inv. mass | |
363 | // type = 1: gaus signal + exponential background in 2.5 - 4 GeV inv. mass | |
364 | // type = 2: half gaussian, half exponential signal function | |
365 | // type = 3: Crystal-Ball function | |
366 | // type = 4: Crystal-Ball signal + exponential background | |
367 | // | |
572b0139 | 368 | |
369 | if (type==0){ | |
bc75eeb5 | 370 | fFuncSignal=new TF1("DieleSignal","gaus",2.5,4); |
371 | fFuncBackground=new TF1("DieleBackground","pol1",2.5,4); | |
372 | fFuncSigBack=new TF1("DieleCombined","gaus+pol1(3)",2.5,4); | |
572b0139 | 373 | |
bc75eeb5 | 374 | fFuncSigBack->SetParameters(1,3.1,.05,2.5,1); |
375 | fFuncSigBack->SetParLimits(0,0,10000000); | |
376 | fFuncSigBack->SetParLimits(1,3.05,3.15); | |
377 | fFuncSigBack->SetParLimits(2,.02,.1); | |
3505bfad | 378 | } |
bc75eeb5 | 379 | else if (type==1){ |
380 | fFuncSignal=new TF1("DieleSignal","gaus",2.5,4); | |
381 | fFuncBackground=new TF1("DieleBackground","[0]*exp(-(x-[1])/[2])",2.5,4); | |
382 | fFuncSigBack=new TF1("DieleCombined","gaus+[3]*exp(-(x-[4])/[5])",2.5,4); | |
572b0139 | 383 | |
bc75eeb5 | 384 | fFuncSigBack->SetParameters(1,3.1,.05,1,2.5,1); |
385 | fFuncSigBack->SetParLimits(0,0,10000000); | |
386 | fFuncSigBack->SetParLimits(1,3.05,3.15); | |
387 | fFuncSigBack->SetParLimits(2,.02,.1); | |
3505bfad | 388 | } |
bc75eeb5 | 389 | else if (type==2){ |
572b0139 | 390 | // half gaussian, half exponential signal function |
391 | // exponential background | |
bc75eeb5 | 392 | 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); |
393 | fFuncBackground = new TF1("DieleBackground","[0]*exp(-(x-[1])/[2])+[3]",2.5,4); | |
394 | 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); | |
395 | fFuncSigBack->SetParameters(1.,3.1,.05,.1,1,2.5,1,0); | |
572b0139 | 396 | |
bc75eeb5 | 397 | fFuncSigBack->SetParLimits(0,0,10000000); |
398 | fFuncSigBack->SetParLimits(1,3.05,3.15); | |
399 | fFuncSigBack->SetParLimits(2,.02,.1); | |
400 | fFuncSigBack->FixParameter(6,2.5); | |
401 | fFuncSigBack->FixParameter(7,0); | |
572b0139 | 402 | } |
403 | } | |
404 | ||
405 | ||
406 | //______________________________________________ | |
407 | void AliDielectronSignalFunc::Draw(const Option_t* option) | |
408 | { | |
409 | // | |
410 | // Draw the fitted function | |
411 | // | |
bc75eeb5 | 412 | |
572b0139 | 413 | TString drawOpt(option); |
414 | drawOpt.ToLower(); | |
3505bfad | 415 | |
572b0139 | 416 | Bool_t optStat=drawOpt.Contains("stat"); |
417 | ||
bc75eeb5 | 418 | fFuncSigBack->SetNpx(200); |
419 | fFuncSigBack->SetRange(fIntMin,fIntMax); | |
420 | fFuncBackground->SetNpx(200); | |
421 | fFuncBackground->SetRange(fIntMin,fIntMax); | |
572b0139 | 422 | |
bc75eeb5 | 423 | TGraph *grSig=new TGraph(fFuncSigBack); |
572b0139 | 424 | grSig->SetFillColor(kGreen); |
425 | grSig->SetFillStyle(3001); | |
3505bfad | 426 | |
bc75eeb5 | 427 | TGraph *grBack=new TGraph(fFuncBackground); |
572b0139 | 428 | grBack->SetFillColor(kRed); |
429 | grBack->SetFillStyle(3001); | |
3505bfad | 430 | |
572b0139 | 431 | grSig->SetPoint(0,grBack->GetX()[0],grBack->GetY()[0]); |
432 | grSig->SetPoint(grSig->GetN()-1,grBack->GetX()[grBack->GetN()-1],grBack->GetY()[grBack->GetN()-1]); | |
433 | ||
434 | grBack->SetPoint(0,grBack->GetX()[0],0.); | |
435 | grBack->SetPoint(grBack->GetN()-1,grBack->GetX()[grBack->GetN()-1],0.); | |
436 | ||
bc75eeb5 | 437 | fFuncSigBack->SetRange(fFitMin,fFitMax); |
438 | fFuncBackground->SetRange(fFitMin,fFitMax); | |
572b0139 | 439 | |
440 | if (!drawOpt.Contains("same")){ | |
bc75eeb5 | 441 | if (fHistDataPM){ |
442 | fHistDataPM->Draw(); | |
8df8e382 | 443 | grSig->Draw("f"); |
444 | } else { | |
445 | grSig->Draw("af"); | |
446 | } | |
572b0139 | 447 | } else { |
448 | grSig->Draw("f"); | |
449 | } | |
bc75eeb5 | 450 | if(fMethod==kFitted) grBack->Draw("f"); |
451 | fFuncSigBack->Draw("same"); | |
452 | fFuncSigBack->SetLineWidth(2); | |
453 | if(fMethod==kLikeSign) { | |
454 | fHistDataPP->SetLineWidth(2); | |
455 | fHistDataPP->SetLineColor(6); | |
456 | fHistDataPP->Draw("same"); | |
457 | fHistDataMM->SetLineWidth(2); | |
3505bfad | 458 | fHistDataMM->SetLineColor(8); |
bc75eeb5 | 459 | fHistDataMM->Draw("same"); |
460 | } | |
3505bfad | 461 | |
462 | if(fMethod==kFitted) | |
bc75eeb5 | 463 | fFuncBackground->Draw("same"); |
3505bfad | 464 | |
8df8e382 | 465 | if (optStat) DrawStats(); |
bc75eeb5 | 466 | |
572b0139 | 467 | } |