disp_im = CameraDisplay(geom, ax=ax_im, cmap=vi) disp_im.add_colorbar() disp_t = CameraDisplay(geom, ax=ax_t, cmap=cw) disp_t.add_colorbar() fig.tight_layout() fig.show() def plot(pe): image = pe['photoelectrons'] image[image == 0] = np.nan time = np.empty_like(image) mask = pe['pixel_id'] time[:] = np.nan time[mask] = pe['time'] - np.mean(pe['time']) disp_im.image = image disp_t.image = time for event in f.iter_mc_events(): if event['photoelectrons'] != {}: pe = event['photoelectrons'][0] if np.sum(pe['photoelectrons']) > 100: plot(pe) plt.pause(0.2)
class SimtelReader: def __init__( self, path: str, disable_remapping: bool = False, only_triggered_events: bool = False, n_events: int = None, ): """ Read Photoelectron arrays directly from simtelarray files Parameters ---------- path : str Path to the simtel file disable_remapping : bool Disables the remapping of the pixels to the sstcam-simulation pixel mapping only_triggered_events : bool Only read events which caused a telescope trigger n_events : int Number of telescope events to process """ self._file = SimTelFile(path) self._disable_remapping = disable_remapping self._only_triggered_events = only_triggered_events self._n_events = n_events self.n_pixels = 2048 self._camera_settings = {} self._pixel_remap = {} mapping = SSTCameraMapping() for telid, tel in self._file.telescope_descriptions.items(): camera_settings = tel['camera_settings'] self._camera_settings[telid] = camera_settings self._pixel_remap[telid] = get_pixel_remap( camera_settings['pixel_x'], camera_settings['pixel_y'], mapping.pixel) @property def camera_settings(self): return self._camera_settings @property def pixel_remap(self): return self._pixel_remap def __iter__(self): n_events = 0 if self._only_triggered_events: it = self._file.iter_array_events() else: it = self._file.iter_mc_events() for iev, event in enumerate(it): if 'photoelectrons' not in event: continue photoelectrons = event['photoelectrons'] mc_shower = event['mc_shower'] mc_event = event['mc_event'] if self._only_triggered_events: tel_ids = event['telescope_events'].keys() else: tel_ids = np.array(list(photoelectrons.keys())) + 1 for tel_id in tel_ids: # Retrieve only SST Camera if self._camera_settings[tel_id]['n_pixels'] != self.n_pixels: continue n_events += 1 if self._n_events and n_events > self._n_events: return values = photoelectrons[tel_id - 1] metadata = dict(event_index=iev, event_id=event['event_id'], telescope_id=tel_id, n_photoelectrons=values['time'].size, energy=mc_shower["energy"], alt=mc_shower["altitude"], az=mc_shower["azimuth"], core_x=mc_event["xcore"], core_y=mc_event["ycore"], h_first_int=mc_shower["h_first_int"], x_max=mc_shower["xmax"], shower_primary_id=mc_shower["primary_id"]) pixel = values['pixel_id'] time = values['time'] charge = np.ones(pixel.size) # Shift photoelectron times to sensible reference time start_time = 30 # ns time = start_time + time - time.min() # Convert pixel mapping if not self._disable_remapping: pixel = self._pixel_remap[tel_id][pixel] yield Photoelectrons(pixel=pixel, time=time, charge=charge, metadata=metadata)