aboutsummaryrefslogtreecommitdiff
path: root/plip/visualization/visualize.py
blob: a551798b578d2b3adc71706eab47b2780aa92f6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from pymol import cmd

from plip.basic import config, logger
from plip.basic.supplemental import start_pymol
from plip.visualization.pymol import PyMOLVisualizer

logger = logger.get_logger()


def visualize_in_pymol(plcomplex):
    """Visualizes the protein-ligand pliprofiler at one site in PyMOL."""

    vis = PyMOLVisualizer(plcomplex)

    #####################
    # Set everything up #
    #####################

    pdbid = plcomplex.pdbid
    lig_members = plcomplex.lig_members
    chain = plcomplex.chain
    if config.PEPTIDES:
        vis.ligname = "PeptideChain%s" % plcomplex.chain
    if config.INTRA is not None:
        vis.ligname = "Intra%s" % plcomplex.chain

    ligname = vis.ligname
    hetid = plcomplex.hetid

    metal_ids = plcomplex.metal_ids
    metal_ids_str = "+".join([str(i) for i in metal_ids])

    ########################
    # Basic visualizations #
    ########################

    start_pymol(
        run=True, options="-pcq", quiet=not config.VERBOSE and not config.SILENT
    )
    vis.set_initial_representations()

    cmd.load(plcomplex.sourcefile)
    current_name = cmd.get_object_list(selection="(all)")[0]
    logger.debug(f"setting current_name to {current_name} and pdbid to {pdbid}")
    cmd.set_name(current_name, pdbid)
    cmd.hide("everything", "all")
    if config.PEPTIDES:
        cmd.select(ligname, "chain %s and not resn HOH" % plcomplex.chain)
    else:
        cmd.select(
            ligname,
            "resn %s and chain %s and resi %s*" % (hetid, chain, plcomplex.position),
        )
    logger.debug(f"selecting ligand for PDBID {pdbid} and ligand name {ligname}")
    logger.debug(f"resn {hetid} and chain {chain} and resi {plcomplex.position}")

    # Visualize and color metal ions if there are any
    if not len(metal_ids) == 0:
        vis.select_by_ids(ligname, metal_ids, selection_exists=True)
        cmd.show("spheres", "id %s and %s" % (metal_ids_str, pdbid))

    # Additionally, select all members of composite ligands
    if len(lig_members) > 1:
        for member in lig_members:
            resid, chain, resnr = member[0], member[1], str(member[2])
            cmd.select(
                ligname,
                "%s or (resn %s and chain %s and resi %s)"
                % (ligname, resid, chain, resnr),
            )

    cmd.show("sticks", ligname)
    cmd.color("myblue")
    cmd.color("myorange", ligname)
    cmd.util.cnc("all")
    if not len(metal_ids) == 0:
        cmd.color("hotpink", "id %s" % metal_ids_str)
        cmd.hide("sticks", "id %s" % metal_ids_str)
        cmd.set("sphere_scale", 0.3, ligname)
    cmd.deselect()

    vis.make_initial_selections()

    vis.show_hydrophobic()  # Hydrophobic Contacts
    vis.show_hbonds()  # Hydrogen Bonds
    vis.show_halogen()  # Halogen Bonds
    vis.show_stacking()  # pi-Stacking Interactions
    vis.show_cationpi()  # pi-Cation Interactions
    vis.show_sbridges()  # Salt Bridges
    vis.show_wbridges()  # Water Bridges
    vis.show_metal()  # Metal Coordination

    vis.refinements()

    vis.zoom_to_ligand()

    vis.selections_cleanup()

    vis.selections_group()
    vis.additional_cleanup()
    if config.DNARECEPTOR:
        # Rename Cartoon selection to Line selection and change repr.
        cmd.set_name("%sCartoon" % plcomplex.pdbid, "%sLines" % plcomplex.pdbid)
        cmd.hide("cartoon", "%sLines" % plcomplex.pdbid)
        cmd.show("lines", "%sLines" % plcomplex.pdbid)

    if config.PEPTIDES:
        filename = "%s_PeptideChain%s" % (pdbid.upper(), plcomplex.chain)
        if config.PYMOL:
            vis.save_session(config.OUTPATH, override=filename)
    elif config.INTRA is not None:
        filename = "%s_IntraChain%s" % (pdbid.upper(), plcomplex.chain)
        if config.PYMOL:
            vis.save_session(config.OUTPATH, override=filename)
    else:
        filename = "%s_%s" % (
            pdbid.upper(),
            "_".join([hetid, plcomplex.chain, plcomplex.position]),
        )
        if config.PYMOL:
            vis.save_session(config.OUTPATH)
    if config.PICS:
        vis.save_picture(config.OUTPATH, filename)