FitOverROI.cc

00001 #include "FitOverROI.hh"
00002 
00003 #include "TMath.h"
00004 #include "TROOT.h"
00005 #include "TFitResult.h"
00006 #include "TSpectrum.h"
00007 #include "TTree.h"
00008 #include "TFile.h"
00009 #include "TF1.h"
00010 #include "TCanvas.h"
00011 #include "TPad.h"
00012 #include "TLine.h"
00013 #include "TAxis.h"
00014 
00015 #include "TList.h"
00016 #include "TCut.h"
00017 #include <algorithm>
00018 #include <numeric>
00019 #include <string>
00020 #include <iomanip>
00021 #include <iostream>
00022 #include <sstream>
00023 #include "TMatrixDSym.h"
00024 #include "TGraph.h"
00025 #include <fstream>
00026 
00027 
00028 using namespace std;
00029 
00030 #define HISTOGRAMWIDTH 7
00031 #define NPEAKS 7
00032 
00033 
00034 
00035 #define mCON params[CONSTANT]
00036 #define mLAM params[LAMBDA]
00037 #define mMEAN params[MEAN]
00038 #define mSIG params[SIGMA]
00039 #define mAMP params[AMP_E]
00040 #define mPE params[P_E]
00041 #define mSHT params[SHOTNOISE]
00042 #define mPDM params[PEDMEAN]
00043 
00044 
00045 const char* names[] = {"CONSTANT","LAMBDA", "SPE_MEAN", "SPE_SIGMA", "AMP_E", "P_E", "SHOTNOISE" ,"PEDMEAN","NPAR"};
00046 
00047 
00048 Double_t FitOverROI::response_0(Double_t* x, Double_t* params) 
00049 {
00050     double y = x[0] - mPDM;
00051     return mCON*TMath::Poisson(0,mLAM)*TMath::Gaus(y, 0, mSHT, true);
00052 }
00053 
00054 Double_t FitOverROI::background_func(Double_t* x, Double_t* params)
00055 {
00056     double y = x[0] - mPDM;
00057 
00058     //mathematica version (my own convolution)
00059     double exp_term=(TMath::Power(TMath::E(),(-2*mAMP*y + mSHT*mSHT)/
00060                                   (2.*mAMP*mAMP))*mPE*
00061                      (1 + TMath::Erf(((mAMP*y)/mSHT - mSHT)/(sqrt(2)*mAMP))))/
00062         (2.*mAMP);
00063     return mCON*TMath::Poisson(1,mLAM)*exp_term;
00064 }
00065 
00066 Double_t FitOverROI::gauss_func(Double_t* x, Double_t* params)
00067 {
00068     double y = x[0] - mPDM;
00069     double sigma_1=sqrt(mSHT*mSHT + mSIG*mSIG); 
00070         
00071     double gauss_term= (1-mPE)*(TMath::Power(TMath::E(), - (mMEAN-y)*(mMEAN-y)/(2*sigma_1*sigma_1)) *
00072                                 (1 + TMath::Erf((mMEAN*mSHT*mSHT + mSIG*mSIG*y)/(sqrt(2) * mSIG*mSHT *sigma_1))) /
00073                                 (sqrt(2*TMath::Pi())*sigma_1 * (1+ TMath::Erf(mMEAN/(sqrt(2)*mSIG)))));
00074         
00075         
00076     double response=mCON*TMath::Poisson(1,mLAM)*gauss_term;
00077     return response;
00078 }  
00079   
00080 Double_t FitOverROI::response_1(Double_t* x, Double_t* params)
00081 {
00082     double exp_term= background_func(x, params);
00083         
00084     double gauss_term= gauss_func(x, params);
00085         
00086         
00087     double response=gauss_term+exp_term;
00088     return response;
00089 }
00090 
00091 
00092 Double_t FitOverROI::response_2(Double_t* x, Double_t* params)
00093 {
00094     double y = x[0] - mPDM;
00095     double response=((TMath::Power(TMath::E(),(-2*mAMP*y + TMath::Power(mSHT,2))/
00096                                    (2.*TMath::Power(mAMP,2)))*mPE*mPE*
00097                       (mAMP*y - TMath::Power(mSHT,2)))/TMath::Power(mAMP,3) + 
00098                      (2*TMath::Power(-1 + mPE,2)*sqrt(2/TMath::Pi()))/
00099                      (TMath::Power(TMath::E(),TMath::Power(-2*mMEAN + y,2)/
00100                                    (2.*(TMath::Power(mSHT,2) + 
00101                                         2*TMath::Power(mSIG,2))))*mSHT*
00102                       sqrt(2/TMath::Power(mSHT,2) + TMath::Power(mSIG,-2))*
00103                       mSIG*TMath::Power(1 + TMath::Erf(mMEAN/(sqrt(2)*mSIG)),2)) 
00104                      + (2*TMath::Power(TMath::E(),
00105                                        (2*mAMP*mMEAN - 2*mAMP*y + TMath::Power(mSHT,2) + 
00106                                         TMath::Power(mSIG,2))/(2.*TMath::Power(mAMP,2)))*
00107                         (-1 + mPE)*mPE*
00108                         (-1 + TMath::Erf((mAMP*(mMEAN - y) + 
00109                                           TMath::Power(mSHT,2) + TMath::Power(mSIG,2))/
00110                                          (mAMP*sqrt(2*TMath::Power(mSHT,2) + 
00111                                                     2*TMath::Power(mSIG,2))))))
00112                      /(mAMP*(1 + TMath::Erf(mMEAN/(sqrt(2)*mSIG)))));
00113     
00114     return TMath::Poisson(2,mLAM)*mCON*response;
00115     
00116       /*double sigma_1=sqrt(mSHT*mSHT + mSIG*mSIG);     
00117       
00118       double response= TMath::Poisson(2,mLAM)*(mPE*mPE*y/(mAMP*mAMP) * TMath::Power(TMath::E(), -y/mAMP)+ 
00119       2 * (1-mPE)*mPE/(sqrt(2*TMath::Pi())*sigma_1) * TMath::Power(TMath::E(), -0.5*(y-mMEAN-mAMP)*(y-mMEAN-mAMP)/(sigma_1*sigma_1)) + 
00120       (1-mPE)*(1-mPE)/(2 *sqrt(TMath::Pi())*sigma_1) *TMath::Power(TMath::E(),-0.5 *(y- 2*mMEAN)*(y- 2*mMEAN)/(sigma_1 * sigma_1 *2)));
00121       return mCON*response;*/
00122 }
00123         
00124 Double_t FitOverROI::m_n(const Double_t* params)
00125 {
00126     return mMEAN + mAMP*mPE - mMEAN*mPE + 
00127         (sqrt(2/TMath::Pi())*mSIG*
00128          (1/(1 + TMath::Erf(mMEAN/(sqrt(2)*mSIG))) + 
00129           mPE/(-2 + TMath::Erfc(mMEAN/(sqrt(2)*mSIG)))))/
00130         TMath::Power(TMath::E(),TMath::Power(mMEAN,2)/(2.*TMath::Power(mSIG,2)));
00131 }
00132 
00133 Double_t FitOverROI::sigma_n(const  Double_t* params)
00134 {
00135     return sqrt(-(TMath::Power(mMEAN,2)*(-1 + mPE)) + 
00136                 2*TMath::Power(mAMP,2)*mPE  - 
00137                 (-1 + mPE)*TMath::Power(mSIG,2) - 
00138                 TMath::Power(mMEAN + mAMP*mPE - mMEAN*mPE + 
00139                              (sqrt(2/TMath::Pi())*mSIG*
00140                               (1/(1 + TMath::Erf(mMEAN/(sqrt(2)*mSIG))) + 
00141                                mPE/(-2 + TMath::Erfc(mMEAN/(sqrt(2)*mSIG)))
00142                                   ))/
00143                              TMath::Power(TMath::E(),TMath::Power(mMEAN,2)/
00144                                           (2.*TMath::Power(mSIG,2))),2) + 
00145                 (mMEAN*sqrt(2/TMath::Pi())*mSIG*
00146                  (1/(1 + TMath::Erf(mMEAN/(sqrt(2)*mSIG))) + 
00147                   mPE/(-2 + TMath::Erfc(mMEAN/(sqrt(2)*mSIG)))))
00148                 /TMath::Power(TMath::E(),TMath::Power(mMEAN,2)/
00149                               (2.*TMath::Power(mSIG,2))));
00150 }
00151            
00152 Double_t FitOverROI::response_multi(Double_t* x, Double_t* params)
00153 {       
00154     double y = x[0] - mPDM;
00155         
00156                 
00157     double response=0;
00158         
00159     for(int i=3; i<=NPEAKS; i++)
00160     {
00161         response += TMath::Poisson(i,mLAM) *TMath::Gaus(y,m_n(params)*i,sqrt(i*sigma_n(params)*sigma_n(params)+TMath::Power(mSHT,2)),true);
00162     }
00163     return mCON*response;
00164 }       
00165 
00166 Double_t FitOverROI::SPEFunc(Double_t* x, Double_t* params)
00167 {
00168     double sig = (response_0(x, params)+response_1(x,params)+response_2(x,params)+response_multi(x,params));    
00169     /*double fixerparams[] = {mCON, 0.00143997, 83.9085, 29.0772, 149.998, 0.704112 , mSHT };
00170       double base= (response_1(x,fixerparams)+response_2(x,fixerparams)+response_multi(x,fixerparams));
00171       return sig*(TMath::Poisson(0,0.00143997))+base;*/
00172     return sig;
00173 
00174 }
00175 
00176 TFitResultPtr FitOverROI::FitSPE(FitTH1F* spe, ChanFitSettings& CFS, int ntriggers,
00177                                  bool allow_bg,
00178                                  bool force_old)
00179 {
00180     
00181     TF1* spefunc = (TF1*)gROOT->GetFunction("spefunc");
00182     int nEvtsInRange = (int)spe->Integral(0,spe->GetNbinsX()+1,"width");
00183         
00184     spe->GetXaxis()->SetRangeUser(CFS.range_min, CFS.range_max);
00185         
00186     double fitmin, fitmax;
00187     fitmin = spe->GetBinLowEdge(spe->GetXaxis()->GetFirst());
00188     fitmax = 0;
00189     //find the last non-zero bin
00190     int bin = spe->GetXaxis()->GetLast();
00191     //bin = spe->GetNbinsX()+1;
00192                 
00193     while(spe->GetBinContent(bin) == 0) {bin--;}
00194     fitmax = spe->GetBinLowEdge(bin);
00195     fitmax = fitmax*1; 
00196 
00197     //Pedestal centering
00198         
00199     Double_t pedmean = CFS.pedmean_min_bound;
00200     if(fitmin<0 && !force_old && (max(fitmin,CFS.pedrange_min)< min(CFS.pedrange_max,fitmax)))
00201     {
00202         spe->GetXaxis()->SetRangeUser(max(fitmin,CFS.pedrange_min), min(CFS.pedrange_max,fitmax));
00203         std::cout<<"Fitting pedestal in range ["<<max(fitmin,CFS.pedrange_min)<<", "<<min(fitmax,CFS.pedrange_max)<<"]"<<std::endl;
00204         TFitResultPtr pedfit = spe->Fit("gaus","QMIS");
00205         if(pedfit.Get())
00206         {
00207             pedmean = pedfit->Value(1);
00208         }
00209         else{pedmean=0;}
00210     }
00211     if(force_old)
00212     {
00213         pedmean=spefunc->GetParameter(PEDMEAN);
00214     }
00215         
00216     double params[NPAR];
00217     //find the likely place for the single p.e. peak
00218     bin = spe->FindBin(0);
00219     //params[SHOTNOISE] = FindExtremum(bin, spe, FORWARD, MINIMUM)/3.;
00220 
00221 
00222     if(!force_old || !spefunc)
00223     {
00224         params[SHOTNOISE] = CFS.shotnoise_start_value;
00225         params[MEAN] = CFS.mean_start_value;
00226         params[SIGMA] = CFS.sigma_start_value;
00227         params[LAMBDA] = CFS.lambda_start_value;
00228         if(CFS.constant_start_value)
00229         { 
00230             params[CONSTANT] = nEvtsInRange;
00231         } 
00232         else
00233         {  
00234             params[CONSTANT] = CFS.constant_start_value;
00235         }
00236         params[AMP_E] = CFS.amp_E_start_value;
00237         params[P_E] = CFS.p_E_start_value;  
00238                 
00239         spefunc = new TF1("spefunc", SPEFunc, fitmin, fitmax, NPAR);
00240 
00241         spefunc->SetParameters(params);
00242         for(int i=0; i<NPAR; i++)
00243             spefunc->SetParName(i, names[i]);
00244         //spefunc->SetParLimits(CONSTANT, 0 , params[CONSTANT]);
00245         //DIVOT
00246         spefunc->SetParLimits(LAMBDA, CFS.lambda_min_bound, CFS.lambda_max_bound);
00247         spefunc->SetParLimits(MEAN, CFS.mean_min_bound, CFS.mean_max_bound);//spe_min, spe_max);
00248         spefunc->SetParLimits(SHOTNOISE, CFS.shotnoise_min_bound, CFS.shotnoise_max_bound);//spe_min, spe_max);         
00249         spefunc->SetParLimits(SIGMA, CFS.sigma_min_bound, CFS.sigma_max_bound);
00250         spefunc->SetParLimits(P_E, CFS.p_E_min_bound, CFS.p_E_max_bound);
00251         spefunc->SetParLimits(AMP_E, CFS.amp_E_min_bound, CFS.amp_E_max_bound);//Focus here
00252         if(!allow_bg)
00253         {
00254             cout<<"Disallowing exponential background for this fit"<<endl;
00255             spefunc->SetParameter(AMP_E,0);
00256             spefunc->SetParameter(P_E,0);
00257             spefunc->FixParameter(AMP_E,0);
00258             spefunc->FixParameter(P_E,0);
00259         }
00260                 
00261                 
00262         spefunc->SetLineStyle(1);
00263         spefunc->SetLineColor(kBlue);
00264     }
00265     else
00266     {
00267         for(int i=0; i<NPAR; i++)
00268         {
00269             if(i == CONSTANT || i == LAMBDA)
00270                 continue;
00271             double width=0;
00272             spefunc->SetParLimits(i,
00273                                   std::max(0. ,spefunc->GetParameter(i)-width*spefunc->GetParError(i)),
00274                                   spefunc->GetParameter(i) + width*spefunc->GetParError(i));
00275         }
00276     }
00277     spefunc->FixParameter(CONSTANT, nEvtsInRange);
00278     spefunc->FixParameter(PEDMEAN, pedmean);
00279         
00280     spe->GetXaxis()->SetRangeUser(fitmin, fitmax);
00281     
00282     spe->Draw();
00283     spefunc->Draw("same");
00284 
00285     //spe->Fit(spefunc,"MRES");
00286     //spe->Fit(spefunc,"MRL");
00287     std::cout<<std::endl<<"Fitting entire spectrum"<<std::endl;
00288     TFitResultPtr fitResult = spe->Fit(spefunc,"QMRES");
00289     spe->fitResult= fitResult;
00290 
00291     //spefunc->DrawCopy("same");
00292     std::cout<<endl<<"Fit Results: "<<endl
00293              <<"Fit Status: "<<spe->fitResult<<endl 
00294              <<"Chi2/NDF = "<<spefunc->GetChisquare()<<"/"<<spefunc->GetNDF()<<endl
00295              <<"Prob = "<<spefunc->GetProb()<<std::endl<<std::endl;
00296 
00297     for(int i=0; i<NPAR; i++){  params[i] = spefunc->GetParameter(i);}
00298     TList* funclist = spe->GetListOfFunctions();
00299 
00300     static TF1* background = new TF1("background",background_func,fitmin,fitmax,NPAR);
00301     background->SetRange(fitmin, fitmax);
00302     background->SetLineColor(kRed);
00303     background->SetParameters(spefunc->GetParameters());
00304     funclist->Add(background->Clone());
00305   
00306     static TF1* gauss_curve = new TF1("gause_curve",gauss_func,fitmin,fitmax,NPAR);
00307     gauss_curve->SetRange(fitmin, fitmax);
00308     gauss_curve->SetLineColor(kRed);
00309     gauss_curve->SetParameters(spefunc->GetParameters());
00310     funclist->Add(gauss_curve->Clone());
00311 
00312 
00313     TF1* response_0_f = (TF1*)gROOT->GetFunction("response_0_f");       
00314     if(!response_0_f){response_0_f = new TF1("response_0_f",response_0,fitmin,fitmax,NPAR);}
00315     response_0_f->SetRange(fitmin, fitmax);
00316     response_0_f->SetLineColor(kGreen); 
00317     response_0_f->SetParameters(spefunc->GetParameters());
00318     response_0_f->SetRange(fitmin,70);
00319     if(response_0_f){funclist->Add(response_0_f->Clone());}
00320         
00321     TF1* response_1_f = (TF1*)gROOT->GetFunction("response_1_f");       
00322     if(!response_1_f){response_1_f = new TF1("response_1_f",response_1,fitmin,fitmax,NPAR);}
00323     response_1_f->SetRange(fitmin, fitmax);
00324     response_1_f->SetLineColor(kMagenta); 
00325     response_1_f->SetParameters(spefunc->GetParameters());
00326     if(response_1_f){funclist->Add(response_1_f->Clone());}
00327         
00328     TF1* response_2_f = (TF1*)gROOT->GetFunction("response_2_f");       
00329     if(!response_2_f){response_2_f = new TF1("response_2_f",response_2,fitmin,fitmax,NPAR);}
00330     response_2_f->SetRange(fitmin, fitmax);
00331     response_2_f->SetLineColor(kGreen); 
00332     response_2_f->SetParameters(spefunc->GetParameters());
00333     if(response_2_f){funclist->Add(response_2_f->Clone());}
00334         
00335     TF1* response_multi_f = (TF1*)gROOT->GetFunction("response_multi_f");       
00336     if(!response_multi_f){response_multi_f = new TF1("response_multi_f",response_multi,fitmin,fitmax,NPAR);}
00337     response_multi_f->SetRange(fitmin, fitmax);
00338     response_multi_f->SetLineColor(kGreen); 
00339     response_multi_f->SetParameters(spefunc->GetParameters());
00340     if(response_multi_f){funclist->Add(response_multi_f->Clone());}
00341         
00342 
00343     //double thresh = spefunc->GetParameter(MEAN) - 2.*spefunc->GetParameter(SIGMA);
00344     //TLine* twosigma = new TLine(thresh, spe->GetYaxis()->GetBinLowEdge(1), thresh, 1.1*spe->GetMaximum());
00345     //twosigma->SetLineColor(kGreen);
00346     //twosigma->Draw();
00347 
00348     cout<<"Valid Events collected: "<<ntriggers<<std::endl;
00349     cout<<"Events Passing Cuts: " <<spe->GetEntries()<<std::endl;
00350     cout<<"Noise fraction: "
00351         <<spefunc->GetParameter(AMP_E)/spefunc->GetParameter(CONSTANT)
00352         <<std::endl;
00353     cout<<"Exponential fraction: "<<spefunc->GetParameter(P_E)<<std::endl;
00354     cout<<"Average photoelectrons per pulse: "<<spefunc->GetParameter(LAMBDA)
00355         <<std::endl;
00356     cout<<"Pedestal Mean: "<<spefunc->GetParameter(PEDMEAN)<<" count*samples"<<endl;
00357     cout<<"Pedestal Width: "<<spefunc->GetParameter(SHOTNOISE)<<" count*samples"<<endl;
00358     //double mean = spefunc->GetParameter(MEAN);
00359         
00360 
00361         
00362     double conversion = 0.00049 /*V/ct*/ * 4E-9 /*ns/samp*/ * 1./25. /*ohm*/ *
00363         0.1 /*amplifier*/ * 1.E12 /*pC/C*/;
00364         
00365     cout<<"Single photoelectron Peak: "<<m_n(params)<<" count*samples"<<std::endl
00366         <<"Single photoelectron Width: " <<sigma_n (params)<<" count*samples"<<std::endl
00367         <<"Single photoelectron Charge: "<<m_n(params)*conversion<<" pC"<<std::endl
00368         <<"Phototube Gain: "<<m_n(params)*conversion / 1.602E-7<<std::endl;
00369         
00370     //afan-----------
00371     double pdfmean_approx = mPE*mAMP+(1-mPE)*mMEAN;
00372     //double pdfmean_error_uncorr = sqrt(TMath::Power((mAMP-mMEAN)*spefunc->GetParError(P_E),2) 
00373     //                                     +TMath::Power((1-mPE)*spefunc->GetParError(MEAN),2)
00374     //                             +TMath::Power(mPE*spefunc->GetParError(AMP_E),2));
00375     //double pdfmean_error_corr = (pdfmean_error_uncorr 
00376     //                       + 2*(mAMP-mMEAN)*(1-mPE)*cov[P_E][MEAN] 
00377     //                       + 2*(mAMP-mMEAN)*mPE*cov[P_E][AMP_E] 
00378     //                       + 2*(1-mPE)*mPE*cov[MEAN][AMP_E]);
00379     cout<<"Approximated pdfmean (using corr): "<<pdfmean_approx
00380         <<" +- "<<pdfmean_error_corr(fitResult)<<endl;
00381     return fitResult;
00382 }
00383 
00384 double FitOverROI::pdfmean_error_corr(TFitResultPtr& fitresult)
00385 {
00386         TMatrixDSym cov = fitresult->GetCovarianceMatrix();
00387   const double* params = fitresult->GetParams();
00388   const double* errors = fitresult->GetErrors();
00389   //leaving out small correction factor from cut-off gaussian
00390     double pdfmean_error_uncorr_sq = TMath::Power((mAMP-mMEAN)*errors[P_E],2)
00391                                        +TMath::Power((1-mPE)*errors[MEAN],2)
00392                                        +TMath::Power(mPE*errors[AMP_E],2);
00393     /* cout<<endl<<"mean err: "<<errors[MEAN]<<" amp err: "
00394                <<errors[AMP_E]<<" p_E err: "
00395                <<errors[P_E]<<" uncorr error: "
00396                <<sqrt(pdfmean_error_uncorr_sq)
00397                <<" cov matrix (mean x p_E): "<<2*(mAMP-mMEAN)*(1-mPE)*cov[P_E][MEAN]
00398                <<" cov matrix (amp_E x p_E): "<<2*(mAMP-mMEAN)*mPE*cov[P_E][AMP_E] 
00399                <<" cov matrix (mean x amp_E): "<<2*(1-mPE)*mPE*cov[MEAN][AMP_E]
00400                <<endl;
00401                cov.Print(); */
00402     return sqrt(pdfmean_error_uncorr_sq + (2*(mAMP-mMEAN)*(1-mPE)*cov[P_E][MEAN] 
00403                                    + 2*(mAMP-mMEAN)*mPE*cov[P_E][AMP_E] 
00404                                    + 2*(1-mPE)*mPE*cov[MEAN][AMP_E]));
00405   
00406   
00407   
00408   
00409 }
00410 
00411 /* double FitOverROI::pdfmean_error_corr(TFitResultPtr& fitresult)
00412 {
00413     TMatrixDSym cov = fitresult->GetCovarianceMatrix();
00414     const double* params = fitresult->GetParams();
00415     const double* errors = fitresult->GetErrors();
00416     double pdfmean_error_uncorr = sqrt(TMath::Power((mAMP-mMEAN)*errors[P_E],2)
00417                                        +TMath::Power((1-mPE)*errors[MEAN],2)
00418                                        +TMath::Power(mPE*errors[AMP_E],2));
00419     cout<<endl<<"pdfmean uncorr:"<<pdfmean_error_uncorr<<endl;
00420     cout<<"correction: "<<(sqrt(2/TMath::Pi())*mSIG*
00421          (1/(1 + TMath::Erf(mMEAN/(sqrt(2)*mSIG))) + 
00422           mPE/(-2 + TMath::Erfc(mMEAN/(sqrt(2)*mSIG)))))/
00423         TMath::Power(TMath::E(),TMath::Power(mMEAN,2)/(2.*TMath::Power(mSIG,2)))<<endl;
00424     cout<<"term 1: "<<2*(mAMP-mMEAN)*(1-mPE)*cov[P_E][MEAN]<<" term 2: "<<2*(mAMP-mMEAN)*mPE*cov[P_E][AMP_E] <<" term 3: "<<2*(1-mPE)*mPE*cov[MEAN][AMP_E]<<endl;
00425     return pdfmean_error_uncorr + (2*(mAMP-mMEAN)*(1-mPE)*cov[P_E][MEAN] 
00426                 + 2*(mAMP-mMEAN)*mPE*cov[P_E][AMP_E] 
00427                 + 2*(1-mPE)*mPE*cov[MEAN][AMP_E]);
00428 
00429 } */
00430 /* int ProcessSPEFile(const char* fname, Long_t roi = -1, int channel = -1, 
00431    double emax = -1, bool force_old = false)
00432    {
00433    if(!gPad) new TCanvas;
00434    gPad->SetLogy();
00435    gPad->SetTitle(fname);
00436    static bool loaded = false;
00437    if(!loaded){
00438    gROOT->ProcessLine(".L lib/libDict.so");
00439    loaded = true;
00440    }
00441 
00442    TFile* fin = new TFile(fname);
00443    if(!fin->IsOpen()){
00444    std::cerr<<"Unable to open file "<<fname<<std::endl;
00445    return 1;
00446    }
00447 
00448    TTree* Events = (TTree*)(fin->Get("Events"));
00449    if(!Events){
00450    std::cerr<<"Unable to load Events tree from file "<<fname<<std::endl;
00451    return 2;
00452    }
00453    TString data_source;
00454    if(roi == -1) data_source = "channels[].pulses.integral";
00455    else data_source = TString("-channels[].regions[") + roi
00456    + TString("].integral");
00457    if( emax < 0){
00458    Events->Draw(data_source+" >> htemp",data_source+" > 0");
00459    TH1* htemp = (TH1*)(gROOT->FindObject("htemp"));
00460    emax = htemp->GetMean()*HISTOGRAMWIDTH;
00461    }
00462         
00463    TCut min_en = (data_source+" > 0").Data();
00464    char chstring[100];
00465    sprintf(chstring,data_source+" < %.0f",emax);
00466    TCut max_en = chstring;
00467    sprintf(chstring,"channels[].channel_id == %d",channel);
00468    TCut chan_cut = (channel == -1 ? "" : chstring);
00469 
00470    TCut time_cut = (roi == -1 ? get_time_cut(Events, chan_cut) : "" );
00471 
00472    TCut total_cut = min_en && max_en && time_cut && chan_cut;
00473         
00474    Events->Draw(data_source+" >> hspec",total_cut,"e");
00475    TH1* hspec = (TH1*)(gROOT->FindObject("hspec"));
00476 
00477 
00478    FitSPE(hspec, Events->GetEntries("channels[].baseline.found_baseline"),
00479    force_old);
00480 
00481 
00482    return 0;
00483    } */
00484 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines

Generated on 20 Jun 2014 for daqman by  doxygen 1.6.1