diff --git a/arbdmodel/polymer.py b/arbdmodel/polymer.py
deleted file mode 100644
index 40c684a3b34a5e37d4d16c22ba8c3716fc962f96..0000000000000000000000000000000000000000
--- a/arbdmodel/polymer.py
+++ /dev/null
@@ -1,159 +0,0 @@
-class PolymerParticle(PointParticle):
-    def __init__(self, type_, position, name="A", **kwargs):
-        self.name = name
-        self.contour_position = None
-        PointParticle.__init__(self, type_, position, name=name, **kwargs)
-        self.intrahelical_neighbors = []
-        self.other_neighbors = []
-        self.locations = []
-
-    def get_intrahelical_above(self):
-        """ Returns bead directly above self """
-        # assert( len(self.intrahelical_neighbors) <= 2 )
-        for b in self.intrahelical_neighbors:
-            if b.get_contour_position(self.parent, self.contour_position) > self.contour_position:
-                return b
-
-    def get_intrahelical_below(self):
-        """ Returns bead directly below self """
-        # assert( len(self.intrahelical_neighbors) <= 2 )
-        for b in self.intrahelical_neighbors:
-            if b.get_contour_position(self.parent, self.contour_position) < self.contour_position:
-                return b
-
-    def _neighbor_should_be_added(self,b):
-        if type(self.parent) != type(b.parent):
-            return True
-
-        c1 = self.contour_position
-        c2 = b.get_contour_position(self.parent,c1)
-        if c2 < c1:
-            b0 = self.get_intrahelical_below()
-        else:
-            b0 = self.get_intrahelical_above()
-
-        if b0 is not None:            
-            c0 = b0.get_contour_position(self.parent,c1)
-            if np.abs(c2-c1) < np.abs(c0-c1):
-                ## remove b0
-                self.intrahelical_neighbors.remove(b0)
-                b0.intrahelical_neighbors.remove(self)
-                return True
-            else:
-                return False
-        return True
-        
-    def make_intrahelical_neighbor(self,b):
-        add1 = self._neighbor_should_be_added(b)
-        add2 = b._neighbor_should_be_added(self)
-        if add1 and add2:
-            # assert(len(b.intrahelical_neighbors) <= 1)
-            # assert(len(self.intrahelical_neighbors) <= 1)
-            self.intrahelical_neighbors.append(b)
-            b.intrahelical_neighbors.append(self)
-
-    def conceptual_get_position(self, context):
-        """ 
-        context: object
-
-Q: does this function do too much?
-Danger of mixing return values
-
-Q: does context describe the system or present an argument?
-        """
-
-        ## Validate Inputs
-        ...
-
-        ## Algorithm
-        """
-context specifies:
-  - kind of output: real space, nt within segment, fraction of segment
-  - absolute or relative
-  - constraints: e.g. if passing through
-        """
-        """
-given context, provide the position
-        input
-"""
-
-    def get_nt_position(self, seg, near_address=None):
-        """ Returns the "address" of the nucleotide relative to seg in
-        nucleotides, taking the shortest (intrahelical) contour length route to seg
-        """
-        if seg == self.parent:
-            pos = self.contour_position
-        else:
-            pos = self.get_contour_position(seg,near_address)
-        return seg.contour_to_nt_pos(pos)
-
-    def get_contour_position(self,seg, address = None):
-        """ TODO: fix paradigm where a bead maps to exactly one location in a polymer
-        - One way: modify get_contour_position to take an optional argument that indicates where in the polymer you are looking from
-        """
-
-        if seg == self.parent:
-            return self.contour_position
-        else:
-            cutoff = 30*3
-            target_seg = seg
-
-            ## depth-first search
-            ## TODO cache distances to nearby locations?
-            def descend_search_tree(seg, contour_in_seg, distance=0, visited_segs=None):
-                nonlocal cutoff
-                if visited_segs is None: visited_segs = []
-
-                if seg == target_seg:
-                    # pdb.set_trace()
-                    ## Found a segment in our target
-                    sign = 1 if contour_in_seg == 1 else -1
-                    if sign == -1: assert( contour_in_seg == 0 )
-                    if distance < cutoff: # TODO: check if this does anything
-                        cutoff = distance
-                    return [[distance, contour_in_seg+sign*seg.nt_pos_to_contour(distance)]], [(seg, contour_in_seg, distance)]
-                if distance > cutoff:
-                    return None,None
-                    
-                ret_list = []
-                hist_list = []
-                ## Find intrahelical locations in seg that we might pass through
-                conn_locs = seg.get_connections_and_locations("intrahelical")
-                if isinstance(target_seg, SingleStrandedSegment):
-                    tmp = seg.get_connections_and_locations("sscrossover")
-                    conn_locs = conn_locs + list(filter(lambda x: x[2].container == target_seg, tmp))
-                for c,A,B in conn_locs:
-                    if B.container in visited_segs: continue
-                    dx = seg.contour_to_nt_pos( A.address, round_nt=False ) - seg.contour_to_nt_pos( contour_in_seg, round_nt=False)
-                    dx = np.abs(dx)
-                    results,history = descend_search_tree( B.container, B.address,
-                                                   distance+dx, visited_segs + [seg] )
-                    if results is not None:
-                        ret_list.extend( results )
-                        hist_list.extend( history )
-                return ret_list,hist_list
-
-            results,history = descend_search_tree(self.parent, self.contour_position)
-            if results is None or len(results) == 0:
-                raise Exception("Could not find location in segment") # TODO better error
-            if address is not None:
-                return sorted(results,key=lambda x:(x[0],(x[1]-address)**2))[0][1]
-            else:
-                return sorted(results,key=lambda x:x[0])[0][1]
-            # nt_pos = self.get_nt_position(seg)
-            # return seg.nt_pos_to_contour(nt_pos)
-
-    def update_position(self, contour_position):
-        self.contour_position = contour_position
-        self.position = self.parent.contour_to_position(contour_position)
-        if 'orientation_bead' in self.__dict__:
-            o = self.orientation_bead
-            o.contour_position = contour_position
-            orientation = self.parent.contour_to_orientation(contour_position)
-            if orientation is None:
-                print("WARNING: local_twist is True, but orientation is None; using identity")
-                orientation = np.eye(3)
-            o.position = self.position + orientation.dot( np.array((Segment.orientation_bond.r0,0,0)) )
-            
-    def __repr__(self):
-        return "<SegmentParticle {} on {}[{:.2f}]>".format( self.name, self.parent, self.contour_position)