#include "TROOT.h" #include "TObject.h" #include "TFile.h" #include "TTree.h" #include "TH2.h" #include "TMath.h" #include "TColor.h" #include "TCanvas.h" double sigmaEffective() { TFile* f = new TFile("data.root"); TH1F * hdatamassCorr1RG = (TH1F*)f->Get("hdatamassCorr1RG"); TAxis *xaxis = hdatamassCorr1RG->GetXaxis(); Int_t nb = xaxis->GetNbins(); if(nb < 10) { std::cout << "effsigma: Not a valid hdatamassCorr1RGo. nbins = " << nb << std::endl; return 0.; } Double_t bwid = xaxis->GetBinWidth(1); if(bwid == 0) { std::cout << "effsigma: Not a valid hdatamassCorr1RGo. bwid = " << bwid << std::endl; return 0.; } Double_t xmin = xaxis->GetXmin(); Double_t ave = hdatamassCorr1RG->GetMean(); Double_t rms = hdatamassCorr1RG->GetRMS(); Double_t total=0.; for(Int_t i=0; iGetBinContent(i); } if(total < 50.) { std::cout << "effsigma: Too few entries " << total << std::endl; return 0.; } Int_t ierr=0; Int_t ismin=999; Double_t rlim=0.683*total; Int_t nrms=rms/(bwid); // Set scan size to +/- rms if(nrms > nb/10) nrms=nb/10; // Could be tuned... Double_t widmin=9999999.; for(Int_t iscan=-nrms;iscanGetBinContent(ibm); total=bin; for(Int_t j=1;jGetBinContent(jbm); total+=bin; if(total > rlim) break; if(total > rlim) break; } else ierr=1; if(kbm > 0) { kbm--; xk-=bwid; bin=hdatamassCorr1RG->GetBinContent(kbm); total+=bin; if(total > rlim) break; } else ierr=1; } Double_t dxf=(total-rlim)*bwid/bin; Double_t wid=(xj-xk+bwid-dxf)*0.5; if(wid < widmin) { widmin=wid; ismin=iscan; } } if(ismin == nrms || ismin == -nrms) ierr=3; if(ierr != 0) std::cout << "effsigma: Error of type " << ierr << std::endl; return widmin; }