diff options
Diffstat (limited to 'fileio/root.py')
-rw-r--r-- | fileio/root.py | 199 |
1 files changed, 0 insertions, 199 deletions
diff --git a/fileio/root.py b/fileio/root.py deleted file mode 100644 index af86deb..0000000 --- a/fileio/root.py +++ /dev/null @@ -1,199 +0,0 @@ -import ROOT -import os.path -import numpy as np - -ROOT.gROOT.ProcessLine('.L '+os.path.join(os.path.dirname(__file__), 'root.C+g')) - -import ROOT -import chroma.event as event - -def tvector3_to_ndarray(vec): - '''Convert a ROOT.TVector3 into a numpy np.float32 array''' - return np.array((vec.X(), vec.Y(), vec.Z()), dtype=np.float32) - -def make_photon_with_arrays(size): - '''Returns a new chroma.event.Photons object for `size` number of - photons with empty arrays set for all the photon attributes.''' - return event.Photons(pos=np.empty((size,3), dtype=np.float32), - dir=np.empty((size,3), dtype=np.float32), - pol=np.empty((size,3), dtype=np.float32), - wavelengths=np.empty(size, dtype=np.float32), - t=np.empty(size, dtype=np.float32), - flags=np.empty(size, dtype=np.uint32), - last_hit_triangles=np.empty(size, dtype=np.int32)) - -def root_vertex_to_python_vertex(vertex): - "Returns a chroma.event.Vertex object from a root Vertex object." - return event.Vertex(str(vertex.particle_name), - pos=tvector3_to_ndarray(vertex.pos), - dir=tvector3_to_ndarray(vertex.dir), - ke=vertex.ke, - t0=vertex.t0, - pol=tvector3_to_ndarray(vertex.pol)) - -def root_event_to_python_event(ev): - '''Returns a new chroma.event.Event object created from the - contents of the ROOT event `ev`.''' - pyev = event.Event(ev.id) - pyev.primary_vertex = root_vertex_to_python_vertex(ev.primary_vertex) - - for vertex in ev.vertices: - pyev.vertices.append(root_vertex_to_python_vertex(vertex)) - - # photon begin - if ev.photons_beg.size() > 0: - photons = make_photon_with_arrays(ev.photons_beg.size()) - ROOT.get_photons(ev.photons_beg, - photons.pos.ravel(), - photons.dir.ravel(), - photons.pol.ravel(), - photons.wavelengths, - photons.t, - photons.last_hit_triangles, - photons.flags) - pyev.photons_beg = photons - - # photon end - if ev.photons_end.size() > 0: - photons = make_photon_with_arrays(ev.photons_end.size()) - ROOT.get_photons(ev.photons_end, - photons.pos.ravel(), - photons.dir.ravel(), - photons.pol.ravel(), - photons.wavelengths, - photons.t, - photons.last_hit_triangles, - photons.flags) - pyev.photons_end = photons - - # channels - hit = np.empty(ev.nchannels, dtype=np.int32) - t = np.empty(ev.nchannels, dtype=np.float32) - q = np.empty(ev.nchannels, dtype=np.float32) - flags = np.empty(ev.nchannels, dtype=np.uint32) - - ROOT.get_channels(ev, hit, t, q, flags) - pyev.channels = event.Channels(hit.astype(bool), t, q, flags) - return pyev - -class RootReader(object): - '''Reader of Chroma events from a ROOT file. This class can be used to - navigate up and down the file linearly or in a random access fashion. - All returned events are instances of the chroma.event.Event class. - - It implements the iterator protocol, so you can do - - for ev in RootReader('electron.root'): - # process event here - ''' - - def __init__(self, filename): - '''Open ROOT file named `filename` containing TTree `T`.''' - self.f = ROOT.TFile(filename) - self.T = self.f.T - self.i = -1 - - def __len__(self): - '''Returns number of events in this file.''' - return self.T.GetEntries() - - def next(self): - '''Return the next event in the file. Raises StopIteration - when you get to the end.''' - if self.i + 1 >= len(self): - raise StopIteration - - self.i += 1 - self.T.GetEntry(self.i) - return root_event_to_python_event(self.T.ev) - - def prev(self): - '''Return the next event in the file. Raises StopIteration if - that would go past the beginning.''' - if self.i <= 0: - self.i = -1 - raise StopIteration - - self.i -= 1 - self.T.GetEntry(self.i) - return root_event_to_python_event(self.T.ev) - - def current(self): - '''Return the current event in the file.''' - self.T.GetEntry(self.i) # just in case? - return root_event_to_python_event(self.T.ev) - - def jump_to(self, index): - '''Return the event at `index`. Updates current location.''' - if index < 0 or index >= len(self): - raise IndexError - - self.T.GetEntry(self.i) - return root_event_to_python_event(self.T.ev) - - def index(self): - '''Return the current event index''' - return self.i - -class RootWriter(object): - def __init__(self, filename): - self.filename = filename - self.file = ROOT.TFile(filename, 'RECREATE') - - self.T = ROOT.TTree('T', 'Chroma events') - self.ev = ROOT.Event() - self.T.Branch('ev', self.ev) - - def write_event(self, pyev): - "Write an event.Event object to the ROOT tree as a ROOT.Event object." - self.ev.id = pyev.id - - if pyev.primary_vertex is not None: - self.ev.primary_vertex.particle_name = \ - pyev.primary_vertex.particle_name - self.ev.primary_vertex.pos.SetXYZ(*pyev.primary_vertex.pos) - self.ev.primary_vertex.dir.SetXYZ(*pyev.primary_vertex.dir) - if pyev.primary_vertex.pol is not None: - self.ev.primary_vertex.pol.SetXYZ(*pyev.primary_vertex.pol) - self.ev.primary_vertex.ke = pyev.primary_vertex.ke - - if pyev.photons_beg is not None: - photons = pyev.photons_beg - ROOT.fill_photons(self.ev.photons_beg, - len(photons.pos), - photons.pos.ravel(), - photons.dir.ravel(), - photons.pol.ravel(), - photons.wavelengths, photons.t, - photons.last_hit_triangles, photons.flags) - - if pyev.photons_end is not None: - photons = pyev.photons_end - ROOT.fill_photons(self.ev.photons_end, - len(photons.pos), - photons.pos.ravel(), - photons.dir.ravel(), - photons.pol.ravel(), - photons.wavelengths, photons.t, - photons.last_hit_triangles, photons.flags) - - self.ev.vertices.resize(0) - if pyev.vertices is not None: - self.ev.vertices.resize(len(pyev.vertices)) - for i, vertex in enumerate(pyev.vertices): - self.ev.vertices[i].particle_name = vertex.particle_name - self.ev.vertices[i].pos.SetXYZ(*vertex.pos) - self.ev.vertices[i].dir.SetXYZ(*vertex.dir) - if vertex.pol is not None: - self.ev.vertices[i].pol.SetXYZ(*vertex.pol) - self.ev.vertices[i].ke = vertex.ke - self.ev.vertices[i].t0 = vertex.t0 - - if pyev.channels is not None: - ROOT.fill_channels(self.ev, np.count_nonzero(pyev.channels.hit), np.arange(len(pyev.channels.t))[pyev.channels.hit].astype(np.int32), pyev.channels.t, pyev.channels.q, pyev.channels.flags, len(pyev.channels.hit)) - - self.T.Fill() - - def close(self): - self.T.Write() - self.file.Close() |