11 #include "GaudiKernel/FileIncident.h"
21 static const char*
const fmt_oid =
"[OID=%08lX%08lX-%016llX]";
22 static const char*
const fmt_aux =
"[AUX=%08lX]";
26 stringBefore(std::string &
s,
char sc){
28 if (
n!=std::string::npos)
s.resize(
n);
35 const std::string&
name,
45 m_incidentSvc(
"IncidentSvc",
name) {
46 declareInterface<IAthenaIPCTool>(
this);
57 return(StatusCode::FAILURE);
62 return(StatusCode::FAILURE);
64 return(StatusCode::SUCCESS);
76 return(StatusCode::FAILURE);
89 m_file =
new H5::H5File(
"test.h5", H5F_ACC_TRUNC );
92 m_file =
new H5::H5File(
"test.h5", H5F_ACC_RDONLY );
96 return(StatusCode::SUCCESS);
105 StatusCode AthenaHDFStreamTool::putEvent(
long,
const void* , std::size_t,
unsigned int)
const {
107 return(StatusCode::FAILURE);
113 const std::string dh_entry =
"POOLContainer(DataHeader)_entry";
116 FileIncident endFileIncident(
name(),
"EndInputFile",
"HDF:test.h5");
119 return(StatusCode::RECOVERABLE);
123 H5::DataSpace filespace =
dataset.getSpace();
124 const hsize_t mem_size[1] = {2};
125 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
126 H5::DataSpace memspace(1, mem_size);
127 long long unsigned int ds_data[2] = {0, 0};
128 dataset.read(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
129 std::size_t nbytes = ds_data[1] - ds_data[0];
130 m_token =
"[DB=00000000-0000-0000-0000-000000000000][CNT=POOLContainer(DataHeader)][CLID=4DDBD295-EFCE-472A-9EC8-15CD35A9EB8D][TECH=00000401]";
140 return(StatusCode::SUCCESS);
148 FileIncident beginFileIncident(
name(),
"BeginInputFile",
"HDF:test.h5");
151 return(StatusCode::SUCCESS);
156 if (nbytes == 0 ||
m_token.empty()) {
157 return(StatusCode::SUCCESS);
159 ATH_MSG_INFO(
"AthenaHDFStreamTool::putObject: source = " << source <<
", nbytes = " << nbytes);
161 if (
m_token.find(
"[CONT=") != std::string::npos)
m_token.replace(
m_token.find(
"[CONT="), 6,
"[CNT=");
163 stringBefore(ds_name,
']');
164 while (ds_name.find(
"/") != std::string::npos) { ds_name = ds_name.replace(ds_name.find(
"/"), 1,
"_"); }
170 long long unsigned int positionCount = 0;
171 if (
m_token.find(
"[CLID=") == std::string::npos) {
175 sprintf(
text, fmt_aux, nbytes);
179 positionCount =
offset[0];
180 const hsize_t ds_size[1] = {
offset[0] + 15};
182 H5::DataSpace filespace =
dataset.getSpace();
183 const hsize_t mem_size[1] = {15};
184 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
185 H5::DataSpace memspace(1, mem_size);
186 dataset.write(
text, H5::PredType::NATIVE_CHAR, memspace, filespace);
190 if (!
m_group->exists(ds_name)) {
191 const hsize_t maxdim[1] = {H5S_UNLIMITED};
192 const hsize_t ds_size[1] = {nbytes};
193 H5::DataSpace filespace(1, ds_size, maxdim);
194 H5::DSetCreatPropList ds_prop;
195 hsize_t chunkdim[1] = {nbytes};
200 }
else if (nbytes < 16 * 512) {
201 chunkdim[0] = 4 * 4096;
203 chunkdim[0] = (
int(nbytes / 4096) + 1) * 4096;
206 ds_prop.setChunk(1, chunkdim);
207 char fill_val[1] = {0};
208 ds_prop.setFillValue(H5::PredType::NATIVE_CHAR, fill_val);
209 H5::DataSet
dataset =
m_group->createDataSet(ds_name, H5::PredType::NATIVE_CHAR, filespace, ds_prop);
210 dataset.write(source, H5::PredType::NATIVE_CHAR);
214 positionCount =
offset[0];
215 const hsize_t ds_size[1] = {
offset[0] + nbytes};
217 H5::DataSpace filespace =
dataset.getSpace();
218 const hsize_t mem_size[1] = {nbytes};
219 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
220 H5::DataSpace memspace(1, mem_size);
221 dataset.write(source, H5::PredType::NATIVE_CHAR, memspace, filespace);
223 if (
m_token.find(
"[OID=") == std::string::npos) {
225 sprintf(
text, fmt_oid, 0ul, nbytes, positionCount);
230 std::size_t firstU, firstL;
231 long long unsigned int second;
232 ::sscanf(
m_token.substr(
m_token.find(
"[OID="), 40).c_str(), fmt_oid, &firstU, &firstL, &
second);
236 firstL = positionCount + nbytes -
second;
237 sprintf(
text, fmt_oid, firstU, firstL,
second);
242 std::string entry_name = ds_name.substr(ds_name.find(
'(') + 1);
243 stringBefore(entry_name,
')');
245 if (entry_name ==
"DataHeader" || entry_name ==
"DataHeaderForm") {
246 auto dh_entry = ds_name +
"_entry";
247 if (!
m_group->exists(dh_entry)) {
248 const hsize_t maxdim[1] = {H5S_UNLIMITED};
249 const hsize_t ds_size[1] = {2};
250 H5::DataSpace filespace(1, ds_size, maxdim);
251 H5::DSetCreatPropList ds_prop;
252 const hsize_t chunkdim[1] = {512};
253 ds_prop.setChunk(1, chunkdim);
254 char fill_val[1] = {0};
255 ds_prop.setFillValue(H5::PredType::NATIVE_ULLONG, fill_val);
256 H5::DataSet
dataset =
m_group->createDataSet(dh_entry, H5::PredType::NATIVE_ULLONG, filespace, ds_prop);
257 long long unsigned int ds_data[2] = {positionCount, positionCount + nbytes};
258 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG);
262 const hsize_t ds_size[1] = {
offset[0] + 1};
264 H5::DataSpace filespace =
dataset.getSpace();
265 const hsize_t mem_size[1] = {1};
266 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
267 H5::DataSpace memspace(1, mem_size);
268 long long unsigned int ds_data[1] = {positionCount + nbytes};
269 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
271 if (entry_name ==
"DataHeader") {
272 auto dh_form_entry = ds_name +
"_form_entry";
273 if (!
m_group->exists(dh_form_entry)) {
274 const hsize_t maxdim[1] = {H5S_UNLIMITED};
275 const hsize_t ds_size[1] = {1};
276 H5::DataSpace filespace(1, ds_size, maxdim);
277 H5::DSetCreatPropList ds_prop;
278 const hsize_t chunkdim[1] = {512};
279 ds_prop.setChunk(1, chunkdim);
280 char fill_val[1] = {0};
281 ds_prop.setFillValue(H5::PredType::NATIVE_ULLONG, fill_val);
282 H5::DataSet
dataset =
m_group->createDataSet(dh_form_entry, H5::PredType::NATIVE_ULLONG, filespace, ds_prop);
283 long long unsigned int ds_data[1] = {0};
284 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG);
288 const hsize_t ds_size[1] = {
offset[0] + 1};
290 H5::DataSpace filespace =
dataset.getSpace();
291 const hsize_t mem_size[1] = {1};
292 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
293 H5::DataSpace memspace(1, mem_size);
294 auto dh_form_entry_name = ds_name.substr(0, ds_name.find(
'(')) +
"Form(DataHeaderForm)_entry";
295 H5::DataSet dh_form_dataset =
m_group->openDataSet(dh_form_entry_name);
296 long long unsigned int ds_data[1] = {dh_form_dataset.getInMemDataSize()/8 - 1};
297 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
300 if (entry_name ==
"DataHeaderForm") {
301 auto dh_entry_name = ds_name.substr(0, ds_name.find(
'(') - 4) +
"(DataHeader)_form_entry";
303 const hsize_t
offset[1] = {
dataset.getInMemDataSize()/8 - 1};
304 H5::DataSpace filespace =
dataset.getSpace();
305 const hsize_t mem_size[1] = {1};
306 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
307 H5::DataSpace memspace(1, mem_size);
308 H5::DataSet dh_form_dataset =
m_group->openDataSet(ds_name +
"_entry");
309 long long unsigned int ds_data[1] = {dh_form_dataset.getInMemDataSize()/8 - 1};
310 dataset.write(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
313 return(StatusCode::SUCCESS);
319 return(StatusCode::SUCCESS);
323 std::string clid_name =
m_token.substr(
m_token.find(
"[CLID=") + 6);
324 stringBefore(clid_name,
']');
326 stringBefore(ds_name,
']');
327 if (ds_name.empty()) {
328 return(StatusCode::SUCCESS);
330 while (ds_name.find(
'/') != std::string::npos) { ds_name = ds_name.replace(ds_name.find(
'/'), 1,
"_"); }
333 auto n = oid_name.find(
']') + 1;
335 std::size_t firstU, firstL;
336 long long unsigned int second;
337 ::sscanf(oid_name.c_str(), fmt_oid, &firstU, &firstL, &
second);
339 std::size_t aux_size = 0;
349 return(StatusCode::SUCCESS);
351 return(StatusCode::FAILURE);
354 std::string entry_name = ds_name.substr(ds_name.find(
'(') + 1);
355 stringBefore(entry_name,
')');
357 if (entry_name ==
"DataHeader") {
358 if (clid_name ==
"7BE56CEF-C866-4BEE-9348-A5F34B5F1DAD") {
359 ds_name.replace(ds_name.find(
"(DataHeader)"), 12,
"Form(DataHeaderForm)");
361 }
else if (clid_name ==
"00000000-0000-0000-0000-000000000000") {
365 m_token.replace(
m_token.find(
"[CLID="), 43,
"[CLID=4DDBD295-EFCE-472A-9EC8-15CD35A9EB8D]");
370 return(StatusCode::SUCCESS);
375 auto dh_entry = ds_name +
"_entry";
378 return(StatusCode::FAILURE);
381 H5::DataSpace filespace =
dataset.getSpace();
382 const hsize_t mem_size[1] = {2};
383 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
384 H5::DataSpace memspace(1, mem_size);
385 long long unsigned int ds_data[2] = {0, 0};
386 dataset.read(ds_data, H5::PredType::NATIVE_ULLONG, memspace, filespace);
387 firstL = ds_data[1] - ds_data[0];
391 if (!
m_group->exists(ds_name)) {
392 return(StatusCode::FAILURE);
396 return(StatusCode::FAILURE);
399 H5::DataSpace filespace =
dataset.getSpace();
400 const hsize_t mem_size[1] = {firstL};
401 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
402 H5::DataSpace memspace(1, mem_size);
408 ::sscanf(
m_read_data + firstL - 15, fmt_aux, &nbytes);
413 return(StatusCode::SUCCESS);
418 std::size_t firstU, firstL;
419 long long unsigned int second;
420 ::sscanf(
m_token.substr(
m_token.find(
"[OID="), 40).c_str(), fmt_oid, &firstU, &firstL, &
second);
422 stringBefore(ds_name,
']');
423 while (ds_name.find(
'/') != std::string::npos) { ds_name = ds_name.replace(ds_name.find(
'/'), 1,
"_"); }
425 if (firstU > 0 || ds_name.substr(ds_name.length() - 5, 4) ==
"Aux.") {
426 if (firstU == 0) firstU = firstL;
428 sprintf(
text, fmt_aux, firstU);
432 const hsize_t ds_size[1] = {
offset[0] + 15};
434 H5::DataSpace filespace =
dataset.getSpace();
435 const hsize_t mem_size[1] = {15};
436 filespace.selectHyperslab(H5S_SELECT_SET, mem_size,
offset);
437 H5::DataSpace memspace(1, mem_size);
438 dataset.write(
text, H5::PredType::NATIVE_CHAR, memspace, filespace);
441 sprintf(
text, fmt_oid, firstU, firstL,
second);
446 std::string entry_name = ds_name.substr(ds_name.find(
'(') + 1);
447 stringBefore(entry_name,
')');
448 if (entry_name ==
"DataHeaderForm") {
451 *tokenString =
m_token.c_str();
452 return(StatusCode::SUCCESS);
461 return(StatusCode::SUCCESS);