예제 #1
0
def main():
    parser = argparse.ArgumentParser(description='')
    parser.add_argument('-r', '--residue', help='investigated residue')
    parser.add_argument(
        '-i',
        '--input',
        nargs='?',
        help=
        'list of inputs (e.g. "model1.prmtop model1.incprd mutation.prmtop prod_1.nc 1 20, ...")'
    )
    parser.add_argument('-f',
                        '--output_folder',
                        nargs='?',
                        help='set output folder (default: "occupancies")')
    parser.add_argument(
        '-m1',
        '--mask1',
        nargs='?',
        help='mask for calculation of average occupancies (e.g. '
        '1-582; default: solute-solute contacts excluded)')
    parser.add_argument(
        '-m2',
        '--mask2',
        nargs='?',
        help='second mask determines what residues are used to '
        'calculate occupancies with (default: 1-50000')
    parser.add_argument('-a',
                        '--avrgs',
                        help='calculate averages',
                        action='store_true')
    parser.add_argument('-w', '--wat', help='strip water', action='store_true')
    parser.add_argument('-hy',
                        '--hydro',
                        help='strip hydrogen',
                        action='store_true')
    args = parser.parse_args()

    # parse inputs into input object
    ip = Input(sys.argv)

    # create output folder
    os.create_output_folder(ip.folder)

    # copy input trajectories and topology files to output folder
    for item in ip.input:
        os.copy_to_folder(item[0], ip.folder)
        os.copy_to_folder(item[1], ip.folder)

    # change to results folder
    os.change_to_folder(ip.folder)

    # set new file paths
    ip.set_file_paths_to_output_folder()

    ##### calculate occupancies #####
    initial_contact_atoms = cpp.get_residue_contacting_atoms(
        ip.input[0][0], ip.input[0][1], ip.input[0][2], ip.input[0][3],
        ip.mutation, ip.strip_water, ip.strip_hydro)
    occupancies = []
    for item in ip.input:
        occupancies.append(
            cpp.get_occupancy_of_atoms(item[0], item[1], item[2], item[3],
                                       initial_contact_atoms, ip.strip_water,
                                       ip.strip_hydro))

    ##### calculate average occupancies #####
    if ip.calc_averages:

        # generate pdb
        pdb_file_name = cpp.generate_pdb(ip.input[0][0], ip.input[0][1], "1",
                                         "1", 0, 1)
        pdb = Pdb(pdb_file_name)

        # get non solvent residue numbers from pdb to create mask to exclude solvent in calculation of averages
        # (solute-solvent contacts will be calculated, but no solvent-solvent contacts)
        if not ip.mask1:
            non_solvent_residues = pdb.get_non_solvent_residue_numbers()
            ip.mask1 = str(non_solvent_residues[0]) + "-" + str(
                non_solvent_residues[-1])

        if not ip.mask2:
            ip.mask2 = "1-" + str(max(pdb.get_residue_numbers()))
        # get types of contacting atoms
        contacting_atoms_types = pdb.get_atom_types(initial_contact_atoms)

        averages = []
        for item in ip.input:
            averages.append(
                cpp.get_contact_averages_of_types(
                    item[0], item[1], item[2], item[3], contacting_atoms_types,
                    ip.mask1, ip.mask2, ip.strip_water, ip.strip_hydro))

    ##### reformat data #####
    occupancies = reformat_occupancies_list(occupancies)

    if ip.calc_averages:
        for item in averages:
            occupancies = add_averages_column(occupancies, item)

    # add headers
    output = add_headers(occupancies, ip.calc_averages)

    # format output
    output = output_2D_list(output)
    output = prepare_output(output, ip.calc_averages)

    ##### write data #####
    input_file_names = ip.get_file_names()
    write_output(output, ip.mutation + '_occupancies.dat')
    output_to_pdf(output, ip.mutation + '_occupancies.dat', ip.calc_averages,
                  ip.strip_water, ip.strip_hydro, input_file_names,
                  ip.mutation)
    if ip.calc_averages:
        write_percentages_quotients(output,
                                    ip.mutation + "_percentage_quotients.dat")
