From 7501aa93768708ee33ef07a259f177e482d83e4e Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Tue, 29 Nov 2016 16:42:18 +0100 Subject: [PATCH 1/5] inline Phase2TrackerClusterizer --- .../SiPhase2Clusterizer/BuildFile.xml | 14 --- .../Phase2TrackerClusterizerAlgorithm.h | 34 ------- .../interface/Phase2TrackerClusterizerArray.h | 29 ------ .../SiPhase2Clusterizer/plugins/BuildFile.xml | 2 +- .../plugins/Phase2TrackerClusterizer.cc | 2 +- .../Phase2TrackerClusterizerAlgorithm.cc | 4 +- .../plugins/Phase2TrackerClusterizerArray.cc | 88 ------------------- 7 files changed, 4 insertions(+), 169 deletions(-) delete mode 100644 RecoLocalTracker/SiPhase2Clusterizer/BuildFile.xml delete mode 100644 RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerAlgorithm.h delete mode 100644 RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerArray.h delete mode 100644 RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerArray.cc diff --git a/RecoLocalTracker/SiPhase2Clusterizer/BuildFile.xml b/RecoLocalTracker/SiPhase2Clusterizer/BuildFile.xml deleted file mode 100644 index 69cf6199f4706..0000000000000 --- a/RecoLocalTracker/SiPhase2Clusterizer/BuildFile.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerAlgorithm.h b/RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerAlgorithm.h deleted file mode 100644 index 7f1e229330913..0000000000000 --- a/RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerAlgorithm.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerAlgorithm_h -#define RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerAlgorithm_h - -#include "DataFormats/Common/interface/DetSetVector.h" -#include "DataFormats/Common/interface/DetSetVectorNew.h" -#include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h" -#include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h" - -#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" - -#include "RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerArray.h" - -class Phase2TrackerClusterizerAlgorithm { - - public: - - Phase2TrackerClusterizerAlgorithm(unsigned int, unsigned int); - void setup(const PixelGeomDetUnit*); - void clusterizeDetUnit(const edm::DetSet< Phase2TrackerDigi >&, Phase2TrackerCluster1DCollectionNew::FastFiller&); - - private: - - void fillMatrix(edm::DetSet< Phase2TrackerDigi >::const_iterator, edm::DetSet< Phase2TrackerDigi >::const_iterator); - void clearMatrix(edm::DetSet< Phase2TrackerDigi >::const_iterator, edm::DetSet< Phase2TrackerDigi >::const_iterator); - - Phase2TrackerClusterizerArray matrix_; - unsigned int maxClusterSize_; - unsigned int maxNumberClusters_; - unsigned int nrows_; - unsigned int ncols_; - -}; - -#endif diff --git a/RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerArray.h b/RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerArray.h deleted file mode 100644 index 22032264edb26..0000000000000 --- a/RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerArray.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerArray_h -#define RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerArray_h - -#include - -class Phase2TrackerClusterizerArray { - - public: - - Phase2TrackerClusterizerArray(); - Phase2TrackerClusterizerArray(unsigned int, unsigned int); - void setSize(unsigned int, unsigned int); - int operator()(unsigned int, unsigned int) const; - unsigned int rows() const; - unsigned int columns() const; - bool inside(unsigned int, unsigned int) const; - void set(unsigned int, unsigned int, bool, bool); - unsigned int size() const; - unsigned int index(unsigned int, unsigned int) const; - - private: - - unsigned int nrows_, ncols_; - std::vector< bool > matrix_; - std::vector< bool > hipmatrix_; - -}; - -#endif diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/BuildFile.xml b/RecoLocalTracker/SiPhase2Clusterizer/plugins/BuildFile.xml index 62f00a969f2e7..15a90b879602e 100644 --- a/RecoLocalTracker/SiPhase2Clusterizer/plugins/BuildFile.xml +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/BuildFile.xml @@ -1,4 +1,4 @@ - + diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc index a6b19856cc5f8..c111d303a07c0 100644 --- a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc @@ -9,7 +9,7 @@ #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/Framework/interface/ESHandle.h" -#include "RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerAlgorithm.h" +#include "Phase2TrackerClusterizerAlgorithm.h" #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h" #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.cc b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.cc index d3e7dc10647dc..bfe8ab4687c36 100644 --- a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.cc +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.cc @@ -1,4 +1,4 @@ -#include "RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerAlgorithm.h" +#include "Phase2TrackerClusterizerAlgorithm.h" #include "Geometry/CommonTopologies/interface/PixelTopology.h" @@ -16,7 +16,7 @@ void Phase2TrackerClusterizerAlgorithm::setup(const PixelGeomDetUnit* pixDet) { const PixelTopology& topol(pixDet->specificTopology()); nrows_ = topol.nrows(); ncols_ = topol.ncolumns(); - matrix_.setSize(nrows_, ncols_); + matrix_ = decltype(matrix_)(nrows_, ncols_); } /* diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerArray.cc b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerArray.cc deleted file mode 100644 index b447da877cba8..0000000000000 --- a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerArray.cc +++ /dev/null @@ -1,88 +0,0 @@ -#include "RecoLocalTracker/SiPhase2Clusterizer/interface/Phase2TrackerClusterizerArray.h" - -/* - * Create a new Array of hits - */ - -Phase2TrackerClusterizerArray::Phase2TrackerClusterizerArray() : nrows_(0), ncols_(0) { } - -Phase2TrackerClusterizerArray::Phase2TrackerClusterizerArray(unsigned int nrows, unsigned int ncols) { - setSize(nrows, ncols); -} - -/* - * Resize the Array and clear the values - */ - -void Phase2TrackerClusterizerArray::setSize(unsigned int nrows, unsigned int ncols) { - nrows_ = nrows; - ncols_ = ncols; - matrix_.resize(nrows * ncols); - hipmatrix_.resize(nrows * ncols); - for (std::vector< bool >::iterator it(matrix_.begin()); it != matrix_.end(); ++it) *it = false; - for (std::vector< bool >::iterator it(hipmatrix_.begin()); it != hipmatrix_.end(); ++it) *it = false; -} - -/* - * Return the value of an element in the Array - */ - -int Phase2TrackerClusterizerArray::operator()(unsigned int row, unsigned int col) const { - if (inside(row, col)) { - if (matrix_[index(row, col)]) { - if (hipmatrix_[index(row, col)]) return 2; - else return 1; - } else return 0; - } - else return 0; -} - -/* - * Return the number of rows - */ - -unsigned int Phase2TrackerClusterizerArray::rows() const { - return nrows_; -} - -/* - * Return the number of columns - */ - -unsigned int Phase2TrackerClusterizerArray::columns() const { - return ncols_; -} - -/* - * Tell if an element is inside the array or not - */ - -bool Phase2TrackerClusterizerArray::inside(unsigned int row, unsigned int col) const { - return (row < nrows_ && col < ncols_); -} - -/* - * Change the value of an element of the Array - */ - -void Phase2TrackerClusterizerArray::set(unsigned int row, unsigned int col, bool state, bool hip) { - matrix_[index(row, col)] = state; - hipmatrix_[index(row, col)] = hip; -} - -/* - * Return the size of the array - */ - -unsigned int Phase2TrackerClusterizerArray::size() const { - return matrix_.size(); -} - -/* - * Get the poisiton of an element of the Array in the vector that holds the data - */ - -unsigned int Phase2TrackerClusterizerArray::index(unsigned int row, unsigned int col) const { - return col * nrows_ + row; -} - From ae386e19dcb48d7b438885499af5734516ea52b5 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Tue, 29 Nov 2016 16:59:09 +0100 Subject: [PATCH 2/5] inline Phase2TrackerClusterizer and move in plugins --- .../Phase2TrackerClusterizerAlgorithm.h | 34 ++++++ .../plugins/Phase2TrackerClusterizerArray.h | 102 ++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.h create mode 100644 RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerArray.h diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.h b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.h new file mode 100644 index 0000000000000..be797238df9b1 --- /dev/null +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.h @@ -0,0 +1,34 @@ +#ifndef RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerAlgorithm_h +#define RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerAlgorithm_h + +#include "DataFormats/Common/interface/DetSetVector.h" +#include "DataFormats/Common/interface/DetSetVectorNew.h" +#include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h" +#include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h" + +#include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h" + +#include "Phase2TrackerClusterizerArray.h" + +class Phase2TrackerClusterizerAlgorithm { + + public: + + Phase2TrackerClusterizerAlgorithm(unsigned int, unsigned int); + void setup(const PixelGeomDetUnit*); + void clusterizeDetUnit(const edm::DetSet< Phase2TrackerDigi >&, Phase2TrackerCluster1DCollectionNew::FastFiller&); + + private: + + void fillMatrix(edm::DetSet< Phase2TrackerDigi >::const_iterator, edm::DetSet< Phase2TrackerDigi >::const_iterator); + void clearMatrix(edm::DetSet< Phase2TrackerDigi >::const_iterator, edm::DetSet< Phase2TrackerDigi >::const_iterator); + + Phase2TrackerClusterizerArray matrix_; + unsigned int maxClusterSize_; + unsigned int maxNumberClusters_; + unsigned int nrows_; + unsigned int ncols_; + +}; + +#endif diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerArray.h b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerArray.h new file mode 100644 index 0000000000000..f2197f6957c47 --- /dev/null +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerArray.h @@ -0,0 +1,102 @@ +#ifndef RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerArray_h +#define RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerArray_h + +#include + +class Phase2TrackerClusterizerArray { + + public: + + inline Phase2TrackerClusterizerArray(); + inline Phase2TrackerClusterizerArray(unsigned int, unsigned int); +// inline void setSize(unsigned int, unsigned int); + inline int operator()(unsigned int, unsigned int) const; + inline unsigned int rows() const; + inline unsigned int columns() const; + inline bool inside(unsigned int, unsigned int) const; + inline void set(unsigned int, unsigned int, bool, bool); + inline unsigned int size() const; + inline unsigned int index(unsigned int, unsigned int) const; + + private: + + unsigned int nrows_, ncols_; + std::vector< bool > matrix_; + std::vector< bool > hipmatrix_; + +}; + + +/* + * Create a new Array of hits + */ + +Phase2TrackerClusterizerArray::Phase2TrackerClusterizerArray() : nrows_(0), ncols_(0) { } + +Phase2TrackerClusterizerArray::Phase2TrackerClusterizerArray(unsigned int nrows, unsigned int ncols) : + nrows_(nrows), + ncols_(ncols), + matrix_(nrows * ncols,false), + hipmatrix_(nrows * ncols,false){} + + +/* + * Return the value of an element in the Array + */ + +int Phase2TrackerClusterizerArray::operator()(unsigned int row, unsigned int col) const { + if (!inside(row, col)) return 0; // FIXME this should go outside: avoid it + return matrix_[index(row, col)] ? + ( hipmatrix_[index(row, col)] ? 2 : 1 ) : 0; +} + +/* + * Return the number of rows + */ + +unsigned int Phase2TrackerClusterizerArray::rows() const { + return nrows_; +} + +/* + * Return the number of columns + */ + +unsigned int Phase2TrackerClusterizerArray::columns() const { + return ncols_; +} + +/* + * Tell if an element is inside the array or not + */ + +bool Phase2TrackerClusterizerArray::inside(unsigned int row, unsigned int col) const { + return ( (row < nrows_) & (col < ncols_) ); +} + +/* + * Change the value of an element of the Array + */ + +void Phase2TrackerClusterizerArray::set(unsigned int row, unsigned int col, bool state, bool hip) { + matrix_[index(row, col)] = state; + hipmatrix_[index(row, col)] = hip; +} + +/* + * Return the size of the array + */ + +unsigned int Phase2TrackerClusterizerArray::size() const { + return matrix_.size(); +} + +/* + * Get the poisiton of an element of the Array in the vector that holds the data + */ + +unsigned int Phase2TrackerClusterizerArray::index(unsigned int row, unsigned int col) const { + return col * nrows_ + row; +} + +#endif From 22780a35206c9f34044284a171d098ab3cf557a3 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Wed, 30 Nov 2016 09:35:04 +0100 Subject: [PATCH 3/5] do not use ot bit in comparison --- .../Phase2TrackerDigi/interface/Phase2TrackerDigi.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h b/DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h index 19db15183201e..e768351d0f507 100644 --- a/DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h +++ b/DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h @@ -30,6 +30,7 @@ class Phase2TrackerDigi { // Access to digi information - pixel sensors unsigned int row() const { return channelToRow(theChannel); } unsigned int column() const { return channelToColumn(theChannel); } + uint16_t packedPosition() const { return 0x7FFF & theChannel; // Access to digi information - strip sensors unsigned int strip() const { return row(); } unsigned int edge() const { return column(); } // CD: any better name for that? @@ -57,9 +58,15 @@ class Phase2TrackerDigi { // Comparison operators inline bool operator<( const Phase2TrackerDigi& one, const Phase2TrackerDigi& other) { - return one.channel() < other.channel(); + return one.packedPosition() < other.packedPosition(); } +// distance operators +inline bool operator-( const Phase2TrackerDigi& one, const Phase2TrackerDigi& other) { + return one.packedPosition() - other.packedPosition(); +} + + #include inline std::ostream & operator<<(std::ostream & o, const Phase2TrackerDigi& digi) { return o << " " << digi.channel(); From 9ca66c4b16a6f7ed74dff1d2c6df333da24090b4 Mon Sep 17 00:00:00 2001 From: Vincenzo Innocente Date: Wed, 30 Nov 2016 12:16:19 +0100 Subject: [PATCH 4/5] new fast sequential algo --- .../interface/Phase2TrackerDigi.h | 6 +-- .../plugins/Phase2TrackerClusterizer.cc | 27 +++++++++++- ...se2TrackerClusterizerSequentialAlgorithm.h | 44 +++++++++++++++++++ 3 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerSequentialAlgorithm.h diff --git a/DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h b/DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h index e768351d0f507..1f95519a0a0f1 100644 --- a/DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h +++ b/DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h @@ -30,7 +30,7 @@ class Phase2TrackerDigi { // Access to digi information - pixel sensors unsigned int row() const { return channelToRow(theChannel); } unsigned int column() const { return channelToColumn(theChannel); } - uint16_t packedPosition() const { return 0x7FFF & theChannel; + uint16_t packedPosition() const { return 0x7FFF & theChannel; } // Access to digi information - strip sensors unsigned int strip() const { return row(); } unsigned int edge() const { return column(); } // CD: any better name for that? @@ -62,8 +62,8 @@ inline bool operator<( const Phase2TrackerDigi& one, const Phase2TrackerDigi& ot } // distance operators -inline bool operator-( const Phase2TrackerDigi& one, const Phase2TrackerDigi& other) { - return one.packedPosition() - other.packedPosition(); +inline int operator-( const Phase2TrackerDigi& one, const Phase2TrackerDigi& other) { + return int(one.packedPosition()) - int(other.packedPosition()); } diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc index c111d303a07c0..7383e390196a3 100644 --- a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc @@ -10,6 +10,7 @@ #include "FWCore/Framework/interface/ESHandle.h" #include "Phase2TrackerClusterizerAlgorithm.h" +#include "Phase2TrackerClusterizerSequentialAlgorithm.h" #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h" #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" @@ -24,6 +25,8 @@ #include #include + + class Phase2TrackerClusterizer : public edm::stream::EDProducer<> { public: @@ -67,6 +70,7 @@ class Phase2TrackerClusterizer : public edm::stream::EDProducer<> { // Global container for the clusters of each modules auto outputClusters = std::make_unique(); + auto outputClustersNew = std::make_unique(); // Go over all the modules for (auto DSViter : *digis) { @@ -86,9 +90,30 @@ class Phase2TrackerClusterizer : public edm::stream::EDProducer<> { // Pass the list of Digis to the main algorithm // This function will store the clusters in the previously created container clusterizer_->clusterizeDetUnit(DSViter, clusters); - if (clusters.empty()) clusters.abort(); + + Phase2TrackerCluster1DCollectionNew::FastFiller clustersNew(*outputClustersNew, DSViter.detId()); + Phase2TrackerClusterizerSequentialAlgorithm algo; + algo.clusterizeDetUnit(DSViter, clustersNew); + if (clustersNew.empty()) clustersNew.abort(); + + if (clusters.size() != clustersNew.size()) { + std::cout << "SIZEs " << int(detId) << ' ' << clusters.size() << ' ' << clustersNew.size() << std::endl; + for (auto const & cl : clusters) std::cout << cl.size() << ' ' << cl.threshold() << ' ' << cl.firstRow() << ' ' << cl.column() << std::endl; + std::cout << "new " << std::endl; + for (auto const & cl : clustersNew) std::cout << cl.size() << ' ' << cl.threshold() << ' ' << cl.firstRow() << ' ' << cl.column() << std::endl; + } } + + std::cout << "SIZEs " << outputClusters->dataSize() << ' ' << outputClustersNew->dataSize() << std::endl; + // assert(outputClusters->dataSize()==outputClustersNew->dataSize()); + for (auto i=0U;idataSize(); ++i) { + assert(outputClusters->data()[i].size() == outputClustersNew->data()[i].size()); + assert(outputClusters->data()[i].threshold() == outputClustersNew->data()[i].threshold()); + assert(outputClusters->data()[i].firstRow() == outputClustersNew->data()[i].firstRow()); + assert(outputClusters->data()[i].column() == outputClustersNew->data()[i].column()); + } + // Add the data to the output outputClusters->shrink_to_fit(); diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerSequentialAlgorithm.h b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerSequentialAlgorithm.h new file mode 100644 index 0000000000000..7fd4f3eec1b60 --- /dev/null +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerSequentialAlgorithm.h @@ -0,0 +1,44 @@ +#ifndef RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerSequentialAlgorithm_h +#define RecoLocalTracker_SiPhase2Clusterizer_Phase2TrackerClusterizerSequentialAlgorithm_h + +#include "DataFormats/Common/interface/DetSetVector.h" +#include "DataFormats/Common/interface/DetSetVectorNew.h" +#include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h" +#include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h" + + +class Phase2TrackerClusterizerSequentialAlgorithm { + public: + inline void clusterizeDetUnit(const edm::DetSet< Phase2TrackerDigi >&, Phase2TrackerCluster1DCollectionNew::FastFiller&) const; +}; + +void +Phase2TrackerClusterizerSequentialAlgorithm::clusterizeDetUnit(const edm::DetSet< Phase2TrackerDigi >& digis, Phase2TrackerCluster1DCollectionNew::FastFiller& clusters) const { + if (digis.empty()) return; + auto di = digis.begin(); + unsigned int sizeCluster=1; + Phase2TrackerDigi firstDigi = *di; + bool HIPbit = firstDigi.overThreshold(); + auto previous = firstDigi; + ++di; + for (;di!=digis.end(); ++di) { + auto digi = *di; + if ( !(previous Date: Wed, 30 Nov 2016 13:59:42 +0100 Subject: [PATCH 5/5] fix bug in old clusterizer --- .../plugins/Phase2TrackerClusterizer.cc | 59 +++++++++++-------- .../Phase2TrackerClusterizerAlgorithm.cc | 1 + ...se2TrackerClusterizerSequentialAlgorithm.h | 2 + .../python/phase2TrackerClusterizer_cfi.py | 2 +- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc index 7383e390196a3..aa3fa2aeb7101 100644 --- a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizer.cc @@ -9,7 +9,9 @@ #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "FWCore/Framework/interface/ESHandle.h" +#ifdef VERIFY_PH2_TK_CLUS #include "Phase2TrackerClusterizerAlgorithm.h" +#endif #include "Phase2TrackerClusterizerSequentialAlgorithm.h" #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h" @@ -35,7 +37,9 @@ class Phase2TrackerClusterizer : public edm::stream::EDProducer<> { virtual void produce(edm::Event& event, const edm::EventSetup& eventSetup) override; private: +#ifdef VERIFY_PH2_TK_CLUS std::unique_ptr< Phase2TrackerClusterizerAlgorithm > clusterizer_; +#endif edm::EDGetTokenT< edm::DetSetVector< Phase2TrackerDigi > > token_; }; @@ -46,7 +50,9 @@ class Phase2TrackerClusterizer : public edm::stream::EDProducer<> { */ Phase2TrackerClusterizer::Phase2TrackerClusterizer(edm::ParameterSet const& conf) : +#ifdef VERIFY_PH2_TK_CLUS clusterizer_(new Phase2TrackerClusterizerAlgorithm(conf.getParameter< unsigned int >("maxClusterSize"), conf.getParameter< unsigned int >("maxNumberClusters"))), +#endif token_(consumes< edm::DetSetVector< Phase2TrackerDigi > >(conf.getParameter("src"))) { produces< Phase2TrackerCluster1DCollectionNew >(); } @@ -63,57 +69,62 @@ class Phase2TrackerClusterizer : public edm::stream::EDProducer<> { edm::Handle< edm::DetSetVector< Phase2TrackerDigi > > digis; event.getByToken(token_, digis); +#ifdef VERIFY_PH2_TK_CLUS // Get the geometry edm::ESHandle< TrackerGeometry > geomHandle; eventSetup.get< TrackerDigiGeometryRecord >().get(geomHandle); - const TrackerGeometry* tkGeom(&(*geomHandle)); - + const TrackerGeometry* tkGeom(&(*geomHandle)); // Global container for the clusters of each modules + auto outputClustersOld = std::make_unique(); +#endif auto outputClusters = std::make_unique(); - auto outputClustersNew = std::make_unique(); // Go over all the modules for (auto DSViter : *digis) { DetId detId(DSViter.detId()); - // Geometry + Phase2TrackerCluster1DCollectionNew::FastFiller clusters(*outputClusters, DSViter.detId()); + Phase2TrackerClusterizerSequentialAlgorithm algo; + algo.clusterizeDetUnit(DSViter, clusters); + if (clusters.empty()) clusters.abort(); + +#ifdef VERIFY_PH2_TK_CLUS + // Geometry const GeomDetUnit* geomDetUnit(tkGeom->idToDetUnit(detId)); const PixelGeomDetUnit* pixDet = dynamic_cast< const PixelGeomDetUnit* >(geomDetUnit); if (!pixDet) assert(0); // Container for the clusters that will be produced for this modules - Phase2TrackerCluster1DCollectionNew::FastFiller clusters(*outputClusters, DSViter.detId()); + Phase2TrackerCluster1DCollectionNew::FastFiller clustersOld(*outputClustersOld, DSViter.detId()); // Setup the clusterizer algorithm for this detector (see ClusterizerAlgorithm for more details) clusterizer_->setup(pixDet); // Pass the list of Digis to the main algorithm // This function will store the clusters in the previously created container - clusterizer_->clusterizeDetUnit(DSViter, clusters); - if (clusters.empty()) clusters.abort(); - - Phase2TrackerCluster1DCollectionNew::FastFiller clustersNew(*outputClustersNew, DSViter.detId()); - Phase2TrackerClusterizerSequentialAlgorithm algo; - algo.clusterizeDetUnit(DSViter, clustersNew); - if (clustersNew.empty()) clustersNew.abort(); + clusterizer_->clusterizeDetUnit(DSViter, clustersOld); + if (clustersOld.empty()) clustersOld.abort(); - if (clusters.size() != clustersNew.size()) { - std::cout << "SIZEs " << int(detId) << ' ' << clusters.size() << ' ' << clustersNew.size() << std::endl; + if (clusters.size() != clustersOld.size()) { + std::cout << "SIZEs " << int(detId) << ' ' << clusters.size() << ' ' << clustersOld.size() << std::endl; for (auto const & cl : clusters) std::cout << cl.size() << ' ' << cl.threshold() << ' ' << cl.firstRow() << ' ' << cl.column() << std::endl; - std::cout << "new " << std::endl; - for (auto const & cl : clustersNew) std::cout << cl.size() << ' ' << cl.threshold() << ' ' << cl.firstRow() << ' ' << cl.column() << std::endl; + std::cout << "Old " << std::endl; + for (auto const & cl : clustersOld) std::cout << cl.size() << ' ' << cl.threshold() << ' ' << cl.firstRow() << ' ' << cl.column() << std::endl; } +#endif + } - - std::cout << "SIZEs " << outputClusters->dataSize() << ' ' << outputClustersNew->dataSize() << std::endl; - // assert(outputClusters->dataSize()==outputClustersNew->dataSize()); + +#ifdef VERIFY_PH2_TK_CLUS + // std::cout << "SIZEs " << outputClusters->dataSize() << ' ' << outputClustersOld->dataSize() << std::endl; + assert(outputClusters->dataSize()==outputClustersOld->dataSize()); for (auto i=0U;idataSize(); ++i) { - assert(outputClusters->data()[i].size() == outputClustersNew->data()[i].size()); - assert(outputClusters->data()[i].threshold() == outputClustersNew->data()[i].threshold()); - assert(outputClusters->data()[i].firstRow() == outputClustersNew->data()[i].firstRow()); - assert(outputClusters->data()[i].column() == outputClustersNew->data()[i].column()); + assert(outputClusters->data()[i].size() == outputClustersOld->data()[i].size()); + assert(outputClusters->data()[i].threshold() == outputClustersOld->data()[i].threshold()); + assert(outputClusters->data()[i].firstRow() == outputClustersOld->data()[i].firstRow()); + assert(outputClusters->data()[i].column() == outputClustersOld->data()[i].column()); } - +#endif // Add the data to the output outputClusters->shrink_to_fit(); diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.cc b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.cc index bfe8ab4687c36..5d16810e8c7f3 100644 --- a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.cc +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerAlgorithm.cc @@ -71,6 +71,7 @@ void Phase2TrackerClusterizerAlgorithm::clusterizeDetUnit(const edm::DetSet< Pha sizeCluster = 0; // Increase the number of clusters ++numberClusters; + HIPbit = false; } // Check if we hit the maximum number of clusters per module diff --git a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerSequentialAlgorithm.h b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerSequentialAlgorithm.h index 7fd4f3eec1b60..cc6746ae449e1 100644 --- a/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerSequentialAlgorithm.h +++ b/RecoLocalTracker/SiPhase2Clusterizer/plugins/Phase2TrackerClusterizerSequentialAlgorithm.h @@ -23,7 +23,9 @@ Phase2TrackerClusterizerSequentialAlgorithm::clusterizeDetUnit(const edm::DetSet ++di; for (;di!=digis.end(); ++di) { auto digi = *di; +#ifdef VERIFY_PH2_TK_CLUS if ( !(previous