diff --git a/rowers/dataprep.py b/rowers/dataprep.py index d5c46c6b..c98edd6c 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -2332,8 +2332,16 @@ def workout_normv(w,pp=4.0): v4mean = wavg(df,'v4','deltat') normv = v4mean**(1./pp) - if np.isnan(normv): - return 500./120. - - return normv + df['w4'] = df['driveenergy']**(pp) + w4mean = wavg(df,'w4','deltat') + normw = w4mean**(1./pp) + + + if np.isnan(normv): + normv = 500./120. + + if np.isnan(normw): + normw = 0 + + return normv,normw diff --git a/rowers/forms.py b/rowers/forms.py index ae4fcc53..1ad57343 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -485,11 +485,13 @@ class MyTimeField(forms.TimeField): class PowerIntervalUpdateForm(forms.Form): selectorchoices = ( ('power','Power'), - ('pace','Pace') + ('pace','Pace'), + ('work','Work per Stroke'), ) pace = forms.DurationField(required=False,label='Pace (/500m)') power = forms.IntegerField(required=False,label='Power (W)') + work = forms.IntegerField(required=False,label='Work per Stroke (J)') selector = forms.ChoiceField(choices=selectorchoices, required=True, initial='power', diff --git a/rowers/views.py b/rowers/views.py index 45406548..63764da4 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -11293,7 +11293,7 @@ def workout_summary_edit_view(request,id,message="",successmessage="" tss,normp = dataprep.workout_rscore(row) - normv = dataprep.workout_normv(row,pp=8.0) + normv,normw = dataprep.workout_normv(row,pp=8.0) try: avpace = datetime.timedelta(seconds=int(500./normv)) @@ -11304,6 +11304,7 @@ def workout_summary_edit_view(request,id,message="",successmessage="" 'power': int(normp), 'pace': avpace, 'selector': 'power', + 'work': int(normw) } powerorpace = 'power' @@ -11337,15 +11338,21 @@ def workout_summary_edit_view(request,id,message="",successmessage="" powerorpace = request.POST['powerorpace'] value_pace = request.POST['value_pace'] value_power = request.POST['value_power'] + value_work = request.POST['value_work'] if powerorpace == 'power': power = int(value_power) pace_secs = 120.0 - else: + work = 400. + elif powerorpace == 'pace': power = 0 try: pace_secs = float(value_pace) except ValueError: pace_secs = float(value_pace.replace(',','.')) + elif powerorpace == 'work': + power = 0 + work = int(value_work) + pace_secs = 120.0 if powerorpace == 'power' and power is not None: try: @@ -11362,6 +11369,13 @@ def workout_summary_edit_view(request,id,message="",successmessage="" debug=False,smoothwindow=15.) except: messages.error(request,'Error updating pace') + elif powerorpace == 'work': + try: + rowdata.updateinterval_metric( + ' WorkPerStroke (joules)',work,mode='larger', + debug=False,smoothwindow=15.) + except: + messages.error(request,'Error updating Work per Stroke') intervalstats = rowdata.allstats() itime,idist,itype = rowdata.intervalstats_values() @@ -11386,7 +11400,8 @@ def workout_summary_edit_view(request,id,message="",successmessage="" formvalues = { 'powerorpace': powerorpace, 'value_power': power, - 'value_pace': pace_secs + 'value_pace': pace_secs, + 'value_work':work, } @@ -11429,6 +11444,7 @@ def workout_summary_edit_view(request,id,message="",successmessage="" powerorpace = cd['selector'] power = cd['power'] pace = cd['pace'] + work = cd['work'] try: pace_secs = pace.seconds+pace.microseconds/1.0e6 except AttributeError: @@ -11447,6 +11463,14 @@ def workout_summary_edit_view(request,id,message="",successmessage="" debug=False,smoothwindow=15) except: messages.error(request,'Error updating pace') + elif powerorpace == 'work': + try: + rowdata.updateinterval_metric( + 'driveenergy',work,mode='larger', + debug=False,smoothwindow=15.) + except: + messages.error(request,'Error updating Work per Stroke') + intervalstats = rowdata.allstats() itime,idist,itype = rowdata.intervalstats_values() @@ -11455,7 +11479,8 @@ def workout_summary_edit_view(request,id,message="",successmessage="" formvalues = { 'powerorpace': powerorpace, 'value_power': power, - 'value_pace': pace_secs + 'value_pace': pace_secs, + 'value_work': work, } powerupdateform = PowerIntervalUpdateForm(initial=cd) form = SummaryStringForm()