CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Types | Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes
L3TkMuonProducer Class Reference

#include <L3TkMuonProducer.h>

Inheritance diagram for L3TkMuonProducer:
edm::stream::EDProducer<>

Public Types

typedef edm::Ref
< L3MuonTrajectorySeedCollection
SeedRef
 
- Public Types inherited from edm::stream::EDProducer<>
using CacheTypes = CacheContexts< T...>
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T...>
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 

Public Member Functions

 L3TkMuonProducer (const edm::ParameterSet &)
 constructor with config More...
 
void produce (edm::Event &, const edm::EventSetup &) override
 produce candidates More...
 
 ~L3TkMuonProducer () override
 destructor More...
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Private Types

typedef std::map< pseudoRef,
std::pair< reco::TrackRef,
SeedRef > > 
LXtoL3sMap
 
typedef std::pair< unsigned
int, unsigned int > 
pseudoRef
 

Private Member Functions

pseudoRef makePseudoRef (const L3MuonTrajectorySeed &s)
 
bool sharedSeed (const L3MuonTrajectorySeed &s1, const L3MuonTrajectorySeed &s2)
 

Static Private Member Functions

static bool seedRefBypT (const SeedRef &s1, const SeedRef &s2)
 
static bool trackRefBypT (const reco::TrackRef &t1, const reco::TrackRef &t2)
 

Private Attributes

edm::InputTag theL3CollectionLabel
 
edm::EDGetTokenT
< reco::TrackCollection
trackToken_
 

Detailed Description

