Skip to content

Commit 1649272

Browse files
author
Daniel Abercrombie
authored
Merge pull request #130 from yiiyama/master
It doesn't seem to change anything for me in Hbb no leptons either.
2 parents 8649fa8 + 29afbe0 commit 1649272

5 files changed

Lines changed: 84 additions & 66 deletions

File tree

Objects/interface/EventBase.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ namespace panda {
7777
* By default, all trigger objects are loaded into the triggerObjects map at each call to getEntry.
7878
* Once a call to this function is made, only the objects for the registered filter will be loaded.
7979
*/
80-
void registerTriggerObjects(char const* filter) { registeredTriggerFilters_.emplace_back(filter); }
80+
void registerTriggerObjects(char const* filter) { triggerObjects.registerFilter(filter); }
8181

8282
//! Repeatable random number generator, initialized to be empty
8383
RRNG rng{0,0,nullptr};
@@ -95,12 +95,6 @@ namespace panda {
9595
*/
9696
std::map<TTree*, std::pair<Int_t, TTree*>> runTrees_;
9797

98-
//! List of trigger object filter names to use
99-
std::vector<TString> registeredTriggerFilters_{};
100-
101-
//! Trigger filter mask generated from registeredTriggerFilters for each run
102-
std::vector<bool> triggerFilterMask_{};
103-
10498
/* END CUSTOM */
10599
};
106100

Objects/interface/HLTObjectStore.h

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,33 @@ namespace panda {
2222
void setFilterObjectKeys(std::vector<TString> const& filters);
2323

2424
//! Fill the filterObjects map for each event. Not to be called by users.
25-
void makeMap(std::vector<bool> const& mask);
25+
void makeMap();
26+
27+
//! Use to declare a trigger filter name (key in the triggerObjects map) to be used in the analysis.
28+
/*!
29+
* By default, all trigger objects are loaded into the triggerObjects map at each call to getEntry.
30+
* Once a call to this function is made, only the objects for the registered filter will be loaded.
31+
*/
32+
void registerFilter(char const* filter) { registeredFilters_.emplace(filter); }
33+
34+
//! If set to true, return an empty vector when non-existent filter is asked for
35+
void setIgnoreMissing(Bool_t b) { ignoreMissing_ = b; }
2636

2737
//! filterObjects_.at() with warnings. To be called by users.
2838
HLTObjectVector const& filterObjects(char const* filter) const;
2939

3040
protected:
31-
std::map<TString, HLTObjectVector> filterObjects_{};
32-
//! internal-use pointers to the values of filterObjects_
33-
std::vector<HLTObjectVector*> objectVectors_{};
41+
Bool_t ignoreMissing_{false};
42+
//! List of trigger object filter names to use
43+
std::set<TString> registeredFilters_{};
44+
//! Map from filter name to the outer index of objectVectors
45+
std::map<TString, UInt_t> nameToSlot_{};
46+
//! Map from filter index to objectVectors slot
47+
std::vector<Int_t> indexToSlot_{};
48+
//! Vector of vector of pointers to the objects. Outer index for filters
49+
std::vector<HLTObjectVector> objectVectors_{};
50+
//! Empty vector as a return value to filterObjects when ignoreMissing is true
51+
static HLTObjectVector const emptyVector_;
3452
};
3553

3654
}

Objects/src/EventBase.cc

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ panda::EventBase::operator=(EventBase const& _src)
4848
rng = _src.rng;
4949
rng.setSeedAddress(&eventNumber);
5050
triggerObjects = _src.triggerObjects;
51+
52+
readRunTree_ = _src.readRunTree_;
5153
/* END CUSTOM */
5254

5355
runNumber = _src.runNumber;
@@ -223,7 +225,7 @@ panda::EventBase::doGetEntry_(TTree& _tree)
223225
}
224226

