Exemple #1
0
def apply_rotations_to_chains(final_coordinates_atomistic,
                              atomistic_protein_centered, at_com_group,
                              cg_com_group, cg_com):
    final_user_supplied_coord = {}
    for chain in range(len(final_coordinates_atomistic)):
        rotations = []
        if chain in atomistic_protein_centered:
            rotate_chain = at_mod.kabsch_rotate(
                at_com_group[g_var.group_chains[chain]] -
                cg_com[g_var.group_chains[chain]][0],
                cg_com_group[g_var.group_chains[chain]] -
                cg_com[g_var.group_chains[chain]][0])
            for part_val, part in enumerate(atomistic_protein_centered[chain]):
                if chain in g_var.group_chains:
                    rotations.append(rotate_chain)
                else:
                    rotations = at_com_group[chain]
            final_user_supplied_coord[chain] = hybridise_protein_inputs(
                final_coordinates_atomistic[chain],
                atomistic_protein_centered[chain], cg_com[chain], rotations,
                chain)
        else:
            final_user_supplied_coord[chain] = hybridise_protein_inputs(
                final_coordinates_atomistic[chain], [], [], [], chain)
    return final_user_supplied_coord
Exemple #2
0
def RMSD_align(coord_set_1, coord_set_2):
    center = np.mean(coord_set_2, axis=0)
    xyz_rot_apply=at_mod.kabsch_rotate(coord_set_1-center, coord_set_2-center)
    ali= []
    for at_val, atom in enumerate(coord_set_1):
        ali.append( at_mod.rotate_atom(atom, center, xyz_rot_apply) )
    return np.array(ali)
Exemple #3
0
def return_all_rotations_final(at_com_group, cg_com_group, cg_com):
    if len(at_com_group['all']) == len(cg_com_group['all']):
        return at_mod.kabsch_rotate(at_com_group['all'] - cg_com[0][0],
                                    cg_com_group['all'] - cg_com[0][0])
    else:
        sys.exit('The atomistic input does not match the CG. \n\
                number of CG residues ' + str(len(cg_com_group['all'])) +
                 '\nnumber of AT residues ' + str(len(at_com_group['all'])))
Exemple #4
0
def return_indivdual_rotations(chain, part_val, at_centers, cg_com, at_com_group, cg_com_group, sls, sle):
    if chain not in at_com_group:
        at_com_group[chain]=[]
    if len(at_centers) == len(np.array(g_var.backbone_coords[chain])[sls:sle,:3]):
        at_com_group[chain].append(at_mod.kabsch_rotate(np.array(at_centers)-cg_com[chain][part_val], 
                             np.array(g_var.backbone_coords[chain])[sls:sle,:3]-cg_com[chain][part_val]))
    else:
        sys.exit('In chain '+str(chain)+' the atomistic input does not match the CG. \n\
                    number of CG residues '+str(len(g_var.backbone_coords[chain]))+'\nnumber of AT residues '+str(len(at_centers)))    
    return at_com_group
