Exemplo n.º 1
0
def percent_vbur(
    session,
    selection,
    radii="UMN",
    radius=3.5,
    scale=1.17,
    method="Lebedev",
    radialPoints=20,
    angularPoints=1454,
    minimumIterations=25,
    onlyAtoms=None,
    center=None,
    useCentroid=True,
    displaySphere=None,
    pointSpacing=0.1,
    intersectionScale=6,
    palette="rainbow",
    return_values=False,
    steric_map=False,
    useScene=False,
    num_pts=100,
    shape="circle",
    labels="none",
    reportComponent="total",
):

    out = []

    models = {
        model: [
            atom for atom in model.atoms
            if onlyAtoms is not None and atom in onlyAtoms
        ]
        for model in selection if isinstance(model, AtomicStructure)
    }

    s = "<pre>model\tcenter\t%Vbur\n"

    for model in models:
        if len(models[model]) == 0:
            targets = None
        else:
            targets = [AtomSpec(atom.atomspec) for atom in models[model]]

        if center is not None:
            if isinstance(center, tuple):
                mdl_center = np.array(center)
            else:
                mdl_center = [
                    AtomSpec(atom.atomspec) for atom in model.atoms
                    if atom in center
                ]

        else:
            mdl_center = []

        rescol = ResidueCollection(model)

        if useScene:
            oop_vector = session.view.camera.get_position().axes()[2]
            ip_vector = session.view.camera.get_position().axes()[1]
            x_vec = session.view.camera.get_position().axes()[0]
            basis = np.array([x_vec, ip_vector, oop_vector]).T

        else:
            oop_vector = None
            ip_vector = None
            basis = None

        if len(mdl_center) == 0:
            rescol.detect_components()
            mdl_center = rescol.center
        elif not isinstance(center, np.ndarray):
            mdl_center = rescol.find([AtomSpec(c.atomspec) for c in center])

        key_atoms = None

        if not useCentroid and not isinstance(center, np.ndarray):
            for c in mdl_center:
                if targets is not None:
                    key_atoms = []
                    targets = rescol.find(targets)
                    for atom in targets:
                        if c in atom.connected or atom in c.connected:
                            key_atoms.append(atom)
                else:
                    key_atoms = None

                if (labels != "none"
                        or reportComponent != "total") and not useScene:
                    if not key_atoms:
                        session.logger.warning(
                            "bonds between center and coordinating atoms is required to"
                            " properly orient octants")
                    oop_vector = np.zeros(3)
                    for atom in key_atoms:
                        oop_vector += c.coords - atom.coords

                    if len(key_atoms) == 1:
                        ip_vector = perp_vector(oop_vector)
                        x_vec = np.cross(ip_vector, oop_vector)
                    else:
                        coords = [atom.coords for atom in key_atoms]
                        coords.append(c.coords)
                        coords = np.array(coords)
                        ip_vector = perp_vector(coords)
                        x_vec = np.cross(ip_vector, oop_vector)
                        x_vec /= np.linalg.norm(x_vec)
                        ip_vector = -np.cross(x_vec, oop_vector)
                    ip_vector /= np.linalg.norm(ip_vector)

                    basis = np.array([x_vec, ip_vector, oop_vector]).T

                if steric_map:
                    x, y, z, min_alt, max_alt, basis, _ = rescol.steric_map(
                        center=c,
                        key_atoms=key_atoms,
                        radii=radii,
                        oop_vector=oop_vector,
                        ip_vector=ip_vector,
                        radius=radius,
                        return_basis=True,
                        num_pts=num_pts,
                        shape=shape,
                    )

                vbur = rescol.percent_buried_volume(
                    targets=targets,
                    basis=basis,
                    center=c,
                    radius=radius,
                    radii=radii,
                    scale=scale,
                    method=method,
                    rpoints=int(radialPoints),
                    apoints=int(angularPoints),
                    min_iter=minimumIterations,
                )

                if steric_map:
                    out.append(
                        (model, c.atomspec, vbur, (x, y, z, min_alt, max_alt)))
                else:
                    out.append((model, c.atomspec, vbur))
                s += "%s\t%s\t" % (model.name, c.atomspec)
                if hasattr(vbur, "__iter__"):
                    if reportComponent == "octants":
                        s += "%s\n" % ",".join(["%.1f%%" % v for v in vbur])
                    elif reportComponent == "quadrants":
                        s += "%s\n" % ",".join([
                            "%.1f%%" % v for v in [
                                vbur[0] + vbur[7],
                                vbur[1] + vbur[6],
                                vbur[2] + vbur[5],
                                vbur[3] + vbur[4],
                            ]
                        ])
                    else:
                        s += "%.1f%%\n" % sum(vbur)
                else:
                    s += "%.1f%%\n" % vbur

                if displaySphere is not None:
                    mdl = vbur_vis(
                        session,
                        rescol,
                        targets,
                        radii,
                        scale,
                        radius,
                        c,
                        pointSpacing,
                        intersectionScale,
                        displaySphere,
                        vbur,
                        labels,
                        basis=basis,
                    )
                    model.add(mdl)
                    atomspec = mdl[0].atomspec
                    center_coords = rescol.COM(c)
                    args = [
                        "color",
                        "radial",
                        atomspec,
                        "center",
                        ",".join(["%.4f" % x for x in center_coords]),
                        "palette",
                        palette,
                        "range",
                        "0,%.2f" % radius,
                        "coordinateSystem",
                        model.atomspec,
                        ";",
                        "transparency",
                        atomspec,
                        "30",
                    ]

                    run(session, " ".join(args))
        else:
            if targets is not None:
                key_atoms = []
                targets = rescol.find(targets)
                for atom in targets:
                    if any(c in atom.connected for c in mdl_center):
                        key_atoms.append(atom)
            else:
                key_atoms = None

            if (labels != "none"
                    or reportComponent != "total") and not useScene:
                if not key_atoms:
                    session.logger.warning(
                        "bonds between center and coordinating atoms is required to"
                        " properly orient octants")
                oop_vector = np.zeros(3)
                for atom in key_atoms:
                    if isinstance(mdl_center, np.ndarray):
                        oop_vector += mdl_center - atom.coords
                    else:
                        for c in mdl_center:
                            oop_vector += c.coords - atom.coords

                if len(key_atoms) == 1:
                    ip_vector = perp_vector(oop_vector)
                    x_vec = np.cross(ip_vector, oop_vector)
                else:
                    coords = [atom.coords for atom in key_atoms]
                    if isinstance(mdl_center, np.ndarray):
                        coords.append(mdl_center)
                    else:
                        coords.extend([c.coords for c in mdl_center])
                    coords = np.array(coords)
                    ip_vector = perp_vector(coords)
                    x_vec = np.cross(ip_vector, oop_vector)
                    x_vec /= np.linalg.norm(x_vec)
                    ip_vector = -np.cross(x_vec, oop_vector)
                ip_vector /= np.linalg.norm(ip_vector)

                basis = np.array([x_vec, ip_vector, oop_vector]).T

            if steric_map:
                x, y, z, min_alt, max_alt, basis, _ = rescol.steric_map(
                    center=mdl_center,
                    key_atoms=key_atoms,
                    radius=radius,
                    radii=radii,
                    oop_vector=oop_vector,
                    ip_vector=ip_vector,
                    return_basis=True,
                    num_pts=num_pts,
                    shape=shape,
                )

            vbur = rescol.percent_buried_volume(
                targets=targets,
                basis=basis,
                center=mdl_center,
                radius=radius,
                radii=radii,
                scale=scale,
                method=method,
                rpoints=int(radialPoints),
                apoints=int(angularPoints),
                min_iter=minimumIterations,
            )

            if steric_map:
                if not isinstance(mdl_center, np.ndarray):
                    out.append(
                        (model, ",".join([c.atomspec for c in mdl_center]),
                         vbur, (x, y, z, min_alt, max_alt)))
                else:
                    out.append(
                        (model, ",".join(["%.3f" % c for c in mdl_center]),
                         vbur, (x, y, z, min_alt, max_alt)))
            else:
                if not isinstance(mdl_center, np.ndarray):
                    s += "%s\t%s\t" % (model.name, ", ".join(
                        [c.atomspec for c in mdl_center]))
                    out.append(
                        (model, ", ".join([c.atomspec
                                           for c in mdl_center]), vbur))
                else:
                    s += "%s\t%s\t" % (model.name, ",".join(
                        ["%.3f" % c for c in mdl_center]))
                    out.append(
                        (model, ",".join(["%.3f" % c
                                          for c in mdl_center]), vbur))

            if hasattr(vbur, "__iter__"):
                if reportComponent == "octants":
                    s += "%s\n" % ",".join(["%.1f%%" % v for v in vbur])
                elif reportComponent == "quadrants":
                    s += "%s\n" % ",".join([
                        "%.1f%%" % v for v in [
                            vbur[0] + vbur[7],
                            vbur[1] + vbur[6],
                            vbur[2] + vbur[5],
                            vbur[3] + vbur[4],
                        ]
                    ])
                else:
                    s += "%.1f%%\n" % sum(vbur)
            else:
                s += "%.1f%%\n" % vbur

            if displaySphere is not None:
                mdl = vbur_vis(
                    session,
                    rescol,
                    targets,
                    radii,
                    scale,
                    radius,
                    mdl_center,
                    pointSpacing,
                    intersectionScale,
                    displaySphere,
                    vbur,
                    labels,
                    basis=basis,
                )
                model.add(mdl)
                atomspec = mdl[0].atomspec
                if not isinstance(mdl_center, np.ndarray):
                    center_coords = rescol.COM(mdl_center)
                else:
                    center_coords = mdl_center
                #XXX: the center will be wrong if the models are tiled
                args = [
                    "color",
                    "radial",
                    atomspec,
                    "center",
                    ",".join(["%.4f" % x for x in center_coords]),
                    "palette",
                    palette,
                    "range",
                    "0,%.2f" % radius,
                    "coordinateSystem",
                    model.atomspec,
                    ";",
                    "transparency",
                    atomspec,
                    "30",
                ]

                run(session, " ".join(args))

    s = s.strip()
    s += "</pre>"

    if not return_values:
        session.logger.info(s, is_html=True)
    else:
        return out
