38 template <
typename ObjType>
45 template <
typename ObjType,
typename StringFunctor,
typename ValType>
52 cfg.getUntrackedParameter<
bool>(
"lazyEval")) {}
56 std::vector<ValType> vals(selobjs.size());
57 for (
unsigned int i = 0,
n = vals.size();
i <
n; ++
i) {
59 if constexpr (std::is_same<ValType, float>()) {
77 template <
typename ObjType>
86 template <
typename ObjType,
typename TIn,
typename ValType = TIn>
100 std::vector<ValType> vals;
102 vals.resize(selptrs.size());
103 for (
unsigned int i = 0,
n = vals.size();
i <
n; ++
i) {
105 vals[
i] = this->
eval(vmap, selptrs[
i]);
116 template <
typename ObjType,
typename TIn,
typename ValType = TIn>
125 ValType
val = (*vmap)[
op];
130 template <
typename ObjType,
typename TIn,
typename StringFunctor,
typename ValType>
144 if constexpr (std::is_same<ValType, float>()) {
164 template <
typename T,
typename TProd>
178 vars_.push_back(std::make_unique<IntVar>(vname, varPSet));
179 else if (
type ==
"uint")
180 vars_.push_back(std::make_unique<UIntVar>(vname, varPSet));
181 else if (
type ==
"float")
182 vars_.push_back(std::make_unique<FloatVar>(vname, varPSet));
183 else if (
type ==
"double")
184 vars_.push_back(std::make_unique<DoubleVar>(vname, varPSet));
185 else if (
type ==
"uint8")
186 vars_.push_back(std::make_unique<UInt8Var>(vname, varPSet));
187 else if (
type ==
"int16")
188 vars_.push_back(std::make_unique<Int16Var>(vname, varPSet));
189 else if (
type ==
"uint16")
190 vars_.push_back(std::make_unique<UInt16Var>(vname, varPSet));
191 else if (
type ==
"bool")
192 vars_.push_back(std::make_unique<BoolVar>(vname, varPSet));
194 throw cms::Exception(
"Configuration",
"unsupported type " +
type +
" for variable " + vname);
197 produces<nanoaod::FlatTable>();
206 desc.add<
std::string>(
"doc",
"")->setComment(
"few words of self documentation");
207 desc.add<
bool>(
"extension",
false)->setComment(
"whether or not to extend an existing same table");
208 desc.add<
bool>(
"skipNonExistingSrc",
false)
209 ->setComment(
"whether or not to skip producing the table on absent input product");
210 desc.add<
edm::InputTag>(
"src")->setComment(
"input collection to fill the flat table");
213 variable.add<
std::string>(
"expr")->setComment(
"a function to define the content of the branch in the flat table");
214 variable.add<
std::string>(
"doc")->setComment(
"few words description of the branch content");
215 variable.addUntracked<
bool>(
"lazyEval",
false)
216 ->setComment(
"if true, can use methods of inheriting classes in `expr`. Can cause problems with threading.");
219 "type",
"int",
true,
edm::Comment(
"the c++ type of the branch in the flat table")),
220 edm::allowedValues<std::string>(
"int",
"uint",
"float",
"double",
"uint8",
"int16",
"uint16",
"bool"));
223 "precision",
true,
edm::Comment(
"the precision with which to store the value in the flat table")) xor
225 "precision",
true,
edm::Comment(
"the precision with which to store the value in the flat table")),
229 variables.setComment(
"a parameters set to define all variable to fill the flat table");
265 std::vector<std::unique_ptr<Variable<T>>>
vars_;
268 template <
typename T>
275 :
std::numeric_limits<unsigned
int>::
max()),
285 std::make_unique<IntExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
286 else if (type ==
"uint")
288 std::make_unique<UIntExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
289 else if (type ==
"float")
291 std::make_unique<FloatExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
292 else if (type ==
"double")
294 std::make_unique<DoubleExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
295 else if (type ==
"uint8")
297 std::make_unique<UInt8ExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
298 else if (type ==
"int16")
300 std::make_unique<Int16ExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
301 else if (type ==
"uint16")
303 std::make_unique<UInt16ExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
304 else if (type ==
"bool")
306 std::make_unique<BoolExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
308 throw cms::Exception(
"Configuration",
"unsupported type " + type +
" for variable " + vname);
320 "singleton",
false,
true,
edm::Comment(
"whether or not the input collection is single-element")),
322 "cut",
"",
true,
edm::Comment(
"selection on the main input collection")) and
326 edm::Comment(
"if true, can use methods of inheriting classes. Can " 327 "cause problems when multi-threading.")))
or 329 desc.addOptional<
unsigned int>(
"maxLen")->setComment(
330 "define the maximum length of the input collection to put in the branch");
333 extvariable.
add<
edm::InputTag>(
"src")->setComment(
"valuemap input collection to fill the flat table");
334 extvariable.
add<
std::string>(
"doc")->setComment(
"few words description of the branch content");
337 "type",
"int",
true,
edm::Comment(
"the c++ type of the branch in the flat table")),
338 edm::allowedValues<std::string>(
"int",
"uint",
"float",
"double",
"uint8",
"int16",
"uint16",
"bool"));
341 "precision",
true,
edm::Comment(
"the precision with which to store the value in the flat table")) xor
344 edm::Comment(
"the precision with which to store the value in the " 345 "flat table, as a function of the object evaluated")),
349 extvariables.
setComment(
"a parameters set to define all variable taken form valuemap to fill the flat table");
362 std::vector<const T *> selobjs;
363 std::vector<edm::Ptr<T>> selptrs;
367 selobjs.push_back(&(*
prod)[0]);
369 selptrs.emplace_back(
prod->ptrAt(0));
371 for (
unsigned int i = 0,
n =
prod->size();
i <
n; ++
i) {
372 const auto &
obj = (*prod)[
i];
374 selobjs.push_back(&
obj);
376 selptrs.emplace_back(
prod->ptrAt(
i));
387 var->fill(iEvent, selptrs, *
out);
389 var->fill(iEvent, selptrs, *
out);
406 std::vector<std::unique_ptr<ExtVariable<T>>>
extvars_;
410 template <
typename T,
typename V>
420 std::make_unique<IntTypedExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
421 else if (type ==
"uint")
423 std::make_unique<UIntTypedExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
424 else if (type ==
"float")
426 std::make_unique<FloatTypedExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
427 else if (type ==
"double")
429 std::make_unique<DoubleTypedExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
430 else if (type ==
"uint8")
432 std::make_unique<UInt8TypedExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
433 else if (type ==
"int16")
435 std::make_unique<Int16TypedExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
436 else if (type ==
"uint16")
438 std::make_unique<UInt16TypedExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
439 else if (type ==
"bool")
441 std::make_unique<BoolTypedExtVar>(vname, varPSet, this->consumesCollector(), this->
skipNonExistingSrc_));
443 throw cms::Exception(
"Configuration",
"unsupported type " + type +
" for variable " + vname);
450 extvariable.
add<
edm::InputTag>(
"src")->setComment(
"valuemap input collection to fill the flat table");
452 "a function to define the content of the branch in the flat table");
453 extvariable.
add<
std::string>(
"doc")->setComment(
"few words description of the branch content");
455 ->setComment(
"if true, can use methods of inheriting classes in `expr`. Can cause problems with threading.");
458 "type",
"int",
true,
edm::Comment(
"the c++ type of the branch in the flat table")),
459 edm::allowedValues<std::string>(
"int",
"uint",
"float",
"double",
"uint8",
"int16",
"uint16",
"bool"));
462 "precision",
true,
edm::Comment(
"the precision with which to store the value in the flat table")) xor
465 edm::Comment(
"the precision with which to store the value in the " 466 "flat table, as a function of the object evaluated")),
470 extvariables.
setComment(
"a parameters set to define all variable taken form valuemap to fill the flat table");
489 template <
typename T>
495 :
std::numeric_limits<unsigned
int>::
max()),
505 "BXVectorSimpleFlatTableProducer already defines the " +
bxVarName_ +
506 "internally and thus you should not specify it yourself");
513 "selection on the main input collection (but selection can not be bx based)");
514 desc.addOptional<
unsigned int>(
"maxLen")->setComment(
515 "define the maximum length of the input collection to put in the branch");
516 desc.add<
int>(
"minBX", -2)->setComment(
"min bx (inclusive) to include");
517 desc.add<
int>(
"maxBX", 2)->setComment(
"max bx (inclusive) to include");
518 desc.add<
bool>(
"alwaysWriteBXValue",
true)
519 ->setComment(
"always write the bx number (event when only one bx can be present, ie minBX==maxBX)");
525 std::vector<const T *> selObjs;
526 std::vector<int> selObjBXs;
532 for (
size_t objNr = 0, nrObjs =
prod->size(
bx); objNr < nrObjs; ++objNr) {
535 selObjs.push_back(&
obj);
536 selObjBXs.push_back(
bx);
543 auto out = std::make_unique<nanoaod::FlatTable>(selObjs.size(), this->
name_,
false, this->
extension_);
547 out->template addColumn<int16_t>(
bxVarName_, selObjBXs,
"BX of the L1 candidate");
561 template <
typename T>
574 auto out = std::make_unique<nanoaod::FlatTable>(1, this->
name_,
true, this->
extension_);
575 std::vector<const T *> selobjs(1,
prod.product());
582 template <
typename T>
597 auto out = std::make_unique<nanoaod::FlatTable>(1, this->
name_,
true, this->
extension_);
598 std::vector<const T *> selobjs(1, &(*
prod)[0]);
609 template <
typename T,
typename TProd>
611 :
public edm::one::EDProducer<edm::EndLuminosityBlockProducer, edm::LuminosityBlockCache<int>> {
626 vars_.push_back(std::make_unique<IntVar>(vname, varPSet));
627 else if (
type ==
"float")
628 vars_.push_back(std::make_unique<FloatVar>(vname, varPSet));
629 else if (
type ==
"uint8")
630 vars_.push_back(std::make_unique<UInt8Var>(vname, varPSet));
631 else if (
type ==
"bool")
632 vars_.push_back(std::make_unique<BoolVar>(vname, varPSet));
634 throw cms::Exception(
"Configuration",
"unsupported type " +
type +
" for variable " + vname);
637 produces<nanoaod::FlatTable, edm::Transition::EndLuminosityBlock>();
678 std::vector<std::unique_ptr<Variable<T>>>
vars_;
682 template <
typename T>
697 auto out = std::make_unique<nanoaod::FlatTable>(1, this->
name_,
true, this->
extension_);
698 std::vector<const T *> selobjs(1,
prod.product());
706 template <
typename T,
typename TProd>
712 :
std::numeric_limits<unsigned
int>::
max()),
719 desc.addOptional<
unsigned int>(
"maxLen")->setComment(
720 "define the maximum length of the input collection to put in the branch");
726 std::vector<const T *> selobjs;
728 for (
unsigned int i = 0,
n = prod->size();
i <
n; ++
i) {
729 const auto &
obj = (*prod)[
i];
731 selobjs.push_back(&
obj);
737 auto out = std::make_unique<nanoaod::FlatTable>(selobjs.size(), this->
name_,
false, this->
extension_);
752 template <
typename T,
typename TProd>
768 vars_.push_back(std::make_unique<IntVar>(vname, varPSet));
769 else if (
type ==
"float")
770 vars_.push_back(std::make_unique<FloatVar>(vname, varPSet));
771 else if (
type ==
"uint8")
772 vars_.push_back(std::make_unique<UInt8Var>(vname, varPSet));
773 else if (
type ==
"bool")
774 vars_.push_back(std::make_unique<BoolVar>(vname, varPSet));
776 throw cms::Exception(
"Configuration",
"unsupported type " +
type +
" for variable " + vname);
779 produces<nanoaod::FlatTable, edm::Transition::EndRun>();
816 std::vector<std::unique_ptr<Variable<T>>>
vars_;
820 template <
typename T>
828 auto out = std::make_unique<nanoaod::FlatTable>(1, this->
name_,
true, this->
extension_);
829 std::vector<const T *> selobjs(1,
prod.product());
837 template <
typename T,
typename TProd>
843 :
std::numeric_limits<unsigned
int>::
max()),
849 std::vector<const T *> selobjs;
851 for (
unsigned int i = 0,
n = prod->size();
i <
n; ++
i) {
852 const auto &
obj = (*prod)[
i];
854 selobjs.push_back(&
obj);
860 auto out = std::make_unique<nanoaod::FlatTable>(selobjs.size(), this->
name_,
false, this->
extension_);
ValueMapVariable< T, double, float > DoubleExtVar
SimpleTypedExternalFlatTableProducer(edm::ParameterSet const ¶ms)
ParameterDescriptionNode * ifValue(ParameterDescription< T > const &switchParameter, std::unique_ptr< ParameterDescriptionCases< T >> cases)
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
Variable(const std::string &aname, const edm::ParameterSet &cfg)
T getParameter(std::string const &) const
TypedValueMapVariable< T, V, StringObjectFunction< V >, double > DoubleTypedExtVar
ValueMapVariable< T, int, uint16_t > UInt16ExtVar
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
ValueMapVariable< T, bool > BoolExtVar
FuncVariable< T, StringObjectFunction< T >, int > IntVar
~SimpleFlatTableProducerBase() override
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
std::vector< std::unique_ptr< Variable< T > > > vars_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::LuminosityBlock &, const edm::Handle< T > &prod) const override
~RunSingletonSimpleFlatTableProducer() override
TypedValueMapVariable< T, V, StringObjectFunction< V >, uint16_t > UInt16TypedExtVar
FuncVariable< T, StringCutObjectSelector< T >, bool > BoolVar
virtual void fill(const edm::Event &iEvent, std::vector< edm::Ptr< ObjType >> selptrs, nanoaod::FlatTable &out) const =0
std::shared_ptr< int > globalBeginRun(edm::Run const &, edm::EventSetup const &) const override
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
uint32_t cc[maxCellsPerHit]
ValueMapVariable< T, int, uint8_t > UInt8ExtVar
const edm::EDGetTokenT< TProd > src_
~FirstObjectSimpleFlatTableProducer() override
void globalEndRun(edm::Run const &, edm::EventSetup const &) override
const StringCutObjectSelector< T > cut_
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &iEvent, const edm::Handle< edm::View< T >> &prod) const override
TypedValueMapVariable< T, V, StringObjectFunction< V >, uint32_t > UIntTypedExtVar
FuncVariable< T, StringObjectFunction< T >, uint32_t > UIntVar
FuncVariable< T, StringObjectFunction< T >, uint8_t > UInt8Var
const bool skipNonExistingSrc_
constexpr char const * varNames[]
FuncVariable< T, StringCutObjectSelector< T >, bool > BoolVar
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
VariableBase(const std::string &aname, const edm::ParameterSet &cfg)
~LumiSimpleFlatTableProducer() override
const bool skipNonExistingSrc_
FuncVariable< T, StringObjectFunction< T >, uint16_t > UInt16Var
SimpleFlatTableProducerBase(edm::ParameterSet const ¶ms)
ValueMapVariable< T, uint32_t > UIntExtVar
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
virtual std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Run &iRun, const edm::Handle< TProd > &prod) const =0
~LumiSingletonSimpleFlatTableProducer() override
ValueMapVariable< T, int, int16_t > Int16ExtVar
ValType eval(const edm::Handle< edm::ValueMap< TIn >> &vmap, const edm::Ptr< ObjType > &op) const override
TypedValueMapVariable(const std::string &aname, const edm::ParameterSet &cfg, edm::ConsumesCollector &&cc, bool skipNonExistingSrc=false)
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &, const edm::Handle< T > &prod) const override
FuncVariable< T, StringObjectFunction< T >, uint8_t > UInt8Var
void setComment(std::string const &value)
void globalEndLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
const StringCutObjectSelector< T > cut_
~EventSingletonSimpleFlatTableProducer() override
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::LuminosityBlock &iLumi, const edm::Handle< TProd > &prod) const override
const StringCutObjectSelector< T > cut_
TypedValueMapVariable< T, V, StringObjectFunction< V >, float > FloatTypedExtVar
~SimpleFlatTableProducer() override
const bool skipNonExistingSrc_
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
const unsigned int maxLen_
FuncVariable< T, StringObjectFunction< T >, int16_t > Int16Var
FuncVariable< T, StringObjectFunction< T >, float > FloatVar
TypedValueMapVariable< T, V, StringObjectFunction< V >, int16_t > Int16TypedExtVar
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
static const std::string & name()
const unsigned int maxLen_
std::vector< std::unique_ptr< ExtVariable< T > > > typedextvars_
std::vector< std::unique_ptr< ExtVariable< T > > > extvars_
ParameterDescriptionNode * addOptionalNode(ParameterDescriptionNode const &node, bool writeToCfi)
LumiSingletonSimpleFlatTableProducer(edm::ParameterSet const ¶ms)
RunSingletonSimpleFlatTableProducer(edm::ParameterSet const ¶ms)
static edm::ParameterSetDescription baseDescriptions()
ExtVariable(const std::string &aname, const edm::ParameterSet &cfg)
TypedValueMapVariable< T, V, StringCutObjectSelector< V >, bool > BoolTypedExtVar
SimpleFlatTableProducer(edm::ParameterSet const ¶ms)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
virtual ValType eval(const edm::Handle< edm::ValueMap< TIn >> &vmap, const edm::Ptr< ObjType > &op) const =0
ValueMapVariableBase(const std::string &aname, const edm::ParameterSet &cfg, edm::ConsumesCollector &&cc, bool skipNonExistingSrc=false)
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Run &iRun, const edm::Handle< TProd > &prod) const override
edm::EDGetTokenT< edm::ValueMap< TIn > > token_
const unsigned int maxLen_
const unsigned int maxLen_
TypedValueMapVariable< T, V, StringObjectFunction< V >, int32_t > IntTypedExtVar
void endRunProduce(edm::Run &iRun, const edm::EventSetup &iSetup) final
const bool skipNonExistingSrc_
const edm::EDGetTokenT< TProd > src_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
FuncVariable< T, StringObjectFunction< T >, float > FloatVar
~SimpleFlatTableProducerBaseLumi() override
FuncVariable< T, StringObjectFunction< T >, int32_t > IntVar
StringObjectFunction< ObjType > precisionFunc_
void fill(std::vector< const ObjType *> &selobjs, nanoaod::FlatTable &out) const override
BXVectorSimpleFlatTableProducer(edm::ParameterSet const ¶ms)
FuncVariable< T, StringObjectFunction< T >, int > IntVar
StringFunctor precisionFunc_
RunSimpleFlatTableProducer(edm::ParameterSet const ¶ms)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const std::string & name() const
SimpleFlatTableProducerBaseRun(edm::ParameterSet const ¶ms)
FuncVariable< T, StringObjectFunction< T >, uint8_t > UInt8Var
FuncVariable< T, StringObjectFunction< T >, float > FloatVar
SimpleFlatTableProducerBaseLumi(edm::ParameterSet const ¶ms)
virtual std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &iEvent, const edm::Handle< TProd > &prod) const =0
FuncVariable< T, StringObjectFunction< T >, double > DoubleVar
std::vector< std::unique_ptr< Variable< T > > > vars_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::shared_ptr< int > globalBeginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) const override
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &iEvent, const edm::Handle< edm::View< T >> &prod) const override
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Event &iEvent, const edm::Handle< BXVector< T >> &prod) const override
static float reduceMantissaToNbitsRounding(const float &f)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
ValueMapVariable(const std::string &aname, const edm::ParameterSet &cfg, edm::ConsumesCollector &&cc, bool skipNonExistingSrc=false)
FirstObjectSimpleFlatTableProducer(edm::ParameterSet const ¶ms)
EventSingletonSimpleFlatTableProducer(edm::ParameterSet const ¶ms)
ValueMapVariable< T, float > FloatExtVar
FuncVariable(const std::string &aname, const edm::ParameterSet &cfg)
~RunSimpleFlatTableProducer() override
virtual void fill(std::vector< const ObjType *> &selobjs, nanoaod::FlatTable &out) const =0
TypedValueMapVariable< T, V, StringObjectFunction< V >, uint8_t > UInt8TypedExtVar
ValueMapVariable< T, int32_t > IntExtVar
std::vector< std::unique_ptr< Variable< T > > > vars_
ValType eval(const edm::Handle< edm::ValueMap< TIn >> &vmap, const edm::Ptr< ObjType > &op) const override
LumiSimpleFlatTableProducer(edm::ParameterSet const ¶ms)
~SimpleTypedExternalFlatTableProducer() override
std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::Run &, const edm::Handle< T > &prod) const override
void endLuminosityBlockProduce(edm::LuminosityBlock &iLumi, const edm::EventSetup &iSetup) final
~SimpleFlatTableProducerBaseRun() override
const StringCutObjectSelector< T > cut_
FuncVariable< T, StringCutObjectSelector< T >, bool > BoolVar
const bool alwaysWriteBXValue_
virtual std::unique_ptr< nanoaod::FlatTable > fillTable(const edm::LuminosityBlock &iLumi, const edm::Handle< TProd > &prod) const =0
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const edm::EDGetTokenT< TProd > src_
static edm::ParameterSetDescription baseDescriptions()
const std::string bxVarName_
void fill(const edm::Event &iEvent, std::vector< edm::Ptr< ObjType >> selptrs, nanoaod::FlatTable &out) const override