ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/Plotting/Modules/PeakFinder.C
Revision: 1.9
Committed: Fri Sep 9 07:17:20 2011 UTC (13 years, 8 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Changes since 1.8: +3 -1 lines
Log Message:
Adapted legend size so that the histos are more visible ...

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