VTK  9.6.20260304
vtkHDFReaderImplementation.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
8
9#ifndef vtkHDFReaderImplementation_h
10#define vtkHDFReaderImplementation_h
11
12#include "vtkAMRBox.h"
14#include "vtkHDFReader.h"
15#include "vtk_hdf5.h"
16
17#include <array>
18#include <map>
19#include <string>
20#include <vector>
21
22VTK_ABI_NAMESPACE_BEGIN
24class vtkBitArray;
25class vtkDataArray;
26class vtkDataAssembly;
29class vtkStringArray;
30
36{
37public:
39 virtual ~Implementation();
40
44 bool Open(VTK_FILEPATH const char* fileName, bool quiet = false);
45
49 bool Open(vtkResourceStream* stream, bool quiet = false);
50
54 void Close();
55
60
65 int GetDataSetType() { return this->DataSetType; }
69 vtkHDFReader* GetReader() { return this->Reader; }
73 const std::array<int, 2>& GetVersion() { return this->Version; }
77 template <typename T>
78 bool GetAttribute(const char* attributeName, size_t numberOfElements, T* value);
82 bool HasAttribute(const char* groupName, const char* attributeName);
86 bool HasDataset(const char* datasetName);
96 bool GetPartitionExtent(hsize_t partitionIndex, int* extent);
100 std::vector<std::string> GetArrayNames(int attributeType);
104 std::vector<std::string> GetOrderedChildrenOfGroup(const std::string& path);
106
115 int attributeType, const char* name, const std::vector<hsize_t>& fileExtent);
116 vtkDataArray* NewArray(int attributeType, const char* name, hsize_t offset, hsize_t size);
118 const char* name, vtkIdType offset = -1, vtkIdType size = -1, vtkIdType dimMaxSize = -1);
120
127 int attributeType, vtkDataArray* array, vtkDataSetAttributes* attributes);
128
130
136 vtkDataArray* NewMetadataArray(const char* name, hsize_t offset, hsize_t size);
137 std::vector<vtkIdType> GetMetadata(const char* name, hsize_t size, hsize_t offset = 0);
139
142 std::vector<hsize_t> GetDimensions(const char* dataset);
143
147 bool IsPathSoftLink(const std::string& path);
148
150
155 bool FillAssembly(vtkDataAssembly* data, hid_t assemblyHandle, int assemblyID, std::string path);
157
161 std::size_t GetNumberOfSteps();
162
164
170
174 vtkIdType GetArrayOffset(vtkIdType step, int attributeType, std::string name);
175
181 std::array<vtkIdType, 2> GetFieldArraySize(vtkIdType step, std::string name);
182
186 bool OpenGroupAsVTKGroup(const std::string& groupPath);
187
191 bool RetrieveHDFInformation(const std::string& rootName, const std::string& groupPrefix = "");
192
197 bool GetImageAttributes(int WholeExtent[6], double Origin[3], double Spacing[3]);
198
200
206 unsigned int GetAMRNumberOfLevels();
207
213 bool ComputeAMRBlocksPerLevels(unsigned int nLevels);
214
221 vtkDataArraySelection* dataArraySelection[3], vtkIdType step, unsigned int nLevels);
222
227 vtkOverlappingAMR* data, unsigned int maxLevel, double origin[3], bool isTemporalData);
228
234 unsigned int level, int attributeType, const std::string& name, hsize_t& offset);
236
241 vtkSmartPointer<vtkDataObject> GetNewDataSet(int dataSetType, int numPieces);
242
249 vtkIdType cellOffset, vtkIdType treeIdsOffset, vtkIdType depthOffset,
250 vtkIdType descriptorOffset, vtkIdType maskOffset, vtkIdType partOffset,
251 vtkIdType verticesPerDepthOffset, vtkIdType depthLimit, vtkIdType step);
252
257
262
267 std::vector<vtkSmartPointer<vtkAbstractArray>>& cellArrays,
268 const vtkDataArraySelection* arraySelection, vtkIdType cellCount);
269
274 vtkIdType cellOffset, vtkIdType inputCellOffset, vtkIdType step, vtkIdType readableTreeSize);
275
280 vtkIdType maskOffset, vtkIdType readableTreeSize);
281
282private:
283 std::string FileName;
284 vtkResourceStream* Stream = nullptr;
285 vtkNew<vtkMemoryResourceStream> LocalMemStream;
286 hid_t File;
287 hid_t VTKGroup;
288 // in the same order as vtkDataObject::AttributeTypes: POINT, CELL, FIELD
289 std::array<hid_t, 3> AttributeDataGroup;
290 int DataSetType;
291 int NumberOfPieces;
292 std::array<int, 2> Version;
293 vtkHDFReader* Reader;
294
296
299 struct AMRBlocksInformation
300 {
301 std::vector<int> BlocksPerLevel;
302 std::vector<vtkIdType> BlockOffsetsPerLevel;
303 std::map<std::string, std::vector<vtkIdType>> CellOffsetsPerLevel;
304 std::map<std::string, std::vector<vtkIdType>> PointOffsetsPerLevel;
305
306 void Clear()
307 {
308 this->BlocksPerLevel.clear();
309 this->BlockOffsetsPerLevel.clear();
310 this->PointOffsetsPerLevel.clear();
311 this->CellOffsetsPerLevel.clear();
312 }
313 };
314
315 AMRBlocksInformation AMRInformation;
316
317 bool ReadLevelSpacing(hid_t levelGroupID, double* spacing);
318 bool ReadAMRBoxRawValues(
319 hid_t levelGroupID, std::vector<int>& amrBoxRawData, int level, bool isTemporalData);
320 bool ReadLevelTopology(unsigned int level, const std::string& levelGroupName,
321 vtkOverlappingAMR* data, double origin[3], bool isTemporalData);
323};
324
325VTK_ABI_NAMESPACE_END
326#endif
327// VTK-HeaderTest-Exclude: vtkHDFReaderImplementation.h
Abstract superclass for all arrays.
dynamic, self-adjusting array of bits
Definition vtkBitArray.h:33
Store on/off settings for data arrays, etc.
hierarchical representation to use with vtkPartitionedDataSetCollection
represent and manipulate attribute data in a dataset
Implementation for the vtkHDFReader.
vtkDataArray * NewMetadataArray(const char *name, hsize_t offset, hsize_t size)
Reads a 1D metadata array in a DataArray or a vector of vtkIdType.
bool GetPartitionExtent(hsize_t partitionIndex, int *extent)
For an ImageData, sets the extent for 'partitionIndex'.
void CloseMemberGroups()
Close HDF5 groups stored as class members.
bool HasDataset(const char *datasetName)
Return true if the dataset exists in the specified group root group.
bool OpenGroupAsVTKGroup(const std::string &groupPath)
Open a sub group of the current file and consider it as the new root file.
bool Open(vtkResourceStream *stream, bool quiet=false)
Opens this VTK HDF stream and checks if it is valid.
bool IsPathSoftLink(const std::string &path)
Return true if current root path is a soft link.
bool Open(const char *fileName, bool quiet=false)
Opens this VTK HDF file and checks if it is valid.
const std::array< int, 2 > & GetVersion()
Returns the version of the VTK HDF implementation.
unsigned int GetAMRNumberOfLevels()
Specific public API for AMR support.
Implementation(vtkHDFReader *reader)
bool GetAMRTemporalOffsetForAttributeType(unsigned int level, int attributeType, const std::string &name, hsize_t &offset)
Get the temporal offset for a specific attribute Return true if the offset arg was set,...
vtkDataArray * NewArray(int attributeType, const char *name, const std::vector< hsize_t > &fileExtent)
Reads and returns a new vtkDataArray.
vtkIdType GetArrayOffset(vtkIdType step, int attributeType, std::string name)
Methods to query for array offsets when steps are present.
std::vector< hsize_t > GetDimensions(const char *dataset)
Returns the dimensions of a HDF dataset.
vtkSmartPointer< vtkDataObject > GetNewDataSet(int dataSetType, int numPieces)
Create a new dataset given its type and the number of pieces.
bool HasAttribute(const char *groupName, const char *attributeName)
Return true if the attribute exists in the specified group.
vtkHDFReader * GetReader()
Return the reader this impl is associated to.
vtkAbstractArray * NewFieldArray(const char *name, vtkIdType offset=-1, vtkIdType size=-1, vtkIdType dimMaxSize=-1)
Reads and returns a new vtkDataArray.
bool ReadHyperTreeGridMetaInfo(vtkHyperTreeGrid *htg)
Read HTG meta-information stored in attributes.
std::vector< std::string > GetArrayNames(int attributeType)
Returns the names of arrays for 'attributeType' (point or cell).
vtkDataArray * GetStepValues()
Read the values of the steps from the open file.
std::array< vtkIdType, 2 > GetFieldArraySize(vtkIdType step, std::string name)
Return the field array size (components, tuples) for the current step.
bool CreateHyperTreeGridCellArrays(vtkHyperTreeGrid *htg, std::vector< vtkSmartPointer< vtkAbstractArray > > &cellArrays, const vtkDataArraySelection *arraySelection, vtkIdType cellCount)
Initialize selected Cell arrays for HyperTreeGrid.
int GetDataSetType()
Type of vtkDataSet stored by the HDF file, such as VTK_IMAGE_DATA or VTK_UNSTRUCTURED_GRID,...
int GetNumberOfPieces(vtkIdType step=-1)
Returns the number of partitions for this dataset at the time step step if applicable.
bool ReadHyperTreeGridData(vtkHyperTreeGrid *htg, const vtkDataArraySelection *arraySelection, vtkIdType cellOffset, vtkIdType treeIdsOffset, vtkIdType depthOffset, vtkIdType descriptorOffset, vtkIdType maskOffset, vtkIdType partOffset, vtkIdType verticesPerDepthOffset, vtkIdType depthLimit, vtkIdType step)
Read data and build the HyperTreeGrid from descriptors, mask information and cell data array in the f...
bool FillAssembly(vtkDataAssembly *data)
Fills the given Assembly with the content of the opened HDF file.
vtkDataArray * GetStepValues(hid_t group)
Read the values of the steps from the open file.
bool AppendCellDataForHyperTree(std::vector< vtkSmartPointer< vtkAbstractArray > > &cellArrays, vtkIdType cellOffset, vtkIdType inputCellOffset, vtkIdType step, vtkIdType readableTreeSize)
Read & add cell data for the tree currently processed.
void AttachDatasetAttributeToArray(int attributeType, vtkDataArray *array, vtkDataSetAttributes *attributes)
Given a named data array and an attribute type, read from the file the special array attribute (scala...
void Close()
Closes the VTK HDF file and releases any allocated resources.
bool GetAttribute(const char *attributeName, size_t numberOfElements, T *value)
Reads an attribute from the /VTKHDF group.
bool RetrieveHDFInformation(const std::string &rootName, const std::string &groupPrefix="")
Initialize meta information of the implementation based on root name specified.
bool GetImageAttributes(int WholeExtent[6], double Origin[3], double Spacing[3])
Retrieve ImageData attributes and store them.
std::size_t GetNumberOfSteps()
Read the number of steps from the opened file.
bool ReadHyperTreeGridDimensions(vtkHyperTreeGrid *htg)
Read HTG dimensions and coordinates.
bool FillAssembly(vtkDataAssembly *data, hid_t assemblyHandle, int assemblyID, std::string path)
Fills the given Assembly with the content of the opened HDF file.
bool ComputeAMROffsetsPerLevels(vtkDataArraySelection *dataArraySelection[3], vtkIdType step, unsigned int nLevels)
Retrieve offset for AMRBox, point/cell/field arrays for each level.
bool AppendMaskForHyperTree(vtkHyperTreeGrid *htg, vtkIdType inputCellOffset, vtkIdType maskOffset, vtkIdType readableTreeSize)
Read & add mask data for the current tree.
bool ReadAMRTopology(vtkOverlappingAMR *data, unsigned int maxLevel, double origin[3], bool isTemporalData)
Read the AMR topology based on offset data on AMRBlocks.
std::vector< std::string > GetOrderedChildrenOfGroup(const std::string &path)
Return the name of all children of an HDF group given its path.
std::vector< vtkIdType > GetMetadata(const char *name, hsize_t size, hsize_t offset=0)
Reads a 1D metadata array in a DataArray or a vector of vtkIdType.
vtkDataArray * NewArray(int attributeType, const char *name, hsize_t offset, hsize_t size)
Reads and returns a new vtkDataArray.
bool ComputeAMRBlocksPerLevels(unsigned int nLevels)
Retrieve for each required level AMRBlocks size and position.
A dataset containing a grid of vtkHyperTree instances arranged as a rectilinear grid.
vtkResourceStream implementation for memory input.
Allocate and hold a VTK object.
Definition vtkNew.h:167
a multi-resolution dataset based on vtkCartesianGrid allowing overlaps
Abstract class used for custom streams.
Hold a reference to a vtkObjectBase instance.
a vtkAbstractArray subclass for strings
#define vtkDataArray
int64_t hid_t
int vtkIdType
Definition vtkType.h:363
#define VTK_FILEPATH