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