CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HLTLevel1Pattern.cc
Go to the documentation of this file.
1 
15 #include <vector>
16 
28 
29 //
30 // class declaration
31 //
32 
33 class HLTLevel1Pattern : public HLTFilter {
34 public:
35  explicit HLTLevel1Pattern(const edm::ParameterSet&);
37  static void fillDescriptions(edm::ConfigurationDescriptions & descriptions);
38  virtual bool filter(edm::Event&, const edm::EventSetup&);
39 
40 private:
42  std::string m_triggerBit;
43  std::vector<int> m_bunchCrossings;
44  std::vector<int> m_triggerPattern;
45  unsigned int m_daqPartitions;
46  unsigned int m_triggerNumber;
50  bool m_invert;
51  bool m_throw;
52 
56 };
57 
58 #include <boost/foreach.hpp>
59 
66 
67 //
68 // constructors and destructor
69 //
71  m_gtReadoutRecord( config.getParameter<edm::InputTag> ("L1GtReadoutRecordTag") ),
72  m_triggerBit( config.getParameter<std::string> ("triggerBit") ),
73  m_bunchCrossings( config.getParameter<std::vector<int> > ("bunchCrossings") ),
74  m_triggerPattern( m_bunchCrossings.size(), false ),
75  m_daqPartitions( config.getParameter<unsigned int> ("daqPartitions") ),
76  m_triggerNumber( 0 ),
77  m_triggerAlgo( true ),
78  m_triggerMasked( false ),
79  m_ignoreL1Mask( config.getParameter<bool> ("ignoreL1Mask") ),
80  m_invert( config.getParameter<bool> ("invert") ),
81  m_throw ( config.getParameter<bool> ("throw" ) )
82 {
83  std::vector<int> pattern( config.getParameter<std::vector<int> > ("triggerPattern") );
84  if (pattern.size() != m_bunchCrossings.size())
85  throw cms::Exception("Configuration") << "\"bunchCrossings\" and \"triggerPattern\" parameters do not match";
86 
87  for (unsigned int i = 0; i < pattern.size(); ++i)
88  m_triggerPattern[i] = (bool) pattern[i];
89 }
90 
92 {
93 }
94 
95 void
98  desc.add<edm::InputTag>("L1GtReadoutRecordTag",edm::InputTag("hltGtDigis"));
99  desc.add<std::string>("triggerBit","L1Tech_RPC_TTU_pointing_Cosmics.v0");
100  {
101  std::vector<int> temp1;
102  temp1.reserve(5);
103  temp1.push_back(-2);
104  temp1.push_back(-1);
105  temp1.push_back(0);
106  temp1.push_back(1);
107  temp1.push_back(2);
108  desc.add<std::vector<int> >("bunchCrossings",temp1);
109  }
110  desc.add<unsigned int>("daqPartitions",1);
111  desc.add<bool>("ignoreL1Mask",false);
112  desc.add<bool>("invert",false);
113  desc.add<bool>("throw",true);
114  {
115  std::vector<int> temp1;
116  temp1.reserve(5);
117  temp1.push_back(1);
118  temp1.push_back(1);
119  temp1.push_back(1);
120  temp1.push_back(0);
121  temp1.push_back(0);
122  desc.add<std::vector<int> >("triggerPattern",temp1);
123  }
124  descriptions.add("hltLevel1Pattern",desc);
125 }
126 
127 //
128 // member functions
129 //
130 
131 // ------------ method called to produce the data ------------
132 bool
134 {
135  // determine the L1 algo or tech bit to use
136  if (m_watchL1Menu.check(setup)) {
138  setup.get<L1GtTriggerMenuRcd>().get(h_menu);
139 
140  // look for an Algo L1 bit
141  const AlgorithmMap & algoMap = h_menu->gtAlgorithmAliasMap();
142  const AlgorithmMap & techMap = h_menu->gtTechnicalTriggerMap();
143  AlgorithmMap::const_iterator entry;
144  if ((entry = algoMap.find(m_triggerBit)) != algoMap.end()) {
145  m_triggerAlgo = true;
146  m_triggerNumber = entry->second.algoBitNumber();
147  } else
148  if ((entry = techMap.find(m_triggerBit)) != techMap.end()) {
149  m_triggerAlgo = false;
150  m_triggerNumber = entry->second.algoBitNumber();
151  } else {
152  if (m_throw) {
153  throw cms::Exception("Configuration") << "requested L1 trigger \"" << m_triggerBit << "\" does not exist in the current L1 menu";
154  } else {
155  return m_invert;
156  }
157  }
158  }
159 
160  if (m_triggerAlgo) {
161  // check the L1 algorithms mask
162  // - mask & partition == part. --> fully masked
163  // - mask & partition == 0x00 --> fully unmasked
164  // - mask & partition != part. --> unmasked in some partitions, consider as unmasked
165  if (m_watchPhysicsMask.check(setup)) {
167  setup.get<L1GtTriggerMaskAlgoTrigRcd>().get(h_mask);
168  m_triggerMasked = ((h_mask->gtTriggerMask()[m_triggerNumber] & m_daqPartitions) == m_daqPartitions);
169  }
170  } else {
171  // check the L1 technical triggers mask
172  // - mask & partition == part. --> fully masked
173  // - mask & partition == 0x00 --> fully unmasked
174  // - mask & partition != part. --> unmasked in some partitions, consider as unmasked
175  if (m_watchTechnicalMask.check(setup)) {
177  setup.get<L1GtTriggerMaskTechTrigRcd>().get(h_mask);
178  m_triggerMasked = ((h_mask->gtTriggerMask()[m_triggerNumber] & m_daqPartitions) == m_daqPartitions);
179  }
180  }
181 
182  // is the L1 trigger masked ?
183  if (not m_ignoreL1Mask and m_triggerMasked)
184  return m_invert;
185 
186  // access the L1 decisions
188  event.getByLabel(m_gtReadoutRecord, h_gtReadoutRecord);
189 
190  // check the L1 algorithms results
191  for (unsigned int i = 0; i < m_bunchCrossings.size(); ++i) {
192  int bx = m_bunchCrossings[i];
193  const std::vector<bool> & word = (m_triggerAlgo) ? h_gtReadoutRecord->decisionWord(bx) : h_gtReadoutRecord->technicalTriggerWord(bx);
194  if (word.empty() or m_triggerNumber >= word.size())
195  // L1 results not available, bail out
196  return m_invert;
197  bool result = word[m_triggerNumber];
198  if (result != m_triggerPattern[i])
199  // comparison failed, bail out
200  return m_invert;
201  }
202 
203  // comparison successful
204  return not m_invert;
205 }
206 
207 // define as a framework plugin
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
HLTLevel1Pattern(const edm::ParameterSet &)
std::string m_triggerBit
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
edm::InputTag m_gtReadoutRecord
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::map< std::string, L1GtAlgorithm > AlgorithmMap
map containing the algorithms
edm::ESWatcher< L1GtTriggerMaskTechTrigRcd > m_watchTechnicalMask
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< int > m_bunchCrossings
virtual bool filter(edm::Event &, const edm::EventSetup &)
std::pair< std::string, MonitorElement * > entry
Definition: ME_MAP.h:8
tuple result
Definition: query.py:137
unsigned int m_triggerNumber
ParameterDescriptionBase * add(U const &iLabel, T const &value)
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 and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
edm::ESWatcher< L1GtTriggerMenuRcd > m_watchL1Menu
const T & get() const
Definition: EventSetup.h:55
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:59
edm::ESWatcher< L1GtTriggerMaskAlgoTrigRcd > m_watchPhysicsMask
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.