CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes
L1MuBMMuonSorter Class Reference

#include <L1MuBMMuonSorter.h>

Inheritance diagram for L1MuBMMuonSorter:
L1AbstractProcessor

Public Member Functions

 L1MuBMMuonSorter (const L1MuBMTrackFinder &)
 constructor More...
 
int numberOfTracks () const
 return number of found muon candidates after sorter More...
 
void print () const
 print results after sorting More...
 
void reset () override
 reset Muon Sorter More...
 
void run () override
 run Muon Sorter More...
 
const L1MuBMTracktrack (int id) const
 return pointer to a muon candidate More...
 
const std::vector< const L1MuBMTrack * > & tracks () const
 return vector of muon candidates More...
 
 ~L1MuBMMuonSorter () override
 destructor More...
 
- Public Member Functions inherited from L1AbstractProcessor
virtual void run (const edm::EventSetup &c)
 
virtual void run (const edm::EventSetup &c)
 
virtual ~L1AbstractProcessor ()
 destructor More...
 
virtual ~L1AbstractProcessor ()
 destructor More...
 

Private Member Functions

void runCOL (std::vector< L1MuBMTrack * > &) const
 run the Cancel Out Logic of the muon sorter More...
 

Static Private Member Functions

static int neighbour (const L1MuBMSecProcId &spid1, const L1MuBMSecProcId &spid2)
 find out if two Sector Processors are neighbours More...
 

Private Attributes

const L1MuBMTrackFinderm_tf
 
std::vector< const L1MuBMTrack * > m_TrackCands
 

Detailed Description

BM Muon Sorter:

The BM Muon Sorter receives 2 muon candidates from each of the 12 Wedge Sorters and sorts out the 4 best (highest pt, highest quality) muons

N. Neumeister CERN EP

Definition at line 45 of file L1MuBMMuonSorter.h.

Constructor & Destructor Documentation

◆ L1MuBMMuonSorter()

L1MuBMMuonSorter::L1MuBMMuonSorter ( const L1MuBMTrackFinder tf)

constructor

Definition at line 49 of file L1MuBMMuonSorter.cc.

49 : m_tf(tf), m_TrackCands() { m_TrackCands.reserve(4); }

References m_TrackCands.

◆ ~L1MuBMMuonSorter()

L1MuBMMuonSorter::~L1MuBMMuonSorter ( )
override

destructor

Definition at line 55 of file L1MuBMMuonSorter.cc.

55 {}

Member Function Documentation

◆ neighbour()

int L1MuBMMuonSorter::neighbour ( const L1MuBMSecProcId spid1,
const L1MuBMSecProcId spid2 
)
staticprivate

find out if two Sector Processors are neighbours

Definition at line 305 of file L1MuBMMuonSorter.cc.

305  {
306  // definition of valid topologies:
307 
308  // E T A
309  // -----------------
310  // +
311  // --- ---
312  // | | 2 | | 2 |
313  // P | |___| |___|
314  // | --- --- --- ---
315  // H | | 1 | | 1 | | 1 | | 1 |
316  // | |___| |___| |___| |___|
317  // I | --- ---
318  // | | 2 | | 2 |
319  // |___| |___|
320  // -
321  // result: 1 2 3 4 5 6 otherwise : -1
322 
323  int topology = -1;
324 
325  int sector1 = spid1.sector();
326  int wheel1 = spid1.wheel();
327 
328  int sector2 = spid2.sector();
329  int wheel2 = spid2.wheel();
330 
331  int sectordiff = (sector2 - sector1) % 12;
332  if (sectordiff >= 6)
333  sectordiff -= 12;
334  if (sectordiff < -6)
335  sectordiff += 12;
336 
337  if (abs(sectordiff) == 1) {
338  if (wheel1 == wheel2)
339  topology = (sectordiff > 0) ? 1 : 2;
340  if (wheel1 == +1 && wheel2 == -1)
341  topology = (sectordiff > 0) ? 5 : 6;
342  if ((wheel1 == -2 && wheel2 == -3) || (wheel1 == -1 && wheel2 == -2) || (wheel1 == +1 && wheel2 == +2) ||
343  (wheel1 == +2 && wheel2 == +3))
344  topology = (sectordiff > 0) ? 3 : 4;
345  }
346 
347  return topology;
348 }

References funct::abs(), L1MuBMSecProcId::sector(), hgcalTopologyTester_cfi::sector1, hgcalTopologyTester_cfi::sector2, ecaldqm::topology(), and L1MuBMSecProcId::wheel().

Referenced by runCOL().

◆ numberOfTracks()

int L1MuBMMuonSorter::numberOfTracks ( ) const
inline