225227
if (triggerObjects.size() != 0 && run.hlt.filters)
226-
triggerObjects.makeMap(triggerFilterMask_);
228+
triggerObjects.makeMap();
227229

228230
rng.generate();
229231

@@ -266,27 +268,10 @@ panda::EventBase::triggerFired(UInt_t _token) const
266268
void
267269
panda::EventBase::setTriggerFilters_()
268270
{
271+
if (triggerObjects.size() == 0 || !run.hlt.filters)
272+
return;
269273

270-
if (triggerObjects.size() != 0 && run.hlt.filters) {
271-
triggerObjects.setFilterObjectKeys(*run.hlt.filters);
272-
273-
if (registeredTriggerFilters_.empty()) {
274-
// if no filters are registered, don't mask
275-
triggerFilterMask_.resize(run.hlt.filters->size(), true);
276-
}
277-
else {
278-
// else only allow the registered filters
279-
triggerFilterMask_.resize(run.hlt.filters->size(), false);
280-
for (unsigned fidx(0); fidx != run.hlt.filters->size(); ++fidx) {
281-
for (auto& filter : registeredTriggerFilters_) {
282-
if (filter == run.hlt.filters->at(fidx)) {
283-
triggerFilterMask_[fidx] = true;
284-
break;
285-
}
286-
}
287-
}
288-
}
289-
}
274+
triggerObjects.setFilterObjectKeys(*run.hlt.filters);
290275
}
291276

292277
/* END CUSTOM */

Objects/src/EventMonophoton.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ panda::EventMonophoton::copy(Event const& _src)
304304
weight = _src.weight;
305305

306306
triggers = _src.triggers;
307+
triggerObjects = _src.triggerObjects;
307308

308309
npv = _src.npv;
309310
npvTrue = _src.npvTrue;

Objects/src/HLTObjectStore.cc

Lines changed: 54 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
#include "../interface/HLTObjectStore.h"
22

