13 #include "Riostream.h" 21 #include "TObjString.h" 22 #include "TLinearFitter.h" 25 #include "TGraphErrors.h" 26 #include "TMultiGraph.h" 30 #include "THashList.h" 31 #include "TFitResultPtr.h" 32 #include "TFitResult.h" 33 #include "TPaletteAxis.h" 39 #include "TStopwatch.h" 59 void EvaluateUni(Int_t nvectors, Double_t *data, Double_t &mean, Double_t &sigma, Int_t hh);
60 void EvaluateUniExternal(Int_t nvectors, Double_t *data, Double_t &mean, Double_t &sigma, Int_t hh, Float_t externalfactor=1);
61 Int_t
Freq(Int_t n,
const Int_t *inlist, Int_t *outlist, Bool_t down);
66 void TruncatedMean(
const TH1 * his, TVectorT<T> *param, Float_t down=0, Float_t up=1.0, Bool_t verbose=kFALSE);
69 template <
typename T> Bool_t
LTMHisto(TH1 * his, TVectorT<T> ¶m , Float_t fraction=1);
70 template <
typename T> Int_t*
LTMUnbinned(
int np,
const T *arr, TVectorT<T> ¶ms , Float_t keep=1.0);
72 template <
typename T>
void Reorder(
int np, T *arr,
const int *idx);
75 void LTM(TH1 * his, TVectorT<T> *param=0 , Float_t fraction=1, Bool_t verbose=kFALSE);
78 Double_t
FitGaus(TH1* his, TVectorT<T> *param=0, TMatrixT<T> *matrix=0, Float_t xmin=0, Float_t xmax=0, Bool_t verbose=kFALSE);
81 Double_t
FitGaus(Float_t *arr, Int_t
nBins, Float_t xMin, Float_t xMax, TVectorT<T> *param=0, TMatrixT<T> *matrix=0, Bool_t verbose=kFALSE);
82 Float_t
GetCOG(
const Short_t *arr, Int_t nBins, Float_t xMin, Float_t xMax, Float_t *rms=0, Float_t *
sum=0);
84 TGraph2D *
MakeStat2D(TH3 * his, Int_t delta0, Int_t delta1, Int_t type);
85 TGraphErrors *
MakeStat1D(TH2 * his, Int_t deltaBin, Double_t fraction, Int_t returnType, Int_t markerStyle, Int_t markerColor);
91 THashList *
AddMetadata(TTree*,
const char *vartagName,
const char *varTagValue);
94 TGraph *
MakeGraphSparse(TTree * tree,
const char * expr=
"Entry",
const char *
cut=
"1", Int_t mstyle=25, Int_t mcolor=1, Float_t msize=-1, Float_t offset=0.0);
95 TGraphErrors *
MakeGraphErrors(TTree * tree,
const char * expr=
"Entry",
const char *
cut=
"1", Int_t mstyle=25, Int_t mcolor=1, Float_t msize=-1, Float_t offset=0.0, Int_t entries=10000000, Int_t firstEntry=0);
96 TMultiGraph *
MakeMultGraph(TTree * tree,
const char *groupName,
const char* expr,
const char *
cut,
const char *
markers,
const char *
colors, Bool_t drawSparse, Float_t msize, Float_t sigmaRange, TLegend * legend, Bool_t
comp=kTRUE );
97 void RebinSparseGraph(TGraph * graph0, TGraph *graph1, Option_t * option=
"");
103 TString*
FitPlane(TTree * tree,
const char* drawCommand,
const char* formula,
const char* cuts, Double_t &
chi2, Int_t &
npoints, TVectorD &fitParam, TMatrixD &covMatrix, Float_t frac=-1, Int_t start=0, Int_t stop=10000000, Bool_t fix0=kFALSE);
104 TString*
FitPlaneFixed(TTree * tree,
const char* drawCommand,
const char* formula,
const char* cuts, Double_t & chi2, Int_t &npoints, TVectorD &fitParam, TMatrixD &covMatrix, Float_t frac=-1, Int_t start=0, Int_t stop=10000000);
108 TString*
FitPlaneConstrain(TTree * tree,
const char* drawCommand,
const char* formula,
const char* cuts, Double_t & chi2, Int_t &npoints, TVectorD &fitParam, TMatrixD &covMatrix, Float_t frac=-1, Int_t start=0, Int_t stop=10000000, Double_t constrain=-1);
109 Int_t
GetFitIndex(
const TString fString,
const TString subString);
110 TString
FilterFit(
const TString &input,
const TString filter, TVectorD &
vec, TMatrixD &covar);
111 void Update1D(Double_t delta, Double_t sigma, Int_t s1, TMatrixD ¶m, TMatrixD &covar);
112 void Constrain1D(
const TString &input,
const TString filter, TVectorD ¶m, TMatrixD & covar, Double_t mean, Double_t sigma);
113 TString
MakeFitString(
const TString &input,
const TVectorD ¶m,
const TMatrixD & covar, Bool_t verbose=kFALSE);
117 Int_t
MakeStatAlias(TTree * tree,
const char * expr,
const char * cut,
const char * alias);
118 void MakeAnchorAlias(TTree * tree, TString& sTrendVars, Int_t doCheck, Int_t verbose);
119 void MakeCombinedAlias(TTree * tree, TString& sCombinedStatus, Bool_t doCheck, Int_t verbose );
120 Int_t
SetStatusAlias(TTree * tree,
const char * expr,
const char * cut,
const char * alias);
122 TMultiGraph*
MakeStatusMultGr(TTree * tree,
const char * expr,
const char * cut,
const char * alias, Int_t igr=0);
123 void AddStatusPad(TCanvas* c1, Float_t padratio, Float_t bottommargin);
127 TMultiGraph*
MakeStatusLines(TTree * tree,
const char * expr,
const char * cut,
const char * alias);
140 const Bool_t normaliseToEntries=kFALSE,
const Double_t pvalue=1.);
142 const Bool_t normaliseToEntries=kFALSE,
const Double_t pvalue=1.);
143 Double_t
GetDistance(TTree * tree,
const char * var,
const char * selection,
144 const ENormType normType,
const Bool_t normaliseToEntries=kFALSE,
const Double_t pvalue=1.);
148 TH1*
DrawHistogram(TTree * tree,
const char* drawCommand,
const char* cuts =
"1",
const char* hname =
"histo",
const char* htitle =
"histo", Int_t nsigma = 4, Float_t fraction = 0.75,
TObjArray *description=0 );
157 template <
typename T>
158 void GetMinMax(
const T* arr, Long64_t n,
double &minVal,
double &maxVal);
159 template <
typename T>
160 void GetMinMaxMean(
const T* arr, Long64_t n,
double &minVal,
double &maxVal,
double &meanVal);
165 template <
typename T>
173 if (val<minVal) minVal = val;
174 if (val>maxVal) maxVal = val;
179 template <
typename T>
188 if (val<minVal) minVal = val;
189 if (val>maxVal) maxVal = val;
196 template <
typename T>
201 Int_t nbins = his->GetNbinsX();
202 Float_t nentries = his->GetEntries();
207 for (Int_t ibin=1;ibin<nbins; ibin++){
208 ncumul+= his->GetBinContent(ibin);
209 Float_t fraction = Float_t(ncumul)/Float_t(nentries);
210 if (fraction>down && fraction<up){
211 sum+=his->GetBinContent(ibin);
212 mean+=his->GetBinCenter(ibin)*his->GetBinContent(ibin);
213 sigma2+=his->GetBinCenter(ibin)*his->GetBinCenter(ibin)*his->GetBinContent(ibin);
217 sigma2= TMath::Sqrt(TMath::Abs(sigma2/sum-mean*mean));
219 (*param)[0] = his->GetMaximum();
221 (*param)[2] = sigma2;
224 if (verbose)
printf(
"Mean\t%f\t Sigma2\t%f\n", mean,sigma2);
227 template <
typename T>
248 Int_t nbins = his1D->GetNbinsX();
249 Int_t nentries = (Int_t)his1D->GetEntries();
250 const Double_t
kEpsilon=0.0000000001;
252 if (nentries<=0)
return 0;
253 if (fraction>1) fraction=0;
254 if (fraction<0)
return 0;
255 TVectorD vectorX(nbins);
256 TVectorD vectorMean(nbins);
257 TVectorD vectorRMS(nbins);
259 for (Int_t ibin0=1; ibin0<=nbins; ibin0++) sumCont+=his1D->GetBinContent(ibin0);
261 Double_t minRMS=his1D->GetRMS()*10000;
264 for (Int_t ibin0=1; ibin0<nbins; ibin0++){
265 Double_t sum0=0, sum1=0, sum2=0;
267 for ( ibin1=ibin0; ibin1<=nbins; ibin1++){
268 Double_t cont=his1D->GetBinContent(ibin1);
269 Double_t x= his1D->GetBinCenter(ibin1);
273 if ( (ibin0!=ibin1) && sum0>=fraction*sumCont)
break;
275 vectorX[ibin0]=his1D->GetBinCenter(ibin0);
276 if (sum0<fraction*sumCont)
continue;
280 Double_t diff = sum0-fraction*sumCont;
281 Double_t mean = (sum0>0) ? sum1/sum0:0;
283 Double_t x0=his1D->GetBinCenter(ibin0);
284 Double_t x1=his1D->GetBinCenter(ibin1);
285 Double_t y0=his1D->GetBinContent(ibin0);
286 Double_t y1=his1D->GetBinContent(ibin1);
288 Double_t d = y0+y1-diff;
290 if (y0<=kEpsilon&&y1>kEpsilon){
293 if (y1<=kEpsilon&&y0>kEpsilon){
296 if (y0>kEpsilon && y1>kEpsilon && x1>x0 ){
297 w0 = (d*(x1-mean))/((x1-x0)*y0);
300 if (w0>1) {w1+=(w0-1)*y0/y1; w0=1;}
301 if (w1>1) {w0+=(w1-1)*y1/y0; w1=1;}
303 if ( (x1>x0) &&TMath::Abs(y0*w0+y1*w1-d)>kEpsilon*sum0){
304 printf(
" TStatToolkit::LTMHisto error\n");
312 Double_t xx0=his1D->GetXaxis()->GetBinUpEdge(ibin0)-0.5*w0*his1D->GetBinWidth(ibin0);
313 Double_t xx1=his1D->GetXaxis()->GetBinLowEdge(ibin1)+0.5*w1*his1D->GetBinWidth(ibin1);
324 vectorMean[ibin0]=sum1/sum0;
325 vectorRMS[ibin0]=TMath::Sqrt(TMath::Abs(sum2/sum0-vectorMean[ibin0]*vectorMean[ibin0]));
326 if (vectorRMS[ibin0]<minRMS){
327 minRMS=vectorRMS[ibin0];
329 params[1]=vectorMean[ibin0];
330 params[2]=vectorRMS[ibin0];
331 params[3]=vectorRMS[ibin0]/TMath::Sqrt(sumCont*fraction);
335 params[7]=his1D->GetBinCenter(ibin0);
336 params[8]=his1D->GetBinCenter(ibin1);
346 template <
typename T>
347 Double_t
TStatToolkit::FitGaus(TH1* his, TVectorT<T> *param, TMatrixT<T> *, Float_t xmin, Float_t xmax, Bool_t verbose){
361 static TLinearFitter fitter(3,
"pol2");
365 if (his->GetMaximum()<4)
return -1;
366 if (his->GetEntries()<12)
return -1;
367 if (his->GetRMS()<mat.GetTol())
return -1;
368 Float_t maxEstimate = his->GetEntries()*his->GetBinWidth(1)/TMath::Sqrt((TMath::TwoPi()*his->GetRMS()));
369 Int_t dsmooth = TMath::Nint(6./TMath::Sqrt(maxEstimate));
371 if (maxEstimate<1)
return -1;
372 Int_t nbins = his->GetNbinsX();
378 xmin = his->GetXaxis()->GetXmin();
379 xmax = his->GetXaxis()->GetXmax();
381 for (Int_t iter=0; iter<2; iter++){
382 fitter.ClearPoints();
384 for (Int_t ibin=1;ibin<nbins+1; ibin++){
386 Float_t entriesI = his->GetBinContent(ibin);
387 for (Int_t delta = -dsmooth; delta<=dsmooth; delta++){
388 if (ibin+delta>1 &&ibin+delta<nbins-1){
389 entriesI += his->GetBinContent(ibin+delta);
394 Double_t xcenter= his->GetBinCenter(ibin);
395 if (xcenter<xmin || xcenter>xmax)
continue;
396 Double_t error=1./TMath::Sqrt(countB);
399 if (par[0]+par[1]*xcenter+par[2]*xcenter*xcenter>20)
return 0;
400 cont = TMath::Exp(par[0]+par[1]*xcenter+par[2]*xcenter*xcenter);
401 if (cont>1.) error = 1./TMath::Sqrt(cont*Float_t(countB));
403 if (entriesI>1&&cont>1){
404 fitter.AddPoint(&xcenter,TMath::Log(Float_t(entriesI)),error);
410 fitter.GetParameters(par);
418 fitter.GetParameters(par);
419 fitter.GetCovarianceMatrix(mat);
420 if (TMath::Abs(par[1])<mat.GetTol())
return -1;
421 if (TMath::Abs(par[2])<mat.GetTol())
return -1;
422 Double_t
chi2 = fitter.GetChisquare()/Float_t(npoints);
424 if (!param) param =
new TVectorT<T>(3);
426 (*param)[1] = par[1]/(-2.*par[2]);
427 (*param)[2] = 1./TMath::Sqrt(TMath::Abs(-2.*par[2]));
428 (*param)[0] = TMath::Exp(par[0]+ par[1]* (*param)[1] + par[2]*(*param)[1]*(*param)[1]);
434 TF1 * f1=
new TF1(
"f1",
"[0]*exp(-(x-[1])^2/(2*[2]*[2]))",his->GetXaxis()->GetXmin(),his->GetXaxis()->GetXmax());
435 f1->SetParameter(0, (*param)[0]);
436 f1->SetParameter(1, (*param)[1]);
437 f1->SetParameter(2, (*param)[2]);
443 template <
typename T>
457 Int_t nbins = his->GetNbinsX();
458 Int_t nentries = (Int_t)his->GetEntries();
459 if (nentries<=0)
return;
460 Double_t *data =
new Double_t[nentries];
462 for (Int_t ibin=1;ibin<nbins; ibin++){
463 Double_t entriesI = his->GetBinContent(ibin);
465 Double_t x0 = his->GetXaxis()->GetBinLowEdge(ibin);
466 Double_t w = his->GetXaxis()->GetBinWidth(ibin);
467 for (Int_t ic=0; ic<entriesI; ic++){
468 if (npoints<nentries){
469 data[
npoints]= x0+w*Double_t((ic+0.5)/entriesI);
474 Double_t mean, sigma;
475 Int_t npoints2=TMath::Min(Int_t(fraction*Float_t(npoints)),npoints-1);
476 npoints2=TMath::Max(Int_t(0.5*Float_t(npoints)),npoints2);
479 if (verbose)
printf(
"Mean\t%f\t Sigma2\t%f\n", mean,sigma);
481 (*param)[0] = his->GetMaximum();
488 template <
typename T>
510 static TLinearFitter fitter(3,
"pol2");
511 static TMatrixD
mat(3,3);
512 static Double_t kTol = mat.GetTol();
513 fitter.StoreData(kFALSE);
514 fitter.ClearPoints();
519 Float_t rms = TMath::RMS(nBins,arr);
520 Float_t max = TMath::MaxElement(nBins,arr);
521 Float_t binWidth = (xMax-xMin)/(Float_t)
nBins;
530 for (Int_t i=0; i<
nBins; i++){
532 if (arr[i]>0) nfilled++;
535 if (max<4)
return -4;
536 if (entries<12)
return -4;
537 if (rms<kTol)
return -4;
543 for (Int_t ibin=0;ibin<
nBins; ibin++){
544 Float_t entriesI = arr[ibin];
546 Double_t xcenter = xMin+(ibin+0.5)*binWidth;
548 Float_t error = 1./TMath::Sqrt(entriesI);
549 Float_t val = TMath::Log(Float_t(entriesI));
550 fitter.AddPoint(&xcenter,val,error);
553 matA(npoints,1)=xcenter;
554 matA(npoints,2)=xcenter*xcenter;
556 meanCOG+=xcenter*entriesI;
557 rms2COG +=xcenter*entriesI*xcenter;
579 fitter.GetParameters(par);
580 fitter.GetCovarianceMatrix(mat);
581 chi2 = fitter.GetChisquare()/Float_t(npoints);
583 if (TMath::Abs(par[1])<kTol)
return -4;
584 if (TMath::Abs(par[2])<kTol)
return -4;
586 if (!param) param =
new TVectorT<T>(3);
589 (*param)[1] = par[1]/(-2.*par[2]);
590 (*param)[2] = 1./TMath::Sqrt(TMath::Abs(-2.*par[2]));
591 Double_t lnparam0 = par[0]+ par[1]* (*param)[1] + par[2]*(*param)[1]*(*param)[1];
592 if ( lnparam0>307 )
return -4;
593 (*param)[0] = TMath::Exp(lnparam0);
599 TF1 * f1=
new TF1(
"f1",
"[0]*exp(-(x-[1])^2/(2*[2]*[2]))",xMin,xMax);
600 f1->SetParameter(0, (*param)[0]);
601 f1->SetParameter(1, (*param)[1]);
602 f1->SetParameter(2, (*param)[2]);
613 (*param)[1] = meanCOG;
614 (*param)[2] = TMath::Sqrt(TMath::Abs(meanCOG*meanCOG-rms2COG));
620 (*param)[1] = meanCOG;
621 (*param)[2] = binWidth/TMath::Sqrt(12);
628 template <
typename T>
654 static int *index = 0;
657 if (keepN>np) keepN = np;
658 if (keepN<2)
return 0;
663 index =
new int[book];
665 w =
new float[book+book];
668 float *wx1 = w, *wx2 = wx1+np;
669 TMath::Sort(np,arr,index,kFALSE);
671 double sum1=0.0,sum2=0.0;
672 for (
int i=0;i<np;i++) {
673 double x = arr[index[i]];
675 wx2[i] = (sum2+=x*x);
677 double minRMS = sum2+1e6;
679 int limI = np - keepN+1;
680 for (
int i=0;i<limI;i++) {
681 int limJ = i+keepN-1;
682 Double_t sum1 = double(wx1[limJ]) - double(i ? wx1[i-1] : 0.0);
683 Double_t sum2 = double(wx2[limJ]) - double(i ? wx2[i-1] : 0.0);
684 double mean = sum1/keepN;
685 double rms2 = sum2/keepN - mean*mean;
687 if (rms2>minRMS)
continue;
695 if (!params[0])
return 0;
697 ::Error(
"TStatToolkit::LTMUnbinned",
"rounding error in RMS<0");
702 params[2] = TMath::Sqrt(params[2]);
703 params[3] = params[2]/TMath::Sqrt(params[0]);
704 params[4] = params[3]/TMath::Sqrt(2.0);
708 template <
typename T>
712 const int kMaxOnStack = 10000;
714 T *arrCHeap=0, arrCstack[np<kMaxOnStack ? np:1], *arrC=np<kMaxOnStack ? &arrCstack[0] : (arrCHeap=
new T[np]);
715 memcpy(arrC,arr,np*
sizeof(T));
716 for (
int i=np;i--;) arr[i] = arrC[idx[i]];
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
TTreeSRedirector * pcstream