return number of found muon candidates after sorter

Definition at line 63 of file L1MuBMMuonSorter.h.

63 { return m_TrackCands.size(); }

References m_TrackCands.

Referenced by print().

◆ print()

void L1MuBMMuonSorter::print ( void  ) const

print results after sorting

Definition at line 132 of file L1MuBMMuonSorter.cc.

132  {
133  cout << endl;
134  cout << "Muon candidates found by the barrel MTTF : " << numberOfTracks() << endl;
135  vector<const L1MuBMTrack*>::const_iterator iter = m_TrackCands.begin();
136  while (iter != m_TrackCands.end()) {
137  if (*iter)
138  cout << *(*iter) << endl;
139  iter++;
140  }
141  cout << endl;
142 }

References gather_cfg::cout, m_TrackCands, and numberOfTracks().

◆ reset()

void L1MuBMMuonSorter::reset ( void  )
overridevirtual

reset Muon Sorter

Implements L1AbstractProcessor.

Definition at line 121 of file L1MuBMMuonSorter.cc.

121  {
122  m_TrackCands.clear();
123  vector<const L1MuBMTrack*>::iterator iter;
124  for (iter = m_TrackCands.begin(); iter != m_TrackCands.end(); iter++) {
125  *iter = nullptr;
126  }
127 }

References m_TrackCands.

Referenced by L1MuBMTrackFinder::reset().

◆ run()

void L1MuBMMuonSorter::run ( )
overridevirtual

run Muon Sorter

Reimplemented from L1AbstractProcessor.

Definition at line 64 of file L1MuBMMuonSorter.cc.

64  {
65  // get track candidates from Wedge Sorters
66  vector<L1MuBMTrack*> mycands;
67  mycands.reserve(24);
68 
69  for (int wedge = 0; wedge < 12; wedge++) {
70  vector<const L1MuBMTrack*> wscand = m_tf.ws(wedge)->tracks();
71  vector<const L1MuBMTrack*>::iterator iter = wscand.begin();
72  while (iter != wscand.end()) {
73  if (*iter && !(*iter)->empty())
74  mycands.push_back(const_cast<L1MuBMTrack*>(*iter));
75  iter++;
76  }
77  }
78 
79  // print input data
80  if (L1MuBMTFConfig::Debug(4)) {
81  cout << "BM Muon Sorter input: " << mycands.size() << endl;
82  vector<L1MuBMTrack*>::const_iterator iter;
83  for (iter = mycands.begin(); iter != mycands.end(); iter++) {
84  if (*iter)
85  (*iter)->print();
86  }
87  }
88 
89  // run Cancel Out Logic
90  runCOL(mycands);
91 
92  // remove disabled candidates
93  vector<L1MuBMTrack*>::iterator it = mycands.begin();
94  while (it != mycands.end()) {
95  if (*it && (*it)->empty()) {
96  mycands.erase(it);
97  it = mycands.begin();
98  continue;
99  }
100  it++;
101  }
102 
103  // sort pt and quality
104  stable_sort(mycands.begin(), mycands.end(), L1MuBMTrack::rank);
105 
106  // copy the best 4 candidates
107  int number_of_tracks = 0;
108  vector<L1MuBMTrack*>::const_iterator iter1 = mycands.begin();
109  while (iter1 != mycands.end()) {
110  if (*iter1 && number_of_tracks < 4) {
111  m_TrackCands.push_back(*iter1);
112  number_of_tracks++;
113  }
114  iter1++;
115  }
116 }

References gather_cfg::cout, L1MuBMTFConfig::Debug(), m_tf, m_TrackCands, L1MuBMTrack::rank(), runCOL(), L1MuBMWedgeSorter::tracks(), and L1MuBMTrackFinder::ws().

◆ runCOL()

void L1MuBMMuonSorter::runCOL ( std::vector< L1MuBMTrack * > &  cands) const
private

run the Cancel Out Logic of the muon sorter

Definition at line 147 of file L1MuBMMuonSorter.cc.

