File indexing completed on 2024-04-06 12:26:44
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include "FWCore/Framework/interface/Frameworkfwd.h"
0017 #include "FWCore/Framework/interface/global/EDFilter.h"
0018 #include "FWCore/Framework/interface/Event.h"
0019 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0021
0022 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
0023 #include "DataFormats/DetId/interface/DetId.h"
0024 #include "DataFormats/EcalDetId/interface/EEDetId.h"
0025
0026 #include "Geometry/CaloTopology/interface/CaloTopology.h"
0027 #include "Geometry/Records/interface/CaloTopologyRecord.h"
0028
0029 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
0030 #include "RecoCaloTools/Navigation/interface/CaloNavigator.h"
0031
0032 #include "TVector3.h"
0033
0034 class EEBadScFilter : public edm::global::EDFilter<> {
0035 public:
0036 explicit EEBadScFilter(const edm::ParameterSet &iConfig);
0037 ~EEBadScFilter() override {}
0038
0039 private:
0040
0041
0042 bool filter(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const override;
0043
0044
0045
0046 void scan5x5(const DetId &det,
0047 const EcalRecHitCollection &hits,
0048 const CaloTopology &caloTopo,
0049 const CaloGeometry &geometry,
0050 int &nHits,
0051 float &totEt) const;
0052
0053
0054
0055
0056 const edm::EDGetTokenT<EcalRecHitCollection> eeRHSrcToken_;
0057 const edm::ESGetToken<CaloGeometry, CaloGeometryRecord> geometryToken_;
0058 const edm::ESGetToken<CaloTopology, CaloTopologyRecord> caloTopoToken_;
0059
0060
0061 const double Emin_;
0062 const double EtminSC_;
0063 const int side_;
0064 const int nBadHitsSC_;
0065 const std::vector<int> badsc_;
0066
0067 const bool taggingMode_;
0068 const bool debug_;
0069 };
0070
0071
0072 EEBadScFilter::EEBadScFilter(const edm::ParameterSet &iConfig)
0073 : eeRHSrcToken_(consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("EERecHitSource"))),
0074 geometryToken_(esConsumes()),
0075 caloTopoToken_(esConsumes()),
0076 Emin_(iConfig.getParameter<double>("EminHit")),
0077 EtminSC_(iConfig.getParameter<double>("EtminSC")),
0078 side_(iConfig.getParameter<int>("SCsize")),
0079 nBadHitsSC_(iConfig.getParameter<int>("nBadHitsSC")),
0080 badsc_(iConfig.getParameter<std::vector<int> >("badscEE")),
0081 taggingMode_(iConfig.getParameter<bool>("taggingMode")),
0082 debug_(iConfig.getParameter<bool>("debug")) {
0083 produces<bool>();
0084 }
0085
0086 void EEBadScFilter::scan5x5(const DetId &det,
0087 const EcalRecHitCollection &hits,
0088 const CaloTopology &caloTopo,
0089 const CaloGeometry &geometry,
0090 int &nHits,
0091 float &totEt) const {
0092
0093
0094
0095
0096 nHits = 0;
0097 totEt = 0;
0098
0099
0100
0101 CaloNavigator<DetId> cursor = CaloNavigator<DetId>(det, caloTopo.getSubdetectorTopology(det));
0102
0103
0104
0105 for (int j = side_ / 2; j >= -side_ / 2; --j) {
0106 for (int i = -side_ / 2; i <= side_ / 2; ++i) {
0107 cursor.home();
0108 cursor.offsetBy(i, j);
0109 if (hits.find(*cursor) != hits.end())
0110 {
0111 EcalRecHit tmpHit = *hits.find(*cursor);
0112
0113 const GlobalPoint p(geometry.getPosition(*cursor));
0114 TVector3 hitPos(p.x(), p.y(), p.z());
0115 hitPos *= 1.0 / hitPos.Mag();
0116 hitPos *= tmpHit.energy();
0117 float rechitEt = hitPos.Pt();
0118
0119
0120 totEt += rechitEt;
0121
0122
0123 if (tmpHit.energy() > Emin_ && !tmpHit.checkFlag(EcalRecHit::kGood))
0124 nHits++;
0125 }
0126 }
0127 }
0128 }
0129
0130 bool EEBadScFilter::filter(edm::StreamID, edm::Event &iEvent, const edm::EventSetup &iSetup) const {
0131
0132
0133
0134 auto const &eeRHs = iEvent.get(eeRHSrcToken_);
0135
0136
0137 auto const &geometry = iSetup.getData(geometryToken_);
0138
0139
0140 auto const &caloTopo = iSetup.getData(caloTopoToken_);
0141
0142
0143 bool pass = true;
0144
0145
0146 int nhits = 0;
0147 float totEt = 0.0;
0148
0149
0150
0151 EEDetId scdet;
0152 DetId det;
0153
0154 int ix, iy, iz;
0155
0156
0157
0158 for (std::vector<int>::const_iterator scit = badsc_.begin(); scit != badsc_.end(); ++scit) {
0159
0160
0161 iz = int(*scit / 1000000);
0162 iy = *scit % 100 * iz;
0163 ix = int((*scit - iy - 1000000 * iz) / 1000) * iz;
0164
0165
0166 scdet = EEDetId(ix, iy, iz);
0167 det = scdet;
0168
0169
0170
0171 scan5x5(det, eeRHs, caloTopo, geometry, nhits, totEt);
0172
0173
0174
0175 if (debug_) {
0176 edm::LogInfo("EEBadScFilter") << "SCID=" << *scit;
0177 edm::LogInfo("EEBadScFilter") << "ix=" << ix << " iy=" << iy << " iz=" << iz;
0178 edm::LogInfo("EEBadScFilter") << "Et(5x5)=" << totEt << " nbadhits=" << nhits;
0179 }
0180
0181
0182
0183
0184 if (totEt > EtminSC_ && nhits >= nBadHitsSC_)
0185 pass = false;
0186 }
0187
0188
0189 if (pass == false && debug_)
0190 edm::LogInfo("EEBadScFilter") << "REJECT EVENT!!!";
0191
0192 iEvent.put(std::make_unique<bool>(pass));
0193
0194
0195
0196 return taggingMode_ || pass;
0197 }
0198
0199 #include "FWCore/Framework/interface/MakerMacros.h"
0200
0201 DEFINE_FWK_MODULE(EEBadScFilter);