ATLAS Offline Software
Loading...
Searching...
No Matches
Lvl1MuBarrelSectorLogicDataPhase1.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3*/
4#include <iomanip>
5#include <iostream>
6
9
10namespace LVL1MUONIF {
11
18
20
21 if ( ( right.getSystemId() == m_id_system ) &&
22 ( this != &right ) ) {
23
24 m_bcid = right.bcid();
26 for ( size_t i = 0; i < NCAND[m_id_system]; ++i ) {
27 m_roi[ i ] = right.roi( i );
28 m_ovl[ i ] = right.ovl( i );
29 m_pt[ i ] = right.pt( i );
30 m_charge[ i ] = right.charge( i );
31 m_2candidates[ i ] = right.is2candidates( i );
32 }
33 }
34
35 return *this;
36 }
37
39
40 SectorLogicWord val(std::make_pair(0, 0));
41 unsigned int len=0;
42 unsigned int pos=0;
43 for (size_t i=0;i<NCAND[m_id_system];i++)
44 {
45 //track current position and length of current data
46 len=0;
47 pos=0;
48 bool noROI=0;
49
50 // Candidate 'i' will be offset by 16*i bits
51 //0-4: ROI - 5 bits
53 if (roi(i) < 0)
54 {
55 val.first |= len << (i*16+pos);
56 noROI=1;
57 }
58 else val.first |= (roi(i) & len) << (i*16+pos);
59 pos += len;
60
61 //5-7: Nothing - 3 bits
62 len=3;
63 pos += len;
64
65 //8-10: pT - 3 bits
67 if (pt(i) < 0) val.first |= len << (i*16+pos);
68 else val.first |= (pt(i) & len) << (i*16+pos);
69 pos += len;
70
71 //11: Nothing - 1 bit
72 len=1;
73 pos += len;
74
75 //12: 2 candidates in ROI
77 val.first |= (is2candidates(i) & len) << (i*16+pos);
78 pos += len;
79
80 //13-14: overlap
82 if (!noROI || ovl(i) < 0) val.first |= len << (i*16+pos);
83 else val.first |= (ovl(i) & len) << (i*16+pos);
84 pos += len;
85
86 //15: charge?
88 if (charge(i) > 0) val.first |= (1 >> (i*16+pos)) & len;
89 pos += len;
90 }
91
92
93
94 // Global+BCID flags (bits 32-47)
95 len=0;
96 pos=0;
97
98 //0-11: BCID
100 val.second |= ( bcid() & len);
101 pos += len;
102
103 //12-15: global flags
105 if (is2candidatesInSector()) val.second |= (1 >> pos) & len;
106
107
108 return val;
109 }
110
111
113
114 unsigned int val;
115 unsigned int pos=0;
116 unsigned int len=0;
117 for (size_t i=0;i<NCAND[m_id_system];i++)
118 {
119 //track current position and length of current data
120 len=0;
121 pos=0;
122 bool noROI=0;
123
124 // Candidate 'i' will be offset by 16*i bits
125 //0-4: ROI - 5 bits
127 val = (value.first >> (i*16+pos)) & len;
128 if (val == len)
129 {
130 noROI=1;
131 roi(i, -1);
132 ovl(i, -1);
133 }
134 else roi(i, val);
135 pos += len;
136
137 //5-7: Nothing - 3 bits
138 len=3;
139 pos += len;
140
141 //8-10: pT - 3 bits
143 val = (value.first >> (i*16+pos)) & len;
144 if (val == len) pt(i, -1);
145 else pt(i, val);
146 pos += len;
147
148 //11: Nothing - 1 bit
149 len=1;
150 pos += len;
151
152 //12: 2 candidates in ROI
154 val = (value.first >> (i*16+pos)) & len;
155 if (val == len) set2candidates(i);
156 else clear2candidates(i);
157 pos += len;
158
159 //13-14: overlap
161 val = (value.first >> (i*16+pos)) & len;
162 if (!noROI) ovl(i, val);
163 pos += len;
164
165 //15: charge?
167 val = (value.first >> (i*16+pos)) & len;
168 if (val > 0) charge(i, +1);
169 else charge(i, -1); // should this be -1 or 0?
170 pos += len;
171 }
172
173 // Global+BCID flags (bits 32-47)
174 len=0;
175 pos=0;
176
177 //0-11: BCID
179 val = value.second & len;
180 bcid(val);
181 pos += len;
182
183 //12: > 2 candidates
185 val = (value.second >> pos) & len;
186 if (val) set2candidatesInSector();
188 pos += len;
189
190 //13-15: other global flags
191
192
193 return *this;
194 }
195
196
197 void Lvl1MuBarrelSectorLogicDataPhase1::printOut( std::ostream& out ) const {
198
199 for (size_t i=0;i<NCAND[m_id_system];i++)
200 {
201 out << "Bit 0-4 " << " ROI<" << i+1 << "> ";
202 if (roi(i) == -1) out << "NA" << std::endl;
203 else out << std::setw(8) << roi(i) << std::endl;
204
205 out << "Bit 8-10 "<< "Pt" << i+1 << " ";
206 if (pt(i) == -1) out << "No Hit" << std::endl;
207 else out << pt(i) << std::endl;
208
209 out << "Bit 12 "<<"2 candidates in ROI<" << i+1 << "> ";
210 out << std::setw(8) << is2candidates(i) << std::endl;
211
212 out << "Bit 13-14 "<<"overlap<"<<i+1<<"> ";
213 out << std::setw(8) << ovl(i) << std::endl;
214
215 out << "Bit 15 "<<"charge<"<<i+1<<"> ";
216 out << std::setw(8) << charge(i) << std::endl;
217 }
218 out << "Bit 0-11 " << " BCID ";
219 out << std::setw( 8 ) << bcid() << std::endl;
220
221 out << "Bit 12 " << " >2candidates in a sector ";
222 out << std::setw( 8 ) << m_2candidatesInSector << std::endl;
223
224 }
225
226} // namespace LVL1MUONIF
virtual SectorLogicWord getWordFormat() const override
Get data in 32 bit word format.
Lvl1MuBarrelSectorLogicDataPhase1 & operator=(const Lvl1MuSectorLogicDataPhase1 &right)
virtual void printOut(std::ostream &out) const override
print out data
virtual const Lvl1MuSectorLogicDataPhase1 & convertFromWordFormat(const SectorLogicWord &) override
Convert SectorLogicDataPhase1 from 32 bit word data.
std::pair< unsigned long int, unsigned short int > SectorLogicWord
Namespace for the LVL1 muon interface classes.
static const unsigned int NBITS_CHARGE[3]
static const unsigned int NBITS_ROI[3]
static const unsigned int NBITS_OVL[3]
static const unsigned int NBITS_IS2CANDIDATESINSECTOR[3]
static const unsigned int NBITS_PT[3]
static const size_t NCAND[3]
static const unsigned int NBITS_BCID[3]
static const unsigned int NBITS_IS2CANDIDATES[3]