CMS 3D CMS Logo

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

#include <BestTrackSelection.h>

Public Member Functions

void cancel_multi_bx (const std::deque< EMTFTrackCollection > &extended_best_track_cands, EMTFTrackCollection &best_tracks) const
 
void cancel_one_bx (const std::deque< EMTFTrackCollection > &extended_best_track_cands, EMTFTrackCollection &best_tracks) const
 
void configure (int verbose, int endcap, int sector, int bx, int bxWindow, int maxRoadsPerZone, int maxTracks, bool useSecondEarliest, bool bugSameSectorPt0)
 
void process (const std::deque< EMTFTrackCollection > &extended_best_track_cands, EMTFTrackCollection &best_tracks) const
 

Private Attributes

bool bugSameSectorPt0_
 
int bx_
 
int bxWindow_
 
int endcap_
 
int maxRoadsPerZone_
 
int maxTracks_
 
int sector_
 
bool useSecondEarliest_
 
int verbose_
 

Detailed Description

Definition at line 6 of file BestTrackSelection.h.

Member Function Documentation

void BestTrackSelection::cancel_multi_bx ( const std::deque< EMTFTrackCollection > &  extended_best_track_cands,
EMTFTrackCollection best_tracks 
) const

Definition at line 257 of file BestTrackSelection.cc.

References bx_, bxWindow_, gather_cfg::cout, spr::find(), h, l1t::EMTFTrack::Hits(), mps_fire::i, dqmiolumiharvest::j, mps_check::killed, maxRoadsPerZone_, maxTracks_, dqmiodumpmetadata::n, emtf::NUM_ZONES, EcalTangentSkim_cfg::o, l1t::EMTFTrack::Rank(), l1t::EMTFTrack::Second_BX(), HLT_2018_cff::track, PDWG_EXOHSCP_cff::tracks, verbose_, and z.

Referenced by process().

