Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-09-20 02:50:18

0001 // system includes
0002 #include <memory>
0003 
0004 // user includes
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 // ROOT includes
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   // ----------member data ---------------------------
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   // Read Electron Collection
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       // set a max Eta cut
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       // separate cut for barrel and endcap
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;  // only electrons with tracks
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       // DB corrected PF Isolation
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 // Define this as a plug-in
0205 #include "FWCore/Framework/interface/MakerMacros.h"
0206 DEFINE_FWK_MODULE(ZtoEEElectronTrackProducer);