147  {
148  // compare candidates which were found in nearby sectors and wheels
149  // if 2 candidates have at least one track segment in common
150  // disable the one with lower quality
151  // compare addresses from stations 2, 3 and 4
152 
153  typedef vector<L1MuBMTrack*>::iterator TI;
154  for (TI iter1 = cands.begin(); iter1 != cands.end(); iter1++) {
155  if (*iter1 == nullptr)
156  continue;
157  if ((*iter1)->empty())
158  continue;
159  L1MuBMSecProcId sp1 = (*iter1)->spid();
160  int qual1 = (*iter1)->quality();
161  for (TI iter2 = cands.begin(); iter2 != cands.end(); iter2++) {
162  if (*iter2 == nullptr)
163  continue;
164  if (*iter1 == *iter2)
165  continue;
166  if ((*iter2)->empty())
167  continue;
168  L1MuBMSecProcId sp2 = (*iter2)->spid();
169  int qual2 = (*iter2)->quality();
170  if (sp1 == sp2)
171  continue;
172  int topology = neighbour(sp1, sp2);
173  if (topology == -1)
174  continue;
175  int countTS = 0;
176  for (int stat = 2; stat <= 4; stat++) {
177  int adr1 = (*iter1)->address(stat);
178  int adr2 = (*iter2)->address(stat);
179  if (adr1 == 15 || adr2 == 15)
180  continue;
181  switch (topology) {
182  case 1: {
183  if (adr1 > 7)
184  continue;
185  if (adr2 > 3 && adr2 < 8)
186  continue;
187  int adr_shift = (adr2 > 7) ? -8 : 4;
188  if (adr1 == adr2 + adr_shift)
189  countTS++;
190  break;
191  }
192  case 2: {
193  if (adr2 > 7)
194  continue;
195  if (adr1 > 3 && adr1 < 8)
196  continue;
197  int adr_shift = (adr2 > 3) ? -4 : 8;
198  if (adr1 == adr2 + adr_shift)
199  countTS++;
200  break;
201  }
202  case 3: {
203  if ((adr1 == 6 && adr2 == 0) || (adr1 == 7 && adr2 == 1) || (adr1 == 2 && adr2 == 8) ||
204  (adr1 == 3 && adr2 == 9))
205  countTS++;
206  break;
207  }
208  case 4: {
209  if ((adr1 == 2 && adr2 == 4) || (adr1 == 3 && adr2 == 5) || (adr1 == 10 && adr2 == 0) ||
210  (adr1 == 11 && adr2 == 1))
211  countTS++;
212  break;
213  }
214  case 5: {
215  if ((adr1 == 0 && adr2 == 8) || (adr1 == 1 && adr2 == 9) || (adr1 == 4 && adr2 == 0) ||
216  (adr1 == 5 && adr2 == 1))
217  countTS++;
218  break;
219  }
220  case 6: {
221  if ((adr1 == 0 && adr2 == 4) || (adr1 == 1 && adr2 == 5) || (adr1 == 8 && adr2 == 0) ||
222  (adr1 == 9 && adr2 == 1))
223  countTS++;
224  break;
225  }
226  default:
227  break;
228  }
229  }
230  if (countTS > 0) {
231  if (qual1 < qual2) {
232  if (L1MuBMTFConfig::Debug(5)) {
233  cout << "Muon Sorter cancel : ";
234  (*iter1)->print();
235  }
236  (*iter1)->disable();
237  break;
238  } else {
239  if (L1MuBMTFConfig::Debug(5)) {
240  cout << "Muon Sorter cancel : ";
241  (*iter2)->print();
242  }
243  (*iter2)->disable();
244  }
245  }
246  }
247  }
248 
249  // if two candidates have exactly the same phi and eta values
250  // remove the one with lower rank
251 
252  for (TI iter1 = cands.begin(); iter1 != cands.end(); iter1++) {
253  if (*iter1 == nullptr)
254  continue;
255  if ((*iter1)->empty())
256  continue;
257  int phi1 = (*iter1)->phi();
258  int pt1 = (*iter1)->pt();
259  int qual1 = (*iter1)->quality();
260  for (TI iter2 = cands.begin(); iter2 != cands.end(); iter2++) {
261  if (*iter2 == nullptr)
262  continue;
263  if (*iter1 == *iter2)
264  continue;
265  if ((*iter2)->empty())
266  continue;
267  int phi2 = (*iter2)->phi();
268  int pt2 = (*iter2)->pt();
269  int qual2 = (*iter2)->quality();
270  int w1 = (*iter1)->getStartTSphi().wheel();
271  int w2 = (*iter2)->getStartTSphi().wheel();
272  int phidiff = (phi2 - phi1) % 144;
273  if (phidiff >= 72)
274  phidiff -= 144;
275  if (phidiff < -72)
276  phidiff += 144;
277  if (abs(phidiff) < 2 && (w1 == w2)) {
278  int rank1 = 10 * pt1 + qual1;
279  int rank2 = 10 * pt2 + qual2;
280  if (L1MuBMTFConfig::Debug(5)) {
281  cout << "========================================" << endl;
282  cout << " special cancellation : " << endl;
283  (*iter1)->print();
284  if (rank1 < rank2)
285  cout << "cancelled" << endl;
286  (*iter2)->print();
287  if (rank1 >= rank2)
288  cout << "cancelled" << endl;
289  cout << "========================================" << endl;
290  }
291  if (rank1 >= rank2)
292  (*iter2)->disable();
293  if (rank1 < rank2) {
294  (*iter1)->disable();
295  break;
296  }
297  }
298  }
299  }
300 }

