gammasimtools 0.13.0__py3-none-any.whl → 0.15.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gammasimtools-0.13.0.dist-info → gammasimtools-0.15.0.dist-info}/METADATA +3 -3
- {gammasimtools-0.13.0.dist-info → gammasimtools-0.15.0.dist-info}/RECORD +224 -217
- {gammasimtools-0.13.0.dist-info → gammasimtools-0.15.0.dist-info}/WHEEL +1 -1
- {gammasimtools-0.13.0.dist-info → gammasimtools-0.15.0.dist-info}/entry_points.txt +3 -1
- simtools/_version.py +2 -2
- simtools/applications/db_add_file_to_db.py +15 -0
- simtools/applications/db_add_value_from_json_to_db.py +18 -1
- simtools/applications/derive_ctao_array_layouts.py +120 -0
- simtools/applications/derive_photon_electron_spectrum.py +29 -1
- simtools/applications/docs_produce_array_element_report.py +41 -16
- simtools/applications/docs_produce_model_parameter_reports.py +28 -8
- simtools/applications/{production_extract_mc_event_data.py → generate_simtel_event_data.py} +12 -20
- simtools/applications/print_version.py +81 -0
- simtools/applications/production_derive_corsika_limits.py +172 -39
- simtools/applications/production_scale_events.py +59 -36
- simtools/applications/run_application.py +41 -11
- simtools/applications/simulate_light_emission.py +115 -247
- simtools/applications/simulate_prod_htcondor_generator.py +2 -2
- simtools/camera/single_photon_electron_spectrum.py +163 -15
- simtools/data_model/model_data_writer.py +7 -6
- simtools/db/db_handler.py +14 -8
- simtools/dependencies.py +38 -3
- simtools/layout/array_layout.py +1 -0
- simtools/layout/ctao_array_layouts.py +172 -0
- simtools/model/array_model.py +3 -4
- simtools/model/model_parameter.py +30 -87
- simtools/production_configuration/derive_corsika_limits.py +222 -154
- simtools/production_configuration/event_scaler.py +2 -2
- simtools/reporting/docs_auto_report_generator.py +217 -0
- simtools/reporting/docs_read_parameters.py +192 -110
- simtools/schemas/application_workflow.metaschema.yml +3 -0
- simtools/schemas/model_parameter.metaschema.yml +13 -0
- simtools/schemas/model_parameter_and_data_schema.metaschema.yml +6 -0
- simtools/schemas/model_parameters/adjust_gain.schema.yml +1 -1
- simtools/schemas/model_parameters/altitude.schema.yml +1 -1
- simtools/schemas/model_parameters/array_coordinates_UTM.schema.yml +3 -3
- simtools/schemas/model_parameters/array_element_position_ground.schema.yml +3 -3
- simtools/schemas/model_parameters/array_element_position_utm.schema.yml +3 -3
- simtools/schemas/model_parameters/array_window.schema.yml +1 -1
- simtools/schemas/model_parameters/asum_clipping.schema.yml +1 -1
- simtools/schemas/model_parameters/asum_offset.schema.yml +1 -1
- simtools/schemas/model_parameters/asum_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/axes_offsets.schema.yml +2 -2
- simtools/schemas/model_parameters/camera_body_diameter.schema.yml +1 -1
- simtools/schemas/model_parameters/camera_body_shape.schema.yml +1 -1
- simtools/schemas/model_parameters/camera_config_rotate.schema.yml +1 -1
- simtools/schemas/model_parameters/camera_degraded_efficiency.schema.yml +1 -1
- simtools/schemas/model_parameters/camera_depth.schema.yml +1 -1
- simtools/schemas/model_parameters/camera_pixels.schema.yml +1 -1
- simtools/schemas/model_parameters/camera_transmission.schema.yml +1 -1
- simtools/schemas/model_parameters/channels_per_chip.schema.yml +1 -1
- simtools/schemas/model_parameters/corsika_iact_io_buffer.schema.yml +1 -1
- simtools/schemas/model_parameters/corsika_iact_max_bunches.schema.yml +1 -1
- simtools/schemas/model_parameters/corsika_iact_split_auto.schema.yml +1 -1
- simtools/schemas/model_parameters/corsika_observation_level.schema.yml +1 -1
- simtools/schemas/model_parameters/dark_events.schema.yml +1 -1
- simtools/schemas/model_parameters/disc_bins.schema.yml +1 -1
- simtools/schemas/model_parameters/disc_start.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_amplitude.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_fall_time.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_gate_length.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_hysteresis.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_output_amplitude.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_output_var_percent.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_rise_time.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_scale_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_sigsum_over_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_time_over_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_var_gate_length.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_var_sigsum_over_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_var_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/discriminator_var_time_over_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/dish_shape_length.schema.yml +1 -1
- simtools/schemas/model_parameters/dsum_clipping.schema.yml +1 -1
- simtools/schemas/model_parameters/dsum_ignore_below.schema.yml +1 -1
- simtools/schemas/model_parameters/dsum_offset.schema.yml +1 -1
- simtools/schemas/model_parameters/dsum_pre_clipping.schema.yml +1 -1
- simtools/schemas/model_parameters/dsum_prescale.schema.yml +2 -2
- simtools/schemas/model_parameters/dsum_presum_max.schema.yml +1 -1
- simtools/schemas/model_parameters/dsum_presum_shift.schema.yml +1 -1
- simtools/schemas/model_parameters/dsum_threshold.schema.yml +1 -1
- simtools/schemas/model_parameters/dsum_zero_clip.schema.yml +1 -1
- simtools/schemas/model_parameters/effective_focal_length.schema.yml +5 -5
- simtools/schemas/model_parameters/epsg_code.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_amplitude.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_bins.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_compensate_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_dev_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_err_compensate_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_err_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_amplitude.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_compensate_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_dev_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_err_compensate_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_err_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_max_signal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_max_sum.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_noise.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_sensitivity.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_sysvar_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_var_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_lg_var_sensitivity.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_max_signal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_max_sum.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_mhz.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_noise.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_sensitivity.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_sum_bins.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_sum_offset.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_sysvar_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_var_pedestal.schema.yml +1 -1
- simtools/schemas/model_parameters/fadc_var_sensitivity.schema.yml +1 -1
- simtools/schemas/model_parameters/focal_length.schema.yml +1 -1
- simtools/schemas/model_parameters/focal_surface_parameters.schema.yml +20 -20
- simtools/schemas/model_parameters/focal_surface_ref_radius.schema.yml +1 -1
- simtools/schemas/model_parameters/focus_offset.schema.yml +4 -4
- simtools/schemas/model_parameters/gain_variation.schema.yml +1 -1
- simtools/schemas/model_parameters/geomag_horizontal.schema.yml +1 -1
- simtools/schemas/model_parameters/geomag_rotation.schema.yml +1 -1
- simtools/schemas/model_parameters/geomag_vertical.schema.yml +1 -1
- simtools/schemas/model_parameters/hg_lg_variation.schema.yml +1 -1
- simtools/schemas/model_parameters/iobuf_maximum.schema.yml +1 -1
- simtools/schemas/model_parameters/iobuf_output_maximum.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_events.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_external_trigger.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_photons.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_pulse_exptime.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_pulse_offset.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_pulse_sigtime.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_pulse_twidth.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_var_photons.schema.yml +1 -1
- simtools/schemas/model_parameters/laser_wavelength.schema.yml +1 -1
- simtools/schemas/model_parameters/led_events.schema.yml +1 -1
- simtools/schemas/model_parameters/led_photons.schema.yml +1 -1
- simtools/schemas/model_parameters/led_pulse_offset.schema.yml +1 -1
- simtools/schemas/model_parameters/led_pulse_sigtime.schema.yml +1 -1
- simtools/schemas/model_parameters/led_var_photons.schema.yml +1 -1
- simtools/schemas/model_parameters/min_photoelectrons.schema.yml +1 -1
- simtools/schemas/model_parameters/min_photons.schema.yml +1 -1
- simtools/schemas/model_parameters/mirror_align_random_distance.schema.yml +1 -1
- simtools/schemas/model_parameters/mirror_align_random_horizontal.schema.yml +4 -4
- simtools/schemas/model_parameters/mirror_align_random_vertical.schema.yml +4 -4
- simtools/schemas/model_parameters/mirror_class.schema.yml +1 -1
- simtools/schemas/model_parameters/mirror_degraded_reflection.schema.yml +1 -1
- simtools/schemas/model_parameters/mirror_focal_length.schema.yml +1 -1
- simtools/schemas/model_parameters/mirror_offset.schema.yml +1 -1
- simtools/schemas/model_parameters/mirror_panel_2f_measurements.schema.yml +3 -3
- simtools/schemas/model_parameters/mirror_reflection_random_angle.schema.yml +3 -3
- simtools/schemas/model_parameters/multiplicity_offset.schema.yml +1 -1
- simtools/schemas/model_parameters/muon_mono_threshold.schema.yml +45 -0
- simtools/schemas/model_parameters/nsb_autoscale_airmass.schema.yml +2 -2
- simtools/schemas/model_parameters/nsb_gain_drop_scale.schema.yml +1 -1
- simtools/schemas/model_parameters/nsb_offaxis.schema.yml +5 -5
- simtools/schemas/model_parameters/nsb_pixel_rate.schema.yml +1 -1
- simtools/schemas/model_parameters/nsb_reference_value.schema.yml +1 -1
- simtools/schemas/model_parameters/nsb_scaling_factor.schema.yml +1 -1
- simtools/schemas/model_parameters/nsb_spectrum.schema.yml +2 -2
- simtools/schemas/model_parameters/num_gains.schema.yml +1 -1
- simtools/schemas/model_parameters/pedestal_events.schema.yml +1 -1
- simtools/schemas/model_parameters/photon_delay.schema.yml +1 -1
- simtools/schemas/model_parameters/photons_per_run.schema.yml +1 -1
- simtools/schemas/model_parameters/pixel_cells.schema.yml +1 -1
- simtools/schemas/model_parameters/pixels_parallel.schema.yml +1 -1
- simtools/schemas/model_parameters/pixeltrg_time_step.schema.yml +1 -1
- simtools/schemas/model_parameters/pm_average_gain.schema.yml +1 -1
- simtools/schemas/model_parameters/pm_collection_efficiency.schema.yml +1 -1
- simtools/schemas/model_parameters/pm_gain_index.schema.yml +1 -1
- simtools/schemas/model_parameters/pm_transit_time.schema.yml +4 -4
- simtools/schemas/model_parameters/pm_voltage_variation.schema.yml +1 -1
- simtools/schemas/model_parameters/primary_mirror_degraded_map.schema.yml +7 -3
- simtools/schemas/model_parameters/primary_mirror_diameter.schema.yml +1 -1
- simtools/schemas/model_parameters/primary_mirror_hole_diameter.schema.yml +1 -1
- simtools/schemas/model_parameters/primary_mirror_parameters.schema.yml +20 -20
- simtools/schemas/model_parameters/primary_mirror_ref_radius.schema.yml +1 -1
- simtools/schemas/model_parameters/qe_variation.schema.yml +1 -1
- simtools/schemas/model_parameters/random_focal_length.schema.yml +2 -2
- simtools/schemas/model_parameters/random_mono_probability.schema.yml +38 -0
- simtools/schemas/model_parameters/reference_point_altitude.schema.yml +1 -1
- simtools/schemas/model_parameters/reference_point_latitude.schema.yml +4 -1
- simtools/schemas/model_parameters/reference_point_longitude.schema.yml +4 -1
- simtools/schemas/model_parameters/reference_point_utm_east.schema.yml +1 -1
- simtools/schemas/model_parameters/reference_point_utm_north.schema.yml +1 -1
- simtools/schemas/model_parameters/secondary_mirror_baffle.schema.yml +5 -5
- simtools/schemas/model_parameters/secondary_mirror_degraded_reflection.schema.yml +1 -1
- simtools/schemas/model_parameters/secondary_mirror_diameter.schema.yml +1 -1
- simtools/schemas/model_parameters/secondary_mirror_hole_diameter.schema.yml +1 -1
- simtools/schemas/model_parameters/secondary_mirror_parameters.schema.yml +20 -20
- simtools/schemas/model_parameters/secondary_mirror_ref_radius.schema.yml +1 -1
- simtools/schemas/model_parameters/secondary_mirror_shadow_diameter.schema.yml +1 -1
- simtools/schemas/model_parameters/secondary_mirror_shadow_offset.schema.yml +1 -1
- simtools/schemas/model_parameters/stars.schema.yml +36 -0
- simtools/schemas/model_parameters/store_photoelectrons.schema.yml +1 -1
- simtools/schemas/model_parameters/tailcut_scale.schema.yml +1 -1
- simtools/schemas/model_parameters/telescope_axis_height.schema.yml +1 -1
- simtools/schemas/model_parameters/telescope_random_angle.schema.yml +1 -1
- simtools/schemas/model_parameters/telescope_random_error.schema.yml +1 -1
- simtools/schemas/model_parameters/telescope_sphere_radius.schema.yml +1 -1
- simtools/schemas/model_parameters/telescope_transmission.schema.yml +6 -6
- simtools/schemas/model_parameters/teltrig_min_sigsum.schema.yml +1 -1
- simtools/schemas/model_parameters/teltrig_min_time.schema.yml +1 -1
- simtools/schemas/model_parameters/transit_time_calib_error.schema.yml +1 -1
- simtools/schemas/model_parameters/transit_time_compensate_error.schema.yml +1 -1
- simtools/schemas/model_parameters/transit_time_compensate_step.schema.yml +1 -1
- simtools/schemas/model_parameters/transit_time_error.schema.yml +1 -1
- simtools/schemas/model_parameters/transit_time_jitter.schema.yml +1 -1
- simtools/schemas/model_parameters/trigger_current_limit.schema.yml +1 -1
- simtools/schemas/model_parameters/trigger_delay_compensation.schema.yml +4 -4
- simtools/schemas/model_parameters/trigger_pixels.schema.yml +1 -1
- simtools/simtel/simtel_config_writer.py +70 -38
- simtools/simtel/simtel_io_event_reader.py +278 -0
- simtools/simtel/simtel_io_event_writer.py +317 -0
- simtools/simtel/simulator_light_emission.py +181 -67
- simtools/simulator.py +2 -2
- simtools/testing/configuration.py +18 -0
- simtools/utils/general.py +33 -7
- simtools/utils/geometry.py +19 -0
- simtools/utils/names.py +7 -1
- simtools/visualization/visualize.py +2 -2
- simtools/production_configuration/extract_mc_event_data.py +0 -253
- simtools/simtel/simtel_io_events.py +0 -265
- {gammasimtools-0.13.0.dist-info → gammasimtools-0.15.0.dist-info/licenses}/LICENSE +0 -0
- {gammasimtools-0.13.0.dist-info → gammasimtools-0.15.0.dist-info}/top_level.txt +0 -0
- /simtools/schemas/model_parameters/{nsb_skymap.schema.yml → nsb_sky_map.schema.yml} +0 -0
|
@@ -16,19 +16,19 @@ short_description: |-
|
|
|
16
16
|
The delay applied to the trigger output to compensate for the different
|
|
17
17
|
execution times of each trigger algorithm.
|
|
18
18
|
data:
|
|
19
|
-
- type:
|
|
19
|
+
- type: float64
|
|
20
20
|
description: Delay applied for majority trigger.
|
|
21
21
|
unit: ns
|
|
22
22
|
default: 0.0
|
|
23
|
-
- type:
|
|
23
|
+
- type: float64
|
|
24
24
|
description: Delay applied for analog sum trigger.
|
|
25
25
|
unit: ns
|
|
26
26
|
default: 0.0
|
|
27
|
-
- type:
|
|
27
|
+
- type: float64
|
|
28
28
|
description: Delay applied for digital sum trigger.
|
|
29
29
|
unit: ns
|
|
30
30
|
default: 0.0
|
|
31
|
-
- type:
|
|
31
|
+
- type: float64
|
|
32
32
|
description: Delay (TODO this value is unclear)
|
|
33
33
|
unit: ns
|
|
34
34
|
default: 0.0
|
|
@@ -76,16 +76,24 @@ class SimtelConfigWriter:
|
|
|
76
76
|
)
|
|
77
77
|
file.write("#endif\n\n")
|
|
78
78
|
|
|
79
|
-
for
|
|
79
|
+
for par, value in parameters.items():
|
|
80
|
+
_simtel_name = names.get_simulation_software_name_from_parameter_name(
|
|
81
|
+
par, simulation_software="sim_telarray"
|
|
82
|
+
)
|
|
80
83
|
# array trigger is a site parameter, not a telescope parameter
|
|
81
84
|
# fake_mirror_list is not a sim_telarray parameter (used for testeff only)
|
|
82
|
-
if
|
|
85
|
+
if (
|
|
86
|
+
not _simtel_name
|
|
87
|
+
or _simtel_name.startswith("array_trigger")
|
|
88
|
+
or _simtel_name == "fake_mirror_list"
|
|
89
|
+
):
|
|
83
90
|
continue
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
91
|
+
file.write(
|
|
92
|
+
f"{_simtel_name} = {self._get_value_string_for_simtel(value['value'])}\n"
|
|
93
|
+
)
|
|
94
|
+
_config_meta = self._get_simtel_metadata("telescope", parameters)
|
|
95
|
+
for value in _config_meta:
|
|
96
|
+
file.write(f"{value}\n")
|
|
89
97
|
|
|
90
98
|
def _get_value_string_for_simtel(self, value):
|
|
91
99
|
"""
|
|
@@ -108,7 +116,7 @@ class SimtelConfigWriter:
|
|
|
108
116
|
value = gen.convert_list_to_string(value, shorten_list=True)
|
|
109
117
|
return value
|
|
110
118
|
|
|
111
|
-
def _get_simtel_metadata(self, config_type):
|
|
119
|
+
def _get_simtel_metadata(self, config_type, model_parameters):
|
|
112
120
|
"""
|
|
113
121
|
Return simtel metadata.
|
|
114
122
|
|
|
@@ -116,35 +124,60 @@ class SimtelConfigWriter:
|
|
|
116
124
|
----------
|
|
117
125
|
type: str
|
|
118
126
|
Type of the configuration file (telescope, site)
|
|
127
|
+
model_parameters: dict
|
|
128
|
+
Model parameters dictionary.
|
|
119
129
|
|
|
120
130
|
Returns
|
|
121
131
|
-------
|
|
122
|
-
|
|
123
|
-
|
|
132
|
+
list
|
|
133
|
+
List with simtel metadata.
|
|
124
134
|
|
|
125
135
|
"""
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
f"{self._model_version}
|
|
129
|
-
|
|
130
|
-
parameters["config_version"] = self._model_version
|
|
136
|
+
meta_parameters = [
|
|
137
|
+
f"config_release = {self._model_version} with simtools v{simtools.version.__version__}",
|
|
138
|
+
f"config_version = {self._model_version}",
|
|
139
|
+
]
|
|
131
140
|
if config_type == "telescope":
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
141
|
+
meta_parameters.extend(
|
|
142
|
+
[
|
|
143
|
+
f"camera_config_name = {self._telescope_model_name}",
|
|
144
|
+
"camera_config_variant = ",
|
|
145
|
+
f"camera_config_version = {self._model_version}",
|
|
146
|
+
f"optics_config_name = {self._telescope_model_name}",
|
|
147
|
+
"optics_config_variant = ",
|
|
148
|
+
f"optics_config_version = {self._model_version}",
|
|
149
|
+
]
|
|
150
|
+
)
|
|
151
|
+
prefix = "metaparam telescope"
|
|
138
152
|
elif config_type == "site":
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
153
|
+
meta_parameters.extend(
|
|
154
|
+
[
|
|
155
|
+
f"site_config_name = {self._site}",
|
|
156
|
+
"site_config_variant = ",
|
|
157
|
+
f"site_config_version = {self._model_version}",
|
|
158
|
+
f"array_config_name = {self._layout_name}",
|
|
159
|
+
"array_config_variant = ",
|
|
160
|
+
f"array_config_version = {self._model_version}",
|
|
161
|
+
]
|
|
162
|
+
)
|
|
163
|
+
prefix = "metaparam global"
|
|
145
164
|
else:
|
|
146
165
|
raise ValueError(f"Unknown metadata type {config_type}")
|
|
147
|
-
|
|
166
|
+
|
|
167
|
+
if model_parameters:
|
|
168
|
+
for key, value in model_parameters.items():
|
|
169
|
+
simtel_name = names.get_simulation_software_name_from_parameter_name(
|
|
170
|
+
key, simulation_software="sim_telarray", set_meta_parameter=False
|
|
171
|
+
)
|
|
172
|
+
if simtel_name and value.get("meta_parameter"):
|
|
173
|
+
meta_parameters.append(f"{prefix} add {simtel_name}")
|
|
174
|
+
simtel_name = names.get_simulation_software_name_from_parameter_name(
|
|
175
|
+
key, simulation_software="sim_telarray", set_meta_parameter=True
|
|
176
|
+
)
|
|
177
|
+
if simtel_name and value.get("meta_parameter"):
|
|
178
|
+
meta_parameters.append(f"{prefix} set {simtel_name}={value['value']}")
|
|
179
|
+
|
|
180
|
+
return meta_parameters
|
|
148
181
|
|
|
149
182
|
def write_array_config_file(self, config_file_path, telescope_model, site_model):
|
|
150
183
|
"""
|
|
@@ -177,7 +210,7 @@ class SimtelConfigWriter:
|
|
|
177
210
|
|
|
178
211
|
# Writing site parameters
|
|
179
212
|
self._write_site_parameters(
|
|
180
|
-
file, site_model, Path(config_file_path).parent, telescope_model
|
|
213
|
+
file, site_model.parameters, Path(config_file_path).parent, telescope_model
|
|
181
214
|
)
|
|
182
215
|
|
|
183
216
|
# Maximum telescopes
|
|
@@ -276,7 +309,7 @@ class SimtelConfigWriter:
|
|
|
276
309
|
header += f"{comment_char}\n"
|
|
277
310
|
file.write(header)
|
|
278
311
|
|
|
279
|
-
def _write_site_parameters(self, file,
|
|
312
|
+
def _write_site_parameters(self, file, site_parameters, model_path, telescope_model):
|
|
280
313
|
"""
|
|
281
314
|
Write site parameters.
|
|
282
315
|
|
|
@@ -284,27 +317,26 @@ class SimtelConfigWriter:
|
|
|
284
317
|
----------
|
|
285
318
|
file: file
|
|
286
319
|
File to write on.
|
|
287
|
-
|
|
288
|
-
Site
|
|
320
|
+
site_parameters: site parameters
|
|
321
|
+
Site parameters.
|
|
289
322
|
model_path: Path
|
|
290
323
|
Path to the model for writing of additional files.
|
|
291
324
|
telescope_model: dict of TelescopeModel
|
|
292
325
|
Telescope models.
|
|
293
326
|
"""
|
|
294
327
|
file.write(self.TAB + "% Site parameters\n")
|
|
295
|
-
|
|
296
|
-
for par, value in _site_parameters.items():
|
|
328
|
+
for par, value in site_parameters.items():
|
|
297
329
|
_simtel_name = names.get_simulation_software_name_from_parameter_name(
|
|
298
330
|
par, simulation_software="sim_telarray"
|
|
299
331
|
)
|
|
300
332
|
_simtel_name, value = self._convert_model_parameters_to_simtel_format(
|
|
301
|
-
_simtel_name, value, model_path, telescope_model
|
|
333
|
+
_simtel_name, value["value"], model_path, telescope_model
|
|
302
334
|
)
|
|
303
335
|
if _simtel_name is not None:
|
|
304
336
|
file.write(f"{self.TAB}{_simtel_name} = {value}\n")
|
|
305
|
-
_simtel_meta = self._get_simtel_metadata("site")
|
|
306
|
-
for
|
|
307
|
-
file.write(f"{self.TAB}{
|
|
337
|
+
_simtel_meta = self._get_simtel_metadata("site", site_parameters)
|
|
338
|
+
for value in _simtel_meta:
|
|
339
|
+
file.write(f"{self.TAB}{value}\n")
|
|
308
340
|
file.write("\n")
|
|
309
341
|
|
|
310
342
|
def _convert_model_parameters_to_simtel_format(
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Read a reduced dataset from file.
|
|
3
|
+
|
|
4
|
+
Allow to filter the events based on the triggered telescopes.
|
|
5
|
+
Provide functionality to list events, e.g. through
|
|
6
|
+
|
|
7
|
+
.. code-block:: console
|
|
8
|
+
|
|
9
|
+
from simtools.simtel.simtel_io_event_reader import SimtelIOEventDataReader
|
|
10
|
+
reader = SimtelIOEventDataReader("gamma_diffuse_60deg.hdf5", [1,2,3,4])
|
|
11
|
+
reader.print_event_table()
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
|
|
17
|
+
import astropy.units as u
|
|
18
|
+
import numpy as np
|
|
19
|
+
import tables
|
|
20
|
+
from astropy.coordinates import AltAz, angular_separation
|
|
21
|
+
from ctapipe.coordinates import GroundFrame, TiltedGroundFrame
|
|
22
|
+
|
|
23
|
+
from simtools.simtel.simtel_io_event_writer import ShowerEventData, TriggeredEventData
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SimtelIOEventDataReader:
|
|
27
|
+
"""
|
|
28
|
+
Read reduced MC data set from file.
|
|
29
|
+
|
|
30
|
+
Calculate some standard derivation like core position in shower coordinates.
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
event_data_file : str
|
|
35
|
+
Path to the HDF5 file containing the event data.
|
|
36
|
+
telescope_list : list, optional
|
|
37
|
+
List of telescope IDs to filter the events (default is None).
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, event_data_file, telescope_list=None):
|
|
41
|
+
"""Initialize SimtelIOEventDataReader with the given event data file."""
|
|
42
|
+
self._logger = logging.getLogger(__name__)
|
|
43
|
+
self.telescope_list = telescope_list
|
|
44
|
+
|
|
45
|
+
self.shower_data, self.triggered_shower_data, self.triggered_data = self.read_event_data(
|
|
46
|
+
event_data_file
|
|
47
|
+
)
|
|
48
|
+
self._derived_event_data()
|
|
49
|
+
|
|
50
|
+
def read_event_data(self, event_data_file):
|
|
51
|
+
"""
|
|
52
|
+
Read event data from the reduced MC event data file.
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
event_data_file : str, Path
|
|
57
|
+
Path to the HDF5 file containing the event data.
|
|
58
|
+
|
|
59
|
+
Returns
|
|
60
|
+
-------
|
|
61
|
+
ShowerEventData, TriggeredEventData
|
|
62
|
+
Event data and triggered event data.
|
|
63
|
+
"""
|
|
64
|
+
event_data = ShowerEventData()
|
|
65
|
+
triggered_event_data = TriggeredEventData()
|
|
66
|
+
|
|
67
|
+
with tables.open_file(event_data_file, mode="r") as f:
|
|
68
|
+
reduced_data = f.root.data.reduced_data
|
|
69
|
+
event_data.simulated_energy = reduced_data.col("simulated_energy")
|
|
70
|
+
event_data.x_core = reduced_data.col("x_core")
|
|
71
|
+
event_data.y_core = reduced_data.col("y_core")
|
|
72
|
+
event_data.shower_azimuth = reduced_data.col("shower_azimuth")
|
|
73
|
+
event_data.shower_altitude = reduced_data.col("shower_altitude")
|
|
74
|
+
event_data.shower_id = reduced_data.col("shower_id")
|
|
75
|
+
event_data.area_weight = reduced_data.col("area_weight")
|
|
76
|
+
|
|
77
|
+
triggered_data = f.root.data.triggered_data
|
|
78
|
+
triggered_event_data.triggered_id = triggered_data.col("triggered_id")
|
|
79
|
+
triggered_event_data.array_altitudes = triggered_data.col("array_altitudes")
|
|
80
|
+
triggered_event_data.array_azimuths = triggered_data.col("array_azimuths")
|
|
81
|
+
|
|
82
|
+
telescope_indices = triggered_data.col("telescope_list_index")
|
|
83
|
+
telescope_list_array = f.root.data.trigger_telescope_list_list
|
|
84
|
+
|
|
85
|
+
triggered_event_data.trigger_telescope_list_list = []
|
|
86
|
+
for index in telescope_indices:
|
|
87
|
+
if index < telescope_list_array.nrows:
|
|
88
|
+
triggered_event_data.trigger_telescope_list_list.append(
|
|
89
|
+
telescope_list_array[index]
|
|
90
|
+
)
|
|
91
|
+
else:
|
|
92
|
+
self._logger.warning(f"Invalid telescope list index: {index}")
|
|
93
|
+
triggered_event_data.trigger_telescope_list_list.append(
|
|
94
|
+
np.array([], dtype=np.int16)
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
triggered_shower, triggered_data = self._reduce_to_triggered_events(
|
|
98
|
+
event_data, triggered_event_data
|
|
99
|
+
)
|
|
100
|
+
return event_data, triggered_shower, triggered_data
|
|
101
|
+
|
|
102
|
+
def _reduce_to_triggered_events(self, event_data, triggered_data):
|
|
103
|
+
"""
|
|
104
|
+
Reduce event data to triggered events only. Apply filter on telescope list if specified.
|
|
105
|
+
|
|
106
|
+
Parameters
|
|
107
|
+
----------
|
|
108
|
+
event_data : ShowerEventData
|
|
109
|
+
Event data.
|
|
110
|
+
triggered_data : TriggeredEventData
|
|
111
|
+
Triggered event data.
|
|
112
|
+
|
|
113
|
+
Returns
|
|
114
|
+
-------
|
|
115
|
+
ShowerEventData, TriggeredEventData
|
|
116
|
+
Filtered event data and triggered event data
|
|
117
|
+
"""
|
|
118
|
+
filtered_shower_ids, triggered_indices = self._get_mask_triggered_telescopes(
|
|
119
|
+
self.telescope_list,
|
|
120
|
+
triggered_data.triggered_id,
|
|
121
|
+
triggered_data.trigger_telescope_list_list,
|
|
122
|
+
)
|
|
123
|
+
filtered_event_data = ShowerEventData(
|
|
124
|
+
x_core=event_data.x_core[filtered_shower_ids],
|
|
125
|
+
y_core=event_data.y_core[filtered_shower_ids],
|
|
126
|
+
simulated_energy=event_data.simulated_energy[filtered_shower_ids],
|
|
127
|
+
shower_azimuth=event_data.shower_azimuth[filtered_shower_ids],
|
|
128
|
+
shower_altitude=event_data.shower_altitude[filtered_shower_ids],
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
filtered_telescope_list = [
|
|
132
|
+
triggered_data.trigger_telescope_list_list[i] for i in triggered_indices
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
filtered_triggered_data = TriggeredEventData(
|
|
136
|
+
array_azimuths=triggered_data.array_azimuths[triggered_indices],
|
|
137
|
+
array_altitudes=triggered_data.array_altitudes[triggered_indices],
|
|
138
|
+
trigger_telescope_list_list=filtered_telescope_list,
|
|
139
|
+
)
|
|
140
|
+
self._logger.info(
|
|
141
|
+
f"Events reduced to triggered events: {len(filtered_event_data.simulated_energy)}"
|
|
142
|
+
)
|
|
143
|
+
return filtered_event_data, filtered_triggered_data
|
|
144
|
+
|
|
145
|
+
def _get_mask_triggered_telescopes(
|
|
146
|
+
self, telescope_list, triggered_id, trigger_telescope_list_list
|
|
147
|
+
):
|
|
148
|
+
"""
|
|
149
|
+
Return indices of events that triggered the specified telescopes.
|
|
150
|
+
|
|
151
|
+
Parameters
|
|
152
|
+
----------
|
|
153
|
+
telescope_list : list
|
|
154
|
+
List of telescope IDs to filter the events
|
|
155
|
+
triggered_id : np.ndarray
|
|
156
|
+
Array of event IDs that triggered.
|
|
157
|
+
trigger_telescope_list_list : list
|
|
158
|
+
List of triggered telescopes for each event.
|
|
159
|
+
|
|
160
|
+
Returns
|
|
161
|
+
-------
|
|
162
|
+
tuple
|
|
163
|
+
Filtered triggered IDs and indices.
|
|
164
|
+
"""
|
|
165
|
+
triggered_indices = np.arange(len(triggered_id))
|
|
166
|
+
if telescope_list:
|
|
167
|
+
mask = np.array(
|
|
168
|
+
[
|
|
169
|
+
any(tel in event for tel in telescope_list)
|
|
170
|
+
for event in trigger_telescope_list_list
|
|
171
|
+
]
|
|
172
|
+
)
|
|
173
|
+
triggered_indices = triggered_indices[mask]
|
|
174
|
+
return triggered_id[mask], triggered_indices
|
|
175
|
+
return triggered_id, triggered_indices
|
|
176
|
+
|
|
177
|
+
def _derived_event_data(self):
|
|
178
|
+
"""Calculate core positions in shower coordinates and angular distances."""
|
|
179
|
+
for event_data in (self.shower_data, self.triggered_shower_data):
|
|
180
|
+
event_data.x_core_shower, event_data.y_core_shower = (
|
|
181
|
+
self._transform_to_shower_coordinates(
|
|
182
|
+
event_data.x_core,
|
|
183
|
+
event_data.y_core,
|
|
184
|
+
event_data.shower_azimuth,
|
|
185
|
+
event_data.shower_altitude,
|
|
186
|
+
)
|
|
187
|
+
)
|
|
188
|
+
event_data.core_distance_shower = np.sqrt(
|
|
189
|
+
event_data.x_core_shower**2 + event_data.y_core_shower**2
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
self.triggered_data.angular_distance = (
|
|
193
|
+
angular_separation(
|
|
194
|
+
self.triggered_shower_data.shower_azimuth,
|
|
195
|
+
self.triggered_shower_data.shower_altitude,
|
|
196
|
+
self.triggered_data.array_azimuths,
|
|
197
|
+
self.triggered_data.array_altitudes,
|
|
198
|
+
)
|
|
199
|
+
* 180
|
|
200
|
+
/ np.pi
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
def _transform_to_shower_coordinates(self, x_core, y_core, shower_azimuth, shower_altitude):
|
|
204
|
+
"""
|
|
205
|
+
Transform core positions from ground coordinates to shower coordinates.
|
|
206
|
+
|
|
207
|
+
Parameters
|
|
208
|
+
----------
|
|
209
|
+
x_core : np.ndarray
|
|
210
|
+
Core x positions in ground coordinates.
|
|
211
|
+
y_core : np.ndarray
|
|
212
|
+
Core y positions in ground coordinates.
|
|
213
|
+
shower_azimuth : np.ndarray
|
|
214
|
+
Shower azimuth angles.
|
|
215
|
+
shower_altitude : np.ndarray
|
|
216
|
+
Shower altitude angles.
|
|
217
|
+
|
|
218
|
+
Returns
|
|
219
|
+
-------
|
|
220
|
+
tuple
|
|
221
|
+
Core positions in shower coordinates (x, y).
|
|
222
|
+
"""
|
|
223
|
+
pointing = AltAz(az=shower_azimuth * u.rad, alt=shower_altitude * u.rad)
|
|
224
|
+
ground = GroundFrame(x=x_core * u.m, y=y_core * u.m, z=0 * u.m)
|
|
225
|
+
shower_frame = ground.transform_to(TiltedGroundFrame(pointing_direction=pointing))
|
|
226
|
+
|
|
227
|
+
return shower_frame.x.value, shower_frame.y.value
|
|
228
|
+
|
|
229
|
+
def print_dataset_information(self, n_events=1):
|
|
230
|
+
"""Print information about the datasets."""
|
|
231
|
+
|
|
232
|
+
def print_event_data(data, name):
|
|
233
|
+
"""Print event data."""
|
|
234
|
+
print(f"{name}: {data[:n_events]}")
|
|
235
|
+
|
|
236
|
+
print_event_data(self.triggered_shower_data.simulated_energy, "Simulated energy (TeV)")
|
|
237
|
+
print_event_data(self.triggered_shower_data.x_core, "Core x (m)")
|
|
238
|
+
print_event_data(self.triggered_shower_data.y_core, "Core y (m)")
|
|
239
|
+
print_event_data(self.triggered_shower_data.shower_azimuth, "Shower azimuth (rad)")
|
|
240
|
+
print_event_data(self.triggered_shower_data.shower_altitude, "Shower altitude (rad)")
|
|
241
|
+
print_event_data(self.triggered_shower_data.x_core_shower, "Core x shower (m)")
|
|
242
|
+
print_event_data(self.triggered_shower_data.y_core_shower, "Core y shower (m)")
|
|
243
|
+
print_event_data(
|
|
244
|
+
self.triggered_shower_data.core_distance_shower, "Core distance shower (m)"
|
|
245
|
+
)
|
|
246
|
+
print_event_data(self.triggered_data.array_azimuths, "Array azimuth (rad)")
|
|
247
|
+
print_event_data(self.triggered_data.array_altitudes, "Array altitude (rad)")
|
|
248
|
+
print_event_data(self.triggered_data.trigger_telescope_list_list, "Triggered telescopes")
|
|
249
|
+
print_event_data(
|
|
250
|
+
self.triggered_data.angular_distance, "Angular distance to pointing direction (deg)"
|
|
251
|
+
)
|
|
252
|
+
print("")
|
|
253
|
+
|
|
254
|
+
def print_event_table(self, lines_per_page=20):
|
|
255
|
+
"""Print event table with pagination.
|
|
256
|
+
|
|
257
|
+
Parameters
|
|
258
|
+
----------
|
|
259
|
+
lines_per_page : int
|
|
260
|
+
Number of lines to display before pausing (default: 20)
|
|
261
|
+
"""
|
|
262
|
+
print(
|
|
263
|
+
f"{'Counter':<10} {'Simulated Energy (TeV)':<20} {'Triggered Telescopes':<20} "
|
|
264
|
+
f"{'Core distance shower (m)':<20}"
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
for i, telescope_list in enumerate(self.triggered_data.trigger_telescope_list_list):
|
|
268
|
+
if i > 0 and i % lines_per_page == 0:
|
|
269
|
+
response = input("Press Enter to continue or 'q' to quit...")
|
|
270
|
+
if response.lower() == "q":
|
|
271
|
+
break
|
|
272
|
+
|
|
273
|
+
print(
|
|
274
|
+
f"{i:<10} {self.triggered_shower_data.simulated_energy[i]:<20.3f}"
|
|
275
|
+
f"{telescope_list} "
|
|
276
|
+
f"{self.triggered_shower_data.core_distance_shower[i]:<20.3f}"
|
|
277
|
+
)
|
|
278
|
+
print("")
|