2 #ifdef SiStripMonitorHardware_BuildEventMatchingCode 37 : eventId_(eventId), apvAddress_(apvAddress) {}
40 : outputRawData_(outputRawData),
67 std::make_shared<edm::BranchIDListHelper>(),
68 std::make_shared<edm::ThinnedAssociationsHelper>(),
80 size_t fileNameHash = 0
U;
86 [
this](
auto const& iE,
auto const&) {
94 std::ostringstream
ss;
95 ss <<
"Events with possible matches (eventID,apvAddress): ";
96 for (std::map<EventKey, SpyEventList>::const_iterator iSpyEvent =
eventMatches_.begin();
99 ss <<
"(" << iSpyEvent->first.eventId() <<
"," << uint16_t(iSpyEvent->first.apvAddress()) <<
") ";
112 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
113 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
114 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
116 std::map<EventKey, uint16_t> fedCounts;
117 unsigned int fedid = 0;
118 for (; ((iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) &&
119 (iAPVAddress != apvAddresses->end()));
120 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress, ++
fedid)) {
121 if (*iAPVAddress == 0) {
125 if (((*iTotalEventCount) > (*iL1ACount)) || ((*iL1ACount) - (*iTotalEventCount) >
counterDiffMax_)) {
127 <<
", totCount = " << *iTotalEventCount <<
", L1Acount = " << *iL1ACount << std::endl;
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();
143 iEventFEDCount != fedCounts.end();
145 ss <<
"(" << iEventFEDCount->first.eventId() <<
"," << uint16_t(iEventFEDCount->first.apvAddress()) <<
"," 146 << iEventFEDCount->second <<
") ";
152 const uint8_t apvAddress)
const {
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);
159 std::ostringstream
ss;
160 ss <<
"Found matches to event " << eventId <<
" with address " << uint16_t(apvAddress) <<
" in spy events ";
161 for (SpyEventList::const_iterator iMatchingSpyEvent = iMatch->second.begin();
162 iMatchingSpyEvent != iMatch->second.end();
163 ++iMatchingSpyEvent) {
164 ss << iMatchingSpyEvent->event() <<
" ";
167 return &(iMatch->second);
172 const uint32_t eventId,
173 const uint8_t apvAddress,
178 if (!inputRawDataPtr) {
203 std::set<uint16_t> matchingFeds;
204 findMatchingFeds(eventId, apvAddress, inputTotalEventCounters, inputL1ACounters, inputAPVAddresses, matchingFeds);
205 LogInfo(
mlLabel_) <<
"Spy event " <<
event.id() <<
" has " << matchingFeds.size() <<
" matching FEDs";
206 std::ostringstream
ss;
207 ss <<
"Matching FEDs for event " <<
event.id() <<
": ";
208 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
209 ss << *iFedId <<
" ";
214 std::vector<uint16_t>::iterator duplicatesBegin = duplicateFeds.begin();
217 matchingFeds.begin(),
220 if ((duplicatesEnd - duplicatesBegin) != 0) {
221 std::ostringstream
ss;
222 ss <<
"Found a match for FEDs ";
223 for (std::vector<uint16_t>::const_iterator iDup = duplicatesBegin; iDup != duplicatesEnd; ++iDup) {
226 ss <<
". Output SetSetVectors will be unusable!";
232 inputTotalEventCounters,
252 const uint8_t apvAddress,
258 size_t fileNameHash = 0
U;
264 matchingEvents->begin(),
265 matchingEvents->end(),
266 [&](
auto const& iE,
auto const&) { this->
getCollections(iE, eventId, apvAddress, cabling, mo); });
278 const uint8_t apvAddress,
282 std::set<uint16_t>& matchingFeds) {
284 std::vector<uint32_t>::const_iterator iTotalEventCount = totalEventCounters->begin();
285 std::vector<uint32_t>::const_iterator iL1ACount = l1aCounters->begin();
286 std::vector<uint32_t>::const_iterator iAPVAddress = apvAddresses->begin();
287 for (; ((iTotalEventCount != totalEventCounters->end()) && (iL1ACount != l1aCounters->end()) &&
288 (iAPVAddress != apvAddresses->end()));
289 (++iTotalEventCount, ++iL1ACount, ++iAPVAddress)) {
290 if (*iAPVAddress == 0) {
293 if ((eventId > *iTotalEventCount) && (eventId <= (*iL1ACount) + 1) && (*iAPVAddress == apvAddress)) {
294 matchingFeds.insert(matchingFeds.end(), iTotalEventCount - totalEventCounters->begin());
309 std::vector<uint32_t>& outputTotalEventCounters,
310 std::vector<uint32_t>& outputL1ACounters,
311 std::vector<uint32_t>& outputAPVAddresses,
318 if (inputScopeDigis) {
319 outputScopeDigisVector->reserve(outputScopeDigisVector->size() +
320 matchingFeds.size() *
323 if (inputPayloadDigis) {
324 outputPayloadDigisVector->reserve(outputPayloadDigisVector->size() + matchingFeds.size() *
FEDCH_PER_FED);
326 if (inputReorderedDigis) {
327 outputReorderedDigisVector->reserve(outputReorderedDigisVector->size() + matchingFeds.size() *
FEDCH_PER_FED);
329 if (inputVirginRawDigis) {
330 outputVirginRawDigisVector->reserve(outputVirginRawDigisVector->size() +
335 std::set<uint32_t> usedDetIds;
336 for (std::set<uint16_t>::const_iterator iFedId = matchingFeds.begin(); iFedId != matchingFeds.end(); ++iFedId) {
337 const uint32_t
fedId = *iFedId;
342 outputTotalEventCounters[
fedId] = (*inputTotalEventCounters)[
fedId];
343 outputL1ACounters[
fedId] = (*inputL1ACounters)[
fedId];
344 outputAPVAddresses[
fedId] = (*inputAPVAddresses)[
fedId];
348 if (inputScopeDigis) {
350 if (iScopeDigis != inputScopeDigis->
end()) {
351 outputScopeDigisVector->push_back(*iScopeDigis);
354 if (inputPayloadDigis) {
356 if (iPayloadDigis != inputPayloadDigis->
end()) {
357 outputPayloadDigisVector->push_back(*iPayloadDigis);
360 if (inputReorderedDigis) {
362 if (iReorderedDigis != inputReorderedDigis->
end()) {
363 outputReorderedDigisVector->push_back(*iReorderedDigis);
367 if (inputVirginRawDigis) {
368 std::set<uint32_t> fedDetIds;
370 for (
auto iConn = conns.begin(); iConn != conns.end(); ++iConn) {
371 if (!iConn->isConnected())
373 const uint32_t detId = iConn->detId();
374 if (usedDetIds.find(detId) != usedDetIds.end()) {
375 LogError(
mlLabel_) <<
"Duplicate DetID found " << detId <<
" skipping data for this Det from FED " <<
fedId;
378 fedDetIds.insert(iConn->detId());
380 usedDetIds.insert(fedDetIds.begin(), fedDetIds.end());
381 for (std::set<uint32_t>::const_iterator iDetId = fedDetIds.begin(); iDetId != fedDetIds.end(); ++iDetId) {
383 if (iVirginRawDigis != inputVirginRawDigis->
end()) {
384 outputVirginRawDigisVector->push_back(*iVirginRawDigis);
393 const bool mapKeyIsByFedID) {
394 const std::vector<uint32_t>* vectorFromEvent = getProduct<std::vector<uint32_t> >(
event,
tag);
395 if (vectorFromEvent) {
397 return std::make_shared<CountersWrapper>(vectorFromEvent);
399 const std::map<uint32_t, uint32_t>* mapFromEvent = getProduct<std::map<uint32_t, uint32_t> >(
event,
tag);
401 std::vector<uint32_t>* newVector =
new std::vector<uint32_t>(
FED_ID_MAX + 1, 0);
402 if (mapKeyIsByFedID) {
403 for (std::map<uint32_t, uint32_t>::const_iterator iIdValue = mapFromEvent->begin();
404 iIdValue != mapFromEvent->end();
406 newVector->at(iIdValue->first) = iIdValue->second;
419 return newCountersPtr;
428 std::vector<uint32_t>& theTotalEventCounters,
429 std::vector<uint32_t>& theL1ACounters,
430 std::vector<uint32_t>& theAPVAddresses,
436 totalEventCounters(new
std::
vector<uint32_t>),
439 scopeDigis(theScopeDigisVector ? new
edm::DetSetVector<
SiStripRawDigi>(*theScopeDigisVector) : nullptr),
440 payloadDigis(thePayloadDigisVector ? new
edm::DetSetVector<
SiStripRawDigi>(*thePayloadDigisVector) : nullptr),
441 reorderedDigis(theReorderedDigisVector ? new
edm::DetSetVector<
SiStripRawDigi>(*theReorderedDigisVector)
443 virginRawDigis(theVirginRawDigisVector ? new
edm::DetSetVector<
SiStripRawDigi>(*theVirginRawDigisVector)
453 totalEventCounters(),
462 : pConst(theCounters),
p(nullptr), deleteP(
false) {}
465 : pConst(theCounters),
p(theCounters), deleteP(takeOwnership) {}
474 #endif //SiStripMonitorHardware_BuildEventMatchingCode CountersWrapper(const Counters *theCounters)
void fillFEDMajorities(const std::map< uint32_t, uint32_t > &channelValues, std::vector< uint32_t > &fedMajoritiesToFill)
edm::InputTag virginRawDigisTag_
std::map< EventKey, SpyEventList > eventMatches_
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::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputVirginRawDigisVector_
std::vector< uint32_t > Counters
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)
static CountersPtr getCounters(const edm::EventPrincipal &event, const edm::InputTag &tag, const bool mapKeyIsByFedID=true)
FEDRawDataCollection & outputRawData_
std::unique_ptr< edm::ProcessConfiguration > processConfiguration_
const SpyEventList * matchesForEvent(const uint32_t eventId, const uint8_t apvAddress) const
size_t size() const
Lenght of the data buffer in bytes.
void getMatchedCollections(const uint32_t eventId, const uint8_t apvAddress, const SpyEventList *matchingEvents, const SiStripFedCabling &cabling, SpyDataCollections &collectionsToCreate)
edm::InputTag apvAddressesTag_
edm::InputTag scopeDigisTag_
void fedIndex(uint32_t aFedIndex, uint16_t &aFedId, uint16_t &aFedChannel)
Log< level::Error, false > LogError
std::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputScopeDigisVector_
std::vector< uint32_t > outputAPVAddresses_
edm::InputTag l1aCountersTag_
std::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputReorderedDigisVector_
std::unique_ptr< FEDRawDataCollection > rawData
std::unique_ptr< Source > constructSource(const edm::ParameterSet &sourceConfig)
std::shared_ptr< CountersWrapper > CountersPtr
std::unique_ptr< std::vector< uint32_t > > totalEventCounters
std::set< EventID > SpyEventList
std::shared_ptr< edm::ProductRegistry > productRegistry_
std::unique_ptr< std::vector< uint32_t > > apvAddresses
virtual ~SpyEventMatcher()
MatchingOutput(FEDRawDataCollection &outputRawData)
std::unique_ptr< edm::VectorInputSource > const source_
iterator end()
Return the off-the-end iterator.
edm::InputTag totalEventCountersTag_
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
static const char *const mlLabel_
std::string getReleaseVersion()
Log< level::Info, false > LogInfo
EventKey(const uint32_t eventId, const uint8_t apvAddress)
std::vector< uint32_t > outputTotalEventCounters_
edm::InputTag reorderedDigisTag_
static const uint16_t invalid_
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...
void addNextEventToMap(const edm::EventPrincipal &nextSpyEvent)
static const uint16_t FEDCH_PER_FED
std::unique_ptr< std::vector< uint32_t > > l1aCounters
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)
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
SpyEventMatcher(const edm::ParameterSet &config)
static const uint16_t FED_ID_MAX
std::shared_ptr< std::vector< edm::DetSet< SiStripRawDigi > > > outputPayloadDigisVector_
Log< level::Warning, false > LogWarning
collection_type::const_iterator const_iterator
A Digi for the silicon strip detector, containing only adc information, and suitable for storing raw ...
EventID const & id() const
static ParameterSetID emptyParameterSetID()
ConnsConstIterRange fedConnections(uint16_t fed_id) const
EventNumber_t event() const