ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
LArCalorimeter
LArBadChannelTool
src
LArBadChanBlobUtils.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
LArBadChannelTool/LArBadChanBlobUtils.h
"
6
7
namespace
LArBadChanBlobUtils
{
8
9
int
machineEndianness
()
10
{
11
int
i = 1;
12
char
*p =
reinterpret_cast<
char
*
>
(&i);
13
if
(p[0] == 1)
return
LittleEndian
;
// Lowest address contains the least significant byte
14
else
return
BigEndian
;
15
}
16
17
void
fillFebBlobV1
(
const
std::vector<HWIdentifier>&
vec
, coral::Blob& blob)
18
{
19
std::size_t nbytes =
vec
.size() *
sizeof
(
Channel
);
20
blob.resize(nbytes);
21
void
* adr = blob.startingAddress();
22
for
( std::vector<HWIdentifier>::const_iterator i=
vec
.begin();
23
i !=
vec
.end(); ++i) {
24
Channel
* ch =
static_cast<
Channel
*
>
( adr);
25
*ch = i->get_identifier32().get_compact();
// assign channel
26
adr =
static_cast<
void
*
>
(ch+1);
// points just after channel
27
}
28
}
29
30
bool
checkBlob
(
const
coral::Blob* blobp,
31
std::size_t chanSize,
32
std::size_t stateSizeInBlob,
33
int
endian,
34
int
/*version*/
,
35
std::size_t step,
36
std::size_t currentStateSize,
37
MsgStream& log)
38
{
39
if
( endian !=
machineEndianness
()) {
40
log << MSG::ERROR <<
"BLOB endian-ness and computer endian-ness differ."
41
<<
" This version cannot decode such BLOBs"
<<
endmsg
;
42
return
false
;
43
}
44
if
( chanSize !=
sizeof
(
Channel
)) {
45
log << MSG::ERROR <<
"The word size for HWidentifier in the BLOB ("
46
<< chanSize <<
") diifers from the HWIdentifier::value_type size "
47
<<
sizeof
(
Channel
) <<
endmsg
;
48
log << MSG::ERROR <<
"This version cannot decode such BLOBs"
<<
endmsg
;
49
return
false
;
50
}
51
if
( stateSizeInBlob != 0 && stateSizeInBlob != currentStateSize) {
52
log << MSG::ERROR <<
"The word size for LArBadChannel or LArBadFeb in the BLOB ("
53
<< stateSizeInBlob <<
") diifers from the runtime BitWord size "
54
<< currentStateSize <<
endmsg
;
55
log << MSG::ERROR <<
"This version cannot decode such BLOBs"
<<
endmsg
;
56
return
false
;
57
}
58
59
if
(blobp->size() % step != 0) {
60
log << MSG::ERROR <<
"BLOB size ("
<< blobp->size()
61
<<
") is not an exact multiple of content size "
62
<< step <<
endmsg
;
63
log << MSG::ERROR <<
"The BLOB is probably corrupted."
<<
endmsg
;
64
return
false
;
65
}
66
67
// FIXME: add version check
68
69
return
true
;
70
}
71
72
std::vector<HWIdentifier>
decodeFebBlobV1
(
const
coral::Blob* blobp,
73
std::size_t chanSize,
74
int
endian,
75
int
version,
76
MsgStream& log)
77
{
78
std::vector<HWIdentifier> result;
79
std::size_t step;
80
if
(version == 1) step =
sizeof
(
Channel
) ;
81
else
step =
sizeof
(
Channel
) +
sizeof
(
LArBadFeb::BitWord
);
82
83
if
(!
checkBlob
( blobp, chanSize, 0, endian, version, step, 0, log)) {
84
return
result;
85
}
86
std::size_t vecSize = blobp->size() / step;
87
result.reserve( vecSize);
88
const
void
* adr = blobp->startingAddress();
89
for
(std::size_t i=0; i< vecSize; i++) {
90
const
Channel
* ch =
static_cast<
const
Channel
*
>
( adr);
91
adr =
static_cast<
const
void
*
>
(ch+1);
92
result.emplace_back(
Identifier32
(*ch));
93
}
94
return
result;
95
}
96
97
}
endmsg
#define endmsg
Definition
AnalysisConfig_Ntuple.cxx:61
vec
std::vector< size_t > vec
Definition
CombinationsGeneratorTest.cxx:9
LArBadChanBlobUtils.h
Identifier32
Definition
Identifier32.h:28
LArBadFebEnum::BitWord
unsigned int BitWord
Definition
LArBadFebEnum.h:13
LArBadChanBlobUtils
Definition
LArBadChanBlobUtils.h:18
LArBadChanBlobUtils::checkBlob
bool checkBlob(const coral::Blob *blobp, std::size_t chanSize, std::size_t stateSizeInBlob, int endian, int, std::size_t step, std::size_t currentStateSize, MsgStream &log)
Definition
LArBadChanBlobUtils.cxx:30
LArBadChanBlobUtils::Channel
Identifier32::value_type Channel
Definition
LArBadChanBlobUtils.h:24
LArBadChanBlobUtils::decodeFebBlobV1
std::vector< HWIdentifier > decodeFebBlobV1(const coral::Blob *blobp, std::size_t chanSize, int endian, int version, MsgStream &log)
Definition
LArBadChanBlobUtils.cxx:72
LArBadChanBlobUtils::machineEndianness
int machineEndianness()
Definition
LArBadChanBlobUtils.cxx:9
LArBadChanBlobUtils::BigEndian
@ BigEndian
Definition
LArBadChanBlobUtils.h:26
LArBadChanBlobUtils::LittleEndian
@ LittleEndian
Definition
LArBadChanBlobUtils.h:26
LArBadChanBlobUtils::fillFebBlobV1
void fillFebBlobV1(const std::vector< HWIdentifier > &vec, coral::Blob &blob)
Definition
LArBadChanBlobUtils.cxx:17
Generated on
for ATLAS Offline Software by
1.17.0