File indexing completed on 2024-09-07 04:37:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021
0022
0023
0024 #include "FWCore/Framework/interface/Frameworkfwd.h"
0025 #include "FWCore/Framework/interface/stream/EDProducer.h"
0026 #include "FWCore/Framework/interface/Event.h"
0027 #include "FWCore/Framework/interface/MakerMacros.h"
0028 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0029
0030 #include "RecoJets/JetPlusTracks/plugins/JetPlusTrackProducer.h"
0031 #include "DataFormats/JetReco/interface/CaloJetCollection.h"
0032 #include "DataFormats/JetReco/interface/CaloJet.h"
0033 #include "DataFormats/JetReco/interface/JPTJetCollection.h"
0034 #include "DataFormats/JetReco/interface/JPTJet.h"
0035 #include "DataFormats/JetReco/interface/TrackJetCollection.h"
0036 #include "DataFormats/JetReco/interface/TrackJet.h"
0037 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0038 #include "DataFormats/TrackReco/interface/Track.h"
0039 #include "DataFormats/JetReco/interface/Jet.h"
0040 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0041 #include "DataFormats/VertexReco/interface/Vertex.h"
0042 #include "DataFormats/Math/interface/deltaPhi.h"
0043 #include "DataFormats/Math/interface/deltaR.h"
0044 #include <string>
0045
0046 using namespace std;
0047 using namespace jpt;
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 JetPlusTrackProducer::JetPlusTrackProducer(const edm::ParameterSet& iConfig) {
0061
0062 src_ = iConfig.getParameter<edm::InputTag>("src");
0063 srcTrackJets_ = iConfig.getParameter<edm::InputTag>("srcTrackJets");
0064 alias_ = iConfig.getUntrackedParameter<string>("alias");
0065 srcPVs_ = iConfig.getParameter<edm::InputTag>("srcPVs");
0066 vectorial_ = iConfig.getParameter<bool>("VectorialCorrection");
0067 useZSP_ = iConfig.getParameter<bool>("UseZSP");
0068 ptCUT_ = iConfig.getParameter<double>("ptCUT");
0069 dRcone_ = iConfig.getParameter<double>("dRcone");
0070 usePAT_ = iConfig.getParameter<bool>("UsePAT");
0071
0072 mJPTalgo = new JetPlusTrackCorrector(iConfig, consumesCollector());
0073 if (useZSP_)
0074 mZSPalgo = new ZSPJPTJetCorrector(iConfig);
0075
0076 produces<reco::JPTJetCollection>().setBranchAlias(alias_);
0077 produces<reco::CaloJetCollection>().setBranchAlias("ak4CaloJetsJPT");
0078
0079 input_jets_token_ = consumes<edm::View<reco::CaloJet> >(src_);
0080 input_addjets_token_ = consumes<edm::View<reco::CaloJet> >(iConfig.getParameter<edm::InputTag>("srcAddCaloJets"));
0081 input_trackjets_token_ = consumes<edm::View<reco::TrackJet> >(srcTrackJets_);
0082 input_vertex_token_ = consumes<reco::VertexCollection>(srcPVs_);
0083 mExtrapolations_ =
0084 consumes<std::vector<reco::TrackExtrapolation> >(iConfig.getParameter<edm::InputTag>("extrapolations"));
0085 }
0086
0087 JetPlusTrackProducer::~JetPlusTrackProducer() {
0088
0089
0090 }
0091
0092
0093
0094
0095 bool sort_by_pt(const reco::JPTJet& a, const reco::JPTJet& b) { return (a.pt() > b.pt()); }
0096
0097
0098 void JetPlusTrackProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0099 using namespace edm;
0100
0101 auto const& jets_h = iEvent.get(input_jets_token_);
0102 auto const& addjets_h = iEvent.get(input_addjets_token_);
0103 auto const& iExtrapolations = iEvent.get(mExtrapolations_);
0104 edm::RefProd<reco::CaloJetCollection> pOut1RefProd = iEvent.getRefBeforePut<reco::CaloJetCollection>();
0105 edm::Ref<reco::CaloJetCollection>::key_type idxCaloJet = 0;
0106
0107 auto pOut = std::make_unique<reco::JPTJetCollection>();
0108 auto pOut1 = std::make_unique<reco::CaloJetCollection>();
0109
0110 double scaleJPT = 1.;
0111 for (auto const& jet : iEvent.get(input_trackjets_token_)) {
0112 int icalo = -1;
0113 int i = 0;
0114 for (auto const& oldjet : addjets_h) {
0115 double dr2 = deltaR2(jet, oldjet);
0116 if (dr2 <= dRcone_ * dRcone_) {
0117 icalo = i;
0118 }
0119 i++;
0120 }
0121 if (icalo < 0)
0122 continue;
0123 auto const& mycalo = addjets_h[icalo];
0124 std::vector<edm::Ptr<reco::Track> > tracksinjet = jet.tracks();
0125 reco::TrackRefVector tracksincalo;
0126 reco::TrackRefVector tracksinvert;
0127 for (auto const& itrack : tracksinjet) {
0128 for (auto const& ixtrp : iExtrapolations) {
0129 if (ixtrp.positions().empty())
0130 continue;
0131 if (usePAT_) {
0132 double mydphi = deltaPhi(ixtrp.track()->phi(), itrack->phi());
0133 if (fabs(ixtrp.track()->pt() - itrack->pt()) > 0.001 || fabs(ixtrp.track()->eta() - itrack->eta()) > 0.001 ||
0134 mydphi > 0.001)
0135 continue;
0136 } else {
0137 if (itrack.id() != ixtrp.track().id() || itrack.key() != ixtrp.track().key())
0138 continue;
0139 }
0140 tracksinvert.push_back(ixtrp.track());
0141 reco::TrackBase::Point const& point = ixtrp.positions().at(0);
0142 double dr2 = deltaR2(jet, point);
0143 if (dr2 <= dRcone_ * dRcone_) {
0144 tracksincalo.push_back(ixtrp.track());
0145 }
0146 }
0147 }
0148
0149 const reco::TrackJet& corrected = jet;
0150 math::XYZTLorentzVector p4;
0151 jpt::MatchedTracks pions;
0152 jpt::MatchedTracks muons;
0153 jpt::MatchedTracks elecs;
0154
0155 scaleJPT =
0156 mJPTalgo->correction(corrected, mycalo, iEvent, iSetup, tracksinvert, tracksincalo, p4, pions, muons, elecs);
0157 if (p4.pt() > ptCUT_) {
0158 reco::JPTJet::Specific jptspe;
0159 jptspe.pionsInVertexInCalo = pions.inVertexInCalo_;
0160 jptspe.pionsInVertexOutCalo = pions.inVertexOutOfCalo_;
0161 jptspe.pionsOutVertexInCalo = pions.outOfVertexInCalo_;
0162 jptspe.muonsInVertexInCalo = muons.inVertexInCalo_;
0163 jptspe.muonsInVertexOutCalo = muons.inVertexOutOfCalo_;
0164 jptspe.muonsOutVertexInCalo = muons.outOfVertexInCalo_;
0165 jptspe.elecsInVertexInCalo = elecs.inVertexInCalo_;
0166 jptspe.elecsInVertexOutCalo = elecs.inVertexOutOfCalo_;
0167 jptspe.elecsOutVertexInCalo = elecs.outOfVertexInCalo_;
0168 reco::CaloJetRef myjet(pOut1RefProd, idxCaloJet++);
0169 jptspe.theCaloJetRef = edm::RefToBase<reco::Jet>(myjet);
0170 jptspe.JPTSeed = 1;
0171 reco::JPTJet fJet(p4, jet.primaryVertex()->position(), jptspe, mycalo.getJetConstituents());
0172 pOut->push_back(fJet);
0173 pOut1->push_back(mycalo);
0174 }
0175 }
0176
0177 int iJet = 0;
0178 for (auto const& oldjet : jets_h) {
0179 reco::CaloJet corrected = oldjet;
0180
0181
0182 double factorZSP = 1.;
0183 if (useZSP_)
0184 factorZSP = mZSPalgo->correction(corrected, iEvent, iSetup);
0185 corrected.scaleEnergy(factorZSP);
0186
0187
0188 scaleJPT = 1.;
0189
0190 math::XYZTLorentzVector p4;
0191
0192 jpt::MatchedTracks pions;
0193 jpt::MatchedTracks muons;
0194 jpt::MatchedTracks elecs;
0195 bool validMatches = false;
0196
0197 if (!vectorial_) {
0198 scaleJPT = mJPTalgo->correction(corrected, oldjet, iEvent, iSetup, pions, muons, elecs, validMatches);
0199 p4 = math::XYZTLorentzVector(corrected.px() * scaleJPT,
0200 corrected.py() * scaleJPT,
0201 corrected.pz() * scaleJPT,
0202 corrected.energy() * scaleJPT);
0203 } else {
0204 scaleJPT = mJPTalgo->correction(corrected, oldjet, iEvent, iSetup, p4, pions, muons, elecs, validMatches);
0205 }
0206
0207 reco::JPTJet::Specific specific;
0208
0209 if (validMatches) {
0210 specific.pionsInVertexInCalo = pions.inVertexInCalo_;
0211 specific.pionsInVertexOutCalo = pions.inVertexOutOfCalo_;
0212 specific.pionsOutVertexInCalo = pions.outOfVertexInCalo_;
0213 specific.muonsInVertexInCalo = muons.inVertexInCalo_;
0214 specific.muonsInVertexOutCalo = muons.inVertexOutOfCalo_;
0215 specific.muonsOutVertexInCalo = muons.outOfVertexInCalo_;
0216 specific.elecsInVertexInCalo = elecs.inVertexInCalo_;
0217 specific.elecsInVertexOutCalo = elecs.inVertexOutOfCalo_;
0218 specific.elecsOutVertexInCalo = elecs.outOfVertexInCalo_;
0219 }
0220
0221
0222 specific.theCaloJetRef = edm::RefToBase<reco::Jet>(jets_h.refAt(iJet));
0223 specific.mResponseOfChargedWithEff = (float)mJPTalgo->getResponseOfChargedWithEff();
0224 specific.mResponseOfChargedWithoutEff = (float)mJPTalgo->getResponseOfChargedWithoutEff();
0225 specific.mSumPtOfChargedWithEff = (float)mJPTalgo->getSumPtWithEff();
0226 specific.mSumPtOfChargedWithoutEff = (float)mJPTalgo->getSumPtWithoutEff();
0227 specific.mSumEnergyOfChargedWithEff = (float)mJPTalgo->getSumEnergyWithEff();
0228 specific.mSumEnergyOfChargedWithoutEff = (float)mJPTalgo->getSumEnergyWithoutEff();
0229 specific.mChargedHadronEnergy = (float)mJPTalgo->getSumEnergyWithoutEff();
0230
0231
0232
0233 double deR2Tr = 0.;
0234 double deEta2Tr = 0.;
0235 double dePhi2Tr = 0.;
0236 double Zch = 0.;
0237 double Pout2 = 0.;
0238 double Pout = 0.;
0239 double denominator_tracks = 0.;
0240 int ntracks = 0;
0241
0242 for (reco::TrackRefVector::const_iterator it = pions.inVertexInCalo_.begin(); it != pions.inVertexInCalo_.end();
0243 it++) {
0244 double deR = deltaR((*it)->eta(), (*it)->phi(), p4.eta(), p4.phi());
0245 double deEta = (*it)->eta() - p4.eta();
0246 double dePhi = deltaPhi((*it)->phi(), p4.phi());
0247 if ((**it).ptError() / (**it).pt() < 0.1) {
0248 deR2Tr = deR2Tr + deR * deR * (*it)->pt();
0249 deEta2Tr = deEta2Tr + deEta * deEta * (*it)->pt();
0250 dePhi2Tr = dePhi2Tr + dePhi * dePhi * (*it)->pt();
0251 denominator_tracks = denominator_tracks + (*it)->pt();
0252 Zch = Zch + (*it)->pt();
0253
0254 Pout2 = Pout2 + (**it).p() * (**it).p() - (Zch * p4.P()) * (Zch * p4.P());
0255 ntracks++;
0256 }
0257 }
0258 for (reco::TrackRefVector::const_iterator it = muons.inVertexInCalo_.begin(); it != muons.inVertexInCalo_.end();
0259 it++) {
0260 double deR = deltaR((*it)->eta(), (*it)->phi(), p4.eta(), p4.phi());
0261 double deEta = (*it)->eta() - p4.eta();
0262 double dePhi = deltaPhi((*it)->phi(), p4.phi());
0263 if ((**it).ptError() / (**it).pt() < 0.1) {
0264 deR2Tr = deR2Tr + deR * deR * (*it)->pt();
0265 deEta2Tr = deEta2Tr + deEta * deEta * (*it)->pt();
0266 dePhi2Tr = dePhi2Tr + dePhi * dePhi * (*it)->pt();
0267 denominator_tracks = denominator_tracks + (*it)->pt();
0268 Zch = Zch + (*it)->pt();
0269
0270 Pout2 = Pout2 + (**it).p() * (**it).p() - (Zch * p4.P()) * (Zch * p4.P());
0271 ntracks++;
0272 }
0273 }
0274 for (reco::TrackRefVector::const_iterator it = elecs.inVertexInCalo_.begin(); it != elecs.inVertexInCalo_.end();
0275 it++) {
0276 double deR = deltaR((*it)->eta(), (*it)->phi(), p4.eta(), p4.phi());
0277 double deEta = (*it)->eta() - p4.eta();
0278 double dePhi = deltaPhi((*it)->phi(), p4.phi());
0279 if ((**it).ptError() / (**it).pt() < 0.1) {
0280 deR2Tr = deR2Tr + deR * deR * (*it)->pt();
0281 deEta2Tr = deEta2Tr + deEta * deEta * (*it)->pt();
0282 dePhi2Tr = dePhi2Tr + dePhi * dePhi * (*it)->pt();
0283 denominator_tracks = denominator_tracks + (*it)->pt();
0284 Zch = Zch + (*it)->pt();
0285
0286 Pout2 = Pout2 + (**it).p() * (**it).p() - (Zch * p4.P()) * (Zch * p4.P());
0287 ntracks++;
0288 }
0289 }
0290
0291 for (reco::TrackRefVector::const_iterator it = pions.inVertexOutOfCalo_.begin();
0292 it != pions.inVertexOutOfCalo_.end();
0293 it++) {
0294 Zch = Zch + (*it)->pt();
0295 }
0296 for (reco::TrackRefVector::const_iterator it = muons.inVertexOutOfCalo_.begin();
0297 it != muons.inVertexOutOfCalo_.end();
0298 it++) {
0299 Zch = Zch + (*it)->pt();
0300 }
0301 for (reco::TrackRefVector::const_iterator it = elecs.inVertexOutOfCalo_.begin();
0302 it != elecs.inVertexOutOfCalo_.end();
0303 it++) {
0304 Zch = Zch + (*it)->pt();
0305 }
0306
0307 if (mJPTalgo->getSumPtForBeta() > 0.)
0308 Zch = Zch / mJPTalgo->getSumPtForBeta();
0309
0310 if (ntracks > 0) {
0311 Pout = sqrt(fabs(Pout2)) / ntracks;
0312 }
0313 if (denominator_tracks != 0) {
0314 deR2Tr = deR2Tr / denominator_tracks;
0315 deEta2Tr = deEta2Tr / denominator_tracks;
0316 dePhi2Tr = dePhi2Tr / denominator_tracks;
0317 }
0318
0319 specific.R2momtr = deR2Tr;
0320 specific.Eta2momtr = deEta2Tr;
0321 specific.Phi2momtr = dePhi2Tr;
0322 specific.Pout = Pout;
0323 specific.Zch = Zch;
0324
0325
0326 reco::Particle::Point vertex_ = reco::Jet::Point(0, 0, 0);
0327
0328
0329 edm::Handle<reco::VertexCollection> pvCollection;
0330 iEvent.getByToken(input_vertex_token_, pvCollection);
0331 if (pvCollection.isValid() && !pvCollection->empty())
0332 vertex_ = pvCollection->begin()->position();
0333
0334 reco::JPTJet fJet(p4, vertex_, specific, corrected.getJetConstituents());
0335 iJet++;
0336
0337
0338 if (fJet.pt() > ptCUT_)
0339 pOut->push_back(fJet);
0340 }
0341 std::sort(pOut->begin(), pOut->end(), sort_by_pt);
0342 iEvent.put(std::move(pOut1));
0343 iEvent.put(std::move(pOut));
0344 }
0345
0346
0347