changeset 880:000555430b28

adapted code from Paul St-Aubin and udpated MovingObject.setFeatures to truly find the right features in a list that may not start at 0
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 14 Mar 2017 17:10:35 -0400
parents f9ea5083588e
children 8ba82b371eea
files python/moving.py python/storage.py python/tests/storage.txt
diffstat 3 files changed, 72 insertions(+), 50 deletions(-) [+]
line wrap: on
line diff
--- a/python/moving.py	Tue Mar 14 14:22:14 2017 -0400
+++ b/python/moving.py	Tue Mar 14 17:10:35 2017 -0400
@@ -1242,8 +1242,14 @@
     def setUserType(self, userType):
         self.userType = userType
 
-    def setFeatures(self, features):
-        self.features = [features[i] for i in self.featureNumbers]
+    def setFeatures(self, features, featuresOrdered = False):
+        '''Sets the features in the features field based on featureNumbers
+        if not all features are loaded from 0, one needs to renumber in a dict'''
+        if featuresOrdered:
+            tmp = features
+        else:
+            tmp = {f.getNum():f for f in features}
+        self.features = [tmp[i] for i in self.featureNumbers]
 
     def getFeatures(self):
         return self.features
--- a/python/storage.py	Tue Mar 14 14:22:14 2017 -0400
+++ b/python/storage.py	Tue Mar 14 17:10:35 2017 -0400
@@ -333,72 +333,59 @@
     Either feature positions (and velocities if they exist)
     or curvilinear positions will be saved at a time'''
 
-    ## Sanitation
-    if(type(objects) is not list or len(objects)==0): return False
     connection = sqlite3.connect(outputFilename)
     try:
         cursor = connection.cursor()
-        ## Extract features from objects
-        if(trajectoryType == 'object'):
-            features = []
-            for obj in objects:
-                if(obj.hasFeatures()):
-                    features += obj.getFeatures()
-        elif(trajectoryType == 'feature'):
-            features = objects
-        ## Setup feature queries
+        # Parse feature and/or object structure and commit to DB
         if(trajectoryType == 'feature' or trajectoryType == 'object'):
+            # Extract features from objects
+            if(trajectoryType == 'object'):
+                features = []
+                for obj in objects:
+                    if(obj.hasFeatures()):
+                        features += obj.getFeatures()
+            elif(trajectoryType == 'feature'):
+                features = objects
+            # Setup feature queries
             createTrajectoryTable(cursor, "positions")
             createTrajectoryTable(cursor, "velocities")
             positionQuery = insertTrajectoryQuery("positions")
             velocityQuery = insertTrajectoryQuery("velocities")
-        ## Setup object queries
-        if(trajectoryType == 'object'):    
-            createObjectsTable(cursor)
-            createObjectsFeaturesTable(cursor)
-            objectQuery        = insertObjectQuery()
-            objectFeatureQuery = insertObjectFeatureQuery()
-        ## Parse feature and/or object structure and commit to DB
-        if(trajectoryType == 'feature' or trajectoryType == 'object'):
-            running_tally_of_unique_nums = []
+            # Setup object queries
+            if(trajectoryType == 'object'):    
+                createObjectsTable(cursor)
+                createObjectsFeaturesTable(cursor)
+                objectQuery = insertObjectQuery()
+                objectFeatureQuery = insertObjectFeatureQuery()
             for feature in features:
                 num = feature.getNum()
-                if(num not in running_tally_of_unique_nums):
-                    running_tally_of_unique_nums.append(num)
-                    frame_number = feature.getFirstInstant()
-                    for position in feature.getPositions():
-                        cursor.execute(positionQuery, (num, frame_number, position.x, position.y))
-                        frame_number += 1
-                    velocities = feature.getVelocities()
-                    if velocities is not None:
-                        frame_number = feature.getFirstInstant()
-                        for i in xrange(velocities.length()-1):
-                            v = velocities[i]
-                            cursor.execute(velocityQuery, (num, frame_number, v.x, v.y))
-                            frame_number += 1    
+                frameNum = feature.getFirstInstant()
+                for position in feature.getPositions():
+                    cursor.execute(positionQuery, (num, frameNum, position.x, position.y))
+                    frameNum += 1
+                velocities = feature.getVelocities()
+                if velocities is not None:
+                    frameNum = feature.getFirstInstant()
+                    for i in xrange(velocities.length()-1):
+                        v = velocities[i]
+                        cursor.execute(velocityQuery, (num, frameNum, v.x, v.y))
+                        frameNum += 1    
             if(trajectoryType == 'object'):
-                running_tally_of_unique_nums = []
                 for obj in objects:
-                    if(obj.hasFeatures()):
-                        n_objects = len(obj.getFeatures())
-                        for feature in obj.getFeatures():
-                            feature_num = feature.getNum()
-                            if(feature_num not in running_tally_of_unique_nums):
-                                running_tally_of_unique_nums.append(feature_num)
-                                cursor.execute(objectFeatureQuery, (obj.getNum(), feature_num))
-                    else:
-                        n_objects = 0
-                    cursor.execute(objectQuery, (obj.getNum(), obj.getUserType(), n_objects))   
-        ## Parse curvilinear position structure
+                    for feature in obj.getFeatures():
+                        featureNum = feature.getNum()
+                        cursor.execute(objectFeatureQuery, (obj.getNum(), featureNum))
+                    cursor.execute(objectQuery, (obj.getNum(), obj.getUserType(), 1))   
+        # Parse curvilinear position structure
         elif(trajectoryType == 'curvilinear'):
             createCurvilinearTrajectoryTable(cursor)
             curvilinearQuery = "insert into curvilinear_positions (trajectory_id, frame_number, s_coordinate, y_coordinate, lane) values (?,?,?,?,?)"
             for obj in objects:
                 num = obj.getNum()
-                frame_number = obj.getFirstInstant()
+                frameNum = obj.getFirstInstant()
                 for position in obj.getCurvilinearPositions():
-                    cursor.execute(curvilinearQuery, (num, frame_number, position[0], position[1], position[2]))
-                    frame_number += 1
+                    cursor.execute(curvilinearQuery, (num, frameNum, position[0], position[1], position[2]))
+                    frameNum += 1
         else:
             print('Unknown trajectory type {}'.format(trajectoryType))
         connection.commit()
--- a/python/tests/storage.txt	Tue Mar 14 14:22:14 2017 -0400
+++ b/python/tests/storage.txt	Tue Mar 14 17:10:35 2017 -0400
@@ -71,6 +71,35 @@
 True
 >>> remove('test.sqlite')
 
+>>> f1 = MovingObject.generate(Point(0.,0.), Point(1.,0.), TimeInterval(0,10))
+>>> f1.num = 3
+>>> f2 = MovingObject.generate(Point(1.,1.), Point(-0.5,-0.2), TimeInterval(0,9))
+>>> f2.num = 4
+>>> o1 = MovingObject(num = 1, userType = 1)
+>>> o1.features = [f1, f2]
+>>> saveTrajectoriesToSqlite('test.sqlite', [o1], 'object')
+>>> objects = loadTrajectoriesFromSqlite('test.sqlite', 'object', withFeatures = True)
+>>> len(objects)
+1
+>>> reloaded1 = objects[0]
+>>> reloaded1.getNum() == o1.getNum()
+True
+>>> reloaded1.getUserType() == o1.getUserType()
+True
+>>> len(reloaded1.featureNumbers)
+2
+>>> len(reloaded1.features)
+2
+>>> reloaded1.getPositionAt(0) == Point.midPoint(f1.getPositionAt(0), f2.getPositionAt(0))
+True
+>>> reloaded1.getPositionAt(5) == Point.midPoint(f1.getPositionAt(5), f2.getPositionAt(5))
+True
+>>> reloaded1.getPositionAt(10) == f1.getPositionAt(10)
+True
+>>> set(reloaded1.featureNumbers) == set([f1.num, f2.num])
+True
+>>> remove('test.sqlite')
+
 >>> strio = StringIO('# asdlfjasdlkj0\nsadlkfjsdlakjf')
 >>> readline(strio)
 'sadlkfjsdlakjf'