I was interested in Kinect as input device, because Kinect can detect motion as input it feels feature. ;-)
And some days ago, I got new input device “Leap Motion”.
The Leap Motion controller is a small USB peripheral device which is designed to be placed on a physical desktop, facing upward. ( from wiki )
I want to use this device with PyMol!
Let’s try it.
At first to use Leap Motion from python, user need to get Leapmotion SDK. My environment is OSX, so I got SDK v2.3 from developer site.
https://developer.leapmotion.com/sdk/v2
Installation is little bit complicated for me, because I want to use LeapPython library from virtual environment but the library is linked with native python.
So, I build or change dynamic link following procedure.
In Python2.7, I changed link with following command.
iwatobipen$ cd /somepath/LeapSDK/lib iwatobipen$ otool -L LeapPython.so LeapPython.so: /Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0) @loader_path/libLeap.dylib (compatibility version 0.7.0, current version 2.3.1) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0) # change Python link from native to anaconda iwatobipen$ install_name_tool -change /Library/Frameworks/Python.framework/Versions/2.7/Python /Users/iwatobipen/.pyenv/versions/anaconda-2.4.0/lib/libpython2.7.dylib LeapPython.so
In Python3.5, I compiled LeapPython.so using swig.
Newest swig will cause error, so I used swig version 3.0.3
I referred following url to do that. https://support.leapmotion.com/hc/en-us/articles/223784048-Generating-a-Python-3-3-0-Wrapper-with-SWIG-2-0-9
OK Let’s go
# Copy Leap.h, LeapMath.h, Leap.i, and libLeap.dylib into one folder. And type following command. # Generate LeapPython.cpp withswig -c++ -python -o LeapPython.cpp -interface LeapPython Leap.i iwatobipen$ swig -c++ -python -o LeapPython.cpp -interface LeapPython Leap.i # Compile and link clang++ -arch x86_64 -I/Users/iwatobipen/.pyenv/versions/anaconda-2.4.0/include/python2.7 LeapPython.cpp libLeap.dylib /Users/iwatobipen/.pyenv/versions/anaconda-2.4.0/lib/libpython2.7.dylib -shared -o LeapPython.so
Now I got LeapPython.so linked each python version in anaconda.
Unfortunately, I could not install pymol in python3.5. Following code was run in python2.7. I installed pymol by using conda install command.
Pymol Wiki provided sample code to use Leap Motion from pymol. I used the example. I added “path” which placed LeapPython.so.
test.py
import sys import math from pymol import cmd sys.path.insert( 0, '/Users/iwatobipen/develop/py2env/LeapSDK/build/') import Leap from Leap import Matrix, Vector class PymolListener(Leap.Listener): def __init__(self, *args, **kwargs): super(PymolListener, self).__init__(*args, **kwargs) self.prev_frame = None self.controller = Leap.Controller() self.controller.add_listener(self) def __del__(self): self.controller.remove_listener(self) super(PymolListener, self).__del__() def update_view(self, frame): if not self.prev_frame: return view = list(cmd.get_view()) if frame.rotation_probability(self.prev_frame) > 0.1: m = frame.rotation_matrix(self.prev_frame) m *= Matrix(Vector(*view[0:3]), Vector(*view[3:6]), Vector(*view[6:9])) view[:9] = m.to_array_3x3() if frame.scale_probability(self.prev_frame) > 0.1: s = frame.scale_factor(self.prev_frame) delta_z = math.log(s) * 100.0 view[11] += delta_z view[15] -= delta_z view[16] -= delta_z cmd.set_view(view) def on_frame(self, controller): frame = controller.frame() self.update_view(frame) self.prev_frame = frame listener = PymolListener()
Then run pymol and fetched sample pdb.
iwatobipen$ pymol # from pymolconsole. pymol> fetch 1atp pymol> run test.py
Result is …. It seems work well. Now, I am reading API reference to write code.