changeset 341:2f39c4ed0b62

first version of indicator saving to sqlite
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 20 Jun 2013 14:31:24 -0400
parents 1046b7346886
children 4d69486869a5
files python/events.py python/indicators.py python/storage.py python/ubc_utils.py
diffstat 4 files changed, 63 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/python/events.py	Wed Jun 19 23:35:24 2013 -0400
+++ b/python/events.py	Thu Jun 20 14:31:24 2013 -0400
@@ -8,9 +8,7 @@
 import multiprocessing
 import itertools
 
-import moving
-import prediction
-import indicators
+import moving, prediction, indicators, utils
 
 __metaclass__ = type
 
@@ -31,7 +29,25 @@
                       'Collision Course Angle',
                       'Distance',
                       'Minimum Distance',
-                      'Speed Differential']
+                      'Velocity Angle',
+                      'Speed Differential',
+                      'Collision Probability',
+                      'Time to Collision',
+                      'Probability of Successful Evasive Action',
+                      'predicted Post Encroachment Time']
+
+    indicatorNameToIndices = utils.inverseEnumeration(indicatorNames)
+
+    indicatorShortNames = ['',
+                           'CCAng',
+                           'Dist',
+                           'MinDist',
+                           'VA',
+                           'SD',
+                           'PoC',
+                           'TTC',
+                           'P(SEA)',
+                           'pPET']
 
     def __init__(self, num = None, timeInterval = None, roaduserNum1 = None, roaduserNum2 = None, roadUser1 = None, roadUser2 = None, categoryNum = None):
         moving.STObject.__init__(self, num, timeInterval)
@@ -103,6 +119,7 @@
         for i in list(commonTimeInterval)[:-1]: # do not look at the 1 last position/velocities, often with errors
             self.collisionPoints[i], self.crossingZones[i] = prediction.computeCrossingsCollisionsAtInstant(i, self.roadUser1, self.roadUser2, predictionParameters, collisionDistanceThreshold, timeHorizon, computeCZ, debug)
             TTCs[i] = prediction.computeExpectedIndicator(self.collisionPoints[i])
+        # add probability of collision, and probability of successful evasive action
         self.addIndicator(indicators.SeverityIndicator('TTC', TTCs))
         
         if computeCZ:
--- a/python/indicators.py	Wed Jun 19 23:35:24 2013 -0400
+++ b/python/indicators.py	Thu Jun 20 14:31:24 2013 -0400
@@ -18,7 +18,6 @@
     
     def __init__(self, name, values, timeInterval=None, maxValue = None):
         self.name = name
-        self.isCosine = (name.find('Cosine') >= 0)
         if timeInterval:
             assert len(values) == timeInterval.length()
             self.timeInterval = timeInterval
@@ -69,6 +68,9 @@
     def getTimeInterval(self):
         return self.timeInterval
 
+    def getName(self):
+        return self.name
+
     def getValues(self):
         return [self.__getitem__(t) for t in self.timeInterval]
 
--- a/python/storage.py	Wed Jun 19 23:35:24 2013 -0400
+++ b/python/storage.py	Thu Jun 20 14:31:24 2013 -0400
@@ -2,8 +2,7 @@
 # -*- coding: utf-8 -*-
 '''Various utilities to save and load data'''
 
-import utils
-import moving
+import utils, moving, events
 
 __metaclass__ = type
 
@@ -16,7 +15,7 @@
 # Sqlite
 #########################
 
