I want to select multiple residues from different PDB files loaded on the same pymol session.

select resi LIG
get_area sele

How do I loop the above command to enable the command below:

select ligands,resn LIG

2 Answers 2


from https://www.blopig.com/blog/2019/08/how-to-iterate-in-pymol/

Example 1: Print the names of all the selected objects

You’ve selected several objects in PyMOL, and you want to see their names. By default, a new selection object called “(sele)” is created. We can create a Python variable called seleobjs, say, and then loop over them:

seleobjs = cmd.get_object_list('(sele)')
    for obj in seleobjs: print obj

Example 2: Disable all the selected objects

If you still have your selection, “(sele)”, you can disable them (effectively turn them off on the right-hand sidebar):

seleobjs = cmd.get_object_list('(sele)')
    for obj in seleobjs: cmd.disable(obj)

Example 3: Delete all the selected objects

You’re done with the objects in your selection, “(sele)”: you might be able to delete them using “delete ”, but if you can’t write a wildcard that covers all the names of the objects, you can iterate over a selection and delete them:

seleobjs = cmd.get_object_list('(sele)')
    for obj in seleobjs: cmd.delete(obj)

from https://pymolwiki.org/index.php/Get_Area

get_area calculates the surface area in square Angstroms of the selection given. Note that the accessibility is assessed in the context of the object(s) that the selection is part of. So, to get the surface areas of e.g. a component of a complex, you should make a new object containing a copy of just that component and calculate its area.

please let us know if it worked

  • $\begingroup$ Thanks, this code is working, but I am still not able to calculate the area of selected residues. My main hurdle is how to use the get_area pymol command and incorporate in the loop. $\endgroup$
    – shome
    Dec 15, 2020 at 22:50
  • $\begingroup$ @shome edited my answer $\endgroup$
    – pippo1980
    Dec 16, 2020 at 13:50
  • $\begingroup$ I typed : seleobjs = cmd.get_object_list('(sele)') for obj in seleobjs: get_area obj It is showing me invalid syntax.. $\endgroup$
    – shome
    Dec 16, 2020 at 14:00
  • $\begingroup$ cmd.get_area(str selection="(all)", int state=1, int load_b=0) try with Parentheses (Round Berackets) $\endgroup$
    – pippo1980
    Dec 16, 2020 at 14:24
  • $\begingroup$ showing invalid syntax $\endgroup$
    – shome
    Dec 16, 2020 at 15:10

Ok went back to this question having pymol within a hand's reach this time. Question is not really clear to me so I am posting a reasonable (to me) version of the question into a new code snippet;

I am using two PDBs containing ATP as ligand '3dgl.pdb', '2p09.pdb'


import pymol

list_pdbs = ['3dgl.pdb', '2p09.pdb']


for _i in list_pdbs :
    pymol.cmd.load( _i, _i.rstrip('.pdb'))

objs = pymol.cmd.get_object_list(selection='(all)')

print('structure loaded : ' , objs)

pymol.cmd.remove('resn HOH')

for _i in objs:
    pymol.cmd.create(_i+'_ATP_copy' ,  _i + ' and resn ATP')
    # print('after create ')
    area = pymol.cmd.get_area(_i+'_ATP_copy', quiet = 0)
    pymol.cmd.show('dots' , _i+'_ATP_copy')
    print(_i+'ATP_copy' + ' area --->  ' + str(area))


structure loaded :  ['3dgl', '2p09']
 cmd.get_area: 1013.704 Angstroms^2.
3dglATP_copy area --->  1013.7040405273438
 cmd.get_area: 1013.704 Angstroms^2.
2p09ATP_copy area --->  1013.7040405273438

picture of the ATP surfaces in Pymol itself,

enter image description here

you can play with cmd.get_area(...) parameters see https://pymolwiki.org/index.php/Get_area


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.