ATLAS Offline Software
Loading...
Searching...
No Matches
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
6
7namespace LArBadChanBlobUtils {
8
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}
#define endmsg
std::vector< size_t > vec
unsigned int BitWord
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)
Identifier32::value_type Channel
std::vector< HWIdentifier > decodeFebBlobV1(const coral::Blob *blobp, std::size_t chanSize, int endian, int version, MsgStream &log)
void fillFebBlobV1(const std::vector< HWIdentifier > &vec, coral::Blob &blob)