ATLAS Offline Software
Loading...
Searching...
No Matches
PixelConvert Namespace Reference

Classes

struct  Map

Functions

std::string PackOfflineID (int system, int subSystem, int endcap, int layer, int phi, int eta)
int UnpackOfflineID (const std::string &offlineID, int &system, int &subSystem, int &endcap, int &layer, int &phi, int &eta)
std::string OnlineID (int system, int subSystem, int endcap, int layer, int phi, int eta)
std::string OnlineID (const std::string &offlineID)
std::string OnlineID (int hashID)
std::string OnlineIDfromDCSID (const std::string &DCSID)
int OfflineID (const std::string &onlineID, int &system, int &subSystem, int &endcap, int &layer, int &phi, int &eta)
std::string OfflineID (const std::string &onlineID)
int OfflineID (int hashID, int &system, int &subSystem, int &endcap, int &layer, int &phi, int &eta)
std::string OfflineID (int hashID)
int HashID (const std::string &ID)
int HashID (int system, int subSystem, int endcap, int layer, int phi, int eta)
std::string DCSID (const std::string &OnlineID)
int ReadMap (const std::string &filename, Map &map)
unsigned int GetID (const Map &map, const unsigned int moduleID)

Variables

const int NLayer =3
const int BSMax [] ={11,19,26}
const int EtaMax =6
const int NinSector =6
const int NinDisk =48
const std::string Error ="InvalidChannel"

Function Documentation

◆ DCSID()

std::string PixelConvert::DCSID ( const std::string & OnlineID)

Definition at line 314 of file PixelConvert.cxx.

314 {
315 std::string ID=OnlineID;
316 std::string newID(Error);
317 size_t pos=0;
318 char ch{};
319 std::replace(ID.begin(), ID.end(), '-', '_');
320
321 if ( ID.at(0)=='L' ) {
322 pos = ID.find('S'); // stave in DCS is S1/S2, not S01/S02
323 if ( pos!=std::string::npos ) {
324 ch = ID.at(pos+1);
325 if ( ch=='0' ) ID.erase(pos+1,1);
326 }
327 return ID;
328 }
329 pos=5; // do not rely a priori on
330 ch=ID.at(pos); // about input data being S0#
331 if ( ch=='0' ) {pos++; ch=ID.at(pos);} // or S#
332 switch (ch) {
333 case '1':
334 newID="B01_S2";
335 break;
336 case '2':
337 newID="B02_S1";
338 break;
339 case '3':
340 newID="B02_S2";
341 break;
342 case '4':
343 newID="B03_S1";
344 break;
345 case '5':
346 newID="B03_S2";
347 break;
348 case '6':
349 newID="B04_S1";
350 break;
351 case '7':
352 newID="B04_S2";
353 break;
354 case '8':
355 newID="B01_S1";
356 break;
357 default:
358 return newID;
359 }
360 ID.replace(4,pos-3,newID);
361 return ID;
362 }
std::vector< Identifier > ID
const std::string Error
std::string OnlineID(int system, int subSystem, int endcap, int layer, int phi, int eta)

◆ GetID()

unsigned int PixelConvert::GetID ( const Map & map,
const unsigned int moduleID )

Definition at line 433 of file PixelConvert.cxx.

435 {
436 if ( moduleID>=510000 && moduleID<=519999 )
437 return (*map.m_SNIndex)[moduleID];
438 else
439 return (*map.m_hashIndex)[moduleID];
440 }
STL class.

◆ HashID() [1/2]

int PixelConvert::HashID ( const std::string & ID)

Definition at line 282 of file PixelConvert.cxx.

282 {
283 int system{}, subSystem{}, endcap{}, layer{}, phi{}, eta{};
284 int success{};
285 if ( ID.at(0)=='[' ) // already offline ID
286 success=UnpackOfflineID(ID,system,subSystem,endcap,layer,phi,eta);
287 else // probably it is online ID
288 success=OfflineID(ID,system,subSystem,endcap,layer,phi,eta);
289 if (success)
290 return HashID(system,subSystem,endcap,layer,phi,eta);
291 else
292 return -1;
293 }
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
int UnpackOfflineID(const std::string &offlineID, int &system, int &subSystem, int &endcap, int &layer, int &phi, int &eta)
int HashID(const std::string &ID)
int OfflineID(const std::string &onlineID, int &system, int &subSystem, int &endcap, int &layer, int &phi, int &eta)
@ layer
Definition HitInfo.h:79

◆ HashID() [2/2]

int PixelConvert::HashID ( int system,
int subSystem,
int endcap,
int layer,
int phi,
int eta )

Definition at line 295 of file PixelConvert.cxx.

