CMS 3D CMS Logo

SimpleFlatTableProducer.h
Go to the documentation of this file.
7 
10 
11 #include <vector>
12 #include <boost/ptr_container/ptr_vector.hpp>
13 
14 template <typename T, typename TProd>
16 public:
18  : name_(params.getParameter<std::string>("name")),
19  doc_(params.existsAs<std::string>("doc") ? params.getParameter<std::string>("doc") : ""),
20  extension_(params.existsAs<bool>("extension") ? params.getParameter<bool>("extension") : false),
21  src_(consumes<TProd>(params.getParameter<edm::InputTag>("src"))) {
22  edm::ParameterSet const &varsPSet = params.getParameter<edm::ParameterSet>("variables");
23  for (const std::string &vname : varsPSet.getParameterNamesForType<edm::ParameterSet>()) {
24  const auto &varPSet = varsPSet.getParameter<edm::ParameterSet>(vname);
25  const std::string &type = varPSet.getParameter<std::string>("type");
26  if (type == "int")
27  vars_.push_back(new IntVar(vname, nanoaod::FlatTable::IntColumn, varPSet));
28  else if (type == "float")
29  vars_.push_back(new FloatVar(vname, nanoaod::FlatTable::FloatColumn, varPSet));
30  else if (type == "uint8")
31  vars_.push_back(new UInt8Var(vname, nanoaod::FlatTable::UInt8Column, varPSet));
32  else if (type == "bool")
33  vars_.push_back(new BoolVar(vname, nanoaod::FlatTable::BoolColumn, varPSet));
34  else
35  throw cms::Exception("Configuration", "unsupported type " + type + " for variable " + vname);
36  }
37 
38  produces<nanoaod::FlatTable>();
39  }
40 
42 
43  // this is to be overriden by the child class
44  virtual std::unique_ptr<nanoaod::FlatTable> fillTable(const edm::Event &iEvent,
45  const edm::Handle<TProd> &prod) const = 0;
46 
47  void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override {
49  iEvent.getByToken(src_, src);
50 
51  std::unique_ptr<nanoaod::FlatTable> out = fillTable(iEvent, src);
52  out->setDoc(doc_);
53 
54  iEvent.put(std::move(out));
55  }
56 
57 protected:
60  const bool extension_;
62 
63  class VariableBase {
64  public:
66  : name_(aname),
67  doc_(cfg.getParameter<std::string>("doc")),
68  type_(atype),
69  precision_(cfg.existsAs<int>("precision") ? cfg.getParameter<int>("precision")
70  : (cfg.existsAs<std::string>("precision") ? -2 : -1)) {}
71  virtual ~VariableBase() {}
72  const std::string &name() const { return name_; }
73  const nanoaod::FlatTable::ColumnType &type() const { return type_; }
74 
75  protected:
79  };
80  class Variable : public VariableBase {
81  public:
83  : VariableBase(aname, atype, cfg) {}
84  virtual void fill(std::vector<const T *> selobjs, nanoaod::FlatTable &out) const = 0;
85  };
86  template <typename StringFunctor, typename ValType>
87  class FuncVariable : public Variable {
88  public:
90  : Variable(aname, atype, cfg),
91  func_(cfg.getParameter<std::string>("expr"), true),
92  precisionFunc_(cfg.existsAs<std::string>("precision") ? cfg.getParameter<std::string>("precision") : "23",
93  true) {}
94  ~FuncVariable() override {}
95  void fill(std::vector<const T *> selobjs, nanoaod::FlatTable &out) const override {
96  std::vector<ValType> vals(selobjs.size());
97  for (unsigned int i = 0, n = vals.size(); i < n; ++i) {
98  if (this->precision_ == -2) {
100  } else
101  vals[i] = func_(*selobjs[i]);
102  }
103  out.template addColumn<ValType>(this->name_, vals, this->doc_, this->type_, this->precision_);
104  }
105 
106  protected:
107  StringFunctor func_;
108  StringFunctor precisionFunc_;
109  };
110  typedef FuncVariable<StringObjectFunction<T>, int> IntVar;
111  typedef FuncVariable<StringObjectFunction<T>, float> FloatVar;
112  typedef FuncVariable<StringObjectFunction<T>, uint8_t> UInt8Var;
113  typedef FuncVariable<StringCutObjectSelector<T>, uint8_t> BoolVar;
114  boost::ptr_vector<Variable> vars_;
115 };
116 
117 template <typename T>
118 class SimpleFlatTableProducer : public SimpleFlatTableProducerBase<T, edm::View<T>> {
119 public:
121 
124  singleton_(params.getParameter<bool>("singleton")),
125  maxLen_(params.existsAs<unsigned int>("maxLen") ? params.getParameter<unsigned int>("maxLen")
126  : std::numeric_limits<unsigned int>::max()),
127  cut_(!singleton_ ? params.getParameter<std::string>("cut") : "", true) {
128  if (params.existsAs<edm::ParameterSet>("externalVariables")) {
129  edm::ParameterSet const &extvarsPSet = params.getParameter<edm::ParameterSet>("externalVariables");
130  for (const std::string &vname : extvarsPSet.getParameterNamesForType<edm::ParameterSet>()) {
131  const auto &varPSet = extvarsPSet.getParameter<edm::ParameterSet>(vname);
132  const std::string &type = varPSet.getParameter<std::string>("type");
133  if (type == "int")
134  extvars_.push_back(new IntExtVar(vname, nanoaod::FlatTable::IntColumn, varPSet, this->consumesCollector()));
135  else if (type == "float")
136  extvars_.push_back(
137  new FloatExtVar(vname, nanoaod::FlatTable::FloatColumn, varPSet, this->consumesCollector()));
138  else if (type == "double")
139  extvars_.push_back(
140  new DoubleExtVar(vname, nanoaod::FlatTable::FloatColumn, varPSet, this->consumesCollector()));
141  else if (type == "uint8")
142  extvars_.push_back(
143  new UInt8ExtVar(vname, nanoaod::FlatTable::UInt8Column, varPSet, this->consumesCollector()));
144  else if (type == "bool")
145  extvars_.push_back(new BoolExtVar(vname, nanoaod::FlatTable::BoolColumn, varPSet, this->consumesCollector()));
146  else
147  throw cms::Exception("Configuration", "unsupported type " + type + " for variable " + vname);
148  }
149  }
150  }
151 
153 
154  std::unique_ptr<nanoaod::FlatTable> fillTable(const edm::Event &iEvent,
155  const edm::Handle<edm::View<T>> &prod) const override {
156  std::vector<const T *> selobjs;
157  std::vector<edm::Ptr<T>> selptrs; // for external variables
158  if (singleton_) {
159  assert(prod->size() == 1);
160  selobjs.push_back(&(*prod)[0]);
161  if (!extvars_.empty())
162  selptrs.emplace_back(prod->ptrAt(0));
163  } else {
164  for (unsigned int i = 0, n = prod->size(); i < n; ++i) {
165  const auto &obj = (*prod)[i];
166  if (cut_(obj)) {
167  selobjs.push_back(&obj);
168  if (!extvars_.empty())
169  selptrs.emplace_back(prod->ptrAt(i));
170  }
171  if (selobjs.size() >= maxLen_)
172  break;
173  }
174  }
175  auto out = std::make_unique<nanoaod::FlatTable>(selobjs.size(), this->name_, singleton_, this->extension_);
176  for (const auto &var : this->vars_)
177  var.fill(selobjs, *out);
178  for (const auto &var : this->extvars_)
179  var.fill(iEvent, selptrs, *out);
180  return out;
181  }
182 
183 protected:
185  const unsigned int maxLen_;
187 
188  class ExtVariable : public base::VariableBase {
189  public:
191  : base::VariableBase(aname, atype, cfg) {}
192  virtual void fill(const edm::Event &iEvent, std::vector<edm::Ptr<T>> selptrs, nanoaod::FlatTable &out) const = 0;
193  };
194  template <typename TIn, typename ValType = TIn>
195  class ValueMapVariable : public ExtVariable {
196  public:
199  const edm::ParameterSet &cfg,
201  : ExtVariable(aname, atype, cfg),
202  token_(cc.consumes<edm::ValueMap<TIn>>(cfg.getParameter<edm::InputTag>("src"))) {}
203  void fill(const edm::Event &iEvent, std::vector<edm::Ptr<T>> selptrs, nanoaod::FlatTable &out) const override {
205  iEvent.getByToken(token_, vmap);
206  std::vector<ValType> vals(selptrs.size());
207  for (unsigned int i = 0, n = vals.size(); i < n; ++i) {
208  vals[i] = (*vmap)[selptrs[i]];
209  }
210  out.template addColumn<ValType>(this->name_, vals, this->doc_, this->type_, this->precision_);
211  }
212 
213  protected:
215  };
221  boost::ptr_vector<ExtVariable> extvars_;
222 };
223 
224 template <typename T>
226 public:
228 
230 
231  std::unique_ptr<nanoaod::FlatTable> fillTable(const edm::Event &, const edm::Handle<T> &prod) const override {
232  auto out = std::make_unique<nanoaod::FlatTable>(1, this->name_, true, this->extension_);
233  std::vector<const T *> selobjs(1, prod.product());
234  for (const auto &var : this->vars_)
235  var.fill(selobjs, *out);
236  return out;
237  }
238 };
239 
240 template <typename T>
242 public:
245 
247 
248  std::unique_ptr<nanoaod::FlatTable> fillTable(const edm::Event &iEvent,
249  const edm::Handle<edm::View<T>> &prod) const override {
250  auto out = std::make_unique<nanoaod::FlatTable>(1, this->name_, true, this->extension_);
251  std::vector<const T *> selobjs(1, &(*prod)[0]);
252  for (const auto &var : this->vars_)
253  var.fill(selobjs, *out);
254  return out;
255  }
256 };
SimpleFlatTableProducer::ExtVariable::ExtVariable
ExtVariable(const std::string &aname, nanoaod::FlatTable::ColumnType atype, const edm::ParameterSet &cfg)
Definition: SimpleFlatTableProducer.h:190
nanoaod::FlatTable::FloatColumn
Definition: FlatTable.h:39
electrons_cff.bool
bool
Definition: electrons_cff.py:372
mps_fire.i
i
Definition: mps_fire.py:355
SimpleFlatTableProducerBase::produce
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
Definition: SimpleFlatTableProducer.h:47
funct::false
false
Definition: Factorize.h:34
dqmiodumpmetadata.n
n
Definition: dqmiodumpmetadata.py:28
SimpleFlatTableProducer::ValueMapVariable::token_
edm::EDGetTokenT< edm::ValueMap< TIn > > token_
Definition: SimpleFlatTableProducer.h:214
SimpleFlatTableProducer::ValueMapVariable::ValueMapVariable
ValueMapVariable(const std::string &aname, nanoaod::FlatTable::ColumnType atype, const edm::ParameterSet &cfg, edm::ConsumesCollector &&cc)
Definition: SimpleFlatTableProducer.h:197
sistrip::View
View
Definition: ConstantsForView.h:26
CalibrationSummaryClient_cfi.params
params
Definition: CalibrationSummaryClient_cfi.py:14
SimpleFlatTableProducer::ExtVariable
Definition: SimpleFlatTableProducer.h:188
FirstObjectSimpleFlatTableProducer
Definition: SimpleFlatTableProducer.h:241
SimpleFlatTableProducerBase::FuncVariable::func_
StringFunctor func_
Definition: SimpleFlatTableProducer.h:107
edm::EDGetTokenT< TProd >
edm
HLT enums.
Definition: AlignableModifier.h:19
SimpleFlatTableProducer::IntExtVar
ValueMapVariable< int > IntExtVar
Definition: SimpleFlatTableProducer.h:216
SimpleFlatTableProducerBase::VariableBase::name
const std::string & name() const
Definition: SimpleFlatTableProducer.h:72
SimpleFlatTableProducerBase::Variable
Definition: SimpleFlatTableProducer.h:80
cms::cuda::assert
assert(be >=bs)
EDProducer.h
SimpleFlatTableProducer::UInt8ExtVar
ValueMapVariable< int, uint8_t > UInt8ExtVar
Definition: SimpleFlatTableProducer.h:220
SimpleFlatTableProducerBase::FuncVariable::precisionFunc_
StringFunctor precisionFunc_
Definition: SimpleFlatTableProducer.h:108
SimpleFlatTableProducer::base
SimpleFlatTableProducerBase< T, edm::View< T > > base
Definition: SimpleFlatTableProducer.h:120
edm::Handle
Definition: AssociativeIterator.h:50
SimpleFlatTableProducerBase::SimpleFlatTableProducerBase
SimpleFlatTableProducerBase(edm::ParameterSet const &params)
Definition: SimpleFlatTableProducer.h:17
SimpleFlatTableProducerBase::VariableBase::~VariableBase
virtual ~VariableBase()
Definition: SimpleFlatTableProducer.h:71
SimpleFlatTableProducer::singleton_
bool singleton_
Definition: SimpleFlatTableProducer.h:184
SimpleFlatTableProducer::FloatExtVar
ValueMapVariable< float > FloatExtVar
Definition: SimpleFlatTableProducer.h:217
nanoaod::FlatTable::ColumnType
ColumnType
Definition: FlatTable.h:38
trigObjTnPSource_cfi.var
var
Definition: trigObjTnPSource_cfi.py:21
SimpleFlatTableProducerBase::vars_
boost::ptr_vector< Variable > vars_
Definition: SimpleFlatTableProducer.h:114
EventSingletonSimpleFlatTableProducer
Definition: SimpleFlatTableProducer.h:225
SimpleFlatTableProducerBase::VariableBase::VariableBase
VariableBase(const std::string &aname, nanoaod::FlatTable::ColumnType atype, const edm::ParameterSet &cfg)
Definition: SimpleFlatTableProducer.h:65
SimpleFlatTableProducerBase::UInt8Var
FuncVariable< StringObjectFunction< T >, uint8_t > UInt8Var
Definition: SimpleFlatTableProducer.h:112
SimpleFlatTableProducerBase::FloatVar
FuncVariable< StringObjectFunction< T >, float > FloatVar
Definition: SimpleFlatTableProducer.h:111
dumpMFGeometry_cfg.prod
prod
Definition: dumpMFGeometry_cfg.py:24
SimpleFlatTableProducerBase::BoolVar
FuncVariable< StringCutObjectSelector< T >, uint8_t > BoolVar
Definition: SimpleFlatTableProducer.h:113
SimpleFlatTableProducer::maxLen_
const unsigned int maxLen_
Definition: SimpleFlatTableProducer.h:185
SimpleFlatTableProducerBase::~SimpleFlatTableProducerBase
~SimpleFlatTableProducerBase() override
Definition: SimpleFlatTableProducer.h:41
SimpleFlatTableProducerBase::VariableBase
Definition: SimpleFlatTableProducer.h:63
EventSingletonSimpleFlatTableProducer::EventSingletonSimpleFlatTableProducer
EventSingletonSimpleFlatTableProducer(edm::ParameterSet const &params)
Definition: SimpleFlatTableProducer.h:227
SimpleFlatTableProducerBase::VariableBase::type_
nanoaod::FlatTable::ColumnType type_
Definition: SimpleFlatTableProducer.h:77
FirstObjectSimpleFlatTableProducer::FirstObjectSimpleFlatTableProducer
FirstObjectSimpleFlatTableProducer(edm::ParameterSet const &params)
Definition: SimpleFlatTableProducer.h:243
SimpleFlatTableProducerBase::FuncVariable::fill
void fill(std::vector< const T * > selobjs, nanoaod::FlatTable &out) const override
Definition: SimpleFlatTableProducer.h:95
SimpleFlatTableProducer::extvars_
boost::ptr_vector< ExtVariable > extvars_
Definition: SimpleFlatTableProducer.h:221
getGTfromDQMFile.obj
obj
Definition: getGTfromDQMFile.py:32
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
FirstObjectSimpleFlatTableProducer::fillTable
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &iEvent, const edm::Handle< edm::View< T >> &prod) const override
Definition: SimpleFlatTableProducer.h:248
edm::View
Definition: CaloClusterFwd.h:14
funct::true
true
Definition: Factorize.h:173
SimpleFlatTableProducerBase::Variable::fill
virtual void fill(std::vector< const T * > selobjs, nanoaod::FlatTable &out) const =0
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
MiniFloatConverter::reduceMantissaToNbitsRounding
static float reduceMantissaToNbitsRounding(const float &f)
Definition: libminifloat.h:102
edm::ParameterSet
Definition: ParameterSet.h:36
SimpleFlatTableProducerBase::name_
const std::string name_
Definition: SimpleFlatTableProducer.h:58
TrackRefitter_38T_cff.src
src
Definition: TrackRefitter_38T_cff.py:24
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
FirstObjectSimpleFlatTableProducer::~FirstObjectSimpleFlatTableProducer
~FirstObjectSimpleFlatTableProducer() override
Definition: SimpleFlatTableProducer.h:246
SimpleFlatTableProducer::~SimpleFlatTableProducer
~SimpleFlatTableProducer() override
Definition: SimpleFlatTableProducer.h:152
createfilelist.int
int
Definition: createfilelist.py:10
SimpleFlatTableProducer::ExtVariable::fill
virtual void fill(const edm::Event &iEvent, std::vector< edm::Ptr< T >> selptrs, nanoaod::FlatTable &out) const =0
edm::ParameterSet::getParameterNamesForType
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
Definition: ParameterSet.h:168
iEvent
int iEvent
Definition: GenABIO.cc:224
edm::stream::EDProducer
Definition: EDProducer.h:38
SimpleFlatTableProducerBase::Variable::Variable
Variable(const std::string &aname, nanoaod::FlatTable::ColumnType atype, const edm::ParameterSet &cfg)
Definition: SimpleFlatTableProducer.h:82
SimpleFlatTableProducerBase::FuncVariable
Definition: SimpleFlatTableProducer.h:87
edm::EventSetup
Definition: EventSetup.h:57
SimpleFlatTableProducerBase::VariableBase::name_
std::string name_
Definition: SimpleFlatTableProducer.h:76
SimpleFlatTableProducerBase::src_
const edm::EDGetTokenT< TProd > src_
Definition: SimpleFlatTableProducer.h:61
cc
nanoaod::FlatTable::UInt8Column
Definition: FlatTable.h:41
FlatTable.h
edm::Ptr
Definition: AssociationVector.h:31
looper.cfg
cfg
Definition: looper.py:297
ValueMap.h
SimpleFlatTableProducer::SimpleFlatTableProducer
SimpleFlatTableProducer(edm::ParameterSet const &params)
Definition: SimpleFlatTableProducer.h:122
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
nanoaod::FlatTable
Definition: FlatTable.h:36
nanoaod::FlatTable::IntColumn
Definition: FlatTable.h:40
SimpleFlatTableProducerBase::FuncVariable::FuncVariable
FuncVariable(const std::string &aname, nanoaod::FlatTable::ColumnType atype, const edm::ParameterSet &cfg)
Definition: SimpleFlatTableProducer.h:89
type
type
Definition: HCALResponse.h:21
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
SimpleFlatTableProducerBase::VariableBase::precision_
int precision_
Definition: SimpleFlatTableProducer.h:78
StringCutObjectSelector.h
SimpleFlatTableProducerBase::VariableBase::doc_
std::string doc_
Definition: SimpleFlatTableProducer.h:76
T
long double T
Definition: Basic3DVectorLD.h:48
nanoaod::FlatTable::BoolColumn
Definition: FlatTable.h:42
SimpleFlatTableProducer::ValueMapVariable
Definition: SimpleFlatTableProducer.h:195
StringCutObjectSelector< T >
Exception
Definition: hltDiff.cc:246
SimpleFlatTableProducerBase::fillTable
virtual std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &iEvent, const edm::Handle< TProd > &prod) const =0
SimpleFlatTableProducer
Definition: SimpleFlatTableProducer.h:118
SimpleFlatTableProducerBase::VariableBase::type
const nanoaod::FlatTable::ColumnType & type() const
Definition: SimpleFlatTableProducer.h:73
MillePedeFileConverter_cfg.out
out
Definition: MillePedeFileConverter_cfg.py:31
SimpleFlatTableProducerBase::FuncVariable::~FuncVariable
~FuncVariable() override
Definition: SimpleFlatTableProducer.h:94
ConsumesCollector.h
SimpleFlatTableProducer::BoolExtVar
ValueMapVariable< bool, uint8_t > BoolExtVar
Definition: SimpleFlatTableProducer.h:219
SimpleFlatTableProducer::cut_
const StringCutObjectSelector< T > cut_
Definition: SimpleFlatTableProducer.h:186
View.h
EventSingletonSimpleFlatTableProducer::~EventSingletonSimpleFlatTableProducer
~EventSingletonSimpleFlatTableProducer() override
Definition: SimpleFlatTableProducer.h:229
ParameterSet.h
SimpleFlatTableProducerBase
Definition: SimpleFlatTableProducer.h:15
SimpleFlatTableProducer::fillTable
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &iEvent, const edm::Handle< edm::View< T >> &prod) const override
Definition: SimpleFlatTableProducer.h:154
edm::Event
Definition: Event.h:73
EventSingletonSimpleFlatTableProducer::fillTable
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &, const edm::Handle< T > &prod) const override
Definition: SimpleFlatTableProducer.h:231
StringObjectFunction.h
SimpleFlatTableProducerBase::doc_
const std::string doc_
Definition: SimpleFlatTableProducer.h:59
edm::ConsumesCollector
Definition: ConsumesCollector.h:39
SimpleFlatTableProducerBase::IntVar
FuncVariable< StringObjectFunction< T >, int > IntVar
Definition: SimpleFlatTableProducer.h:110
SimpleFlatTableProducer::DoubleExtVar
ValueMapVariable< double, float > DoubleExtVar
Definition: SimpleFlatTableProducer.h:218
SimpleFlatTableProducer::ValueMapVariable::fill
void fill(const edm::Event &iEvent, std::vector< edm::Ptr< T >> selptrs, nanoaod::FlatTable &out) const override
Definition: SimpleFlatTableProducer.h:203
SimpleFlatTableProducerBase::extension_
const bool extension_
Definition: SimpleFlatTableProducer.h:60