Incorrect pool swim interval data

Hi there. Absolutely love your platform! So much flexibility and data, yet incredibly user friendly!

I understand the swim feature is under development, but still wanted to note there are huge discrepancies between my 25m pool swim intervals on Strava and Intervals. If this is easily solved via settings somewhere, please let me know as I haven’t found it myself.

I’ve attached screenshots from two recent indoor 25m pool swims, doing warmup at varying speeds and lengths and then main sets (between 100-300m intervals). The original data is from a Coros Pace 2 directly uploaded to Strava. My watch records active and rest time separately, as can be seen on the Strava intervals quite clearly. The total swim work time and distance on Intervals are correct. Total intensity and load also feel in the right zones, so not too worried on how this affects my overall training load and fatigue, just a data nerding thing.

Any suggestions on what to do with this?

Thanks a million!






Unfortunately the stream data from Strava has movement in the “rest” laps. The highlighted cells below show velocity inside lap 2 which is why it ends up being approx 10m long in Intervals.

I think the laps displayed by Strava are “real” laps from the device. Intervals.icu maps the laps back to the underlying data so it can build intervals for them.

If you can get a fit file from your Coros watch you can try uploading that and see if it is better.

@Piet_van_Vliet Just want to followup on this old thread for all those that search and find it like me. I ran into this same issue and did as @david suggested and uploaded the .fit file directly into intervals.icu instead of relying on my strava connection and it fixed it this. Now the lap and pace data are correct.

1 Like

Thanks! I just recently started swimming again and giving up my TP subscription to go all in on ICU because I genuinely like the interface and customization much better. Just like to preface all of the following with that I’m still figuring stuff out, so this is more of a summary of discrepancies than a final verdict.
The swim calculations are still off. First, even when I upload the (Coros Pace 2) .fit files, the total activity time appears to be vastly underestimated (see example) and the average swim pace vastly overestimated (even if this is a total time versus work time issue, the TP calculated average appears more in line with the paces of individual intervals than the ICU calculated average). The individual interval times appear mostly correct though (with just some recovery recognized as work, which I’d think would actually add to total time, not subtract from it). Second, there are also still discrepancies in how load is calculated between my TP and ICU. I noticed that in my settings, the TP calculation shows a 96-102% z4 range around my 1.40 threshold, whereas ICU shows a 95-100% range, so that maybe affects it. Third, when files were uploaded to Strava and from there to ICU, the ICU TSS was 150% that of TP sTSS (based on the last 13 pool swims). When I uploaded the .fit files directly to ICU (just the last 3 pool swims), ICU TSS increased from 145% of TP sTSS to 190% TP sTSS. I will admit TP sTSS has always felt a little too low, but the ICU TSS seems way too high IMHO. Maybe I can artificially tweak this by setting my ICU threshold to 1.35 or something. Not sure what to do.

Intervals.icu displays the moving time of activities (47m55s) and not elapsed time (1h11). The pace is moving time / distance which is approx 93s per 100m in this case.

Supposedly Intervals.icu calculates swim TSS in the same way as TP:

tss = 1;
if (moving_time <= 0) return;;
double mins = moving_time / 60.0;
double metersPerMin = distance / mins;
double metersPerMinFtp = threshold_pace * 60.0;
intensity = metersPerMin / metersPerMinFtp;
if (intensity >= 2.0) return; // probably dodgy moving time
double hours = moving_time / 3600.0;
tss = (int)(intensity * intensity * intensity * hours * 100.0 + 0.5);

Note that threshold_pace is in meters/second.

You could use load from HR instead? This comes out at 51 for that swim.

Thanks! The average pace (93s/100m) is way faster than I actually went though. The majority of my intervals (200-400m or warm up) was well into the 1.40-1.50’s, with only a couple 50m sprints between 1.30-1.35. Seems very unlikely my overall pace would have been 1.33/100m.