258  {
259  const int max_h = bxWindow_; // = 3 bx history
260  const int max_z = emtf::NUM_ZONES; // = 4 zones
261  const int max_n = maxRoadsPerZone_; // = 3 candidates per zone
262  const int max_zn = max_z * max_n; // = 12 total candidates
263  const int max_hzn = max_h * max_zn; // = 36 total candidates
264  if (not(maxTracks_ <= max_hzn)) {
265  edm::LogError("L1T") << "maxTracks_ = " << maxTracks_ << ", max_hzn = " << max_hzn;
266  return;
267  }
268 
269  const int delayBX = bxWindow_ - 1;
270  const int num_h = extended_best_track_cands.size() / max_z; // num of bx history so far
271 
272  // Emulate the arrays used in firmware
273  typedef std::array<int, 3> segment_ref_t;
274  std::vector<std::vector<segment_ref_t> > segments(max_hzn,
275  std::vector<segment_ref_t>()); // 2D array [hzn][num segments]
276 
277  std::vector<std::vector<bool> > larger(max_hzn, std::vector<bool>(max_hzn, false)); // 2D array [hzn][hzn]
278  std::vector<std::vector<bool> > winner(max_hzn, std::vector<bool>(max_hzn, false));
279 
280  std::vector<bool> exists(max_hzn, false); // 1D array [hzn]
281  std::vector<bool> killed(max_hzn, false);
282  std::vector<int> rank(max_hzn, 0);
283  std::vector<int> good_bx(max_hzn, 0);
284 
285  // Initialize arrays: rank, good_bx, segments
286  for (int h = 0; h < num_h; ++h) {
287  // extended_best_track_cands[0..3] has 4 zones for road/pattern BX-0 (i.e. current) with possible tracks from [BX-2, BX-1, BX-0]
288  // extended_best_track_cands[4..7] has 4 zones for road/pattern BX-1 with possible tracks from [BX-3, BX-2, BX-1]
289  // extended_best_track_cands[8..11] has 4 zones for road/pattern BX-2 with possible tracks from [BX-4, BX-3, BX-2]
290 
291  for (int z = 0; z < max_z; ++z) {
292  const EMTFTrackCollection& tracks = extended_best_track_cands.at(h * max_z + z);
293  const int ntracks = tracks.size();
294  if (not(ntracks <= max_n)) {
295  edm::LogError("L1T") << "ntracks = " << ntracks << ", max_n = " << max_n;
296  return;
297  }
298 
299  for (int n = 0; n < ntracks; ++n) {
300  const int hzn = (h * max_z * max_n) + (n * max_z) + z; // for (i = 0; i < 12; i = i+1) rank[i%4][i/4]
301  const EMTFTrack& track = tracks.at(n);
302  int cand_bx = track.Second_BX();
303  cand_bx -= (bx_ - delayBX); // convert track.second_bx=[BX-2, BX-1, BX-0] --> cand_bx=[0,1,2]
304 
305  rank.at(hzn) = track.Rank();
306  if (cand_bx == 0)
307  good_bx.at(hzn) = 1; // kill this rank if it's not the right BX
308 
309  for (const auto& conv_hit : track.Hits()) {
310  if (not(conv_hit.Valid())) {
311  edm::LogError("L1T") << "conv_hit.Valid() = " << conv_hit.Valid();
312  return;
313  }
314 
315  // Notes from Alex (2017-03-16):
316  //
317  // What happens currently is that RPC hits are inserted instead of
318  // CSC hits, if CSC hits are missing. So the track address will point
319  // at a CSC chamber, but the actual hit may have come from
320  // corresponding RPC located behind it. If the same substitution
321  // happened in the neighboring sector, then the cancellation in uGMT
322  // will work correctly. If the substitution happened in only one
323  // sector, then RPC hit may "trump" a CSC hit, or vice versa.
324 
325  // A segment identifier (chamber, strip, bx)
326  const segment_ref_t segment = {{conv_hit.PC_station() * 9 + conv_hit.PC_chamber(),
327  (conv_hit.PC_segment() % 2),
328  conv_hit.BX()}}; // FW doesn't check whether a segment is CSC or RPC
329  //int chamber_index = int(conv_hit.Subsystem() == TriggerPrimitive::kRPC)*9*5;
330  //chamber_index += conv_hit.PC_station()*9;
331  //chamber_index += conv_hit.PC_chamber();
332  //const segment_ref_t segment = {{chamber_index, conv_hit.Strip(), conv_hit.BX()}};
333  segments.at(hzn).push_back(segment);
334  }
335  } // end loop over n
336  } // end loop over z
337  } // end loop over h
338 
339  // Simultaneously compare each rank with each other
340  int i = 0, j = 0, ri = 0, rj = 0, sum = 0;
341 
342  for (i = 0; i < max_hzn; ++i) {
343  //for (j = 0; j < max_hzn; ++j) {
344  // larger[i][j] = 0;
345  //}
346  larger[i][i] = true; // result of comparison with itself
347  //ri = rank[i%4][i/4]; // first index loops zone, second loops candidate. Zone loops faster, so we give equal priority to zones
348  ri = rank[i];
349 
350  for (j = i + 1; j < max_hzn; ++j) {
351  // i&j bits show which rank is larger
352  //rj = rank[j%4][j/4];
353  rj = rank[j];
354  if (ri >= rj)
355  larger[i][j] = true;
356  else
357  larger[j][i] = true;
358  }
359  // "larger" array shows the result of comparison for each rank
360 
361  // track exists if quality != 0
362  exists[i] = (ri != 0);
363  }
364 
365  // ghost cancellation, over 3 BXs
366  for (i = 0; i < max_hzn - 1; ++i) { // candidate loop
367  for (j = i + 1; j < max_hzn; ++j) { // comparison candidate loop
368  int shared_segs = 0;
369 
370  // count shared segments
371  for (const auto& isegment : segments.at(i)) { // loop over all pairs of hits
372  for (const auto& jsegment : segments.at(j)) {
373  if (isegment == jsegment) { // same chamber and same segment
374  shared_segs += 1;
375  }
376  }
377  }
378 
379  if (shared_segs > 0) { // a single shared segment means it's ghost
380  // kill candidate that has lower rank
381  if (larger[i][j])
382  killed[j] = true;
383  else
384  killed[i] = true;
385  }
386  }
387  }
388 
389  // remove ghosts according to kill mask
390  //exists = exists & (~kill1);
391  for (i = 0; i < max_hzn; ++i) {
392  exists[i] = exists[i] & (!killed[i]);
393  }
394 
395  // remove tracks that are not at correct BX number
396  //exists = exists & good_bx;
397  for (i = 0; i < max_hzn; ++i) {
398  exists[i] = exists[i] & good_bx[i];
399  }
400 
401  bool anything_exists = (std::find(exists.begin(), exists.end(), 1) != exists.end());
402  if (!anything_exists)
403  return;
404 
405  // update "larger" array
406  for (i = 0; i < max_hzn; ++i) {
407  for (j = 0; j < max_hzn; ++j) {
408  //if (exists[i]) larger[i] = larger[i] | (~exists); // if this track exists make it larger than all non-existing tracks
409  //else larger[i] = 0; // else make it smaller than anything
410  if (exists[i])
411  larger[i][j] = larger[i][j] | (!exists[j]);
412  else
413  larger[i][j] = false;
414  }
415  }
416 
417  if (verbose_ > 0) { // debug
418  std::cout << "exists: ";
419  for (i = max_hzn - 1; i >= 0; --i) {
420  std::cout << exists[i];
421  if ((i % max_zn) == 0 && i != 0)
422  std::cout << "_";
423  }
424  std::cout << std::endl;
425  std::cout << "killed: ";
426  for (i = max_hzn - 1; i >= 0; --i) {
427  std::cout << killed[i];
428  if ((i % max_zn) == 0 && i != 0)
429  std::cout << "_";
430  }
431  std::cout << std::endl;
432  for (j = 0; j < max_hzn; ++j) {
433  std::cout << "larger: ";
434  for (i = max_hzn - 1; i >= 0; --i) {
435  std::cout << larger[j][i];
436  if ((i % max_zn) == 0 && i != 0)
437  std::cout << "_";
438  }
439  std::cout << std::endl;
440  }
441  }
442 
443  // count zeros in the comparison results. The best track will have none, the next will have one, the third will have two
444  for (i = 0; i < max_hzn; ++i) {
445  sum = 0;
446  for (j = 0; j < max_hzn; ++j) {
447  if (larger[i][j] == 0)
448  sum += 1;
449  }
450 
451  if (sum < maxTracks_) {
452  winner[sum][i] = true; // assign positional winner codes
453  }
454 
455  if (sum < maxTracks_ && bugSameSectorPt0_ && sum > 0) {
456  // just keep the best track and kill the rest of them
457  winner[sum][i] = false;
458  }
459  }
460 
461  // Output best tracks according to winner signals
462  best_tracks.clear();
463 
464  for (int o = 0; o < maxTracks_; ++o) { // output candidate loop
465  int h = 0, n = 0, z = 0;
466  for (i = 0; i < max_hzn; ++i) { // winner bit loop
467  if (winner[o][i]) {
468  h = (i / max_z / max_n);
469  n = (i / max_z) % max_n;
470  z = i % max_z;
471 
472  const EMTFTrackCollection& tracks = extended_best_track_cands.at(h * max_z + z);
473  const EMTFTrack& track = tracks.at(n);
474  best_tracks.push_back(track);
475 
476  // Update winner, BX
477  best_tracks.back().set_track_num(best_tracks.size() - 1);
478  best_tracks.back().set_winner(o);
479  best_tracks.back().set_bx(best_tracks.back().Second_BX());
480  }
481  }
482  }
483 }
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
l1t::EMTFTrackCollection EMTFTrackCollection
Definition: Common.h:29
int killed
Definition: mps_check.py:40
int NUM_ZONES
Definition: Common.h:67
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
void set_track_num(int bits)
Definition: EMTFTrack.h:146
int Second_BX() const
Definition: EMTFTrack.h:161
EMTFHitCollection Hits() const
Definition: EMTFTrack.h:107
int Rank() const
Definition: EMTFTrack.h:156
void BestTrackSelection::cancel_one_bx ( const std::deque< EMTFTrackCollection > &  extended_best_track_cands,
EMTFTrackCollection best_tracks 
) const

