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")),
68 std::make_shared<edm::BranchIDListHelper>(),
69 std::make_shared<edm::ThinnedAssociationsHelper>(),
83 size_t fileNameHash = 0U;
87 std::ostringstream
ss;
88 ss <<
"Events with possible matches (eventID,apvAddress): ";
89 for (std::map<EventKey,SpyEventList>::const_iterator iSpyEvent =
eventMatches_.begin(); iSpyEvent !=
eventMatches_.end(); ++iSpyEvent) {
90 ss <<
"(" << iSpyEvent->first.eventId() <<
"," << uint16_t(iSpyEvent->first.apvAddress()) <<
") ";
104 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
105 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
106 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
108 std::map<EventKey,uint16_t> fedCounts;
109 unsigned int fedid = 0;
111 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
112 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress, ++fedid)
114 if (*iAPVAddress == 0) {
118 if ( ((*iTotalEventCount) > (*iL1ACount) ) ||
122 <<
" error in counter values for FED " << fedid
123 <<
", totCount = " << *iTotalEventCount
124 <<
", L1Acount = " << *iL1ACount
130 for (uint32_t eventId = (*iTotalEventCount)+1; eventId <= (*iL1ACount)+1; ++eventId) {
138 std::ostringstream
ss;
139 ss <<
"Spy event " << spyEventId.
event() <<
" matches (eventID,apvAddress,nFEDs): ";
140 for (std::map<EventKey,uint16_t>::const_iterator iEventFEDCount = fedCounts.begin(); iEventFEDCount != fedCounts.end(); ++iEventFEDCount) {
141 ss <<
"(" << iEventFEDCount->first.eventId() <<
"," << uint16_t(iEventFEDCount->first.apvAddress()) <<
"," << iEventFEDCount->second <<
") ";
148 EventKey eventKey(eventId,apvAddress);
149 std::map<EventKey,SpyEventList>::const_iterator iMatch =
eventMatches_.find(eventKey);
151 LogDebug(
mlLabel_) <<
"No match found for event " << eventId <<
" with APV address " << uint16_t(apvAddress);
155 std::ostringstream
ss;
156 ss <<
"Found matches to event " << eventId <<
" with address " << uint16_t(apvAddress) <<
" in spy events ";
157 for (SpyEventList::const_iterator iMatchingSpyEvent = iMatch->second.begin(); iMatchingSpyEvent != iMatch->second.end(); ++iMatchingSpyEvent) {
158 ss << iMatchingSpyEvent->event() <<
" ";
161 return &(iMatch->second);
171 if (!inputRawDataPtr) {
188 std::set<uint16_t> matchingFeds;
189 findMatchingFeds(eventId,apvAddress,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,matchingFeds);
190 LogInfo(
mlLabel_) <<
"Spy event " <<
event.id() <<
" has " << matchingFeds.size() <<
" matching FEDs";
191 std::ostringstream
ss;
192 ss <<
"Matching FEDs for event " <<
event.id() <<
": ";
193 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
194 ss << *iFedId <<
" ";
199 std::vector<uint16_t>::iterator duplicatesBegin = duplicateFeds.begin();
201 matchingFeds.begin(),matchingFeds.end(),
203 if ( (duplicatesEnd-duplicatesBegin) != 0 ) {
204 std::ostringstream
ss;
205 ss <<
"Found a match for FEDs ";
206 for (std::vector<uint16_t>::const_iterator iDup = duplicatesBegin; iDup != duplicatesEnd; ++iDup) {
209 ss <<
". Output SetSetVectors will be unusable!";
213 mergeMatchingData(matchingFeds,inputRawData,inputTotalEventCounters,inputL1ACounters,inputAPVAddresses,
214 inputScopeDigis,inputPayloadDigis,inputReorderedDigis,inputVirginRawDigis,
226 if (!matchingEvents)
return;
227 size_t fileNameHash = 0U;
231 eventId,apvAddress,boost::cref(cabling),boost::ref(mo)));
235 collectionsToCreate = collections;
242 std::set<uint16_t>& matchingFeds)
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();
249 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
250 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress)
252 if (*iAPVAddress == 0) {
255 if ( (eventId > *iTotalEventCount) && (eventId <= (*iL1ACount)+1) && (*iAPVAddress == apvAddress) ) {
256 matchingFeds.insert(matchingFeds.end(),iTotalEventCount-totalEventCounters->begin());
271 std::vector<uint32_t>& outputTotalEventCounters,
272 std::vector<uint32_t>& outputL1ACounters,
273 std::vector<uint32_t>& outputAPVAddresses,
281 if (inputScopeDigis) {
282 outputScopeDigisVector->reserve(outputScopeDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
284 if (inputPayloadDigis) {
285 outputPayloadDigisVector->reserve(outputPayloadDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
287 if (inputReorderedDigis) {
288 outputReorderedDigisVector->reserve(outputReorderedDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
290 if (inputVirginRawDigis) {
291 outputVirginRawDigisVector->reserve(outputVirginRawDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED/2);
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;
301 outputTotalEventCounters[
fedId] = (*inputTotalEventCounters)[
fedId];
302 outputL1ACounters[
fedId] = (*inputL1ACounters)[
fedId];
303 outputAPVAddresses[
fedId] = (*inputAPVAddresses)[
fedId];
306 if (inputScopeDigis) {
308 if (iScopeDigis != inputScopeDigis->
end()) {
309 outputScopeDigisVector->push_back(*iScopeDigis);
312 if (inputPayloadDigis) {
314 if (iPayloadDigis != inputPayloadDigis->
end()) {
315 outputPayloadDigisVector->push_back(*iPayloadDigis);
318 if (inputReorderedDigis) {
320 if (iReorderedDigis != inputReorderedDigis->
end()) {
321 outputReorderedDigisVector->push_back(*iReorderedDigis);
325 if (inputVirginRawDigis) {
326 std::set<uint32_t> fedDetIds;
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;
335 fedDetIds.insert(iConn->detId());
337 usedDetIds.insert(fedDetIds.begin(),fedDetIds.end());
338 for (std::set<uint32_t>::const_iterator iDetId = fedDetIds.begin(); iDetId != fedDetIds.end(); ++iDetId) {
340 if (iVirginRawDigis != inputVirginRawDigis->
end()) {
341 outputVirginRawDigisVector->push_back(*iVirginRawDigis);
350 const std::vector<uint32_t>* vectorFromEvent = getProduct< std::vector<uint32_t> >(
event,
tag);
351 if (vectorFromEvent) {
355 const std::map<uint32_t,uint32_t>* mapFromEvent = getProduct< std::map<uint32_t,uint32_t> >(
event,
tag);
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;
373 return newCountersPtr;
381 std::vector<uint32_t>& theTotalEventCounters,
382 std::vector<uint32_t>& theL1ACounters,
383 std::vector<uint32_t>& theAPVAddresses,
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) :
NULL),
393 payloadDigis(thePayloadDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*thePayloadDigisVector) :
NULL),
394 reorderedDigis(theReorderedDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theReorderedDigisVector) :
NULL),
395 virginRawDigis(theVirginRawDigisVector ? new edm::DetSetVector<
SiStripRawDigi>(*theVirginRawDigisVector) :
NULL)
405 totalEventCounters(),
427 : pConst(theCounters),
434 : pConst(theCounters),
436 deleteP(takeOwnership)
443 if (deleteP)
delete p;
448 #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
std::shared_ptr< edm::ProductRegistry > productRegistry_
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
string key
FastSim: produces sample of signal events, overlayed with premixed minbias events.
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)
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_