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
@@ -5,11 +5,13 @@ a gitlab repository ('SimulationModels'). This module provides service
5
5
  functions to interact with and verify the repository.
6
6
  """
7
7
 
8
- import json
9
8
  import logging
10
- import shutil
11
9
  from pathlib import Path
12
10
 
11
+ from packaging.version import Version
12
+ from packaging.version import parse as parse_version
13
+
14
+ import simtools.data_model.model_data_writer as writer
13
15
  from simtools.io import ascii_handler
14
16
  from simtools.utils import names
15
17
 
@@ -136,101 +138,186 @@ def _get_model_parameter_file_path(
136
138
  )
137
139
 
138
140
 
139
- def copy_and_update_production_table(args_dict):
141
+ def generate_new_production(modifications, simulation_models_path):
140
142
  """
141
- Copy and update simulation model production tables.
143
+ Generate a new production definition (production tables and model parameters).
144
+
145
+ The following steps are performed:
146
+
147
+ - copy of production tables from an existing base model version
148
+ - update production tables with changes defined in a YAML file
149
+ - generate new model parameter entries for changed parameters
150
+ - allows for full or patch updates
142
151
 
143
152
  Parameters
144
153
  ----------
145
- args_dict: dict
146
- Dictionary containing the arguments for copying and updating production tables.
154
+ modifications: str
155
+ Path to the YAML file defining the changes to be applied.
156
+ simulation_models_path: str
157
+ Path to the simulation models repository.
147
158
  """
148
- modifications = ascii_handler.collect_data_from_file(args_dict["modifications"])
149
- changes = modifications.get("changes", {})
159
+ modifications = ascii_handler.collect_data_from_file(modifications)
160
+ model_version_history = modifications.get("model_version_history", [])
161
+ try:
162
+ # oldest version is the base version
163
+ base_model_version = min(set(model_version_history), key=Version)
164
+ except ValueError as exc:
165
+ raise ValueError(f"Base model version not found in {modifications}") from exc
150
166
  model_version = modifications["model_version"]
167
+ changes = modifications.get("changes", {})
151
168
 
152
- simulation_models_path = Path(args_dict["simulation_models_path"])
153
- source_prod_table_path = (
154
- simulation_models_path / "productions" / args_dict["source_prod_table_dir"]
169
+ _apply_changes_to_production_tables(
170
+ changes,
171
+ base_model_version,
172
+ model_version,
173
+ modifications.get("model_update", "full_update"),
174
+ simulation_models_path,
155
175
  )
156
- target_prod_table_path = simulation_models_path / "productions" / model_version
157
- model_parameters_dir = simulation_models_path / "model_parameters"
158
176
 
159
- _logger.info(
160
- f"Copying production tables from {source_prod_table_path} to {target_prod_table_path}"
161
- )
177
+ _apply_changes_to_model_parameters(changes, simulation_models_path)
162
178
 
163
- if Path(target_prod_table_path).exists():
164
- raise FileExistsError(
165
- f"The target production table directory '{target_prod_table_path}' already exists."
166
- )
167
- shutil.copytree(source_prod_table_path, target_prod_table_path)
168
179
 
169
- _apply_changes_to_production_tables(target_prod_table_path, changes, model_version)
180
+ def _apply_changes_to_production_tables(
181
+ changes, base_model_version, model_version, update_type, simulation_models_path
182
+ ):
183
+ """
184
+ Apply changes to production tables and write them to target directory.
170
185
 
