ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
InnerDetector
InDetCalibAlgs
PixelCalibAlgs
src
PixelConvert.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
PixelCalibAlgs/PixelConvert.h
"
6
#include "
CxxUtils/checker_macros.h
"
7
#include <algorithm>
8
9
namespace
PixelConvert
{
10
11
constexpr
int
NLayer
=3;
12
constexpr
int
BSMax
[]={11,19,26};
13
constexpr
int
EtaMax
=6;
14
constexpr
int
NinSector
=6;
15
constexpr
int
NinDisk
=48;
16
const
std::string
Error
=
"InvalidChannel"
;
17
18
std::string
PackOfflineID
(
int
system,
19
int
subSystem,
20
int
endcap,
21
int
layer,
22
int
phi
,
23
int
eta
) {
24
std::ostringstream s;
25
s <<
"["
<< system <<
"."
<< subSystem <<
"."
<< endcap <<
"."
26
<< layer <<
"."
<<
phi
<<
"."
<<
eta
<<
".0]"
;
27
return
s.str();
28
}
29
30
int
UnpackOfflineID
(
const
std::string& offlineID,
31
int
& system,
32
int
& subSystem,
33
int
& endcap,
34
int
& layer,
35
int
&
phi
,
36
int
&
eta
) {
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
}
48
49
std::string
OnlineID
(
int
system,
50
int
subSystem,
51
int
endcap,
52
int
layer,
53
int
phi
,
54
int
eta
) {
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
}
124
125
std::string
OnlineID
(
const
std::string& offlineID) {
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
}
141
142
std::string
OnlineID
(
int
hashID) {
143
return
OnlineID
(
OfflineID
(hashID));
144
}
145
146
147
int
OfflineID
(
const
std::string& onlineID,
148
int
& system,
149
int
& subSystem,
150
int
& endcap,
151
int
& layer,
152
int
&
phi
,
153
int
&
eta
) {
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
}
249
250
std::string
OfflineID
(
const
std::string& onlineID) {
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
}
256
257
int
OfflineID
(
int
hashID,
258
int
& system,
259
int
& subSystem,
260
int
& endcap,
261
int
& layer,
262
int
&
phi
,
263
int
&
eta
) {
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
}
275
276
std::string
OfflineID
(
int
hashID) {
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
}
281
282
int
HashID
(
const
std::string& ID) {
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
}
294
295
int
HashID
(
int
system,
296
int
subSystem,
297
int
endcap,
298
int
layer,
299
int
phi
,
300
int
eta
) {
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
}
313
314
std::string
DCSID
(
const
std::string&
OnlineID
) {
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
}
363
364
std::string
OnlineIDfromDCSID
(
const
std::string&
DCSID
) {
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
}
386
387
388
/*
389
* This function provides the module hashID if it is given as input
390
* moduleID between 510000 and 519999, which are possible serial number
391
* of production modules.
392
* Otherwise, it interprets the input argument as an hash identifier
393
* and gives back the corresponding module SN.
394
* In case of failure the return value is 0.
395
*
396
*/
397
398
int
ReadMap
(
const
std::string& filename,
399
Map
&
map
)
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
}
432
433
unsigned
int
GetID
(
const
Map
&
map
,
434
const
unsigned
int
moduleID)
435
{
436
if
( moduleID>=510000 && moduleID<=519999 )
437
return
(*
map
.m_SNIndex)[moduleID];
438
else
439
return
(*
map
.m_hashIndex)[moduleID];
440
}
441
442
}
443
444
445
446
447
448
449
450
DCSID
struct _DCSID DCSID
eta
Scalar eta() const
pseudorapidity method
Definition
AmgMatrixBasePlugin.h:83
phi
Scalar phi() const
phi method
Definition
AmgMatrixBasePlugin.h:67
PixelConvert.h
checker_macros.h
Define macros for attributes used to control the static checker.
map
STL class.
PixelConvert
Definition
PixelConvert.h:31
PixelConvert::GetID
unsigned int GetID(const Map &map, const unsigned int moduleID)
Definition
PixelConvert.cxx:433
PixelConvert::NLayer
const int NLayer
Definition
PixelConvert.cxx:11
PixelConvert::NinSector
const int NinSector
Definition
PixelConvert.cxx:14
PixelConvert::UnpackOfflineID
int UnpackOfflineID(const std::string &offlineID, int &system, int &subSystem, int &endcap, int &layer, int &phi, int &eta)
Definition
PixelConvert.cxx:30
PixelConvert::Error
const std::string Error
Definition
PixelConvert.cxx:16
PixelConvert::EtaMax
const int EtaMax
Definition
PixelConvert.cxx:13
PixelConvert::OnlineIDfromDCSID
std::string OnlineIDfromDCSID(const std::string &DCSID)
Definition
PixelConvert.cxx:364
PixelConvert::DCSID
std::string DCSID(const std::string &OnlineID)
Definition
PixelConvert.cxx:314
PixelConvert::NinDisk
const int NinDisk
Definition
PixelConvert.cxx:15
PixelConvert::HashID
int HashID(const std::string &ID)
Definition
PixelConvert.cxx:282
PixelConvert::PackOfflineID
std::string PackOfflineID(int system, int subSystem, int endcap, int layer, int phi, int eta)
Definition
PixelConvert.cxx:18
PixelConvert::OfflineID
int OfflineID(const std::string &onlineID, int &system, int &subSystem, int &endcap, int &layer, int &phi, int &eta)
Definition
PixelConvert.cxx:147
PixelConvert::ReadMap
int ReadMap(const std::string &filename, Map &map)
Definition
PixelConvert.cxx:398
PixelConvert::OnlineID
std::string OnlineID(int system, int subSystem, int endcap, int layer, int phi, int eta)
Definition
PixelConvert.cxx:49
PixelConvert::BSMax
const int BSMax[]
Definition
PixelConvert.cxx:12
PixelConvert::Map
Definition
PixelConvert.h:190
Generated on
for ATLAS Offline Software by
1.17.0