def bring_in_dstrand(s1, s2, initial, radius): R = utils.get_random_rotation_matrix() s1.rotate(R) s2.rotate(R, s1.cm_pos) start_from = [s1, s2][np.random.random_integers(0, 1)]._nucleotides[np.random.random_integers(-1, 0)].cm_pos new_pos = initial + utils.get_random_vector_in_sphere(radius) disp = new_pos - start_from s1.cm_pos = s1.cm_pos + disp s2.cm_pos = s2.cm_pos + disp
def generate_rw(self, sequence, start_pos=np.array([0., 0., 0.])): """ Generate ssDNA as a random walk (high-energy configurations are possible): generate(bp=45,double=False,circular=False,random_walk=True) """ # random walk generator base.Logger.log( "Generating strand as a random walk. Remember to equilibrate the configuration with MC", base.Logger.WARNING) d = np.array([0.7525, 0., 0.]) pos = start_pos rw = [] rw.append(pos) for i, _ in enumerate(sequence[1:]): overlap = True while overlap: overlap = False R = utils.get_random_rotation_matrix() dd = np.dot(R, d) trypos = pos + np.dot(R, d) overlap = False for r in rw: dd = trypos - r if np.dot(dd, dd) < 0.40 * 0.40: overlap = True pos = trypos rw.append(pos) # print >> sys.stderr, "# nucleotide", i + 1, "inserted" # we get the a1 vectors in a smart way a1s = [] d = rw[1] - rw[0] a1s.append(d / np.sqrt(np.dot(d, d))) for i in range(1, len(rw) - 1): d = (rw[i + 1] + rw[i - 1]) * 0.5 d = rw[i] - d a1s.append(d / np.sqrt(np.dot(d, d))) d = rw[len(rw) - 1] - rw[len(rw) - 2] a1s.append(d / np.sqrt(np.dot(d, d))) s = base.Strand() for i, r in enumerate(rw): a1, _, a3 = utils.get_orthonormalized_base( a1s[i], utils.get_random_vector(), utils.get_random_vector()) # print np.dot(a1, a1), np.dot(a2, a2), np.dot(a3, a3), np.dot(a1, a2), np.dot(a1, a3), np.dot(a2, a3) # # POS_BACK is negative! cm = r + a1s[i] * abs(base.POS_BACK) s.add_nucleotide(base.Nucleotide(cm, a1, a3, sequence[i])) return s
if np.dot (cdm, cdm) < 1.: redo = False final_box = np.array([box_side, box_side, box_side]) final = systems[0].copy() final.print_lorenzo_output ("justone.dat", "justone.top") njoined = 1 for S in systems[1:]: base.Logger.log ("# Trying to join") has_overlaps = True while has_overlaps: translated = S.copy() nold = final.N_strands translated.rotate(utils.get_random_rotation_matrix(), np.array([0.,0.,0.])) translated.translate(np.random.rand(3) * final._box) has_overlaps = False for s1 in translated._strands: if final.is_overlapping_better(s1): has_overlaps = True base.Logger.log (" # Overlap, retrying") break '''prova = final.join(translated, final_box) for s1 in prova._strands[nold:]: for s2 in prova._strands[:nold]: if s1.overlaps_with(s2, final_box): has_overlaps = True base.Logger.log (" # Overlap, retrying")
if np.dot(cdm, cdm) < 1.: redo = False final_box = np.array([box_side, box_side, box_side]) final = systems[0].copy() final.print_lorenzo_output("justone.dat", "justone.top") njoined = 1 for S in systems[1:]: base.Logger.log("# Trying to join") has_overlaps = True while has_overlaps: translated = S.copy() nold = final.N_strands translated.rotate(utils.get_random_rotation_matrix(), np.array([0., 0., 0.])) translated.translate(np.random.rand(3) * final._box) has_overlaps = False for s1 in translated._strands: if final.is_overlapping_better(s1): has_overlaps = True base.Logger.log(" # Overlap, retrying") break '''prova = final.join(translated, final_box) for s1 in prova._strands[nold:]: for s2 in prova._strands[:nold]: if s1.overlaps_with(s2, final_box): has_overlaps = True base.Logger.log (" # Overlap, retrying")