-
Notifications
You must be signed in to change notification settings - Fork 1
Auto Python Bindings #44
Description
@omar-moreno and I have chatted about this idea on-and-off and I am really excited about it. I've done some surface-level research and just wanted to open an issue to keep track of my notes.
Goal
The long term goal would be to get rid of ConfigurePython and fire altogether. We would instead call Process::run directly from a script run inside python after doing all the necessary configuration. i.e. instead of having a "configuration script", we would have a running script that is really similar.
# code snippet
from LDMX.Framework import Process
p = Process('run')
from LDMX.SimCore import simulator
sim = simulator.simulator('test')
sim.setDetector('ldmx-dev-v12')
# other configurations and calls to Cpp functions
# attach processors same as before? (hopefully)
p.sequence = [ sim ]
# pause to make sure config is correct
p.pause()
# actually run the processing pass
p.run()
# could do some post-processing python nonsenseAnother goal that would be awesome if we can get it to work is to have a Python parent class for both the Cpp pythonizations and potentially new Python processors. i.e. Something like the following
from LDMX.Framework import Process
p = Process('run')
from LDMX.Framework import Analyzer
class MyAnalyzer(Analyzer) :
def analyze(self, event) :
# event is our event bus
# do normal python analysis nonsense
# attach python analyzer alongside Cpp processors
p.sequence = [ sim, MyAnalyzer() ]
p.run()Both of these would be run through python instead of fire:
ldmx python3 run.pyTools
- Omar has metioned Boost.Python
- I have looked into cppyy which is used by ROOT.
Both have their pros and cons from my research.
| Note | Boost.Python | cppyy |
|---|---|---|
| Changes to C++ | required | optional |
| CMake Interface | available | available |
| Inheritance Handling | available | automatic |
| Pre-Compiled Python Module | default | unavailable? |
Long story short. It seems like Boost.Python would be the way to go if we were rebuilding from the ground-up. That way, the python module would be pre-compiled (i.e. faster) and we would have more control over its behavior. However, I am not interested in rebuilding from the ground up and therefore I am interested in using cppyy to "attach" our C++ objects to pythonic ones similar to how ROOT does it (versions > 6.18ish).
Plan
This is a drastic change to the Framework code-base, so I think this would necessarily be a long way off. Since this is also a big change in terms of user-interaction, we would need to be patient with merging anything like this in and potentially make a release separating our current method from this more pythonic one. For now, I am just collecting notes and links and maybe dipping my toe into the coding pool.