This module creates a skimed list of reco::Track (pointing to the original TrackExtra and TrackingRecHitOwnedVector One highest pT track per L1/L2 is selected, requiring some quality.

Author
J-R Vlimant.

Definition at line 27 of file L3TkMuonProducer.h.

Member Typedef Documentation

typedef std::map<pseudoRef, std::pair<reco::TrackRef, SeedRef> > L3TkMuonProducer::LXtoL3sMap
private

Definition at line 47 of file L3TkMuonProducer.h.

typedef std::pair<unsigned int, unsigned int> L3TkMuonProducer::pseudoRef
private

Definition at line 46 of file L3TkMuonProducer.h.

Definition at line 38 of file L3TkMuonProducer.h.

Constructor & Destructor Documentation

L3TkMuonProducer::L3TkMuonProducer ( const edm::ParameterSet parameterSet)

constructor with config

Definition at line 26 of file L3TkMuonProducer.cc.

References edm::ParameterSet::getParameter(), gpuClustering::id, LogTrace, edm::BranchDescription::moduleLabel(), edm::BranchDescription::processName(), edm::BranchDescription::productInstanceName(), and edm::BranchDescription::unwrappedTypeID().

26  {
27  LogTrace("Muon|RecoMuon|L3TkMuonProducer") << " constructor called";
28 
29  // StandAlone Collection Label
30  theL3CollectionLabel = parameterSet.getParameter<InputTag>("InputObjects");
31  trackToken_ = consumes<reco::TrackCollection>(theL3CollectionLabel);
32  produces<TrackCollection>();
33  produces<TrackExtraCollection>();
34  produces<TrackingRecHitCollection>();
35 
36  callWhenNewProductsRegistered([this](const edm::BranchDescription& iBD) {
38  if (iBD.unwrappedTypeID() == id) {
39  this->mayConsume<L3MuonTrajectorySeedCollection>(
41  }
42  });
43 }
uint16_t *__restrict__ id
std::string const & processName() const
#define LogTrace(id)
std::string const & moduleLabel() const
std::string const & productInstanceName() const
TypeID unwrappedTypeID() const
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
edm::EDGetTokenT< reco::TrackCollection > trackToken_
edm::InputTag theL3CollectionLabel
L3TkMuonProducer::~L3TkMuonProducer ( )
override

destructor

Definition at line 46 of file L3TkMuonProducer.cc.

References LogTrace.

46  {
47  LogTrace("Muon|RecoMuon|L3TkMuonProducer") << " L3TkMuonProducer destructor called";
48 }
#define LogTrace(id)

Member Function Documentation

pseudoRef L3TkMuonProducer::makePseudoRef ( const L3MuonTrajectorySeed s)
inlineprivate

Definition at line 49 of file L3TkMuonProducer.h.

References edm::ProductID::id(), edm::Ref< C, T, F >::id(), edm::Ref< C, T, F >::isNull(), edm::Ref< C, T, F >::key(), L3MuonTrajectorySeed::l1Particle(), and L3MuonTrajectorySeed::l2Track().

49  {
50  reco::TrackRef l2ref = s.l2Track();
51  if (l2ref.isNull()) {
53  return std::make_pair(l1ref.id().id(), l1ref.key());
54  } else
55  return std::make_pair(l2ref.id().id(), l2ref.key());
56  }
reco::TrackRef l2Track() const
Get L2 info.
key_type key() const
Accessor for product key.
Definition: Ref.h:250
ProductID id() const
Accessor for product ID.
Definition: Ref.h:244
bool isNull() const
Checks for null.
Definition: Ref.h:235
l1extra::L1MuonParticleRef l1Particle() const
Get L1 info.
ProductIndex id() const
Definition: ProductID.h:35
void L3TkMuonProducer::produce ( edm::Event event,
const edm::EventSetup eventSetup 
)
override

produce candidates

reconstruct muons

Definition at line 108 of file L3TkMuonProducer.cc.

References TrajectorySeed::direction(), validate-o2o-wbm::f, mps_fire::i, edm::ProductID::id(), edm::Ref< C, T, F >::id(), reco::Track::innerDetId(), reco::Track::innerMomentum(), reco::Track::innerOk(), reco::Track::innerPosition(), reco::Track::innerStateCovariance(), edm::Ref< C, T, F >::key(), LogDebug, findQualityFiles::maxI, metname, edm::StableProvenance::moduleLabel(), eostools::move(), reco::Track::outerDetId(), reco::Track::outerMomentum(), reco::Track::outerOk(), reco::Track::outerPosition(), reco::Track::outerStateCovariance(), printseed(), printvector(), edm::StableProvenance::processName(), edm::StableProvenance::productInstanceName(), reco::Track::recHitsBegin(), reco::Track::recHitsEnd(), fileCollector::seed, and tracks.

108  {
109  const string metname = "Muon|RecoMuon|L3TkMuonProducer";
110 
111  // Take the L3 container
112  LogDebug(metname) << " Taking the L3/GLB muons: " << theL3CollectionLabel.label();
114  event.getByToken(trackToken_, tracks);
115 
116  //make the LX->L3s pools
117  LXtoL3sMap LXtoL3s;
118 
119  unsigned int maxI = tracks->size();
120  bool gotL3seeds = false;
122 
123  //make a list of reference to tracker tracks
124  vector<TrackRef> orderedTrackTracks(maxI);
125  for (unsigned int i = 0; i != maxI; i++)
126  orderedTrackTracks[i] = TrackRef(tracks, i);
127  LogDebug(metname) << "vector of L3 tracks before ordering:\n" << printvector(orderedTrackTracks);
128  //order them in pT
129  sort(orderedTrackTracks.begin(), orderedTrackTracks.end(), trackRefBypT);
130  LogDebug(metname) << "vector of L3 tracks after ordering:\n" << printvector(orderedTrackTracks);
131  //loop over then
132  for (unsigned int i = 0; i != maxI; i++) {
133  TrackRef& tk = orderedTrackTracks[i];
134  SeedRef l3seedRef = tk->seedRef().castTo<SeedRef>();
135 
136  vector<SeedRef> allPossibleOrderedLx; // with identical hit-set
137  //add the direct relation
138  allPossibleOrderedLx.push_back(l3seedRef);
139  LogDebug(metname) << "adding the seed ref: " << l3seedRef.id().id() << ":" << l3seedRef.key()
140  << " for this tracker track: " << tk.id().id() << ":" << tk.key();
141 
142  //add the relations due to shared seeds
143  //check whether there is a "shared" seed in addition
144  if (!gotL3seeds) {
145  //need to fetch the handle from the ref
146  const edm::StableProvenance& seedsProv = event.getStableProvenance(l3seedRef.id());
147  edm::InputTag l3seedsTag(seedsProv.moduleLabel(), seedsProv.productInstanceName(), seedsProv.processName());
148  event.getByLabel(l3seedsTag, l3seeds);
149  gotL3seeds = true;
150  LogDebug(metname) << "got seeds handle from: " << l3seedsTag;
151  }
152  //loop the other seeds in the collection
153  for (unsigned int iS = 0; iS != l3seeds->size(); ++iS) {
154  const L3MuonTrajectorySeed& seed = (*l3seeds)[iS];
155  const L3MuonTrajectorySeed& thisSeed = *l3seedRef;
156  if (l3seedRef.key() == iS)
157  continue; //not care about this one
158  //compare this seed with the seed in the collection
159  if (sharedSeed(seed, thisSeed)) {
160  SeedRef thisSharedSeedRef(l3seeds, iS);
161  LogDebug(metname) << "shared seeds: \n"
162  << printseed(l3seedRef) << " and: \n"
163  << printseed(thisSharedSeedRef)
164  << "\nadding ANOTHER seed ref: " << thisSharedSeedRef.id().id() << ":"
165  << thisSharedSeedRef.key() << " for this tracker track: " << tk.id().id() << ":" << tk.key();
166  // edm::LogError(metname)<<" we have a shared seed right there.";
167  allPossibleOrderedLx.push_back(thisSharedSeedRef);
168  } //seed is shared
169  } //loop all other existing seed for overlaps
170 
171  //now you have the full list of Lx objects that have seed this tracker track.
172  // order the list in pT of Lx objects
173  LogDebug(metname) << "list of possible Lx objects for tracker track: " << tk.id().id() << ":" << tk.key()
174  << " before ordering\n"
175  << printvector(allPossibleOrderedLx);
176  sort(allPossibleOrderedLx.begin(), allPossibleOrderedLx.end(), seedRefBypT);
177  LogDebug(metname) << "list of possible Lx objects for tracker track: " << tk.id().id() << ":" << tk.key()
178  << " after ordering\n"
179  << printvector(allPossibleOrderedLx);
180  // assign this tracker track to the highest pT Lx.
181  for (unsigned int iL = 0; iL != allPossibleOrderedLx.size(); ++iL) {
182  SeedRef thisRef = allPossibleOrderedLx[iL];
183  pseudoRef ref = makePseudoRef(*thisRef);
184  LogDebug(metname) << "seed ref: " << thisRef.id().id() << ":" << thisRef.key()
185  << " transcribe to pseudoref: " << ref.first << ":" << ref.second;
186  LXtoL3sMap::iterator f = LXtoL3s.find(ref);
187  if (f != LXtoL3s.end()) {
188  //there's already an entry. because of the prior ordering in pT of the tracker track refs
189  // the track ref already there *has* a higher pT: this one cannot compete and should be assigned to the next Lx;
190  LogDebug(metname) << "this tracker track: " << tk.id().id() << ":" << tk.key() << " (" << tk->pt() << ")"
191  << "\n cannot compete in pT with track: " << f->second.first.id().id() << ":"
192  << f->second.first.key() << " (" << f->second.first->pt() << ")"
193  << "\n already assigned to pseudo ref: " << ref.first << ":" << ref.second
194  << " which corresponds to seedRef: " << f->second.second.id().id() << ":"
195  << f->second.second.key();
196  continue;
197  } else {
198  //there was no entry yet. make the assignement
199  LogDebug(metname) << "this tracker track: " << tk.id().id() << ":" << tk.key()
200  << " is assigned to pseudo ref: " << ref.first << ":" << ref.second
201  << " which corresponds to seedRef: " << thisRef.id().id() << ":" << thisRef.key();
202  LXtoL3s[ref] = std::make_pair(tk, thisRef);
203  //once assigned. break
204  break;
205  }
206  } //loop possible Lx for possible assignement
207  } //loop over ordered list of tracker track refs
208 
209  //prepare the output
210  auto outTracks = std::make_unique<TrackCollection>(LXtoL3s.size());
211  auto outTrackExtras = std::make_unique<TrackExtraCollection>(LXtoL3s.size());
212  reco::TrackExtraRefProd rTrackExtras = event.getRefBeforePut<TrackExtraCollection>();
213  auto outRecHits = std::make_unique<TrackingRecHitCollection>();
214  TrackingRecHitRefProd rHits = event.getRefBeforePut<TrackingRecHitCollection>();
215 
216  LogDebug(metname) << "reading the map to make " << LXtoL3s.size() << "products.";
217  //fill the collection from the map
218  LXtoL3sMap::iterator f = LXtoL3s.begin();
219  unsigned int i = 0;
220  for (; f != LXtoL3s.end(); ++f, ++i) {
221  LogDebug(metname) << "copy the track over, and make ref to extra";
222  const Track& trk = *(f->second.first);
223  (*outTracks)[i] = Track(trk);
224  (*outTracks)[i].setExtra(TrackExtraRef(rTrackExtras, i));
225 
226  LogDebug(metname) << "copy the trackExtra too, and change the seedref";
227  edm::RefToBase<TrajectorySeed> seedRef(f->second.second);
228  //do not use the copy constructor, otherwise the hit Ref are still the same
229  (*outTrackExtras)[i] = TrackExtra(trk.outerPosition(),
230  trk.outerMomentum(),
231  trk.outerOk(),
232  trk.innerPosition(),
233  trk.innerMomentum(),
234  trk.innerOk(),
235  trk.outerStateCovariance(),
236  trk.outerDetId(),
237  trk.innerStateCovariance(),
238  trk.innerDetId(),
239  seedRef->direction(),
240  seedRef);
241 
242  LogDebug(metname) << "copy the hits too";
243  unsigned int iRH = 0;
244  for (trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++hit, ++iRH) {
245  outRecHits->push_back((*hit)->clone());
246  }
247  (*outTrackExtras)[i].setHits(rHits, 0, iRH);
248  }
249 
250  LogDebug(metname) << "made: " << outTracks->size() << " tracks, " << outTrackExtras->size() << " extras and "
251  << outRecHits->size() << " rechits.";
252 
253  //put the collection in the event
254  LogDebug(metname) << "loading...";
255  event.put(std::move(outTracks));
256  event.put(std::move(outTrackExtras));
257  event.put(std::move(outRecHits));
258  LogDebug(metname) << " Event loaded"
259  << "================================";
260 }
string printseed(const L3TkMuonProducer::SeedRef &s)
const std::string metname
bool innerOk() const
return true if the innermost hit is valid
Definition: Track.h:53
auto const & tracks
cannot be loose
edm::Ref< TrackExtraCollection > TrackExtraRef
persistent reference to a TrackExtra
Definition: TrackExtraFwd.h:16
key_type key() const
Accessor for product key.
Definition: Ref.h:250
const math::XYZPoint & outerPosition() const
position of the outermost hit
Definition: Track.h:62
ProductID id() const
Accessor for product ID.
Definition: Ref.h:244
bool sharedSeed(const L3MuonTrajectorySeed &s1, const L3MuonTrajectorySeed &s2)
const math::XYZPoint & innerPosition() const
position of the innermost hit
Definition: Track.h:56
std::map< pseudoRef, std::pair< reco::TrackRef, SeedRef > > LXtoL3sMap
std::string const & productInstanceName() const
static bool trackRefBypT(const reco::TrackRef &t1, const reco::TrackRef &t2)
static bool seedRefBypT(const SeedRef &s1, const SeedRef &s2)
CovarianceMatrix outerStateCovariance() const
outermost trajectory state curvilinear errors
Definition: Track.h:68
def move
Definition: eostools.py:511
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
Definition: Track.h:79
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:88
edm::Ref< L3MuonTrajectorySeedCollection > SeedRef
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
Definition: TrackExtraFwd.h:10
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
Definition: Track.h:65
bool outerOk() const
return true if the outermost hit is valid
Definition: Track.h:50
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:20
CovarianceMatrix innerStateCovariance() const
innermost trajectory state curvilinear errors
Definition: Track.h:71
std::pair< unsigned int, unsigned int > pseudoRef
edm::EDGetTokenT< reco::TrackCollection > trackToken_
std::string const & label() const
Definition: InputTag.h:36
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
Definition: Track.h:59
std::string const & processName() const
pseudoRef makePseudoRef(const L3MuonTrajectorySeed &s)
ProductIndex id() const
Definition: ProductID.h:35
edm::InputTag theL3CollectionLabel
std::string const & moduleLabel() const
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
Definition: Track.h:82
string printvector(const vector< TrackRef > &v)
#define LogDebug(id)
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:91
static bool L3TkMuonProducer::seedRefBypT ( const SeedRef s1,
const SeedRef s2 
)
inlinestaticprivate

Definition at line 61 of file L3TkMuonProducer.h.

References edm::Ref< C, T, F >::isNull().

61  {
62  double pt1, pt2;
63  reco::TrackRef l2ref1 = s1->l2Track();
64  if (l2ref1.isNull())
65  pt1 = s1->l1Particle()->pt();
66  else
67  pt1 = l2ref1->pt();
68  reco::TrackRef l2ref2 = s2->l2Track();
69  if (l2ref2.isNull())
70  pt2 = s2->l1Particle()->pt();
71  else
72  pt2 = l2ref2->pt();
73  return (pt1 > pt2);
74  }
bool isNull() const
Checks for null.
Definition: Ref.h:235
bool L3TkMuonProducer::sharedSeed ( const L3MuonTrajectorySeed s1,
const L3MuonTrajectorySeed s2 
)
private

Definition at line 50 of file L3TkMuonProducer.cc.

References TrackingRecHit::all, TrajectorySeed::nHits(), diffTwoXMLs::r1, diffTwoXMLs::r2, and TrajectorySeed::recHits().

50  {
51  //quit right away on nH=0
52  if (s1.nHits() == 0 || s2.nHits() == 0)
53  return false;
54  //quit right away if not the same number of hits
55  if (s1.nHits() != s2.nHits())
56  return false;
57  auto const& r1 = s1.recHits();
58  auto const& r2 = s2.recHits();
59  //quit right away if first detId does not match. front exist because of ==0 ->quit test
60  if (r1.begin()->geographicalId() != r2.begin()->geographicalId())
61  return false;
62  //then check hit by hit if they are the same
63  for (auto i1 = r1.begin(), i2 = r2.begin(); i1 != r1.end() && i2 != r2.end(); ++i1, ++i2) {
64  if (!i1->sharesInput(&(*i2), TrackingRecHit::all))
65  return false;
66  }
67  return true;
68 }
RecHitRange recHits() const
unsigned int nHits() const
static bool L3TkMuonProducer::trackRefBypT ( const reco::TrackRef t1,
const reco::TrackRef t2 
)
inlinestaticprivate

Definition at line 76 of file L3TkMuonProducer.h.

76 { return (t1->pt() > t2->pt()); }

Member Data Documentation

edm::InputTag L3TkMuonProducer::theL3CollectionLabel
private

Definition at line 42 of file L3TkMuonProducer.h.

edm::EDGetTokenT<reco::TrackCollection> L3TkMuonProducer::trackToken_
private

Definition at line 43 of file L3TkMuonProducer.h.