comparison python/storage.py @ 918:3a06007a4bb7

modularized save trajectories, added slice to Trajectory, etc
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 05 Jul 2017 12:19:59 -0400
parents 89cc05867c4c
children 7b3f2e0a2652
comparison
equal deleted inserted replaced
917:89cc05867c4c 918:3a06007a4bb7
373 if objNum in objects: 373 if objNum in objects:
374 objects[objNum].curvilinearPositions.addPositionSYL(row[2],row[3],row[4]) 374 objects[objNum].curvilinearPositions.addPositionSYL(row[2],row[3],row[4])
375 if len(missingObjectNumbers) > 0: 375 if len(missingObjectNumbers) > 0:
376 print('List of missing objects to attach corresponding curvilinear trajectories: {}'.format(missingObjectNumbers)) 376 print('List of missing objects to attach corresponding curvilinear trajectories: {}'.format(missingObjectNumbers))
377 377
378 def saveTrajectoriesToSqlite(outputFilename, objects, trajectoryType, withFeatures = False): 378 def saveTrajectoriesToTable(connection, objects, trajectoryType, tablePrefix = None):
379 'Saves trajectories in table tableName'
380 cursor = connection.cursor()
381 # Parse feature and/or object structure and commit to DB
382 if(trajectoryType == 'feature' or trajectoryType == 'object'):
383 # Extract features from objects
384 if trajectoryType == 'object':
385 features = []
386 for obj in objects:
387 if obj.hasFeatures():
388 features += obj.getFeatures()
389 if len(features) == 0:
390 print('Warning, objects have no features') # todo save centroid trajectories?
391 elif trajectoryType == 'feature':
392 features = objects
393 # Setup feature queries
394 if tablePrefix is None:
395 prefix = ''
396 else:
397 prefix = tablePrefix+'_'
398 createTrajectoryTable(cursor, prefix+"positions")
399 createTrajectoryTable(cursor, prefix+"velocities")
400 positionQuery = insertTrajectoryQuery(prefix+"positions")
401 velocityQuery = insertTrajectoryQuery(prefix+"velocities")
402 # Setup object queries
403 if trajectoryType == 'object':
404 createObjectsTable(cursor)
405 createObjectsFeaturesTable(cursor)
406 objectQuery = insertObjectQuery()
407 objectFeatureQuery = insertObjectFeatureQuery()
408 for feature in features:
409 num = feature.getNum()
410 frameNum = feature.getFirstInstant()
411 for p in feature.getPositions():
412 cursor.execute(positionQuery, (num, frameNum, p.x, p.y))
413 frameNum += 1
414 velocities = feature.getVelocities()
415 if velocities is not None:
416 frameNum = feature.getFirstInstant()
417 for v in velocities[:-1]:
418 cursor.execute(velocityQuery, (num, frameNum, v.x, v.y))
419 frameNum += 1
420 if trajectoryType == 'object':
421 for obj in objects:
422 if obj.hasFeatures():
423 for feature in obj.getFeatures():
424 featureNum = feature.getNum()
425 cursor.execute(objectFeatureQuery, (obj.getNum(), featureNum))
426 cursor.execute(objectQuery, (obj.getNum(), obj.getUserType(), 1))
427 # Parse curvilinear position structure
428 elif(trajectoryType == 'curvilinear'):
429 createCurvilinearTrajectoryTable(cursor)
430 curvilinearQuery = "insert into curvilinear_positions (trajectory_id, frame_number, s_coordinate, y_coordinate, lane) values (?,?,?,?,?)"
431 for obj in objects:
432 num = obj.getNum()
433 frameNum = obj.getFirstInstant()
434 for p in obj.getCurvilinearPositions():
435 cursor.execute(curvilinearQuery, (num, frameNum, p[0], p[1], p[2]))
436 frameNum += 1
437 else:
438 print('Unknown trajectory type {}'.format(trajectoryType))
439 connection.commit()
440
441 def saveTrajectoriesToSqlite(outputFilename, objects, trajectoryType):
379 '''Writes features, ie the trajectory positions (and velocities if exist) 442 '''Writes features, ie the trajectory positions (and velocities if exist)
380 with their instants to a specified sqlite file 443 with their instants to a specified sqlite file
381 Either feature positions (and velocities if they exist) 444 Either feature positions (and velocities if they exist)
382 or curvilinear positions will be saved at a time''' 445 or curvilinear positions will be saved at a time'''
383 446
384 connection = sqlite3.connect(outputFilename) 447 connection = sqlite3.connect(outputFilename)
385 try: 448 try:
386 cursor = connection.cursor() 449 saveTrajectoriesToTable(connection, objects, trajectoryType, None)
387 # Parse feature and/or object structure and commit to DB
388 if(trajectoryType == 'feature' or trajectoryType == 'object'):
389 # Extract features from objects
390 if(trajectoryType == 'object'):
391 features = []
392 for obj in objects:
393 if(obj.hasFeatures()):
394 features += obj.getFeatures()
395 elif(trajectoryType == 'feature'):
396 features = objects
397 # Setup feature queries
398 createTrajectoryTable(cursor, "positions")
399 createTrajectoryTable(cursor, "velocities")
400 positionQuery = insertTrajectoryQuery("positions")
401 velocityQuery = insertTrajectoryQuery("velocities")
402 # Setup object queries
403 if(trajectoryType == 'object'):
404 createObjectsTable(cursor)
405 createObjectsFeaturesTable(cursor)
406 objectQuery = insertObjectQuery()
407 objectFeatureQuery = insertObjectFeatureQuery()
408 for feature in features:
409 num = feature.getNum()
410 frameNum = feature.getFirstInstant()
411 for position in feature.getPositions():
412 cursor.execute(positionQuery, (num, frameNum, position.x, position.y))
413 frameNum += 1
414 velocities = feature.getVelocities()
415 if velocities is not None:
416 frameNum = feature.getFirstInstant()
417 for i in xrange(velocities.length()-1):
418 v = velocities[i]
419 cursor.execute(velocityQuery, (num, frameNum, v.x, v.y))
420 frameNum += 1
421 if(trajectoryType == 'object'):
422 for obj in objects:
423 for feature in obj.getFeatures():
424 featureNum = feature.getNum()
425 cursor.execute(objectFeatureQuery, (obj.getNum(), featureNum))
426 cursor.execute(objectQuery, (obj.getNum(), obj.getUserType(), 1))
427 # Parse curvilinear position structure
428 elif(trajectoryType == 'curvilinear'):
429 createCurvilinearTrajectoryTable(cursor)
430 curvilinearQuery = "insert into curvilinear_positions (trajectory_id, frame_number, s_coordinate, y_coordinate, lane) values (?,?,?,?,?)"
431 for obj in objects:
432 num = obj.getNum()
433 frameNum = obj.getFirstInstant()
434 for position in obj.getCurvilinearPositions():
435 cursor.execute(curvilinearQuery, (num, frameNum, position[0], position[1], position[2]))
436 frameNum += 1
437 else:
438 print('Unknown trajectory type {}'.format(trajectoryType))
439 connection.commit()
440 except sqlite3.OperationalError as error: 450 except sqlite3.OperationalError as error:
441 printDBError(error) 451 printDBError(error)
442 connection.close() 452 connection.close()
443 453
444 def loadBBMovingObjectsFromSqlite(filename, objectType = 'bb', objectNumbers = None, timeStep = None): 454 def loadBBMovingObjectsFromSqlite(filename, objectType = 'bb', objectNumbers = None, timeStep = None):
596 dbfn = dbFilenames[i] 606 dbfn = dbFilenames[i]
597 else: 607 else:
598 dbfn = filename 608 dbfn = filename
599 cursor.execute('INSERT INTO prototypes (id, dbfilename, trajectory_type, nmatchings, positions_id) VALUES ({},\"{}\",\"{}\",{}, {})'.format(protoId, dbfn, trajectoryType, n, i)) 609 cursor.execute('INSERT INTO prototypes (id, dbfilename, trajectory_type, nmatchings, positions_id) VALUES ({},\"{}\",\"{}\",{}, {})'.format(protoId, dbfn, trajectoryType, n, i))
600 #cursor.execute('SELECT * from sqlite_master WHERE type = \"table\" and name = \"{}\"'.format(tableNames[trajectoryType])) 610 #cursor.execute('SELECT * from sqlite_master WHERE type = \"table\" and name = \"{}\"'.format(tableNames[trajectoryType]))
601 if objects is not None: 611 if objects is not None: # save positions and velocities
602 pass 612 pass
603 except sqlite3.OperationalError as error: 613 except sqlite3.OperationalError as error:
604 printDBError(error) 614 printDBError(error)
605 connection.commit() 615 connection.commit()
606 connection.close() 616 connection.close()