2 #ifdef SiStripMonitorHardware_BuildEventMatchingCode
24 #include "boost/bind.hpp"
38 : eventId_(eventId), apvAddress_(apvAddress) {}
41 outputRawData_(outputRawData),
42 outputTotalEventCounters_(sistrip::
FED_ID_MAX+1),
57 counterDiffMax_(config.getParameter<uint32_t>(
"CounterDiffMaxAllowed")),
69 source_->thinnedAssociationsHelper(),
79 std::make_shared<edm::BranchIDListHelper>(),
80 std::make_shared<edm::ThinnedAssociationsHelper>(),
81 std::make_shared<edm::ActivityRegistry>(),
89 size_t fileNameHash = 0U;
93 std::ostringstream
ss;
94 ss <<
"Events with possible matches (eventID,apvAddress): ";
95 for (std::map<EventKey,SpyEventList>::const_iterator iSpyEvent =
eventMatches_.begin(); iSpyEvent !=
eventMatches_.end(); ++iSpyEvent) {
96 ss <<
"(" << iSpyEvent->first.eventId() <<
"," << uint16_t(iSpyEvent->first.apvAddress()) <<
") ";
110 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
111 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
112 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
114 std::map<EventKey,uint16_t> fedCounts;
115 unsigned int fedid = 0;
117 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
118 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress, ++fedid)
120 if (*iAPVAddress == 0) {
124 if ( ((*iTotalEventCount) > (*iL1ACount) ) ||
128 <<
" error in counter values for FED " << fedid
129 <<
", totCount = " << *iTotalEventCount
130 <<
", L1Acount = " << *iL1ACount
136 for (uint32_t eventId = (*iTotalEventCount)+1; eventId <= (*iL1ACount)+1; ++eventId) {
144 std::ostringstream
ss;
145 ss <<
"Spy event " << spyEventId.
event() <<
" matches (eventID,apvAddress,nFEDs): ";
146 for (std::map<EventKey,uint16_t>::const_iterator iEventFEDCount = fedCounts.begin(); iEventFEDCount != fedCounts.end(); ++iEventFEDCount) {
147 ss <<
"(" << iEventFEDCount->first.eventId() <<
"," << uint16_t(iEventFEDCount->first.apvAddress()) <<
"," << iEventFEDCount->second <<
") ";
154 EventKey eventKey(eventId,apvAddress);
155 std::map<EventKey,SpyEventList>::const_iterator iMatch =
eventMatches_.find(eventKey);
157 LogDebug(
mlLabel_) <<
"No match found for event " << eventId <<
" with APV address " << uint16_t(apvAddress);
161 std::ostringstream
ss;
162 ss <<
"Found matches to event " << eventId <<
" with address " << uint16_t(apvAddress) <<
" in spy events ";
163 for (SpyEventList::const_iterator iMatchingSpyEvent = iMatch->second.begin(); iMatchingSpyEvent != iMatch->second.end(); ++iMatchingSpyEvent) {
164 ss << iMatchingSpyEvent->event() <<
" ";
167 return &(iMatch->second);
177 if (!inputRawDataPtr) {
194 std::set<uint16_t> matchingFeds;
195 findMatchingFeds(eventId,apvAddress,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,matchingFeds);
196 LogInfo(
mlLabel_) <<
"Spy event " <<
event.id() <<
" has " << matchingFeds.size() <<
" matching FEDs";
197 std::ostringstream
ss;
198 ss <<
"Matching FEDs for event " <<
event.id() <<
": ";
199 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
200 ss << *iFedId <<
" ";
205 std::vector<uint16_t>::iterator duplicatesBegin = duplicateFeds.begin();
207 matchingFeds.begin(),matchingFeds.end(),
209 if ( (duplicatesEnd-duplicatesBegin) != 0 ) {
210 std::ostringstream
ss;
211 ss <<
"Found a match for FEDs ";
212 for (std::vector<uint16_t>::const_iterator iDup = duplicatesBegin; iDup != duplicatesEnd; ++iDup) {
215 ss <<
". Output SetSetVectors will be unusable!";
219 mergeMatchingData(matchingFeds,inputRawData,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,
220 inputScopeDigis,inputPayloadDigis,inputReorderedDigis,inputVirginRawDigis,
232 if (!matchingEvents)
return;
233 size_t fileNameHash = 0U;
237 eventId,apvAddress,boost::cref(cabling),boost::ref(mo)));
241 collectionsToCreate = collections;
248 std::set<uint16_t>& matchingFeds)
251 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
252 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
253 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
255 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
256 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress)
258 if (*iAPVAddress == 0) {
261 if ( (eventId > *iTotalEventCount) && (eventId <= (*iL1ACount)+1) && (*iAPVAddress == apvAddress) ) {
262 matchingFeds.insert(matchingFeds.end(),iTotalEventCount-totalEventCounters->begin());
277 std::vector<uint32_t>& outputTotalEventCounters,
278 std::vector<uint32_t>& outputL1ACounters,
279 std::vector<uint32_t>& outputAPVAddresses,
287 if (inputScopeDigis) {
288 outputScopeDigisVector->reserve(outputScopeDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
290 if (inputPayloadDigis) {
291 outputPayloadDigisVector->reserve(outputPayloadDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
293 if (inputReorderedDigis) {
294 outputReorderedDigisVector->reserve(outputReorderedDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
296 if (inputVirginRawDigis) {
297 outputVirginRawDigisVector->reserve(outputVirginRawDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED/2);
300 std::set<uint32_t> usedDetIds;
301 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
302 const uint32_t
fedId = *iFedId;
307 outputTotalEventCounters[
fedId] = (*inputTotalEventCounters)[
fedId];
308 outputL1ACounters[
fedId] = (*inputL1ACounters)[
fedId];
309 outputAPVAddresses[
fedId] = (*inputAPVAddresses)[
fedId];
312 if (inputScopeDigis) {
314 if (iScopeDigis != inputScopeDigis->
end()) {
315 outputScopeDigisVector->push_back(*iScopeDigis);
318 if (inputPayloadDigis) {
320 if (iPayloadDigis != inputPayloadDigis->
end()) {
321 outputPayloadDigisVector->push_back(*iPayloadDigis);
324 if (inputReorderedDigis) {
326 if (iReorderedDigis != inputReorderedDigis->
end()) {
327 outputReorderedDigisVector->push_back(*iReorderedDigis);
331 if (inputVirginRawDigis) {
332 std::set<uint32_t> fedDetIds;
334 for (
auto iConn = conns.begin(); iConn != conns.end(); ++iConn) {
335 if (!iConn->isConnected())
continue;
336 const uint32_t detId = iConn->detId();
337 if (usedDetIds.find(detId) != usedDetIds.end()) {
338 LogError(
mlLabel_) <<
"Duplicate DetID found " << detId <<
" skipping data for this Det from FED " <<
fedId;
341 fedDetIds.insert(iConn->detId());
343 usedDetIds.insert(fedDetIds.begin(),fedDetIds.end());
344 for (std::set<uint32_t>::const_iterator iDetId = fedDetIds.begin(); iDetId != fedDetIds.end(); ++iDetId) {
346 if (iVirginRawDigis != inputVirginRawDigis->
end()) {
347 outputVirginRawDigisVector->push_back(*iVirginRawDigis);
356 const std::vector<uint32_t>* vectorFromEvent = getProduct< std::vector<uint32_t> >(
event,
tag);
357 if (vectorFromEvent) {
361 const std::map<uint32_t,uint32_t>* mapFromEvent = getProduct< std::map<uint32_t,uint32_t> >(
event,
tag);
363 std::vector<uint32_t>* newVector =
new std::vector<uint32_t>(
FED_ID_MAX+1,0);
364 if (mapKeyIsByFedID) {
365 for (std::map<uint32_t,uint32_t>::const_iterator iIdValue = mapFromEvent->begin(); iIdValue != mapFromEvent->end(); ++iIdValue) {
366 newVector->at(iIdValue->first) = iIdValue->second;
379 return newCountersPtr;
387 std::vector<uint32_t>& theTotalEventCounters,
388 std::vector<uint32_t>& theL1ACounters,
389 std::vector<uint32_t>& theAPVAddresses,
395 totalEventCounters(new std::vector<uint32_t>),
396 l1aCounters(new std::vector<uint32_t>),
397 apvAddresses(new std::vector<uint32_t>),
398 scopeDigis(theScopeDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theScopeDigisVector) :
NULL),
399 payloadDigis(thePayloadDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*thePayloadDigisVector) :
NULL),
400 reorderedDigis(theReorderedDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theReorderedDigisVector) :
NULL),
401 virginRawDigis(theVirginRawDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theVirginRawDigisVector) :
NULL)
411 totalEventCounters(),
433 : pConst(theCounters),
440 : pConst(theCounters),
442 deleteP(takeOwnership)
449 if (deleteP)
delete p;
454 #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_