diff --git a/cadnano_segments.py b/cadnano_segments.py
index d0adeea2b822735fc997b5081a0e0a1e74fce940..b8149c2ac45f13dddbade565d95154332d1b6cd9 100644
--- a/cadnano_segments.py
+++ b/cadnano_segments.py
@@ -449,37 +449,29 @@ class cadnano_part(SegmentModel):
         for hid,segs in self.helices.items():
             occ = self.strand_occupancies[hid]
             for i in range(len(segs)-1):
-                    seg1,seg2 = [segs[j] for j in (i,i+1)]
-                    r1,r2 = [self.helix_ranges[hid][j] for j in (i,i+1)]
-                    if r1[1]+1 == r2[0]:
-                        ## TODO: handle nicks that are at intrahelical connections(?)
-                        zmid1 = int(0.5*(r1[0]+r1[1]))
-                        zmid2 = int(0.5*(r2[0]+r2[1]))
-                        # if seg1.name == "1-1" or seg2.name == "1-1":
-                        #     # if seg1.name == "19-3" or seg2.name == "19-3":
-                        #     import pdb
-                        #     pdb.set_trace()
-
-                        ## TODO: validate
-                        if zmid1 in occ[0] and zmid2 in occ[0]:
-                            seg1.connect_end3(seg2.start5)
-
-                        if zmid1 in occ[1] and zmid2 in occ[1]:
-                            if zmid1 in occ[0]:
-                                end = seg1.end5
-                            else:
-                                end = seg1.start5
-                            if zmid2 in occ[0]:
-                                seg2.connect_start3(end)
-                            else:
-                                seg2.connect_end3(end)
+                seg1,seg2 = [segs[j] for j in (i,i+1)]
+                r1,r2 = [self.helix_ranges[hid][j] for j in (i,i+1)]
+                if r1[1]+1 == r2[0]:
+                    ## TODO: handle nicks that are at intrahelical connections(?)
+                    zmid1 = int(0.5*(r1[0]+r1[1]))
+                    zmid2 = int(0.5*(r2[0]+r2[1]))
+
+                    ## TODO: validate
+                    if zmid1 in occ[0] and zmid2 in occ[0]:
+                        seg1.connect_end3(seg2.start5)
+
+                    if zmid1 in occ[1] and zmid2 in occ[1]:
+                        if zmid1 in occ[0]:
+                            end = seg1.end5
+                        else:
+                            end = seg1.start5
+                        if zmid2 in occ[0]:
+                            seg2.connect_start3(end)
+                        else:
+                            seg2.connect_end3(end)
                         
     def _add_crossovers(self):
         for h1,f1,z1,h2,f2,z2 in self.xover_list:
-            # if (h1 == 52 or h2 == 52) and z1 == 221:
-            if (h1 == 15 and z1 == 230) or h2 == 15 and z2 == 231:
-                import pdb
-                pdb.set_trace()
             seg1, nt1 = self._get_segment_nucleotide(h1,z1,not f1)
             seg2, nt2 = self._get_segment_nucleotide(h2,z2,f2)
             ## TODO: use different types of crossovers
@@ -548,8 +540,8 @@ def read_model(json_data, sequence=None):
     """ Read in data """
     part = decode_cadnano_part(json_data)
     model = cadnano_part(part,
-                         max_basepairs_per_bead = 7,
-                         max_nucleotides_per_bead = 4,
+                         max_basepairs_per_bead = 5,
+                         max_nucleotides_per_bead = 5,
                          local_twist=False)
     model._generate_strands() # TODO: move into model creation
 
@@ -576,120 +568,6 @@ def read_model(json_data, sequence=None):
 
     return model
 