I could use HR as my watch actually seems capable of recording that properly, but that would have the same drawbacks as using HR for running/cycling. Probably even worse, since for our pool swims we do a lot of short/medium intervals where my HR doesn’t even have time to go up by much, so would vastly underestimate the actual effort I’m putting in. I did notice in the meantime that, for the example shown, the IF on TP is much lower (0.73) compared to ICU (0.91). So when using IF to correct sTSS, 0.91x0.91x0.91=0.75 will of course give much higher final TSS than 0.73x0.73x0.73=0.38. In fact, 0.75/0.38=197%, which is close (albeit not exact) to the 190% higher TSS in ICU compared to TP for my last three swims. For the other two swims, the TP/ICU IFs are 0.76/0.84 and 0.75/0.91. So maybe this is where those differences are coming from?

Ultimately, I mostly care about using TSS to prevent overtraining (as my fitness feeling generally supercedes what my body can actually handle), so if I can just figure out something that a) reflects what I can manage long-term and b) helps to somewhat estimate similar TSS when exchanging a swim with a bike effort for example, then that’s all that matters for me in the end.

The laps that the intervals have been generated from include not moving time and I think that is why the pace seems slower. You can see that in the first 200m interval here:

I think TP is probably including the not moving time in the pace calc which would throw off the intensity numbers. The doc says not but it is quite old:

“2. Determine time to cover total distance (not including rest periods)”

@david I’ve been having the same problem. And yes today I traced the problem using the streams ‘csv’ file which shows what might be interpreted as ‘not moving’ times for each flip turn (or open turn). These are the time I am spending turning and gliding. The ‘moving’ time returns as soon as I start to stroke. An example…

|time|cadence|heartrate|distance|velocity_smooth|

|21|29|98|22.86|1.42875|
|22|0|101|22.86|0|
|23|0|104|22.86|0|
|24|0|107|22.86|0|
|25|0|110|22.86|0|
|26|0|111|22.86|0|
|27|0|111|22.86|0|
|28|28|112|24.003|1.143|

My actual moving time including flip and glid for the session is 2241s whereas ICU’s moving time is 1996s. So the ICU load ends up being 90 vs. 71 for what I would consider to be the more appropriate moving time. (The other way to look at this is that those holes in the stream, from a velocity accuracy point of view, result in times which would need to be paired with the length of the pool minus the turning glide length.)

Perhaps you might consider calculating moving time, and therefore IF & Load from the interval data or perhaps provide the option to do so. Example…

And let me also say how wonderful and fantastic your platform is. So many heartfelt thanks to you my good and fine sir. :slight_smile: :smiley:

So calculate moving time for pool swims using the total elapsed time of all the work intervals? That would work for your file with those “not moving” gaps between each length. The lengths in the file are each a bit short which is making the gaps. Piet van Vliet’s swims don’t have those gaps.

I noticed that the laps in your file end in the middle of a length a lot of the time. Is that correct?

