From 4d006f604455a438bc07fbf13292ba4c530f6aee Mon Sep 17 00:00:00 2001
From: RomanKova <kovalchykrv@gmail.com>
Date: Fri, 16 Apr 2021 09:05:57 +0530
Subject: [PATCH 1/5] creates the main entry point facade file

---
 foldFacade.py | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
 create mode 100644 foldFacade.py

diff --git a/foldFacade.py b/foldFacade.py
new file mode 100644
index 0000000..3680b96
--- /dev/null
+++ b/foldFacade.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+from simtk.openmm.app import *
+from simtk.openmm import *
+from simtk.unit import *
+from sys import stdout
+import os
+import sys
+import argparse
+
+from parser import Parser
+from unfold import Unfold
+from simulate import Simulate
+from modeller import ModellerF
+
+args = Parser(argparse).parse()
+
+try:
+    platform = Platform.getPlatformByName("CUDA")
+except Exception:
+    platform = Platform.getPlatformByName("OpenCL")
+
+pdb = Unfold(args).unfold
+forcefield = ForceField('amber03.xml', 'amber03_obc.xml')
+
+ModellerF(forcefield).model()
+
+Simulate(forcefield, modeller, args).simulate()

From e9f5b3e50261acb5514a61924b75323550cefafb Mon Sep 17 00:00:00 2001
From: RomanKova <kovalchykrv@gmail.com>
Date: Fri, 16 Apr 2021 09:06:27 +0530
Subject: [PATCH 2/5] separate out modeller to be used by the facade

---
 modeller.py | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 modeller.py

diff --git a/modeller.py b/modeller.py
new file mode 100644
index 0000000..b5074ed
--- /dev/null
+++ b/modeller.py
@@ -0,0 +1,12 @@
+import sys
+
+
+class ModellerF:
+    def __init__(self, forcefield):
+        self.forcefield = forcefield
+
+    def model(self):
+       #forcefield = ForceField('amber99sb.xml', 'tip3p.xml')
+        modeller = Modeller(pdb.topology, pdb.positions)
+        modeller.addHydrogens(self.forcefield)
+        print(modeller.topology)

From 1671ee5983e1ef3545812dc308c8dd955f7373d2 Mon Sep 17 00:00:00 2001
From: RomanKova <kovalchykrv@gmail.com>
Date: Fri, 16 Apr 2021 09:06:58 +0530
Subject: [PATCH 3/5] separate out simulation to be used by facade

---
 simulate.py | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100644 simulate.py

diff --git a/simulate.py b/simulate.py
new file mode 100644
index 0000000..b967192
--- /dev/null
+++ b/simulate.py
@@ -0,0 +1,29 @@
+import sys
+
+
+class Simulate:
+    def __init__(self, forcefield, modeller, args):
+        self.forcefield = forcefield
+        self.modeller = modeller
+        self.args = args
+
+    def simulate(self):
+        system = self.forcefield.createSystem(self.modeller.topology,
+                                              # matches https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2980750/#bib39
+                                              implicitSolvent=OBC2,
+                                              nonbondedMethod=NoCutoff, nonbondedCutoff=1*nanometer,
+                                              constraints=HBonds)
+        integrator = LangevinIntegrator(
+            self.args.temp*kelvin, 1/picosecond, 2*femtoseconds)
+        simulation = Simulation(
+            self.modeller.topology, system, integrator, platform)
+        simulation.context.setPositions(self.modeller.positions)
+        simulation.minimizeEnergy()
+
+        steps = self.args.steps
+        steps_write = max(1, steps//self.args.writes)
+        print("writing every %d steps" % steps_write)
+        simulation.reporters.append(PDBReporter(args.out, steps_write))
+        simulation.reporters.append(StateDataReporter(
+            stdout, steps_write, step=True, potentialEnergy=True, temperature=True))
+        simulation.step(steps)

From df0b531f508d39d41eb7beca2b1f1a00e72deb8f Mon Sep 17 00:00:00 2001
From: RomanKova <kovalchykrv@gmail.com>
Date: Fri, 16 Apr 2021 09:07:19 +0530
Subject: [PATCH 4/5] separate out unfold operation

---
 unfold.py | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)
 create mode 100644 unfold.py

