File indexing completed on 2024-04-06 12:26:19
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include "SiPixelClusterProducer.h"
0016 #include "PixelThresholdClusterizer.h"
0017
0018
0019 #include "Geometry/CommonDetUnit/interface/PixelGeomDetUnit.h"
0020
0021
0022 #include "DataFormats/Common/interface/DetSetVector.h"
0023 #include "DataFormats/SiPixelDigi/interface/PixelDigi.h"
0024 #include "DataFormats/DetId/interface/DetId.h"
0025
0026
0027 #include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationService.h"
0028 #include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationOfflineService.h"
0029 #include "CalibTracker/SiPixelESProducers/interface/SiPixelGainCalibrationForHLTService.h"
0030
0031
0032 #include "DataFormats/Common/interface/Handle.h"
0033 #include "FWCore/Framework/interface/ESHandle.h"
0034 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0035
0036
0037 #include <vector>
0038 #include <memory>
0039 #include <string>
0040 #include <iostream>
0041
0042
0043 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0044
0045
0046
0047
0048 SiPixelClusterProducer::SiPixelClusterProducer(edm::ParameterSet const& conf)
0049 : tPutPixelClusters(produces<SiPixelClusterCollectionNew>()),
0050 clusterMode_(conf.getParameter<std::string>("ClusterMode")),
0051 maxTotalClusters_(conf.getParameter<int32_t>("maxNumberOfClusters")) {
0052 if (clusterMode_ == "PixelThresholdReclusterizer")
0053 tPixelClusters = consumes<SiPixelClusterCollectionNew>(conf.getParameter<edm::InputTag>("src"));
0054 else
0055 tPixelDigi = consumes<edm::DetSetVector<PixelDigi>>(conf.getParameter<edm::InputTag>("src"));
0056
0057 trackerTopoToken_ = esConsumes<TrackerTopology, TrackerTopologyRcd>();
0058 trackerGeomToken_ = esConsumes<TrackerGeometry, TrackerDigiGeometryRecord>();
0059
0060 const auto& payloadType = conf.getParameter<std::string>("payloadType");
0061
0062 if (payloadType == "HLT")
0063 theSiPixelGainCalibration_ = std::make_unique<SiPixelGainCalibrationForHLTService>(conf, consumesCollector());
0064 else if (payloadType == "Offline")
0065 theSiPixelGainCalibration_ = std::make_unique<SiPixelGainCalibrationOfflineService>(conf, consumesCollector());
0066 else if (payloadType == "Full")
0067 theSiPixelGainCalibration_ = std::make_unique<SiPixelGainCalibrationService>(conf, consumesCollector());
0068 else if (payloadType == "None")
0069 theSiPixelGainCalibration_ = nullptr;
0070
0071
0072
0073 setupClusterizer(conf);
0074 }
0075
0076
0077 SiPixelClusterProducer::~SiPixelClusterProducer() = default;
0078
0079 void SiPixelClusterProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0080 edm::ParameterSetDescription desc;
0081
0082 desc.add<edm::InputTag>("src", edm::InputTag("siPixelDigis"));
0083 desc.add<std::string>("ClusterMode", "PixelThresholdClusterizer");
0084 desc.add<int>("maxNumberOfClusters", -1)->setComment("-1 means no limit");
0085 desc.add<std::string>("payloadType", "Offline")
0086 ->setComment("Options: HLT - column granularity, Offline - gain:col/ped:pix, None: no gain calibrations");
0087
0088 PixelThresholdClusterizer::fillPSetDescription(desc);
0089 SiPixelGainCalibrationServiceBase::fillPSetDescription(desc);
0090
0091 descriptions.add("SiPixelClusterizerDefault", desc);
0092 }
0093
0094
0095
0096
0097 void SiPixelClusterProducer::produce(edm::Event& e, const edm::EventSetup& es) {
0098
0099 if (theSiPixelGainCalibration_.get())
0100 theSiPixelGainCalibration_->setESObjects(es);
0101
0102
0103 edm::Handle<SiPixelClusterCollectionNew> inputClusters;
0104 edm::Handle<edm::DetSetVector<PixelDigi>> inputDigi;
0105 if (clusterMode_ == "PixelThresholdReclusterizer")
0106 e.getByToken(tPixelClusters, inputClusters);
0107 else
0108 e.getByToken(tPixelDigi, inputDigi);
0109
0110
0111 edm::ESHandle<TrackerGeometry> geom = es.getHandle(trackerGeomToken_);
0112
0113 edm::ESHandle<TrackerTopology> trackerTopologyHandle = es.getHandle(trackerTopoToken_);
0114 tTopo_ = trackerTopologyHandle.product();
0115
0116
0117 auto output = std::make_unique<SiPixelClusterCollectionNew>();
0118
0119
0120
0121
0122 if (clusterMode_ == "PixelThresholdReclusterizer")
0123 run(*inputClusters, geom, *output);
0124 else
0125 run(*inputDigi, geom, *output);
0126
0127
0128 output->shrink_to_fit();
0129
0130
0131 for (auto clusters : *output) {
0132 uint16_t id = 0;
0133 for (auto& cluster : clusters) {
0134 cluster.setOriginalId(id++);
0135 }
0136 }
0137 e.put(tPutPixelClusters, std::move(output));
0138 }
0139
0140
0141
0142
0143
0144
0145 void SiPixelClusterProducer::setupClusterizer(const edm::ParameterSet& conf) {
0146 if (clusterMode_ == "PixelThresholdReclusterizer" || clusterMode_ == "PixelThresholdClusterizer") {
0147 clusterizer_ = std::make_unique<PixelThresholdClusterizer>(conf);
0148 if (theSiPixelGainCalibration_.get()) {
0149 clusterizer_->setSiPixelGainCalibrationService(theSiPixelGainCalibration_.get());
0150 }
0151 } else {
0152 throw cms::Exception("Configuration") << "[SiPixelClusterProducer]:"
0153 << " choice " << clusterMode_ << " is invalid.\n"
0154 << "Possible choices:\n"
0155 << " PixelThresholdClusterizer";
0156 }
0157 }
0158
0159
0160
0161
0162 template <typename T>
0163 void SiPixelClusterProducer::run(const T& input,
0164 const edm::ESHandle<TrackerGeometry>& geom,
0165 edmNew::DetSetVector<SiPixelCluster>& output) {
0166 int numberOfClusters = 0;
0167
0168
0169 for (auto const& dsv : input) {
0170
0171
0172
0173 std::vector<short> badChannels;
0174 DetId detIdObject(dsv.detId());
0175
0176
0177
0178
0179
0180
0181 const GeomDetUnit* geoUnit = geom->idToDetUnit(detIdObject);
0182 const PixelGeomDetUnit* pixDet = dynamic_cast<const PixelGeomDetUnit*>(geoUnit);
0183 if (!pixDet) {
0184
0185 assert(0);
0186 }
0187 {
0188
0189
0190 edmNew::DetSetVector<SiPixelCluster>::FastFiller spc(output, dsv.detId());
0191 clusterizer_->clusterizeDetUnit(dsv, pixDet, tTopo_, badChannels, spc);
0192 if (spc.empty()) {
0193 spc.abort();
0194 } else {
0195 numberOfClusters += spc.size();
0196 }
0197 }
0198 if ((maxTotalClusters_ >= 0) && (numberOfClusters > maxTotalClusters_)) {
0199 edm::LogError("TooManyClusters")
0200 << "Limit on the number of clusters exceeded. An empty cluster collection will be produced instead.\n";
0201 edmNew::DetSetVector<SiPixelCluster> empty;
0202 empty.swap(output);
0203 break;
0204 }
0205 }
0206 }
0207
0208 #include "PixelThresholdClusterizer.icc"
0209 #include "FWCore/PluginManager/interface/ModuleDef.h"
0210 #include "FWCore/Framework/interface/MakerMacros.h"
0211
0212 DEFINE_FWK_MODULE(SiPixelClusterProducer);