Exemple #5
0
def RMSD_measure(structure_atoms):
    RMSD_dict = {}
    for chain in range(g_var.system['PROTEIN']):
        at_centers = []
        #### runs through every residue and atom
        for residue in structure_atoms[chain]:
            #### gets center of mass of each residue (note only backbone heavy atoms have a mass)
            at_centers_iter = []
            for atom in structure_atoms[chain][residue]:
                at_centers_iter.append(
                    np.append(
                        structure_atoms[chain][residue][atom]['coord'],
                        structure_atoms[chain][residue][atom]['frag_mass']))
            try:
                at_centers.append(
                    np.average(np.array(at_centers_iter)[:, :3],
                               axis=0,
                               weights=np.array(at_centers_iter)[:, 3]))
            except BaseException:
                print('The fragment probably has no mass\n')
                for atom in structure_atoms[chain][residue]:
                    print(structure_atoms[chain][residue][atom])
                sys.exit()
    #### checks that the number of residues in the chain are the same between CG and AT
        if len(at_centers) != len(g_var.backbone_coords[chain]):
            sys.exit('In chain ' + str(chain) +
                     ' the atomistic input does not match the CG. \n\
    number of CG residues ' + str(len(g_var.backbone_coords[chain])) +
                     '\nnumber of AT residues ' + str(len(at_centers)))
        cg_center = np.mean(np.array(g_var.backbone_coords[chain])[:, :3],
                            axis=0)
        at_align = np.array(at_centers) - (
            np.mean(np.array(at_centers), axis=0) - cg_center)
        xyz_rot_apply = at_mod.kabsch_rotate(
            np.array(at_align) - cg_center,
            np.array(np.array(g_var.backbone_coords[chain])[:, :3]) -
            cg_center)
        for at_val, atom in enumerate(at_align):
            at_align[at_val] = at_mod.rotate_atom(atom, cg_center,
                                                  xyz_rot_apply)
        #### finds distance between backbone COM and cg backbone beads
        dist = np.sqrt((np.array(at_align) -
                        np.array(g_var.backbone_coords[chain])[:, :3])**2)
        RMSD_val = np.sqrt(np.mean(dist**2))  #### RMSD calculation
        RMSD_dict[chain] = np.round(RMSD_val,
                                    3)  #### stores RMSD in dictionary
    return RMSD_dict
Exemple #6
0
def atomistic_non_protein_non_solvent(cg_residue_type, cg_residues):
    atomistic_fragments = {}  #### residue dictionary
    #### run through every residue in a particular residue type
    residue_type = {}
    residue_type_mass = {}
    if not os.path.exists(g_var.working_dir + cg_residue_type + '/' +
                          cg_residue_type + '_all.pdb'):
        for cg_resid, cg_residue in enumerate(cg_residues):
            atomistic_fragments[cg_resid] = {}
            frag_location = gen.fragment_location(
                cg_residue_type)  ### get fragment location from database
            residue_type[cg_residue_type], residue_type_mass[
                cg_residue_type] = at_mod.get_atomistic(frag_location)
            for group in residue_type[cg_residue_type]:
                center, at_frag_centers, cg_frag_centers, group_fit = at_mod.rigid_fit(
                    residue_type[cg_residue_type][group],
                    residue_type_mass[cg_residue_type], cg_residue,
                    cg_residues[cg_residue])
                at_connect, cg_connect = at_mod.connectivity(
                    cg_residues[cg_residue], at_frag_centers, cg_frag_centers,
                    group_fit, group)
                if len(at_connect) == len(cg_connect) and len(cg_connect) > 0:
                    try:
                        xyz_rot_apply = at_mod.kabsch_rotate(
                            np.array(at_connect) - center,
                            np.array(cg_connect) - center)
                    except BaseException:
                        sys.exit('There is a issue with residue: ' +
                                 cg_residue_type + ' in group: ' + str(group))
                else:
                    print('atom connections: ' + str(len(at_connect)) +
                          ' does not match CG connections: ' +
                          str(len(cg_connect)))
                    sys.exit('residue number: ' + str(cg_resid) +
                             ', residue type: ' + str(cg_residue_type) +
                             ', group: ' + group)
                for bead in group_fit:
                    for atom in group_fit[bead]:
                        group_fit[bead][atom]['coord'] = at_mod.rotate_atom(
                            group_fit[bead][atom]['coord'], center,
                            xyz_rot_apply)
                        atom_new = group_fit[bead][atom].copy()
                        atomistic_fragments[cg_resid][atom] = atom_new
        return atomistic_fragments, 0
    else:
        return atomistic_fragments, len(cg_residues)
