80 if (!handle || !rootclass)
82 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo CCCC - for class %s \n", rootclass->GetName());
86 TIter baseiter(rootclass->GetListOfBases());
87 while (
auto obj = baseiter()) {
90 TBaseClass *base =
dynamic_cast<TBaseClass *
>(obj);
91 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo - base class 0x%lx %s \n", (
unsigned long)base,
92 (base ? base->GetName() :
"No base class"));
95 TClass *bclass = base->GetClassPointer();
102 if (strcmp(rootclass->GetName(),
"TObject") == 0)
104 if (strcmp(rootclass->GetName(),
"TNamed") == 0)
106 if (strcmp(rootclass->GetName(),
"TGo4EventElement") == 0)
109 if (strcmp(rootclass->GetName(),
"TGo4CompositeEvent") == 0) {
110 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo COMP detects go4 composite event. Assign fMaxIndex member...\n");
111 TDataMember *member = rootclass->GetDataMember(
"fMaxIndex");
114 size_t memberoffset = member->GetOffset();
115 const char *memtypename = member->GetFullTypeName();
117 (basename ? TString::Format(
"%s_%s", basename, member->GetName()) : TString(member->GetName()));
118 const char *membername = fullname.Data();
119 Int_t arraydim = member->GetArrayDim();
120 FillTypeInfo(handle, membername, memtypename, memberoffset, arraydim, member);
127 TIter iter(rootclass->GetListOfDataMembers());
129 while (
auto obj = iter()) {
130 TDataMember *member =
dynamic_cast<TDataMember *
>(obj);
133 const char *memtypename = member->GetFullTypeName();
135 (basename ? TString::Format(
"%s_%s", basename, member->GetName()) : TString(member->GetName()));
136 const char *membername = fullname.Data();
137 size_t memberoffset = member->GetOffset();
138 Int_t arraydim = member->GetArrayDim();
139 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo *** sees member %s of type %s, offset=%ld, arraydim=%d\n", membername,
140 memtypename, memberoffset, arraydim);
148 if (strstr(memtypename,
"TClass"))
150 if (strstr(membername,
"fgIsA"))
153 if (member->Property() & kIsStatic) {
154 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo ignored static member.\n");
159 TClass *innerclass = TClass::GetClass(memtypename);
160 TVirtualCollectionProxy *cprox = innerclass ? innerclass->GetCollectionProxy() :
nullptr;
162 TClass *collectionclass = cprox->GetCollectionClass();
163 TClass *valueclass = cprox->GetValueClass();
164 EDataType valuetype = cprox->GetType();
166 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo *** has collection proxy, type:%d, valueclass=0x%lx, valuetype=%d\n",
167 cprox->GetCollectionType(), (
unsigned long)valueclass, valuetype);
168 size_t innersize = 0;
176 collsize = collectionclass->Size();
177 innersize = valueclass->Size();
178 typenm = valueclass->GetName();
179 colltypnm = collectionclass->GetName();
180 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo has collection proxy for type %d, collectionclass %s, class %s, "
181 "size:%ld, collsize:%ld\n",
182 collectionclass->GetCollectionType(), colltypnm.Data(), typenm.Data(), innersize,
185 }
else if (valuetype) {
186 TDataType *datatype = TDataType::GetDataType(valuetype);
187 typenm = datatype->GetTypeName();
188 innersize = datatype->Size();
195 colltypnm = memtypename;
196 collectionclass = TClass::GetClass(memtypename);
198 collsize = collectionclass->Size();
200 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo could not get class for collection %s \n", memtypename);
202 "TGo4HDF5Adapter::FillTypeInfo has collection proxy for value %d, type %s, size:%ld, collsize:%ld\n",
203 collectionclass->GetCollectionType(), typenm.Data(), innersize, collsize);
212 Int_t maxindex1 = 0, maxindex2 = 0;
217 AddSubHandle(handle, membername, colltypnm.
Data(), innersize, memberoffset, member->GetName(),
218 typenm.Data(), valueclass);
222 maxindex1 = member->GetMaxIndex(0);
223 for (
int x = 0; x < maxindex1; ++x) {
224 TString arraymember =
225 TString::Format(
"%s[%d]", membername, x);
226 TString memberhandle =
227 TString::Format(
"%s[%d]", member->GetName(), x);
228 AddSubHandle(handle, arraymember.
Data(), colltypnm.Data(), innersize, memberoffset, memberhandle.Data(),
229 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) {
239 TString arraymember =
240 TString::Format(
"%s[%d][%d]", membername, x, y);
241 TString memberhandle =
242 TString::Format(
"%s[%d][%d]", member->GetName(), x, y);
243 AddSubHandle(handle, arraymember.
Data(), colltypnm.Data(), innersize, memberoffset,
244 memberhandle.Data(), typenm.Data(), valueclass);
245 memberoffset += collsize;
253 FillTypeInfo(handle, membername, memtypename, memberoffset, arraydim, member);
259 const char *membername,
const char *memtypename,
size_t memberoffset,
260 Int_t arraydim, TDataMember *member)
262 H5::DataType theType;
263 hsize_t maxindex1 = 1, maxindex2 = 1;
265 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo begins for type %s ...\n",memtypename);
267 if ((strcmp(memtypename,
"Char_t") == 0) || (strcmp(memtypename,
"char") == 0))
268 theType = H5::PredType::NATIVE_CHAR;
269 else if ((strcmp(memtypename,
"UChar_t") == 0) || (strcmp(memtypename,
"unsigned char") == 0))
270 theType = H5::PredType::NATIVE_UCHAR;
271 else if ((strcmp(memtypename,
"Short_t") == 0) || (strcmp(memtypename,
"short") == 0))
272 theType = H5::PredType::NATIVE_SHORT;
273 else if ((strcmp(memtypename,
"UShort_t") == 0) || (strcmp(memtypename,
"unsigned short") == 0))
274 theType = H5::PredType::NATIVE_USHORT;
275 else if ((strcmp(memtypename,
"Int_t") == 0) || (strcmp(memtypename,
"int") == 0))
276 theType = H5::PredType::NATIVE_INT;
277 else if ((strcmp(memtypename,
"UInt_t") == 0) || (strcmp(memtypename,
"unsigned int") == 0))
278 theType = H5::PredType::NATIVE_UINT;
279 else if ((strcmp(memtypename,
"ULong_t") == 0) || (strcmp(memtypename,
"unsigned long") == 0))
280 theType = H5::PredType::NATIVE_ULONG;
281 else if ((strcmp(memtypename,
"Double_t") == 0) || (strcmp(memtypename,
"double") == 0))
282 theType = H5::PredType::NATIVE_DOUBLE;
283 else if ((strcmp(memtypename,
"Float_t") == 0) || (strcmp(memtypename,
"float") == 0))
284 theType = H5::PredType::NATIVE_FLOAT;
285 else if ((strcmp(memtypename,
"Bool_t") == 0) || (strcmp(memtypename,
"bool") == 0))
286 theType = H5::PredType::NATIVE_HBOOL;
287 else if ((strcmp(memtypename,
"TString") == 0) || strstr(memtypename,
"string")) {
291 else if (strcmp(memtypename,
"TGo4HDF5VectorProxy") == 0) {
293 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo handles explicitly vector entry %s\n", memtypename);
295 TString innermemname;
297 innermemname = TString::Format(
"%s_fx_Begin_ptr", membername);
299 H5::PredType::NATIVE_ULONG);
300 innermemname = TString::Format(
"%s_fx_End_ptr", membername);
302 H5::PredType::NATIVE_ULONG);
303 innermemname = TString::Format(
"%s_fx_Cap_ptr", membername);
305 H5::PredType::NATIVE_ULONG);
306 theType = *(innercomp.
GetType());
311 TClass *innerclass = TClass::GetClass(memtypename);
315 go4hdfdbg(
"TGo4HDF5Adapter::FillTypeInfo finds root class info for type %s\n", memtypename);
317 size_t innersize = innerclass->Size();
321 theType = *(innercomp.
GetType());
324 const H5std_string theMEMBER(membername);
328 maxindex1 = member->GetMaxIndex(0);
329 hsize_t dims[1] = {maxindex1};
330 H5::ArrayType theArray(theType, arraydim, dims);
332 "TGo4HDF5Adapter::FillTypeInfo inserts array member %s, type %s dimension %d, maxindex:%lld, offset:%ld\n",
333 membername, memtypename, arraydim, maxindex1, memberoffset);
338 maxindex1 = member->GetMaxIndex(0);
339 maxindex2 = member->GetMaxIndex(1);
340 hsize_t dims[2] = {maxindex1, maxindex2};
341 H5::ArrayType theArray(theType, arraydim, dims);
343 "TGo4HDF5Adapter::FillTypeInfo inserts array member %s, type %s dimension %d, maxindex:%lld, offset:%ld\n",
344 membername, memtypename, arraydim, maxindex1, memberoffset);
352 "TGo4HDF5Adapter::FillTypeInfo inserts simple member %s, type %s dimension %d, maxindex:%lld, offset:%ld\n",
353 membername, memtypename, arraydim, maxindex1, memberoffset);