double langaufun(
double *
x,
double *par) {
double invsq2pi = 0.3989422804014;
double mpshift = -0.22278298;
double sc = 5.0;
double xx;
double mpc;
double fland;
double xlow,xupp;
double step;
double i;
mpc = par[1] - mpshift * par[0];
xlow =
x[0] - sc * par[3];
xupp =
x[0] + sc * par[3];
for(i=1.0; i<=
np/2; i++) {
xx = xlow + (i-.5) * step;
xx = xupp - (i-.5) * step;
}
return (par[2] * step *
sum * invsq2pi / par[3]);
}
TF1 *langaufit(
TH1F *his,
double *fitrange,
double *startvalues,
double *parlimitslo,
double *parlimitshi,
double *fitparams,
double *fiterrors,
double *ChiSqr,
int *NDF)
{
int i;
char FunName[100];
sprintf(FunName,
"Fitfcn_%s",his->
GetName());
if (ffitold) delete ffitold;
TF1 *ffit =
new TF1(FunName,langaufun,fitrange[0],fitrange[1],4);
for (i=0; i<4; i++) {
}
for (i=0; i<4; i++) {
}
return (ffit);
}
int langaupro(double *params, double &maxx, double &FWHM) {
double step;
int i = 0;
int MAXCALLS = 10000;
p = params[1] - 0.1 * params[0];
step = 0.05 * params[0];
lold = -2.0;
while ( (
l != lold) && (i < MAXCALLS) ) {
i++;
l = langaufun(&
x,params);
step = -step/10;
}
if (i == MAXCALLS)
return (-1);
step = params[0];
lold = -2.0;
i = 0;
while ( (
l != lold) && (i < MAXCALLS) ) {
i++;
step = -step/10;
}
if (i == MAXCALLS)
return (-2);
p = maxx - 0.5 * params[0];
step = -params[0];
lold = -2.0;
i = 0;
while ( (
l != lold) && (i < MAXCALLS) ) {
i++;
step = -step/10;
}
if (i == MAXCALLS)
return (-3);
FWHM = fxr - fxl;
return (0);
}
void langaus() {
int data[100] = {0,0,0,0,0,0,2,6,11,18,18,55,90,141,255,323,454,563,681,
737,821,796,832,720,637,558,519,460,357,291,279,241,212,
153,164,139,106,95,91,76,80,80,59,58,51,30,49,23,35,28,23,
22,27,27,24,20,16,17,14,20,12,12,13,10,17,7,6,12,6,12,4,
9,9,10,3,4,5,2,4,1,5,5,1,7,1,6,3,3,3,4,5,4,4,2,2,7,2,4};
TH1F *hSNR =
new TH1F(
"snr",
"Signal-to-noise",400,0,400);
for (
int i=0; i<100; i++) hSNR->
Fill(i,
data[i]);
printf("Fitting...\n");
double fr[2];
double sv[4], pllo[4], plhi[4], fp[4], fpe[4];
pllo[0]=0.5; pllo[1]=5.0; pllo[2]=1.0; pllo[3]=0.4;
plhi[0]=5.0; plhi[1]=50.0; plhi[2]=1000000.0; plhi[3]=5.0;
sv[0]=1.8; sv[1]=20.0; sv[2]=50000.0; sv[3]=3.0;
double chisqr;
int ndf;
TF1 *fitsnr = langaufit(hSNR,fr,sv,pllo,plhi,fp,fpe,&chisqr,&ndf);
double SNRPeak, SNRFWHM;
langaupro(fp,SNRPeak,SNRFWHM);
printf("Fitting done\nPlotting results...\n");
}
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t np
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
R__EXTERN TStyle * gStyle
virtual void SetRange(Int_t first=0, Int_t last=0)
Set the viewing range for the axis using bin numbers.
virtual Int_t GetNDF() const
Return the number of degrees of freedom in the fit the fNDF parameter has been previously computed du...
virtual Double_t GetParError(Int_t ipar) const
Return value of parameter number ipar.
Double_t GetChisquare() const
Return the Chisquare after fitting. See ROOT::Fit::FitResult::Chi2()
virtual void SetParNames(const char *name0="", const char *name1="", const char *name2="", const char *name3="", const char *name4="", const char *name5="", const char *name6="", const char *name7="", const char *name8="", const char *name9="", const char *name10="")
Set up to 10 parameter names.
virtual Double_t * GetParameters() const
void Draw(Option_t *option="") override
Draw this function with its current attributes.
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax)
Set lower and upper limits for parameter ipar.
virtual void SetParameters(const Double_t *params)
1-D histogram with a float per channel (see TH1 documentation)
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Double_t xmin=0, Double_t xmax=0)
Fit histogram with function fname.
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
void Draw(Option_t *option="") override
Draw this histogram with options.
const char * GetName() const override
Returns name of object.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
void SetLabelSize(Float_t size=0.04, Option_t *axis="X")
Set size of axis labels.
void SetOptFit(Int_t fit=1)
The type of information about fit parameters printed in the histogram statistics box can be selected ...
Double_t Gaus(Double_t x, Double_t mean=0, Double_t sigma=1, Bool_t norm=kFALSE)
Calculates a gaussian function with mean and sigma.
Double_t Landau(Double_t x, Double_t mpv=0, Double_t sigma=1, Bool_t norm=kFALSE)
The LANDAU function.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
static uint64_t sum(uint64_t i)