Skip to content

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):

import rddac
with rddac.open_h5(0) as f:
    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

  • n is 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 fixed y_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…