File indexing completed on 2024-04-06 12:26:32
0001 #include "FWCore/Framework/interface/stream/EDProducer.h"
0002 #include "FWCore/Framework/interface/Event.h"
0003 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0004 #include "FWCore/Utilities/interface/InputTag.h"
0005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0006
0007 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
0008 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0009
0010 #include "DataFormats/Common/interface/ValueMap.h"
0011 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0012 #include "DataFormats/Provenance/interface/ProductID.h"
0013 #include "DataFormats/Common/interface/ContainerMask.h"
0014
0015 #include "DataFormats/DetId/interface/DetId.h"
0016
0017 #include "DataFormats/TrackerRecHit2D/interface/ClusterRemovalInfo.h"
0018
0019 #include "DataFormats/SiStripCluster/interface/SiStripClusterTools.h"
0020 #include "RecoLocalTracker/SiStripClusterizer/interface/ClusterChargeCut.h"
0021
0022 namespace {
0023
0024 class ClusterChargeMasker : public edm::stream::EDProducer<> {
0025 public:
0026 ClusterChargeMasker(const edm::ParameterSet& iConfig);
0027 ~ClusterChargeMasker() override {}
0028 void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0029
0030 private:
0031 using PixelMaskContainer = edm::ContainerMask<edmNew::DetSetVector<SiPixelCluster>>;
0032 using StripMaskContainer = edm::ContainerMask<edmNew::DetSetVector<SiStripCluster>>;
0033
0034 bool mergeOld_;
0035 float minGoodStripCharge_;
0036
0037 edm::EDGetTokenT<edmNew::DetSetVector<SiPixelCluster>> pixelClusters_;
0038 edm::EDGetTokenT<edmNew::DetSetVector<SiStripCluster>> stripClusters_;
0039
0040 edm::EDGetTokenT<PixelMaskContainer> oldPxlMaskToken_;
0041 edm::EDGetTokenT<StripMaskContainer> oldStrMaskToken_;
0042 };
0043
0044 ClusterChargeMasker::ClusterChargeMasker(const edm::ParameterSet& iConfig)
0045 : mergeOld_(iConfig.exists("oldClusterRemovalInfo")), minGoodStripCharge_(clusterChargeCut(iConfig)) {
0046 produces<edm::ContainerMask<edmNew::DetSetVector<SiPixelCluster>>>();
0047 produces<edm::ContainerMask<edmNew::DetSetVector<SiStripCluster>>>();
0048
0049 pixelClusters_ =
0050 consumes<edmNew::DetSetVector<SiPixelCluster>>(iConfig.getParameter<edm::InputTag>("pixelClusters"));
0051 stripClusters_ =
0052 consumes<edmNew::DetSetVector<SiStripCluster>>(iConfig.getParameter<edm::InputTag>("stripClusters"));
0053
0054 if (mergeOld_) {
0055 oldPxlMaskToken_ = consumes<PixelMaskContainer>(iConfig.getParameter<edm::InputTag>("oldClusterRemovalInfo"));
0056 oldStrMaskToken_ = consumes<StripMaskContainer>(iConfig.getParameter<edm::InputTag>("oldClusterRemovalInfo"));
0057 }
0058 }
0059
0060 void ClusterChargeMasker::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0061 edm::Handle<edmNew::DetSetVector<SiPixelCluster>> pixelClusters;
0062 iEvent.getByToken(pixelClusters_, pixelClusters);
0063 edm::Handle<edmNew::DetSetVector<SiStripCluster>> stripClusters;
0064 iEvent.getByToken(stripClusters_, stripClusters);
0065
0066 std::vector<bool> collectedStrips;
0067 std::vector<bool> collectedPixels;
0068
0069 if (mergeOld_) {
0070 edm::Handle<PixelMaskContainer> oldPxlMask;
0071 edm::Handle<StripMaskContainer> oldStrMask;
0072 iEvent.getByToken(oldPxlMaskToken_, oldPxlMask);
0073 iEvent.getByToken(oldStrMaskToken_, oldStrMask);
0074 LogDebug("ClusterChargeMasker") << "to merge in, " << oldStrMask->size() << " strp and " << oldPxlMask->size()
0075 << " pxl";
0076 oldStrMask->copyMaskTo(collectedStrips);
0077 oldPxlMask->copyMaskTo(collectedPixels);
0078 assert(stripClusters->dataSize() >= collectedStrips.size());
0079 collectedStrips.resize(stripClusters->dataSize(), false);
0080 } else {
0081 collectedStrips.resize(stripClusters->dataSize(), false);
0082 collectedPixels.resize(pixelClusters->dataSize(), false);
0083 }
0084
0085 auto const& clusters = stripClusters->data();
0086 for (auto const& item : stripClusters->ids()) {
0087 if (!item.isValid())
0088 continue;
0089
0090 auto detid = item.id;
0091
0092 for (int i = item.offset; i < item.offset + int(item.size); ++i) {
0093 auto clusCharge = siStripClusterTools::chargePerCM(detid, clusters[i]);
0094 if (clusCharge < minGoodStripCharge_)
0095 collectedStrips[i] = true;
0096 }
0097 }
0098
0099 LogDebug("ClusterChargeMasker") << "total strip to skip: "
0100 << std::count(collectedStrips.begin(), collectedStrips.end(), true);
0101
0102
0103 iEvent.put(std::make_unique<StripMaskContainer>(edm::RefProd<edmNew::DetSetVector<SiStripCluster>>(stripClusters),
0104 collectedStrips));
0105
0106 LogDebug("ClusterChargeMasker") << "total pxl to skip: "
0107 << std::count(collectedPixels.begin(), collectedPixels.end(), true);
0108 iEvent.put(std::make_unique<PixelMaskContainer>(edm::RefProd<edmNew::DetSetVector<SiPixelCluster>>(pixelClusters),
0109 collectedPixels));
0110 }
0111
0112 }
0113
0114 #include "FWCore/PluginManager/interface/ModuleDef.h"
0115 #include "FWCore/Framework/interface/MakerMacros.h"
0116 DEFINE_FWK_MODULE(ClusterChargeMasker);