Mercurial > hg > nsaunier > traffic-intelligence
comparison trafficintelligence/ubc_utils.py @ 1028:cc5cb04b04b0
major update using the trafficintelligence package name and install through pip
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Fri, 15 Jun 2018 11:19:10 -0400 |
| parents | python/ubc_utils.py@933670761a57 |
| children | aafbc0bab925 |
comparison
equal
deleted
inserted
replaced
| 1027:6129296848d3 | 1028:cc5cb04b04b0 |
|---|---|
| 1 #! /usr/bin/env python | |
| 2 '''Various utilities to load data saved by the UBC tool(s)''' | |
| 3 | |
| 4 from trafficintelligence import utils, events, storage | |
| 5 from trafficintelligence.moving import MovingObject, TimeInterval, Trajectory | |
| 6 | |
| 7 | |
| 8 fileTypeNames = ['feature', | |
| 9 'object', | |
| 10 'prototype', | |
| 11 'contoursequence'] | |
| 12 | |
| 13 severityIndicatorNames = ['Distance', | |
| 14 'Collision Course Cosine', | |
| 15 'Velocity Cosine', | |
| 16 'Speed Differential', | |
| 17 'Collision Probability', | |
| 18 'Severity Index', | |
| 19 'Time to Collision'] | |
| 20 | |
| 21 userTypeNames = ['car', | |
| 22 'pedestrian', | |
| 23 'twowheels', | |
| 24 'bus', | |
| 25 'truck'] | |
| 26 | |
| 27 # severityIndicator = {'Distance': 0, | |
| 28 # 'Cosine': 1, | |
| 29 # 'Velocity Cosine': 2, | |
| 30 # 'Speed Differential': 3, | |
| 31 # 'Collision Probability': 4, | |
| 32 # 'Severity Index': 5, | |
| 33 # 'TTC': 6} | |
| 34 | |
| 35 mostSevereIsMax = [False, | |
| 36 False, | |
| 37 True, | |
| 38 True, | |
| 39 True, | |
| 40 True, | |
| 41 False] | |
| 42 | |
| 43 ignoredValue = [None, None, None, None, None, None, -1] | |
| 44 | |
| 45 def getFileType(s): | |
| 46 'Finds the type in fileTypeNames' | |
| 47 for fileType in fileTypeNames: | |
| 48 if s.find(fileType)>0: | |
| 49 return fileType | |
| 50 return '' | |
| 51 | |
| 52 def isFileType(s, fileType): | |
| 53 return (s.find(fileType)>0) | |
| 54 | |
| 55 def saveTrajectoryUserTypes(inFilename, outFilename, objects): | |
| 56 '''The program saves the objects, | |
| 57 by just copying the corresponding trajectory and velocity data | |
| 58 from the inFilename, and saving the characteristics in objects (first line) | |
| 59 into outFilename''' | |
| 60 infile = storage.openCheck(inFilename) | |
| 61 outfile = storage.openCheck(outFilename,'w') | |
| 62 | |
| 63 if (inFilename.find('features') >= 0) or (not infile) or (not outfile): | |
| 64 return | |
| 65 | |
| 66 lines = storage.getLines(infile) | |
| 67 objNum = 0 # in inFilename | |
| 68 while lines != []: | |
| 69 # find object in objects (index i) | |
| 70 i = 0 | |
| 71 while (i<len(objects)) and (objects[i].num != objNum): | |
| 72 i+=1 | |
| 73 | |
| 74 if i<len(objects): | |
| 75 l = lines[0].split(' ') | |
| 76 l[3] = str(objects[i].userType) | |
| 77 outfile.write(' '.join(l)+'\n') | |
| 78 for l in lines[1:]: | |
| 79 outfile.write(l+'\n') | |
| 80 outfile.write(utils.delimiterChar+'\n') | |
| 81 # next object | |
| 82 objNum += 1 | |
| 83 lines = storage.getLines(infile) | |
| 84 | |
| 85 print('read {0} objects'.format(objNum)) | |
| 86 | |
| 87 def modifyTrajectoryFile(modifyLines, filenameIn, filenameOut): | |
| 88 '''Reads filenameIn, replaces the lines with the result of modifyLines and writes the result in filenameOut''' | |
| 89 fileIn = storage.openCheck(filenameIn, 'r', True) | |
| 90 fileOut = storage.openCheck(filenameOut, "w", True) | |
| 91 | |
| 92 lines = storage.getLines(fileIn) | |
| 93 trajNum = 0 | |
| 94 while (lines != []): | |
| 95 modifiedLines = modifyLines(trajNum, lines) | |
| 96 if modifiedLines: | |
| 97 for l in modifiedLines: | |
| 98 fileOut.write(l+"\n") | |
| 99 fileOut.write(utils.delimiterChar+"\n") | |
| 100 lines = storage.getLines(fileIn) | |
| 101 trajNum += 1 | |
| 102 | |
| 103 fileIn.close() | |
| 104 fileOut.close() | |
| 105 | |
| 106 def copyTrajectoryFile(keepTrajectory, filenameIn, filenameOut): | |
| 107 '''Reads filenameIn, keeps the trajectories for which the function keepTrajectory(trajNum, lines) is True | |
| 108 and writes the result in filenameOut''' | |
| 109 fileIn = storage.openCheck(filenameIn, 'r', True) | |
| 110 fileOut = storage.openCheck(filenameOut, "w", True) | |
| 111 | |
| 112 lines = storage.getLines(fileIn) | |
| 113 trajNum = 0 | |
| 114 while (lines != []): | |
| 115 if keepTrajectory(trajNum, lines): | |
| 116 for l in lines: | |
| 117 fileOut.write(l+"\n") | |
| 118 fileOut.write(utils.delimiterChar+"\n") | |
| 119 lines = storage.getLines(fileIn) | |
| 120 trajNum += 1 | |
| 121 | |
| 122 fileIn.close() | |
| 123 fileOut.close() | |
| 124 | |
| 125 def loadTrajectories(filename, nObjects = -1): | |
| 126 '''Loads trajectories''' | |
| 127 | |
| 128 file = storage.openCheck(filename) | |
| 129 if (not file): | |
| 130 return [] | |
| 131 | |
| 132 objects = [] | |
| 133 objNum = 0 | |
| 134 objectType = getFileType(filename) | |
| 135 lines = storage.getLines(file) | |
| 136 while (lines != []) and ((nObjects<0) or (objNum<nObjects)): | |
| 137 l = lines[0].split(' ') | |
| 138 parsedLine = [int(n) for n in l[:4]] | |
| 139 obj = MovingObject(num = objNum, timeInterval = TimeInterval(parsedLine[1],parsedLine[2])) | |
| 140 #add = True | |
| 141 if len(lines) >= 3: | |
| 142 obj.positions = Trajectory.load(lines[1], lines[2]) | |
| 143 if len(lines) >= 5: | |
| 144 obj.velocities = Trajectory.load(lines[3], lines[4]) | |
| 145 if objectType == 'object': | |
| 146 obj.userType = parsedLine[3] | |
| 147 obj.nObjects = float(l[4]) | |
| 148 obj.featureNumbers = [int(n) for n in l[5:]] | |
| 149 | |
| 150 # load contour data if available | |
| 151 if len(lines) >= 6: | |
| 152 obj.contourType = utils.line2Floats(lines[6]) | |
| 153 obj.contourOrigins = Trajectory.load(lines[7], lines[8]) | |
| 154 obj.contourSizes = Trajectory.load(lines[9], lines[10]) | |
| 155 elif objectType == 'prototype': | |
| 156 obj.userType = parsedLine[3] | |
| 157 obj.nMatchings = int(l[4]) | |
| 158 | |
| 159 if len(lines) != 2: | |
| 160 objects.append(obj) | |
| 161 objNum+=1 | |
| 162 else: | |
| 163 print("Error two lines of data for feature {}".format(f.num)) | |
| 164 | |
| 165 lines = storage.getLines(file) | |
| 166 | |
| 167 file.close() | |
| 168 return objects | |
| 169 | |
| 170 def getFeatureNumbers(objects): | |
| 171 featureNumbers=[] | |
| 172 for o in objects: | |
| 173 featureNumbers += o.featureNumbers | |
| 174 return featureNumbers | |
| 175 | |
| 176 def loadInteractions(filename, nInteractions = -1): | |
| 177 'Loads interactions from the old UBC traffic event format' | |
| 178 from events import Interaction | |
| 179 from indicators import SeverityIndicator | |
| 180 file = storage.openCheck(filename) | |
| 181 if (not file): | |
| 182 return [] | |
| 183 | |
| 184 interactions = [] | |
| 185 interactionNum = 0 | |
| 186 lines = storage.getLines(file) | |
| 187 while (lines != []) and ((nInteractions<0) or (interactionNum<nInteractions)): | |
| 188 parsedLine = [int(n) for n in lines[0].split(' ')] | |
| 189 inter = Interaction(interactionNum, TimeInterval(parsedLine[1],parsedLine[2]), parsedLine[3], parsedLine[4], categoryNum = parsedLine[5]) | |
| 190 | |
| 191 indicatorFrameNums = [int(n) for n in lines[1].split(' ')] | |
| 192 for indicatorNum,line in enumerate(lines[2:]): | |
| 193 values = {} | |
| 194 for i,v in enumerate([float(n) for n in line.split(' ')]): | |
| 195 if not ignoredValue[indicatorNum] or v != ignoredValue[indicatorNum]: | |
| 196 values[indicatorFrameNums[i]] = v | |
| 197 inter.addIndicator(SeverityIndicator(severityIndicatorNames[indicatorNum], values, None, mostSevereIsMax[indicatorNum])) | |
| 198 | |
| 199 interactions.append(inter) | |
| 200 interactionNum+=1 | |
| 201 lines = storage.getLines(file) | |
| 202 | |
| 203 file.close() | |
| 204 return interactions | |
| 205 | |
| 206 def loadCollisionPoints(filename, nPoints = -1): | |
| 207 '''Loads collision points and returns a dict | |
| 208 with keys as a pair of the numbers of the two interacting objects''' | |
| 209 file = storage.openCheck(filename) | |
| 210 if (not file): | |
| 211 return [] | |
| 212 | |
| 213 points = {} | |
| 214 num = 0 | |
| 215 lines = storage.getLines(file) | |
| 216 while (lines != []) and ((nPoints<0) or (num<nPoints)): | |
| 217 parsedLine = [int(n) for n in lines[0].split(' ')] | |
| 218 protagonistNums = (parsedLine[0], parsedLine[1]) | |
| 219 points[protagonistNums] = [[float(n) for n in lines[1].split(' ')], | |
| 220 [float(n) for n in lines[2].split(' ')]] | |
| 221 | |
| 222 num+=1 | |
| 223 lines = storage.getLines(file) | |
| 224 | |
| 225 file.close() | |
| 226 return points |
