41 edm::LogError(
"L1T|EMTF") <<
"Payload size in 'SP Output Data Record' is different than expected";
45 for (
unsigned int i = 0;
i < 8;
i++) {
48 edm::LogError(
"L1T|EMTF") <<
"Payload[" <<
i <<
"] has more than 16 bits in 'SP Output Data Record'";
64 edm::LogError(
"L1T|EMTF") <<
"Format identifier bits in SP1a are incorrect";
68 edm::LogError(
"L1T|EMTF") <<
"Format identifier bits in SP1b are incorrect";
72 edm::LogError(
"L1T|EMTF") <<
"Format identifier bits in SP1c are incorrect";
76 edm::LogError(
"L1T|EMTF") <<
"Format identifier bits in SP1d are incorrect";
80 edm::LogError(
"L1T|EMTF") <<
"Format identifier bits in SP2a are incorrect";
84 edm::LogError(
"L1T|EMTF") <<
"Format identifier bits in SP2b are incorrect";
88 edm::LogError(
"L1T|EMTF") <<
"Format identifier bits in SP2c are incorrect";
92 edm::LogError(
"L1T|EMTF") <<
"Format identifier bits in SP2d are incorrect";
100 int new_sector = _sector;
103 int arr[] = {_csc_ID, -99, -99, -99};
104 std::vector<int> vec(arr, arr + 4);
106 }
else if (_csc_ID == 0) {
107 int arr[] = {-1, -1, -1, -1};
108 std::vector<int> vec(arr, arr + 4);
110 }
else if (_csc_ID <= 9) {
111 int arr[] = {_csc_ID, new_sector, _subsector + 1, 0};
112 std::vector<int> vec(arr, arr + 4);
115 new_sector = (_sector != 1) ? _sector - 1 : 6;
118 int arr[] = {3, new_sector, 2, 1};
119 std::vector<int> vec(arr, arr + 4);
121 }
else if (_csc_ID == 11) {
122 int arr[] = {6, new_sector, 2, 1};
123 std::vector<int> vec(arr, arr + 4);
125 }
else if (_csc_ID == 12) {
126 int arr[] = {9, new_sector, 2, 1};
127 std::vector<int> vec(arr, arr + 4);
130 int arr[] = {_csc_ID, -99, -99, -99};
131 std::vector<int> vec(arr, arr + 4);
134 }
else if (_station == 2 || _station == 3 || _station == 4) {
136 int arr[] = {_csc_ID, -99, -99, -99};
137 std::vector<int> vec(arr, arr + 4);
139 }
else if (_csc_ID == 0) {
140 int arr[] = {-1, -1, -1, -1};
141 std::vector<int> vec(arr, arr + 4);
143 }
else if (_csc_ID <= 9) {
144 int arr[] = {_csc_ID, new_sector, -1, 0};
145 std::vector<int> vec(arr, arr + 4);
148 new_sector = (_sector != 1) ? _sector - 1 : 6;
151 int arr[] = {3, new_sector, -1, 1};
152 std::vector<int> vec(arr, arr + 4);
154 }
else if (_csc_ID == 11) {
155 int arr[] = {9, new_sector, -1, 1};
156 std::vector<int> vec(arr, arr + 4);
159 int arr[] = {_csc_ID, -99, -99, -99};
160 std::vector<int> vec(arr, arr + 4);
164 int arr[] = {-99, -99, -99, -99};
165 std::vector<int> vec(arr, arr + 4);
183 static constexpr
int nominalShower_ = 1;
184 static constexpr
int tightShower_ = 3;
205 int iOut =
res->size() - 1;
206 std::vector<int> conv_vals_SP;
207 std::vector<int> conv_vals_pT_LUT;
217 res_cand =
static_cast<EMTFCollections*
>(coll)->getRegionalMuonCands();
221 res_shower =
static_cast<EMTFCollections*
>(coll)->getRegionalMuonShowers();
275 ImportSP(Track_, SP_, (
res->at(iOut)).PtrEventHeader()->Endcap(), (
res->at(iOut)).PtrEventHeader()->Sector());
278 if (!(
res->at(iOut)).PtrSPCollection()->empty())
279 if (SP_.
TBIN() == (
res->at(iOut)).PtrSPCollection()->at((
res->at(iOut)).PtrSPCollection()->size() - 1).TBIN())
303 int EMTF_kBX = ((
res->at(iOut)).PtrEventHeader()->L1A_BXN() % 2048) - 25 + Track_.
BX();
322 int nDelay[3] = {0, 0, 0};
323 if (Track_.
Mode() >= 8)
325 if ((Track_.
Mode() % 8) >= 4)
327 if ((Track_.
Mode() % 4) >= 2)
329 if ((Track_.
Mode() % 2) == 1)
336 else if (nDelay[2] + nDelay[1] >= 2)
338 else if (nDelay[2] + nDelay[1] + nDelay[0] >= 2)
347 auto get_subsector_rpc_cppf = [](
int subsector_rpc) {
return ((subsector_rpc + 3) % 6) + 1; };
349 std::array<int, 4> St_hits{{0, 0, 0, 0}};
351 for (
auto const&
Hit : *res_hit) {
352 if (Track_.
Mode() == 1)
358 if (
Hit.Station() == 1)
360 else if (
Hit.Station() == 2)
362 else if (
Hit.Station() == 3)
364 else if (
Hit.Station() == 4)
368 if (
Hit.BX() + 3 + hit_delay != SP_.
TBIN() + trk_delay)
375 if (
Hit.Station() == 1 &&
Hit.Sector() == conv_vals_SP.at(1) &&
Hit.Neighbor() == conv_vals_SP.at(3) &&
377 if (
Hit.Is_CSC() == 1 && (
Hit.CSC_ID() != conv_vals_SP.at(0) ||
Hit.Subsector() != conv_vals_SP.at(2)))
380 int tmp_subsector = get_subsector_rpc_cppf(
Hit.Subsector_RPC());
381 int RPC_subsector = ((tmp_subsector - 1) / 3) + 1;
382 int RPC_CSC_ID = ((tmp_subsector - 1) % 3) + 4;
384 if (
Hit.Is_RPC() == 1 && (RPC_CSC_ID != conv_vals_SP.at(0) || RPC_subsector != conv_vals_SP.at(2)))
387 if (St_hits.at(0) == 0) {
400 if (
Hit.Station() == 2 &&
Hit.Sector() == conv_vals_SP.at(1) &&
Hit.Neighbor() == conv_vals_SP.at(3) &&
402 if (
Hit.Is_CSC() == 1 &&
Hit.CSC_ID() != conv_vals_SP.at(0))
405 int tmp_subsector = get_subsector_rpc_cppf(
Hit.Subsector_RPC());
406 if (
Hit.Is_RPC() == 1 && tmp_subsector + 3 != conv_vals_SP.at(0))
409 if (St_hits.at(1) == 0) {
422 if (
Hit.Station() == 3 &&
Hit.Sector() == conv_vals_SP.at(1) &&
Hit.Neighbor() == conv_vals_SP.at(3) &&
424 if (
Hit.Is_CSC() == 1 &&
Hit.CSC_ID() != conv_vals_SP.at(0))
427 int tmp_subsector = get_subsector_rpc_cppf(
Hit.Subsector_RPC());
428 if (
Hit.Is_RPC() == 1 && tmp_subsector + 3 != conv_vals_SP.at(0))
431 if (St_hits.at(2) == 0) {
444 if (
Hit.Station() == 4 &&
Hit.Sector() == conv_vals_SP.at(1) &&
Hit.Neighbor() == conv_vals_SP.at(3) &&
446 if (
Hit.Is_CSC() == 1 &&
Hit.CSC_ID() != conv_vals_SP.at(0))
449 int tmp_subsector = get_subsector_rpc_cppf(
Hit.Subsector_RPC());
450 if (
Hit.Is_RPC() == 1 && tmp_subsector + 3 != conv_vals_SP.at(0))
453 if (St_hits.at(3) == 0) {
466 if (Track_.
Mode() == 1) {
468 int chamber_min = ((Track_.
GMT_phi() - 17) / 16) + Track_.
Sector() * 6 - 3;
469 int chamber_max = ((Track_.
GMT_phi() + 1) / 16) + Track_.
Sector() * 6 - 3;
470 for (
int iChamb = chamber_max; iChamb >= chamber_min; iChamb--) {
471 int chamber = (iChamb < 37 ? iChamb : (iChamb % 36));
473 for (
auto const&
Hit : *res_hit) {
476 if (
Hit.BX() != Track_.
BX())
480 if (
Hit.Is_CSC() != 1)
482 if (
Hit.Station() != 1)
484 if ((
Hit.Ring() % 3) != 1)
486 if (
Hit.Neighbor() == 1)
490 bool hit_already_used =
false;
491 for (
auto const& Trk : *res_track) {
494 if (Trk.NumHits() < 1)
497 if (Trk.Hits().at(0).Station() == 1 && Trk.Hits().at(0).Chamber() ==
chamber &&
498 Trk.Hits().at(0).BX() ==
Hit.BX() && Trk.Hits().at(0).Ring() ==
Hit.Ring() &&
499 Trk.Hits().at(0).Strip() ==
Hit.Strip() && Trk.Hits().at(0).Wire() ==
Hit.Wire()) {
500 hit_already_used =
true;
505 if (!hit_already_used) {
580 (
res->at(iOut)).push_SP(SP_);
582 res_track->push_back(Track_);
void set_me3_stub_num(int bits)
void setOneTightInTime(const bool bit)
void setHwPhi(int bits)
Set compressed relative phi as transmitted by hardware LSB = 2*pi/576 (8 bits)
void set_me2_stub_num(int bits)
void set_pt_dxy_GMT(int bits)
void set_me3_CSC_ID(int bits)
unsigned int getAlgoVersion()
virtual int checkFormat(const Block &block)
int calc_uGMT_chamber(int csc_ID, int subsector, int neighbor, int station)
Log< level::Error, false > LogError
void set_me2_CSC_ID(int bits)
void set_me1_stub_num(int bits)
void set_pt_GMT(int bits)
void set_me4_delay(int bits)
void set_phi_GMT(int bits)
int TwosCompl(int nBits, int bits)
void set_me1_delay(int bits)
void set_me2_delay(int bits)
void setTFIdentifiers(int processor, tftype trackFinder)
Set the processor ID, track-finder type. From these two, the link is set.
std::vector< EMTFHit > EMTFHitCollection
std::vector< EMTFDaqOut > EMTFDaqOutCollection
void setTrackSubAddress(bmtfAddress subAddress, int value)
Set a part of the muon candidates track address; specialised for BMTF.
void set_track_num(int bits)
void set_eta_GMT(int bits)
void setHwQual(int bits)
Set compressed quality code as transmitted by hardware (4 bits)
void setHwPt(int bits)
Set compressed pT as transmitted by hardware LSB = 0.5 (9 bits)
void set_me4_CSC_ID(int bits)
void setHwEta(int bits)
Set compressed eta as transmitted by hardware LSB = 0.010875 (9 bits)
void setHwDXY(int bits)
Set compressed impact parameter with respect to beamspot (4 bits)
void setOneNominalInTime(const bool bit)
void set_me4_stub_num(int bits)
bool unpack(const Block &block, UnpackerCollections *coll) override
void set_me3_delay(int bits)
void set_dxy_GMT(int bits)
int ME1_subsector() const
void setBXRange(int bxFirst, int bxLast)
void setTFIdentifiers(int processor, tftype trackFinder)
Set the processor ID, track-finder type. From these two, the link is set.
void set_pt_LUT_addr(unsigned long bits)
void ImportSP(EMTFTrack &_track, const l1t::emtf::SP _SP, const int _endcap, const int _evt_sector)
void push_Hit(const EMTFHit &hit)
#define DEFINE_L1T_UNPACKER(type)
void set_me1_CSC_ID(int bits)
void setHwSignValid(int bits)
Set whether charge measurement is valid (0 for high pT muons)
std::vector< int > convert_SP_location(int _csc_ID, int _sector, int _subsector, int _station)
std::vector< EMTFTrack > EMTFTrackCollection
uint16_t GetHexBits(uint16_t word, uint16_t lowBit, uint16_t highBit)
void set_me1_subsector(int bits)
void setHwPtUnconstrained(int bits)
Set compressed second displaced pT as transmitted by hardware LSB = 1.0 (8 bits)
void set_quality_GMT(int bits)
void push_back(int bx, T object)
void set_phi_full(int bits)
void setHwSign(int bits)
Set charge sign bit (charge = (-1)^(sign))
void set_nn_pt_valid(int bits)