Skip to contents

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:

  • System contains information about the athlete, the bike settings, and the environment.
  • Program contains information about the Cyclus2 program.
  • Training contains 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; value 1 for “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:

<Field>
  <AirDens>1.202</AirDens>
  <FricIdx>1</FricIdx>
</Field>

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.

FIXME: VirtDerailleur content

Here an example:

<VirtDerailleur>
  <UserCas>11;12;13;14;15;16;17;19;21;23;25</UserCas>
  <UserCr>39;53</UserCr>
  <Cassette>1</Cassette>
  <Chainrings>3</Chainrings>
</VirtDerailleur>

FIXME: Describe them!

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 Date element contains the date and time of the training, in the format “MM/DD/YYYY HH:MM:SS (AM)|(PM)”.
  • The Header element contains the column names for the data in Rows, separated by semicolons.
  • Inside the Run node:
    • FIXME: What’s the meaning of RRInt?
    • The number inside Count is the number of headers and elements inside Rows.
    • Inside Rows are elements R[0-9]* that each contain the data for one time point, with values separated by semicolons.
    • FIXME: What’s the meaning of Delay?

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.

  1. idCadence: Cadence in revolutions per minute (1/min)
  2. idHeartrate: Heart rate in beats per minute (1/min)
  3. idSpeed: Speed in kilometers per hour (km/h)
  4. idTransmission: Transmission, unitless
  5. idPedalForce: Pedal force in newtons (N)
  6. idPower: Power in watts (W)
  7. idInclination: Inclination in percent (%)
  8. idWorkPerBeat: Work per beat in joules (J)
  9. idLactate
  10. idNone
  11. idTorque: Torque in newton meters (Nm)
  12. idCdA: CdA in square meters (m²)
  13. idCurrent: Current in amperes (A)
  14. idTime: Time in milliseconds (ms)
  15. idDistance: Distance in meters (m)
  16. idRevolutions: Number of revolutions, unitless
  17. idWork: Work in joules (J)

Relative IDs, added in July 2020

  1. idRelPower: Relative power in percent (%)
  2. idRelTorque: Relative torque in percent (%)
  3. idRelPedalForce: Relative pedal force in percent (%)

Acceleration IDs, added in May 2020

  1. idAngularAcceleration
  2. idAccTorque
  3. idAccPower
  4. idAccPedalForce
  5. idAccWork
  6. idAccWorkPerBeat

Bluetooth IDs, added in May 2020

  1. idBtRRInterval
  2. idBtPower
  3. idBtCadence
  4. idDeltaPower
  5. idBtLactate
  6. idBtVO2
  7. idBtRelVO2
  8. idBtCO2: placeholder for future VO2Master
  9. idBtRER: placeholder for future VO2Master

Bluetooth IDs for VO2Master, added in Aug 2021

  1. idBtRf: respiratory frequency
  2. idBtTv: tidal volume
  3. idBtVe: ventilation

  1. idBtSmO2
  2. idBtTHb

Bluetooth IDs, added in Jan 2022

  1. idBtCoreBodyTemperature
  2. idBtSkinTemperature

  1. idDio: state of digital inputs and outputs from SyncInterface, added in June 2024

Diagnosis IDs, added in May 2020

  1. idMotorTemperature: Motor temperature in degrees Celsius (°C)
  2. idFrameTemperature: Frame temperature in degrees Celsius (°C)
  3. idBatteryCapacity
  4. idFlags: Flags as bitmask
  5. idMemory: Memory use in bytes (B)

  1. idStageIndex: Stage Index; new since Aug 2021, such that jumps in stages remain visible/traceable
  2. StageIndex: previous name for idStageIndex, since Aug 2020 value changed from 31 to 63 such that a 64-bit flag can be derived from it

  1. 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