Trisurf Monte Carlo simulator
Samo Penic
2016-03-07 0706adbb9bee43e3e5349c3d9fa5f001257b7510
python/trisurf/trisurf.py
@@ -1,7 +1,13 @@
#!/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
'''
This is a trisurf instance manager written in python
@@ -27,47 +33,183 @@
      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)
                  if(i==nlines-1):
                     print (line)
                  i=i+1
         except:
            print("Cannot read statistics file in "+self.fullname+"\n")
            exit(1)
      else:
         print("File "+self.fullname+" does not exists.\n")
         exit(1)
class Runner:
   '''
   Class Runner consists of a single running or terminated instance of the trisurf
   '''
   def initFromTape(self, 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
      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("", statfile) # we are already in the running directory, so local path is needed!
      return
   def __str__(self):
      return("Running instance")
      if(self.getStatus()==0):
         str=" not running."
      else:
         str=" running."
      return(self.Dir.fullpath()+str)