File indexing completed on 2024-04-06 12:24:45
0001
0002
0003 #include <memory>
0004 #include "FWCore/Framework/interface/Frameworkfwd.h"
0005 #include "FWCore/Framework/interface/stream/EDFilter.h"
0006 #include "FWCore/Framework/interface/Event.h"
0007 #include "FWCore/Framework/interface/MakerMacros.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009
0010
0011 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
0012 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
0013 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
0014 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
0015
0016 #include "RecoEcal/EgammaCoreTools/interface/EcalClusterSeverityLevelAlgo.h"
0017 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgoRcd.h"
0018 #include "RecoEcal/EgammaCoreTools/interface/EcalClusterTools.h"
0019
0020 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
0021 #include "Geometry/CaloTopology/interface/CaloTopology.h"
0022
0023 #include "Geometry/Records/interface/CaloGeometryRecord.h"
0024 #include "Geometry/Records/interface/CaloTopologyRecord.h"
0025
0026 #include "CondFormats/DataRecord/interface/EcalChannelStatusRcd.h"
0027 #include "CondFormats/EcalObjects/interface/EcalChannelStatus.h"
0028
0029 class ProbClustersFilter : public edm::stream::EDFilter<> {
0030 public:
0031 explicit ProbClustersFilter(const edm::ParameterSet&);
0032 ~ProbClustersFilter() override = default;
0033
0034 bool filter(edm::Event&, const edm::EventSetup&) override;
0035
0036 private:
0037 int maxDistance_;
0038 float maxGoodFraction_;
0039 edm::ParameterSet conf_;
0040 edm::InputTag barrelClusterCollection_;
0041 edm::InputTag endcapClusterCollection_;
0042 edm::InputTag reducedBarrelRecHitCollection_;
0043 edm::InputTag reducedEndcapRecHitCollection_;
0044
0045 const edm::EDGetTokenT<reco::SuperClusterCollection> ebSCToken_;
0046 const edm::EDGetTokenT<EcalRecHitCollection> ebRecHitsToken_;
0047 const edm::ESGetToken<CaloTopology, CaloTopologyRecord> topologyToken_;
0048 const edm::ESGetToken<EcalSeverityLevelAlgo, EcalSeverityLevelAlgoRcd> severityLevelAlgoToken_;
0049 };
0050
0051 ProbClustersFilter::ProbClustersFilter(const edm::ParameterSet& iConfig)
0052 : maxDistance_(iConfig.getParameter<int>("maxDistance")),
0053 maxGoodFraction_(iConfig.getParameter<double>("maxGoodFraction")),
0054 conf_(iConfig),
0055 barrelClusterCollection_(iConfig.getParameter<edm::InputTag>("barrelClusterCollection")),
0056 endcapClusterCollection_(iConfig.getParameter<edm::InputTag>("endcapClusterCollection")),
0057 reducedBarrelRecHitCollection_(iConfig.getParameter<edm::InputTag>("reducedBarrelRecHitCollection")),
0058 reducedEndcapRecHitCollection_(iConfig.getParameter<edm::InputTag>("reducedEndcapRecHitCollection")),
0059 ebSCToken_(consumes<reco::SuperClusterCollection>(barrelClusterCollection_)),
0060 ebRecHitsToken_(consumes<EcalRecHitCollection>(reducedBarrelRecHitCollection_)),
0061 topologyToken_(esConsumes()),
0062 severityLevelAlgoToken_(esConsumes()) {}
0063
0064 bool ProbClustersFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0065 int problematicClusters = 0;
0066
0067 edm::Handle<reco::SuperClusterCollection> pEBClusters;
0068 iEvent.getByToken(ebSCToken_, pEBClusters);
0069 const reco::SuperClusterCollection* ebClusters = pEBClusters.product();
0070
0071 edm::Handle<EcalRecHitCollection> pEBRecHits;
0072 iEvent.getByToken(ebRecHitsToken_, pEBRecHits);
0073 const EcalRecHitCollection* ebRecHits = pEBRecHits.product();
0074
0075 const auto& topology = iSetup.getData(topologyToken_);
0076 const auto& sevLv = iSetup.getData(severityLevelAlgoToken_);
0077
0078 for (reco::SuperClusterCollection::const_iterator it = ebClusters->begin(); it != ebClusters->end(); ++it) {
0079 float goodFraction = EcalClusterSeverityLevelAlgo::goodFraction(*it, *ebRecHits, sevLv);
0080 std::pair<int, int> distance =
0081 EcalClusterSeverityLevelAlgo::etaphiDistanceClosestProblematic(*it, *ebRecHits, &topology, sevLv);
0082 if (distance.first == -1 && distance.second == -1) {
0083 distance.first = 999;
0084 distance.second = 999;
0085 }
0086 if (goodFraction >= maxGoodFraction_ &&
0087 sqrt(distance.first * distance.first + distance.second * distance.second) >= maxDistance_)
0088 continue;
0089 ++problematicClusters;
0090 }
0091
0092 return problematicClusters;
0093 }
0094
0095 DEFINE_FWK_MODULE(ProbClustersFilter);