diff --git a/unfold.py b/unfold.py
new file mode 100644
index 0000000..7ac44aa
--- /dev/null
+++ b/unfold.py
@@ -0,0 +1,23 @@
+import sys
+
+
+class Unfold:
+    def __init__(self, args):
+        self.args = args
+
+    def unfold(self):
+        if self.args.scratch:
+            # unfolded protein
+            if self.args.fasta is not None:
+                fasta = self.args.fasta
+            else:
+                protein_fasta = "proteins/villin/1vii.fasta"
+                fasta = open(protein_fasta).read().split("\n")[1]
+            print("folding %s" % fasta)
+            from lib import write_unfolded
+            write_unfolded(fasta, "/tmp/unfolded.pdb")
+            pdb = PDBFile("/tmp/unfolded.pdb")
+        else:
+            # already folded protein
+            pdb = PDBFile(self.args.pdb)
+        return pdb

From 00c2daaef965cacf387dea957a7e6f3f0d9d4566 Mon Sep 17 00:00:00 2001
From: RomanKova <kovalchykrv@gmail.com>
Date: Fri, 16 Apr 2021 09:08:05 +0530
Subject: [PATCH 5/5] fold.py is converted to foldFacade.py

---
 fold.py | 62 ---------------------------------------------------------
 1 file changed, 62 deletions(-)
 delete mode 100755 fold.py

diff --git a/fold.py b/fold.py
deleted file mode 100755
index 50b2e22..0000000
--- a/fold.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/env python3
-from simtk.openmm.app import *
-from simtk.openmm import *
-from simtk.unit import *
-from sys import stdout
-import os
-import sys
-import argparse
-
-parser = argparse.ArgumentParser(description='Fold some proteins.')
-parser.add_argument('--scratch', action='store_true')
-parser.add_argument('--temp', type=int, default=300)
-parser.add_argument('--steps', type=int, default=100000, help="2500000000 should fold the protein")
-parser.add_argument('--writes', type=int, default=1000, help="default is 1000")
-parser.add_argument('--out', type=str, default="/tmp/output.pdb")
-parser.add_argument('--pdb', type=str, default="proteins/villin/1vii.pdb")
-parser.add_argument('--fasta', type=str, default=None)
-args = parser.parse_args(sys.argv[1:])
-
-try:
-  platform = Platform.getPlatformByName("CUDA")
-except Exception:
-  platform = Platform.getPlatformByName("OpenCL")
-
-if args.scratch:
-  # unfolded protein
-  if args.fasta is not None:
-    fasta = args.fasta
-  else:
-    protein_fasta = "proteins/villin/1vii.fasta"
-    fasta = open(protein_fasta).read().split("\n")[1]
-  print("folding %s" % fasta)
-  from lib import write_unfolded
-  write_unfolded(fasta, "/tmp/unfolded.pdb")
-  pdb = PDBFile("/tmp/unfolded.pdb")
-else:
-  # already folded protein
-  pdb = PDBFile(args.pdb)
-
-#forcefield = ForceField('amber99sb.xml', 'tip3p.xml')
-forcefield = ForceField('amber03.xml', 'amber03_obc.xml')
-
-modeller = Modeller(pdb.topology, pdb.positions)
-modeller.addHydrogens(forcefield)
-print(modeller.topology)
-
-system = forcefield.createSystem(modeller.topology,
-  implicitSolvent=OBC2,   # matches https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2980750/#bib39
-  nonbondedMethod=NoCutoff, nonbondedCutoff=1*nanometer,
-  constraints=HBonds)
-integrator = LangevinIntegrator(args.temp*kelvin, 1/picosecond, 2*femtoseconds)
-simulation = Simulation(modeller.topology, system, integrator, platform)
-simulation.context.setPositions(modeller.positions)
-simulation.minimizeEnergy()
-
-steps = args.steps
-steps_write = max(1, steps//args.writes)
-print("writing every %d steps" % steps_write)
-simulation.reporters.append(PDBReporter(args.out, steps_write))
-simulation.reporters.append(StateDataReporter(stdout, steps_write, step=True, potentialEnergy=True, temperature=True))
-simulation.step(steps)
-