-
Notifications
You must be signed in to change notification settings - Fork 4.6k
Add SiStrip ApproximateClusterCollection as a simple format for RAW #42022
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
45836ba
b039b47
b5bcf1f
d4f39f3
db7951c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,107 @@ | ||
| #ifndef DataFormats_SiStripCluster_SiStripApproximateClusterCollection_h | ||
| #define DataFormats_SiStripCluster_SiStripApproximateClusterCollection_h | ||
|
|
||
| #include <vector> | ||
|
|
||
| #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<SiStripApproximateCluster>& clusters) : clusters_(clusters) {} | ||
|
|
||
| std::vector<SiStripApproximateCluster>& clusters_; | ||
| }; | ||
|
|
||
| class const_iterator; | ||
| class DetSet { | ||
| public: | ||
| using const_iterator = std::vector<SiStripApproximateCluster>::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<unsigned int> detIds_; // DetId for the Det | ||
| std::vector<unsigned int> beginIndices_; | ||
| std::vector<SiStripApproximateCluster> clusters_; | ||
| }; | ||
|
|
||
| #endif |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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_); | ||
| } |
| Original file line number | Diff line number | Diff line change | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -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" | ||||||||||||
|
Comment on lines
+23
to
+26
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Three includes are duplicated of the already included ones.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. By the way, since only DetSetVectorNew seems to be used, I think you can remove the includes of "DataFormats/Common/interface/DetSetVector.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<edmNew::DetSetVector<SiStripApproximateCluster> >(); | ||||||||||||
| produces<SiStripApproximateClusterCollection>(); | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| void SiStripClusters2ApproxClusters::produce(edm::Event& event, edm::EventSetup const& iSetup) { | ||||||||||||
| auto result = std::make_unique<edmNew::DetSetVector<SiStripApproximateCluster> >(); | ||||||||||||
| const auto& clusterCollection = event.get(clusterToken); | ||||||||||||
| auto result = std::make_unique<SiStripApproximateClusterCollection>(); | ||||||||||||
| 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<SiStripApproximateCluster>::FastFiller ff{*result, detClusters.id()}; | ||||||||||||
| auto ff = result->beginDet(detClusters.id()); | ||||||||||||
|
|
||||||||||||
| unsigned int detId = detClusters.id(); | ||||||||||||
| const GeomDet* det = tkGeom->idToDet(detId); | ||||||||||||
|
|
||||||||||||
Uh oh!
There was an error while loading. Please reload this page.