From 9bf485f596ad098f366aa8007cf6c2f42d99eeaa Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 1 Mar 2017 15:00:58 +0100 Subject: [PATCH 1/2] adding oarlength and inboard --- rowers/dataprep.py | 16 ++++++++++++---- rowers/models.py | 6 ++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 646ab4fa..8365cee1 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -8,7 +8,7 @@ from rowers.tasks import handle_sendemail_unrecognized from rowingdata import rower as rrower from rowingdata import main as rmain -from rowingdata import get_file_type +from rowingdata import get_file_type,get_empower_rigging from pandas import DataFrame,Series from pytz import timezone as tz,utc @@ -326,7 +326,8 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', dosummary=True,title='Workout', notes='',totaldist=0,totaltime=0, summary='', - makeprivate=False): + makeprivate=False, + oarlength=2.89,inboard=0.88): message = None powerperc = 100*np.array([r.pw_ut2, r.pw_ut1, @@ -446,6 +447,7 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', csvfilename=f2,notes=notes,summary=summary, maxhr=maxhr,averagehr=averagehr, startdatetime=workoutstartdatetime, + inboard=inboard,oarlength=oarlength, privacy=privacy) @@ -463,6 +465,8 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', return (w.id,message) def handle_nonpainsled(f2,fileformat,summary=''): + oarlength = 2.89 + inboard = 0.88 # handle RowPro: if (fileformat == 'rp'): row = RowProParser(f2) @@ -506,6 +510,7 @@ def handle_nonpainsled(f2,fileformat,summary=''): if (fileformat == 'speedcoach2'): row = SpeedCoach2Parser(f2) try: + oarlength,inboard = get_empower_rigging(f2) summary = row.allstats() except: pass @@ -534,7 +539,7 @@ def handle_nonpainsled(f2,fileformat,summary=''): except: os.remove(f_to_be_deleted+'.gz') - return (f2,summary) + return (f2,summary,oarlength,inboard) # Create new workout from file and store it in the database # This routine should be used everywhere in views.py and mailprocessing.py @@ -547,6 +552,8 @@ def new_workout_from_file(r,f2, message = None fileformat = get_file_type(f2) summary = '' + oarlength = 2.89 + inboard = 0.88 if len(fileformat)==3 and fileformat[0]=='zip': f_to_be_deleted = f2 with zipfile.ZipFile(f2) as z: @@ -590,7 +597,7 @@ def new_workout_from_file(r,f2, # handle non-Painsled by converting it to painsled compatible CSV if (fileformat != 'csv'): - f2,summary = handle_nonpainsled(f2,fileformat,summary=summary) + f2,summary,oarlength,inboard = handle_nonpainsled(f2,fileformat,summary=summary) dosummary = (fileformat != 'fit') @@ -599,6 +606,7 @@ def new_workout_from_file(r,f2, makeprivate=makeprivate, dosummary=dosummary, summary=summary, + inboard=inboard,oarlength=oarlength, title=title) return (id,message,f2) diff --git a/rowers/models.py b/rowers/models.py index c52c34ed..784a5943 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -393,6 +393,12 @@ class Workout(models.Model): maxhr = models.IntegerField(blank=True,null=True) uploadedtostrava = models.IntegerField(default=0) uploadedtosporttracks = models.IntegerField(default=0) + + # empower stuff + inboard = models.FloatField(default=0.88) + oarlength = models.FloatField(default=2.89) + + notes = models.CharField(blank=True,null=True,max_length=1000) summary = models.TextField(blank=True) privacy = models.CharField(default='visible',max_length=30, From 82c182f6570998e8383ee70f42bbcf8cc58836f4 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 1 Mar 2017 15:40:16 +0100 Subject: [PATCH 2/2] improved empower calculation of drive length --- rowers/dataprep.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 8365cee1..f0468037 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -31,7 +31,7 @@ import os import pandas as pd import numpy as np import itertools - +import math from tasks import handle_sendemail_unrecognized from django.conf import settings @@ -460,7 +460,7 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', # put stroke data in database res = dataprep(row.df,id=w.id,bands=True, - barchart=True,otwpower=True,empower=True) + barchart=True,otwpower=True,empower=True,inboard=inboard) return (w.id,message) @@ -892,7 +892,7 @@ def smalldataprep(therows,xparam,yparam1,yparam2): # saves it to the stroke_data table in the database # Takes a rowingdata object's DataFrame as input def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True, - empower=True): + empower=True,inboard=0.88): rowdatadf.set_index([range(len(rowdatadf))],inplace=True) t = rowdatadf.ix[:,'TimeStamp (sec)'] t = pd.Series(t-rowdatadf.ix[0,'TimeStamp (sec)']) @@ -1005,7 +1005,11 @@ def dataprep(rowdatadf,id=0,bands=True,barchart=True,otwpower=True, finish = rowdatadf.ix[:,'finish'] peakforceangle = rowdatadf.ix[:,'peakforceangle'] driveenergy = rowdatadf.ix[:,'driveenergy'] - drivelength = driveenergy/(averageforce*4.44822) + arclength = (inboard-0.05)*(np.radians(finish)-np.radians(catch)) + if arclength.mean()>0: + drivelength = arclength + else: + drivelength = driveenergy/(averageforce*4.44822) slip = rowdatadf.ix[:,'slip'] if windowsize > 3 and windowsize