Exemplo n.º 2
0
def percent_vbur(
    session,
    selection,
    radii="UMN",
    radius=3.5,
    scale=1.17,
    method="Lebedev",
    radialPoints=20,
    angularPoints=1454,
    minimumIterations=25,
    onlyAtoms=None,
    center=None,
    useCentroid=True,
    displaySphere=None,
    pointSpacing=0.075,
    intersectionScale=2,
    palette="rainbow",
    return_values=False,
    steric_map=False,
    use_scene=False,
    num_pts=100,
    shape="circle",
):

    out = []

    models = {
        model: [
            atom for atom in model.atoms
            if onlyAtoms is not None and atom in onlyAtoms
        ]
        for model in selection if isinstance(model, AtomicStructure)
    }

    s = "<pre>model\tcenter\t%Vbur\n"

    for model in models:
        if len(models[model]) == 0:
            targets = None
        else:
            targets = [AtomSpec(atom.atomspec) for atom in models[model]]

        if center is not None:
            if isinstance(center, tuple):
                mdl_center = np.array(center)
            else:
                mdl_center = [
                    AtomSpec(atom.atomspec) for atom in model.atoms
                    if atom in center
                ]

        else:
            mdl_center = []

        rescol = ResidueCollection(model)

        if use_scene:
            oop_vector = session.view.camera.get_position().axes()[2]
            ip_vector = session.view.camera.get_position().axes()[1]

        else:
            oop_vector = None
            ip_vector = None

        if len(mdl_center) == 0:
            rescol.detect_components()
            mdl_center = rescol.center
        elif not isinstance(center, np.ndarray):
            mdl_center = rescol.find([AtomSpec(c.atomspec) for c in center])

        if not useCentroid and not isinstance(center, np.ndarray):
            for c in mdl_center:
                if steric_map:
                    if targets is not None:
                        key_atoms = []
                        targets = rescol.find(targets)
                        for atom in targets:
                            if c in atom.connected or atom in c.connected:
                                key_atoms.append(atom)
                    else:
                        key_atoms = None

                    x, y, z, min_alt, max_alt, basis, targets = rescol.steric_map(
                        center=c,
                        key_atoms=key_atoms,
                        radii=radii,
                        oop_vector=oop_vector,
                        ip_vector=ip_vector,
                        radius=radius,
                        return_basis=True,
                        num_pts=num_pts,
                        shape=shape,
                    )

                    vbur = rescol.percent_buried_volume(
                        targets=targets,
                        basis=basis,
                        center=c,
                        radius=radius,
                        radii=radii,
                        scale=scale,
                        method=method,
                        rpoints=int(radialPoints),
                        apoints=int(angularPoints),
                        min_iter=minimumIterations,
                    )

                    out.append((model.name, c.atomspec, vbur,
                                (x, y, z, min_alt, max_alt)))

                else:
                    vbur = rescol.percent_buried_volume(
                        targets=targets,
                        center=c,
                        radius=radius,
                        radii=radii,
                        scale=scale,
                        method=method,
                        rpoints=int(radialPoints),
                        apoints=int(angularPoints),
                        min_iter=minimumIterations,
                    )

                    s += "%s\t%s\t%4.1f%%\n" % (model.name, c.atomspec, vbur)

                    out.append((model.name, c.atomspec, vbur))

                if displaySphere is not None:
                    mdl = vbur_vis(
                        session,
                        rescol,
                        targets,
                        radii,
                        scale,
                        radius,
                        c,
                        pointSpacing,
                        intersectionScale,
                        displaySphere,
                    )
                    model.add([mdl])
                    atomspec = mdl.atomspec
                    center_coords = rescol.COM(c)
                    #XXX: the center will be wrong if the models are tiled
                    args = [
                        "color",
                        "radial",
                        atomspec,
                        "center",
                        ",".join(["%.4f" % x for x in center_coords]),
                        "palette",
                        palette,
                        ";",
                        "transparency",
                        atomspec,
                        "30",
                    ]

                    run(session, " ".join(args))
        else:
            if steric_map:
                if targets is not None:
                    key_atoms = []
                    targets = rescol.find(targets)
                    for atom in targets:
                        if any(c in atom.connected for c in mdl_center):
                            key_atoms.append(atom)
                else:
                    key_atoms = None

                x, y, z, min_alt, max_alt, basis, targets = rescol.steric_map(
                    center=mdl_center,
                    key_atoms=key_atoms,
                    radius=radius,
                    radii=radii,
                    oop_vector=oop_vector,
                    ip_vector=ip_vector,
                    return_basis=True,
                    num_pts=num_pts,
                    shape=shape,
                )

                vbur = rescol.percent_buried_volume(
                    targets=targets,
                    basis=basis,
                    center=mdl_center,
                    radius=radius,
                    radii=radii,
                    scale=scale,
                    method=method,
                    rpoints=int(radialPoints),
                    apoints=int(angularPoints),
                    min_iter=minimumIterations,
                )

                if not isinstance(mdl_center, np.ndarray):
                    out.append(
                        (model.name, ",".join([c.atomspec
                                               for c in mdl_center]), vbur,
                         (x, y, z, min_alt, max_alt)))
                else:
                    out.append(
                        (model.name, ",".join(["%.3f" % c
                                               for c in mdl_center]), vbur,
                         (x, y, z, min_alt, max_alt)))

            else:
                vbur = rescol.percent_buried_volume(
                    targets=targets,
                    center=mdl_center,
                    radius=radius,
                    radii=radii,
                    scale=scale,
                    method=method,
                    rpoints=int(radialPoints),
                    apoints=int(angularPoints),
                    min_iter=minimumIterations,
                )

                if not isinstance(mdl_center, np.ndarray):
                    s += "%s\t%s\t%4.1f%%\n" % (model.name, ", ".join(
                        [c.atomspec for c in mdl_center]), vbur)
                    out.append(
                        (model.name,
                         ", ".join([c.atomspec for c in mdl_center]), vbur))
                else:
                    s += "%s\t%s\t%4.1f%%\n" % (model.name, ",".join(
                        ["%.3f" % c for c in mdl_center]), vbur)
                    out.append(
                        (model.name, ",".join(["%.3f" % c
                                               for c in mdl_center]), vbur))

            if displaySphere is not None:
                mdl = vbur_vis(
                    session,
                    rescol,
                    targets,
                    radii,
                    scale,
                    radius,
                    mdl_center,
                    pointSpacing,
                    intersectionScale,
                    displaySphere,
                )
                model.add([mdl])
                atomspec = mdl.atomspec
                if not isinstance(mdl_center, np.ndarray):
                    center_coords = rescol.COM(mdl_center)
                else:
                    center_coords = mdl_center
                #XXX: the center will be wrong if the models are tiled
                args = [
                    "color",
                    "radial",
                    atomspec,
                    "center",
                    ",".join(["%.4f" % x for x in center_coords]),
                    "palette",
                    palette,
                    ";",
                    "transparency",
                    atomspec,
                    "30",
                ]

                run(session, " ".join(args))

    s = s.strip()
    s += "</pre>"

    if not return_values:
        session.logger.info(s, is_html=True)
    else:
        return out