Trisurf Monte Carlo simulator
Samo Penic
2016-03-15 34600bfcd7791fdc09ad7a03f5c2aa37b59dc42c
python/trisurf/trisurf.py
@@ -1,7 +1,15 @@
#!/usr/bin/python3
import configobj
import xml.etree.ElementTree as ET
import base64
import zlib
import io
import os
from itertools import islice
import mmap
import shlex
import psutil
'''
This is a trisurf instance manager written in python
@@ -27,47 +35,204 @@
      except:
         print("Error reading or parsing tape file!\n")
         exit(1)
   def setTape(self, string):
      self.tape=string
      self.config=configobj.ConfigObj(io.StringIO(string))
      return
   def getValue(self,key):
      return self.config[key]
   def __str__(self):
      retval=""
      for key,val in self.config.iteritems():
         retval=retval+str(key)+" = "+str(val)+"\n"
      return retval
class Directory:
   def __init__(self, maindir=".", simdir=""):
      self.maindir=maindir
      self.simdir=simdir
      return
   def fullpath(self):
      return os.path.join(self.maindir,self.simdir)
   def exists(self):
      path=self.fullpath()
      if(os.path.exists(path)):
         return 1
      else:
         return 0
   def make(self):
      try:
         os.makedirs(self.fullpath())
      except:
         print("Cannot make directory "+self.fullpath()+"\n")
         exit(1)
      return
   def makeifnotexist(self):
      if(self.exists()==0):
         self.make()
      return
   def remove(self):
      if(self.exists()):
         try:
            os.rmdir(self.fullpath())
         except:
            print("Cannot remove directory "+self.fullpath()+ "\n")
            exit(1)
      return
   def goto(self):
      try:
         os.chdir(self.fullpath())
      except:
         print("Cannot go to directory "+self.fullpath()+"\n")
      return
class Statistics:
   def __init__(self,path,filename="statistics.csv"):
      self.path=path
      self.filename=filename
      self.fullname=os.path.join(path,filename)
      self.read()
      return
   def __str__(self):
      return(str(self.fullname))
   def exists(self):
      if(os.path.isfile(self.fullname)):
         return True
      else:
         return False
   def mapcount(self):
      f = open(self.fullname, "r+")
      buf = mmap.mmap(f.fileno(), 0)
      lines = 0
      readline = buf.readline
      while readline():
         lines += 1
      return lines
   def read(self):
      if(self.exists()):
         nlines=self.mapcount()
         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)
      self.dT=(int(epoch2)-int(epoch1))/(int(n2)-int(n1))
      return(True)
class Runner:
   '''
   Class Runner consists of a single running or terminated instance of the trisurf
   '''
   def initFromTape(self, tape='tape'):
      self.tape=Tape()
      self.tape.readTape(tape)
      pass
   def initFromSnapshot(self, tape='snapshot.vtu'):
      pass
   def __init__(self, subdir='run0', tape='', snapshot=''):
      self.subdir=subdir
      if(tape!=''):
         self.initFromTape(tape)
      if(snapshot!=''):
         self.initFromSnapshot(snapshot)
      return
   def initFromTape(self, tape):
      self.tape=Tape()
      self.tape.readTape(tape)
   def initFromSnapshot(self, snapshotfile):
      try:
         tree = ET.parse(snapshotfile)
      except:
         print("Error reading snapshot file")
         exit(1)
      root = tree.getroot()
      tapetxt=root.find('tape')
      version=root.find('trisurfversion')
      self.tape=Tape()
      self.tape.setTape(tapetxt.text)
   def getStatus(self):
      pass
      self.Dir=Directory(maindir=self.maindir,simdir=self.subdir)
      self.Dir.makeifnotexist()
#      self.Dir.goto()
      try:
         fp = open(os.path.join(self.Dir.fullpath(),'.lock'))
      except IOError as e:
         return 0 #file probably does not exist. e==2??
      pid=fp.readline();
      fp.close();
      if(psutil.pid_exists(int(pid))):
         return 1
      else:
         return 0
   def start(self):
      pass
      if(self.getStatus()==0):
         self.Dir=Directory(maindir=self.maindir,simdir=self.subdir)
         self.Dir.makeifnotexist()
#         self.Dir.goto()
         print("Starting trisurf-ng executable at "+self.Dir.fullpath()+"\n")
      else:
         print("Process already running. Not starting\n")
      return
   def stop(self):
      pass
   def setMaindir(self,prefix,variables):
      maindir="./"
      for p,v in zip(prefix,variables):
         if(v=="xk0"):
            tv=str(round(float(self.tape.config[v])))
         else:
            tv=self.tape.config[v]
         maindir=maindir+p+tv
      self.maindir=maindir
      return
   def setSubdir(self, subdir="run0"):
      self.subdir=subdir
      return
   def getStatistics(self, statfile="statistics.csv"):
      self.statistics=Statistics(self.Dir.fullpath(), statfile)
      return
   def __str__(self):
      return("Running instance")
      if(self.getStatus()==0):
         str=" not running."
      else:
         str=" running."
      return(self.Dir.fullpath()+str)