示例#1
0
    def run_tm_bond(self, *args):
        color = self.tm_bond_color.get_color()
        self.settings.tm_bond_color = tuple([c / 255. for c in color])

        radius = self.tm_bond_radius.value()
        self.settings.tm_bond_radius = radius

        dashes = self.tm_bond_dashes.value()
        self.settings.tm_bond_dashes = dashes

        models = self.session.models.list(type=AtomicStructure)
        for model in models:
            rescol = ResidueCollection(model, bonds_matter=False)
            try:
                tm_list = rescol.find([
                    AnyTransitionMetal(), "Na", "K", "Rb", "Cs", "Fr", "Mg",
                    "Ca", "Sr", "Ba", "Ra"
                ])
                for tm in tm_list:
                    for atom in rescol.atoms:
                        if atom is tm:
                            continue

                        if atom.is_connected(tm):
                            pbg = model.pseudobond_group(
                                model.PBG_METAL_COORDINATION,
                                create_type="normal")
                            pbg.new_pseudobond(tm.chix_atom, atom.chix_atom)
                            pbg.dashes = dashes
                            pbg.color = color
                            pbg.radius = radius

            except LookupError:
                pass
示例#2
0
文件: libadd.py 项目: QChASM/SEQCROW
    def libadd_ring(self):
        """add ring to library or open it in a new model"""
        selection = self.session.seqcrow_ordered_selection_manager.selection

        if not selection.single_structure:
            raise RuntimeError("selected atoms must be on the same model")

        rescol = ResidueCollection(selection[0].structure)
        walk_atoms = rescol.find(
            [AtomSpec(atom.atomspec) for atom in selection])

        if len(walk_atoms) < 1:
            raise RuntimeError("no walk direction could be determined")

        ring_name = self.ring_name.text()
        ring = Ring(rescol, name=ring_name, end=walk_atoms)
        ring.comment = "E:%s" % ",".join(
            [str(rescol.atoms.index(atom) + 1) for atom in walk_atoms])

        if len(ring_name) == 0:
            chimerax_ring = ResidueCollection(ring).get_chimera(self.session)
            chimerax_ring.name = "ring preview"
            self.session.models.add([chimerax_ring])
            bild_obj = show_walk_highlight(ring, chimerax_ring,
                                           [0.9, 0.4, 0.3, 0.9], self.session)
            self.session.models.add(bild_obj, parent=chimerax_ring)

        else:
            check_aaronlib_dir()
            filename = os.path.join(AARONLIB, "Rings", ring_name + ".xyz")
            if os.path.exists(filename):
                exists_warning = QMessageBox()
                exists_warning.setIcon(QMessageBox.Warning)
                exists_warning.setText(
                    "%s already exists.\nWould you like to overwrite?" %
                    filename)
                exists_warning.setStandardButtons(QMessageBox.Yes
                                                  | QMessageBox.No)

                rv = exists_warning.exec_()
                if rv == QMessageBox.Yes:
                    ring.write(outfile=filename)
                    self.tool_window.status("%s added to ring library" %
                                            ring_name)

                else:
                    self.tool_window.status(
                        "%s has not been added to ring library" % ring_name)

            else:
                ring.write(outfile=filename)
                self.tool_window.status("%s added to ring library" % ring_name)
