8 const int invalid_ph_diff = 0x1ff;
34 auto update_fs_history = [](
int fs_segment,
int this_bx,
int hit_bx) {
36 int fs_history = this_bx - hit_bx;
37 fs_segment |= ((fs_history & 0x3) << 4);
42 auto update_bt_history = [](
int bt_segment,
int this_bx,
int hit_bx) {
44 int bt_history = this_bx - hit_bx;
45 bt_segment |= ((bt_history & 0x3) << 5);
51 for (
const auto& roads : zone_roads)
52 num_roads += roads.size();
53 bool early_exit = (num_roads == 0);
59 for (
const auto& roads : zone_roads) {
60 for (
const auto& road : roads) {
61 std::cout <<
"pattern on match input: z: " << road.Zone() - 1 <<
" r: " << road.Winner()
62 <<
" ph_num: " << road.Key_zhit() <<
" ph_q: " <<
to_hex(road.Quality_code())
63 <<
" ly: " << to_binary(road.Layer_code(), 3) <<
" str: " << to_binary(road.Straightness(), 3)
70 std::array<EMTFHitCollection, emtf::NUM_ZONES * emtf::NUM_STATIONS> zs_conv_hits;
72 bool use_fs_zone_code =
true;
74 std::deque<EMTFHitCollection>::const_iterator ext_conv_hits_it = extended_conv_hits.begin();
75 std::deque<EMTFHitCollection>::const_iterator ext_conv_hits_end = extended_conv_hits.end();
77 for (; ext_conv_hits_it != ext_conv_hits_end; ++ext_conv_hits_it) {
78 EMTFHitCollection::const_iterator conv_hits_it = ext_conv_hits_it->begin();
79 EMTFHitCollection::const_iterator conv_hits_end = ext_conv_hits_it->end();
81 for (; conv_hits_it != conv_hits_end; ++conv_hits_it) {
82 int istation = conv_hits_it->Station() - 1;
83 int zone_code = conv_hits_it->Zone_code();
85 zone_code = conv_hits_it->FS_zone_code();
89 if (!zone_roads.at(izone).empty()) {
90 if (zone_code & (1 << izone)) {
92 zs_conv_hits.at(zs).push_back(*conv_hits_it);
96 EMTFHit& conv_hit = zs_conv_hits.at(zs).back();
98 int new_fs_segment = update_fs_history(old_fs_segment,
bx_, conv_hit.
BX());
102 int new_bt_segment = update_bt_history(old_bt_segment,
bx_, conv_hit.
BX());
115 for (
const auto& conv_hit : zs_conv_hits.at(zs)) {
116 std::cout <<
"z: " << izone <<
" st: " << istation + 1 <<
" cscid: " << conv_hit.CSC_ID()
117 <<
" ph_zone_phi: " << conv_hit.Zone_hit() <<
" ph_low_prec: " << (conv_hit.Zone_hit() << 5)
118 <<
" ph_high_prec: " << conv_hit.Phi_fp()
119 <<
" ph_high_low_diff: " << (conv_hit.Phi_fp() - (conv_hit.Zone_hit() << 5)) << std::endl;
138 izone + 1, istation + 1, zone_roads.at(izone), zs_conv_hits.at(zs), zs_phi_differences.at(zs));
140 if (not(zone_roads.at(izone).size() == zs_phi_differences.at(zs).size())) {
141 edm::LogError(
"L1T") <<
"zone_roads.at(izone).size() = " << zone_roads.at(izone).size()
142 <<
", zs_phi_differences.at(zs).size() = " << zs_phi_differences.at(zs).size();
150 const auto& roads = zone_roads.at(izone);
151 for (
unsigned iroad = 0; iroad < roads.size(); ++iroad) {
152 const auto& road = roads.at(iroad);
155 int ph_diff = zs_phi_differences.at(zs).at(iroad).first;
156 std::cout <<
"find seg: z: " << road.Zone() - 1 <<
" r: " << road.Winner() <<
" st: " << istation
157 <<
" ph_diff: " << ph_diff << std::endl;
167 for (
unsigned iroad = 0; iroad < roads.size(); ++iroad) {
168 const EMTFRoad& road = roads.at(iroad);
189 int ph_diff = zs_phi_differences.at(zs).at(iroad).first;
190 hit_ptr_t conv_hit_ptr = zs_phi_differences.at(zs).at(iroad).second;
192 if (ph_diff != invalid_ph_diff) {
200 if (not(!track.
Hits().empty())) {
207 zone_tracks.at(izone).push_back(track);
213 for (
const auto&
tracks : zone_tracks) {
215 for (
const auto&
hit :
track.Hits()) {
216 std::cout <<
"match seg: z: " <<
track.Zone() - 1 <<
" pat: " <<
track.Winner() <<
" st: " <<
hit.Station()
217 <<
" vi: " << to_binary(0b1, 2) <<
" hi: " << ((
hit.FS_segment() >> 4) & 0x3)
218 <<
" ci: " << ((
hit.FS_segment() >> 1) & 0x7) <<
" si: " << (
hit.FS_segment() & 0x1)
219 <<
" ph: " <<
hit.Phi_fp() <<
" th: " <<
hit.Theta_fp() << std::endl;
230 std::vector<hit_sort_pair_t>& phi_differences)
const {
233 int max_ph_diff = (station == 1) ? 15 : 7;
242 }
else if (station == 2) {
256 auto abs_diff = [](
int a,
int b) {
return std::abs(a -
b); };
261 bool operator()(
const value_type& lhs,
const value_type& rhs)
const {
return lhs.first <= rhs.first; }
267 int operator()(
const value_type& a,
const value_type&
b,
const value_type&
c)
const {
269 r |=
bool(a.first <= b.first);
271 r |=
bool(b.first <= c.first);
273 r |=
bool(c.first <= a.first);
308 EMTFRoadCollection::const_iterator roads_it = roads.begin();
309 EMTFRoadCollection::const_iterator roads_end = roads.end();
311 for (; roads_it != roads_end; ++roads_it) {
312 int ph_pat = roads_it->Key_zhit();
313 int ph_q = roads_it->Quality_code();
314 if (not(ph_pat >= 0 && ph_q > 0)) {
315 edm::LogError(
"L1T") <<
"ph_pat = " << ph_pat <<
", ph_q = " << ph_q;
323 std::vector<hit_sort_pair_t> tmp_phi_differences;
325 EMTFHitCollection::const_iterator conv_hits_it = conv_hits.begin();
326 EMTFHitCollection::const_iterator conv_hits_end = conv_hits.end();
328 for (; conv_hits_it != conv_hits_end; ++conv_hits_it) {
329 int ph_seg = conv_hits_it->Phi_fp();
330 int ph_seg_red = ph_seg >> (bw_fph - bpow - 1);
331 if (not(ph_seg >= 0)) {
341 int ph_diff = abs_diff(ph_pat, ph_seg_red);
342 if (ph_diff > max_ph_diff)
343 ph_diff = invalid_ph_diff;
345 if (ph_diff != invalid_ph_diff)
346 tmp_phi_differences.push_back(std::make_pair(ph_diff, conv_hits_it));
352 if (!tmp_phi_differences.empty()) {
356 bool use_fw_sorting =
true;
359 use_fw_sorting =
false;
361 if (use_fw_sorting) {
364 const int max_drift = 3;
365 const int zone_cham = ((zone == 1 && (2 <= station && station <= 4)) || (zone == 2 && station == 2)) ? 4 : 7;
366 const int seg_ch = 2;
368 (max_drift * zone_cham * seg_ch) + ((zone_cham == 4) ? 3 : 12);
370 std::vector<hit_sort_pair_t> fw_sort_array(tot_diff, std::make_pair(invalid_ph_diff, conv_hits_end));
373 std::vector<hit_sort_pair_t>::const_iterator phdiffs_it = tmp_phi_differences.begin();
374 std::vector<hit_sort_pair_t>::const_iterator phdiffs_end = tmp_phi_differences.end();
376 for (; phdiffs_it != phdiffs_end; ++phdiffs_it) {
378 int fs_segment = phdiffs_it->second->FS_segment();
381 int fs_history = ((fs_segment >> 4) & 0x3);
382 int fs_chamber = ((fs_segment >> 1) & 0x7);
383 fs_segment = (fs_segment & 0x1);
384 unsigned fw_sort_array_index = (fs_history * zone_cham * seg_ch) + (fs_chamber * seg_ch) + fs_segment;
386 if (not(fs_history < max_drift && fs_chamber < zone_cham && fs_segment < seg_ch)) {
387 edm::LogError(
"L1T") <<
"fs_history = " << fs_history <<
", max_drift = " << max_drift
388 <<
", fs_chamber = " << fs_chamber <<
", zone_cham = " << zone_cham
389 <<
", fs_segment = " << fs_segment <<
", seg_ch = " << seg_ch;
392 if (not(fw_sort_array_index < fw_sort_array.size())) {
393 edm::LogError(
"L1T") <<
"fw_sort_array_index = " << fw_sort_array_index
394 <<
", fw_sort_array.size() = " << fw_sort_array.size();
397 fw_sort_array.at(fw_sort_array_index) = *phdiffs_it;
414 merge_sort3_with_hint(fw_sort_array.begin(),
418 ((tot_diff == 54) ? tot_diff / 2 : tot_diff / 3));
421 phi_differences.push_back(fw_sort_array.front());
432 bool operator()(
const value_type& lhs,
const value_type& rhs)
const {
434 if (lhs.second->Subsystem() != rhs.second->Subsystem())
437 return lhs.first <= rhs.first;
439 } tmp_less_ph_diff_cmp;
442 std::stable_sort(tmp_phi_differences.begin(), tmp_phi_differences.end(), tmp_less_ph_diff_cmp);
445 phi_differences.push_back(tmp_phi_differences.front());
450 phi_differences.push_back(std::make_pair(invalid_ph_diff, conv_hits_end));
459 EMTFHitCollection::const_iterator conv_hits_it = conv_hits.begin();
460 EMTFHitCollection::const_iterator conv_hits_end = conv_hits.end();
462 const bool is_csc_me11 = (conv_hit_ptr->Subsystem() ==
TriggerPrimitive::kCSC) && (conv_hit_ptr->Station() == 1) &&
463 (conv_hit_ptr->Ring() == 1 || conv_hit_ptr->Ring() == 4);
466 for (; conv_hits_it != conv_hits_end; ++conv_hits_it) {
467 const EMTFHit& conv_hit_i = *conv_hits_it;
468 const EMTFHit& conv_hit_j = *conv_hit_ptr;
473 (conv_hit_i.
Ring() == conv_hit_j.
Ring()) &&
476 (conv_hit_i.
Pattern() == conv_hit_j.
Pattern()) && (conv_hit_i.
BX() == conv_hit_j.
BX()) &&
477 ((conv_hit_i.
Is_RPC() ==
false) ||
485 <<
", conv_hit_j.Phi_fp() = " << conv_hit_j.
Phi_fp();
500 (conv_hit_i.
BX() == conv_hit_j.
BX()) &&
515 bool operator()(
const value_type& lhs,
const value_type& rhs)
const {
return lhs.Station() < rhs.Station(); }
519 std::stable_sort(tmp_hits.begin(), tmp_hits.end(), less_station_cmp);
static char to_hex(unsigned int i)
void set_sector(int bits)
std::pair< int, hit_ptr_t > hit_sort_pair_t
void set_ph_num(int bits)
l1t::EMTFHitCollection EMTFHitCollection
void set_theta_fp(int bits)
void set_sector_idx(int bits)
void insert_hits(hit_ptr_t conv_hit_ptr, const EMTFHitCollection &conv_hits, EMTFTrack &track) const
Container::value_type value_type
void set_bt_segment(int bits)
l1t::EMTFRoadCollection EMTFRoadCollection
std::array< T, NUM_ZONES > zone_array
Abs< T >::type abs(const T &t)
EMTFHitCollection::const_iterator hit_ptr_t
void set_fs_segment(int bits)
void set_winner(int bits)
EMTFHitCollection Hits() const
void process_single_zone_station(int zone, int station, const EMTFRoadCollection &roads, const EMTFHitCollection &conv_hits, std::vector< hit_sort_pair_t > &phi_differences) const
void set_endcap(int bits)
void push_Hit(const EMTFHit &hit)
void set_Hits(const EMTFHitCollection &hits)
void process(const std::deque< EMTFHitCollection > &extended_conv_hits, const emtf::zone_array< EMTFRoadCollection > &zone_roads, emtf::zone_array< EMTFTrackCollection > &zone_tracks) const
void configure(int verbose, int endcap, int sector, int bx, bool fixZonePhi, bool useNewZones, bool bugSt2PhDiff, bool bugME11Dupes)