Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:58

0001 #ifndef RecoMuon_L3MuonProducer_L3TkMuonProducer_H
0002 #define RecoMuon_L3MuonProducer_L3TkMuonProducer_H
0003 
0004 /**  \class L3TkMuonProducer
0005  * 
0006  *    This module creates a skimed list of reco::Track (pointing to the original TrackExtra and TrackingRecHitOwnedVector
0007  *    One highest pT track per L1/L2 is selected, requiring some quality.
0008  *
0009  *   \author  J-R Vlimant.
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 }  // namespace edm
0026 
0027 class L3TkMuonProducer : public edm::stream::EDProducer<> {
0028 public:
0029   /// constructor with config
0030   L3TkMuonProducer(const edm::ParameterSet&);
0031 
0032   /// destructor
0033   ~L3TkMuonProducer() override;
0034 
0035   /// produce candidates
0036   void produce(edm::Event&, const edm::EventSetup&) override;
0037 
0038   typedef edm::Ref<L3MuonTrajectorySeedCollection> SeedRef;
0039 
0040 private:
0041   // L3/GLB Collection Label
0042   edm::InputTag theL3CollectionLabel;
0043   edm::EDGetTokenT<reco::TrackCollection> trackToken_;
0044 
0045   //psuedo ref is L2 or L1 ref.
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   //ordering functions
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