示例#3
0
    def calc_cone(self, *args):
        self.settings.cone_option = self.cone_option.currentText()
        self.settings.radii = self.radii_option.currentText()
        self.settings.display_radii = self.display_radii.checkState(
        ) == Qt.Checked
        self.settings.display_cone = self.display_cone.checkState(
        ) == Qt.Checked

        if self.cone_option.currentText() == "Tolman (Unsymmetrical)":
            method = "tolman"
        else:
            method = self.cone_option.currentText()

        radii = self.radii_option.currentText()
        return_cones = self.display_cone.checkState() == Qt.Checked
        display_radii = self.display_radii.checkState() == Qt.Checked

        # self.table.setRowCount(0)

        for center_atom in selected_atoms(self.session):
            rescol = ResidueCollection(center_atom.structure)
            at_center = rescol.find_exact(AtomSpec(center_atom.atomspec))[0]
            if center_atom.structure in self.ligands:
                comp = Component(
                    rescol.find([
                        AtomSpec(atom.atomspec)
                        for atom in self.ligands[center_atom.structure]
                    ]),
                    to_center=rescol.find_exact(AtomSpec(
                        center_atom.atomspec)),
                    key_atoms=rescol.find(BondedTo(at_center)),
                )
            else:
                comp = Component(
                    rescol.find(NotAny(at_center)),
                    to_center=rescol.find_exact(AtomSpec(
                        center_atom.atomspec)),
                    key_atoms=rescol.find(BondedTo(at_center)),
                )

            cone_angle = comp.cone_angle(
                center=rescol.find(AtomSpec(center_atom.atomspec)),
                method=method,
                radii=radii,
                return_cones=return_cones,
            )

            if return_cones:
                cone_angle, cones = cone_angle
                s = ".transparency 0.5\n"
                for cone in cones:
                    apex, base, radius = cone
                    s += ".cone   %6.3f %6.3f %6.3f   %6.3f %6.3f %6.3f   %.3f open\n" % (
                        *apex, *base, radius)

                stream = BytesIO(bytes(s, "utf-8"))
                bild_obj, status = read_bild(self.session, stream,
                                             "Cone angle %s" % center_atom)

                self.session.models.add(bild_obj, parent=center_atom.structure)

            if display_radii:
                s = ".note radii\n"
                s += ".transparency 75\n"
                color = None
                for atom in comp.atoms:
                    chix_atom = atom.chix_atom
                    if radii.lower() == "umn":
                        r = VDW_RADII[chix_atom.element.name]
                    elif radii.lower() == "bondi":
                        r = BONDI_RADII[chix_atom.element.name]

                    if color is None or chix_atom.color != color:
                        color = chix_atom.color
                        rgb = [x / 255. for x in chix_atom.color]
                        rgb.pop(-1)

                        s += ".color %f %f %f\n" % tuple(rgb)

                    s += ".sphere %f %f %f %f\n" % (*chix_atom.coord, r)

                stream = BytesIO(bytes(s, "utf-8"))
                bild_obj, status = read_bild(self.session, stream,
                                             "Cone angle radii")

                self.session.models.add(bild_obj, parent=center_atom.structure)

            row = self.table.rowCount()
            self.table.insertRow(row)

            name = QTableWidgetItem()
            name.setData(Qt.DisplayRole, center_atom.structure.name)
            self.table.setItem(row, 0, name)

            center = QTableWidgetItem()
            center.setData(Qt.DisplayRole, center_atom.atomspec)
            self.table.setItem(row, 1, center)

            ca = QTableWidgetItem()
            ca.setData(Qt.DisplayRole, "%.2f" % cone_angle)
            self.table.setItem(row, 2, ca)

            self.table.resizeColumnToContents(0)
            self.table.resizeColumnToContents(1)
            self.table.resizeColumnToContents(2)
示例#4
0
def fuseRing(session,
             selection=None,
             rings=None,
             newName=None,
             modify=True,
             minimize=False,
             available=False):
    if available:
        fuseRing_list(session)
        return

    if not selection:
        selection = selected_atoms(session)

    if not rings:
        session.logger.error("missing required \"rings\" argument")
        return

    if newName is None:
        pass
    elif any(len(name.strip()) > 4 for name in newName):
        raise RuntimeError("residue names must be 4 characters or less")
    elif not all(name.isalnum() for name in newName):
        raise RuntimeError("invalid residue name: %s" % newName)
    elif len(rings) != len(newName):
        raise RuntimeError(
            "number of substituents is not the same as the number of new names"
        )

    if len(selection) < 2:
        raise RuntimeWarning("two atoms must be selected per molecule")

    models = {}
    for atom in selection:
        if atom.structure not in models:
            models[atom.structure] = [atom]
        else:
            models[atom.structure].append(atom)

        if len(models[atom.structure]) > 2:
            raise RuntimeError("only two atoms can be selected on any model")

    first_pass = True
    new_structures = []
    for i, ringname in enumerate(rings):
        ringname = ringname.strip()

        for model in models:
            atom1 = models[model][0]
            atom2 = models[model][1]
            if modify and first_pass:
                convert = minimal_ring_convert(model, *models[model])
                if newName is not None:
                    for res in convert:
                        res.name = newName[i]

                rescol = ResidueCollection(model, convert_residues=convert)

                target = rescol.find(
                    [AtomSpec(atom1.atomspec),
                     AtomSpec(atom2.atomspec)])

            elif modify and not first_pass:
                raise RuntimeError("only the first model can be replaced")
            else:
                model_copy = model.copy()
                a1 = model_copy.atoms[model.atoms.index(models[model][0])]
                a2 = model_copy.atoms[model.atoms.index(models[model][1])]
                convert = minimal_ring_convert(model_copy, a1, a2)
                if newName is not None:
                    for res in convert:
                        res.name = newName[i]

                rescol = ResidueCollection(model_copy,
                                           convert_residues=convert)

                target = rescol.find(
                    [AtomSpec(a1.atomspec),
                     AtomSpec(a2.atomspec)])

            rescol.ring_substitute(target, ringname, minimize=minimize)

            if modify:
                rescol.update_chix(model)
            else:
                rescol.update_chix(model_copy)
                new_structures.append(model_copy)

        first_pass = False

    if not modify:
        session.models.add(new_structures)
