WARNING: 🚧 This is work in progress, please read with care. 🚧
The goal of this text is to provide a brief overview of the
.c2d file format from Cyclus2 ergometers by RBM
elektronik-automation GmbH. The text gives an overview what kind of
data is contained and how it is organized. The intended audience are
users who want to extract their research- or training-relevant data from
.c2d files for analysis in R. Any contained data for
internal use by the Cyclus2 software is not of interest and thus omitted
here.
Disclaimer
This text is neither an authorative nor comprehensive reference for
the .c2d file format. The descriptions are based on the
authors’ understanding, some of which was verified with RBM, but some of
which is based on guesses and may be incomplete or inaccurate.
Structure overview
Technically, .c2d files are gzip-compressed XML text
files with Cyclus2-specific content. Let’s take a tour through an
simplified .c2d file to get an overview of its structure
and content. The rough XML structure inside a .c2d file
consists of 3 main nodes called System,
Program, and Training:
-
Systemcontains information about the athlete, the bike settings, and the environment. -
Programcontains information about the Cyclus2 program. -
Trainingcontains the data of the training session, including the date, the header, and the row data for each time point.
<?xml version="1.0" encoding="UTF-8"?>
<BODY_50>
<C2D>
<System>
<Athlete>[...]</Athlete>
<CycleData>[...]</CycleData>
<Field>[...]</Field>
<VirtDerailleur>[...]</VirtDerailleur>
<SysName>somename, somefirstname</SysName>
</System>
<Program>
[...]
</Program>
<Training>
<Date>somedate,sometime</Date>
<Header>someheaders</Header>
<Run>
<RRInt>somerrint</RRInt>
<Count>somecount</Count>
<Rows>
[...]
</Rows>
<Delay>somedelay</Delay>
</Run>
</Training>
</C2D>
</BODY_50>System content
The System node contains information about the athlete,
the bike settings, and the environment.
Athlete content
The Athlete node contains information about the athlete,
see manual section “6.1. Athlete data”. All are user-entered in the
Cyclus2 menu item System > Athlete Settings.
Here an example of an Athlete element:
<Athlete>
<Firstname>somefirstname</Firstname>
<Name>somename</Name>
<Sex>1</Sex>
<DoB>05/25/1974 12:00:00 AM</DoB>
<Area>0.44</Area>
<Weight>69.0</Weight>
<Height>1.840</Height>
<Cw>0.715</Cw>
<tp>[...]</tp>
</Athlete>Here a description of the elements:
-
Firstname: String for the first name. -
Name: String for the family name. -
Sex: Numeric code for the sex; value1for “male”? FIXME: Check for other possible values. -
DoB: Date of birth, in the format “MM/DD/YYYY 12:00:00 AM”. -
Area: Drag Area in square meters (m²), see manual. -
Weight: Weight in kilograms (kg). -
Height: Height in meters (m). -
Cw: Drag coefficient, see manual. -
tp: Obsolete; was used for encrypted credentials for online training platforms like TrainingPeaks.
CycleData content
The CycleData node contains information about the bike
settings, see manual section “6.2. Bike settings”. These bike parameters
are user-entered in the Cyclus2 menu item System > Bike
Settings. (Note that their units may be different, e.g., Crank
Length is entered in millimeters, but saved in meters inside the
crank element). The bike parameters must accurately
correspond to the actual, physical bike used for ergometry, because they
enter the calculations for the values pedal force, cadence, speed,
inclination and cycled distance.
Here an example for CycleData node; all contain numeric
values.
<CycleData>
<crank>0.1725</crank>
<perim>2.113</perim>
<weight>8</weight>
<front>52</front>
<rear>11</rear>
<vfront>53</vfront>
<vrear>17</vrear>
</CycleData>Here the element desriptions, though some still seem slightly unclear.
-
crank: The crank length, in meters (m). -
perim: The wheel perimeter/circumference, in meters (m). -
weight: The bike weight, in kilograms (kg). -
front: The number of teeth on the physical/real front chain ring. -
rear: The number of teeth on the physical/real rear sprocket. -
vfront: FIXME: Unclear? Probably the number of teeth on the virtual front chainring, for virtual gear settings. -
vrear: FIXME: Unclear? Probably the number of teeth on the virtual rear sprocket, for virtual gear settings.
Field content
The Field node contains information about the
environment, see manual section “6.3. Environmental conditions”. These
are user-entered in the Cyclus2 menu item System >
External Conditions.
Here an example of a Field node:
Here the elements’ meanings:
-
AirDens: Air density, in kilograms per cubic meter (kg/m³), see manual. -
FricIdx: Friction index, important for the track simulation, see manual.
Program content (omitted)
The content of the Program node is currently left
undescribed. It contains internal information about the Cyclus2 program,
but does not appear to be of primary interest for general data
analysis.
Training content
The Training node contains the data of the training
session.
Here a reduced example from a Wingate test, but note that the recorded columns vary depending on the Cyclus2’s program. See below for all possible headers and column data.
<Training>
<Date>7/15/2025 1:23:42 PM</Date>
<Header>idStageIndex;idTime;idDistance;idRevolutions;idWork;idHeartrate;idCadence;idTorque;idRelTorque;idPower;idRelPower;idPedalForce;idRelPedalForce;idSpeed;idTransmission;idInclination;idWorkPerBeat;idCdA;idCurrent;idMotorTemperature;idFrameTemperature;idFlags;idMemory</Header>
<Run>
<RRInt>682;667;707;670;625;617;601;557;566;546;545;535;523;515;515;506;500;492;484;479;472;464;460;456;449;445;445;437;424;429;425;417;417;413;410;410;402;402;402;401;398;398;394;394;397;390;389;394;390;386;390;386;393;382;394;382;386;385;382;382;386;382;382;381</RRInt>
<Count>301</Count>
<Rows>
<R0>0;0;0.00;0;0.00;94;71;20.1;0.27;150;2.02;118.1;1.59;37;8.61;-1.04;96;0.3146;7.1;34;29;34;749240300</R0>
<R1>0;100;1.02;0;38.85;94;71;52.0;0.70;388;5.22;306.0;4.11;37;8.61;1.81;248;0.3146;16.7;34;29;32;749240300</R1>
[...]
<R300>0;30000;464.14;54;17610.36;156;102;52.0;0.70;556;7.48;306.0;4.11;53;8.61;-0.73;214;0.3146;24.2;34;29;32;749248500</R300>
</Rows>
<Delay>191</Delay>
</Run>
</Training>- The
Dateelement contains the date and time of the training, in the format “MM/DD/YYYY HH:MM:SS (AM)|(PM)”. - The
Headerelement contains the column names for the data inRows, separated by semicolons. - Inside the
Runnode:- FIXME: What’s the meaning of
RRInt? - The number inside
Countis the number of headers and elements insideRows. - Inside
Rowsare elementsR[0-9]*that each contain the data for one time point, with values separated by semicolons. - FIXME: What’s the meaning of
Delay?
- FIXME: What’s the meaning of
Possible headers and column data
Below is a list of possible Header values and their
corresponding data in Rows, though that’s work in progress!
Any particular .c2d file only contains a subset of all
possible variables. Note that the list’s numbering matches the
enum from RBM’s internal code, in case that becomes
relevant at some point.
-
idCadence: Cadence in revolutions per minute (1/min) -
idHeartrate: Heart rate in beats per minute (1/min) -
idSpeed: Speed in kilometers per hour (km/h) -
idTransmission: Transmission, unitless -
idPedalForce: Pedal force in newtons (N) -
idPower: Power in watts (W) -
idInclination: Inclination in percent (%) -
idWorkPerBeat: Work per beat in joules (J) idLactateidNone-
idTorque: Torque in newton meters (Nm) -
idCdA: CdA in square meters (m²) -
idCurrent: Current in amperes (A) -
idTime: Time in milliseconds (ms) -
idDistance: Distance in meters (m) -
idRevolutions: Number of revolutions, unitless -
idWork: Work in joules (J)
Relative IDs, added in July 2020
-
idRelPower: Relative power in percent (%) -
idRelTorque: Relative torque in percent (%) -
idRelPedalForce: Relative pedal force in percent (%)
Acceleration IDs, added in May 2020
idAngularAccelerationidAccTorqueidAccPoweridAccPedalForceidAccWorkidAccWorkPerBeat
Bluetooth IDs, added in May 2020
idBtRRIntervalidBtPoweridBtCadenceidDeltaPoweridBtLactateidBtVO2idBtRelVO2-
idBtCO2: placeholder for future VO2Master -
idBtRER: placeholder for future VO2Master
Bluetooth IDs for VO2Master, added in Aug 2021
-
idBtRf: respiratory frequency -
idBtTv: tidal volume -
idBtVe: ventilation
idBtSmO2idBtTHb
Bluetooth IDs, added in Jan 2022
idBtCoreBodyTemperatureidBtSkinTemperature
-
idDio: state of digital inputs and outputs from SyncInterface, added in June 2024
Diagnosis IDs, added in May 2020
-
idMotorTemperature: Motor temperature in degrees Celsius (°C) -
idFrameTemperature: Frame temperature in degrees Celsius (°C) idBatteryCapacity-
idFlags: Flags as bitmask -
idMemory: Memory use in bytes (B)
-
idStageIndex: Stage Index; new since Aug 2021, such that jumps in stages remain visible/traceable -
StageIndex: previous name foridStageIndex, since Aug 2020 value changed from 31 to 63 such that a 64-bit flag can be derived from it
UNKNOWN_VALUE
The following two values are commented out and thus have no
enum numbers assigned:
-
idPostLactate: Lactate following workload -
idRegenerationHeartRate: Heart rate in regeneration intervals