CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
L3TkMuonProducer.cc
Go to the documentation of this file.
1 
9 // Framework
15 
18 
19 #include <string>
20 
21 using namespace edm;
22 using namespace std;
23 using namespace reco;
24 
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 
37 
38  callWhenNewProductsRegistered( [this](const edm::BranchDescription& iBD) {
40  if(iBD.unwrappedTypeID() == id) {
41  this->mayConsume<L3MuonTrajectorySeedCollection>(edm::InputTag{iBD.moduleLabel(), iBD.productInstanceName(),iBD.processName()} );
42  }
43  });
44 
45 
46 
47 }
48 
51  LogTrace("Muon|RecoMuon|L3TkMuonProducer")<<" L3TkMuonProducer destructor called";
52 }
53 
55  //quit right away on nH=0
56  if (s1.nHits()==0 || s2.nHits()==0) return false;
57  //quit right away if not the same number of hits
58  if (s1.nHits()!=s2.nHits()) return false;
62  TrajectorySeed::const_iterator & i1_e=r1.second,&i2_e=r2.second;
63  TrajectorySeed::const_iterator & i1_b=r1.first,&i2_b=r2.first;
64  //quit right away if first detId does not match. front exist because of ==0 ->quit test
65  if(i1_b->geographicalId() != i2_b->geographicalId()) return false;
66  //then check hit by hit if they are the same
67  for (i1=i1_b,i2=i2_b;i1!=i1_e && i2!=i2_e;++i1,++i2){
68  if (!i1->sharesInput(&(*i2),TrackingRecHit::all)) return false;
69  }
70  return true;
71 }
72 
73 string printvector(const vector<TrackRef> & v){
74  std::stringstream ss;
75  for (unsigned int i=0;i!=v.size();++i) {
76  if (i!=0) ss<<"\n";
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();
80  }
81  return ss.str();
82 }
83 
84 string printvector(const vector<L3TkMuonProducer::SeedRef> & v){
85  std::stringstream ss;
86  for (unsigned int i=0;i!=v.size();++i){
87  if (i!=0) ss<<"\n";
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();
91  else
92  ss<<" and pT: "<<v[i]->l2Track()->pt()<<" of L2: "<<v[i]->l2Track().id().id()<<":"<<v[i]->l2Track().key();
93  }
94  return ss.str();
95 }
96 
98  std::stringstream ss;
99  ss<<" seed ref: "<<s.id().id()<<":"<<s.key()<<" has "<< s->nHits()<<"rechits";
100  TrajectorySeed::range r=s->recHits();
102  for (;it!=r.second;++it)
103  ss<<"\n detId: "<<it->geographicalId()<<" position: "<<it->localPosition()<<" and error: "<<it->localPositionError();
104  return ss.str();
105 }
106 
108 void L3TkMuonProducer::produce(Event& event, const EventSetup& eventSetup) {
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++) orderedTrackTracks[i]=TrackRef(tracks,i);
126  LogDebug(metname)<<"vector of L3 tracks before ordering:\n"<<printvector(orderedTrackTracks);
127  //order them in pT
128  sort(orderedTrackTracks.begin(),orderedTrackTracks.end(),trackRefBypT);
129  LogDebug(metname)<<"vector of L3 tracks after ordering:\n"<<printvector(orderedTrackTracks);
130  //loop over then
131  for (unsigned int i=0;i!=maxI;i++) {
132  TrackRef & tk=orderedTrackTracks[i];
133  SeedRef l3seedRef = tk->seedRef().castTo<SeedRef>();
134 
135  vector<SeedRef> allPossibleOrderedLx; // with identical hit-set
136  //add the direct relation
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();
139 
140  //add the relations due to shared seeds
141  //check whether there is a "shared" seed in addition
142  if (!gotL3seeds){
143  //need to fetch the handle from the ref
144  const edm::Provenance & seedsProv=event.getProvenance(l3seedRef.id());
145  edm::InputTag l3seedsTag(seedsProv.moduleLabel(), seedsProv.productInstanceName(), seedsProv.processName());
146  event.getByLabel(l3seedsTag, l3seeds);
147  gotL3seeds=true;
148  LogDebug(metname)<<"got seeds handle from: "<<l3seedsTag;
149  }
150  //loop the other seeds in the collection
151  for (unsigned int iS=0;iS!=l3seeds->size();++iS){
152  const L3MuonTrajectorySeed & seed = (*l3seeds)[iS];
153  const L3MuonTrajectorySeed & thisSeed = *l3seedRef;
154  if (l3seedRef.key()==iS) continue; //not care about this one
155  //compare this seed with the seed in the collection
156  if (sharedSeed(seed,thisSeed)){
157  SeedRef thisSharedSeedRef(l3seeds,iS);
158  LogDebug(metname)<<"shared seeds: \n"<<printseed(l3seedRef)<<" and: \n"<<printseed(thisSharedSeedRef)
159  <<"\nadding ANOTHER seed ref: "<<thisSharedSeedRef.id().id()<<":"<<thisSharedSeedRef.key()<<" for this tracker track: "<<tk.id().id()<<":"<<tk.key();
160  // edm::LogError(metname)<<" we have a shared seed right there.";
161  allPossibleOrderedLx.push_back(thisSharedSeedRef);
162  }//seed is shared
163  }//loop all other existing seed for overlaps
164 
165  //now you have the full list of Lx objects that have seed this tracker track.
166  // order the list in pT of Lx objects
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);
170  // assign this tracker track to the highest pT Lx.
171  for (unsigned int iL=0;iL!=allPossibleOrderedLx.size();++iL){
172  SeedRef thisRef=allPossibleOrderedLx[iL];
173  pseudoRef ref = makePseudoRef(*thisRef);
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()){
177  //there's already an entry. because of the prior ordering in pT of the tracker track refs
178  // the track ref already there *has* a higher pT: this one cannot compete and should be assigned to the next Lx;
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();
182  continue;
183  }else{
184  //there was no entry yet. make the assignement
185  LogDebug(metname)<<"this tracker track: "<<tk.id().id()<<":"<<tk.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);
188  //once assigned. break
189  break;
190  }
191  }//loop possible Lx for possible assignement
192  }//loop over ordered list of tracker track refs
193 
194 
195  //prepare the output
196  std::auto_ptr<TrackCollection> outTracks( new TrackCollection(LXtoL3s.size()));
197  std::auto_ptr<TrackExtraCollection> outTrackExtras( new TrackExtraCollection(LXtoL3s.size()));
198  reco::TrackExtraRefProd rTrackExtras = event.getRefBeforePut<TrackExtraCollection>();
199  std::auto_ptr<TrackingRecHitCollection> outRecHits( new TrackingRecHitCollection());
200  TrackingRecHitRefProd rHits = event.getRefBeforePut<TrackingRecHitCollection>();
201 
202  LogDebug(metname)<<"reading the map to make "<< LXtoL3s.size()<<"products.";
203  //fill the collection from the map
204  LXtoL3sMap::iterator f=LXtoL3s.begin();
205  unsigned int i=0;
206  for (;f!=LXtoL3s.end();++f,++i){
207 
208  LogDebug(metname)<<"copy the track over, and make ref to extra";
209  const Track & trk = *(f->second.first);
210  (*outTracks)[i] = Track(trk);
211  (*outTracks)[i].setExtra( TrackExtraRef(rTrackExtras,i));
212 
213  LogDebug(metname)<<"copy the trackExtra too, and change the seedref";
214  edm::RefToBase<TrajectorySeed> seedRef(f->second.second);
215  //do not use the copy constructor, otherwise the hit Ref are still the same
216  (*outTrackExtras)[i] = TrackExtra(
217  trk.outerPosition(), trk.outerMomentum(), trk.outerOk(),
218  trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
219  trk.outerStateCovariance(), trk.outerDetId(),
220  trk.innerStateCovariance(), trk.innerDetId(),
221  seedRef->direction(),seedRef
222  );
223 
224  LogDebug(metname)<<"copy the hits too";
225  unsigned int iRH=0;
226  for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++ hit,++iRH ) {
227  outRecHits->push_back((*hit)->clone());
228  }
229  (*outTrackExtras)[i].setHits( rHits, 0, iRH);
230  }
231 
232  LogDebug(metname)<<"made: "<<outTracks->size()<<" tracks, "<<outTrackExtras->size()<<" extras and "<<outRecHits->size()<<" rechits.";
233 
234  //put the collection in the event
235  LogDebug(metname)<<"loading...";
236  event.put(outTracks);
237  event.put(outTrackExtras);
238  event.put(outRecHits);
239  LogDebug(metname)<<" Event loaded"
240  <<"================================";
241 }
#define LogDebug(id)
PropagationDirection direction() const
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
std::pair< unsigned int, unsigned int > pseudoRef
string printseed(const L3TkMuonProducer::SeedRef &s)
const std::string metname
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:13
bool innerOk() const
return true if the innermost hit is valid
Definition: Track.h:50
edm::Ref< TrackExtraCollection > TrackExtraRef
persistent reference to a TrackExtra
Definition: TrackExtraFwd.h:17
std::string const & processName() const
key_type key() const
Accessor for product key.
Definition: Ref.h:266
std::string const & processName() const
Definition: Provenance.h:61
const math::XYZPoint & outerPosition() const
position of the outermost hit
Definition: Track.h:65
ProductID id() const
Accessor for product ID.
Definition: Ref.h:256
tuple s2
Definition: indexGen.py:106
bool sharedSeed(const L3MuonTrajectorySeed &s1, const L3MuonTrajectorySeed &s2)
const math::XYZPoint & innerPosition() const
position of the innermost hit
Definition: Track.h:55
virtual 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
Definition: Track.h:75
TypeID unwrappedTypeID() const
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
Definition: Track.h:94
L3TkMuonProducer(const edm::ParameterSet &)
constructor with config
std::pair< const_iterator, const_iterator > range
double f[11][100]
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:104
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
#define LogTrace(id)
std::map< pseudoRef, std::pair< reco::TrackRef, SeedRef > > LXtoL3sMap
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
Definition: TrackExtraFwd.h:11
edm::OwnVector< TrackingRecHit > TrackingRecHitCollection
collection of TrackingRecHits
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
Definition: Track.h:70
bool outerOk() const
return true if the outermost hit is valid
Definition: Track.h:45
tuple tracks
Definition: testEve_cfg.py:39
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:19
CovarianceMatrix innerStateCovariance() const
innermost trajectory state curvilinear errors
Definition: Track.h:80
range recHits() const
std::string const & moduleLabel() const
Definition: Provenance.h:60
virtual ~L3TkMuonProducer()
destructor
unsigned int nHits() const
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
Definition: Track.h:60
ProductIndex id() const
Definition: ProductID.h:38
std::string const & productInstanceName() const
Definition: Provenance.h:62
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
Definition: Track.h:99
string printvector(const vector< TrackRef > &v)
ParameterSet const & parameterSet(Provenance const &provenance)
Definition: Provenance.cc:11
TrackingRecHitCollection::base::const_iterator trackingRecHit_iterator
iterator over a vector of reference to TrackingRecHit in the same collection
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:109