File indexing completed on 2025-06-12 23:30:05
0001
0002
0003
0004
0005
0006
0007 #include <memory>
0008 #include <vector>
0009
0010 #include "CondFormats/DataRecord/interface/CTPPSPixelAnalysisMaskRcd.h"
0011 #include "CondFormats/DataRecord/interface/CTPPSPixelDAQMappingRcd.h"
0012 #include "CondFormats/DataRecord/interface/CTPPSPixelGainCalibrationsRcd.h"
0013 #include "CondFormats/PPSObjects/interface/CTPPSPixelAnalysisMask.h"
0014 #include "CondFormats/PPSObjects/interface/CTPPSPixelDAQMapping.h"
0015 #include "CondFormats/PPSObjects/interface/CTPPSPixelGainCalibrations.h"
0016 #include "DataFormats/CTPPSDetId/interface/CTPPSPixelDetId.h"
0017 #include "DataFormats/CTPPSDigi/interface/CTPPSPixelDigi.h"
0018 #include "DataFormats/CTPPSReco/interface/CTPPSPixelCluster.h"
0019 #include "DataFormats/Common/interface/DetSet.h"
0020 #include "DataFormats/Common/interface/DetSetVector.h"
0021 #include "DataFormats/Common/interface/Handle.h"
0022 #include "DataFormats/DetId/interface/DetId.h"
0023 #include "FWCore/Framework/interface/ESHandle.h"
0024 #include "FWCore/Framework/interface/Event.h"
0025 #include "FWCore/Framework/interface/EventSetup.h"
0026 #include "FWCore/Framework/interface/stream/EDProducer.h"
0027 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0028 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0029 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0030 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0031 #include "FWCore/Utilities/interface/ESGetToken.h"
0032 #include "FWCore/Utilities/interface/EDGetToken.h"
0033 #include "FWCore/Utilities/interface/EDPutToken.h"
0034 #include "FWCore/Utilities/interface/InputTag.h"
0035 #include "RecoPPS/Local/interface/RPixDetClusterizer.h"
0036
0037 class CTPPSPixelClusterProducer : public edm::stream::EDProducer<> {
0038 public:
0039 explicit CTPPSPixelClusterProducer(const edm::ParameterSet ¶m);
0040
0041 ~CTPPSPixelClusterProducer() override = default;
0042
0043 void produce(edm::Event &, const edm::EventSetup &) override;
0044 static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
0045
0046 private:
0047 const edm::EDGetTokenT<edm::DetSetVector<CTPPSPixelDigi>> tokenCTPPSPixelDigi_;
0048 const edm::EDPutTokenT<edm::DetSetVector<CTPPSPixelCluster>> tokenCTPPSPixelCluster_;
0049 const edm::ESGetToken<CTPPSPixelAnalysisMask, CTPPSPixelAnalysisMaskRcd> tokenCTPPSPixelAnalysisMask_;
0050 const edm::ESGetToken<CTPPSPixelGainCalibrations, CTPPSPixelGainCalibrationsRcd> tokenGainCalib_;
0051 const int verbosity_;
0052 RPixDetClusterizer clusterizer_;
0053
0054 void run(const edm::DetSetVector<CTPPSPixelDigi> &input,
0055 edm::DetSetVector<CTPPSPixelCluster> &output,
0056 const CTPPSPixelAnalysisMask &mask,
0057 const CTPPSPixelGainCalibrations &gainCalibration);
0058 };
0059
0060 CTPPSPixelClusterProducer::CTPPSPixelClusterProducer(const edm::ParameterSet &conf)
0061 : tokenCTPPSPixelDigi_(consumes<edm::DetSetVector<CTPPSPixelDigi>>(conf.getParameter<edm::InputTag>("tag"))),
0062 tokenCTPPSPixelCluster_(produces()),
0063 tokenCTPPSPixelAnalysisMask_(esConsumes()),
0064 tokenGainCalib_(esConsumes()),
0065 verbosity_(conf.getUntrackedParameter<int>("RPixVerbosity")),
0066 clusterizer_(conf) {}
0067
0068 void CTPPSPixelClusterProducer::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0069 edm::ParameterSetDescription desc;
0070 desc.addUntracked<int>("RPixVerbosity", 0);
0071 desc.add<edm::InputTag>("tag", edm::InputTag("ctppsPixelDigis"));
0072 desc.add<int>("SeedADCThreshold", 2);
0073 desc.add<int>("ADCThreshold", 2);
0074 desc.add<double>("ElectronADCGain", 135.0);
0075 desc.add<int>("VCaltoElectronGain", 50);
0076 desc.add<int>("VCaltoElectronOffset", -411);
0077 desc.add<bool>("doSingleCalibration", false);
0078 descriptions.add("ctppsPixelClusters", desc);
0079 }
0080
0081 void CTPPSPixelClusterProducer::produce(edm::Event &event, const edm::EventSetup &setup) {
0082
0083 edm::DetSetVector<CTPPSPixelDigi> const &rpd = event.get(tokenCTPPSPixelDigi_);
0084
0085 edm::DetSetVector<CTPPSPixelCluster> output;
0086
0087 if (not rpd.empty()) {
0088
0089 const auto &mask = setup.getData(tokenCTPPSPixelAnalysisMask_);
0090
0091 const auto &gainCalibrations = setup.getData(tokenGainCalib_);
0092
0093 run(rpd, output, mask, gainCalibrations);
0094 }
0095
0096
0097 event.emplace(tokenCTPPSPixelCluster_, std::move(output));
0098 }
0099
0100 void CTPPSPixelClusterProducer::run(const edm::DetSetVector<CTPPSPixelDigi> &input,
0101 edm::DetSetVector<CTPPSPixelCluster> &output,
0102 const CTPPSPixelAnalysisMask &mask,
0103 const CTPPSPixelGainCalibrations &gainCalibration) {
0104 for (const auto &ds_digi : input) {
0105 edm::DetSet<CTPPSPixelCluster> &ds_cluster = output.find_or_insert(ds_digi.id);
0106 clusterizer_.buildClusters(ds_digi.id, ds_digi.data, ds_cluster.data, &gainCalibration, &mask);
0107
0108 if (verbosity_) {
0109 unsigned int cluN = 0;
0110 for (std::vector<CTPPSPixelCluster>::iterator iit = ds_cluster.data.begin(); iit != ds_cluster.data.end();
0111 iit++) {
0112 edm::LogInfo("CTPPSPixelClusterProducer") << "Cluster " << ++cluN << " avg row " << (*iit).avg_row()
0113 << " avg col " << (*iit).avg_col() << " ADC.size " << (*iit).size();
0114 }
0115 }
0116 }
0117 }
0118
0119 #include "FWCore/Framework/interface/MakerMacros.h"
0120 DEFINE_FWK_MODULE(CTPPSPixelClusterProducer);