152 {
153 if (nbytes == 0 ||
m_token.empty()) {
154 return(StatusCode::SUCCESS);
155 }
156 ATH_MSG_INFO(
"AthenaHDFStreamTool::putObject: source = " << source <<
", nbytes = " << nbytes);
157
158 if (
m_token.find(
"[CONT=") != std::string::npos)
m_token.replace(
m_token.find(
"[CONT="), 6,
"[CNT=");
160 stringBefore(ds_name,']');
161 while (ds_name.find("/") != std::string::npos) { ds_name = ds_name.replace(ds_name.find("/"), 1, "_"); }
162
164 std::string className =
m_token.substr(
m_token.find(
"[PNAME=") + 7);
165 stringBefore(className, ']');
166
167 long long unsigned int positionCount = 0;
168 if (
m_token.find(
"[CLID=") == std::string::npos) {
170 } else {
172 sprintf(text,
fmt_aux, nbytes);
176 positionCount =
offset[0];
177 const hsize_t ds_size[1] = {
offset[0] + 15};
179 H5::DataSpace filespace =
dataset.getSpace();
180 const hsize_t mem_size[1] = {15};
181 filespace.selectHyperslab(H5S_SELECT_SET, mem_size, offset);
182 H5::DataSpace memspace(1, mem_size);
183 dataset.write(text, H5::PredType::NATIVE_CHAR, memspace, filespace);
184 }
185
186
187 if (!
m_group->exists(ds_name)) {
188 const hsize_t maxdim[1] = {H5S_UNLIMITED};
189 const hsize_t ds_size[1] = {nbytes};
190 H5::DataSpace filespace(1, ds_size, maxdim);
191 H5::DSetCreatPropList ds_prop;
192 hsize_t chunkdim[1] = {nbytes};
195 if (nbytes < 512) {
196 chunkdim[0] = 4096;
197 } else if (nbytes < 16 * 512) {
198 chunkdim[0] = 4 * 4096;
199 } else {
200 chunkdim[0] = (hsize_t(nbytes / 4096) + 1) * 4096;
201 }
202 }
203 ds_prop.setChunk(1, chunkdim);
204 char fill_val[1] = {0};
205 ds_prop.setFillValue(H5::PredType::NATIVE_CHAR, fill_val);
206 H5::DataSet
dataset =
m_group->createDataSet(ds_name, H5::PredType::NATIVE_CHAR, filespace, ds_prop);
207 dataset.write(source, H5::PredType::NATIVE_CHAR);
208 } else {
211 positionCount =
offset[0];
212 const hsize_t ds_size[1] = {
offset[0] + nbytes};
214 H5::DataSpace filespace =
dataset.getSpace();
215 const hsize_t mem_size[1] = {nbytes};
216 filespace.selectHyperslab(H5S_SELECT_SET, mem_size, offset);
217 H5::DataSpace memspace(1, mem_size);
218 dataset.write(source, H5::PredType::NATIVE_CHAR, memspace, filespace);
219 }
220 if (
m_token.find(
"[OID=") == std::string::npos) {
222 sprintf(text,
fmt_oid, 0ul, nbytes, positionCount);
225 } else {
227 std::size_t firstU, firstL;
228 long long unsigned int second;
230 if (firstU == 0ul) {
231 firstU = firstL;
232 }
233 firstL = positionCount + nbytes -
second;
234 sprintf(text,
fmt_oid, firstU, firstL, second);
237 }
238
239 std::string entry_name = ds_name.substr(ds_name.find('(') + 1);
240 stringBefore(entry_name,')');
241
242 if (entry_name == "DataHeader" || entry_name == "DataHeaderForm") {
243 auto dh_entry = ds_name + "_entry";
244 if (!
m_group->exists(dh_entry)) {
245 const hsize_t maxdim[1] = {H5S_UNLIMITED};
246 const hsize_t ds_size[1] = {2};
247 H5::DataSpace filespace(1, ds_size, maxdim);
248 H5::DSetCreatPropList ds_prop;
249 const hsize_t chunkdim[1] = {512};
250 ds_prop.setChunk(1, chunkdim);
251 char fill_val[1] = {0};
252 ds_prop.setFillValue(H5::PredType::NATIVE_ULLONG, fill_val);
253 H5::DataSet
dataset =
m_group->createDataSet(dh_entry, H5::PredType::NATIVE_ULLONG, filespace, ds_prop);
254 long long unsigned int ds_data[2] = {positionCount, positionCount + nbytes};
255 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG);
256 } else {
259 const hsize_t ds_size[1] = {
offset[0] + 1};
261 H5::DataSpace filespace =
dataset.getSpace();
262 const hsize_t mem_size[1] = {1};
263 filespace.selectHyperslab(H5S_SELECT_SET, mem_size, offset);
264 H5::DataSpace memspace(1, mem_size);
265 long long unsigned int ds_data[1] = {positionCount + nbytes};
266 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
267 }
268 if (entry_name == "DataHeader") {
269 auto dh_form_entry = ds_name + "_form_entry";
270 if (!
m_group->exists(dh_form_entry)) {
271 const hsize_t maxdim[1] = {H5S_UNLIMITED};
272 const hsize_t ds_size[1] = {1};
273 H5::DataSpace filespace(1, ds_size, maxdim);
274 H5::DSetCreatPropList ds_prop;
275 const hsize_t chunkdim[1] = {512};
276 ds_prop.setChunk(1, chunkdim);
277 char fill_val[1] = {0};
278 ds_prop.setFillValue(H5::PredType::NATIVE_ULLONG, fill_val);
279 H5::DataSet
dataset =
m_group->createDataSet(dh_form_entry, H5::PredType::NATIVE_ULLONG, filespace, ds_prop);
280 long long unsigned int ds_data[1] = {0};
281 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG);
282 } else {
285 const hsize_t ds_size[1] = {
offset[0] + 1};
287 H5::DataSpace filespace =
dataset.getSpace();
288 const hsize_t mem_size[1] = {1};
289 filespace.selectHyperslab(H5S_SELECT_SET, mem_size, offset);
290 H5::DataSpace memspace(1, mem_size);
291 auto dh_form_entry_name = ds_name.substr(0, ds_name.find('(')) + "Form(DataHeaderForm)_entry";
292 H5::DataSet dh_form_dataset =
m_group->openDataSet(dh_form_entry_name);
293 long long unsigned int ds_data[1] = {dh_form_dataset.getInMemDataSize()/8 - 1};
294 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
295 }
296 }
297 if (entry_name == "DataHeaderForm") {
298 auto dh_entry_name = ds_name.substr(0, ds_name.find('(') - 4) + "(DataHeader)_form_entry";
300 const hsize_t
offset[1] = {
dataset.getInMemDataSize()/8 - 1};
301 H5::DataSpace filespace =
dataset.getSpace();
302 const hsize_t mem_size[1] = {1};
303 filespace.selectHyperslab(H5S_SELECT_SET, mem_size, offset);
304 H5::DataSpace memspace(1, mem_size);
305 H5::DataSet dh_form_dataset =
m_group->openDataSet(ds_name +
"_entry");
306 long long unsigned int ds_data[1] = {dh_form_dataset.getInMemDataSize()/8 - 1};
307 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
308 }
309 }
310 return(StatusCode::SUCCESS);
311}
constexpr void toString(std::span< char, StrLen > buf, bool uppercase=true) const noexcept
Automatic conversion to string representation.
static TScopeAdapter ByNameNoQuiet(const std::string &name, Bool_t load=kTRUE)
static Guid guid(const TypeH &id)
Determine Guid (normalized string form) from reflection type.
const char * getEventDataName()
const char * getEventTagName()