Commit 1c6a70c2 authored by cmaffeo2's avatar cmaffeo2
Browse files

Variable renamed: num_nts --> num_nt

parent 243a46e5
......@@ -319,10 +319,10 @@ class cadnano_part(SegmentModel):
kwargs['num_bp'] = numBps
seg = DoubleStrandedSegment(**kwargs,**posargs1)
elif zMid in strandOccupancies[0]:
kwargs['num_nts'] = numBps
kwargs['num_nt'] = numBps
seg = SingleStrandedSegment(**kwargs,**posargs1)
elif zMid in strandOccupancies[1]:
kwargs['num_nts'] = numBps
kwargs['num_nt'] = numBps
seg = SingleStrandedSegment(**kwargs,**posargs2)
else:
raise Exception("Segment could not be found")
......@@ -486,8 +486,8 @@ class cadnano_part(SegmentModel):
def get_bead(self, hid, zid):
# get segment, get nucleotide,
seg, nt = self._get_segment_nucleotide(h,z)
# return seg.get_nearest_bead(seg,nt / seg.num_nts)
return seg.get_nearest_bead(seg,nt / (seg.num_nts-1))
# return seg.get_nearest_bead(seg,nt / seg.num_nt)
return seg.get_nearest_bead(seg,nt / (seg.num_nt-1))
def read_json_file(filename):
import json
......
......@@ -329,7 +329,7 @@ def convert_maya_to_segments(helices):
seg2 = SingleStrandedSegment("strand",
start_position = ssSeg[0].get_position(),
end_position = ssSeg[-1].get_position(),
num_nts = len(ssSeg))
num_nt = len(ssSeg))
seg.connect_end3(seg2)
connectionToSingleStrand[top] = seg2
other = ssSeg[-1].end3
......@@ -357,7 +357,7 @@ def convert_maya_to_segments(helices):
seg2 = SingleStrandedSegment("strand",
start_position = ssSeg[-1].get_position(),
end_position = ssSeg[0].get_position(),
num_nts = len(ssSeg))
num_nt = len(ssSeg))
seg.connect_end5(seg2)
connectionToSingleStrand[top.basepair] = seg2
other = ssSeg[0].end5
......@@ -385,7 +385,7 @@ def convert_maya_to_segments(helices):
seg2 = SingleStrandedSegment("strand",
start_position = ssSeg[0].get_position(),
end_position = ssSeg[-1].get_position(),
num_nts = len(ssSeg))
num_nt = len(ssSeg))
seg.connect_start3(seg2)
connectionToSingleStrand[bot] = seg2
other = ssSeg[-1].end3
......@@ -409,7 +409,7 @@ def convert_maya_to_segments(helices):
seg2 = SingleStrandedSegment("strand",
start_position = ssSeg[-1].get_position(),
end_position = ssSeg[0].get_position(),
num_nts = len(ssSeg))
num_nt = len(ssSeg))
seg.connect_start5(seg2)
connectionToSingleStrand[bot.basepair] = seg2
other = ssSeg[0].end5
......
......@@ -75,7 +75,7 @@ class Location():
if self.address == 0:
pos = 0
elif self.address == 1:
pos = self.container.num_nts-1
pos = self.container.num_nt-1
else:
raise
return pos
......@@ -133,7 +133,7 @@ class ConnectableElement():
def get_location_at(self, address, on_fwd_strand=True, new_type="crossover"):
loc = None
if (self.num_nts == 1):
if (self.num_nt == 1):
# import pdb
# pdb.set_trace()
## Assumes that intrahelical connections have been made before crossovers
......@@ -332,7 +332,7 @@ class Segment(ConnectableElement, Group):
radius = 3,
)
def __init__(self, name, num_nts,
def __init__(self, name, num_nt,
start_position = None,
end_position = None,
segment_model = None):
......@@ -351,9 +351,9 @@ class Segment(ConnectableElement, Group):
self._bead_model_generation = 0 # TODO: remove?
self.segment_model = segment_model # TODO: remove?
self.num_nts = int(num_nts)
self.num_nt = int(num_nt)
if end_position is None:
end_position = np.array((0,0,self.distance_per_nt*num_nts)) + start_position
end_position = np.array((0,0,self.distance_per_nt*num_nt)) + start_position
self.start_position = start_position
self.end_position = end_position
......@@ -373,14 +373,14 @@ class Segment(ConnectableElement, Group):
loc.particle = None
def contour_to_nt_pos(self, contour_pos, round_nt=False):
nt = contour_pos*(self.num_nts) - 0.5
nt = contour_pos*(self.num_nt) - 0.5
if round_nt:
assert( np.isclose(np.around(nt),nt) )
nt = np.around(nt)
return nt
def nt_pos_to_contour(self,nt_pos):
return (nt_pos+0.5)/(self.num_nts)
return (nt_pos+0.5)/(self.num_nt)
def contour_to_position(self,s):
p = interpolate.splev( s, self.position_spline_params )
......@@ -424,9 +424,9 @@ class Segment(ConnectableElement, Group):
bases = list(seqComplement.keys())
# bases = ['T'] ## FOR DEBUG
if self.sequence is None:
self.sequence = [random.choice(bases) for i in range(self.num_nts)]
self.sequence = [random.choice(bases) for i in range(self.num_nt)]
else:
assert(len(self.sequence) == self.num_nts) # TODO move
assert(len(self.sequence) == self.num_nt) # TODO move
for i in range(len(self.sequence)):
if self.sequence[i] is None:
self.sequence[i] = random.choice(bases)
......@@ -455,7 +455,7 @@ class Segment(ConnectableElement, Group):
y = np.cross(axis,angleVec)
orientation = np.array([angleVec,y,axis]).T
## TODO: improve placement of ssDNA
# rot = rotationAboutAxis( axis, contour_position*self.twist_per_nt*self.num_nts, normalizeAxis=True )
# rot = rotationAboutAxis( axis, contour_position*self.twist_per_nt*self.num_nt, normalizeAxis=True )
# orientation = rot.dot(orientation)
else:
orientation = orientation
......@@ -554,7 +554,7 @@ class Segment(ConnectableElement, Group):
if l.address == 0:
pos = 0.0
elif l.address == 1:
pos = self.num_nts-1
pos = self.num_nt-1
else:
pos = self.contour_to_nt_pos(l.address, round_nt=True)
......@@ -700,8 +700,8 @@ class Segment(ConnectableElement, Group):
b = self._generate_one_bead( self.nt_pos_to_contour(0), 0)
existing_beads = [b] + existing_beads
if existing_beads[-1].get_nt_position(self)-(self.num_nts-1) < -0.5:
b = self._generate_one_bead( self.nt_pos_to_contour(self.num_nts-1), 0)
if existing_beads[-1].get_nt_position(self)-(self.num_nt-1) < -0.5:
b = self._generate_one_bead( self.nt_pos_to_contour(self.num_nt-1), 0)
existing_beads.append(b)
assert(len(existing_beads) > 1)
......@@ -721,9 +721,9 @@ class Segment(ConnectableElement, Group):
e_ds = eb2.get_contour_position(self) - eb1.get_contour_position(self)
num_beads = self._get_num_beads( e_ds, max_basepairs_per_bead, max_nucleotides_per_bead )
ds = e_ds / (num_beads+1)
nts = ds*self.num_nts
eb1.num_nts += 0.5*nts
eb2.num_nts += 0.5*nts
nts = ds*self.num_nt
eb1.num_nt += 0.5*nts
eb2.num_nt += 0.5*nts
## Add beads
if eb1.parent == self:
......@@ -775,7 +775,7 @@ class DoubleStrandedSegment(Segment):
start_position,
end_position,
segment_model)
self.num_bp = self.num_nts
self.num_bp = self.num_nt
self.local_twist = local_twist
if num_turns is None:
......@@ -865,8 +865,8 @@ class DoubleStrandedSegment(Segment):
else:
end2.container._connect( end1.container, Connection( end2, end1, type_=type_ ), in_3prime_direction=True )
def _get_num_beads(self, contour, max_basepairs_per_bead, max_nucleotides_per_bead):
# return int(contour*self.num_nts // max_basepairs_per_bead)
return int(contour*(self.num_nts**2/(self.num_nts+1)) // max_basepairs_per_bead)
# return int(contour*self.num_nt // max_basepairs_per_bead)
return int(contour*(self.num_nt**2/(self.num_nt+1)) // max_basepairs_per_bead)
def _generate_one_bead(self, contour_position, nts):
pos = self.contour_to_position(contour_position)
......@@ -881,15 +881,15 @@ class DoubleStrandedSegment(Segment):
assert(np.linalg.norm(opos-pos) < 10 )
o = SegmentParticle( Segment.orientation_particle, opos, name="O",
contour_position = contour_position,
num_nts=nts, parent=self )
num_nt=nts, parent=self )
bead = SegmentParticle( Segment.dsDNA_particle, pos, name="DNA",
num_nts=nts, parent=self,
num_nt=nts, parent=self,
orientation_bead=o,
contour_position=contour_position )
else:
bead = SegmentParticle( Segment.dsDNA_particle, pos, name="DNA",
num_nts=nts, parent=self,
num_nt=nts, parent=self,
contour_position=contour_position )
self._add_bead(bead)
return bead
......@@ -899,13 +899,13 @@ class SingleStrandedSegment(Segment):
""" Class that describes a segment of ssDNA. When built from
cadnano models, should not span helices """
def __init__(self, name, num_nts, start_position = None,
def __init__(self, name, num_nt, start_position = None,
end_position = None,
segment_model = None):
if start_position is None: start_position = np.array((0,0,0))
self.distance_per_nt = 5
Segment.__init__(self, name, num_nts,
Segment.__init__(self, name, num_nt,
start_position,
end_position,
segment_model)
......@@ -949,10 +949,10 @@ class SingleStrandedSegment(Segment):
# # TODOTODO
# ## Ensure connections occur at ends, otherwise the structure doesn't make sense
# # assert(np.isclose(c1,0) or np.isclose(c1,1))
# assert(np.isclose(nt,0) or np.isclose(nt,self.num_nts-1))
# assert(np.isclose(nt,0) or np.isclose(nt,self.num_nt-1))
if nt == 0:
c1 = 0
elif nt == self.num_nts-1:
elif nt == self.num_nt-1:
c1 = 1
else:
raise Exception("Crossovers can only be at the ends of an ssDNA segment")
......@@ -960,14 +960,14 @@ class SingleStrandedSegment(Segment):
if other_nt == 0:
c2 = 0
elif other_nt == other.num_nts-1:
elif other_nt == other.num_nt-1:
c2 = 1
else:
c2 = other.nt_pos_to_contour(other_nt)
if isinstance(other,SingleStrandedSegment):
## Ensure connections occur at opposing ends
assert(np.isclose(other_nt,0) or np.isclose(other_nt,self.num_nts-1))
assert(np.isclose(other_nt,0) or np.isclose(other_nt,self.num_nt-1))
other_loc = other.get_location_at( c2, True )
# if ("22-2" in (self.name, other.name)):
# pdb.set_trace()
......@@ -985,14 +985,14 @@ class SingleStrandedSegment(Segment):
other._connect(self, Connection( other_loc, loc, type_="sscrossover" ), in_3prime_direction=True )
def _get_num_beads(self, contour, max_basepairs_per_bead, max_nucleotides_per_bead):
return int(contour*(self.num_nts**2/(self.num_nts+1)) // max_basepairs_per_bead)
# return int(contour*self.num_nts // max_nucleotides_per_bead)
return int(contour*(self.num_nt**2/(self.num_nt+1)) // max_basepairs_per_bead)
# return int(contour*self.num_nt // max_nucleotides_per_bead)
def _generate_one_bead(self, contour_position, nts):
pos = self.contour_to_position(contour_position)
b = SegmentParticle( Segment.ssDNA_particle, pos,
name="NAS",
num_nts=nts, parent=self,
num_nt=nts, parent=self,
contour_position=contour_position )
self._add_bead(b)
return b
......@@ -1004,7 +1004,7 @@ class StrandInSegment(Group):
def __init__(self, segment, start, end, is_fwd):
""" start/end should be provided expressed in nt coordinates, is_fwd tuples """
Group.__init__(self)
self.num_nts = 0
self.num_nt = 0
# self.sequence = []
self.segment = segment
self.start = start
......@@ -1012,8 +1012,8 @@ class StrandInSegment(Group):
self.is_fwd = is_fwd
nts = np.abs(end-start)+1
self.num_nts = int(round(nts))
assert( np.isclose(self.num_nts,nts) )
self.num_nt = int(round(nts))
assert( np.isclose(self.num_nt,nts) )
def _nucleotide_ids(self):
nt0 = self.start # seg.contour_to_nt_pos(self.start)
......@@ -1022,7 +1022,7 @@ class StrandInSegment(Group):
assert( (self.end-self.start) >= 0 or not self.is_fwd )
direction = (2*self.is_fwd-1)
return range(nt0,nt0 + direction*self.num_nts, direction)
return range(nt0,nt0 + direction*self.num_nt, direction)
def get_sequence(self):
""" return 5-to-3 """
......@@ -1035,13 +1035,13 @@ class StrandInSegment(Group):
def get_contour_points(self):
c0,c1 = [self.segment.nt_pos_to_contour(p) for p in (self.start,self.end)]
return np.linspace(c0,c1,self.num_nts)
return np.linspace(c0,c1,self.num_nt)
class Strand(Group):
""" Represents an entire ssDNA strand from 5' to 3' as it routes through segments """
def __init__(self, segname = None):
Group.__init__(self)
self.num_nts = 0
self.num_nt = 0
self.children = self.strand_segments = []
self.segname = segname
......@@ -1064,11 +1064,11 @@ class Strand(Group):
s = StrandInSegment( segment, start, end, is_fwd )
self.add( s )
self.num_nts += s.num_nts
self.num_nt += s.num_nt
def set_sequence(self,sequence): # , set_complement=True):
## validate input
assert( len(sequence) >= self.num_nts )
assert( len(sequence) >= self.num_nt )
assert( np.all( [i in ('A','T','C','G') for i in sequence] ) )
seq_idx = 0
......@@ -1076,7 +1076,7 @@ class Strand(Group):
for s in self.children:
seg = s.segment
if seg.sequence is None:
seg.sequence = [None for i in range(seg.num_nts)]
seg.sequence = [None for i in range(seg.num_nt)]
if s.is_fwd:
for nt in s._nucleotide_ids():
......@@ -1092,11 +1092,11 @@ class Strand(Group):
# for ss in self.strand_segments:
# sequence.extend( ss.get_sequence() )
# assert( len(sequence) >= self.num_nts )
# assert( len(sequence) >= self.num_nt )
# ret = ["5"+sequence[0]] +\
# sequence[1:-1] +\
# [sequence[-1]+"3"]
# assert( len(ret) == self.num_nts )
# assert( len(ret) == self.num_nt )
# return ret
def generate_atomic_model(self,scale):
......@@ -1111,7 +1111,7 @@ class Strand(Group):
# if s.end == s.start:
# pdb.set_trace()
# assert(s.end != s.start)
assert( s.num_nts == 1 or (np.linalg.norm( seg.contour_to_position(contour[-1]) - seg.contour_to_position(contour[0]) ) > 0.1) )
assert( s.num_nt == 1 or (np.linalg.norm( seg.contour_to_position(contour[-1]) - seg.contour_to_position(contour[0]) ) > 0.1) )
for c,seq in zip(contour,s.get_sequence()):
if last is None:
seq = "5"+seq
......@@ -1460,7 +1460,7 @@ class SegmentModel(ArbdModel):
""" Simplify connections """
# d_nt = dict() #
# for s in segments:
# d_nt[s] = 1.5/(s.num_nts-1)
# d_nt[s] = 1.5/(s.num_nt-1)
# for s in segments:
# ## replace consecutive crossovers with
# cl = sorted( s.get_connections_and_locations("crossover"), key=lambda x: x[1].address )
......@@ -1607,19 +1607,19 @@ class SegmentModel(ArbdModel):
beadtype_s = dict()
for segment in segments:
for b in segment:
# b.num_nts = np.around( b.num_nts, decimals=1 )
b.num_nts = 3*np.around( float(b.num_nts)/3, decimals=1 )
key = (b.type_.name[0].upper(), b.num_nts)
# b.num_nt = np.around( b.num_nt, decimals=1 )
b.num_nt = 3*np.around( float(b.num_nt)/3, decimals=1 )
key = (b.type_.name[0].upper(), b.num_nt)
if key in beadtype_s:
b.type_ = beadtype_s[key]
else:
t = deepcopy(b.type_)
if key[0] == "D":
t.__dict__["nts"] = b.num_nts*2
t.__dict__["nts"] = b.num_nt*2
elif key[0] == "S":
t.__dict__["nts"] = b.num_nts
t.__dict__["nts"] = b.num_nt
elif key[0] == "O":
t.__dict__["nts"] = b.num_nts
t.__dict__["nts"] = b.num_nt
else:
raise Exception("TODO")
# print(t.nts)
......@@ -1641,7 +1641,7 @@ class SegmentModel(ArbdModel):
parent = self._getParent(b1,b2)
## TODO: could be sligtly smarter about sep
sep = 0.5*(b1.num_nts+b2.num_nts)
sep = 0.5*(b1.num_nt+b2.num_nt)
conversion = 0.014393265 # units "pN/AA" kcal_mol/AA^2
if b1.type_.name[0] == "D" and b2.type_.name[0] == "D":
......@@ -1672,7 +1672,7 @@ class SegmentModel(ArbdModel):
if self.DEBUG: print("Adding intrahelical angle potentials")
for b1,b2,b3 in self._get_intrahelical_angle_beads():
## TODO: could be slightly smarter about sep
sep = 0.5*b1.num_nts+b2.num_nts+0.5*b3.num_nts
sep = 0.5*b1.num_nt+b2.num_nt+0.5*b3.num_nt
parent = self._getParent(b1,b2,b3)
kT = 0.58622522 # kcal/mol
......@@ -1988,7 +1988,7 @@ class SegmentModel(ArbdModel):
add_end = False
break
if add_end:
seg.add_5prime(seg.num_nts-1,on_fwd_strand=False)
seg.add_5prime(seg.num_nt-1,on_fwd_strand=False)
if 'start3' in seg.__dict__ and seg.start3.connection is None:
add_end = True
......@@ -2005,7 +2005,7 @@ class SegmentModel(ArbdModel):
add_end = False
break
if add_end:
seg.add_3prime(seg.num_nts-1)
seg.add_3prime(seg.num_nt-1)
# print( [(l,l.get_connected_location()) for l in seg.locations] )
# addresses = np.array([l.address for l in seg.get_locations("5prime")])
......@@ -2045,10 +2045,10 @@ class SegmentModel(ArbdModel):
is_fwd = l.on_fwd_strand
s = Strand()
_recursively_build_strand(s, seg, pos, is_fwd)
# print("{} {}".format(seg.name,s.num_nts))
# print("{} {}".format(seg.name,s.num_nt))
strands.append(s)
self.strands = sorted(strands, key=lambda s:s.num_nts)[::-1] # or something
self.strands = sorted(strands, key=lambda s:s.num_nt)[::-1] # or something
## relabel segname
counter = 0
for s in self.strands:
......
......@@ -18,12 +18,12 @@ if __name__ == "__main__":
seg2 = SingleStrandedSegment("strand",
start_position = seg1.end_position + np.array((5,0,5)),
num_nts = 12)
num_nt = 12)
seg3 = SingleStrandedSegment("strand",
start_position = seg1.start_position + np.array((-5,0,-5)),
end_position = seg1.end_position + np.array((-5,0,5)),
num_nts = 128)
num_nt = 128)
seg1.start3
seg1.start5
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment