CMS 3D CMS Logo

HLTLevel1Pattern.cc
Go to the documentation of this file.
1 
13 #include <vector>
14 
28 
29 //
30 // class declaration
31 //
32 
34 public:
35  explicit HLTLevel1Pattern(const edm::ParameterSet&);
36  ~HLTLevel1Pattern() override;
37  static void fillDescriptions(edm::ConfigurationDescriptions & descriptions);
38  bool filter(edm::Event&, const edm::EventSetup&) override;
39 
40 private:
44  std::vector<int> m_bunchCrossings;
45  std::vector<int> m_triggerPattern;
46  unsigned int m_daqPartitions;
47  unsigned int m_triggerNumber;
51  bool m_invert;
52  bool m_throw;
53 
57 };
58 
64 
65 //
66 // constructors and destructor
67 //
69  m_gtReadoutRecord( config.getParameter<edm::InputTag> ("L1GtReadoutRecordTag") ),
70  m_triggerBit( config.getParameter<std::string> ("triggerBit") ),
71  m_bunchCrossings( config.getParameter<std::vector<int> > ("bunchCrossings") ),
73  m_daqPartitions( config.getParameter<unsigned int> ("daqPartitions") ),
74  m_triggerNumber( 0 ),
77  m_ignoreL1Mask( config.getParameter<bool> ("ignoreL1Mask") ),
78  m_invert( config.getParameter<bool> ("invert") ),
79  m_throw ( config.getParameter<bool> ("throw" ) )
80 {
81  m_gtReadoutRecordToken = consumes<L1GlobalTriggerReadoutRecord>(m_gtReadoutRecord);
82  std::vector<int> pattern( config.getParameter<std::vector<int> > ("triggerPattern") );
83  if (pattern.size() != m_bunchCrossings.size())
84  throw cms::Exception("Configuration") << "\"bunchCrossings\" and \"triggerPattern\" parameters do not match";
85 
86  for (unsigned int i = 0; i < pattern.size(); ++i)
87  m_triggerPattern[i] = (bool) pattern[i];
88 }
89 
91 
92 void
95  desc.add<edm::InputTag>("L1GtReadoutRecordTag",edm::InputTag("hltGtDigis"));
96  desc.add<std::string>("triggerBit","L1Tech_RPC_TTU_pointing_Cosmics.v0");
97  {
98  std::vector<int> temp1;
99  temp1.reserve(5);
100  temp1.push_back(-2);
101  temp1.push_back(-1);
102  temp1.push_back(0);
103  temp1.push_back(1);
104  temp1.push_back(2);
105  desc.add<std::vector<int> >("bunchCrossings",temp1);
106  }
107  desc.add<unsigned int>("daqPartitions",1);
108  desc.add<bool>("ignoreL1Mask",false);
109  desc.add<bool>("invert",false);
110  desc.add<bool>("throw",true);
111  {
112  std::vector<int> temp1;
113  temp1.reserve(5);
114  temp1.push_back(1);
115  temp1.push_back(1);
116  temp1.push_back(1);
117  temp1.push_back(0);
118  temp1.push_back(0);
119  desc.add<std::vector<int> >("triggerPattern",temp1);
120  }
121  descriptions.add("hltLevel1Pattern",desc);
122 }
123 
124 //
125 // member functions
126 //
127 
128 // ------------ method called to produce the data ------------
129 bool
131 {
132  // determine the L1 algo or tech bit to use
133  if (m_watchL1Menu.check(setup)) {
135  setup.get<L1GtTriggerMenuRcd>().get(h_menu);
136 
137  // look for an Algo L1 bit
138  const AlgorithmMap & algoMap = h_menu->gtAlgorithmAliasMap();
139  const AlgorithmMap & techMap = h_menu->gtTechnicalTriggerMap();
140  AlgorithmMap::const_iterator entry;
141  if ((entry = algoMap.find(m_triggerBit)) != algoMap.end()) {
142  m_triggerAlgo = true;
143  m_triggerNumber = entry->second.algoBitNumber();
144  } else
145  if ((entry = techMap.find(m_triggerBit)) != techMap.end()) {
146  m_triggerAlgo = false;
147  m_triggerNumber = entry->second.algoBitNumber();
148  } else {
149  if (m_throw) {
150  throw cms::Exception("Configuration") << "requested L1 trigger \"" << m_triggerBit << "\" does not exist in the current L1 menu";
151  } else {
152  return m_invert;
153  }
154  }
155  }
156 
157  if (m_triggerAlgo) {
158  // check the L1 algorithms mask
159  // - mask & partition == part. --> fully masked
160  // - mask & partition == 0x00 --> fully unmasked
161  // - mask & partition != part. --> unmasked in some partitions, consider as unmasked
162  if (m_watchPhysicsMask.check(setup)) {
164  setup.get<L1GtTriggerMaskAlgoTrigRcd>().get(h_mask);
166  }
167  } else {
168  // check the L1 technical triggers mask
169  // - mask & partition == part. --> fully masked
170  // - mask & partition == 0x00 --> fully unmasked
171  // - mask & partition != part. --> unmasked in some partitions, consider as unmasked
172  if (m_watchTechnicalMask.check(setup)) {
174  setup.get<L1GtTriggerMaskTechTrigRcd>().get(h_mask);
176  }
177  }
178 
179  // is the L1 trigger masked ?
180  if (not m_ignoreL1Mask and m_triggerMasked)
181  return m_invert;
182 
183  // access the L1 decisions
185  event.getByToken(m_gtReadoutRecordToken, h_gtReadoutRecord);
186 
187  // check the L1 algorithms results
188  for (unsigned int i = 0; i < m_bunchCrossings.size(); ++i) {
189  int bx = m_bunchCrossings[i];
190  const std::vector<bool> & word = (m_triggerAlgo) ? h_gtReadoutRecord->decisionWord(bx) : h_gtReadoutRecord->technicalTriggerWord(bx);
191  if (word.empty() or m_triggerNumber >= word.size())
192  // L1 results not available, bail out
193  return m_invert;
194  bool result = word[m_triggerNumber];
195  if (result != m_triggerPattern[i])
196  // comparison failed, bail out
197  return m_invert;
198  }
199 
200  // comparison successful
201  return not m_invert;
202 }
203 
204 // define as a framework plugin
size
Write out results.
T getParameter(std::string const &) const
HLTLevel1Pattern(const edm::ParameterSet &)
std::string m_triggerBit
const TechnicalTriggerWord & technicalTriggerWord(int bxInEventValue) const
bool filter(edm::Event &, const edm::EventSetup &) override
edm::InputTag m_gtReadoutRecord
std::map< std::string, L1GtAlgorithm > AlgorithmMap
map containing the algorithms
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
Definition: config.py:1
edm::ESWatcher< L1GtTriggerMaskTechTrigRcd > m_watchTechnicalMask
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< int > m_bunchCrossings
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const std::vector< unsigned int > & gtTriggerMask() const
get the trigger mask
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
Definition: Activities.doc:12
unsigned int m_triggerNumber
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const DecisionWord & decisionWord(int bxInEventValue) const
~HLTLevel1Pattern() override
edm::EDGetTokenT< L1GlobalTriggerReadoutRecord > m_gtReadoutRecordToken
edm::ESWatcher< L1GtTriggerMenuRcd > m_watchL1Menu
unsigned int m_daqPartitions
void add(std::string const &label, ParameterSetDescription const &psetDescription)
std::vector< int > m_triggerPattern
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:52
HLT enums.
T get() const
Definition: EventSetup.h:71
const AlgorithmMap & gtTechnicalTriggerMap() const
get / set the technical trigger map
edm::ESWatcher< L1GtTriggerMaskAlgoTrigRcd > m_watchPhysicsMask
const AlgorithmMap & gtAlgorithmAliasMap() const
get / set the algorithm map (by alias)
Definition: event.py:1