5. Measurement chains#

<< PREVIOUS TUTORIAL

5.1. Overview#

This tutorial covers:

The MeasurementChain class that describes in detail how the experimental date was acquired

Requirements:

  • Opening and navigating through WelDX files (tutorial)

  • Dealing with time-dependent data (tutorial)

# download the example file for this tutorial

from util import download_tutorial_input_file

download_tutorial_input_file(print_status=False)

5.2. Plotting the measurement chain#

When working with experimental data we sometimes need more information than just the pure data itself. For example, we might want to know how large the measurement error can be or if the data has already been preprocessed before it was written to the file. Getting this information might be challenging because the person who conducted the experiment might be not available to you or the information is simply lost because nobody remembers and it hasn’t been documented.

WelDX solves this problem by enforcing that the experimental setup is actually documented and stored during the creation of a file. Therefore, it uses a dedicated data structure called the Measurement. Let’s get it out of our example file and explore the information it provides.

As always, we get us a quick overview of the file content to find out how to access the data:

from weldx import WeldxFile

wxfile = WeldxFile("single_pass_weld.wx")
/home/docs/checkouts/readthedocs.org/user_builds/weldx/conda/latest/lib/python3.10/site-packages/asdf/asdf.py:340: AsdfWarning: File 'file:///home/docs/checkouts/readthedocs.org/user_builds/weldx/checkouts/latest/doc/src/tutorials/single_pass_weld.wx' was created with extension URI 'asdf://weldx.bam.de/weldx/extensions/weldx-0.1.1' (from package weldx==0.6.0), which is not currently installed
  warnings.warn(msg, AsdfWarning)
wxfile.info()
root (dict)
├─TCP (LocalCoordinateSystem)
├─coordinate_systems (CoordinateSystemManager)
├─equipment (list)
│ ├─[0] (MeasurementEquipment)
│ ├─[1] (MeasurementEquipment)
│ └─[2] (MeasurementEquipment)
├─measurements (list)
│ ├─[0] (Measurement)
│ ├─[1] (Measurement)
│ ├─[2] (Measurement)
│ └─[3] (Measurement)
├─process (dict)
│ ├─shielding_gas (ShieldingGasForProcedure)
│ ├─weld_speed (TimeSeries)
│ ├─welding_process (GmawProcess)
│ └─welding_wire (dict)
│   ├─class (str)
│   ├─diameter (Quantity)
│   └─wx_user (dict)
│     ├─charge id (str)
│     └─manufacturer (str)
├─reference_timestamp (Timestamp)
├─welding_current (TimeSeries)
├─welding_voltage (TimeSeries)
├─workpiece (dict)
│ ├─base_metal (dict)
│ │ ├─common_name (str)
│ │ └─standard (str)
│ └─geometry (dict)
│   ├─groove_shape (VGroove)
│   └─seam_length (Quantity)
└─wx_user (dict)
  ├─WID (int)
  ├─operator (str)
  └─project (str)

From the file content we see, that there actually multiple Measurement objects stored under the key "measurements". Let’s extract the list and print the names of all measurements by using the name attribute of the Measurement class:

measurements = wxfile["measurements"]
for measurement in measurements:
    print(measurement.name)
welding current
welding voltage
temperature T1
temperature T2

From the output we learn that there are a current, voltage and two temperature measurements. We will pick the current measurement for further discussion:

current_measurement = measurements[0]

The Measurement class is just a data container that stores the name of a measurement, the data that belongs to it, and a special class called MeasurementChain. The MeasurementChain documents the setup of a measurement and provides a complete overview of the different involved processing steps. Let’s extract it from the Measurement class:

current_measurement_chain = current_measurement.measurement_chain

The easiest way to get an overview of the MeasurementChain is to call the plot function:

current_measurement_chain.plot();
../_images/05b27aaca6fe36afedca5f5733f627f0730ae762185a91e0f68e4029fe029df9.png

As you can see in the flow chart, we had an initial analog signal that was converted to a digital one by an AD converter. By applying the calibration, we finally got a digital signal that corresponds to the welding current. We only stored values after the last transformation step as measurement data.

The plot also shows us the formulas of the transformation step. Furthermore, the error percentage of the AD-conversion is shown.

5.3. Extracting the data#

With the get_signal_data function, we can extract the data from the MeasurementChain. But this requires us to provide the name of the signal that was recorded. The signal name is equal to the preceding transformation or source name. We could deduce this from the plot, but another way is to use the transformation_names and source_name functions.

current_measurement_chain.transformation_names
['AD current conversion', 'current calibration']
current_measurement_chain.source_name
'Current Sensor'

Because only the data after the calibration step was stored, we use "current_calibration" as input to get_signal_data.

current_data = current_measurement_chain.get_signal_data("current calibration")

The returned data is a TimeSeries that was introduced in an earlier tutorial. We can simply call its plot function to take a look at the data:

current_data.plot();
../_images/0496b1d5028805ce8600a36767d04358598e6e80ea305c69efb2da5a6495db5d.png

5.4. Conclusion#

This tutorial demonstrated that WelDX provides a class called MeasurementChain that captures not only the measurement data itself but also important meta data about how it was gathered. It has a useful visualization method that provides a quick overview over the experimental setup.

5.5. Further readings#

<< PREVIOUS TUTORIAL