From d2f7b0c053e93b4d409d9661dbaff2eedcf391c1 Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@gmail.com> Date: Sat, 14 Jan 2017 22:06:35 +0000 Subject: [PATCH] Added analyses collection file into trisurf package --- trisurf/trisurf.py | 144 +++++++++++++++++++++++++++-------------------- 1 files changed, 82 insertions(+), 62 deletions(-) diff --git a/trisurf/trisurf.py b/trisurf/trisurf.py index 92b138b..a709d8a 100644 --- a/trisurf/trisurf.py +++ b/trisurf/trisurf.py @@ -186,7 +186,6 @@ self.path=path self.filename=filename self.fullname=os.path.join(path,filename) - self.fileOK=self.read() return def exists(self): @@ -196,7 +195,7 @@ else: return False - def mapcount(self): + def lineCount(self): ''' Internal method for determining the number of the lines in the most efficient way. Is it really the most efficient? ''' @@ -213,19 +212,26 @@ f.close() return lines - def tail(self,filename,n=2): - with open(filename,'r') as myfile: + def tail(self): + with open(self.fullname,'r') as myfile: lines=myfile.readlines() return [lines[len(lines)-2].replace('\n',''),lines[len(lines)-1].replace('\n','')] - def read(self): + def checkFileValidity(self): try: - lines=self.tail(self.fullname) + lines=self.tail() except: return(False) if len(lines)<2: return(False) - #print (line) + return(True) + + def getSimulationDeltaTime(self): + try: + lines=self.tail() + except: + return 0 + fields=shlex.split(lines[0]) epoch1=fields[0] n1=fields[1] @@ -234,61 +240,59 @@ epoch2=fields[0] n2=fields[1] try: - self.dT=int(epoch2)-int(epoch1) - self.last=n2 - #print(epoch1) - #print(epoch2) - #print(self.dT) - #print(self.last) - self.startDate=os.path.getmtime(os.path.join(self.path,'.lock')) + dT=int(epoch2)-int(epoch1) except: - return(False) - return(True) + return 0 + return dT + + def getLastIterationInStatistics(self): + try: + lines=self.tail() + except: + return 0 + + fields=shlex.split(lines[0]) + epoch1=fields[0] + n1=fields[1] + + fields=shlex.split(lines[1]) + epoch2=fields[0] + return (fields[1]) + + def getColumn(self,n=0): + lines=self.readText().splitlines() + col=[] + name=lines[0].split()[n] + for line in lines: + col.append(line.split()[n]) + return col[2:],name + + def getTable(self): + lines=self.readText().splitlines() + keys=lines[0].split() + table={} + def num(s): + try: + return int(s) + except ValueError: + return float(s) + for key in keys: + table[key]=[] + for line in lines: + fields=line.split() + for i in range(0,len(keys)): + try: + value=num(fields[i]) + table[keys[i]].append(value) + except: + pass + return table + def readText(self): with open(self.fullname, 'r+') as fin: cont=fin.read() return cont - - def read_old(self): - ''' - Method read() reads the statistics if it exists. It sets local variable dT storing the time differential between two intervals of simulation (outer loops). It also stores last simulation loop and the start of the run. - ''' - if(self.exists()): - # epoch1=0 - # epoch2=0 - # n1=0 - # n2=0 - nlines=self.mapcount() - if nlines<2: - return(False) - try: - with open(self.fullname, "r+") as fin: - i=0; - for line in fin: - if(i==1): - #print (line) - fields=shlex.split(line) - epoch1=fields[0] - n1=fields[1] - if(i==nlines-1): - fields=shlex.split(line) - epoch2=fields[0] - n2=fields[1] - i=i+1 - except: - #print("Cannot read statistics file in "+self.fullname+"\n") - return(False) - else: - #print("File "+self.fullname+" does not exists.\n") - return(False) - try: - self.dT=(int(epoch2)-int(epoch1))/(int(n2)-int(n1)) - except: - self.dT=0 - self.last=n2 - self.startDate=epoch1 - return(True) def __str__(self): ''' @@ -365,6 +369,13 @@ return True else: return False + + + def getStartTime(self): + try: + return os.path.getmtime(os.path.join(self.Dir.fullpath(),'.lock')) + except: + return -1 def getStatus(self): pid=self.getPID() @@ -469,8 +480,8 @@ self.Comment=FileContent(os.path.join(self.Dir.fullpath(),".comment")) pid=self.getPID() status=self.getStatus() - if(self.Statistics.fileOK): - ETA=str(datetime.timedelta(microseconds=(int(self.Tape.config['iterations'])-int(self.Statistics.last))*self.Statistics.dT)*1000000) + if(self.Statistics.checkFileValidity()): + ETA=str(datetime.timedelta(microseconds=(int(self.Tape.config['iterations'])-int(self.Statistics.getLastIterationInStatistics()))*self.Statistics.getSimulationDeltaTime())*1000000) if(status==TS_NONEXISTANT or status==TS_NOLOCK): statustxt="Not running" pid="" @@ -485,8 +496,8 @@ else: statustxt="Running" - if(self.Statistics.fileOK): - report=[time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(self.Statistics.startDate))),ETA, statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] + if(self.Statistics.checkFileValidity()): + report=[time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(self.getStartTime()))),ETA, statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] else: report=["N/A","N/A",statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] return report @@ -505,12 +516,20 @@ self.Comment.writefile(data,mode=mode) - def getLastVTU(self): + def getLastVTUold(self): vtuidx=self.getLastIteration()-int(self.Tape.getValue("inititer")) if vtuidx<0: return None else: return 'timestep_{:06d}.vtu'.format(vtuidx) + + def getLastVTU(self): + flist=[] + for file in os.listdir(self.Dir.fullpath()): + if file.endswith(".vtu"): + flist.append(file) + flist.sort() + return(flist[-1]) def __str__(self): if(self.getStatus()==0): @@ -519,4 +538,5 @@ str=" running." return(self.Dir.fullpath()+str) - + def __repr__(self): + return("Instance of trisurf in "+self.Dir.fullpath()) -- Gitblit v1.9.3