def test_system(): system = System(np.array([50., 50., 50.])) system.add_strands(generate_helix(10, double=True)) print(system.lammps) print(system.bonds) return system
def main(length=17, n_strands=10, output_format='oxdna'): # generate a strand strands = [] staples = [] strand, staple = generate_helix(n=length, double=True) staples.append(staple.copy()) strands.append(strand.copy()) for i in range(n_strands - 1): last_nuc = strands[-1].nucleotides[-1] direction = -last_nuc._a3 a1 = -last_nuc._a1 # ensure the backbone position is FENE_LENGTH away from # the backbone position of the previous nucleotide start = last_nuc.pos_back + (FENE_LENGTH - POS_BACK) * a1 # generate strand above that's going in opposite direction strand, staple = generate_helix(n=length, start_position=start, direction=direction, a1=a1, double=True) strands.append(strand.copy()) staples.append(staple.copy()) print(staples) # using the two previously created strands create a new strand that # we will add to the system nucleotides = [] for strand in strands: nucleotides += strand.nucleotides strand = Strand(nucleotides=nucleotides) # create system and add the final completed strand system = System(np.array([50., 50., 50.])) system.add_strand(strand) # create staples from staple list # iterate over every 2 staples in reverse # and append the last onto the first, and add to the system staples = staples[::-1] completed_staples = [] for i, staple in enumerate(staples): if i % 2 != 0: continue try: new_nucleotides = [] new_nucleotides += staples[i + 1].nucleotides new_nucleotides += staple.nucleotides new_staple = Strand(nucleotides=new_nucleotides) system.add_strand(new_staple.copy()) except IndexError: pass if output_format.lower() == 'oxdna': system.write_oxDNA('stapled_turns') elif output_format.lower() == 'lammps': system.write_lammps_data('stapled_turns')
def generate_system( n : int, double_strand_length : int, single_strand_length : int, box : float = None, ) -> System: """ Generates an oxDNA system containing a single piece of DNA which has blocks of equal size of double-stranded portions and single-stranded portions. Parameters: n - number of nucleotides e.g. 100 fraction_ds - fraction of double-strand DNA e.g. 0.5 Returns: system - oxDNA system """ # initialise system to comply with minimum image convention if not box: box = 2. * n * FENE_EPS print(f'Creating simulation system with box size: {box}') system = System(np.array([box, box, box])) # create a list of strands, our main strand which we will use # and our complementary strand strands = generate_helix(n, double=True) # make a copy of the complementary strand and remove it # from the main list of strands second_strand = strands[1].copy() strands = strands[:1] # calculate how many portions there should be portion_size = double_strand_length + single_strand_length portions = n // portion_size print(f'Creating {portions} portions of total size: {portion_size}') # iterate over all portions, adding a new complementary # strand to the list of strands we will use for i in range(portions): # take the nucleotides from each portion and # create a new strand for each double-stranded part # of the portion start = portion_size * i end = start + double_strand_length nucleotides = second_strand.nucleotides[start:end] new_strand = Strand(nucleotides=nucleotides) strands.append(new_strand) # finally add the strands to the system and return # the system system.add_strands(strands) return system
def main(number : int = 10, double : bool = False): # Add Strand 1 - ssDNA n = number nucleotides = [] print("Creating a nucleotide:") nucleotides.append( Nucleotide( random.choice(['A', 'T', 'C', 'G']), np.array([0., -10., 0.]), a1 = np.array([1., 0., 0.]), a3 = np.array([0., 1., 0.]) ) ) print(f"Nucleotide #0: {nucleotides[0]}") print("Creating more nucleotides...\n") for i in range(n): nucleotides.append(get_5p(nucleotides[-1], base=random.choice(['A', 'T', 'C', 'G']))) strand = Strand(nucleotides=nucleotides) print(f"Strand: {strand}") system = System(np.array([20., 20., 20.])) system.add_strand(strand) # Add Strand 2 - complementary ssDNA -> dsDNA if double: nucleotides = [] for nucleotide in strand.nucleotides[::-1]: nucleotides.append(get_across(nucleotide)) # for i in range(10): # nucleotides.append(get_5p(nucleotides[-1])) strand = Strand(nucleotides=nucleotides) print(f"Adding double: {strand}") system.add_strand(strand) system.write_oxDNA('local') return
def main(strands : bool = True, edges : bool = False): system = System(np.array([30., 30., 30.])) if strands: system.add_strands(with_strands()) if edges: system.add_strands(with_edges()) system.write_oxDNA('connect') return
def main(length=16, n_strands=10): # generate a strand strands = [] strand = generate_helix(n=length)[0] strands.append(strand.copy()) for i in range(n_strands - 1): last_nuc = strands[-1].nucleotides[-1] direction = -last_nuc._a3 a1 = -last_nuc._a1 # ensure the backbone position is FENE_LENGTH away from # the backbone position of the previous nucleotide start = last_nuc.pos_back + (FENE_LENGTH - POS_BACK) * a1 # generate strand above that's going in opposite direction strand = generate_helix(n=length, start_position=start, direction=direction, a1=a1)[0] strands.append(strand) # using the two previously created strands create a new strand that # we will add to the system nucleotides = [] for strand in strands: nucleotides += strand.nucleotides strand = Strand(nucleotides=nucleotides) # create system and add the final completed strand system = System(np.array([50., 50., 50.])) system.add_strand(strand) system.write_oxDNA('turns')
def test_route(): nodes = [ LatticeNode(np.array([0., 10., 0.])), LatticeNode(np.array([0., 30., 0.])), LatticeNode(np.array([30., 30., 0.])), LatticeNode(np.array([30., 10., 0.])), ] route = LatticeRoute(nodes) assert len(route.edges) == 3 system = System(np.array([50., 50., 50.])) system.add_strand(route) assert len(system.strands) == 1 system = route.system(box=np.array([50., 50., 50.])) assert len(system.strands) == 1 system.write_oxDNA(root=ROOT) return route
def main(): strand = long_strand() print(f"Strand:\n {strand}") print( f" Length between bases of the end nucleotides: {strand_length(strand)}" ) route = long_route() print(f"\nSingle-Edge Route:\n {route}") print( f" Length between bases of the end nucleotides: {strand_length(route)}" ) multi = multi_route() print(f"\nDouble-Edge Route:\n {multi}") print( f" Length between bases of the end nucleotides: {strand_length(multi)}" ) system = System(np.array([50., 50., 50.])) system.add_strands([strand, route, multi]) system.write_oxDNA('route') return
def test_square(): route = square_route() system = System(np.array([50.0, 50.0, 50.0])) system.add_strand(route) system.write_oxDNA()
def test_System(): system = System(np.array([50.0, 50.0, 50.0])) strand_1 = Strand( [ Nucleotide( "A", np.array([1.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "A", np.array([2.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "A", np.array([3.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "A", np.array([4.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "A", np.array([5.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "A", np.array([6.0, 0.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), ] ) strand_2 = Strand( [ Nucleotide( "T", np.array([1.0, 2.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "T", np.array([2.0, 2.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "T", np.array([3.0, 2.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "T", np.array([4.0, 2.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "T", np.array([5.0, 2.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), Nucleotide( "T", np.array([6.0, 2.0, 0.0]), np.array([1.0, 0.0, 0.0]), np.array([0, 0.0, 1.0]), ), ] ) system.add_strands([strand_1, strand_2]) assert isinstance(system, System) assert system.E_tot == 0.0 assert len(system.dataframe.count()) == 10 assert len(system.configuration.count()) == 5 assert len(system.topology.count()) == 4 assert len(system.strands) == 2 assert len(system.nucleotides) == 12 system.strands[0].sequence = "AGAGAG" system.add_strand(system.strands[0].copy()) system.strands[0].sequence = "TATATA" assert len(system.strands) == 3 assert len(system.nucleotides) == 18 assert system.strands[0].sequence == "TATATA" assert system.strands[2].sequence == "AGAGAG" strand_3 = system.strands[1].copy() strand_3.sequence = "CCCGGG" strand_4 = strand_3.copy() strand_4.sequence = "AAATTT" system.add_strands({ 0 : strand_3, 1 : strand_4 }) assert len(system.strands) == 5 assert len(system.nucleotides) == 30 print(system.strands) assert system.strands[0].sequence == "CCCGGG" assert system.strands[1].sequence == "AAATTT" assert system.strands[2].sequence == "TATATA" print(system) print(system.dataframe) # system.write_oxDNA() return