ATLAS Offline Software
Loading...
Searching...
No Matches
Database.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef FAKEBKGTOOLS_DATABASE_H
6#define FAKEBKGTOOLS_DATABASE_H
7
11
12#include <string>
13#include <cstring>
14#include <cmath>
15#include <algorithm>
16#include <vector>
17#include <map>
18#include <bitset>
19#include <sstream>
20#include <exception>
21
22class TFile;
23class TH1;
24
25namespace FakeBkgTools
26{
27
29{
30public:
31 Database(Client client, bool useGeV, bool convertWhenMissing);
32
33 void importXML(std::string filename);
34 void importDefaultROOT(std::string filename);
35 bool ready() const;
36 void reset();
37 bool needEventInfo() const;
38
39 bool fillEfficiencies(ParticleData& pd, const xAOD::IParticle& p, const xAOD::EventInfo& eventInfo, std::string& error) const;
40 unsigned getXmlLineNumber(const char* pos) const;
41
57
58 enum class InputType
59 {
61 };
62 enum class StatMode
63 {
65 };
66
68 {
69 struct Dimension
70 {
71 unsigned short paramUID = 0, iMinBound = 0, nBounds = 0;
72 };
73
75 {
76 int as_int;
77 float as_float;
78 };
79 std::vector<Efficiency> m_efficiencies;
80 std::vector<BoundType> m_bounds;
81 std::vector<Dimension> m_dimensions;
83 unsigned numberOfBins() const
84 {
85 unsigned nBins = 1;
86 for(auto& dim : m_dimensions) nBins *= (dim.nBounds - 1);
87 return nBins;
88 }
89 };
90
95 struct StringRef
96 {
97 const char* ptr = nullptr, *endptr = nullptr;
98 operator bool() const { return ptr && endptr && (ptr!=endptr); }
99 bool operator==(const char* s) const
100 {
101 #if __cplusplus >= 201402L
102 return std::equal(ptr, endptr, s, s+std::strlen(s));
103 #else
104 return str() == s;
105 #endif
106 }
107 bool operator!=(const char* s) const { return !operator==(s); }
108 bool operator<(const StringRef& rhs) const { return endptr < rhs.ptr; }
109 template<class Str> std::string operator+(Str s) { return str() + s; }
110 std::size_t length() const { return (endptr - ptr); }
111 void clear() { ptr = endptr = nullptr; }
112 std::string str() const { return std::string(ptr, endptr); }
114 StringRef(const char* newptr, const char* newendptr) : ptr(newptr), endptr(newendptr) {}
115 StringRef(const char* newptr, std::size_t length) : ptr(newptr), endptr(newptr+length) {}
116 void set(const char* newptr, const char* newendptr) { *this = StringRef(newptr, newendptr); }
117 void set(const char* newptr, std::size_t length) { *this = StringRef(newptr, length); }
118 std::string trim() const;
119 };
120
123 struct XmlError : public std::exception
124 {
125 std::string reason;
127 XmlError(const StringRef& l) : reason(""), location(l) {}
128 XmlError(const char* s, std::size_t length) : reason(""), location(s, s+length) {}
129 XmlError& operator<<(const char* msg) { reason += msg; return *this; }
130 XmlError& operator<<(const std::string& msg) { reason += msg; return *this; }
131 XmlError& operator<<(int msg) { reason += std::to_string(msg); return *this; }
132 virtual const char* what() const noexcept override { return reason.c_str(); }
133 };
134
135 struct GenericError : public std::exception
136 {
137 std::string reason;
138 GenericError& operator<<(const char* msg) { reason += msg; return *this; }
139 GenericError& operator<<(const std::string& msg) { reason += msg; return *this; }
140 GenericError& operator<<(int msg) { reason += std::to_string(msg); return *this; }
141 virtual const char* what() const noexcept override { return reason.c_str(); }
142 };
143
144 struct Param
145 {
150 enum class Level
151 {
153 };
154 std::string name;
157 Param(const std::string& n, Type t, Level l) : name(n), type(t), level(l) {}
158 bool integer() const { return type==Type::PREDEFINED_INT || type==Type::CUSTOM_INT; }
159 };
160
161 struct SystDef
162 {
163 const std::string name;
164 std::bitset<N_EFFICIENCY_TYPES> affects;
165 SystDef(const std::string& n, const std::bitset<N_EFFICIENCY_TYPES>& a) : name(n), affects(a) {}
166 SystDef(SystDef&& rhs) = default;
167 };
168 struct StatDef
169 {
170 const std::bitset<N_EFFICIENCY_TYPES> affects;
171 StatDef(long a) : affects(a) {}
172 };
173
174protected:
175 using AttributesMap = std::map<std::string, StringRef>;
176
178 void dropXmlComments(std::string& buffer);
179 void dropRootTag(std::string& buffer);
180 void readNextTag(StringRef& stream, StringRef& tag, AttributesMap& attributes, StringRef& contents);
181 void readTagAttributes(StringRef stream, const std::string& tag, AttributesMap& attributes);
182 void resetAttributes(AttributesMap& attributes);
183 void importCustomROOT(const StringRef& tag, const StringRef& contents, const AttributesMap& attributes);
184 void addParams(const StringRef& tag, const StringRef& contents, AttributesMap& attributes);
185 void addSysts(const StringRef& tag, const StringRef& contents, const AttributesMap& attributes);
186 unsigned short addStat(EfficiencyType type, const StringRef& pos = StringRef());
187 void addTables(const StringRef& particleType, const AttributesMap& attributes, const StringRef& contents, TFile* source = nullptr);
188 void addDimension(EfficiencyTable& table, unsigned paramUID, const StringRef& contents);
189 void addValues(const StringRef& contents, EfficiencyTable& table, EfficiencyType type, StatMode statMode, unsigned short& globalStatUID);
190
192 void importNominalTH1(const TH1* hist, EfficiencyType type, const StringRef& paramX, const StringRef& paramY, const StringRef& paramZ,
193 float scale, StatMode statMode, unsigned short& globalStatUID, const StringRef& xmlStream);
194 void importSystTH1(const TH1* hist, EfficiencyType type, const std::string& sysname);
195 float getWeightedAverage(const TH1* hist, const StringRef& xmlStream);
196 float getNormalizationFactor(const TH1* hist, EfficiencyType type, const StringRef& norm, const StringRef& xmlStream);
197
200 bool retrieveParameterValue(const xAOD::IParticle& p, const xAOD::EventInfo& eventInfo, const Param& param, EfficiencyTable::BoundType& val) const;
202 int readEfficiencyFromTable(Efficiency& eff, const EfficiencyTable& table, std::map<unsigned, EfficiencyTable::BoundType>& cachedParamVals, const xAOD::IParticle& p, const xAOD::EventInfo& eventInfo, std::string& error) const;
203
205 template<typename ReturnValue, typename... Args>
206 static inline ReturnValue getAttribute(const StringRef& tag, const AttributesMap& attributes, const std::string& type, const char* ref, ReturnValue rv, Args... args);
207 static inline void assertNoLeftover(std::stringstream& ss, const StringRef& pos);
208 std::vector<std::string> getListOfNames(const StringRef& stream);
209 static constexpr unsigned short maxIndex() { return 0x4000; }
210 static std::string getTypeAsString(EfficiencyType type);
211
212private:
213 template<typename ReturnValue>
214 static inline ReturnValue getAttribute(const StringRef& attr, const char* ref, ReturnValue rv);
215 template<typename ReturnValue, typename... Args>
216 static inline ReturnValue getAttribute(const StringRef& attr, const char* ref, ReturnValue rv, Args... args);
217
218public:
219 static constexpr unsigned short indexFromUID(unsigned short uid) { return uid&0x3FFF; }
220 static constexpr unsigned short systIndexToUID(unsigned short index) { return 0x4000 | index; }
221 static constexpr unsigned short statIndexToUID(unsigned short index) { return 0x8000 | index; }
222 static constexpr bool isSystUID(unsigned short uid) { return ((uid&0xC000) == 0x4000); }
223 static constexpr bool isStatUID(unsigned short uid) { return ((uid&0xC000) == 0x8000); }
224 unsigned numberOfStats() const { return m_stats.size(); }
225 unsigned numberOfSysts() const { return m_systs.size(); }
226 const SystDef* findSyst(unsigned short uid) const
227 {
228 if(!isSystUID(uid)) return nullptr;
229 unsigned index = indexFromUID(uid);
230 return (index<m_systs.size())? &m_systs[index] : nullptr;
231 }
232 const StatDef* findStat(unsigned short uid) const
233 {
234 if(!isStatUID(uid)) return nullptr;
235 unsigned index = indexFromUID(uid);
236 return (index<m_stats.size())? &m_stats[index] : nullptr;
237 }
238
239protected:
241 const bool m_useGeV;
242 const std::bitset<N_EFFICIENCY_TYPES> m_typesToFill;
243 static std::bitset<N_EFFICIENCY_TYPES> selectTypesToFill(Client client);
246
248 std::vector<Param> m_params;
249 std::vector<SystDef> m_systs;
250 std::vector<StatDef> m_stats;
251 std::map<int, std::vector<EfficiencyTable>> m_tables;
252
254 std::string m_xmlBuffer;
255 std::vector<std::size_t> m_lineOffset;
256 std::map<std::string, float> m_normFactors;
257
258};
259
260}
261
262#endif
const boost::regex ref(r_ef)
bool operator==(const DataVector< T > &a, const DataVector< T > &b)
Vector equality comparison.
double length(const pvec &v)
static Double_t a
static Double_t ss
string trim(string s)
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
std::string m_xmlBuffer
Temporary buffers (only used while importing data)
Definition Database.h:254
void importDefaultROOT(std::string filename)
Definition Database.cxx:742
unsigned numberOfStats() const
Definition Database.h:224
float getNormalizationFactor(const TH1 *hist, EfficiencyType type, const StringRef &norm, const StringRef &xmlStream)
Definition Database.cxx:830
std::map< std::string, StringRef > AttributesMap
Definition Database.h:175
static FakeBkgTools::Efficiency * selectEfficiency(FakeBkgTools::ParticleData &pd, const xAOD::IParticle &p, EfficiencyType type)
Methods used to fill efficiencies.
void importNominalTH1(const TH1 *hist, EfficiencyType type, const StringRef &paramX, const StringRef &paramY, const StringRef &paramZ, float scale, StatMode statMode, unsigned short &globalStatUID, const StringRef &xmlStream)
Methods used to load from ROOT files.
Definition Database.cxx:845
void addValues(const StringRef &contents, EfficiencyTable &table, EfficiencyType type, StatMode statMode, unsigned short &globalStatUID)
Definition Database.cxx:581
float getWeightedAverage(const TH1 *hist, const StringRef &xmlStream)
Definition Database.cxx:803
void readNextTag(StringRef &stream, StringRef &tag, AttributesMap &attributes, StringRef &contents)
Definition Database.cxx:235
std::vector< std::string > getListOfNames(const StringRef &stream)
Definition Database.cxx:319
EfficiencyType getSourceType(EfficiencyType wantedType) const
static constexpr unsigned short systIndexToUID(unsigned short index)
Definition Database.h:220
static constexpr unsigned short statIndexToUID(unsigned short index)
Definition Database.h:221
unsigned getXmlLineNumber(const char *pos) const
std::vector< Param > m_params
Permanent buffers.
Definition Database.h:248
static constexpr unsigned short indexFromUID(unsigned short uid)
Definition Database.h:219
bool retrieveParameterValue(const xAOD::IParticle &p, const xAOD::EventInfo &eventInfo, const Param &param, EfficiencyTable::BoundType &val) const
std::vector< StatDef > m_stats
Definition Database.h:250
static constexpr bool isStatUID(unsigned short uid)
Definition Database.h:223
static void assertNoLeftover(std::stringstream &ss, const StringRef &pos)
Definition Database.cxx:500
void importXML(std::string filename)
Definition Database.cxx:186
static constexpr bool isSystUID(unsigned short uid)
Definition Database.h:222
void importSystTH1(const TH1 *hist, EfficiencyType type, const std::string &sysname)
Definition Database.cxx:925
void addTables(const StringRef &particleType, const AttributesMap &attributes, const StringRef &contents, TFile *source=nullptr)
Definition Database.cxx:420
const std::bitset< N_EFFICIENCY_TYPES > m_typesToFill
Definition Database.h:242
const SystDef * findSyst(unsigned short uid) const
Definition Database.h:226
int readEfficiencyFromTable(Efficiency &eff, const EfficiencyTable &table, std::map< unsigned, EfficiencyTable::BoundType > &cachedParamVals, const xAOD::IParticle &p, const xAOD::EventInfo &eventInfo, std::string &error) const
Definition Database.cxx:130
bool needEventInfo() const
Definition Database.cxx:56
void readTagAttributes(StringRef stream, const std::string &tag, AttributesMap &attributes)
Definition Database.cxx:258
static std::bitset< N_EFFICIENCY_TYPES > selectTypesToFill(Client client)
This function is only called by the Database constructor.
std::map< std::string, float > m_normFactors
Definition Database.h:256
unsigned short addStat(EfficiencyType type, const StringRef &pos=StringRef())
Definition Database.cxx:409
unsigned numberOfSysts() const
Definition Database.h:225
void addSysts(const StringRef &tag, const StringRef &contents, const AttributesMap &attributes)
Definition Database.cxx:377
void dropXmlComments(std::string &buffer)
Methods used to parse XML files.
Definition Database.cxx:289
std::map< int, std::vector< EfficiencyTable > > m_tables
Definition Database.h:251
const bool m_convertWhenMissing
Definition Database.h:244
static ReturnValue getAttribute(const StringRef &tag, const AttributesMap &attributes, const std::string &type, const char *ref, ReturnValue rv, Args... args)
Helper methods.
Definition Database.cxx:352
bool fillEfficiencies(ParticleData &pd, const xAOD::IParticle &p, const xAOD::EventInfo &eventInfo, std::string &error) const
Definition Database.cxx:65
Database(Client client, bool useGeV, bool convertWhenMissing)
Definition Database.cxx:26
void addParams(const StringRef &tag, const StringRef &contents, AttributesMap &attributes)
Definition Database.cxx:360
const StatDef * findStat(unsigned short uid) const
Definition Database.h:232
void addDimension(EfficiencyTable &table, unsigned paramUID, const StringRef &contents)
Definition Database.cxx:511
std::vector< std::size_t > m_lineOffset
Definition Database.h:255
void dropRootTag(std::string &buffer)
Definition Database.cxx:305
void resetAttributes(AttributesMap &attributes)
Definition Database.cxx:708
void importCustomROOT(const StringRef &tag, const StringRef &contents, const AttributesMap &attributes)
Definition Database.cxx:681
std::vector< SystDef > m_systs
Definition Database.h:249
static constexpr unsigned short maxIndex()
Definition Database.h:209
Class providing the definition of the 4-vector interface.
void contents(std::vector< std::string > &keys, TDirectory *td, const std::string &directory, const std::string &pattern, const std::string &path)
Definition index.py:1
EventInfo_v1 EventInfo
Definition of the latest event info version.
std::vector< Efficiency > m_efficiencies
Definition Database.h:79
std::vector< BoundType > m_bounds
Definition Database.h:80
std::vector< Dimension > m_dimensions
Definition Database.h:81
This propagates an error message.
Definition Database.h:136
GenericError & operator<<(const char *msg)
Definition Database.h:138
GenericError & operator<<(int msg)
Definition Database.h:140
virtual const char * what() const noexcept override
Definition Database.h:141
GenericError & operator<<(const std::string &msg)
Definition Database.h:139
Param(const std::string &n, Type t, Level l)
Definition Database.h:157
could try to keep track of the bin number, for the description
Definition Database.h:169
const std::bitset< N_EFFICIENCY_TYPES > affects
Definition Database.h:170
Note: the following structure is used (instead of a simple std::string) so that XML line numbers can ...
Definition Database.h:96
std::string operator+(Str s)
used to check if a piece of text appeared before another piece of text
Definition Database.h:109
bool operator<(const StringRef &rhs) const
Definition Database.h:108
StringRef(const char *newptr, const char *newendptr)
Definition Database.h:114
std::size_t length() const
Definition Database.h:110
void set(const char *newptr, const char *newendptr)
Definition Database.h:116
bool operator==(const char *s) const
Definition Database.h:99
bool operator!=(const char *s) const
Definition Database.h:107
StringRef(const char *newptr, std::size_t length)
Definition Database.h:115
void set(const char *newptr, std::size_t length)
Definition Database.h:117
SystDef(SystDef &&rhs)=default
std::bitset< N_EFFICIENCY_TYPES > affects
Definition Database.h:164
SystDef(const std::string &n, const std::bitset< N_EFFICIENCY_TYPES > &a)
Definition Database.h:165
XmlError(const char *s, std::size_t length)
Definition Database.h:128
XmlError(const StringRef &l)
Definition Database.h:127
XmlError & operator<<(const std::string &msg)
Definition Database.h:130
virtual const char * what() const noexcept override
Definition Database.h:132
XmlError & operator<<(const char *msg)
Definition Database.h:129
XmlError & operator<<(int msg)
Definition Database.h:131
a structure to hold an efficiency together with a variable number of uncertainties
MsgStream & msg
Definition testRead.cxx:32