• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

/Users/jmonk/Physics/ForIA/src/AnalysisTools/MinBiasPhiGridCorrections.cxx

Go to the documentation of this file.
00001 #include "ForIA/AnalysisTools/MinBiasPhiGridCorrections.hh"
00002 #include "ForIA/IDataLoader.hh"
00003 
00004 #include "TH2F.h"
00005 
00006 #include "boost/lexical_cast.hpp"
00007 
00008 namespace ForIA{
00009 
00010   MinBiasPhiGridCorrections::MinBiasPhiGridCorrections(): m_segments(32), m_doInitialise(true),
00011   m_gotSegment(m_segments, false), m_gotGrid(false), m_randomGenerator(0){
00012 
00013   }
00014 
00015   MinBiasPhiGridCorrections::~MinBiasPhiGridCorrections(){
00016     if(m_randomGenerator != 0){
00017       gsl_rng_free(m_randomGenerator);
00018     }
00019   }
00020   
00021   void MinBiasPhiGridCorrections::initialise(){
00022 
00023     DataLoaderPtr dl = IDataLoader::create();
00024     dl->open("Root/MinBias/TruthReco.simple.quantiles.root");
00025 
00026     m_quantilePlot = dl->retrieve<TH2F>("TruthRecoCorrelations/quantile/self");
00027     /*
00028     for(int seg=0; seg != m_segments; ++seg){
00029       string path = "TruthRecoCorrelations/seg" + 
00030         boost::lexical_cast<string>(seg) + "/quantile/";
00031 
00032       TH2F *selfPlot = dl->retrieve<TH2F>(path + "self");
00033       m_selfPlots.push_back((TH2F*)selfPlot->Clone());
00034 
00035       TH2F *plusPlot = dl->retrieve<TH2F>(path + "diffPlus");
00036       m_plusPlots.push_back((TH2F*)plusPlot->Clone());
00037 
00038       TH2F *minusPlot = dl->retrieve<TH2F>(path + "diffMinus");
00039       m_minusPlots.push_back((TH2F*)minusPlot->Clone());
00040 
00041     }
00042     */
00043     dl->close();
00044     
00045     m_minPT = m_quantilePlot->GetXaxis()->GetBinUpEdge(1);
00046     
00047     std::cout<<"correction min pT = "<<m_minPT<<std::endl;
00048     
00049     // see http://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html
00050     m_randomGenerator = gsl_rng_alloc (gsl_rng_taus2);
00051     
00052     gsl_rng_set(m_randomGenerator, 8912041);
00053     
00054     m_doInitialise = false;
00055     return;
00056   }
00057 
00058   bool MinBiasPhiGridCorrections::setGrid(const vector<double> &grid){
00059     
00060     if(m_doInitialise) initialise();
00061     
00062     for(vector<bool>::iterator seg = m_gotSegment.begin();
00063         seg != m_gotSegment.end(); ++seg){
00064       (*seg) = false;
00065     }
00066 
00067     m_gotGrid = false;
00068     
00069     m_input = grid;
00070     
00071     return true;
00072   }
00073   
00075   const vector<double> &MinBiasPhiGridCorrections::correctedGrid(){
00076         
00077     if(m_gotGrid) return m_corrected;
00078         
00079     
00080     vector<double> left;
00081     vector<double> right;
00082         
00083     m_corrected.clear();
00084     
00085     for(int seg=0; seg != m_segments; ++seg){
00086       
00087       double delta = getDelta(m_quantilePlot, m_input[seg]);
00088       if(delta < 500. && delta > 0.) delta = 0.;
00089       double result = m_input[seg] + delta;
00090       if(result < m_minPT) result = 0.;
00091       m_corrected.push_back(result);
00092     }
00093     /*
00094     for(int seg=0; seg != m_segments; ++seg){
00095       int segMinus=(seg==0)? m_segments-1: seg-1;
00096       double delta = getDelta(m_plusPlots[segMinus], m_input[seg]);
00097       double diff = m_input[seg] - delta;
00098       if(diff < 0.){
00099         diff = 0.;
00100         delta = m_input[seg];
00101       }
00102       left.push_back(delta);
00103       m_corrected.push_back(diff);
00104     }
00105     
00106     for(int seg=0; seg != m_segments; ++seg){
00107       int segPlus = seg + 1;
00108       if(segPlus == m_segments) segPlus = 0;
00109       double delta = getDelta(m_minusPlots[segPlus], m_input[seg]);
00110       double diff = m_corrected[seg] - delta;
00111       if(diff < 0.){
00112         diff = 0.;
00113         delta = m_corrected[seg];
00114       }
00115       right.push_back(delta);
00116       m_corrected[seg] = diff;
00117     }
00118     
00119     for(int seg=0; seg != m_segments; ++seg){
00120       double delta = getDelta(m_selfPlots[seg], m_input[seg]);
00121       int segPlus = seg + 1;
00122       if(segPlus == m_segments) segPlus = 0;
00123 
00124       int segMinus=(seg==0)? m_segments-1: seg-1;
00125      
00126       double cor = m_input[seg] + delta;// + left[segPlus] + right[segMinus];
00127       
00128       if(cor < 0.) cor=0.;
00129       
00130       m_corrected[seg] = cor;
00131       
00132     }
00133     */
00134     m_gotGrid = true;
00135     return m_corrected;
00136   }
00137   /*
00138   double MinBiasPhiGridCorrections::correctedSegment(int seg){
00139     
00140     if(m_gotSegment[seg]) return m_corrected[seg];
00141     
00142     int segPlus = seg + 1;
00143     if(segPlus == m_segments) segPlus = 0;
00144     int segMinus = seg - 1;
00145     if(segMinus == -1) segMinus = m_segments - 1;
00146     
00147     double deltaSelf  = getDelta(m_selfPlots[seg] , m_input[seg]);
00148     double deltaPlus  = getDelta(m_plusPlots[seg] , m_input[segPlus]);
00149     double deltaMinus = getDelta(m_minusPlots[seg], m_input[segMinus]);
00150     
00151     m_corrected[seg] = m_input[seg] + deltaSelf + deltaPlus + deltaMinus;
00152     
00153     return m_corrected[seg];
00154   }
00155 */
00156   double MinBiasPhiGridCorrections::getDelta(const TH2F *qPlot, double pT){
00157     
00158     int xbin = qPlot->GetXaxis()->FindBin(pT);
00159     
00160     double ran = gsl_rng_uniform(m_randomGenerator);
00161     
00162     int ybin = qPlot->GetYaxis()->FindBin(ran);
00163     
00164     if(ybin < 2) ybin=2;
00165     
00166     int binUp = qPlot->GetBin(xbin, ybin);
00167     int binDn = qPlot->GetBin(xbin, ybin - 1);
00168     
00169     double deltaUp = qPlot->GetBinContent(binUp);
00170     double deltaDn = qPlot->GetBinContent(binDn);
00171     
00172     double upEdge = qPlot->GetYaxis()->GetBinUpEdge(ybin);
00173     double dnEdge = qPlot->GetYaxis()->GetBinLowEdge(ybin);
00174     
00175     
00176     return (deltaUp - (upEdge - ran) * (deltaUp - deltaDn) / (upEdge - dnEdge));
00177   }
00178   
00179 }
00180 
00181 

Generated on Mon Jul 30 2012 16:56:35 for ForIA by  doxygen 1.7.2