ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/Plotting/Modules/PeakFinder.C
Revision: 1.11
Committed: Mon Oct 24 15:05:37 2011 UTC (13 years, 6 months ago) by buchmann
Content type: text/plain
Branch: MAIN
CVS Tags: cbaf_4_98ifb_paper, beforeFR20120418, cbaf_4p7ifb, HEAD
Changes since 1.10: +13 -0 lines
Log Message:
Upgrade from HoneyPot to IceCreamBowl: merged in offpeak stuff, different warning color for frederic, saving to rootfile, only 3 attempts when computing limits and much, much more

File Contents

# Content
1 /****
2
3 Off peak status (RestrictToMassPeak) :
4
5 x Necessary adaptations identified
6 x Started working on necessary adaptations
7 x Necessary adaptations implemented
8 x Necessary adaptations tested
9
10 NO ADAPTATIONS REQUIRED
11
12
13 ****/
14 #include <iostream>
15 #include <sstream>
16 #include <iomanip>
17 #include <TFile.h>
18 #include <TTree.h>
19 #include <TH1.h>
20 #include <TF1.h>
21 #include <TMath.h>
22 #include <TCanvas.h>
23 #include <vector>
24 #include <TROOT.h>
25 #include <TLine.h>
26 #include <TLegend.h>
27 #include <TLatex.h>
28 #include <TRandom.h>
29 #ifndef GeneralToolBoxLoaded
30 #include "GeneralToolBox.C"
31 #endif
32 #ifndef Verbosity
33 #define Verbosity 0
34 #endif
35
36 using namespace std;
37
38 Double_t LogParabola(Double_t *x,Double_t *par)
39 {
40 return par[0]*TMath::Exp(-par[1]*(x[0]-par[2])*(x[0]-par[2])); // we're adding a "logarithmic parabola" :-)
41 //note: the abs() around the first parameter ensures that, when fitting, no negative values are chosen.
42 }
43
44 Double_t LogParabolaP(Double_t *x,Double_t *par)
45 {
46 float fitval = par[0]*TMath::Exp(-par[1]*(x[0]-par[2])*(x[0]-par[2])); // we're adding a "logarithmic parabola" :-)
47 fitval+= statErrorP(fitval);
48 return fitval;
49 }
50
51 Double_t LogParabolaN(Double_t *x,Double_t *par)
52 {
53 float fitval = par[0]*TMath::Exp(-par[1]*(x[0]-par[2])*(x[0]-par[2])); // we're adding a "logarithmic parabola" :-)
54 fitval-= statErrorN(fitval);
55 return fitval;
56 }
57
58
59
60 bool doreject=false;
61 float low_reject=-10;
62 float hi_reject=10;
63
64 bool dofixed=true;
65
66
67 bool addparabola=true;
68 float parabola_height=0;
69 float parabola_inclination=0;
70 float parabola_pointzero=0;
71
72 float find_KM_peak(TH1F *all, TH1F *ttbar, float minfit, float maxfit, bool is_data, float &error,float &Sigma);
73 float find_Gauss_peak(TH1F *all, TH1F *ttbar, float minfit, float maxfit, bool is_data, float &error,float &Sigma,int numsig);
74
75 Double_t CrystalBallPlusLogParabola(double *x, double *par)
76 {
77 //parameters:
78 //N: the way we scale the function
79 //alpha (where the function changes)
80 //n: exponent of the power expression in the left area
81 //xbar: peak of the gaussian part (RHS)
82 //sigma: width of the gaussian part (RHS)
83 float N=par[0];
84 float alpha=par[3]; //verified (orig: 1)
85 float n=par[4]; // verified (orig: 2)
86 float xbar=par[1]; //verified (orig: 3)
87 float sigma=par[2]; //verified (orig: 4)
88 float altX=-x[0];
89 float result=-999;
90 if(((altX-xbar)/sigma>-alpha)){
91 result=N*TMath::Exp(-(altX-xbar)*(altX-xbar)/(2*sigma*sigma));
92 }
93 else
94 {
95 //if we are outside the central (Gaussian) area things become more difficult ...
96 float A=TMath::Power(n/TMath::Abs(alpha),n)*TMath::Exp(-alpha*alpha/2);
97 float B=n/TMath::Abs(alpha) - TMath::Abs(alpha);
98 if((altX-xbar)/sigma<=-alpha) result=N*A*TMath::Power((B-((altX-xbar)/sigma)),-n);
99 if((altX-xbar)/sigma>=alpha) result=N*A*TMath::Power((B+((altX-xbar)/sigma)),-n);
100 }
101
102 result+=par[5]*TMath::Exp(-par[6]*(x[0]-par[7])*(x[0]-par[7])); // we're adding a "logarithmic parabola" :-)
103 if(par[5]<0) return -999; // there can be no negative ttbar contribution, so just return a value which is going to be a horrible fit.
104 if(par[6]<0) return -999; // the parabola needs to close (i.e. tend to negative values for large |jzb|, not to large positive values)
105
106 return result;
107 }
108
109 Double_t CrystalBallPlusLogParabolaP(double *x, double *par)
110 {
111 float parameter_bkp=par[5];
112 par[5]=0;
113 float zjetsresult=CrystalBallPlusLogParabola(x,par);
114 par[5]=parameter_bkp;
115 parameter_bkp=par[0];
116 par[0]=0;
117 float ttbarresult=CrystalBallPlusLogParabola(x,par);
118 par[0]=parameter_bkp;
119 return zjetsresult+ttbarresult+TMath::Sqrt(zjetsresult+(1.0/3.0)*ttbarresult);
120 }
121
122 Double_t CrystalBallPlusLogParabolaN(double *x, double *par)
123 {
124 float parameter_bkp=par[5];
125 par[5]=0;
126 float zjetsresult=CrystalBallPlusLogParabola(x,par);
127 par[5]=parameter_bkp;
128 parameter_bkp=par[0];
129 par[0]=0;
130 float ttbarresult=CrystalBallPlusLogParabola(x,par);
131 par[0]=parameter_bkp;
132 return zjetsresult+ttbarresult-TMath::Sqrt(zjetsresult+(1.0/3.0)*ttbarresult);
133 }
134
135 Double_t KrystalMallLogPar(double *x, double *par)
136 {
137 //parameters:
138 //N: the way we scale the function
139 //alpha (where the function changes)
140 //n: exponent of the power expression in the left area
141 //xbar: peak of the gaussian part (RHS)
142 //sigma: width of the gaussian part (RHS)
143 float N=par[0];
144 float alpha=par[1];
145 float n=par[2];
146 float xbar=par[3];
147 float sigma=par[4];
148 float altX=x[0];
149 float result=-999;
150 if(doreject&&x[0]>low_reject&&x[0]<hi_reject)
151 {
152 TF1::RejectPoint();
153 return 0;
154 }
155 if(((altX-xbar)/sigma>-alpha)&&((altX-xbar)/sigma<alpha)){
156 result=N*TMath::Exp(-(altX-xbar)*(altX-xbar)/(2*sigma*sigma));
157 }
158 else
159 {
160 //if we are outside the central (Gaussian) area things become more difficult ...
161 float A=TMath::Power(n/TMath::Abs(alpha),n)*TMath::Exp(-alpha*alpha/2);
162 float B=n/TMath::Abs(alpha) - TMath::Abs(alpha);
163 if((altX-xbar)/sigma<=-alpha) result=N*A*TMath::Power((B-((altX-xbar)/sigma)),-n);
164 if((altX-xbar)/sigma>=alpha) result=N*A*TMath::Power((B+((altX-xbar)/sigma)),-n);
165 }
166
167 if(addparabola) {
168 if(dofixed) {
169 result+=parabola_height*TMath::Exp(-parabola_inclination*(x[0]-parabola_pointzero)*(x[0]-parabola_pointzero)); // we're adding a "logarithmic parabola" :-)
170 }
171 else {
172 result+=par[5]*TMath::Exp(-par[6]*(x[0]-par[7])*(x[0]-par[7])); // we're adding a "logarithmic parabola" :-)
173 if(par[5]<0) return -999; // there can be no negative ttbar contribution, so just return a value which is going to be a horrible fit.
174 if(par[6]<0) return -999; // the parabola needs to close (i.e. tend to negative values for large |jzb|, not to large positive values)
175 }
176 }
177 return result;
178 }
179
180
181 void do_ttbar_fit(TH1F *ttbar,TF1 *logpar, TF1 *KM)
182 {
183 logpar->SetParameters(10,2,3);
184 ttbar->Fit(logpar,"NQ");
185 ttbar->Fit(logpar,"NQ");
186 ttbar->Fit(logpar,"NQ");
187 ttbar->Fit(logpar,"NQ");
188 ttbar->SetStats(0);
189 parabola_height=logpar->GetParameter(0);
190 parabola_inclination=logpar->GetParameter(1);
191 parabola_pointzero=logpar->GetParameter(2);
192 }
193
194 void draw_complete_fit(TH1F *all, TH1F *ttbar, float minfit, float maxfit, bool is_data, TF1 *KM)
195 {
196 TCanvas *fitsummary;
197 if(is_data) {
198 fitsummary= new TCanvas("fitsummary","Fit Summary",1000,500);
199 fitsummary->Divide(2,1);
200 }
201 else {
202 fitsummary= new TCanvas("fitsummary","Fit Summary",1200,400);
203 fitsummary->Divide(3,1);
204 }
205 TF1 *logpar = new TF1("logpar",LogParabola,minfit,maxfit,3);
206
207 logpar->SetParameters(KM->GetParameter(5),KM->GetParameter(6),KM->GetParameter(7));
208 logpar->SetLineColor(kOrange);
209 logpar->SetLineStyle(2);
210 if(!is_data)
211 {
212 ttbar->GetXaxis()->SetTitle("JZB (GeV/c)");
213 ttbar->GetYaxis()->SetTitle("events");
214 ttbar->GetXaxis()->CenterTitle();
215 ttbar->GetYaxis()->CenterTitle();
216 ttbar->SetLineColor(kRed);
217 fitsummary->cd(1);
218 ttbar->Draw();
219 fitsummary->cd(1);
220 logpar->Draw("same");
221 TLegend *leg = new TLegend(0.3,0.25,0.65,0.4);
222 leg->AddEntry(ttbar,"t#bar{t} (mc)","l");
223 leg->AddEntry(logpar,"Fit with Log. Parabola","l");
224 leg->SetLineColor(kWhite);
225 leg->SetFillColor(kWhite);
226 leg->Draw();
227 TText *title1=write_title("t#bar{t} Distribution and Fit");
228 title1->Draw();
229 }
230 fitsummary->cd(2-int(is_data));
231 fitsummary->cd(2-int(is_data))->SetLogy(1);
232 all->GetYaxis()->SetTitle("events");
233 all->GetYaxis()->CenterTitle();
234 all->Draw();
235 ttbar->SetLineColor(kRed);
236 if(!is_data) ttbar->Draw("same");
237 KM->SetLineWidth(1);
238 KM->Draw("same");
239 logpar->SetLineWidth(1);
240 logpar->Draw("same");
241 if(!is_data)ttbar->Draw("same");
242 TLegend *leg2 = new TLegend(0.65,0.65,0.89,0.89);
243 if(is_data) leg2->AddEntry(all,"Data","l");
244 else leg2->AddEntry(all,"Stacked MC","l");
245 leg2->AddEntry(KM,"Fitted KM Function","l");
246 if(!is_data) leg2->AddEntry(ttbar,"t#bar{t} MC","l");
247 leg2->AddEntry(logpar,"t#bar{t} (Fit)","l");
248 leg2->SetFillColor(kWhite);
249 leg2->SetLineColor(kWhite);
250 leg2->Draw();
251 TText *title2=write_title("Distribution and Fits (log.)");
252 title2->Draw();
253 fitsummary->cd(3-is_data);
254 all->Draw();
255 KM->Draw("same");
256 float peaklocation=KM->GetParameter(3);
257 TLine *muline = new TLine(peaklocation,0,peaklocation,all->GetMaximum());
258 muline->SetLineColor(kBlue);
259 muline->SetLineStyle(2);
260 muline->Draw();
261 TLegend *leg = new TLegend(0.75,0.75,0.89,0.89);
262 if(is_data) leg2->AddEntry(all,"Data","l");
263 else leg->AddEntry(all,"Stacked MC","l");
264 leg->AddEntry(KM,"Fitted KM Function","l");
265 stringstream mulinelabel;
266 mulinelabel<<"Peak position at #mu="<<peaklocation;
267 leg->AddEntry(muline,mulinelabel.str().c_str(),"l");
268 leg->SetLineColor(kWhite);
269 leg->SetFillColor(kWhite);
270 leg->Draw();
271 mulinelabel<<"+/-"<<TMath::Abs(KM->GetParError(3));
272 TText *title3=write_title("Distribution and Fits");
273 title3->Draw();
274 TText *titlel=write_title_low(mulinelabel.str().c_str());
275 titlel->Draw();
276
277 stringstream printtop;
278 printtop << "#mu="<<std::setprecision(3)<<KM->GetParameter(3)<<"+/-"<<std::setprecision(3)<<KM->GetParError(3);
279 TLatex *toptext = new TLatex(0,all->GetMaximum()*1.3,printtop.str().c_str());
280 toptext->SetTextAlign(22);
281 // toptext->Draw();
282
283 doreject=false;
284 TF1 *wholefitfunc=(TF1*)KM->Clone();
285 doreject=true;
286 wholefitfunc->SetLineColor(kRed);
287 wholefitfunc->SetLineStyle(2);
288 wholefitfunc->Draw("same");
289
290 fitsummary->cd(2-is_data);
291 wholefitfunc->Draw("same");
292
293 if(is_data) CompleteSave(fitsummary, "fit/Fit_Summary_Data");
294 else CompleteSave(fitsummary,"fit/Fit_Summary_MC");
295
296 }
297
298 float Kostas_algorithm(TH1F *hist, float &error, float &sigma, TF1* fitFunc, float lowlimit, float highlimit,bool is_data)
299 {
300 float mean = hist->GetBinCenter( hist->GetMaximumBin());
301 float rms = hist->GetRMS();
302 mean = hist->GetBinCenter( hist->GetMaximumBin());
303
304 fitFunc->SetParameter(1,mean);
305
306 hist->Fit(fitFunc,"QLL0","",mean-10,mean+10);
307
308 mean=fitFunc->GetParameter(1);
309 rms=fitFunc->GetParameter(2);
310 error=fitFunc->GetParError(1);
311
312 bool printOut = false; // print the peak estimate in the i-th iteration
313
314 // --- perform iterations
315 int numIterations=5;
316
317 if(printOut) dout << " ( ";
318 for(int i=1;i<numIterations+1;i++) //--- modify the number of iterations until peak is stable
319 {
320 hist->Fit(fitFunc,"QLLN","same",mean - lowlimit*rms, mean + highlimit*rms); // fit -2 +1 sigma from previous iteration
321 mean=fitFunc->GetParameter(1);
322 fitFunc->SetRange(mean - lowlimit*rms, mean + highlimit*rms);
323 if(printOut) dout << mean << ",";
324 }
325 if(printOut) dout << " ) ";
326 if(printOut) dout << endl;
327 mean=fitFunc->GetParameter(1);
328 sigma=fitFunc->GetParameter(2);
329 error=1.0*fitFunc->GetParError(1);
330
331 // below this point we're merely doing cosmetics :-)
332 TCanvas *peakfitcanvas = new TCanvas("peakfitcanvas","Fitting Canvas");
333 peakfitcanvas->cd();
334
335 hist->SetMinimum(0);
336 if(is_data) hist->Draw("e1");
337 else hist->Draw("histo");
338 fitFunc->SetLineColor(kBlue);
339 fitFunc->SetLineWidth(1);
340 fitFunc->Draw("same");
341 hist->SetStats(0);
342 TLegend *leg;
343 if(is_data) {
344 leg= make_legend("Fit (Data)");
345 leg->AddEntry(hist,"Data","p");
346 }
347 else {
348 leg= make_legend("Fit (MC)");
349 leg->AddEntry(hist,"MC","l");
350 }
351
352 leg->AddEntry(fitFunc,"Fit","l");
353 leg->SetX1(0.7);
354 leg->SetY1(0.7);
355 leg->Draw();
356
357 TText *ftitle=write_text(0.20,0.86,"Fit results:");
358 ftitle->SetTextSize(0.03);
359 ftitle->SetTextAlign(11);
360 stringstream fitresult;
361 fitresult << "#mu=" << std::setprecision(4) << mean << "+/-" << std::setprecision(4) << error;
362 // TText *title1=write_text(0.20,0.96,fitresult.str().c_str());
363 TText *title1=write_text(0.20,0.82,fitresult.str().c_str());
364 title1->SetTextSize(0.03);
365 title1->SetTextAlign(11);
366 stringstream sigmainfo;
367 sigmainfo << "#sigma=" << std::setprecision(4) << fitFunc->GetParameter(2) << "+/-" << std::setprecision(4) << fitFunc->GetParError(2);
368 // TText *sigmatext=write_text(0.80,0.96,sigmainfo.str().c_str());
369 TText *sigmatext=write_text(0.20,0.78,sigmainfo.str().c_str());
370 sigmatext->SetTextSize(0.03);
371 sigmatext->SetTextAlign(11);
372
373 // TText* toptitle;
374 // if(is_data) toptitle = write_title("Fit Result (data)");
375 // else toptitle = write_title("Fit Result (MC)");
376 // toptitle->Draw();
377 ftitle->Draw();
378 title1->Draw();
379 sigmatext->Draw();
380 if(!is_data) {
381 CompleteSave(peakfitcanvas,"fit/Fit_Summary_MC");
382 PlottingSetup::JZBPeakPositionMC=mean;
383 PlottingSetup::JZBPeakWidthMC=fitFunc->GetParameter(2);
384 } else {
385 CompleteSave(peakfitcanvas,"fit/Fit_Summary_Data");
386 PlottingSetup::JZBPeakPositionData=mean;
387 PlottingSetup::JZBPeakWidthData=fitFunc->GetParameter(2);
388 }
389 delete peakfitcanvas;
390
391 return mean;
392 }
393
394
395
396 float find_peak(TH1F *all, TH1F *ttbar, float minfit, float maxfit, bool is_data, float &error,float &Sigma, int method)
397 {
398 float peak_position=0;
399 if(method==0||method>1) {
400 //looking at a gaus request
401 int numsig=1;
402 if(method>1) numsig=method;
403 peak_position=find_Gauss_peak(all,ttbar,minfit,maxfit,is_data,error,Sigma,numsig);
404 }
405 if(method==1) {
406 //looking at a KM request
407 peak_position=find_KM_peak(all,ttbar,minfit,maxfit,is_data,error,Sigma);
408 }
409 if(method==-99) { // KOSTAS!!
410 TF1 *f1 = new TF1("f1","gaus",-40,40);
411 peak_position=Kostas_algorithm(all,error,Sigma,f1,2.5,2.5,is_data);
412 }
413 return peak_position;
414 }
415
416
417 float get_Gaussian_peak(TH1F *hist, float &error, float &sigma, TF1* fitFunc, float lowlimit, float highlimit,bool is_data,int numsig)
418 {
419 TCanvas *fitcanvas = new TCanvas("fitcanvas","fitcanvas");
420 float mean = hist->GetBinCenter( hist->GetMaximumBin());
421 float rms = hist->GetRMS();
422
423 mean = hist->GetBinCenter( hist->GetMaximumBin());
424
425 fitFunc->SetParameter(1,mean);
426
427 hist->Fit(fitFunc,"QLL0","",mean-10,mean+10);
428
429 mean=fitFunc->GetParameter(1);
430 rms=fitFunc->GetParameter(2);
431 error=fitFunc->GetParError(1);
432
433 bool printOut = false; // print the peak estimate in the i-th iteration
434
435 // --- perform iterations
436 int numIterations=5;
437
438 if(printOut) dout << " ( ";
439 for(int i=1;i<numIterations+1;i++) //--- modify the number of iterations until peak is stable
440 {
441 hist->Fit(fitFunc,"QLLN","same",mean - numsig*rms, mean + numsig*rms); // fit -2 +1 sigma from previous iteration
442 mean=fitFunc->GetParameter(1);
443 fitFunc->SetRange(mean - numsig*rms, mean + numsig*rms);
444 if(printOut) dout << mean << ",";
445 }
446 if(printOut) dout << " ) ";
447 if(printOut) dout << endl;
448 mean=fitFunc->GetParameter(1);
449 sigma=fitFunc->GetParameter(2);
450 error=1.0*fitFunc->GetParError(1);
451 fitcanvas->cd();
452 hist->SetMinimum(0);
453 if(is_data) hist->Draw("e1");
454 else hist->Draw("histo");
455 fitFunc->SetLineColor(kBlue);
456 fitFunc->SetLineWidth(1);
457 fitFunc->Draw("same");
458 hist->SetStats(0);
459 TLegend *leg;
460 if(is_data) {
461 leg= make_legend("Fit (Data)");
462 leg->AddEntry(hist,"Data","p");
463 }
464 else {
465 leg= make_legend("Fit (MC)");
466 leg->AddEntry(hist,"MC","l");
467 }
468
469 leg->AddEntry(fitFunc,"Fit","l");
470 leg->Draw();
471
472 TText *ftitle=write_text(0.20,0.86,"Fit results:");
473 ftitle->SetTextSize(0.03);
474 ftitle->SetTextAlign(11);
475 stringstream fitresult;
476 fitresult << "#mu=" << std::setprecision(4) << mean << "+/-" << std::setprecision(4) << error;
477 // TText *title1=write_text(0.20,0.96,fitresult.str().c_str());
478 TText *title1=write_text(0.20,0.82,fitresult.str().c_str());
479 title1->SetTextSize(0.03);
480 title1->SetTextAlign(11);
481 stringstream sigmainfo;
482 sigmainfo << "#sigma=" << std::setprecision(4) << fitFunc->GetParameter(2) << "+/-" << std::setprecision(4) << fitFunc->GetParError(2);
483 // TText *sigmatext=write_text(0.80,0.96,sigmainfo.str().c_str());
484 TText *sigmatext=write_text(0.20,0.78,sigmainfo.str().c_str());
485 sigmatext->SetTextSize(0.03);
486 sigmatext->SetTextAlign(11);
487
488 // TText* toptitle;
489 // if(is_data) toptitle = write_title("Fit Result (data)");
490 // else toptitle = write_title("Fit Result (MC)");
491 // toptitle->Draw();
492 ftitle->Draw();
493 title1->Draw();
494 sigmatext->Draw();
495 if(!is_data) CompleteSave(fitcanvas,"fit/Fit_Summary_MC");
496 if(is_data) CompleteSave(fitcanvas,"fit/Fit_Summary_Data");
497
498
499 // dout << "[" << fitFunc->GetParameter(1) << " , " << fitFunc->GetParError(1) << "]" << endl;
500 return mean;
501 }
502
503
504 float find_Gauss_peak(TH1F *all, TH1F *ttbar, float minfit, float maxfit, bool is_data, float &error,float &Sigma,int numsig)
505 {
506 TF1 *fitfunc = new TF1("fitfunc","gaus",minfit,maxfit);
507 float peakpos = get_Gaussian_peak(all,error,Sigma,fitfunc, minfit, maxfit,is_data,numsig);
508 return peakpos;
509 }
510
511 float find_KM_peak(TH1F *all, TH1F *ttbar, float minfit, float maxfit, bool is_data, float &error,float &Sigma)
512 {
513 all->SetLineColor(kBlue);
514 all->SetStats(0);
515 all->SetTitle("");
516 all->GetXaxis()->SetTitle("JZB (GeV/c)");
517 all->GetYaxis()->SetTitle("events");
518 all->GetXaxis()->CenterTitle();
519 all->GetYaxis()->CenterTitle();
520 TF1 *fitfunc = new TF1("fitfunc",KrystalMallLogPar,0.8*minfit,0.8*maxfit,8);
521 if(!is_data)
522 {
523 TF1 *logpar = new TF1("logpar",LogParabola,minfit,maxfit,3);
524 do_ttbar_fit(ttbar,logpar,fitfunc);
525 fitfunc->SetParameters(1000,2,2.5,-1.6,4,logpar->GetParameter(0),logpar->GetParameter(1),logpar->GetParameter(2));
526 parabola_height=logpar->GetParameter(0);
527 parabola_inclination=logpar->GetParameter(1);
528 parabola_pointzero=logpar->GetParameter(2);
529 dofixed=true;//ttbar is known so we can fix the parameters and don't need to use them for fitting!
530 }
531 else
532 {
533 fitfunc->SetParameters(1000,2,2.5,-1.6,4,5.45039,0.000324593,12.3528);
534 dofixed=false;
535 }
536
537 vector<float> chi2values;
538 addparabola=true;
539 for (int ifit=0;ifit<100;ifit++)
540 {
541 all->Fit(fitfunc,"NQ");
542 chi2values.push_back(fitfunc->GetChisquare());
543 if(ifit>5&&chi2values[ifit-2]==chi2values[ifit]) break;
544 }
545 /*
546 The parameters represent the following quantities:
547 float N=par[0];
548 float alpha=par[1];
549 float n=par[2];
550 float xbar=par[3];
551 float sigma=par[4];
552 */
553 //we are clearing an area of two sigma to the left and to the right of the center of the function for the "real fit".
554 low_reject=-2*fitfunc->GetParameter(4)+fitfunc->GetParameter(3);
555 hi_reject=fitfunc->GetParameter(3)+2*fitfunc->GetParameter(4);
556 if(low_reject>-15) low_reject=-10;
557 if(hi_reject<15) hi_reject=10;
558 doreject=true;//activating the rejection :-)
559
560 for (int ifit=0;ifit<100;ifit++)
561 {
562 all->Fit(fitfunc,"NQ");
563 chi2values.push_back(fitfunc->GetChisquare());
564 if(ifit>5&&chi2values[ifit-2]==chi2values[ifit]) break;
565 }
566
567 draw_complete_fit(all,ttbar,minfit,maxfit,is_data,fitfunc);
568 doreject=true;
569 error=fitfunc->GetParError(3);
570 Sigma=fitfunc->GetParameter(4);//sigma
571
572 return fitfunc->GetParameter(3);
573 }
574
575 Double_t InvCrystalBall(Double_t *x,Double_t *par)
576 {
577 Double_t arg1=0,arg2=0,A=0,B=0;
578 Double_t f1=0;
579 Double_t f2=0;
580 Double_t lim=0;
581 Double_t fitval=0;
582 Double_t N=0;
583 Double_t n=par[4];
584
585 Double_t invX = -x[0];
586
587 if (par[2] != 0)
588 arg1 = (invX-par[1])/par[2];
589
590 arg2 = ( -pow( TMath::Abs(par[3]) , 2 ) ) / 2 ;
591
592 if (par[3] != 0)
593 A = pow( ( n / TMath::Abs( par[3] ) ) , n) * TMath::Exp(arg2);
594
595 if (par[3] != 0)
596 B = n / TMath::Abs(par[3]) - TMath::Abs(par[3]);
597
598 f1 = TMath::Exp(-0.5*arg1*arg1);
599 if (par[2] != 0)
600 f2 = A * pow( ( B - (invX - par[1])/par[2] ) , -n );
601
602 if (par[2] != 0)
603 lim = ( par[1] - invX ) / par[2] ;
604
605 N = par[0];
606
607
608
609 if(lim < par[3])
610 fitval = N * f1;
611 if(lim >= par[3])
612 fitval = N * f2;
613
614 return fitval;
615 }
616
617
618 Double_t DoubleInvCrystalBall(Double_t *x,Double_t *par)
619 {
620 Double_t arg1=0,arg2=0,A=0,B=0;
621 Double_t f1=0;
622 Double_t f2=0;
623 Double_t lim=0;
624 Double_t fitval=0;
625 Double_t N=0;
626 Double_t n=par[4];
627
628 Double_t Sarg1=0,Sarg2=0,SA=0,SB=0;
629 Double_t Sf1=0;
630 Double_t Sf2=0;
631 Double_t Slim=0;
632 Double_t Sfitval=0;
633 Double_t SN=0;
634 Double_t Sn=par[9];
635
636 Double_t invX = -x[0];
637
638 if (par[2] != 0) arg1 = (invX-par[1])/par[2];
639
640 if (par[7] != 0) Sarg1 = (invX-par[6])/par[7];
641
642 arg2 = ( -pow( TMath::Abs(par[3]) , 2 ) ) / 2 ;
643 Sarg2 = ( -pow( TMath::Abs(par[8]) , 2 ) ) / 2 ;
644
645 if (par[3] != 0) A = pow( ( n / TMath::Abs( par[3] ) ) , n) * TMath::Exp(arg2);
646 if (par[8] != 0) SA = pow( ( Sn / TMath::Abs( par[8] ) ) , Sn) * TMath::Exp(Sarg2);
647
648 if (par[3] != 0) B = n / TMath::Abs(par[3]) - TMath::Abs(par[3]);
649 if (par[8] != 0) SB = Sn / TMath::Abs(par[8]) - TMath::Abs(par[8]);
650
651 f1 = TMath::Exp(-0.5*arg1*arg1);
652 Sf1 = TMath::Exp(-0.5*Sarg1*Sarg1);
653
654 if (par[2] != 0) f2 = A * pow( ( B - (invX - par[1])/par[2] ) , -n );
655 if (par[7] != 0) Sf2 = SA * pow( ( SB - (invX - par[6])/par[7] ) , -Sn );
656
657 if (par[2] != 0) lim = ( par[1] - invX ) / par[2] ;
658 if (par[7] != 0) Slim = ( par[6] - invX ) / par[7] ;
659
660 N = par[0];
661 SN = par[5];
662
663
664
665 if(lim < par[3]) fitval = N * f1;
666 if(lim >= par[3]) fitval = N * f2;
667
668 if(Slim < par[8]) Sfitval = SN * Sf1;
669 if(Slim >= par[8]) Sfitval = SN * Sf2;
670
671 return fitval+Sfitval;
672 }
673
674 Double_t DoubleInvCrystalBallP(Double_t *x,Double_t *par)
675 {
676 Double_t arg1=0,arg2=0,A=0,B=0;
677 Double_t f1=0;
678 Double_t f2=0;
679 Double_t lim=0;
680 Double_t fitval=0;
681 Double_t N=0;
682 Double_t n=par[4];
683
684 Double_t Sarg1=0,Sarg2=0,SA=0,SB=0;
685 Double_t Sf1=0;
686 Double_t Sf2=0;
687 Double_t Slim=0;
688 Double_t Sfitval=0;
689 Double_t SN=0;
690 Double_t Sn=par[9];
691
692 Double_t invX = -x[0];
693
694 if (par[2] != 0) arg1 = (invX-par[1])/par[2];
695
696 if (par[7] != 0) Sarg1 = (invX-par[6])/par[7];
697
698 arg2 = ( -pow( TMath::Abs(par[3]) , 2 ) ) / 2 ;
699 Sarg2 = ( -pow( TMath::Abs(par[8]) , 2 ) ) / 2 ;
700
701 if (par[3] != 0) A = pow( ( n / TMath::Abs( par[3] ) ) , n) * TMath::Exp(arg2);
702 if (par[8] != 0) SA = pow( ( Sn / TMath::Abs( par[8] ) ) , Sn) * TMath::Exp(Sarg2);
703
704 if (par[3] != 0) B = n / TMath::Abs(par[3]) - TMath::Abs(par[3]);
705 if (par[8] != 0) SB = Sn / TMath::Abs(par[8]) - TMath::Abs(par[8]);
706
707 f1 = TMath::Exp(-0.5*arg1*arg1);
708 Sf1 = TMath::Exp(-0.5*Sarg1*Sarg1);
709
710 if (par[2] != 0) f2 = A * pow( ( B - (invX - par[1])/par[2] ) , -n );
711 if (par[7] != 0) Sf2 = SA * pow( ( SB - (invX - par[6])/par[7] ) , -Sn );
712
713 if (par[2] != 0) lim = ( par[1] - invX ) / par[2] ;
714 if (par[7] != 0) Slim = ( par[6] - invX ) / par[7] ;
715
716 N = par[0];
717 SN = par[5];
718
719
720
721 if(lim < par[3]) fitval = N * f1;
722 if(lim >= par[3]) fitval = N * f2;
723
724 if(Slim < par[8]) Sfitval = SN * Sf1;
725 if(Slim >= par[8]) Sfitval = SN * Sf2;
726
727 fitval+=Sfitval;
728 fitval+=statErrorP(fitval);
729
730 return fitval;
731 }
732
733 Double_t DoubleInvCrystalBallN(Double_t *x,Double_t *par)
734 {
735 Double_t arg1=0,arg2=0,A=0,B=0;
736 Double_t f1=0;
737 Double_t f2=0;
738 Double_t lim=0;
739 Double_t fitval=0;
740 Double_t N=0;
741 Double_t n=par[4];
742
743 Double_t Sarg1=0,Sarg2=0,SA=0,SB=0;
744 Double_t Sf1=0;
745 Double_t Sf2=0;
746 Double_t Slim=0;
747 Double_t Sfitval=0;
748 Double_t SN=0;
749 Double_t Sn=par[9];
750
751 Double_t invX = -x[0];
752
753 if (par[2] != 0) arg1 = (invX-par[1])/par[2];
754
755 if (par[7] != 0) Sarg1 = (invX-par[6])/par[7];
756
757 arg2 = ( -pow( TMath::Abs(par[3]) , 2 ) ) / 2 ;
758 Sarg2 = ( -pow( TMath::Abs(par[8]) , 2 ) ) / 2 ;
759
760 if (par[3] != 0) A = pow( ( n / TMath::Abs( par[3] ) ) , n) * TMath::Exp(arg2);
761 if (par[8] != 0) SA = pow( ( Sn / TMath::Abs( par[8] ) ) , Sn) * TMath::Exp(Sarg2);
762
763 if (par[3] != 0) B = n / TMath::Abs(par[3]) - TMath::Abs(par[3]);
764 if (par[8] != 0) SB = Sn / TMath::Abs(par[8]) - TMath::Abs(par[8]);
765
766 f1 = TMath::Exp(-0.5*arg1*arg1);
767 Sf1 = TMath::Exp(-0.5*Sarg1*Sarg1);
768
769 if (par[2] != 0) f2 = A * pow( ( B - (invX - par[1])/par[2] ) , -n );
770 if (par[7] != 0) Sf2 = SA * pow( ( SB - (invX - par[6])/par[7] ) , -Sn );
771
772 if (par[2] != 0) lim = ( par[1] - invX ) / par[2] ;
773 if (par[7] != 0) Slim = ( par[6] - invX ) / par[7] ;
774
775 N = par[0];
776 SN = par[5];
777
778
779
780 if(lim < par[3]) fitval = N * f1;
781 if(lim >= par[3]) fitval = N * f2;
782
783 if(Slim < par[8]) Sfitval = SN * Sf1;
784 if(Slim >= par[8]) Sfitval = SN * Sf2;
785
786 fitval+=Sfitval;
787 fitval-=statErrorN(fitval);
788
789 return fitval;
790 }
791
792 Double_t InvCrystalBallP(Double_t *x,Double_t *par)
793 {
794 Double_t arg1=0,arg2=0,A=0,B=0;
795 Double_t f1=0;
796 Double_t f2=0;
797 Double_t lim=0;
798 Double_t fitval=0;
799 Double_t N=0;
800 Double_t n=par[4];
801
802 Double_t invX = -x[0];
803
804 if (par[2] != 0)
805 arg1 = (invX-par[1])/par[2];
806
807 arg2 = ( -pow( TMath::Abs(par[3]) , 2 ) ) / 2 ;
808
809 if (par[3] != 0)
810 A = pow( ( n / TMath::Abs( par[3] ) ) , n) * TMath::Exp(arg2);
811
812 if (par[3] != 0)
813 B = n / TMath::Abs(par[3]) - TMath::Abs(par[3]);
814
815 f1 = TMath::Exp(-0.5*arg1*arg1);
816 if (par[2] != 0)
817 f2 = A * pow( ( B - (invX - par[1])/par[2] ) , -n );
818
819 if (par[2] != 0)
820 lim = ( par[1] - invX ) / par[2] ;
821
822 N = par[0];
823
824
825
826 if(lim < par[3])
827 fitval = N * f1;
828 if(lim >= par[3])
829 fitval = N * f2;
830
831 fitval+= statErrorP(fitval);
832 return fitval;
833 }
834
835 Double_t InvCrystalBallN(Double_t *x,Double_t *par)
836 {
837 Double_t arg1=0,arg2=0,A=0,B=0;
838 Double_t f1=0;
839 Double_t f2=0;
840 Double_t lim=0;
841 Double_t fitval=0;
842 Double_t N=0;
843 Double_t n=par[4];
844
845 Double_t invX = -x[0];
846
847 if (par[2] != 0)
848 arg1 = (invX-par[1])/par[2];
849
850 arg2 = ( -pow( TMath::Abs(par[3]) , 2 ) ) / 2 ;
851
852 if (par[3] != 0)
853 A = pow( ( n / TMath::Abs( par[3] ) ) , n) * TMath::Exp(arg2);
854
855 if (par[3] != 0)
856 B = n / TMath::Abs(par[3]) - TMath::Abs(par[3]);
857
858 f1 = TMath::Exp(-0.5*arg1*arg1);
859 if (par[2] != 0)
860 f2 = A * pow( ( B - (invX - par[1])/par[2] ) , -n );
861
862 if (par[2] != 0)
863 lim = ( par[1] - invX ) / par[2] ;
864
865 N = par[0];
866
867
868
869 if(lim < par[3])
870 fitval = N * f1;
871 if(lim >= par[3])
872 fitval = N * f2;
873
874 fitval-= statErrorN(fitval);
875 return fitval;
876 }
877
878