Add high-level pipeline API
authorMaxim Koltsov <maks@omrb.pnpi.spb.ru>
Wed, 15 Jul 2015 13:27:21 +0000 (16:27 +0300)
committerMaxim Koltsov <maks@omrb.pnpi.spb.ru>
Wed, 15 Jul 2015 13:27:21 +0000 (16:27 +0300)
GromacsPipeline wrapper enables you to construct a pipeline of Gromacs
modules and run it in a single pass with one trajectory.

src/python/CMakeLists.txt
src/python/pipeline_test.py [new file with mode: 0644]
src/python/runner/__init__.py [new file with mode: 0644]
src/python/runner/pipeline.py [new file with mode: 0644]

index d26e903783e8755b41d23deeea743cfba2944af6..d2f779eb45f70ebddd518c7ecc20389382c796b8 100644 (file)
@@ -78,3 +78,7 @@ add_sip_python_module(gromacs.TrajectoryAnalysis
     sip/trajectoryanalysis/TrajectoryAnalysis.sip libgromacs)
 
 python_install(__init__.py ${PYTHON_SITE_PACKAGES_INSTALL_DIR}/gromacs)
+
+install(DIRECTORY runner DESTINATION ${PYTHON_SITE_PACKAGES_INSTALL_DIR}/gromacs)
+python_install(runner/__init__.py ${PYTHON_SITE_PACKAGES_INSTALL_DIR}/gromacs)
+python_install(runner/pipeline.py ${PYTHON_SITE_PACKAGES_INSTALL_DIR}/gromacs)
diff --git a/src/python/pipeline_test.py b/src/python/pipeline_test.py
new file mode 100644 (file)
index 0000000..1aaedd5
--- /dev/null
@@ -0,0 +1,38 @@
+
+from gromacs import TrajectoryAnalysis
+from runner.pipeline import GromacsPipeline, runPipeline
+
+class Test(TrajectoryAnalysis.TrajectoryAnalysisModule):
+
+    def __init__(self):
+        super(Test, self).__init__("test", "test")
+
+    def initOptions(self, options, settings):
+        options.setDescription(self.description())
+
+    def getBatch(self):
+        return self.modules
+
+    def getArgv(self, i):
+        return self.options[i]
+
+    def initAnalysis(self, settings, top):
+        pass
+
+    def analyzeFrame(self, frnr, frame, pbc, data):
+        print("Analyzing frame in Test module")
+
+    def finishAnalysis(self, nframes):
+        pass
+
+    def writeOutput(self):
+        pass
+
+modules = [
+    ("Angle", "-group1 System -oav angles.xvg"),
+    (Test(), ""),
+    (TrajectoryAnalysis.SasaInfo.create(), "-surface DNA"),
+]
+
+runPipeline(name="Pipeline", modules=modules)
+
diff --git a/src/python/runner/__init__.py b/src/python/runner/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/python/runner/pipeline.py b/src/python/runner/pipeline.py
new file mode 100644 (file)
index 0000000..f0dbb79
--- /dev/null
@@ -0,0 +1,61 @@
+
+from gromacs import Options, TrajectoryAnalysis
+import sys, shlex
+
+class GromacsPipeline(TrajectoryAnalysis.TrajectoryAnalysisModule):
+
+    def __init__(self,
+        name="PythonPipeline",
+        description="Pipeline of modules created with Python",
+        modules=[]
+    ):
+        super(GromacsPipeline, self).__init__(name, description)
+
+        self.optionsHolder = Options.PyOptionsHolder()
+
+        self.modules = []
+        self.options = []
+
+        for module, options in modules:
+            if not isinstance(module, TrajectoryAnalysis.TrajectoryAnalysisModule):
+                info_name = module + "Info"
+                if not hasattr(TrajectoryAnalysis, info_name):
+                    raise ValueError("There is no module named {}".format(name))
+
+                module = getattr(TrajectoryAnalysis, info_name).create()
+
+            options_list = [name] + shlex.split(options)
+
+            self.modules.append(module)
+            self.options.append(options_list)
+
+    def initOptions(self, options, settings):
+        options.setDescription(self.description())
+
+    def getBatch(self):
+        return self.modules
+
+    def getArgv(self, i):
+        return self.options[i]
+
+    def initAnalysis(self, settings, top):
+        pass
+
+    def analyzeFrame(self, frnr, frame, pbc, data):
+        pass
+
+    def finishAnalysis(self, nframes):
+        pass
+
+    def writeOutput(self):
+        pass
+
+    def run(self, argv):
+        if argv is None:
+            argv = sys.argv
+
+        TrajectoryAnalysis.runAsMain(self, argv)
+
+def runPipeline(name="PythonPipeline", description="Pipeline of modules created with Python", modules=[], argv=None):
+    pipeline = GromacsPipeline(name, description, modules)
+    pipeline.run(argv)