References funct::abs(), HLT_2018_cff::cands, gather_cfg::cout, L1MuBMTFConfig::Debug(), neighbour(), hitfit::phidiff(), HLT_2018_cff::pt1, HLT_2018_cff::pt2, hgcalPlots::stat, ecaldqm::topology(), and w2.

Referenced by run().

◆ track()

const L1MuBMTrack* L1MuBMMuonSorter::track ( int  id) const
inline

return pointer to a muon candidate

Definition at line 66 of file L1MuBMMuonSorter.h.

66 { return m_TrackCands[id]; }

References triggerObjects_cff::id, and m_TrackCands.

◆ tracks()

const std::vector<const L1MuBMTrack*>& L1MuBMMuonSorter::tracks ( void  ) const
inline

return vector of muon candidates

Definition at line 69 of file L1MuBMMuonSorter.h.

69 { return m_TrackCands; }

References m_TrackCands.

Member Data Documentation

◆ m_tf

const L1MuBMTrackFinder& L1MuBMMuonSorter::m_tf
private

Definition at line 79 of file L1MuBMMuonSorter.h.

Referenced by run().

◆ m_TrackCands

std::vector<const L1MuBMTrack*> L1MuBMMuonSorter::m_TrackCands
private

Definition at line 80 of file L1MuBMMuonSorter.h.

Referenced by L1MuBMMuonSorter(), numberOfTracks(), print(), reset(), run(), track(), and tracks().

w2
common ppss p3p6s2 common epss epspn46 common const1 w2
Definition: inclppp.h:1
HLT_2018_cff.pt2
pt2
Definition: HLT_2018_cff.py:8552
L1MuBMTrackFinder::ws
const L1MuBMWedgeSorter * ws(int id) const
get a pointer to a Wedge Sorter, index [0-11]
Definition: L1MuBMTrackFinder.h:96
L1MuBMSecProcId
Definition: L1MuBMSecProcId.h:40
hgcalTopologyTester_cfi.sector1
sector1
Definition: hgcalTopologyTester_cfi.py:9
L1MuBMMuonSorter::m_tf
const L1MuBMTrackFinder & m_tf
Definition: L1MuBMMuonSorter.h:79
L1MuBMWedgeSorter::tracks
const std::vector< const L1MuBMTrack * > & tracks() const
return vector of muon candidates
Definition: L1MuBMWedgeSorter.h:66
gather_cfg.cout
cout
Definition: gather_cfg.py:144
HLT_2018_cff.pt1
pt1
Definition: HLT_2018_cff.py:8550
L1MuBMMuonSorter::neighbour
static int neighbour(const L1MuBMSecProcId &spid1, const L1MuBMSecProcId &spid2)
find out if two Sector Processors are neighbours
Definition: L1MuBMMuonSorter.cc:305
L1MuBMSecProcId::sector
int sector() const
return sector number
Definition: L1MuBMSecProcId.h:58
L1MuBMSecProcId::wheel
int wheel() const
return wheel number
Definition: L1MuBMSecProcId.h:55
L1MuBMMuonSorter::m_TrackCands
std::vector< const L1MuBMTrack * > m_TrackCands
Definition: L1MuBMMuonSorter.h:80
hgcalPlots.stat
stat
Definition: hgcalPlots.py:1111
ecaldqm::topology
const CaloTopology * topology(nullptr)
L1MuBMTFConfig::Debug
static bool Debug()
Definition: L1MuBMTFConfig.h:54
hitfit::phidiff
double phidiff(double phi)
Normalized difference in azimuthal angles to a range between .
Definition: fourvec.cc:220
L1MuBMTrack::rank
static bool rank(const L1MuBMTrack *first, const L1MuBMTrack *second)
define a rank for muon candidates
Definition: L1MuBMTrack.h:195
hgcalTopologyTester_cfi.sector2
sector2
Definition: hgcalTopologyTester_cfi.py:10
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:31
HLT_2018_cff.cands
cands
Definition: HLT_2018_cff.py:13762
L1MuBMMuonSorter::runCOL
void runCOL(std::vector< L1MuBMTrack * > &) const
run the Cancel Out Logic of the muon sorter
Definition: L1MuBMMuonSorter.cc:147
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
L1MuBMMuonSorter::numberOfTracks
int numberOfTracks() const
return number of found muon candidates after sorter
Definition: L1MuBMMuonSorter.h:63