示例#5
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
示例#6
0
def ligandSterimol(session,
                   selection,
                   radii="UMN",
                   showVectors=True,
                   showRadii=True,
                   at_L=None,
                   bisect_L=False,
                   return_values=False):
    models, center, key_atoms = avoidTargets(session.logger, selection)

    radii = radii.lower()

    targets = []
    coord_atoms = []
    datas = []

    info = "<pre>model\tcoord. atoms\tB1\tB2\tB3\tB4\tB5\tL\n"

    # if return_values:
    # if len(models.keys()) > 1:
    #     raise RuntimeError("only one substituent may be selected")

    # if any(len(models[key]) > 1 for key in models.keys()):
    #     raise RuntimeError("only one substituent may be selected")

    for model in models:
        rescol = ResidueCollection(model)
        comp_atoms = [AtomSpec(at.atomspec) for at in models[model]]
        key_atomspec = [AtomSpec(at.atomspec) for at in key_atoms[model]]
        center_atomspec = [AtomSpec(at.atomspec) for at in center[model]]
        if len(center_atomspec) != 1:
            session.logger.error(
                "ligand sterimol requires one central atom to which " + \
                "the ligand is coordinated\n" + \
                "%i were found on model %s:\n" % (len(center_atomspec), model.atomspec) + \
                "\n".join([at.atomspec for at in center[model]])
            )
            continue

        comp = Component(
            rescol.find(comp_atoms),
            to_center=rescol.find(center_atomspec),
            key_atoms=rescol.find(key_atomspec),
        )

        data = comp.sterimol(
            return_vector=True,
            radii=radii,
            at_L=at_L,
            to_center=rescol.find(center_atomspec),
            bisect_L=bisect_L,
        )
        l = np.linalg.norm(data["L"][1] - data["L"][0])
        b1 = np.linalg.norm(data["B1"][1] - data["B1"][0])
        b2 = np.linalg.norm(data["B2"][1] - data["B2"][0])
        b3 = np.linalg.norm(data["B3"][1] - data["B3"][0])
        b4 = np.linalg.norm(data["B4"][1] - data["B4"][0])
        b5 = np.linalg.norm(data["B5"][1] - data["B5"][0])

        if showVectors:
            for key, color in zip(
                ["B1", "B2", "B3", "B4", "B5", "L"],
                ["black", "green", "purple", "orange", "red", "blue"]):
                start, end = data[key]
                s = ".color %s\n" % color
                s += ".note Sterimol %s\n" % key
                s += ".arrow %6.3f %6.3f %6.3f   %6.3f %6.3f %6.3f\n" % (
                    *start, *end)

                stream = BytesIO(bytes(s, "utf-8"))
                bild_obj, status = read_bild(session, stream,
                                             "Sterimol %s" % key)

                session.models.add(bild_obj, parent=model)

        if showRadii:
            s = ".note radii\n"
            s += ".transparency 75\n"
            color = None
            for atom in comp.atoms:
                chix_atom = atom.chix_atom
                if radii == "umn":
                    r = VDW_RADII[chix_atom.element.name]
                elif radii == "bondi":
                    r = BONDI_RADII[chix_atom.element.name]

                if color is None or chix_atom.color != color:
                    color = chix_atom.color
                    rgb = [x / 255. for x in chix_atom.color]
                    rgb.pop(-1)

                    s += ".color %f %f %f\n" % tuple(rgb)

                s += ".sphere %f %f %f %f\n" % (*chix_atom.coord, r)

            stream = BytesIO(bytes(s, "utf-8"))
            bild_obj, status = read_bild(session, stream, "Sterimol radii")

            session.models.add(bild_obj, parent=model)

        name = get_filename(model.name, include_parent_dir=False)

        info += "%-16s\t%-11s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n" % (
            name, ", ".join(at.atomspec
                            for at in key_atoms[model]), b1, b2, b3, b4, b5, l)
        targets.append(name)
        coord_atoms.append([at.atomspec for at in key_atoms[model]])
        datas.append(data)

    info = info.strip()
    info += "</pre>"
    if not return_values:
        session.logger.info(info, is_html=True)

    if return_values:
        return targets, coord_atoms, datas
