File indexing completed on 2024-04-06 12:31:18
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include <algorithm>
0025 #include <sstream>
0026 #include <stdexcept>
0027 #include "TopQuarkAnalysis/TopHitFit/interface/EtaDepResolution.h"
0028
0029 namespace hitfit {
0030
0031 std::vector<EtaDepResElement>::const_iterator EtaDepResolution::FindResolution(double& eta) const {
0032 for (std::vector<EtaDepResElement>::const_iterator res = _EtaDepResElement.begin(); res != _EtaDepResElement.end();
0033 ++res) {
0034 if (res->IsInInterval(eta) || res->IsOnEdge(eta)) {
0035 return res;
0036 }
0037 }
0038 return _EtaDepResElement.end();
0039 }
0040
0041 void EtaDepResolution::sort() { std::stable_sort(_EtaDepResElement.begin(), _EtaDepResElement.end()); }
0042
0043 EtaDepResolution::EtaDepResolution() {}
0044
0045 EtaDepResolution::EtaDepResolution(const std::string& default_file) { Read(default_file); }
0046
0047 EtaDepResolution::~EtaDepResolution() {}
0048
0049 std::vector<EtaDepResElement>::size_type EtaDepResolution::Read(const std::string& default_file) {
0050 const Defaults_Text defs(default_file);
0051 Read(defs);
0052 return _EtaDepResElement.size();
0053 }
0054
0055 std::vector<EtaDepResElement>::size_type EtaDepResolution::Read(const Defaults_Text& defs) {
0056 _EtaDepResElement.clear();
0057
0058 for (std::vector<EtaDepResElement>::size_type i = 0;; ++i) {
0059 std::ostringstream os_etamin;
0060 std::ostringstream os_etamax;
0061 std::ostringstream os_res;
0062
0063 os_etamin << "etadep_etamin" << i;
0064 os_etamax << "etadep_etamax" << i;
0065 os_res << "etadep_vecres" << i;
0066
0067 if (defs.exists(os_etamin.str()) && defs.exists(os_etamax.str()) && defs.exists(os_res.str())) {
0068 double etamin = defs.get_float(os_etamin.str());
0069 double etamax = defs.get_float(os_etamax.str());
0070 Vector_Resolution res(defs.get_string(os_res.str()));
0071 _EtaDepResElement.push_back(EtaDepResElement(etamin, etamax, res));
0072
0073 } else {
0074 break;
0075 }
0076 }
0077
0078 if (CheckNoOverlap(_EtaDepResElement)) {
0079 sort();
0080 } else {
0081 _EtaDepResElement.clear();
0082 }
0083
0084 return _EtaDepResElement.size();
0085 }
0086
0087 bool EtaDepResolution::CheckNoOverlap(const std::vector<EtaDepResElement>& v) {
0088 for (std::vector<EtaDepResElement>::size_type i = 0; i != v.size(); i++) {
0089 for (std::vector<EtaDepResElement>::size_type j = i + 1; j != v.size(); j++) {
0090 if (v[i].IsOverlap(v[j])) {
0091 return false;
0092 }
0093 }
0094 }
0095 return true;
0096 }
0097
0098 const double EtaDepResolution::EtaMin() const {
0099 if (!(_EtaDepResElement.empty())) {
0100 return _EtaDepResElement.front().EtaMin();
0101 }
0102 return 999.;
0103 }
0104
0105 const double EtaDepResolution::EtaMax() const {
0106 if (!(_EtaDepResElement.empty())) {
0107 return _EtaDepResElement.back().EtaMax();
0108 }
0109 return -999.;
0110 }
0111
0112 const bool EtaDepResolution::CheckEta(double eta) const { return FindResolution(eta) != _EtaDepResElement.end(); }
0113
0114 Vector_Resolution EtaDepResolution::operator()(double& eta) { return GetResolution(eta); }
0115
0116 Vector_Resolution EtaDepResolution::GetResolution(double& eta) const {
0117 std::vector<EtaDepResElement>::const_iterator etaDepResEleVecIter = FindResolution(eta);
0118 if (etaDepResEleVecIter != _EtaDepResElement.end()) {
0119 return etaDepResEleVecIter->GetResolution();
0120 }
0121
0122 std::stringstream message;
0123 message << "Error, the given eta value : " << eta << " is not inside the valid eta range!";
0124
0125 throw std::runtime_error(message.str());
0126 }
0127
0128 EtaDepResElement EtaDepResolution::GetEtaDepResElement(double& eta) const { return *(FindResolution(eta)); }
0129
0130 const std::vector<EtaDepResElement> EtaDepResolution::GetEtaDepResElement() const { return _EtaDepResElement; }
0131
0132 }