153 if (nbytes == 0 ||
m_token.empty()) {
154 return(StatusCode::SUCCESS);
156 ATH_MSG_INFO(
"AthenaHDFStreamTool::putObject: source = " << source <<
", nbytes = " << nbytes);
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,
"_"); }
164 std::string className =
m_token.substr(
m_token.find(
"[PNAME=") + 7);
165 stringBefore(className,
']');
167 long long unsigned int positionCount = 0;
168 if (
m_token.find(
"[CLID=") == std::string::npos) {
172 sprintf(text,
fmt_aux, nbytes);
175 const hsize_t offset[1] = {
dataset.getInMemDataSize()};
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);
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};
197 }
else if (nbytes < 16 * 512) {
198 chunkdim[0] = 4 * 4096;
200 chunkdim[0] = (hsize_t(nbytes / 4096) + 1) * 4096;
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);
210 const hsize_t offset[1] = {
dataset.getInMemDataSize()};
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);
220 if (
m_token.find(
"[OID=") == std::string::npos) {
222 sprintf(text,
fmt_oid, 0ul, nbytes, positionCount);
227 std::size_t firstU, firstL;
228 long long unsigned int second;
233 firstL = positionCount + nbytes - second;
234 sprintf(text,
fmt_oid, firstU, firstL, second);
239 std::string entry_name = ds_name.substr(ds_name.find(
'(') + 1);
240 stringBefore(entry_name,
')');
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);
258 const hsize_t offset[1] = {
dataset.getInMemDataSize()/8};
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);
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);
284 const hsize_t offset[1] = {
dataset.getInMemDataSize()/8};
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);
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);
310 return(StatusCode::SUCCESS);
316 return(StatusCode::SUCCESS);
320 std::string clid_name =
m_token.substr(
m_token.find(
"[CLID=") + 6);
321 stringBefore(clid_name,
']');
323 stringBefore(ds_name,
']');
324 if (ds_name.empty()) {
325 return(StatusCode::SUCCESS);
327 while (ds_name.find(
'/') != std::string::npos) { ds_name = ds_name.replace(ds_name.find(
'/'), 1,
"_"); }
330 auto n = oid_name.find(
']') + 1;
332 std::size_t firstU, firstL;
333 long long unsigned int second;
334 ::sscanf(oid_name.c_str(),
fmt_oid, &firstU, &firstL, &second);
336 std::size_t aux_size = 0;
346 return(StatusCode::SUCCESS);
348 return(StatusCode::FAILURE);
351 std::string entry_name = ds_name.substr(ds_name.find(
'(') + 1);
352 stringBefore(entry_name,
')');
354 if (entry_name ==
"DataHeader") {
355 if (clid_name ==
"7BE56CEF-C866-4BEE-9348-A5F34B5F1DAD") {
356 ds_name.replace(ds_name.find(
"(DataHeader)"), 12,
"Form(DataHeaderForm)");
358 }
else if (clid_name ==
"00000000-0000-0000-0000-000000000000") {
362 m_token.replace(
m_token.find(
"[CLID="), 43,
"[CLID=4DDBD295-EFCE-472A-9EC8-15CD35A9EB8D]");
366 *target =
const_cast<char*
>(
m_token.c_str());
367 return(StatusCode::SUCCESS);
372 auto dh_entry = ds_name +
"_entry";
374 if (second + 1 >=
dataset.getInMemDataSize()/8) {
375 return(StatusCode::FAILURE);
377 const hsize_t offset[1] = {second};
378 H5::DataSpace filespace =
dataset.getSpace();
379 const hsize_t mem_size[1] = {2};
380 filespace.selectHyperslab(H5S_SELECT_SET, mem_size, offset);
381 H5::DataSpace memspace(1, mem_size);
382 long long unsigned int ds_data[2] = {0, 0};
383 dataset.read(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
384 firstL = ds_data[1] - ds_data[0];
388 if (!
m_group->exists(ds_name)) {
389 return(StatusCode::FAILURE);
392 if (second + firstL >
dataset.getInMemDataSize()) {
393 return(StatusCode::FAILURE);
395 const hsize_t offset[1] = {second};
396 H5::DataSpace filespace =
dataset.getSpace();
397 const hsize_t mem_size[1] = {firstL};
398 filespace.selectHyperslab(H5S_SELECT_SET, mem_size, offset);
399 H5::DataSpace memspace(1, mem_size);
410 return(StatusCode::SUCCESS);