def add_angle_inducing_insertions_deletions(design: sc.DNADesign): # insertion followed by deletion start = 59 end = start + (32 * 12) for helix in [1, 5, 7, 11, 13]: for offset in range(start, end, 32): design.add_insertion(helix, offset, 1) design.add_deletion(helix, offset + 16) # deletion followed by insertion for helix in [2, 4, 8, 10, 14]: for offset in range(start, end, 32): design.add_deletion(helix, offset) design.add_insertion(helix, offset + 16, 1)
def add_deletion_in_range(design: sc.DNADesign, helix: int, start: int, end: int, deletion_offset: int): #Inserts deletion somewhere in given range. #`offset` is the relative offset within a column at which to put the deletions. #If negative, chooses first available offset. candidate_offsets = [] for candidate_deletion_offset in range(start, end): if valid_deletion_offset(design, helix, candidate_deletion_offset): candidate_offsets.append(candidate_deletion_offset) if len(candidate_offsets) == 0: raise ValueError(f"no pair of Substrands found on Helix {helix} " f"overlapping interval [{start},{end})") if deletion_offset < 0: # pick offset furthest from edges of interval candidate_offsets.sort(key=lambda offset: min(offset - start, end - offset)) deletion_absolute_offset = candidate_offsets[0] else: deletion_absolute_offset = start + deletion_offset design.add_deletion(helix, deletion_absolute_offset)
def add_twist_correct_deletions(design: sc.DNADesign): # I choose between 3 and 4 offset arbitrarily for twist-correction deletions for some reason, # so they have to be hard-coded. for col, offset in zip(range(4, 29, 3), [4, 3, 3, 4, 3, 3, 3, 3, 3]): for helix in range(0, 16): design.add_deletion(helix, 16 * col + offset)
def add_deletions(design: sc.DNADesign): for helix in range(24): for offset in range(27, 294, 48): design.add_deletion(helix, offset)