diff --git a/rowers/datautils.py b/rowers/datautils.py index a13709f9..d0d9fe23 100644 --- a/rowers/datautils.py +++ b/rowers/datautils.py @@ -5,6 +5,7 @@ from scipy.interpolate import griddata from scipy import optimize from rowers.mytypes import otwtypes, otetypes, rowtypes +from rowers.models import Workout p0 = [190, 200, 33, 16000] @@ -22,6 +23,31 @@ rpetotss = { 10: 140, } +def rscore_approx(row): + if row['rscore'] > 0: + return row['rscore'] + if row['rscore'] == 0: + if row['hrtss'] > 0: + return row['hrtss'] + else: + dd = 3600*row['duration'].hour+60*row['duration'].minute+row['duration'].second + dd = dd/3600 + print(row['rpe'],dd,rpetotss[row['rpe']]) + return rpetotss[row['rpe']]*dd + if row['rscore'] < 0: + w = Workout.objects.get(id=row['id']) + trimp, hrtss = dataprep.workout_trimp(w) + rscore, normp = dataprep.workout_rscore(w) + if row['rpe'] and row['rpe'] > 0: + dd = 3600*row['duration'].hour+60*row['duration'].minute+row['duration'].second + dd = dd/3600 + return rpetotss[row['rpe']]*dd + else: # pragma: no cover + minutes = row['duration'].hour*60+row['duration'].minute + return minutes + + print('boer') + return 0 def updatecp(delta, cpvalues, r, workouttype='water'): # pragma: no cover if workouttype in otwtypes: diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index ba084f68..7089f993 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1,6 +1,6 @@ from rowers.metrics import axes, axlabels, yaxminima, yaxmaxima, get_yaxminima, get_yaxmaxima from rowers.dataprep import nicepaceformat, niceformat, strfdelta -from rowers.datautils import p0, rpetotss +from rowers.datautils import p0, rpetotss, rscore_approx from rowers.metrics import rowingmetrics, metricsdicts from scipy.spatial import ConvexHull, Delaunay from scipy.stats import linregress, percentileofscore @@ -1507,21 +1507,8 @@ def weightfromrecord(row,metricchoice): vv = row[metricchoice] if vv > 0: return vv - if vv == 0: - if metricchoice == 'rscore' and row['hrtss'] > 0: # pragma: no cover - return row['hrtss'] - else: - dd = 3600*row['duration'].hour+60*row['duration'].minute+row['duration'].second - dd = dd/3600 - return rpetotss[row['rpe']]*dd - if vv < 0: - w = Workout.objects.get(id=row['id']) - trimp, hrtss = dataprep.workout_trimp(w) - rscore, normp = dataprep.workout_rscore(w) - if row['rpe'] and row['rpe'] > 0: # pragma: no cover - dd = 3600*row['duration'].hour+60*row['duration'].minute+row['duration'].second - dd = dd/3600 - return rpetotss[row['rpe']]*dd + if metricchoice == 'rscore': + return rscore_approx(row) return 0 diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 8b795e05..5558796a 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -257,13 +257,16 @@ def get_execution_report(rower, startdate, enddate, plan=None): plannedsession=None, date__gte=mm.startdate, date__lte=mm.enddate).exclude(duplicate=True) for w in unmatchedworkouts: - if w.rscore != 0: - actualscore += w.rscore - elif w.hrtss != 0: # pragma: no cover - actualscore += w.hrtss - else: # pragma: no cover - minutes = w.duration.hour*60+w.duration.minute - actualscore += minutes + row = { + 'rscore': w.rscore, + 'hrtss': w.hrtss, + 'rpe': w.rpe, + 'duration': w.duration, + 'id': w.id + } + rscore = datautils.rscore_approx(row) + actualscore += rscore + for ps in sps: # pragma: no cover ratio, status, cdate = is_session_complete(rower, ps) if ps.sessionmode == 'rScore': @@ -576,11 +579,15 @@ def get_session_metrics(ps): durationv += timefield_to_seconds_duration(w.duration) thetrimp, hrtss = dataprep.workout_trimp(w) trimpv += thetrimp - tss = dataprep.workout_rscore(w)[0] - if not np.isnan(tss) and tss != 0: - rscorev += tss - elif tss == 0: # pragma: no cover - rscorev += hrtss + row = { + 'rscore': w.rscore, + 'hrtss': w.hrtss, + 'rpe': w.rpe, + 'duration': w.duration, + 'id': w.id + } + tss = datautils.rscore_approx(row) + rscorev += tss ratio, statusv, completiondate = is_session_complete_ws(ws, ps) try: @@ -674,13 +681,15 @@ def is_session_complete_ws(ws, ps): trimp, hrtss = dataprep.workout_trimp(w) score += trimp elif ps.sessionmode == 'rScore': - rscore = dataprep.workout_rscore(w)[0] - if not np.isnan(rscore) and rscore != 0: - score += rscore - elif rscore == 0: # pragma: no cover - trimp, hrtss = dataprep.workout_trimp(w) - score += hrtss - + row = { + 'rscore': w.rscore, + 'hrtss': w.hrtss, + 'rpe': w.rpe, + 'duration': w.duration, + 'id': w.id + } + rscore = datautils.rscore_approx(row) + score += rscore if not completiondate and score >= cratiomin*value: completiondate = w.date diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index b4b43516..a7f3519a 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