示例#7
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
示例#8
0
文件: libadd.py 项目: QChASM/SEQCROW
    def libadd_ligand(self):
        """add ligand to library or open it in a new model"""
        selection = selected_atoms(self.session)

        if not selection.single_structure:
            raise RuntimeError("selected atoms must be on the same model")

        rescol = ResidueCollection(selection[0].structure)
        ligand_atoms = [
            atom for atom in rescol.atoms if atom.chix_atom in selection
        ]

        key_chix_atoms = [
            atom for atom in self.key_atomspec if not atom.deleted
        ]
        if len(key_chix_atoms) < 1:
            key_atoms = set([])
            for atom in ligand_atoms:
                for atom2 in atom.connected:
                    if atom2 not in ligand_atoms:
                        key_atoms.add(atom)

        else:
            key_atoms = rescol.find(
                [AtomSpec(atom.atomspec) for atom in key_chix_atoms])

        if len(key_atoms) < 1:
            raise RuntimeError("no key atoms could be determined")

        lig_name = self.ligand_name.text()
        ligand = Component(ligand_atoms, name=lig_name, key_atoms=key_atoms)
        ligand.comment = "K:%s" % ",".join(
            [str(ligand.atoms.index(atom) + 1) for atom in key_atoms])

        if len(lig_name) == 0:
            chimerax_ligand = ResidueCollection(ligand).get_chimera(
                self.session)
            chimerax_ligand.name = "ligand preview"
            self.session.models.add([chimerax_ligand])
            bild_obj = key_atom_highlight(ligand, [0.2, 0.5, 0.8, 0.5],
                                          self.session)
            self.session.models.add(bild_obj, parent=chimerax_ligand)

        else:
            check_aaronlib_dir()
            filename = os.path.join(AARONLIB, "Ligands", lig_name + ".xyz")
            if os.path.exists(filename):
                exists_warning = QMessageBox()
                exists_warning.setIcon(QMessageBox.Warning)
                exists_warning.setText(
                    "%s already exists.\nWould you like to overwrite?" %
                    filename)
                exists_warning.setStandardButtons(QMessageBox.Yes
                                                  | QMessageBox.No)

                rv = exists_warning.exec_()
                if rv == QMessageBox.Yes:
                    ligand.write(outfile=filename)
                    self.tool_window.status("%s added to ligand library" %
                                            lig_name)

                else:
                    self.tool_window.status(
                        "%s has not been added to ligand library" % lig_name)

            else:
                ligand.write(outfile=filename)
                self.tool_window.status("%s added to ligand library" %
                                        lig_name)
示例#9
0
    def do_maplig(self):
        lignames = self.ligname.text()
        selection = selected_atoms(self.session)
        
        if len(selection) < 1:
            raise RuntimeWarning("nothing selected")
        
        models = {}
        for atom in selection:
            if atom.structure not in models:
                models[atom.structure] = [AtomSpec(atom.atomspec)]
            else:
                models[atom.structure].append(AtomSpec(atom.atomspec))        
        
        first_pass = True
        new_structures = []
        for ligname in lignames.split(','):
            ligname = ligname.strip()
            lig = Component(ligname)
            for model in models:
                if self.close_previous_bool and first_pass:
                    rescol = ResidueCollection(model)
                elif self.close_previous_bool and not first_pass:
                    raise RuntimeError("only the first model can be replaced")
                else:
                    model_copy = model.copy()
                    rescol = ResidueCollection(model_copy)
                    for i, atom in enumerate(model.atoms):
                        rescol.atoms[i].atomspec = atom.atomspec
                        rescol.atoms[i].add_tag(atom.atomspec)
                        rescol.atoms[i].chix_atom = atom

                target = rescol.find(models[model])
                if len(target) % len(lig.key_atoms) == 0:
                    k = 0
                    ligands = []
                    while k != len(target):
                        res_lig = ResidueCollection(lig.copy(), comment=lig.comment)
                        res_lig.parse_comment()
                        res_lig = Component(res_lig, key_atoms = ",".join([str(k + 1) for k in res_lig.other["key_atoms"]]))
                        ligands.append(res_lig)
                        k += len(lig.key_atoms)
                else:
                    raise RuntimeError("number of key atoms no not match: %i now, new ligand has %i" % (len(target), len(lig.key_atoms)))
                
                rescol.map_ligand(ligands, target)

                for center_atom in rescol.center:
                    center_atom.connected = set([])
                    for atom in rescol.atoms:
                        if atom not in rescol.center:
                            if center_atom.is_connected(atom):
                                atom.connected.add(center_atom)
                                center_atom.connected.add(atom)
                
                if self.close_previous_bool:    
                    rescol.update_chix(model)
                else:
                    struc = rescol.get_chimera(self.session)
                    new_structures.append(struc)
            
            first_pass = False
        
        if not self.close_previous_bool:
            self.session.models.add(new_structures)