Definition at line 64 of file BestTrackSelection.cc.

References gather_cfg::cout, Vispa.Plugins.EdmBrowser.EdmDataAccessor::eq(), spr::find(), l1t::EMTFTrack::Hits(), mps_fire::i, dqmiolumiharvest::j, mps_check::killed, maxRoadsPerZone_, maxTracks_, dqmiodumpmetadata::n, emtf::NUM_ZONES, EcalTangentSkim_cfg::o, l1t::EMTFTrack::Rank(), HLT_2018_cff::track, PDWG_EXOHSCP_cff::tracks, verbose_, and z.

Referenced by process().

65  {
66  const int max_z = emtf::NUM_ZONES; // = 4 zones
67  const int max_n = maxRoadsPerZone_; // = 3 candidates per zone
68  const int max_zn = max_z * max_n; // = 12 total candidates
69  if (not(maxTracks_ <= max_zn)) {
70  edm::LogError("L1T") << "maxTracks_ = " << maxTracks_ << ", max_zn = " << max_zn;
71  return;
72  }
73 
74  // Emulate the arrays used in firmware
75  typedef std::array<int, 3> segment_ref_t;
76  std::vector<std::vector<segment_ref_t> > segments(max_zn,
77  std::vector<segment_ref_t>()); // 2D array [zn][num segments]
78 
79  std::vector<std::vector<bool> > larger(max_zn, std::vector<bool>(max_zn, false)); // 2D array [zn][zn]
80  std::vector<std::vector<bool> > winner(max_zn, std::vector<bool>(max_zn, false));
81 
82  std::vector<bool> exists(max_zn, false); // 1D array [zn]
83  std::vector<bool> killed(max_zn, false);
84  std::vector<int> rank(max_zn, 0);
85  //std::vector<int> good_bx(max_zn, 0);
86 
87  // Initialize arrays: rank, segments
88  for (int z = 0; z < max_z; ++z) {
89  const EMTFTrackCollection& tracks = extended_best_track_cands.at(z);
90  const int ntracks = tracks.size();
91  if (not(ntracks <= max_n)) {
92  edm::LogError("L1T") << "ntracks = " << ntracks << ", max_n = " << max_n;
93  return;
94  }
95 
96  for (int n = 0; n < ntracks; ++n) {
97  const int zn = (n * max_z) + z; // for (i = 0; i < 12; i = i+1) rank[i%4][i/4]
98  const EMTFTrack& track = tracks.at(n);
99 
100  rank.at(zn) = track.Rank();
101 
102  for (const auto& conv_hit : track.Hits()) {
103  if (not(conv_hit.Valid())) {
104  edm::LogError("L1T") << "conv_hit.Valid() = " << conv_hit.Valid();
105  return;
106  }
107 
108  // A segment identifier (chamber, strip, bx)
109  const segment_ref_t segment = {{conv_hit.PC_station() * 9 + conv_hit.PC_chamber(),
110  (conv_hit.PC_segment() % 2),
111  0}}; // FW doesn't check whether a segment is CSC or RPC
112  //int chamber_index = int(conv_hit.Subsystem() == TriggerPrimitive::kRPC)*9*5;
113  //chamber_index += conv_hit.PC_station()*9;
114  //chamber_index += conv_hit.PC_chamber();
115  //const segment_ref_t segment = {{chamber_index, conv_hit.Strip(), 0}};
116  segments.at(zn).push_back(segment);
117  }
118  } // end loop over n
119  } // end loop over z
120 
121  // Simultaneously compare each rank with each other
122  int i = 0, j = 0, ri = 0, rj = 0, gt = 0, eq = 0, sum = 0;
123 
124  for (i = 0; i < max_zn; ++i) {
125  for (j = 0; j < max_zn; ++j) {
126  larger[i][j] = false;
127  }
128  larger[i][i] = true; // result of comparison with itself
129  //ri = rank[i%4][i/4]; // first index loops zone, second loops candidate. Zone loops faster, so we give equal priority to zones
130  ri = rank[i];
131 
132  for (j = 0; j < max_zn; ++j) {
133  // i&j bits show which rank is larger
134  // the comparison scheme below avoids problems
135  // when there are two or more tracks with the same rank
136  //rj = rank[j%4][j/4];
137  rj = rank[j];
138  gt = ri > rj;
139  eq = ri == rj;
140  if ((i < j && (gt || eq)) || (i > j && gt))
141  larger[i][j] = true;
142  }
143  // "larger" array shows the result of comparison for each rank
144 
145  // track exists if quality != 0
146  exists[i] = (ri != 0);
147  }
148 
149  // ghost cancellation, only in the current BX so far
150  for (i = 0; i < max_zn - 1; ++i) { // candidate loop
151  for (j = i + 1; j < max_zn; ++j) { // comparison candidate loop
152  int shared_segs = 0;
153 
154  // count shared segments
155  for (const auto& isegment : segments.at(i)) { // loop over all pairs of hits
156  for (const auto& jsegment : segments.at(j)) {
157  if (isegment == jsegment) { // same chamber and same segment
158  shared_segs += 1;
159  }
160  }
161  }
162 
163  if (shared_segs > 0) { // a single shared segment means it's ghost
164  // kill candidate that has lower rank
165  if (larger[i][j])
166  killed[j] = true;
167  else
168  killed[i] = true;
169  }
170  }
171  }
172 
173  // remove ghosts according to kill mask
174  //exists = exists & (~kill1);
175  for (i = 0; i < max_zn; ++i) {
176  exists[i] = exists[i] & (!killed[i]);
177  }
178 
179  bool anything_exists = (std::find(exists.begin(), exists.end(), 1) != exists.end());
180  if (!anything_exists)
181  return;
182 
183  // update "larger" array
184  for (i = 0; i < max_zn; ++i) {
185  for (j = 0; j < max_zn; ++j) {
186  //if (exists[i]) larger[i] = larger[i] | (~exists); // if this track exists make it larger than all non-existing tracks
187  //else larger[i] = 0; // else make it smaller than anything
188  if (exists[i])
189  larger[i][j] = larger[i][j] | (!exists[j]);
190  else
191  larger[i][j] = false;
192  }
193  }
194 
195  if (verbose_ > 0) { // debug
196  std::cout << "exists: ";
197  for (i = max_zn - 1; i >= 0; --i) {
198  std::cout << exists[i];
199  }
200  std::cout << std::endl;
201  std::cout << "killed: ";
202  for (i = max_zn - 1; i >= 0; --i) {
203  std::cout << killed[i];
204  }
205  std::cout << std::endl;
206  for (j = 0; j < max_zn; ++j) {
207  std::cout << "larger: ";
208  for (i = max_zn - 1; i >= 0; --i) {
209  std::cout << larger[j][i];
210  }
211  std::cout << std::endl;
212  }
213  }
214 
215  // count zeros in the comparison results. The best track will have none, the next will have one, the third will have two
216  // skip the bits corresponding to the comparison of the track with itself
217  for (i = 0; i < max_zn; ++i) {
218  sum = 0;
219  for (j = 0; j < max_zn; ++j) {
220  if (larger[i][j] == 0)
221  sum += 1;
222  }
223 
224  if (sum < maxTracks_) {
225  winner[sum][i] = true; // assign positional winner codes
226  }
227 
228  if (sum < maxTracks_ && bugSameSectorPt0_ && sum > 0) {
229  // just keep the best track and kill the rest of them
230  winner[sum][i] = false;
231  }
232  }
233 
234  // Output best tracks according to winner signals
235  best_tracks.clear();
236 
237  for (int o = 0; o < maxTracks_; ++o) { // output candidate loop
238  int z = 0, n = 0;
239  for (i = 0; i < max_zn; ++i) { // winner bit loop
240  if (winner[o][i]) {
241  n = i / max_z;
242  z = i % max_z;
243 
244  const EMTFTrackCollection& tracks = extended_best_track_cands.at(z);
245  const EMTFTrack& track = tracks.at(n);
246  best_tracks.push_back(track);
247 
248  // Update winner, BX
249  best_tracks.back().set_track_num(best_tracks.size() - 1);
250  best_tracks.back().set_winner(o);
251  best_tracks.back().set_bx(best_tracks.back().First_BX());
252  }
253  }
254  }
255 }
l1t::EMTFTrackCollection EMTFTrackCollection
Definition: Common.h:29
int killed
Definition: mps_check.py:40
int NUM_ZONES
Definition: Common.h:67
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
void set_track_num(int bits)
Definition: EMTFTrack.h:146
EMTFHitCollection Hits() const
Definition: EMTFTrack.h:107
int Rank() const
Definition: EMTFTrack.h:156
void BestTrackSelection::configure ( int  verbose,
int  endcap,
int  sector,
int  bx,
int  bxWindow,
int  maxRoadsPerZone,
int  maxTracks,
bool  useSecondEarliest,
bool  bugSameSectorPt0 
)

