CollapseSel
From PyMOLWiki
Overview
CollapseSel is a small utility function to compress strings for selections. So, if you have a selection with residues 1+2+3+4+20+21+22+100-120 this will return, 1-4+20-22+100-120.
CollapseIDs is a small utility function to compress strings for an array of IDs. This does NOT have the logic for detecting duplicates, CollapseSel does.
Example
run /dir/to/collapseSel.py fetch 1cll select EE, resn GLU print collapseSel("EE") # # and PyMOL should output: # # 6-7+11+14+31+45+47+54+67+82-84+87+104+114+119-120+123+127+139-140 #
The Code
import pymol from pymol import stored def collapseIDs(ids): """ Helper function to make a smart list of IDs: eg turns 1+2+3+4+5 into 1-5. """ rVal = [] if len(ids)==0: return "" scanning=False anchor = 0 start = 0 # 1-5 7-10 12 21-23 for cur in range(0,len(ids)-1): if ids[cur]+1 == ids[cur+1]: if scanning: scanning=True continue else: scanning=True start = cur else: if scanning: scanning=False rVal.append(str(ids[start]) + "-" + str(ids[cur])) start = cur else: scanning=False rVal.append(str(ids[cur])) if scanning: rVal.append( str(ids[start]) + "-" + str(ids[cur+1])) else: rVal.append(str(ids[-1])) return rVal def collapseSel(sel=None,lType="resi"): """ collapseSel -- given a valid PyMOL selection and list type, return a collapsed list of numbers corresponding to the lType. For example, to compactly print the residue identifiers for all the waters, try: select theWaters, resn HOH print collapseSel( "theWaters" ) This will convert: 1+2+3+4+10+11+12 into 1-4+10-12 PARAMS sel The selection to collapse lType The identifier type: 'resi', 'ID', 'id', or any numerical property. RETURNS a string of collapsed IDs. """ if sel==None: return "" stored.s = set() cmd.iterate( sel, "stored.s.add(int(float(%s)))" % lType) l = list(stored.s) l.sort() return "+".join(collapseIDs(list(l))) cmd.extend("collapseSel", collapseSel)