27 LogTrace(
"Muon|RecoMuon|L3TkMuonProducer")<<
" constructor called";
31 trackToken_ = consumes<reco::TrackCollection>(theL3CollectionLabel);
32 produces<TrackCollection>();
33 produces<TrackExtraCollection>();
34 produces<TrackingRecHitCollection>();
51 LogTrace(
"Muon|RecoMuon|L3TkMuonProducer")<<
" L3TkMuonProducer destructor called";
56 if (s1.
nHits()==0 || s2.
nHits()==0)
return false;
65 if(i1_b->geographicalId() != i2_b->geographicalId())
return false;
67 for (i1=i1_b,i2=i2_b;i1!=i1_e && i2!=i2_e;++i1,++i2){
75 for (
unsigned int i=0;
i!=v.size();++
i) {
77 ss<<
"track with ref: "<<v[
i].id().id()<<
":"<<v[
i].key()
78 <<
" and pT: "<<v[
i]->pt()
79 <<
" with seedRef: "<<v[
i]->seedRef().id().id()<<
":"<<v[
i]->seedRef().key();
86 for (
unsigned int i=0;
i!=v.size();++
i){
88 ss<<
"seed ref: "<<v[
i].id().id()<<
":"<<v[
i].key();
89 if (v[
i]->l2Track().isNull())
90 ss<<
" and pT: "<<v[
i]->l1Particle()->pt()<<
" of L1: "<<v[
i]->l1Particle().id().id()<<
":"<<v[
i]->l1Particle().key();
92 ss<<
" and pT: "<<v[
i]->l2Track()->pt()<<
" of L2: "<<v[
i]->l2Track().id().id()<<
":"<<v[
i]->l2Track().key();
99 ss<<
" seed ref: "<<s.
id().
id()<<
":"<<s.
key()<<
" has "<< s->nHits()<<
"rechits";
102 for (;it!=r.second;++it)
103 ss<<
"\n detId: "<<it->geographicalId()<<
" position: "<<it->localPosition()<<
" and error: "<<it->localPositionError();
109 const string metname =
"Muon|RecoMuon|L3TkMuonProducer";
112 LogDebug(metname)<<
" Taking the L3/GLB muons: "<<theL3CollectionLabel.label();
114 event.getByToken(trackToken_,tracks);
119 unsigned int maxI = tracks->size();
120 bool gotL3seeds=
false;
124 vector<TrackRef> orderedTrackTracks(maxI);
126 LogDebug(metname)<<
"vector of L3 tracks before ordering:\n"<<
printvector(orderedTrackTracks);
128 sort(orderedTrackTracks.begin(),orderedTrackTracks.end(),trackRefBypT);
129 LogDebug(metname)<<
"vector of L3 tracks after ordering:\n"<<
printvector(orderedTrackTracks);
131 for (
unsigned int i=0;
i!=
maxI;
i++) {
135 vector<SeedRef> allPossibleOrderedLx;
137 allPossibleOrderedLx.push_back(l3seedRef);
138 LogDebug(metname)<<
"adding the seed ref: "<<l3seedRef.
id().
id()<<
":"<<l3seedRef.
key()<<
" for this tracker track: "<<tk.
id().
id()<<
":"<<tk.
key();
146 event.getByLabel(l3seedsTag, l3seeds);
148 LogDebug(metname)<<
"got seeds handle from: "<<l3seedsTag;
151 for (
unsigned int iS=0;iS!=l3seeds->size();++iS){
154 if (l3seedRef.
key()==iS)
continue;
156 if (sharedSeed(seed,thisSeed)){
157 SeedRef thisSharedSeedRef(l3seeds,iS);
159 <<
"\nadding ANOTHER seed ref: "<<thisSharedSeedRef.
id().
id()<<
":"<<thisSharedSeedRef.
key()<<
" for this tracker track: "<<tk.
id().
id()<<
":"<<tk.
key();
161 allPossibleOrderedLx.push_back(thisSharedSeedRef);
167 LogDebug(metname)<<
"list of possible Lx objects for tracker track: "<<tk.
id().
id()<<
":"<<tk.
key()<<
" before ordering\n"<<
printvector(allPossibleOrderedLx);
168 sort(allPossibleOrderedLx.begin(),allPossibleOrderedLx.end(),seedRefBypT);
169 LogDebug(metname)<<
"list of possible Lx objects for tracker track: "<<tk.
id().
id()<<
":"<<tk.
key()<<
" after ordering\n"<<
printvector(allPossibleOrderedLx);
171 for (
unsigned int iL=0;iL!=allPossibleOrderedLx.size();++iL){
172 SeedRef thisRef=allPossibleOrderedLx[iL];
174 LogDebug(metname)<<
"seed ref: "<<thisRef.
id().
id()<<
":"<<thisRef.
key()<<
" transcribe to pseudoref: "<<ref.first<<
":"<<ref.second;
175 LXtoL3sMap::iterator
f=LXtoL3s.find(ref);
176 if (f!=LXtoL3s.end()){
179 LogDebug(metname)<<
"this tracker track: "<<tk.
id().
id()<<
":"<<tk.
key()<<
" ("<< tk->pt()<<
")" 180 <<
"\n cannot compete in pT with track: "<<f->second.first.
id().
id()<<
":"<<f->second.first.key()<<
" ("<<f->second.first->pt()<<
")" 181 <<
"\n already assigned to pseudo ref: "<<ref.first<<
":"<<ref.second<<
" which corresponds to seedRef: "<<f->second.second.id().id()<<
":"<<f->second.second.key();
186 <<
" is assigned to pseudo ref: "<<ref.first<<
":"<<ref.second<<
" which corresponds to seedRef: "<<thisRef.
id().
id()<<
":"<<thisRef.
key();
187 LXtoL3s[ref] = std::make_pair(tk,thisRef);
196 auto outTracks = std::make_unique<TrackCollection>(LXtoL3s.size());
197 auto outTrackExtras = std::make_unique<TrackExtraCollection>(LXtoL3s.size());
199 auto outRecHits = std::make_unique<TrackingRecHitCollection>();
202 LogDebug(metname)<<
"reading the map to make "<< LXtoL3s.size()<<
"products.";
204 LXtoL3sMap::iterator
f=LXtoL3s.begin();
206 for (;f!=LXtoL3s.end();++
f,++
i){
208 LogDebug(metname)<<
"copy the track over, and make ref to extra";
209 const Track & trk = *(f->second.first);
210 (*outTracks)[
i] =
Track(trk);
213 LogDebug(metname)<<
"copy the trackExtra too, and change the seedref";
224 LogDebug(metname)<<
"copy the hits too";
227 outRecHits->push_back((*hit)->clone());
229 (*outTrackExtras)[
i].setHits( rHits, 0, iRH);
232 LogDebug(metname)<<
"made: "<<outTracks->size()<<
" tracks, "<<outTrackExtras->size()<<
" extras and "<<outRecHits->size()<<
" rechits.";
240 <<
"================================";
PropagationDirection direction() const
T getParameter(std::string const &) const
std::pair< unsigned int, unsigned int > pseudoRef
string printseed(const L3TkMuonProducer::SeedRef &s)
const std::string metname
bool innerOk() const
return true if the innermost hit is valid
edm::Ref< TrackExtraCollection > TrackExtraRef
persistent reference to a TrackExtra
std::string const & processName() const
key_type key() const
Accessor for product key.
std::string const & processName() const
const math::XYZPoint & outerPosition() const
position of the outermost hit
ProductID id() const
Accessor for product ID.
bool sharedSeed(const L3MuonTrajectorySeed &s1, const L3MuonTrajectorySeed &s2)
const math::XYZPoint & innerPosition() const
position of the innermost hit
void produce(edm::Event &, const edm::EventSetup &) override
produce candidates
std::string const & moduleLabel() const
std::string const & productInstanceName() const
recHitContainer::const_iterator const_iterator
CovarianceMatrix outerStateCovariance() const
outermost trajectory state curvilinear errors
TypeID unwrappedTypeID() const
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
L3TkMuonProducer(const edm::ParameterSet &)
constructor with config
std::pair< const_iterator, const_iterator > range
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
std::map< pseudoRef, std::pair< reco::TrackRef, SeedRef > > LXtoL3sMap
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
bool outerOk() const
return true if the outermost hit is valid
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
CovarianceMatrix innerStateCovariance() const
innermost trajectory state curvilinear errors
std::string const & moduleLabel() const
~L3TkMuonProducer() override
destructor
unsigned int nHits() const
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
std::string const & productInstanceName() const
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
string printvector(const vector< TrackRef > &v)
ParameterSet const & parameterSet(Provenance const &provenance)
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.