-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathProducerBase.h
140 lines (100 loc) · 4.61 KB
/
ProducerBase.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#pragma once
#include <string>
#include <boost/noncopyable.hpp>
#include "Artus/Utility/interface/ArtusLogging.h"
#include "Artus/Core/interface/ProductBase.h"
#include "Artus/Core/interface/EventBase.h"
#include "Artus/Core/interface/MetadataBase.h"
#include "Artus/Core/interface/ProcessNodeBase.h"
#include "Artus/Configuration/interface/SettingsBase.h"
/**
\brief Base class for Producers, that extend the product.
This is a base class for Producers, that extend the product after performing
some calculations. The function ProduceGlobal is called once per event before
the pipelines are split. The function ProduceLocal is called once per event
within a given pipeline. Only one of these functions are called.
*/
class ProducerBaseAccess;
class ProducerBaseUntemplated : public ProcessNodeBase
{
public:
// this will allow the pipeline class to call the protected
// base implemenations of ProcessEvent / Init and friends
friend ProducerBaseAccess;
virtual ~ProducerBaseUntemplated();
/// Must return a unique id of the producer.
virtual std::string GetProducerId() const = 0;
protected:
// will be implemented by the ConsumerBase class
virtual void baseInit(SettingsBase const& settings, MetadataBase& metadata) = 0;
virtual void baseOnRun(EventBase const& event, SettingsBase const& settings, MetadataBase const& metadata) = 0;
virtual void baseOnLumi(EventBase const& event, SettingsBase const& settings, MetadataBase const& metadata) = 0;
virtual void baseProduce(EventBase const& event, ProductBase& product, SettingsBase const& settings, MetadataBase const& metadata) const = 0;
};
class ProducerBaseAccess
{
public:
explicit ProducerBaseAccess(ProducerBaseUntemplated& producer);
void Init(SettingsBase const& settings, MetadataBase& metadata);
void OnRun(EventBase const& event, SettingsBase const& settings, MetadataBase const& metadata);
void OnLumi(EventBase const& event, SettingsBase const& settings, MetadataBase const& metadata);
void Produce(EventBase const& event, ProductBase& product, SettingsBase const& settings, MetadataBase const& metadata);
private:
ProducerBaseUntemplated& m_producer;
};
template<class TTypes>
class ProducerBase: public ProducerBaseUntemplated
{
public:
typedef typename TTypes::event_type event_type;
typedef typename TTypes::product_type product_type;
typedef typename TTypes::setting_type setting_type;
typedef typename TTypes::metadata_type metadata_type;
virtual ~ProducerBase()
{
}
virtual void Init(setting_type const& settings, metadata_type& metadata)
{
LOG(DEBUG) << "Initialize producer \"" << this->GetProducerId() << "\".";
}
virtual void OnLumi(event_type const& event, setting_type const& settings, metadata_type const& metadata)
{
}
virtual void OnRun(event_type const& event, setting_type const& settings, metadata_type const& metadata)
{
}
virtual void Produce(event_type const& event, product_type& product, setting_type const& settings, metadata_type const& metadata) const = 0;
ProcessNodeType GetProcessNodeType() const final
{
return ProcessNodeType::Producer;
}
protected:
void baseInit(SettingsBase const& settings, MetadataBase& metadata) override
{
setting_type const& specSettings = static_cast<setting_type const&>(settings);
metadata_type& specMetadata = static_cast<metadata_type&>(metadata);
this->Init(specSettings, specMetadata);
}
void baseOnRun(EventBase const& evt, SettingsBase const& settings, MetadataBase const& metadata) override
{
event_type const& specEvent = static_cast<event_type const&>(evt);
setting_type const& specSettings = static_cast<setting_type const&>(settings);
metadata_type const& specMetadata = static_cast<metadata_type const&>(metadata);
OnRun(specEvent, specSettings, specMetadata);
}
void baseOnLumi(EventBase const& evt, SettingsBase const& settings, MetadataBase const& metadata) override
{
event_type const& specEvent = static_cast<event_type const&>(evt);
setting_type const& specSettings = static_cast<setting_type const&>(settings);
metadata_type const& specMetadata = static_cast<metadata_type const&>(metadata);
OnLumi(specEvent, specSettings, specMetadata);
}
void baseProduce(EventBase const& evt, ProductBase& prod, SettingsBase const& settings, MetadataBase const& metadata) const override
{
event_type const& specEvent = static_cast<event_type const&>(evt);
product_type& specProduct = static_cast<product_type&>(prod);
setting_type const& specSettings = static_cast<setting_type const&>(settings);
metadata_type const& specMetadata = static_cast<metadata_type const&>(metadata);
Produce(specEvent, specProduct, specSettings, specMetadata);
}
};