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)];
60 Double_t bestmean = 0;
61 Double_t bestsigma = (data[index[nvectors-1]]-data[index[0]]+1.);
62 bestsigma *=bestsigma;
64 for (Int_t i=0; i<hh; i++){
65 sumx += data[index[i]];
66 sumx2 += data[index[i]]*data[index[i]];
69 Double_t norm = 1./Double_t(hh);
70 Double_t norm2 = (hh-1)>0 ? 1./Double_t(hh-1):1;
71 for (Int_t i=hh; i<nvectors; i++){
72 Double_t cmean = sumx*norm;
73 Double_t csigma = (sumx2 - hh*cmean*cmean)*norm2;
74 if (csigma<bestsigma){
79 sumx += data[index[i]]-data[index[i-hh]];
80 sumx2 += data[index[i]]*data[index[i]]-data[index[i-hh]]*data[index[i-hh]];
83 Double_t bstd=factor*TMath::Sqrt(TMath::Abs(bestsigma));
100 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};
101 Int_t *index=
new Int_t[nvectors];
102 TMath::Sort(nvectors, data, index, kFALSE);
104 Int_t nquant = TMath::Min(Int_t(Double_t(((hh*1./nvectors)-0.5)*40))+1, 11);
105 Double_t factor = faclts[0];
108 factor = faclts[nquant-1];
115 Double_t bestmean = 0;
116 Double_t bestsigma = -1;
117 for (Int_t i=0; i<hh; i++){
118 sumx += data[index[i]];
119 sumx2 += data[index[i]]*data[index[i]];
122 Double_t kfactor = 2.*externalfactor - externalfactor*externalfactor;
123 Double_t norm = 1./Double_t(hh);
124 for (Int_t i=hh; i<nvectors; i++){
125 Double_t cmean = sumx*norm;
126 Double_t csigma = (sumx2*norm - cmean*cmean*kfactor);
127 if (csigma<bestsigma || bestsigma<0){
133 sumx += data[index[i]]-data[index[i-hh]];
134 sumx2 += data[index[i]]*data[index[i]]-data[index[i-hh]]*data[index[i-hh]];
137 Double_t bstd=factor*TMath::Sqrt(TMath::Abs(bestsigma));
146 , Int_t *outlist, Bool_t down)
153 Int_t * sindexS =
new Int_t[n];
154 Int_t * sindexF =
new Int_t[2*n];
155 for (Int_t i=0;i<n;i++) sindexS[i]=0;
156 for (Int_t i=0;i<2*n;i++) sindexF[i]=0;
158 TMath::Sort(n,inlist, sindexS, down);
159 Int_t last = inlist[sindexS[0]];
166 for(Int_t i=1;i<n; i++){
167 val = inlist[sindexS[i]];
168 if (last == val) sindexF[countPos]++;
171 sindexF[countPos+n] = val;
176 if (last==val) countPos++;
178 TMath::Sort(countPos, sindexF, sindexS, kTRUE);
179 for (Int_t i=0;i<countPos;i++){
180 outlist[2*i ] = sindexF[sindexS[i]+n];
181 outlist[2*i+1] = sindexF[sindexS[i]];
202 Int_t nbins = his1D->GetNbinsX();
203 TVectorD vectorH(nbins);
204 for (Int_t ibin=0; ibin<nbins; ibin++) vectorH[ibin]=his1D->GetBinContent(ibin+1);
205 for (Int_t ibin=0; ibin<nbins; ibin++) {
206 Int_t index0=ibin-nmedian;
207 Int_t index1=ibin+nmedian;
208 if (index0<0) {index1+=-index0; index0=0;}
209 if (index1>=nbins) {index0-=index1-nbins+1; index1=nbins-1;}
210 Double_t value= TMath::Median(index1-index0,&(vectorH.GetMatrixArray()[index0]));
211 his1D->SetBinContent(ibin+1, value);
228 Float_t binWidth = (xMax-xMin)/(Float_t)
nBins;
230 for (Int_t ibin=0; ibin<
nBins; ibin++){
231 Float_t entriesI = (Float_t)arr[ibin];
232 Double_t xcenter = xMin+(ibin+0.5)*binWidth;
234 meanCOG += xcenter*entriesI;
235 rms2COG += xcenter*entriesI*xcenter;
240 if ( sumCOG == 0 )
return xMin;
245 (*rms) = TMath::Sqrt(TMath::Abs(meanCOG*meanCOG-rms2COG));
246 if ( npoints == 1 ) (*rms) = binWidth/TMath::Sqrt(12);
273 Float_t *xTrue =
new Float_t[nhistos];
274 Float_t *sTrue =
new Float_t[nhistos];
275 TVectorD **par1 =
new TVectorD*[nhistos];
276 TVectorD **par2 =
new TVectorD*[nhistos];
280 TH1F **h1f =
new TH1F*[nhistos];
281 TF1 *myg =
new TF1(
"myg",
"gaus");
282 TF1 *
fit =
new TF1(
"fit",
"gaus");
286 for (Int_t i=0;i<nhistos; i++){
287 par1[i] =
new TVectorD(3);
288 par2[i] =
new TVectorD(3);
289 h1f[i] =
new TH1F(Form(
"h1f%d",i),Form(
"h1f%d",i),20,-10,10);
290 xTrue[i]= gRandom->Rndm();
292 sTrue[i]= .75+gRandom->Rndm()*.5;
293 myg->SetParameters(1,xTrue[i],sTrue[i]);
294 h1f[i]->FillRandom(
"myg");
300 for (Int_t i=0; i<nhistos; i++){
301 h1f[i]->Fit(fit,
"0q");
302 (*par1[i])(0) = fit->GetParameter(0);
303 (*par1[i])(1) = fit->GetParameter(1);
304 (*par1[i])(2) = fit->GetParameter(2);
312 for (Int_t i=0; i<nhistos; i++){
313 TStatToolkit::FitGaus(h1f[i]->GetArray()+1,h1f[i]->GetNbinsX(),h1f[i]->GetXaxis()->GetXmin(),h1f[i]->GetXaxis()->GetXmax(),par2[i],&dummy);
317 printf(
"Parabolic fit\t");
320 for (Int_t i=0;i<nhistos; i++){
321 Float_t xt = xTrue[i];
322 Float_t st = sTrue[i];
331 for (Int_t i=0;i<nhistos; i++){
355 TAxis * xaxis = his->GetXaxis();
356 TAxis * yaxis = his->GetYaxis();
358 Int_t nbinx = xaxis->GetNbins();
359 Int_t nbiny = yaxis->GetNbins();
362 TGraph2D *graph =
new TGraph2D(nbinx*nbiny);
364 for (Int_t ix=0; ix<nbinx;ix++)
365 for (Int_t iy=0; iy<nbiny;iy++){
366 Float_t xcenter = xaxis->GetBinCenter(ix);
367 Float_t ycenter = yaxis->GetBinCenter(iy);
368 snprintf(name,1000,
"%s_%d_%d",his->GetName(), ix,iy);
369 TH1 *projection = his->ProjectionZ(name,ix-delta0,ix+delta0,iy-delta1,iy+delta1);
371 if (type==0) stat = projection->GetMean();
372 if (type==1) stat = projection->GetRMS();
373 if (type==2 || type==3){
376 if (type==2) stat= vec[1];
377 if (type==3) stat= vec[0];
379 if (type==4|| type==5){
380 projection->Fit(&f1);
381 if (type==4) stat= f1.GetParameter(1);
382 if (type==5) stat= f1.GetParameter(2);
385 graph->SetPoint(icount,xcenter, ycenter, stat);
391 TGraphErrors *
TStatToolkit::MakeStat1D(TH2 * his, Int_t deltaBin, Double_t fraction, Int_t returnType, Int_t markerStyle, Int_t markerColor){
410 TAxis * xaxis = his->GetXaxis();
411 Int_t nbinx = xaxis->GetNbins();
415 TVectorD vecX(nbinx);
416 TVectorD vecXErr(nbinx);
417 TVectorD vecY(nbinx);
418 TVectorD vecYErr(nbinx);
423 for (Int_t jx=1; jx<=nbinx;jx++){
425 Float_t xcenter = xaxis->GetBinCenter(jx);
426 snprintf(name,1000,
"%s_%d",his->GetName(), ix);
427 TH1 *projection = his->ProjectionY(name,TMath::Max(jx-deltaBin,1),TMath::Min(jx+deltaBin,nbinx));
430 if (projection->Integral()==0) {
431 vecX[icount] = xcenter;
433 vecYErr[icount] = err;
442 stat = projection->GetMean();
443 err = projection->GetMeanError();
445 else if (returnType==1) {
446 stat = projection->GetRMS();
447 err = projection->GetRMSError();
449 else if (returnType==2 || returnType==3){
450 if (returnType==2) {stat= vecLTM[1]; err =projection->GetRMSError();}
451 if (returnType==3) {stat= vecLTM[2]; err =projection->GetRMSError();}
453 else if (returnType==4|| returnType==5){
454 f1.SetParameters(vecLTM[0], vecLTM[1], vecLTM[2]+0.05);
455 projection->Fit(&f1,
"QN",
"QN", vecLTM[7]-vecLTM[2], vecLTM[8]+vecLTM[2]);
457 stat= f1.GetParameter(1);
458 err=f1.GetParError(1);
461 stat= f1.GetParameter(2);
462 err=f1.GetParError(2);
465 else if (returnType==6) {
468 else if (returnType==7) {
469 const Int_t maxBin = projection->GetMaximumBin();
470 const Double_t max = projection->GetXaxis()->GetBinCenter(maxBin);
471 const Double_t
range = fraction*(projection->GetXaxis()->GetXmax()-projection->GetXaxis()->GetXmin());
472 f1.SetParameters(projection->GetMaximum(),
473 projection->GetMean(),
474 projection->GetRMS());
475 f1.SetRange(max-range, max+range);
476 projection->Fit(&f1,
"QN",
"QN", max-range, max+range);
477 stat= f1.GetParameter(1);
478 err=f1.GetParError(1);
481 vecX[icount]=xcenter;
487 TGraphErrors *graph =
new TGraphErrors(icount,vecX.GetMatrixArray(), vecY.GetMatrixArray(),0, vecYErr.GetMatrixArray());
488 graph->SetMarkerStyle(markerStyle);
489 graph->SetMarkerColor(markerColor);
496 const Int_t nbins1D=hist->GetNbinsX();
497 Double_t binMedian=0;
498 Double_t limits[2]={hist->GetBinCenter(1), hist->GetBinCenter(nbins1D)};
501 Double_t* integral=hist->GetIntegral();
502 for (Int_t i=1; i<nbins1D-1; i++){
503 if (integral[i-1]<0.5 && integral[i]>=0.5){
504 if (hist->GetBinContent(i-1)+hist->GetBinContent(i)>0){
505 binMedian=hist->GetBinCenter(i);
506 Double_t dIdx=-(integral[i-1]-integral[i]);
507 Double_t dx=(0.5+(0.5-integral[i])/dIdx)*hist->GetBinWidth(i);
511 if (integral[i-1]<fractionCut && integral[i]>=fractionCut){
512 limits[0]=hist->GetBinCenter(i-1)-hist->GetBinWidth(i);
514 if (integral[i]<1-fractionCut && integral[i+1]>=1-fractionCut){
515 limits[1]=hist->GetBinCenter(i+1)+hist->GetBinWidth(i);
523 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){
530 TString formulaStr(formula);
531 TString drawStr(drawCommand);
532 TString cutStr(cuts);
535 TString strVal(drawCommand);
536 if (strVal.Contains(
":")){
537 TObjArray* valTokens = strVal.Tokenize(
":");
538 drawStr = valTokens->At(0)->GetName();
539 ferr = valTokens->At(1)->GetName();
544 formulaStr.ReplaceAll(
"++",
"~");
545 TObjArray* formulaTokens = formulaStr.Tokenize(
"~");
546 Int_t dim = formulaTokens->GetEntriesFast();
548 fitParam.ResizeTo(dim);
549 covMatrix.ResizeTo(dim,dim);
551 TLinearFitter* fitter =
new TLinearFitter(dim+1, Form(
"hyp%d",dim));
552 fitter->StoreData(kTRUE);
553 fitter->ClearPoints();
555 Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start, start);
557 delete formulaTokens;
558 return new TString(TString::Format(
"ERROR expr: %s\t%s\tEntries==0",drawStr.Data(),cutStr.Data()));
560 Double_t **values =
new Double_t*[dim+1] ;
561 for (Int_t i=0; i<dim+1; i++) values[i]=NULL;
563 entries = tree->Draw(ferr.Data(), cutStr.Data(),
"goff", stop-start, start);
565 delete formulaTokens;
567 return new TString(TString::Format(
"ERROR error part: %s\t%s\tEntries==0",ferr.Data(),cutStr.Data()));
569 Double_t *
errors =
new Double_t[entries];
570 memcpy(errors, tree->GetV1(), entries*
sizeof(Double_t));
572 for (Int_t i = 0; i < dim + 1; i++){
574 if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(),
"goff", stop-start,start);
575 else centries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start,start);
577 if (entries != centries) {
580 return new TString(TString::Format(
"ERROR: %s\t%s\tEntries==%d\tEntries2=%d\n",drawStr.Data(),cutStr.Data(),entries,centries));
582 values[i] =
new Double_t[entries];
583 memcpy(values[i], tree->GetV1(), entries*
sizeof(Double_t));
587 for (Int_t i = 0; i < entries; i++){
589 for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
590 fitter->AddPoint(x, values[dim][i], errors[i]);
594 if (frac>0.5 && frac<1){
595 fitter->EvalRobust(frac);
598 fitter->FixParameter(0,0);
602 fitter->GetParameters(fitParam);
603 fitter->GetCovarianceMatrix(covMatrix);
604 chi2 = fitter->GetChisquare();
606 TString *preturnFormula =
new TString(Form(
"( %f+",fitParam[0])), &returnFormula = *preturnFormula;
608 for (Int_t iparam = 0; iparam < dim; iparam++) {
609 returnFormula.Append(Form(
"%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam+1]));
610 if (iparam < dim-1) returnFormula.Append(
"+");
612 returnFormula.Append(
" )");
615 for (Int_t j=0; j<dim+1;j++)
delete [] values[j];
618 delete formulaTokens;
622 return preturnFormula;
625 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){
632 TString formulaStr(formula);
633 TString drawStr(drawCommand);
634 TString cutStr(cuts);
637 TString strVal(drawCommand);
638 if (strVal.Contains(
":")){
639 TObjArray* valTokens = strVal.Tokenize(
":");
640 drawStr = valTokens->At(0)->GetName();
641 ferr = valTokens->At(1)->GetName();
646 formulaStr.ReplaceAll(
"++",
"~");
647 TObjArray* formulaTokens = formulaStr.Tokenize(
"~");
648 Int_t dim = formulaTokens->GetEntriesFast();
650 fitParam.ResizeTo(dim);
651 covMatrix.ResizeTo(dim,dim);
653 TLinearFitter* fitter =
new TLinearFitter(dim+1, Form(
"hyp%d",dim));
654 fitter->StoreData(kTRUE);
655 fitter->ClearPoints();
657 Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start, start);
659 delete formulaTokens;
660 return new TString(
"An ERROR has occured during fitting!");
662 Double_t **values =
new Double_t*[dim+1] ;
663 for (Int_t i=0; i<dim+1; i++) values[i]=NULL;
665 entries = tree->Draw(ferr.Data(), cutStr.Data(),
"goff", stop-start, start);
667 delete formulaTokens;
669 return new TString(
"An ERROR has occured during fitting!");
671 Double_t *
errors =
new Double_t[entries];
672 memcpy(errors, tree->GetV1(), entries*
sizeof(Double_t));
674 for (Int_t i = 0; i < dim + 1; i++){
676 if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(),
"goff", stop-start,start);
677 else centries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start,start);
679 if (entries != centries) {
682 delete formulaTokens;
683 return new TString(
"An ERROR has occured during fitting!");
685 values[i] =
new Double_t[entries];
686 memcpy(values[i], tree->GetV1(), entries*
sizeof(Double_t));
690 for (Int_t i = 0; i < entries; i++){
692 for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
693 fitter->AddPoint(x, values[dim][i], errors[i]);
696 for (Int_t i = 0; i < dim; i++){
698 for (Int_t j=0; j<dim;j++)
if (i!=j) x[j]=0;
700 fitter->AddPoint(x, 0, constrain);
706 if (frac>0.5 && frac<1){
707 fitter->EvalRobust(frac);
709 fitter->GetParameters(fitParam);
710 fitter->GetCovarianceMatrix(covMatrix);
711 chi2 = fitter->GetChisquare();
714 TString *preturnFormula =
new TString(Form(
"( %f+",fitParam[0])), &returnFormula = *preturnFormula;
716 for (Int_t iparam = 0; iparam < dim; iparam++) {
717 returnFormula.Append(Form(
"%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam+1]));
718 if (iparam < dim-1) returnFormula.Append(
"+");
720 returnFormula.Append(
" )");
722 for (Int_t j=0; j<dim+1;j++)
delete [] values[j];
726 delete formulaTokens;
730 return preturnFormula;
735 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){
742 TString formulaStr(formula);
743 TString drawStr(drawCommand);
744 TString cutStr(cuts);
747 TString strVal(drawCommand);
748 if (strVal.Contains(
":")){
749 TObjArray* valTokens = strVal.Tokenize(
":");
750 drawStr = valTokens->At(0)->GetName();
751 ferr = valTokens->At(1)->GetName();
756 formulaStr.ReplaceAll(
"++",
"~");
757 TObjArray* formulaTokens = formulaStr.Tokenize(
"~");
758 Int_t dim = formulaTokens->GetEntriesFast();
760 fitParam.ResizeTo(dim);
761 covMatrix.ResizeTo(dim,dim);
763 for (Int_t i=1; i<dim; i++) fitString+=Form(
"++x%d",i);
764 TLinearFitter* fitter =
new TLinearFitter(dim, fitString.Data());
765 fitter->StoreData(kTRUE);
766 fitter->ClearPoints();
768 Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start, start);
770 delete formulaTokens;
771 return new TString(
"An ERROR has occured during fitting!");
773 Double_t **values =
new Double_t*[dim+1] ;
774 for (Int_t i=0; i<dim+1; i++) values[i]=NULL;
776 entries = tree->Draw(ferr.Data(), cutStr.Data(),
"goff", stop-start, start);
779 delete formulaTokens;
780 return new TString(
"An ERROR has occured during fitting!");
782 Double_t *
errors =
new Double_t[entries];
783 memcpy(errors, tree->GetV1(), entries*
sizeof(Double_t));
785 for (Int_t i = 0; i < dim + 1; i++){
787 if (i < dim) centries = tree->Draw(((TObjString*)formulaTokens->At(i))->GetName(), cutStr.Data(),
"goff", stop-start,start);
788 else centries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff", stop-start,start);
790 if (entries != centries) {
793 delete formulaTokens;
794 return new TString(
"An ERROR has occured during fitting!");
796 values[i] =
new Double_t[entries];
797 memcpy(values[i], tree->GetV1(), entries*
sizeof(Double_t));
801 for (Int_t i = 0; i < entries; i++){
803 for (Int_t j=0; j<dim;j++) x[j]=values[j][i];
804 fitter->AddPoint(x, values[dim][i], errors[i]);
808 if (frac>0.5 && frac<1){
809 fitter->EvalRobust(frac);
811 fitter->GetParameters(fitParam);
812 fitter->GetCovarianceMatrix(covMatrix);
813 chi2 = fitter->GetChisquare();
816 TString *preturnFormula =
new TString(
"("), &returnFormula = *preturnFormula;
818 for (Int_t iparam = 0; iparam < dim; iparam++) {
819 returnFormula.Append(Form(
"%s*(%f)",((TObjString*)formulaTokens->At(iparam))->GetName(),fitParam[iparam]));
820 if (iparam < dim-1) returnFormula.Append(
"+");
822 returnFormula.Append(
" )");
825 for (Int_t j=0; j<dim+1;j++)
delete [] values[j];
827 delete formulaTokens;
831 return preturnFormula;
845 TObjArray *arrFit = fString.Tokenize(
"++");
846 TObjArray *arrSub = subString.Tokenize(
"++");
848 for (Int_t i=0; i<arrFit->GetEntries(); i++){
850 TString str =arrFit->At(i)->GetName();
851 for (Int_t isub=0; isub<arrSub->GetEntries(); isub++){
852 if (str.Contains(arrSub->At(isub)->GetName())==0) isOK=kFALSE;
867 TObjArray *array1= filter.Tokenize(
"++");
869 TString result=
"(0.0";
870 for (Int_t i=0; i<array0->GetEntries(); i++){
872 TString str(array0->At(i)->GetName());
873 for (Int_t j=0; j<array1->GetEntries(); j++){
874 if (str.Contains(array1->At(j)->GetName())==0) isOK=kFALSE;
878 result+=Form(
"*(%f)",param[i+1]);
879 printf(
"%f\t%f\t%s\n",param[i+1], TMath::Sqrt(covar(i+1,i+1)),str.Data());
895 const Int_t knMeas=1;
896 Int_t knElem=vecXk.GetNrows();
898 TMatrixD mat1(knElem,knElem);
899 TMatrixD matHk(1,knElem);
900 TMatrixD vecYk(knMeas,1);
901 TMatrixD matHkT(knElem,knMeas);
902 TMatrixD matSk(knMeas,knMeas);
903 TMatrixD matKk(knElem,knMeas);
904 TMatrixD covXk2(knElem,knElem);
905 TMatrixD covXk3(knElem,knElem);
909 measR(0,0)=sigma*sigma;
912 for (Int_t iel=0;iel<knElem;iel++)
913 for (Int_t ip=0;ip<knMeas;ip++) matHk(ip,iel)=0;
915 for (Int_t iel=0;iel<knElem;iel++) {
916 for (Int_t jel=0;jel<knElem;jel++) mat1(iel,jel)=0;
921 vecYk = vecZk-matHk*vecXk;
922 matHkT=matHk.T(); matHk.T();
923 matSk = (matHk*(covXk*matHkT))+measR;
925 matKk = (covXk*matHkT)*matSk;
926 vecXk += matKk*vecYk;
927 covXk2= (mat1-(matKk*matHk));
928 covXk3 = covXk2*covXk;
930 Int_t nrows=covXk3.GetNrows();
932 for (Int_t irow=0; irow<nrows; irow++)
933 for (Int_t icol=0; icol<nrows; icol++){
935 covXk(irow,icol)=(covXk3(irow,icol)+covXk3(icol,irow))*0.5;
941 void TStatToolkit::Constrain1D(
const TString &input,
const TString filter, TVectorD ¶m, TMatrixD & covar, Double_t mean, Double_t sigma){
951 TObjArray *array1= filter.Tokenize(
"++");
952 TMatrixD paramM(param.GetNrows(),1);
953 for (Int_t i=0; i<=array0->GetEntries(); i++){paramM(i,0)=param(i);}
955 if (filter.Length()==0){
958 for (Int_t i=0; i<array0->GetEntries(); i++){
960 TString str(array0->At(i)->GetName());
961 for (Int_t j=0; j<array1->GetEntries(); j++){
962 if (str.Contains(array1->At(j)->GetName())==0) isOK=kFALSE;
969 for (Int_t i=0; i<=array0->GetEntries(); i++){
970 param(i)=paramM(i,0);
981 TString result=Form(
"(%f",param[0]);
982 printf(
"%f\t%f\t\n", param[0], TMath::Sqrt(covar(0,0)));
983 for (Int_t i=0; i<array0->GetEntries(); i++){
984 TString str(array0->At(i)->GetName());
986 result+=Form(
"*(%f)",param[i+1]);
987 if (verbose)
printf(
"%f\t%f\t%s\n", param[i+1], TMath::Sqrt(covar(i+1,i+1)),str.Data());
994 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){
1001 const Int_t entries = tree->Draw(expr,cut,
"goff",drawEntries,firstEntry);
1004 ::Error(
"TStatToolkit::MakeGraphError",
"Empty or Not valid expression (%s) or cut *%s)", expr,cut);
1007 if ( tree->GetV2()==0){
1008 ::Error(
"TStatToolkit::MakeGraphError",
"Not valid expression (%s) ", expr);
1011 TGraphErrors * graph=0;
1012 if ( tree->GetV3()!=0){
1013 graph =
new TGraphErrors (entries, tree->GetV2(),tree->GetV1(),0,tree->GetV3());
1015 graph =
new TGraphErrors (entries, tree->GetV2(),tree->GetV1(),0,0);
1018 graph->SetMarkerStyle(mstyle);
1019 graph->SetMarkerColor(mcolor);
1020 graph->SetLineColor(mcolor);
1021 graph->SetTitle(expr);
1022 TString chstring(expr);
1023 TObjArray *charray = chstring.Tokenize(
":");
1024 graph->GetXaxis()->SetTitle(charray->At(1)->GetName());
1025 graph->GetYaxis()->SetTitle(charray->At(0)->GetName());
1026 THashList * metaData = (THashList*) tree->GetUserInfo()->FindObject(
"metaTable");
1027 if ( metaData != NULL){
1033 TString grTitle=charray->At(0)->GetName();
1034 if (nmdTitle0) grTitle=nmdTitle0->GetTitle();
1037 grTitle+=nmdTitle1->GetTitle();
1040 grTitle+=charray->At(1)->GetName();
1042 if (nmdYAxis) {graph->GetYaxis()->SetTitle(nmdYAxis->GetTitle());}
1043 if (nmdXAxis) {graph->GetXaxis()->SetTitle(nmdXAxis->GetTitle());}
1044 graph->SetTitle(grTitle.Data());
1047 if (msize>0) graph->SetMarkerSize(msize);
1048 for(Int_t i=0;i<graph->GetN();i++) graph->GetX()[i]+=offset;
1050 if (tree->GetVar(1)->IsString()){
1051 TAxis * axis = tree->GetHistogram()->GetXaxis();
1052 axis->Copy(*(graph->GetXaxis()));
1054 if (tree->GetVar(0)->IsString()){
1055 TAxis * axis = tree->GetHistogram()->GetYaxis();
1056 axis->Copy(*(graph->GetYaxis()));
1079 if (!tree)
return NULL;
1080 THashList * metaData = (THashList*) tree->GetUserInfo()->FindObject(
"metaTable");
1081 if (metaData == NULL){
1082 metaData=
new THashList;
1083 metaData->SetName(
"metaTable");
1084 tree->GetUserInfo()->AddLast(metaData);
1086 if (varTagName!=NULL && varTagValue!=NULL){
1089 metaData->AddLast(
new TNamed(varTagName,varTagValue));
1091 named->SetTitle(varTagValue);
1109 if (!tree)
return 0;
1110 TTree * treeMeta=
tree;
1112 THashList * metaData = (THashList*) treeMeta->GetUserInfo()->FindObject(
"metaTable");
1113 if (metaData == NULL){
1114 metaData=
new THashList;
1115 metaData->SetName(
"metaTable");
1116 tree->GetUserInfo()->AddLast(metaData);
1119 TNamed * named = (TNamed*)metaData->FindObject(varTagName);
1120 if (named || fullMatch)
return named;
1122 TString metaName(varTagName);
1123 Int_t nDots= metaName.CountChar(
'.');
1124 if (prefix!=NULL) *prefix=
"";
1127 TList *fList= treeMeta->GetListOfFriends();
1129 Int_t nFriends= fList->GetEntries();
1130 for (Int_t kf=0; kf<nFriends; kf++){
1131 TPRegexp regFriend(TString::Format(
"^%s.",fList->At(kf)->GetName()).Data());
1132 if (metaName.Contains(regFriend)){
1133 treeMeta=treeMeta->GetFriend(fList->At(kf)->GetName());
1134 regFriend.Substitute(metaName,
"");
1136 (*prefix)+=fList->At(kf)->GetName();
1142 if (nDots == metaName.CountChar(
'.'))
break;
1143 nDots=metaName.CountChar(
'.');
1147 named = (TNamed*)metaData->FindObject(metaName.Data());
1161 const Int_t entries = tree->Draw(expr,cut,
"goff");
1163 ::Error(
"TStatToolkit::MakeGraphSparse",
"Empty or Not valid expression (%s) or cut (%s)", expr, cut);
1167 Double_t *graphY, *graphX;
1168 graphY = tree->GetV1();
1169 graphX = tree->GetV2();
1172 Int_t *index =
new Int_t[entries*4];
1173 TMath::Sort(entries,graphX,index,kFALSE);
1176 Double_t *unsortedX =
new Double_t[entries];
1178 Double_t count = 0.5;
1183 unsortedX[index[0]] = count;
1184 runNumber[0] = graphX[index[0]];
1186 for(Int_t i=1;i<entries;i++)
1188 if(graphX[index[i]]==graphX[index[i-1]])
1189 unsortedX[index[i]] = count;
1190 else if(graphX[index[i]]!=graphX[index[i-1]]){
1193 unsortedX[index[i]] = count;
1194 runNumber[icount]=graphX[index[i]];
1199 const Int_t newNbins = int(count+0.5);
1200 Double_t *newBins =
new Double_t[newNbins+1];
1201 for(Int_t i=0; i<=count+1;i++){
1206 TGraph *graphNew = 0;
1207 if (tree->GetV3()) {
1208 if (tree->GetV4()) {
1209 graphNew =
new TGraphErrors(entries,unsortedX,graphY,tree->GetV4(),tree->GetV3());
1211 else { graphNew =
new TGraphErrors(entries,unsortedX,graphY,0,tree->GetV3()); }
1213 else { graphNew =
new TGraphErrors(entries,unsortedX,graphY,0,0); }
1215 graphNew->GetXaxis()->Set(newNbins,newBins);
1219 for(Int_t i=0;i<count;i++){
1220 snprintf(xName,50,
"%d",runNumber[i]);
1221 graphNew->GetXaxis()->SetBinLabel(i+1,xName);
1222 graphNew->GetX()[i]+=offset;
1224 if (tree->GetVar(1)->IsInteger() && strlen(tree->GetHistogram()->GetXaxis()->GetBinLabel(1))>0){
1225 for(Int_t i=0;i<count;i++){
1226 graphNew->GetXaxis()->SetBinLabel(i+1,tree->GetHistogram()->GetXaxis()->GetBinLabel(i+1));
1229 if (tree->GetVar(0)->IsInteger() && strlen(tree->GetHistogram()->GetXaxis()->GetBinLabel(1))>0 ){
1230 for(Int_t i=0;i<count;i++){
1231 graphNew->GetYaxis()->SetBinLabel(i+1,tree->GetHistogram()->GetYaxis()->GetBinLabel(i+1));
1235 graphNew->GetHistogram()->SetTitle(
"");
1236 graphNew->SetMarkerStyle(mstyle);
1237 graphNew->SetMarkerColor(mcolor); graphNew->SetLineColor(mcolor);
1238 if (msize>0) { graphNew->SetMarkerSize(msize); graphNew->SetLineWidth(msize); }
1239 delete [] unsortedX;
1244 TString chstring(expr);
1245 if (cut) chstring+=TString::Format(
" ( %s )", cut);
1246 graphNew->SetTitle(chstring);
1248 THashList * metaData = (THashList*) tree->GetUserInfo()->FindObject(
"metaTable");
1249 if (metaData != NULL){
1251 TObjArray *charray = chstring.Tokenize(
":");
1252 graphNew->GetXaxis()->SetTitle(charray->At(1)->GetName());
1253 graphNew->GetYaxis()->SetTitle(charray->At(0)->GetName());
1259 TString grTitle=charray->At(0)->GetName();
1260 if (nmdTitle0) grTitle=nmdTitle0->GetTitle();
1263 grTitle+=nmdTitle1->GetTitle();
1266 grTitle+=charray->At(1)->GetName();
1268 if (cut) grTitle+=TString::Format(
" ( %s )", cut);
1269 graphNew->SetTitle(grTitle);
1270 if (nmdYAxis) {graphNew->GetYaxis()->SetTitle(nmdYAxis->GetTitle());}
1271 if (nmdXAxis) {graphNew->GetXaxis()->SetTitle(nmdXAxis->GetTitle());}
1299 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){
1301 TMultiGraph *multiGraph=
new TMultiGraph(groupName,groupName);
1302 TObjArray * exprVars=TString(expr).Tokenize(
":");
1304 if (exprVars->GetEntries()<2) {
1305 ::Error(
"MakeMultGraph",
"NotValid expression %s",expr);
1310 TObjArray*exprVarErrArray=(exprVars->GetEntries()>2)? TString(exprVars->At(2)->GetName()).
Tokenize(
";"):0;
1311 TString cutString=(cut!=0)?cut:
"1";
1312 if (cutString.Length()==0) cutString=
"1";
1313 TObjArray*exprCutArray= cutString.Tokenize(
";");
1316 const char* markerstyles;
1317 const char* linestyles=0;
1319 if(TString(styles).Contains(
",")){
1320 TString styls=TString(styles).ReplaceAll(
" ",
"");
1321 TObjArray * stylarr=styls.Tokenize(
",");
1322 markerstyles=TString(stylarr->At(0)->GetName());
1323 linestyles=TString(stylarr->At(1)->GetName());
1325 else markerstyles = styles;
1328 const char* markercolors;
1329 const char* linecolors=0;
1331 if(TString(colors).Contains(
",")){
1332 TString cols=TString(colors).ReplaceAll(
" ",
"");
1334 markercolors=TString(colarr->At(0)->GetName());
1335 linecolors=TString(colarr->At(1)->GetName());
1337 else markercolors =
colors;
1340 Int_t notOK=(exprVarArray->GetEntries()<1 && exprCutArray->GetEntries()<2);
1341 if (exprVarErrArray) notOK+=2*(exprVarArray->GetEntriesFast()!=exprVarErrArray->GetEntriesFast());
1343 ::Error(
"MakeMultGraph",
"Not compatible arrays of variables:err variables or cuts - Problem %d", notOK);
1344 exprVarArray->Print();
1345 exprCutArray->Print();
1346 if (exprVarErrArray) exprVarErrArray->Print();
1350 Int_t nCuts= TMath::Max(exprCutArray->GetEntries()-1,1);
1351 Int_t nExpr= exprVarArray->GetEntries();
1352 Int_t ngraphs = nCuts*nExpr;
1353 Double_t minValue=1;
1354 Double_t maxValue=-1;
1355 TVectorF vecMean(ngraphs);
1356 Bool_t flag = kFALSE;
1357 for (Int_t iGraph=0; iGraph<ngraphs; iGraph++){
1360 Int_t iCut =iGraph%nCuts;
1361 Int_t iExpr=iGraph/nCuts;
1362 const char *expName=exprVarArray->At(iExpr)->GetName();
1363 const char *xName=exprVars->At(1)->GetName();
1364 const char *expErrName=(exprVarErrArray==NULL)? NULL:exprVarErrArray->At(iExpr)->GetName();
1365 TString cCut=exprCutArray->At(0)->GetName();
1368 cCut+=exprCutArray->At(iCut+1)->GetName();
1372 if (exprVarErrArray==NULL){
1378 if (exprVarErrArray==NULL){
1391 multiGraph->Add(gr);
1394 multiGraph->Add(gr,
"ap");
1396 multiGraph->Add(gr,
"p");
1400 Double_t meanT,rmsT=0;
1403 ::Error(
"MakeMultGraph",
"Not valid expression %s or cut %s - return",expName,cCut.Data());
1404 delete exprVarArray;
1405 delete exprVarErrArray;
1406 delete exprCutArray;
1410 ::Error(
"MakeMultGraph",
"Not valid sub-expression %s or cut %s - continue",expName,cCut.Data());
1418 meanT=TMath::Median(gr->GetN(), gr->GetY());
1419 rmsT=TMath::RMS(gr->GetN(), gr->GetY());
1421 if (maxValue<minValue){
1422 maxValue=meanT+sigmaRange*rmsT;
1423 minValue=meanT-sigmaRange*rmsT;
1425 vecMean[iGraph]=meanT;
1426 if (minValue>meanT-sigmaRange*rmsT) minValue=meanT-sigmaRange*rmsT;
1427 if (maxValue<meanT+sigmaRange*rmsT) maxValue=meanT+sigmaRange*rmsT;
1429 gr->SetName(expName);
1432 gr->SetTitle(named->GetTitle());
1434 gr->SetTitle(expName);
1437 TString legendName=
"";
1440 if (prefix.Length()>0){
1441 TString dummy=prefix+
".Legend";
1445 legendName+=prefix.Data();
1448 legendName+=named->GetTitle();
1456 legendName+=named->GetTitle();
1458 legendName=exprCutArray->At(iCut+1)->GetName();
1461 legend->AddEntry(gr,legendName,
"p");
1468 ::Error(
"Test::",
"Number of graphs 0 -return 0");
1469 delete exprVarArray;
1470 delete exprVarErrArray;
1475 Double_t rmsGraphs = TMath::RMS(ngraphs, vecMean.GetMatrixArray());
1476 minValue-=sigmaRange*rmsGraphs;
1477 maxValue+=sigmaRange*rmsGraphs;
1478 Double_t xmin=0,xmax=0;
1479 for (Int_t igr=0; igr<multiGraph->GetListOfGraphs()->GetSize(); igr++){
1480 TGraph*
gr = (TGraph*)(multiGraph->GetListOfGraphs()->At(igr));
1481 gr->SetMinimum(minValue);
1482 gr->SetMaximum(maxValue);
1484 xmin=gr->GetXaxis()->GetXmin();
1485 xmax=gr->GetXaxis()->GetXmax();
1487 if (xmin>gr->GetXaxis()->GetXmin()) xmin=gr->GetXaxis()->GetXmin();
1488 if (xmax<gr->GetXaxis()->GetXmax()) xmax=gr->GetXaxis()->GetXmax();
1491 for (Int_t igr=0; igr<multiGraph->GetListOfGraphs()->GetSize(); igr++) {
1492 TGraph *
gr = (TGraph *)(multiGraph->GetListOfGraphs()->At(igr));
1493 if (gr!=NULL) gr->GetXaxis()->SetLimits(xmin,xmax);
1495 multiGraph->SetMinimum(minValue);
1496 multiGraph->SetMaximum(maxValue);
1497 delete exprVarArray;
1498 delete exprVarErrArray;
1499 delete exprCutArray;
1509 static TPRegexp regAxis(
"^a");
1511 TList * grArray = graph->GetListOfGraphs();
1512 if (grArray==NULL)
return;
1513 TGraph * gr0=(TGraph*)(grArray->At(0));
1514 if (gr0==NULL)
return;
1516 Int_t ngr=grArray->GetEntries();
1517 TString option2(option);
1518 regAxis.Substitute(option2,
"");
1519 for (Int_t igr=1; igr<ngr; igr++){
1520 grArray->At(igr)->Draw(option2.Data());
1559 Int_t entries = tree->Draw(expr,cut,
"goff");
1561 printf(
"Expression or cut not valid:\t%s\t%s\n", expr, cut);
1565 TObjArray* oaAlias = TString(alias).Tokenize(
":");
1566 if (oaAlias->GetEntries()<2) {
1567 printf(
"Alias must have 2 arguments:\t%s\n", alias);
1570 Float_t entryFraction = atof( oaAlias->At(1)->GetName() );
1572 Double_t median = TMath::Median(entries,tree->GetV1());
1573 Double_t mean = TMath::Mean(entries,tree->GetV1());
1574 Double_t rms = TMath::RMS(entries,tree->GetV1());
1575 Double_t meanEF=0, rmsEF=0;
1578 tree->SetAlias(Form(
"%s_Median",oaAlias->At(0)->GetName()), Form(
"(%f+0)",median));
1579 tree->SetAlias(Form(
"%s_Mean",oaAlias->At(0)->GetName()), Form(
"(%f+0)",mean));
1580 tree->SetAlias(Form(
"%s_RMS",oaAlias->At(0)->GetName()), Form(
"(%f+0)",rms));
1581 tree->SetAlias(Form(
"%s_Mean%d",oaAlias->At(0)->GetName(),Int_t(entryFraction*100)), Form(
"(%f+0)",meanEF));
1582 tree->SetAlias(Form(
"%s_RMS%d",oaAlias->At(0)->GetName(),Int_t(entryFraction*100)), Form(
"(%f+0)",rmsEF));
1614 Int_t entries = tree->Draw(expr,cut,
"goff");
1616 printf(
"Expression or cut not valid:\t%s\t%s\n", expr, cut);
1620 TObjArray* oaVar = TString(expr).Tokenize(
":");
1622 snprintf(varname,50,
"%s", oaVar->At(0)->GetName());
1623 Float_t entryFraction = 0.8;
1625 TObjArray* oaAlias = TString(alias).Tokenize(
":");
1626 if (oaAlias->GetEntries()<2) {
1627 printf(
"Alias must have at least 2 arguments:\t%s\n", alias);
1630 else if (oaAlias->GetEntries()<3) {
1633 else entryFraction = atof( oaAlias->At(2)->GetName() );
1635 Double_t median = TMath::Median(entries,tree->GetV1());
1636 Double_t mean = TMath::Mean(entries,tree->GetV1());
1637 Double_t rms = TMath::RMS(entries,tree->GetV1());
1638 Double_t meanEF=0, rmsEF=0;
1641 TString sAlias( oaAlias->At(0)->GetName() );
1642 sAlias.ReplaceAll(
"varname",varname);
1643 sAlias.ReplaceAll(
"MeanEF", Form(
"Mean%1.0f",entryFraction*100) );
1644 sAlias.ReplaceAll(
"RMSEF", Form(
"RMS%1.0f",entryFraction*100) );
1645 TString sQuery( oaAlias->At(1)->GetName() );
1646 sQuery.ReplaceAll(
"varname",varname);
1647 sQuery.ReplaceAll(
"MeanEF", Form(
"%f",meanEF) );
1648 sQuery.ReplaceAll(
"RMSEF", Form(
"%f",rmsEF) );
1649 sQuery.ReplaceAll(
"Median", Form(
"%f",median) );
1650 sQuery.ReplaceAll(
"Mean", Form(
"%f",mean) );
1651 sQuery.ReplaceAll(
"RMS", Form(
"%f",rms) );
1652 printf(
"define alias:\t%s = %s\n", sAlias.Data(), sQuery.Data());
1656 snprintf(query,200,
"%s", sQuery.Data());
1657 snprintf(aname,200,
"%s", sAlias.Data());
1658 tree->SetAlias(aname, query);
1686 const char* aType[4]={
"Warning",
"Outlier",
"PhysAcc"};
1687 TObjArray *aTrendVars = sTrendVars.Tokenize(
";");
1688 Int_t entries= aTrendVars->GetEntries();
1689 const Int_t kMaxEntries=100;
1690 for (Int_t ientry=0; ientry<entries; ientry++){
1691 TString variables[kMaxEntries];
1695 if (descriptor->GetEntries()!=5){
1696 ::Error(
"makeAnchorAlias",
" Invalid status descriptor. %s has %d members instead of 5 (variable, deltaWarning,deltaError, PhysAcc) ",aTrendVars->At(ientry)->GetName(),descriptor->GetEntries());
1700 for (Int_t ivar=0; ivar<5; ivar++){
1701 variables[ivar]=descriptor->At(ivar)->GetName();
1703 TTreeFormula *form=
new TTreeFormula(
"dummy",descriptor->At(ivar)->GetName(),
tree);
1704 if (form->GetTree()==NULL){
1706 ::Error(
"makeAnchorAlias",
" Invalid element %d, %s in %s",ivar, descriptor->At(ivar)->GetName(),aTrendVars->At(ientry)->GetName());
1711 if (!isOK)
continue;
1712 for (Int_t itype=0; itype<3; itype++) {
1713 TString aName = TString::Format(
"absDiff.%s_%s", variables[0].Data(), aType[itype]);
1714 TString aValue =
"";
1716 aValue = TString::Format(
"abs(%s-%s)>%s", variables[0].Data(), variables[1].Data(),
1717 variables[2 + itype].Data());
1719 aValue = TString::Format(
"abs(%s-%s)<%s", variables[0].Data(), variables[1].Data(),
1720 variables[2 + itype].Data());
1722 tree->SetAlias(aName.Data(), aValue.Data());
1723 if ((doCheck & 2) > 0) {
1724 TTreeFormula *form =
new TTreeFormula(
"dummy", aName.Data(),
tree);
1725 if (form->GetTree() == NULL) {
1727 ::Error(
"makeAnchorAlias",
"Alias not valid \t%s\t%s", aName.Data(), aValue.Data());
1731 ::Info(
"makeAnchorAlias",
"SetAlias\t%s\t%s", aName.Data(), aValue.Data());
1734 TString aName = TString::Format(
"absDiff.%s_", variables[0].Data());
1735 tree->SetAlias((aName+
"WarningBand").Data(), (TString(
"1.*")+variables[2+0]).Data());
1736 tree->SetAlias((aName+
"OutlierBand").Data(), (TString(
"1.*")+variables[2+1]).Data());
1737 tree->SetAlias((aName+
"PhysAccBand").Data(), (TString(
"1.*")+variables[2+2]).Data());
1739 ::Info(
"makeAnchorAlias",
"SetAlias \t%s\t%s", (aName+
"WarningBand").Data(), variables[2+0].Data());
1760 const char* aType[3]={
"_Warning",
"_Outlier",
"_PhysAcc"};
1761 TObjArray *aTrendStatus = sCombinedStatus.Tokenize(
";");
1762 Int_t entries= aTrendStatus->GetEntries();
1763 const Int_t kMaxEntries=100;
1764 for (Int_t ientry=0; ientry<entries; ientry++){
1765 TString variables[kMaxEntries];
1767 TObjArray *descriptor=TString(aTrendStatus->At(ientry)->GetName()).
Tokenize(
",");
1769 Int_t nElems=descriptor->GetEntries();
1771 ::Error(
"makeCombinedAlias",
" Invalid combined status descriptor. Too few entries %d in status %s", nElems, aTrendStatus->At(ientry)->GetName());
1775 TString aliasName[3], aliasContent[3];
1776 for (Int_t ivar=0; ivar<nElems; ivar++){
1777 if ((doCheck&1)>0 &&ivar>0) {
1778 TTreeFormula *form=
new TTreeFormula(
"dummy",descriptor->At(ivar)->GetName(),
tree);
1779 isOK=form->GetTree()!=NULL;
1783 ::Error(
"makeCombinedAlias",
" Invalid element %d, %s in %s ",ivar, descriptor->At(ivar)->GetName(),aTrendStatus->At(ientry)->GetName());
1786 variables[ivar]=descriptor->At(ivar)->GetName();
1787 for (Int_t iType=0; iType<3; iType++){
1789 aliasName[iType]=descriptor->At(ivar)->GetName();
1790 aliasName[iType]+=aType[iType];
1793 if (ivar==1) aliasContent[iType]=
"(";
1794 aliasContent[iType]+=descriptor->At(ivar)->GetName();
1795 aliasContent[iType]+=aType[iType];
1796 if (ivar<nElems-1) aliasContent[iType]+=
"||";
1797 if (ivar==nElems-1) aliasContent[iType]+=
")";
1803 for (Int_t iType=0; iType<3; iType++){
1804 tree->SetAlias(aliasName[iType].Data(), aliasContent[iType].Data());
1806 ::Info(
"makeCombinedAlias",
"SetAlias\t%s\t%s", aliasName[iType].Data(),aliasContent[iType].Data());
1810 if (!isOK)
continue;
1813 delete aTrendStatus;
1856 TObjArray* oaVar = TString(expr).Tokenize(
":");
1857 if (oaVar->GetEntries()<2) {
1858 printf(
"Expression has to be of type 'varname:xaxis':\t%s\n", expr);
1863 snprintf(varname,50,
"%s", oaVar->At(0)->GetName());
1864 snprintf(var_x ,50,
"%s", oaVar->At(1)->GetName());
1866 TString sAlias(alias);
1867 sAlias.ReplaceAll(
"varname",varname);
1869 if (oaAlias->GetEntries()<2) {
1870 printf(
"Alias must have 2-6 arguments:\t%s\n", alias);
1874 TMultiGraph* multGr =
new TMultiGraph();
1875 Int_t marArr[6] = {24+igr%2, 20+igr%2, 20+igr%2, 20+igr%2, 20+igr%2, 20+igr%2};
1876 Int_t colArr[6] = {kBlack, kBlack, kOrange, kRed, kGreen+1, kBlue};
1877 Double_t sizeArr[6] = {1.4, 1.1, 1.5, 1.1, 1.4, 0.8};
1878 Double_t shiftArr[6] = {0., 0., 0.25, 0.25, -0.25, -0.25};
1879 const Int_t ngr = oaAlias->GetEntriesFast();
1880 for (Int_t i=0; i<ngr; i++){
1881 snprintf(query,200,
"%f*(%s-0.5):%s", 1.+igr, oaAlias->At(i)->GetName(), var_x);
1885 gr->SetName(oaAlias->At(i)->GetName());
1886 gr->SetTitle(oaAlias->At(i)->GetName());
1889 ::Error(
"TStatToolkit::MakeStatusMultGr",
"MakeGraphSparse() returned with error when called with the following query: %s",query);
1894 multGr->SetName(varname);
1895 multGr->SetTitle(varname);
1908 TCanvas* c1_clone = (TCanvas*) c1->Clone(
"c1_clone");
1912 TPad* pad1 =
new TPad(
"pad1",
"pad1", 0., padratio, 1., 1.);
1916 TPad* pad2 =
new TPad(
"pad2",
"pad2", 0., 0., 1., padratio);
1921 c1_clone->DrawClonePad();
1922 pad1->SetBottomMargin(0.001);
1923 pad1->SetRightMargin(0.01);
1927 pad2->SetTopMargin(0);
1928 pad2->SetBottomMargin(bottommargin);
1929 pad2->SetRightMargin(0.01);
1939 const Int_t nvars = oaMultGr->GetEntriesFast();
1940 TGraph* grAxis = (TGraph*) ((TMultiGraph*) oaMultGr->At(0))->GetListOfGraphs()->At(0);
1941 grAxis->SetMaximum(0.5*nvars+0.5);
1942 grAxis->SetMinimum(0);
1943 grAxis->GetYaxis()->SetLabelSize(0);
1944 grAxis->GetYaxis()->SetTitle(
"");
1945 grAxis->SetTitle(
"");
1946 Int_t entries = grAxis->GetN();
1947 grAxis->GetXaxis()->SetLabelSize(5.7*TMath::Min(TMath::Max(5./entries,0.01),0.03));
1948 grAxis->GetXaxis()->LabelsOption(
"v");
1952 for (Int_t i=0; i<nvars; i++){
1953 ((TMultiGraph*) oaMultGr->At(i))->
Draw(
"p");
1954 TLatex* ylabel =
new TLatex(-0.1, 0.5*i+0.5, ((TMultiGraph*) oaMultGr->At(i))->GetTitle());
1955 ylabel->SetTextAlign(32);
1956 ylabel->SetTextSize(0.025/gPad->GetHNDC());
1978 Bool_t needDeletion=kFALSE;
1979 if (oStatusGr->IsA() == TObjArray::Class()) {
1982 else if (oStatusGr->IsA() == TMultiGraph::Class()) {
1983 oaMultGr =
new TObjArray(); needDeletion=kTRUE;
1984 oaMultGr->Add((TMultiGraph*) oStatusGr);
1987 Printf(
"WriteStatusToTree(): Error! 'oStatusGr' must be a TMultiGraph or a TObjArray of them!");
1991 const int nvarsMax=10;
1992 const int ncritMax=5;
1994 Int_t treevars[nvarsMax*ncritMax];
1995 TString varnames[nvarsMax*ncritMax];
1996 for (
int i=0; i<nvarsMax*ncritMax; i++) treevars[i]=-1;
1998 Printf(
"WriteStatusToTree(): writing following variables to TTree (maybe only subset of listed criteria filled)");
1999 for (Int_t vari=0; vari<nvarsMax; vari++)
2001 if (vari < oaMultGr->GetEntriesFast()) {
2002 varnames[vari*ncritMax+0] = Form(
"%s_statisticOK", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2003 varnames[vari*ncritMax+1] = Form(
"%s_Warning", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2004 varnames[vari*ncritMax+2] = Form(
"%s_Outlier", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2005 varnames[vari*ncritMax+3] = Form(
"%s_PhysAcc", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2006 varnames[vari*ncritMax+4] = Form(
"%s_Extra", ((TMultiGraph*) oaMultGr->At(vari))->GetName());
2009 varnames[vari*ncritMax+0] = Form(
"dummy");
2010 varnames[vari*ncritMax+1] = Form(
"dummy");
2011 varnames[vari*ncritMax+2] = Form(
"dummy");
2012 varnames[vari*ncritMax+3] = Form(
"dummy");
2013 varnames[vari*ncritMax+4] = Form(
"dummy");
2015 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;
2018 TTree* statusTree =
new TTree(
"statusTree",
"statusTree");
2019 statusTree->Branch(
"run", ¤tRun );
2020 statusTree->Branch(varnames[ 0].Data(), &treevars[ 0]);
2021 statusTree->Branch(varnames[ 1].Data(), &treevars[ 1]);
2022 statusTree->Branch(varnames[ 2].Data(), &treevars[ 2]);
2023 statusTree->Branch(varnames[ 3].Data(), &treevars[ 3]);
2024 statusTree->Branch(varnames[ 4].Data(), &treevars[ 4]);
2025 statusTree->Branch(varnames[ 5].Data(), &treevars[ 5]);
2026 statusTree->Branch(varnames[ 6].Data(), &treevars[ 6]);
2027 statusTree->Branch(varnames[ 7].Data(), &treevars[ 7]);
2028 statusTree->Branch(varnames[ 8].Data(), &treevars[ 8]);
2029 statusTree->Branch(varnames[ 9].Data(), &treevars[ 9]);
2030 statusTree->Branch(varnames[10].Data(), &treevars[10]);
2031 statusTree->Branch(varnames[11].Data(), &treevars[11]);
2032 statusTree->Branch(varnames[12].Data(), &treevars[12]);
2033 statusTree->Branch(varnames[13].Data(), &treevars[13]);
2034 statusTree->Branch(varnames[14].Data(), &treevars[14]);
2035 statusTree->Branch(varnames[15].Data(), &treevars[15]);
2036 statusTree->Branch(varnames[16].Data(), &treevars[16]);
2037 statusTree->Branch(varnames[17].Data(), &treevars[17]);
2038 statusTree->Branch(varnames[18].Data(), &treevars[18]);
2039 statusTree->Branch(varnames[19].Data(), &treevars[19]);
2040 statusTree->Branch(varnames[20].Data(), &treevars[20]);
2041 statusTree->Branch(varnames[21].Data(), &treevars[21]);
2042 statusTree->Branch(varnames[22].Data(), &treevars[22]);
2043 statusTree->Branch(varnames[23].Data(), &treevars[23]);
2044 statusTree->Branch(varnames[24].Data(), &treevars[24]);
2045 statusTree->Branch(varnames[25].Data(), &treevars[25]);
2046 statusTree->Branch(varnames[26].Data(), &treevars[26]);
2047 statusTree->Branch(varnames[27].Data(), &treevars[27]);
2048 statusTree->Branch(varnames[28].Data(), &treevars[28]);
2049 statusTree->Branch(varnames[29].Data(), &treevars[29]);
2050 statusTree->Branch(varnames[30].Data(), &treevars[30]);
2051 statusTree->Branch(varnames[31].Data(), &treevars[31]);
2052 statusTree->Branch(varnames[32].Data(), &treevars[32]);
2053 statusTree->Branch(varnames[33].Data(), &treevars[33]);
2054 statusTree->Branch(varnames[34].Data(), &treevars[34]);
2055 statusTree->Branch(varnames[35].Data(), &treevars[35]);
2056 statusTree->Branch(varnames[36].Data(), &treevars[36]);
2057 statusTree->Branch(varnames[37].Data(), &treevars[37]);
2058 statusTree->Branch(varnames[38].Data(), &treevars[38]);
2059 statusTree->Branch(varnames[39].Data(), &treevars[39]);
2060 statusTree->Branch(varnames[40].Data(), &treevars[40]);
2061 statusTree->Branch(varnames[41].Data(), &treevars[41]);
2062 statusTree->Branch(varnames[42].Data(), &treevars[42]);
2063 statusTree->Branch(varnames[43].Data(), &treevars[43]);
2064 statusTree->Branch(varnames[44].Data(), &treevars[44]);
2065 statusTree->Branch(varnames[45].Data(), &treevars[45]);
2066 statusTree->Branch(varnames[46].Data(), &treevars[46]);
2067 statusTree->Branch(varnames[47].Data(), &treevars[47]);
2068 statusTree->Branch(varnames[48].Data(), &treevars[48]);
2069 statusTree->Branch(varnames[49].Data(), &treevars[49]);
2074 TList* arrRuns = (TList*) ((TGraph*) ((TMultiGraph*) oaMultGr->At(0))->GetListOfGraphs()->At(0))->GetXaxis()->GetLabels();
2076 for (Int_t runi=0; runi<arrRuns->GetSize(); runi++)
2078 currentRun = atoi( arrRuns->At(runi)->GetName() );
2082 for (Int_t vari=0; vari<oaMultGr->GetEntriesFast(); vari++)
2084 TMultiGraph* multGr = (TMultiGraph*) oaMultGr->At(vari);
2089 for (Int_t criti=1; criti<multGr->GetListOfGraphs()->GetEntries(); criti++)
2091 TGraph* grCriterion = (TGraph*) multGr->GetListOfGraphs()->At(criti);
2092 graphX = -1, graphY = -1;
2093 grCriterion->GetPoint(runi, graphX, graphY);
2094 treevars[(vari)*ncritMax+(criti-1)] = (graphY>0)?1:0;
2100 if (needDeletion)
delete oaMultGr;
2128 TObjArray * brArray = treeIn->GetListOfBranches();
2129 Int_t tEntries= treeIn->GetEntries();
2130 Int_t nBranches=brArray->GetEntries();
2131 TString treeName = treeIn->GetName();
2133 (*pcstream)<<treeName.Data()<<
"entries="<<tEntries;
2134 (*pcstream)<<treeName.Data()<<
"ID.="<<&sumID;
2136 TMatrixD valBranch(nBranches,7);
2137 for (Int_t iBr=0; iBr<nBranches; iBr++){
2138 TString brName= brArray->At(iBr)->GetName();
2139 Int_t entries=treeIn->Draw(TString::Format(
"%s>>dummy(10,0,1)",brArray->At(iBr)->GetName()).Data(),selection,
"goff");
2140 if (entries==0)
continue;
2141 Double_t median, mean, rms, mean60,rms60, mean90, rms90;
2142 mean = TMath::Mean(entries,treeIn->GetV1());
2143 median= TMath::Median(entries,treeIn->GetV1());
2144 rms = TMath::RMS(entries,treeIn->GetV1());
2145 TStatToolkit::EvaluateUni(entries, treeIn->GetV1(), mean60,rms60,TMath::Min(TMath::Max(2., 0.60*entries),Double_t(entries)));
2146 TStatToolkit::EvaluateUni(entries, treeIn->GetV1(), mean90,rms90,TMath::Min(TMath::Max(2., 0.90*entries),Double_t(entries)));
2147 valBranch(iBr,0)=mean;
2148 valBranch(iBr,1)=median;
2149 valBranch(iBr,2)=rms;
2150 valBranch(iBr,3)=mean60;
2151 valBranch(iBr,4)=rms60;
2152 valBranch(iBr,5)=mean90;
2153 valBranch(iBr,6)=rms90;
2154 (*pcstream)<<treeName.Data()<<
2155 brName+
"="<<valBranch(iBr,1)<<
2156 brName+
"_Mean="<<valBranch(iBr,0)<<
2157 brName+
"_Median="<<valBranch(iBr,1)<<
2158 brName+
"_RMS="<<valBranch(iBr,2)<<
2159 brName+
"_Mean60="<<valBranch(iBr,3)<<
2160 brName+
"_RMS60="<<valBranch(iBr,4)<<
2161 brName+
"_Mean90="<<valBranch(iBr,5)<<
2162 brName+
"_RMS90="<<valBranch(iBr,6);
2164 (*pcstream)<<treeName.Data()<<
"\n";
2179 TObjArray* oaVar = TString(expr).Tokenize(
":");
2180 if (oaVar->GetEntries()<2) {
2181 printf(
"Expression has to be of type 'varname:xaxis':\t%s\n", expr);
2186 snprintf(varname,50,
"%s", oaVar->At(0)->GetName());
2187 snprintf(var_x ,50,
"%s", oaVar->At(1)->GetName());
2189 TString sAlias(alias);
2190 if (sAlias.IsNull()) {
2191 sAlias =
"varname_OutlierMin:varname_OutlierMax:varname_WarningMin:varname_WarningMax:varname_PhysAccMin:varname_PhysAccMax:varname_RobustMean";
2193 sAlias.ReplaceAll(
"varname",varname);
2195 if (oaAlias->GetEntries()<2) {
2196 printf(
"Alias must have 2-7 arguments:\t%s\n", alias);
2200 TMultiGraph* multGr =
new TMultiGraph();
2201 Int_t colArr[7] = {kRed, kRed, kOrange, kOrange, kGreen+1, kGreen+1, kGray+2};
2202 const Int_t ngr = oaAlias->GetEntriesFast();
2203 for (Int_t i=0; i<ngr; i++){
2204 snprintf(query,200,
"%s:%s", oaAlias->At(i)->GetName(), var_x);
2208 multGr->SetName(varname);
2209 multGr->SetTitle(varname);
2233 TString drawStr(drawCommand);
2234 TString cutStr(cuts);
2238 ::Error(
"TStatToolkit::DrawHistogram",
"Tree pointer is NULL!");
2243 Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(),
"goff");
2244 if (entries == -1) {
2245 ::Error(
"TStatToolkit::DrawHistogram",
"Tree draw returns -!");
2248 TObjArray *charray = drawStr.Tokenize(
":");
2251 if(tree->GetV1()) dim = 1;
2252 if(tree->GetV2()) dim = 2;
2253 if(tree->GetV3()) dim = 3;
2255 cerr<<
"TTree has more than 2 dimensions (not yet supported)"<<endl;
2261 Double_t mean1=0, rms1=0, min1=0, max1=0;
2262 Double_t mean2=0, rms2=0, min2=0, max2=0;
2263 Double_t mean3=0, rms3=0, min3=0, max3=0;
2278 hOut =
new TH1F(histoname, histotitle, 200, mean1-nsigma*rms1, mean1+nsigma*rms1);
2279 for (Int_t i=0; i<entries; i++) hOut->Fill(tree->GetV1()[i]);
2280 hOut->GetXaxis()->SetTitle(tree->GetHistogram()->GetXaxis()->GetTitle());
2283 hOut =
new TH2F(histoname, histotitle, 200, min2, max2,200, mean1-nsigma*rms1, mean1+nsigma*rms1);
2284 for (Int_t i=0; i<entries; i++) hOut->Fill(tree->GetV2()[i],tree->GetV1()[i]);
2285 hOut->GetXaxis()->SetTitle(tree->GetHistogram()->GetXaxis()->GetTitle());
2286 hOut->GetYaxis()->SetTitle(tree->GetHistogram()->GetYaxis()->GetTitle());
2288 THashList * metaData = (THashList*) tree->GetUserInfo()->FindObject(
"metaTable");
2290 if (metaData != NULL){
2296 TString hisTitle=charray->At(0)->GetName();
2297 if (nmdTitle0) hisTitle=nmdTitle0->GetTitle();
2300 hisTitle+=nmdTitle1->GetTitle();
2303 hisTitle+=charray->At(1)->GetName();
2305 if (nmdYAxis) {hOut->GetYaxis()->SetTitle(nmdYAxis->GetTitle());}
2306 if (nmdXAxis) {hOut->GetXaxis()->SetTitle(nmdXAxis->GetTitle());}
2307 hOut->SetTitle(hisTitle);
2319 TList * aliases = (TList*)tree->GetListOfAliases();
2320 Int_t entries = aliases->GetEntries();
2321 for (Int_t i=0; i<entries; i++){
2322 TObject *
object= aliases->At(i);
2323 if (!
object)
continue;
2324 Int_t ndraw=tree->Draw(aliases->At(i)->GetName(),
"1",
"goff",nCheck);
2326 ::Error(
"Alias:\tProblem",
"%s",aliases->At(i)->GetName());
2328 ::Info(
"Alias:\tOK",
"%s",aliases->At(i)->GetName());
2340 Int_t entries = tree->Draw(var,selection,
"goff");
2341 if (entries==0)
return 0;
2346 return entries*TMath::Mean(entries, tree->GetV1());
2348 return TMath::Mean(entries, tree->GetV1());
2350 return TMath::RMS(entries, tree->GetV1());
2352 return TMath::Median(entries, tree->GetV1());
2370 const Int_t numberOfDimensions = tree->GetPlayer()->GetDimension();
2371 if (numberOfDimensions==1) {
2372 values.Use(tree->GetSelectedRows(), tree->GetVal(0));
2376 const Int_t numberOfSelectedRows = tree->GetSelectedRows();
2377 values.ResizeTo(numberOfDimensions * numberOfSelectedRows);
2380 for (Int_t idim=0; idim<numberOfDimensions; ++idim) {
2381 const Double_t *arr = tree->GetVal(idim);
2384 for (Int_t ival=0; ival<numberOfSelectedRows; ++ival) {
2385 values.GetMatrixArray()[nfill++] = arr[ival];
2393 const Bool_t normaliseToEntries,
const Double_t pvalue)
2406 norm=values.Norm1();
2409 norm=TMath::Sqrt(values.Norm2Sqr());
2414 ::Error(
"TStatToolkit::GetDistance",
"Lp norm: p-value=%5.3g not valid. Only p-value>=1 is allowed", pvalue);
2418 for (Int_t ival=0; ival<values.GetNrows(); ++ival) {
2419 sum+=TMath::Power(TMath::Abs(values.GetMatrixArray()[ival]), pvalue);
2421 norm=TMath::Power(sum, 1./pvalue);
2425 norm=values.NormInf();
2430 for (Int_t ival=0; ival<values.GetNrows(); ++ival) {
2431 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];
2540 snprintf(tname, 100,
"%sDist",histo->GetName());
2545 Int_t dimProject = TMath::Nint(projectionInfo(iter,0));
2546 TH1 *his1DFull = histo->Projection(dimProject);
2547 Double_t mean= his1DFull->GetMean();
2548 Double_t rms= his1DFull->GetRMS();
2549 Int_t entries= his1DFull->GetEntries();
2550 TString hname=
"his_";
2551 for (Int_t idim=0; idim<ndim; idim++) {hname+=
"_"; hname+=TMath::Nint(projectionInfo(idim,3));}
2552 Double_t meanG=0, rmsG=0, chi2G=0;
2553 if (entries>kMinEntries){
2554 fgaus.SetParameters(entries,mean,rms);
2555 his1DFull->Fit(&fgaus,
"qnr",
"qnr");
2556 meanG = fgaus.GetParameter(1);
2557 rmsG = fgaus.GetParameter(2);
2558 chi2G = fgaus.GetChisquare()/fgaus.GetNumberFreeParameters();
2561 static Int_t histoCounter=0;
2562 if ((histoCounter%dumpHisto)==0) his1DFull->Write(hname.Data());
2566 (*pcstream)<<tname<<
2567 "entries="<<entries<<
2574 for (Int_t idim=0; idim<ndim; idim++){
2575 TH1 *his1DAxis = histo->Projection(idim);
2576 meanVector[idim] = his1DAxis->GetMean();
2577 snprintf(aname, 100,
"%sMean=",histo->GetAxis(idim)->GetName());
2578 (*pcstream)<<tname<<
2579 aname<<meanVector[idim];
2582 for (Int_t iIter=0; iIter<ndim; iIter++){
2583 Int_t idim = TMath::Nint(projectionInfo(iIter,0));
2584 binVector[idim] = TMath::Nint(projectionInfo(iIter,3));
2585 centerVector[idim] = projectionInfo(iIter,4);
2586 snprintf(bname, 100,
"%sBin=",histo->GetAxis(idim)->GetName());
2587 snprintf(cname, 100,
"%sCenter=",histo->GetAxis(idim)->GetName());
2588 (*pcstream)<<tname<<
2589 bname<<binVector[idim]<<
2590 cname<<centerVector[idim];
2592 (*pcstream)<<tname<<
"\n";
2598 Int_t dimProject = TMath::Nint(projectionInfo(iter,0));
2599 Int_t groupProject = TMath::Nint(projectionInfo(iter,1));
2600 Int_t stepProject = TMath::Nint(projectionInfo(iter,2));
2601 if (stepProject<1) stepProject=1;
2602 Int_t nbins = histo->GetAxis(dimProject)->GetNbins();
2604 for (Int_t ibin=1; ibin<=nbins; ibin+=stepProject){
2605 if (iter>1 && verbose){
2606 for (Int_t idim=0; idim<ndim; idim++){
2607 printf(
"\t%d(%d,%d)",TMath::Nint(projectionInfo(idim,3)),TMath::Nint(projectionInfo(idim,0)),TMath::Nint(projectionInfo(idim,1) ));
2611 Int_t bin0=TMath::Max(ibin-groupProject,1);
2612 Int_t bin1=TMath::Min(ibin+groupProject,nbins);
2613 histo->GetAxis(dimProject)->SetRange(bin0,bin1);
2614 projectionInfo(iter,3)=ibin;
2615 projectionInfo(iter,4)=histo->GetAxis(dimProject)->GetBinCenter(ibin);
2616 Int_t iterProject=iter-1;
2660 if (histo->GetNdimensions()<=1) {
2661 ::Error(
"TStatToolkit::MakeDistortionMapFast",
"Invalid dimension of input histogram");
2664 if (fractionCut<0 || fractionCut>0.4){
2665 ::Error(
"TStatToolkit::MakeDistortionMapFast",
"Invalid input fraction cut %f\r. Should be in range <0,0.4>", fractionCut);
2668 const Double_t kMinEntries=30, kUseLLFrom=20;
2669 const Float_t kDumpHistoFraction = TString(gSystem->Getenv(
"gDumpHistoFraction")).Atof();
2674 Float_t fractionLTM[100]={0.8};
2675 TVectorF *vecLTM[100]={0};
2676 Int_t nestimators=1;
2677 if (estimators!=NULL){
2679 nestimators=array->GetEntries();
2680 for (Int_t iest=0; iest<nestimators; iest++){
2681 fractionLTM[iest]=TString(array->At(iest)->GetName()).Atof();
2684 for (Int_t iest=0; iest<nestimators; iest++) {
2685 vecLTM[iest]=
new TVectorF(10);
2686 (*(vecLTM[iest]))[9]= fractionLTM[iest];
2690 int ndim = histo->GetNdimensions();
2691 int nbins[ndim],idx[ndim],idxmin[ndim],idxmax[ndim],idxSav[ndim];
2692 for (
int id=0;
id<ndim;
id++) nbins[
id] = histo->GetAxis(
id)->GetNbins();
2694 int axOrd[ndim],binSt[ndim],binGr[ndim];
2695 for (
int i=0;i<ndim;i++) {
2696 axOrd[i] = TMath::Nint(projectionInfo(i,0));
2697 binGr[i] = TMath::Nint(projectionInfo(i,1));
2698 binSt[i] = TMath::Max(1,TMath::Nint(projectionInfo(i,2)));
2700 int tgtDim = axOrd[0],tgtStep=binSt[0],tgtNb=nbins[tgtDim],tgtNb1=tgtNb+1;
2701 double binY[tgtNb],binX[tgtNb],meanVector[ndim],centerVector[ndim], meanVectorMI[ndim+2];
2702 Int_t binVector[ndim];
2704 TAxis* xax = histo->GetAxis(tgtDim);
2705 for (
int i=tgtNb;i--;) binX[i] = xax->GetBinCenter(i+1);
2706 for (
int i=ndim;i--;) idx[i]=1;
2707 Bool_t grpOn = kFALSE;
2708 for (
int i=1;i<ndim;i++)
if (binGr[i]) grpOn = kTRUE;
2711 histo->GetListOfAxes()->Print();
2712 ULong64_t nfits = 1, fitCount=0;
2713 printf(
"index\tdim\t|\tnbins\tgrouping\tstep\tnfits\n");
2714 for (
int i=1;i<ndim;i++) {
2715 int idim = axOrd[i];
2716 nfits *= TMath::Max(1,nbins[idim]/binSt[idim]);
2717 printf(
"%d %d | %d %d %d %lld\n",i,idim,nbins[idim],binGr[idim], binSt[idim],nfits);
2719 printf(
"Expect %lld nfits\n",nfits);
2720 ULong64_t fitProgress = nfits/100;
2723 static TF1 fgaus(
"fgaus",
"gaus",-10,10);
2724 fgaus.SetRange(xax->GetXmin(),xax->GetXmax());
2726 TH1F* hfit =
new TH1F(
"hfit",
"hfit",tgtNb,xax->GetXmin(),xax->GetXmax());
2728 snprintf(tname, 100,
"%sDist",histo->GetName());
2731 int dimVar=1, dimVarID = axOrd[dimVar];
2739 memset(binY,0,tgtNb*
sizeof(
double));
2741 for (
int idim=1;idim<ndim;idim++) {
2742 int grp = binGr[idim];
2743 int idimR = axOrd[idim];
2744 idxSav[idimR]=idx[idimR];
2745 idxmax[idimR] = TMath::Min(idx[idimR]+grp,nbins[idimR]);
2746 idx[idimR] = idxmin[idimR] = TMath::Max(1,idx[idimR]-grp);
2749 meanVector[idimR] = 0;
2750 TAxis* ax = histo->GetAxis(idimR);
2752 for (
int k=idxmin[idimR];k<=idxmax[idimR];k++) meanVector[idimR] += ax->GetBinCenter(k);
2753 meanVector[idimR] /= (1+(grp<<1));
2755 else meanVector[idimR] = ax->GetBinCenter(idxSav[idimR]);
2759 for (
int i=0;i<ndim;i++)
if (i!=tgtDim)
printf(
"[D:%d]:%d ",i,idxSav[i]);
2762 for (
int i=0;i<ndim;i++)
if (i!=tgtDim)
printf(
"[D:%d]:%d-%d ",i,idxmin[i],idxmax[i]);
2766 for (Int_t jDim=0; jDim<ndim+2; jDim++) meanVectorMI[jDim]=0;
2769 int &it = idx[tgtDim];
2770 for (it=1;it<tgtNb1;it+=tgtStep) {
2771 Double_t content=histo->GetBinContent(idx);
2772 binY[it-1] += content;
2773 for (Int_t jDim=0; jDim<ndim; jDim++) meanVectorMI[jDim]+=content*histo->GetAxis(jDim)->GetBinCenter(idx[jDim]);
2774 meanVectorMI[ndim]+=content;
2775 meanVectorMI[ndim+1]+=1.;
2776 if (verbose>1) {
for (
int i=0;i<ndim;i++)
printf(
"%d ",idx[i]);
printf(
" | accumulation\n");}
2780 for (idim=1;idim<ndim;idim++) {
2781 int idimR = axOrd[idim];
2782 if ( (++idx[idimR]) > idxmax[idimR] ) idx[idimR]=idxmin[idimR];
2785 if (idim==ndim)
break;
2789 int &it = idx[tgtDim];
2790 for (it=1;it<tgtNb1;it+=tgtStep) {
2791 binY[it-1] = histo->GetBinContent(idx);
2795 for (
int idim=1;idim<ndim;idim++) {
2796 int idimR = axOrd[idim];
2797 meanVector[idimR] = histo->GetAxis(idimR)->GetBinCenter(idx[idimR]);
2800 if (grpOn)
for (
int i=ndim;i--;) idx[i]=idxSav[i];
2802 if (verbose>0) {
for (
int i=0;i<ndim;i++)
printf(
"%d ",idx[i]);
printf(
" | central bin fit\n");}
2803 if (meanVectorMI[ndim]>1) {
2804 for (Int_t jDim=0; jDim<ndim; jDim++) meanVectorMI[jDim]/= meanVectorMI[ndim];
2806 for (Int_t jDim=0; jDim<ndim; jDim++) meanVectorMI[jDim]= meanVector[ndim];
2810 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;
2812 for (
int ip=tgtNb;ip--;) {
2814 hfit->SetBinContent(ip+1,binY[ip]);
2816 mean += binX[ip]*binY[ip];
2817 mom2 += binX[ip]*binX[ip]*binY[ip];
2818 if (maxVal<binY[ip]) maxVal = binY[ip];
2823 rms = mom2 - mean*mean;
2824 rms = rms>0 ? TMath::Sqrt(rms):0;
2830 Int_t nbins1D=hfit->GetNbinsX();
2831 Float_t binMedian=0;
2832 Double_t limits[2]={hfit->GetBinCenter(1), hfit->GetBinCenter(nbins1D)};
2834 for (Int_t iest=0; iest<nestimators; iest++){
2837 Double_t* integral=hfit->GetIntegral();
2838 for (Int_t i=1; i<nbins1D-1; i++){
2839 if (integral[i-1]<0.5 && integral[i]>=0.5){
2840 if (hfit->GetBinContent(i-1)+hfit->GetBinContent(i)>0){
2841 binMedian=hfit->GetBinCenter(i);
2842 Double_t dIdx=-(integral[i-1]-integral[i]);
2843 Double_t dx=(0.5+(0.5-integral[i])/dIdx)*hfit->GetBinWidth(i);
2847 if (integral[i-1]<fractionCut && integral[i]>=fractionCut){
2848 limits[0]=hfit->GetBinCenter(i-1)-hfit->GetBinWidth(i);
2850 if (integral[i]<1-fractionCut && integral[i+1]>=1-fractionCut){
2851 limits[1]=hfit->GetBinCenter(i+1)+hfit->GetBinWidth(i);
2855 if (nrm>5&&fractionCut>0 &&rms>0) {
2856 hfit->GetXaxis()->SetRangeUser(limits[0], limits[1]);
2857 mean=hfit->GetMean();
2859 if (nrm>0 && rms>0) {
2860 m3=hfit->GetSkewness();
2861 m4=hfit->GetKurtosis();
2865 fgaus.SetRange(xax->GetXmin(),xax->GetXmax());
2869 Bool_t isFitValid=kFALSE;
2870 if (nrm>=kMinEntries && rms>hfit->GetBinWidth(nbins1D)/TMath::Sqrt(12.)) {
2871 fgaus.SetParameters(nrm/(rms/hfit->GetBinWidth(nbins1D)),mean,rms);
2872 fgaus.SetParError(0,nrm/(rms/hfit->GetBinWidth(nbins1D)));
2873 fgaus.SetParError(1,rms);
2874 fgaus.SetParError(2,rms);
2876 TFitResultPtr fitPtr= hfit->Fit(&fgaus,maxVal<kUseLLFrom ?
"qnrlS+":
"qnrS+");
2878 entriesG = fgaus.GetParameter(0);
2879 meanG = fgaus.GetParameter(1);
2880 rmsG = fgaus.GetParameter(2);
2881 chi2G = fgaus.GetChisquare()/fgaus.GetNumberFreeParameters();
2882 TFitResult * result = fitPtr.Get();
2884 isFitValid = result->IsValid();
2889 if (nrm>=kMinEntries&& kDumpHistoFraction>0 && (gRandom->Rndm()<kDumpHistoFraction || isFitValid!=kTRUE)){
2892 if (kDumpHistoFraction>=1.){
2896 hfit->GetListOfFunctions()->AddLast(&fgaus);
2897 (*pcstream)<<TString::Format(
"%sDump", tname).Data()<<
2899 "isFitValid="<<isFitValid<<
2907 "binMedian="<<binMedian<<
2908 "entriesG="<<entriesG<<
2911 "vecLTM.="<<vecLTM[0]<<
2913 for (Int_t iest=1; iest<nestimators; iest++)
2914 (*pcstream)<<TString::Format(
"%sDump", tname).Data()<<TString::Format(
"vecLTM%d.=",iest)<<vecLTM[iest];
2918 (*pcstream)<<tname<<
2920 "isFitValid="<<isFitValid<<
2927 "binMedian="<<binMedian<<
2928 "entriesG="<<entriesG<<
2931 "vecLTM.="<<vecLTM[0]<<
2933 for (Int_t iest=1; iest<nestimators; iest++)
2934 (*pcstream)<<tname<<TString::Format(
"vecLTM%d.=",iest)<<vecLTM[iest];
2938 meanVector[tgtDim] = mean;
2939 for (Int_t idim=0; idim<ndim; idim++){
2940 snprintf(aname, 100,
"%sMean=",histo->GetAxis(idim)->GetName());
2941 (*pcstream)<<tname<<
2942 aname<<meanVectorMI[idim];
2945 for (Int_t iIter=0; iIter<ndim; iIter++){
2946 Int_t idim = axOrd[iIter];
2947 binVector[idim] = idx[idim];
2948 centerVector[idim] = histo->GetAxis(idim)->GetBinCenter(idx[idim]);
2949 snprintf(bname, 100,
"%sBin=",histo->GetAxis(idim)->GetName());
2950 snprintf(cname, 100,
"%sCenter=",histo->GetAxis(idim)->GetName());
2951 (*pcstream)<<tname<<
2952 bname<<binVector[idim]<<
2953 cname<<centerVector[idim];
2955 (*pcstream)<<TString::Format(
"%sDump", tname).Data()<<
2956 bname<<binVector[idim]<<
2957 cname<<centerVector[idim];
2960 (*pcstream)<<tname<<
"\n";
2962 (*pcstream)<<TString::Format(
"%sDump", tname).Data()<<
"\n";
2963 hfit->GetListOfFunctions()->RemoveLast();
2967 if ( fitProgress>0 && nfits>0) {
2968 if (((++fitCount)%fitProgress)==0) {
2969 printf(
"fit %lld %4.1f%% done\n",fitCount,100*
double(fitCount)/nfits);
2974 for (dimVar=1;dimVar<ndim;dimVar++) {
2975 dimVarID = axOrd[dimVar];
2976 if ( (idx[dimVarID]+=binSt[dimVar]) > nbins[dimVarID] ) idx[dimVarID]=1;
2979 if (dimVar==ndim)
break;
3011 if (graph0==NULL)
throw std::invalid_argument(
"RebinSparseGraph.graph0");
3012 if (graph1==NULL)
throw std::invalid_argument(
"RebinSparseGraph.graph1");
3013 TString opt = option;
3015 map<string,int> mapStrInt0, mapStrInt1;
3016 map<int,string> mapIntStr0, mapIntStr1;
3017 for (Int_t i=1; i<=graph0->GetXaxis()->GetNbins(); i++){
3018 mapStrInt0[graph0->GetXaxis()->GetBinLabel(i)]=i;
3019 mapIntStr0[i]=graph0->GetXaxis()->GetBinLabel(i);
3021 for (Int_t i=1; i<=graph1->GetXaxis()->GetNbins(); i++){
3022 mapStrInt1[graph1->GetXaxis()->GetBinLabel(i)]=i;
3023 mapIntStr1[i]=graph1->GetXaxis()->GetBinLabel(i);
3025 if (opt.Contains(
"merge")) {
3026 ::Error(
"Not supported option",
"%s",opt.Data());
3028 for (Int_t i=1; i<=graph0->GetXaxis()->GetNbins(); i++){
3029 Int_t indexNew=mapStrInt1[mapIntStr0[i]];
3030 Double_t offset=graph0->GetX()[i-1]-int(graph0->GetX()[i-1]);
3031 graph0->GetX()[i-1]=indexNew+offset-1;
3033 graph0->GetXaxis()->Set(graph1->GetXaxis()->GetNbins(),graph1->GetXaxis()->GetXbins()->GetArray());
3034 for (Int_t i=1; i<=graph0->GetXaxis()->GetNbins(); ++i){
3035 graph0->GetXaxis()->SetBinLabel(i,graph1->GetXaxis()->GetBinLabel(i));
3054 if (multiGraph==NULL)
throw std::invalid_argument(
"RebinSparseMultyGraph.multiGraph");
3055 if (multiGraph->GetListOfGraphs()==NULL)
throw std::invalid_argument(
"RebinSparseMultyGraph.multiGraph empty");
3056 if (graphRef==NULL) {
3057 graphRef=(TGraph*)multiGraph->GetListOfGraphs()->At(0);
3059 for (Int_t i=0; i<multiGraph->GetListOfGraphs()->GetEntries(); i++){
3062 }
catch(
const std::invalid_argument& error){
3063 ::Error(
"RebinSparseMultiGraph",
"%s",error.what());
3090 if (multiGraph == NULL)
throw std::invalid_argument(
"MakeSparseMultiGraphInt.multiGraph");
3091 map<int, int> intCounter;
3092 map<int, int> intMap;
3093 vector<int> valueArray;
3094 const TList *grArray = multiGraph->GetListOfGraphs();
3095 for (Int_t iGr = 0; iGr < grArray->GetEntries(); ++iGr) {
3096 TGraph *iGraph = (TGraph *) grArray->At(iGr);
3097 for (Int_t iPoint = 0; iPoint < iGraph->GetN(); ++iPoint) {
3098 Int_t value = TMath::Nint(iGraph->GetX()[iPoint]);
3099 intCounter[value]++;
3102 for (std::map<int, int>::iterator iterator = intCounter.begin(); iterator != intCounter.end(); iterator++)
3103 valueArray.push_back(iterator->first);
3104 std::sort(valueArray.begin(), valueArray.begin());
3106 for (UInt_t iValue = 0; iValue < valueArray.size(); iValue++) intMap[valueArray[iValue]] = iValue;
3108 for (Int_t iGr = 0; iGr < grArray->GetEntries(); ++iGr) {
3109 TGraph *iGraph = (TGraph *) grArray->At(iGr);
3110 iGraph->GetXaxis()->Set(valueArray.size(), 0, valueArray.size());
3111 for (UInt_t iValue = 0; iValue < valueArray.size(); iValue++)
3112 iGraph->GetXaxis()->SetBinLabel(iValue + 1, TString::Format(
"%d", valueArray[iValue]).Data());
3113 for (Int_t iPoint = 0; iPoint < iGraph->GetN(); ++iPoint) {
3114 iGraph->GetX()[iPoint] = intMap[TMath::Nint(iGraph->GetX()[iPoint]) + 0.5];
3117 if (multiGraph->GetXaxis()) {
3118 multiGraph->GetXaxis()->Set(valueArray.size(), 0, valueArray.size());
3119 for (UInt_t iValue = 0; iValue < valueArray.size(); iValue++)
3120 multiGraph->GetXaxis()->SetBinLabel(iValue + 1, TString::Format(
"%d", valueArray[iValue]).Data());
3132 if (histogram==NULL) histogram= tree->GetHistogram();
3133 if (histogram==NULL)
return -1;
3136 if (named) histogram->GetXaxis()->SetTitle(named->GetTitle());
3138 if (named) histogram->GetYaxis()->SetTitle(named->GetTitle());
3139 if (histogram->GetZaxis()){
3141 if (named) histogram->GetZaxis()->SetTitle(named->GetTitle());
3144 TPaletteAxis *palette = (TPaletteAxis*)histogram->GetListOfFunctions()->FindObject(
"palette");
3145 if (palette) palette->SetX2NDC(0.92);
3146 histogram->Draw(option.Data());
3151 TList *list=(TList*)(tree->GetUserInfo());
3152 return (THashList*)((list!=
nullptr)? list->FindObject(
"metaTable"):0);
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 Int_t GetMarkerColor(const char *style, Int_t index)
static Int_t GetMarkerStyle(const char *style, Int_t index)