CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
EtaDepResolution.cc
Go to the documentation of this file.
1 //
2 //
3 // File : src/EtaDepResolution.cc
4 // Author : Haryo Sumowidagdo <Suharyo.Sumowidagdo@cern.ch>
5 // Purpose: Hold on to eta-dependent resolution.
6 //
7 
24 #include <algorithm>
25 #include <sstream>
26 #include <stdexcept>
28 
29 namespace hitfit {
30 
31  std::vector<EtaDepResElement>::const_iterator EtaDepResolution::FindResolution(double& eta) const {
32  for (std::vector<EtaDepResElement>::const_iterator res = _EtaDepResElement.begin(); res != _EtaDepResElement.end();
33  ++res) {
34  if (res->IsInInterval(eta) || res->IsOnEdge(eta)) {
35  return res;
36  }
37  }
38  return _EtaDepResElement.end();
39  }
40 
41  void EtaDepResolution::sort() { std::stable_sort(_EtaDepResElement.begin(), _EtaDepResElement.end()); }
42 
44 
45  EtaDepResolution::EtaDepResolution(const std::string& default_file) { Read(default_file); }
46 
48 
50  const Defaults_Text defs(default_file);
51  Read(defs);
52  return _EtaDepResElement.size();
53  }
54 
56  _EtaDepResElement.clear();
57 
59  std::ostringstream os_etamin;
60  std::ostringstream os_etamax;
61  std::ostringstream os_res;
62 
63  os_etamin << "etadep_etamin" << i;
64  os_etamax << "etadep_etamax" << i;
65  os_res << "etadep_vecres" << i;
66 
67  if (defs.exists(os_etamin.str()) && defs.exists(os_etamax.str()) && defs.exists(os_res.str())) {
68  double etamin = defs.get_float(os_etamin.str());
69  double etamax = defs.get_float(os_etamax.str());
70  Vector_Resolution res(defs.get_string(os_res.str()));
71  _EtaDepResElement.push_back(EtaDepResElement(etamin, etamax, res));
72 
73  } else {
74  break;
75  }
76  }
77 
79  sort();
80  } else {
81  _EtaDepResElement.clear();
82  }
83 
84  return _EtaDepResElement.size();
85  }
86 
87  bool EtaDepResolution::CheckNoOverlap(const std::vector<EtaDepResElement>& v) {
88  for (std::vector<EtaDepResElement>::size_type i = 0; i != v.size(); i++) {
89  for (std::vector<EtaDepResElement>::size_type j = i + 1; j != v.size(); j++) {
90  if (v[i].IsOverlap(v[j])) {
91  return false;
92  }
93  }
94  }
95  return true;
96  }
97 
98  const double EtaDepResolution::EtaMin() const {
99  if (!(_EtaDepResElement.empty())) {
100  return _EtaDepResElement.front().EtaMin();
101  }
102  return 999.; // a ridiculously positive large number
103  }
104 
105  const double EtaDepResolution::EtaMax() const {
106  if (!(_EtaDepResElement.empty())) {
107  return _EtaDepResElement.back().EtaMax();
108  }
109  return -999.; // a ridiculously negative large number
110  }
111 
112  const bool EtaDepResolution::CheckEta(double eta) const { return FindResolution(eta) != _EtaDepResElement.end(); }
113 
115 
117  std::vector<EtaDepResElement>::const_iterator etaDepResEleVecIter = FindResolution(eta);
118  if (etaDepResEleVecIter != _EtaDepResElement.end()) {
119  return etaDepResEleVecIter->GetResolution();
120  }
121 
122  std::stringstream message;
123  message << "Error, the given eta value : " << eta << " is not inside the valid eta range!";
124 
125  throw std::runtime_error(message.str());
126  }
127 
129 
130  const std::vector<EtaDepResElement> EtaDepResolution::GetEtaDepResElement() const { return _EtaDepResElement; }
131 
132 } // namespace hitfit
bool exists(std::string name) const override
const double EtaMax() const
Return the upper limit of the valid -range.
std::string get_string(std::string name) const override
std::vector< EtaDepResElement >::size_type Read(const std::string &default_file)
Read the -dependent resolution information from an ASCII text file.
const std::vector< EtaDepResElement > GetEtaDepResElement() const
Access the internal list of -dependent resolution elements.
A lightweight implementation of the Defaults interface that uses simple ASCII text files...
std::vector< EtaDepResElement >::const_iterator FindResolution(double &eta) const
Internal method to return the corresponding -dependent resolution element for a given value...
Represent a resolution and an range in which the resolution is valid.
bool CheckNoOverlap(const std::vector< EtaDepResElement > &v)
Check for non-overlapping -range between -dependent resolution elements in a list.
uint16_t size_type
Vector_Resolution GetResolution(double &eta) const
Return the corresponding resolution for a value of .
const double EtaMin() const
Return the lower limit of the valid -range.
std::vector< EtaDepResElement > _EtaDepResElement
double get_float(std::string name) const override
Vector_Resolution operator()(double &eta)
Allow users to call this instance as a function to access the corresponding resolution for an input v...
Hold on to -dependent resolution. This class acts as a function object and returns Vector_Resolution ...
EtaDepResolution()
Default constructor, instantiate an EtaDepResolution object with empty list of -dependent resolution ...
const bool CheckEta(double eta) const
Check is an input value is within the valid -range of this instance.
Calculate and represent resolution for a vector of , pseudorapidity , and azimuthal angle ...