12 bool useSecondEarliest,
13 bool bugSameSectorPt0) {
29 for (
const auto&
cands : extended_best_track_cands) {
31 if (
cand.Rank() > 0) {
36 bool early_exit = (num_cands == 0);
48 for (
const auto&
track : best_tracks) {
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;
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;
68 const int max_zn = max_z * max_n;
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>());
79 std::vector<std::vector<bool> > larger(max_zn, std::vector<bool>(max_zn,
false));
80 std::vector<std::vector<bool> > winner(max_zn, std::vector<bool>(max_zn,
false));
82 std::vector<bool> exists(max_zn,
false);
83 std::vector<bool>
killed(max_zn,
false);
84 std::vector<int> rank(max_zn, 0);
88 for (
int z = 0;
z < max_z; ++
z) {
90 const int ntracks = tracks.size();
91 if (not(ntracks <= max_n)) {
92 edm::LogError(
"L1T") <<
"ntracks = " << ntracks <<
", max_n = " << max_n;
96 for (
int n = 0;
n < ntracks; ++
n) {
97 const int zn = (
n * max_z) +
z;
100 rank.at(zn) = track.
Rank();
102 for (
const auto& conv_hit : track.
Hits()) {
103 if (not(conv_hit.Valid())) {
104 edm::LogError(
"L1T") <<
"conv_hit.Valid() = " << conv_hit.Valid();
109 const segment_ref_t segment = {{conv_hit.PC_station() * 9 + conv_hit.PC_chamber(),
110 (conv_hit.PC_segment() % 2),
116 segments.at(zn).push_back(segment);
122 int i = 0,
j = 0, ri = 0, rj = 0, gt = 0,
eq = 0, sum = 0;
124 for (i = 0; i < max_zn; ++
i) {
125 for (
j = 0;
j < max_zn; ++
j) {
126 larger[
i][
j] =
false;
132 for (
j = 0;
j < max_zn; ++
j) {
140 if ((i <
j && (gt ||
eq)) || (i >
j && gt))
146 exists[
i] = (ri != 0);
150 for (i = 0; i < max_zn - 1; ++
i) {
151 for (
j = i + 1;
j < max_zn; ++
j) {
155 for (
const auto& isegment : segments.at(i)) {
156 for (
const auto& jsegment : segments.at(
j)) {
157 if (isegment == jsegment) {
163 if (shared_segs > 0) {
175 for (i = 0; i < max_zn; ++
i) {
176 exists[
i] = exists[
i] & (!killed[
i]);
179 bool anything_exists = (
std::find(exists.begin(), exists.end(), 1) != exists.end());
180 if (!anything_exists)
184 for (i = 0; i < max_zn; ++
i) {
185 for (
j = 0;
j < max_zn; ++
j) {
189 larger[
i][
j] = larger[
i][
j] | (!exists[
j]);
191 larger[
i][
j] =
false;
197 for (i = max_zn - 1; i >= 0; --
i) {
202 for (i = max_zn - 1; i >= 0; --
i) {
206 for (
j = 0;
j < max_zn; ++
j) {
208 for (i = max_zn - 1; i >= 0; --
i) {
217 for (i = 0; i < max_zn; ++
i) {
219 for (
j = 0;
j < max_zn; ++
j) {
220 if (larger[i][
j] == 0)
225 winner[sum][
i] =
true;
228 if (sum < maxTracks_ && bugSameSectorPt0_ && sum > 0) {
230 winner[sum][
i] =
false;
239 for (i = 0; i < max_zn; ++
i) {
246 best_tracks.push_back(track);
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());
262 const int max_zn = max_z * max_n;
263 const int max_hzn = max_h * max_zn;
270 const int num_h = extended_best_track_cands.size() / max_z;
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>());
277 std::vector<std::vector<bool> > larger(max_hzn, std::vector<bool>(max_hzn,
false));
278 std::vector<std::vector<bool> > winner(max_hzn, std::vector<bool>(max_hzn,
false));
280 std::vector<bool> exists(max_hzn,
false);
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);
286 for (
int h = 0;
h < num_h; ++
h) {
291 for (
int z = 0;
z < 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;
299 for (
int n = 0;
n < ntracks; ++
n) {
300 const int hzn = (
h * max_z * max_n) + (
n * max_z) +
z;
303 cand_bx -= (
bx_ - delayBX);
305 rank.at(hzn) = track.
Rank();
309 for (
const auto& conv_hit : track.
Hits()) {
310 if (not(conv_hit.Valid())) {
311 edm::LogError(
"L1T") <<
"conv_hit.Valid() = " << conv_hit.Valid();
326 const segment_ref_t segment = {{conv_hit.PC_station() * 9 + conv_hit.PC_chamber(),
327 (conv_hit.PC_segment() % 2),
333 segments.at(hzn).push_back(segment);
340 int i = 0,
j = 0, ri = 0, rj = 0, sum = 0;
342 for (i = 0; i < max_hzn; ++
i) {
350 for (
j = i + 1;
j < max_hzn; ++
j) {
362 exists[
i] = (ri != 0);
366 for (i = 0; i < max_hzn - 1; ++
i) {
367 for (
j = i + 1;
j < max_hzn; ++
j) {
371 for (
const auto& isegment : segments.at(i)) {
372 for (
const auto& jsegment : segments.at(
j)) {
373 if (isegment == jsegment) {
379 if (shared_segs > 0) {
391 for (i = 0; i < max_hzn; ++
i) {
392 exists[
i] = exists[
i] & (!killed[
i]);
397 for (i = 0; i < max_hzn; ++
i) {
398 exists[
i] = exists[
i] & good_bx[
i];
401 bool anything_exists = (
std::find(exists.begin(), exists.end(), 1) != exists.end());
402 if (!anything_exists)
406 for (i = 0; i < max_hzn; ++
i) {
407 for (
j = 0;
j < max_hzn; ++
j) {
411 larger[
i][
j] = larger[
i][
j] | (!exists[
j]);
413 larger[
i][
j] =
false;
419 for (i = max_hzn - 1; i >= 0; --
i) {
421 if ((i % max_zn) == 0 && i != 0)
426 for (i = max_hzn - 1; i >= 0; --
i) {
428 if ((i % max_zn) == 0 && i != 0)
432 for (
j = 0;
j < max_hzn; ++
j) {
434 for (i = max_hzn - 1; i >= 0; --
i) {
436 if ((i % max_zn) == 0 && i != 0)
444 for (i = 0; i < max_hzn; ++
i) {
446 for (
j = 0;
j < max_hzn; ++
j) {
447 if (larger[i][
j] == 0)
452 winner[sum][
i] =
true;
455 if (sum < maxTracks_ && bugSameSectorPt0_ && sum > 0) {
457 winner[sum][
i] =
false;
465 int h = 0,
n = 0,
z = 0;
466 for (i = 0; i < max_hzn; ++
i) {
468 h = (i / max_z / max_n);
469 n = (i / max_z) % max_n;
474 best_tracks.push_back(track);
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());
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
static char to_hex(unsigned int i)
l1t::EMTFTrackCollection EMTFTrackCollection
void process(const std::deque< EMTFTrackCollection > &extended_best_track_cands, EMTFTrackCollection &best_tracks) const
void cancel_multi_bx(const std::deque< EMTFTrackCollection > &extended_best_track_cands, EMTFTrackCollection &best_tracks) const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void configure(int verbose, int endcap, int sector, int bx, int bxWindow, int maxRoadsPerZone, int maxTracks, bool useSecondEarliest, bool bugSameSectorPt0)
EMTFHitCollection Hits() const
void cancel_one_bx(const std::deque< EMTFTrackCollection > &extended_best_track_cands, EMTFTrackCollection &best_tracks) const