class MuonDisplayerTool(Tool): name = 'ctapipe-display-muons' description = t.Unicode(__doc__) infile = t.Unicode( help='input file name', default=get_dataset('gamma_test_large.simtel.gz') ).tag(config=True) outfile = t.Unicode(help='output file name', default=None).tag(config=True) display = t.Bool( help='display the camera events', default=False ).tag(config=True) classes = t.List([CameraCalibrator,]) aliases = t.Dict({'infile': 'MuonDisplayerTool.infile', 'outfile': 'MuonDisplayerTool.outfile', 'display' : 'MuonDisplayerTool.display' }) def setup(self): self.calib = CameraCalibrator(config=self.config, tool=self) def start(self): output_parameters = {'MuonEff': [], 'ImpactP': [], 'RingWidth': []} numev = 0 num_muons_found = 0 for event in hessio_event_source(self.infile): self.log.info("Event Number: %d, found %d muons", numev, num_muons_found) self.calib.calibrate(event) muon_evt = analyze_muon_event(event) numev += 1 if not muon_evt['MuonIntensityParams']: # No telescopes contained a good muon continue else: if self.display: plot_muon_event(event, muon_evt) for tid in muon_evt['TelIds']: idx = muon_evt['TelIds'].index(tid) if not muon_evt['MuonIntensityParams'][idx]: continue self.log.info("** Muon params: %s", muon_evt[idx]) output_parameters['MuonEff'].append( muon_evt['MuonIntensityParams'][idx].optical_efficiency_muon ) output_parameters['ImpactP'].append( muon_evt['MuonIntensityParams'][idx].impact_parameter.value ) output_parameters['RingWidth'].append( muon_evt['MuonIntensityParams'][idx].ring_width.value ) print_muon(muon_evt, printer=self.log.info) num_muons_found += 1 t = Table(output_parameters) t['ImpactP'].unit = 'm' t['RingWidth'].unit = 'deg' if self.outfile: t.write(self.outfile)
class MuonDisplayerTool(Tool): name = 'ctapipe-display-muons' description = t.Unicode(__doc__) events = t.Unicode("", help="input event data file").tag(config=True) outfile = t.Unicode("muons.hdf5", help='HDF5 output file name').tag( config=True) display = t.Bool( help='display the camera events', default=False ).tag(config=True) classes = t.List([ CameraCalibrator, EventSource ]) aliases = t.Dict({ 'input': 'MuonDisplayerTool.events', 'outfile': 'MuonDisplayerTool.outfile', 'display': 'MuonDisplayerTool.display', 'max_events': 'EventSource.max_events', 'allowed_tels': 'EventSource.allowed_tels', }) def setup(self): if self.events == '': raise ToolConfigurationError("please specify --input <events file>") self.log.debug("input: %s", self.events) self.source = event_source(self.events) self.calib = CameraCalibrator( config=self.config, tool=self, eventsource=self.source ) self.writer = HDF5TableWriter(self.outfile, "muons") def start(self): numev = 0 self.num_muons_found = defaultdict(int) for event in tqdm(self.source, desc='detecting muons'): self.calib.calibrate(event) muon_evt = analyze_muon_event(event) if numev == 0: _exclude_some_columns(event.inst.subarray, self.writer) numev += 1 if not muon_evt['MuonIntensityParams']: # No telescopes contained a good muon continue else: if self.display: plot_muon_event(event, muon_evt) for tel_id in muon_evt['TelIds']: idx = muon_evt['TelIds'].index(tel_id) intens_params = muon_evt['MuonIntensityParams'][idx] if intens_params is not None: ring_params = muon_evt['MuonRingParams'][idx] cam_id = str(event.inst.subarray.tel[tel_id].camera) self.num_muons_found[cam_id] += 1 self.log.debug("INTENSITY: %s", intens_params) self.log.debug("RING: %s", ring_params) self.writer.write(table_name=cam_id, containers=[intens_params, ring_params]) self.log.info( "Event Number: %d, found %s muons", numev, dict(self.num_muons_found) ) def finish(self): Provenance().add_output_file(self.outfile, role='dl1.tel.evt.muon') self.writer.close()
class MuonDisplayerTool(Tool): name = 'ctapipe-display-muons' description = t.Unicode(__doc__) infile = t.Unicode( help='input file name', default=get_dataset('gamma_test_large.simtel.gz')).tag(config=True) outfile = t.Unicode(help='output file name', default=None).tag(config=True) display = t.Bool(help='display the camera events', default=False).tag(config=True) classes = t.List([ CameraCalibrator, ]) aliases = t.Dict({ 'infile': 'MuonDisplayerTool.infile', 'outfile': 'MuonDisplayerTool.outfile', 'display': 'MuonDisplayerTool.display' }) def setup(self): self.calib = CameraCalibrator() def start(self): output_parameters = { 'MuonEff': [], 'ImpactP': [], 'RingWidth': [], 'RingCont': [], 'RingComp': [], 'RingPixComp': [], 'Core_x': [], 'Core_y': [], 'Impact_x_arr': [], 'Impact_y_arr': [], 'MCImpactP': [], 'ImpactDiff': [], 'RingSize': [], 'RingRadius': [], 'NTels': [] } numev = 0 num_muons_found = 0 for event in event_source(self.infile): self.log.info("Event Number: %d, found %d muons", numev, num_muons_found) self.calib.calibrate(event) muon_evt = analyze_muon_event(event) numev += 1 if not muon_evt[ 'MuonIntensityParams']: # No telescopes contained a good muon continue else: if self.display: plot_muon_event(event, muon_evt) ntels = len(event.r0.tels_with_data) #if(len( event.r0.tels_with_data) <= 1): #continue #print("event.r0.tels_with_data", event.r0.tels_with_data) for tid in muon_evt['TelIds']: idx = muon_evt['TelIds'].index(tid) if muon_evt['MuonIntensityParams'][idx] is not None: print("pos, tid", event.inst.subarray.positions[tid], tid) tel_x = event.inst.subarray.positions[tid][0] tel_y = event.inst.subarray.positions[tid][1] core_x = event.mc.core_x # MC Core x core_y = event.mc.core_y # MC Core y rec_impact_x = muon_evt['MuonIntensityParams'][ idx].impact_parameter_pos_x rec_impact_y = muon_evt['MuonIntensityParams'][ idx].impact_parameter_pos_y print("rec_impact_x, rec_impact_y", rec_impact_x, rec_impact_y) print("event.mc.core_x, event.mc.core_y", event.mc.core_x, event.mc.core_y) impact_mc = np.sqrt( np.power(core_x - tel_x, 2) + np.power(core_y - tel_y, 2)) print("simulated impact", impact_mc) # Coordinate transformation to move the impact point to array coordinates rec_impact_x_arr = tel_x + rec_impact_x rec_impact_y_arr = tel_y + rec_impact_y print("impact_x_arr, impact_y_arr", rec_impact_x_arr, rec_impact_y_arr) # Distance between core of the showe and impact parameter impact_diff = np.sqrt( np.power(core_x - rec_impact_x_arr, 2) + np.power(core_y - rec_impact_y_arr, 2)) print("impact_diff ", impact_diff) self.log.info("** Muon params: %s", muon_evt['MuonIntensityParams'][idx]) output_parameters['MuonEff'].append( muon_evt['MuonIntensityParams'] [idx].optical_efficiency_muon) output_parameters['ImpactP'].append( muon_evt['MuonIntensityParams'] [idx].impact_parameter.value) output_parameters['RingWidth'].append( muon_evt['MuonIntensityParams'] [idx].ring_width.value) output_parameters['RingCont'].append( muon_evt['MuonRingParams'][idx].ring_containment) output_parameters['RingComp'].append( muon_evt['MuonIntensityParams'] [idx].ring_completeness) output_parameters['RingPixComp'].append( muon_evt['MuonIntensityParams'] [idx].ring_pix_completeness) output_parameters['Core_x'].append( event.mc.core_x.value) output_parameters['Core_y'].append( event.mc.core_y.value) output_parameters['Impact_x_arr'].append( rec_impact_x_arr.value) output_parameters['Impact_y_arr'].append( rec_impact_y_arr.value) output_parameters['MCImpactP'].append(impact_mc.value) output_parameters['ImpactDiff'].append( impact_diff.value) output_parameters['RingSize'].append( muon_evt['MuonIntensityParams'][idx].ring_size) output_parameters['RingRadius'].append( muon_evt['MuonRingParams'][idx].ring_radius.value) output_parameters['NTels'].append(ntels) print_muon(muon_evt, printer=self.log.info) num_muons_found += 1 t = Table(output_parameters) t['ImpactP'].unit = 'm' t['RingWidth'].unit = 'deg' #t['MCImpactP'].unit = 'm' if self.outfile: t.write(self.outfile)