ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/PeakFinder.C
Revision: 1.4
Committed: Fri Jul 20 16:35:53 2012 UTC (12 years, 9 months ago) by fronga
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +16 -12 lines
Error occurred while calculating annotation data.
Log Message:
Implemented uncertainty on sigma (for aesthetics).

File Contents

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