diff --git a/bin/mrdna b/bin/mrdna index e43df23423b1c6e56ff3c3b7bbb22bab447b3a8f..a604fd793fddc98df3483fbcabde1e4e1b8053cc 100755 --- a/bin/mrdna +++ b/bin/mrdna @@ -73,6 +73,9 @@ parser.add_argument('--draw-cylinders', action='store_true', parser.add_argument('--draw-tubes', action='store_true', help='Whether or not to draw the tubes') +parser.add_argument('--hj-equilibrium-angle', type=float, default=0.0, + help='Specify an equilibrium dihedral angle for the Holliday junction angle potential; the default value works well for origami') + parser.add_argument('--version', action='version', version='%(prog)s {}'.format(__version__), help='Print the version of mrdna') @@ -113,7 +116,7 @@ def main(): from mrdna.readers import read_list as read_model else: raise Exception("Unrecognized input file '{}'".format(infile)) - model = read_model( str(infile), debye_length=args.debye_length, temperature=args.temperature ) + model = read_model( str(infile), debye_length=args.debye_length, temperature=args.temperature, hj_equilibrium_angle = args.hj_equilibrium_angle ) if args.dimensions is None: dim = [max(x,1000) for x in model.dimensions_from_structure( padding_factor=2.5 )] diff --git a/mrdna/segmentmodel.py b/mrdna/segmentmodel.py index 0e52a4408c7565e723a567f57494ce5d7f583348..99315a596dfb2deb0e95117aa59135116a00124b 100644 --- a/mrdna/segmentmodel.py +++ b/mrdna/segmentmodel.py @@ -1600,6 +1600,7 @@ class SegmentModel(ArbdModel): nonbondedResolution=0, DEBUG=0, integrator='Brown', debye_length = None, + hj_equilibrium_angle = 0, extra_bd_file_lines = "", ): self.DEBUG = DEBUG @@ -1617,6 +1618,10 @@ class SegmentModel(ArbdModel): # self.max_nucleotides_per_bead = max_nucleotides_per_bead # ssDNA self.children = self.segments = segments + if (hj_equilibrium_angle > 180) or (hj_equilibrium_angle < -180): + raise ValueError("Holliday junction equilibrium dihedral angle must be in the range from -180 to 180 degrees!") + self.hj_equilibrium_angle = hj_equilibrium_angle + self._generate_bead_callbacks = [] self._bonded_potential = dict() # cache for bonded potentials @@ -2712,18 +2717,23 @@ class SegmentModel(ArbdModel): a = None if u1 is not None and u2 is not None: - t0 = 0 + t0 = self.hj_equilibrium_angle a,b,c,d = (u1,b1,b2,u2) elif d1 is not None and d2 is not None: - t0 = 0 + t0 = self.hj_equilibrium_angle a,b,c,d = (d1,b1,b2,d2 ) elif d1 is not None and u2 is not None: - t0 = 180 + t0 = self.hj_equilibrium_angle-180 a,b,c,d = (d1,b1,b2,u2) elif u1 is not None and d2 is not None: - t0 = 180 + t0 = self.hj_equilibrium_angle-180 a,b,c,d = (u1,b1,b2,d2) + if t0 > 180: + t0 = t0-360 + elif t0 < -180: + t0 = t0+360 + ## TODO?: Check length-dependence of this potential if a is not None: k_intrinsic = 0.00086