File indexing completed on 2024-04-06 12:26:27
0001 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0002 #include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster.h"
0003 #include "DataFormats/SiStripCluster/interface/SiStripApproximateClusterCollection.h"
0004 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
0005 #include "FWCore/Framework/interface/Event.h"
0006 #include "FWCore/Framework/interface/Frameworkfwd.h"
0007 #include "FWCore/Framework/interface/MakerMacros.h"
0008 #include "FWCore/Framework/interface/global/EDProducer.h"
0009 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0012 #include "FWCore/Utilities/interface/InputTag.h"
0013 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0014 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
0015 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0016
0017 #include <vector>
0018 #include <memory>
0019
0020 class SiStripApprox2Clusters : public edm::global::EDProducer<> {
0021 public:
0022 explicit SiStripApprox2Clusters(const edm::ParameterSet& conf);
0023
0024 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0025 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0026
0027 private:
0028 edm::EDGetTokenT<SiStripApproximateClusterCollection> clusterToken_;
0029 edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> tkGeomToken_;
0030 };
0031
0032 SiStripApprox2Clusters::SiStripApprox2Clusters(const edm::ParameterSet& conf) {
0033 clusterToken_ = consumes(conf.getParameter<edm::InputTag>("inputApproxClusters"));
0034 tkGeomToken_ = esConsumes();
0035 produces<edmNew::DetSetVector<SiStripCluster>>();
0036 }
0037
0038 void SiStripApprox2Clusters::produce(edm::StreamID id, edm::Event& event, const edm::EventSetup& iSetup) const {
0039 auto result = std::make_unique<edmNew::DetSetVector<SiStripCluster>>();
0040 const auto& clusterCollection = event.get(clusterToken_);
0041
0042 const auto& tkGeom = &iSetup.getData(tkGeomToken_);
0043 const auto& tkDets = tkGeom->dets();
0044
0045 for (const auto& detClusters : clusterCollection) {
0046 edmNew::DetSetVector<SiStripCluster>::FastFiller ff{*result, detClusters.id()};
0047 unsigned int detId = detClusters.id();
0048
0049 uint16_t nStrips{0};
0050 auto det = std::find_if(tkDets.begin(), tkDets.end(), [detId](auto& elem) -> bool {
0051 return (elem->geographicalId().rawId() == detId);
0052 });
0053 const StripTopology& p = dynamic_cast<const StripGeomDetUnit*>(*det)->specificTopology();
0054 nStrips = p.nstrips() - 1;
0055
0056 for (const auto& cluster : detClusters) {
0057 ff.push_back(SiStripCluster(cluster, nStrips));
0058 }
0059 }
0060
0061 event.put(std::move(result));
0062 }
0063
0064 void SiStripApprox2Clusters::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0065 edm::ParameterSetDescription desc;
0066 desc.add<edm::InputTag>("inputApproxClusters", edm::InputTag("siStripClusters"));
0067 descriptions.add("SiStripApprox2Clusters", desc);
0068 }
0069
0070 DEFINE_FWK_MODULE(SiStripApprox2Clusters);