24 #include "TStopwatch.h" 26 #include "TTreeFormula.h" 51 Double_t faclts[]={2.6477,2.5092,2.3826,2.2662,2.1587,2.0589,1.9660,1.879,1.7973,1.7203,1.6473};
52 Int_t *index=
new Int_t[nvectors];
53 TMath::Sort(nvectors, data, index, kFALSE);
55 Int_t nquant = TMath::Min(Int_t(Double_t(((hh*1./nvectors)-0.5)*40))+1, 11);
56 Double_t factor = faclts[TMath::Max(0,nquant-1)];
61 Double_t bestmean = 0;
62 Double_t bestsigma = (data[index[nvectors-1]]-data[index[0]]+1.);
63 bestsigma *=bestsigma;
65 for (Int_t i=0; i<hh; i++){
66 sumx += data[index[i]];
67 sumx2 += data[index[i]]*data[index[i]];
70 Double_t norm = 1./Double_t(hh);
71 Double_t norm2 = (hh-1)>0 ? 1./Double_t(hh-1):1;
72 for (Int_t i=hh; i<nvectors; i++){
73 Double_t cmean = sumx*norm;
74 Double_t csigma = (sumx2 - hh*cmean*cmean)*norm2;
75 if (csigma<bestsigma){
81 sumx += data[index[i]]-data[index[i-hh]];
82 sumx2 += data[index[i]]*data[index[i]]-data[index[i-hh]]*data[index[i-hh]];
85 Double_t bstd=factor*TMath::Sqrt(TMath::Abs(bestsigma));
102 Double_t faclts[]={2.6477,2.5092,2.3826,2.2662,2.1587,2.0589,1.9660,1.879,1.7973,1.7203,1.6473};
103 Int_t *index=
new Int_t[nvectors];
104 TMath::Sort(nvectors, data, index, kFALSE);
106 Int_t nquant = TMath::Min(Int_t(Double_t(((hh*1./nvectors)-0.5)*40))+1, 11);
107 Double_t factor = faclts[0];
110 factor = faclts[nquant-1];
117 Int_t bestindex = -1;
118 Double_t bestmean = 0;
119 Double_t bestsigma = -1;
120 for (Int_t i=0; i<hh; i++){
121 sumx += data[index[i]];
122 sumx2 += data[index[i]]*data[index[i]];
125 Double_t kfactor = 2.*externalfactor - externalfactor*externalfactor;
126 Double_t norm = 1./Double_t(hh);
127 for (Int_t i=hh; i<nvectors; i++){
128 Double_t cmean = sumx*norm;
129 Double_t csigma = (sumx2*norm - cmean*cmean*kfactor);
130 if (csigma<bestsigma || bestsigma<0){
137 sumx += data[index[i]]-data[index[i-hh]];
138 sumx2 += data[index[i]]*data[index[i]]-data[index[i-hh]]*data[index[i-hh]];
141 Double_t bstd=factor*TMath::Sqrt(TMath::Abs(bestsigma));
150 , Int_t *outlist, Bool_t down)
157 Int_t * sindexS =
new Int_t[n];
158 Int_t * sindexF =
new Int_t[2*n];
159 for (Int_t i=0;i<n;i++) sindexS[i]=0;
160 for (Int_t i=0;i<2*n;i++) sindexF[i]=0;
162 TMath::Sort(n,inlist, sindexS, down);
163 Int_t last = inlist[sindexS[0]];
170 for(Int_t i=1;i<n; i++){
171 val = inlist[sindexS[i]];
172 if (last == val) sindexF[countPos]++;
175 sindexF[countPos+n] = val;
180 if (last==val) countPos++;
182 TMath::Sort(countPos, sindexF, sindexS, kTRUE);
183 for (Int_t i=0;i<countPos;i++){
184 outlist[2*i ] = sindexF[sindexS[i]+n];
185 outlist[2*i+1] = sindexF[sindexS[i]];
206 Int_t nbins = his1D->GetNbinsX();
208 for (Int_t ibin=0; ibin<nbins; ibin++) vectorH[ibin]=his1D->GetBinContent(ibin+1);
209 for (Int_t ibin=0; ibin<nbins; ibin++) {
210 Int_t index0=ibin-nmedian;
211 Int_t index1=ibin+nmedian;
212 if (index0<0) {index1+=-index0; index0=0;}
213 if (index1>=nbins) {index0-=index1-nbins+1; index1=nbins-1;}
214 Double_t value= TMath::Median(index1-index0,&(vectorH.GetMatrixArray()[index0]));
215 his1D->SetBinContent(ibin+1, value);
232 Float_t binWidth = (xMax-xMin)/(Float_t)
nBins;
234 for (Int_t ibin=0; ibin<
nBins; ibin++){
235 Float_t entriesI = (Float_t)arr[ibin];
236 Double_t xcenter = xMin+(ibin+0.5)*binWidth;
238 meanCOG += xcenter*entriesI;
239 rms2COG += xcenter*entriesI*xcenter;
244 if ( sumCOG == 0 )
return xMin;
249 (*rms) = TMath::Sqrt(TMath::Abs(meanCOG*meanCOG-rms2COG));
250 if ( npoints == 1 ) (*rms) = binWidth/TMath::Sqrt(12);
277 Float_t *xTrue =
new Float_t[nhistos];
278 Float_t *sTrue =
new Float_t[nhistos];
284 TH1F **h1f =
new TH1F*[nhistos];
285 TF1 *myg =
new TF1(
"myg",
"gaus");
286 TF1 *
fit =
new TF1(
"fit",
"gaus");
290 for (Int_t i=0;i<nhistos; i++){
293 h1f[i] =
new TH1F(Form(
"h1f%d",i),Form(
"h1f%d",i),20,-10,10);
294 xTrue[i]= gRandom->Rndm();
296 sTrue[i]= .75+gRandom->Rndm()*.5;
297 myg->SetParameters(1,xTrue[i],sTrue[i]);
298 h1f[i]->FillRandom(
"myg");
304 for (Int_t i=0; i<nhistos; i++){
305 h1f[i]->Fit(fit,
"0q");
306 (*par1[i])(0) = fit->GetParameter(0);
307 (*par1[i])(1) = fit->GetParameter(1);
308 (*par1[i])(2) = fit->GetParameter(2);
316 for (Int_t i=0; i<nhistos; i++){
317 TStatToolkit::FitGaus(h1f[i]->GetArray()+1,h1f[i]->GetNbinsX(),h1f[i]->GetXaxis()->GetXmin(),h1f[i]->GetXaxis()->GetXmax(),par2[i],&dummy);
321 printf(
"Parabolic fit\t");
324 for (Int_t i=0;i<nhistos; i++){
325 Float_t xt = xTrue[i];
326 Float_t st = sTrue[i];
335 for (Int_t i=0;i<nhistos; i++){
359 TAxis * xaxis = his->GetXaxis();
360 TAxis * yaxis = his->GetYaxis();
362 Int_t nbinx = xaxis->GetNbins();
363 Int_t nbiny = yaxis->GetNbins();
366 TGraph2D *graph =
new TGraph2D(nbinx*nbiny);
368 for (Int_t ix=0; ix<nbinx;ix++)
369 for (Int_t iy=0; iy<nbiny;iy++){
370 Float_t xcenter = xaxis->GetBinCenter(ix);
371 Float_t ycenter = yaxis->GetBinCenter(iy);
372 snprintf(name,1000,
"%s_%d_%d",his->GetName(), ix,iy);
373 TH1 *projection = his->ProjectionZ(name,ix-delta0,ix+delta0,iy-delta1,iy+delta1);
375 if (type==0) stat = projection->GetMean();
376 if (type==1) stat = projection->GetRMS();
377 if (type==2 || type==3){
380 if (type==2) stat= vec[1];
381 if (type==3) stat= vec[0];
383 if (type==4|| type==5){
384 projection->Fit(&f1);
385 if (type==4) stat= f1.GetParameter(1);
386 if (type==5) stat= f1.GetParameter(2);
389 graph->SetPoint(icount,xcenter, ycenter, stat);
395 TGraphErrors *
TStatToolkit::MakeStat1D(TH2 * his, Int_t deltaBin, Double_t fraction, Int_t returnType, Int_t markerStyle, Int_t markerColor){
414 TAxis * xaxis = his->GetXaxis();
415 Int_t nbinx = xaxis->GetNbins();
427 for (Int_t jx=1; jx<=nbinx;jx++){
429 Float_t xcenter = xaxis->GetBinCenter(jx);
430 snprintf(name,1000,
"%s_%d",his->GetName(), ix);
431 TH1 *projection = his->ProjectionY(name,TMath::Max(jx-deltaBin,1),TMath::Min(jx+deltaBin,nbinx));
434 if (projection->Integral()==0) {
435 vecX[icount] = xcenter;
437 vecYErr[icount] = err;
446 stat = projection->GetMean();
447 err = projection->GetMeanError();
449 else if (returnType==1) {
450 stat = projection->GetRMS();
451 err = projection->GetRMSError();
453 else if (returnType==2 || returnType==3){
454 if (returnType==2) {stat= vecLTM[1]; err =projection->GetRMSError();}
455 if (returnType==3) {stat= vecLTM[2]; err =projection->GetRMSError();}
457 else if (returnType==4|| returnType==5){
458 f1.SetParameters(vecLTM[0], vecLTM[1], vecLTM[2]+0.05);
459 projection->Fit(&f1,
"QN",
"QN", vecLTM[7]-vecLTM[2], vecLTM[8]+vecLTM[2]);
461 stat= f1.GetParameter(1);
462 err=f1.GetParError(1);
465 stat= f1.GetParameter(2);
466 err=f1.GetParError(2);
469 else if (returnType==6) {
472 else if (returnType==7) {
473 const Int_t maxBin = projection->GetMaximumBin();
474 const Double_t max = projection->GetXaxis()->GetBinCenter(maxBin);
475 const Double_t
range = fraction*(projection->GetXaxis()->GetXmax()-projection->GetXaxis()->GetXmin());
476 f1.SetParameters(projection->GetMaximum(),
477 projection->GetMean(),
478 projection->GetRMS());
479 f1.SetRange(max-range, max+range);
480 projection->Fit(&f1,
"QN",
"QN", max-range, max+range);
481 stat= f1.GetParameter(1);
482 err=f1.GetParError(1);
485 vecX[icount]=xcenter;
491 TGraphErrors *graph =
new TGraphErrors(icount,vecX.GetMatrixArray(), vecY.GetMatrixArray(),0, vecYErr.GetMatrixArray());
492 graph->SetMarkerStyle(markerStyle);
493 graph->SetMarkerColor(markerColor);
500 const Int_t nbins1D=hist->GetNbinsX();
501 Double_t binMedian=0;
502 Double_t limits[2]={hist->GetBinCenter(1), hist->GetBinCenter(nbins1D)};
504 Double_t* integral=hist->GetIntegral();
505 for (Int_t i=1; i<nbins1D-1; i++){
506 if (integral[i-1]<0.5 && integral[i]>=0.5){
507 if (hist->GetBinContent(i-1)+hist->GetBinContent(i)>0){
508 binMedian=hist->GetBinCenter(i);
509 Double_t dIdx=-(integral[i-1]-integral[i]);
510 Double_t dx=(0.5+(0.5-integral[i])/dIdx)*hist->GetBinWidth(i);
514 if (integral[i-1]<fractionCut && integral[i]>=fractionCut){
515 limits[0]=hist->GetBinCenter(i-1)-hist->GetBinWidth(i);
517 if (integral[i]<1-fractionCut && integral[i+1]>=1-fractionCut){
518 limits[1]=hist->GetBinCenter(i+1)+hist->GetBinWidth(i);
526 TString*
TStatToolkit::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, Int_t start, Int_t stop,Bool_t fix0){
533 TString formulaStr(formula);
534 TString drawStr(drawCommand);
535 TString cutStr(cuts);
538 TString strVal(drawCommand);
539 if (strVal.Contains(
":")){
540 TObjArray* valTokens = strVal.Tokenize(
":");
541 drawStr = valTokens->At(0)->GetName();
542 ferr = valTokens->At(1)->GetName();
547 formulaStr.ReplaceAll(
"++",
"~");
548 TObjArray* formulaTokens = formulaStr.Tokenize(
"~");
549 Int_t dim = formulaTokens->GetEntriesFast();
551 fitParam.ResizeTo(dim);
552 covMatrix.ResizeTo(dim,dim);
554 TLinearFitter* fitter =
new TLinearFitter(dim+1, Form(
"hyp%d",dim));
555 fitter->StoreData(kTRUE);
556 fitter->ClearPoints();
558 Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start, start);
560 delete formulaTokens;
561 return new TString(TString::Format(
"ERROR expr: %s\t%s\tEntries==0",drawStr.Data(),cutStr.Data()));
563 Double_t **values =
new Double_t*[dim+1] ;
564 for (Int_t i=0; i<dim+1; i++) values[i]=NULL;
566 entries = tree->Draw(ferr.Data(), cutStr.Data(),
"goff", stop-start, start);
568 delete formulaTokens;
570 return new TString(TString::Format(
"ERROR error part: %s\t%s\tEntries==0",ferr.Data(),cutStr.Data()));
572 Double_t *
errors =
new Double_t[entries];
573 memcpy(errors, tree->GetV1(), entries*
sizeof(Double_t));
575 for (Int_t i = 0; i < dim + 1; i++){
577 if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(),
"goff", stop-start,start);
578 else centries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start,start);
580 if (entries != centries) {
583 return new TString(TString::Format(
"ERROR: %s\t%s\tEntries==%d\tEntries2=%d\n",drawStr.Data(),cutStr.Data(),entries,centries));
585 values[i] =
new Double_t[entries];
586 memcpy(values[i], tree->GetV1(), entries*
sizeof(Double_t));
590 for (Int_t i = 0; i < entries; i++){
592 for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
593 fitter->AddPoint(x, values[dim][i], errors[i]);
597 if (frac>0.5 && frac<1){
598 fitter->EvalRobust(frac);
601 fitter->FixParameter(0,0);
605 fitter->GetParameters(fitParam);
606 fitter->GetCovarianceMatrix(covMatrix);
607 chi2 = fitter->GetChisquare();
609 TString *preturnFormula =
new TString(Form(
"( %f+",fitParam[0])), &returnFormula = *preturnFormula;
611 for (Int_t iparam = 0; iparam < dim; iparam++) {
612 returnFormula.Append(Form(
"%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam+1]));
613 if (iparam < dim-1) returnFormula.Append(
"+");
615 returnFormula.Append(
" )");
618 for (Int_t j=0; j<dim+1;j++)
delete [] values[j];
621 delete formulaTokens;
625 return preturnFormula;
628 TString*
TStatToolkit::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, Int_t start, Int_t stop,Double_t constrain){
635 TString formulaStr(formula);
636 TString drawStr(drawCommand);
637 TString cutStr(cuts);
640 TString strVal(drawCommand);
641 if (strVal.Contains(
":")){
642 TObjArray* valTokens = strVal.Tokenize(
":");
643 drawStr = valTokens->At(0)->GetName();
644 ferr = valTokens->At(1)->GetName();
649 formulaStr.ReplaceAll(
"++",
"~");
650 TObjArray* formulaTokens = formulaStr.Tokenize(
"~");
651 Int_t dim = formulaTokens->GetEntriesFast();
653 fitParam.ResizeTo(dim);
654 covMatrix.ResizeTo(dim,dim);
656 TLinearFitter* fitter =
new TLinearFitter(dim+1, Form(
"hyp%d",dim));
657 fitter->StoreData(kTRUE);
658 fitter->ClearPoints();
660 Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start, start);
662 delete formulaTokens;
663 return new TString(
"An ERROR has occured during fitting!");
665 Double_t **values =
new Double_t*[dim+1] ;
666 for (Int_t i=0; i<dim+1; i++) values[i]=NULL;
668 entries = tree->Draw(ferr.Data(), cutStr.Data(),
"goff", stop-start, start);
670 delete formulaTokens;
672 return new TString(
"An ERROR has occured during fitting!");
674 Double_t *
errors =
new Double_t[entries];
675 memcpy(errors, tree->GetV1(), entries*
sizeof(Double_t));
677 for (Int_t i = 0; i < dim + 1; i++){
679 if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(),
"goff", stop-start,start);
680 else centries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start,start);
682 if (entries != centries) {
685 delete formulaTokens;
686 return new TString(
"An ERROR has occured during fitting!");
688 values[i] =
new Double_t[entries];
689 memcpy(values[i], tree->GetV1(), entries*
sizeof(Double_t));
693 for (Int_t i = 0; i < entries; i++){
695 for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
696 fitter->AddPoint(x, values[dim][i], errors[i]);
699 for (Int_t i = 0; i < dim; i++){
701 for (Int_t j=0; j<dim;j++)
if (i!=j) x[j]=0;
703 fitter->AddPoint(x, 0, constrain);
709 if (frac>0.5 && frac<1){
710 fitter->EvalRobust(frac);
712 fitter->GetParameters(fitParam);
713 fitter->GetCovarianceMatrix(covMatrix);
714 chi2 = fitter->GetChisquare();
717 TString *preturnFormula =
new TString(Form(
"( %f+",fitParam[0])), &returnFormula = *preturnFormula;
719 for (Int_t iparam = 0; iparam < dim; iparam++) {
720 returnFormula.Append(Form(
"%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam+1]));
721 if (iparam < dim-1) returnFormula.Append(
"+");
723 returnFormula.Append(
" )");
725 for (Int_t j=0; j<dim+1;j++)
delete [] values[j];
729 delete formulaTokens;
733 return preturnFormula;
738 TString*
TStatToolkit::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, Int_t start, Int_t stop){
745 TString formulaStr(formula);
746 TString drawStr(drawCommand);
747 TString cutStr(cuts);
750 TString strVal(drawCommand);
751 if (strVal.Contains(
":")){
752 TObjArray* valTokens = strVal.Tokenize(
":");
753 drawStr = valTokens->At(0)->GetName();
754 ferr = valTokens->At(1)->GetName();
759 formulaStr.ReplaceAll(
"++",
"~");
760 TObjArray* formulaTokens = formulaStr.Tokenize(
"~");
761 Int_t dim = formulaTokens->GetEntriesFast();
763 fitParam.ResizeTo(dim);
764 covMatrix.ResizeTo(dim,dim);
766 for (Int_t i=1; i<dim; i++) fitString+=Form(
"++x%d",i);
767 TLinearFitter* fitter =
new TLinearFitter(dim, fitString.Data());
768 fitter->StoreData(kTRUE);
769 fitter->ClearPoints();
771 Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start, start);
773 delete formulaTokens;
774 return new TString(
"An ERROR has occured during fitting!");
776 Double_t **values =
new Double_t*[dim+1] ;
777 for (Int_t i=0; i<dim+1; i++) values[i]=NULL;
779 entries = tree->Draw(ferr.Data(), cutStr.Data(),
"goff", stop-start, start);
782 delete formulaTokens;
783 return new TString(
"An ERROR has occured during fitting!");
785 Double_t *
errors =
new Double_t[entries];
786 memcpy(errors, tree->GetV1(), entries*
sizeof(Double_t));
788 for (Int_t i = 0; i < dim + 1; i++){
790 if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(),
"goff", stop-start,start);
791 else centries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start,start);
793 if (entries != centries) {
796 delete formulaTokens;
797 return new TString(
"An ERROR has occured during fitting!");
799 values[i] =
new Double_t[entries];
800 memcpy(values[i], tree->GetV1(), entries*
sizeof(Double_t));
804 for (Int_t i = 0; i < entries; i++){
806 for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
807 fitter->AddPoint(x, values[dim][i], errors[i]);
811 if (frac>0.5 && frac<1){
812 fitter->EvalRobust(frac);
814 fitter->GetParameters(fitParam);
815 fitter->GetCovarianceMatrix(covMatrix);
816 chi2 = fitter->GetChisquare();
819 TString *preturnFormula =
new TString(
"("), &returnFormula = *preturnFormula;
821 for (Int_t iparam = 0; iparam < dim; iparam++) {
822 returnFormula.Append(Form(
"%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam]));
823 if (iparam < dim-1) returnFormula.Append(
"+");
825 returnFormula.Append(
" )");
828 for (Int_t j=0; j<dim+1;j++)
delete [] values[j];
830 delete formulaTokens;
834 return preturnFormula;
848 TObjArray *arrFit = fString.Tokenize(
"++");
849 TObjArray *arrSub = subString.Tokenize(
"++");
851 for (Int_t i=0; i<arrFit->GetEntries(); i++){
853 TString str =arrFit->At(i)->GetName();
854 for (Int_t isub=0; isub<arrSub->GetEntries(); isub++){
855 if (str.Contains(arrSub->At(isub)->GetName())==0) isOK=kFALSE;
870 TObjArray *array1= filter.Tokenize(
"++");
872 TString result=
"(0.0";
873 for (Int_t i=0; i<array0->GetEntries(); i++){
875 TString str(array0->At(i)->GetName());
876 for (Int_t j=0; j<array1->GetEntries(); j++){
877 if (str.Contains(array1->At(j)->GetName())==0) isOK=kFALSE;
881 result+=Form(
"*(%f)",param[i+1]);
882 printf(
"%f\t%f\t%s\n",param[i+1], TMath::Sqrt(covar(i+1,i+1)),str.Data());
898 const Int_t knMeas=1;
899 Int_t knElem=vecXk.GetNrows();
912 measR(0,0)=sigma*sigma;
915 for (Int_t iel=0;iel<knElem;iel++)
916 for (Int_t ip=0;ip<knMeas;ip++) matHk(ip,iel)=0;
918 for (Int_t iel=0;iel<knElem;iel++) {
919 for (Int_t jel=0;jel<knElem;jel++) mat1(iel,jel)=0;
924 vecYk = vecZk-matHk*vecXk;
925 matHkT=matHk.T(); matHk.T();
926 matSk = (matHk*(covXk*matHkT))+measR;
928 matKk = (covXk*matHkT)*matSk;
929 vecXk += matKk*vecYk;
930 covXk2= (mat1-(matKk*matHk));
931 covXk3 = covXk2*covXk;
933 Int_t nrows=covXk3.GetNrows();
935 for (Int_t irow=0; irow<nrows; irow++)
936 for (Int_t icol=0; icol<nrows; icol++){
938 covXk(irow,icol)=(covXk3(irow,icol)+covXk3(icol,irow))*0.5;
954 TObjArray *array1= filter.Tokenize(
"++");
955 TMatrixD paramM(param.GetNrows(),1);
956 for (Int_t i=0; i<=array0->GetEntries(); i++){paramM(i,0)=param(i);}
958 if (filter.Length()==0){
961 for (Int_t i=0; i<array0->GetEntries(); i++){
963 TString str(array0->At(i)->GetName());
964 for (Int_t j=0; j<array1->GetEntries(); j++){
965 if (str.Contains(array1->At(j)->GetName())==0) isOK=kFALSE;
972 for (Int_t i=0; i<=array0->GetEntries(); i++){
973 param(i)=paramM(i,0);
984 TString result=Form(
"(%f",param[0]);
985 printf(
"%f\t%f\t\n", param[0], TMath::Sqrt(covar(0,0)));
986 for (Int_t i=0; i<array0->GetEntries(); i++){
987 TString str(array0->At(i)->GetName());
989 result+=Form(
"*(%f)",param[i+1]);
990 if (verbose)
printf(
"%f\t%f\t%s\n", param[i+1], TMath::Sqrt(covar(i+1,i+1)),str.Data());
997 TGraphErrors *
TStatToolkit::MakeGraphErrors(TTree *
tree,
const char * expr,
const char *
cut, Int_t mstyle, Int_t mcolor, Float_t msize, Float_t offset, Int_t drawEntries, Int_t firstEntry){
1004 const Int_t entries = tree->Draw(expr,cut,
"goff",drawEntries,firstEntry);
1007 ::Error(
"TStatToolkit::MakeGraphError",
"Empty or Not valid expression (%s) or cut *%s)", expr,cut);
1010 if ( tree->GetV2()==0){
1011 ::Error(
"TStatToolkit::MakeGraphError",
"Not valid expression (%s) ", expr);
1014 TGraphErrors * graph=0;
1015 if ( tree->GetV3()!=0){
1016 graph =
new TGraphErrors (entries, tree->GetV2(),tree->GetV1(),0,tree->GetV3());
1018 graph =
new TGraphErrors (entries, tree->GetV2(),tree->GetV1(),0,0);
1021 graph->SetMarkerStyle(mstyle);
1022 graph->SetMarkerColor(mcolor);
1023 graph->SetLineColor(mcolor);
1024 graph->SetTitle(expr);
1025 TString chstring(expr);
1026 TObjArray *charray = chstring.Tokenize(
":");
1027 graph->GetXaxis()->SetTitle(charray->At(1)->GetName());
1028 graph->GetYaxis()->SetTitle(charray->At(0)->GetName());
1029 THashList * metaData = (THashList*) tree->GetUserInfo()->FindObject(
"metaTable");
1030 if ( metaData != NULL){
1036 TString grTitle=charray->At(0)->GetName();
1037 if (nmdTitle0) grTitle=nmdTitle0->GetTitle();
1040 grTitle+=nmdTitle1->GetTitle();
1043 grTitle+=charray->At(1)->GetName();
1045 if (nmdYAxis) {graph->GetYaxis()->SetTitle(nmdYAxis->GetTitle());}
1046 if (nmdXAxis) {graph->GetXaxis()->SetTitle(nmdXAxis->GetTitle());}
1047 graph->SetTitle(grTitle.Data());
1050 if (msize>0) graph->SetMarkerSize(msize);
1051 for(Int_t i=0;i<graph->GetN();i++) graph->GetX()[i]+=offset;
1053 if (tree->GetVar(1)->IsString()){
1054 TAxis * axis = tree->GetHistogram()->GetXaxis();
1055 axis->Copy(*(graph->GetXaxis()));
1057 if (tree->GetVar(0)->IsString()){
1058 TAxis * axis = tree->GetHistogram()->GetYaxis();
1059 axis->Copy(*(graph->GetYaxis()));
1082 if (!tree)
return NULL;
1083 THashList * metaData = (THashList*) tree->GetUserInfo()->FindObject(
"metaTable");
1084 if (metaData == NULL){
1085 metaData=
new THashList;
1086 metaData->SetName(
"metaTable");
1087 tree->GetUserInfo()->AddLast(metaData);
1089 if (varTagName!=NULL && varTagValue!=NULL){
1092 metaData->AddLast(
new TNamed(varTagName,varTagValue));
1094 named->SetTitle(varTagValue);
1112 if (!tree)
return 0;
1113 TTree * treeMeta=
tree;
1115 THashList * metaData = (THashList*) treeMeta->GetUserInfo()->FindObject(
"metaTable");
1116 if (metaData == NULL){
1117 metaData=
new THashList;
1118 metaData->SetName(
"metaTable");
1119 tree->GetUserInfo()->AddLast(metaData);
1122 TNamed * named = (TNamed*)metaData->FindObject(varTagName);
1123 if (named || fullMatch)
return named;
1125 TString metaName(varTagName);
1126 Int_t nDots= metaName.CountChar(
'.');
1127 if (prefix!=NULL) *prefix=
"";
1130 TList *fList= treeMeta->GetListOfFriends();
1132 Int_t nFriends= fList->GetEntries();
1133 for (Int_t kf=0; kf<nFriends; kf++){
1134 TPRegexp regFriend(TString::Format(
"^%s.",fList->At(kf)->GetName()).Data());
1135 if (metaName.Contains(regFriend)){
1136 treeMeta=treeMeta->GetFriend(fList->At(kf)->GetName());
1137 regFriend.Substitute(metaName,
"");
1139 (*prefix)+=fList->At(kf)->GetName();
1145 if (nDots == metaName.CountChar(
'.'))
break;
1146 nDots=metaName.CountChar(
'.');
1150 named = (TNamed*)metaData->FindObject(metaName.Data());
1164 const Int_t entries = tree->Draw(expr,cut,
"goff");
1166 ::Error(
"TStatToolkit::MakeGraphSparse",
"Empty or Not valid expression (%s) or cut (%s)", expr, cut);
1170 Double_t *graphY, *graphX;
1171 graphY = tree->GetV1();
1172 graphX = tree->GetV2();
1175 Int_t *index =
new Int_t[entries*4];
1176 TMath::Sort(entries,graphX,index,kFALSE);
1179 Double_t *unsortedX =
new Double_t[entries];
1181 Double_t count = 0.5;
1186 unsortedX[index[0]] = count;
1187 runNumber[0] = graphX[index[0]];
1189 for(Int_t i=1;i<entries;i++)
1191 if(graphX[index[i]]==graphX[index[i-1]])
1192 unsortedX[index[i]] = count;
1193 else if(graphX[index[i]]!=graphX[index[i-1]]){
1196 unsortedX[index[i]] = count;
1197 runNumber[icount]=graphX[index[i]];
1202 const Int_t newNbins = int(count+0.5);
1203 Double_t *newBins =
new Double_t[newNbins+1];
1204 for(Int_t i=0; i<=count+1;i++){
1209 TGraph *graphNew = 0;
1210 if (tree->GetV3()) {
1211 if (tree->GetV4()) {
1212 graphNew =
new TGraphErrors(entries,unsortedX,graphY,tree->GetV4(),tree->GetV3());
1214 else { graphNew =
new TGraphErrors(entries,unsortedX,graphY,0,tree->GetV3()); }
1216 else { graphNew =
new TGraphErrors(entries,unsortedX,graphY,0,0); }
1218 graphNew->GetXaxis()->Set(newNbins,newBins);
1222 for(Int_t i=0;i<count;i++){
1223 snprintf(xName,50,
"%d",runNumber[i]);
1224 graphNew->GetXaxis()->SetBinLabel(i+1,xName);
1225 graphNew->GetX()[i]+=offset;
1227 if (tree->GetVar(1)->IsInteger() && strlen(tree->GetHistogram()->GetXaxis()->GetBinLabel(1))>0){
1228 for(Int_t i=0;i<count;i++){
1229 graphNew->GetXaxis()->SetBinLabel(i+1,tree->GetHistogram()->GetXaxis()->GetBinLabel(i+1));
1232 if (tree->GetVar(0)->IsInteger() && strlen(tree->GetHistogram()->GetXaxis()->GetBinLabel(1))>0 ){
1233 for(Int_t i=0;i<count;i++){
1234 graphNew->GetYaxis()->SetBinLabel(i+1,tree->GetHistogram()->GetYaxis()->GetBinLabel(i+1));
1238 graphNew->GetHistogram()->SetTitle(
"");
1239 graphNew->SetMarkerStyle(mstyle);
1240 graphNew->SetMarkerColor(mcolor); graphNew->SetLineColor(mcolor);
1241 if (msize>0) { graphNew->SetMarkerSize(msize); graphNew->SetLineWidth(msize); }
1242 delete [] unsortedX;
1247 TString chstring(expr);
1248 if (cut) chstring+=TString::Format(
" ( %s )", cut);
1249 graphNew->SetTitle(chstring);
1251 THashList * metaData = (THashList*) tree->GetUserInfo()->FindObject(
"metaTable");
1252 if (metaData != NULL){
1254 TObjArray *charray = chstring.Tokenize(
":");
1255 graphNew->GetXaxis()->SetTitle(charray->At(1)->GetName());
1256 graphNew->GetYaxis()->SetTitle(charray->At(0)->GetName());
1262 TString grTitle=charray->At(0)->GetName();
1263 if (nmdTitle0) grTitle=nmdTitle0->GetTitle();
1266 grTitle+=nmdTitle1->GetTitle();
1269 grTitle+=charray->At(1)->GetName();
1271 if (cut) grTitle+=TString::Format(
" ( %s )", cut);
1272 graphNew->SetTitle(grTitle);
1273 if (nmdYAxis) {graphNew->GetYaxis()->SetTitle(nmdYAxis->GetTitle());}
1274 if (nmdXAxis) {graphNew->GetXaxis()->SetTitle(nmdXAxis->GetTitle());}
1302 TMultiGraph *
TStatToolkit::MakeMultGraph(TTree *
tree,
const char *groupName,
const char* expr,
const char *
cut,
const char * styles,
const char *
colors, Bool_t drawSparse, Float_t msize, Float_t sigmaRange, TLegend * legend, Bool_t
comp){
1304 TMultiGraph *multiGraph=
new TMultiGraph(groupName,groupName);
1305 TObjArray * exprVars=TString(expr).Tokenize(
":");
1307 if (exprVars->GetEntries()<2) {
1308 ::Error(
"MakeMultGraph",
"NotValid expression %s",expr);
1313 TObjArray*exprVarErrArray=(exprVars->GetEntries()>2)? TString(exprVars->At(2)->GetName()).
Tokenize(
";"):0;
1314 TString cutString=(cut!=0)?cut:
"1";
1315 if (cutString.Length()==0) cutString=
"1";
1316 TObjArray*exprCutArray= cutString.Tokenize(
";");
1319 const char* markerstyles;
1320 const char* linestyles=0;
1322 if(TString(styles).Contains(
",")){
1323 TString styls=TString(styles).ReplaceAll(
" ",
"");
1324 TObjArray * stylarr=styls.Tokenize(
",");
1325 markerstyles=TString(stylarr->At(0)->GetName());
1326 linestyles=TString(stylarr->At(1)->GetName());
1328 else markerstyles = styles;
1331 const char* markercolors;
1332 const char* linecolors=0;
1334 if(TString(colors).Contains(
",")){
1335 TString cols=TString(colors).ReplaceAll(
" ",
"");
1337 markercolors=TString(colarr->At(0)->GetName());
1338 linecolors=TString(colarr->At(1)->GetName());
1340 else markercolors =
colors;
1343 Int_t notOK=(exprVarArray->GetEntries()<1 && exprCutArray->GetEntries()<2);
1344 if (exprVarErrArray) notOK+=2*(exprVarArray->GetEntriesFast()!=exprVarErrArray->GetEntriesFast());
1346 ::Error(
"MakeMultGraph",
"Not compatible arrays of variables:err variables or cuts - Problem %d", notOK);
1347 exprVarArray->Print();
1348 exprCutArray->Print();
1349 if (exprVarErrArray) exprVarErrArray->Print();
1353 Int_t nCuts= TMath::Max(exprCutArray->GetEntries()-1,1);
1354 Int_t nExpr= exprVarArray->GetEntries();
1355 Int_t ngraphs = nCuts*nExpr;
1356 Double_t minValue=1;
1357 Double_t maxValue=-1;
1358 TVectorF vecMean(ngraphs);
1359 Bool_t flag = kFALSE;
1360 for (Int_t iGraph=0; iGraph<ngraphs; iGraph++){
1363 Int_t iCut =iGraph%nCuts;
1364 Int_t iExpr=iGraph/nCuts;
1365 const char *expName=exprVarArray->At(iExpr)->GetName();
1366 const char *xName=exprVars->At(1)->GetName();
1367 const char *expErrName=(exprVarErrArray==NULL)? NULL:exprVarErrArray->At(iExpr)->GetName();
1368 TString cCut=exprCutArray->At(0)->GetName();
1371 cCut+=exprCutArray->At(iCut+1)->GetName();
1375 if (exprVarErrArray==NULL){
1381 if (exprVarErrArray==NULL){
1394 multiGraph->Add(gr);
1397 multiGraph->Add(gr,
"ap");
1399 multiGraph->Add(gr,
"p");
1403 Double_t meanT,rmsT=0;
1406 ::Error(
"MakeMultGraph",
"Not valid expression %s or cut %s - return",expName,cCut.Data());
1407 delete exprVarArray;
1408 delete exprVarErrArray;
1409 delete exprCutArray;
1413 ::Error(
"MakeMultGraph",
"Not valid sub-expression %s or cut %s - continue",expName,cCut.Data());
1421 meanT=TMath::Median(gr->GetN(), gr->GetY());
1422 rmsT=TMath::RMS(gr->GetN(), gr->GetY());
1424 if (maxValue<minValue){
1425 maxValue=meanT+sigmaRange*rmsT;
1426 minValue=meanT-sigmaRange*rmsT;
1428 vecMean[iGraph]=meanT;
1429 if (minValue>meanT-sigmaRange*rmsT) minValue=meanT-sigmaRange*rmsT;
1430 if (maxValue<meanT+sigmaRange*rmsT) maxValue=meanT+sigmaRange*rmsT;
1432 gr->SetName(expName);
1435 gr->SetTitle(named->GetTitle());
1437 gr->SetTitle(expName);
1440 TString legendName=
"";
1443 if (prefix.Length()>0){
1444 TString dummy=prefix+
".Legend";
1448 legendName+=prefix.Data();
1451 legendName+=named->GetTitle();
1459 legendName+=named->GetTitle();
1461 legendName=exprCutArray->At(iCut+1)->GetName();
1464 legend->AddEntry(gr,legendName,
"p");
1471 ::Error(
"Test::",
"Number of graphs 0 -return 0");
1472 delete exprVarArray;
1473 delete exprVarErrArray;
1478 Double_t rmsGraphs = TMath::RMS(ngraphs, vecMean.GetMatrixArray());
1479 minValue-=sigmaRange*rmsGraphs;
1480 maxValue+=sigmaRange*rmsGraphs;
1481 Double_t xmin=0,xmax=0;
1482 for (Int_t igr=0; igr<multiGraph->GetListOfGraphs()->GetSize(); igr++){
1483 TGraph*
gr = (TGraph*)(multiGraph->GetListOfGraphs()->At(igr));
1484 gr->SetMinimum(minValue);
1485 gr->SetMaximum(maxValue);
1487 xmin=gr->GetXaxis()->GetXmin();
1488 xmax=gr->GetXaxis()->GetXmax();
1490 if (xmin>gr->GetXaxis()->GetXmin()) xmin=gr->GetXaxis()->GetXmin();
1491 if (xmax<gr->GetXaxis()->GetXmax()) xmax=gr->GetXaxis()->GetXmax();
1494 for (Int_t igr=0; igr<multiGraph->GetListOfGraphs()->GetSize(); igr++) {
1495 TGraph *
gr = (TGraph *)(multiGraph->GetListOfGraphs()->At(igr));
1496 if (gr!=NULL) gr->GetXaxis()->SetLimits(xmin,xmax);
1498 multiGraph->SetMinimum(minValue);
1499 multiGraph->SetMaximum(maxValue);
1500 delete exprVarArray;
1501 delete exprVarErrArray;
1502 delete exprCutArray;
1512 static TPRegexp regAxis(
"^a");
1514 TList * grArray = graph->GetListOfGraphs();
1515 if (grArray==NULL)
return;
1516 TGraph * gr0=(TGraph*)(grArray->At(0));
1517 if (gr0==NULL)
return;
1519 Int_t ngr=grArray->GetEntries();
1520 TString option2(option);
1521 regAxis.Substitute(option2,
"");
1522 for (Int_t igr=1; igr<ngr; igr++){
1523 grArray->At(igr)->Draw(option2.Data());
1562 Int_t entries = tree->Draw(expr,cut,
"goff");
1564 printf(
"Expression or cut not valid:\t%s\t%s\n", expr, cut);
1568 TObjArray* oaAlias = TString(alias).Tokenize(
":");
1569 if (oaAlias->GetEntries()<2) {
1570 printf(
"Alias must have 2 arguments:\t%s\n", alias);
1573 Float_t entryFraction = atof( oaAlias->At(1)->GetName() );
1575 Double_t median = TMath::Median(entries,tree->GetV1());
1576 Double_t mean = TMath::Mean(entries,tree->GetV1());
1577 Double_t rms = TMath::RMS(entries,tree->GetV1());
1578 Double_t meanEF=0, rmsEF=0;
1581 tree->SetAlias(Form(
"%s_Median",oaAlias->At(0)->GetName()), Form(
"(%f+0)",median));
1582 tree->SetAlias(Form(
"%s_Mean",oaAlias->At(0)->GetName()), Form(
"(%f+0)",mean));
1583 tree->SetAlias(Form(
"%s_RMS",oaAlias->At(0)->GetName()), Form(
"(%f+0)",rms));
1584 tree->SetAlias(Form(
"%s_Mean%d",oaAlias->At(0)->GetName(),Int_t(entryFraction*100)), Form(
"(%f+0)",meanEF));
1585 tree->SetAlias(Form(
"%s_RMS%d",oaAlias->At(0)->GetName(),Int_t(entryFraction*100)), Form(
"(%f+0)",rmsEF));
1617 Int_t entries = tree->Draw(expr,cut,
"goff");
1619 printf(
"Expression or cut not valid:\t%s\t%s\n", expr, cut);
1623 TObjArray* oaVar = TString(expr).Tokenize(
":");
1625 snprintf(varname,50,
"%s", oaVar->At(0)->GetName());
1626 Float_t entryFraction = 0.8;
1628 TObjArray* oaAlias = TString(alias).Tokenize(
":");
1629 if (oaAlias->GetEntries()<2) {
1630 printf(
"Alias must have at least 2 arguments:\t%s\n", alias);
1633 else if (oaAlias->GetEntries()<3) {
1636 else entryFraction = atof( oaAlias->At(2)->GetName() );
1638 Double_t median = TMath::Median(entries,tree->GetV1());
1639 Double_t mean = TMath::Mean(entries,tree->GetV1());
1640 Double_t rms = TMath::RMS(entries,tree->GetV1());
1641 Double_t meanEF=0, rmsEF=0;
1644 TString sAlias( oaAlias->At(0)->GetName() );
1645 sAlias.ReplaceAll(
"varname",varname);
1646 sAlias.ReplaceAll(
"MeanEF", Form(
"Mean%1.0f",entryFraction*100) );
1647 sAlias.ReplaceAll(
"RMSEF", Form(
"RMS%1.0f",entryFraction*100) );
1648 TString sQuery( oaAlias->At(1)->GetName() );
1649 sQuery.ReplaceAll(
"varname",varname);
1650 sQuery.ReplaceAll(
"MeanEF", Form(
"%f",meanEF) );
1651 sQuery.ReplaceAll(
"RMSEF", Form(
"%f",rmsEF) );
1652 sQuery.ReplaceAll(
"Median", Form(
"%f",median) );
1653 sQuery.ReplaceAll(
"Mean", Form(
"%f",mean) );
1654 sQuery.ReplaceAll(
"RMS", Form(
"%f",rms) );
1655 printf(
"define alias:\t%s = %s\n", sAlias.Data(), sQuery.Data());
1659 snprintf(query,200,
"%s", sQuery.Data());
1660 snprintf(aname,200,
"%s", sAlias.Data());
1661 tree->SetAlias(aname, query);
1689 const char* aType[4]={
"Warning",
"Outlier",
"PhysAcc"};
1690 TObjArray *aTrendVars = sTrendVars.Tokenize(
";");
1691 Int_t entries= aTrendVars->GetEntries();
1692 const Int_t kMaxEntries=100;
1693 for (Int_t ientry=0; ientry<entries; ientry++){
1694 TString variables[kMaxEntries];
1698 if (descriptor->GetEntries()!=5){
1699 ::Error(
"makeAnchorAlias",
" Invalid status descriptor. %s has %d members instead of 5 (variable, deltaWarning,deltaError, PhysAcc) ",aTrendVars->At(ientry)->GetName(),descriptor->GetEntries());
1703 for (Int_t ivar=0; ivar<5; ivar++){
1704 variables[ivar]=descriptor->At(ivar)->GetName();
1706 TTreeFormula *form=
new TTreeFormula(
"dummy",descriptor->At(ivar)->GetName(),
tree);
1707 if (form->GetTree()==NULL){
1709 ::Error(
"makeAnchorAlias",
" Invalid element %d, %s in %s",ivar, descriptor->At(ivar)->GetName(),aTrendVars->At(ientry)->GetName());
1714 if (!isOK)
continue;
1715 for (Int_t itype=0; itype<3; itype++) {
1716 TString aName = TString::Format(
"absDiff.%s_%s", variables[0].Data(), aType[itype]);
1717 TString aValue =
"";
1719 aValue = TString::Format(
"abs(%s-%s)>%s", variables[0].Data(), variables[1].Data(),
1720 variables[2 + itype].Data());
1722 aValue = TString::Format(
"abs(%s-%s)<%s", variables[0].Data(), variables[1].Data(),
1723 variables[2 + itype].Data());
1725 tree->SetAlias(aName.Data(), aValue.Data());
1726 if ((doCheck & 2) > 0) {
1727 TTreeFormula *form =
new TTreeFormula(
"dummy", aName.Data(),
tree);
1728 if (form->GetTree() == NULL) {
1730 ::Error(
"makeAnchorAlias",
"Alias not valid \t%s\t%s", aName.Data(), aValue.Data());
1734 ::Info(
"makeAnchorAlias",
"SetAlias\t%s\t%s", aName.Data(), aValue.Data());
1737 TString aName = TString::Format(
"absDiff.%s_", variables[0].Data());
1738 tree->SetAlias((aName+
"WarningBand").Data(), (TString(
"1.*")+variables[2+0]).Data());
1739 tree->SetAlias((aName+
"OutlierBand").Data(), (TString(
"1.*")+variables[2+1]).Data());
1740 tree->SetAlias((aName+
"PhysAccBand").Data(), (TString(
"1.*")+variables[2+2]).Data());
1742 ::Info(
"makeAnchorAlias",
"SetAlias \t%s\t%s", (aName+
"WarningBand").Data(), variables[2+0].Data());
1763 const char* aType[3]={
"_Warning",
"_Outlier",
"_PhysAcc"};
1764 TObjArray *aTrendStatus = sCombinedStatus.Tokenize(
";");
1765 Int_t entries= aTrendStatus->GetEntries();
1766 const Int_t kMaxEntries=100;
1767 for (Int_t ientry=0; ientry<entries; ientry++){
1768 TString variables[kMaxEntries];
1770 TObjArray *descriptor=TString(aTrendStatus->At(ientry)->GetName()).
Tokenize(
",");
1772 Int_t nElems=descriptor->GetEntries();
1774 ::Error(
"makeCombinedAlias",
" Invalid combined status descriptor. Too few entries %d in status %s", nElems, aTrendStatus->At(ientry)->GetName());
1778 TString aliasName[3], aliasContent[3];
1779 for (Int_t ivar=0; ivar<nElems; ivar++){
1780 if ((doCheck&1)>0 &&ivar>0) {
1781 TTreeFormula *form=
new TTreeFormula(
"dummy",descriptor->At(ivar)->GetName(),
tree);
1782 isOK=form->GetTree()!=NULL;
1786 ::Error(
"makeCombinedAlias",
" Invalid element %d, %s in %s ",ivar, descriptor->At(ivar)->GetName(),aTrendStatus->At(ientry)->GetName());
1789 variables[ivar]=descriptor->At(ivar)->GetName();
1790 for (Int_t iType=0; iType<3; iType++){
1792 aliasName[iType]=descriptor->At(ivar)->GetName();
1793 aliasName[iType]+=aType[iType];
1796 if (ivar==1) aliasContent[iType]=
"(";
1797 aliasContent[iType]+=descriptor->At(ivar)->GetName();
1798 aliasContent[iType]+=aType[iType];
1799 if (ivar<nElems-1) aliasContent[iType]+=
"||";
1800 if (ivar==nElems-1) aliasContent[iType]+=
")";
1806 for (Int_t iType=0; iType<3; iType++){
1807 tree->SetAlias(aliasName[iType].Data(), aliasContent[iType].Data());
1809 ::Info(
"makeCombinedAlias",
"SetAlias\t%s\t%s", aliasName[iType].Data(),aliasContent[iType].Data());
1813 if (!isOK)
continue;
1816 delete aTrendStatus;
1859 TObjArray* oaVar = TString(expr).Tokenize(
":");
1860 if (oaVar->GetEntries()<2) {
1861 printf(
"Expression has to be of type 'varname:xaxis':\t%s\n", expr);
1866 snprintf(varname,50,
"%s", oaVar->At(0)->GetName());
1867 snprintf(var_x ,50,
"%s", oaVar->At(1)->GetName());
1869 TString sAlias(alias);
1870 sAlias.ReplaceAll(
"varname",varname);
1872 if (oaAlias->GetEntries()<2) {
1873 printf(
"Alias must have 2-6 arguments:\t%s\n", alias);
1877 TMultiGraph* multGr =
new TMultiGraph();
1878 Int_t marArr[6] = {24+igr%2, 20+igr%2, 20+igr%2, 20+igr%2, 20+igr%2, 20+igr%2};
1879 Int_t colArr[6] = {kBlack, kBlack, kOrange, kRed, kGreen+1, kBlue};
1880 Double_t sizeArr[6] = {1.4, 1.1, 1.5, 1.1, 1.4, 0.8};
1881 Double_t shiftArr[6] = {0., 0., 0.25, 0.25, -0.25, -0.25};
1882 const Int_t ngr = oaAlias->GetEntriesFast();
1883 for (Int_t i=0; i<ngr; i++){
1884 snprintf(query,200,
"%f*(%s-0.5):%s", 1.+igr, oaAlias->At(i)->GetName(), var_x);
1888 gr->SetName(oaAlias->At(i)->GetName());
1889 gr->SetTitle(oaAlias->At(i)->GetName());
1892 ::Error(
"MakeGraphSparse",
" returned with error -> returning");
1897 multGr->SetName(varname);
1898 multGr->SetTitle(varname);
1911 TCanvas* c1_clone = (TCanvas*) c1->Clone(
"c1_clone");
1915 TPad* pad1 =
new TPad(
"pad1",
"pad1", 0., padratio, 1., 1.);
1919 TPad* pad2 =
new TPad(
"pad2",
"pad2", 0., 0., 1., padratio);
1924 c1_clone->DrawClonePad();
1925 pad1->SetBottomMargin(0.001);
1926 pad1->SetRightMargin(0.01);
1930 pad2->SetTopMargin(0);
1931 pad2->SetBottomMargin(bottommargin);
1932 pad2->SetRightMargin(0.01);
1942 const Int_t nvars = oaMultGr->GetEntriesFast();
1943 TGraph* grAxis = (TGraph*) ((TMultiGraph*) oaMultGr->At(0))->GetListOfGraphs()->At(0);
1944 grAxis->SetMaximum(0.5*nvars+0.5);
1945 grAxis->SetMinimum(0);
1946 grAxis->GetYaxis()->SetLabelSize(0);
1947 grAxis->GetYaxis()->SetTitle(
"");
1948 grAxis->SetTitle(
"");
1949 Int_t entries = grAxis->GetN();
1950 grAxis->GetXaxis()->SetLabelSize(5.7*TMath::Min(TMath::Max(5./entries,0.01),0.03));
1951 grAxis->GetXaxis()->LabelsOption(
"v");
1955 for (Int_t i=0; i<nvars; i++){
1956 ((TMultiGraph*) oaMultGr->At(i))->
Draw(
"p");
1957 TLatex* ylabel =
new TLatex(-0.1, 0.5*i+0.5, ((TMultiGraph*) oaMultGr->At(i))->GetTitle());
1958 ylabel->SetTextAlign(32);
1959 ylabel->SetTextSize(0.025/gPad->GetHNDC());
1981 Bool_t needDeletion=kFALSE;
1982 if (oStatusGr->IsA() == TObjArray::Class()) {
1985 else if (oStatusGr->IsA() == TMultiGraph::Class()) {
1986 oaMultGr =
new TObjArray(); needDeletion=kTRUE;
1987 oaMultGr->Add((TMultiGraph*) oStatusGr);
1990 Printf(
"WriteStatusToTree(): Error! 'oStatusGr' must be a TMultiGraph or a TObjArray of them!");
1994 const int nvarsMax=10;
1995 const int ncritMax=5;
1997 Int_t treevars[nvarsMax*ncritMax];
1998 TString varnames[nvarsMax*ncritMax];
1999 for (
int i=0; i<nvarsMax*ncritMax; i++) treevars[i]=-1;
2001 Printf(
"WriteStatusToTree(): writing following variables to TTree (maybe only subset of listed criteria filled)");
2002 for (Int_t vari=0; vari<nvarsMax; vari++)
2004 if (vari < oaMultGr->GetEntriesFast()) {
2005 varnames[vari*ncritMax+0] = Form(
"%s_statisticOK", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2006 varnames[vari*ncritMax+1] = Form(
"%s_Warning", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2007 varnames[vari*ncritMax+2] = Form(
"%s_Outlier", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2008 varnames[vari*ncritMax+3] = Form(
"%s_PhysAcc", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2009 varnames[vari*ncritMax+4] = Form(
"%s_Extra", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2012 varnames[vari*ncritMax+0] = Form(
"dummy");
2013 varnames[vari*ncritMax+1] = Form(
"dummy");
2014 varnames[vari*ncritMax+2] = Form(
"dummy");
2015 varnames[vari*ncritMax+3] = Form(
"dummy");
2016 varnames[vari*ncritMax+4] = Form(
"dummy");
2018 cout <<
" " << varnames[vari*ncritMax+0].Data() <<
" " << varnames[vari*ncritMax+1].Data() <<
" " << varnames[vari*ncritMax+2].Data() <<
" " << varnames[vari*ncritMax+3].Data() <<
" " << varnames[vari*ncritMax+4].Data() << endl;
2021 TTree* statusTree =
new TTree(
"statusTree",
"statusTree");
2022 statusTree->Branch(
"run", ¤tRun );
2023 statusTree->Branch(varnames[ 0].Data(), &treevars[ 0]);
2024 statusTree->Branch(varnames[ 1].Data(), &treevars[ 1]);
2025 statusTree->Branch(varnames[ 2].Data(), &treevars[ 2]);
2026 statusTree->Branch(varnames[ 3].Data(), &treevars[ 3]);
2027 statusTree->Branch(varnames[ 4].Data(), &treevars[ 4]);
2028 statusTree->Branch(varnames[ 5].Data(), &treevars[ 5]);
2029 statusTree->Branch(varnames[ 6].Data(), &treevars[ 6]);
2030 statusTree->Branch(varnames[ 7].Data(), &treevars[ 7]);
2031 statusTree->Branch(varnames[ 8].Data(), &treevars[ 8]);
2032 statusTree->Branch(varnames[ 9].Data(), &treevars[ 9]);
2033 statusTree->Branch(varnames[10].Data(), &treevars[10]);
2034 statusTree->Branch(varnames[11].Data(), &treevars[11]);
2035 statusTree->Branch(varnames[12].Data(), &treevars[12]);
2036 statusTree->Branch(varnames[13].Data(), &treevars[13]);
2037 statusTree->Branch(varnames[14].Data(), &treevars[14]);
2038 statusTree->Branch(varnames[15].Data(), &treevars[15]);
2039 statusTree->Branch(varnames[16].Data(), &treevars[16]);
2040 statusTree->Branch(varnames[17].Data(), &treevars[17]);
2041 statusTree->Branch(varnames[18].Data(), &treevars[18]);
2042 statusTree->Branch(varnames[19].Data(), &treevars[19]);
2043 statusTree->Branch(varnames[20].Data(), &treevars[20]);
2044 statusTree->Branch(varnames[21].Data(), &treevars[21]);
2045 statusTree->Branch(varnames[22].Data(), &treevars[22]);
2046 statusTree->Branch(varnames[23].Data(), &treevars[23]);
2047 statusTree->Branch(varnames[24].Data(), &treevars[24]);
2048 statusTree->Branch(varnames[25].Data(), &treevars[25]);
2049 statusTree->Branch(varnames[26].Data(), &treevars[26]);
2050 statusTree->Branch(varnames[27].Data(), &treevars[27]);
2051 statusTree->Branch(varnames[28].Data(), &treevars[28]);
2052 statusTree->Branch(varnames[29].Data(), &treevars[29]);
2053 statusTree->Branch(varnames[30].Data(), &treevars[30]);
2054 statusTree->Branch(varnames[31].Data(), &treevars[31]);
2055 statusTree->Branch(varnames[32].Data(), &treevars[32]);
2056 statusTree->Branch(varnames[33].Data(), &treevars[33]);
2057 statusTree->Branch(varnames[34].Data(), &treevars[34]);
2058 statusTree->Branch(varnames[35].Data(), &treevars[35]);
2059 statusTree->Branch(varnames[36].Data(), &treevars[36]);
2060 statusTree->Branch(varnames[37].Data(), &treevars[37]);
2061 statusTree->Branch(varnames[38].Data(), &treevars[38]);
2062 statusTree->Branch(varnames[39].Data(), &treevars[39]);
2063 statusTree->Branch(varnames[40].Data(), &treevars[40]);
2064 statusTree->Branch(varnames[41].Data(), &treevars[41]);
2065 statusTree->Branch(varnames[42].Data(), &treevars[42]);
2066 statusTree->Branch(varnames[43].Data(), &treevars[43]);
2067 statusTree->Branch(varnames[44].Data(), &treevars[44]);
2068 statusTree->Branch(varnames[45].Data(), &treevars[45]);
2069 statusTree->Branch(varnames[46].Data(), &treevars[46]);
2070 statusTree->Branch(varnames[47].Data(), &treevars[47]);
2071 statusTree->Branch(varnames[48].Data(), &treevars[48]);
2072 statusTree->Branch(varnames[49].Data(), &treevars[49]);
2077 TList* arrRuns = (TList*) ((TGraph*) ((TMultiGraph*) oaMultGr->At(0))->GetListOfGraphs()->At(0))->GetXaxis()->GetLabels();
2079 for (Int_t runi=0; runi<arrRuns->GetSize(); runi++)
2081 currentRun = atoi( arrRuns->At(runi)->GetName() );
2085 for (Int_t vari=0; vari<oaMultGr->GetEntriesFast(); vari++)
2087 TMultiGraph* multGr = (TMultiGraph*) oaMultGr->At(vari);
2092 for (Int_t criti=1; criti<multGr->GetListOfGraphs()->GetEntries(); criti++)
2094 TGraph* grCriterion = (TGraph*) multGr->GetListOfGraphs()->At(criti);
2095 graphX = -1, graphY = -1;
2096 grCriterion->GetPoint(runi, graphX, graphY);
2097 treevars[(vari)*ncritMax+(criti-1)] = (graphY>0)?1:0;
2103 if (needDeletion)
delete oaMultGr;
2131 TObjArray * brArray = treeIn->GetListOfBranches();
2132 Int_t tEntries= treeIn->GetEntries();
2133 Int_t nBranches=brArray->GetEntries();
2134 TString treeName = treeIn->GetName();
2136 (*pcstream)<<treeName.Data()<<
"entries="<<tEntries;
2137 (*pcstream)<<treeName.Data()<<
"ID.="<<&sumID;
2140 for (Int_t iBr=0; iBr<nBranches; iBr++){
2141 TString brName= brArray->At(iBr)->GetName();
2142 Int_t entries=treeIn->Draw(TString::Format(
"%s>>dummy(10,0,1)",brArray->At(iBr)->GetName()).Data(),selection,
"goff");
2143 if (entries==0)
continue;
2144 Double_t median, mean, rms, mean60,rms60, mean90, rms90;
2145 mean = TMath::Mean(entries,treeIn->GetV1());
2146 median= TMath::Median(entries,treeIn->GetV1());
2147 rms = TMath::RMS(entries,treeIn->GetV1());
2148 TStatToolkit::EvaluateUni(entries, treeIn->GetV1(), mean60,rms60,TMath::Min(TMath::Max(2., 0.60*entries),Double_t(entries)));
2149 TStatToolkit::EvaluateUni(entries, treeIn->GetV1(), mean90,rms90,TMath::Min(TMath::Max(2., 0.90*entries),Double_t(entries)));
2150 valBranch(iBr,0)=mean;
2151 valBranch(iBr,1)=median;
2152 valBranch(iBr,2)=rms;
2153 valBranch(iBr,3)=mean60;
2154 valBranch(iBr,4)=rms60;
2155 valBranch(iBr,5)=mean90;
2156 valBranch(iBr,6)=rms90;
2157 (*pcstream)<<treeName.Data()<<
2158 brName+
"="<<valBranch(iBr,1)<<
2159 brName+
"_Mean="<<valBranch(iBr,0)<<
2160 brName+
"_Median="<<valBranch(iBr,1)<<
2161 brName+
"_RMS="<<valBranch(iBr,2)<<
2162 brName+
"_Mean60="<<valBranch(iBr,3)<<
2163 brName+
"_RMS60="<<valBranch(iBr,4)<<
2164 brName+
"_Mean90="<<valBranch(iBr,5)<<
2165 brName+
"_RMS90="<<valBranch(iBr,6);
2167 (*pcstream)<<treeName.Data()<<
"\n";
2182 TObjArray* oaVar = TString(expr).Tokenize(
":");
2183 if (oaVar->GetEntries()<2) {
2184 printf(
"Expression has to be of type 'varname:xaxis':\t%s\n", expr);
2189 snprintf(varname,50,
"%s", oaVar->At(0)->GetName());
2190 snprintf(var_x ,50,
"%s", oaVar->At(1)->GetName());
2192 TString sAlias(alias);
2193 if (sAlias.IsNull()) {
2194 sAlias =
"varname_OutlierMin:varname_OutlierMax:varname_WarningMin:varname_WarningMax:varname_PhysAccMin:varname_PhysAccMax:varname_RobustMean";
2196 sAlias.ReplaceAll(
"varname",varname);
2198 if (oaAlias->GetEntries()<2) {
2199 printf(
"Alias must have 2-7 arguments:\t%s\n", alias);
2203 TMultiGraph* multGr =
new TMultiGraph();
2204 Int_t colArr[7] = {kRed, kRed, kOrange, kOrange, kGreen+1, kGreen+1, kGray+2};
2205 const Int_t ngr = oaAlias->GetEntriesFast();
2206 for (Int_t i=0; i<ngr; i++){
2207 snprintf(query,200,
"%s:%s", oaAlias->At(i)->GetName(), var_x);
2211 multGr->SetName(varname);
2212 multGr->SetTitle(varname);
2236 TString drawStr(drawCommand);
2237 TString cutStr(cuts);
2241 ::Error(
"TStatToolkit::DrawHistogram",
"Tree pointer is NULL!");
2246 Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff");
2247 if (entries == -1) {
2248 ::Error(
"TStatToolkit::DrawHistogram",
"Tree draw returns -!");
2251 TObjArray *charray = drawStr.Tokenize(
":");
2254 if(tree->GetV1()) dim = 1;
2255 if(tree->GetV2()) dim = 2;
2256 if(tree->GetV3()) dim = 3;
2258 cerr<<
"TTree has more than 2 dimensions (not yet supported)"<<endl;
2264 Double_t mean1=0, rms1=0, min1=0, max1=0;
2265 Double_t mean2=0, rms2=0, min2=0, max2=0;
2266 Double_t mean3=0, rms3=0, min3=0, max3=0;
2281 hOut =
new TH1F(histoname, histotitle, 200, mean1-nsigma*rms1, mean1+nsigma*rms1);
2282 for (Int_t i=0; i<entries; i++) hOut->Fill(tree->GetV1()[i]);
2283 hOut->GetXaxis()->SetTitle(tree->GetHistogram()->GetXaxis()->GetTitle());
2286 hOut =
new TH2F(histoname, histotitle, 200, min2, max2,200, mean1-nsigma*rms1, mean1+nsigma*rms1);
2287 for (Int_t i=0; i<entries; i++) hOut->Fill(tree->GetV2()[i],tree->GetV1()[i]);
2288 hOut->GetXaxis()->SetTitle(tree->GetHistogram()->GetXaxis()->GetTitle());
2289 hOut->GetYaxis()->SetTitle(tree->GetHistogram()->GetYaxis()->GetTitle());
2291 THashList * metaData = (THashList*) tree->GetUserInfo()->FindObject(
"metaTable");
2293 if (metaData != NULL){
2299 TString hisTitle=charray->At(0)->GetName();
2300 if (nmdTitle0) hisTitle=nmdTitle0->GetTitle();
2303 hisTitle+=nmdTitle1->GetTitle();
2306 hisTitle+=charray->At(1)->GetName();
2308 if (nmdYAxis) {hOut->GetYaxis()->SetTitle(nmdYAxis->GetTitle());}
2309 if (nmdXAxis) {hOut->GetXaxis()->SetTitle(nmdXAxis->GetTitle());}
2310 hOut->SetTitle(hisTitle);
2322 TList * aliases = (TList*)tree->GetListOfAliases();
2323 Int_t entries = aliases->GetEntries();
2324 for (Int_t i=0; i<entries; i++){
2325 TObject *
object= aliases->At(i);
2326 if (!
object)
continue;
2327 Int_t ndraw=tree->Draw(aliases->At(i)->GetName(),
"1",
"goff",nCheck);
2329 ::Error(
"Alias:\tProblem",
"%s",aliases->At(i)->GetName());
2331 ::Info(
"Alias:\tOK",
"%s",aliases->At(i)->GetName());
2343 Int_t entries = tree->Draw(var,selection,
"goff");
2344 if (entries==0)
return 0;
2349 return entries*TMath::Mean(entries, tree->GetV1());
2351 return TMath::Mean(entries, tree->GetV1());
2353 return TMath::RMS(entries, tree->GetV1());
2355 return TMath::Median(entries, tree->GetV1());
2372 const Int_t numberOfDimensions = tree->GetPlayer()->GetDimension();
2373 if (numberOfDimensions==1) {
2374 values.Use(tree->GetSelectedRows(), tree->GetVal(0));
2378 const Int_t numberOfSelectedRows = tree->GetSelectedRows();
2379 values.ResizeTo(numberOfDimensions * numberOfSelectedRows);
2382 for (Int_t idim=0; idim<numberOfDimensions; ++idim) {
2383 const Double_t *arr = tree->GetVal(idim);
2386 for (Int_t ival=0; ival<numberOfSelectedRows; ++ival) {
2387 values.GetMatrixArray()[nfill++] = arr[ival];
2395 const Bool_t normaliseToEntries,
const Double_t pvalue)
2408 norm=values.Norm1();
2411 norm=TMath::Sqrt(values.Norm2Sqr());
2416 ::Error(
"TStatToolkit::GetDistance",
"Lp norm: p-value=%5.3g not valid. Only p-value>=1 is allowed", pvalue);
2420 for (Int_t ival=0; ival<values.GetNrows(); ++ival) {
2421 sum+=TMath::Power(TMath::Abs(values.GetMatrixArray()[ival]), pvalue);
2423 norm=TMath::Power(sum, 1./pvalue);
2427 norm=values.NormInf();
2432 for (Int_t ival=0; ival<values.GetNrows(); ++ival) {
2433 if (TMath::Abs(values.GetMatrixArray()[ival])>1e-30) ++
sum;
2439 if (normaliseToEntries && values.GetNrows()>0) {
2440 norm/=values.GetNrows();
2447 const Bool_t normaliseToEntries,
const Double_t pvalue)
2452 vecvalues.Use(size, values);
2453 return GetDistance(vecvalues, normType, normaliseToEntries, pvalue);
2458 const ENormType normType,
const Bool_t normaliseToEntries,
const Double_t pvalue)
2475 Int_t entries = tree->Draw(var,selection,
"goff");
2476 if (entries==0)
return 0.;
2480 return GetDistance(values, normType, normaliseToEntries, pvalue);
2525 static TF1 fgaus(
"fgaus",
"gaus",-10,10);
2526 const Double_t kMinEntries=50;
2527 Int_t ndim=histo->GetNdimensions();
2529 Double_t meanVector[ndim];
2530 Int_t binVector[ndim];
2531 Double_t centerVector[ndim];
2532 for (Int_t idim=0; idim<ndim; idim++) axis[idim]=idim;
2540 snprintf(tname, 100,
"%sDist",histo->GetName());
2545 Int_t axis1D[1]={0};
2546 Int_t dimProject = TMath::Nint(projectionInfo(iter,0));
2547 axis1D[0]=dimProject;
2548 TH1 *his1DFull = histo->Projection(dimProject);
2549 Double_t mean= his1DFull->GetMean();
2550 Double_t rms= his1DFull->GetRMS();
2551 Int_t entries= his1DFull->GetEntries();
2552 TString hname=
"his_";
2553 for (Int_t idim=0; idim<ndim; idim++) {hname+=
"_"; hname+=TMath::Nint(projectionInfo(idim,3));}
2554 Double_t meanG=0, rmsG=0, chi2G=0;
2555 if (entries>kMinEntries){
2556 fgaus.SetParameters(entries,mean,rms);
2557 his1DFull->Fit(&fgaus,
"qnr",
"qnr");
2558 meanG = fgaus.GetParameter(1);
2559 rmsG = fgaus.GetParameter(2);
2560 chi2G = fgaus.GetChisquare()/fgaus.GetNumberFreeParameters();
2563 static Int_t histoCounter=0;
2564 if ((histoCounter%dumpHisto)==0) his1DFull->Write(hname.Data());
2568 (*pcstream)<<tname<<
2569 "entries="<<entries<<
2576 for (Int_t idim=0; idim<ndim; idim++){
2578 TH1 *his1DAxis = histo->Projection(idim);
2579 meanVector[idim] = his1DAxis->GetMean();
2580 snprintf(aname, 100,
"%sMean=",histo->GetAxis(idim)->GetName());
2581 (*pcstream)<<tname<<
2582 aname<<meanVector[idim];
2585 for (Int_t iIter=0; iIter<ndim; iIter++){
2586 Int_t idim = TMath::Nint(projectionInfo(iIter,0));
2587 binVector[idim] = TMath::Nint(projectionInfo(iIter,3));
2588 centerVector[idim] = projectionInfo(iIter,4);
2589 snprintf(bname, 100,
"%sBin=",histo->GetAxis(idim)->GetName());
2590 snprintf(cname, 100,
"%sCenter=",histo->GetAxis(idim)->GetName());
2591 (*pcstream)<<tname<<
2592 bname<<binVector[idim]<<
2593 cname<<centerVector[idim];
2595 (*pcstream)<<tname<<
"\n";
2601 Int_t dimProject = TMath::Nint(projectionInfo(iter,0));
2602 Int_t groupProject = TMath::Nint(projectionInfo(iter,1));
2603 Int_t stepProject = TMath::Nint(projectionInfo(iter,2));
2604 if (stepProject<1) stepProject=1;
2605 Int_t nbins = histo->GetAxis(dimProject)->GetNbins();
2607 for (Int_t ibin=1; ibin<=nbins; ibin+=stepProject){
2608 if (iter>1 && verbose){
2609 for (Int_t idim=0; idim<ndim; idim++){
2610 printf(
"\t%d(%d,%d)",TMath::Nint(projectionInfo(idim,3)),TMath::Nint(projectionInfo(idim,0)),TMath::Nint(projectionInfo(idim,1) ));
2615 Int_t bin0=TMath::Max(ibin-groupProject,1);
2616 Int_t bin1=TMath::Min(ibin+groupProject,nbins);
2617 histo->GetAxis(dimProject)->SetRange(bin0,bin1);
2618 projectionInfo(iter,3)=ibin;
2619 projectionInfo(iter,4)=histo->GetAxis(dimProject)->GetBinCenter(ibin);
2620 Int_t iterProject=iter-1;
2664 const Double_t kMinEntries=30, kUseLLFrom=20;
2665 const Float_t kDumpHistoFraction = TString(gSystem->Getenv(
"gDumpHistoFraction")).Atof();
2670 Float_t fractionLTM[100]={0.8};
2671 TVectorF *vecLTM[100]={0};
2672 Int_t nestimators=1;
2673 if (estimators!=NULL){
2675 nestimators=array->GetEntries();
2676 for (Int_t iest=0; iest<nestimators; iest++){
2677 fractionLTM[iest]=TString(array->At(iest)->GetName()).Atof();
2680 for (Int_t iest=0; iest<nestimators; iest++) {
2681 vecLTM[iest]=
new TVectorF(10);
2682 (*(vecLTM[iest]))[9]= fractionLTM[iest];
2686 int ndim = histo->GetNdimensions();
2687 int nbins[ndim],idx[ndim],idxmin[ndim],idxmax[ndim],idxSav[ndim];
2688 for (
int id=0;
id<ndim;
id++) nbins[
id] = histo->GetAxis(
id)->GetNbins();
2690 int axOrd[ndim],binSt[ndim],binGr[ndim];
2691 for (
int i=0;i<ndim;i++) {
2692 axOrd[i] = TMath::Nint(projectionInfo(i,0));
2693 binGr[i] = TMath::Nint(projectionInfo(i,1));
2694 binSt[i] = TMath::Max(1,TMath::Nint(projectionInfo(i,2)));
2696 int tgtDim = axOrd[0],tgtStep=binSt[0],tgtNb=nbins[tgtDim],tgtNb1=tgtNb+1;
2697 double binY[tgtNb],binX[tgtNb],meanVector[ndim],centerVector[ndim];
2698 Int_t binVector[ndim];
2700 TAxis* xax = histo->GetAxis(tgtDim);
2701 for (
int i=tgtNb;i--;) binX[i] = xax->GetBinCenter(i+1);
2702 for (
int i=ndim;i--;) idx[i]=1;
2703 Bool_t grpOn = kFALSE;
2704 for (
int i=1;i<ndim;i++)
if (binGr[i]) grpOn = kTRUE;
2707 histo->GetListOfAxes()->Print();
2708 ULong64_t nfits = 1, fitCount=0;
2709 printf(
"index\tdim\t|\tnbins\tgrouping\tstep\tnfits\n");
2710 for (
int i=1;i<ndim;i++) {
2711 int idim = axOrd[i];
2712 nfits *= TMath::Max(1,nbins[idim]/binSt[idim]);
2713 printf(
"%d %d | %d %d %d %lld\n",i,idim,nbins[idim],binGr[idim], binSt[idim],nfits);
2715 printf(
"Expect %lld nfits\n",nfits);
2716 ULong64_t fitProgress = nfits/100;
2719 static TF1 fgaus(
"fgaus",
"gaus",-10,10);
2720 fgaus.SetRange(xax->GetXmin(),xax->GetXmax());
2722 TH1F* hfit =
new TH1F(
"hfit",
"hfit",tgtNb,xax->GetXmin(),xax->GetXmax());
2724 snprintf(tname, 100,
"%sDist",histo->GetName());
2727 int dimVar=1, dimVarID = axOrd[dimVar];
2732 double dimVarCen = histo->GetAxis(dimVarID)->GetBinCenter(idx[dimVarID]);
2735 memset(binY,0,tgtNb*
sizeof(
double));
2737 for (
int idim=1;idim<ndim;idim++) {
2738 int grp = binGr[idim];
2739 int idimR = axOrd[idim];
2740 idxSav[idimR]=idx[idimR];
2741 idxmax[idimR] = TMath::Min(idx[idimR]+grp,nbins[idimR]);
2742 idx[idimR] = idxmin[idimR] = TMath::Max(1,idx[idimR]-grp);
2745 meanVector[idimR] = 0;
2746 TAxis* ax = histo->GetAxis(idimR);
2748 for (
int k=idxmin[idimR];k<=idxmax[idimR];k++) meanVector[idimR] += ax->GetBinCenter(k);
2749 meanVector[idimR] /= (1+(grp<<1));
2751 else meanVector[idimR] = ax->GetBinCenter(idxSav[idimR]);
2755 for (
int i=0;i<ndim;i++)
if (i!=tgtDim)
printf(
"[D:%d]:%d ",i,idxSav[i]);
printf(
"\n");
2757 for (
int i=0;i<ndim;i++)
if (i!=tgtDim)
printf(
"[D:%d]:%d-%d ",i,idxmin[i],idxmax[i]);
printf(
"\n");
2762 int &it = idx[tgtDim];
2763 for (it=1;it<tgtNb1;it+=tgtStep) {
2764 binY[it-1] += histo->GetBinContent(idx);
2765 if (verbose>1) {
for (
int i=0;i<ndim;i++)
printf(
"%d ",idx[i]);
printf(
" | accumulation\n");}
2769 for (idim=1;idim<ndim;idim++) {
2770 int idimR = axOrd[idim];
2771 if ( (++idx[idimR]) > idxmax[idimR] ) idx[idimR]=idxmin[idimR];
2774 if (idim==ndim)
break;
2778 int &it = idx[tgtDim];
2779 for (it=1;it<tgtNb1;it+=tgtStep) {
2780 binY[it-1] = histo->GetBinContent(idx);
2784 for (
int idim=1;idim<ndim;idim++) {
2785 int idimR = axOrd[idim];
2786 meanVector[idimR] = histo->GetAxis(idimR)->GetBinCenter(idx[idimR]);
2789 if (grpOn)
for (
int i=ndim;i--;) idx[i]=idxSav[i];
2791 if (verbose>0) {
for (
int i=0;i<ndim;i++)
printf(
"%d ",idx[i]);
printf(
" | central bin fit\n");}
2794 float mean=0,mom2=0,rms=0,m3=0, m4=0, nrm=0,meanG=0,rmsG=0,chi2G=0,maxVal=0,entriesG=0,mean0=0, rms0=0, curt0=0;
2796 for (
int ip=tgtNb;ip--;) {
2798 hfit->SetBinContent(ip+1,binY[ip]);
2800 mean += binX[ip]*binY[ip];
2801 mom2 += binX[ip]*binX[ip]*binY[ip];
2802 if (maxVal<binY[ip]) maxVal = binY[ip];
2807 rms = mom2 - mean*mean;
2808 rms = rms>0 ? TMath::Sqrt(rms):0;
2814 Int_t nbins1D=hfit->GetNbinsX();
2815 Float_t binMedian=0;
2816 Double_t limits[2]={hfit->GetBinCenter(1), hfit->GetBinCenter(nbins1D)};
2818 for (Int_t iest=0; iest<nestimators; iest++){
2821 Double_t* integral=hfit->GetIntegral();
2822 for (Int_t i=1; i<nbins1D-1; i++){
2823 if (integral[i-1]<0.5 && integral[i]>=0.5){
2824 if (hfit->GetBinContent(i-1)+hfit->GetBinContent(i)>0){
2825 binMedian=hfit->GetBinCenter(i);
2826 Double_t dIdx=-(integral[i-1]-integral[i]);
2827 Double_t dx=(0.5+(0.5-integral[i])/dIdx)*hfit->GetBinWidth(i);
2831 if (integral[i-1]<fractionCut && integral[i]>=fractionCut){
2832 limits[0]=hfit->GetBinCenter(i-1)-hfit->GetBinWidth(i);
2834 if (integral[i]<1-fractionCut && integral[i+1]>=1-fractionCut){
2835 limits[1]=hfit->GetBinCenter(i+1)+hfit->GetBinWidth(i);
2839 if (nrm>5&&fractionCut>0 &&rms>0) {
2840 hfit->GetXaxis()->SetRangeUser(limits[0], limits[1]);
2841 mean=hfit->GetMean();
2843 if (nrm>0 && rms>0) {
2844 m3=hfit->GetSkewness();
2845 m4=hfit->GetKurtosis();
2847 fgaus.SetRange(limits[0]-rms, limits[1]+rms);
2849 fgaus.SetRange(xax->GetXmin(),xax->GetXmax());
2853 Bool_t isFitValid=kFALSE;
2854 if (nrm>=kMinEntries && rms>hfit->GetBinWidth(nbins1D)/TMath::Sqrt(12.)) {
2855 fgaus.SetParameters(nrm/(rms/hfit->GetBinWidth(nbins1D)),mean,rms);
2856 fgaus.SetParError(0,nrm/(rms/hfit->GetBinWidth(nbins1D)));
2857 fgaus.SetParError(1,rms);
2858 fgaus.SetParError(2,rms);
2860 TFitResultPtr fitPtr= hfit->Fit(&fgaus,maxVal<kUseLLFrom ?
"qnrlS":
"qnrS");
2862 entriesG = fgaus.GetParameter(0);
2863 meanG = fgaus.GetParameter(1);
2864 rmsG = fgaus.GetParameter(2);
2865 chi2G = fgaus.GetChisquare()/fgaus.GetNumberFreeParameters();
2866 TFitResult * result = fitPtr.Get();
2868 isFitValid = result->IsValid();
2873 if (nrm>=kMinEntries&& kDumpHistoFraction>0 && (gRandom->Rndm()<kDumpHistoFraction || isFitValid!=kTRUE)){
2877 (*pcstream)<<TString::Format(
"%sDump", tname).Data()<<
2879 "isFitValid="<<isFitValid<<
2887 "binMedian="<<binMedian<<
2888 "entriesG="<<entriesG<<
2891 "vecLTM.="<<vecLTM[0]<<
2893 for (Int_t iest=1; iest<nestimators; iest++)
2894 (*pcstream)<<TString::Format(
"%sDump", tname).Data()<<TString::Format(
"vecLTM%d.=",iest)<<vecLTM[iest];
2898 (*pcstream)<<tname<<
2900 "isFitValid="<<isFitValid<<
2907 "binMedian="<<binMedian<<
2908 "entriesG="<<entriesG<<
2911 "vecLTM.="<<vecLTM[0]<<
2913 for (Int_t iest=1; iest<nestimators; iest++)
2914 (*pcstream)<<tname<<TString::Format(
"vecLTM%d.=",iest)<<vecLTM[iest];
2918 meanVector[tgtDim] = mean;
2919 for (Int_t idim=0; idim<ndim; idim++){
2920 snprintf(aname, 100,
"%sMean=",histo->GetAxis(idim)->GetName());
2921 (*pcstream)<<tname<<
2922 aname<<meanVector[idim];
2925 for (Int_t iIter=0; iIter<ndim; iIter++){
2926 Int_t idim = axOrd[iIter];
2927 binVector[idim] = idx[idim];
2928 centerVector[idim] = histo->GetAxis(idim)->GetBinCenter(idx[idim]);
2929 snprintf(bname, 100,
"%sBin=",histo->GetAxis(idim)->GetName());
2930 snprintf(cname, 100,
"%sCenter=",histo->GetAxis(idim)->GetName());
2931 (*pcstream)<<tname<<
2932 bname<<binVector[idim]<<
2933 cname<<centerVector[idim];
2935 (*pcstream)<<TString::Format(
"%sDump", tname).Data()<<
2936 bname<<binVector[idim]<<
2937 cname<<centerVector[idim];
2940 (*pcstream)<<tname<<
"\n";
2941 if (hDump) (*pcstream)<<TString::Format(
"%sDump", tname).Data()<<
"\n";
2944 if ( fitProgress>0 && nfits>0) {
2945 if (((++fitCount)%fitProgress)==0) {
2946 printf(
"fit %lld %4.1f%% done\n",fitCount,100*
double(fitCount)/nfits);
2952 for (dimVar=1;dimVar<ndim;dimVar++) {
2953 dimVarID = axOrd[dimVar];
2954 if ( (idx[dimVarID]+=binSt[dimVar]) > nbins[dimVarID] ) idx[dimVarID]=1;
2957 if (dimVar==ndim)
break;
2989 if (graph0==NULL)
throw std::invalid_argument(
"RebinSparseGraph.graph0");
2990 if (graph1==NULL)
throw std::invalid_argument(
"RebinSparseGraph.graph1");
2991 TString opt = option;
2993 map<string,int> mapStrInt0, mapStrInt1;
2994 map<int,string> mapIntStr0, mapIntStr1;
2995 for (Int_t i=1; i<=graph0->GetXaxis()->GetNbins(); i++){
2996 mapStrInt0[graph0->GetXaxis()->GetBinLabel(i)]=i;
2997 mapIntStr0[i]=graph0->GetXaxis()->GetBinLabel(i);
2999 for (Int_t i=1; i<=graph1->GetXaxis()->GetNbins(); i++){
3000 mapStrInt1[graph1->GetXaxis()->GetBinLabel(i)]=i;
3001 mapIntStr1[i]=graph1->GetXaxis()->GetBinLabel(i);
3003 if (opt.Contains(
"merge")) {
3004 ::Error(
"Not supported option",
"%s",opt.Data());
3006 for (Int_t i=1; i<=graph0->GetXaxis()->GetNbins(); i++){
3007 Int_t indexNew=mapStrInt1[mapIntStr0[i]];
3008 Double_t offset=graph0->GetX()[i-1]-int(graph0->GetX()[i-1]);
3009 graph0->GetX()[i-1]=indexNew+offset-1;
3011 graph0->GetXaxis()->Set(graph1->GetXaxis()->GetNbins(),graph1->GetXaxis()->GetXbins()->GetArray());
3012 for (Int_t i=1; i<=graph0->GetXaxis()->GetNbins(); ++i){
3013 graph0->GetXaxis()->SetBinLabel(i,graph1->GetXaxis()->GetBinLabel(i));
3032 if (multiGraph==NULL)
throw std::invalid_argument(
"RebinSparseMultyGraph.multiGraph");
3033 if (multiGraph->GetListOfGraphs()==NULL)
throw std::invalid_argument(
"RebinSparseMultyGraph.multiGraph empty");
3034 if (graphRef==NULL) {
3035 graphRef=(TGraph*)multiGraph->GetListOfGraphs()->At(0);
3037 for (Int_t i=0; i<multiGraph->GetListOfGraphs()->GetEntries(); i++){
3040 }
catch(
const std::invalid_argument& error){
3041 ::Error(
"RebinSparseMultiGraph",
"%s",error.what());
3068 if (multiGraph == NULL)
throw std::invalid_argument(
"MakeSparseMultiGraphInt.multiGraph");
3069 map<int, int> intCounter;
3070 map<int, int> intMap;
3071 vector<int> valueArray;
3072 const TList *grArray = multiGraph->GetListOfGraphs();
3073 for (Int_t iGr = 0; iGr < grArray->GetEntries(); ++iGr) {
3074 TGraph *iGraph = (TGraph *) grArray->At(iGr);
3075 for (Int_t iPoint = 0; iPoint < iGraph->GetN(); ++iPoint) {
3076 Int_t value = TMath::Nint(iGraph->GetX()[iPoint]);
3077 intCounter[value]++;
3080 for (std::map<int, int>::iterator iterator = intCounter.begin(); iterator != intCounter.end(); iterator++)
3081 valueArray.push_back(iterator->first);
3082 std::sort(valueArray.begin(), valueArray.begin());
3084 for (UInt_t iValue = 0; iValue < valueArray.size(); iValue++) intMap[valueArray[iValue]] = iValue;
3086 for (Int_t iGr = 0; iGr < grArray->GetEntries(); ++iGr) {
3087 TGraph *iGraph = (TGraph *) grArray->At(iGr);
3088 iGraph->GetXaxis()->Set(valueArray.size(), 0, valueArray.size());
3089 for (UInt_t iValue = 0; iValue < valueArray.size(); iValue++)
3090 iGraph->GetXaxis()->SetBinLabel(iValue + 1, TString::Format(
"%d", valueArray[iValue]).Data());
3091 for (Int_t iPoint = 0; iPoint < iGraph->GetN(); ++iPoint) {
3092 iGraph->GetX()[iPoint] = intMap[TMath::Nint(iGraph->GetX()[iPoint]) + 0.5];
3095 if (multiGraph->GetXaxis()) {
3096 multiGraph->GetXaxis()->Set(valueArray.size(), 0, valueArray.size());
3097 for (UInt_t iValue = 0; iValue < valueArray.size(); iValue++)
3098 multiGraph->GetXaxis()->SetBinLabel(iValue + 1, TString::Format(
"%d", valueArray[iValue]).Data());
3110 if (histogram==NULL) histogram= tree->GetHistogram();
3111 if (histogram==NULL)
return -1;
3114 if (named) histogram->GetXaxis()->SetTitle(named->GetTitle());
3116 if (named) histogram->GetYaxis()->SetTitle(named->GetTitle());
3117 if (histogram->GetZaxis()){
3119 if (named) histogram->GetZaxis()->SetTitle(named->GetTitle());
3122 TPaletteAxis *palette = (TPaletteAxis*)histogram->GetListOfFunctions()->FindObject(
"palette");
3123 if (palette) palette->SetX2NDC(0.92);
3124 histogram->Draw(option.Data());
printf("Chi2/npoints = %f\n", TMath::Sqrt(chi2/npoints))
TTreeSRedirector * pcstream
strP3 Tokenize("+") -> Print()
static Int_t GetLineColor(const char *style, Int_t index)
static Int_t GetLineStyle(const char *style, Int_t index)
Int_t grp(UInt_t run, TString &gdc)
static void AddStamp(const char *sname, Int_t id0=-1, Int_t id1=-1, Int_t id2=-1, Int_t id3=-1)
class TVectorT< Double_t > TVectorD
static Int_t GetMarkerColor(const char *style, Int_t index)
static Int_t GetMarkerStyle(const char *style, Int_t index)
class TMatrixT< Double_t > TMatrixD