171
- for telescope, parameters in changes.items():
172
- for param, param_data in parameters.items():
173
- if param_data.get("value"):
174
- _create_new_parameter_entry(telescope, param, param_data, model_parameters_dir)
186
+ Parameters
187
+ ----------
188
+ changes: dict
189
+ The changes to be applied.
190
+ base_model_version: str
191
+ The base model version (source directory for production tables).
192
+ model_version: str
193
+ The model version to be set in the JSON data.
194
+ update_type: str
195
+ Update mode, either 'full_update' or 'patch_update'.
196
+ simulation_models_path: Path
197
+ Path to the simulation models repository.
198
+ """
199
+ source = simulation_models_path / "productions" / base_model_version
200
+ target = simulation_models_path / "productions" / model_version
201
+ _logger.info(f"Production tables {update_type} from {source} to {target}")
202
+ target.mkdir(parents=True, exist_ok=True)
203
+
204
+ # load existing tables
205
+ tables = {}
206
+ for file_path in Path(source).rglob("*.json"):
207
+ data = ascii_handler.collect_data_from_file(file_path)
208
+ if not isinstance(data, dict):
209
+ raise TypeError(f"Unsupported data type {type(data)} in {file_path}")
210
+ tables[data["production_table_name"]] = data
175
211
 
212
+ # placeholder for new tables
213
+ for table_name in changes:
214
+ tables.setdefault(table_name, {})
176
215
 
177
- def _apply_changes_to_production_tables(target_prod_table_path, changes, model_version):
178
- """Apply changes to the production tables in the target directory."""
179
- for file_path in Path(target_prod_table_path).rglob("*.json"):
180
- if file_path.name.startswith("configuration"):
181
- continue
182
- data = ascii_handler.collect_data_from_file(file_path)
183
- _apply_changes_to_production_table(data, changes, model_version)
184
- with file_path.open("w", encoding="utf-8") as f:
185
- json.dump(data, f, indent=4, sort_keys=True)
186
- f.write("\n")
216
+ for table_name, data in tables.items():
217
+ if _apply_changes_to_production_table(
218
+ table_name, data, changes, model_version, update_type == "patch_update"
219
+ ):
220
+ _logger.info(f"Writing updated production table '{table_name}'")
221
+ data["production_table_name"] = table_name
222
+ ascii_handler.write_data_to_file(data, target / f"{table_name}.json", sort_keys=True)
187
223
 
188
224
 
189
- def _apply_changes_to_production_table(data, changes, model_version):
225
+ def _apply_changes_to_production_table(table_name, data, changes, model_version, patch_update):
190
226
  """
191
- Recursively apply changes to the new production tables.
227
+ Apply changes to a single production table.
192
228
 
193
229
  Parameters
194
230
  ----------
195
- data: dict or list
196
- The JSON data to be updated.
231
+ data: dict
232
+ The data to be updated.
197
233
  changes: dict
198
234
  The changes to be applied.
199
235
  model_version: str
200
236
  The model version to be set in the JSON data.
237
+ patch_update: bool
238
+ True if patch update (modify only changed parameters), False for full update.
239
+
240
+ Returns
241
+ -------
242
+ bool
243
+ True if data was modified and should be written to disk (patch updates);
244
+ always True for full updates.
201
245
  """
202
- if isinstance(data, dict):
203
- if "model_version" in data:
204
- data["model_version"] = model_version
205
- _update_parameters(data.get("parameters", {}), changes)
206
-
207
- elif isinstance(data, list):
208
- for item in data:
209
- _apply_changes_to_production_table(item, changes, model_version)
210
-
211
-
212
- def _update_parameters(params, changes):
213
- """Update parameters in the given dictionary based on changes."""
214
- for telescope, updates in changes.items():
215
- if telescope not in params:
216
- continue
217
- for param, param_data in updates.items():
218
- if param in params[telescope]:
219
- old = params[telescope][param]
220
- new = param_data["version"]
221
- _logger.info(f"Updating '{telescope} - {param}' from {old} to {new}")
222
- params[telescope][param] = new
223
- else:
224
- _logger.info(
225
- f"Adding new parameter '{telescope} - {param}' "
226
- f"with version {param_data['version']}"
246
+ data["model_version"] = model_version
247
+ if table_name in changes:
248
+ table_parameters = {} if patch_update else data.get("parameters", {}).get(table_name, {})
249
+ parameters, deprecated = _update_parameters_dict(table_parameters, changes, table_name)
250
+ data["parameters"] = parameters
251
+ if deprecated:
252
+ data["deprecated_parameters"] = deprecated
253
+ elif patch_update:
254
+ return False
255
+
256
+ return True
257
+
258
+
259
+ def _update_parameters_dict(table_parameters, changes, table_name):
260
+ """
261
+ Create a new parameters dictionary for the production tables.
262
+
263
+ Include only changes relevant to the specific telescope.
264
+ Do not include parameters if 'deprecated' flag is set to True.
265
+
266
+ Parameters
267
+ ----------
268
+ table_parameters: dict
269
+ Parameters for the specific table.
270
+ changes: dict
271
+ The changes to be applied, containing table and parameter information.
272
+ table_name: str
273
+ The name of the production table to filter parameters for.
274
+
275
+ Returns
276
+ -------
277
+ dict, list
278
+ Dictionary containing only the new/changed parameters for the specified table.
279
+ List of deprecated parameters.
280
+ """
281
+ new_params = {table_name: table_parameters}
282
+ deprecated_params = []
283
+
284
+ for param, data in changes[table_name].items():
285
+ if data.get("deprecated", False):
286
+ _logger.info(f"Removing model parameter '{table_name} - {param}'")
287
+ deprecated_params.append(param)
288
+ else:
289
+ version = data["version"]
290
+ _logger.info(f"Setting '{table_name} - {param}' to version {version}")
291
+ new_params[table_name][param] = version
292
+
293
+ return new_params, deprecated_params
294
+
295
+
296
+ def _apply_changes_to_model_parameters(changes, simulation_models_path):
297
+ """
298
+ Apply changes to model parameters by creating new parameter entries.
299
+
300
+ Parameters
301
+ ----------
302
+ changes: dict
303
+ The changes to be applied.
304
+ simulation_models_path: Path
305
+ Path to the simulation models directory.
306
+ """
307
+ for telescope, parameters in changes.items():
308
+ for param, param_data in parameters.items():
309
+ if param_data.get("value") is not None:
310
+ _create_new_model_parameter_entry(
311
+ telescope, param, param_data, simulation_models_path
227
312
  )
228
- params[telescope][param] = param_data["version"]
229
313
 
230
314
 
231
- def _create_new_parameter_entry(telescope, param, param_data, model_parameters_dir):
315
+ def _create_new_model_parameter_entry(telescope, param, param_data, simulation_models_path):
232
316
  """