Definition at line 5 of file BestTrackSelection.cc.

References bugSameSectorPt0_, l1GtPatternGenerator_cfi::bx, bx_, bxWindow_, makeMuonMisalignmentScenario::endcap, endcap_, maxRoadsPerZone_, HLT_2018_cff::maxTracks, maxTracks_, sector_, useSecondEarliest_, verbose, and verbose_.

Referenced by SectorProcessor::process_single_bx().

void BestTrackSelection::process ( const std::deque< EMTFTrackCollection > &  extended_best_track_cands,
EMTFTrackCollection best_tracks 
) const

Definition at line 26 of file BestTrackSelection.cc.

References cancel_multi_bx(), cancel_one_bx(), HLT_2018_cff::cands, gather_cfg::cout, mps_fire::i, emtf::NUM_STATIONS, to_hex(), HLT_2018_cff::track, useSecondEarliest_, and verbose_.

Referenced by SectorProcessor::process_single_bx().

27  {
28  int num_cands = 0;
29  for (const auto& cands : extended_best_track_cands) {
30  for (const auto& cand : cands) {
31  if (cand.Rank() > 0) {
32  num_cands += 1;
33  }
34  }
35  }
36  bool early_exit = (num_cands == 0);
37 
38  if (early_exit)
39  return;
40 
41  if (!useSecondEarliest_) {
42  cancel_one_bx(extended_best_track_cands, best_tracks);
43  } else {
44  cancel_multi_bx(extended_best_track_cands, best_tracks);
45  }
46 
47  if (verbose_ > 0) { // debug
48  for (const auto& track : best_tracks) {
49  std::cout << "track: " << track.Winner() << " rank: " << to_hex(track.Rank())
50  << " ph_deltas: " << array_as_string(track.PtLUT().delta_ph)
51  << " th_deltas: " << array_as_string(track.PtLUT().delta_th) << " phi: " << track.Phi_fp()
52  << " theta: " << track.Theta_fp() << " cpat: " << array_as_string(track.PtLUT().cpattern)
53  << " bx: " << track.BX() << std::endl;
54  for (int i = 0; i < emtf::NUM_STATIONS + 1; ++i) { // stations 0-4
55  if (track.PtLUT().bt_vi[i] != 0)
56  std::cout << ".. track segments: st: " << i << " v: " << track.PtLUT().bt_vi[i]
57  << " h: " << track.PtLUT().bt_hi[i] << " c: " << track.PtLUT().bt_ci[i]
58  << " s: " << track.PtLUT().bt_si[i] << std::endl;
59  }
60  }
61  }
62 }
static char to_hex(unsigned int i)
Definition: types.cc:27
void cancel_multi_bx(const std::deque< EMTFTrackCollection > &extended_best_track_cands, EMTFTrackCollection &best_tracks) const
int NUM_STATIONS
Definition: Common.h:71
void cancel_one_bx(const std::deque< EMTFTrackCollection > &extended_best_track_cands, EMTFTrackCollection &best_tracks) const

