zwiftout/src/stats/tss.ts

36 lines
1.0 KiB
TypeScript

import { Interval } from "../ast";
// Training Stress Score formula from Training and Racing with a Power Meter:
//
// TSS = (s * W * IF) / (FTP * 3600) * 100
//
// s - duration in seconds
// W - power in watts
// IF - intensity factor (power / FTP)
const steadyTss = (duration: number, intensity: number): number => {
return ((duration * intensity * intensity) / 3600) * 100;
};
const rangeTss = (duration: number, from: number, to: number): number => {
let score = 0;
const step = 1;
for (let i = 0; i < duration; i += step) {
const intensity = from + (to - from) * (i / duration);
score += steadyTss(step, intensity);
}
return score;
};
const intervalTss = ({ duration, intensity }: Interval): number => {
if (intensity.from === intensity.to) {
return steadyTss(duration, intensity.from);
} else {
return rangeTss(duration, intensity.from, intensity.to);
}
};
export const tss = (intervals: Interval[]): number => {
return intervals.map(intervalTss).reduce((a, b) => a + b, 0);
};