ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/PeakFinder.C
Revision: 1.1
Committed: Mon Jan 30 14:46:25 2012 UTC (13 years, 3 months ago) by buchmann
Content type: text/plain
Branch: MAIN
Log Message:
Initial commit of Ice Cream versions

File Contents

# User Rev Content
1 buchmann 1.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