File indexing completed on 2025-01-09 23:33:53
0001 #ifndef RecoMuon_L3MuonProducer_L3TkMuonProducer_H
0002 #define RecoMuon_L3MuonProducer_L3TkMuonProducer_H
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "FWCore/Framework/interface/stream/EDProducer.h"
0013 #include "FWCore/Utilities/interface/InputTag.h"
0014
0015 #include "DataFormats/TrackReco/interface/Track.h"
0016 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0017 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeed.h"
0018 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeedCollection.h"
0019 #include "DataFormats/L1Trigger/interface/L1MuonParticle.h"
0020
0021 namespace edm {
0022 class ParameterSet;
0023 class Event;
0024 class EventSetup;
0025 }
0026
0027 class L3TkMuonProducer : public edm::stream::EDProducer<> {
0028 public:
0029
0030 L3TkMuonProducer(const edm::ParameterSet&);
0031
0032
0033 ~L3TkMuonProducer() override;
0034
0035
0036 void produce(edm::Event&, const edm::EventSetup&) override;
0037
0038 typedef edm::Ref<L3MuonTrajectorySeedCollection> SeedRef;
0039
0040 private:
0041
0042 edm::InputTag theL3CollectionLabel;
0043 edm::EDGetTokenT<reco::TrackCollection> trackToken_;
0044
0045
0046 typedef std::pair<unsigned int, unsigned int> pseudoRef;
0047 typedef std::map<pseudoRef, std::pair<reco::TrackRef, SeedRef> > LXtoL3sMap;
0048
0049 pseudoRef makePseudoRef(const L3MuonTrajectorySeed& s) {
0050 reco::TrackRef l2ref = s.l2Track();
0051 if (l2ref.isNull()) {
0052 l1extra::L1MuonParticleRef l1ref = s.l1Particle();
0053 return std::make_pair(l1ref.id().id(), l1ref.key());
0054 } else
0055 return std::make_pair(l2ref.id().id(), l2ref.key());
0056 }
0057
0058 bool sharedSeed(const L3MuonTrajectorySeed& s1, const L3MuonTrajectorySeed& s2);
0059
0060
0061 static bool seedRefBypT(const SeedRef& s1, const SeedRef& s2) {
0062 double pt1, pt2;
0063 reco::TrackRef l2ref1 = s1->l2Track();
0064 if (l2ref1.isNull())
0065 pt1 = s1->l1Particle()->pt();
0066 else
0067 pt1 = l2ref1->pt();
0068 reco::TrackRef l2ref2 = s2->l2Track();
0069 if (l2ref2.isNull())
0070 pt2 = s2->l1Particle()->pt();
0071 else
0072 pt2 = l2ref2->pt();
0073 return (pt1 > pt2);
0074 }
0075
0076 static bool trackRefBypT(const reco::TrackRef& t1, const reco::TrackRef& t2) { return (t1->pt() > t2->pt()); }
0077 };
0078
0079 #endif