File indexing completed on 2023-09-20 02:50:18
0001
0002 #include <memory>
0003
0004
0005 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0006 #include "DataFormats/Common/interface/Handle.h"
0007 #include "DataFormats/EgammaCandidates/interface/Electron.h"
0008 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
0009 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
0010 #include "DataFormats/TrackReco/interface/HitPattern.h"
0011 #include "DataFormats/TrackReco/interface/TrackExtra.h"
0012 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0013 #include "FWCore/Framework/interface/Event.h"
0014 #include "FWCore/Framework/interface/Frameworkfwd.h"
0015 #include "FWCore/Framework/interface/global/EDProducer.h"
0016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0017 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0020 #include "FWCore/Utilities/interface/InputTag.h"
0021 #include "FWCore/Utilities/interface/StreamID.h"
0022 #include "RecoTracker/TrackProducer/interface/TrackProducerBase.h"
0023
0024
0025 #include "TLorentzVector.h"
0026
0027 class ZtoEEElectronTrackProducer : public edm::global::EDProducer<> {
0028 public:
0029 explicit ZtoEEElectronTrackProducer(const edm::ParameterSet&);
0030 ~ZtoEEElectronTrackProducer() override = default;
0031 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0032
0033 void produce(edm::StreamID streamID, edm::Event& iEvent, edm::EventSetup const& iSetup) const override;
0034
0035 private:
0036
0037 const edm::InputTag electronTag_;
0038 const edm::InputTag bsTag_;
0039 const edm::EDGetTokenT<reco::GsfElectronCollection> electronToken_;
0040 const edm::EDGetTokenT<reco::BeamSpot> bsToken_;
0041
0042 const double maxEta_;
0043 const double minPt_;
0044 const double maxDeltaPhiInEB_;
0045 const double maxDeltaEtaInEB_;
0046 const double maxHOEEB_;
0047 const double maxSigmaiEiEEB_;
0048 const double maxDeltaPhiInEE_;
0049 const double maxDeltaEtaInEE_;
0050 const double maxHOEEE_;
0051 const double maxSigmaiEiEEE_;
0052 const double maxNormChi2_;
0053 const double maxD0_;
0054 const double maxDz_;
0055 const int minPixelHits_;
0056 const int minStripHits_;
0057 const double maxIso_;
0058 const double minPtHighest_;
0059 const double minInvMass_;
0060 const double maxInvMass_;
0061 };
0062
0063 using namespace std;
0064 using namespace edm;
0065
0066 void ZtoEEElectronTrackProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0067 edm::ParameterSetDescription desc;
0068 desc.addUntracked<edm::InputTag>("electronInputTag", edm::InputTag("gedGsfElectrons"));
0069 desc.addUntracked<edm::InputTag>("offlineBeamSpot", edm::InputTag("offlineBeamSpot"));
0070 desc.addUntracked<double>("maxEta", 2.4);
0071 desc.addUntracked<double>("minPt", 5);
0072 desc.addUntracked<double>("maxDeltaPhiInEB", 0.15);
0073 desc.addUntracked<double>("maxDeltaEtaInEB", 0.007);
0074 desc.addUntracked<double>("maxHOEEB", 0.12);
0075 desc.addUntracked<double>("maxSigmaiEiEEB", 0.01);
0076 desc.addUntracked<double>("maxDeltaPhiInEE", 0.1);
0077 desc.addUntracked<double>("maxDeltaEtaInEE", 0.009);
0078 desc.addUntracked<double>("maxHOEEB_", .10);
0079 desc.addUntracked<double>("maxSigmaiEiEEE", 0.03);
0080 desc.addUntracked<double>("maxNormChi2", 10);
0081 desc.addUntracked<double>("maxD0", 0.02);
0082 desc.addUntracked<double>("maxDz", 20.);
0083 desc.addUntracked<unsigned int>("minPixelHits", 1);
0084 desc.addUntracked<unsigned int>("minStripHits", 8);
0085 desc.addUntracked<double>("maxIso", 0.3);
0086 desc.addUntracked<double>("minPtHighest", 24);
0087 desc.addUntracked<double>("minInvMass", 60);
0088 desc.addUntracked<double>("maxInvMass", 120);
0089 descriptions.addWithDefaultLabel(desc);
0090 }
0091
0092 ZtoEEElectronTrackProducer::ZtoEEElectronTrackProducer(const edm::ParameterSet& ps)
0093 : electronTag_(ps.getUntrackedParameter<edm::InputTag>("electronInputTag", edm::InputTag("gedGsfElectrons"))),
0094 bsTag_(ps.getUntrackedParameter<edm::InputTag>("offlineBeamSpot", edm::InputTag("offlineBeamSpot"))),
0095 electronToken_(consumes<reco::GsfElectronCollection>(electronTag_)),
0096 bsToken_(consumes<reco::BeamSpot>(bsTag_)),
0097 maxEta_(ps.getUntrackedParameter<double>("maxEta", 2.4)),
0098 minPt_(ps.getUntrackedParameter<double>("minPt", 5)),
0099 maxDeltaPhiInEB_(ps.getUntrackedParameter<double>("maxDeltaPhiInEB", 0.15)),
0100 maxDeltaEtaInEB_(ps.getUntrackedParameter<double>("maxDeltaEtaInEB", 0.007)),
0101 maxHOEEB_(ps.getUntrackedParameter<double>("maxHOEEB", 0.12)),
0102 maxSigmaiEiEEB_(ps.getUntrackedParameter<double>("maxSigmaiEiEEB", 0.01)),
0103 maxDeltaPhiInEE_(ps.getUntrackedParameter<double>("maxDeltaPhiInEE", 0.1)),
0104 maxDeltaEtaInEE_(ps.getUntrackedParameter<double>("maxDeltaEtaInEE", 0.009)),
0105 maxHOEEE_(ps.getUntrackedParameter<double>("maxHOEEB_", .10)),
0106 maxSigmaiEiEEE_(ps.getUntrackedParameter<double>("maxSigmaiEiEEE", 0.03)),
0107 maxNormChi2_(ps.getUntrackedParameter<double>("maxNormChi2", 10)),
0108 maxD0_(ps.getUntrackedParameter<double>("maxD0", 0.02)),
0109 maxDz_(ps.getUntrackedParameter<double>("maxDz", 20.)),
0110 minPixelHits_(ps.getUntrackedParameter<uint32_t>("minPixelHits", 1)),
0111 minStripHits_(ps.getUntrackedParameter<uint32_t>("minStripHits", 8)),
0112 maxIso_(ps.getUntrackedParameter<double>("maxIso", 0.3)),
0113 minPtHighest_(ps.getUntrackedParameter<double>("minPtHighest", 24)),
0114 minInvMass_(ps.getUntrackedParameter<double>("minInvMass", 60)),
0115 maxInvMass_(ps.getUntrackedParameter<double>("maxInvMass", 120)) {
0116 produces<reco::TrackCollection>("");
0117 }
0118
0119 void ZtoEEElectronTrackProducer::produce(edm::StreamID streamID,
0120 edm::Event& iEvent,
0121 edm::EventSetup const& iSetup) const {
0122 std::unique_ptr<reco::TrackCollection> outputTColl(new reco::TrackCollection());
0123
0124
0125 edm::Handle<reco::GsfElectronCollection> electronColl;
0126 iEvent.getByToken(electronToken_, electronColl);
0127
0128 edm::Handle<reco::BeamSpot> beamSpot;
0129 iEvent.getByToken(bsToken_, beamSpot);
0130
0131 if (electronColl.isValid()) {
0132 for (auto const& ele : *electronColl) {
0133 if (!ele.ecalDriven())
0134 continue;
0135 if (ele.pt() < minPt_)
0136 continue;
0137
0138 if (!(ele.isEB() || ele.isEE()))
0139 continue;
0140
0141 double hOverE = ele.hadronicOverEm();
0142 double sigmaee = ele.sigmaIetaIeta();
0143 double deltaPhiIn = ele.deltaPhiSuperClusterTrackAtVtx();
0144 double deltaEtaIn = ele.deltaEtaSuperClusterTrackAtVtx();
0145
0146
0147 if (ele.isEB()) {
0148 if (fabs(deltaPhiIn) >= maxDeltaPhiInEB_ && fabs(deltaEtaIn) >= maxDeltaEtaInEB_ && hOverE >= maxHOEEB_ &&
0149 sigmaee >= maxSigmaiEiEEB_)
0150 continue;
0151 } else if (ele.isEE()) {
0152 if (fabs(deltaPhiIn) >= maxDeltaPhiInEE_ && fabs(deltaEtaIn) >= maxDeltaEtaInEE_ && hOverE >= maxHOEEE_ &&
0153 sigmaee >= maxSigmaiEiEEE_)
0154 continue;
0155 }
0156
0157 reco::GsfTrackRef trk = ele.gsfTrack();
0158 reco::TrackRef tk = ele.closestCtfTrackRef();
0159 if (!trk.isNonnull())
0160 continue;
0161 if (!tk.isNonnull())
0162 continue;
0163 double chi2 = trk->chi2();
0164 double ndof = trk->ndof();
0165 double chbyndof = (ndof > 0) ? chi2 / ndof : 0;
0166 if (chbyndof >= maxNormChi2_)
0167 continue;
0168
0169 double trkd0 = trk->d0();
0170 if (beamSpot.isValid()) {
0171 trkd0 = -(trk->dxy(beamSpot->position()));
0172 } else {
0173 edm::LogError("ZtoEEElectronTrackProducer") << "Error >> Failed to get BeamSpot for label: " << bsTag_;
0174 }
0175 if (std::abs(trkd0) >= maxD0_)
0176 continue;
0177
0178 const reco::HitPattern& hitp = trk->hitPattern();
0179 int nPixelHits = hitp.numberOfValidPixelHits();
0180 if (nPixelHits < minPixelHits_)
0181 continue;
0182
0183 int nStripHits = hitp.numberOfValidStripHits();
0184 if (nStripHits < minStripHits_)
0185 continue;
0186
0187
0188 reco::GsfElectron::PflowIsolationVariables pfIso = ele.pfIsolationVariables();
0189 const float eiso =
0190 pfIso.sumChargedHadronPt + std::max(0.0, pfIso.sumNeutralHadronEt + pfIso.sumPhotonEt - 0.5 * pfIso.sumPUPt);
0191 if (eiso > maxIso_ * ele.pt())
0192 continue;
0193
0194 outputTColl->push_back(*tk);
0195 }
0196 } else {
0197 edm::LogError("ZtoEEElectronTrackProducer")
0198 << "Error >> Failed to get ElectronCollection for label: " << electronTag_;
0199 }
0200
0201 iEvent.put(std::move(outputTColl));
0202 }
0203
0204
0205 #include "FWCore/Framework/interface/MakerMacros.h"
0206 DEFINE_FWK_MODULE(ZtoEEElectronTrackProducer);