Exemple #7
0
def build_multi_residue_atomistic_system(cg_residues, sys_type):
    #### initisation of counters
    chain_count = 0
    coord_atomistic = {}
    g_var.seq_cg = {sys_type: {}}
    g_var.ter_res = {sys_type: {}}
    gen.mkdir_directory(g_var.working_dir +
                        sys_type)  ### make and change to protein directory
    #### for each residue in protein
    residue_type = {}
    residue_type_mass = {}
    new_chain = True
    for cg_residue_id, residue_number in enumerate(cg_residues[sys_type]):

        if np.round((cg_residue_id / len(cg_residues[sys_type])) * 100,
                    2).is_integer():
            print('Converting de_novo ' + sys_type + ': ',
                  np.round((cg_residue_id / len(cg_residues[sys_type])) * 100,
                           2),
                  '%',
                  end='\r')
        resname = cg_residues[sys_type][residue_number][next(
            iter(cg_residues[sys_type][residue_number]))]['residue_name']
        if new_chain:
            if chain_count not in coord_atomistic:
                if sys_type == 'PROTEIN':
                    g_var.backbone_coords[chain_count] = []
                coord_atomistic[chain_count] = {}
                g_var.seq_cg[sys_type][chain_count] = []
                g_var.ter_res[sys_type][chain_count] = [resname, False]
            new_chain = False
        coord_atomistic[chain_count][residue_number] = {}
        frag_location = gen.fragment_location(
            resname)  ### get fragment location from database
        residue_type[resname], residue_type_mass[
            resname] = at_mod.get_atomistic(frag_location)
        g_var.seq_cg[sys_type] = add_to_sequence(g_var.seq_cg[sys_type],
                                                 resname, chain_count)
        new_chain = False
        for group in residue_type[resname]:
            for key in list(residue_type[resname][group].keys()):
                if key not in cg_residues[sys_type][residue_number]:
                    del residue_type[resname][group][key]
            if len(residue_type[resname][group]) > 0:
                center, at_frag_centers, cg_frag_centers, group_fit = at_mod.rigid_fit(
                    residue_type[resname][group], residue_type_mass[resname],
                    residue_number, cg_residues[sys_type][residue_number])
                at_connect, cg_connect = at_mod.connectivity(
                    cg_residues[sys_type][residue_number], at_frag_centers,
                    cg_frag_centers, group_fit, group)
                for group_bead in group_fit:
                    if group_bead in g_var.res_top[resname]['CONNECT']:
                        at_connect, cg_connect, new_chain = at_mod.BB_connectivity(
                            at_connect, cg_connect, cg_residues[sys_type],
                            group_fit[group_bead], residue_number, group_bead)
                        if sys_type == 'PROTEIN':
                            g_var.backbone_coords[chain_count].append(
                                np.append(
                                    cg_residues[sys_type][residue_number]
                                    [group_bead]['coord'], 1))
                if len(at_connect) == len(cg_connect) and len(at_connect) != 0:
                    xyz_rot_apply = at_mod.kabsch_rotate(
                        np.array(at_connect) - center,
                        np.array(cg_connect) - center)
                elif len(at_connect) == 0:
                    xyz_rot_apply = False
                    print('Cannot find any connectivity for residue number: ' +
                          str(residue_number) + ', residue type: ' +
                          str(resname) + ', group: ' + str(group))
                else:
                    print('atom connections: ' + str(len(at_connect)) +
                          ' does not equal CG connections: ' +
                          str(len(cg_connect)))
                    sys.exit('residue number: ' + str(residue_number) +
                             ', residue type: ' + str(resname) + ', group: ' +
                             group)

                for bead in group_fit:
                    for atom in group_fit[bead]:
                        group_fit[bead][atom]['coord'] = at_mod.rotate_atom(
                            group_fit[bead][atom]['coord'], center,
                            xyz_rot_apply)
                        atom_new = group_fit[bead][atom].copy()
                        coord_atomistic[chain_count][residue_number][
                            atom] = atom_new
        if new_chain:
            g_var.ter_res[sys_type][chain_count][1] = resname
            chain_count += 1

    print('Completed initial conversion of ' + sys_type + '\n')
    g_var.system[sys_type] = chain_count
    if sys_type == 'PROTEIN':
        for chain in range(chain_count):
            g_var.skip_disul[chain] = False
    return coord_atomistic