def test_array_draw(): filename = get_dataset("gamma_test.simtel.gz") cam_geom = {} source = hessio_event_source(filename, max_events=2) r1 = HESSIOR1Calibrator() dl0 = CameraDL0Reducer() calibrator = CameraDL1Calibrator() for event in source: array_pointing = SkyCoord( event.mcheader.run_array_direction[1] * u.rad, event.mcheader.run_array_direction[0] * u.rad, frame=AltAz) # array_view = ArrayPlotter(instrument=event.inst, # system=TiltedGroundFrame( # pointing_direction=array_pointing)) hillas_dict = {} r1.calibrate(event) dl0.reduce(event) calibrator.calibrate(event) # calibrate the events # store MC pointing direction for the array for tel_id in event.dl0.tels_with_data: pmt_signal = event.dl1.tel[tel_id].image[0] geom = deepcopy(event.inst.subarray.tel[tel_id].camera) fl = event.inst.subarray.tel[tel_id].optics.equivalent_focal_length # Transform the pixels positions into nominal coordinates camera_coord = CameraFrame(x=geom.pix_x, y=geom.pix_y, z=np.zeros(geom.pix_x.shape) * u.m, focal_length=fl, rotation=90 * u.deg - geom.cam_rotation) nom_coord = camera_coord.transform_to( NominalFrame(array_direction=array_pointing, pointing_direction=array_pointing)) geom.pix_x = nom_coord.x geom.pix_y = nom_coord.y mask = tailcuts_clean(geom, pmt_signal, picture_thresh=10., boundary_thresh=5.) try: moments = hillas_parameters(geom, pmt_signal * mask) hillas_dict[tel_id] = moments nom_coord = NominalPlotter(hillas_parameters=hillas_dict, draw_axes=True) nom_coord.draw_array() except HillasParameterizationError as e: print(e) continue
def test_array_draw(): filename = get_dataset("gamma_test.simtel.gz") cam_geom = {} source = hessio_event_source(filename, max_events=2) r1 = HessioR1Calibrator(None, None) dl0 = CameraDL0Reducer(None, None) calibrator = CameraDL1Calibrator(None, None) for event in source: array_pointing = SkyCoord(event.mcheader.run_array_direction[1] * u.rad, event.mcheader.run_array_direction[0] * u.rad, frame=AltAz) # array_view = ArrayPlotter(instrument=event.inst, # system=TiltedGroundFrame( # pointing_direction=array_pointing)) hillas_dict = {} r1.calibrate(event) dl0.reduce(event) calibrator.calibrate(event) # calibrate the events # store MC pointing direction for the array for tel_id in event.dl0.tels_with_data: pmt_signal = event.dl1.tel[tel_id].image[0] geom = event.inst.subarray.tel[tel_id].camera fl = event.inst.subarray.tel[tel_id].optics.effective_focal_length # Transform the pixels positions into nominal coordinates camera_coord = CameraFrame(x=geom.pix_x, y=geom.pix_y, z=np.zeros(geom.pix_x.shape) * u.m, focal_length=fl, rotation=90 * u.deg - geom.cam_rotation) nom_coord = camera_coord.transform_to( NominalFrame(array_direction=array_pointing, pointing_direction=array_pointing)) mask = tailcuts_clean(geom, pmt_signal, picture_thresh=10., boundary_thresh=5.) try: moments = hillas_parameters(nom_coord.x, nom_coord.y, pmt_signal * mask) hillas_dict[tel_id] = moments nom_coord = NominalPlotter(hillas_parameters=hillas_dict, draw_axes=True) nom_coord.draw_array() except HillasParameterizationError as e: print(e) continue
def draw_event(self, event, hillas_parameters=None): """ Draw display for a given event Parameters ---------- event: ctapipe event object hillas_parameters: dict Dictionary of Hillas parameters (in nominal system) Returns ------- None """ tel_list = event.r0.tels_with_data images = event.dl1 # First close any plots that already exist plt.close() ntels = len(tel_list) fig = plt.figure(figsize=(20, 20 * 0.66)) # If we want to draw the Hillas parameters in different planes we need to split our figure if self.draw_hillas_planes: y_axis_split = 2 else: y_axis_split = 1 outer_grid = gridspec.GridSpec(1, y_axis_split, width_ratios=[y_axis_split, 1]) # Create a square grid for camera images nn = int(ceil(sqrt(ntels))) nx = nn ny = nn while nx * ny >= ntels: ny -= 1 ny += 1 while nx * ny >= ntels: nx -= 1 nx += 1 camera_grid = gridspec.GridSpecFromSubplotSpec( ny, nx, subplot_spec=outer_grid[0]) # Loop over camera images of all telescopes and create plots for ii, tel_id in zip(range(ntels), tel_list): # Cache of camera geometries, this may go away soon if tel_id not in self.geom: self.geom[tel_id] = CameraGeometry.guess( event.inst.pixel_pos[tel_id][0], event.inst.pixel_pos[tel_id][1], event.inst.optical_foclen[tel_id]) ax = plt.subplot(camera_grid[ii]) self.get_camera_view(tel_id, images.tel[tel_id].image[0], ax) # If we want to draw the Hillas parameters in different planes we need to make a couple more viewers if self.draw_hillas_planes: # Split the second sub figure into two further figures reco_grid = gridspec.GridSpecFromSubplotSpec( 2, 1, subplot_spec=outer_grid[1]) # Create plot of telescope positions at ground level array = ArrayPlotter( telescopes=tel_list, instrument=event.inst, # system=tilted_system, ax=plt.subplot(reco_grid[0])) # Draw MC position (this should change later) array.draw_position(event.mc.core_x, event.mc.core_y, use_centre=True) array.draw_array(((-300, 300), (-300, 300))) # If we have valid Hillas parameters we should draw them in the Nominal system if hillas_parameters is not None: array.overlay_hillas(hillas_parameters, draw_axes=True) nominal = NominalPlotter(hillas_parameters=hillas_parameters, draw_axes=True, ax=plt.subplot(reco_grid[1])) nominal.draw_array() plt.show() return
def draw_event(self, event, hillas_parameters=None): """ Draw display for a given event Parameters ---------- event: ctapipe event object hillas_parameters: dict Dictionary of Hillas parameters (in nominal system) Returns ------- None """ tel_list = event.r0.tels_with_data images = event.dl1 # First close any plots that already exist plt.close() ntels = len(tel_list) fig = plt.figure(figsize=(20, 20 * 0.66)) # If we want to draw the Hillas parameters in different planes we need to split our figure if self.draw_hillas_planes: y_axis_split = 2 else: y_axis_split = 1 outer_grid = gridspec.GridSpec(1, y_axis_split, width_ratios=[y_axis_split, 1]) # Create a square grid for camera images nn = int(ceil(sqrt(ntels))) nx = nn ny = nn while nx * ny >= ntels: ny-=1 ny+=1 while nx * ny >= ntels: nx -= 1 nx += 1 camera_grid = gridspec.GridSpecFromSubplotSpec(ny, nx, subplot_spec=outer_grid[0]) # Loop over camera images of all telescopes and create plots for ii, tel_id in zip(range(ntels), tel_list): # Cache of camera geometries, this may go away soon if tel_id not in self.geom: self.geom[tel_id] = CameraGeometry.guess( event.inst.pixel_pos[tel_id][0], event.inst.pixel_pos[tel_id][1], event.inst.optical_foclen[tel_id]) ax = plt.subplot(camera_grid[ii]) self.get_camera_view(tel_id, images.tel[tel_id].image[0], ax) # If we want to draw the Hillas parameters in different planes we need to make a couple more viewers if self.draw_hillas_planes: # Split the second sub figure into two further figures reco_grid = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec=outer_grid[1]) # Create plot of telescope positions at ground level array = ArrayPlotter(telescopes=tel_list, instrument=event.inst,# system=tilted_system, ax=plt.subplot(reco_grid[0])) # Draw MC position (this should change later) array.draw_position(event.mc.core_x, event.mc.core_y, use_centre=True) array.draw_array(((-300,300),(-300,300))) # If we have valid Hillas parameters we should draw them in the Nominal system if hillas_parameters is not None: array.overlay_hillas(hillas_parameters, draw_axes=True) nominal = NominalPlotter(hillas_parameters=hillas_parameters, draw_axes=True, ax=plt.subplot(reco_grid[1])) nominal.draw_array() plt.show() return