Back to home page

Project CMSSW displayed by LXR

 
 

    


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);