-def writeTrajectoriesToSqlite(objects, outFilename, trajectoryType, objectNumbers = -1):
+def saveTrajectoriesToSqlite(objects, outFilename, trajectoryType, objectNumbers = -1):
     """
     This function writers trajectories to a specified sqlite file
     @param[in] objects -> a list of trajectories
@@ -29,7 +28,7 @@
     connection = sqlite3.connect(outFilename)
     cursor = connection.cursor()
 
-    schema = "CREATE TABLE \"positions\"(trajectory_id INTEGER,frame_number INTEGER, x_coordinate REAL, y_coordinate REAL, PRIMARY KEY(trajectory_id, frame_number))"
+    schema = "CREATE TABLE IF NOT EXISTS \"positions\"(trajectory_id INTEGER,frame_number INTEGER, x_coordinate REAL, y_coordinate REAL, PRIMARY KEY(trajectory_id, frame_number))"
     cursor.execute(schema)
 
     trajectory_id = 0
@@ -205,28 +204,50 @@
     'Deletes all indicator data in db'
     pass
 
+def createInteractionTable(cursor):
+    cursor.execute('CREATE TABLE IF NOT EXISTS interactions (id INTEGER PRIMARY KEY, object_id1 INTEGER, object_id2 INTEGER, FOREIGN KEY(object_id1) REFERENCES objects(id), FOREIGN KEY(object_id2) REFERENCES objects(id))')
+
+def createIndicatorTables(cursor):
+    # cursor.execute('CREATE TABLE IF NOT EXISTS indicators (id INTEGER PRIMARY KEY, interaction_id INTEGER, indicator_type INTEGER, FOREIGN KEY(interaction_id) REFERENCES interactions(id))')
+    # cursor.execute('CREATE TABLE IF NOT EXISTS indicator_values (indicator_id INTEGER, frame_number INTEGER, value REAL, FOREIGN KEY(indicator_id) REFERENCES indicators(id), PRIMARY KEY(indicator_id, frame_number))')
+    cursor.execute('CREATE TABLE IF NOT EXISTS indicators (interaction_id INTEGER, indicator_type INTEGER, frame_number INTEGER, value REAL, FOREIGN KEY(interaction_id) REFERENCES interactions(id), PRIMARY KEY(interaction_id, indicator_type, frame_number))')
+
+def saveInteraction(cursor, interaction):
+    roadUserNumbers = list(interaction.getRoadUserNumbers())
+    cursor.execute('INSERT INTO interactions VALUES({}, {}, {})'.format(interaction.getNum(), roadUserNumbers[0], roadUserNumbers[1]))
+
 def saveInteractions(filename, interactions):
     'Saves the interactions in the table'
     import sqlite3
     connection = sqlite3.connect(filename)
     cursor = connection.cursor()
-    cursor.execute('CREATE TABLE interactions IF NOT EXISTS (id INTEGER PRIMARY KEY, object_id1 INTEGER, object_id2 INTEGER, FOREIGN KEY(object_id1) REFERENCES objects(id), FOREIGN KEY(object_id2) REFERENCES objects(id))')
-    # get the highest interaction id
-    for i in interactions:
-        cursor.execute('INSERT INTO interactions VALUES({})'.format(i.getNum())) # todo getRoadUserNumbers()
-    # CREATE TABLE IF NOT EXISTS interactions (id INTEGER PRIMARY KEY, object_id1 INTEGER, object_id2 INTEGER, FOREIGN KEY(object_id1) REFERENCES objects(id), FOREIGN KEY(object_id2) REFERENCES objects(id));
-    # CREATE TABLE IF NOT EXISTS indicators (id INTEGER PRIMARY KEY, interaction_id INTEGER, indicator_type INTEGER, FOREIGN KEY(interaction_id) REFERENCES interactions(id))
-    # CREATE TABLE IF NOT EXISTS indicator_values (indicator_id INTEGER, frame_number INTEGER, value REAL, FOREIGN KEY(indicator_id) REFERENCES indicators(id), PRIMARY KEY(indicator_id, frame_number))
-
+    createInteractionTable(cursor)
+    for inter in interactions:
+        saveInteraction(cursor, inter)
+    connection.commit()
     connection.close()
 
-def saveIndicators(filename, indicators):
+def saveIndicator(cursor, interactionNum, indicator):
+    for instant in indicator.getTimeInterval():
+        if indicator[instant]:
+            cursor.execute('INSERT INTO indicators VALUES({}, {}, {}, {})'.format(interactionNum, events.Interaction.indicatorNameToIndices[indicator.getName()], instant, indicator[instant]))
+
+def saveIndicators(filename, interactions, indicatorNames):
     'Saves the indicator values in the table'
     import sqlite3
     connection = sqlite3.connect(filename)
-    
+    cursor = connection.cursor()
+    createInteractionTable(cursor)
+    createIndicatorTables(cursor)
+    for inter in interactions:
+        saveInteraction(cursor, inter)
+        for indicatorName in indicatorNames:
+            indicator = inter.getIndicator(indicatorName)
+            if indicator != None:
+                saveIndicator(cursor, inter.getNum(), indicator)
+    connection.commit()
+    connection.close()
 
-    connection.close()
 
 #########################
 # txt files
--- a/python/ubc_utils.py	Wed Jun 19 23:35:24 2013 -0400
+++ b/python/ubc_utils.py	Thu Jun 20 14:31:24 2013 -0400
@@ -1,7 +1,7 @@
 #! /usr/bin/env python
 '''Various utilities to load data saved by the UBC tool(s)'''
 
-import utils
+import utils, events
 from moving import MovingObject, TimeInterval, Trajectory
 
 __metaclass__ = type
@@ -12,12 +12,12 @@
                  'contoursequence']
 
 severityIndicatorNames = ['Distance',
-                          'Cosine',
+                          'Collision Course Cosine',
                           'Velocity Cosine',
                           'Speed Differential',
                           'Collision Probability',
                           'Severity Index',
-                          'TTC']
+                          'Time to Collision']
 
 userTypeNames = ['car',
                  'pedestrian',