CMS 3D CMS Logo

SiStripSpyEventMatcher.cc
Go to the documentation of this file.
2 #ifdef SiStripMonitorHardware_BuildEventMatchingCode
3 
24 #include <algorithm>
25 #include <limits>
26 #include <memory>
27 
28 using edm::LogInfo;
29 using edm::LogWarning;
30 using edm::LogError;
31 
32 namespace sistrip {
33 
34  const char* SpyEventMatcher::mlLabel_ = "SpyEventMatcher";
35 
36  SpyEventMatcher::EventKey::EventKey(const uint32_t eventId, const uint8_t apvAddress)
37  : eventId_(eventId), apvAddress_(apvAddress) {}
38 
40  outputRawData_(outputRawData),
41  outputTotalEventCounters_(sistrip::FED_ID_MAX+1),
42  outputL1ACounters_(sistrip::FED_ID_MAX+1),
43  outputAPVAddresses_(sistrip::FED_ID_MAX+1) {}
44 
46 
48  : rawDataTag_(config.getParameter<edm::InputTag>("RawSpyDataTag")),
49  totalEventCountersTag_(config.getParameter<edm::InputTag>("SpyTotalEventCountersTag")),
50  l1aCountersTag_(config.getParameter<edm::InputTag>("SpyL1ACountersTag")),
51  apvAddressesTag_(config.getParameter<edm::InputTag>("SpyAPVAddressesTag")),
52  scopeDigisTag_(config.getParameter<edm::InputTag>("SpyScopeDigisTag")),
53  payloadDigisTag_(config.getParameter<edm::InputTag>("SpyPayloadDigisTag")),
54  reorderedDigisTag_(config.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
55  virginRawDigisTag_(config.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
56  counterDiffMax_(config.getParameter<uint32_t>("CounterDiffMaxAllowed")),
58  source_(constructSource(config.getParameter<edm::ParameterSet>("SpySource"))),
59  processConfiguration_(new edm::ProcessConfiguration(std::string("@MIXING"), edm::getReleaseVersion(), edm::getPassID())),
61  {
62  // Use the empty parameter set for the parameter set ID of our "@MIXING" process.
64  productRegistry_->setFrozen();
65 
66  eventPrincipal_.reset(new edm::EventPrincipal(source_->productRegistry(),
67  std::make_shared<edm::BranchIDListHelper>(),
68  std::make_shared<edm::ThinnedAssociationsHelper>(),
70  nullptr));
71  }
72 
73  std::unique_ptr<SpyEventMatcher::Source> SpyEventMatcher::constructSource(const edm::ParameterSet& sourceConfig)
74  {
77  return sourceFactory->makeVectorInputSource(sourceConfig, description);
78  }
79 
81  {
82  size_t fileNameHash = 0U;
83  //add spy events to the map until there are none left
84  source_->loopOverEvents(*eventPrincipal_,fileNameHash,std::numeric_limits<size_t>::max(),
85  [this](auto const& iE, auto const&){ this->addNextEventToMap(iE); return true; },
86  nullptr,nullptr,false);
87  //debug
88  std::ostringstream ss;
89  ss << "Events with possible matches (eventID,apvAddress): ";
90  for (std::map<EventKey,SpyEventList>::const_iterator iSpyEvent = eventMatches_.begin(); iSpyEvent != eventMatches_.end(); ++iSpyEvent) {
91  ss << "(" << iSpyEvent->first.eventId() << "," << uint16_t(iSpyEvent->first.apvAddress()) << ") ";
92  }
93  LogDebug(mlLabel_) << ss.str();
94  }
95 
97  {
98  edm::EventID spyEventId = nextSpyEvent.id();
99 
100  CountersPtr totalEventCounters = getCounters(nextSpyEvent,totalEventCountersTag_);
101  CountersPtr l1aCounters = getCounters(nextSpyEvent,l1aCountersTag_);
102  CountersPtr apvAddresses = getCounters(nextSpyEvent,apvAddressesTag_,false);
103  //loop over all FEDs. Maps should have same content and be in order so, avoid searches by iterating (and checking keys match)
104  //add all possible event keys to the map
105  std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
106  std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
107  std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
108  //for debug
109  std::map<EventKey,uint16_t> fedCounts;
110  unsigned int fedid = 0;
111  for (;
112  ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
113  (++iTotalEventCount, ++iL1ACount, ++iAPVAddress, ++fedid)
114  ){
115  if (*iAPVAddress == 0) {
116  continue;
117  }
118 
119  if ( ((*iTotalEventCount) > (*iL1ACount) ) ||
120  ((*iL1ACount)-(*iTotalEventCount) > counterDiffMax_)
121  ) {
122  LogWarning(mlLabel_) << "Spy event " << spyEventId.event()
123  << " error in counter values for FED " << fedid
124  << ", totCount = " << *iTotalEventCount
125  << ", L1Acount = " << *iL1ACount
126  << std::endl;
127 
128  continue;
129  }
130 
131  for (uint32_t eventId = (*iTotalEventCount)+1; eventId <= (*iL1ACount)+1; ++eventId) {
132  EventKey key(eventId,*iAPVAddress);
133  eventMatches_[key].insert(spyEventId);
134  fedCounts[key]++;
135  }
136  }
137 
138  //for debug
139  std::ostringstream ss;
140  ss << "Spy event " << spyEventId.event() << " matches (eventID,apvAddress,nFEDs): ";
141  for (std::map<EventKey,uint16_t>::const_iterator iEventFEDCount = fedCounts.begin(); iEventFEDCount != fedCounts.end(); ++iEventFEDCount) {
142  ss << "(" << iEventFEDCount->first.eventId() << "," << uint16_t(iEventFEDCount->first.apvAddress()) << "," << iEventFEDCount->second << ") ";
143  }
144  LogDebug(mlLabel_) << ss.str();
145  }
146 
147  const SpyEventMatcher::SpyEventList* SpyEventMatcher::matchesForEvent(const uint32_t eventId, const uint8_t apvAddress) const
148  {
149  EventKey eventKey(eventId,apvAddress);
150  std::map<EventKey,SpyEventList>::const_iterator iMatch = eventMatches_.find(eventKey);
151  if (iMatch == eventMatches_.end()) {
152  LogDebug(mlLabel_) << "No match found for event " << eventId << " with APV address " << uint16_t(apvAddress);
153  return nullptr;
154  }
155  else {
156  std::ostringstream ss;
157  ss << "Found matches to event " << eventId << " with address " << uint16_t(apvAddress) << " in spy events ";
158  for (SpyEventList::const_iterator iMatchingSpyEvent = iMatch->second.begin(); iMatchingSpyEvent != iMatch->second.end(); ++iMatchingSpyEvent) {
159  ss << iMatchingSpyEvent->event() << " ";
160  }
161  LogInfo(mlLabel_) << ss.str();
162  return &(iMatch->second);
163  }
164  }
165 
166  void SpyEventMatcher::getCollections(const edm::EventPrincipal& event, const uint32_t eventId,
167  const uint8_t apvAddress, const SiStripFedCabling& cabling,
168  MatchingOutput& mo) {
169 
170  //read the input collections from the event
171  const FEDRawDataCollection* inputRawDataPtr = getProduct< FEDRawDataCollection >(event,rawDataTag_);
172  if (!inputRawDataPtr) {
173  throw cms::Exception(mlLabel_) << "Failed to get raw spy data with tag " << rawDataTag_ << " from spy event";
174  }
175  const FEDRawDataCollection& inputRawData = *inputRawDataPtr;
176  CountersPtr inputTotalEventCounters = getCounters(event,totalEventCountersTag_);
177  CountersPtr inputL1ACounters = getCounters(event,l1aCountersTag_);
178  CountersPtr inputAPVAddresses = getCounters(event,apvAddressesTag_,false);
179  const edm::DetSetVector<SiStripRawDigi>* inputScopeDigis = getProduct< edm::DetSetVector<SiStripRawDigi> >(event,scopeDigisTag_);
180  const edm::DetSetVector<SiStripRawDigi>* inputPayloadDigis = getProduct< edm::DetSetVector<SiStripRawDigi> >(event,payloadDigisTag_);
181  const edm::DetSetVector<SiStripRawDigi>* inputReorderedDigis = getProduct< edm::DetSetVector<SiStripRawDigi> >(event,reorderedDigisTag_);
182  const edm::DetSetVector<SiStripRawDigi>* inputVirginRawDigis = getProduct< edm::DetSetVector<SiStripRawDigi> >(event,virginRawDigisTag_);
183  //construct the output vectors if the digis were found and they do not exist
184  if (inputScopeDigis && !mo.outputScopeDigisVector_.get() ) mo.outputScopeDigisVector_.reset(new std::vector< edm::DetSet<SiStripRawDigi> >);
185  if (inputPayloadDigis && !mo.outputPayloadDigisVector_.get() ) mo.outputPayloadDigisVector_.reset(new std::vector< edm::DetSet<SiStripRawDigi> >);
186  if (inputReorderedDigis && !mo.outputReorderedDigisVector_.get() ) mo.outputReorderedDigisVector_.reset(new std::vector< edm::DetSet<SiStripRawDigi> >);
187  if (inputVirginRawDigis && !mo.outputVirginRawDigisVector_.get() ) mo.outputVirginRawDigisVector_.reset(new std::vector< edm::DetSet<SiStripRawDigi> >);
188  //find matching FEDs
189  std::set<uint16_t> matchingFeds;
190  findMatchingFeds(eventId,apvAddress,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,matchingFeds);
191  LogInfo(mlLabel_) << "Spy event " << event.id() << " has " << matchingFeds.size() << " matching FEDs";
192  std::ostringstream ss;
193  ss << "Matching FEDs for event " << event.id() << ": ";
194  for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
195  ss << *iFedId << " ";
196  }
197  LogDebug(mlLabel_) << ss.str();
198  //check there are no duplicates
199  std::vector<uint16_t> duplicateFeds( std::min(mo.alreadyMergedFeds_.size(),matchingFeds.size()) );
200  std::vector<uint16_t>::iterator duplicatesBegin = duplicateFeds.begin();
201  std::vector<uint16_t>::iterator duplicatesEnd = std::set_intersection(mo.alreadyMergedFeds_.begin(),mo.alreadyMergedFeds_.end(),
202  matchingFeds.begin(),matchingFeds.end(),
203  duplicatesBegin);
204  if ( (duplicatesEnd-duplicatesBegin) != 0 ) {
205  std::ostringstream ss;
206  ss << "Found a match for FEDs ";
207  for (std::vector<uint16_t>::const_iterator iDup = duplicatesBegin; iDup != duplicatesEnd; ++iDup) {
208  ss << *iDup << " ";
209  }
210  ss << ". Output SetSetVectors will be unusable!";
211  LogError(mlLabel_) << ss.str();
212  }
213  //merge the matching data
214  mergeMatchingData(matchingFeds,inputRawData,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,
215  inputScopeDigis,inputPayloadDigis,inputReorderedDigis,inputVirginRawDigis,
219  cabling);
220  mo.alreadyMergedFeds_.insert(matchingFeds.begin(),matchingFeds.end());
221  }
222 
223  void SpyEventMatcher::getMatchedCollections(const uint32_t eventId, const uint8_t apvAddress,
224  const SpyEventList* matchingEvents, const SiStripFedCabling& cabling,
225  SpyDataCollections& collectionsToCreate)
226  {
227  if (!matchingEvents) return;
228  size_t fileNameHash = 0U;
229  FEDRawDataCollection outputRawData;
230  MatchingOutput mo(outputRawData);
231  source_->loopSpecified(*eventPrincipal_,fileNameHash,matchingEvents->begin(),matchingEvents->end(),
232  [&](auto const& iE, auto const&){ this->getCollections(iE,eventId,apvAddress,cabling,mo); });
236  }
237 
238  void SpyEventMatcher::findMatchingFeds(const uint32_t eventId, const uint8_t apvAddress,
239  SpyEventMatcher::CountersPtr totalEventCounters,
240  SpyEventMatcher::CountersPtr l1aCounters,
241  SpyEventMatcher::CountersPtr apvAddresses,
242  std::set<uint16_t>& matchingFeds)
243  {
244  //loop over all FEDs. Maps should have same content and be in order so, avoid searches by iterating (and checking keys match)
245  std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
246  std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
247  std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
248  for (;
249  ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
250  (++iTotalEventCount, ++iL1ACount, ++iAPVAddress)
251  ){
252  if (*iAPVAddress == 0) {
253  continue;
254  }
255  if ( (eventId > *iTotalEventCount) && (eventId <= (*iL1ACount)+1) && (*iAPVAddress == apvAddress) ) {
256  matchingFeds.insert(matchingFeds.end(),iTotalEventCount-totalEventCounters->begin());
257  }
258  }
259  }
260 
261  void SpyEventMatcher::mergeMatchingData(const std::set<uint16_t>& matchingFeds,
262  const FEDRawDataCollection& inputRawData,
263  SpyEventMatcher::CountersPtr inputTotalEventCounters,
264  SpyEventMatcher::CountersPtr inputL1ACounters,
265  SpyEventMatcher::CountersPtr inputAPVAddresses,
266  const edm::DetSetVector<SiStripRawDigi>* inputScopeDigis,
267  const edm::DetSetVector<SiStripRawDigi>* inputPayloadDigis,
268  const edm::DetSetVector<SiStripRawDigi>* inputReorderedDigis,
269  const edm::DetSetVector<SiStripRawDigi>* inputVirginRawDigis,
270  FEDRawDataCollection& outputRawData,
271  std::vector<uint32_t>& outputTotalEventCounters,
272  std::vector<uint32_t>& outputL1ACounters,
273  std::vector<uint32_t>& outputAPVAddresses,
274  std::vector< edm::DetSet<SiStripRawDigi> >* outputScopeDigisVector,
275  std::vector< edm::DetSet<SiStripRawDigi> >* outputPayloadDigisVector,
276  std::vector< edm::DetSet<SiStripRawDigi> >* outputReorderedDigisVector,
277  std::vector< edm::DetSet<SiStripRawDigi> >* outputVirginRawDigisVector,
278  const SiStripFedCabling& cabling)
279  {
280  //reserve space in vectors
281  if (inputScopeDigis) {
282  outputScopeDigisVector->reserve(outputScopeDigisVector->size()+matchingFeds.size()*FEDCH_PER_FED); //maximum number of channels on matching FEDs
283  }
284  if (inputPayloadDigis) {
285  outputPayloadDigisVector->reserve(outputPayloadDigisVector->size()+matchingFeds.size()*FEDCH_PER_FED);
286  }
287  if (inputReorderedDigis) {
288  outputReorderedDigisVector->reserve(outputReorderedDigisVector->size()+matchingFeds.size()*FEDCH_PER_FED);
289  }
290  if (inputVirginRawDigis) {
291  outputVirginRawDigisVector->reserve(outputVirginRawDigisVector->size()+matchingFeds.size()*FEDCH_PER_FED/2); //maximum number of dets on matching FEDs
292  }
293  //copy the data into output collections
294  std::set<uint32_t> usedDetIds;
295  for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
296  const uint32_t fedId = *iFedId;
297  LogDebug(mlLabel_) << "Copying data for FED " << fedId;
298  if (inputRawData.FEDData(fedId).size() && inputRawData.FEDData(fedId).data()) {
299  outputRawData.FEDData(fedId) = inputRawData.FEDData(fedId);
300  }
301  outputTotalEventCounters[fedId] = (*inputTotalEventCounters)[fedId];
302  outputL1ACounters[fedId] = (*inputL1ACounters)[fedId];
303  outputAPVAddresses[fedId] = (*inputAPVAddresses)[fedId];
304  for (uint8_t chan = 0; chan < FEDCH_PER_FED; ++chan) {
305  uint32_t fedIndex = ( ( fedId & sistrip::invalid_ ) << 16 ) | ( chan & sistrip::invalid_ ) ;;
306  if (inputScopeDigis) {
307  edm::DetSetVector<SiStripRawDigi>::const_iterator iScopeDigis = inputScopeDigis->find(fedIndex);
308  if (iScopeDigis != inputScopeDigis->end()) {
309  outputScopeDigisVector->push_back(*iScopeDigis);
310  }
311  }
312  if (inputPayloadDigis) {
313  edm::DetSetVector<SiStripRawDigi>::const_iterator iPayloadDigis = inputPayloadDigis->find(fedIndex);
314  if (iPayloadDigis != inputPayloadDigis->end()) {
315  outputPayloadDigisVector->push_back(*iPayloadDigis);
316  }
317  }
318  if (inputReorderedDigis) {
319  edm::DetSetVector<SiStripRawDigi>::const_iterator iReorderedDigis = inputReorderedDigis->find(fedIndex);
320  if (iReorderedDigis != inputReorderedDigis->end()) {
321  outputReorderedDigisVector->push_back(*iReorderedDigis);
322  }
323  }
324  }
325  if (inputVirginRawDigis) {
326  std::set<uint32_t> fedDetIds;
327  auto conns = cabling.fedConnections(fedId);
328  for (auto iConn = conns.begin(); iConn != conns.end(); ++iConn) {
329  if (!iConn->isConnected()) continue;
330  const uint32_t detId = iConn->detId();
331  if (usedDetIds.find(detId) != usedDetIds.end()) {
332  LogError(mlLabel_) << "Duplicate DetID found " << detId << " skipping data for this Det from FED " << fedId;
333  continue;
334  }
335  fedDetIds.insert(iConn->detId());
336  }
337  usedDetIds.insert(fedDetIds.begin(),fedDetIds.end());
338  for (std::set<uint32_t>::const_iterator iDetId = fedDetIds.begin(); iDetId != fedDetIds.end(); ++iDetId) {
339  edm::DetSetVector<SiStripRawDigi>::const_iterator iVirginRawDigis = inputVirginRawDigis->find(*iDetId);
340  if (iVirginRawDigis != inputVirginRawDigis->end()) {
341  outputVirginRawDigisVector->push_back(*iVirginRawDigis);
342  }
343  }
344  }
345  }
346  }
347 
349  {
350  const std::vector<uint32_t>* vectorFromEvent = getProduct< std::vector<uint32_t> >(event,tag);
351  if (vectorFromEvent) {
352  //vector is from event so, will be deleted when the event is destroyed (and not before)
353  return CountersPtr(new CountersWrapper(vectorFromEvent) );
354  } else {
355  const std::map<uint32_t,uint32_t>* mapFromEvent = getProduct< std::map<uint32_t,uint32_t> >(event,tag);
356  if (mapFromEvent) {
357  std::vector<uint32_t>* newVector = new std::vector<uint32_t>(FED_ID_MAX+1,0);
358  if (mapKeyIsByFedID) {
359  for (std::map<uint32_t,uint32_t>::const_iterator iIdValue = mapFromEvent->begin(); iIdValue != mapFromEvent->end(); ++iIdValue) {
360  newVector->at(iIdValue->first) = iIdValue->second;
361  }
362  } else {
363  SpyUtilities::fillFEDMajorities(*mapFromEvent,*newVector);
364  }
365 // std::cout << " -- Map " << tag << std::endl;
366 // for (uint32_t lIt= 0;
367 // lIt < newVector->size();
368 // lIt++) {
369 // std::cout << lIt << " " << newVector->at(lIt) << std::endl;
370 // }
371  //vector was allocated here so, will need to be deleted when finished with
372  CountersPtr newCountersPtr( new CountersWrapper(newVector,true) );
373  return newCountersPtr;
374  } else {
375  throw cms::Exception(mlLabel_) << "Unable to get product " << tag << " from spy event";
376  }
377  }
378  }
379 
381  std::vector<uint32_t>& theTotalEventCounters,
382  std::vector<uint32_t>& theL1ACounters,
383  std::vector<uint32_t>& theAPVAddresses,
384  std::vector< edm::DetSet<SiStripRawDigi> >* theScopeDigisVector,
385  std::vector< edm::DetSet<SiStripRawDigi> >* thePayloadDigisVector,
386  std::vector< edm::DetSet<SiStripRawDigi> >* theReorderedDigisVector,
387  std::vector< edm::DetSet<SiStripRawDigi> >* theVirginRawDigisVector)
388  : rawData(new FEDRawDataCollection),
389  totalEventCounters(new std::vector<uint32_t>),
390  l1aCounters(new std::vector<uint32_t>),
391  apvAddresses(new std::vector<uint32_t>),
392  scopeDigis(theScopeDigisVector ? new edm::DetSetVector<SiStripRawDigi>(*theScopeDigisVector) : nullptr),
393  payloadDigis(thePayloadDigisVector ? new edm::DetSetVector<SiStripRawDigi>(*thePayloadDigisVector) : nullptr),
394  reorderedDigis(theReorderedDigisVector ? new edm::DetSetVector<SiStripRawDigi>(*theReorderedDigisVector) : nullptr),
395  virginRawDigis(theVirginRawDigisVector ? new edm::DetSetVector<SiStripRawDigi>(*theVirginRawDigisVector) : nullptr)
396  {
397  rawData->swap(theRawData);
398  totalEventCounters->swap(theTotalEventCounters);
399  l1aCounters->swap(theL1ACounters);
400  apvAddresses->swap(theAPVAddresses);
401  }
402 
404  : rawData(),
406  l1aCounters(),
407  apvAddresses(),
408  scopeDigis(),
409  payloadDigis(),
410  reorderedDigis(),
412  {}
413 
415  : pConst(theCounters),
416  p(nullptr),
417  deleteP(false)
418  {
419  }
420 
421  SpyEventMatcher::CountersWrapper::CountersWrapper(Counters* theCounters, const bool takeOwnership)
422  : pConst(theCounters),
423  p(theCounters),
424  deleteP(takeOwnership)
425  {
426 
427  }
428 
430  {
431  if (deleteP) delete p;
432  }
433 
434 }
435 
436 #endif //SiStripMonitorHardware_BuildEventMatchingCode
#define LogDebug(id)
EventNumber_t event() const
Definition: EventID.h:41
std::string getPassID()
Definition: GetPassID.h:7
static void findMatchingFeds(const uint32_t eventId, const uint8_t apvAddress, CountersPtr totalEventCounters, CountersPtr l1aCounters, CountersPtr apvAddresses, std::set< uint16_t > &matchingFeds)
iterator find(det_id_type id)
Definition: DetSetVector.h:290
std::vector< uint32_t > Counters
std::unique_ptr< std::vector< uint32_t > > l1aCounters
boost::shared_ptr< CountersWrapper > CountersPtr
std::unique_ptr< std::vector< uint32_t > > totalEventCounters
std::unique_ptr< edm::EventPrincipal > eventPrincipal_
#define nullptr
void getCollections(const edm::EventPrincipal &event, const uint32_t eventId, const uint8_t apvAddress, const SiStripFedCabling &cabling, MatchingOutput &matchingOutput)
EventID const & id() const
static CountersPtr getCounters(const edm::EventPrincipal &event, const edm::InputTag &tag, const bool mapKeyIsByFedID=true)
std::unique_ptr< edm::ProcessConfiguration > processConfiguration_
void getMatchedCollections(const uint32_t eventId, const uint8_t apvAddress, const SpyEventList *matchingEvents, const SiStripFedCabling &cabling, SpyDataCollections &collectionsToCreate)
Definition: config.py:1
boost::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputReorderedDigisVector_
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
sistrip classes
std::unique_ptr< edm::DetSetVector< SiStripRawDigi > > virginRawDigis
boost::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputScopeDigisVector_
static void fillFEDMajorities(const std::map< uint32_t, uint32_t > &channelValues, std::vector< uint32_t > &fedMajoritiesToFill)
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
std::unique_ptr< Source > constructSource(const edm::ParameterSet &sourceConfig)
boost::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputPayloadDigisVector_
std::set< EventID > SpyEventList
std::shared_ptr< edm::ProductRegistry > productRegistry_
std::unique_ptr< VectorInputSource > makeVectorInputSource(ParameterSet const &, VectorInputSourceDescription const &) const
T min(T a, T b)
Definition: MathUtil.h:58
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
MatchingOutput(FEDRawDataCollection &outputRawData)
std::unique_ptr< edm::VectorInputSource > const source_
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:361
const SpyEventList * matchesForEvent(const uint32_t eventId, const uint8_t apvAddress) const
std::string getReleaseVersion()
std::unique_ptr< FEDRawDataCollection > rawData
EventKey(const uint32_t eventId, const uint8_t apvAddress)
std::unique_ptr< edm::DetSetVector< SiStripRawDigi > > scopeDigis
static const uint16_t invalid_
Definition: Constants.h:16
ConnsConstIterRange fedConnections(uint16_t fed_id) const
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi...
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
boost::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputVirginRawDigisVector_
void addNextEventToMap(const edm::EventPrincipal &nextSpyEvent)
HLT enums.
static const uint16_t FEDCH_PER_FED
std::unique_ptr< std::vector< uint32_t > > apvAddresses
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
static void mergeMatchingData(const std::set< uint16_t > &matchingFeds, const FEDRawDataCollection &inputRawData, CountersPtr inputTotalEventCounters, CountersPtr inputL1ACounters, CountersPtr inputAPVAddresses, const edm::DetSetVector< SiStripRawDigi > *inputScopeDigis, const edm::DetSetVector< SiStripRawDigi > *inputPayloadDigis, const edm::DetSetVector< SiStripRawDigi > *inputReorderedDigis, const edm::DetSetVector< SiStripRawDigi > *inputVirginRawDigis, FEDRawDataCollection &outputRawData, std::vector< uint32_t > &outputTotalEventCounters, std::vector< uint32_t > &outputL1ACounters, std::vector< uint32_t > &outputAPVAddresses, std::vector< edm::DetSet< SiStripRawDigi > > *outputScopeDigisVector, std::vector< edm::DetSet< SiStripRawDigi > > *outputPayloadDigisVector, std::vector< edm::DetSet< SiStripRawDigi > > *outputReorderedDigisVector, std::vector< edm::DetSet< SiStripRawDigi > > *outputVirginRawDigisVector, const SiStripFedCabling &cabling)
SpyEventMatcher(const edm::ParameterSet &config)
static const uint16_t FED_ID_MAX
std::unique_ptr< edm::DetSetVector< SiStripRawDigi > > reorderedDigis
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:104
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
static VectorInputSourceFactory const * get()
static ParameterSetID emptyParameterSetID()
Definition: ParameterSet.cc:87
std::unique_ptr< edm::DetSetVector< SiStripRawDigi > > payloadDigis
std::map< EventKey, SpyEventList > eventMatches_
Definition: event.py:1