diff --git a/DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h b/DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h new file mode 100644 index 0000000000000..ad5606d74c50e --- /dev/null +++ b/DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h @@ -0,0 +1,107 @@ +#ifndef DataFormats_SiStripCluster_SiStripApproximateClusterCollection_h +#define DataFormats_SiStripCluster_SiStripApproximateClusterCollection_h + +#include + +#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster.h" + +/** + * This class provides a minimal interface that resembles + * edmNew::DetSetVector, but is crafted such that we are comfortable + * to provide an infinite backwards compatibility guarantee for it + * (like all RAW data). Any modifications need to be made with care. + * Please consult core software group if in doubt. +**/ +class SiStripApproximateClusterCollection { +public: + // Helper classes to make creation and iteration easier + class Filler { + public: + void push_back(SiStripApproximateCluster const& cluster) { clusters_.push_back(cluster); } + + private: + friend SiStripApproximateClusterCollection; + Filler(std::vector& clusters) : clusters_(clusters) {} + + std::vector& clusters_; + }; + + class const_iterator; + class DetSet { + public: + using const_iterator = std::vector::const_iterator; + + unsigned int id() const { return coll_->detIds_[detIndex_]; } + + const_iterator begin() const { return coll_->clusters_.begin() + clusBegin_; } + const_iterator cbegin() const { return begin(); } + const_iterator end() const { return coll_->clusters_.begin() + clusEnd_; } + const_iterator cend() const { return end(); } + + private: + friend SiStripApproximateClusterCollection::const_iterator; + DetSet(SiStripApproximateClusterCollection const* coll, unsigned int detIndex) + : coll_(coll), + detIndex_(detIndex), + clusBegin_(coll_->beginIndices_[detIndex]), + clusEnd_(detIndex == coll_->beginIndices_.size() - 1 ? coll_->beginIndices_.size() + : coll_->beginIndices_[detIndex + 1]) {} + + SiStripApproximateClusterCollection const* const coll_; + unsigned int const detIndex_; + unsigned int const clusBegin_; + unsigned int const clusEnd_; + }; + + class const_iterator { + public: + DetSet operator*() const { return DetSet(coll_, index_); } + + const_iterator& operator++() { + ++index_; + if (index_ == coll_->detIds_.size()) { + *this = const_iterator(); + } + return *this; + } + + const_iterator operator++(int) { + const_iterator clone = *this; + ++(*this); + return clone; + } + + bool operator==(const_iterator const& other) const { return coll_ == other.coll_ and index_ == other.index_; } + bool operator!=(const_iterator const& other) const { return not operator==(other); } + + private: + friend SiStripApproximateClusterCollection; + // default-constructed object acts as the sentinel + const_iterator() = default; + const_iterator(SiStripApproximateClusterCollection const* coll) : coll_(coll) {} + + SiStripApproximateClusterCollection const* coll_ = nullptr; + unsigned int index_ = 0; + }; + + // Actual public interface + SiStripApproximateClusterCollection() = default; + + void reserve(std::size_t dets, std::size_t clusters); + Filler beginDet(unsigned int detId); + + const_iterator begin() const { return const_iterator(this); } + const_iterator cbegin() const { return begin(); } + const_iterator end() const { return const_iterator(); } + const_iterator cend() const { return end(); } + +private: + // The detIds_ and beginIndices_ have one element for each Det. An + // element of beginIndices_ points to the first cluster of the Det + // in clusters_. + std::vector detIds_; // DetId for the Det + std::vector beginIndices_; + std::vector clusters_; +}; + +#endif diff --git a/DataFormats/SiStripCluster/src/SiStripApproximateClusterCollection.cc b/DataFormats/SiStripCluster/src/SiStripApproximateClusterCollection.cc new file mode 100644 index 0000000000000..6723971dc428e --- /dev/null +++ b/DataFormats/SiStripCluster/src/SiStripApproximateClusterCollection.cc @@ -0,0 +1,13 @@ +#include "DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h" + +void SiStripApproximateClusterCollection::reserve(std::size_t dets, std::size_t clusters) { + detIds_.reserve(dets); + beginIndices_.reserve(dets); + clusters_.reserve(clusters); +} + +SiStripApproximateClusterCollection::Filler SiStripApproximateClusterCollection::beginDet(unsigned int detId) { + detIds_.push_back(detId); + beginIndices_.push_back(clusters_.size()); + return Filler(clusters_); +} diff --git a/DataFormats/SiStripCluster/src/classes.h b/DataFormats/SiStripCluster/src/classes.h index 00819e76d08a4..94eafdf2ecac7 100644 --- a/DataFormats/SiStripCluster/src/classes.h +++ b/DataFormats/SiStripCluster/src/classes.h @@ -7,6 +7,7 @@ #include "DataFormats/SiStripCluster/interface/SiStripCluster.h" #include "DataFormats/SiStripCluster/interface/SiStripClustersSOA.h" #include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster.h" +#include "DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h" #include "DataFormats/Common/interface/ContainerMask.h" #endif // SISTRIPCLUSTER_CLASSES_H diff --git a/DataFormats/SiStripCluster/src/classes_def.xml b/DataFormats/SiStripCluster/src/classes_def.xml index 3efcd26a23881..fa475a9e1ae50 100755 --- a/DataFormats/SiStripCluster/src/classes_def.xml +++ b/DataFormats/SiStripCluster/src/classes_def.xml @@ -31,6 +31,10 @@ + + + + diff --git a/RecoLocalTracker/SiStripClusterizer/plugins/SiStripApprox2Clusters.cc b/RecoLocalTracker/SiStripClusterizer/plugins/SiStripApprox2Clusters.cc index 3dc01b9311077..803c8949f90c6 100644 --- a/RecoLocalTracker/SiStripClusterizer/plugins/SiStripApprox2Clusters.cc +++ b/RecoLocalTracker/SiStripClusterizer/plugins/SiStripApprox2Clusters.cc @@ -1,6 +1,6 @@ -#include "DataFormats/Common/interface/DetSetVector.h" #include "DataFormats/Common/interface/DetSetVectorNew.h" #include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster.h" +#include "DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h" #include "DataFormats/SiStripCluster/interface/SiStripCluster.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/Frameworkfwd.h" @@ -25,13 +25,12 @@ class SiStripApprox2Clusters : public edm::global::EDProducer<> { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); private: - edm::EDGetTokenT> clusterToken_; + edm::EDGetTokenT clusterToken_; edm::ESGetToken tkGeomToken_; }; SiStripApprox2Clusters::SiStripApprox2Clusters(const edm::ParameterSet& conf) { - clusterToken_ = consumes>( - conf.getParameter("inputApproxClusters")); + clusterToken_ = consumes(conf.getParameter("inputApproxClusters")); tkGeomToken_ = esConsumes(); produces>(); } diff --git a/RecoLocalTracker/SiStripClusterizer/plugins/SiStripClusters2ApproxClusters.cc b/RecoLocalTracker/SiStripClusterizer/plugins/SiStripClusters2ApproxClusters.cc index c842c384c4971..e8cccd928f4ad 100644 --- a/RecoLocalTracker/SiStripClusterizer/plugins/SiStripClusters2ApproxClusters.cc +++ b/RecoLocalTracker/SiStripClusterizer/plugins/SiStripClusters2ApproxClusters.cc @@ -20,6 +20,10 @@ #include "FWCore/ParameterSet/interface/FileInPath.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster.h" +#include "DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h" +#include "DataFormats/SiStripCluster/interface/SiStripCluster.h" +#include "DataFormats/Common/interface/DetSetVectorNew.h" #include "FWCore/Utilities/interface/ESInputTag.h" #include "FWCore/Utilities/interface/InputTag.h" #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" @@ -84,12 +88,13 @@ SiStripClusters2ApproxClusters::SiStripClusters2ApproxClusters(const edm::Parame stripNoiseToken_ = esConsumes(); - produces >(); + produces(); } void SiStripClusters2ApproxClusters::produce(edm::Event& event, edm::EventSetup const& iSetup) { - auto result = std::make_unique >(); const auto& clusterCollection = event.get(clusterToken); + auto result = std::make_unique(); + result->reserve(clusterCollection.size(), clusterCollection.dataSize()); auto const beamSpotHandle = event.getHandle(beamSpotToken_); auto const& bs = beamSpotHandle.isValid() ? *beamSpotHandle : reco::BeamSpot(); @@ -103,7 +108,7 @@ void SiStripClusters2ApproxClusters::produce(edm::Event& event, edm::EventSetup const auto& theNoise_ = &iSetup.getData(stripNoiseToken_); for (const auto& detClusters : clusterCollection) { - edmNew::DetSetVector::FastFiller ff{*result, detClusters.id()}; + auto ff = result->beginDet(detClusters.id()); unsigned int detId = detClusters.id(); const GeomDet* det = tkGeom->idToDet(detId);