ATLAS Offline Software
Loading...
Searching...
No Matches
CaloCondBlobBase.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
8#include <algorithm>
9#include <ctime>
10
11//
12//_____________________________________________________________
14 const coral::Blob* blob)
15 : m_blob_nc(blob_nc),
16 m_blob(blob)
17 , m_isBlobOwner(false),m_sizeOfObj(0),m_nChans(0),m_nGains(0), m_pDataStart(nullptr)
18{
19 if(uint64_t(m_blob->size())>=getHdrSize()*sizeof(uint32_t)) {
20 m_sizeOfObj=static_cast<const uint32_t*>(m_blob->startingAddress())[1];
21 //m_nChans=static_cast<uint16_t*>(m_blob->startingAddress())[6];
22 //m_nGains=static_cast<uint16_t*>(m_blob->startingAddress())[7];
23 const CaloCondBlobBase& this_c = *this;
26 m_pDataStart=static_cast<const void*>(this_c.getBlobStart()+getHdrSize());
27 //std::cout << "CaloCondBlobObj: nChans=" << m_nChans << " nGains=" << m_nGains << std::endl;
28 }
29 }
30
31CaloCondBlobBase::CaloCondBlobBase(const coral::Blob& blob)
32 : CaloCondBlobBase (nullptr, &blob)
33{
34}
35
37 : CaloCondBlobBase (&blob, &blob)
38{
39}
40
41//
42//_____________________________________________________________
44{
45 //=== delete the coral::Blob if owner
46 if(m_isBlobOwner) {delete m_blob;}
47}
48
49//
50//_____________________________________________________________
52 : m_blob_nc(new coral::Blob(*other.m_blob))
54 , m_isBlobOwner(true),
56 m_nChans(other.getNChans()),
57 m_nGains(other.getNChans()),
58 m_pDataStart(static_cast<const void*>(getBlobStart()+getHdrSize()))
59{
60}
61
62//
63//_____________________________________________________________
66{
67 //=== catch self-assignment
68 if(&other == this) {return *this;}
69 if (m_isBlobOwner) delete m_blob;
70 m_blob = other.m_blob;
71 m_blob_nc = other.m_blob_nc;
72 m_isBlobOwner = false;
73 m_sizeOfObj=static_cast<const uint32_t*>(m_blob->startingAddress())[1];
76 m_pDataStart=static_cast<const void*>(getBlobStart()+getHdrSize());
77 return *this;
78}
79
80
81//
82//_____________________________________________________________
83uint32_t
85 uint16_t objVersion,
86 uint32_t objSizeUint32,
87 uint32_t nObjs,
88 uint32_t nChans,
89 uint16_t nGains,
90 const std::string& author,
91 const std::string& comment,
92 uint64_t timeStamp)
93{
95 //=== blob data length including header in bytes
96 const uint32_t dataSizeByte = (getHdrSize()+objSizeUint32*nObjs) * sizeof(uint32_t);
97
98 //=== calculate comment length, including two ASCII NULLs to end text fields
99 uint32_t commentSizeChar(0);
100 if(!author.empty() || !comment.empty() || timeStamp){
101 commentSizeChar += author.size()+comment.size()+sizeof(uint64_t) + 2;
102 //=== force comment length to end on 4 byte boundary
103 commentSizeChar += (commentSizeChar % sizeof(uint32_t)) ?
104 (sizeof(uint32_t)-(commentSizeChar % sizeof(uint32_t))) : 0;
105 }
106
107 //=== create blob
108 const uint32_t blobSizeInBytes = dataSizeByte+commentSizeChar;
109 m_blob_nc->resize(blobSizeInBytes);
110
111 //=== fill header
112 reinterpret_cast<uint16_t*>(getBlobStart())[0] = objType;
113 reinterpret_cast<uint16_t*>(getBlobStart())[1] = objVersion;
114 getBlobStart()[1] = objSizeUint32;
115 m_sizeOfObj=objSizeUint32;
116 getBlobStart()[2] = nObjs;
117 getBlobStart()[3] = packGainAndNchans(nGains,nChans);
118 m_nChans=nChans;
119 m_nGains=nGains;
120 getBlobStart()[4] = commentSizeChar/sizeof(uint32_t);
121
122 //==== fill comment fields
123 if(commentSizeChar){
124 if(!timeStamp) timeStamp = ::time(nullptr);
125 uint8_t* pChar = reinterpret_cast<uint8_t*> (getBlobStart()+dataSizeByte/sizeof(uint32_t));
126 CxxUtils::set_unaligned<uint64_t> (pChar, timeStamp);
127 std::string::const_iterator iStr = author.begin();
128 for(; iStr!=author.end(); ++iStr){ *pChar = *iStr; ++pChar; }
129 *pChar = 0;
130 for(iStr=comment.begin(); iStr!=comment.end(); ++iStr){ *(++pChar) = *iStr; }
131 *(++pChar) = 0;
132 }
133
134 m_pDataStart=static_cast<const void*>(getBlobStart()+getHdrSize());
135 return (blobSizeInBytes/sizeof(uint32_t));
136}
137
138
139uint32_t CaloCondBlobBase::packGainAndNchans(const uint32_t gain, const uint32_t nChans) {
140
141 if (gain>0x7F)
142 throw CaloCond::InvalidBlob("CaloCondBlobBase::packGainAndNchans: Gain too large");
143
144 if (nChans>0xFFFFFF)
145 throw CaloCond::InvalidBlob("CaloCondBlobBase::packGainAndNchans: Number of channels too large");
146
147 return 0x80000000 | (gain << 24) | nChans;
150uint32_t CaloCondBlobBase::unpacknGains(const uint32_t gainAndnChans) {
151 if (gainAndnChans & 0x80000000) { //new version: 24 bytes for the nChans, 7 for the gain
152 //std::cout << "CaloCondBlobBase: Reading gain from new version" << std::endl;
153 return (gainAndnChans>>24) & 0x7F;
154 }
155 else //Old version: 16 bigs for gain
156 //std::cout << "CaloCondBlobBase: Reading gain from old version" << std::endl;
157 return (gainAndnChans>>16) & 0xFFFF;
158}
159
160uint32_t CaloCondBlobBase::unpacknChans(const uint32_t gainAndnChans) {
161 if (gainAndnChans & 0x80000000) { //new version: 24 bytes for the nChans, 7 for the gain
162 //std::cout << "CaloCondBlobBase: Reading nChans from new version" << std::endl;
163 return gainAndnChans & 0xFFFFFF;
164 }
165 else //Old version: 16 bits for nChans
166 //std::cout << "CaloCondBlobBase: Reading nChangs from old version" << std::endl;
167 return gainAndnChans & 0xFFFF;
168}
169
170
171
172
173//
174//_____________________________________________________________
175std::string
177{
178 if(!getCommentSizeUint32()) return std::string("");
179 const char* iBeg =
180 reinterpret_cast<const char*>(getBlobStart()+getHdrSize() +
182 sizeof(uint64_t)/sizeof(uint32_t));
183 return std::string(iBeg);
184}
185
186
187//
188//_____________________________________________________________
189std::string
191{
192 if(!getCommentSizeUint32()) return std::string("");
193 const char* iBeg =
194 reinterpret_cast<const char*>(getBlobStart()+getHdrSize() +
196 sizeof(uint64_t)/sizeof(uint32_t));
197 const char* iEnd = iBeg + getCommentSizeChar();
198 iBeg = std::find(iBeg,iEnd,0);
199 return std::string(++iBeg);
200}
201
202//
203//_____________________________________________________________
204std::string
206{
207 if(!getCommentSizeUint32()) return std::string("");
208 ::time_t timeStamp = getTimeStamp();
209 char buf[26];
210 char* iBeg = ::ctime_r(&timeStamp, buf);
211 char* iEnd = iBeg;
212 while(*iEnd!='\n'){++iEnd;}
213 return std::string(iBeg,iEnd-iBeg);
214}
215
216//
217//_____________________________________________________________
218std::string
220{
221 if(!getCommentSizeUint32()) return std::string("");
222 return getAuthor()+" ("+getDate()+"): "+getComment();
223}
224
225
226//
227//_____________________________________________________________
228void
229CaloCondBlobBase::dumpHeader(std::ostream& stm) const
230{
231 stm << "This is a " << CaloCondType::getClassName(getObjType()) << std::endl;
232 stm << "ObjType : " << getObjType() << std::endl;
233 stm << "ObjVersion : " << getObjVersion() << std::endl;
234 stm << "ObjSize [bytes]: " << getObjSizeByte() << std::endl;
235 stm << "NObjs : " << getNObjs() << std::endl;
236 stm << "NChannels : " << getNChans() << std::endl;
237 stm << "NGains : " << getNGains() << std::endl;
239 stm << "=== No comment available ===" << std::endl;
240 }
241 else{
242 stm << "Author : " << getAuthor() << std::endl;
243 stm << "Date : " << getDate() << " ("<< getTimeStamp() << ")" << std::endl;
244 stm << "Comment: : " << getComment() << std::endl;
245 }
246}
This class provides the core BLOB infrastructure.
uint16_t getObjType() const
Returns the BLOB object type.
std::string getDate() const
Returns the date of the comment as string (derived from timestamp)
CaloCondBlobBase & operator=(const CaloCondBlobBase &other)
Assignment operator.
virtual ~CaloCondBlobBase()
Dtor.
uint32_t getNGains() const
Returns the number of gains stored for each channel.
uint64_t getTimeStamp() const
Returns the unix timestamp of the comment (seconds since 1.1.1970)
uint32_t getObjSizeUint32() const
Returns the size of a data object in units of uint32_t.
const uint32_t * getBlobStart() const
Returns the BLOB start address as uint32_t pointer.
static uint32_t packGainAndNchans(const uint32_t gain, const uint32_t nChans)
bool m_isBlobOwner
Do I own the BLOB?
std::string getAuthor() const
Returns the comment author.
static uint32_t unpacknGains(const uint32_t gainAndnChans)
uint32_t getCommentSizeUint32() const
Returns the space occupied by the comment fields in units of uint32_t.
unsigned m_sizeOfObj
Chache of some frequently-used numbers.
static uint32_t unpacknChans(const uint32_t gainAndnChans)
void dumpHeader(std::ostream &stm) const
Prints the BLOB header summary information.
uint32_t createBlob(uint16_t objType, uint16_t objVersion, uint32_t objSizeUint32, uint32_t nObjs, uint32_t nChans, uint16_t nGains, const std::string &author="", const std::string &comment="", uint64_t timeStamp=0)
(re-)creation of the referenced BLOB object.
CaloCondBlobBase(const CaloCondBlobBase &other)
Copy Ctor.
uint32_t getNObjs() const
Returns the number of data objects stored int the BLOB.
std::string getComment() const
Returns the actual comment.
uint32_t getNChans() const
Returns the number of channels stored in the BLOB.
uint32_t getObjSizeByte() const
Returns the size of a data object in units of bytes.
uint16_t getObjVersion() const
Returns the BLOB object version.
uint32_t getCommentSizeChar() const
Returns the space occupied by the comment fields in units of chars.
coral::Blob * m_blob_nc
Non-const reference to the BLOB.
std::string getFullComment() const
Returns a formated string build from all comment fields.
unsigned int getHdrSize() const
Returns the size of the header in units of uint32_t.
const coral::Blob * m_blob
Const reference to the BLOB (always there)
const void * m_pDataStart
static std::string getClassName(CaloCondType::TYPE type)
Returns the class name.
Thrown if coral::Blob does not conform with expected structure.
void set_unaligned< uint64_t >(uint8_t *ATH_RESTRICT &p, uint64_t val)
Write little-endian values through possibly unaligned pointers.