31 src_(
consumes<
std::vector<
pat::TriggerObjectStandAlone>>(iConfig.getParameter<
edm::InputTag>(
"src"))),
38 std::vector<edm::ParameterSet> selPSets = iConfig.
getParameter<std::vector<edm::ParameterSet>>(
"selections");
39 sels_.reserve(selPSets.size());
40 std::stringstream idstr, qualitystr;
41 idstr <<
"ID of the object: ";
42 for (
auto &
pset : selPSets) {
44 idstr <<
sels_.back().id <<
" = " <<
sels_.back().name;
45 if (
sels_.size() < selPSets.size()) idstr <<
", ";
46 if (!
sels_.back().qualityBitsDoc.empty()) {
47 qualitystr <<
sels_.back().qualityBitsDoc <<
" for " <<
sels_.back().name <<
"; ";
53 produces<nanoaod::FlatTable>();
81 name(pset.getParameter<
std::
string>(
"name")),
82 id(pset.getParameter<
int>(
"id")),
83 cut(pset.getParameter<
std::
string>(
"sel")),
84 l1cut(
""), l1cut_2(
""), l2cut(
""),
85 l1DR2(-1), l1DR2_2(-1), l2DR2(-1),
86 qualityBits(pset.getParameter<
std::
string>(
"qualityBits")),
87 qualityBitsDoc(pset.getParameter<
std::
string>(
"qualityBitsDoc"))
119 std::vector<std::pair<const pat::TriggerObjectStandAlone *, const SelectedObject *>> selected;
120 for (
const auto &
obj : *src) {
123 selected.emplace_back(&
obj,&
sel);
130 std::map<const pat::TriggerObjectStandAlone *,int> selected_bits;
131 for(
unsigned int i = 0;
i < selected.size(); ++
i) {
132 const auto &
obj = *selected[
i].first;
133 const auto &
sel = *selected[
i].second;
136 for(
unsigned int j=0; j<
i; ++j){
137 const auto & obj2 = *selected[j].first;
138 const auto & sel2 = *selected[j].second;
140 selected_bits[&obj2] |= selected_bits[&
obj];
141 selected.erase(selected.begin()+
i);
158 std::vector<pair<pat::TriggerObjectStandAlone,int>> l1Objects;
164 l1Objects.emplace_back(l1obj,it->hwIso());
170 switch(it->getType()){
174 l1obj.setCollection(
"L1ETM");
177 case l1t::EtSum::EtSumType::kMissingEtHF:
179 l1obj.setCollection(
"L1ETMHF");
184 l1obj.setCollection(
"L1ETT");
187 case l1t::EtSum::EtSumType::kTotalEtEm:
189 l1obj.setCollection(
"L1ETEm");
194 l1obj.setCollection(
"L1HTT");
197 case l1t::EtSum::EtSumType::kTotalHtHF:
199 l1obj.setCollection(
"L1HTTHF");
204 l1obj.setCollection(
"L1HTM");
207 case l1t::EtSum::EtSumType::kMissingHtHF:
209 l1obj.setCollection(
"L1HTMHF");
216 l1Objects.emplace_back(l1obj,it->hwIso());
224 l1Objects.emplace_back(l1obj,it->hwIso());
231 l1obj.setCharge(it->charge());
232 l1Objects.emplace_back(l1obj,it->hwIso());
239 l1Objects.emplace_back(l1obj,it->hwIso());
243 unsigned int nobj = selected.size();
244 std::vector<float>
pt(nobj,0),
eta(nobj,0),
phi(nobj,0), l1pt(nobj, 0), l1pt_2(nobj, 0), l2pt(nobj, 0);
245 std::vector<int>
id(nobj,0),
bits(nobj, 0), l1iso(nobj, 0), l1charge(nobj,0);
246 for (
unsigned int i = 0;
i < nobj; ++
i) {
247 const auto &
obj = *selected[
i].first;
248 const auto &
sel = *selected[
i].second;
255 float best =
sel.l1DR2;
256 for (
const auto & l1obj : l1Objects) {
257 const auto &
seed = l1obj.first;
259 if (dr2 < best &&
sel.l1cut(
seed)) {
261 l1iso[
i] = l1obj.second;
262 l1charge[
i] =
seed.charge();
266 if (
sel.l1DR2_2 > 0) {
267 float best =
sel.l1DR2_2;
268 for (
const auto & l1obj : l1Objects) {
269 const auto &
seed = l1obj.first;
271 if (dr2 < best &&
sel.l1cut_2(
seed)) {
272 l1pt_2[
i] =
seed.pt();
277 float best =
sel.l2DR2;
278 for (
const auto &
seed : *src) {
280 if (dr2 < best &&
sel.l2cut(
seed)) {
287 auto tab = std::make_unique<nanoaod::FlatTable>(nobj,
name_,
false,
false);
BXVector< EGamma > EGammaBxCollection
const_iterator end(int bx) const
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
SelectedObject(const edm::ParameterSet &pset)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
enum start value shifted to 81 so as to avoid clashes with PDG codes
#define DEFINE_FWK_MODULE(type)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision bits
BXVector< Tau > TauBxCollection
~TriggerObjectTableProducer() override
StringCutObjectSelector< pat::TriggerObjectStandAlone > l1cut
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
edm::EDGetTokenT< l1t::JetBxCollection > l1Jet_
BXVector< EtSum > EtSumBxCollection
TriggerObjectTableProducer(const edm::ParameterSet &iConfig)
edm::EDGetTokenT< std::vector< pat::TriggerObjectStandAlone > > src_
void setCollection(const std::string &collName)
Methods.
StringObjectFunction< pat::TriggerObjectStandAlone > qualityBits
edm::EDGetTokenT< l1t::MuonBxCollection > l1Muon_
Abs< T >::type abs(const T &t)
std::string qualityBitsDoc
BXVector< Muon > MuonBxCollection
BXVector< Jet > JetBxCollection
StringCutObjectSelector< pat::TriggerObjectStandAlone > l1cut_2
bool match(const pat::TriggerObjectStandAlone &obj) const
T1 deltaR2(T1 eta1, T2 phi1, T3 eta2, T4 phi2)
edm::EDGetTokenT< l1t::TauBxCollection > l1Tau_
StringCutObjectSelector< pat::TriggerObjectStandAlone > cut
std::vector< SelectedObject > sels_
edm::EDGetTokenT< l1t::EGammaBxCollection > l1EG_
edm::EDGetTokenT< l1t::EtSumBxCollection > l1Sum_
void produce(edm::Event &, edm::EventSetup const &) override
const_iterator begin(int bx) const
Power< A, B >::type pow(const A &a, const B &b)
StringCutObjectSelector< pat::TriggerObjectStandAlone > l2cut
std::vector< EGamma >::const_iterator const_iterator
Analysis-level trigger object class (stand-alone)