Source code for pydna_epbd.simulation.dna
from pydna_epbd.simulation.constants import *
[docs]class DNA:
"""The DNA object for MCMC simulation."""
def __init__(self, seq) -> None:
"""Initialize a DNA object from an input DNA sequence.
Args:
seq (str): A DNA sequence. The characters are supposed to be in {A,C,G,T} (upper case).
"""
super(DNA, self).__init__()
self.seq = seq
self.n_nt_bases = len(seq) # nt: nucleotide
self.reset()
[docs] def reset(self):
"""A DNA object is initialized with coordinates (left and right bases),
the distances among them, bp energies, total energy, stacking terms,
hydrogen bond types and other constants.
"""
self.coords_state = self.__init_coords() # DNA, u and v
self.coords_dist = self.__init_coords_dist() # y
self.bp_energies = self.__init_energy() # energies for each base-pairs
self.total_energy = 0.0
self.DA, self.kn = self.__init_stacking_terms()
self.kn_div_four = [i * 0.25 for i in self.kn]
self.DA_div_sqrt_two = [
[j * one_div_sqrt2 for j in self.DA[i]] for i in range(self.n_nt_bases)
]
def __init_coords(self):
"""Private method for initializing coordinates (u (left) and v (right) bases).
Returns:
list: Bp coordinates.
"""
# 0, 1: u, v
return [[0.0] * 2 for _ in range(self.n_nt_bases)]
def __init_coords_dist(self):
"""Private method for initializing bp distances (y_n).
Returns:
list: Bp distances.
"""
# y = (u-v)/sqrt(2)
return [0.0] * self.n_nt_bases
def __init_energy(self):
"""Private method for initializing bp energies.
Returns:
list: Bp energies
"""
# 0, 1: Umors, Wstack
return [[0.0] * 2 for _ in range(self.n_nt_bases)]
def __str__(self):
return f"{self.coords_state}"
def __init_stacking_terms(self):
"""Private method for initializing bp stacking constants.
Returns:
list, list: Bp nature (DA), coupling constants between the left and right two neighboring bases.
"""
seq = self.seq
# D and A values for computing Morse-potentials for each base-pair
DA = [[0.0] * 2 for _ in range(self.n_nt_bases)] # 0 -> D_n, 1 -> a_n
kn = [0.0] * self.n_nt_bases
for i in range(self.n_nt_bases):
# next base index
if i + 1 >= self.n_nt_bases: # circular stacking
k1 = 0
else:
k1 = i + 1
if seq[i] == "G":
DA[i][0] = DGC
DA[i][1] = aGC
if seq[k1] == "G":
kn[k1] = GG
elif seq[k1] == "T":
kn[k1] = GT
elif seq[k1] == "A":
kn[k1] = GA
elif seq[k1] == "C":
kn[k1] = GC
else:
print("G Wrong DNA input structure!", i)
elif seq[i] == "C":
DA[i][0] = DGC
DA[i][1] = aGC
if seq[k1] == "G":
kn[k1] = CG
elif seq[k1] == "T":
kn[k1] = CT
elif seq[k1] == "A":
kn[k1] = CA
elif seq[k1] == "C":
kn[k1] = CC
else:
print("C Wrong DNA input structure!", i)
elif seq[i] == "T":
DA[i][0] = DAT
DA[i][1] = aAT
if seq[k1] == "G":
kn[k1] = TG
elif seq[k1] == "T":
kn[k1] = TT
elif seq[k1] == "A":
kn[k1] = TA
elif seq[k1] == "C":
kn[k1] = TC
else:
print("T Wrong DNA input structure!", i)
elif seq[i] == "A":
DA[i][0] = DAT
DA[i][1] = aAT
if seq[k1] == "G":
kn[k1] = AG
elif seq[k1] == "T":
kn[k1] = AT
elif seq[k1] == "A":
kn[k1] = AA
elif seq[k1] == "C":
kn[k1] = AC
else:
print("T Wrong DNA input structure!", i)
return DA, kn
#