3+
/*static*/
4+
panda::HLTObjectStore::HLTObjectVector const panda::HLTObjectStore::emptyVector_{};
5+
36
panda::HLTObjectStore::HLTObjectStore(HLTObjectStore const& _src) :
47
HLTObjectCollection(_src)
58
{
6-
for (auto& fo : _src.filterObjects_) {
7-
HLTObjectVector myVector;
8-
for (auto* obj : fo.second) {
9-
for (unsigned iO(0); iO != _src.size(); ++iO) {
10-
if (&(_src[iO]) == obj)
11-
myVector.push_back(&at(iO));
12-
}
13-
}
9+
nameToSlot_ = _src.nameToSlot_;
10+
objectVectors_.resize(_src.objectVectors_.size());
1411

15-
filterObjects_.emplace(fo.first, myVector);
12+
for (UInt_t fidx(0); fidx != _src.objectVectors_.size(); ++fidx) {
13+
objectVectors_[fidx].clear();
14+
for (auto* obj : _src.objectVectors_[fidx])
15+
objectVectors_[fidx].push_back(&at(obj - &_src.at(0)));
1616
}
1717
}
1818

@@ -21,18 +21,14 @@ panda::HLTObjectStore::operator=(HLTObjectStore const& _rhs)
2121
{
2222
HLTObjectCollection::operator=(_rhs);
2323

24-
filterObjects_.clear();
24+
registeredFilters_ = _rhs.registeredFilters_;
25+
nameToSlot_ = _rhs.nameToSlot_;
26+
objectVectors_.resize(_rhs.objectVectors_.size());
2527

26-
for (auto& fo : _rhs.filterObjects_) {
27-
HLTObjectVector myVector;
28-
for (auto* obj : fo.second) {
29-
for (unsigned iO(0); iO != _rhs.size(); ++iO) {
30-
if (&(_rhs[iO]) == obj)
31-
myVector.push_back(&at(iO));
32-
}
33-
}
34-
35-
filterObjects_.emplace(fo.first, myVector);
28+
for (UInt_t fidx(0); fidx != _rhs.objectVectors_.size(); ++fidx) {
29+
objectVectors_[fidx].clear();
30+
for (auto* obj : _rhs.objectVectors_[fidx])
31+
objectVectors_[fidx].push_back(&at(obj - &_rhs.at(0)));
3632
}
3733

3834
return *this;
@@ -41,36 +37,57 @@ panda::HLTObjectStore::operator=(HLTObjectStore const& _rhs)
4137
void
4238
panda::HLTObjectStore::setFilterObjectKeys(std::vector<TString> const& _filters)
4339
{
44-
filterObjects_.clear();
45-
if (_filters.size() > objectVectors_.size())
40+
nameToSlot_.clear();
41+
42+
if (registeredFilters_.empty()) {
43+
// all filters are used
4644
objectVectors_.resize(_filters.size());
45+
indexToSlot_.resize(_filters.size());
4746

48-
for (UShort_t fidx(0); fidx != _filters.size(); ++fidx)
49-
objectVectors_[fidx] = &filterObjects_[_filters[fidx]];
47+
for (UShort_t fidx(0); fidx != _filters.size(); ++fidx) {
48+
nameToSlot_[_filters[fidx]] = fidx;
49+
indexToSlot_[fidx] = fidx;
50+
}
51+
}
52+
else {
53+
indexToSlot_.assign(_filters.size(), -1);
54+
55+
// only allow registered filters
56+
int slot(0);
57+
for (UShort_t fidx(0); fidx != _filters.size(); ++fidx) {
58+
auto& filter(_filters[fidx]);
59+
if (registeredFilters_.count(filter) != 0) {
60+
indexToSlot_[fidx] = slot;
61+
nameToSlot_[filter] = slot++;
62+
}
63+
}
64+
65+
objectVectors_.resize(slot);
66+
}
5067
}
5168

5269
void
53-
panda::HLTObjectStore::makeMap(std::vector<bool> const& _mask)
70+
panda::HLTObjectStore::makeMap()
5471
{
55-
for (auto* objv : objectVectors_)
56-
objv->clear();
72+
for (auto& objv : objectVectors_)
73+
objv.clear();
5774

5875
for (auto& obj : *this) {
5976
for (UShort_t fidx : *obj.filters) {
60-
if (fidx < _mask.size()) {
61-
if (_mask[fidx])
62-
objectVectors_[fidx]->push_back(&obj);
63-
}
64-
else
77+
if (fidx >= indexToSlot_.size())
6578
throw std::runtime_error(TString::Format("Invalid trigger filter index %d found in trigger objects. There is very likely a bug in HLTObjectStore or EventBase.", fidx).Data());
79+
80+
int slot(indexToSlot_[fidx]);
81+
if (slot >= 0)
82+
objectVectors_[slot].push_back(&obj);
6683
}
6784
}
6885
}
6986

7087
panda::HLTObjectStore::HLTObjectVector const&
7188
panda::HLTObjectStore::filterObjects(char const* _filter) const
7289
{
73-
if (filterObjects_.empty()) {
90+
if (nameToSlot_.empty()) {
7491
std::cerr << " HLTObjectStore has no filter objects. Store is filled by a call to makeMap(),"
7592
<< " which is executed in EventBase::doGetEntry_ if the following conditions are met:\n"
7693
<< " 1. runNumber branch is read in Event\n"
@@ -82,9 +99,12 @@ panda::HLTObjectStore::filterObjects(char const* _filter) const
8299
}
83100

84101
try {
85-
return filterObjects_.at(_filter);
102+
return objectVectors_[nameToSlot_.at(_filter)];
86103
}
87104
catch (std::out_of_range& ex) {
105+
if (ignoreMissing_)
106+
return emptyVector_;
107+
88108
std::cerr << "Unknown HLT filter " << _filter << std::endl;
89109
throw;
90110
}

0 commit comments

Comments
 (0)