18 #include "TDataMember.h"
19 #include "TVirtualCollectionProxy.h"
20 #include "TBaseClass.h"
46 if (event==0)
return 0;
47 TClass* evclass=
event->Class();
48 TClass* actualclass=evclass->GetActualClass(event);
49 size_t rev=actualclass->Size();
50 go4hdfdbg(
"TGo4HDF5Adapter: ScanEventSize for class %s with object size %ld\n",
51 actualclass->GetName(), rev);
56 size_t memberoffset,
const char* membername,
const char* classname, TClass* valueclass)
65 TString containerclass =
"TGo4HDF5VectorProxy";
83 if(handle==0 || rootclass==0)
return;
84 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo CCCC - for class %s \n", rootclass->GetName());
88 TIter baseiter(rootclass->GetListOfBases());
90 while ((obj=baseiter()) != 0) {
92 TBaseClass* base =
dynamic_cast<TBaseClass*
>(obj);
93 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo - base class 0x%lx %s \n", (
unsigned long) base, (base ? base->GetName() :
"No base class"));
94 if (base==0)
continue;
95 TClass* bclass=base->GetClassPointer();
96 if(bclass==0)
continue;
101 if(strcmp(rootclass->GetName(),
"TObject")==0)
return;
102 if(strcmp(rootclass->GetName(),
"TNamed")==0)
return;
103 if(strcmp(rootclass->GetName(),
"TGo4EventElement")==0)
return;
105 if(strcmp(rootclass->GetName(),
"TGo4CompositeEvent")==0)
107 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo COMP detects go4 composite event. Assign fMaxIndex member...\n");
108 TDataMember* member=rootclass->GetDataMember(
"fMaxIndex");
109 if (member==0)
return;
110 size_t memberoffset = member->GetOffset();
111 const char* memtypename = member->GetFullTypeName();
112 TString fullname= (basename ? TString::Format(
"%s_%s", basename, member->GetName()) : TString(member->GetName()));
113 const char* membername = fullname.Data();
114 Int_t arraydim = member->GetArrayDim();
115 FillTypeInfo(handle, membername, memtypename, memberoffset, arraydim, member);
125 TIter iter(rootclass->GetListOfDataMembers());
128 while ((obj=iter()) != 0) {
129 TDataMember* member =
dynamic_cast<TDataMember*
>(obj);
130 if (member==0)
continue;
131 const char* memtypename = member->GetFullTypeName();
132 TString fullname= (basename ? TString::Format(
"%s_%s", basename, member->GetName()) : TString(member->GetName()));
133 const char* membername = fullname.Data();
134 size_t memberoffset = member->GetOffset();
135 Int_t arraydim = member->GetArrayDim();
136 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo *** sees member %s of type %s, offset=%ld , arraydim=%d\n",
137 membername, memtypename, memberoffset, arraydim);
140 if (arraydim>2)
continue;
144 if(strstr(memtypename,
"TClass"))
146 if(strstr(membername,
"fgIsA")!=0)
149 if(member->Property() & kIsStatic)
151 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo ignored static member.\n");
157 TClass* innerclass=TClass::GetClass(memtypename);
158 TVirtualCollectionProxy* cprox = (innerclass ? innerclass->GetCollectionProxy() : 0);
161 TClass* collectionclass=cprox->GetCollectionClass();
162 TClass* valueclass=cprox->GetValueClass();
163 EDataType valuetype=cprox->GetType();
165 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo *** has collection proxy, type:%d, valueclass=0x%lx, valuetype=%d\n",
166 cprox->GetCollectionType(),
167 (
unsigned long) valueclass, valuetype);
178 collsize=collectionclass->Size();
179 innersize=valueclass->Size();
180 typenm=valueclass->GetName();
181 colltypnm= collectionclass->GetName();
182 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo has collection proxy for type %d, collectionclass %s, class %s, size:%ld, collsize:%ld\n",
183 collectionclass->GetCollectionType(), colltypnm.Data(), typenm.Data(), innersize, collsize);
188 TDataType* datatype=TDataType::GetDataType(valuetype);
189 typenm=datatype->GetTypeName();
190 innersize=datatype->Size();
196 colltypnm=memtypename;
197 collectionclass=TClass::GetClass(memtypename);
199 collsize= collectionclass->Size();
201 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo could not get class for collection %s \n",memtypename);
202 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo has collection proxy for value %d, type %s, size:%ld, collsize:%ld\n",
203 collectionclass->GetCollectionType(), typenm.Data(), innersize, collsize);
214 Int_t maxindex1=0, maxindex2=0;
220 AddSubHandle(handle, membername, colltypnm.
Data(), innersize, memberoffset, member->GetName(), typenm.Data(), valueclass);
224 maxindex1 = member->GetMaxIndex(0);
225 for(
int x=0; x<maxindex1; ++x)
227 TString arraymember=TString::Format(
"%s[%d]",membername,x);
228 TString memberhandle=TString::Format(
"%s[%d]",member->GetName(),x);
229 AddSubHandle(handle, arraymember.
Data(), colltypnm.Data(), innersize, memberoffset, memberhandle.Data(), typenm.Data(), valueclass);
230 memberoffset+=collsize;
235 maxindex1 = member->GetMaxIndex(0);
236 maxindex2 = member->GetMaxIndex(1);
237 for(
int x=0; x<maxindex1; ++x)
238 for(
int y=0; y<maxindex2; ++y)
240 TString arraymember=TString::Format(
"%s[%d][%d]",membername,x,y);
241 TString memberhandle=TString::Format(
"%s[%d][%d]",member->GetName(),x,y);
242 AddSubHandle(handle, arraymember.
Data(), colltypnm.Data(), innersize, memberoffset, memberhandle.Data(), typenm.Data(), valueclass);
243 memberoffset+=collsize;
252 FillTypeInfo(handle, membername, memtypename, memberoffset, arraydim, member);
260 const char* membername,
const char* memtypename,
size_t memberoffset,
261 Int_t arraydim, TDataMember* member)
263 H5::DataType theType;
264 hsize_t maxindex1(1), maxindex2(1);
266 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo begins for type %s ...\n",memtypename);
269 if ((strcmp(memtypename,
"Char_t")==0) || (strcmp(memtypename,
"char")==0))
270 theType=H5::PredType::NATIVE_CHAR;
271 else if ((strcmp(memtypename,
"UChar_t")==0) || (strcmp(memtypename,
"unsigned char")==0))
272 theType=H5::PredType::NATIVE_UCHAR;
273 else if ((strcmp(memtypename,
"Short_t")==0) || (strcmp(memtypename,
"short")==0))
274 theType=H5::PredType::NATIVE_SHORT;
275 else if ((strcmp(memtypename,
"UShort_t")==0) || (strcmp(memtypename,
"unsigned short")==0))
276 theType=H5::PredType::NATIVE_USHORT;
277 else if ((strcmp(memtypename,
"Int_t")==0) || (strcmp(memtypename,
"int")==0))
278 theType=H5::PredType::NATIVE_INT;
279 else if ((strcmp(memtypename,
"UInt_t")==0) || (strcmp(memtypename,
"unsigned int")==0))
280 theType=H5::PredType::NATIVE_UINT;
281 else if ((strcmp(memtypename,
"ULong_t")==0) || (strcmp(memtypename,
"unsigned long")==0))
282 theType=H5::PredType::NATIVE_ULONG;
283 else if ((strcmp(memtypename,
"Double_t")==0)|| (strcmp(memtypename,
"double")==0))
284 theType=H5::PredType::NATIVE_DOUBLE;
285 else if ((strcmp(memtypename,
"Float_t")==0) || (strcmp(memtypename,
"float")==0))
286 theType=H5::PredType::NATIVE_FLOAT;
287 else if ((strcmp(memtypename,
"Bool_t")==0)|| (strcmp(memtypename,
"bool")==0))
288 theType=H5::PredType::NATIVE_HBOOL;
291 else if((strcmp(memtypename,
"TString")==0) || (strstr(memtypename,
"string")!=0))
296 else if(strcmp(memtypename,
"TGo4HDF5VectorProxy")==0)
299 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo handles explicitly vector entry %s\n",memtypename);
301 TString innermemname;
303 innermemname= TString::Format(
"%s_fx_Begin_ptr",membername);
305 innermemname= TString::Format(
"%s_fx_End_ptr",membername);
307 innermemname= TString::Format(
"%s_fx_Cap_ptr",membername);
309 theType= *(innercomp.
GetType());
317 TClass* innerclass=TClass::GetClass(memtypename);
319 if(innerclass==0)
return;
320 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo finds root class info for type %s\n",memtypename);
322 size_t innersize=innerclass->Size();
326 theType= *(innercomp.
GetType());
329 const H5std_string theMEMBER(membername);
334 maxindex1 = member->GetMaxIndex(0);
335 hsize_t dims[1]={maxindex1};
336 H5::ArrayType theArray(theType, arraydim, dims);
337 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo inserts array member %s, type %s dimension %d, maxindex:%lld , offset:%ld\n",
338 membername,memtypename, arraydim,maxindex1, memberoffset);
344 maxindex1 = member->GetMaxIndex(0);
345 maxindex2 = member->GetMaxIndex(1);
346 hsize_t dims[2]={maxindex1, maxindex2};
347 H5::ArrayType theArray(theType, arraydim, dims);
348 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo inserts array member %s, type %s dimension %d, maxindex:%lld , offset:%ld\n",
349 membername,memtypename, arraydim,maxindex1, memberoffset);
358 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo inserts simple member %s, type %s dimension %d, maxindex:%lld , offset:%ld\n",
359 membername, memtypename, arraydim,maxindex1, memberoffset);
371 TClass* evclass=
event->Class();
374 TGo4Log::Error(
"TGo4HDF5Adapter::BuildDataType can not find an event class\n");
377 TClass* actualclass=evclass->GetActualClass(event);
378 TString actualclassname= actualclass->GetName();
381 go4hdfdbg(
"TGo4HDF5Adapter::BuildDataType for class %s\n",
382 actualclassname.Data());
397 TString compname=TString::Format(
"%s_%s(%d)",parent->
GetTypeName(), actualclassname.Data(), index);
398 TString comptype=
"Go4CompEv";
399 theHandle=parent->
AddSubMember(compname.Data(), eventsize, comptype.Data());
400 void* super=parent->
Data();
401 size_t delta= (
char*) event - (
char*) super;
402 go4hdfdbg(
"TGo4HDF5Adapter::BuildDataType sets parent offset %ld (event:0x%lx, super:0x%lx)\n",
403 delta, (
unsigned long) event, (
unsigned long) super);
419 go4hdfdbg(
"TGo4HDF5Adapter::BuildDataType evaluates members of Go4 composite event %s\n",
422 for (
int i = 0; i < numSubEvents ; ++i)
448 h5flags=H5F_ACC_TRUNC;
451 h5flags=H5F_ACC_EXCL;
454 h5flags=H5F_ACC_RDONLY;
457 h5flags=H5F_ACC_RDWR;
460 h5flags=H5F_ACC_TRUNC;
static const char * fgcFILESUF
void InsertTypeMember(const H5std_string &name, size_t offset, const H5::DataType &new_member)
UInt_t ConvertFileMode(Go4_H5_File_Flags flags)
Short_t getNElements() const
static void FillTypeInfo(TGo4HDF5DataHandle *handle, TClass *rootclass, const char *basename=0)
void BuildDataType(TGo4EventElement *event, TGo4HDF5DataHandle *parent=0, Int_t index=0)
#define go4hdfdbg(args...)
size_t ScanEventSize(TGo4EventElement *event)
static void AddSubHandle(TGo4HDF5DataHandle *handle, const char *name, const char *type, size_t size, size_t memberoffset, const char *membername, const char *classname, TClass *valueclass)
virtual void DeleteDataSet()
void SetTopEventClass(const char *classname)
const char * GetTypeName()
void SetTopEvent(TGo4EventElement *eve)
TGo4EventElement * getEventElement(Int_t idx)
virtual void SetObjectPointer(void *memptr)
void SetParentOffset(size_t off)
TGo4HDF5DataHandle * AddSubMember(const char *name, size_t datasize, const char *collectiontype=0)
static void Error(const char *text,...)
void SetMemberName(const char *name)
TGo4HDF5DataHandle * fxHandle
void SetMemberClass(const char *clname)