diff --git a/RecoTauTag/HLTProducers/interface/CaloTowerFromL1TCreatorForTauHLT.h b/RecoTauTag/HLTProducers/interface/CaloTowerFromL1TCreatorForTauHLT.h new file mode 100644 index 0000000000000..f5b0229425633 --- /dev/null +++ b/RecoTauTag/HLTProducers/interface/CaloTowerFromL1TCreatorForTauHLT.h @@ -0,0 +1,64 @@ +#ifndef CaloTowerCreator_CaloTowerFromL1TCreatorForTauHLT_h +#define CaloTowerCreator_CaloTowerFromL1TCreatorForTauHLT_h + +/** \class CaloTowerFromL1TCreatorForTauHLT + * + * Framework module that produces a collection + * of calo towers in the region of interest for Tau HLT reconnstruction, + * depending on tau type trigger: + * Tau1 - take location of 1st L1 Tau + * Tau2 - take location of 2nd L1 Tau; if does not exists, + * take location of 1st Calo Tower + * ETau - take L1 Tau candidate which is not collinear + * to HLT (or L1) electron candidate. + * + * \author A. Nikitenko. IC. based on L. Lista and J. Mans + * + */ + +#include "FWCore/Framework/interface/global/EDProducer.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "DataFormats/CaloTowers/interface/CaloTower.h" +#include "DataFormats/L1Trigger/interface/Tau.h" +#include + +namespace edm { + class ParameterSet; +} + +class CaloTowerFromL1TCreatorForTauHLT : public edm::global::EDProducer<> { + public: + /// constructor from parameter set + CaloTowerFromL1TCreatorForTauHLT( const edm::ParameterSet & ); + /// destructor + ~CaloTowerFromL1TCreatorForTauHLT(); + /// + static void fillDescriptions( edm::ConfigurationDescriptions& desc ); + + private: + /// process one event + void produce( edm::StreamID sid, edm::Event& evt, const edm::EventSetup& stp ) const override; + + /// bunch crossing + const int mBX; + /// verbosity + const int mVerbose; + /// label of source collection + const edm::EDGetTokenT mtowers_token; + /// use only towers in cone mCone around L1 candidate for regional jet reco + const double mCone; + /// label of tau trigger type analysis + const edm::EDGetTokenT mTauTrigger_token; + /// imitator of L1 seeds + //edm::InputTag ml1seeds; + /// ET threshold + const double mEtThreshold; + /// E threshold + const double mEThreshold; + // + const int mTauId; + +}; + +#endif diff --git a/RecoTauTag/HLTProducers/interface/L1THLTTauMatching.h b/RecoTauTag/HLTProducers/interface/L1THLTTauMatching.h new file mode 100644 index 0000000000000..c4a59bb28ade8 --- /dev/null +++ b/RecoTauTag/HLTProducers/interface/L1THLTTauMatching.h @@ -0,0 +1,35 @@ +#ifndef L1THLTTauMatching_H +#define L1THLTTauMatching_H + +// user include files +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/global/EDProducer.h" +#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" +#include "FWCore/ParameterSet/interface/ParameterSetDescription.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/InputTag.h" +#include "DataFormats/Common/interface/Handle.h" +#include "DataFormats/L1Trigger/interface/Tau.h" +#include "DataFormats/JetReco/interface/CaloJetCollection.h" +#include "DataFormats/TauReco/interface/PFTauFwd.h" +#include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h" + + +#include +#include +class L1THLTTauMatching: public edm::global::EDProducer<> { + public: + explicit L1THLTTauMatching(const edm::ParameterSet&); + ~L1THLTTauMatching(); + virtual void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override; + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + + private: + + const edm::EDGetTokenT jetSrc; + const edm::EDGetTokenT tauTrigger; + const double mEt_Min; + +}; +#endif diff --git a/RecoTauTag/HLTProducers/src/CaloTowerFromL1TCreatorForTauHLT.cc b/RecoTauTag/HLTProducers/src/CaloTowerFromL1TCreatorForTauHLT.cc new file mode 100644 index 0000000000000..56a2aab9392e5 --- /dev/null +++ b/RecoTauTag/HLTProducers/src/CaloTowerFromL1TCreatorForTauHLT.cc @@ -0,0 +1,107 @@ +// makes CaloTowerCandidates from CaloTowers +// original author: L.Lista INFN, modifyed by: F.Ratnikov UMd +// Author for regionality A. Nikitenko +// Modified by S. Gennai + +#include "DataFormats/RecoCandidate/interface/RecoCaloTowerCandidate.h" +#include "DataFormats/Common/interface/Handle.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "RecoTauTag/HLTProducers/interface/CaloTowerFromL1TCreatorForTauHLT.h" +// Math +#include "Math/GenVector/VectorUtil.h" +#include + +using namespace edm ; +using namespace reco; +using namespace std ; + +CaloTowerFromL1TCreatorForTauHLT::CaloTowerFromL1TCreatorForTauHLT( const ParameterSet & p ) + : + mBX (p.getParameter ("BX" ) ), + mVerbose (p.getUntrackedParameter ("verbose" , 0) ), + mtowers_token (consumes (p.getParameter ("towers" ))), + mCone (p.getParameter ("UseTowersInCone" ) ), + mTauTrigger_token (consumes (p.getParameter ("TauTrigger" ))), + mEtThreshold (p.getParameter ("minimumEt" ) ), + mEThreshold (p.getParameter ("minimumE" ) ), + mTauId (p.getParameter ("TauId" ) ) +{ + produces(); +} + +CaloTowerFromL1TCreatorForTauHLT::~CaloTowerFromL1TCreatorForTauHLT() { +} + +void CaloTowerFromL1TCreatorForTauHLT::produce( StreamID sid, Event& evt, const EventSetup& stp ) const { + edm::Handle caloTowers; + evt.getByToken( mtowers_token, caloTowers ); + + // imitate L1 seeds + edm::Handle jetsgen; + evt.getByToken( mTauTrigger_token, jetsgen); + + std::auto_ptr cands( new CaloTowerCollection ); + cands->reserve( caloTowers->size() ); + + int idTau = 0; + if (jetsgen.isValid()){ + for (auto myL1Jet = jetsgen->begin(mBX); myL1Jet != jetsgen->end(mBX); myL1Jet++){ + if(idTau == mTauId){ + double Sum08 = 0.; + unsigned idx = 0 ; + for (; idx < caloTowers->size(); idx++) { + const CaloTower* cal = &((*caloTowers) [idx]); + bool isAccepted = false; + if (mVerbose == 2) { + edm::LogInfo("JetDebugInfo") << "CaloTowerFromL1TCreatorForTauHLT::produce-> " << idx + << " tower et/eta/phi/e: " << cal->et() << '/' + << cal->eta() << '/' + << cal->phi() << '/' + << cal->energy() + << " is..."; + } + if (cal->et() >= mEtThreshold && cal->energy() >= mEThreshold ) { + math::PtEtaPhiELorentzVector p( cal->et(), cal->eta(), cal->phi(), cal->energy() ); + double delta = ROOT::Math::VectorUtil::DeltaR((*myL1Jet).p4().Vect(), p); + if(delta < mCone) { + isAccepted = true; + Sum08 += cal->et(); + cands->push_back( *cal ); + } + } + if (mVerbose == 2){ + if (isAccepted) edm::LogInfo("JetDebugInfo") << "accepted \n"; + else edm::LogInfo("JetDebugInfo") << "rejected \n"; + } + } + } + idTau++; + } + } + else { + edm::LogWarning("MissingProduct") << "L1Upgrade jet bx collection not found." << std::endl; + } + + evt.put( cands ); + +} + +void CaloTowerFromL1TCreatorForTauHLT::fillDescriptions( edm::ConfigurationDescriptions & desc ) { + + edm::ParameterSetDescription aDesc; + + aDesc.add("TauTrigger" , edm::InputTag("caloStage2Digis"))->setComment("L1 Tau collection for seeding" ); + aDesc.add("towers" , edm::InputTag("towerMaker" ))->setComment("Input tower collection" ); + aDesc.add ("TauId" , 0 )->setComment("Item from L1 Tau collection used for seeding. From 0 to 11" ); + aDesc.add ("UseTowersInCone", 0.8 )->setComment("Radius of cone around seed" ); + aDesc.add ("minimumE" , 0.8 )->setComment("Minimum tower energy" ); + aDesc.add ("minimumEt" , 0.5 )->setComment("Minimum tower ET" ); + aDesc.add ("BX" , 0 )->setComment("Set bunch crossing; 0 = in time, -1 = previous, 1 = following"); + aDesc.addUntracked ("verbose" , 0 )->setComment("Verbosity level; 0=silent" ); + + desc.add ("CaloTowerFromL1TCreatorForTauHLT", aDesc); + desc.setComment ("Produce tower collection around L1 particle seed."); + +} diff --git a/RecoTauTag/HLTProducers/src/L1THLTTauMatching.cc b/RecoTauTag/HLTProducers/src/L1THLTTauMatching.cc new file mode 100644 index 0000000000000..24866b43bdf8e --- /dev/null +++ b/RecoTauTag/HLTProducers/src/L1THLTTauMatching.cc @@ -0,0 +1,73 @@ +#include "RecoTauTag/HLTProducers/interface/L1THLTTauMatching.h" +#include "Math/GenVector/VectorUtil.h" +#include "DataFormats/HLTReco/interface/TriggerTypeDefs.h" +#include "FWCore/Utilities/interface/EDMException.h" +#include "DataFormats/TauReco/interface/PFTau.h" + +// +// class decleration +// +using namespace reco ; +using namespace std ; +using namespace edm ; +using namespace trigger; + +L1THLTTauMatching::L1THLTTauMatching(const edm::ParameterSet& iConfig): + jetSrc ( consumes (iConfig.getParameter("JetSrc" ) ) ), + tauTrigger( consumes(iConfig.getParameter("L1TauTrigger") ) ), + mEt_Min ( iConfig.getParameter ("EtMin" ) ) +{ + produces(); +} +L1THLTTauMatching::~L1THLTTauMatching(){ } + +void L1THLTTauMatching::produce(edm::StreamID iSId, edm::Event& iEvent, const edm::EventSetup& iES) const +{ + + auto_ptr tauL2jets(new PFTauCollection); + + double deltaR = 1.0; + double matchingR = 0.5; + + // Getting HLT jets to be matched + edm::Handle tauJets; + iEvent.getByToken( jetSrc, tauJets ); + + edm::Handle l1TriggeredTaus; + iEvent.getByToken(tauTrigger,l1TriggeredTaus); + + l1t::TauVectorRef tauCandRefVec; + l1TriggeredTaus->getObjects( trigger::TriggerL1Tau,tauCandRefVec); + + math::XYZPoint a(0.,0.,0.); + + for(unsigned int iL1Tau = 0; iL1Tau < tauCandRefVec.size(); iL1Tau++){ + for(unsigned int iJet = 0; iJet < tauJets->size(); iJet++){ + // Find the relative L2TauJets, to see if it has been reconstructed + const PFTau & myJet = (*tauJets)[iJet]; + deltaR = ROOT::Math::VectorUtil::DeltaR(myJet.p4().Vect(), (tauCandRefVec[iL1Tau]->p4()).Vect()); + if(deltaR < matchingR ) { + if(myJet.leadPFChargedHadrCand().isNonnull()){ + a = myJet.leadPFChargedHadrCand()->vertex(); + } + PFTau myPFTau(std::numeric_limits::quiet_NaN(), myJet.p4(), a); + if(myJet.pt() > mEt_Min) { + tauL2jets->push_back(myPFTau); + } + break; + } + } + } + + iEvent.put(tauL2jets); +} + +void L1THLTTauMatching::fillDescriptions(edm::ConfigurationDescriptions& descriptions) +{ + edm::ParameterSetDescription desc; + desc.add("L1TauTrigger", edm::InputTag("hltL1sDoubleIsoTau40er" ))->setComment("Name of trigger filter" ); + desc.add("JetSrc" , edm::InputTag("hltSelectedPFTausTrackPt1MediumIsolationReg"))->setComment("Input collection of PFTaus"); + desc.add ("EtMin",0.0)->setComment("Minimal pT of PFTau to match"); + descriptions.setComment("This module produces collection of PFTaus matched to L1 Taus / Jets passing a HLT filter (Only p4 and vertex of returned PFTaus are set)."); + descriptions.add ("L1THLTTauMatching",desc); +} diff --git a/RecoTauTag/HLTProducers/src/SealModule.cc b/RecoTauTag/HLTProducers/src/SealModule.cc index 0415375bc2140..8efc7166eec9b 100644 --- a/RecoTauTag/HLTProducers/src/SealModule.cc +++ b/RecoTauTag/HLTProducers/src/SealModule.cc @@ -5,8 +5,10 @@ #include "RecoTauTag/HLTProducers/interface/PFJetToCaloProducer.h" #include "RecoTauTag/HLTProducers/interface/L1HLTJetsMatching.h" #include "RecoTauTag/HLTProducers/interface/L1HLTTauMatching.h" +#include "RecoTauTag/HLTProducers/interface/L1THLTTauMatching.h" #include "RecoTauTag/HLTProducers/interface/L2TauJetsMerger.h" #include "RecoTauTag/HLTProducers/interface/CaloTowerCreatorForTauHLT.h" +#include "RecoTauTag/HLTProducers/interface/CaloTowerFromL1TCreatorForTauHLT.h" #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducerFactory.h" #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducer.h" #include "TauRegionalPixelSeedGenerator.h" @@ -25,7 +27,9 @@ DEFINE_EDM_PLUGIN(TrackingRegionProducerFactory, CandidateSeededTrackingRegionsP DEFINE_FWK_MODULE(L2TauJetsMerger); DEFINE_FWK_MODULE(L1HLTJetsMatching); DEFINE_FWK_MODULE(L1HLTTauMatching); +DEFINE_FWK_MODULE(L1THLTTauMatching); DEFINE_FWK_MODULE(CaloTowerCreatorForTauHLT); +DEFINE_FWK_MODULE(CaloTowerFromL1TCreatorForTauHLT); DEFINE_FWK_MODULE(PFTauToJetProducer); DEFINE_FWK_MODULE(PFJetToCaloProducer); DEFINE_FWK_MODULE(TauJetSelectorForHLTTrackSeeding);