2 #ifdef SiStripMonitorHardware_BuildEventMatchingCode 24 #include "boost/bind.hpp" 38 : eventId_(eventId), apvAddress_(apvAddress) {}
41 outputRawData_(outputRawData),
49 :
rawDataTag_(config.getParameter<
edm::InputTag>(
"RawSpyDataTag")),
57 counterDiffMax_(config.getParameter<uint32_t>(
"CounterDiffMaxAllowed")),
68 std::make_shared<edm::BranchIDListHelper>(),
69 std::make_shared<edm::ThinnedAssociationsHelper>(),
83 size_t fileNameHash = 0
U;
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 = 0
U;
231 eventId,apvAddress,boost::cref(cabling),boost::ref(mo)));
241 std::set<uint16_t>& matchingFeds)
244 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
245 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
246 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
248 ( (iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) && (iAPVAddress != apvAddresses->end()) );
249 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress)
251 if (*iAPVAddress == 0) {
254 if ( (eventId > *iTotalEventCount) && (eventId <= (*iL1ACount)+1) && (*iAPVAddress == apvAddress) ) {
255 matchingFeds.insert(matchingFeds.end(),iTotalEventCount-totalEventCounters->begin());
270 std::vector<uint32_t>& outputTotalEventCounters,
271 std::vector<uint32_t>& outputL1ACounters,
272 std::vector<uint32_t>& outputAPVAddresses,
280 if (inputScopeDigis) {
281 outputScopeDigisVector->reserve(outputScopeDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
283 if (inputPayloadDigis) {
284 outputPayloadDigisVector->reserve(outputPayloadDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
286 if (inputReorderedDigis) {
287 outputReorderedDigisVector->reserve(outputReorderedDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED);
289 if (inputVirginRawDigis) {
290 outputVirginRawDigisVector->reserve(outputVirginRawDigisVector->size()+matchingFeds.size()*
FEDCH_PER_FED/2);
293 std::set<uint32_t> usedDetIds;
294 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
295 const uint32_t fedId = *iFedId;
300 outputTotalEventCounters[fedId] = (*inputTotalEventCounters)[fedId];
301 outputL1ACounters[fedId] = (*inputL1ACounters)[fedId];
302 outputAPVAddresses[fedId] = (*inputAPVAddresses)[fedId];
305 if (inputScopeDigis) {
307 if (iScopeDigis != inputScopeDigis->
end()) {
308 outputScopeDigisVector->push_back(*iScopeDigis);
311 if (inputPayloadDigis) {
313 if (iPayloadDigis != inputPayloadDigis->
end()) {
314 outputPayloadDigisVector->push_back(*iPayloadDigis);
317 if (inputReorderedDigis) {
319 if (iReorderedDigis != inputReorderedDigis->
end()) {
320 outputReorderedDigisVector->push_back(*iReorderedDigis);
324 if (inputVirginRawDigis) {
325 std::set<uint32_t> fedDetIds;
327 for (
auto iConn = conns.begin(); iConn != conns.end(); ++iConn) {
328 if (!iConn->isConnected())
continue;
329 const uint32_t detId = iConn->detId();
330 if (usedDetIds.find(detId) != usedDetIds.end()) {
331 LogError(
mlLabel_) <<
"Duplicate DetID found " << detId <<
" skipping data for this Det from FED " << fedId;
334 fedDetIds.insert(iConn->detId());
336 usedDetIds.insert(fedDetIds.begin(),fedDetIds.end());
337 for (std::set<uint32_t>::const_iterator iDetId = fedDetIds.begin(); iDetId != fedDetIds.end(); ++iDetId) {
339 if (iVirginRawDigis != inputVirginRawDigis->
end()) {
340 outputVirginRawDigisVector->push_back(*iVirginRawDigis);
349 const std::vector<uint32_t>* vectorFromEvent = getProduct< std::vector<uint32_t> >(
event,
tag);
350 if (vectorFromEvent) {
354 const std::map<uint32_t,uint32_t>* mapFromEvent = getProduct< std::map<uint32_t,uint32_t> >(
event,
tag);
356 std::vector<uint32_t>* newVector =
new std::vector<uint32_t>(
FED_ID_MAX+1,0);
357 if (mapKeyIsByFedID) {
358 for (std::map<uint32_t,uint32_t>::const_iterator iIdValue = mapFromEvent->begin(); iIdValue != mapFromEvent->end(); ++iIdValue) {
359 newVector->at(iIdValue->first) = iIdValue->second;
372 return newCountersPtr;
380 std::vector<uint32_t>& theTotalEventCounters,
381 std::vector<uint32_t>& theL1ACounters,
382 std::vector<uint32_t>& theAPVAddresses,
388 totalEventCounters(new
std::vector<uint32_t>),
389 l1aCounters(new
std::vector<uint32_t>),
390 apvAddresses(new
std::vector<uint32_t>),
391 scopeDigis(theScopeDigisVector ? new
edm::DetSetVector<
SiStripRawDigi>(*theScopeDigisVector) :
NULL),
392 payloadDigis(thePayloadDigisVector ? new
edm::DetSetVector<
SiStripRawDigi>(*thePayloadDigisVector) :
NULL),
393 reorderedDigis(theReorderedDigisVector ? new
edm::DetSetVector<
SiStripRawDigi>(*theReorderedDigisVector) :
NULL),
394 virginRawDigis(theVirginRawDigisVector ? new
edm::DetSetVector<
SiStripRawDigi>(*theVirginRawDigisVector) :
NULL)
414 : pConst(theCounters),
435 #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)
static const char * mlLabel_
std::vector< uint32_t > Counters
std::unique_ptr< std::vector< uint32_t > > l1aCounters
boost::shared_ptr< CountersWrapper > CountersPtr
edm::InputTag rawDataTag_
std::unique_ptr< std::vector< uint32_t > > totalEventCounters
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_
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::unique_ptr< edm::DetSetVector< SiStripRawDigi > > virginRawDigis
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()
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()
std::unique_ptr< FEDRawDataCollection > rawData
EventKey(const uint32_t eventId, const uint8_t apvAddress)
std::vector< uint32_t > outputTotalEventCounters_
std::unique_ptr< edm::DetSetVector< SiStripRawDigi > > scopeDigis
edm::InputTag reorderedDigisTag_
ConnsConstIterRange fedConnections(uint16_t fed_id) const
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi...
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
boost::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputVirginRawDigisVector_
void addNextEventToMap(const edm::EventPrincipal &nextSpyEvent)
static const uint16_t FEDCH_PER_FED
std::unique_ptr< std::vector< uint32_t > > apvAddresses
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
std::unique_ptr< edm::DetSetVector< SiStripRawDigi > > reorderedDigis
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::unique_ptr< edm::DetSetVector< SiStripRawDigi > > payloadDigis
std::map< EventKey, SpyEventList > eventMatches_