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),
48 :
rawDataTag_(config.getParameter<edm::InputTag>(
"RawSpyDataTag")),
50 l1aCountersTag_(config.getParameter<edm::InputTag>(
"SpyL1ACountersTag")),
52 scopeDigisTag_(config.getParameter<edm::InputTag>(
"SpyScopeDigisTag")),
56 counterDiffMax_(config.getParameter<uint32_t>(
"CounterDiffMaxAllowed")),
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()) <<
") ";
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) ) ||
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) {
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 <<
") ";
150 EventKey eventKey(eventId,apvAddress);
151 std::map<EventKey,SpyEventList>::const_iterator iMatch =
eventMatches_.find(eventKey);
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() <<
" ";
163 return &(iMatch->second);
173 if (!inputRawDataPtr) {
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 <<
" ";
201 std::vector<uint16_t>::iterator duplicatesBegin = duplicateFeds.begin();
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!";
215 mergeMatchingData(matchingFeds,inputRawData,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,
216 inputScopeDigis,inputPayloadDigis,inputReorderedDigis,inputVirginRawDigis,
228 if (!matchingEvents)
return;
232 eventId,apvAddress,boost::cref(cabling),boost::ref(mo)));
236 collectionsToCreate = collections;
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());
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;
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) {
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;
374 return newCountersPtr;
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)
406 totalEventCounters(),
428 : pConst(theCounters),
435 : pConst(theCounters),
437 deleteP(takeOwnership)
444 if (deleteP)
delete p;
449 #endif //SiStripMonitorHardware_BuildEventMatchingCode
CountersWrapper(const Counters *theCounters)
EventNumber_t event() const
edm::InputTag virginRawDigisTag_
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)
std::auto_ptr< std::vector< uint32_t > > apvAddresses
static const char * mlLabel_
boost::shared_ptr< CountersWrapper > CountersPtr
edm::InputTag rawDataTag_
edm::InputTag payloadDigisTag_
std::unique_ptr< edm::EventPrincipal > eventPrincipal_
std::set< uint16_t > alreadyMergedFeds_
std::vector< uint32_t > outputL1ACounters_
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)
FEDRawDataCollection & outputRawData_
std::unique_ptr< edm::ProcessConfiguration > processConfiguration_
void getMatchedCollections(const uint32_t eventId, const uint8_t apvAddress, const SpyEventList *matchingEvents, const SiStripFedCabling &cabling, SpyDataCollections &collectionsToCreate)
edm::InputTag apvAddressesTag_
edm::InputTag scopeDigisTag_
std::auto_ptr< std::vector< uint32_t > > l1aCounters
std::auto_ptr< std::vector< uint32_t > > totalEventCounters
SpyDataCollections & operator=(SpyDataCollections original)
static uint32_t fedIndex(const uint16_t &fed_id, const uint16_t &fed_ch)
boost::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputReorderedDigisVector_
size_t size() const
Lenght of the data buffer in bytes.
std::vector< uint32_t > outputAPVAddresses_
boost::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputScopeDigisVector_
edm::InputTag l1aCountersTag_
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
virtual ~SpyEventMatcher()
std::auto_ptr< edm::DetSetVector< SiStripRawDigi > > payloadDigis
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.
edm::InputTag totalEventCountersTag_
const SpyEventList * matchesForEvent(const uint32_t eventId, const uint8_t apvAddress) const
std::string getReleaseVersion()
EventKey(const uint32_t eventId, const uint8_t apvAddress)
std::auto_ptr< edm::DetSetVector< SiStripRawDigi > > scopeDigis
std::auto_ptr< FEDRawDataCollection > rawData
std::vector< uint32_t > outputTotalEventCounters_
edm::InputTag reorderedDigisTag_
ConnsConstIterRange fedConnections(uint16_t fed_id) const
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
boost::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputVirginRawDigisVector_
std::auto_ptr< edm::DetSetVector< SiStripRawDigi > > virginRawDigis
void addNextEventToMap(const edm::EventPrincipal &nextSpyEvent)
static const uint16_t FEDCH_PER_FED
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
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)
std::unique_ptr< edm::ProductRegistry > productRegistry_
SpyEventMatcher(const edm::ParameterSet &config)
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()
std::map< EventKey, SpyEventList > eventMatches_