5 #include "RooRealVar.h" 
    6 #include "RooWorkspace.h" 
    7 #include "RooGaussModel.h" 
    8 #include "RooArgList.h" 
   10 #include "RooDataSet.h" 
   11 #include "RooDataHist.h" 
   12 #include "RooAddPdf.h" 
   13 #include "RooGaussian.h" 
   14 #include "RooMsgService.h" 
   26 using namespace RooFit;
 
   43   double tlow , thigh , 
tpeak , nhits , meanToT , sigmaToT , max_ToT ;
 
   45   int n_bins_right , n_bins_left , n_bins_before_peak , n_bins_afterpulse , max_n_bins_baseline , min_n_bins_baseline , 
n_sigma_peak , n_sigma_before_peak  ; 
 
   47   double fit_region_min , fit_region_max , fit_range_min , fit_range_max , landau_m_min , landau_m_max , 
landau_s_min , landau_s_max , gaus_m_min , gaus_m_max , gaus_s_min , gaus_s_max , l_g_ratio_min , l_g_ratio_max , KS_threshold;
 
   80     n_bins_before_peak(2) ,
 
   81     n_bins_afterpulse (10),
 
   82     max_n_bins_baseline (50),
 
   83     min_n_bins_baseline (10),
 
   85     n_sigma_before_peak (4) ,
 
   86     fit_region_min (20.0), 
 
   87     fit_region_max (20.0) , 
 
   89     fit_range_max (15.0) , 
 
  104     saturated_hit (false) ,
 
  105     saturated_tot (false) , 
 
  124     if (analyzed == 
true){
 
  143     TRandom3* 
r = 
new TRandom3() ;
 
  147     double high_x = h->GetBinCenter(h->GetNbinsX() - 1) ;
 
  149     int nentries = h->Integral(1 , h->GetNbinsX() - 1) ;
 
  151     if (h->GetBinCenter(1)>=0){
 
  153       low_x = h->GetBinCenter(1) ;
 
  157     TH1D* 
u = (TH1D*)h->Clone(
"uniform") ;
 
  161     for (
int i = 0 ; i<nentries ; i++){
 
  163       u->Fill(
r->Uniform(low_x, high_x));
 
  167     double proba = h->KolmogorovTest(
u) ;
 
  186     htime_full = time_vs_tot->ProjectionX(time_vs_tot->GetName() , 1 , time_vs_tot->GetNbinsY());
 
  188     htime_full->SetDirectory(0) ;
 
  200     if (analyzed == 
true) return ;
 
  202     computeBaseline(htime_full) ;
 
  204     int peakbin = htime_full->GetMaximumBin() ;
 
  206     double height = htime_full->GetBinContent(peakbin) ;
 
  208     int leftbin = peakbin - n_bins_left ;
 
  210     int rightbin = peakbin + n_bins_right ;
 
  212     tpeak = htime_full->GetBinCenter(peakbin) ;
 
  214     tlow = htime_full->GetBinCenter(leftbin) ;
 
  216     thigh = htime_full->GetBinCenter(rightbin) ;
 
  218     htime_peak = (TH1D*)htime_full->Clone();
 
  220     for (
int i=0 ; i<htime_peak->GetNbinsX() ; i++){
 
  222       if (i<leftbin || i>rightbin){
 
  224         htime_peak->SetBinContent(i,0);
 
  230     htime_peak->SetName((std::string(
"htime_")+htime_peak->GetName()).c_str());
 
  232     htime_peak->SetDirectory(0) ;
 
  234     tot_peak = (TH1D*)time_vs_tot->ProjectionY((std::string(
"ToT_") + time_vs_tot->GetName()).c_str() , leftbin , rightbin) ; 
 
  236     tot_peak->SetDirectory(0);
 
  238     meanToT = tot_peak->GetMean() ;
 
  240     if (meanToT > max_ToT){
 
  242       saturated_tot = true ;
 
  246     sigmaToT = tot_peak->GetStdDev() ;
 
  248     double p_KS = Kolmogorov_Smirnov_uniform(htime_full) ;
 
  250     if (baseline.first==0 && baseline.second==0) weak = true ;
 
  252     if (p_KS > KS_threshold) weak = true ;
 
  254     if (height < (baseline.first + n_sigma_peak * baseline.second)) weak = true ;
 
  256     for (
int i = 1 ; i<=n_bins_before_peak ; i++){
 
  258       if (htime_full->GetBinContent(peakbin - n_bins_before_peak) < (baseline.first + n_sigma_before_peak * baseline.second)) weak = true ;
 
  262     if (weak == 
false && htime_full->GetBinContent(peakbin + n_bins_afterpulse) == 0) saturated_hit = 
true ;
 
  264     if (weak == 
false && saturated_hit == 
false) is_good = true ;
 
  266     nhits = htime_peak->Integral() ;
 
  287     for (
int i=1 ; i<max_n_bins_baseline + 1 ; i++){
 
  289       if(h->GetBinContent(i) > 0 ){
 
  291         sum += h->GetBinContent(i);
 
  293         bins.push_back(h->GetBinContent(i));
 
  301     if(N < min_n_bins_baseline){
 
  309       for (
int i=1 ; i<max_n_bins_baseline + 1 ; i++){
 
  311         if(h->GetBinContent(h->GetNbinsX() - i)>0){
 
  313           sum += h->GetBinContent(h->GetNbinsX() - i);
 
  315           bins.push_back(h->GetBinContent(h->GetNbinsX() - i));
 
  325     if(N < min_n_bins_baseline){
 
  329       baseline.second = 0 ;
 
  335     double bg_mean = sum/N ;
 
  337     baseline.first = bg_mean ;
 
  341     for (
int i=0 ; i<N ; i++){
 
  343       sdev += pow((bins[i] - bg_mean) , 2) ;
 
  347     baseline.second = sqrt(sdev/N);
 
  357     if (fitted==
true)   return ;
 
  359     if (analyzed==
false) analyzeFast() ;
 
  361     w.SetName((std::string(
"W_") + htime_full->GetName()).c_str());
 
  363     double tpeak = htime_full->GetBinCenter(htime_full->GetMaximumBin()) ;
 
  365     RooRealVar x(
"time" , 
"hit time" , tpeak - fit_region_min , tpeak + fit_region_max) ;
 
  367     RooRealVar ml(
"mean landau" , 
"mean landau" , tpeak - landau_m_min , tpeak + landau_m_max);
 
  369     RooRealVar sl(
"sigma landau" , 
"sigma landau" , landau_s_min , landau_s_max);
 
  371     RooLandau L1(
"L1" , 
"Main_Landau" , x , ml , sl) ;
 
  373     RooRealVar mg(
"mean Gauss" , 
"mean Gauss" , tpeak - gaus_m_min , tpeak + gaus_m_max);
 
  375     RooRealVar sg(
"sigma Gauss" , 
"sigma Gauss" , gaus_s_min , gaus_s_max);
 
  377     RooGaussian 
G1(
"G1" , 
"Main_Gaussian" , x , mg , sg) ;
 
  379     RooRealVar 
c1(
"c1" , 
"c1" , l_g_ratio_min , l_g_ratio_max);
 
  381     RooAddPdf M(
"Model" , 
"Model" , RooArgList(
G1,L1) , RooArgList(
c1));
 
  385     RooDataHist Data (
"data" , 
"data" , *
w.var(
"time") , Import(*htime_full));
 
  387     w.pdf(
"Model")->fitTo(Data , Range(tpeak - fit_range_min  , tpeak + fit_range_max) , RooFit::PrintLevel(-1000) , RooFit::PrintEvalErrors(-1000)) ;
 
  389     RooRealVar Tmin (
"tmin" , 
"tmin" , tpeak - fit_range_min) ;
 
  391     RooRealVar Tmax (
"tmax" , 
"tmax" , tpeak + fit_range_max) ;
 
  393     RooRealVar Tpeak (
"tpeak" , 
"tpeak" , tpeak) ;
 
  395     RooRealVar Mpv(
"mpv" , 
"mpv" , Tmin.getVal()) ;
 
  397     RooRealVar Diff(
"peak-mpv" , 
"peak-mpv" , Tpeak.getVal() - Tmin.getVal()) ;
 
  399     double max_pdfval = 0 ;
 
  401     RooRealVar *var = (RooRealVar*)
w.function(
"Model")->getObservables(RooArgSet(*
w.var(
"time")))->first();
 
  403     for(
double x = Tmin.getVal() ; x<Tmax.getVal() ; x+=0.1){
 
  407       double pdfval = 
w.function(
"Model")->getVal(RooArgSet(*var)) ;
 
  409       if (pdfval>max_pdfval){
 
  411         max_pdfval = pdfval ;
 
  465     return saturated_hit ;
 
  595     return time_vs_tot->GetName();