As you saw in Sample 06, the PyMOL JavaScript API re-exposes PyMOL's Python programming interface directly to the JavaScript layer in an object-oriented way. However, there are some performance issues (and in some cases, reliability issues) associated with sending hundreds or perhaps thousands of HTTP requests in a very short period of time.
We have implemented a buffering system into the PyMOL JavaScript API which enables many requests to be combined into a single compound request, provided of course, that only one return value (the final result value) is required by the client.
The API is used as before, except that we enable the buffering option by passing 'on' as the third argument of the constructor
var pymol = new PyMOL(null, null, 'on'); // create PyMOL object with buffering enabled var cmd = pymol.cmd; // assign a global symbol for the PyMOL cmd API
The trick to using buffering in the same origin scenario is to remember two things:
Python (inside PyMOL) | JavaScript (inside Browser) | |
---|---|---|
cmd.reinitialize() cmd.load("$PYMOL_PATH/test/dat/1tii.pdb") cmd.color("white") count = cmd.count_atoms() for i in range(1,count+1): cmd.color("auto","index "+str(i)) | cmd.reinitialize(); cmd.load("$PYMOL_PATH/test/dat/1tii.pdb"); cmd.color("white") cmd.count_atoms() count = pymol.flush() for(var i=1;i<=count;i++) { cmd.color("auto","index "+i); } pymol.flush()Run this program |
Note that you can turn buffering on or off at any time with the setBufferMode method of the pymol object:
pymol.setBufferMode('off') // disables buffering list = cmd.get_chains('1tii') // immediate calls can now be made, with results returned pymol.setBufferMode('on') // restores buffering (must call flush to force execution)