File indexing completed on 2023-03-17 11:20:02
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #ifndef TCMETAlgo_h
0026 #define TCMETAlgo_h
0027
0028
0029 #include <vector>
0030 #include <string>
0031 #include "FWCore/Framework/interface/Event.h"
0032 #include "DataFormats/Common/interface/Handle.h"
0033 #include "FWCore/Framework/interface/ESHandle.h"
0034 #include "FWCore/Framework/interface/EventSetup.h"
0035 #include "DataFormats/Common/interface/ValueMap.h"
0036
0037 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0038 #include "DataFormats/Candidate/interface/CandidateFwd.h"
0039 #include "DataFormats/METReco/interface/CommonMETData.h"
0040 #include "DataFormats/METReco/interface/MET.h"
0041
0042 #include "DataFormats/EgammaCandidates/interface/Electron.h"
0043 #include "DataFormats/EgammaCandidates/interface/ElectronFwd.h"
0044 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
0045 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
0046
0047 #include "DataFormats/MuonReco/interface/Muon.h"
0048 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0049 #include "DataFormats/TrackReco/interface/TrackBase.h"
0050 #include "DataFormats/VertexReco/interface/Vertex.h"
0051 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0052 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0053 #include "DataFormats/METReco/interface/CaloMET.h"
0054 #include "DataFormats/METReco/interface/CaloMETCollection.h"
0055 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0056 #include "DataFormats/MuonReco/interface/MuonMETCorrectionData.h"
0057 #include "DataFormats/ParticleFlowReco/interface/PFClusterFwd.h"
0058
0059 #include "MagneticField/Engine/interface/MagneticField.h"
0060 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0061
0062 #include "FWCore/Framework/interface/ConsumesCollector.h"
0063
0064 #include "TH2D.h"
0065 #include "TVector3.h"
0066
0067
0068 class TCMETAlgo {
0069 public:
0070 typedef std::vector<const reco::Candidate> InputCollection;
0071 TCMETAlgo();
0072 virtual ~TCMETAlgo();
0073 reco::MET CalculateTCMET(edm::Event& event, const edm::EventSetup& setup);
0074 TH2D* getResponseFunction_fit();
0075 TH2D* getResponseFunction_mode();
0076 TH2D* getResponseFunction_shower();
0077 TH2D* getResponseFunction_noshower();
0078 void configure(const edm::ParameterSet& iConfig, edm::ConsumesCollector&& iConsumesCollector);
0079
0080 private:
0081 double met_x_;
0082 double met_y_;
0083 double sumEt_;
0084
0085 void initialize_MET_with_PFClusters(edm::Event& event);
0086 void initialize_MET_with_CaloMET(edm::Event& event);
0087 void correct_MET_for_Muons();
0088 void correct_MET_for_Tracks();
0089
0090 edm::Handle<reco::MuonCollection> muonHandle_;
0091 edm::Handle<reco::GsfElectronCollection> electronHandle_;
0092 edm::Handle<reco::TrackCollection> trackHandle_;
0093 edm::Handle<reco::BeamSpot> beamSpotHandle_;
0094 edm::Handle<reco::VertexCollection> vertexHandle_;
0095 edm::Handle<edm::ValueMap<reco::MuonMETCorrectionData> > muonDepValueMapHandle_;
0096 edm::Handle<edm::ValueMap<reco::MuonMETCorrectionData> > tcmetDepValueMapHandle_;
0097
0098 edm::ESHandle<MagneticField> magneticFieldHandle_;
0099
0100 edm::EDGetTokenT<reco::MuonCollection> muonToken_;
0101 edm::EDGetTokenT<reco::GsfElectronCollection> electronToken_;
0102 edm::EDGetTokenT<edm::View<reco::MET> > metToken_;
0103 edm::EDGetTokenT<reco::TrackCollection> trackToken_;
0104 edm::EDGetTokenT<reco::BeamSpot> beamSpotToken_;
0105 edm::EDGetTokenT<reco::VertexCollection> vertexToken_;
0106 edm::EDGetTokenT<reco::PFClusterCollection> clustersECALToken_;
0107 edm::EDGetTokenT<reco::PFClusterCollection> clustersHCALToken_;
0108 edm::EDGetTokenT<reco::PFClusterCollection> clustersHFToken_;
0109 edm::EDGetTokenT<edm::ValueMap<reco::MuonMETCorrectionData> > muonDepValueMapToken_;
0110 edm::EDGetTokenT<edm::ValueMap<reco::MuonMETCorrectionData> > tcmetDepValueMapToken_;
0111 edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> magneticFieldToken_;
0112
0113 bool usePFClusters_;
0114 int nLayers_;
0115 int nLayersTight_;
0116 int vertexNdof_;
0117 double vertexZ_;
0118 double vertexRho_;
0119 double vertexMaxDZ_;
0120 double maxpt_eta25_;
0121 double maxpt_eta20_;
0122 bool vetoDuplicates_;
0123 double dupMinPt_;
0124 double dupDPhi_;
0125 double dupDCotTh_;
0126 std::vector<int> duplicateTracks_;
0127
0128 double d0cuta_;
0129 double d0cutb_;
0130 double maxd0cut_;
0131 double maxchi2_tight_;
0132 double minhits_tight_;
0133 double maxPtErr_tight_;
0134 int nMinOuterHits_;
0135 std::vector<reco::TrackBase::TrackAlgorithm> trackAlgos_;
0136 double usedeltaRRejection_;
0137 double deltaRShower_;
0138 double minpt_;
0139 double maxpt_;
0140 double maxeta_;
0141 double maxchi2_;
0142 double minhits_;
0143 double maxPtErr_;
0144 double radius_;
0145 double zdist_;
0146 double corner_;
0147 double eVetoDeltaR_;
0148 double eVetoDeltaPhi_;
0149 double eVetoDeltaCotTheta_;
0150 double eVetoMinElectronPt_;
0151 double hOverECut_;
0152 std::vector<int> trkQuality_;
0153 std::vector<reco::TrackBase::TrackAlgorithm> trkAlgos_;
0154
0155 bool isCosmics_;
0156 bool correctShowerTracks_;
0157 bool electronVetoCone_;
0158 bool usePvtxd0_;
0159 bool checkTrackPropagation_;
0160
0161 class TH2D* response_function_;
0162 class TH2D* showerRF_;
0163 bool hasValidVertex_;
0164 const reco::VertexCollection* vertexColl_;
0165
0166 bool isMuon(const reco::TrackRef& trackRef);
0167 bool isElectron(const reco::TrackRef& trackRef);
0168 bool isGoodTrack(const reco::TrackRef trackRef);
0169 bool closeToElectron(const reco::TrackRef);
0170 void correctMETforMuon(const reco::TrackRef, reco::MuonRef& muonRef);
0171 void correctMETforMuon(reco::MuonRef& muonRef);
0172 void correctMETforTrack(const reco::TrackRef, TH2D* rf, const TVector3&);
0173 void correctSumEtForTrack(const reco::TrackRef, TH2D* rf, const TVector3&);
0174 class TVector3 propagateTrackToCalorimeterFace(const reco::TrackRef trackRef);
0175 void findGoodShowerTracks(std::vector<int>& goodShowerTracks);
0176 bool nearGoodShowerTrack(const reco::TrackRef, const std::vector<int>& goodShowerTracks);
0177 int nExpectedInnerHits(const reco::TrackRef);
0178 int nExpectedOuterHits(const reco::TrackRef);
0179 int nLayers(const reco::TrackRef);
0180 bool isValidVertex();
0181 void findDuplicateTracks();
0182 int vetoTrack(int i1, int i2);
0183 };
0184
0185
0186 #endif