From 3998c7ddeda2615b40de8407eece0d4d4ccce193 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 1 Jun 2018 09:16:24 +0200 Subject: [PATCH] routine to find shortest course completion If rowing through start box more than 1 time, it checks for every passing of the start box --- rowers/courses.py | 6 +++- rowers/courseutils.py | 7 +++-- rowers/tasks.py | 65 +++++++++++++++++++++++++++++++++---------- 3 files changed, 60 insertions(+), 18 deletions(-) diff --git a/rowers/courses.py b/rowers/courses.py index 7a3066a2..cfe3ac45 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -33,7 +33,7 @@ from rowers.models import ( ) from utils import geo_distance -from rowers.courseutils import coursetime_paths, coursetime_first +from rowers.courseutils import coursetime_paths, coursetime_first,time_in_path @@ -199,12 +199,16 @@ def get_time_course(ws,course): rowdata = rowdata.resample('100ms',on='dt').mean() rowdata = rowdata.interpolate() + # create path polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course") paths = [] for polygon in polygons: path = polygon_to_path(polygon) paths.append(path) + + + ( coursetimeseconds, coursemeters, diff --git a/rowers/courseutils.py b/rowers/courseutils.py index d3b8d636..75130af5 100644 --- a/rowers/courseutils.py +++ b/rowers/courseutils.py @@ -10,7 +10,7 @@ class InvalidTrajectoryError(Exception): def __str__(self): return repr(self.value) -def time_in_path(df,p,maxmin='max'): +def time_in_path(df,p,maxmin='max',getall=False): if df.empty: return 0 @@ -29,7 +29,10 @@ def time_in_path(df,p,maxmin='max'): if len(df[b==2]): - return df[b==2]['time'].min(),df[b==2]['cum_dist'].min() + if getall: + return df[b==2]['time'],df[b==2]['cum_dist'] + else: + return df[b==2]['time'].min(),df[b==2]['cum_dist'].min() raise InvalidTrajectoryError("Trajectory doesn't go through path") diff --git a/rowers/tasks.py b/rowers/tasks.py index 139f8908..8739e307 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -70,7 +70,7 @@ siteurl = SITE_URL # testing task from rowers.emails import send_template_email -from rowers.courseutils import coursetime_paths, coursetime_first +from rowers.courseutils import coursetime_paths, coursetime_first, time_in_path @app.task def add(x, y): @@ -276,21 +276,56 @@ def handle_check_race_course(self, path = polygon_to_path(polygon,debug=debug) paths.append(path) - ( - coursetimeseconds, - coursemeters, - coursecompleted, - - ) = coursetime_paths(rowdata,paths) - ( - coursetimefirst, - coursemetersfirst, - firstcompleted - ) = coursetime_first( - rowdata,paths) + # check how many times went through start polygon + entrytimes,entrydistances = time_in_path(rowdata,paths[0],maxmin='max',getall=True) - coursetimeseconds = coursetimeseconds-coursetimefirst - coursemeters = coursemeters-coursemetersfirst + cseconds = [] + cmeters = [] + ccomplete = [] + + for startt in entrytimes: + + rowdata2 = rowdata[rowdata['time']>(startt-10.)] + + ( + coursetimeseconds, + coursemeters, + coursecompleted, + + ) = coursetime_paths(rowdata2,paths) + ( + coursetimefirst, + coursemetersfirst, + firstcompleted + ) = coursetime_first( + rowdata2,paths) + + + + coursetimeseconds = coursetimeseconds-coursetimefirst + coursemeters = coursemeters-coursemetersfirst + + cseconds.append(coursetimeseconds) + cmeters.append(coursemeters) + ccomplete.append(coursecompleted) + + + records = pd.DataFrame({ + 'coursetimeseconds':cseconds, + 'coursecompleted': ccomplete, + 'coursemeters': cmeters + }) + + records = records[records['coursecompleted'] == True] + + if len(records): + coursecompleted = True + mintime = records['coursetimeseconds'].min() + coursetimeseconds = records[records['coursetimeseconds'] == mintime]['coursetimeseconds'].min() + coursemeters = records[records['coursetimeseconds'] == mintime]['coursemeters'].min() + else: + coursecompleted = False + if coursecompleted: query = 'UPDATE rowers_virtualraceresult SET coursecompleted = 1, duration = "{duration}", distance = {distance}, workoutid = {workoutid} WHERE id={recordid}'.format(