[95a917c] | 1 | // -*- C++ -*-
|
---|
| 2 | //
|
---|
| 3 | // This file is part of HepMC
|
---|
| 4 | // Copyright (C) 2014-2020 The HepMC collaboration (see AUTHORS for details)
|
---|
| 5 | //
|
---|
| 6 | ///
|
---|
| 7 | /// @file GenRunInfo.h
|
---|
| 8 | /// @brief Definition of \b class GenRunInfo
|
---|
| 9 | ///
|
---|
| 10 | #ifndef HEPMC3_GENRUNINFO_H
|
---|
| 11 | #define HEPMC3_GENRUNINFO_H
|
---|
| 12 |
|
---|
| 13 | #if !defined(__CINT__)
|
---|
| 14 | #include "HepMC3/Units.h"
|
---|
| 15 | #include "HepMC3/Attribute.h"
|
---|
| 16 | #include <mutex>
|
---|
| 17 | #endif // __CINT__
|
---|
| 18 |
|
---|
| 19 | #ifdef HEPMC3_ROOTIO
|
---|
| 20 | class TBuffer;
|
---|
| 21 | #endif
|
---|
| 22 |
|
---|
| 23 | namespace HepMC3 {
|
---|
| 24 | /** Deprecated */
|
---|
| 25 | using namespace std;
|
---|
| 26 |
|
---|
| 27 | struct GenRunInfoData;
|
---|
| 28 |
|
---|
| 29 | /// @brief Stores run-related information
|
---|
| 30 | ///
|
---|
| 31 | /// Manages run-related information.
|
---|
| 32 | /// Contains run-wide attributes
|
---|
| 33 | class GenRunInfo {
|
---|
| 34 |
|
---|
| 35 | public:
|
---|
| 36 |
|
---|
| 37 | /// @brief Interrnal struct for keeping track of tools.
|
---|
| 38 | struct ToolInfo {
|
---|
| 39 |
|
---|
| 40 | /// @brief The name of the tool.
|
---|
| 41 | std::string name;
|
---|
| 42 |
|
---|
| 43 | /// @brief The version of the tool.
|
---|
| 44 | std::string version;
|
---|
| 45 |
|
---|
| 46 | /// @brief Other information about how the tool was used in
|
---|
| 47 | /// the run.
|
---|
| 48 | std::string description;
|
---|
| 49 | };
|
---|
| 50 |
|
---|
| 51 | public:
|
---|
| 52 |
|
---|
| 53 | /// @brief Default constructor
|
---|
| 54 | GenRunInfo() {}
|
---|
| 55 | /// @brief Copy constructor
|
---|
| 56 | GenRunInfo(const GenRunInfo& r);
|
---|
| 57 | /// @brief Assignmet
|
---|
| 58 | GenRunInfo& operator=(const GenRunInfo& r);
|
---|
| 59 |
|
---|
| 60 | #if !defined(__CINT__)
|
---|
| 61 |
|
---|
| 62 | /// @brief The vector of tools used to produce this run.
|
---|
| 63 | const std::vector<ToolInfo> & tools() const {
|
---|
| 64 | return m_tools;
|
---|
| 65 | }
|
---|
| 66 | /// @brief The vector of tools used to produce this run.
|
---|
| 67 | std::vector<ToolInfo> & tools() {
|
---|
| 68 | return m_tools;
|
---|
| 69 | }
|
---|
| 70 |
|
---|
| 71 | /// @brief Check if a weight name is present.
|
---|
| 72 | bool has_weight(const std::string& name) const {
|
---|
| 73 | return m_weight_indices.find(name) != m_weight_indices.end();
|
---|
| 74 | }
|
---|
| 75 |
|
---|
| 76 | /// @brief Return the index corresponding to a weight name.
|
---|
| 77 | /// @return -1 if name was not found
|
---|
| 78 | int weight_index(const std::string& name) const {
|
---|
| 79 | std::map<std::string, int>::const_iterator it = m_weight_indices.find(name);
|
---|
| 80 | return it == m_weight_indices.end()? -1: it->second;
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | /// @brief Get the vector of weight names.
|
---|
| 84 | const std::vector<std::string> & weight_names() const {
|
---|
| 85 | return m_weight_names;
|
---|
| 86 | }
|
---|
| 87 |
|
---|
| 88 | /// @brief Set the names of the weights in this run.
|
---|
| 89 | ///
|
---|
| 90 | /// For consistency, the length of the vector should be the same as
|
---|
| 91 | /// the number of weights in the events in the run.
|
---|
| 92 | void set_weight_names(const std::vector<std::string> & names);
|
---|
| 93 |
|
---|
| 94 | /// @brief add an attribute
|
---|
| 95 | /// This will overwrite existing attribute if an attribute
|
---|
| 96 | /// with the same name is present
|
---|
| 97 | void add_attribute(const std::string &name,
|
---|
| 98 | const std::shared_ptr<Attribute> &att) {
|
---|
| 99 | std::lock_guard<std::recursive_mutex> lock(m_lock_attributes);
|
---|
| 100 | if ( att ) m_attributes[name] = att;
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | /// @brief Remove attribute
|
---|
| 104 | void remove_attribute(const std::string &name) {
|
---|
| 105 | std::lock_guard<std::recursive_mutex> lock(m_lock_attributes);
|
---|
| 106 | m_attributes.erase(name);
|
---|
| 107 | }
|
---|
| 108 |
|
---|
| 109 | /// @brief Get attribute of type T
|
---|
| 110 | template<class T>
|
---|
| 111 | std::shared_ptr<T> attribute(const std::string &name) const;
|
---|
| 112 |
|
---|
| 113 | /// @brief Get attribute of any type as string
|
---|
| 114 | std::string attribute_as_string(const std::string &name) const;
|
---|
| 115 |
|
---|
| 116 | /// @brief Get list of attribute names
|
---|
| 117 | std::vector<std::string> attribute_names() const;
|
---|
| 118 |
|
---|
| 119 | /// @brief Get a copy of the list of attributes
|
---|
| 120 | /// @note To avoid thread issues, this is returns a copy. Better solution may be needed.
|
---|
| 121 | std::map< std::string, std::shared_ptr<Attribute> > attributes() const {
|
---|
| 122 | return m_attributes;
|
---|
| 123 | }
|
---|
| 124 |
|
---|
| 125 |
|
---|
| 126 | #endif // __CINT__
|
---|
| 127 |
|
---|
| 128 | /// @name Methods to fill GenRunInfoData and to read it back
|
---|
| 129 | //@{
|
---|
| 130 |
|
---|
| 131 | /// @brief Fill GenRunInfoData object
|
---|
| 132 | void write_data(GenRunInfoData &data) const;
|
---|
| 133 |
|
---|
| 134 | /// @brief Fill GenRunInfo based on GenRunInfoData
|
---|
| 135 | void read_data(const GenRunInfoData &data);
|
---|
| 136 |
|
---|
| 137 | #ifdef HEPMC3_ROOTIO
|
---|
| 138 | /// @brief ROOT I/O streamer
|
---|
| 139 | void Streamer(TBuffer &b);
|
---|
| 140 | //@}
|
---|
| 141 | #endif
|
---|
| 142 |
|
---|
| 143 | private:
|
---|
| 144 |
|
---|
| 145 | /// @name Fields
|
---|
| 146 | //@{
|
---|
| 147 |
|
---|
| 148 | #if !defined(__CINT__)
|
---|
| 149 |
|
---|
| 150 | /// @brief The vector of tools used to produce this run.
|
---|
| 151 | std::vector<ToolInfo> m_tools;
|
---|
| 152 |
|
---|
| 153 | /// @brief A map of weight names mapping to indices.
|
---|
| 154 | std::map<std::string, int> m_weight_indices;
|
---|
| 155 |
|
---|
| 156 | /// @brief A vector of weight names.
|
---|
| 157 | std::vector<std::string> m_weight_names;
|
---|
| 158 |
|
---|
| 159 | /// @brief Map of attributes
|
---|
| 160 | mutable std::map< std::string, std::shared_ptr<Attribute> > m_attributes;
|
---|
| 161 |
|
---|
| 162 | /// @brief Mutex lock for the m_attibutes map.
|
---|
| 163 | mutable std::recursive_mutex m_lock_attributes;
|
---|
| 164 | //@}
|
---|
| 165 |
|
---|
| 166 | #endif // __CINT__
|
---|
| 167 | };
|
---|
| 168 |
|
---|
| 169 | #if !defined(__CINT__)
|
---|
| 170 |
|
---|
| 171 | //
|
---|
| 172 | // Template methods
|
---|
| 173 | //
|
---|
| 174 |
|
---|
| 175 | template<class T>
|
---|
| 176 | std::shared_ptr<T> GenRunInfo::attribute(const std::string &name) const {
|
---|
| 177 | std::lock_guard<std::recursive_mutex> lock(m_lock_attributes);
|
---|
| 178 | std::map< std::string, std::shared_ptr<Attribute> >::iterator i =
|
---|
| 179 | m_attributes.find(name);
|
---|
| 180 | if( i == m_attributes.end() ) return std::shared_ptr<T>();
|
---|
| 181 |
|
---|
| 182 | if( !i->second->is_parsed() ) {
|
---|
| 183 |
|
---|
| 184 | std::shared_ptr<T> att = std::make_shared<T>();
|
---|
| 185 | if ( att->from_string(i->second->unparsed_string()) &&
|
---|
| 186 | att->init(*this) ) {
|
---|
| 187 | // update map with new pointer
|
---|
| 188 | i->second = att;
|
---|
| 189 |
|
---|
| 190 | return att;
|
---|
| 191 | }
|
---|
| 192 | else
|
---|
| 193 | return std::shared_ptr<T>();
|
---|
| 194 | }
|
---|
| 195 | else return std::dynamic_pointer_cast<T>(i->second);
|
---|
| 196 | }
|
---|
| 197 |
|
---|
| 198 | #endif // __CINT__
|
---|
| 199 |
|
---|
| 200 | } // namespace HepMC3
|
---|
| 201 |
|
---|
| 202 | #endif
|
---|