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
16 
19 
20 #include <string>
21 
22 using namespace edm;
23 using namespace std;
24 using namespace reco;
25 
28  LogTrace("Muon|RecoMuon|L3TkMuonProducer")<<" constructor called";
29 
30  // StandAlone Collection Label
31  theL3CollectionLabel = parameterSet.getParameter<InputTag>("InputObjects");
32  produces<TrackCollection>();
33  produces<TrackExtraCollection>();
34  produces<TrackingRecHitCollection>();
35 }
36 
39  LogTrace("Muon|RecoMuon|L3TkMuonProducer")<<" L3TkMuonProducer destructor called";
40 }
41 
43  //quit right away on nH=0
44  if (s1.nHits()==0 || s2.nHits()==0) return false;
45  //quit right away if not the same number of hits
46  if (s1.nHits()!=s2.nHits()) return false;
50  TrajectorySeed::const_iterator & i1_e=r1.second,&i2_e=r2.second;
51  TrajectorySeed::const_iterator & i1_b=r1.first,&i2_b=r2.first;
52  //quit right away if first detId does not match. front exist because of ==0 ->quit test
53  if(i1_b->geographicalId() != i2_b->geographicalId()) return false;
54  //then check hit by hit if they are the same
55  for (i1=i1_b,i2=i2_b;i1!=i1_e,i2!=i2_e;++i1,++i2){
56  if (!i1->sharesInput(&(*i2),TrackingRecHit::all)) return false;
57  }
58  return true;
59 }
60 
61 string printvector(const vector<TrackRef> & v){
62  std::stringstream ss;
63  for (unsigned int i=0;i!=v.size();++i) {
64  if (i!=0) ss<<"\n";
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();
68  }
69  return ss.str();
70 }
71 
72 string printvector(const vector<L3TkMuonProducer::SeedRef> & v){
73  std::stringstream ss;
74  for (unsigned int i=0;i!=v.size();++i){
75  if (i!=0) ss<<"\n";
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();
79  else
80  ss<<" and pT: "<<v[i]->l2Track()->pt()<<" of L2: "<<v[i]->l2Track().id().id()<<":"<<v[i]->l2Track().key();
81  }
82  return ss.str();
83 }
84 
86  std::stringstream ss;
87  ss<<" seed ref: "<<s.id().id()<<":"<<s.key()<<" has "<< s->nHits()<<"rechits";
88  TrajectorySeed::range r=s->recHits();
90  for (;it!=r.second;++it)
91  ss<<"\n detId: "<<it->geographicalId()<<" position: "<<it->localPosition()<<" and error: "<<it->localPositionError();
92  return ss.str();
93 }
94 
96 void L3TkMuonProducer::produce(Event& event, const EventSetup& eventSetup){
97  const string metname = "Muon|RecoMuon|L3TkMuonProducer";
98 
99  // Take the L3 container
100  LogDebug(metname)<<" Taking the L3/GLB muons: "<<theL3CollectionLabel.label();
102  event.getByLabel(theL3CollectionLabel,tracks);
103 
104  //make the LX->L3s pools
105  LXtoL3sMap LXtoL3s;
106 
107  unsigned int maxI = tracks->size();
108  bool gotL3seeds=false;
110 
111  //make a list of reference to tracker tracks
112  vector<TrackRef> orderedTrackTracks(maxI);
113  for (unsigned int i=0;i!=maxI;i++) orderedTrackTracks[i]=TrackRef(tracks,i);
114  LogDebug(metname)<<"vector of L3 tracks before ordering:\n"<<printvector(orderedTrackTracks);
115  //order them in pT
116  sort(orderedTrackTracks.begin(),orderedTrackTracks.end(),trackRefBypT);
117  LogDebug(metname)<<"vector of L3 tracks after ordering:\n"<<printvector(orderedTrackTracks);
118  //loop over then
119  for (unsigned int i=0;i!=maxI;i++) {
120  TrackRef & tk=orderedTrackTracks[i];
121  SeedRef l3seedRef = tk->seedRef().castTo<SeedRef>();
122 
123  vector<SeedRef> allPossibleOrderedLx; // with identical hit-set
124  //add the direct relation
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();
127 
128  //add the relations due to shared seeds
129  //check whether there is a "shared" seed in addition
130  if (!gotL3seeds){
131  //need to fetch the handle from the ref
132  const edm::Provenance & seedsProv=event.getProvenance(l3seedRef.id());
133  edm::InputTag l3seedsTag(seedsProv.moduleLabel(), seedsProv.productInstanceName(), seedsProv.processName());
134  event.getByLabel(l3seedsTag, l3seeds);
135  gotL3seeds=true;
136  LogDebug(metname)<<"got seeds handle from: "<<l3seedsTag;
137  }
138  //loop the other seeds in the collection
139  for (unsigned int iS=0;iS!=l3seeds->size();++iS){
140  const L3MuonTrajectorySeed & seed = (*l3seeds)[iS];
141  const L3MuonTrajectorySeed & thisSeed = *l3seedRef;
142  if (l3seedRef.key()==iS) continue; //not care about this one
143  //compare this seed with the seed in the collection
144  if (sharedSeed(seed,thisSeed)){
145  SeedRef thisSharedSeedRef(l3seeds,iS);
146  LogDebug(metname)<<"shared seeds: \n"<<printseed(l3seedRef)<<" and: \n"<<printseed(thisSharedSeedRef)
147  <<"\nadding ANOTHER seed ref: "<<thisSharedSeedRef.id().id()<<":"<<thisSharedSeedRef.key()<<" for this tracker track: "<<tk.id().id()<<":"<<tk.key();
148  // edm::LogError(metname)<<" we have a shared seed right there.";
149  allPossibleOrderedLx.push_back(thisSharedSeedRef);
150  }//seed is shared
151  }//loop all other existing seed for overlaps
152 
153  //now you have the full list of Lx objects that have seed this tracker track.
154  // order the list in pT of Lx objects
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);
158  // assign this tracker track to the highest pT Lx.
159  for (unsigned int iL=0;iL!=allPossibleOrderedLx.size();++iL){
160  SeedRef thisRef=allPossibleOrderedLx[iL];
161  pseudoRef ref = makePseudoRef(*thisRef);
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()){
165  //there's already an entry. because of the prior ordering in pT of the tracker track refs
166  // the track ref already there *has* a higher pT: this one cannot compete and should be assigned to the next Lx;
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();
170  continue;
171  }else{
172  //there was no entry yet. make the assignement
173  LogDebug(metname)<<"this tracker track: "<<tk.id().id()<<":"<<tk.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);
176  //once assigned. break
177  break;
178  }
179  }//loop possible Lx for possible assignement
180  }//loop over ordered list of tracker track refs
181 
182 
183  //prepare the output
184  std::auto_ptr<TrackCollection> outTracks( new TrackCollection(LXtoL3s.size()));
185  std::auto_ptr<TrackExtraCollection> outTrackExtras( new TrackExtraCollection(LXtoL3s.size()));
186  reco::TrackExtraRefProd rTrackExtras = event.getRefBeforePut<TrackExtraCollection>();
187  std::auto_ptr<TrackingRecHitCollection> outRecHits( new TrackingRecHitCollection());
188  TrackingRecHitRefProd rHits = event.getRefBeforePut<TrackingRecHitCollection>();
189 
190  LogDebug(metname)<<"reading the map to make "<< LXtoL3s.size()<<"products.";
191  //fill the collection from the map
192  LXtoL3sMap::iterator f=LXtoL3s.begin();
193  unsigned int i=0;
194  for (;f!=LXtoL3s.end();++f,++i){
195 
196  LogDebug(metname)<<"copy the track over, and make ref to extra";
197  const Track & trk = *(f->second.first);
198  (*outTracks)[i] = Track(trk);
199  (*outTracks)[i].setExtra( TrackExtraRef(rTrackExtras,i));
200 
201  LogDebug(metname)<<"copy the trackExtra too, and change the seedref";
202  edm::RefToBase<TrajectorySeed> seedRef(f->second.second);
203  //do not use the copy constructor, otherwise the hit Ref are still the same
204  (*outTrackExtras)[i] = TrackExtra(
205  trk.outerPosition(), trk.outerMomentum(), trk.outerOk(),
206  trk.innerPosition(), trk.innerMomentum(), trk.innerOk(),
207  trk.outerStateCovariance(), trk.outerDetId(),
208  trk.innerStateCovariance(), trk.innerDetId(),
209  seedRef->direction(),seedRef
210  );
211 
212  LogDebug(metname)<<"copy the hits too";
213  unsigned int iRH=0;
214  for( trackingRecHit_iterator hit = trk.recHitsBegin(); hit != trk.recHitsEnd(); ++ hit,++iRH ) {
215  outRecHits->push_back((*hit)->clone());
216  (*outTrackExtras)[i].add( TrackingRecHitRef( rHits, iRH));
217  }
218  }
219 
220  LogDebug(metname)<<"made: "<<outTracks->size()<<" tracks, "<<outTrackExtras->size()<<" extras and "<<outRecHits->size()<<" rechits.";
221 
222  //put the collection in the event
223  LogDebug(metname)<<"loading...";
224  event.put(outTracks);
225  event.put(outTrackExtras);
226  event.put(outRecHits);
227  LogDebug(metname)<<" Event loaded"
228  <<"================================";
229 }
#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:10
bool innerOk() const
return true if the innermost hit is valid
Definition: Track.h:40
edm::Ref< TrackExtraCollection > TrackExtraRef
persistent reference to a TrackExtra
Definition: TrackExtraFwd.h:13
std::string const & processName() const
Definition: Provenance.h:63
const math::XYZPoint & outerPosition() const
position of the outermost hit
Definition: Track.h:47
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:42
recHitContainer::const_iterator const_iterator
edm::Ref< TrackingRecHitCollection > TrackingRecHitRef
persistent reference to a TrackingRecHit
CovarianceMatrix outerStateCovariance() const
outermost trajectory state curvilinear errors
Definition: Track.h:51
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
Definition: Track.h:59
L3TkMuonProducer(const edm::ParameterSet &)
constructor with config
virtual void produce(edm::Event &, const edm::EventSetup &)
produce candidates
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:63
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:9
edm::OwnVector< TrackingRecHit > TrackingRecHitCollection
collection of TrackingRecHits
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
Definition: Track.h:49
bool outerOk() const
return true if the outermost hit is valid
Definition: Track.h:38
tuple tracks
Definition: testEve_cfg.py:39
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
Definition: TrackFwd.h:14
CovarianceMatrix innerStateCovariance() const
innermost trajectory state curvilinear errors
Definition: Track.h:53
key_type key() const
Accessor for product key.
Definition: Ref.h:266
range recHits() const
std::string const & moduleLabel() const
Definition: Provenance.h:62
virtual ~L3TkMuonProducer()
destructor
unsigned int nHits() const
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
Definition: Track.h:45
ProductID id() const
Accessor for product ID.
Definition: Ref.h:256
ProductIndex id() const
Definition: ProductID.h:38
std::string const & productInstanceName() const
Definition: Provenance.h:64
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
Definition: Track.h:61
mathSSE::Vec4< T > v
string printvector(const vector< TrackRef > &v)
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:65