Skip to content
Snippets Groups Projects
run.py 4.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • cmaffeo2's avatar
    cmaffeo2 committed
    from glob import glob
    import numpy as np
    from arbdmodel.ssdna_two_bead import DnaModel, PolymerSection, _P, _B
    from arbdmodel.coords import rotationAboutAxis
    from copy import copy
    
    
    gridfile = '/data/server5/cmaffeo2/latexDocuments/2013-coarse-SSB/sources/replisome/maps/combine.dx'
    restraint1 = np.array((189.5, 199.5, 209.8))
    restraint2 = np.array((153.9, 161.1, 196.6))
    
    _P.grid = (gridfile, 1)
    _B.grid = (gridfile, 1)
    
    """ Create spline-based polymer """
    a = PolymerSection(name='loop', num_monomers=500,
                       monomer_length = 5,
                       start_position = restraint1,
                       end_position = restraint2,
    )
    
    
    """ VMD: set R [lindex [molinfo top get rotate_matrix] 0]
    vectrans [transtranspose $R] {0 0 1}
    """
    axis1 = np.array((-0.9432600140571594, -0.12140899896621704, -0.3090659976005554))
    axis2 = np.array((-0.8285319805145264, -0.4766559898853302, -0.29383501410484314))
    
    delta = (0.4*a.num_monomers) * a.monomer_length
    midpoint1 = restraint1 +  delta*axis1
    midpoint2 = restraint2 +  delta*axis2
    
    # def get_ideal_position(contour):
    #     if contour < 0.4:
    #         return restraint1 + delta*axis1
    
    dna_coordinates = np.loadtxt('0-initial/p-coords.dat')
    ssb_dna_contacts = [np.loadtxt('0-initial/contacts/{}.dat'.format(i)) for i in range(1,15)]
    ssb_coords = [np.loadtxt('0-initial/coords/{}.dat'.format(i)) for i in range(1,15)]
    ssb_dna_contact_center = [a.mean() for a in ssb_dna_contacts]
    midpoints = [int(0.5*(a[-1]+b[0])) for a,b in zip(ssb_dna_contacts[:-1],ssb_dna_contacts[1:])]
    edges = [0] + midpoints + [500]
    
    idxidx1 = 4
    idxidx2 = 9
    idx1 = edges[idxidx1+1]
    idx2 = edges[idxidx2+1]
    r0 = dna_coordinates[0]
    r1 = dna_coordinates[idx1]
    r2 = dna_coordinates[idx2]
    r3 = dna_coordinates[-1]
    
    def rotate_to(initial, final):
        a0,a1 = [a/np.linalg.norm(a) for a in (initial, final)]
        cross = np.cross(a0,a1)
        cross_l = np.linalg.norm(cross)
        axis = cross/cross_l
        angle = np.arcsin(cross_l)*180/np.pi
        return rotationAboutAxis(axis,angle, normalizeAxis=False)
    
    R1 = rotate_to(r1-r0, axis1)
    target1 = R1.dot(r1-r0) + restraint1
    
    tmp_R3 = rotate_to(r2-r3, axis2)
    tmp_target2 = tmp_R3.dot(r2-r3) + restraint2
    
    R2 = rotate_to(r2-r1, tmp_target2-target1)
    target2 = R2.dot(r2-r1) + target1
    
    R3 = rotate_to(r2-r3, target2-restraint2)
    target3 = R3.dot(r2-r3) + restraint2
    
    # print(target3-restraint2)
    print(restraint1)
    print(target1)
    print(target2)
    print(target3)
    print(restraint2)
    print( np.linalg.norm(target3-restraint2) )
    
    coords = [R1.dot(r-r0)+restraint1 for r in dna_coordinates[:idx1]] + \
             [R2.dot(r-r1)+target1 for r in dna_coordinates[idx1:idx2]] + \
             [R3.dot(r-r3)+restraint2 for r in dna_coordinates[idx2:]]
    coords = np.array(coords)
    print(coords[idx1],coords[idx1+1])
    print(coords[idx2],coords[idx2+1])
    print(coords[0],restraint1)
    print(coords[-1],restraint2)
    
    a.set_splines( np.linspace(0,1,len(coords)), coords )
    
    # coords = np.array((restraint1, midpoint1, midpoint2, restraint2))
    # a.set_splines( (0,0.4,0.6,1), coords )
    
    ## print RB positions
    def print_rb_coords(original, R, about0, about1):
        r = original[:3]
        R0 = original[3:].reshape((3,3))
        r = R.dot(r-about0)+about1
        R = R.dot(R0)
        fh.write( '{} {} {} {} {} {} {} {} {} {} {} {}\n'.format(*r, *R.reshape(9)) )
    
    with open("trombone-ssb.rbcoords.txt",'w') as fh:
        for rR in ssb_coords[:idxidx1]:
            print_rb_coords(rR, R1, r0, restraint1)
        for rR in ssb_coords[idxidx1:idxidx2]:
            print_rb_coords(rR, R2, r1, target1)
        for rR in ssb_coords[idxidx2:]:
            print_rb_coords(rR, R3, r3, restraint2)
    
    
    # for s in np.linspace(0.25,0.75,5):
    #     print( '{} {} {} 1 0 0 0 1 0 0 0 1'.format( *(restraint1 * (1-s) + midpoint1*s) ))
    # for s in np.linspace(0.25,0.75,5):
    #     print( '{} {} {} 1 0 0 0 1 0 0 0 1'.format( *(restraint2 * (1-s) + midpoint2*s) ))
    
    
    
    model = DnaModel([a], dimensions=(3000,3000,3000))
    model.timestep = 20e-6
    
    end1 = model.strands[0].children[0].children[0]
    end2 = model.strands[0].children[-1].children[0]
    
    end1.add_restraint( (10, restraint1) )
    end2.add_restraint( (10, restraint2) )
    
    model.simulate(output_name='trombone-dna',
                   num_steps=1e5, output_period=1e4,
                   gpu=1
    )