CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/TopQuarkAnalysis/TopHitFit/src/EtaDepResolution.cc

Go to the documentation of this file.
00001 //
00002 //     $Id: EtaDepResolution.cc,v 1.2 2011/10/13 12:34:16 snaumann Exp $
00003 //
00004 // File   : src/EtaDepResolution.cc
00005 // Author : Haryo Sumowidagdo <Suharyo.Sumowidagdo@cern.ch>
00006 // Purpose: Hold on to eta-dependent resolution.
00007 //
00008 
00026 #include <algorithm>
00027 #include <sstream>
00028 #include <stdexcept>
00029 #include "TopQuarkAnalysis/TopHitFit/interface/EtaDepResolution.h"
00030 
00031 namespace hitfit {
00032 
00033 std::vector<EtaDepResElement>::const_iterator
00034 EtaDepResolution::FindResolution(double& eta) const
00035 {
00036 
00037     for (std::vector<EtaDepResElement>::const_iterator res = _EtaDepResElement.begin() ;
00038          res != _EtaDepResElement.end() ;
00039          ++res) {
00040         if (res->IsInInterval(eta) || res->IsOnEdge(eta)) {
00041             return res;
00042         }
00043     }
00044     return _EtaDepResElement.end() ;
00045 
00046 }
00047 
00048 
00049 void
00050 EtaDepResolution::sort()
00051 {
00052     std::stable_sort(_EtaDepResElement.begin(),_EtaDepResElement.end());
00053 }
00054 
00055 
00056 EtaDepResolution::EtaDepResolution()
00057 {
00058 }
00059 
00060 
00061 EtaDepResolution::EtaDepResolution(const std::string& default_file)
00062 {
00063     Read(default_file);
00064 }
00065 
00066 
00067 EtaDepResolution::~EtaDepResolution()
00068 {
00069 }
00070 
00071 
00072 std::vector<EtaDepResElement>::size_type
00073 EtaDepResolution::Read(const std::string& default_file)
00074 {
00075     const Defaults_Text defs(default_file);
00076     Read(defs);
00077     return _EtaDepResElement.size();
00078 }
00079 
00080 
00081 std::vector<EtaDepResElement>::size_type
00082 EtaDepResolution::Read(const Defaults_Text& defs)
00083 {
00084 
00085     _EtaDepResElement.clear();
00086 
00087     for (std::vector<EtaDepResElement>::size_type i = 0 ;
00088          ;
00089          ++i) {
00090 
00091         std::ostringstream os_etamin ;
00092         std::ostringstream os_etamax ;
00093         std::ostringstream os_res ;
00094 
00095         os_etamin << "etadep_etamin" << i ;
00096         os_etamax << "etadep_etamax" << i ;
00097         os_res    << "etadep_vecres" << i ;
00098 
00099         if (defs.exists(os_etamin.str()) &&
00100             defs.exists(os_etamax.str()) &&
00101             defs.exists(os_res.str())) {
00102 
00103             double            etamin = defs.get_float(os_etamin.str());
00104             double            etamax = defs.get_float(os_etamax.str());
00105             Vector_Resolution res(defs.get_string(os_res.str()));
00106             _EtaDepResElement.push_back(EtaDepResElement(etamin,etamax,res));
00107 
00108         }
00109         else {
00110             break;
00111         }
00112 
00113     }
00114 
00115     if (CheckNoOverlap(_EtaDepResElement)) {
00116         sort();
00117     } else {
00118         _EtaDepResElement.clear();
00119     }
00120 
00121     return _EtaDepResElement.size();
00122 
00123 }
00124 
00125 
00126 bool
00127 EtaDepResolution::CheckNoOverlap(const std::vector<EtaDepResElement>& v)
00128 {
00129     for (std::vector<EtaDepResElement>::size_type i = 0 ;
00130          i != v.size() ;
00131          i++) {
00132         for (std::vector<EtaDepResElement>::size_type j = i + 1 ;
00133              j != v.size() ;
00134              j++) {
00135             if (v[i].IsOverlap(v[j])) {
00136                 return false;
00137             }
00138         }
00139     }
00140     return true;
00141 }
00142 
00143 
00144 const double
00145 EtaDepResolution::EtaMin() const
00146 {
00147     if (!(_EtaDepResElement.empty())) {
00148         return _EtaDepResElement.front().EtaMin();
00149     }
00150     return 999.; // a ridiculously positive large number
00151 }
00152 
00153 
00154 const double
00155 EtaDepResolution::EtaMax() const
00156 {
00157     if (!(_EtaDepResElement.empty())) {
00158         return _EtaDepResElement.back().EtaMax();
00159     }
00160     return -999.; // a ridiculously negative large number
00161 }
00162 
00163 
00164 const bool
00165 EtaDepResolution::CheckEta(double eta) const
00166 {
00167     return FindResolution(eta) != _EtaDepResElement.end();
00168 }
00169 
00170 
00171 Vector_Resolution
00172 EtaDepResolution::operator () (double& eta)
00173 {
00174     return GetResolution(eta);
00175 }
00176 
00177 
00178 Vector_Resolution
00179 EtaDepResolution::GetResolution(double& eta) const
00180 {
00181 
00182     std::vector<EtaDepResElement>::const_iterator etaDepResEleVecIter = FindResolution(eta);
00183     if (etaDepResEleVecIter != _EtaDepResElement.end()) {
00184         return etaDepResEleVecIter->GetResolution();
00185     }
00186 
00187     std::stringstream message;
00188     message << "Error, the given eta value : "
00189             << eta << " is not inside the valid eta range!" ;
00190 
00191     throw std::runtime_error(message.str());
00192 }
00193 
00194 EtaDepResElement
00195 EtaDepResolution::GetEtaDepResElement(double& eta) const
00196 {
00197     return *(FindResolution(eta));
00198 }
00199 
00200 
00201 const std::vector<EtaDepResElement>
00202 EtaDepResolution::GetEtaDepResElement() const
00203 {
00204     return _EtaDepResElement;
00205 }
00206 
00207 } // namespace hitfit