artdaq  v3_11_01
BuildInfo_module.hh
1 #ifndef ARTDAQ_ARTDAQ_ARTMODULES_BUILDINFO_MODULE_HH_
2 #define ARTDAQ_ARTDAQ_ARTMODULES_BUILDINFO_MODULE_HH_
3 
4 #include "art/Framework/Core/EDProducer.h"
5 #include "art/Framework/Core/ModuleMacros.h"
6 #include "art/Framework/Principal/Event.h"
7 #include "art/Framework/Principal/Run.h"
8 #include "artdaq-core/Data/PackageBuildInfo.hh"
9 #include "fhiclcpp/ParameterSet.h"
10 #include "tracemf.h"
11 
12 #include <iostream>
13 #include <memory>
14 #include <string>
15 #include <utility>
16 #include <vector>
17 
18 #include "tracemf.h"
19 #define TRACE_NAME "BuildInfo"
20 
21 namespace artdaq {
27 template<std::string* instanceName, typename... Pkgs>
28 class BuildInfo : public art::EDProducer
29 {
30 public:
38  explicit BuildInfo(fhicl::ParameterSet const& p);
39 
43  virtual ~BuildInfo() = default;
44 
52  void beginRun(art::Run& r) override;
53 
60  void produce(art::Event& e) override;
61 
62 private:
63  BuildInfo(BuildInfo const&) = delete;
64  BuildInfo(BuildInfo&&) = delete;
65  BuildInfo& operator=(BuildInfo const&) = delete;
66  BuildInfo& operator=(BuildInfo&&) = delete;
67 
68  std::unique_ptr<std::vector<PackageBuildInfo>> packages_;
69  std::string instanceName_;
70 
71  template<typename... Args>
72  struct fill_packages;
73 
74  template<typename Arg>
75  struct fill_packages<Arg>
76  {
77  static void doit(std::vector<PackageBuildInfo>& packages)
78  {
79  packages.emplace_back(Arg::getPackageBuildInfo());
80  }
81  };
82 
83  template<typename Arg, typename... Args>
84  struct fill_packages<Arg, Args...>
85  {
86  static void doit(std::vector<PackageBuildInfo>& packages)
87  {
88  packages.emplace_back(Arg::getPackageBuildInfo());
89  fill_packages<Args...>::doit(packages);
90  }
91  };
92 };
93 
94 template<std::string* instanceName, typename... Pkgs>
95 BuildInfo<instanceName, Pkgs...>::BuildInfo(fhicl::ParameterSet const& ps)
96  : EDProducer(ps)
97  , packages_(new std::vector<PackageBuildInfo>())
98  , instanceName_(ps.get<std::string>("instance_name", *instanceName))
99 {
100  fill_packages<Pkgs...>::doit(*packages_);
101 
102  produces<std::vector<PackageBuildInfo>, art::InRun>(instanceName_);
103 }
104 
105 template<std::string* instanceName, typename... Pkgs>
107 {
108  // JCF, 9/22/14
109 
110  // Previously, the vector pointed to by the member variable
111  // packages_ itself got stored in output on the call to "r.put()"
112  // below; what would then happen is that at the start of a new run
113  // or subrun, when r.put() got called again an exception would be
114  // thrown because packages_ would now be null thanks to the
115  // previous call to std::move. To make sure this doesn't happen, I
116  // now stash a copy of the vector pointed to by packages_, not the
117  // original member vector
118 
119  auto packages_deep_copy_ptr = std::make_unique<std::vector<PackageBuildInfo>>(*packages_);
120 
121  TLOG(TLVL_INFO, "BuildInfo") << "Placing BuildInfo with instance name \"" << instanceName_ << "\"";
122  for (auto& pbi : *packages_)
123  {
124  TLOG(TLVL_DEBUG) << "Package " << pbi.getPackageName() << ": version " << pbi.getPackageVersion() << " built at " << pbi.getBuildTimestamp();
125  }
126  r.put(std::move(packages_deep_copy_ptr), instanceName_);
127 }
128 
129 template<std::string* instanceName, typename... Pkgs>
131 {
132  // nothing to be done for individual events
133 }
134 } // namespace artdaq
135 
136 #endif // ARTDAQ_ARTDAQ_ARTMODULES_BUILDINFO_MODULE_HH_
virtual ~BuildInfo()=default
Default Destructor.
void produce(art::Event &e) override
Perform actions for each event.
void beginRun(art::Run &r) override
Perform actions at the beginning of the Run.
BuildInfo(fhicl::ParameterSet const &p)
BuildInfo module Constructor.
BuildInfo is an art::EDProducer which saves information about package builds to the data file...
static std::string instanceName
Name of this BuildInfo instance.