CMS 3D CMS Logo

L1ITMuonBarrelPrimitiveProducer.cc
Go to the documentation of this file.
1 //Authors:
2 //Luigi Guiducci - Giuseppe Codispoti
3 // framework include files
11 
12 // L1IT include files
14 
17 
20 
23 
26 
29 
30 // user include files
32 
33 using namespace L1TwinMux;
34 using namespace L1TMuon;
35 
37 
38 public:
39  inline L1ITMuonBarrelPrimitiveProducer(std::unique_ptr<MBLTContainer> _mbltContainer);
40  inline virtual ~L1ITMuonBarrelPrimitiveProducer();
41  inline virtual std::unique_ptr<L1MuDTChambPhContainer> produce( const edm::EventSetup&);
42 
43 private:
44  edm::InputTag _mbltCollectionInput = edm::InputTag("MBLTProducer");
46  //std::unique_ptr<MBLTContainer> mbltContainer;
47  std::unique_ptr<MBLTContainer> mbltContainer;
48 };
49 
50 inline std::ostream & operator<< (std::ostream & out, const TriggerPrimitiveList & rpc )
51 {
52  std::vector<TriggerPrimitiveRef>::const_iterator it = rpc.begin();
53  std::vector<TriggerPrimitiveRef>::const_iterator end = rpc.end();
54  for ( ; it != end ; ++it ) out << (*it)->getCMSGlobalPhi() << '\t';
55  out << std::endl;
56  return out;
57 }
58 
60 {
61 }
62 
63 inline L1ITMuonBarrelPrimitiveProducer::L1ITMuonBarrelPrimitiveProducer( std::unique_ptr<MBLTContainer> _mbltContainer )
64 : mbltContainer(std::move(_mbltContainer))
65 {
66  //produces<L1MuDTChambPhContainer>("L1ITMuonBarrelPrimitiveProducer");
67 
68  //consumes<MBLTContainer>(iConfig.getParameter<edm::InputTag>("MBLTCollection"));
69  //mbltContainer = std::move(_mbltContainer);
70 }
71 
72 
73 inline std::unique_ptr<L1MuDTChambPhContainer> L1ITMuonBarrelPrimitiveProducer::produce(const edm::EventSetup& iSetup )
74 {
75 
76  const PrimitiveCombiner::resolutions _resol(0.1, 2., 0.005, 0.04);
77  const int _qualityRemappingMode = 2;
78  const int _useRpcBxForDtBelowQuality = 5;
79  const bool _is7QualityCodes = true;
80 
81 
82  iSetup.get<MuonGeometryRecord>().get(_muonGeom);
83 
84  std::unique_ptr<L1MuDTChambPhContainer> out(new L1MuDTChambPhContainer);
85  std::vector<L1MuDTChambPhDigi> phiChambVector;
86 
87  // edm::Handle<MBLTContainer> mbltContainer;
88  //iEvent.getByLabel( _mbltCollectionInput, mbltContainer );
89 
90  MBLTContainer::const_iterator st = mbltContainer->begin();
91  MBLTContainer::const_iterator stend = mbltContainer->end();
92 
93  L1MuDTChambPhContainer phiContainer;
94  std::vector<L1MuDTChambPhDigi> phiVector;
95 
96  for ( ; st != stend; ++st ) {
97 
98  const MBLTCollection & mbltStation = st->second;
99 
101  int station = mbltStation.station();
102  int wheel = mbltStation.wheel();
103  int sector = mbltStation.sector();
105 
107  size_t dtListSize = mbltStation.getDtSegments().size();
108  std::vector<size_t> uncorrelated;
109  std::vector<size_t> correlated;
110  for ( size_t iDt = 0; iDt < dtListSize; ++iDt ) {
111  const TriggerPrimitiveRef & dt = mbltStation.getDtSegments().at(iDt);
112  int dtquality = dt->getDTData().qualityCode;
113  //if ( dtquality == 2 || dtquality == 3 ) std::cout << "[o]" << dtquality << '\t' ; /// GC
114  // if ( dtquality > 3 ) std::cout << "[o]" << dtquality << '\t' ; /// GC
117  // int qualityCode = -2;
118  // switch ( dtquality ) {
119  // case -1 : continue;/// -1 are theta
120  // case 0 : /* qualityCode = -2;*/ break;
121  // case 1 : /* qualityCode = -2;*/ break;
122  // case 2 : uncorrelated.push_back( iDt ); continue;
123  // case 3 : uncorrelated.push_back( iDt ); continue;
124  // case 4 : correlated.push_back( iDt ); continue; //qualityCode = 5; break;
125  // case 5 : correlated.push_back( iDt ); continue; //qualityCode = 5; break;
126  // case 6 : correlated.push_back( iDt ); continue; //qualityCode = 5; break;
127  // default : /* qualityCode = dtquality; */ break;
128  // }
129 
130  switch ( dtquality ) {
131  case -1 : continue;
132  case 0 : /* qualityCode = -2;*/ break;
133  case 1 : /* qualityCode = -2;*/ break;
134  case 2 : uncorrelated.push_back( iDt ); continue; // HI
135  case 3 : uncorrelated.push_back( iDt ); continue; // HO
136  case 4 : correlated.push_back( iDt ); continue; // LL
137  case 5 : correlated.push_back( iDt ); continue; // HL
138  case 6 : correlated.push_back( iDt ); continue; // HH
139  default : /* qualityCode = dtquality; */ break;
140  }
141 
142  //L1MuDTChambPhDigi chamb( dt->getBX(), wheel, sector-1, station, dt->getDTData().radialAngle,
143  // dt->getDTData().bendingAngle, qualityCode,
144  // dt->getDTData().Ts2TagCode, dt->getDTData().BxCntCode );
145  //phiChambVector.push_back( chamb );
146  }
147 
148  // START OF BX ANALYSIS FOR CORRELATED TRIGGER
149  size_t cSize = correlated.size();
150  for ( size_t idxDt = 0; idxDt < cSize; ++idxDt ) {
151  int bx=-999;
152  int iDt = correlated.at(idxDt);
153  if ( iDt < 0 ) continue;
154  const TriggerPrimitive & dt = *mbltStation.getDtSegments().at(iDt);
155  TriggerPrimitiveList rpcInMatch = mbltStation.getRpcInAssociatedStubs( iDt );
156  TriggerPrimitiveList rpcOutMatch = mbltStation.getRpcOutAssociatedStubs( iDt );
157  size_t rpcInMatchSize = rpcInMatch.size();
158  size_t rpcOutMatchSize = rpcOutMatch.size();
159  if ( rpcInMatchSize && rpcOutMatchSize ) {
160  const TriggerPrimitive & rpcIn = *rpcInMatch.front();
161  const TriggerPrimitive & rpcOut = *rpcOutMatch.front();
163  // LG try also to reassign BX to single H using RPC BX, e.g. do not ask for DT and RPC to have the same BX
164  if ( ( dt.getBX() == rpcIn.getBX() && dt.getBX() == rpcOut.getBX() )
165  || (_qualityRemappingMode>1 && rpcIn.getBX()==rpcOut.getBX() && abs(dt.getBX()-rpcIn.getBX())<=1) ) {
166  bx = rpcIn.getBX();
167  }
168  } else if (rpcInMatchSize){
169  const TriggerPrimitive & rpcIn = *rpcInMatch.front();
170  if ( dt.getBX() == rpcIn.getBX() || (_qualityRemappingMode>1 && abs(dt.getBX()-rpcIn.getBX())<=1)) {
171  bx = rpcIn.getBX();
172  }
173  }
174  else if (rpcOutMatchSize){
175  const TriggerPrimitive & rpcOut = *rpcOutMatch.front();
176  if ( dt.getBX() == rpcOut.getBX() || (_qualityRemappingMode>1 && abs(dt.getBX()-rpcOut.getBX())<=1)) {
177  bx = rpcOut.getBX();
178  }
179  }
180  // add primitive here
181  int newBx=dt.getBX();
182  if (bx>-999 && dt.getDTData().qualityCode<_useRpcBxForDtBelowQuality){
183  newBx=bx;
184  }
185 
186  int qualityCode = 6;
187  if ( ! _is7QualityCodes ) {
188  qualityCode = 13;
189  switch ( dt.getDTData().qualityCode ) {
190  case 4 : qualityCode = 14; break; // LL // TODO: LL+rpc=13
191  case 5 : qualityCode = 15; break; // HL
192  case 6 : qualityCode = 15; break; // HH
193  default : break;
194  }
195  }
196 
197  //std::cout << "[n]" << dt.getDTData().qualityCode << std::endl; /// GC
198  L1MuDTChambPhDigi chamb( newBx, wheel, sector-1, station, dt.getDTData().radialAngle,
199  dt.getDTData().bendingAngle, qualityCode,
201  phiChambVector.push_back( chamb );
202  }
203  // END OF BX ANALYSIS FOR CORRELATED TRIGGER
204 
205  // BEGIN OF BX ANALYSIS FOR UNCORRELATED TRIGGER
206  size_t uncSize = uncorrelated.size();
207  for ( size_t idxDt = 0; idxDt < uncSize; ++idxDt ) {
208 
209  int iDt = uncorrelated.at(idxDt);
210  if ( iDt < 0 ) continue;
211  const TriggerPrimitive & dt = *mbltStation.getDtSegments().at(iDt);
212 
214  int closest = -1;
215  int closestIdx = -1;
216  double minDeltaPhiDt = 9999999999;
217  for ( size_t jdxDt = idxDt+1; jdxDt < uncSize; ++jdxDt ) {
218 
219  int jDt = uncorrelated.at(jdxDt);
220  if ( jDt < 0 ) continue;
221 
222  const TriggerPrimitiveRef & dtM = mbltStation.getDtSegments().at(jDt);
223  if ( dt.getBX() == dtM->getBX() || dt.getDTData().qualityCode == dtM->getDTData().qualityCode )
224  continue;
225 
226  double deltaPhiDt = fabs( reco::deltaPhi( dt.getCMSGlobalPhi(), dtM->getCMSGlobalPhi() ) );
227  if ( deltaPhiDt < minDeltaPhiDt ) {
228  closest = jDt;
229  closestIdx = jdxDt;
230  minDeltaPhiDt=deltaPhiDt;
231  }
232  }
233 
236  if ( closest > 0 && minDeltaPhiDt < 0.05 ) {
237  //if ( closest > 0 ) {
238  match = mbltStation.haveCommonRpc( iDt, closest );
239  }
240 
242  // int qualityCode = dt.getDTData().qualityCode;
243  int bx = -2;
244  int radialAngle = 0;
245  int bendingAngle = 0;
248  combiner.addDt( dt );
249 
251  if ( match != MBLTCollection::NOMATCH ) {
252  uncorrelated[closestIdx] = -1;
253 
255  combiner.addDt( *mbltStation.getDtSegments().at(closest) );
256 
259  TriggerPrimitiveList rpcInMatch = mbltStation.getRpcInAssociatedStubs( iDt );
260  TriggerPrimitiveList rpcOutMatch = mbltStation.getRpcOutAssociatedStubs( iDt );
261 
263  if ( match == MBLTCollection::INMATCH ) {
264 
265  const TriggerPrimitive & rpcIn = *rpcInMatch.front();
266  combiner.addRpcIn( rpcIn );
267  bx = rpcIn.getBX();
268 
270  } else if ( match == MBLTCollection::OUTMATCH ) {
271 
272  const TriggerPrimitive & rpcOut = *rpcOutMatch.front();
273  combiner.addRpcOut( rpcOut );
274  bx = rpcOut.getBX();
275 
277  } else if ( match == MBLTCollection::FULLMATCH ) {
278 
279  const TriggerPrimitive & rpcIn = *rpcInMatch.front();
280  const TriggerPrimitive & rpcOut = *rpcOutMatch.front();
281  combiner.addRpcIn( rpcIn );
282  combiner.addRpcOut( rpcOut );
283  bx = rpcIn.getBX();
284  }
285 
286 
287  } else {
288 
289  TriggerPrimitiveList rpcInMatch = mbltStation.getRpcInAssociatedStubs( iDt );
290  TriggerPrimitiveList rpcOutMatch = mbltStation.getRpcOutAssociatedStubs( iDt );
291  size_t rpcInMatchSize = rpcInMatch.size();
292  size_t rpcOutMatchSize = rpcOutMatch.size();
293 
295  if ( rpcInMatchSize && rpcOutMatchSize ) {
296  const TriggerPrimitive & rpcIn = *rpcInMatch.front();
297  const TriggerPrimitive & rpcOut = *rpcOutMatch.front();
299  // LG try also to reassign BX to single H using RPC BX, e.g. do not ask for DT and RPC to have the same BX
300  if (( dt.getBX() == rpcIn.getBX() && dt.getBX() == rpcOut.getBX() )
301  || (_qualityRemappingMode>1 && rpcIn.getBX()==rpcOut.getBX() && abs(dt.getBX()-rpcIn.getBX())<=1)) {
302  bx = rpcIn.getBX();
303  combiner.addRpcIn( rpcIn );
304  combiner.addRpcOut( rpcOut );
305  } else if ( dt.getBX() == rpcIn.getBX() ) {
306  bx = rpcIn.getBX();
307  combiner.addRpcIn( rpcIn );
308  } else if ( dt.getBX() == rpcOut.getBX() ) {
309  bx = rpcOut.getBX();
310  combiner.addRpcOut( rpcOut );
311  }
312 
314  } else if ( rpcInMatchSize ) {
315  const TriggerPrimitive & rpcIn = *rpcInMatch.front();
316  if ( dt.getBX() == rpcIn.getBX() || (_qualityRemappingMode>1 && abs(dt.getBX()-rpcIn.getBX())<=1)) {
317  bx = rpcIn.getBX();
318  combiner.addRpcIn( rpcIn );
319  }
320 
322  } else if ( rpcOutMatchSize ) {
323  const TriggerPrimitive & rpcOut = *rpcOutMatch.front();
324  if ( dt.getBX() == rpcOut.getBX()|| (_qualityRemappingMode>1 && abs(dt.getBX()-rpcOut.getBX())<=1)) {
325  bx = rpcOut.getBX();
326  combiner.addRpcOut( rpcOut );
327  }
328 
329  }
330  }
331 
332  // match found, PrimitiveCombiner has the needed variables already calculated
333  // 2016: the DT spatial parameters are not updated
334  if ( combiner.isValid() ) {
335  //std::cout<<"=== I am making a combination ==="<<std::endl;
336  combiner.combine();
337  radialAngle = dt.getDTData().radialAngle;
338  bendingAngle = dt.getDTData().bendingAngle;
339 
340  //radialAngle = combiner.radialAngle();
341  //bendingAngle = (combiner.bendingAngle() < -511 || combiner.bendingAngle() > 511) ? dt.getDTData().bendingAngle : combiner.bendingAngle( );
342 
343  } else {
344  // no match found, keep the primitive as it is
345  bx = dt.getBX();
346  radialAngle = dt.getDTData().radialAngle;
347  bendingAngle = dt.getDTData().bendingAngle;
348  //if (_qualityRemappingMode==0)
349  // qualityCode = ( qualityCode == 2 ) ? 0 : 1;
350  }
351 
352  int qualityCode = ( _is7QualityCodes ?
353  combiner.getUncorrelatedQuality7() :
354  combiner.getUncorrelatedQuality16() );
355 
356  // std::cout << "[n]" << qualityCode << std::endl; /// GC
357  L1MuDTChambPhDigi chamb( bx, wheel, sector-1, station, radialAngle,
358  bendingAngle, qualityCode,
360  phiChambVector.push_back( chamb );
361  //if (abs(bendingAngle)>511||1==1){
362  // std::cout<<"Got bending angle: "<<bendingAngle<<std::endl;
363  //std::cout<<"Original DT primitive had bending angle: "<<dt.getDTData().bendingAngle<<std::endl;
364  //std::cout<<"Original radial angle: "<<radialAngle<<std::endl;
365  //std::cout<<"Quality: "<<qualityCode<<std::endl;
366  //std::cout<<"Station: "<<station<<std::endl;
367  //}
368 
369  }
370 // ////////////////////////////////////////////////////
371 // /// loop over unassociated inner and outer RPC hits
372 // const TriggerPrimitiveList & rpcInUnass = mbltStation.getRpcInUnassociatedStubs();
373 // const TriggerPrimitiveList & rpcOutUnass = mbltStation.getRpcOutUnassociatedStubs();
374 
375 // size_t rpcInUSize = rpcInUnass.size();
376 // size_t rpcOutUsize = rpcOutUnass.size();
377 
378 // for ( size_t in = 0; in < rpcInUSize; ++in ) {
379 // for ( size_t out = 0; out < rpcOutUSize; ++out ) {
380 
381  const std::vector< std::pair< TriggerPrimitiveList, TriggerPrimitiveList > >
382  rpcPairList = mbltStation.getUnassociatedRpcClusters( 0.05 );
383  auto rpcPair = rpcPairList.cbegin();
384  auto rpcPairEnd = rpcPairList.cend();
385  for ( ; rpcPair != rpcPairEnd; ++ rpcPair ) {
386  const TriggerPrimitiveList & inRpc = rpcPair->first;
387  const TriggerPrimitiveList & outRpc = rpcPair->second;
388 
389  if ( inRpc.empty() && outRpc.empty() ) continue;
390 
392  size_t inSize = inRpc.size();
393  size_t outSize = outRpc.size();
394  int station = -1;
395  int sector = -1;
396  int wheel = -5;
397  // double qualityCode = 0;
398 
399  if ( inSize ) {
400  //std::cout<<"Producer working on IN&&!OUT"<<std::endl;
401  size_t inPos = 0;
402  // double avPhiIn = 0;
403  double avPhiSin = 0;
404  double avPhiCos = 0;
405  for ( size_t i = 0; i < inSize; ++i ) {
406  double locPhi = inRpc.at(i)->getCMSGlobalPhi();
407  // avPhiIn += ( locPhi > 0 ? locPhi : 2*M_PI + locPhi );
408  avPhiSin += sin( locPhi );
409  avPhiCos += cos( locPhi );
410  }
411  // avPhiIn /= inSize;
412  avPhiSin /= inSize;
413  avPhiCos /= inSize;
414  double avPhiIn = atan2( avPhiSin, avPhiCos );
415 
416  double minDist = fabs( inRpc.at(0)->getCMSGlobalPhi() - avPhiIn );
417  for ( size_t i = 1; i < inSize; ++i ) {
418  double dist = fabs( inRpc.at(i)->getCMSGlobalPhi() - avPhiIn );
419  if ( dist < minDist ) {
420  inPos = i;
421  minDist = dist;
422  }
423  }
424 
425  // const TriggerPrimitive & rpc = (*inRpc.at(inPos));
426  TriggerPrimitive rpc = (*inRpc.at(inPos));
427  rpc.setCMSGlobalPhi( avPhiIn );
428  station = rpc.detId<RPCDetId>().station();
429  sector = rpc.detId<RPCDetId>().sector();
430  wheel = rpc.detId<RPCDetId>().ring();
431  combiner.addRpcIn( rpc );
432 
433 
434  }
435  if ( outSize ) {
436  //std::cout<<"Producer working on OUT&&!IN"<<std::endl;
437  size_t outPos = 0;
438  //double avPhiOut = 0;
439  double avPhiSin = 0;
440  double avPhiCos = 0;
441  for ( size_t i = 0; i < outSize; ++i ) {
442  double locPhi = outRpc.at(i)->getCMSGlobalPhi();
443  // avPhiOut += ( locPhi > 0 ? locPhi : 2*M_PI + locPhi );
444  avPhiSin += sin( locPhi );
445  avPhiCos += cos( locPhi );
446  }
447 
448  //avPhiOut /= outSize;
449  avPhiSin /= outSize;
450  avPhiCos /= outSize;
451  double avPhiOut = atan2( avPhiSin, avPhiCos );
452  double minDist = fabs( outRpc.at(0)->getCMSGlobalPhi() - avPhiOut );
453  for ( size_t i = 1; i < outSize; ++i ) {
454  double dist = fabs( outRpc.at(i)->getCMSGlobalPhi() - avPhiOut );
455  if ( dist < minDist ) {
456  outPos = i;
457  minDist = dist;
458  }
459  }
460  // const TriggerPrimitive & rpc = (*outRpc.at(outPos));
461  TriggerPrimitive rpc = (*outRpc.at(outPos));
462  rpc.setCMSGlobalPhi( avPhiOut );
463  station = rpc.detId<RPCDetId>().station();
464  sector = rpc.detId<RPCDetId>().sector();
465  wheel = rpc.detId<RPCDetId>().ring();
466  combiner.addRpcOut( rpc );
467  }
468  //else // {
469 // // std::cout<<"Producer working on IN&&OUT"<<std::endl;
470 // size_t inPos = 0;
471 // size_t outPos = 0;
472 // double minDist = 9999;
473 
474 // for ( size_t i = 0; i < inSize; ++i ) {
475 // for ( size_t j = 0; j < outSize; ++j ) {
476 
477 // double dist = fabs( inRpc.at(0)->getCMSGlobalPhi()
478 // - outRpc.at(0)->getCMSGlobalPhi() );
479 // if ( dist < minDist ) {
480 // inPos = i;
481 // outPos = j;
482 // minDist = dist;
483 // }
484 // }
485 // }
486 // const TriggerPrimitive & rpc_in = (*inRpc.at(inPos));
487 
488 // const TriggerPrimitive & rpc_out = (*outRpc.at(outPos));
489 // station = rpc_in.detId<RPCDetId>().station();
490 // sector = rpc_in.detId<RPCDetId>().sector();
491 // wheel = rpc_in.detId<RPCDetId>().ring();
492 // combiner.addRpcIn( rpc_in );
493 // combiner.addRpcOut( rpc_out );
494 // qualityCode = 1;
495 // }
496 
497  // if (inSize && outSize) qualityCode=1;
498  combiner.combine();
499  double radialAngle = combiner.radialAngle();
500  double bendingAngle = combiner.bendingAngle();
501  double bx = combiner.bx();
502  double Ts2TagCode = 0;
503  double BxCntCode = 0;
504 
505 
506  int qualityCode = ( _is7QualityCodes ?
507  combiner.getUncorrelatedQuality7() :
508  combiner.getUncorrelatedQuality16() );
509  if ( qualityCode >= 0 ) {
510  // std::cout << "[r]" << qualityCode << std::endl ; /// GC
511  L1MuDTChambPhDigi chamb( bx, wheel, sector-1, station, radialAngle,
512  bendingAngle, qualityCode,
513  Ts2TagCode, BxCntCode );
514  phiChambVector.push_back( chamb );
515  }
516 
517  //std::cout << "IN: \n" << inRpc;
518  //std::cout << "OUT: \n" << outRpc;
519  //std::cout << "\n";
520 
521  }
522 
523  }
524 
525 
526 
527 
528  out->setContainer( phiChambVector );
530  //iEvent.put(std::move(out));
531  return out;
532 
533 }
534 
535 //#include "FWCore/Framework/interface/MakerMacros.h"
536 //DEFINE_FWK_MODULE(L1ITMuonBarrelPrimitiveProducer);
537 
float dt
Definition: AMPTWrapper.h:126
int wheel() const
returns wheel
int getUncorrelatedQuality7() const
FIXME END.
const DTData getDTData() const
a struct useful for resulution info sharing
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
bool isValid() const
valid if we have at least: 1 rpc; 1 dt + 1 any
bxMatch haveCommonRpc(size_t dt1, size_t dt2) const
std::vector< std::pair< TriggerPrimitiveList, TriggerPrimitiveList > > getUnassociatedRpcClusters(double minRpcPhi) const
RPC unassociated clusters.
void combine()
do combine the primitives
L1ITMuonBarrelPrimitiveProducer(std::unique_ptr< MBLTContainer > _mbltContainer)
const double getCMSGlobalPhi() const
std::unique_ptr< MBLTContainer > mbltContainer
const double NOMATCH
TriggerPrimitiveList getRpcInAssociatedStubs(size_t dtIndex) const
rpc inner layer hits associated to a given dt station
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
#define end
Definition: vmac.h:37
int sector() const
returns sector
double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
void addRpcOut(const L1TMuon::TriggerPrimitive &prim)
void addRpcIn(const L1TMuon::TriggerPrimitive &prim)
const T & get() const
Definition: EventSetup.h:55
std::vector< TriggerPrimitiveRef > TriggerPrimitiveList
virtual std::unique_ptr< L1MuDTChambPhContainer > produce(const edm::EventSetup &)
int bx() const
output result variables
void addDt(const L1TMuon::TriggerPrimitive &prim)
feed the combiner with the available primitives
int station() const
returns station
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
void setCMSGlobalPhi(const double phi)
TriggerPrimitiveList getRpcOutAssociatedStubs(size_t dtIndex) const
rpc outer layer hits associated to a given dt station
std::ostream & operator<<(std::ostream &out, const TriggerPrimitiveList &rpc)
def move(src, dest)
Definition: eostools.py:510
const TriggerPrimitiveList & getDtSegments() const
return a reference to the DT only segments