Esempio n. 1
0
def fake_events(n):
    result = []
    for i in range(n):
        e = Event(n_channels=1, start_time=0, length=100, sample_duration=10)
        e.event_number = i
        e.block_id = i // 10
        result.append(e)
    return result
Esempio n. 2
0
def fake_events(n):
    result = []
    for i in range(n):
        e = Event(n_channels=1, start_time=0, length=100, sample_duration=10)
        e.event_number = i
        e.block_id = i // 10
        result.append(e)
    return result
Esempio n. 3
0
    def get_single_event_in_current_file(self, event_position=1):
        # Seek to the requested event
        # print(self.event_positions)
        self.current_evefile.seek(self.event_positions[event_position])
        # self.current_evefile.seek(event_position, whence=io.SEEK_CUR)
        # Read event event header, check if it is a real data event or file event header or something different.
        event_event_header = np.fromfile(self.current_evefile,
                                         dtype=eve_event_header,
                                         count=1)[0]
        if event_event_header['event_type'] not in [
                3, 4
        ]:  # 3 = signal event, 4 = header event. Do others occur?
            raise NotImplementedError(
                "Event type %i not yet implemented!" %
                event_event_header['event_type'], self.current_evefile.tell())
        if event_event_header['event_type'] == 4:
            # it might be possible to get another event header along with caen1724.par stuff
            self.log.error(
                "Unexpected event header at this position, trying to go on")
            self.file_caen_pars = np.fromfile(self.current_evefile,
                                              dtype=eve_caen1724_par_t,
                                              count=1)[0]
            event_event_header = np.fromfile(self.current_evefile,
                                             dtype=eve_event_header,
                                             count=1)[0]

        # Start building the event
        event = Event(
            n_channels=14,  # never trust the config file
            start_time=int(event_event_header['event_timestamp'] * units.s  # +
                           # event_layer_metadata['utc_time_usec'] * units.us
                           ),
            sample_duration=int(10 * units.ns),
            # 10 ns is the inverse of the sampling  frequency 10MHz
            length=self.file_caen_pars['nof_samples']  # nof samples per event
        )

        event.dataset_name = self.current_filename  # now metadata available
        # as eve files do not have event numbers just count them
        event.event_number = event_position
        if self.file_caen_pars['zle'] == 0:
            # Zero length encoding disabled
            # Data is just a big bunch of samples from one channel, then next channel, etc
            # unless board's last channel is read. Then signal header from next board and then again data
            # Each channel has an equal number of samples.
            for board_i, channels_active in enumerate(
                    self.file_caen_pars["chan_active"]):
                if channels_active.sum(
                ) == 0:  # if no channel is active there should be no signal header of the current board TODO: Check if that is really the case!
                    continue  # skip the current board
                event_signal_header_raw = np.fromfile(self.current_evefile,
                                                      dtype=eve_signal_header,
                                                      count=1)[0]
                event_signal_header = header_unpacker(event_signal_header_raw)
                for ch_i, channel_is_active in enumerate(channels_active):
                    if channel_is_active == 0:
                        continue  # skip unused channels
                    chdata = np.fromfile(self.current_evefile,
                                         dtype=np.int16,
                                         count=int(
                                             event_signal_header["page_size"]))

                    event.pulses.append(
                        Pulse(channel=ch_i + 8 * board_i,
                              left=0,
                              raw_data=np.array(chdata, dtype=np.int16)))

        elif self.file_caen_pars['zle'] == 1:
            # print(len(self.file_caen_pars["chan_active"]))
            for board_i, channels_active in enumerate(
                    self.file_caen_pars["chan_active"]):
                # Skip nonexistent board
                if channels_active.sum(
                ) == 0:  # if no channel is active there should be no signal header of the current board TODO: Check if that is really the case!
                    continue  # skip the current board

                event_signal_header_raw = np.fromfile(self.current_evefile,
                                                      dtype=eve_signal_header,
                                                      count=1)[0]
                event_signal_header = header_unpacker(event_signal_header_raw)
                channel_mask = event_signal_header["channel_mask"]

                channels_included = [
                    i for i in range(8) if (2**i & channel_mask) > 0
                ]

                for ch_i in channels_included:  # enumerate(channels_active):
                    position = self.current_evefile.tell()
                    channel_size = np.fromfile(self.current_evefile,
                                               dtype=np.uint32,
                                               count=1)[0]
                    sample_position = 0
                    while (self.current_evefile.tell() <
                           position + channel_size * 4):
                        cword = np.fromfile(self.current_evefile,
                                            dtype=np.uint32,
                                            count=1)[0]
                        if cword < 0x80000000:  # if cword is less than 0x80000000 waveform is below zle threshold
                            # skip word
                            sample_position += 2 * cword
                            continue
                        else:
                            chdata = np.fromfile(self.current_evefile,
                                                 dtype=np.int16,
                                                 count=2 *
                                                 (cword - 0x80000000))
                            event.pulses.append(
                                Pulse(channel=ch_i + 8 * board_i,
                                      left=sample_position,
                                      raw_data=chdata))
                            sample_position += 2 * (cword & (2**20 - 1))

        # TODO: Check we have read all data for this event
        affe = hex(
            np.fromfile(self.current_evefile, dtype=np.uint32, count=1)[0])
        if affe != '0xaffe':
            print(
                "WARNING : EVENT DID NOT END WITH 0XAFFE!! INSTEAD IT ENDED WITH ",
                affe)
        if event_position != len(self.event_positions) - 1:
            current_pos = self.current_evefile.tell()
            should_be_at_pos = self.event_positions[event_position + 1]
            if current_pos != should_be_at_pos:
                raise RuntimeError(
                    "Error during XED reading: after reading event %d from file "
                    "(event number %d) we should be at position %d, but we are at position %d!"
                    % (event_position, event.event_number, should_be_at_pos,
                       current_pos))

        return event
