-
johannes bilk authoredjohannes bilk authored
What is this tool?
Let's all be frank, root sucks and the root file format is horrible. It's among humanities worst pieces of software. With this small tool I hope to fix the damage that was done, at least a little, by converting root files into native Python formats.
It's using Numpy and a library called Uproot to read and process these damn root files. So far it is specialist for one task and I will have to work on it to make it actually viable for more use cases. That task is to extract PXD data from Belle 2 data files.
This tool is still in early development, which means that the source code is horrible and that not all features work properly or aren't even fully implemented. Right now only PXD is supported by this tool. In the future I plan to include more detectors.
How to use this?
This is a single class, that needs to be instantiated, it doesn't take any arguments. Just import it like this:
from rootable import Rootable
Then you can create an instance:
loadFromRoot = Rootable()
and load the root file and all the data:
loadFromRoot.loadData('/root-files/slow_pions_2.root')
loadFromRoot.getClusters()
loadFromRoot.getCoordinates()
loadFromRoot.getLayers()
loadFromRoot.getMatrices()
loadFromRoot.getMCData()
One can now specify that ROI unselected digits should be read and to reconstruct the cluster data from them. this is still iffy, after including ROI unselected clusters, one cannot load monte carlo information and the u/v mapping is still very wonky.
loadFromRoot.loadData('/root-files/slow_pions_2.root', includeUnSelected=True)
The 'get' commands don't have any return value, but instead work in-place. Then all data is stored inside the object as dict:
loadFromRoot.data
Here follows a list of keywords contained in the dict:
- cluster data:
- 'eventNumber': int
- 'clsCharge': int
- 'seedCharge': int
- 'clsSize': int
- 'uSize': int
- 'vSize': int
- 'uPosition': float
- 'vPosition': float
- 'sensorID': int
- 'detector': str
- 'roiSelected': bool
- coordinates:
- 'xPosition': float
- 'yPosition': float
- 'zPosition': float
- layers:
- 'layer': int
- 'ladder': int
- matrices:
- 'cluster': array
- Monte Carlo data:
- 'momentumX': float
- 'momentumY': float
- 'momentumZ': float
- 'pdg': int
- 'clsNumber': int
Since the class is subscriptable one can access every element directly using the keywords like this:
loadFromRoot['eventNumber']
or