2 #ifdef SiStripMonitorHardware_BuildEventMatchingCode
24 #include "boost/bind.hpp"
38 : eventId_(eventId), apvAddress_(apvAddress) {}
41 outputRawData_(outputRawData),
42 outputTotalEventCounters_(sistrip::
FED_ID_MAX+1),
49 :
rawDataTag_(config.getParameter<edm::InputTag>(
"RawSpyDataTag")),
51 l1aCountersTag_(config.getParameter<edm::InputTag>(
"SpyL1ACountersTag")),
53 scopeDigisTag_(config.getParameter<edm::InputTag>(
"SpyScopeDigisTag")),
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>(),
92 std::ostringstream
ss;
93 ss <<
"Events with possible matches (eventID,apvAddress): ";
94 for (std::map<EventKey,SpyEventList>::const_iterator iSpyEvent =
eventMatches_.begin(); iSpyEvent !=
eventMatches_.end(); ++iSpyEvent) {
95 ss <<
"(" << iSpyEvent->first.eventId() <<
"," << uint16_t(iSpyEvent->first.apvAddress()) <<
") ";
109 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
110 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
111 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
113 std::map<EventKey,uint16_t> fedCounts;
114 unsigned int fedid = 0;
116 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
117 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress, ++fedid)
119 if (*iAPVAddress == 0) {
123 if ( ((*iTotalEventCount) > (*iL1ACount) ) ||
127 <<
" error in counter values for FED " << fedid
128 <<
", totCount = " << *iTotalEventCount
129 <<
", L1Acount = " << *iL1ACount
135 for (uint32_t eventId = (*iTotalEventCount)+1; eventId <= (*iL1ACount)+1; ++eventId) {
143 std::ostringstream
ss;
144 ss <<
"Spy event " << spyEventId.
event() <<
" matches (eventID,apvAddress,nFEDs): ";
145 for (std::map<EventKey,uint16_t>::const_iterator iEventFEDCount = fedCounts.begin(); iEventFEDCount != fedCounts.end(); ++iEventFEDCount) {
146 ss <<
"(" << iEventFEDCount->first.eventId() <<
"," << uint16_t(iEventFEDCount->first.apvAddress()) <<
"," << iEventFEDCount->second <<
") ";
153 EventKey eventKey(eventId,apvAddress);
154 std::map<EventKey,SpyEventList>::const_iterator iMatch =
eventMatches_.find(eventKey);
156 LogDebug(
mlLabel_) <<
"No match found for event " << eventId <<
" with APV address " << uint16_t(apvAddress);
160 std::ostringstream
ss;
161 ss <<
"Found matches to event " << eventId <<
" with address " << uint16_t(apvAddress) <<
" in spy events ";
162 for (SpyEventList::const_iterator iMatchingSpyEvent = iMatch->second.begin(); iMatchingSpyEvent != iMatch->second.end(); ++iMatchingSpyEvent) {
163 ss << iMatchingSpyEvent->event() <<
" ";
166 return &(iMatch->second);
176 if (!inputRawDataPtr) {
193 std::set<uint16_t> matchingFeds;
194 findMatchingFeds(eventId,apvAddress,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,matchingFeds);
195 LogInfo(
mlLabel_) <<
"Spy event " <<
event.id() <<
" has " << matchingFeds.size() <<
" matching FEDs";
196 std::ostringstream
ss;
197 ss <<
"Matching FEDs for event " <<
event.id() <<
": ";
198 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
199 ss << *iFedId <<
" ";
204 std::vector<uint16_t>::iterator duplicatesBegin = duplicateFeds.begin();
206 matchingFeds.begin(),matchingFeds.end(),
208 if ( (duplicatesEnd-duplicatesBegin) != 0 ) {
209 std::ostringstream
ss;
210 ss <<
"Found a match for FEDs ";
211 for (std::vector<uint16_t>::const_iterator iDup = duplicatesBegin; iDup != duplicatesEnd; ++iDup) {
214 ss <<
". Output SetSetVectors will be unusable!";
218 mergeMatchingData(matchingFeds,inputRawData,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,
219 inputScopeDigis,inputPayloadDigis,inputReorderedDigis,inputVirginRawDigis,
231 if (!matchingEvents)
return;
235 eventId,apvAddress,boost::cref(cabling),boost::ref(mo)));
239 collectionsToCreate = collections;
246 std::set<uint16_t>& matchingFeds)
249 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
250 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
251 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
253 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
254 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress)
256 if (*iAPVAddress == 0) {
259 if ( (eventId > *iTotalEventCount) && (eventId <= (*iL1ACount)+1) && (*iAPVAddress == apvAddress) ) {
260 matchingFeds.insert(matchingFeds.end(),iTotalEventCount-totalEventCounters->begin());
275 std::vector<uint32_t>& outputTotalEventCounters,
276 std::vector<uint32_t>& outputL1ACounters,
277 std::vector<uint32_t>& outputAPVAddresses,
285 if (inputScopeDigis) {
286 outputScopeDigisVector->reserve(outputScopeDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
288 if (inputPayloadDigis) {
289 outputPayloadDigisVector->reserve(outputPayloadDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
291 if (inputReorderedDigis) {
292 outputReorderedDigisVector->reserve(outputReorderedDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
294 if (inputVirginRawDigis) {
295 outputVirginRawDigisVector->reserve(outputVirginRawDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED/2);
298 std::set<uint32_t> usedDetIds;
299 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
300 const uint32_t fedId = *iFedId;
305 outputTotalEventCounters[fedId] = (*inputTotalEventCounters)[fedId];
306 outputL1ACounters[fedId] = (*inputL1ACounters)[fedId];
307 outputAPVAddresses[fedId] = (*inputAPVAddresses)[fedId];
310 if (inputScopeDigis) {
312 if (iScopeDigis != inputScopeDigis->
end()) {
313 outputScopeDigisVector->push_back(*iScopeDigis);
316 if (inputPayloadDigis) {
318 if (iPayloadDigis != inputPayloadDigis->
end()) {
319 outputPayloadDigisVector->push_back(*iPayloadDigis);
322 if (inputReorderedDigis) {
324 if (iReorderedDigis != inputReorderedDigis->
end()) {
325 outputReorderedDigisVector->push_back(*iReorderedDigis);
329 if (inputVirginRawDigis) {
330 std::set<uint32_t> fedDetIds;
332 for (
auto iConn = conns.begin(); iConn != conns.end(); ++iConn) {
333 if (!iConn->isConnected())
continue;
334 const uint32_t detId = iConn->detId();
335 if (usedDetIds.find(detId) != usedDetIds.end()) {
336 LogError(
mlLabel_) <<
"Duplicate DetID found " << detId <<
" skipping data for this Det from FED " << fedId;
339 fedDetIds.insert(iConn->detId());
341 usedDetIds.insert(fedDetIds.begin(),fedDetIds.end());
342 for (std::set<uint32_t>::const_iterator iDetId = fedDetIds.begin(); iDetId != fedDetIds.end(); ++iDetId) {
344 if (iVirginRawDigis != inputVirginRawDigis->
end()) {
345 outputVirginRawDigisVector->push_back(*iVirginRawDigis);
354 const std::vector<uint32_t>* vectorFromEvent = getProduct< std::vector<uint32_t> >(
event,
tag);
355 if (vectorFromEvent) {
359 const std::map<uint32_t,uint32_t>* mapFromEvent = getProduct< std::map<uint32_t,uint32_t> >(
event,
tag);
361 std::vector<uint32_t>* newVector =
new std::vector<uint32_t>(
FED_ID_MAX+1,0);
362 if (mapKeyIsByFedID) {
363 for (std::map<uint32_t,uint32_t>::const_iterator iIdValue = mapFromEvent->begin(); iIdValue != mapFromEvent->end(); ++iIdValue) {
364 newVector->at(iIdValue->first) = iIdValue->second;
377 return newCountersPtr;
385 std::vector<uint32_t>& theTotalEventCounters,
386 std::vector<uint32_t>& theL1ACounters,
387 std::vector<uint32_t>& theAPVAddresses,
393 totalEventCounters(new std::vector<uint32_t>),
394 l1aCounters(new std::vector<uint32_t>),
395 apvAddresses(new std::vector<uint32_t>),
396 scopeDigis(theScopeDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theScopeDigisVector) :
NULL),
397 payloadDigis(thePayloadDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*thePayloadDigisVector) :
NULL),
398 reorderedDigis(theReorderedDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theReorderedDigisVector) :
NULL),
399 virginRawDigis(theVirginRawDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theVirginRawDigisVector) :
NULL)
409 totalEventCounters(),
431 : pConst(theCounters),
438 : pConst(theCounters),
440 deleteP(takeOwnership)
447 if (deleteP)
delete p;
452 #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_