300 {
301 // if (endcap==0) eta+=6;
302 eta+=6;
303 endcap = (endcap+2)/2;
304 system = 0;
305 subSystem= 0;
306 return (( system& 0x7)<<29)
307 + ((subSystem&0x3)<<27)
308 + (( endcap& 0x3)<<25)
309 + (( layer& 0x3)<<23)
310 + (( phi&0x3f)<<17)
311 + (( eta& 0xf)<<13);
312 }

◆ OfflineID() [1/4]

std::string PixelConvert::OfflineID ( const std::string & onlineID)

Definition at line 250 of file PixelConvert.cxx.

250 {
251 int system{}, subSystem{}, endcap{}, layer{}, phi{}, eta{};
252 if ( OfflineID(onlineID,system,subSystem,endcap,layer,phi,eta) )
253 return PackOfflineID(system,subSystem,endcap,layer,phi,eta);
254 else return Error;
255 }
std::string PackOfflineID(int system, int subSystem, int endcap, int layer, int phi, int eta)

◆ OfflineID() [2/4]

int PixelConvert::OfflineID ( const std::string & onlineID,
int & system,
int & subSystem,
int & endcap,
int & layer,
int & phi,
int & eta )

Definition at line 147 of file PixelConvert.cxx.

153 {
154 std::istringstream s(onlineID);
155 system = 2; // ID
156 subSystem=1; // Pixel
157 char c1{}, c{};
158 s >> c1;
159 switch (c1) {
160 case 'D':
161 endcap=2;
162 eta=0;
163 s >> layer;
164 if (layer<=0 || layer>NLayer ) return 0;
165 layer--;
166 s >> c;
167 switch (c) {
168 case 'C': // change sign of endcap;
169 endcap=-endcap;
170 case 'A': // do nothing
171 break;
172 default: // invalid endcap
173 return 0;
174 }
175 s >> c >> c;
176 if ( c!='S' ) return 0;
177 {
178 int sect{}, insect{};
179 s >> sect;
180 if ( sect<=0 || sect>(NinDisk/NinSector)) return 0;
181 s >> c >> c;
182 if ( c != 'M' ) return 0;
183 s >> insect;
184 if ( insect<=0 || insect>NinSector ) return 0;
185 if (insect<=NinSector/2) { // facing IP
186 if ( endcap>0)
187 phi=NinSector*(sect-1)+2*(insect-1);
188 else
189 phi=NinSector*(sect-1)+NinSector-2*insect+1;
190 } else { // away from IP
191 if ( endcap>0)
192 phi=NinSector*(sect-1)+NinSector-2*(insect-NinSector/2)+1;
193 else
194 phi=NinSector*(sect-1)+2*(insect-NinSector/2-1);
195 }
196 }
197 break;
198 case 'L':
199 endcap=0;
200 s >> layer;
201 if ( s.bad() || layer<0 || layer>=NLayer ) return 0;
202 s >> c >> c;
203 if ( c!='B' ) return 0;
204 {
205 int bist{}, stav{};
206 s >> bist >> c >> c >> stav;
207 if ( c!='S' || bist<=0 || bist>BSMax[layer] || stav<=0 || stav>2 )
208 return 0;
209 phi=2*(bist-1)+stav-1;
210 // now set the right offset, so that phi=0 corresponds to
211 // B01-S01. This is different for different layers
212 switch (layer) {
213 case 0: // BLayer, first bistave corresponds to phi=1
214 phi+=1;
215 break;
216 case 1: // Layer1, first bistave corresponds to phi=0
217 break;
218 case 2: // Layer2, first bistave corresponds to phi=51
219 phi-=1;
220 break;
221 default:
222 return 0;
223 }
224 if (phi<0) phi+=2*BSMax[layer];
225 else if (phi>=2*BSMax[layer]) phi-=2*BSMax[layer];
226 }
227 s >> c >> c >> c >> c >> c;
228 if ( c!='M' ) return 0;
229 s >> eta;
230 if ( eta<0 || eta > EtaMax) return 0;
231 if (eta>0) {
232 s >> c;
233 switch (c) {
234 case 'C': // change sign of eta;
235 eta=-eta;
236 case 'A': // do nothing
237 break;
238 default: // invalid side
239 return 0;
240 }
241 }
242 break;
243 default:
244 return 0; // invalid endcap/barrel selection
245 }
246 if (s.bad()) return 0;
247 else return 1;
248 }
const int NLayer
const int NinSector
const int EtaMax
const int NinDisk
const int BSMax[]

◆ OfflineID() [3/4]

std::string PixelConvert::OfflineID ( int hashID)

