File Format

For a combination of compression and speed, the file is currently saved within a zip container, as of version 2.0.10. The numpy arrays are separated from the main data, as numpy has an inbuilt pickle much more effective than cPickle.
While it can take around 25% longer to save, the file size has been cut by 80%.

 profile.data:
     _: Pickled data with numpy arrays replaced with integers (eg. data[Maps][Tracks][(1920, 1080)] = 3)
     n: The number of numpy arrays stored separately
     0-n: Numpy arrays pickled with numpy.save

Warning: As the format could change at any time, please use decode_file from /core/files.py to load a file.




Data Structure

The structure is typically updated for each version, either to add options or bring certain parts to be more in-line with others. It is recommended you use the inbuilt export options after loading the data.

 *map = {(<int> (width), <int> (height)): <numpy.array((height, width), dtype=uint64)}>
 *keys = {<str> (key): <int> (count)}

 Ticks: {
     Total: <int> (count),
     Recorded: <int> (count),
     Tracks: <int> (count),
     Session: {
         Total: <int> (count),
         Tracks: <int> (count)
     }
 },
 Maps: {
     Tracks: *map,
     Click: {
         Single: {
             Left: *map,
             Middle: *map,
             Right: *map
         },
         Double: {
             Left: *map,
             Middle: *map,
             Right: *map
         },
         'Session': {
             Single: {
                 Left: *map,
                 Middle: *map,
                 Right: *map
             },
             Double: {
                 Left: *map,
                 Middle: *map,
                 Right: *map
             }
         }
     }
 },
 Keys: {
     All: {
         Held: *keys,
         Pressed: *keys,
         Intervals: {
             Total: {<int> (period): <int> (count)},
             Individual: {<str> (key): {<str> (key): {<int> (period): <int> (count)}}}
         },
         Mistakes: {<str> (key): *keys}
     },
     Session: {
         Held: *keys,
         Pressed: *keys,
         Intervals: {
             Total: {<int> (period): <int> (count)},
             Individual: {<str> (key): {<str> (key): {<int> (period): <int> (count)}}}
         },
         Mistakes: {<str> (key): *keys}
     }
 },
 Time: {
     Created: <float>,
     Modified: <float>
 },
 TimesLoaded: <int>,
 Version: <str>,
 SessionStarts: [<float>, <float>...]