def listVars(formula): """Extract variables from a formula and sets indices""" tsPattern = re.compile("ts\.(\w*)") tsMatches = tsPattern.findall(formula) tsMatches=utilities.uniqify(tsMatches) #Making sure the first variable is speed and the second is status if "V" in tsMatches: tsMatches.remove("V") tsMatches.insert(0,"V") if "status" in tsMatches: tsMatches.remove("status") tsMatches.insert(1,"status") varPattern = re.compile("v\.(\w*)") varMatches = varPattern.findall(formula) varMatches = utilities.uniqify(varMatches) constPattern = re.compile("c\.(\w*)") constMatches = constPattern.findall(formula) constMatches = utilities.uniqify(constMatches) varList = [] index = 1 for var in tsMatches: varList.append((index, var, "TS")) index+=1 for var in varMatches: varList.append((index, var, "VAR")) index+=1 for var in constMatches: varList.append((index, var, "CONST")) index+=1 for varIndex,varName,varType in varList: if len(varName)>15: raise ValueError("Variable name %s longer than max length of 13 characters" %varName) return varList
def main(): #-----------Setting up and using the option parser----------------------- parser=OptionParser(usage= usage, version=version) parser.add_option("-v", "--verbose", action="store_true",dest="verbose", help="Verbose output") parser.add_option("-b", "--begin", action="store",dest="begin",default=None, help="Time to start extracting ship tracks") parser.add_option("-e", "--end", action="store",dest="end",default=None, help="Time to end extraction of ship tracks") parser.add_option("-m", "--mmsi", action="store",dest="mmsi",default=None, help="Specify a mmsi") parser.add_option("-o", "--output", action="store",dest="outputFile",default=None, help="To write output in ascii format") (options, args) = parser.parse_args() if options.verbose: loglevel = logging.DEBUG else: loglevel = logging.INFO logging.basicConfig(level=loglevel) log = logging.getLogger(__name__) if options.end is None or options.begin is None: parser.error("Need to specify begin and end time") if options.outputFile is None: parser.error("Need to specify output filename") #Get mmsi for ships with data in the time-inteval using keyscan cmd="keyscan -r f -b %s -e %s" %(options.begin,options.end) returnCode,errMsg,outMsg=utilities.execute(cmd) keys=outMsg.split("\n") keys=[int(key[:3]+key[5:11]) for key in keys[:-1]] keys=utilities.uniqify(keys) #remove doubles ais_stat=AisStat(domain=os.environ.get("AVDBNAME")) ais_stat.read() if options.mmsi is not None: mmsi=int(options.mmsi) if mmsi not in ais_stat.mmsi: log.error("MMSI %s not found in ais_stat.txt" %options.mmsi) sys.exit(1) if mmsi not in keys: log.info("No time-series data for ship in specified time interval") sys.exit(0) mmsiList=[mmsi] else: mmsiList = [mmsi for mmsi in keys if mmsi in ais_stat.mmsi] log.info("%i ships out of %i in time-series db found in ais_stat.txt" %(len(mmsiList), len(keys))) firstShip=True for mmsi in mmsiList: cmd="shiptsget -r f -b %s -e %s %i -S" %(options.begin,options.end,mmsi) returnCode,errMsg,outMsg=utilities.execute(cmd) rows=outMsg.split("\n") geomType=rows.pop(0) attributeNames=rows.pop(0) coords=rows[1::4] data=rows[3::4] if firstShip: dataRows=data coordRows=coords firstShip=False else: dataRows+=data coordRows+=coords output=geomType+"\n" output+=attributeNames+"\n" for i in range(len(coordRows)): output+="#COORD %i 0\n" %(i+1) output+=coordRows[i]+"\n" output+="#DATA %i\n" %(i+1) output+=dataRows[i]+"\n" try: outputFile=open(path.abspath(options.outputFile),"w") except: log.error("Could not open file: %s" %path.abspath(options.outputFile)) sys.exit(1) outputFile.write(output) outputFile.close()