diff --git a/HLTrigger/JetMET/plugins/PixelJetPuId.cc b/HLTrigger/JetMET/plugins/PixelJetPuId.cc index c32c3f40a82bf..12afead3325b7 100644 --- a/HLTrigger/JetMET/plugins/PixelJetPuId.cc +++ b/HLTrigger/JetMET/plugins/PixelJetPuId.cc @@ -5,13 +5,13 @@ // /**\class PixelJetPuId PixelJetPuId.cc RecoBTag/PixelJetPuId/src/PixelJetPuId.cc - Description: - The PixelJetPuId module select all the pixel tracks compatible with a jet. - If the sum of the tracks momentum is under a threshold the jet is tagged as "PUjets". +Description: +The PixelJetPuId module select all the pixel tracks compatible with a jet. +If the sum of the tracks momentum is under a threshold the jet is tagged as "PUjets". - Implementation: - [Notes on implementation] -*/ +Implementation: +[Notes on implementation] + */ // // Original Author: Silvio DONATO // Created: Wed Dec 18 10:05:40 CET 2013 @@ -28,6 +28,7 @@ #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/makeRefToBaseProdFrom.h" #include "FWCore/Utilities/interface/InputTag.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" @@ -46,40 +47,41 @@ #include "TrackingTools/Records/interface/TransientTrackRecord.h" #include "DataFormats/Math/interface/deltaR.h" - +#include "DataFormats/BTauReco/interface/JetTag.h" +#include "DataFormats/Common/interface/RefToBase.h" // // class declaration // class PixelJetPuId : public edm::global::EDProducer <>{ - public: - PixelJetPuId(const edm::ParameterSet&); - virtual ~PixelJetPuId(); - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - - private: - virtual void produce(edm::StreamID sid, edm::Event&, const edm::EventSetup&) const override; - - - // ----------member data --------------------------- - edm::InputTag m_primaryVertex; - edm::InputTag m_tracks; - edm::InputTag m_jets; - edm::EDGetTokenT > tracksToken; - edm::EDGetTokenT > jetsToken; - edm::EDGetTokenT primaryVertexToken; - - double m_MinTrackPt; - double m_MaxTrackChi2; - double m_MaxTrackDistanceToJet; - - bool m_fwjets; - double m_mineta_fwjets; - double m_minet_fwjets; - - double m_MinGoodJetTrackPt; - double m_MinGoodJetTrackPtRatio; + public: + PixelJetPuId(const edm::ParameterSet&); + virtual ~PixelJetPuId(); + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + + private: + virtual void produce(edm::StreamID sid, edm::Event&, const edm::EventSetup&) const override; + + // ----------member data --------------------------- + edm::InputTag m_primaryVertex; + edm::InputTag m_tracks; + edm::InputTag m_jets; + edm::EDGetTokenT > tracksToken; + edm::EDGetTokenT > jetsToken; + edm::EDGetTokenT > generaljetsToken; + edm::EDGetTokenT primaryVertexToken; + + double m_MinTrackPt; + double m_MaxTrackChi2; + double m_MaxTrackDistanceToJet; + + bool m_fwjets; + double m_mineta_fwjets; + double m_minet_fwjets; + + double m_MinGoodJetTrackPt; + double m_MinGoodJetTrackPtRatio; }; @@ -88,29 +90,31 @@ class PixelJetPuId : public edm::global::EDProducer <>{ // PixelJetPuId::PixelJetPuId(const edm::ParameterSet& iConfig) { - //InputTag - m_tracks = iConfig.getParameter("tracks"); - tracksToken = consumes >(m_tracks); - m_jets = iConfig.getParameter("jets"); - jetsToken = consumes >(m_jets); - m_primaryVertex = iConfig.getParameter("primaryVertex"); - primaryVertexToken = consumes(m_primaryVertex); - - //Tracks Selection - m_MinTrackPt = iConfig.getParameter("MinTrackPt"); - m_MaxTrackDistanceToJet = iConfig.getParameter("MaxTrackDistanceToJet"); - m_MaxTrackChi2 = iConfig.getParameter("MaxTrackChi2"); - - //A jet is defined as a signal jet if Sum(trackPt) > minPt or Sum(comp.trackPt)/CaloJetPt > minPtRatio - m_MinGoodJetTrackPt = iConfig.getParameter("MinGoodJetTrackPt"); - m_MinGoodJetTrackPtRatio = iConfig.getParameter("MinGoodJetTrackPtRatio"); - - m_fwjets = iConfig.getParameter("UseForwardJetsAsNoPU"); - m_mineta_fwjets = iConfig.getParameter("MinEtaForwardJets"); - m_minet_fwjets = iConfig.getParameter("MinEtForwardJets"); - - produces >(); - produces >("PUjets"); + //InputTag + m_tracks = iConfig.getParameter("tracks"); + tracksToken = consumes >(m_tracks); + m_jets = iConfig.getParameter("jets"); + jetsToken = consumes >(m_jets); + generaljetsToken = consumes >(m_jets); + m_primaryVertex = iConfig.getParameter("primaryVertex"); + primaryVertexToken = consumes(m_primaryVertex); + + //Tracks Selection + m_MinTrackPt = iConfig.getParameter("MinTrackPt"); + m_MaxTrackDistanceToJet = iConfig.getParameter("MaxTrackDistanceToJet"); + m_MaxTrackChi2 = iConfig.getParameter("MaxTrackChi2"); + + //A jet is defined as a signal jet if Sum(trackPt) > minPt or Sum(comp.trackPt)/CaloJetPt > minPtRatio + m_MinGoodJetTrackPt = iConfig.getParameter("MinGoodJetTrackPt"); + m_MinGoodJetTrackPtRatio = iConfig.getParameter("MinGoodJetTrackPtRatio"); + + m_fwjets = iConfig.getParameter("UseForwardJetsAsNoPU"); + m_mineta_fwjets = iConfig.getParameter("MinEtaForwardJets"); + m_minet_fwjets = iConfig.getParameter("MinEtForwardJets"); + + produces >(); + produces >("PUjets"); + produces(); } @@ -119,19 +123,19 @@ PixelJetPuId::~PixelJetPuId() {} void PixelJetPuId::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { - edm::ParameterSetDescription desc; - desc.add ("jets",edm::InputTag("hltCaloJetL1FastJetCorrected")); - desc.add ("tracks",edm::InputTag("hltPixelTracksNoPU")); - desc.add ("primaryVertex",edm::InputTag("hltFastPVPixelVertices")); - desc.add("MinGoodJetTrackPtRatio",0.045); - desc.add("MinGoodJetTrackPt",1.8); - desc.add("MaxTrackDistanceToJet",0.04); - desc.add("MinTrackPt",0.6); - desc.add("MaxTrackChi2",20.); - desc.add("UseForwardJetsAsNoPU",true); - desc.add("MinEtaForwardJets",2.4); - desc.add("MinEtForwardJets",40.); - descriptions.add("pixelJetPuId",desc); + edm::ParameterSetDescription desc; + desc.add ("jets",edm::InputTag("hltCaloJetL1FastJetCorrected")); + desc.add ("tracks",edm::InputTag("hltPixelTracksNoPU")); + desc.add ("primaryVertex",edm::InputTag("hltFastPVPixelVertices")); + desc.add("MinGoodJetTrackPtRatio",0.045); + desc.add("MinGoodJetTrackPt",1.8); + desc.add("MaxTrackDistanceToJet",0.04); + desc.add("MinTrackPt",0.6); + desc.add("MaxTrackChi2",20.); + desc.add("UseForwardJetsAsNoPU",true); + desc.add("MinEtaForwardJets",2.4); + desc.add("MinEtForwardJets",40.); + descriptions.add("pixelJetPuId",desc); } // @@ -141,81 +145,95 @@ PixelJetPuId::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { // ------------ method called on each new Event ------------ void PixelJetPuId::produce(edm::StreamID sid, edm::Event& iEvent, const edm::EventSetup& iSetup) const { - using namespace edm; - std::unique_ptr > pOut(new std::vector ); - std::unique_ptr > pOut_PUjets(new std::vector ); - - //get tracks - Handle > tracks; - iEvent.getByToken(tracksToken, tracks); - unsigned int tsize = tracks->size(); - float teta[tsize], tphi[tsize]; - unsigned int i=0; - for (auto const & tr : *tracks) { teta[i]=tr.eta(); tphi[i]=tr.phi();++i;} - - //get jets - Handle > jets; - iEvent.getByToken(jetsToken, jets); - - //get primary vertices - Handle primaryVertex; - iEvent.getByToken(primaryVertexToken, primaryVertex); - - //get Transient Track Builder - edm::ESHandle builder; - iSetup.get().get("TransientTrackBuilder", builder); - - //loop on trackIPTagInfos - if(primaryVertex->size()>0) + using namespace edm; + std::unique_ptr > pOut(new std::vector ); + std::unique_ptr > pOut_PUjets(new std::vector ); + std::unique_ptr pOut_jetTagCollection(new reco::JetTagCollection ); + + //get tracks + Handle > tracks; + iEvent.getByToken(tracksToken, tracks); + unsigned int tsize = tracks->size(); + float teta[tsize], tphi[tsize]; + unsigned int i=0; + for (auto const & tr : *tracks) { teta[i]=tr.eta(); tphi[i]=tr.phi();++i;} + + //get jets + Handle > jets; + iEvent.getByToken(jetsToken, jets); + + Handle > generaljets; + iEvent.getByToken(generaljetsToken, generaljets); + + //get primary vertices + Handle primaryVertex; + iEvent.getByToken(primaryVertexToken, primaryVertex); + + //get Transient Track Builder + edm::ESHandle builder; + iSetup.get().get("TransientTrackBuilder", builder); + + //init JetTagCollection + if(generaljets.product()->size()>0) { - const reco::Vertex* pv = &*primaryVertex->begin(); - //loop on jets - for(edm::View::const_iterator itJet = jets->begin(); itJet != jets->end(); itJet++ ) { - - math::XYZVector jetMomentum = itJet->momentum(); - GlobalVector direction(jetMomentum.x(), jetMomentum.y(), jetMomentum.z()); - - math::XYZVector trMomentum; - - //loop on tracks - if(fabs(itJet->eta())>m_mineta_fwjets) - { - if((m_fwjets) && (itJet->et()>m_minet_fwjets)) - pOut->push_back(*itJet);// fill forward jet as signal jet - } - else - { - std::vector::const_iterator itTrack = tracks->begin(); - for (unsigned int i=0; ieta(),itJet->phi(), teta[i],tphi[i]); - if(deltaR2<0.25) { - reco::TransientTrack transientTrack = builder->build(*itTrack); - float jetTrackDistance = -((IPTools::jetTrackDistance(transientTrack, direction, *pv)).second).value(); - - //select the tracks compabible with the jet - if(( itTrack->pt() > m_MinTrackPt) && ( itTrack->normalizedChi2() < m_MaxTrackChi2) && (jetTrackDistancemomentum(); //calculate the Sum(trackPt) - } - } - itTrack++; - } - //if Sum(comp.trackPt)/CaloJetPt > minPtRatio or Sum(trackPt) > minPt the jet is a signal jet - if(trMomentum.rho()/jetMomentum.rho() > m_MinGoodJetTrackPtRatio || trMomentum.rho() > m_MinGoodJetTrackPt ) - { - pOut->push_back(*itJet); // fill it as signal jet - } - else//else it is a PUjet - { - pOut_PUjets->push_back(*itJet); // fill it as PUjets - } - } - } + edm::RefToBase jj = edm::RefToBase(generaljets,0); + pOut_jetTagCollection.reset(new reco::JetTagCollection(edm::makeRefToBaseProdFrom(jj, iEvent))); } - iEvent.put(std::move(pOut)); - iEvent.put(std::move(pOut_PUjets),"PUjets"); - + + //loop on trackIPTagInfos + if(primaryVertex->size()>0) + { + const reco::Vertex* pv = &*primaryVertex->begin(); + //loop on jets + for(edm::View::const_iterator itJet = jets->begin(); itJet != jets->end(); itJet++ ) { + + math::XYZVector jetMomentum = itJet->momentum(); + GlobalVector direction(jetMomentum.x(), jetMomentum.y(), jetMomentum.z()); + + math::XYZVector trMomentum; + + if(fabs(itJet->eta())>m_mineta_fwjets) + { + if((m_fwjets) && (itJet->et()>m_minet_fwjets)) + pOut->push_back(*itJet);// fill forward jet as signal jet + } + else + { + //loop on tracks + std::vector::const_iterator itTrack = tracks->begin(); + for (unsigned int i=0; ieta(),itJet->phi(), teta[i],tphi[i]); + if(deltaR2<0.25) { + reco::TransientTrack transientTrack = builder->build(*itTrack); + float jetTrackDistance = -((IPTools::jetTrackDistance(transientTrack, direction, *pv)).second).value(); + + //select the tracks compabible with the jet + if(( itTrack->pt() > m_MinTrackPt) && ( itTrack->normalizedChi2() < m_MaxTrackChi2) && (jetTrackDistancemomentum(); //calculate the Sum(trackPt) + } + } + itTrack++; + } + //if Sum(comp.trackPt)/CaloJetPt > minPtRatio or Sum(trackPt) > minPt the jet is a signal jet + if(trMomentum.rho()/jetMomentum.rho() > m_MinGoodJetTrackPtRatio || trMomentum.rho() > m_MinGoodJetTrackPt ) + { + pOut->push_back(*itJet); // fill it as signal jet + } + else//else it is a PUjet + { + pOut_PUjets->push_back(*itJet); // fill it as PUjets + } + } + RefToBase jRef(generaljets, itJet-jets->begin()); + (*pOut_jetTagCollection)[jRef] = trMomentum.rho(); // fill jetTagCollection + } + } + iEvent.put(std::move(pOut)); + iEvent.put(std::move(pOut_PUjets),"PUjets"); + iEvent.put(std::move(pOut_jetTagCollection)); } //define this as a plug-in DEFINE_FWK_MODULE(PixelJetPuId); +