Beispiel #1
0
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
Beispiel #2
0
    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")
Beispiel #4
0
        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")