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
Log Message:
Implemented uncertainty on sigma (for aesthetics).

File Contents

# User Rev Content
1 buchmann 1.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 fronga 1.4 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 buchmann 1.1
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 fronga 1.4 float Kostas_algorithm(TH1F *hist, float &error, float &sigma, float& serror, TF1* fitFunc, float lowlimit, float highlimit,bool is_data, string saveas)
286 buchmann 1.1 {
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 buchmann 1.2
304     float rmsMultiplier=1.0;
305     if(PlottingSetup::DoBTag) rmsMultiplier=2.0;
306 buchmann 1.1
307     if(printOut) dout << " ( ";
308     for(int i=1;i<numIterations+1;i++) //--- modify the number of iterations until peak is stable
309     {
310 buchmann 1.2 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 buchmann 1.1 }
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 fronga 1.4 serror=fitFunc->GetParError(2);
321 buchmann 1.1
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 buchmann 1.3 CompleteSave(peakfitcanvas,"fit/Fit_Summary_MC"+saveas);
373 buchmann 1.1 PlottingSetup::JZBPeakPositionMC=mean;
374     PlottingSetup::JZBPeakWidthMC=fitFunc->GetParameter(2);
375     } else {
376 buchmann 1.3 CompleteSave(peakfitcanvas,"fit/Fit_Summary_Data"+saveas);
377 buchmann 1.1 PlottingSetup::JZBPeakPositionData=mean;
378     PlottingSetup::JZBPeakWidthData=fitFunc->GetParameter(2);
379     }
380     delete peakfitcanvas;
381    
382     return mean;
383     }
384    
385    
386    
387 fronga 1.4 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 buchmann 1.1 {
389     float peak_position=0;
390 fronga 1.4
391 buchmann 1.1 if(method==0||method>1) {
392     //looking at a gaus request
393     int numsig=1;
394     if(method>1) numsig=method;
395 fronga 1.4 peak_position=find_Gauss_peak(all,ttbar,minfit,maxfit,is_data,error,Sigma,Serror,numsig);
396 buchmann 1.1 }
397     if(method==1) {
398     //looking at a KM request
399 fronga 1.4 peak_position=find_KM_peak(all,ttbar,minfit,maxfit,is_data,error,Sigma,Serror);
400 buchmann 1.1 }
401     if(method==-99) { // KOSTAS!!
402     TF1 *f1 = new TF1("f1","gaus",-40,40);
403 fronga 1.4 peak_position=Kostas_algorithm(all,error,Sigma,Serror,f1,2.5,2.5,is_data,saveas);
404 buchmann 1.1 }
405     return peak_position;
406     }
407    
408    
409 fronga 1.4 float get_Gaussian_peak(TH1F *hist, float &error, float &sigma, float& Serror, TF1* fitFunc, float lowlimit, float highlimit,bool is_data,int numsig)
410 buchmann 1.1 {
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 fronga 1.4 sigma=fitFunc->GetParameter(2);
442 buchmann 1.1 error=1.0*fitFunc->GetParError(1);
443 fronga 1.4 Serror=fitFunc->GetParError(2);
444 buchmann 1.1 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 fronga 1.4 float find_Gauss_peak(TH1F *all, TH1F *ttbar, float minfit, float maxfit, bool is_data, float &error,float &Sigma,float& Serror, int numsig)
498 buchmann 1.1 {
499     TF1 *fitfunc = new TF1("fitfunc","gaus",minfit,maxfit);
500 fronga 1.4 float peakpos = get_Gaussian_peak(all,error,Sigma,Serror,fitfunc, minfit, maxfit,is_data,numsig);
501 buchmann 1.1 return peakpos;
502     }
503    
504 fronga 1.4 float find_KM_peak(TH1F *all, TH1F *ttbar, float minfit, float maxfit, bool is_data, float &error,float &Sigma, float& Serror)
505 buchmann 1.1 {
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 fronga 1.4 Serror=fitfunc->GetParError(4);
565 buchmann 1.1
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