HDF5 File Structure¶
Each experiment is one self contained HDF5 file (~9.7 MB). The parameter values from process_parameters.csv appear as root attributes, so a file inspected in isolation is still fully described.
An experiment captures two consecutive process steps. OP10 is the deep drawing operation: the blank holder presses the sheet against the die and the punch travels down to its final depth. OP20 is the cutting operation that trims the formed cup. The press signals are recorded during forming; the sheet-thickness and oil-film traverses characterise the blank; the part is laser-scanned after each operation (pointcloud/op10 and pointcloud/op20).
File hierarchy¶
The block below is generated by rddac.inspect_h5(f):
0000.h5
├── @blankholder_force = 100
├── @blankholder_force_unit = kN
├── @category = 0
├── @experiment_id = 1
├── @geometry = concave
├── @has_oil = True
├── @has_pointcloud = True
├── @id = 0
├── @mean_punch_temp = 20.2
├── @mean_punch_temp_unit = degC
├── @n_force_measurements = 1140
├── @n_oil_measurements = 421
├── @n_pointcloud_measurements = 6400000
├── @n_sheet_measurements = 208
├── @oil_type = coarse
├── force/
│ ├── @columns = ['time' 'load_cell_1' 'load_cell_2' 'load_cell_3' 'load_cell_4'
│ │ 'punch_temp' 'punch_pos' 'total_force']
│ ├── @n_measurements = 1140
│ ├── @units = ['s' 'kN' 'kN' 'kN' 'kN' 'degC' 'mm' 'kN']
│ └── data (1140, 8) float32
├── oil_thickness/
│ ├── @columns = ['sensor_position' 'oil_value']
│ ├── @n_measurements = 421
│ ├── @units = ['mm' 'g/m^2']
│ └── data (421, 2) float32
├── pointcloud/
│ ├── op10/
│ │ ├── @x_shape = 3200
│ │ ├── @y_shape = 2000
│ │ ├── luminescence (6400000,) float32
│ │ └── z (6400000,) float32
│ └── op20/
│ ├── @x_shape = 3200
│ ├── @y_shape = 2000
│ ├── luminescence (6400000,) float32
│ └── z (6400000,) float32
└── sheet_thickness/
├── @columns = ['sensor_position' 'sheet_thickness']
├── @n_measurements = 208
├── @units = ['mm' 'um']
└── data (208, 2) float32
Lines starting with @ are HDF5 attributes; trailing / marks a group; bare names list shape and dtype. Every table group carries columns and units attributes describing its own layout, so a file remains self describing without the manifest.
Shape notation¶
nis the number of samples in a table and varies per experiment (this is raw data as recorded — 1140 force samples here, a different count in the next file).- The scan buffers are always flat
(6400000,)arrays over a fixedy_shape x x_shape= 2000 x 3200 grid.
force/¶
The press signals sampled during OP10 as one (n, 8) table. Column layout (from the columns / units attrs):
| Column | Unit | Description |
|---|---|---|
time |
s | Sample timestamp |
load_cell_1 .. load_cell_4 |
kN | The four blank holder load cells |
punch_temp |
degC | Punch temperature |
punch_pos |
mm | Punch position |
total_force |
kN | Total press force |
sheet_thickness/¶
The blank's thickness measured along a sensor traverse, as an (n, 2) table of [sensor_position (mm), sheet_thickness (um)].
Sensor position carries a 50 mm mounting offset
The raw sensor_position values include the 50 mm mounting offset of the thickness sensor, so positions run from 50 mm upward (roughly 50-257 mm). Subtract 50 to get positions relative to the traverse start — the example plots in these docs show positions with the offset removed.
oil_thickness/¶
The lubricant film measured along a sensor traverse, as an (n, 2) table of [sensor_position (mm), oil_value (g/m^2)].
Group missing when has_oil=False
123 experiments have no oil_thickness/ group at all (flagged by the has_oil root attribute / CSV column). Reading the group from such a file raises a KeyError; filter with where=lambda row: row["has_oil"] when streaming.
pointcloud/¶
Two laser scans of the part: op10/ after deep drawing and op20/ after cutting. Each holds two flat (6400000,) buffers — z (height) and luminescence (intensity) — stored row-major over the y_shape x x_shape (2000 x 3200) pixel grid declared as group attributes. Reshape with arr.reshape(2000, 3200) to recover the scan image; pixels with value 0 carry no measurement.

The scan grid: one height and one luminescence value per pixel, flattened row-major into the two (6400000,) buffers.
Group missing when has_pointcloud=False
10 experiments have no pointcloud/ group (flagged by has_pointcloud). Filter with where=lambda row: row["has_pointcloud"] when streaming.
Raw sensor units
z and luminescence are uncalibrated sensor units, not mm. Calibration, outlier cleaning, and alignment to the DDACS simulation frame are an optional preprocessing step planned for package v1.1; the published files carry the scans exactly as the scanner recorded them.
Reading example¶
import rddac
import numpy as np
with rddac.open_h5(0) as f:
force = f["force/data"][:] # (n, 8)
columns = [c for c in f["force"].attrs["columns"]]
total = force[:, columns.index("total_force")] # kN over time
z10 = f["pointcloud/op10/z"][:].reshape(2000, 3200) # scan image
valid = z10[z10 != 0] # measured pixels only
Complete field reference¶
The full list of HDF5 datasets, generated from metadata.json. Each row's Field (e.g. force_data) is the identifier accepted by rddac.add_view(..., fields={...}): the Build your own view tutorial walks through composing custom RecordSets from these IDs.
| Field | Description |
|---|---|
force_data |
Press force and process signals, time series. Columns: [time (s), load_cell_1..4 (kN), punch_temp (degC), punch_pos (mm)… |
oil_thickness_data |
Lubricant film measurement along a sensor traverse. Columns: [sensor_position (mm), oil_value (g/m^2)]. HDF5 path: oil_t… |
pointcloud_op10_luminescence |
Flattened luminescence/intensity buffer of the OP10 scan, pixel-aligned with op10/z. HDF5 path: pointcloud/op10/luminesc… |
pointcloud_op10_z |
Flattened height (Z) buffer of the OP10 laser scan (after deep drawing), row-major over a y_shape x x_shape grid (see gr… |
pointcloud_op20_luminescence |
Flattened luminescence/intensity buffer of the OP20 scan, pixel-aligned with op20/z. HDF5 path: pointcloud/op20/luminesc… |
pointcloud_op20_z |
Flattened height (Z) buffer of the OP20 laser scan (after cutting), row-major over a y_shape x x_shape grid (see group a… |
sheet_thickness_data |
Blank sheet thickness measurement along a sensor traverse. Columns: [sensor_position (mm), sheet_thickness (um)]. HDF5 p… |