Definition at line 276 of file PixelConvert.cxx.

276 {
277 int system{}, subSystem{}, endcap{}, layer{}, phi{}, eta{};
278 OfflineID(hashID,system,subSystem,endcap,layer,phi,eta);
279 return PackOfflineID(system,subSystem,endcap,layer,phi,eta);
280 }

◆ OfflineID() [4/4]

int PixelConvert::OfflineID ( int hashID,
int & system,
int & subSystem,
int & endcap,
int & layer,
int & phi,
int & eta )

Definition at line 257 of file PixelConvert.cxx.

263 {
264 system = ((hashID>>29)& 0x7)+2;
265 subSystem = ((hashID>>27)& 0x3)+1;
266 endcap = ((hashID>>25)& 0x3);
267 endcap = 2*(endcap-1);
268 layer = ((hashID>>23)& 0x3);
269 phi = ((hashID>>17)&0x3f);
270 eta = ((hashID>>13)& 0xf);
271 // if (endcap==0) eta-=6;
272 eta-=6;
273 return 1;
274 }

◆ OnlineID() [1/3]

std::string PixelConvert::OnlineID ( const std::string & offlineID)

Definition at line 125 of file PixelConvert.cxx.

125 {
126 int system{};
127 int subSystem{};
128 int endcap{};
129 int layer{};
130 int phi{};
131 int eta{};
132 if ( UnpackOfflineID(offlineID,system,subSystem,endcap,layer,phi,eta) )
133 return OnlineID(system,
134 subSystem,
135 endcap,
136 layer,
137 phi,
138 eta);
139 else return Error;
140 }

◆ OnlineID() [2/3]

std::string PixelConvert::OnlineID ( int hashID)

Definition at line 142 of file PixelConvert.cxx.

142 {
143 return OnlineID(OfflineID(hashID));
144 }

◆ OnlineID() [3/3]

std::string PixelConvert::OnlineID ( int system,
int subSystem,
int endcap,
int layer,
int phi,
int eta )

Definition at line 49 of file PixelConvert.cxx.

54 {
55 std::ostringstream s;
56 if ( system!=2 && subSystem!=1 ) return Error; // not InDet/Pixel
57 if (layer<0 || layer>=NLayer) return Error; // invalid layer
58 switch (endcap) {
59 case 0:
60 if (phi<0 || phi>=2*BSMax[layer]) return Error; // invalid phi position
61 if (abs(eta)>EtaMax) return Error; // invalid eta position
62 {
63 // now set the right offset, so that phi=0 corresponds to
64 // B01-S01. This is different for different layers
65 switch (layer) {
66 case 0: // BLayer, first bistave corresponds to phi=1
67 phi-=1;
68 break;
69 case 1: // Layer1, first bistave corresponds to phi=0
70 break;
71 case 2: // Layer2, first bistave corresponds to phi=51
72 phi+=1;
73 break;
74 }
75 if (phi<0) phi+=2*BSMax[layer];
76 else if (phi>=2*BSMax[layer]) phi-=2*BSMax[layer];
77 int bist=phi/2+1;
78 int stav=phi%2+1;
79 s << "L" << layer;
80 if (bist<10) s << "-B0";
81 else s << "-B";
82 s << bist << "-S0" << stav << "-";
83 if ( stav==1 ) {
84 if ( eta<=0 ) s << "C7";
85 else s << "A6";
86 } else {
87 if ( eta<0 ) s << "C6";
88 else s << "A7";
89 }
90 s << "-M" << abs(eta);
91 }
92 if ( eta>0 ) s << "A";
93 else if (eta<0) s<< "C";
94 break;
95 case 2:
96 case -2:
97 if (phi<0 || phi>=NinDisk ) return Error; // invalid phi position
98 if (eta!=0) return Error; // invalid eta position
99 s << "D" << layer+1;
100 if (endcap>0) s << "A";
101 else s << "C";
102 {
103 int sector = phi/NinSector+1;
104 int inSector= phi%NinSector;
105 s << "-S0" << sector << "-M";
106 if (endcap>0) {
107 if ((inSector%2)==0) // A side, facing IP
108 s << inSector/2+1;
109 else // A side, away from IP
110 s << NinSector-(inSector/2);
111 } else {
112 if ((inSector%2)==0) // C side, away IP
113 s << inSector/2+4;
114 else
115 s << NinSector-3-inSector/2;
116 }
117 }
118 break;
119 default:
120 return Error; // invalid barrel/endcap selection
121 }
122 return s.str();
123 }

◆ OnlineIDfromDCSID()

std::string PixelConvert::OnlineIDfromDCSID ( const std::string & DCSID)

