File indexing completed on 2025-01-08 03:36:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 #include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEBase.h"
0045
0046
0047 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0048 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0049 #include "DataFormats/TrackerRecHit2D/interface/SiPixelRecHitCollection.h"
0050 #include "DataFormats/Common/interface/DetSetVector.h"
0051
0052
0053 #include "FWCore/Framework/interface/stream/EDProducer.h"
0054 #include "FWCore/Framework/interface/Event.h"
0055 #include "FWCore/Framework/interface/EventSetup.h"
0056 #include "FWCore/Framework/interface/MakerMacros.h"
0057 #include "DataFormats/Common/interface/Handle.h"
0058 #include "FWCore/Framework/interface/ESHandle.h"
0059 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0060 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0061 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0062 #include "FWCore/Utilities/interface/InputTag.h"
0063 #include "FWCore/Utilities/interface/EDPutToken.h"
0064 #include "FWCore/Utilities/interface/ESGetToken.h"
0065
0066
0067 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0068 #include "Geometry/CommonDetUnit/interface/PixelGeomDetUnit.h"
0069
0070
0071 #include "DataFormats/DetId/interface/DetId.h"
0072 #include "DataFormats/Common/interface/Ref.h"
0073 #include "DataFormats/Common/interface/DetSet2RangeMap.h"
0074
0075
0076 #include <vector>
0077 #include <memory>
0078 #include <string>
0079 #include <iostream>
0080
0081
0082 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0083
0084 #include "RecoLocalTracker/Records/interface/TkPixelCPERecord.h"
0085
0086
0087 #include "CUDADataFormats/SiPixelCluster/interface/gpuClusteringConstants.h"
0088 #include "CUDADataFormats/Common/interface/HostProduct.h"
0089
0090 using namespace std;
0091
0092 namespace cms {
0093
0094 class SiPixelRecHitConverter : public edm::stream::EDProducer<> {
0095 public:
0096
0097 explicit SiPixelRecHitConverter(const edm::ParameterSet& conf);
0098 ~SiPixelRecHitConverter() override;
0099
0100 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111 void produce(edm::Event& e, const edm::EventSetup& c) override;
0112
0113
0114 void run(edm::Event& e,
0115 edm::Handle<SiPixelClusterCollectionNew> inputhandle,
0116 SiPixelRecHitCollectionNew& output,
0117 TrackerGeometry const& geom);
0118
0119 private:
0120 using HMSstorage = HostProduct<uint32_t[]>;
0121
0122
0123 PixelCPEBase const* cpe_ = nullptr;
0124 edm::InputTag const src_;
0125 std::string const cpeName_;
0126 edm::EDGetTokenT<SiPixelClusterCollectionNew> const tPixelCluster_;
0127 edm::EDPutTokenT<SiPixelRecHitCollection> const tPut_;
0128 edm::EDPutTokenT<HMSstorage> const tHost_;
0129 edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> const tTrackerGeom_;
0130 edm::ESGetToken<PixelClusterParameterEstimator, TkPixelCPERecord> const tCPE_;
0131 bool m_newCont;
0132 };
0133
0134
0135
0136
0137 SiPixelRecHitConverter::SiPixelRecHitConverter(edm::ParameterSet const& conf)
0138 : src_(conf.getParameter<edm::InputTag>("src")),
0139 cpeName_(conf.getParameter<std::string>("CPE")),
0140 tPixelCluster_(consumes<SiPixelClusterCollectionNew>(src_)),
0141 tPut_(produces<SiPixelRecHitCollection>()),
0142 tHost_(produces<HMSstorage>()),
0143 tTrackerGeom_(esConsumes<TrackerGeometry, TrackerDigiGeometryRecord>()),
0144 tCPE_(esConsumes<PixelClusterParameterEstimator, TkPixelCPERecord>(edm::ESInputTag("", cpeName_))) {}
0145
0146
0147 SiPixelRecHitConverter::~SiPixelRecHitConverter() {}
0148
0149
0150
0151
0152 void SiPixelRecHitConverter::produce(edm::Event& e, const edm::EventSetup& es) {
0153
0154 edm::Handle<SiPixelClusterCollectionNew> input;
0155 e.getByToken(tPixelCluster_, input);
0156
0157
0158 auto const& geom = es.getData(tTrackerGeom_);
0159
0160
0161 SiPixelRecHitCollectionNew output;
0162
0163
0164 cpe_ = dynamic_cast<const PixelCPEBase*>(&es.getData(tCPE_));
0165
0166
0167
0168
0169 run(e, input, output, geom);
0170
0171 output.shrink_to_fit();
0172 e.emplace(tPut_, std::move(output));
0173 }
0174
0175
0176
0177
0178
0179
0180 void SiPixelRecHitConverter::run(edm::Event& iEvent,
0181 edm::Handle<SiPixelClusterCollectionNew> inputhandle,
0182 SiPixelRecHitCollectionNew& output,
0183 TrackerGeometry const& geom) {
0184 if (!cpe_) {
0185 edm::LogError("SiPixelRecHitConverter") << " at least one CPE is not ready -- can't run!";
0186
0187 assert(0);
0188 return;
0189 }
0190
0191 int numberOfDetUnits = 0;
0192 int numberOfClusters = 0;
0193
0194 const SiPixelClusterCollectionNew& input = *inputhandle;
0195
0196
0197 auto hmsp = std::make_unique<uint32_t[]>(gpuClustering::maxNumModules + 1);
0198
0199 auto hitsModuleStart = hmsp.get();
0200
0201 std::array<uint32_t, gpuClustering::maxNumModules + 1> clusInModule{};
0202 for (auto const& dsv : input) {
0203 unsigned int detid = dsv.detId();
0204 DetId detIdObject(detid);
0205 const GeomDetUnit* genericDet = geom.idToDetUnit(detIdObject);
0206 auto gind = genericDet->index();
0207
0208 if (gind >= int(gpuClustering::maxNumModules))
0209 continue;
0210 auto const nclus = dsv.size();
0211 assert(nclus > 0);
0212 clusInModule[gind] = nclus;
0213 numberOfClusters += nclus;
0214 }
0215 hitsModuleStart[0] = 0;
0216 assert(clusInModule.size() > gpuClustering::maxNumModules);
0217 for (int i = 1, n = clusInModule.size(); i < n; ++i)
0218 hitsModuleStart[i] = hitsModuleStart[i - 1] + clusInModule[i - 1];
0219 assert(numberOfClusters == int(hitsModuleStart[gpuClustering::maxNumModules]));
0220
0221
0222 iEvent.emplace(tHost_, std::move(hmsp));
0223
0224 numberOfClusters = 0;
0225 for (auto const& dsv : input) {
0226 numberOfDetUnits++;
0227 unsigned int detid = dsv.detId();
0228 DetId detIdObject(detid);
0229 const GeomDetUnit* genericDet = geom.idToDetUnit(detIdObject);
0230 const PixelGeomDetUnit* pixDet = dynamic_cast<const PixelGeomDetUnit*>(genericDet);
0231 assert(pixDet);
0232 SiPixelRecHitCollectionNew::FastFiller recHitsOnDetUnit(output, detid);
0233
0234 edmNew::DetSet<SiPixelCluster>::const_iterator clustIt = dsv.begin(), clustEnd = dsv.end();
0235
0236 for (; clustIt != clustEnd; clustIt++) {
0237 numberOfClusters++;
0238 std::tuple<LocalPoint, LocalError, SiPixelRecHitQuality::QualWordType> tuple =
0239 cpe_->getParameters(*clustIt, *genericDet);
0240 LocalPoint lp(std::get<0>(tuple));
0241 LocalError le(std::get<1>(tuple));
0242 SiPixelRecHitQuality::QualWordType rqw(std::get<2>(tuple));
0243
0244 SiPixelClusterRefNew cluster = edmNew::makeRefTo(inputhandle, clustIt);
0245
0246 SiPixelRecHit hit(lp, le, rqw, *genericDet, cluster);
0247 recHitsOnDetUnit.push_back(hit);
0248
0249 LogDebug("SiPixelRecHitConverter") << "RecHit " << (numberOfClusters - 1)
0250 << " with local position " << lp << " and local error " << le;
0251 }
0252
0253 LogDebug("SiPixelRecHitConverter") << "Found " << recHitsOnDetUnit.size() << " RecHits on " << detid;
0254
0255 }
0256
0257 LogDebug("SiPixelRecHitConverter") << cpeName_ << " converted " << numberOfClusters
0258 << " SiPixelClusters into SiPixelRecHits, in " << numberOfDetUnits
0259 << " DetUnits.";
0260 }
0261 }
0262
0263 using cms::SiPixelRecHitConverter;
0264
0265 void SiPixelRecHitConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0266 edm::ParameterSetDescription desc;
0267 desc.add<edm::InputTag>("src", edm::InputTag("siPixelClusters"));
0268 desc.add<std::string>("CPE", "PixelCPEGeneric");
0269 descriptions.addWithDefaultLabel(desc);
0270 }
0271
0272 DEFINE_FWK_MODULE(SiPixelRecHitConverter);