From 967b04d8ff959b18acb4c6d8fc569e6084c6ce77 Mon Sep 17 00:00:00 2001
From: Chris Maffeo <cmaffeo2@illinois.edu>
Date: Mon, 10 Sep 2018 17:36:14 -0500
Subject: [PATCH] Added 'directory' option to arbdmodel.simulate

---
 mrdna/model/arbdmodel.py | 96 ++++++++++++++++++++++------------------
 1 file changed, 54 insertions(+), 42 deletions(-)

diff --git a/mrdna/model/arbdmodel.py b/mrdna/model/arbdmodel.py
index 3d565f0..048f3a6 100644
--- a/mrdna/model/arbdmodel.py
+++ b/mrdna/model/arbdmodel.py
@@ -676,56 +676,68 @@ class ArbdModel(PdbModel):
         if typeA != typeB:
             self.nbSchemes.append( (nbScheme, typeB, typeA) )
 
-    def simulate(self, outputPrefix, outputDirectory='output', numSteps=100000000, timestep=None, gpu=0, outputPeriod=1e4, arbd=None):
+    def simulate(self, outputPrefix, outputDirectory='output', numSteps=100000000, timestep=None, gpu=0, outputPeriod=1e4, arbd=None, directory='.'):
         assert(type(gpu) is int)
         numSteps = int(numSteps)
 
-        if timestep is not None:
-            self.timestep = timestep
+        d_orig = os.getcwd()
+        try:
+            if not os.path.exists(directory):
+                os.makedirs(directory)
+            os.chdir(directory)
 
-        if self.cacheUpToDate == False: # TODO: remove cache?
-            self._countParticleTypes()
-            self._updateParticleOrder()
+            if timestep is not None:
+                self.timestep = timestep
 
-        if outputDirectory == '': outputDirectory='.'
-            
-        if arbd is None:
-            for path in os.environ["PATH"].split(os.pathsep):
-                path = path.strip('"')
-                fname = os.path.join(path, "arbd")
-                if os.path.isfile(fname) and os.access(fname, os.X_OK):
-                    arbd = fname
-                    break 
-
-        if arbd is None: raise Exception("ARBD was not found")
-
-        if not os.path.exists(arbd):
-            raise Exception("ARBD was not found")
-        if not os.path.isfile(arbd):
-            raise Exception("ARBD was not found")
-        if not os.access(arbd, os.X_OK):
-            raise Exception("ARBD is not executable")
-
-        if not os.path.exists(outputDirectory):
-            os.makedirs(outputDirectory)
-        elif not os.path.isdir(outputDirectory):
-            raise Exception("outputDirectory '%s' is not a directory!" % outputDirectory)
-            
+            if self.cacheUpToDate == False: # TODO: remove cache?
+                self._countParticleTypes()
+                self._updateParticleOrder()
 
-        self.writePdb( outputPrefix + ".pdb" )
-        self.writePsf( outputPrefix + ".psf" )
-        self.writeArbdFiles( outputPrefix, numSteps=numSteps, outputPeriod=outputPeriod )
-        os.sync()
+            if outputDirectory == '': outputDirectory='.'
 
-        ## http://stackoverflow.com/questions/18421757/live-output-from-subprocess-command
-        cmd = (arbd, '-g', "%d" % gpu, "%s.bd" % outputPrefix, "%s/%s" % (outputDirectory, outputPrefix))
-        cmd = tuple(str(x) for x in cmd)
+            if arbd is None:
+                for path in os.environ["PATH"].split(os.pathsep):
+                    path = path.strip('"')
+                    fname = os.path.join(path, "arbd")
+                    if os.path.isfile(fname) and os.access(fname, os.X_OK):
+                        arbd = fname
+                        break 
+
+            if arbd is None: raise Exception("ARBD was not found")
+
+            if not os.path.exists(arbd):
+                raise Exception("ARBD was not found")
+            if not os.path.isfile(arbd):
+                raise Exception("ARBD was not found")
+            if not os.access(arbd, os.X_OK):
+                raise Exception("ARBD is not executable")
+
+            if not os.path.exists(outputDirectory):
+                os.makedirs(outputDirectory)
+            elif not os.path.isdir(outputDirectory):
+                raise Exception("outputDirectory '%s' is not a directory!" % outputDirectory)
+
+
+            self.writePdb( outputPrefix + ".pdb" )
+            self.writePsf( outputPrefix + ".psf" )
+            self.writeArbdFiles( outputPrefix, numSteps=numSteps, outputPeriod=outputPeriod )
+            os.sync()
+
+            ## http://stackoverflow.com/questions/18421757/live-output-from-subprocess-command
+            cmd = (arbd, '-g', "%d" % gpu, "%s.bd" % outputPrefix, "%s/%s" % (outputDirectory, outputPrefix))
+            cmd = tuple(str(x) for x in cmd)
+
+            print("Running ARBD with: %s" % " ".join(cmd))
+            process = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
+            for line in process.stdout:
+                sys.stdout.write(line)
+                sys.stdout.flush()
+
+        except:
+            raise
+        finally:
+            os.chdir(d_orig)
 
-        print("Running ARBD with: %s" % " ".join(cmd))
-        process = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
-        for line in process.stdout:
-            sys.stdout.write(line)
-            sys.stdout.flush()
 
     # -------------------------- #
     # Methods for printing model #
-- 
GitLab