From 1f25a65cb72c02ceac26b54498cc6841fd15b5ea Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Fri, 10 Jan 2014 19:34:13 +0100 Subject: [PATCH 01/10] try to decode ROC once --- .../SiPixelObjects/interface/PixelROC.h | 18 ++- .../interface/SiPixelFrameConverter.h | 21 ++- CondFormats/SiPixelObjects/src/PixelROC.cc | 19 --- .../src/SiPixelFrameConverter.cc | 29 ++-- .../SiPixelRawToDigi/src/ErrorChecker.cc | 1 + .../src/PixelDataFormatter.cc | 147 +++++++++++------- 6 files changed, 134 insertions(+), 101 deletions(-) diff --git a/CondFormats/SiPixelObjects/interface/PixelROC.h b/CondFormats/SiPixelObjects/interface/PixelROC.h index 30192172fffe0..23f74949cf726 100644 --- a/CondFormats/SiPixelObjects/interface/PixelROC.h +++ b/CondFormats/SiPixelObjects/interface/PixelROC.h @@ -48,11 +48,25 @@ class PixelROC { /// converts DU position to local. /// If GlobalPixel is outside ROC the resulting LocalPixel is not inside ROC. /// (call to inside(..) recommended) - LocalPixel toLocal(const GlobalPixel & gp) const; + LocalPixel toLocal(const GlobalPixel & glo) const { + if (!theFrameConverter) initFrameConversion(); + int rocRow = theFrameConverter->row().inverse(glo.row); + int rocCol = theFrameConverter->collumn().inverse(glo.col); + + LocalPixel::RocRowCol rocRowCol = {rocRow, rocCol}; + return LocalPixel(rocRowCol); + + } /// converts LocalPixel in ROC to DU coordinates. /// LocalPixel must be inside ROC. Otherwise result is meaningless - GlobalPixel toGlobal(const LocalPixel & loc) const; + GlobalPixel toGlobal(const LocalPixel & loc) const { + if (!theFrameConverter) initFrameConversion(); + GlobalPixel result; + result.col = theFrameConverter->collumn().convert(loc.rocCol()); + result.row = theFrameConverter->row().convert(loc.rocRow()); + return result; + } /// printout for debug std::string print(int depth = 0) const; diff --git a/CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h b/CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h index 4e204c7ab9a8e..688f68858ee99 100644 --- a/CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h +++ b/CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h @@ -6,6 +6,7 @@ #include "CondFormats/SiPixelObjects/interface/ElectronicIndex.h" #include "CondFormats/SiPixelObjects/interface/DetectorIndex.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCabling.h" +#include "CondFormats/SiPixelObjects/interface/PixelROC.h" #include @@ -16,8 +17,26 @@ class SiPixelFrameConverter { bool hasDetUnit(uint32_t radId) const; + sipixelobjects::PixelROC const * toRoc(int link, int roc) const; + + int toDetector(const sipixelobjects::ElectronicIndex & cabling, - sipixelobjects::DetectorIndex & detector) const; + sipixelobjects::DetectorIndex & detector) const { + using namespace sipixelobjects; + auto roc = toRoc(cabling.link, cabling.roc); + if (!roc) return 2; + LocalPixel::DcolPxid local = { cabling.dcol, cabling.pxid }; + if (!local.valid()) return 3; + + GlobalPixel global = roc->toGlobal( LocalPixel(local) ); + detector.rawId = roc->rawId(); + detector.row = global.row; + detector.col = global.col; + + return 0; + + } + int toCabling( sipixelobjects::ElectronicIndex & cabling, const sipixelobjects::DetectorIndex & detector) const; diff --git a/CondFormats/SiPixelObjects/src/PixelROC.cc b/CondFormats/SiPixelObjects/src/PixelROC.cc index eb162111d7a83..a40f944a26be8 100644 --- a/CondFormats/SiPixelObjects/src/PixelROC.cc +++ b/CondFormats/SiPixelObjects/src/PixelROC.cc @@ -41,25 +41,6 @@ PixelROC::swap(PixelROC& iOther) std::swap(theFrameConverter,iOther.theFrameConverter); } -GlobalPixel PixelROC::toGlobal(const LocalPixel & loc) const -{ - GlobalPixel result; - if (!theFrameConverter) initFrameConversion(); - result.col = theFrameConverter->collumn().convert(loc.rocCol()); - result.row = theFrameConverter->row().convert(loc.rocRow()); - return result; -} - - -LocalPixel PixelROC::toLocal( const GlobalPixel& glo) const -{ - if (!theFrameConverter) initFrameConversion(); - int rocRow = theFrameConverter->row().inverse(glo.row); - int rocCol = theFrameConverter->collumn().inverse(glo.col); - - LocalPixel::RocRowCol rocRowCol = {rocRow, rocCol}; - return LocalPixel(rocRowCol); -} void PixelROC::initFrameConversion() const { diff --git a/CondFormats/SiPixelObjects/src/SiPixelFrameConverter.cc b/CondFormats/SiPixelObjects/src/SiPixelFrameConverter.cc index 156de16895932..49fb1ce9985de 100644 --- a/CondFormats/SiPixelObjects/src/SiPixelFrameConverter.cc +++ b/CondFormats/SiPixelObjects/src/SiPixelFrameConverter.cc @@ -27,34 +27,23 @@ bool SiPixelFrameConverter::hasDetUnit(uint32_t rawId) const } -int SiPixelFrameConverter::toDetector(const ElectronicIndex & cabling, DetectorIndex & detector) const -{ +PixelROC const * SiPixelFrameConverter::toRoc(int link, int roc) const { CablingPathToDetUnit path = {static_cast(theFedId), - static_cast(cabling.link), - static_cast(cabling.roc)}; - const PixelROC * roc = theMap->findItem(path); - if (!roc){ + static_cast(link), + static_cast(roc)}; + const PixelROC * rocp = theMap->findItem(path); + if (!rocp){ stringstream stm; stm << "Map shows no fed="<toGlobal( LocalPixel(local) ); - detector.rawId = roc->rawId(); - detector.row = global.row; - detector.col = global.col; - - return 0; - - + return rocp; } + int SiPixelFrameConverter::toCabling( ElectronicIndex & cabling, const DetectorIndex & detector) const { diff --git a/EventFilter/SiPixelRawToDigi/src/ErrorChecker.cc b/EventFilter/SiPixelRawToDigi/src/ErrorChecker.cc index 1c1afae31abb8..b566267dccc95 100644 --- a/EventFilter/SiPixelRawToDigi/src/ErrorChecker.cc +++ b/EventFilter/SiPixelRawToDigi/src/ErrorChecker.cc @@ -114,6 +114,7 @@ bool ErrorChecker::checkROC(bool& errorsInEvent, int fedId, const SiPixelFrameCo { int errorType = (errorWord >> ROC_shift) & ERROR_mask; + if (errorType<25) return true; switch (errorType) { case(25) : { LogDebug("")<<" invalid ROC=25 found (errorType=25)"; diff --git a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc index e876365e49fd7..39d1e62dc4895 100644 --- a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc +++ b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc @@ -88,75 +88,104 @@ void PixelDataFormatter::passFrameReverter(const SiPixelFrameReverter* reverter) void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const FEDRawData& rawData, Digis& digis, Errors& errors) { + using namespace sipixelobjects; + debug = edm::MessageDrop::instance()->debugEnabled; + int nWords = rawData.size()/sizeof(Word64); if (nWords==0) return; - SiPixelFrameConverter * converter = (theCablingTree) ? - new SiPixelFrameConverter(theCablingTree, fedId) : 0; + SiPixelFrameConverter converter(theCablingTree, fedId); // check CRC bit - const Word64* trailer = reinterpret_cast(rawData.data())+(nWords-1); - bool CRC_OK = errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors); - - if(CRC_OK) { - // check headers - const Word64* header = reinterpret_cast(rawData.data()); header--; - bool moreHeaders = true; - while (moreHeaders) { - header++; - if (debug) LogTrace("")<<"HEADER: " << print(*header); - bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); - moreHeaders = headerStatus; - } + const Word64* trailer = reinterpret_cast(rawData.data())+(nWords-1); + if(!errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors)) return; + + // check headers + const Word64* header = reinterpret_cast(rawData.data()); header--; + bool moreHeaders = true; + while (moreHeaders) { + header++; + if (debug) LogTrace("")<<"HEADER: " << print(*header); + bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); + moreHeaders = headerStatus; + } - // check trailers - bool moreTrailers = true; - trailer++; - while (moreTrailers) { - trailer--; - if (debug) LogTrace("")<<"TRAILER: " << print(*trailer); - bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); - moreTrailers = trailerStatus; - } + // check trailers + bool moreTrailers = true; + trailer++; + while (moreTrailers) { + trailer--; + if (debug) LogTrace("")<<"TRAILER: " << print(*trailer); + bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); + moreTrailers = trailerStatus; + } - // data words - theWordCounter += 2*(nWords-2); - if (debug) LogTrace("")<<"data words: "<< (trailer-header-1); - for (const Word64* word = header+1; word != trailer; word++) { - if (debug) LogTrace("")<<"DATA: " << print(*word); - Word32 w1 = *word & WORD32_mask; - Word32 w2 = *word >> 32 & WORD32_mask; - if (w1==0) theWordCounter--; - if (w2==0) theWordCounter--; - - // check status of word... - bool notErrorROC1 = errorcheck.checkROC(errorsInEvent, fedId, converter, w1, errors); - if (notErrorROC1) { - int status1 = word2digi(fedId, converter, includeErrors, useQualityInfo, w1, digis); - if (status1) { - LogDebug("PixelDataFormatter::interpretRawData") - << "status #" <> 32 & WORD32_mask) }; + + for (int i=0; i<2; ++i) { + auto ww = w[i]; + if (ww==0) { theWordCounter--; continue;} + int nlink = (ww >> LINK_shift) & LINK_mask; + int nroc = (ww >> ROC_shift) & ROC_mask; + + if ( (nlink!=link) | (nroc!=roc) ) { // new roc + link = nlink; roc=nroc; + skipROC = !errorcheck.checkROC(errorsInEvent, fedId, &converter, ww, errors); + if (skipROC) continue; + rocp = converter.toRoc(link,roc); + if (!rocp) { + errorsInEvent = true; + errorcheck.conversionError(fedId, &converter, 2, ww, errors); + skipROC=true; + continue; + } + auto rawId = rocp->rawId(); + if (useQualityInfo&(nullptr!=badPixelInfo)) { + short rocInDet = (short) rocp->idInDetUnit(); + skipROC = badPixelInfo->IsRocBad(rawId, rocInDet); + if (skipROC) continue; + } + + skipROC= modulesToUnpack && ( modulesToUnpack->find(rawId) == modulesToUnpack->end()); + if (skipROC) continue; + detDigis = &digis[rawId]; } - bool notErrorROC2 = errorcheck.checkROC(errorsInEvent, fedId, converter, w2, errors); - if (notErrorROC2) { - int status2 = word2digi(fedId, converter, includeErrors, useQualityInfo, w2, digis); - if (status2) { - LogDebug("PixelDataFormatter::interpretRawData") - << "status #" <> DCOL_shift) & DCOL_mask; + int pxid = (ww >> PXID_shift) & PXID_mask; + int adc = (ww >> ADC_shift) & ADC_mask; + + LocalPixel::DcolPxid local = { dcol, pxid }; + if (!local.valid()) { + LogDebug("PixelDataFormatter::interpretRawData") + << "status #3"; + errorsInEvent = true; + errorcheck.conversionError(fedId, &converter, 3, ww, errors); } + + GlobalPixel global = rocp->toGlobal( LocalPixel(local) ); + (*detDigis).emplace_back(global.row, global.col, adc); + + if (debug) LogTrace("") << (*detDigis).back(); } - } // end if(CRC_OK) - delete converter; + } } - void PixelDataFormatter::formatRawData(unsigned int lvl1_ID, RawData & fedRawData, const Digis & digis) { std::map > words; @@ -250,6 +279,7 @@ int PixelDataFormatter::digi2word( cms_uint32_t detId, const PixelDigi& digi, } +// obsolete... int PixelDataFormatter::word2digi(const int fedId, const SiPixelFrameConverter* converter, const bool includeErrors, const bool useQuality, const Word32 & word, Digis & digis) const { @@ -292,12 +322,11 @@ int PixelDataFormatter::word2digi(const int fedId, const SiPixelFrameConverter* if (modulesToUnpack && modulesToUnpack->find(detIdx.rawId) == modulesToUnpack->end()) return 0; - PixelDigi pd(detIdx.row, detIdx.col, adc); - digis[detIdx.rawId].push_back(pd); + digis[detIdx.rawId].emplace_back(detIdx.row, detIdx.col, adc); theDigiCounter++; - if (debug) LogTrace("") << print(pd); + if (debug) LogTrace("") << digis[detIdx.rawId].back(); return 0; } From f92efe74449b3f9d09a6ac7bec5b6982d276455f Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Sat, 11 Jan 2014 10:49:51 +0100 Subject: [PATCH 02/10] skip if error --- DataFormats/SiPixelDigi/src/PixelDigi.cc | 3 ++- EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/DataFormats/SiPixelDigi/src/PixelDigi.cc b/DataFormats/SiPixelDigi/src/PixelDigi.cc index 0ed6ac5eaee91..f93acd76c76a8 100644 --- a/DataFormats/SiPixelDigi/src/PixelDigi.cc +++ b/DataFormats/SiPixelDigi/src/PixelDigi.cc @@ -10,7 +10,8 @@ void PixelDigi::init( int row, int col, int adc) { // may be smaller! if ( row < 0 || row > PixelChannelIdentifier::thePacking.max_row || col < 0 || col > PixelChannelIdentifier::thePacking.max_column) { - std::cout << "PixelDigi constructor: row or column out packing range" << std::endl; + std::cout << "PixelDigi constructor: row or column out packing range " + << row << ' ' << col << std::endl; } // Set adc to max_adc in case of overflow diff --git a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc index 39d1e62dc4895..3d6477ccc0fe9 100644 --- a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc +++ b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc @@ -176,6 +176,7 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const << "status #3"; errorsInEvent = true; errorcheck.conversionError(fedId, &converter, 3, ww, errors); + continue; } GlobalPixel global = rocp->toGlobal( LocalPixel(local) ); From cfc3e2cac36b1e5a9114e111ea5cd168369a55a8 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Sat, 11 Jan 2014 11:48:46 +0100 Subject: [PATCH 03/10] inline init, remove multiple storage of digis --- .../SiPixelObjects/interface/LocalPixel.h | 8 +++---- DataFormats/SiPixelDigi/interface/PixelDigi.h | 23 +++++++++++++++++- DataFormats/SiPixelDigi/src/PixelDigi.cc | 24 ------------------- .../interface/PixelDataFormatter.h | 5 +++- .../plugins/SiPixelRawToDigi.cc | 15 +++--------- .../src/PixelDataFormatter.cc | 16 ++++++++----- .../SiPixelRawToDigi/test/SiPixelRawDumper.cc | 4 ++-- .../SiPixelRawToDigi/test/findHotPixels.cc | 10 ++++---- 8 files changed, 51 insertions(+), 54 deletions(-) delete mode 100644 DataFormats/SiPixelDigi/src/PixelDigi.cc diff --git a/CondFormats/SiPixelObjects/interface/LocalPixel.h b/CondFormats/SiPixelObjects/interface/LocalPixel.h index 6e069f3b300b5..bf14b50a00576 100644 --- a/CondFormats/SiPixelObjects/interface/LocalPixel.h +++ b/CondFormats/SiPixelObjects/interface/LocalPixel.h @@ -14,19 +14,19 @@ namespace sipixelobjects { /// row and collumn in ROC representation struct RocRowCol { int rocRow, rocCol; - bool valid() const { return 0 <= rocRow && rocRow < numRowsInRoc - && 0 <= rocCol && rocCol < numColsInRoc; } + bool valid() const { return (0 <= rocRow) & (rocRow < numRowsInRoc) + & (0 <= rocCol) & (rocCol < numColsInRoc); } }; /// double collumn and pixel ID in double collumn representation struct DcolPxid { int dcol, pxid; - bool valid() const { return (0 <= dcol && dcol < 26 && 2 <= pxid && pxid < 162 ); } + bool valid() const { return ( (0 <= dcol) & (dcol < 26) & (2 <= pxid) & (pxid < 162) ); } }; LocalPixel( const DcolPxid & pixel) { - thePixel.rocCol = pixel.dcol*2 + pixel.pxid%2; thePixel.rocRow = numRowsInRoc - pixel.pxid/2; + thePixel.rocCol = pixel.dcol*2 + pixel.pxid%2; } LocalPixel( const RocRowCol & pixel) : thePixel(pixel) {} diff --git a/DataFormats/SiPixelDigi/interface/PixelDigi.h b/DataFormats/SiPixelDigi/interface/PixelDigi.h index acd130d3c878f..90e4e5aec7152 100644 --- a/DataFormats/SiPixelDigi/interface/PixelDigi.h +++ b/DataFormats/SiPixelDigi/interface/PixelDigi.h @@ -4,6 +4,7 @@ // 25/06/06 - get rid of time(), change adc() from int to undigned short. d.k. #include +#include #include "DataFormats/SiPixelDetId/interface/PixelChannelIdentifier.h" /** @@ -29,7 +30,27 @@ class PixelDigi { PixelDigi() : theData(0) {} - void init( int row, int col, int adc); + void init( int row, int col, int adc) { +#ifdef FIXME_DEBUG + // This check is for the maximal row or col number that can be packed + // in a PixelDigi. The actual number of rows or columns in a detector + // may be smaller! + // it is done much better in Raw2Digi... + if ( row < 0 || row > PixelChannelIdentifier::thePacking.max_row || + col < 0 || col > PixelChannelIdentifier::thePacking.max_column) { + std::cout << "PixelDigi constructor: row or column out packing range " + << row << ' ' << col << std::endl; + } +#endif + + // Set adc to max_adc in case of overflow + adc = (adc > PixelChannelIdentifier::thePacking.max_adc) ? PixelChannelIdentifier::thePacking.max_adc : std::max(adc,0); + + theData = (row << PixelChannelIdentifier::thePacking.row_shift) | + (col << PixelChannelIdentifier::thePacking.column_shift) | + (adc << PixelChannelIdentifier::thePacking.adc_shift); + + } // Access to digi information int row() const {return (theData >> PixelChannelIdentifier::thePacking.row_shift) & PixelChannelIdentifier::thePacking.row_mask;} diff --git a/DataFormats/SiPixelDigi/src/PixelDigi.cc b/DataFormats/SiPixelDigi/src/PixelDigi.cc deleted file mode 100644 index f93acd76c76a8..0000000000000 --- a/DataFormats/SiPixelDigi/src/PixelDigi.cc +++ /dev/null @@ -1,24 +0,0 @@ -// Modify the pixel packing to make 100micron pixels possible. d.k. 2/02 -// -#include "DataFormats/SiPixelDigi/interface/PixelDigi.h" - -#include - -void PixelDigi::init( int row, int col, int adc) { - // This check is for the maximal row or col number that can be packed - // in a PixelDigi. The actual number of rows or columns in a detector - // may be smaller! - if ( row < 0 || row > PixelChannelIdentifier::thePacking.max_row || - col < 0 || col > PixelChannelIdentifier::thePacking.max_column) { - std::cout << "PixelDigi constructor: row or column out packing range " - << row << ' ' << col << std::endl; - } - - // Set adc to max_adc in case of overflow - adc = (adc > PixelChannelIdentifier::thePacking.max_adc) ? PixelChannelIdentifier::thePacking.max_adc : std::max(adc,0); - - theData = (row << PixelChannelIdentifier::thePacking.row_shift) | - (col << PixelChannelIdentifier::thePacking.column_shift) | - (adc << PixelChannelIdentifier::thePacking.adc_shift); -} - diff --git a/EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h b/EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h index 2b63529683a16..ecda7934ce6e2 100644 --- a/EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h +++ b/EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h @@ -33,6 +33,7 @@ #include "CondFormats/SiPixelObjects/interface/SiPixelFrameReverter.h" #include "DataFormats/SiPixelDigi/interface/PixelDigi.h" +#include "DataFormats/Common/interface/DetSetVector.h" #include "DataFormats/SiPixelRawData/interface/SiPixelRawDataError.h" #include "DataFormats/Common/interface/DetSetVector.h" #include "EventFilter/SiPixelRawToDigi/interface/ErrorChecker.h" @@ -52,6 +53,8 @@ class PixelDataFormatter { public: + typedef edm::DetSetVector Collection; + typedef std::map RawData; typedef std::vector DetDigis; typedef std::map Digis; @@ -72,7 +75,7 @@ class PixelDataFormatter { int nDigis() const { return theDigiCounter; } int nWords() const { return theWordCounter; } - void interpretRawData(bool& errorsInEvent, int fedId, const FEDRawData & data, Digis & digis, Errors & errors); + void interpretRawData(bool& errorsInEvent, int fedId, const FEDRawData & data, Collection & digis, Errors & errors); void formatRawData( unsigned int lvl1_ID, RawData & fedRawData, const Digis & digis); diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc index d4ff90d9c90e8..5ad51c99a8e0d 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc @@ -169,29 +169,20 @@ void SiPixelRawToDigi::produce( edm::Event& ev, LogDebug("SiPixelRawToDigi") << "region2unpack #modules (BPIX,EPIX,total): "<nBarrelModules()<<" "<nForwardModules()<<" "<nModules(); } - typedef std::vector::const_iterator IF; - for (IF aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { + for (auto aFed = fedIds.begin(); aFed != fedIds.end(); ++aFed) { int fedId = *aFed; if (regions_ && !regions_->mayUnpackFED(fedId)) continue; if(debug) LogDebug("SiPixelRawToDigi")<< " PRODUCE DIGI FOR FED: " << fedId << endl; - PixelDataFormatter::Digis digis; + PixelDataFormatter::Errors errors; //get event data for this fed const FEDRawData& fedRawData = buffers->FEDData( fedId ); //convert data to digi and strip off errors - formatter.interpretRawData( errorsInEvent, fedId, fedRawData, digis, errors); - - //pack digi into collection - typedef PixelDataFormatter::Digis::iterator ID; - for (ID it = digis.begin(); it != digis.end(); it++) { - uint32_t detid = it->first; - edm::DetSet& detSet = collection->find_or_insert(detid); - detSet.data.insert(detSet.data.end(), it->second.begin(), it->second.end()); - } + formatter.interpretRawData( errorsInEvent, fedId, fedRawData, *collection, errors); //pack errors into collection if(includeErrors) { diff --git a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc index 3d6477ccc0fe9..e856292858afa 100644 --- a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc +++ b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc @@ -86,7 +86,7 @@ void PixelDataFormatter::passFrameReverter(const SiPixelFrameReverter* reverter) theFrameReverter = reverter; } -void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const FEDRawData& rawData, Digis& digis, Errors& errors) +void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const FEDRawData& rawData, Collection & digis, Errors& errors) { using namespace sipixelobjects; @@ -129,7 +129,7 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const int roc = -1; PixelROC const * rocp=nullptr; bool skipROC=false; - DetDigis * detDigis=nullptr; + edm::DetSet * detDigis=nullptr; for (const Word64* word = header+1; word != trailer; word++) { if (debug) LogTrace("")<<"DATA: " << print(*word); @@ -153,15 +153,17 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const continue; } auto rawId = rocp->rawId(); + if (useQualityInfo&(nullptr!=badPixelInfo)) { short rocInDet = (short) rocp->idInDetUnit(); skipROC = badPixelInfo->IsRocBad(rawId, rocInDet); if (skipROC) continue; } - skipROC= modulesToUnpack && ( modulesToUnpack->find(rawId) == modulesToUnpack->end()); if (skipROC) continue; - detDigis = &digis[rawId]; + + detDigis = &digis.find_or_insert(rawId); + if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations } if (skipROC) continue; @@ -180,13 +182,15 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const } GlobalPixel global = rocp->toGlobal( LocalPixel(local) ); - (*detDigis).emplace_back(global.row, global.col, adc); + (*detDigis).data.emplace_back(global.row, global.col, adc); - if (debug) LogTrace("") << (*detDigis).back(); + if (debug) LogTrace("") << (*detDigis).data.back(); } } } + + void PixelDataFormatter::formatRawData(unsigned int lvl1_ID, RawData & fedRawData, const Digis & digis) { std::map > words; diff --git a/EventFilter/SiPixelRawToDigi/test/SiPixelRawDumper.cc b/EventFilter/SiPixelRawToDigi/test/SiPixelRawDumper.cc index 74f88d60bf80c..69f9c017835e2 100644 --- a/EventFilter/SiPixelRawToDigi/test/SiPixelRawDumper.cc +++ b/EventFilter/SiPixelRawToDigi/test/SiPixelRawDumper.cc @@ -1017,7 +1017,7 @@ void SiPixelRawDumper::analyze(const edm::Event& ev, const edm::EventSetup& es) //LogDebug("SiPixelRawDumper")<< " GET DATA FOR FED: " << fedId ; if(printHeaders) cout<<"Get data For FED = "< collection; PixelDataFormatter::Errors errors; //get event data for this fed @@ -1270,7 +1270,7 @@ void SiPixelRawDumper::analyze(const edm::Event& ev, const edm::EventSetup& es) countErrorsPerEvent2 += countErrorsInFed2; //convert data to digi (dummy for the moment) - formatter.interpretRawData( dummyErrorBool, fedId, rawData, digis, errors); + formatter.interpretRawData( dummyErrorBool, fedId, rawData, collection, errors); //cout<0) { diff --git a/EventFilter/SiPixelRawToDigi/test/findHotPixels.cc b/EventFilter/SiPixelRawToDigi/test/findHotPixels.cc index 81fb78292a398..c1cdfbd3c1eee 100644 --- a/EventFilter/SiPixelRawToDigi/test/findHotPixels.cc +++ b/EventFilter/SiPixelRawToDigi/test/findHotPixels.cc @@ -486,13 +486,15 @@ void findHotPixels::analyze(const edm::Event& ev, const edm::EventSetup& es) { countAllEvents++; if(printHeaders) cout<<" Event = "< collection; + + // Loop over FEDs for (int fedId = fedIds.first; fedId <= fedIds.second; fedId++) { LogDebug("findHotPixels")<< " GET DATA FOR FED: " << fedId ; if(printHeaders) cout<<" For FED = "<FEDData( fedId ); @@ -535,7 +537,7 @@ void findHotPixels::analyze(const edm::Event& ev, const edm::EventSetup& es) { countErrors += countErrorsInFed; //convert data to digi (dummy for the moment) - formatter.interpretRawData( dummyErrorBool, fedId, rawData, digis, errors); + formatter.interpretRawData( dummyErrorBool, fedId, rawData, collection, errors); //cout<0) { From 46ef1920fcb3fc3e3e5341f30c83bc6ee6c0ca38 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Sat, 11 Jan 2014 12:37:35 +0100 Subject: [PATCH 04/10] use hashmap --- .../SiPixelObjects/interface/SiPixelFedCablingTree.h | 4 ++-- .../SiPixelObjects/src/SiPixelFedCablingTree.cc | 12 ++++++------ .../SiPixelRawToDigi/src/PixelDataFormatter.cc | 12 +++++------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h b/CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h index 9b46d565927af..d3765f23a00b2 100644 --- a/CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h +++ b/CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h @@ -2,7 +2,7 @@ #define SiPixelFedCablingTree_H #include -#include +#include #include #include "CondFormats/SiPixelObjects/interface/SiPixelFedCabling.h" @@ -41,6 +41,6 @@ class SiPixelFedCablingTree : public SiPixelFedCabling { private: std::string theVersion; - std::map theFedCablings; + std::unordered_map theFedCablings; }; #endif diff --git a/CondFormats/SiPixelObjects/src/SiPixelFedCablingTree.cc b/CondFormats/SiPixelObjects/src/SiPixelFedCablingTree.cc index 531fed0d84db3..3d84b9c81b2e8 100644 --- a/CondFormats/SiPixelObjects/src/SiPixelFedCablingTree.cc +++ b/CondFormats/SiPixelObjects/src/SiPixelFedCablingTree.cc @@ -1,18 +1,18 @@ #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include #include #include using namespace std; using namespace sipixelobjects; -typedef std::map::const_iterator IMAP; +typedef std::unordered_map::const_iterator IMAP; std::vector SiPixelFedCablingTree::pathToDetUnit( uint32_t rawDetId) const { std::vector result; - typedef std::map::const_iterator IM; - for (IM im = theFedCablings.begin(); im != theFedCablings.end(); ++im) { + for (auto im = theFedCablings.begin(); im != theFedCablings.end(); ++im) { const PixelFEDCabling & aFed = im->second; for (unsigned int idxLink = 1; idxLink <= aFed.numberOfLinks(); idxLink++) { const PixelFEDLink * link = aFed.link(idxLink); @@ -38,7 +38,7 @@ void SiPixelFedCablingTree::addFed(const PixelFEDCabling & f) const PixelFEDCabling * SiPixelFedCablingTree::fed(unsigned int id) const { - IMAP it = theFedCablings.find(id); + auto it = theFedCablings.find(id); return ( it == theFedCablings.end() ) ? 0 : & (*it).second; } @@ -61,6 +61,7 @@ std::vector SiPixelFedCablingTree::fedList() const for (IMAP im = theFedCablings.begin(); im != theFedCablings.end(); im++) { result.push_back( &(im->second) ); } + std::sort(result.begin(),result.end(),[](const PixelFEDCabling * a,const PixelFEDCabling * b){return a->id()id();}); return result; } @@ -87,8 +88,7 @@ const sipixelobjects::PixelROC* SiPixelFedCablingTree::findItem( int SiPixelFedCablingTree::checkNumbering() const { int status = 0; - for (std::map::const_iterator im = theFedCablings.begin(); - im != theFedCablings.end(); ++im) { + for (auto im = theFedCablings.begin(); im != theFedCablings.end(); ++im) { if (im->first != static_cast( im->second.id())) { status = 1; std::cout << "PROBLEM WITH FED ID!!" << im->first <<" vs: "<< im->second.id() << std::endl; diff --git a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc index e856292858afa..42007417ae538 100644 --- a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc +++ b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc @@ -90,8 +90,6 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const { using namespace sipixelobjects; - debug = edm::MessageDrop::instance()->debugEnabled; - int nWords = rawData.size()/sizeof(Word64); if (nWords==0) return; @@ -106,7 +104,7 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const bool moreHeaders = true; while (moreHeaders) { header++; - if (debug) LogTrace("")<<"HEADER: " << print(*header); + LogTrace("")<<"HEADER: " << print(*header); bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors); moreHeaders = headerStatus; } @@ -116,14 +114,14 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const trailer++; while (moreTrailers) { trailer--; - if (debug) LogTrace("")<<"TRAILER: " << print(*trailer); + LogTrace("")<<"TRAILER: " << print(*trailer); bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors); moreTrailers = trailerStatus; } // data words theWordCounter += 2*(nWords-2); - if (debug) LogTrace("")<<"data words: "<< (trailer-header-1); + LogTrace("")<<"data words: "<< (trailer-header-1); int link = -1; int roc = -1; @@ -131,7 +129,7 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const bool skipROC=false; edm::DetSet * detDigis=nullptr; for (const Word64* word = header+1; word != trailer; word++) { - if (debug) LogTrace("")<<"DATA: " << print(*word); + LogTrace("")<<"DATA: " << print(*word); Word32 w[2] = { Word32(*word & WORD32_mask), Word32(*word >> 32 & WORD32_mask) }; @@ -184,7 +182,7 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const GlobalPixel global = rocp->toGlobal( LocalPixel(local) ); (*detDigis).data.emplace_back(global.row, global.col, adc); - if (debug) LogTrace("") << (*detDigis).data.back(); + LogTrace("") << (*detDigis).data.back(); } } } From 0bb32590e430adf23f05248a0eff5eaf757d7f29 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Sat, 11 Jan 2014 15:52:13 +0100 Subject: [PATCH 05/10] use emplace and =move --- DataFormats/Common/interface/DetSet.h | 2 +- DataFormats/Common/interface/DetSetVector.h | 7 +++++++ EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/DataFormats/Common/interface/DetSet.h b/DataFormats/Common/interface/DetSet.h index 24fbaa754059b..90e1e525d1185 100644 --- a/DataFormats/Common/interface/DetSet.h +++ b/DataFormats/Common/interface/DetSet.h @@ -51,7 +51,7 @@ namespace edm { DetSet & operator=(DetSet && rh) noexcept { id = rh.id; - data.swap(rh.data); + data = std::move(rh.data); return * this; } #endif diff --git a/DataFormats/Common/interface/DetSetVector.h b/DataFormats/Common/interface/DetSetVector.h index 25ee14e06b17a..4c49eeb341612 100644 --- a/DataFormats/Common/interface/DetSetVector.h +++ b/DataFormats/Common/interface/DetSetVector.h @@ -148,6 +148,9 @@ namespace edm { /// Return the number of contained DetSets size_type size() const; + // reserve... + void reserve(size_t s) { _sets.reserve(s);} + // Do we need a short-hand method to return the number of T // instances? If so, do we optimize for size (calculate on the // fly) or speed (keep a current cache)? @@ -262,7 +265,11 @@ namespace edm { // Insert the right thing, in the right place, and return a // reference to the newly inserted thing. +#if defined( __GXX_EXPERIMENTAL_CXX0X__) + return *(_sets.emplace(p.first, id)); +#else return *(_sets.insert(p.first, detset(id))); +#endif } template diff --git a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc index 5ad51c99a8e0d..004ff2d0b499f 100644 --- a/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc +++ b/EventFilter/SiPixelRawToDigi/plugins/SiPixelRawToDigi.cc @@ -149,6 +149,7 @@ void SiPixelRawToDigi::produce( edm::Event& ev, // create product (digis & errors) std::auto_ptr< edm::DetSetVector > collection( new edm::DetSetVector ); + // collection->reserve(8*1024); std::auto_ptr< edm::DetSetVector > errorcollection( new edm::DetSetVector ); std::auto_ptr< DetIdCollection > tkerror_detidcollection(new DetIdCollection()); std::auto_ptr< DetIdCollection > usererror_detidcollection(new DetIdCollection()); From 375bb27beb424862ef37e0137d6e80f478bb19e5 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Sat, 11 Jan 2014 17:03:58 +0100 Subject: [PATCH 06/10] fetch fed once --- .../interface/SiPixelFedCablingTree.h | 8 +++++--- .../interface/SiPixelFrameConverter.h | 11 ++++++++++- .../SiPixelObjects/src/SiPixelFedCablingTree.cc | 14 +++++++++++++- .../SiPixelObjects/src/SiPixelFrameConverter.cc | 11 ++++++----- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h b/CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h index d3765f23a00b2..c6a6d18184096 100644 --- a/CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h +++ b/CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h @@ -8,7 +8,7 @@ #include "CondFormats/SiPixelObjects/interface/SiPixelFedCabling.h" #include "CondFormats/SiPixelObjects/interface/PixelFEDCabling.h" -class SiPixelFedCablingTree : public SiPixelFedCabling { +class SiPixelFedCablingTree final : public SiPixelFedCabling { public: typedef sipixelobjects::PixelFEDCabling PixelFEDCabling; @@ -34,8 +34,10 @@ class SiPixelFedCablingTree : public SiPixelFedCabling { virtual std::vector pathToDetUnit(uint32_t rawDetId) const; - virtual const sipixelobjects::PixelROC* findItem( - const sipixelobjects::CablingPathToDetUnit & path) const; + virtual const sipixelobjects::PixelROC* findItem(const sipixelobjects::CablingPathToDetUnit & path) const; + + const sipixelobjects::PixelROC* findItemInFed(const sipixelobjects::CablingPathToDetUnit & path, + const PixelFEDCabling * aFed) const; int checkNumbering() const; diff --git a/CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h b/CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h index 688f68858ee99..3ef155c1edc3d 100644 --- a/CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h +++ b/CondFormats/SiPixelObjects/interface/SiPixelFrameConverter.h @@ -6,13 +6,21 @@ #include "CondFormats/SiPixelObjects/interface/ElectronicIndex.h" #include "CondFormats/SiPixelObjects/interface/DetectorIndex.h" #include "CondFormats/SiPixelObjects/interface/SiPixelFedCabling.h" +#include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h" +#include "CondFormats/SiPixelObjects/interface/PixelFEDCabling.h" #include "CondFormats/SiPixelObjects/interface/PixelROC.h" +#include "FWCore/Utilities/interface/GCC11Compatibility.h" + #include class SiPixelFrameConverter { public: + typedef sipixelobjects::PixelFEDCabling PixelFEDCabling; + + // using PixelFEDCabling = sipixelobjects::PixelFEDCabling; + SiPixelFrameConverter(const SiPixelFedCabling* map, int fedId); bool hasDetUnit(uint32_t radId) const; @@ -42,9 +50,10 @@ class SiPixelFrameConverter { const sipixelobjects::DetectorIndex & detector) const; private: - int theFedId; const SiPixelFedCabling* theMap; + SiPixelFedCablingTree const * theTree; + const PixelFEDCabling * theFed; }; #endif diff --git a/CondFormats/SiPixelObjects/src/SiPixelFedCablingTree.cc b/CondFormats/SiPixelObjects/src/SiPixelFedCablingTree.cc index 3d84b9c81b2e8..1159b928095c8 100644 --- a/CondFormats/SiPixelObjects/src/SiPixelFedCablingTree.cc +++ b/CondFormats/SiPixelObjects/src/SiPixelFedCablingTree.cc @@ -74,7 +74,7 @@ void SiPixelFedCablingTree::addItem(unsigned int fedId, unsigned int linkId, con } const sipixelobjects::PixelROC* SiPixelFedCablingTree::findItem( - const CablingPathToDetUnit & path) const + const CablingPathToDetUnit & path) const { const PixelROC* roc = 0; const PixelFEDCabling * aFed = fed(path.fed); @@ -85,6 +85,18 @@ const sipixelobjects::PixelROC* SiPixelFedCablingTree::findItem( return roc; } + +const sipixelobjects::PixelROC* SiPixelFedCablingTree::findItemInFed( + const CablingPathToDetUnit & path, + const PixelFEDCabling * aFed) const +{ + const PixelROC* roc = 0; + const PixelFEDLink * aLink = aFed->link(path.link); + if (aLink) roc = aLink->roc(path.roc); + return roc; +} + + int SiPixelFedCablingTree::checkNumbering() const { int status = 0; diff --git a/CondFormats/SiPixelObjects/src/SiPixelFrameConverter.cc b/CondFormats/SiPixelObjects/src/SiPixelFrameConverter.cc index 49fb1ce9985de..d77e5a82cfa29 100644 --- a/CondFormats/SiPixelObjects/src/SiPixelFrameConverter.cc +++ b/CondFormats/SiPixelObjects/src/SiPixelFrameConverter.cc @@ -12,9 +12,10 @@ using namespace std; using namespace sipixelobjects; SiPixelFrameConverter::SiPixelFrameConverter(const SiPixelFedCabling* map, int fedId) - : theFedId(fedId), theMap(map) -{ } - + : theFedId(fedId), theMap(map), + theTree(dynamic_cast(map)), + theFed(theTree ? theTree->fed(fedId) : nullptr) +{} bool SiPixelFrameConverter::hasDetUnit(uint32_t rawId) const { @@ -31,8 +32,8 @@ PixelROC const * SiPixelFrameConverter::toRoc(int link, int roc) const { CablingPathToDetUnit path = {static_cast(theFedId), static_cast(link), static_cast(roc)}; - const PixelROC * rocp = theMap->findItem(path); - if (!rocp){ + const PixelROC * rocp = (theFed) ? theTree->findItemInFed(path, theFed) : theMap->findItem(path); + if unlikely(!rocp){ stringstream stm; stm << "Map shows no fed="< Date: Sat, 11 Jan 2014 18:00:02 +0100 Subject: [PATCH 08/10] removed another bunch of global variables --- .../src/PixelDataFormatter.cc | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc index b652cacb8bf50..a0d2b13f8ecc3 100644 --- a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc +++ b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc @@ -22,27 +22,27 @@ using namespace std; using namespace edm; using namespace sipixelobjects; - -const int LINK_bits = 6; -const int ROC_bits = 5; -const int DCOL_bits = 5; -const int PXID_bits = 8; -const int ADC_bits = 8; - -const int ADC_shift = 0; -const int PXID_shift = ADC_shift + ADC_bits; -const int DCOL_shift = PXID_shift + PXID_bits; -const int ROC_shift = DCOL_shift + DCOL_bits; -const int LINK_shift = ROC_shift + ROC_bits; - -const PixelDataFormatter::Word32 LINK_mask = ~(~PixelDataFormatter::Word32(0) << LINK_bits); -const PixelDataFormatter::Word32 ROC_mask = ~(~PixelDataFormatter::Word32(0) << ROC_bits); -const PixelDataFormatter::Word32 DCOL_mask = ~(~PixelDataFormatter::Word32(0) << DCOL_bits); -const PixelDataFormatter::Word32 PXID_mask = ~(~PixelDataFormatter::Word32(0) << PXID_bits); -const PixelDataFormatter::Word32 ADC_mask = ~(~PixelDataFormatter::Word32(0) << ADC_bits); - -const PixelDataFormatter::Word64 WORD32_mask = 0xffffffff; - +namespace { + constexpr int LINK_bits = 6; + constexpr int ROC_bits = 5; + constexpr int DCOL_bits = 5; + constexpr int PXID_bits = 8; + constexpr int ADC_bits = 8; + + constexpr int ADC_shift = 0; + constexpr int PXID_shift = ADC_shift + ADC_bits; + constexpr int DCOL_shift = PXID_shift + PXID_bits; + constexpr int ROC_shift = DCOL_shift + DCOL_bits; + constexpr int LINK_shift = ROC_shift + ROC_bits; + + constexpr PixelDataFormatter::Word32 LINK_mask = ~(~PixelDataFormatter::Word32(0) << LINK_bits); + constexpr PixelDataFormatter::Word32 ROC_mask = ~(~PixelDataFormatter::Word32(0) << ROC_bits); + constexpr PixelDataFormatter::Word32 DCOL_mask = ~(~PixelDataFormatter::Word32(0) << DCOL_bits); + constexpr PixelDataFormatter::Word32 PXID_mask = ~(~PixelDataFormatter::Word32(0) << PXID_bits); + constexpr PixelDataFormatter::Word32 ADC_mask = ~(~PixelDataFormatter::Word32(0) << ADC_bits); + + constexpr PixelDataFormatter::Word64 WORD32_mask = 0xffffffff; +} PixelDataFormatter::PixelDataFormatter( const SiPixelFedCabling* map) : theDigiCounter(0), theWordCounter(0), theCablingTree(map), badPixelInfo(0), modulesToUnpack(0) From 54b3ebf393dd9d34a0bbc40ae22f1417aada3f3a Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Sun, 12 Jan 2014 17:55:12 +0100 Subject: [PATCH 09/10] made PixelRoc thread safe. it is also faster now --- CondCore/SiPixelPlugins/src/plugin.cc | 5 +- .../interface/FrameConversion.h | 3 +- .../SiPixelObjects/interface/PixelROC.h | 23 ++-- .../interface/SiPixelFedCablingMap.h | 2 + CondFormats/SiPixelObjects/src/PixelROC.cc | 40 +----- .../src/SiPixelFedCablingMap.cc | 10 ++ .../src/PixelDataFormatter.cc | 115 ++++++++++-------- 7 files changed, 95 insertions(+), 103 deletions(-) diff --git a/CondCore/SiPixelPlugins/src/plugin.cc b/CondCore/SiPixelPlugins/src/plugin.cc index 8a1c6fe39c5f2..6a37b6a588803 100644 --- a/CondCore/SiPixelPlugins/src/plugin.cc +++ b/CondCore/SiPixelPlugins/src/plugin.cc @@ -31,8 +31,11 @@ #include "CondFormats/DataRecord/interface/SiPixelGainCalibrationForHLTSimRcd.h" #include "CondFormats/DataRecord/interface/SiPixelLorentzAngleSimRcd.h" +namespace { + struct InitRocs {void operator()(SiPixelFedCablingMap& m){ m.initializeRocs();}}; +} -REGISTER_PLUGIN(SiPixelFedCablingMapRcd,SiPixelFedCablingMap); +REGISTER_PLUGIN_INIT(SiPixelFedCablingMapRcd,SiPixelFedCablingMap, InitRocs); REGISTER_PLUGIN(SiPixelGainCalibrationRcd,SiPixelGainCalibration); REGISTER_PLUGIN(SiPixelGainCalibrationForHLTRcd,SiPixelGainCalibrationForHLT); REGISTER_PLUGIN(SiPixelGainCalibrationOfflineRcd,SiPixelGainCalibrationOffline); diff --git a/CondFormats/SiPixelObjects/interface/FrameConversion.h b/CondFormats/SiPixelObjects/interface/FrameConversion.h index 7637f295b9ceb..7ca6ed3ef8ba6 100644 --- a/CondFormats/SiPixelObjects/interface/FrameConversion.h +++ b/CondFormats/SiPixelObjects/interface/FrameConversion.h @@ -11,14 +11,13 @@ namespace sipixelobjects { class FrameConversion { public: + FrameConversion(){} FrameConversion( const PixelEndcapName & name, int rocIdInDetUnit); FrameConversion( const PixelBarrelName & name, int rocIdInDetUnit); FrameConversion( int rowOffset, int rowSlopeSign, int colOffset, int colSlopeSign) : theRowConversion( LinearConversion(rowOffset,rowSlopeSign) ), theCollumnConversion( LinearConversion(colOffset, colSlopeSign) ) {} - FrameConversion * clone() const { return new FrameConversion(*this); } - const sipixelobjects::LinearConversion & row() const { return theRowConversion; } const sipixelobjects::LinearConversion & collumn() const { return theCollumnConversion;} diff --git a/CondFormats/SiPixelObjects/interface/PixelROC.h b/CondFormats/SiPixelObjects/interface/PixelROC.h index 23f74949cf726..8c644f795ac9c 100644 --- a/CondFormats/SiPixelObjects/interface/PixelROC.h +++ b/CondFormats/SiPixelObjects/interface/PixelROC.h @@ -22,14 +22,8 @@ class PixelROC { public: /// dummy - PixelROC() : theDetUnit(0), theIdDU(0), theIdLk(0), theFrameConverter(0) {} + PixelROC() : theDetUnit(0), theIdDU(0), theIdLk(0) {} - ~PixelROC(); - - PixelROC(const PixelROC & o); - const PixelROC& operator=(const PixelROC&); - - void swap(PixelROC&); /// ctor with DetUnit id, /// ROC number in DU (given by token passage), @@ -49,9 +43,8 @@ class PixelROC { /// If GlobalPixel is outside ROC the resulting LocalPixel is not inside ROC. /// (call to inside(..) recommended) LocalPixel toLocal(const GlobalPixel & glo) const { - if (!theFrameConverter) initFrameConversion(); - int rocRow = theFrameConverter->row().inverse(glo.row); - int rocCol = theFrameConverter->collumn().inverse(glo.col); + int rocRow = theFrameConverter.row().inverse(glo.row); + int rocCol = theFrameConverter.collumn().inverse(glo.col); LocalPixel::RocRowCol rocRowCol = {rocRow, rocCol}; return LocalPixel(rocRowCol); @@ -61,23 +54,21 @@ class PixelROC { /// converts LocalPixel in ROC to DU coordinates. /// LocalPixel must be inside ROC. Otherwise result is meaningless GlobalPixel toGlobal(const LocalPixel & loc) const { - if (!theFrameConverter) initFrameConversion(); GlobalPixel result; - result.col = theFrameConverter->collumn().convert(loc.rocCol()); - result.row = theFrameConverter->row().convert(loc.rocRow()); + result.col = theFrameConverter.collumn().convert(loc.rocCol()); + result.row = theFrameConverter.row().convert(loc.rocRow()); return result; } /// printout for debug std::string print(int depth = 0) const; -private: - void initFrameConversion() const; + void initFrameConversion(); private: uint32_t theDetUnit; unsigned int theIdDU, theIdLk; - mutable const FrameConversion * theFrameConverter; + FrameConversion theFrameConverter; }; diff --git a/CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h b/CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h index 0a27ac64548c1..dbb9e6a8d184a 100644 --- a/CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h +++ b/CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h @@ -17,6 +17,8 @@ class SiPixelFedCablingMap : public SiPixelFedCabling { SiPixelFedCablingMap(const std::string & version="") : theVersion(version) {} + void initializeRocs(); + virtual ~SiPixelFedCablingMap() {} SiPixelFedCablingTree * cablingTree() const; diff --git a/CondFormats/SiPixelObjects/src/PixelROC.cc b/CondFormats/SiPixelObjects/src/PixelROC.cc index a40f944a26be8..79fdebb49af8f 100644 --- a/CondFormats/SiPixelObjects/src/PixelROC.cc +++ b/CondFormats/SiPixelObjects/src/PixelROC.cc @@ -10,52 +10,22 @@ using namespace std; using namespace sipixelobjects; PixelROC::PixelROC(uint32_t du, int idDU, int idLk) - : theDetUnit(du), theIdDU(idDU), theIdLk(idLk), theFrameConverter(0) -{} + : theDetUnit(du), theIdDU(idDU), theIdLk(idLk) +{initFrameConversion();} -PixelROC::PixelROC(const PixelROC & o) - : theDetUnit(o.theDetUnit), theIdDU(o.theIdDU), theIdLk(o.theIdLk),theFrameConverter(0) -{ - if(o.theFrameConverter) theFrameConverter = o.theFrameConverter->clone(); -} - -PixelROC::~PixelROC() -{ - delete theFrameConverter; -} - -const PixelROC& -PixelROC::operator=(const PixelROC& iRHS) -{ - PixelROC temp(iRHS); - this->swap(temp); - return *this; -} - -void -PixelROC::swap(PixelROC& iOther) -{ - std::swap(theDetUnit,iOther.theDetUnit); - std::swap(theIdDU,iOther.theIdDU); - std::swap(theIdLk,iOther.theIdLk); - std::swap(theFrameConverter,iOther.theFrameConverter); -} - - -void PixelROC::initFrameConversion() const +void PixelROC::initFrameConversion() { if ( PixelModuleName::isBarrel(theDetUnit) ) { PixelBarrelName barrelName(theDetUnit); - theFrameConverter = new FrameConversion(barrelName, theIdDU); + theFrameConverter = FrameConversion(barrelName, theIdDU); } else { PixelEndcapName endcapName(theDetUnit); - theFrameConverter = new FrameConversion(endcapName, theIdDU); + theFrameConverter = FrameConversion(endcapName, theIdDU); } } string PixelROC::print(int depth) const { - if (!theFrameConverter) initFrameConversion(); ostringstream out; bool barrel = PixelModuleName::isBarrel(theDetUnit); diff --git a/CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc b/CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc index 8e043c349be3f..7ff01dd8647e9 100644 --- a/CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc +++ b/CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc @@ -5,8 +5,18 @@ #include #include +#include + using namespace sipixelobjects; + +void SiPixelFedCablingMap::initializeRocs() { + std::cout << "initialize PixelRocs" << std::endl; + for (auto & v : theMap) v.second.initFrameConversion(); + +} + + bool SiPixelFedCablingMap::Key::operator < (const Key & other) const { if (fed < other.fed) return true; diff --git a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc index a0d2b13f8ecc3..7c48165b480ad 100644 --- a/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc +++ b/EventFilter/SiPixelRawToDigi/src/PixelDataFormatter.cc @@ -128,65 +128,82 @@ void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const PixelROC const * rocp=nullptr; bool skipROC=false; edm::DetSet * detDigis=nullptr; - for (const Word64* word = header+1; word != trailer; word++) { - LogTrace("")<<"DATA: " << print(*word); - Word32 w[2] = { Word32(*word & WORD32_mask), Word32(*word >> 32 & WORD32_mask) }; - - for (int i=0; i<2; ++i) { - auto ww = w[i]; - if (ww==0) { theWordCounter--; continue;} - int nlink = (ww >> LINK_shift) & LINK_mask; - int nroc = (ww >> ROC_shift) & ROC_mask; - - if ( (nlink!=link) | (nroc!=roc) ) { // new roc - link = nlink; roc=nroc; - skipROC = likely(roc<25) ? false : !errorcheck.checkROC(errorsInEvent, fedId, &converter, ww, errors); - if (skipROC) continue; - rocp = converter.toRoc(link,roc); - if (!rocp) { - errorsInEvent = true; - errorcheck.conversionError(fedId, &converter, 2, ww, errors); - skipROC=true; - continue; - } - auto rawId = rocp->rawId(); - - if (useQualityInfo&(nullptr!=badPixelInfo)) { - short rocInDet = (short) rocp->idInDetUnit(); - skipROC = badPixelInfo->IsRocBad(rawId, rocInDet); - if (skipROC) continue; - } - skipROC= modulesToUnpack && ( modulesToUnpack->find(rawId) == modulesToUnpack->end()); - if (skipROC) continue; - - detDigis = &digis.find_or_insert(rawId); - if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations - } + const Word32 * bw =(const Word32 *)(header+1); + const Word32 * ew =(const Word32 *)(trailer); + if ( *(ew-1) == 0 ) { ew--; theWordCounter--;} + for (auto word = bw; word < ew; ++word) { + LogTrace("")<<"DATA: " << print(*word); + + auto ww = *word; + //assert(ww==0); + if unlikely(ww==0) { theWordCounter--; continue;} + int nlink = (ww >> LINK_shift) & LINK_mask; + int nroc = (ww >> ROC_shift) & ROC_mask; + + if ( (nlink!=link) | (nroc!=roc) ) { // new roc + link = nlink; roc=nroc; + skipROC = likely(roc<25) ? false : !errorcheck.checkROC(errorsInEvent, fedId, &converter, ww, errors); if (skipROC) continue; - - - int dcol = (ww >> DCOL_shift) & DCOL_mask; - int pxid = (ww >> PXID_shift) & PXID_mask; - int adc = (ww >> ADC_shift) & ADC_mask; - - LocalPixel::DcolPxid local = { dcol, pxid }; - if (!local.valid()) { - LogDebug("PixelDataFormatter::interpretRawData") - << "status #3"; + rocp = converter.toRoc(link,roc); + if unlikely(!rocp) { errorsInEvent = true; - errorcheck.conversionError(fedId, &converter, 3, ww, errors); + errorcheck.conversionError(fedId, &converter, 2, ww, errors); + skipROC=true; continue; } - - GlobalPixel global = rocp->toGlobal( LocalPixel(local) ); - (*detDigis).data.emplace_back(global.row, global.col, adc); + auto rawId = rocp->rawId(); + + if (useQualityInfo&(nullptr!=badPixelInfo)) { + short rocInDet = (short) rocp->idInDetUnit(); + skipROC = badPixelInfo->IsRocBad(rawId, rocInDet); + if (skipROC) continue; + } + skipROC= modulesToUnpack && ( modulesToUnpack->find(rawId) == modulesToUnpack->end()); + if (skipROC) continue; - LogTrace("") << (*detDigis).data.back(); + detDigis = &digis.find_or_insert(rawId); + if ( (*detDigis).empty() ) (*detDigis).data.reserve(32); // avoid the first relocations } + if unlikely(skipROC) continue; + + + int dcol = (ww >> DCOL_shift) & DCOL_mask; + int pxid = (ww >> PXID_shift) & PXID_mask; + int adc = (ww >> ADC_shift) & ADC_mask; + + LocalPixel::DcolPxid local = { dcol, pxid }; + if unlikely(!local.valid()) { + LogDebug("PixelDataFormatter::interpretRawData") + << "status #3"; + errorsInEvent = true; + errorcheck.conversionError(fedId, &converter, 3, ww, errors); + continue; + } + + GlobalPixel global = rocp->toGlobal( LocalPixel(local) ); + (*detDigis).data.emplace_back(global.row, global.col, adc); + + LogTrace("") << (*detDigis).data.back(); } + } +void doVectorize(int const * __restrict__ w, int * __restrict__ row, int * __restrict__ col, int * __restrict__ valid, int N, PixelROC const * rocp) { + for (int i=0; i> DCOL_shift) & DCOL_mask; + int pxid = (ww >> PXID_shift) & PXID_mask; + // int adc = (ww >> ADC_shift) & ADC_mask; + + LocalPixel::DcolPxid local = { dcol, pxid }; + valid[i] = local.valid(); + GlobalPixel global = rocp->toGlobal( LocalPixel(local) ); + row[i]=global.row; col[i]=global.col; + + } + +} void PixelDataFormatter::formatRawData(unsigned int lvl1_ID, RawData & fedRawData, const Digis & digis) From fea469328a5c9c1b8520bbc3522ceb1c0df88300 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Mon, 13 Jan 2014 13:57:15 +0100 Subject: [PATCH 10/10] remove cout --- CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc b/CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc index 7ff01dd8647e9..512b52c4fefb1 100644 --- a/CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc +++ b/CondFormats/SiPixelObjects/src/SiPixelFedCablingMap.cc @@ -11,7 +11,7 @@ using namespace sipixelobjects; void SiPixelFedCablingMap::initializeRocs() { - std::cout << "initialize PixelRocs" << std::endl; + // std::cout << "initialize PixelRocs" << std::endl; for (auto & v : theMap) v.second.initFrameConversion(); }