diff --git a/bin/mrdna b/bin/mrdna index 440e45073556469bcd61e04c43067e14f15afd5b..2430aadeb170b2e17ffeab2c646e60f2cc51cd99 100755 --- a/bin/mrdna +++ b/bin/mrdna @@ -23,6 +23,9 @@ parser.add_argument('-d','--directory', type=str, default=None, help='Directory for simulation; does not need to exist yet') parser.add_argument('-g','--gpu', type=int, default=0, help='GPU for simulation; check nvidia-smi for availability') +parser.add_argument('--debye-length', type=float, default=None, + help='Adjust the electrostatic repulsion matching osmotic pressure data from Rau and Parsegian under 25 mM MgCl2 condition with a Debye-Hueckel correction from the default 11.1 Angstroms.') + parser.add_argument('--output-period', type=float, default=1e4, help='Simulation steps between DCD frames') # parser.add_argument('--minimization-steps', type=float, default=0, @@ -39,6 +42,7 @@ parser.add_argument('--oxdna-steps', type=float, default=None, parser.add_argument('--oxdna-output-period', type=float, default=1e4, help='Simulation steps between oxDNA configuration and energy output') + parser.add_argument('--backbone-scale', type=float, default=1.0, help='Factor to scale DNA backbone in atomic model; try 0.25 to avoid clashes for atomistic simulations') parser.add_argument('--debug', action='store_true', @@ -78,7 +82,7 @@ def main(): else: raise Exception("Unrecognized input file '{}'".format(infile)) - model = read_model( str(infile) ) + model = read_model( str(infile), debye_length=args.debye_length ) if args.output_prefix is not None: prefix = args.output_prefix diff --git a/mrdna/model/nbPot.py b/mrdna/model/nbPot.py index 305d34bcc14cad0dae86659c83ff573097fbe84a..c26c3b07f116bc67121642c0a7dbf5c1d28df374 100644 --- a/mrdna/model/nbPot.py +++ b/mrdna/model/nbPot.py @@ -23,6 +23,8 @@ class AbstractNbDnaScheme(NonbondedScheme): def __init__(self, *args,**kwargs): NonbondedScheme.__init__(self,*args,**kwargs) + self.debye_length = self.debye_length0 # set by child class + x,y = self.load_pmf() self.target_x = x self.target_y = y @@ -73,6 +75,15 @@ class AbstractNbDnaScheme(NonbondedScheme): bounds_error = False, fill_value="extrapolate", assume_sorted=True)(x).T u[x<13] = u[x<13] + 0.5 * (x[x<13]-13)**2 + + ## Debye correction + if self.debye_length != self.debye_length0: + ## units "e**2/(4 * pi * 80 epsilon0 AA)" kcal_mol + A = 4.1507964 + du = (A/x) * (np.exp(-x/self.debye_length) - np.exp(-x/self.debye_length0)) + du[x < 10] = du[x>=10][0] + u = u + du + return u-u[-1] def get_bead_distributions(self, interhelical_distances): @@ -320,6 +331,11 @@ def _add_parameter_to_cache_dict( args ): class nbDnaScheme100Mg(AbstractNbDnaScheme): + def __init__(self,*args,**kwargs): + ## units "sqrt( 80 epsilon0 295 k K / ((4*100 mM + 200 mM) e**2/particle) )" AA + self.debye_length0 = 5.5771297 + AbstractNbDnaScheme.__init__(self,*args,**kwargs) + def get_package_cache_file(self): return get_resource_path("nbPot.rau_refined_100Mg.dat") @@ -369,6 +385,12 @@ class nbDnaScheme100Mg(AbstractNbDnaScheme): class nbDnaScheme20Mg(AbstractNbDnaScheme): + def __init__(self,*args,**kwargs): + ## units "sqrt( 80 epsilon0 295 k K / ((4*25 mM + 50 mM) e**2/particle) )" nm + ## 25 mM MgCl2, sorry about name of this class/files + self.debye_length0 = 11.154259 + AbstractNbDnaScheme.__init__(self,*args,**kwargs) + def get_package_cache_file(self): return get_resource_path("nbPot.rau_refined_20Mg_200Na.dat") diff --git a/mrdna/readers/__init__.py b/mrdna/readers/__init__.py index 1d6a7893752fcb01ed1c664dd8d2e88939e8daa8..44e5a32cdebff722ac2bf604378220756147017e 100644 --- a/mrdna/readers/__init__.py +++ b/mrdna/readers/__init__.py @@ -15,7 +15,7 @@ from .segmentmodel_from_pdb import SegmentModelFromPdb def read_cadnano(json_file, **model_parameters): data = read_json_file(json_file) - return model_from_cadnano_json(data) + return model_from_cadnano_json(data, **model_parameters) def read_vhelix(maya_file, **model_parameters): data = parse_maya_file(maya_file) diff --git a/mrdna/readers/cadnano_segments.py b/mrdna/readers/cadnano_segments.py index 689b138a88c81263da59501c711acabd805a5037..612b5f95406a1bf6466b730f9e3d9cfdb85d8b5c 100644 --- a/mrdna/readers/cadnano_segments.py +++ b/mrdna/readers/cadnano_segments.py @@ -180,9 +180,7 @@ def combineCompactRegionLists(loHi1,loHi2,intersect=False): class cadnano_part(SegmentModel): def __init__(self, part, - max_basepairs_per_bead = 7, - max_nucleotides_per_bead = 5, - local_twist = False + **kwargs ): self.part = part try: @@ -198,10 +196,7 @@ class cadnano_part(SegmentModel): self._add_crossovers() self._add_prime_ends() SegmentModel.__init__(self, self.segments, - local_twist = local_twist, - max_basepairs_per_bead = max_basepairs_per_bead, - max_nucleotides_per_bead = max_nucleotides_per_bead, - dimensions=(5000,5000,5000)) + **kwargs) def _cadnano_part_to_segments(self,part): try: @@ -625,13 +620,11 @@ def decode_cadnano_part(json_data): def package_archive( name, directory ): ... -def read_model(json_data, sequence=None): +def read_model(json_data, sequence=None, **kwargs): """ Read in data """ part = decode_cadnano_part(json_data) model = cadnano_part(part, - max_basepairs_per_bead = 5, - max_nucleotides_per_bead = 5, - local_twist=False) + **kwargs) # TODO # try: diff --git a/mrdna/segmentmodel.py b/mrdna/segmentmodel.py index cfacf7a29d61fa729c1fa93ccb82da2d737f6fa6..ad49d1220334e18f4596415d68b0bd0116daee5b 100644 --- a/mrdna/segmentmodel.py +++ b/mrdna/segmentmodel.py @@ -1536,10 +1536,12 @@ class SegmentModel(ArbdModel): def __init__(self, segments=[], local_twist=True, escapable_twist=True, max_basepairs_per_bead=7, max_nucleotides_per_bead=4, - dimensions=(1000,1000,1000), temperature=291, + dimensions=(5000,5000,5000), temperature=291, timestep=50e-6, cutoff=50, decompPeriod=10000, pairlistDistance=None, - nonbondedResolution=0,DEBUG=0): + nonbondedResolution=0,DEBUG=0, + debye_length = None + ): self.DEBUG = DEBUG if DEBUG > 0: print("Building ARBD Model") ArbdModel.__init__(self,segments, @@ -1559,6 +1561,9 @@ class SegmentModel(ArbdModel): self.grid_potentials = [] self._generate_bead_model( max_basepairs_per_bead, max_nucleotides_per_bead, local_twist, escapable_twist) + if debye_length is not None: + nbDnaScheme.debye_length = debye_length + self.useNonbondedScheme( nbDnaScheme ) self.useTclForces = False