11#include " ../interface/HLTObjectStore.h"
22
3+ /* static*/
4+ panda::HLTObjectStore::HLTObjectVector const panda::HLTObjectStore::emptyVector_{};
5+
36panda::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)
4137void
4238panda::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
5269void
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
7087panda::HLTObjectStore::HLTObjectVector const &
7188panda::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