28 LogTrace(
"Muon|RecoMuon|L3TkMuonProducer")<<
" constructor called";
32 produces<TrackCollection>();
33 produces<TrackExtraCollection>();
34 produces<TrackingRecHitCollection>();
39 LogTrace(
"Muon|RecoMuon|L3TkMuonProducer")<<
" L3TkMuonProducer destructor called";
44 if (s1.
nHits()==0 || s2.
nHits()==0)
return false;
53 if(i1_b->geographicalId() != i2_b->geographicalId())
return false;
55 for (i1=i1_b,i2=i2_b;i1!=i1_e,i2!=i2_e;++i1,++i2){
63 for (
unsigned int i=0;
i!=v.size();++
i) {
65 ss<<
"track with ref: "<<v[
i].id().id()<<
":"<<v[
i].key()
66 <<
" and pT: "<<v[
i]->pt()
67 <<
" with seedRef: "<<v[
i]->seedRef().id().id()<<
":"<<v[
i]->seedRef().key();
74 for (
unsigned int i=0;
i!=v.size();++
i){
76 ss<<
"seed ref: "<<v[
i].id().id()<<
":"<<v[
i].key();
77 if (v[
i]->l2Track().isNull())
78 ss<<
" and pT: "<<v[
i]->l1Particle()->pt()<<
" of L1: "<<v[
i]->l1Particle().id().id()<<
":"<<v[
i]->l1Particle().key();
80 ss<<
" and pT: "<<v[
i]->l2Track()->pt()<<
" of L2: "<<v[
i]->l2Track().id().id()<<
":"<<v[
i]->l2Track().key();
87 ss<<
" seed ref: "<<s.
id().
id()<<
":"<<s.
key()<<
" has "<< s->nHits()<<
"rechits";
90 for (;it!=r.second;++it)
91 ss<<
"\n detId: "<<it->geographicalId()<<
" position: "<<it->localPosition()<<
" and error: "<<it->localPositionError();
97 const string metname =
"Muon|RecoMuon|L3TkMuonProducer";
100 LogDebug(metname)<<
" Taking the L3/GLB muons: "<<theL3CollectionLabel.label();
102 event.getByLabel(theL3CollectionLabel,tracks);
107 unsigned int maxI = tracks->size();
108 bool gotL3seeds=
false;
112 vector<TrackRef> orderedTrackTracks(maxI);
114 LogDebug(metname)<<
"vector of L3 tracks before ordering:\n"<<
printvector(orderedTrackTracks);
116 sort(orderedTrackTracks.begin(),orderedTrackTracks.end(),trackRefBypT);
117 LogDebug(metname)<<
"vector of L3 tracks after ordering:\n"<<
printvector(orderedTrackTracks);
119 for (
unsigned int i=0;
i!=
maxI;
i++) {
123 vector<SeedRef> allPossibleOrderedLx;
125 allPossibleOrderedLx.push_back(l3seedRef);
126 LogDebug(metname)<<
"adding the seed ref: "<<l3seedRef.
id().
id()<<
":"<<l3seedRef.
key()<<
" for this tracker track: "<<tk.
id().
id()<<
":"<<tk.
key();
134 event.getByLabel(l3seedsTag, l3seeds);
136 LogDebug(metname)<<
"got seeds handle from: "<<l3seedsTag;
139 for (
unsigned int iS=0;iS!=l3seeds->size();++iS){
142 if (l3seedRef.
key()==iS)
continue;
144 if (sharedSeed(seed,thisSeed)){
145 SeedRef thisSharedSeedRef(l3seeds,iS);
147 <<
"\nadding ANOTHER seed ref: "<<thisSharedSeedRef.
id().
id()<<
":"<<thisSharedSeedRef.
key()<<
" for this tracker track: "<<tk.
id().
id()<<
":"<<tk.
key();
149 allPossibleOrderedLx.push_back(thisSharedSeedRef);
155 LogDebug(metname)<<
"list of possible Lx objects for tracker track: "<<tk.
id().
id()<<
":"<<tk.
key()<<
" before ordering\n"<<
printvector(allPossibleOrderedLx);
156 sort(allPossibleOrderedLx.begin(),allPossibleOrderedLx.end(),seedRefBypT);
157 LogDebug(metname)<<
"list of possible Lx objects for tracker track: "<<tk.
id().
id()<<
":"<<tk.
key()<<
" after ordering\n"<<
printvector(allPossibleOrderedLx);
159 for (
unsigned int iL=0;iL!=allPossibleOrderedLx.size();++iL){
160 SeedRef thisRef=allPossibleOrderedLx[iL];
162 LogDebug(metname)<<
"seed ref: "<<thisRef.
id().
id()<<
":"<<thisRef.
key()<<
" transcribe to pseudoref: "<<ref.first<<
":"<<ref.second;
163 LXtoL3sMap::iterator
f=LXtoL3s.find(ref);
164 if (f!=LXtoL3s.end()){
167 LogDebug(metname)<<
"this tracker track: "<<tk.
id().
id()<<
":"<<tk.
key()<<
" ("<< tk->pt()<<
")"
168 <<
"\n cannot compete in pT with track: "<<f->second.first.
id().
id()<<
":"<<f->second.first.key()<<
" ("<<f->second.first->pt()<<
")"
169 <<
"\n already assigned to pseudo ref: "<<ref.first<<
":"<<ref.second<<
" which corresponds to seedRef: "<<f->second.second.id().id()<<
":"<<f->second.second.key();
174 <<
" is assigned to pseudo ref: "<<ref.first<<
":"<<ref.second<<
" which corresponds to seedRef: "<<thisRef.
id().
id()<<
":"<<thisRef.
key();
175 LXtoL3s[ref] = std::make_pair(tk,thisRef);
184 std::auto_ptr<TrackCollection> outTracks(
new TrackCollection(LXtoL3s.size()));
190 LogDebug(metname)<<
"reading the map to make "<< LXtoL3s.size()<<
"products.";
192 LXtoL3sMap::iterator
f=LXtoL3s.begin();
194 for (;f!=LXtoL3s.end();++
f,++
i){
196 LogDebug(metname)<<
"copy the track over, and make ref to extra";
197 const Track & trk = *(f->second.first);
198 (*outTracks)[
i] =
Track(trk);
201 LogDebug(metname)<<
"copy the trackExtra too, and change the seedref";
212 LogDebug(metname)<<
"copy the hits too";
215 outRecHits->push_back((*hit)->clone());
220 LogDebug(metname)<<
"made: "<<outTracks->size()<<
" tracks, "<<outTrackExtras->size()<<
" extras and "<<outRecHits->size()<<
" rechits.";
224 event.put(outTracks);
225 event.put(outTrackExtras);
226 event.put(outRecHits);
228 <<
"================================";
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
std::vector< Track > TrackCollection
collection of Tracks
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
const math::XYZPoint & outerPosition() const
position of the outermost hit
bool sharedSeed(const L3MuonTrajectorySeed &s1, const L3MuonTrajectorySeed &s2)
const math::XYZPoint & innerPosition() const
position of the innermost hit
recHitContainer::const_iterator const_iterator
edm::Ref< TrackingRecHitCollection > TrackingRecHitRef
persistent reference to a TrackingRecHit
CovarianceMatrix outerStateCovariance() const
outermost trajectory state curvilinear errors
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
L3TkMuonProducer(const edm::ParameterSet &)
constructor with config
virtual void produce(edm::Event &, const edm::EventSetup &)
produce candidates
std::pair< const_iterator, const_iterator > range
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
std::map< pseudoRef, std::pair< reco::TrackRef, SeedRef > > LXtoL3sMap
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
edm::OwnVector< TrackingRecHit > TrackingRecHitCollection
collection of TrackingRecHits
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
key_type key() const
Accessor for product key.
std::string const & moduleLabel() const
virtual ~L3TkMuonProducer()
destructor
unsigned int nHits() const
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
ProductID id() const
Accessor for product ID.
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)
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.