2 #ifdef SiStripMonitorHardware_BuildEventMatchingCode
23 #include "boost/bind.hpp"
24 #include "boost/shared_ptr.hpp"
37 : eventId_(eventId), apvAddress_(apvAddress) {}
40 outputRawData_(outputRawData),
41 outputTotalEventCounters_(sistrip::
FED_ID_MAX+1),
45 SpyEventMatcher::~SpyEventMatcher() {}
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"))),
64 productRegistry_->setFrozen();
67 source_->branchIDListHelper(),
68 *processConfiguration_,
72 std::unique_ptr<SpyEventMatcher::Source> SpyEventMatcher::constructSource(
const edm::ParameterSet& sourceConfig)
84 void SpyEventMatcher::initialize()
89 std::ostringstream ss;
90 ss <<
"Events with possible matches (eventID,apvAddress): ";
91 for (std::map<EventKey,SpyEventList>::const_iterator iSpyEvent = eventMatches_.begin(); iSpyEvent != eventMatches_.end(); ++iSpyEvent) {
92 ss <<
"(" << iSpyEvent->first.eventId() <<
"," << uint16_t(iSpyEvent->first.apvAddress()) <<
") ";
101 CountersPtr totalEventCounters = getCounters(nextSpyEvent,totalEventCountersTag_);
102 CountersPtr l1aCounters = getCounters(nextSpyEvent,l1aCountersTag_);
103 CountersPtr apvAddresses = getCounters(nextSpyEvent,apvAddressesTag_,
false);
106 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
107 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
108 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
110 std::map<EventKey,uint16_t> fedCounts;
111 unsigned int fedid = 0;
113 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
114 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress, ++fedid)
116 if (*iAPVAddress == 0) {
120 if ( ((*iTotalEventCount) > (*iL1ACount) ) ||
121 ((*iL1ACount)-(*iTotalEventCount) > counterDiffMax_)
123 LogWarning(mlLabel_) <<
"Spy event " << spyEventId.
event()
124 <<
" error in counter values for FED " << fedid
125 <<
", totCount = " << *iTotalEventCount
126 <<
", L1Acount = " << *iL1ACount
132 for (uint32_t eventId = (*iTotalEventCount)+1; eventId <= (*iL1ACount)+1; ++eventId) {
133 EventKey
key(eventId,*iAPVAddress);
134 eventMatches_[
key].insert(spyEventId);
140 std::ostringstream ss;
141 ss <<
"Spy event " << spyEventId.
event() <<
" matches (eventID,apvAddress,nFEDs): ";
142 for (std::map<EventKey,uint16_t>::const_iterator iEventFEDCount = fedCounts.begin(); iEventFEDCount != fedCounts.end(); ++iEventFEDCount) {
143 ss <<
"(" << iEventFEDCount->first.eventId() <<
"," << uint16_t(iEventFEDCount->first.apvAddress()) <<
"," << iEventFEDCount->second <<
") ";
148 const SpyEventMatcher::SpyEventList* SpyEventMatcher::matchesForEvent(
const uint32_t eventId,
const uint8_t apvAddress)
const
150 EventKey eventKey(eventId,apvAddress);
151 std::map<EventKey,SpyEventList>::const_iterator iMatch = eventMatches_.find(eventKey);
152 if (iMatch == eventMatches_.end()) {
153 LogDebug(mlLabel_) <<
"No match found for event " << eventId <<
" with APV address " << uint16_t(apvAddress);
157 std::ostringstream ss;
158 ss <<
"Found matches to event " << eventId <<
" with address " << uint16_t(apvAddress) <<
" in spy events ";
159 for (SpyEventList::const_iterator iMatchingSpyEvent = iMatch->second.begin(); iMatchingSpyEvent != iMatch->second.end(); ++iMatchingSpyEvent) {
160 ss << iMatchingSpyEvent->event() <<
" ";
162 LogInfo(mlLabel_) << ss.str();
163 return &(iMatch->second);
169 MatchingOutput& mo) {
173 if (!inputRawDataPtr) {
174 throw cms::Exception(mlLabel_) <<
"Failed to get raw spy data with tag " << rawDataTag_ <<
" from spy event";
177 CountersPtr inputTotalEventCounters = getCounters(event,totalEventCountersTag_);
178 CountersPtr inputL1ACounters = getCounters(event,l1aCountersTag_);
179 CountersPtr inputAPVAddresses = getCounters(event,apvAddressesTag_,
false);
185 if (inputScopeDigis && !mo.outputScopeDigisVector_.get() ) mo.outputScopeDigisVector_.reset(
new std::vector<
edm::DetSet<SiStripRawDigi> >);
186 if (inputPayloadDigis && !mo.outputPayloadDigisVector_.get() ) mo.outputPayloadDigisVector_.reset(
new std::vector<
edm::DetSet<SiStripRawDigi> >);
187 if (inputReorderedDigis && !mo.outputReorderedDigisVector_.get() ) mo.outputReorderedDigisVector_.reset(
new std::vector<
edm::DetSet<SiStripRawDigi> >);
188 if (inputVirginRawDigis && !mo.outputVirginRawDigisVector_.get() ) mo.outputVirginRawDigisVector_.reset(
new std::vector<
edm::DetSet<SiStripRawDigi> >);
190 std::set<uint16_t> matchingFeds;
191 findMatchingFeds(eventId,apvAddress,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,matchingFeds);
192 LogInfo(mlLabel_) <<
"Spy event " <<
event.id() <<
" has " << matchingFeds.size() <<
" matching FEDs";
193 std::ostringstream ss;
194 ss <<
"Matching FEDs for event " <<
event.id() <<
": ";
195 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
196 ss << *iFedId <<
" ";
200 std::vector<uint16_t> duplicateFeds(
std::min(mo.alreadyMergedFeds_.size(),matchingFeds.size()) );
201 std::vector<uint16_t>::iterator duplicatesBegin = duplicateFeds.begin();
202 std::vector<uint16_t>::iterator duplicatesEnd = std::set_intersection(mo.alreadyMergedFeds_.begin(),mo.alreadyMergedFeds_.end(),
203 matchingFeds.begin(),matchingFeds.end(),
205 if ( (duplicatesEnd-duplicatesBegin) != 0 ) {
206 std::ostringstream ss;
207 ss <<
"Found a match for FEDs ";
208 for (std::vector<uint16_t>::const_iterator iDup = duplicatesBegin; iDup != duplicatesEnd; ++iDup) {
211 ss <<
". Output SetSetVectors will be unusable!";
212 LogError(mlLabel_) << ss.str();
215 mergeMatchingData(matchingFeds,inputRawData,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,
216 inputScopeDigis,inputPayloadDigis,inputReorderedDigis,inputVirginRawDigis,
217 mo.outputRawData_,mo.outputTotalEventCounters_,mo.outputL1ACounters_,mo.outputAPVAddresses_,
218 mo.outputScopeDigisVector_.get(),mo.outputPayloadDigisVector_.get(),
219 mo.outputReorderedDigisVector_.get(),mo.outputVirginRawDigisVector_.get(),
221 mo.alreadyMergedFeds_.insert(matchingFeds.begin(),matchingFeds.end());
224 void SpyEventMatcher::getMatchedCollections(
const uint32_t eventId,
const uint8_t apvAddress,
226 SpyDataCollections& collectionsToCreate)
228 if (!matchingEvents)
return;
230 MatchingOutput mo(outputRawData);
231 source_->loopSpecified(*eventPrincipal_,*matchingEvents,boost::bind(&SpyEventMatcher::getCollections,
this,_1,
232 eventId,apvAddress,boost::cref(cabling),boost::ref(mo)));
233 SpyDataCollections collections(mo.outputRawData_,mo.outputTotalEventCounters_,mo.outputL1ACounters_,mo.outputAPVAddresses_,
234 mo.outputScopeDigisVector_.get(),mo.outputPayloadDigisVector_.get(),
235 mo.outputReorderedDigisVector_.get(),mo.outputVirginRawDigisVector_.get());
236 collectionsToCreate = collections;
239 void SpyEventMatcher::findMatchingFeds(
const uint32_t eventId,
const uint8_t apvAddress,
240 SpyEventMatcher::CountersPtr totalEventCounters,
241 SpyEventMatcher::CountersPtr l1aCounters,
242 SpyEventMatcher::CountersPtr apvAddresses,
243 std::set<uint16_t>& matchingFeds)
246 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
247 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
248 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
250 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
251 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress)
253 if (*iAPVAddress == 0) {
256 if ( (eventId > *iTotalEventCount) && (eventId <= (*iL1ACount)+1) && (*iAPVAddress == apvAddress) ) {
257 matchingFeds.insert(matchingFeds.end(),iTotalEventCount-totalEventCounters->begin());
262 void SpyEventMatcher::mergeMatchingData(
const std::set<uint16_t>& matchingFeds,
264 SpyEventMatcher::CountersPtr inputTotalEventCounters,
265 SpyEventMatcher::CountersPtr inputL1ACounters,
266 SpyEventMatcher::CountersPtr inputAPVAddresses,
272 std::vector<uint32_t>& outputTotalEventCounters,
273 std::vector<uint32_t>& outputL1ACounters,
274 std::vector<uint32_t>& outputAPVAddresses,
282 if (inputScopeDigis) {
283 outputScopeDigisVector->reserve(outputScopeDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
285 if (inputPayloadDigis) {
286 outputPayloadDigisVector->reserve(outputPayloadDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
288 if (inputReorderedDigis) {
289 outputReorderedDigisVector->reserve(outputReorderedDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
291 if (inputVirginRawDigis) {
292 outputVirginRawDigisVector->reserve(outputVirginRawDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED/2);
295 std::set<uint32_t> usedDetIds;
296 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
297 const uint32_t fedId = *iFedId;
298 LogDebug(mlLabel_) <<
"Copying data for FED " << fedId;
302 outputTotalEventCounters[fedId] = (*inputTotalEventCounters)[fedId];
303 outputL1ACounters[fedId] = (*inputL1ACounters)[fedId];
304 outputAPVAddresses[fedId] = (*inputAPVAddresses)[fedId];
307 if (inputScopeDigis) {
309 if (iScopeDigis != inputScopeDigis->
end()) {
310 outputScopeDigisVector->push_back(*iScopeDigis);
313 if (inputPayloadDigis) {
315 if (iPayloadDigis != inputPayloadDigis->
end()) {
316 outputPayloadDigisVector->push_back(*iPayloadDigis);
319 if (inputReorderedDigis) {
321 if (iReorderedDigis != inputReorderedDigis->
end()) {
322 outputReorderedDigisVector->push_back(*iReorderedDigis);
326 if (inputVirginRawDigis) {
327 std::set<uint32_t> fedDetIds;
329 for (
auto iConn = conns.begin(); iConn != conns.end(); ++iConn) {
330 if (!iConn->isConnected())
continue;
331 const uint32_t detId = iConn->detId();
332 if (usedDetIds.find(detId) != usedDetIds.end()) {
333 LogError(mlLabel_) <<
"Duplicate DetID found " << detId <<
" skipping data for this Det from FED " << fedId;
336 fedDetIds.insert(iConn->detId());
338 usedDetIds.insert(fedDetIds.begin(),fedDetIds.end());
339 for (std::set<uint32_t>::const_iterator iDetId = fedDetIds.begin(); iDetId != fedDetIds.end(); ++iDetId) {
341 if (iVirginRawDigis != inputVirginRawDigis->
end()) {
342 outputVirginRawDigisVector->push_back(*iVirginRawDigis);
351 const std::vector<uint32_t>* vectorFromEvent = getProduct< std::vector<uint32_t> >(
event,
tag);
352 if (vectorFromEvent) {
354 return CountersPtr(
new CountersWrapper(vectorFromEvent) );
356 const std::map<uint32_t,uint32_t>* mapFromEvent = getProduct< std::map<uint32_t,uint32_t> >(
event,
tag);
358 std::vector<uint32_t>* newVector =
new std::vector<uint32_t>(
FED_ID_MAX+1,0);
359 if (mapKeyIsByFedID) {
360 for (std::map<uint32_t,uint32_t>::const_iterator iIdValue = mapFromEvent->begin(); iIdValue != mapFromEvent->end(); ++iIdValue) {
361 newVector->at(iIdValue->first) = iIdValue->second;
364 SpyUtilities::fillFEDMajorities(*mapFromEvent,*newVector);
373 CountersPtr newCountersPtr(
new CountersWrapper(newVector,
true) );
374 return newCountersPtr;
376 throw cms::Exception(mlLabel_) <<
"Unable to get product " << tag <<
" from spy event";
382 std::vector<uint32_t>& theTotalEventCounters,
383 std::vector<uint32_t>& theL1ACounters,
384 std::vector<uint32_t>& theAPVAddresses,
390 totalEventCounters(new std::vector<uint32_t>),
391 l1aCounters(new std::vector<uint32_t>),
392 apvAddresses(new std::vector<uint32_t>),
393 scopeDigis(theScopeDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theScopeDigisVector) :
NULL),
394 payloadDigis(thePayloadDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*thePayloadDigisVector) :
NULL),
395 reorderedDigis(theReorderedDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theReorderedDigisVector) :
NULL),
396 virginRawDigis(theVirginRawDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theVirginRawDigisVector) :
NULL)
398 rawData->swap(theRawData);
399 totalEventCounters->swap(theTotalEventCounters);
400 l1aCounters->swap(theL1ACounters);
401 apvAddresses->swap(theAPVAddresses);
404 SpyEventMatcher::SpyDataCollections::SpyDataCollections()
406 totalEventCounters(),
415 SpyEventMatcher::SpyDataCollections& SpyEventMatcher::SpyDataCollections::operator = (SpyDataCollections
original)
417 rawData = original.rawData;
418 totalEventCounters = original.totalEventCounters;
419 l1aCounters = original.l1aCounters;
420 apvAddresses = original.apvAddresses;
421 scopeDigis = original.scopeDigis;
422 payloadDigis = original.payloadDigis;
423 virginRawDigis = original.virginRawDigis;
427 SpyEventMatcher::CountersWrapper::CountersWrapper(
const Counters* theCounters)
428 : pConst(theCounters),
434 SpyEventMatcher::CountersWrapper::CountersWrapper(
Counters* theCounters,
const bool takeOwnership)
435 : pConst(theCounters),
437 deleteP(takeOwnership)
442 SpyEventMatcher::CountersWrapper::~CountersWrapper()
444 if (deleteP)
delete p;
449 #endif //SiStripMonitorHardware_BuildEventMatchingCode
EventNumber_t event() const
iterator find(det_id_type id)
EventID const & id() const
static uint32_t fedIndex(const uint16_t &fed_id, const uint16_t &fed_ch)
size_t size() const
Lenght of the data buffer in bytes.
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
const T & max(const T &a, const T &b)
static const char * mlLabel_
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
iterator end()
Return the off-the-end iterator.
std::string getReleaseVersion()
EventKey(const uint32_t eventId, const uint8_t apvAddress)
ConnsConstIterRange fedConnections(uint16_t fed_id) const
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
static const uint16_t FEDCH_PER_FED
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
static const uint16_t FED_ID_MAX
volatile std::atomic< bool > shutdown_flag false
collection_type::const_iterator const_iterator
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
static ParameterSetID emptyParameterSetID()