示例#1
0
class RootFile(DataFile):
    extension = ".root"

    def __init__(self, filename, rw_if_possible=False):
        self.filename = filename
        self.num_frames = 0

        self.file = TFile(filename, "READ")
        if not self.file.IsOpen():
            raise IOError(-1, "Cannot open ROOT file for reading", filename)
        if rw_if_possible:
            self.file.Close()
            self.file = TFile(filename, "UPDATE")
            if not self.file.IsWritable():
                raise IOError(-1, "Cannot open ROOT file in RW mode", filename)
        self.tree = self.file.Get("data")
        self.ch = [TGraph(), TGraph(), TGraph(), TGraph()]
        for i in xrange(1, 5):
            self.tree.SetBranchAddress("ch{0}".format(i), self.ch[i-1])
        self.num_frames = self.tree.GetEntries()
        self.next_frame_idx = 0

    def __del__(self):
        if self.file:
            self.file.Close()

    def __enter__(self):
        return self

    def __exit__(self, type, value, tb):
        if self.file:
            self.file.Close()

    def next_frame(self, next_idx=None):
        if next_idx is not None:
            self.next_frame_idx = next_idx
        frame_idx = self.next_frame_idx
        self.next_frame_idx += 1
        if frame_idx >= self.num_frames:
            return None

        t = None
        x = [None] * 4
        self.tree.GetEntry(frame_idx)
        for ch_num in xrange(4):
            n_points = self.ch[ch_num].GetN()
            if not n_points:
                continue
            if t is None:
                t = np.frombuffer(self.ch[ch_num].GetX(),
                                  dtype=float,
                                  count=n_points)
            x[ch_num] = np.frombuffer(self.ch[ch_num].GetY(),
                                      dtype=float,
                                      count=n_points)
        return frame_idx, t, x

    def getRootFile(self):
        return self.file