gammasimtools 0.20.0__py3-none-any.whl → 0.22.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.
Files changed (315) hide show
  1. {gammasimtools-0.20.0.dist-info → gammasimtools-0.22.0.dist-info}/METADATA +2 -3
  2. {gammasimtools-0.20.0.dist-info → gammasimtools-0.22.0.dist-info}/RECORD +313 -296
  3. {gammasimtools-0.20.0.dist-info → gammasimtools-0.22.0.dist-info}/entry_points.txt +3 -2
  4. simtools/_version.py +2 -2
  5. simtools/applications/calculate_incident_angles.py +1 -4
  6. simtools/applications/convert_all_model_parameters_from_simtel.py +1 -2
  7. simtools/applications/convert_model_parameter_from_simtel.py +0 -1
  8. simtools/applications/db_generate_compound_indexes.py +4 -17
  9. simtools/applications/db_upload_model_repository.py +122 -0
  10. simtools/applications/derive_psf_parameters.py +71 -42
  11. simtools/applications/docs_produce_array_element_report.py +1 -1
  12. simtools/applications/docs_produce_calibration_reports.py +1 -1
  13. simtools/applications/docs_produce_model_parameter_reports.py +1 -1
  14. simtools/applications/docs_produce_simulation_configuration_report.py +1 -1
  15. simtools/applications/generate_corsika_histograms.py +8 -185
  16. simtools/applications/maintain_simulation_model_add_production.py +81 -0
  17. simtools/applications/merge_tables.py +1 -1
  18. simtools/applications/plot_array_layout.py +1 -2
  19. simtools/applications/plot_simtel_events.py +2 -228
  20. simtools/applications/print_version.py +8 -7
  21. simtools/applications/production_derive_statistics.py +1 -2
  22. simtools/applications/production_generate_grid.py +1 -1
  23. simtools/applications/simulate_flasher.py +74 -72
  24. simtools/applications/simulate_illuminator.py +52 -186
  25. simtools/applications/{simulate_calibration_events.py → simulate_pedestals.py} +9 -55
  26. simtools/applications/submit_model_parameter_from_external.py +0 -1
  27. simtools/applications/validate_camera_efficiency.py +0 -1
  28. simtools/applications/validate_camera_fov.py +1 -2
  29. simtools/applications/validate_cumulative_psf.py +2 -3
  30. simtools/applications/validate_file_using_schema.py +20 -12
  31. simtools/applications/validate_optics.py +2 -2
  32. simtools/camera/camera_efficiency.py +8 -11
  33. simtools/configuration/commandline_parser.py +1 -7
  34. simtools/configuration/configurator.py +0 -2
  35. simtools/corsika/corsika_config.py +9 -11
  36. simtools/corsika/corsika_histograms.py +82 -1
  37. simtools/data_model/model_data_writer.py +87 -25
  38. simtools/data_model/schema.py +61 -2
  39. simtools/data_model/validate_data.py +1 -1
  40. simtools/db/db_handler.py +103 -48
  41. simtools/db/db_model_upload.py +247 -16
  42. simtools/io/io_handler.py +31 -83
  43. simtools/job_execution/job_manager.py +45 -0
  44. simtools/layout/array_layout_utils.py +1 -5
  45. simtools/model/array_model.py +93 -42
  46. simtools/model/model_parameter.py +20 -9
  47. simtools/model/model_repository.py +197 -109
  48. simtools/model/model_utils.py +21 -6
  49. simtools/model/telescope_model.py +20 -0
  50. simtools/production_configuration/derive_corsika_limits.py +1 -1
  51. simtools/ray_tracing/incident_angles.py +7 -7
  52. simtools/ray_tracing/mirror_panel_psf.py +1 -1
  53. simtools/ray_tracing/psf_parameter_optimisation.py +1106 -565
  54. simtools/ray_tracing/ray_tracing.py +1 -3
  55. simtools/reporting/docs_read_parameters.py +171 -101
  56. simtools/resources/array_elements.yml +26 -0
  57. simtools/runners/corsika_simtel_runner.py +11 -17
  58. simtools/runners/runner_services.py +5 -6
  59. simtools/runners/simtools_runner.py +0 -2
  60. simtools/schemas/application_workflow.metaschema.yml +1 -1
  61. simtools/schemas/common_definitions.schema.yml +39 -0
  62. simtools/schemas/model_parameter.metaschema.yml +19 -13
  63. simtools/schemas/model_parameter_and_data_schema.metaschema.yml +6 -12
  64. simtools/schemas/model_parameters/adjust_gain.schema.yml +0 -5
  65. simtools/schemas/model_parameters/altitude.schema.yml +0 -5
  66. simtools/schemas/model_parameters/array_coordinates.schema.yml +0 -5
  67. simtools/schemas/model_parameters/array_coordinates_UTM.schema.yml +0 -5
  68. simtools/schemas/model_parameters/array_element_position_ground.schema.yml +0 -7
  69. simtools/schemas/model_parameters/array_element_position_utm.schema.yml +0 -7
  70. simtools/schemas/model_parameters/array_layouts.schema.yml +0 -5
  71. simtools/schemas/model_parameters/array_triggers.schema.yml +0 -5
  72. simtools/schemas/model_parameters/array_window.schema.yml +0 -7
  73. simtools/schemas/model_parameters/asum_clipping.schema.yml +0 -3
  74. simtools/schemas/model_parameters/asum_offset.schema.yml +0 -7
  75. simtools/schemas/model_parameters/asum_shaping.schema.yml +0 -7
  76. simtools/schemas/model_parameters/asum_threshold.schema.yml +0 -7
  77. simtools/schemas/model_parameters/atmospheric_profile.schema.yml +0 -5
  78. simtools/schemas/model_parameters/atmospheric_transmission.schema.yml +0 -5
  79. simtools/schemas/model_parameters/axes_offsets.schema.yml +0 -7
  80. simtools/schemas/model_parameters/calibration_devices.schema.yml +30 -0
  81. simtools/schemas/model_parameters/camera_body_diameter.schema.yml +0 -7
  82. simtools/schemas/model_parameters/camera_body_shape.schema.yml +0 -7
  83. simtools/schemas/model_parameters/camera_config_file.schema.yml +0 -7
  84. simtools/schemas/model_parameters/camera_config_rotate.schema.yml +0 -7
  85. simtools/schemas/model_parameters/camera_degraded_efficiency.schema.yml +0 -7
  86. simtools/schemas/model_parameters/camera_degraded_map.schema.yml +0 -7
  87. simtools/schemas/model_parameters/camera_depth.schema.yml +0 -7
  88. simtools/schemas/model_parameters/camera_filter.schema.yml +0 -7
  89. simtools/schemas/model_parameters/camera_filter_incidence_angle.schema.yml +0 -3
  90. simtools/schemas/model_parameters/camera_pixels.schema.yml +0 -7
  91. simtools/schemas/model_parameters/camera_transmission.schema.yml +0 -7
  92. simtools/schemas/model_parameters/channels_per_chip.schema.yml +0 -7
  93. simtools/schemas/model_parameters/correct_nsb_spectrum_to_telescope_altitude.schema.yml +0 -7
  94. simtools/schemas/model_parameters/corsika_observation_level.schema.yml +0 -5
  95. simtools/schemas/model_parameters/dark_events.schema.yml +4 -3
  96. simtools/schemas/model_parameters/default_trigger.schema.yml +0 -7
  97. simtools/schemas/model_parameters/design_model.schema.yml +0 -7
  98. simtools/schemas/model_parameters/disc_ac_coupled.schema.yml +0 -7
  99. simtools/schemas/model_parameters/disc_bins.schema.yml +0 -7
  100. simtools/schemas/model_parameters/disc_start.schema.yml +0 -7
  101. simtools/schemas/model_parameters/discriminator_amplitude.schema.yml +0 -7
  102. simtools/schemas/model_parameters/discriminator_fall_time.schema.yml +0 -7
  103. simtools/schemas/model_parameters/discriminator_gate_length.schema.yml +0 -7
  104. simtools/schemas/model_parameters/discriminator_hysteresis.schema.yml +0 -7
  105. simtools/schemas/model_parameters/discriminator_output_amplitude.schema.yml +0 -7
  106. simtools/schemas/model_parameters/discriminator_output_var_percent.schema.yml +0 -7
  107. simtools/schemas/model_parameters/discriminator_pulse_shape.schema.yml +0 -7
  108. simtools/schemas/model_parameters/discriminator_rise_time.schema.yml +0 -7
  109. simtools/schemas/model_parameters/discriminator_scale_threshold.schema.yml +0 -7
  110. simtools/schemas/model_parameters/discriminator_sigsum_over_threshold.schema.yml +0 -7
  111. simtools/schemas/model_parameters/discriminator_threshold.schema.yml +0 -7
  112. simtools/schemas/model_parameters/discriminator_time_over_threshold.schema.yml +1 -9
  113. simtools/schemas/model_parameters/discriminator_var_gate_length.schema.yml +0 -7
  114. simtools/schemas/model_parameters/discriminator_var_sigsum_over_threshold.schema.yml +0 -7
  115. simtools/schemas/model_parameters/discriminator_var_threshold.schema.yml +0 -7
  116. simtools/schemas/model_parameters/discriminator_var_time_over_threshold.schema.yml +0 -7
  117. simtools/schemas/model_parameters/dish_shape_length.schema.yml +0 -5
  118. simtools/schemas/model_parameters/dsum_clipping.schema.yml +1 -5
  119. simtools/schemas/model_parameters/dsum_ignore_below.schema.yml +0 -3
  120. simtools/schemas/model_parameters/dsum_offset.schema.yml +0 -3
  121. simtools/schemas/model_parameters/dsum_pedsub.schema.yml +0 -3
  122. simtools/schemas/model_parameters/dsum_pre_clipping.schema.yml +0 -3
  123. simtools/schemas/model_parameters/dsum_prescale.schema.yml +0 -3
  124. simtools/schemas/model_parameters/dsum_presum_max.schema.yml +0 -3
  125. simtools/schemas/model_parameters/dsum_presum_shift.schema.yml +0 -3
  126. simtools/schemas/model_parameters/dsum_shaping.schema.yml +0 -3
  127. simtools/schemas/model_parameters/dsum_shaping_renormalize.schema.yml +0 -3
  128. simtools/schemas/model_parameters/dsum_threshold.schema.yml +2 -12
  129. simtools/schemas/model_parameters/dsum_zero_clip.schema.yml +0 -3
  130. simtools/schemas/model_parameters/effective_focal_length.schema.yml +0 -7
  131. simtools/schemas/model_parameters/epsg_code.schema.yml +0 -5
  132. simtools/schemas/model_parameters/fadc_ac_coupled.schema.yml +0 -7
  133. simtools/schemas/model_parameters/fadc_amplitude.schema.yml +2 -9
  134. simtools/schemas/model_parameters/fadc_bins.schema.yml +0 -7
  135. simtools/schemas/model_parameters/fadc_compensate_pedestal.schema.yml +0 -7
  136. simtools/schemas/model_parameters/fadc_dev_pedestal.schema.yml +0 -2
  137. simtools/schemas/model_parameters/fadc_err_compensate_pedestal.schema.yml +0 -7
  138. simtools/schemas/model_parameters/fadc_err_pedestal.schema.yml +0 -7
  139. simtools/schemas/model_parameters/fadc_lg_amplitude.schema.yml +2 -9
  140. simtools/schemas/model_parameters/fadc_lg_compensate_pedestal.schema.yml +0 -7
  141. simtools/schemas/model_parameters/fadc_lg_dev_pedestal.schema.yml +0 -2
  142. simtools/schemas/model_parameters/fadc_lg_err_compensate_pedestal.schema.yml +0 -7
  143. simtools/schemas/model_parameters/fadc_lg_err_pedestal.schema.yml +0 -7
  144. simtools/schemas/model_parameters/fadc_lg_max_signal.schema.yml +0 -7
  145. simtools/schemas/model_parameters/fadc_lg_max_sum.schema.yml +0 -2
  146. simtools/schemas/model_parameters/fadc_lg_noise.schema.yml +0 -7
  147. simtools/schemas/model_parameters/fadc_lg_pedestal.schema.yml +0 -7
  148. simtools/schemas/model_parameters/fadc_lg_sensitivity.schema.yml +0 -7
  149. simtools/schemas/model_parameters/fadc_lg_sysvar_pedestal.schema.yml +0 -7
  150. simtools/schemas/model_parameters/fadc_lg_var_pedestal.schema.yml +0 -7
  151. simtools/schemas/model_parameters/fadc_lg_var_sensitivity.schema.yml +0 -7
  152. simtools/schemas/model_parameters/fadc_long_event_threshold.schema.yml +0 -3
  153. simtools/schemas/model_parameters/fadc_long_sum_bins.schema.yml +0 -3
  154. simtools/schemas/model_parameters/fadc_long_sum_offset.schema.yml +0 -3
  155. simtools/schemas/model_parameters/fadc_max_signal.schema.yml +0 -7
  156. simtools/schemas/model_parameters/fadc_max_sum.schema.yml +0 -2
  157. simtools/schemas/model_parameters/fadc_mhz.schema.yml +0 -7
  158. simtools/schemas/model_parameters/fadc_noise.schema.yml +0 -7
  159. simtools/schemas/model_parameters/fadc_pedestal.schema.yml +0 -7
  160. simtools/schemas/model_parameters/fadc_pulse_shape.schema.yml +0 -7
  161. simtools/schemas/model_parameters/fadc_sensitivity.schema.yml +0 -7
  162. simtools/schemas/model_parameters/fadc_sum_bins.schema.yml +0 -7
  163. simtools/schemas/model_parameters/fadc_sum_offset.schema.yml +0 -7
  164. simtools/schemas/model_parameters/fadc_sysvar_pedestal.schema.yml +0 -7
  165. simtools/schemas/model_parameters/fadc_var_pedestal.schema.yml +0 -7
  166. simtools/schemas/model_parameters/fadc_var_sensitivity.schema.yml +0 -7
  167. simtools/schemas/model_parameters/fake_mirror_list.schema.yml +0 -3
  168. simtools/schemas/model_parameters/flasher_angular_distribution.schema.yml +32 -0
  169. simtools/schemas/model_parameters/flasher_angular_distribution_width.schema.yml +32 -0
  170. simtools/schemas/model_parameters/flasher_bunch_size.schema.yml +28 -0
  171. simtools/schemas/model_parameters/flasher_external_trigger.schema.yml +32 -0
  172. simtools/schemas/model_parameters/flasher_photons.schema.yml +34 -0
  173. simtools/schemas/model_parameters/flasher_position.schema.yml +43 -0
  174. simtools/schemas/model_parameters/flasher_pulse_exp_decay.schema.yml +29 -0
  175. simtools/schemas/model_parameters/flasher_pulse_offset.schema.yml +35 -0
  176. simtools/schemas/model_parameters/flasher_pulse_shape.schema.yml +30 -0
  177. simtools/schemas/model_parameters/flasher_pulse_width.schema.yml +32 -0
  178. simtools/schemas/model_parameters/flasher_type.schema.yml +28 -0
  179. simtools/schemas/model_parameters/flasher_var_photons.schema.yml +31 -0
  180. simtools/schemas/model_parameters/flasher_wavelength.schema.yml +33 -0
  181. simtools/schemas/model_parameters/flatfielding.schema.yml +0 -7
  182. simtools/schemas/model_parameters/focal_length.schema.yml +0 -7
  183. simtools/schemas/model_parameters/focal_surface_parameters.schema.yml +0 -3
  184. simtools/schemas/model_parameters/focal_surface_ref_radius.schema.yml +0 -3
  185. simtools/schemas/model_parameters/focus_offset.schema.yml +0 -7
  186. simtools/schemas/model_parameters/gain_variation.schema.yml +0 -7
  187. simtools/schemas/model_parameters/geomag_horizontal.schema.yml +2 -7
  188. simtools/schemas/model_parameters/geomag_rotation.schema.yml +2 -7
  189. simtools/schemas/model_parameters/geomag_vertical.schema.yml +2 -7
  190. simtools/schemas/model_parameters/hg_lg_variation.schema.yml +0 -5
  191. simtools/schemas/model_parameters/iobuf_maximum.schema.yml +0 -7
  192. simtools/schemas/model_parameters/iobuf_output_maximum.schema.yml +0 -7
  193. simtools/schemas/model_parameters/laser_events.schema.yml +4 -3
  194. simtools/schemas/model_parameters/laser_external_trigger.schema.yml +4 -3
  195. simtools/schemas/model_parameters/laser_photons.schema.yml +4 -3
  196. simtools/schemas/model_parameters/laser_pulse_exptime.schema.yml +4 -3
  197. simtools/schemas/model_parameters/laser_pulse_offset.schema.yml +4 -3
  198. simtools/schemas/model_parameters/laser_pulse_sigtime.schema.yml +4 -3
  199. simtools/schemas/model_parameters/laser_pulse_twidth.schema.yml +4 -3
  200. simtools/schemas/model_parameters/laser_var_photons.schema.yml +4 -3
  201. simtools/schemas/model_parameters/laser_wavelength.schema.yml +4 -3
  202. simtools/schemas/model_parameters/led_events.schema.yml +4 -3
  203. simtools/schemas/model_parameters/led_photons.schema.yml +4 -3
  204. simtools/schemas/model_parameters/led_pulse_offset.schema.yml +4 -3
  205. simtools/schemas/model_parameters/led_pulse_sigtime.schema.yml +4 -3
  206. simtools/schemas/model_parameters/led_var_photons.schema.yml +4 -3
  207. simtools/schemas/model_parameters/lightguide_efficiency_vs_incidence_angle.schema.yml +0 -7
  208. simtools/schemas/model_parameters/lightguide_efficiency_vs_wavelength.schema.yml +0 -7
  209. simtools/schemas/model_parameters/min_photoelectrons.schema.yml +0 -7
  210. simtools/schemas/model_parameters/min_photons.schema.yml +0 -7
  211. simtools/schemas/model_parameters/mirror_align_random_distance.schema.yml +0 -5
  212. simtools/schemas/model_parameters/mirror_align_random_horizontal.schema.yml +0 -7
  213. simtools/schemas/model_parameters/mirror_align_random_vertical.schema.yml +0 -7
  214. simtools/schemas/model_parameters/mirror_class.schema.yml +2 -9
  215. simtools/schemas/model_parameters/mirror_degraded_reflection.schema.yml +0 -7
  216. simtools/schemas/model_parameters/mirror_focal_length.schema.yml +0 -5
  217. simtools/schemas/model_parameters/mirror_list.schema.yml +0 -7
  218. simtools/schemas/model_parameters/mirror_offset.schema.yml +0 -7
  219. simtools/schemas/model_parameters/mirror_reflection_random_angle.schema.yml +0 -7
  220. simtools/schemas/model_parameters/mirror_reflectivity.schema.yml +0 -7
  221. simtools/schemas/model_parameters/multiplicity_offset.schema.yml +0 -7
  222. simtools/schemas/model_parameters/muon_mono_threshold.schema.yml +0 -7
  223. simtools/schemas/model_parameters/nsb_autoscale_airmass.schema.yml +0 -7
  224. simtools/schemas/model_parameters/nsb_gain_drop_scale.schema.yml +0 -3
  225. simtools/schemas/model_parameters/nsb_offaxis.schema.yml +0 -7
  226. simtools/schemas/model_parameters/nsb_pixel_rate.schema.yml +0 -7
  227. simtools/schemas/model_parameters/nsb_reference_spectrum.schema.yml +0 -5
  228. simtools/schemas/model_parameters/nsb_reference_value.schema.yml +0 -5
  229. simtools/schemas/model_parameters/nsb_scaling_factor.schema.yml +0 -5
  230. simtools/schemas/model_parameters/nsb_sky_map.schema.yml +0 -5
  231. simtools/schemas/model_parameters/nsb_spectrum.schema.yml +0 -5
  232. simtools/schemas/model_parameters/num_gains.schema.yml +0 -7
  233. simtools/schemas/model_parameters/only_triggered_telescopes.schema.yml +0 -7
  234. simtools/schemas/model_parameters/optics_properties.schema.yml +0 -7
  235. simtools/schemas/model_parameters/parabolic_dish.schema.yml +0 -3
  236. simtools/schemas/model_parameters/pedestal_events.schema.yml +4 -7
  237. simtools/schemas/model_parameters/photon_delay.schema.yml +0 -7
  238. simtools/schemas/model_parameters/photons_per_run.schema.yml +4 -4
  239. simtools/schemas/model_parameters/pixel_cells.schema.yml +0 -3
  240. simtools/schemas/model_parameters/pixels_parallel.schema.yml +0 -3
  241. simtools/schemas/model_parameters/pixeltrg_time_step.schema.yml +0 -7
  242. simtools/schemas/model_parameters/pm_average_gain.schema.yml +0 -5
  243. simtools/schemas/model_parameters/pm_collection_efficiency.schema.yml +0 -5
  244. simtools/schemas/model_parameters/pm_gain_index.schema.yml +0 -5
  245. simtools/schemas/model_parameters/pm_photoelectron_spectrum.schema.yml +0 -7
  246. simtools/schemas/model_parameters/pm_transit_time.schema.yml +4 -9
  247. simtools/schemas/model_parameters/pm_voltage_variation.schema.yml +0 -5
  248. simtools/schemas/model_parameters/primary_mirror_degraded_map.schema.yml +0 -7
  249. simtools/schemas/model_parameters/primary_mirror_diameter.schema.yml +0 -3
  250. simtools/schemas/model_parameters/primary_mirror_hole_diameter.schema.yml +0 -3
  251. simtools/schemas/model_parameters/primary_mirror_incidence_angle.schema.yml +0 -3
  252. simtools/schemas/model_parameters/primary_mirror_parameters.schema.yml +0 -3
  253. simtools/schemas/model_parameters/primary_mirror_ref_radius.schema.yml +0 -3
  254. simtools/schemas/model_parameters/primary_mirror_segmentation.schema.yml +0 -3
  255. simtools/schemas/model_parameters/qe_variation.schema.yml +0 -7
  256. simtools/schemas/model_parameters/quantum_efficiency.schema.yml +0 -7
  257. simtools/schemas/model_parameters/random_focal_length.schema.yml +2 -7
  258. simtools/schemas/model_parameters/random_generator.schema.yml +0 -7
  259. simtools/schemas/model_parameters/random_mono_probability.schema.yml +0 -7
  260. simtools/schemas/model_parameters/reference_point_altitude.schema.yml +0 -5
  261. simtools/schemas/model_parameters/reference_point_latitude.schema.yml +0 -5
  262. simtools/schemas/model_parameters/reference_point_longitude.schema.yml +0 -5
  263. simtools/schemas/model_parameters/reference_point_utm_east.schema.yml +0 -5
  264. simtools/schemas/model_parameters/reference_point_utm_north.schema.yml +0 -5
  265. simtools/schemas/model_parameters/sampled_output.schema.yml +0 -7
  266. simtools/schemas/model_parameters/save_pe_with_amplitude.schema.yml +0 -7
  267. simtools/schemas/model_parameters/secondary_mirror_baffle.schema.yml +0 -3
  268. simtools/schemas/model_parameters/secondary_mirror_degraded_map.schema.yml +0 -3
  269. simtools/schemas/model_parameters/secondary_mirror_degraded_reflection.schema.yml +0 -3
  270. simtools/schemas/model_parameters/secondary_mirror_diameter.schema.yml +0 -3
  271. simtools/schemas/model_parameters/secondary_mirror_hole_diameter.schema.yml +0 -3
  272. simtools/schemas/model_parameters/secondary_mirror_incidence_angle.schema.yml +0 -3
  273. simtools/schemas/model_parameters/secondary_mirror_parameters.schema.yml +0 -3
  274. simtools/schemas/model_parameters/secondary_mirror_ref_radius.schema.yml +0 -3
  275. simtools/schemas/model_parameters/secondary_mirror_reflectivity.schema.yml +0 -3
  276. simtools/schemas/model_parameters/secondary_mirror_segmentation.schema.yml +0 -3
  277. simtools/schemas/model_parameters/secondary_mirror_shadow_diameter.schema.yml +0 -3
  278. simtools/schemas/model_parameters/secondary_mirror_shadow_offset.schema.yml +0 -3
  279. simtools/schemas/model_parameters/stars.schema.yml +0 -5
  280. simtools/schemas/model_parameters/store_photoelectrons.schema.yml +0 -7
  281. simtools/schemas/model_parameters/tailcut_scale.schema.yml +0 -7
  282. simtools/schemas/model_parameters/telescope_axis_height.schema.yml +0 -7
  283. simtools/schemas/model_parameters/telescope_random_angle.schema.yml +0 -7
  284. simtools/schemas/model_parameters/telescope_random_error.schema.yml +0 -7
  285. simtools/schemas/model_parameters/telescope_sphere_radius.schema.yml +0 -7
  286. simtools/schemas/model_parameters/telescope_transmission.schema.yml +0 -7
  287. simtools/schemas/model_parameters/teltrig_min_sigsum.schema.yml +0 -7
  288. simtools/schemas/model_parameters/teltrig_min_time.schema.yml +0 -7
  289. simtools/schemas/model_parameters/transit_time_calib_error.schema.yml +0 -7
  290. simtools/schemas/model_parameters/transit_time_compensate_error.schema.yml +0 -7
  291. simtools/schemas/model_parameters/transit_time_compensate_step.schema.yml +0 -7
  292. simtools/schemas/model_parameters/transit_time_error.schema.yml +0 -7
  293. simtools/schemas/model_parameters/transit_time_jitter.schema.yml +0 -7
  294. simtools/schemas/model_parameters/trigger_current_limit.schema.yml +0 -7
  295. simtools/schemas/model_parameters/trigger_delay_compensation.schema.yml +0 -7
  296. simtools/schemas/model_parameters/trigger_pixels.schema.yml +0 -7
  297. simtools/schemas/production_tables.schema.yml +8 -8
  298. simtools/schemas/simulation_models_info.schema.yml +78 -0
  299. simtools/simtel/simtel_config_writer.py +88 -14
  300. simtools/simtel/simulator_array.py +44 -74
  301. simtools/simtel/simulator_light_emission.py +336 -629
  302. simtools/simtel/simulator_ray_tracing.py +2 -2
  303. simtools/simulator.py +46 -18
  304. simtools/testing/configuration.py +4 -2
  305. simtools/testing/sim_telarray_metadata.py +4 -4
  306. simtools/utils/geometry.py +34 -0
  307. simtools/version.py +111 -0
  308. simtools/{corsika/corsika_histograms_visualize.py → visualization/plot_corsika_histograms.py} +109 -0
  309. simtools/visualization/plot_psf.py +775 -0
  310. simtools/visualization/plot_simtel_events.py +284 -87
  311. simtools/applications/maintain_simulation_model_add_production_table.py +0 -71
  312. simtools/model/flasher_model.py +0 -106
  313. {gammasimtools-0.20.0.dist-info → gammasimtools-0.22.0.dist-info}/WHEEL +0 -0
  314. {gammasimtools-0.20.0.dist-info → gammasimtools-0.22.0.dist-info}/licenses/LICENSE +0 -0
  315. {gammasimtools-0.20.0.dist-info → gammasimtools-0.22.0.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,7 @@
2
2
  """Plots for light emission (flasher/calibration) sim_telarray events."""
3
3
 
4
4
  import logging
5
+ from pathlib import Path
5
6
 
6
7
  import astropy.units as u
7
8
  import matplotlib.pyplot as plt
@@ -11,7 +12,12 @@ from ctapipe.io import EventSource
11
12
  from ctapipe.visualization import CameraDisplay
12
13
  from scipy import signal as _signal
13
14
 
15
+ from simtools.data_model.metadata_collector import MetadataCollector
16
+ from simtools.visualization.plot_corsika_histograms import save_figs_to_pdf
17
+ from simtools.visualization.visualize import save_figure
18
+
14
19
  __all__ = [
20
+ "generate_and_save_plots",
15
21
  "plot_simtel_event_image",
16
22
  "plot_simtel_integrated_pedestal_image",
17
23
  "plot_simtel_integrated_signal_image",
@@ -29,10 +35,45 @@ NO_R1_WAVEFORMS_MSG = "No R1 waveforms available in event"
29
35
  TIME_NS_LABEL = "time [ns]"
30
36
  R1_SAMPLES_LABEL = "R1 samples [d.c.]"
31
37
 
38
+ # Choices understood by the dispatcher used below
39
+ PLOT_CHOICES = {
40
+ "event_image": "event_image",
41
+ "time_traces": "time_traces",
42
+ "waveform_matrix": "waveform_matrix",
43
+ "step_traces": "step_traces",
44
+ "integrated_signal_image": "integrated_signal_image",
45
+ "integrated_pedestal_image": "integrated_pedestal_image",
46
+ "peak_timing": "peak_timing",
47
+ "all": "all",
48
+ }
49
+
50
+
51
+ def _get_event_source_and_r1_tel(filename, event_index=None, warn_context=None):
52
+ """Return (source, event, first_r1_tel_id) or None if unavailable.
32
53
 
33
- def _compute_integration_window(
34
- peak_idx: int, n_samp: int, half_width: int, mode: str, offset: int | None
35
- ) -> tuple[int, int]:
54
+ Centralizes creation of EventSource, event selection, and first R1 tel-id lookup.
55
+
56
+ When no event exists, logs a standard warning. When the event has no R1 tel data,
57
+ logs either a contextual message ("Event has no R1 data for <context>") if
58
+ warn_context is provided, or the generic "First event has no R1 telescope data".
59
+ """
60
+ source = EventSource(filename, max_events=None)
61
+ event = _select_event_by_type(source)(event_index=event_index)
62
+ if not event:
63
+ _logger.warning("No event found in the file.")
64
+ return None
65
+
66
+ tel_ids = sorted(getattr(event.r1, "tel", {}).keys())
67
+ if not tel_ids:
68
+ if warn_context:
69
+ _logger.warning("Event has no R1 data for %s", warn_context)
70
+ else:
71
+ _logger.warning("First event has no R1 telescope data")
72
+ return None
73
+ return source, event, int(tel_ids[0])
74
+
75
+
76
+ def _compute_integration_window(peak_idx, n_samp, half_width, mode, offset):
36
77
  """Return [a, b) window bounds for integration for signal/pedestal modes."""
37
78
  hw = int(half_width)
38
79
  win_len = 2 * hw + 1
@@ -53,9 +94,7 @@ def _compute_integration_window(
53
94
  return a, b
54
95
 
55
96
 
56
- def _format_integrated_title(
57
- tel_label: str, et_name: str, half_width: int, mode: str, offset: int | None
58
- ) -> str:
97
+ def _format_integrated_title(tel_label, et_name, half_width, mode, offset):
59
98
  win_len = 2 * int(half_width) + 1
60
99
  if mode == "signal":
61
100
  return f"{tel_label} integrated signal (win {win_len}) ({et_name})"
@@ -138,17 +177,10 @@ def plot_simtel_event_image(filename, distance=None, event_index=None):
138
177
  matplotlib.figure.Figure | None
139
178
  The created figure, or ``None`` if no suitable event/image is available.
140
179
  """
141
- source = EventSource(filename, max_events=None)
142
- event = _select_event_by_type(source)(event_index=event_index)
143
- if not event:
144
- _logger.warning("No event found in the file.")
145
- return None
146
-
147
- tel_ids = sorted(getattr(event.r1, "tel", {}).keys())
148
- if not tel_ids:
149
- _logger.warning("First event has no R1 telescope data")
180
+ prepared = _get_event_source_and_r1_tel(filename, event_index=event_index, warn_context=None)
181
+ if prepared is None:
150
182
  return None
151
- tel_id = tel_ids[0]
183
+ source, event, tel_id = prepared
152
184
 
153
185
  calib = CameraCalibrator(subarray=source.subarray)
154
186
  calib(event)
@@ -198,9 +230,9 @@ def plot_simtel_event_image(filename, distance=None, event_index=None):
198
230
 
199
231
  def plot_simtel_time_traces(
200
232
  filename,
201
- tel_id: int | None = None,
202
- n_pixels: int = 3,
203
- event_index: int | None = None,
233
+ tel_id=None,
234
+ n_pixels=3,
235
+ event_index=None,
204
236
  ):
205
237
  """
206
238
  Plot R1 time traces for a few pixels of one event.
@@ -221,15 +253,13 @@ def plot_simtel_time_traces(
221
253
  matplotlib.figure.Figure | None
222
254
  The created figure, or ``None`` if R1 waveforms are unavailable.
223
255
  """
224
- source = EventSource(filename, max_events=None)
225
- event = _select_event_by_type(source)(event_index=event_index)
226
-
227
- r1_tel_ids = sorted(getattr(event.r1, "tel", {}).keys())
228
- if r1_tel_ids:
229
- tel_id = tel_id or r1_tel_ids[0]
230
- else:
231
- dl1_tel_ids = sorted(getattr(event.dl1, "tel", {}).keys())
232
- tel_id = tel_id or dl1_tel_ids[0]
256
+ prepared = _get_event_source_and_r1_tel(
257
+ filename, event_index=event_index, warn_context="time traces plot"
258
+ )
259
+ if prepared is None:
260
+ return None
261
+ source, event, tel_id_default = prepared
262
+ tel_id = tel_id or tel_id_default
233
263
 
234
264
  calib = CameraCalibrator(subarray=source.subarray)
235
265
  try:
@@ -273,10 +303,10 @@ def plot_simtel_time_traces(
273
303
 
274
304
  def plot_simtel_waveform_matrix(
275
305
  filename,
276
- tel_id: int | None = None,
277
- vmax: float | None = None,
278
- event_index: int | None = None,
279
- pixel_step: int | None = None,
306
+ tel_id=None,
307
+ vmax=None,
308
+ event_index=None,
309
+ pixel_step=None,
280
310
  ):
281
311
  """
282
312
  Create a pseudocolor image of R1 waveforms (sample index vs. pixel id).
@@ -299,15 +329,13 @@ def plot_simtel_waveform_matrix(
299
329
  matplotlib.figure.Figure | None
300
330
  The created figure, or ``None`` if R1 waveforms are unavailable.
301
331
  """
302
- source = EventSource(filename, max_events=None)
303
- event = _select_event_by_type(source)(event_index=event_index)
304
-
305
- r1_tel_ids = sorted(getattr(event.r1, "tel", {}).keys())
306
- if r1_tel_ids:
307
- tel_id = tel_id or r1_tel_ids[0]
308
- else:
309
- _logger.warning("Event has no R1 data for waveform plot")
332
+ prepared = _get_event_source_and_r1_tel(
333
+ filename, event_index=event_index, warn_context="waveform plot"
334
+ )
335
+ if prepared is None:
310
336
  return None
337
+ source, event, tel_id_default = prepared
338
+ tel_id = tel_id or tel_id_default
311
339
 
312
340
  waveforms = getattr(event.r1.tel.get(tel_id, None), "waveform", None)
313
341
  if waveforms is None:
@@ -342,10 +370,10 @@ def plot_simtel_waveform_matrix(
342
370
 
343
371
  def plot_simtel_step_traces(
344
372
  filename,
345
- tel_id: int | None = None,
346
- pixel_step: int = 100,
347
- max_pixels: int | None = None,
348
- event_index: int | None = None,
373
+ tel_id=None,
374
+ pixel_step=100,
375
+ max_pixels=None,
376
+ event_index=None,
349
377
  ):
350
378
  """
351
379
  Plot step-style R1 traces for regularly sampled pixels (0, N, 2N, ...).
@@ -368,15 +396,13 @@ def plot_simtel_step_traces(
368
396
  matplotlib.figure.Figure | None
369
397
  The created figure, or ``None`` if R1 waveforms are unavailable.
370
398
  """
371
- source = EventSource(filename, max_events=None)
372
- event = _select_event_by_type(source)(event_index=event_index)
373
-
374
- r1_tel_ids = sorted(getattr(event.r1, "tel", {}).keys())
375
- if r1_tel_ids:
376
- tel_id = tel_id or r1_tel_ids[0]
377
- else:
378
- _logger.warning("Event has no R1 data for traces plot")
399
+ prepared = _get_event_source_and_r1_tel(
400
+ filename, event_index=event_index, warn_context="traces plot"
401
+ )
402
+ if prepared is None:
379
403
  return None
404
+ source, event, tel_id_default = prepared
405
+ tel_id = tel_id or tel_id_default
380
406
 
381
407
  waveforms = getattr(event.r1.tel.get(tel_id, None), "waveform", None)
382
408
  if waveforms is None:
@@ -583,13 +609,13 @@ def _draw_peak_hist(
583
609
 
584
610
  def plot_simtel_peak_timing(
585
611
  filename,
586
- tel_id: int | None = None,
587
- sum_threshold: float = 10.0,
588
- peak_width: int = 8,
589
- examples: int = 3,
590
- timing_bins: int | None = None,
591
- return_stats: bool = False,
592
- event_index: int | None = None,
612
+ tel_id=None,
613
+ sum_threshold=10.0,
614
+ peak_width=8,
615
+ examples=3,
616
+ timing_bins=None,
617
+ return_stats=False,
618
+ event_index=None,
593
619
  ):
594
620
  """
595
621
  Peak finding per pixel; report mean/std of peak sample and plot a histogram.
@@ -620,15 +646,13 @@ def plot_simtel_peak_timing(
620
646
  ``return_stats`` is True, a tuple ``(fig, stats)`` is returned, where
621
647
  ``stats`` has keys ``{"considered", "found", "mean", "std"}``.
622
648
  """
623
- source = EventSource(filename, max_events=None)
624
- event = _select_event_by_type(source)(event_index=event_index)
625
-
626
- r1_tel_ids = sorted(getattr(event.r1, "tel", {}).keys())
627
- if r1_tel_ids:
628
- tel_id = tel_id or r1_tel_ids[0]
629
- else:
630
- _logger.warning("Event has no R1 data for peak timing plot")
649
+ prepared = _get_event_source_and_r1_tel(
650
+ filename, event_index=event_index, warn_context="peak timing plot"
651
+ )
652
+ if prepared is None:
631
653
  return None
654
+ source, event, tel_id_default = prepared
655
+ tel_id = tel_id or tel_id_default
632
656
 
633
657
  waveforms = getattr(event.r1.tel.get(tel_id, None), "waveform", None)
634
658
  if waveforms is None:
@@ -718,15 +742,13 @@ def _prepare_waveforms_for_image(filename, tel_id, context_no_r1, event_index=No
718
742
  ``n_samp`` are integers, and ``source``, ``event`` and ``tel_id`` are
719
743
  the ctapipe objects used. Returns ``None`` on failure.
720
744
  """
721
- source = EventSource(filename, max_events=None)
722
- event = _select_event_by_type(source)(event_index=event_index)
723
-
724
- r1_tel_ids = sorted(getattr(event.r1, "tel", {}).keys())
725
- if r1_tel_ids:
726
- tel_id = tel_id or r1_tel_ids[0]
727
- else:
728
- _logger.warning(f"Event has no R1 data for {context_no_r1}")
745
+ prepared = _get_event_source_and_r1_tel(
746
+ filename, event_index=event_index, warn_context=context_no_r1
747
+ )
748
+ if prepared is None:
729
749
  return None
750
+ source, event, tel_id_default = prepared
751
+ tel_id = tel_id or tel_id_default
730
752
 
731
753
  waveforms = getattr(event.r1.tel.get(tel_id, None), "waveform", None)
732
754
  if waveforms is None:
@@ -742,9 +764,9 @@ def _prepare_waveforms_for_image(filename, tel_id, context_no_r1, event_index=No
742
764
 
743
765
  def plot_simtel_integrated_signal_image(
744
766
  filename,
745
- tel_id: int | None = None,
746
- half_width: int = 8,
747
- event_index: int | None = None,
767
+ tel_id=None,
768
+ half_width=8,
769
+ event_index=None,
748
770
  ):
749
771
  """Plot camera image of integrated signal per pixel around the flasher peak."""
750
772
  return _plot_simtel_integrated_image(
@@ -758,10 +780,10 @@ def plot_simtel_integrated_signal_image(
758
780
 
759
781
  def plot_simtel_integrated_pedestal_image(
760
782
  filename,
761
- tel_id: int | None = None,
762
- half_width: int = 8,
763
- offset: int = 16,
764
- event_index: int | None = None,
783
+ tel_id=None,
784
+ half_width=8,
785
+ offset=16,
786
+ event_index=None,
765
787
  ):
766
788
  """Plot camera image of integrated pedestal per pixel away from the flasher peak."""
767
789
  return _plot_simtel_integrated_image(
@@ -776,11 +798,11 @@ def plot_simtel_integrated_pedestal_image(
776
798
 
777
799
  def _plot_simtel_integrated_image(
778
800
  filename,
779
- tel_id: int | None,
780
- half_width: int,
781
- event_index: int | None,
782
- mode: str,
783
- offset: int | None = None,
801
+ tel_id,
802
+ half_width,
803
+ event_index,
804
+ mode,
805
+ offset=None,
784
806
  ):
785
807
  """Shared implementation for integrated signal/pedestal images.
786
808
 
@@ -814,3 +836,178 @@ def _plot_simtel_integrated_image(
814
836
  ax.set_axis_off()
815
837
  fig.tight_layout()
816
838
  return fig
839
+
840
+
841
+ def _make_output_paths(ioh, base, input_file):
842
+ """Return (out_dir, pdf_path) based on base name and input file."""
843
+ out_dir = ioh.get_output_directory()
844
+ pdf_path = ioh.get_output_file(f"{base}_{input_file.stem}" if base else input_file.stem)
845
+ pdf_path = Path(f"{pdf_path}.pdf") if Path(pdf_path).suffix != ".pdf" else Path(pdf_path)
846
+ return out_dir, pdf_path
847
+
848
+
849
+ def _call_peak_timing(
850
+ filename,
851
+ tel_id=None,
852
+ sum_threshold=10.0,
853
+ peak_width=8,
854
+ examples=3,
855
+ timing_bins=None,
856
+ event_index=None,
857
+ ):
858
+ """Call plot_simtel_peak_timing while tolerating older signature.
859
+
860
+ Returns a matplotlib Figure or None.
861
+ """
862
+ try:
863
+ fig_stats = plot_simtel_peak_timing(
864
+ filename,
865
+ tel_id=tel_id,
866
+ sum_threshold=sum_threshold,
867
+ peak_width=peak_width,
868
+ examples=examples,
869
+ timing_bins=timing_bins,
870
+ return_stats=True,
871
+ event_index=event_index,
872
+ )
873
+ return fig_stats[0] if isinstance(fig_stats, tuple) else fig_stats
874
+ except TypeError:
875
+ return plot_simtel_peak_timing(
876
+ filename,
877
+ tel_id=tel_id,
878
+ sum_threshold=sum_threshold,
879
+ peak_width=peak_width,
880
+ examples=examples,
881
+ timing_bins=timing_bins,
882
+ event_index=event_index,
883
+ )
884
+
885
+
886
+ def _collect_figures_for_file(
887
+ filename,
888
+ plots,
889
+ args,
890
+ out_dir,
891
+ base_stem,
892
+ save_pngs,
893
+ dpi,
894
+ ):
895
+ """Generate selected plots for a single sim_telarray file.
896
+
897
+ Returns a list of figures. If ``save_pngs`` is True, also writes PNGs to ``out_dir``.
898
+ """
899
+ figures = []
900
+
901
+ def add(fig, tag):
902
+ if fig is not None:
903
+ figures.append(fig)
904
+ if save_pngs:
905
+ base_path = out_dir / f"{base_stem}_{tag}"
906
+ try:
907
+ save_figure(fig, base_path, figure_format=["png"], dpi=int(dpi))
908
+ except Exception as ex: # pylint:disable=broad-except
909
+ _logger.warning("Failed to save PNG %s: %s", base_path.with_suffix(".png"), ex)
910
+ else:
911
+ _logger.warning("Plot '%s' returned no figure for %s", tag, filename)
912
+
913
+ plots_to_run = (
914
+ [
915
+ "event_image",
916
+ "time_traces",
917
+ "waveform_matrix",
918
+ "step_traces",
919
+ "integrated_signal_image",
920
+ "integrated_pedestal_image",
921
+ "peak_timing",
922
+ ]
923
+ if "all" in plots
924
+ else list(plots)
925
+ )
926
+
927
+ dispatch = {
928
+ "event_image": (
929
+ plot_simtel_event_image,
930
+ {"distance": None, "event_index": None},
931
+ ),
932
+ "time_traces": (
933
+ plot_simtel_time_traces,
934
+ {"tel_id": None, "n_pixels": 3, "event_index": None},
935
+ ),
936
+ "waveform_matrix": (
937
+ plot_simtel_waveform_matrix,
938
+ {"tel_id": None, "vmax": None, "event_index": None},
939
+ ),
940
+ "step_traces": (
941
+ plot_simtel_step_traces,
942
+ {"tel_id": None, "pixel_step": None, "max_pixels": None, "event_index": None},
943
+ ),
944
+ "integrated_signal_image": (
945
+ plot_simtel_integrated_signal_image,
946
+ {"tel_id": None, "half_width": 8, "event_index": None},
947
+ ),
948
+ "integrated_pedestal_image": (
949
+ plot_simtel_integrated_pedestal_image,
950
+ {"tel_id": None, "half_width": 8, "offset": 16, "event_index": None},
951
+ ),
952
+ "peak_timing": (
953
+ _call_peak_timing,
954
+ {
955
+ "tel_id": None,
956
+ "sum_threshold": 10.0,
957
+ "peak_width": 8,
958
+ "examples": 3,
959
+ "timing_bins": None,
960
+ "event_index": None,
961
+ },
962
+ ),
963
+ }
964
+
965
+ for plot_name in plots_to_run:
966
+ entry = dispatch.get(plot_name)
967
+ if entry is None:
968
+ _logger.warning("Unknown plot selection '%s'", plot_name)
969
+ continue
970
+ func, defaults = entry
971
+ kwargs = {k: args.get(k, v) for k, v in defaults.items()}
972
+ fig = func(filename, **kwargs) # type: ignore[misc]
973
+ add(fig, plot_name)
974
+
975
+ return figures
976
+
977
+
978
+ def generate_and_save_plots(
979
+ simtel_files,
980
+ plots,
981
+ args,
982
+ ioh,
983
+ ):
984
+ """Generate plots for files and save a multi-page PDF per input.
985
+
986
+ Also writes metadata JSON next to the PDF.
987
+ """
988
+ for simtel in simtel_files:
989
+ out_dir, pdf_path = _make_output_paths(ioh, args.get("output_file"), simtel)
990
+ figures = _collect_figures_for_file(
991
+ filename=simtel,
992
+ plots=plots,
993
+ args=args,
994
+ out_dir=out_dir,
995
+ base_stem=simtel.stem,
996
+ save_pngs=bool(args.get("save_pngs", False)),
997
+ dpi=int(args.get("dpi", 300)),
998
+ )
999
+
1000
+ if not figures:
1001
+ _logger.warning("No figures produced for %s", simtel)
1002
+ continue
1003
+
1004
+ try:
1005
+ save_figs_to_pdf(figures, pdf_path)
1006
+ _logger.info("Saved PDF: %s", pdf_path)
1007
+ except Exception as ex: # pylint:disable=broad-except
1008
+ _logger.error("Failed to save PDF %s: %s", pdf_path, ex)
1009
+
1010
+ try:
1011
+ MetadataCollector.dump(args, pdf_path, add_activity_name=True)
1012
+ except Exception as ex: # pylint:disable=broad-except
1013
+ _logger.warning("Failed to write metadata for %s: %s", pdf_path, ex)
@@ -1,71 +0,0 @@
1
- r"""
2
- Generate new simulation model production tables by copying existing table and apply modifications.
3
-
4
- This script should be used to maintain the simulation model repository. It allow to create a
5
- new production table by copying an existing base version and apply modification defined in a YAML
6
- file (see the example file listed below).
7
-
8
- Example
9
- -------
10
- .. code-block:: console
11
-
12
- simtools-maintain-simulation-model-add-production-table \\
13
- --simulation_models_path ../simulation-models-dev/simulation-models/ \\
14
- --source_prod_table_dir 6.0.0 \\
15
- --modifications tests/resources/production_tables_changes_for_threshold_study_6.2.0.yml
16
-
17
- """
18
-
19
- import logging
20
- from pathlib import Path
21
-
22
- import simtools.utils.general as gen
23
- from simtools.configuration import configurator
24
- from simtools.model import model_repository
25
-
26
-
27
- def _parse(label, description):
28
- """
29
- Parse command line arguments.
30
-
31
- Returns
32
- -------
33
- dict
34
- Parsed command-line arguments.
35
- """
36
- config = configurator.Configurator(label=label, description=description)
37
- config.parser.add_argument(
38
- "--simulation_models_path",
39
- type=str,
40
- required=True,
41
- help="Path to the simulation models repository.",
42
- )
43
- config.parser.add_argument(
44
- "--source_prod_table_dir",
45
- type=str,
46
- required=True,
47
- help="The source production table directory to copy from.",
48
- )
49
- config.parser.add_argument(
50
- "--modifications",
51
- type=str,
52
- required=True,
53
- help="File containing the list of changes to apply.",
54
- )
55
-
56
- return config.initialize(db_config=False, output=False)
57
-
58
-
59
- def main(): # noqa: D103
60
- label = Path(__file__).stem
61
- args_dict, _ = _parse(
62
- label=label, description=("Copy and update simulation model production tables.")
63
- )
64
- logger = logging.getLogger()
65
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
66
-
67
- model_repository.copy_and_update_production_table(args_dict)
68
-
69
-
70
- if __name__ == "__main__":
71
- main()
@@ -1,106 +0,0 @@
1
- """Definition and modeling of a flasher device."""
2
-
3
- import logging
4
-
5
- from simtools.model.model_parameter import ModelParameter
6
-
7
- __all__ = ["FlasherModel"]
8
-
9
-
10
- class FlasherModel(ModelParameter):
11
- """
12
- FlasherModel represents the MC model of an individual flasher device.
13
-
14
- It provides functionality to read the required parameters from the DB.
15
- Flasher devices are used for flat fielding of the camera pixels.
16
-
17
- Parameters
18
- ----------
19
- site: str
20
- Site name (e.g., South or North).
21
- flasher_device_model_name: str
22
- Flasher device model name (ex. FLSN-01, FLSS-01, ...).
23
- mongo_db_config: dict
24
- MongoDB configuration.
25
- model_version: str
26
- Model version.
27
- label: str, optional
28
- Instance label. Important for output file naming.
29
- """
30
-
31
- def __init__(
32
- self,
33
- site: str,
34
- flasher_device_model_name: str,
35
- mongo_db_config: dict,
36
- model_version: str,
37
- label: str | None = None,
38
- ):
39
- # Minimal dummy DB to avoid real DB access
40
- class _DummyDB: # pylint: disable=too-few-public-methods
41
- def get_design_model(self, *_, **__):
42
- return {}
43
-
44
- def get_model_parameters(self, *_, **__):
45
- return {}
46
-
47
- def get_simulation_configuration_parameters(self, *_, **__):
48
- return {}
49
-
50
- def export_model_files(self, *_, **__):
51
- return None
52
-
53
- super().__init__(
54
- site=site,
55
- array_element_name=None, # bypass validation (no flasher in array_elements)
56
- collection="flasher_devices",
57
- mongo_db_config=mongo_db_config,
58
- model_version=model_version,
59
- db=_DummyDB(), # do not query DB
60
- label=label,
61
- )
62
-
63
- self._logger = logging.getLogger(__name__)
64
- self._logger.debug(f"Init FlasherModel {site} {flasher_device_model_name}")
65
-
66
- # Keep provided flasher name for reference/logging only
67
- self._flasher_device_model_name = flasher_device_model_name
68
-
69
- # Inject defaults for MST (single-mirror) when DB entries are missing.
70
- self._inject_mst_defaults_if_missing()
71
-
72
- def _inject_mst_defaults_if_missing(self):
73
- """Provide dummy defaults (here NectarCam) when flasher collection is absent."""
74
- defaults = {
75
- "photons_per_flasher": {"value": 2.5e6, "type": "float"},
76
- # Position near optical axis (cm)
77
- "flasher_position": {
78
- "value": [0.0, 0.0],
79
- "unit": "cm,cm",
80
- "type": "float_list",
81
- },
82
- # Distance flasher window to Winston cones (16.75 m)
83
- "flasher_depth": {"value": 1675.0, "unit": "cm", "type": "float"},
84
- # Received wavelength at PMT (nm)
85
- "spectrum": {"value": 392, "unit": "nm", "type": "float"},
86
- # Simple Gaussian pulse width (ns)
87
- "lightpulse": {"value": "Gauss:3.0", "type": "string"},
88
- # Store rise/decay for future use
89
- "rise_time_10_90": {"value": 2.5, "unit": "ns", "type": "float"},
90
- "decay_time_90_10": {"value": 5.0, "unit": "ns", "type": "float"},
91
- # Angular distribution width ~11 deg around axis
92
- "angular_distribution": {"value": "gauss:11", "type": "string"},
93
- "centroid_offset_deg": {"value": 0.5, "unit": "deg", "type": "float"},
94
- # Bunch size for LE
95
- "bunch_size": {"value": 1.0, "type": "float"},
96
- # Placeholder for future spectral file usage
97
- "spectrum_file": {"value": None, "type": "string"},
98
- }
99
-
100
- missing = []
101
- for key, entry in defaults.items():
102
- if key not in self.parameters:
103
- self.parameters[key] = entry
104
- missing.append(key)
105
- if missing:
106
- self._logger.info(f"Using built-in MST flasher defaults for: {', '.join(missing)}")