Definition at line 364 of file PixelConvert.cxx.

364 {
365 std::string ID=DCSID;
366 const std::string &newID(Error);
367 std::replace(ID.begin(), ID.end(), '_', '-');
368 if ( ID.at(0)=='L' ) return ID;
369 std::istringstream in(DCSID);
370 int b{},s{},dum{};
371 char c{}, c1{}, c2{};
372 in >> c >> dum >> c >> c >> c1 >> b >> c >> c2 >> s;
373 if ( c1!='B' || c2!='S' ) return newID;
374 int sector=b*2-3+s;
375 int Nsector=NinDisk/NinSector;
376 if (sector==0) sector=Nsector;
377 else if (sector<0 || sector>=Nsector) return Error;
378 int start=ID.find('-',0)+1; // first '-' is before B
379 int stop =ID.find('-',start); // iterate twice to get third '-'
380 stop=ID.find('-',stop+1); // after sector ID
381 std::ostringstream out;
382 out << "S0" << sector;
383 ID.replace(start,stop-start,out.str());
384 return ID;
385 }
std::string DCSID(const std::string &OnlineID)

◆ PackOfflineID()

std::string PixelConvert::PackOfflineID ( int system,
int subSystem,
int endcap,
int layer,
int phi,
int eta )

Definition at line 18 of file PixelConvert.cxx.

23 {
24 std::ostringstream s;
25 s << "[" << system << "." << subSystem << "." << endcap << "."
26 << layer << "." << phi << "." << eta << ".0]";
27 return s.str();
28 }

◆ ReadMap()

int PixelConvert::ReadMap ( const std::string & filename,
Map & map )

Definition at line 398 of file PixelConvert.cxx.

400 {
401 std::cerr << "INFO: Opening data file " << filename << std::endl;
402 std::ifstream f(filename.c_str());
403 if ( !f.good() ) {
404 std::cerr << "ERROR: Cannot open data file " << filename << std::endl;
405 return -1;
406 }
407 map.m_hashIndex = std::make_unique<PixelConvert::Map::modulemap>();
408 map.m_SNIndex = std::make_unique<PixelConvert::Map::modulemap>();
409 unsigned int hashID, SN;
410 std::string dummy;
411 getline(f,dummy); // read header line
412 while (1) {
413 f >> dummy >> hashID >> dummy >> dummy >> SN
414 >> dummy >> dummy >> dummy >> dummy;
415 // std::cerr << "Read from " << filename << "\t" << hashID << "\t" << SN << std::endl;
416 if ( f.bad() ) {
417 std::cerr << "ERROR: error reading " << filename
418 << " after " << map.m_hashIndex->size() << " entries"
419 << std::endl;
420 f.close();
421 return -2;
422 } else if ( f.eof() ) break;
423 map.m_hashIndex->insert(std::make_pair(hashID,SN));
424 map.m_SNIndex->insert(std::make_pair(SN,hashID));
425 }
426 std::cerr << "INFO: end of file " << filename
427 << " after " << map.m_hashIndex->size() << " entries"
428 << std::endl;
429 f.close();
430 return 0;
431 }
std::unique_ptr< modulemap > m_hashIndex
std::unique_ptr< modulemap > m_SNIndex

◆ UnpackOfflineID()

int PixelConvert::UnpackOfflineID ( const std::string & offlineID,
int & system,
int & subSystem,
int & endcap,
int & layer,
int & phi,
int & eta )

Definition at line 30 of file PixelConvert.cxx.

36 {
37 std::istringstream s(offlineID);
38 char c;
39 s >> c >> system;
40 s >> c >> subSystem;
41 s >> c >> endcap;
42 s >> c >> layer;
43 s >> c >> phi;
44 s >> c >> eta;
45 if (s.bad()) return 0;
46 else return 1;
47 }

Variable Documentation

◆ BSMax

int PixelConvert::BSMax ={11,19,26}
constexpr

Definition at line 12 of file PixelConvert.cxx.

12{11,19,26};

◆ Error

const std::string PixelConvert::Error ="InvalidChannel"

Definition at line 16 of file PixelConvert.cxx.

◆ EtaMax

int PixelConvert::EtaMax =6
constexpr

Definition at line 13 of file PixelConvert.cxx.

◆ NinDisk

int PixelConvert::NinDisk =48
constexpr

Definition at line 15 of file PixelConvert.cxx.

◆ NinSector

int PixelConvert::NinSector =6
constexpr

Definition at line 14 of file PixelConvert.cxx.

◆ NLayer

int PixelConvert::NLayer =3
constexpr

Definition at line 11 of file PixelConvert.cxx.