ATLAS Offline Software
LArBadChanBlobUtils.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 namespace LArBadChanBlobUtils {
8 
10  {
11  int i = 1;
12  char *p = (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 }
Identifier32
Definition: Identifier32.h:25
LArBadChanBlobUtils
Definition: LArBadChanBlobUtils.h:18
sendEI_SPB.ch
ch
Definition: sendEI_SPB.py:35
get_generator_info.result
result
Definition: get_generator_info.py:21
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
LArBadChanBlobUtils::Channel
Identifier32::value_type Channel
Definition: LArBadChanBlobUtils.h:24
LArBadChanBlobUtils::BigEndian
@ BigEndian
Definition: LArBadChanBlobUtils.h:26
python.subdetectors.tile.Blob
Blob
Definition: tile.py:17
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:12
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::decodeFebBlobV1
std::vector< HWIdentifier > decodeFebBlobV1(const coral::Blob *blobp, std::size_t chanSize, int endian, int version, MsgStream &log)
Definition: LArBadChanBlobUtils.cxx:72
LArBadFebEnum::BitWord
unsigned int BitWord
Definition: LArBadFebEnum.h:13
LArBadChanBlobUtils::machineEndianness
int machineEndianness()
Definition: LArBadChanBlobUtils.cxx:9
LArBadChanBlobUtils.h
LArBadChanBlobUtils::fillFebBlobV1
void fillFebBlobV1(const std::vector< HWIdentifier > &vec, coral::Blob &blob)
Definition: LArBadChanBlobUtils.cxx:17
lumiFormat.i
int i
Definition: lumiFormat.py:92
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
get_generator_info.version
version
Definition: get_generator_info.py:33
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
LArBadChanBlobUtils::LittleEndian
@ LittleEndian
Definition: LArBadChanBlobUtils.h:26
LArCellBinning.step
step
Definition: LArCellBinning.py:158
CaloCondBlobAlgs_fillNoiseFromASCII.blob
blob
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:96