modules/pymol/querying.py (1,270 lines of code) (raw):

#A* ------------------------------------------------------------------- #B* This file contains source code for the PyMOL computer program #C* Copyright (c) Schrodinger, LLC. #D* ------------------------------------------------------------------- #E* It is unlawful to modify or remove this copyright notice. #F* ------------------------------------------------------------------- #G* Please see the accompanying LICENSE file for further information. #H* ------------------------------------------------------------------- #I* Additional authors of this source file include: #-* #-* #-* #Z* ------------------------------------------------------------------- from __future__ import print_function if __name__=='pymol.querying': import time from . import selector import pymol cmd = __import__("sys").modules["pymol.cmd"] from .cmd import _cmd,lock,unlock,Shortcut, \ _feedback,fb_module,fb_mask,is_list, \ DEFAULT_ERROR, DEFAULT_SUCCESS, _raising, is_ok, is_error def auto_measure(_self=cmd): lst = _self.get_names("selections") if "pk1" in lst: if "pk2" in lst: if "pk3" in lst: if "pk4" in lst: _self.dihedral() else: _self.angle() else: _self.distance() _self.unpick() def get_volume_field(objName, state=1, copy=1, _self=cmd): ''' DESCRIPTION EXPERIMENTAL AND SUBJECT TO CHANGE - DO NOT USE API only. Get the raw data of a map or volume object. ARGUMENTS objName = str: object name state = int: state index {default: 1} copy = 0/1: {default: 1} WARNING: only use copy=0 if you know what you're doing. copy=0 will return a numpy array which is a wrapper of the internal memory. If the internal memory gets freed or reallocated, this wrapper will become invalid. ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _self._cmd.get_volume_field(_self._COb, objName, int(state) - 1, int(copy)) finally: _self.unlock(r,_self) return r def get_volume_histogram(objName, bins=64, range=None, _self=cmd): ''' DESCRIPTION API ONLY. Get min, max, mean, stdev and histogram of a map or volume object as a list of length bins + 4. ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _self._cmd.get_volume_histogram(_self._COb,objName, int(bins), range or (0., 0.)) finally: _self.unlock(r,_self) return r def get_unused_name(prefix="tmp",alwaysnumber=1,_self=cmd): r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_unused_name(_self._COb, prefix, alwaysnumber) finally: _self.unlock(r,_self) return r def get_modal_draw(_self=cmd,quiet=1): r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_modal_draw(_self._COb) finally: _self.unlock(r,_self) return r def get_drag_object_name(_self=cmd): r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_drag_object_name(_self._COb) finally: _self.unlock(r,_self) return r def get_object_matrix(object,state=1, incl_ttt=1, _self=cmd): ''' DESCRIPTION "get_object_matrix" is an unsupported command that may have something to do with querying the transformation matrices associated with an object ''' r = DEFAULT_ERROR object = str(object) try: _self.lock(_self) r = _cmd.get_object_matrix(_self._COb,str(object), int(state)-1, int(incl_ttt)) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_object_ttt(object, quiet=1, _self=cmd): ''' DESCRIPTION "get_object_ttt" is an unsupported command ''' quiet = int(quiet) with _self.lockcm: r = _cmd.get_object_ttt(_self._COb, str(object), -1, quiet) if not quiet: if r is None: print('TTT is None') else: for i in range(4): if i == 3: print('TTT ---------------------------+---------') print('TTT %8.2f %8.2f %8.2f | %8.2f' % tuple(r[i * 4:i * 4 + 4])) return r def get_object_settings(object, state=0, quiet=1, _self=cmd): ''' DESCRIPTION "get_object_settings" is an unsupported command ''' with _self.lockcm: r = _cmd.get_object_settings(_self._COb, str(object), int(state) - 1) return r def get_object_list(selection="(all)", quiet=1, _self=cmd): ''' DESCRIPTION "get_object_list" is an unsupported command that may have something to do with querying the objects covered by a selection. ''' r = DEFAULT_ERROR selection = selector.process(selection) try: _self.lock(_self) r = _cmd.get_object_list(_self._COb,str(selection)) if not quiet: if(is_list(r)): print(" get_object_list: ",str(r)) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_symmetry(selection="(all)",state=-1,quiet=1,_self=cmd): ''' DESCRIPTION "get_symmetry" can be used to obtain the crystal and spacegroup parameters for a molecule or map. USAGE get_symmetry object-name-or-selection PYMOL API cmd.get_symmetry(string selection, int state, int quiet) ''' r = DEFAULT_ERROR selection = selector.process(selection) try: _self.lock(_self) r = _cmd.get_symmetry(_self._COb,str(selection),int(state)) if not quiet: if(is_list(r)): if(len(r)): print(" get_symmetry: A = %7.3f B = %7.3f C = %7.3f"%tuple(r[0:3])) print(" get_symmetry: Alpha = %7.3f Beta = %7.3f Gamma = %7.3f"%tuple(r[3:6])) print(" get_symmetry: SpaceGroup = %s"%r[6]) else: print(" get_symmetry: No symmetry defined.") finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_title(object, state, quiet=1, _self=cmd): ''' DESCRIPTION "get_title" retrieves a text string to the state of a particular object which will be displayed when the state is active. USAGE set_title object, state PYMOL API cmd.set_title(string object, int state, string text) ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_title(_self._COb,str(object),int(state)-1) if not quiet: if r!=None: print(" get_title: %s"%r) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def angle(name=None, selection1="(pk1)", selection2="(pk2)", selection3="(pk3)", mode=None, label=1, reset=0, zoom=0, state=0, quiet=1, _self=cmd, state1=-3, state2=-3, state3=-3): ''' DESCRIPTION "angle" shows the angle formed between any three atoms. USAGE angle [ name [, selection1 [, selection2 [, selection3 ]]]] NOTES "angle" alone will show the angle angle formed by selections (pk1), (pk2), (pk3) which can be set using the "PkAt" mouse action (typically, Ctrl-middle-click) PYMOL API cmd.angle(string name, string selection1, string selection2, string selection3) SEE ALSO distance, dihedral ''' r = DEFAULT_SUCCESS if selection1=="(pk1)": if "pk1" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk1' selection is undefined.") r = DEFAULT_ERROR if selection2=="(pk2)": if "pk2" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk2' selection is undefined.") r = DEFAULT_ERROR if selection3=="(pk3)": if "pk3" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk3' selection is undefined.") r = DEFAULT_ERROR if is_ok(r): r = DEFAULT_ERROR # if unlabeled, then get next name in series if name!=None: nam=name else: try: _self.lock(_self) cnt = _self.get_setting_int("dist_counter") + 1 r = _self.set("dist_counter", cnt) nam = "angle%02.0f" % cnt finally: _self.unlock(r,_self) # defaults if mode == None: mode = 0 # preprocess selections selection1 = selector.process(selection1) selection2 = selector.process(selection2) selection3 = selector.process(selection3) # now do the deed try: _self.lock(_self) if selection2!="same": selection2 = "("+selection2+")" if selection3!="same": selection3 = "("+selection3+")" r = _cmd.angle(_self._COb,str(nam),"("+str(selection1)+")", str(selection2), str(selection3), int(mode),int(label),int(reset), int(zoom),int(quiet),int(state)-1, int(state1)-1, int(state2)-1, int(state3)-1) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def dihedral(name=None, selection1="(pk1)", selection2="(pk2)", selection3="(pk3)", selection4="(pk4)", mode=None, label=1, reset=0, zoom=0, state=0, quiet=1, _self=cmd): ''' DESCRIPTION "dihedral" shows dihedral angles formed between any four atoms. USAGE dihedral [ name [, selection1 [, selection2 [, selection3 [, selection4 ]]]]] NOTES "dihedral" alone will show the dihedral angle formed by selections (pk1), (pk2), (pk3), and (pk4), which can be set using the "PkAt" mouse action (typically, Ctrl-middle-click) PYMOL API cmd.dihedral(string name, string selection1, string selection2, string selection3, string selection4) SEE ALSO distance, angle ''' r = DEFAULT_SUCCESS if selection1=="(pk1)": if "pk1" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk1' selection is undefined.") r = DEFAULT_ERROR if selection2=="(pk2)": if "pk2" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk2' selection is undefined.") r = DEFAULT_ERROR if selection3=="(pk3)": if "pk3" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk3' selection is undefined.") r = DEFAULT_ERROR if selection3=="(pk4)": if "pk4" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk4' selection is undefined.") r = DEFAULT_ERROR if is_ok(r): r = DEFAULT_ERROR # if unlabeled, then get next name in series if name!=None: nam=name else: try: _self.lock(_self) cnt = _self.get_setting_int("dist_counter") + 1 r = _self.set("dist_counter", cnt) nam = "dihedral%02.0f" % cnt finally: _self.unlock(r,_self) # defaults if mode == None: mode = 0 # preprocess selections selection1 = selector.process(selection1) selection2 = selector.process(selection2) selection3 = selector.process(selection3) selection4 = selector.process(selection4) # now do the deed try: _self.lock(_self) if selection2!="same": selection2 = "("+selection2+")" if selection3!="same": selection3 = "("+selection3+")" if selection4!="same": selection4 = "("+selection4+")" r = _cmd.dihedral(_self._COb,str(nam),"("+str(selection1)+")", str(selection2), str(selection3), str(selection4), int(mode),int(label), int(reset),int(zoom), int(quiet),int(state)-1) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def distance(name=None, selection1="(pk1)", selection2="(pk2)", cutoff=None, mode=None, zoom=0, width=None, length=None, gap=None, label=1, quiet=1, reset=0, state=0, state1=-3, state2=-3, _self=cmd): ''' DESCRIPTION "distance" creates a new distance object between two selections. USAGE distance [name [, selection1 [, selection2 [, cutoff [, mode ]]]]] ARGUMENTS name = string: name of the distance object to create selection1 = string: first atom selection selection2 = string: second atom selection cutoff = float: longest distance to show mode = 0: all interatomic distances mode = 1: only bond distances mode = 2: only show polar contact distances mode = 3: like mode=0, but use distance_exclusion setting mode = 4: distance between centroids (does not support dynamic_measures; new in PyMOL 1.8.2) state = int: object state to create the measurement object in and to get coordinates from {default: 0 (all states)} state1, state2 = int: overrule 'state' argument to measure distances between different states {default: use state} EXAMPLES distance mydist, 14/CA, 29/CA distance hbonds, all, all, 3.2, mode=2 NOTES The distance wizard makes measuring distances easier than using the "dist" command for real-time operations. "dist" alone will show distances between selections (pk1) and (pk1), which can be set using the PkAt mouse action (usually CTRL-middle-click). PYMOL API cmd.distance(string name, string selection1, string selection2, string cutoff, string mode ) ''' # handle unnamed distance r = DEFAULT_SUCCESS if name!=None: if len(name): if name[0]=='(' or ' ' in name or '/' in name: # we're one argument off... if cutoff!=None: mode = cutoff if selection2!="(pk2)": cutoff = selection2 if selection1!="(pk1)": selection2 = selection1 selection1=name name = None if selection1=="(pk1)": if "pk1" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk1' selection is undefined.") r = DEFAULT_ERROR if selection2=="(pk2)": if "pk2" not in _self.get_names('selections'): if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: The 'pk2' selection is undefined.") r = DEFAULT_ERROR if is_ok(r): r = DEFAULT_ERROR # if unlabeled, then get next name in series if name!=None: nam=name else: try: _self.lock(_self) cnt = _self.get_setting_int("dist_counter") + 1 r = _self.set("dist_counter", cnt) nam = "dist%02.0f" % cnt finally: _self.unlock(r,_self) # defaults if mode == None: mode = 0 if cutoff == None: cutoff = -1.0 # preprocess selections selection1 = selector.process(selection1) selection2 = selector.process(selection2) # now do the deed try: _self.lock(_self) if selection2!="same": selection2 = "("+selection2+")" r = _cmd.dist(_self._COb,str(nam),"("+str(selection1)+")", str(selection2),int(mode),float(cutoff), int(label),int(quiet),int(reset), int(state)-1,int(zoom), int(state1)-1, int(state2)-1) if width!=None: _self.set("dash_width",width,nam) if length!=None: _self.set("dash_length",length,nam) if gap!=None: _self.set("dash_gap",gap,nam) finally: _self.unlock(r,_self) if (r<0.0) and (not quiet): # a negative value is an warning signal from PyMOL... r = DEFAULT_ERROR if _raising(r,_self): raise pymol.CmdException return r # LEGACY support for cmd.dist dist = distance def get_povray(_self=cmd): ''' DESCRIPTION "get_povray" returns a tuple corresponding to strings for a PovRay input file. PYMOL API cmd.get_povray() ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_povray(_self._COb) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_idtf(quiet=1, _self=cmd): ''' DESCRIPTION "get_idft" is under development, but should eventually return an idtf file containing multiple objects and scenes. PYMOL API cmd.idtf() ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_idtf(_self._COb) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException if not quiet: fov = _self.get_setting_float("field_of_view") dist = _self.get_view()[11] print(" 3Daac=%3.1f, 3Droll=0, 3Dc2c=0 0 1, 3Droo=%1.2f, 3Dcoo=0 0 %1.2f" % (fov, -dist, dist)) return r def get_mtl_obj(_self=cmd): ''' DESCRIPTION NOTE: this is an incomplete and unsupported feature. "get_mtl_obj" returns a tuple containing mtl and obj input files for use with Maya. PYMOL API cmd.get_obj_mtl() ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_mtl_obj(_self._COb) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_version(quiet=1,_self=cmd): ''' DESCRIPTION "get_version" returns a tuple of length six containing text, floating point, and integer representations of the current PyMOL version number, build date as unix timestamp, GIT SHA and SVN code revision so far available. PYMOL API cmd.get_version(int quiet) ''' # get_version doesn't need the _COb and doesn't require a lock r = _cmd.get_version() if _raising(r,_self): raise pymol.CmdException else: quiet = int(quiet) if quiet < 1 and _feedback(fb_module.cmd, fb_mask.results, _self): import re p = pymol.get_version_message(r) print(re.sub(r'^', ' ', p, re.M)) if quiet < 0: if r[3]: print(' build date:', time.strftime('%c %Z', time.localtime(r[3]))) if r[4]: print(' git sha:', r[4]) return r def get_vrml(version=2,_self=cmd): ''' DESCRIPTION "get_vrml" returns a VRML2 string representing the content currently displayed. PYMOL API cmd.get_vrml() ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_vrml(_self._COb,int(version)) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_collada(version=2, _self=cmd): ''' DESCRIPTION "get_collada" returns a COLLADA string representing the content currently displayed. PYMOL API cmd.get_collada() ''' r = DEFAULT_ERROR with _self.lockcm: r = _cmd.get_collada(_self._COb,int(version)) if _raising(r,_self): raise pymol.CmdException return r def count_states(selection="(all)", quiet=1, _self=cmd): ''' DESCRIPTION "count_states" returns the number of states in the selection. USAGE count_states PYMOL API cmd.count_states(string selection) SEE ALSO frame ''' # preprocess selection selection = selector.process(selection) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.count_states(_self._COb,selection) finally: _self.unlock(r,_self) if is_ok(r): if not quiet: print(" cmd.count_states: %d states."%r) if _raising(r,_self): raise pymol.CmdException return r def get_movie_length(quiet=1, images=-1, _self=cmd): ''' DESCRIPTION "get_movie_length" returns the number of frames explicitly defined in the movie, not including molecular states. PYMOL API cmd.count_frames() SEE ALSO frame, count_states, count_frames ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_movie_length(_self._COb) if r<0: if images==0: r = 0 elif images<0: r = -r if images == 1: if r>0: r = 0 if r>=0 and not quiet: print(" cmd.get_movie_length: %d frames"%r) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def count_frames(quiet=1, _self=cmd): ''' DESCRIPTION "count_frames" returns the number of frames defined for the PyMOL movie. USAGE count_frames PYMOL API cmd.count_frames() SEE ALSO frame, count_states ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.count_frames(_self._COb) if not quiet: print(" cmd.count_frames: %d frames"%r) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def export_dots(object,state,_self=cmd): ''' DESCRIPTION "export_dots" is an old unsupported command that may have something to do with returning the coordinates of the dot representation back to the Python layer. ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.export_dots(_self._COb,object,int(state)-1) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def overlap(selection1, selection2, state1=1, state2=1, adjust=0.0, quiet=1, _self=cmd): ''' DESCRIPTION "overlap" is an unsupported command that sums up [(VDWi + VDWj) - distance_ij]/2 between pairs of selected atoms. PYMOL API cmd.overlap(string selection1, string selection2 [, int state1=1, int state2=1, float adjust=0.0]) NOTES It does not compute the volume overlap, selections with more atoms will have a larger sum. ''' # preprocess selections selection1 = selector.process(selection1) selection2 = selector.process(selection2) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.overlap(_self._COb,str(selection1),str(selection2), int(state1)-1,int(state2)-1, float(adjust)) if not quiet: print(" cmd.overlap: %5.3f Angstroms."%r) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_movie_locked(_self=cmd): r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_movie_locked(_self._COb) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_object_color_index(name,_self=cmd): name = str(name) r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_object_color_index(_self._COb,name) finally: _self.unlock(r,_self) # if _raising(r,_self): raise pymol.CmdException return r def get_color_tuple(name,mode=0,_self=cmd): name=str(name) r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_color(_self._COb,name,mode) if r==None: if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: Unknown color '%s'."%name) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_color_indices(all=0,_self=cmd): r = DEFAULT_ERROR try: _self.lock(_self) if all: r = _cmd.get_color(_self._COb,'',2) else: r = _cmd.get_color(_self._COb,'',1) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_color_index(color,_self=cmd): r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_color(_self._COb,str(color),3) finally: _self.unlock(r,_self) return r def get_renderer(quiet=1, _self=cmd): ''' DESCRIPTION Prints OpenGL renderer information. ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_renderer(_self._COb) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException if not int(quiet): print(" OpenGL graphics engine:") print(" GL_VENDOR: ", r[0]) print(" GL_RENDERER: ", r[1]) print(" GL_VERSION: ", r[2]) return r def get_phipsi(selection="(name CA)",state=-1,_self=cmd): # preprocess selections selection = selector.process(selection) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_phipsi(_self._COb,"("+str(selection)+")",int(state)-1) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_atom_coords(selection, state=0,quiet=1,_self=cmd): ''' DESCRIPTION "get_atom_coords" returns the 3D coordinates of a single atom. ''' # low performance way to get coords for a single atom r = [] selection = selector.process(selection) try: _self.lock(_self) r = _cmd.get_atom_coords(_self._COb,str(selection),int(state)-1,int(quiet)) finally: _self.unlock(r,_self) if r==None: if _self._raising(_self=_self): raise pymol.CmdException elif not quiet: for a in r: print(" cmd.get_atom_coords: [%8.3f,%8.3f,%8.3f]"%(a)) if _raising(r,_self): raise pymol.CmdException return r def get_coords(selection='all', state=1, quiet=1, _self=cmd): ''' DESCRIPTION API only. Get selection coordinates as numpy array. ARGUMENTS selection = str: atom selection {default: all} state = int: state index or all states if state=0 {default: 1} ''' selection = selector.process(selection) with _self.lockcm: r = _cmd.get_coords(_self._COb, selection, int(state) - 1) return r def get_coordset(name, state=1, copy=1, quiet=1, _self=cmd): ''' DESCRIPTION API only. Get object coordinates as numpy array. ARGUMENTS selection = str: atom selection {default: all} state = int: state index {default: 1} copy = 0/1: {default: 1} WARNING: only use copy=0 if you know what you're doing. copy=0 will return a numpy array which is a wrapper of the internal coordinate set memory. If the internal memory gets freed or reallocated, this wrapper will become invalid. ''' with _self.lockcm: r = _cmd.get_coordset(_self._COb, name, int(state) - 1, int(copy)) return r def get_position(quiet=1, _self=cmd): ''' DESCRIPTION "get_position" returns the 3D coordinates of the center of the viewer window. ''' try: _self.lock(_self) r = _cmd.get_position(_self._COb) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException elif not quiet: print(" cmd.get_position: [%8.3f,%8.3f,%8.3f]"%(r[0],r[1],r[2])) return r def get_distance(atom1="pk1",atom2="pk2",state=-1,quiet=1,_self=cmd): ''' DESCRIPTION "get_distance" returns the distance between two atoms. By default, the coordinates used are from the current state, however an alternate state identifier can be provided. USAGE get_distance atom1, atom2, [,state ] EXAMPLES get_distance 4/n,4/c get_distance 4/n,4/c,state=4 PYMOL API cmd.get_distance(atom1="pk1",atom2="pk2",state=-1) ''' r = DEFAULT_ERROR # preprocess selections atom1 = selector.process(atom1) atom2 = selector.process(atom2) # r = None try: _self.lock(_self) r = _cmd.get_distance(_self._COb,str(atom1),str(atom2),int(state)-1) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException elif not quiet: print(" cmd.get_distance: %5.3f Angstroms."%r) return r def get_angle(atom1="pk1",atom2="pk2",atom3="pk3",state=-1,quiet=1,_self=cmd): ''' DESCRIPTION "get_angle" returns the angle between three atoms. By default, the coordinates used are from the current state, however an alternate state identifier can be provided. USAGE get_angle atom1, atom2, atom3, [,state ] EXAMPLES get_angle 4/n,4/c,4/ca get_angle 4/n,4/c,4/ca,state=4 PYMOL API cmd.get_angle(atom1="pk1",atom2="pk2",atom3="pk3",state=-1) ''' # preprocess selections atom1 = selector.process(atom1) atom2 = selector.process(atom2) atom3 = selector.process(atom3) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_angle(_self._COb,str(atom1),str(atom2),str(atom3),int(state)-1) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException elif not quiet: print(" cmd.get_angle: %5.3f degrees."%r) return r def get_dihedral(atom1="pk1",atom2="pk2",atom3="pk3",atom4="pk4",state=-1,quiet=1,_self=cmd): ''' DESCRIPTION "get_dihedral" returns the dihedral angle between four atoms. By default, the coordinates used are from the current state, however an alternate state identifier can be provided. By convention, positive dihedral angles are right-handed (looking down the atom2-atom3 axis). USAGE get_dihedral atom1, atom2, atom3, atom4 [,state ] EXAMPLES get_dihedral 4/n,4/c,4/ca,4/cb get_dihedral 4/n,4/c,4/ca,4/cb,state=4 PYMOL API cmd.get_dihedral(atom1,atom2,atom3,atom4,state=-1) ''' # preprocess selections atom1 = selector.process(atom1) atom2 = selector.process(atom2) atom3 = selector.process(atom3) atom4 = selector.process(atom4) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_dihe(_self._COb,str(atom1),str(atom2),str(atom3),str(atom4),int(state)-1) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException elif not quiet: print(" cmd.get_dihedral: %5.3f degrees."%r) return r def get_model(selection="(all)",state=1,ref='',ref_state=0,_self=cmd): ''' DESCRIPTION "get_model" returns a ChemPy "Indexed" format model from a selection. PYMOL API cmd.get_model(string selection [,int state] ) ''' # preprocess selection selection = selector.process(selection) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_model(_self._COb,"("+str(selection)+")",int(state)-1,str(ref),int(ref_state)-1) if r==None: r = DEFAULT_ERROR finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_bonds(selection="(all)", state=-1, _self=cmd): ''' DESCRIPTION Get a list of (atm1, atm2, order) tuples. SEE ALSO cmd.get_model().bond ''' with _self.lockcm: r = _cmd.get_bonds(_self._COb, selection, int(state)) return r def get_area(selection="(all)",state=1,load_b=0,quiet=1,_self=cmd): ''' DESCRIPTION Get the surface area of an selection. Depends on the "dot_solvent" setting. With "dot_solvent=off" (default) it calculates the solvent excluded surface area, else the surface accessible surface. USAGE get_area [ selection [, state [, load_b ]]] ARGUMENTS load_b = bool: store per-atom surface area in b-factors {default: 0} SEE ALSO "dot_solvent" setting, "dots" representation (show dots) ''' # preprocess selection selection = selector.process(selection) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_area(_self._COb,"("+str(selection)+")",int(state)-1,int(load_b)) finally: _self.unlock(r,_self) if r<0.0: # negative area signals error condition if _self._raising(): raise pymol.CmdException elif not quiet: print(" cmd.get_area: %5.3f Angstroms^2."%r) return r def get_chains(selection="(all)",state=0,quiet=1,_self=cmd): ''' DESCRIPTION Print the list of chain identifiers in the given selection. USAGE get_chains [ selection [, state ]] ARGUMENTS selection = str: atom selection {default: all} state = int: CURRENTLY IGNORED ''' # preprocess selection selection = selector.process(selection) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_chains(_self._COb,"("+str(selection)+")",int(state)-1) finally: _self.unlock(r,_self) if r==None: return [] if _raising(r,_self): raise pymol.CmdException elif not quiet: print(" cmd.get_chains: ",str(r)) return r def get_names(type='public_objects',enabled_only=0,selection="",_self=cmd): ''' DESCRIPTION "get_names" returns a list of object and/or selection names. PYMOL API cmd.get_names( [string: "objects"|"selections"|"all"|"public_objects"|"public_selections"] ) NOTES The default behavior is to return only object names. SEE ALSO get_type, count_atoms, count_states ''' selection = selector.process(selection) r = DEFAULT_ERROR # this needs to be replaced with a flag & masking scheme... mode = 1 if type=='objects': mode = 1 elif type=='selections': mode = 2 elif type=='all': mode = 0 elif type=='public': mode = 3 elif type=='public_objects': mode = 4 elif type=='public_selections': mode = 5 elif type=='public_nongroup_objects': mode = 6 elif type=='public_group_objects': mode = 7 elif type=='nongroup_objects': mode = 8 elif type=='group_objects': mode = 9 else: print("Error: unknown type: '%s'"%str(type)) if _raising(-1,_self): raise pymol.CmdException try: _self.lock(_self) r = _cmd.get_names(_self._COb,int(mode),int(enabled_only),str(selection)) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_legal_name(name,_self=cmd): r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_legal_name(_self._COb,str(name)) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_type(name,quiet=1,_self=cmd): ''' DESCRIPTION "get_type" returns a string describing the named object or selection or the string "nonexistent" if the name in unknown. PYMOL API cmd.get_type(string object-name) NOTES Possible return values are "object:molecule" "object:map" "object:mesh" "object:slice" "object:surface" "object:measurement" "object:cgo" "object:group" "object:volume" "selection" SEE ALSO get_names ''' r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_type(_self._COb,str(name)) finally: _self.unlock(r,_self) if is_error(r): if not quiet and _feedback(fb_module.cmd,fb_mask.errors,_self): print("Cmd-Error: unrecognized name.") elif not quiet: print(r) if _raising(r,_self): raise pymol.CmdException return r def id_atom(selection,mode=0,quiet=1,_self=cmd): ''' DESCRIPTION "id_atom" returns the original source id of a single atom, or raises and exception if the atom does not exist or if the selection corresponds to multiple atoms. PYMOL API list = cmd.id_atom(string selection) ''' r = DEFAULT_ERROR selection = str(selection) l = identify(selection, mode) ll = len(l) if not ll: if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: atom %s not found by id_atom." % selection) if _self._raising(_self=_self): raise pymol.CmdException elif ll>1: if _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: multiple atoms %s found by id_atom." % selection) if _self._raising(_self=_self): raise pymol.CmdException else: r = l[0] if not quiet: if mode: print(" cmd.id_atom: (%s and id %d)"%(r[0],r[1])) else: print(" cmd.id_atom: (id %d)"%r) if _raising(r,_self): raise pymol.CmdException return r def identify(selection="(all)",mode=0,quiet=1,_self=cmd): ''' DESCRIPTION "identify" returns a list of atom IDs corresponding to the ID code of atoms in the selection. PYMOL API list = cmd.identify(string selection="(all)",int mode=0) NOTES mode 0: only return a list of identifiers (default) mode 1: return a list of tuples of the object name and the identifier ''' # preprocess selection selection = selector.process(selection) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.identify(_self._COb,"("+str(selection)+")",int(mode)) # 0 = default mode finally: _self.unlock(r,_self) if is_list(r): if len(r): if not quiet: if mode: for a in r: print(" cmd.identify: (%s and id %d)"%(a[0],a[1])) else: for a in r: print(" cmd.identify: (id %d)"%a) if _raising(r,_self): raise pymol.CmdException return r def index(selection="(all)",quiet=1,_self=cmd): ''' DESCRIPTION "index" returns a list of tuples corresponding to the object name and index of the atoms in the selection. PYMOL API list = cmd.index(string selection="(all)") NOTE Atom indices are fragile and will change as atoms are added or deleted. Whenever possible, use integral atom identifiers instead of indices. ''' # preprocess selection selection = selector.process(selection) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.index(_self._COb,"("+str(selection)+")",0) # 0 = default mode finally: _self.unlock(r,_self) if not quiet: if is_list(r): if len(r): for a in r: print(" cmd.index: (%s`%d)"%(a[0],a[1])) if _raising(r,_self): raise pymol.CmdException return r def find_pairs(selection1,selection2,state1=1,state2=1,cutoff=3.5,mode=0,angle=45,_self=cmd): ''' DESCRIPTION API only function. Returns a list of atom pairs. Atoms are represented as (model,index) tuples. Can be restricted to hydrogen-bonding-like contacts. WARNING: Only checks atom orientation, not atom type (so would hydrogen bond between carbons for example), so make sure to provide appropriate atom selections. ARGUMENTS selection1, selection2 = string: atom selections state1, state2 = integer: state-index (only positive values allowed) {default: 1} cutoff = float: distance cutoff {default: 3.5} mode = integer: if mode=1, do coarse hydrogen bonding assessment {default: 0} angle = float: hydrogen bond angle cutoff, only if mode=1 {default: 45.0} NOTE Although this does a similar job like "distance", it uses a completely different routine and the "mode" argument has different meanings! ''' # preprocess selection selection1 = selector.process(selection1) selection2 = selector.process(selection2) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.find_pairs(_self._COb,"("+str(selection1)+")", "("+str(selection2)+")", int(state1)-1,int(state2)-1, int(mode),float(cutoff),float(angle)) # 0 = default mode finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_extent(selection="(all)",state=0,quiet=1,_self=cmd): ''' DESCRIPTION "get_extent" returns the minimum and maximum XYZ coordinates of a selection as an array: [ [ min-X , min-Y , min-Z ],[ max-X, max-Y , max-Z ]] PYMOL API cmd.get_extent(string selection="(all)", state=0 ) ''' # preprocess selection selection = selector.process(selection) # r = DEFAULT_ERROR try: _self.lock(_self) r = _cmd.get_min_max(_self._COb,str(selection),int(state)-1) finally: _self.unlock(r,_self) if not r: if _self._raising(_self=_self): raise pymol.CmdException elif not quiet: print(" cmd.extent: min: [%8.3f,%8.3f,%8.3f]"%(r[0][0],r[0][1],r[0][2])) print(" cmd.extent: max: [%8.3f,%8.3f,%8.3f]"%(r[1][0],r[1][1],r[1][2])) if _raising(r,_self): raise pymol.CmdException return r def phi_psi(selection="(byres pk1)", quiet=1, _self=cmd): ''' DESCRIPTION "phi_psi" return the phi and psi angles for a protein atom selection. USAGE ''' r = cmd.get_phipsi(selection) if r!=None: kees = list(r.keys()) kees.sort() if not quiet: _self.feedback('push') _self.feedback('disable','executive','actions') for a in kees: _self.iterate("(%s`%d)"%a,"print(' %-9s "+ ("( %6.1f, %6.1f )"%r[a])+ "'%(resn+'-'+resi+':'))") _self.feedback('pop') elif _feedback(fb_module.cmd,fb_mask.errors,_self): print("cmd-Error: can't compute phi_psi") if _raising(r,_self): raise pymol.CmdException return r def count_atoms(selection="(all)",quiet=1,state=0,domain='',_self=cmd): ''' DESCRIPTION "count_atoms" returns a count of atoms in a selection. USAGE count_atoms [ selection [, quiet [, state ]]] ''' r = DEFAULT_ERROR # preprocess selection selection = selector.process(selection) # try: _self.lock(_self) r = _cmd.select(_self._COb,"_count_tmp","("+str(selection)+")",1,int(state)-1,str(domain)) _cmd.delete(_self._COb,"_count_tmp") finally: _self.unlock(r,_self) if not quiet: print(" count_atoms: %d atoms"%r) if _raising(r,_self): raise pymol.CmdException return r def count_discrete(selection, quiet=1, _self=cmd): ''' DESCRIPTION Count the number of discrete objects in selection. USAGE count_discrete selection ''' with _self.lockcm: r = _cmd.count_discrete(_self._COb, str(selection)) if not int(quiet): print(' count_discrete: %d' % r) return r def get_names_of_type(type,public=1,_self=cmd): """ DESCRIPTION "get_names_of_type" will return a list of names for the given type. """ obj_type = "public_objects" if public==1 else "objects" types = [] mix = [] obj = None try: obj = _self.get_names(obj_type) except: pass if obj: try: types = list(map(_self.get_type,obj)) mix = list(zip(obj,types)) except: pass lst = [] for a in mix: if a[1]==type: lst.append(a[0]) return lst def get_raw_alignment(name='',active_only=0,_self=cmd): ''' DESCRIPTION "get_raw_alignment" returns a list of lists of (object,index) tuples containing the raw per-atom alignment relationships PYMOL API cmd.get_raw_alignment(name) ''' try: _self.lock(_self) r = _cmd.get_raw_alignment(_self._COb,str(name),int(active_only)) finally: _self.unlock(r,_self) if _raising(r,_self): raise pymol.CmdException return r def get_object_state(name, _self=cmd): ''' DESCRIPTION Returns the effective object state. ''' states = _self.count_states('%' + name) if states < 2 and _self.get_setting_boolean('static_singletons'): return 1 if _self.get_setting_int('all_states', name): return 0 state = _self.get_setting_int('state', name) if state > states: raise pymol.CmdException('Invalid state %d for object %s' % (state, name)) return state def get_selection_state(selection, _self=cmd): ''' DESCRIPTION Returns the effective object state for all objects in given selection. Raises exception if objects are in different states. ''' state_set = set(map(_self.get_object_state, _self.get_object_list('(' + selection + ')'))) if len(state_set) != 1: if len(state_set) == 0: return 1 raise pymol.CmdException('Selection spans multiple object states') return state_set.pop() def centerofmass(selection='(all)', state=-1, quiet=1, _self=cmd): ''' DESCRIPTION Calculates the center of mass. Considers atom mass and occupancy. ARGUMENTS selection = string: atom selection {default: all} state = integer: object state, -1 for current state, 0 for all states {default: -1} NOTES If occupancy is 0.0 for an atom, set it to 1.0 for the calculation (assume it was loaded from a file without occupancy information). SEE ALSO get_extent ''' from chempy import cpv state, quiet = int(state), int(quiet) if state < 0: state = _self.get_selection_state(selection) if state == 0: states = list(range(1, _self.count_states(selection)+1)) else: states = [state] com = cpv.get_null() totmass = 0.0 for state in states: model = _self.get_model(selection, state) for a in model.atom: m = a.get_mass() * (a.q or 1.0) com = cpv.add(com, cpv.scale(a.coord, m)) totmass += m if not totmass: raise pymol.CmdException('mass is zero') com = cpv.scale(com, 1./totmass) if not quiet: print(' Center of Mass: [%8.3f,%8.3f,%8.3f]' % tuple(com)) return com def cif_get_array(name, key, dtype="s", quiet=1, _self=cmd): ''' DESCRIPTION EXPERIMENTAL AND SUBJECT TO CHANGE! ARGUMENTS name = string: object name key = CIF data item name in lower case dtype = str: "s" (str), "i" (int) or "f" (float) ''' with _self.lockcm: r = _cmd.cif_get_array(_self._COb, name, key, dtype) if r and not int(quiet): n = len(r) r_print = r if n < 10 else (r[:9] + ['... (%d more items)' % (n - 9)]) print(" %s:" % (key), ', '.join(map(str, r_print))) return r def get_assembly_ids(name, quiet=1, _self=cmd): ''' DESCRIPTION EXPERIMENTAL AND SUBJECT TO CHANGE! Get the list of assembly ids for an object loaded from mmCIF. ''' r = cif_get_array(name, "_pdbx_struct_assembly.id", _self=_self) if r and not int(quiet): print(" Assembly IDs: %s" % ', '.join(r)) return r