Beginning to much better understand my data here. Thanks! With the risk of side tracking this discussion (just let me know if you prefer I start a separate one), but if I understand it correctly, recovery is not considered for the calculation of IF on ICU, whereas it does seem to be on TP. For my biking and running, I either softly pedal or jog, so I’m almost never not moving, and I presume ICU would take that into account for IF. For swims, I do short standing rests between intense intervals (20-30") and slow swims in between sets (e.g. 50-100m easy). For the within set recovery, this means that it does not matter for ICU IF if I recover 10 seconds or 30 seconds, since it only considers moving time. However, a 10 vs 30 second recovery between intervals does definitely affect how fast I can swim during those intervals. So I would think the recovery times should be considered part of the overall IF calculation. Please let me know if I’m understanding the calculations incorrectly of course.

1 Like

For cycling, running etc. Intervals.icu only considers moving time for the TSS calculation. Otherwise a 30 minute coffee stop in the middle of a ride will increase the TSS and I don’t think that makes a lot of sense.

But maybe it would be better to do it differently for swims? Do your laps include rest time?

What you could do now is use the ATL/CTL factors in /settings to generally reduce swim TSS:

Ha. Maybe I should just have coffee breaks during the swim too. Maybe in the summer. At the beach. :slight_smile:

My watch records workout and recovery separately, which appears accurately reflected in my direct fit file uploads. But I do swim mostly in 25m pools, so there’s a lot of flipping and turning that is then not counted as work. TP also states that recovery and flip turns are not reflected in their calculations. I am neither a sports or data scientist, but would argue that excluding flip turns is not reflective of the actual effort. Even though I’m not moving horizontally, I’m still ‘working’ and thus flips should count as part of the interval pace IMHO. Only when I hit my watch button does my interval end (even though flips come with other variables like turning and push off speed, which affect interval time too).

With regard to recovery (or a coffee break) affecting overall TSS: in my mind, more recovery = lower overall intensity, whereas less recovery = higher overall intensity, even if my pace will likely be lower with shorter recovery between intervals. Since including recovery time for TSS would artificially inflate TSS, my feeling is that with TSS based on work (including flips) and IF based on work+recovery, TSS x IF could then be used to correct for the difference between for example 10 x 25m with 10" recovery vs 10 x 25m with 40" recovery (as long as recovery is non-moving of course). I realize this is not how IF is officially calculated though.

For now, I’ve set my ICU swim threshold at 1:35 (which normally hovers around 1:40 based on CSS) and that seems to yield TSS and IF that fits my RPE.

Unrelated to exact calculations: an additional problem for me specifically may be that whereas I can out sprint some of my fellow swim mates on 25-50m intervals, I can barely keep up during 400m intervals (worse technique and lactate clearance probably). So maybe the load and IF of my swims will simply always depend more on my work out type than whether its calculations properly reflect sTSS.

Really appreciate the discussion by the way. It’s helping a lot with future interpretation of TSS.

3 Likes

Very interesting discussion. I’m starting to swim again and I’m also swapping my data from TP to ICU during the coming weeks. I can see the same differences and my laps are not as nicely “cut off” as Strava or Garmin. I also finally found the “drill” button/data screen on my Garmin, so I’m going to play with this and see what happens. This “drill” functionality gives the opportunity to include non-arm-swinging technique drills. I wonder if ICU will see this as moving time or recovery or nothing? (it suppose to give a timing + manual entry of distances after the drill).

I will upload some pictures in this thread after my next swim.

Thx.

1 Like

I did my first swim of the year. Here are some screenshots ICU vs TP vs GC.
[Fenix5s + HRM pro chest strap].

I did use the “drill” functionality for the first time, and it worked pretty fine. (If you use the correct lap-button…). Now I can add laps manually after each drill. Easy to add the correct pool distances for each drill, because without arm-swinging, my garmin doesn’t record any distance. If you see 3x rest after some laps, this means I hit the wrong button :wink:

Remarks:

  • Strange way of splitting all the different laps in ICU. Distances are not exactly 100m, but cut-off. This gives an incorrect lap pace/100m. However, the overall distance of 2600m is correct.
  • With an incorrect lap pace, also comes an incorrect time in zone (pace). ICU vs TP.
  • IF/sTSS for TP = 0.95/71, IF/hrTSS for TP = 0.77/55, IF/load for ICU = 0.63/43 → big difference even though the pace-zones are set equally, but the lap-results are different ICU vs GC/TP.
  • No “name” for each lap. Would be nice if the recognized stroke (freestyle/breaststroke/drill/…) could be mentioned on top. (cfr GC and TP).
  • Moving time and avg pace seems to be the same for all 3 platforms.
  • Extra fields to add for ICU: stroke length/avg stroke/swolf/… See GC.







Any other remarks always welcome.

1 Like

Tx for all this info. I need to sink some more time into improving swims and will try to do so soon.

9 Likes

Very happy that I can now directly upload my Coros (Pace 2 for swim & run) data to intervals directly instead of via Strava or manual fit uploads.

I noticed that intervals has now retroactively reset my work & recovery as well as the exact distance for my swims (going back two months but not beyond that), which is what I hoped for. However, for those reset swims, the average pace now appears 20s/100m faster than what it should be based on the Coros average pace calculation. This now artificially inflates the load (often >100 for a <60m total work time) even when those individual work paces rarely go below my Settings threshold pace (in a typical session, roughly 2/3rds is warm up and drills well above threshold pace and only 1/3rd is actual effort at or slightly below threshold pace).

Any idea what’s going on here for (a) the average pace issue and (b) the resetting actual workout, recovery, and distance for swims dating back two months but not beyond that?

Thanks !

1 Like

Can you give me an example swim on Intervals.icu and info on what correct numbers are and I can try figure this out. Intervals.icu uses the length data to generate activity traces for swims.

When you connect Coros the last 30 days or so of activities are downloaded. These will replace ones from Strava (the reset). You can use the “Download old data” button in the Coros box in /settings to get older data.

Apologies for the delay, Busy work week. And thanks in advance for looking into it again. Makes sense about the historical activities.

I also reread the thread and forgot Daniel and I noted in November that Intervals may miscalculate the total activity/moving time, which could have been a moving time versus elapsed time issue or even a not moving during flip turns issue (and then I got sidetracked with IF calculations). Not sure though if that still applies since the interval data for individual 50/100/200/etc sets seems to be correct in these sessions and it’s just the average pace that’s off. When I look at intensity in the interval data, that seems correct, since it’s all just below or above my threshold and I suppose that then works though to calculating load.

For direct Coros to Intervals uploads, please see examples below (all from last 30 days). I’ve noted the dates and the Intervals/Coros calculated paces as well.

Intervals.icu (17 april; Intervals/Coros average pace 1.31/1.44)
Intervals.icu (13 april; Intervals/Coros average pace 1.35/1.45)
Intervals.icu (30 march; Intervals/Coros average pace 1.32/1.43)
Intervals.icu (27 march; Intervals/Coros average pace 1.24/1.41)

Although I regularly hit sub-1.35 paces on my 50m and 100m intervals, I barely get below 1.35 on longer intervals and definitely not during warm up / drills. So the overall session average pace being faster than my threshold pace seems unlikely (especially when it’s 10 seconds faster than my CSS).

If it helps, our sessions are in 25m pools and generally scheduled as warm up → 50m activation intervals → main set one with a bunch of drills, including some legs only which always result in distance miscalculations on my watch → main set two with 50/100/200/400 intervals at CSS +/- X seconds (sometimes with standing rest, sometimes easy 50/100m in between) → cool down. Sometimes we skip the drills, but not often.

For indirect Coros to Strava to Intervals uploads:

Intervals.icu (16 march; Intervals/Coros average pace 1.45/1.44)
Intervals.icu (13 march; Intervals/Coros average pace 1.51/1.50)
Intervals.icu (9 march; Intervals/Coros average pace 1.46/1.45)
Intervals.icu (6 march; Intervals/Coros average pace 1.43/1.42)

I did notice that Intervals marked everything as work in the indirect Coros/Strava/Intervals uploads but that it still gets the average pace very close even though there’s a lot of unlabeled recovery in there. Since Intervals still got the approximate intensity and load close to what I felt it should be, it worked out fine to track my fitness, etc. For the direct Coros to Intervals uploads, this is no longer the case.

I can provide original fit files for all if you’d like those. Just let me know the preferred way to securely share them. I’d rather not download all old data right now since that’s likely to mess with historical TSS and CIL as well, but I can upload a couple of them just for the troubleshooting.

It seems the calculated moving time for the swim is too short pushing up the average pace. I am trying to figure out why. Intervals.icu needs to recalculate that (and other things) from the data to support cropping and so on.

Ok. Thanks again! Hope it can be resolved.