Esempio n. 4
0
    def get_single_event_in_current_file(self, event_position=1):
        # Seek to the requested event
        # print(self.event_positions)
        self.current_evefile.seek(self.event_positions[event_position])
        # self.current_evefile.seek(event_position, whence=io.SEEK_CUR)
        # Read event event header, check if it is a real data event or file event header or something different.
        event_event_header = np.fromfile(self.current_evefile, dtype=eve_event_header, count=1)[0]
        if event_event_header['event_type'] not in [3, 4]:  # 3 = signal event, 4 = header event. Do others occur?
            raise NotImplementedError("Event type %i not yet implemented!"
                                      % event_event_header['event_type'], self.current_evefile.tell())
        if event_event_header['event_type'] == 4:
            # it might be possible to get another event header along with caen1724.par stuff
            self.log.error("Unexpected event header at this position, trying to go on")
            self.file_caen_pars = np.fromfile(self.current_evefile, dtype=eve_caen1724_par_t, count=1)[0]
            event_event_header = np.fromfile(self.current_evefile, dtype=eve_event_header, count=1)[0]

        # Start building the event
        event = Event(
            n_channels=14,  # never trust the config file
            start_time=int(
                event_event_header['event_timestamp'] * units.s  # +
                # event_layer_metadata['utc_time_usec'] * units.us
            ),
            sample_duration=int(10 * units.ns),
            # 10 ns is the inverse of the sampling  frequency 10MHz
            length=self.file_caen_pars['nof_samples']  # nof samples per event
        )

        event.dataset_name = self.current_filename  # now metadata available
        # as eve files do not have event numbers just count them
        event.event_number = event_position
        if self.file_caen_pars['zle'] == 0:
            # Zero length encoding disabled
            # Data is just a big bunch of samples from one channel, then next channel, etc
            # unless board's last channel is read. Then signal header from next board and then again data
            # Each channel has an equal number of samples.
            for board_i, channels_active in enumerate(self.file_caen_pars["chan_active"]):
                if channels_active.sum() == 0:  # if no channel is active there should be no signal header of the current board TODO: Check if that is really the case!
                    continue  # skip the current board
                event_signal_header_raw = np.fromfile(self.current_evefile, dtype=eve_signal_header, count=1)[0]
                event_signal_header = header_unpacker(event_signal_header_raw)
                for ch_i, channel_is_active in enumerate(channels_active):
                    if channel_is_active == 0:
                        continue  # skip unused channels
                    chdata = np.fromfile(self.current_evefile, dtype=np.int16,
                                         count=int(event_signal_header["page_size"]))

                    event.pulses.append(Pulse(
                        channel=ch_i + 8 * board_i,
                        left=0,
                        raw_data=np.array(chdata, dtype=np.int16)
                    ))

        elif self.file_caen_pars['zle'] == 1:
            # print(len(self.file_caen_pars["chan_active"]))
            for board_i, channels_active in enumerate(self.file_caen_pars["chan_active"]):
                # Skip nonexistent board
                if channels_active.sum() == 0:  # if no channel is active there should be no signal header of the current board TODO: Check if that is really the case!
                    continue  # skip the current board

                event_signal_header_raw = np.fromfile(self.current_evefile,
                                                      dtype=eve_signal_header,
                                                      count=1)[0]
                event_signal_header = header_unpacker(event_signal_header_raw)
                channel_mask = event_signal_header["channel_mask"]

                channels_included = [i for i in range(8)
                                     if (2 ** i & channel_mask) > 0]

                for ch_i in channels_included:  # enumerate(channels_active):
                    position = self.current_evefile.tell()
                    channel_size = np.fromfile(self.current_evefile, dtype=np.uint32, count=1)[0]
                    sample_position = 0
                    while (self.current_evefile.tell() < position + channel_size * 4):
                        cword = np.fromfile(self.current_evefile, dtype=np.uint32, count=1)[0]
                        if cword < 0x80000000:  # if cword is less than 0x80000000 waveform is below zle threshold
                            # skip word
                            sample_position += 2 * cword
                            continue
                        else:
                            chdata = np.fromfile(self.current_evefile, dtype=np.int16, count=2 * (cword - 0x80000000))
                            event.pulses.append(Pulse(
                                channel=ch_i + 8 * board_i,
                                left=sample_position,
                                raw_data=chdata
                            ))
                            sample_position += 2 * (cword & (2 ** 20 - 1))

        # TODO: Check we have read all data for this event
        affe = hex(np.fromfile(self.current_evefile, dtype=np.uint32, count=1)[0])
        if affe != '0xaffe':
            print("WARNING : EVENT DID NOT END WITH 0XAFFE!! INSTEAD IT ENDED WITH ", affe)
        if event_position != len(self.event_positions) - 1:
            current_pos = self.current_evefile.tell()
            should_be_at_pos = self.event_positions[event_position + 1]
            if current_pos != should_be_at_pos:
                raise RuntimeError("Error during XED reading: after reading event %d from file "
                                   "(event number %d) we should be at position %d, but we are at position %d!" % (
                                       event_position, event.event_number, should_be_at_pos, current_pos))

        return event