예제 #2
0
파일: __main__.py 프로젝트: Gimba/Occupancy
def main():
    parser = argparse.ArgumentParser(description='')
    parser.add_argument('-r', '--residue', help='investigated residue')
    parser.add_argument(
        '-i',
        '--input',
        nargs='?',
        help=
        'list of inputs (e.g. "model1.prmtop model1.incprd mutation.prmtop prod_1.nc 1 20, ...")'
    )
    # parser.add_argument('-f', '--output_folder', nargs='?', help='set output folder (default: "occupancies")')
    parser.add_argument(
        '-m1',
        '--mask1',
        nargs='?',
        help='mask for calculation of average occupancies (e.g. '
        '1-582; default: solute-solute contacts excluded)')
    parser.add_argument(
        '-m2',
        '--mask2',
        nargs='?',
        help='second mask determines what residues are used to '
        'calculate occupancies with (default: 1-50000')
    parser.add_argument('-a',
                        '--avrgs',
                        help='calculate averages',
                        action='store_true')
    parser.add_argument('-w', '--wat', help='strip water', action='store_true')
    parser.add_argument('-hy',
                        '--hydro',
                        help='strip hydrogen',
                        action='store_true')
    parser.add_argument('-m',
                        '--mapping',
                        nargs='?',
                        help='add file to recalculate residue numbers')
    args = parser.parse_args()

    # parse inputs into input object
    ip = Input(sys.argv)

    # create output folder
    # os.create_output_folder(ip.folder)

    # copy input trajectories and topology files to output folder
    # for item in ip.input:
    #     os.copy_to_folder(item[0], ip.folder)
    #     os.copy_to_folder(item[1], ip.folder)

    # change to results folder
    # os.change_to_folder(ip.folder)

    # set new file paths
    # ip.set_file_paths_to_output_folder()

    ##### calculate occupancies #####
    initial_contact_atoms = cpp.get_residue_contacting_atoms(
        ip.input[0][0], ip.input[0][1], ip.input[0][2], ip.input[0][3],
        ip.mutation, ip.strip_water, ip.strip_hydro)

    # set up multiprocessing
    pool = multiprocessing.Pool()
    input_list = copy.deepcopy(ip.input)

    occupancies = []
    for item in input_list:
        item += [initial_contact_atoms, ip.strip_water, ip.strip_hydro]

    occupancies.append(pool.map(cpp.get_occupancy_of_atoms, input_list))

    ##### calculate average occupancies #####
    if ip.calc_averages:
        # generate pdb
        pdb_file_name = cpp.generate_pdb(ip.input[0][0], ip.input[0][1], "1",
                                         "1", 0, 1)
        pdb = Pdb(pdb_file_name)

        # get non solvent residue numbers from pdb to create mask to exclude solvent in calculation of averages
        # (solute-solvent contacts will be calculated, but no solvent-solvent contacts)
        if not ip.mask1:
            non_solvent_residues = pdb.get_non_solvent_residue_numbers()
            ip.mask1 = str(non_solvent_residues[0]) + "-" + str(
                non_solvent_residues[-1])

        if not ip.mask2:
            ip.mask2 = "1-" + str(max(pdb.get_residue_numbers()))
        # get types of contacting atoms
        contacting_atoms_types = pdb.get_atom_types(initial_contact_atoms)

        averages = []
        input_list = []
        # item[0], item[1], item[2], item[3], contacting_atoms_types, ip.mask1, ip.mask2, ip.strip_water, ip.strip_hydro
        for item2 in ip.input:
            input_list.append([
                item2[0], item2[1], item2[2], item2[3], contacting_atoms_types,
                ip.mask1, ip.mask2, ip.strip_water, ip.strip_hydro
            ])

        averages.append(pool.map(cpp.get_contact_averages_of_types,
                                 input_list))

    pool.close()
    pool.join()

    ##### reformat data #####
    occupancies = reformat_occupancies_list(occupancies[0])

    if ip.calc_averages:
        for item in averages[0]:
            occupancies = add_averages_column(occupancies, item)

    # add headers
    output = add_headers(occupancies, ip.calc_averages)

    # use the mapping file to transform residue numbering
    if ip.mapping:
        map_residues(ip.mapping, output)

    # format output
    output = output_2D_list(output)
    output = prepare_output(output, ip.calc_averages)

    ##### write data #####
    input_file_names = ip.get_file_names()
    write_output(output, ip.mutation + '_occupancies.dat')
    if ip.mapping:
        investigated_residue = map_mutation_residue(ip.mapping, ip.mutation)
    if len(ip.input) < 23:
        output_to_pdf(output, ip.calc_averages, ip.strip_water, ip.strip_hydro,
                      input_file_names, investigated_residue)
    else:
        print(
            "No pdf gets generated if there are more than 22 trajectories. Please refer to "
            + ip.mutation + '_occupancies.dat to retrieve occupancy values')

    if ip.calc_averages:
        totals, percentages = write_percentages_quotients(
            output, ip.mutation + "_percentage_quotients.dat")
        trajectories = ip.get_trajectories()
        plot_total_values(totals, percentages, trajectories, ip.calc_averages)