For all angles the tilt measurements were measured with the laser autocollimator described in the supplementary information, and the Tilt_setup folder.

All data described below is analysed in a Jupyter notebook in the `Analysis`

# Angle calibration

The laser autocollimator returns the position of the laser spot on the camera sensor in pixels, this was converted to tilt by measuring a ThorLabs [KMS/M Compact Kinematic Mirror Mount](https://www.thorlabs.com/newgrouppage9.cfm?objectgroup_id=52) as the knobs were rotated (15mrad per rotation).

During the calibration process the position of the reflected laser beam was constantly monitored by the camera sensor using the `tilt.py` code script inside folder `Experiment`. This data was saved inside HDF5 files inside folder `Raw_data`. These data files have names starting with the data and time the file was created and ending in `tilt.hdf5`. 


Each HDF5 file contains a subgroup called `data000`. This subgroup containing sequentially numbered datasets of 100 readings. The three columns for this data set are time in seconds, spot *x*-position in pixels, and spot *y*-position in pixels.

As the mirror was manually rotated readings were recorded by hand from the terminal output. The output gives mean x and y data, and the standard deviation of x and y data that correspond to these 100 reading groups. The HDF5 files can be used to verify suspected transcription errors. The transcribe results are in `tilt_labbook.txt`.

All adjustments were one sixth of a turn, achieved by rotating an Allen key into a mechanical stop. Separate calibration runs tilt around the x-axis and z-axis (as defined in the paper).


# Angular deflection of the stage under applied torque

To measure the tilt of the moving platform as torque is applied about the x axis, a device with a lever arm and a built in mirror was bolted to the moving platform.

The lever arm has trays at 0 mm, +/-25 mm and +/- 50 mm from the centre of the stage. Torque was applied to the stage by placing 10 g, 20 g and 50 g masses in these trays.

The data was collected by hand using the same method as described for the angular calibration. Again HDF5 files can be used to verify suspected transcription errors.



# Parasitic tilt

This experiment measures the parasitic tilt of the stage at different positions in its range of travel as it scans over a 3D square grid. Motion of the stage was monitored by counting the number of steps moved by the stage. Parasitic tilt of the stage was monitored by tracking the position of a light spot reflected off a mirror attached to the moving platform. Data collected were saved in HDF5 format due to its advantage at handling big datasets of different datatypes. A HDF5 file works like a python dictionary, containing nested groups of datasets. The data can be viewed using [HDFVIEW](https://www.hdfgroup.org/downloads/hdfview/) or packages such as [H5PY in Python](http://docs.h5py.org/en/stable/index.html).

The experiment code script used to perform the raster scan and characterise parasitic tilt is the 'tilt_raster.py' file inside folder `Experiment`. The data collected is saved in a folder named `Raw_data`. The analysis code used to analyse the collected data is saved in a folder named `Analysis`.

The standard raster scanning method takes as input the scanning range along all three axes in steps, and the movement distance between measurements in steps. Each set of measurement contains two reading. The position of the reflected laser beam as measured by the camera sensor in pixels and the stage position obtained by counting the number of steps moved by the stage. The algorithm works by first moving the stage by half the scanning range along all three axes in the negative direction. It then records a set of measurement and moves the stage along _x_ by one movement size in the positive direction. This process is repeated until the entire _x_ range is scanned. Upon the completion of a row, a set of measurement is recorded, and the stage is moved back by the _x_ scanning range and one movement size along _z_ in the positive direction. This process is repeated until every row in the _z_ scanning range is scanned. Upon the completion of a plane, a set of measurement is recorded, and the stage moves back by the _x_ and _z_ scanning range and one movement size along _y_ in the positive direction. This process is repeated until every plane in the _y_ scanning range is scanned. Upon on the completion of all three axes, a set of measurement is recorded, and the stage is moved back by half the scanning range along all three axes to the initial position.

The `tilt_raster.hdf5` file inside folder `Raw_data ` contains a data group named `raster000` which includes parasitic tilt data over a 50000 steps by 50000 steps by 50000 steps range with a movement size of 5000 steps between measurements. The `raster000` group contains a subgroup called `standard_raster000`. The name of this subgroup specifies the name of the raster scanning method used. The `standard_raster000` subgroup contains 1000 datasets recorded at the grid points of a 10-by-10-by-10 square grid. Each dataset contains two arrays. The three-element array inside `cam_position` includes the measurement time (first element), the _x_ position of the reflected light spot as measured by the camera (second element), and the _y_ position of the reflected light spot as measured by the camera (third element). The three-element array inside `stage_position` includes the stage position obtained by counting the number of steps moved by the stage, where the first element is stage _x_ position, the second element is stage _y_ position and the third element is stage _z_ position.