-
-def run_simulation_protocol( output_name, job_id, json_data,
-                             sequence=None,
-                             remove_long_bonds=False,
-                             gpu = 0,
-                             directory=None,
-                             coarse_steps = 1e7+1,
-                             fine_steps = 1e7+1
-                         ):
-
-    ret = None
-    d_orig = os.getcwd()
-    try:
-        if directory is None:
-            import tempfile
-            directory = tempfile.mkdtemp(prefix='origami-%s-' % job_id, dir='/dev/shm/')
-        elif not os.path.exists(directory):
-            os.makedirs(directory)
-        os.chdir(directory)
-
-        output_directory = "output"
-        
-        """ Read in data """
-        part = decode_cadnano_part(json_data)
-        model = cadnano_part(part,
-                             max_basepairs_per_bead = 7, 
-                             max_nucleotides_per_bead = 4,
-                             local_twist=False)
-        model._generate_strands() # TODO: move into model creation
-
-        # TODO        
-        # try:
-        #     model.set_cadnano_sequence()
-        # finally:
-        #     ...
-        #     if sequence is not None and len() :
-        #         model.strands[0].set_sequence(seq)
-        
-        if sequence is None or len(sequence) == 0:
-            ## default m13mp18
-            sequence = list(m13seq)
-            try:
-                model.strands[0].set_sequence(sequence)
-            except:
-                ...
-        else:
-            model.strands[0].set_sequence(sequence)
-
-        for s in model.segments:
-            s.randomize_unset_sequence()
-
-        # TODO: add the output directory in to the readArbdCoords functions or make it an attribute of the model object 
-
-        """ Coarse simulation """
-        # simargs = dict(timestep=200e-6, outputPeriod=1e5, gpu=gpu )
-        simargs = dict(timestep=200e-6, outputPeriod=1e5, gpu=gpu, arbd=arbd )
-        
-        if remove_long_bonds:
-            output_prefix = "%s-0" % output_name
-            full_output_prefix = "%s/%s" % (output_directory,output_prefix)
-            ## TODO Remove long bonds
-            model.simulate( outputPrefix = output_prefix, numSteps=0.05*coarse_steps, **simargs )
-            coordinates = readArbdCoords('%s.0.restart' % full_output_prefix)
-            output_prefix = "%s-1" % output_name
-            model._update_segment_positions(coordinates)
-            # model._clear_beads()
-            # # model._generate_bead_model( 7, 4, False )
-            # model._generate_bead_model( 7, 4, False )
-            model.simulate( outputPrefix = output_prefix, numSteps=0.95*coarse_steps, **simargs )
-        else:
-            output_prefix = "%s-1" % output_name
-            full_output_prefix = "%s/%s" % (output_directory,output_prefix)
-            model.simulate( outputPrefix = output_prefix, numSteps=coarse_steps, **simargs )
-        coordinates = readArbdCoords('%s.0.restart' % full_output_prefix)
-
-
-        """ Fine simulation """ 
-        output_prefix = "%s-2" % output_name
-        full_output_prefix = "%s/%s" % (output_directory,output_prefix)
-        simargs['timestep'] = 50e-6
-        model._update_segment_positions(coordinates)
-        model._clear_beads()
-        model._generate_bead_model( 1.03, 1.03, local_twist=True, escapable_twist=True )
-        model.simulate( outputPrefix = output_prefix, numSteps=fine_steps, **simargs )
-        coordinates = readAvgArbdCoords('%s.psf' % output_prefix,'%s.pdb' % output_prefix, '%s.0.dcd' % full_output_prefix, rmsdThreshold=1)
-
-
-        """ Freeze twist """
-        output_prefix = "%s-3" % output_name
-        full_output_prefix = "%s/%s" % (output_directory,output_prefix)
-        model._update_segment_positions(coordinates)
-        model._clear_beads()
-        model._generate_bead_model( 1, 1, local_twist=True, escapable_twist=False )
-        model.simulate( outputPrefix = output_prefix, numSteps=fine_steps, **simargs )
-        coordinates = readAvgArbdCoords('%s.psf' % output_name,'%s.pdb' % output_prefix, '%s.0.dcd' % full_output_prefix )
-
-
-        """ Atomic simulation """
-        output_prefix = "%s-4" % output_name
-        full_output_prefix = "%s/%s" % (output_directory,output_prefix)
-        model._update_segment_positions(coordinates)
-        model._clear_beads()
-        model._generate_atomic_model(scale=0.25)
-        model.atomic_simulate( outputPrefix = output_prefix )
-
-        ret = directory
-        
-    except:
-        raise
-    finally:
-        os.chdir(d_orig)
-        
-    return ret
-
 # pynvml.nvmlInit()
 # gpus = range(pynvml.nvmlDeviceGetCount())
 # pynvml.nvmlShutdown()
diff --git a/run.py b/run.py
index 71f2f4f118a0a15fe6a182b9a9c3022ce51dd7ab..fd24ebc674b58885ca43087ae4d23536765312c0 100644
--- a/run.py
+++ b/run.py
@@ -2,7 +2,8 @@
 import sys
 from glob import glob
 import re
-from cadnano_segments import read_json_file, run_simulation_protocol
+from cadnano_segments import read_json_file, read_model
+from simulate import run_simulation_protocol
 
 if __name__ == '__main__':
     if len(sys.argv) > 1:
@@ -15,12 +16,18 @@ if __name__ == '__main__':
         out = re.match('json/(.*).json',f).group(1)
         try:
             data = read_json_file(f)
+            model = read_model(data)
         except:
             print("WARNING: skipping unreadable json file {}".format(f))
             continue
             
