18 #include "TObjString.h" 19 #include "TObjArray.h" 20 #include "TDataType.h" 29 : fxTypeName(name), fxType(nullptr), fxDataSet(), fxDataSpace(nullptr), fxFileSpace(0), fiEntries(0),
30 fxData(nullptr), fiParentOffset(0), fiDataSize(datasize), fiReadOffset(0), fxEvent(nullptr),
31 fxParentSource(nullptr), fbDataSetExists(false), fbDataSetActive(false)
34 fxType =
new H5::CompType(datasize);
35 go4hdfdbg(
"TGo4HDF5DataHandle DDD created %s for size %ld \n",
fxTypeName.Data(), datasize);
55 fxType->insertMember(name, offset, new_member);
100 go4hdfdbg(
"TGo4HDF5DataHandle SetObjectPointer for %s with memptr 0x%lx and parentoffset 0x%lx has fxData:0x%lx\n",
114 go4hdfdbg(
"TTTTTTTT TGo4HDF5DataHandle %s - SetTopEvent sets pointer to %ld \n",
fxTypeName.Data(),
166 hsize_t offset[1]= {sequencenum};
167 hsize_t onerow[1] ={1};
168 fxFileSpace.selectHyperslab( H5S_SELECT_SET, onerow, offset );
172 go4hdfdbg(
"TGo4HDF5DataHandle::Read of %s has selected hyperslab for onerow:[%ld] offset:[%ld]\n",
173 fxTypeName.Data(),(
unsigned long) onerow[0], (
unsigned long) offset[0]);
183 entry->
Read(sequencenum, file);
193 go4hdfdbg(
"TGo4HDF5DataHandle::Write %s base function will extend dataset for %lld \n",
fxTypeName.Data(), sequencenum);
194 hsize_t offset[1] = { sequencenum };
195 hsize_t nextsize[1] = { sequencenum + 1 };
200 hsize_t onerow[1] = { 1 };
201 fxFileSpace.selectHyperslab(H5S_SELECT_SET, onerow, offset);
213 entry->
Write(sequencenum, file);
225 go4hdfdbg(
"TGo4HDF5BasicDataHandle ctor\n");
242 go4hdfdbg(
"TGo4HDF5DataHandle: AllocReadBuffer has created read buffer 0x%lx for size %ld \n",
254 hsize_t dims[1] = { 1};
255 hsize_t maxdims[1] = {H5S_UNLIMITED};
256 fxDataSpace=
new H5::DataSpace(rank, dims, maxdims);
259 hsize_t onerow[1] ={1};
260 hsize_t offset[1]= {0};
261 fxDataSpace->selectHyperslab( H5S_SELECT_SET, onerow, offset );
275 H5T_class_t type_class = fxDataSet.getTypeClass();
277 if( type_class == H5T_COMPOUND)
279 intype= fxDataSet.getCompType();
281 go4hdfdbg(
"TGo4HDF5DataHandle::BuildReadDataSet finds in file compound type of size %ld \n", intype.getSize());
283 else if( type_class == H5T_VLEN)
285 H5::VarLenType vtype = fxDataSet.getVarLenType();
286 H5::DataType entrytype = vtype.getSuper();
290 H5T_class_t entry_class = entrytype.getClass();
291 go4hdfdbg(
"TGo4HDF5DataHandle::BuildReadDataSet finds in file vlen type of size %ld, with entry class %d, size %ld \n",
292 vtype.getSize(), entry_class, entrytype.getSize());
293 if( entry_class == H5T_COMPOUND)
296 H5::DataType* ptype=&entrytype;
297 H5::CompType* entrycomp =
static_cast<H5::CompType*
>(ptype);
300 go4hdfdbg(
"TGo4HDF5DataHandle::BuildReadDataSet uses compound entry of vlen dtype %d \n", entry_class );
304 go4hdfdatahandlethrow(
"TGo4HDF5DataHandle: BuildReadDataSet - could not assign component entry of varlen data type !\n");
310 go4hdfdatahandlethrow(
"TGo4HDF5DataHandle: BuildReadDataSet - varlen data type without compound, but contains class %d!\n", entry_class);
315 go4hdfdatahandlethrow(
"TGo4HDF5DataHandle: BuildReadDataSet - file contains no compound or varlen data type, but type %d!\n",type_class)
321 hsize_t dims_out[frank];
322 fxFileSpace.getSimpleExtentDims( dims_out,
nullptr);
323 go4hdfdbg(
"TGo4HDF5DataHandle::BuildReadDataSet file dataspace has rank %d, dimensions:%d, #1. dimension=%ld \n",
325 fxFileSpace.getSimpleExtentDims(dims_out,
nullptr),
326 (
unsigned long)(dims_out[0]));
331 int nfilemembers= intype.getNmembers ();
332 int neventmembers=
fxType->getNmembers ();
335 go4hdfdbg(
"Type comparison: number of compound members: file %d, event %d\n",nfilemembers, neventmembers);
338 for (
int i = 0; i < nfilemembers; ++i)
340 H5::DataType mem_type=intype.getMemberDataType(i);
341 go4hdfdbg(
"\t %d: name:%s class:%s", i, intype.getMemberName(i).c_str(), mem_type.fromClass().c_str());
342 H5T_class_t mem_class = intype.getMemberClass(i);
343 if (mem_class == H5T_ARRAY)
345 H5::ArrayType artyp = intype.getMemberArrayType(i);
346 int ardim = artyp.getArrayNDims();
348 artyp.getArrayDims(dims);
349 go4hdfdbg(
" array dimensions:%d [", ardim);
350 for (
int j = 0; j < ardim; ++j)
358 go4hdfdbg(
"Dump Type from event structure:\n");
359 for (
int i = 0; i < neventmembers; ++i)
361 H5::DataType mem_type=
fxType->getMemberDataType(i);
362 go4hdfdbg(
"\t %d: name:%s class:%s", i, intype.getMemberName(i).c_str(), mem_type.fromClass().c_str());
363 H5T_class_t mem_class =
fxType->getMemberClass(i);
364 if (mem_class == H5T_ARRAY)
366 H5::ArrayType artyp =
fxType->getMemberArrayType(i);
367 int ardim = artyp.getArrayNDims();
369 artyp.getArrayDims(dims);
370 go4hdfdbg(
"array dimensions:%d [", ardim);
371 for (
int j = 0; j < ardim; ++j)
373 go4hdfdbg(
"%lu", (
unsigned long) dims[j]);
384 TString
msg= TString::Format(
"BuildReadDataSet type mismatch between event structure(%s) and input from file (%s)\n",
385 fxType->fromClass().c_str(), intype.fromClass().c_str());
406 go4hdfdbg(
"TGo4HDF5BasicDataHandle: BuildWriteDataset for event set %s\n",
fxTypeName.Data());
408 hsize_t dims[1] = {1};
409 hsize_t maxdims[1] = {H5S_UNLIMITED};
410 fxDataSpace =
new H5::DataSpace(rank, dims, maxdims);
412 H5::DSetCreatPropList cparms;
413 hsize_t chunk_dims[1] = {1};
414 cparms.setChunk(rank, chunk_dims);
441 memcpy(target, source, copylen);
444 printf(
"Copy %ld bytes from %lx to %lx, fiReadOffset=%ld, fiDataSize=%ld \n", copylen, (
long)source, (
long)target,
468 go4hdfdbg(
"TGo4HDF5CompositeDataHandle ctor use go4 composite event component\n");
509 go4hdfdbg(
"TGo4HDF5VectorDataHandle ctor \n");
519 go4hdfdbg(
"TGo4HDF5VectorDataHandle ctor, typename is %s\n",
551 char **p_collection = (
char **)
fxData;
552 char **p_begin_ptr = p_collection;
553 char **p_end_ptr = p_collection + 1;
556 go4hdfdbg(
"TGo4HDF5VectorDataHandle SetObjectPointer has fxData=0x%lx elementsize=%ld\n",
568 static unsigned debugcount = 0;
569 char **p_cap_ptr = p_collection + 2;
571 if (debugcount < 10000)
574 "TGo4HDF5VectorDataHandle SetObjectPointer for count %d has collection size: %ld capacity: %ld pointer to buffer 0x%lx, ACTIVE=%d\n",
597 go4hdfdbg(
"TGo4HDF5VectorDataHandle: BuildWriteDataset for collection set %s \n",
fxTypeName.Data());
600 hsize_t dims[1] = { 1};
601 hsize_t maxdims[1] = {H5S_UNLIMITED};
602 fxDataSpace=
new H5::DataSpace(rank, dims, maxdims);
603 H5::DSetCreatPropList cparms;
604 hsize_t chunk_dims[1] ={1};
605 cparms.setChunk( rank, chunk_dims );
638 go4hdfdbg(
"TGo4HDF5VectorDataHandle::Read LLLL length after reading is %ld, buffer is 0x%lx \n",
694 TString vectorhandle = TString::Format(
"myevent->%s",
fxMemberHandle.Data());
695 TString copycom = TString::Format(
"%s * myevent= (%s *) %ld; %s.insert(%s.end(), (%s *) %ld, (%s *) %ld)",
699 go4hdfdbg(
"TGo4HDF5VectorDataHandle::Read will use command: %s \n", copycom.Data());
700 gROOT->ProcessLineFast(copycom.Data());
705 char **p_collection = (
char **)
fxData;
706 char **p_begin_ptr = p_collection;
707 char **p_end_ptr = p_collection + 1;
708 char **p_cap_ptr = p_collection + 2;
714 "TGo4HDF5VectorDataHandle::Read after INSERT has collection size: %ld capacity: %ld pointer to buffer 0x%lx, end: 0x%lx cap: 0x%lx\n",
715 len, cap, (
unsigned long) *p_begin_ptr, (
unsigned long) *p_end_ptr, (
unsigned long) *p_cap_ptr);
741 go4hdfdbg(
"TGo4HDF5VectorDataHandle::Write DO NOT WRITE inactive %s collection\n",
fxTypeName.Data());
754 go4hdfdbg(
"TGo4HDF5SubVectorDataHandle ctor \n");
771 size_t innersize=datatype.Size();
783 TString fullname= TString::Format(
"%s[%d]",
GetTypeName(), ix );
784 TString membername = TString::Format(
"%s[%d]",
fxMemberHandle.Data(),ix);
787 "TGo4HDF5SubVectorDataHandle SetObjectPointer updating element %s, inner class is %s\n",
794 TString memberclass = TString::Format(
"vector<%s>",
fxInnerClassName.Data());
795 TString searchname = TString::Format(
"%s[%s]",fullname.Data(), memberclass.Data());
800 "TGo4HDF5SubVectorDataHandle SetObjectPointer finds element %s, already in subcomponents\n",
802 subhandle->SetActive(
true);
807 "TGo4HDF5SubVectorDataHandle SetObjectPointer creates new subcomponent %s \n",
810 subhandle =
AddSubMember(fullname.Data(), innersize, memberclass.Data());
816 subhandle->SetActive(
true);
819 void *super =
Data();
828 char *subvector = cursor;
830 size_t delta = (
char *) cursor - (
char *) super;
831 go4hdfdbg(
"TGo4HDF5SubVectorDataHandle SetObjectPointer sets parent offset %ld (subvector:0x%lx, super:0x%lx) cursor was 0x%lx\n",
832 delta, (
unsigned long) subvector, (
unsigned long) super, (
unsigned long) cursor);
834 subhandle->SetParentOffset(delta);
835 subhandle->SetObjectPointer(super);
857 go4hdfdbg(
"TGo4HDF5SubVectorDataHandle: BuildWriteDataset NOP for collection set %s \n",
fxTypeName.Data());
889 if (strstr(type,
"vector<vector"))
892 TString theName(name);
893 TString theCollection(type);
895 theName = theName.Append(theCollection);
899 TObjArray *tokens = theCollection.Tokenize(
"<");
902 TObjString* part =
dynamic_cast<TObjString*
>(tokens->At(2));
905 TString rtype = part->GetString();
906 TObjArray *stokens = rtype.Tokenize(
">");
909 TObjString* spart =
dynamic_cast<TObjString*
>(stokens->At(0));
910 TString valuetype = spart->GetString();
912 go4hdfdbg(
"TGo4HDF5DataHandleFactory::CreateDataHandle for %s sets inner class name to %s\n", type,
918 go4hdfdbg(
"TGo4HDF5DataHandleFactory::CreateDataHandle for %s could not evaluate valuetype from %ss\n", type,
919 theCollection.Data());
924 go4hdfdbg(
"TGo4HDF5DataHandleFactory::CreateDataHandle for %s could not evaluate valuetype from %ss\n", type,
925 theCollection.Data());
931 else if (strstr(type,
"vector"))
934 TString theName(name);
935 TString theCollection(type);
937 theName = theName.Append(theCollection);
943 else if (strstr(type,
"Go4Comp"))
void SetInnerClassName(const char *nm)
void SetActive(Bool_t on)
void Read(hsize_t sequencenum, H5::H5File *file) override
void Write(hsize_t sequencenum, H5::H5File *file) override
virtual void BuildReadDataset(H5::H5File *file, TGo4HDF5Source *parent)
static void FillTypeInfo(TGo4HDF5DataHandle *handle, TClass *rootclass, const char *basename=nullptr)
H5::DataSpace * fxDataSpace
void InsertTypeMember(const H5std_string &name, size_t offset, const H5::DataType &new_member)
void AllocReadBuffer(size_t size)
virtual ~TGo4HDF5BasicDataHandle()
void BuildWriteDataset(H5::H5File *file) override
TGo4HDF5DataHandle * CreateDataHandle(const char *name, size_t datasize, const char *type)
TGo4EventElement * fxEvent
void Read(hsize_t sequencenum, H5::H5File *file) override
void Read(hsize_t sequencenum, H5::H5File *file) override
void BuildReadDataset(H5::H5File *file, TGo4HDF5Source *parent) override
void BuildWriteDataset(H5::H5File *file) override
void SetAllSubMembersActive(Bool_t on)
void SetObjectPointer(void *memptr) override
void Write(hsize_t sequencenum, H5::H5File *file) override
void BuildWriteDataset(H5::H5File *file) override
H5::DataSpace fxFileSpace
void SetErrMess(const char *txt)
void BuildReadDataset(H5::H5File *file, TGo4HDF5Source *parent) override
std::vector< TGo4HDF5DataHandle * > fxSubcomponents
virtual void Read(hsize_t sequencenum, H5::H5File *file)
virtual ~TGo4HDF5SubVectorDataHandle()
virtual void Write(hsize_t sequencenum, H5::H5File *file)
void Write(hsize_t sequencenum, H5::H5File *ile) override
void Write(hsize_t sequencenum, H5::H5File *file) override
#define go4hdfdbg(args...)
virtual ~TGo4HDF5VectorDataHandle()
void Read(hsize_t sequencenum, H5::H5File *file) override
virtual ~TGo4HDF5DataHandle()
void SetTopEventClass(const char *classname)
void SetTopEvent(TGo4EventElement *eve)
void BuildWriteDataset(H5::H5File *file) override
#define go4hdfdatahandlethrow(args ...)
TGo4HDF5CompositeDataHandle(const char *name, size_t datasize)
void BuildReadDataset(H5::H5File *file, TGo4HDF5Source *parent) override
TGo4HDF5BasicDataHandle(const char *name, size_t datasize)
static void Error(const char *text,...) GO4_PRINTF_ARGS
TGo4HDF5Source * fxParentSource
virtual void BuildWriteDataset(H5::H5File *file)
TGo4HDF5SubVectorDataHandle(const char *name, size_t datasize)
TGo4HDF5DataHandle(const char *name, size_t datasize)
TGo4HDF5DataHandle * FindSubMember(const char *name)
virtual void SetObjectPointer(void *memptr)
void BuildReadDataset(H5::H5File *file, TGo4HDF5Source *parent) override
static TGo4HDF5DataHandleFactory fxFactory
void SetObjectPointer(void *memptr) override
TGo4HDF5VectorDataHandle(const char *name, size_t datasize)
const char * GetTypeName() const
TGo4HDF5VarContainer fxVarHandle
H5::CompType * fxCollection
TGo4HDF5DataHandle * AddSubMember(const char *name, size_t datasize, const char *collectiontype=nullptr)
void SetMemberName(const char *name)
void SetElementSize(size_t len)
virtual ~TGo4HDF5CompositeDataHandle()