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
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