-        # run_simulation_protocol( out, "job-"+out+"-", data, gpu=0 )
-        try:
-            run_simulation_protocol( out, "job-"+out+"-", data, gpu=0 )
-        except:
-            print("WARNING: failed to simulate {}".format(f))
+        gpu = 0
+        directory = "run.out.7bd92d9.twist-angles"
+        run_simulation_protocol( out, "job-"+out+"-", model, gpu=gpu,
+                                 directory = directory)
+        # try:
+        #     run_simulation_protocol( out, "job-"+out+"-", model, gpu=gpu,
+        #                              directory = directory)
+        # except:
+        #     print("WARNING: failed to simulate json file {}".format(f))
+        #     continue
diff --git a/simulate.py b/simulate.py
new file mode 100644
index 0000000000000000000000000000000000000000..933db19e0cd13cdc92e25c5841df6862a9e01a3a
--- /dev/null
+++ b/simulate.py
@@ -0,0 +1,89 @@
+import os
+from coords import readArbdCoords, readAvgArbdCoords
+
+arbd="/home/cmaffeo2/development/cuda/arbd.dbg/src/arbd" # reduced the mem footprint cause vmd
+namd="/home/cmaffeo2/development/namd-bin/NAMD_Git-2017-07-06_Linux-x86_64-multicore-CUDA/namd2"
+
+def run_simulation_protocol( output_name, job_id, model,
+                             remove_long_bonds=False,
+                             gpu = 0,
+                             directory=None,
+                             coarse_steps = 5e7+1,
+                             fine_steps = 5e7+1
+                         ):
+
+    ret = None
+    d_orig = os.getcwd()
+    try:
+        if directory is None:
+            import tempfile
+            directory = tempfile.mkdtemp(prefix='origami-%s-' % job_id, dir='/dev/shm/')
+        elif not os.path.exists(directory):
+            os.makedirs(directory)
+        os.chdir(directory)
+
+        output_directory = "output"
+        
+        # TODO: add the output directory in to the readArbdCoords functions or make it an attribute of the model object 
+
+        """ Coarse simulation """
+        # simargs = dict(timestep=200e-6, outputPeriod=1e5, gpu=gpu )
+        simargs = dict(timestep=200e-6, outputPeriod=1e5, gpu=gpu, arbd=arbd )
+
+        model._clear_beads()
+        model._generate_bead_model( 5, 5, local_twist=False )
+
+        if remove_long_bonds:
+            output_prefix = "%s-0" % output_name
+            full_output_prefix = "%s/%s" % (output_directory,output_prefix)
+            ## TODO Remove long bonds
+            model.simulate( outputPrefix = output_prefix, numSteps=0.05*coarse_steps, **simargs )
+            coordinates = readArbdCoords('%s.0.restart' % full_output_prefix)
+            output_prefix = "%s-1" % output_name
+            model._update_segment_positions(coordinates)
+            model.simulate( outputPrefix = output_prefix, numSteps=0.95*coarse_steps, **simargs )
+        else:
+            output_prefix = "%s-1" % output_name
+            full_output_prefix = "%s/%s" % (output_directory,output_prefix)
+            model.simulate( outputPrefix = output_prefix, numSteps=coarse_steps, **simargs )
+        coordinates = readArbdCoords('%s.0.restart' % full_output_prefix)
+
+
+        """ Fine simulation """ 
+        output_prefix = "%s-2" % output_name
+        full_output_prefix = "%s/%s" % (output_directory,output_prefix)
+        simargs['timestep'] = 50e-6
+        model._update_segment_positions(coordinates)
+        model._clear_beads()
+        model._generate_bead_model( 1, 1, local_twist=True, escapable_twist=True )
+        model.simulate( outputPrefix = output_prefix, numSteps=fine_steps, **simargs )
+        coordinates = readAvgArbdCoords('%s.psf' % output_prefix,'%s.pdb' % output_prefix, '%s.0.dcd' % full_output_prefix, rmsdThreshold=1)
+
+
+        """ Freeze twist """
+        output_prefix = "%s-3" % output_name
+        full_output_prefix = "%s/%s" % (output_directory,output_prefix)
+        model._update_segment_positions(coordinates)
+        model._clear_beads()
+        model._generate_bead_model( 1, 1, local_twist=True, escapable_twist=False )
+        model.simulate( outputPrefix = output_prefix, numSteps=fine_steps, **simargs )
+        coordinates = readAvgArbdCoords('%s.psf' % output_name,'%s.pdb' % output_prefix, '%s.0.dcd' % full_output_prefix )
+
+
+        """ Atomic simulation """
+        output_prefix = "%s-4" % output_name
+        full_output_prefix = "%s/%s" % (output_directory,output_prefix)
+        model._update_segment_positions(coordinates)
+        model._clear_beads()
+        # model._generate_atomic_model(scale=0.25)
+        model._generate_atomic_model(scale=1.0)
+        model.atomic_simulate( outputPrefix = output_prefix )
+
+        ret = directory
+        
+    except:
+        raise
+    finally:
+        os.chdir(d_orig)
+        
+    return ret