233
- Create new model parameter JSON file by copying the latest version and updating fields.
317
+ Create new model parameter entry in the model parameters directory.
318
+
319
+ If a model parameter files exists, copy latest version and update the fields.
320
+ Otherwise generate new file using the model parameter schema.
234
321
 
235
322
  Parameters
236
323
  ----------
@@ -240,41 +327,40 @@ def _create_new_parameter_entry(telescope, param, param_data, model_parameters_d
240
327
  Name of the parameter.
241
328
  param_data: dict
242
329
  Dictionary containing the parameter data including version and value.
243
- model_parameters_dir: str
244
- Path to the model parameters directory.
330
+ simulation_models_path: Path
331
+ Path to the simulation models directory.
245
332
  """
246
- telescope_dir = Path(model_parameters_dir) / telescope
333
+ telescope_dir = simulation_models_path / "model_parameters" / telescope
247
334
  if not telescope_dir.exists():
248
- raise FileNotFoundError(
249
- f"Directory for telescope '{telescope}' does not exist in '{model_parameters_dir}'."
250
- )
335
+ _logger.info(f"Create directory for array element '{telescope}': '{telescope_dir}'.")
336
+ telescope_dir.mkdir(parents=True, exist_ok=True)
251
337
 
252
338
  param_dir = telescope_dir / param
253
- if not param_dir.exists():
254
- raise FileNotFoundError(
255
- f"Directory for parameter '{param}' does not exist in '{telescope}'."
339
+ try:
340
+ latest_file = _get_latest_model_parameter_file(param_dir, param)
341
+ except FileNotFoundError:
342
+ latest_file = None
343
+
344
+ if latest_file is not None:
345
+ json_data = ascii_handler.collect_data_from_file(latest_file)
346
+ param_data["version"] = _check_for_major_version_jump(
347
+ json_data, param_data, param, telescope
256
348
  )
257
-
258
- latest_file = _get_latest_model_parameter_file(param_dir, param)
259
- if not latest_file:
260
- raise FileNotFoundError(
261
- f"No files found for parameter '{param}' in directory '{param_dir}'."
262
- )
263
-
264
- json_data = ascii_handler.collect_data_from_file(latest_file)
265
-
266
- json_data["parameter_version"] = _update_model_parameter_version(
267
- json_data, param_data, param, telescope
349
+ # important for e.g. nsb_pixel_rate
350
+ if isinstance(json_data["value"], list) and not isinstance(param_data["value"], list):
351
+ param_data["value"] = [param_data["value"]] * len(json_data["value"])
352
+ param_data["meta_parameter"] = json_data.get("meta_parameter", False)
353
+
354
+ writer.ModelDataWriter.dump_model_parameter(
355
+ parameter_name=param,
356
+ value=param_data["value"],
357
+ instrument=telescope,
358
+ parameter_version=param_data["version"],
359
+ output_file=f"{param}-{param_data['version']}.json",
360
+ output_path=param_dir,
361
+ unit=param_data.get("unit"),
362
+ meta_parameter=param_data.get("meta_parameter", False),
268
363
  )
269
- json_data["value"] = param_data["value"]
270
-
271
- new_file_name = f"{param}-{param_data['version']}.json"
272
- new_file_path = param_dir / new_file_name
273
-
274
- with new_file_path.open("w", encoding="utf-8") as f:
275
- json.dump(json_data, f, indent=4)
276
- f.write("\n")
277
- _logger.info(f"Created new model parameter JSON file: {new_file_path}")
278
364
 
279
365
 
280
366
  def _get_latest_model_parameter_file(directory, parameter):
@@ -307,21 +393,23 @@ def _get_latest_model_parameter_file(directory, parameter):
307
393
  f"No JSON files found for parameter '{parameter}' in directory '{directory}'."
308
394
  )
309
395
 
310
- # Sort files by version number (assumes version is part of the filename)
311
- def safe_parse_version(filename):
312
- version_str = filename.stem.split("-")[-1]
313
- parts = version_str.split(".")
314
- return tuple(part.zfill(8) for part in parts)
396
+ def extract_version(path: Path):
397
+ # version is part after first '-'
398
+ return parse_version(path.stem.split("-", 1)[1])
399
+
400
+ latest_file = max(files, key=extract_version)
401
+ return str(latest_file)
315
402
 
316
- files.sort(key=safe_parse_version)
317
- return str(files[-1])
318
403
 
404
+ def _check_for_major_version_jump(json_data, param_data, param, telescope):
405
+ """
406
+ Check for major version jump and print a warning if necessary.
319
407
 
320
- def _update_model_parameter_version(json_data, param_data, param, telescope):
321
- """Check for major version jump and print a warning if necessary."""
322
- latest_version = int(json_data.get("parameter_version", "0").split(".")[0])
323
- new_version = int(param_data["version"].split(".")[0])
324
- if new_version > latest_version + 1:
408
+ Generally a jump from e.g. '3.1.0' to '5.0.0' should be avoided.
409
+ """
410
+ latest_version = parse_version(json_data.get("parameter_version", "0"))
411
+ new_version = parse_version(param_data["version"])
412
+ if new_version.major > latest_version.major + 1:
325
413
  _logger.warning(
326
414
  f"Major version jump from {latest_version} to {new_version} "
327
415
  f"for parameter '{param}' in telescope '{telescope}'."
@@ -3,6 +3,7 @@
3
3
 
4
4
  import math
5
5
 
6
+ from simtools.model.calibration_model import CalibrationModel
6
7
  from simtools.model.site_model import SiteModel
7
8
  from simtools.model.telescope_model import TelescopeModel
8
9
  from simtools.utils import names
@@ -13,9 +14,11 @@ __all__ = [
13
14
  ]
14
15
 
15
16
 
16
- def initialize_simulation_models(label, db_config, site, telescope_name, model_version):
17
+ def initialize_simulation_models(
18
+ label, db_config, model_version, site, telescope_name, calibration_device_name=None
19
+ ):
17
20
  """
18
- Initialize simulation models for a single telescope and site model.
21
+ Initialize simulation models for a single telescope, site, and calibration device model.
19
22
 
20
23
  Parameters
21
24
  ----------
@@ -23,17 +26,19 @@ def initialize_simulation_models(label, db_config, site, telescope_name, model_v
23
26
  Label for the simulation.
24
27
  db_config: dict
25
28
  Database configuration.
29
+ model_version: str
30
+ Version of the simulation model
26
31
  site: str
27
32
  Name of the site.
28
33
  telescope_name: str
29
34
  Name of the telescope.
30
- model_version: str
31
- Version of the simulation model
35
+ calibration_device_name: str, optional
36
+ Name of the calibration device.
32
37
 
33
38
  Returns
34
39
  -------
35
40
  Tuple
36
- Tuple containing the telescope model and site model.
41
+ Tuple containing the telescope site, (optional) calibration device model.
37
42
  """
38
43
  tel_model = TelescopeModel(
39
44
  site=site,
@@ -48,9 +53,19 @@ def initialize_simulation_models(label, db_config, site, telescope_name, model_v
48
53
  mongo_db_config=db_config,
49
54
  label=label,
50
55
  )
56
+ if calibration_device_name is not None:
57
+ calibration_model = CalibrationModel(
58
+ site=site,
59
+ calibration_device_model_name=calibration_device_name,
60
+ mongo_db_config=db_config,
61
+ model_version=model_version,
62
+ label=label,
63
+ )
64
+ else:
65
+ calibration_model = None
51
66
  for model in tel_model, site_model:
52
67
  model.export_model_files()
53
- return tel_model, site_model
68
+ return tel_model, site_model, calibration_model
54
69
 
55
70
 
56
71
  def compute_telescope_transmission(pars: list[float], off_axis: float) -> float:
@@ -378,3 +378,23 @@ class TelescopeModel(ModelParameter):
378
378
  except InvalidModelParameterError as exc:
379
379
  self._logger.error(f"Coordinate system {coordinate_system} not found.")
380
380
  raise exc
381
+
382
+ def get_calibration_device_name(self, device_type):
383
+ """
384
+ Get the calibration device name for this telescope.
385
+
386
+ Parameters
387
+ ----------
388
+ device_type: str
389
+ Type of the calibration device (e.g., 'flasher', 'illuminator')
390
+
391
+ Returns
392
+ -------
393
+ str or None
394
+ Calibration device name or None if not defined.
395
+ """
396
+ try:
397
+ devices = self.get_parameter_value("calibration_devices") or {}
398
+ except InvalidModelParameterError:
399
+ return None
400
+ return devices.get(device_type)
@@ -116,7 +116,7 @@ def write_results(results, args_dict):
116
116
  """
117
117
  table = _create_results_table(results, args_dict["loss_fraction"])
118
118
 
119
- output_dir = io_handler.IOHandler().get_output_directory("corsika_limits")
119
+ output_dir = io_handler.IOHandler().get_output_directory()
120
120
  output_file = output_dir / args_dict["output_file"]
121
121
 
122
122
  table.write(output_file, format="ascii.ecsv", overwrite=True)
@@ -80,12 +80,12 @@ class IncidentAnglesCalculator:
80
80
  config_data["site"],
81
81
  config_data["telescope"],
82
82
  )
83
- self.telescope_model, self.site_model = initialize_simulation_models(
84
- self.label,
85
- db_config,
86
- config_data["site"],
87
- config_data["telescope"],
88
- config_data["model_version"],
83
+ self.telescope_model, self.site_model, _ = initialize_simulation_models(
84
+ label=self.label,
85
+ db_config=db_config,
86
+ site=config_data["site"],
87
+ telescope_name=config_data["telescope"],
88
+ model_version=config_data["model_version"],
89
89
  )
90
90
 
91
91
  def _label_suffix(self):
@@ -110,7 +110,7 @@ class IncidentAnglesCalculator:
110
110
  Table containing at least the ``angle_incidence_focal`` column
111
111
  and, when configured, primary/secondary angles and hit geometry.
112
112
  """
113
- self.telescope_model.write_sim_telarray_config_file(additional_model=self.site_model)
113
+ self.telescope_model.write_sim_telarray_config_file(additional_models=self.site_model)
114
114
 
115
115
  photons_file, stars_file, log_file = self._prepare_psf_io_files()
116
116
  run_script = self._write_run_script(photons_file, stars_file, log_file)
@@ -70,7 +70,7 @@ class MirrorPanelPSF:
70
70
  site_model : SiteModel
71
71
  The site model.
72
72
  """
73
- tel_model, site_model = initialize_simulation_models(
73
+ tel_model, site_model, _ = initialize_simulation_models(
74
74
  label=label,
75
75
  db_config=db_config,
76
76
  site=self.args_dict["site"],