File Format
Experiments are stored in up to three files. Description of experiment is stored in text *.exp file. The recorded data are stored in binary *.d01 file. When an experiment contains large parameter arrays (more than 1000 elements), those arrays are stored in an optional binary sidecar *.bip file instead of inline in the *.exp file.
Structure of *.d01 file
| Name | Type | Description |
|---|---|---|
| Data amount | unsigned 32 | Number of recorded variables stored. |
| Data format | unsigned 32 | 0 - data stored in double format, 1 - data stored in float format. |
The following two sections are repeated a number of times equal to the Data amount value.
| Name | Type | Description |
|---|---|---|
| Data dimension | int 32 | The number of dimensions of stored data. |
| Array of dimensions | (int 32)*4 | The sizes of dimensions. |
| Overall data size | int 32 | The size of data stored. Equal to the product of all dimension sizes. |
| Data | (Overall data size) * sizeof(double or float) | Data stored in c-style 1D array: [(0,0,0,0), (1,0,0,0), …, (n,0,0,0), (0,1,0,0), …, (n,m,k,l)]. Fastest index corresponds to transient axes, slowest to Z-axes. |
Structure of *.exp file
The exp file is written in Windows ini-file style. Section names are enclosed in square brackets []. Fields have field_name = field_value format. The order in which fields appear within one section is insignificant. Some sections contain plain text. Required sections are marked in red. Section and field names with_underline stand for arbitrary names. Field names in bold are reserved words.
| Section | Field | Value | Description |
|---|---|---|---|
| [general] | name | string | The name of the experiment. |
| [text] | - | plain multiline text | Any text (sample description). |
| [sweep] | - | - | Experimental axis definition. |
| transient | string | Transient axis. Format: T/I, trace_length, rep_number, first_stream_name[, second_stream_name[, …]]. T = transient trace stored; I = trace integrated, only integral stored. Example: transient = I,200,30,a,b — 200-point transient, integrated, 30 shots per loop, streams a and b. For single-point devices trace length is 1. Streams must be defined in the [aquisition] section. | |
| sweep0/1/… | string | Scan axes. Format: X/Y/Z/S/P, trace_length, rep_number, par_name[, …]. Example: sweep0 = X,128,1,T1. The definition order sets the axis presentation order. Data are stored as a 1D c-style array, fastest to slowest: I/T, X, Y, Z. S(um) and P(arameters) axes do not increase stored data amount. Parameters must be described in the [params] section. | |
| [presetup] | var_name | string | Actions before the experiment. Format: value; property@device. Example: Delay = 10 ms;Delay@ADC. |
| [aftersetup] | var_name | string | Actions after the experiment. Format: value; property@device. Example: Delay = 10 ms;Delay@ADC. |
| [eachpoint] | var_name | string | Actions executed at each point. Format: value; property@device. Example: Delay = 10 ms;Delay@ADC. |
| [params] | - | - | Parameters of the experiment. |
| par_name | string | Format: value; property@device. Value forms: (i) comma-separated list; (ii) first_value step increment; (iii) first_value to last_value; (iv) @bip — large array stored in the *.bip sidecar file (see below). Examples: T1 = 40 ns step 20 ns;PPL variable or RF = 40 MHz to 60 MHz;Freq@Gen1. | |
| [aquisition] | - | - | Acquisition streams. |
| stream_name | string | Format: property@device. Example: a = In_Ch0@PulseGen. | |
| [program] | - | plain multiline text | Pulse program. |
| [streams] | - | - | Supporting information about data streams. |
| names | comma-separated list | Names of data streams (may differ from acquisition stream names). Example: names = Re, Im. | |
| units | comma-separated list | Units of data streams. Example: units = V, V. | |
| dwelltime | comma-separated list | Dwell time of transient data streams. Example: dwelltime = 10 ns, 10 ns. | |
| [device_name] | any_field | device dependent | Any information a device chooses to store in the exp file. |
Structure of *.bip file
The *.bip file is a binary sidecar that stores experiment parameter arrays too large to be written compactly in the *.exp file (threshold: 1000 elements). Its name matches the *.exp file with the extension replaced by .bip. In the *.exp file the corresponding parameter value is stored as the literal string @bip to signal that the actual data must be read from the sidecar.
File header:
| Field | Type | Description |
|---|---|---|
| Magic | char[4] | Always BIP1 (ASCII, no null terminator). Any other value indicates a corrupt or incompatible file. |
| Count | uint32 | Number of parameter entries stored in this file. |
The following record is repeated Count times, once per parameter:
| Field | Type | Description |
|---|---|---|
| name_len | uint32 | Byte length of the parameter name string. |
| name | char[name_len] | Parameter name (no null terminator). Matches the name used in the *.exp [params] section. |
| unit_len | uint32 | Byte length of the unit string. |
| unit | char[unit_len] | Unit string (no null terminator), e.g. ns, MHz. |
| sig_digit | uint32 | Number of significant digits used when displaying this parameter. |
| data_type | uint32 | Element format: 0 = double (8 bytes), 1 = float (4 bytes). Current writer always produces 1 (float). |
| elem_count | uint32 | Number of elements in the array. |
| data | float[elem_count] or double[elem_count] | Raw array values in native binary format, elem_count × sizeof(float or double) bytes. All values are in the parameter's native unit. |