Member Data Documentation

bool BestTrackSelection::bugSameSectorPt0_
private

Definition at line 33 of file BestTrackSelection.h.

Referenced by configure().

int BestTrackSelection::bx_
private

Definition at line 28 of file BestTrackSelection.h.

Referenced by cancel_multi_bx(), and configure().

int BestTrackSelection::bxWindow_
private

Definition at line 30 of file BestTrackSelection.h.

Referenced by cancel_multi_bx(), and configure().

int BestTrackSelection::endcap_
private

Definition at line 28 of file BestTrackSelection.h.

Referenced by configure().

int BestTrackSelection::maxRoadsPerZone_
private

Definition at line 31 of file BestTrackSelection.h.

Referenced by cancel_multi_bx(), cancel_one_bx(), and configure().

int BestTrackSelection::maxTracks_
private

Definition at line 31 of file BestTrackSelection.h.

Referenced by cancel_multi_bx(), cancel_one_bx(), and configure().

int BestTrackSelection::sector_
private

Definition at line 28 of file BestTrackSelection.h.

Referenced by configure().

bool BestTrackSelection::useSecondEarliest_
private

Definition at line 32 of file BestTrackSelection.h.

Referenced by configure(), and process().

int BestTrackSelection::verbose_
private

Definition at line 28 of file BestTrackSelection.h.

Referenced by cancel_multi_bx(), cancel_one_bx(), configure(), and process().