gammasimtools 0.17.0__py3-none-any.whl → 0.19.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 (363) hide show
  1. {gammasimtools-0.17.0.dist-info → gammasimtools-0.19.0.dist-info}/METADATA +27 -69
  2. gammasimtools-0.19.0.dist-info/RECORD +393 -0
  3. {gammasimtools-0.17.0.dist-info → gammasimtools-0.19.0.dist-info}/entry_points.txt +10 -2
  4. {gammasimtools-0.17.0.dist-info → gammasimtools-0.19.0.dist-info}/licenses/LICENSE +1 -1
  5. simtools/_version.py +16 -3
  6. simtools/applications/calculate_trigger_rate.py +1 -1
  7. simtools/applications/convert_all_model_parameters_from_simtel.py +4 -3
  8. simtools/applications/convert_geo_coordinates_of_array_elements.py +3 -3
  9. simtools/applications/db_add_simulation_model_from_repository_to_db.py +10 -1
  10. simtools/applications/db_add_value_from_json_to_db.py +2 -1
  11. simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +8 -13
  12. simtools/applications/db_generate_compound_indexes.py +61 -0
  13. simtools/applications/db_get_file_from_db.py +1 -1
  14. simtools/applications/db_get_parameter_from_db.py +4 -4
  15. simtools/applications/db_inspect_databases.py +20 -10
  16. simtools/applications/derive_mirror_rnda.py +18 -12
  17. simtools/applications/derive_psf_parameters.py +59 -309
  18. simtools/applications/docs_produce_array_element_report.py +1 -1
  19. simtools/applications/docs_produce_calibration_reports.py +1 -1
  20. simtools/applications/docs_produce_model_parameter_reports.py +1 -1
  21. simtools/applications/docs_produce_simulation_configuration_report.py +1 -1
  22. simtools/applications/generate_corsika_histograms.py +1 -1
  23. simtools/applications/generate_default_metadata.py +8 -24
  24. simtools/applications/generate_sim_telarray_histograms.py +1 -1
  25. simtools/applications/generate_simtel_event_data.py +97 -5
  26. simtools/applications/maintain_simulation_model_add_production_table.py +71 -0
  27. simtools/applications/maintain_simulation_model_compare_productions.py +98 -0
  28. simtools/applications/{verify_simulation_model_production_tables.py → maintain_simulation_model_verify_production_tables.py} +9 -1
  29. simtools/applications/merge_tables.py +16 -18
  30. simtools/applications/plot_array_layout.py +3 -3
  31. simtools/applications/plot_simtel_events.py +379 -0
  32. simtools/applications/plot_tabular_data.py +21 -3
  33. simtools/applications/plot_tabular_data_for_model_parameter.py +104 -0
  34. simtools/applications/print_version.py +8 -9
  35. simtools/applications/production_derive_corsika_limits.py +64 -27
  36. simtools/applications/production_derive_statistics.py +1 -1
  37. simtools/applications/production_generate_grid.py +2 -2
  38. simtools/applications/production_merge_corsika_limits.py +214 -0
  39. simtools/applications/run_application.py +47 -113
  40. simtools/applications/simulate_calibration_events.py +166 -0
  41. simtools/applications/simulate_flasher.py +141 -0
  42. simtools/applications/{simulate_light_emission.py → simulate_illuminator.py} +35 -99
  43. simtools/applications/simulate_prod.py +6 -24
  44. simtools/applications/simulate_prod_htcondor_generator.py +7 -0
  45. simtools/applications/submit_array_layouts.py +2 -1
  46. simtools/applications/submit_model_parameter_from_external.py +1 -1
  47. simtools/applications/validate_camera_efficiency.py +30 -12
  48. simtools/applications/validate_camera_fov.py +1 -1
  49. simtools/applications/validate_cumulative_psf.py +1 -1
  50. simtools/applications/validate_file_using_schema.py +2 -1
  51. simtools/applications/validate_optics.py +1 -1
  52. simtools/camera/camera_efficiency.py +61 -45
  53. simtools/camera/single_photon_electron_spectrum.py +1 -1
  54. simtools/configuration/commandline_parser.py +31 -1
  55. simtools/configuration/configurator.py +4 -4
  56. simtools/constants.py +2 -0
  57. simtools/corsika/corsika_config.py +45 -25
  58. simtools/corsika/corsika_histograms.py +6 -5
  59. simtools/data_model/data_reader.py +2 -3
  60. simtools/data_model/metadata_collector.py +32 -36
  61. simtools/data_model/metadata_model.py +15 -12
  62. simtools/data_model/model_data_writer.py +13 -32
  63. simtools/data_model/schema.py +88 -24
  64. simtools/data_model/validate_data.py +34 -9
  65. simtools/db/db_handler.py +48 -37
  66. simtools/db/db_model_upload.py +3 -3
  67. simtools/dependencies.py +88 -25
  68. simtools/io/ascii_handler.py +279 -0
  69. simtools/{io_operations → io}/io_handler.py +25 -3
  70. simtools/{io_operations/io_table_handler.py → io/table_handler.py} +1 -1
  71. simtools/job_execution/htcondor_script_generator.py +15 -4
  72. simtools/layout/array_layout.py +1 -1
  73. simtools/layout/array_layout_utils.py +19 -8
  74. simtools/model/array_model.py +28 -5
  75. simtools/model/flasher_model.py +106 -0
  76. simtools/model/model_parameter.py +4 -4
  77. simtools/model/model_repository.py +197 -2
  78. simtools/model/telescope_model.py +3 -1
  79. simtools/production_configuration/derive_corsika_limits.py +361 -427
  80. simtools/production_configuration/derive_production_statistics_handler.py +7 -6
  81. simtools/production_configuration/generate_production_grid.py +9 -11
  82. simtools/production_configuration/merge_corsika_limits.py +528 -0
  83. simtools/ray_tracing/mirror_panel_psf.py +1 -0
  84. simtools/ray_tracing/psf_parameter_optimisation.py +792 -0
  85. simtools/ray_tracing/ray_tracing.py +6 -2
  86. simtools/reporting/docs_read_parameters.py +150 -62
  87. simtools/resources/array-element-ids.json +126 -0
  88. simtools/runners/corsika_runner.py +1 -1
  89. simtools/runners/corsika_simtel_runner.py +14 -5
  90. simtools/runners/runner_services.py +10 -5
  91. simtools/runners/simtools_runner.py +267 -0
  92. simtools/schemas/application_workflow.metaschema.yml +101 -68
  93. simtools/schemas/input/MST_mirror_2f_measurements.schema.yml +1 -1
  94. simtools/schemas/input/single_pe_spectrum.schema.yml +1 -1
  95. simtools/schemas/metadata.metaschema.yml +577 -3
  96. simtools/schemas/model_parameter.metaschema.yml +6 -6
  97. simtools/schemas/model_parameter_and_data_schema.metaschema.yml +7 -3
  98. simtools/schemas/model_parameters/adjust_gain.schema.yml +1 -1
  99. simtools/schemas/model_parameters/altitude.schema.yml +1 -1
  100. simtools/schemas/model_parameters/array_coordinates.schema.yml +1 -1
  101. simtools/schemas/model_parameters/array_coordinates_UTM.schema.yml +1 -1
  102. simtools/schemas/model_parameters/array_element_position_ground.schema.yml +1 -1
  103. simtools/schemas/model_parameters/array_element_position_utm.schema.yml +1 -1
  104. simtools/schemas/model_parameters/array_layouts.schema.yml +1 -1
  105. simtools/schemas/model_parameters/array_triggers.schema.yml +1 -1
  106. simtools/schemas/model_parameters/array_window.schema.yml +1 -1
  107. simtools/schemas/model_parameters/asum_clipping.schema.yml +1 -1
  108. simtools/schemas/model_parameters/asum_offset.schema.yml +1 -1
  109. simtools/schemas/model_parameters/asum_shaping.schema.yml +1 -1
  110. simtools/schemas/model_parameters/asum_threshold.schema.yml +1 -1
  111. simtools/schemas/model_parameters/atmospheric_profile.schema.yml +42 -1
  112. simtools/schemas/model_parameters/atmospheric_transmission.schema.yml +44 -1
  113. simtools/schemas/model_parameters/axes_offsets.schema.yml +1 -1
  114. simtools/schemas/model_parameters/camera_body_diameter.schema.yml +1 -1
  115. simtools/schemas/model_parameters/camera_body_shape.schema.yml +1 -1
  116. simtools/schemas/model_parameters/camera_config_file.schema.yml +1 -1
  117. simtools/schemas/model_parameters/camera_config_rotate.schema.yml +1 -1
  118. simtools/schemas/model_parameters/camera_degraded_efficiency.schema.yml +1 -1
  119. simtools/schemas/model_parameters/camera_degraded_map.schema.yml +1 -1
  120. simtools/schemas/model_parameters/camera_depth.schema.yml +1 -1
  121. simtools/schemas/model_parameters/camera_filter.schema.yml +11 -1
  122. simtools/schemas/model_parameters/camera_filter_incidence_angle.schema.yml +11 -1
  123. simtools/schemas/model_parameters/camera_pixels.schema.yml +1 -1
  124. simtools/schemas/model_parameters/camera_transmission.schema.yml +1 -1
  125. simtools/schemas/model_parameters/channels_per_chip.schema.yml +1 -1
  126. simtools/schemas/model_parameters/correct_nsb_spectrum_to_telescope_altitude.schema.yml +1 -1
  127. simtools/schemas/model_parameters/corsika_cherenkov_photon_bunch_size.schema.yml +1 -1
  128. simtools/schemas/model_parameters/corsika_cherenkov_photon_wavelength_range.schema.yml +1 -1
  129. simtools/schemas/model_parameters/corsika_first_interaction_height.schema.yml +1 -1
  130. simtools/schemas/model_parameters/corsika_iact_io_buffer.schema.yml +1 -1
  131. simtools/schemas/model_parameters/corsika_iact_max_bunches.schema.yml +1 -1
  132. simtools/schemas/model_parameters/corsika_iact_split_auto.schema.yml +1 -1
  133. simtools/schemas/model_parameters/corsika_longitudinal_shower_development.schema.yml +1 -1
  134. simtools/schemas/model_parameters/corsika_observation_level.schema.yml +1 -1
  135. simtools/schemas/model_parameters/corsika_particle_kinetic_energy_cutoff.schema.yml +1 -1
  136. simtools/schemas/model_parameters/corsika_starting_grammage.schema.yml +3 -3
  137. simtools/schemas/model_parameters/dark_events.schema.yml +1 -1
  138. simtools/schemas/model_parameters/default_trigger.schema.yml +1 -1
  139. simtools/schemas/model_parameters/design_model.schema.yml +1 -1
  140. simtools/schemas/model_parameters/disc_ac_coupled.schema.yml +1 -1
  141. simtools/schemas/model_parameters/disc_bins.schema.yml +1 -1
  142. simtools/schemas/model_parameters/disc_start.schema.yml +1 -1
  143. simtools/schemas/model_parameters/discriminator_amplitude.schema.yml +1 -1
  144. simtools/schemas/model_parameters/discriminator_fall_time.schema.yml +1 -1
  145. simtools/schemas/model_parameters/discriminator_gate_length.schema.yml +1 -1
  146. simtools/schemas/model_parameters/discriminator_hysteresis.schema.yml +1 -1
  147. simtools/schemas/model_parameters/discriminator_output_amplitude.schema.yml +1 -1
  148. simtools/schemas/model_parameters/discriminator_output_var_percent.schema.yml +1 -1
  149. simtools/schemas/model_parameters/discriminator_pulse_shape.schema.yml +32 -1
  150. simtools/schemas/model_parameters/discriminator_rise_time.schema.yml +1 -1
  151. simtools/schemas/model_parameters/discriminator_scale_threshold.schema.yml +1 -1
  152. simtools/schemas/model_parameters/discriminator_sigsum_over_threshold.schema.yml +1 -1
  153. simtools/schemas/model_parameters/discriminator_threshold.schema.yml +1 -1
  154. simtools/schemas/model_parameters/discriminator_time_over_threshold.schema.yml +1 -1
  155. simtools/schemas/model_parameters/discriminator_var_gate_length.schema.yml +1 -1
  156. simtools/schemas/model_parameters/discriminator_var_sigsum_over_threshold.schema.yml +1 -1
  157. simtools/schemas/model_parameters/discriminator_var_threshold.schema.yml +1 -1
  158. simtools/schemas/model_parameters/discriminator_var_time_over_threshold.schema.yml +1 -1
  159. simtools/schemas/model_parameters/dish_shape_length.schema.yml +1 -1
  160. simtools/schemas/model_parameters/dsum_clipping.schema.yml +1 -1
  161. simtools/schemas/model_parameters/dsum_ignore_below.schema.yml +1 -1
  162. simtools/schemas/model_parameters/dsum_offset.schema.yml +1 -1
  163. simtools/schemas/model_parameters/dsum_pedsub.schema.yml +1 -1
  164. simtools/schemas/model_parameters/dsum_pre_clipping.schema.yml +1 -1
  165. simtools/schemas/model_parameters/dsum_prescale.schema.yml +1 -1
  166. simtools/schemas/model_parameters/dsum_presum_max.schema.yml +1 -1
  167. simtools/schemas/model_parameters/dsum_presum_shift.schema.yml +1 -1
  168. simtools/schemas/model_parameters/dsum_shaping.schema.yml +1 -1
  169. simtools/schemas/model_parameters/dsum_shaping_renormalize.schema.yml +1 -1
  170. simtools/schemas/model_parameters/dsum_threshold.schema.yml +2 -2
  171. simtools/schemas/model_parameters/dsum_zero_clip.schema.yml +1 -1
  172. simtools/schemas/model_parameters/effective_focal_length.schema.yml +1 -1
  173. simtools/schemas/model_parameters/epsg_code.schema.yml +1 -1
  174. simtools/schemas/model_parameters/fadc_ac_coupled.schema.yml +1 -1
  175. simtools/schemas/model_parameters/fadc_amplitude.schema.yml +1 -1
  176. simtools/schemas/model_parameters/fadc_bins.schema.yml +1 -1
  177. simtools/schemas/model_parameters/fadc_compensate_pedestal.schema.yml +1 -1
  178. simtools/schemas/model_parameters/fadc_dev_pedestal.schema.yml +1 -1
  179. simtools/schemas/model_parameters/fadc_err_compensate_pedestal.schema.yml +1 -1
  180. simtools/schemas/model_parameters/fadc_err_pedestal.schema.yml +1 -1
  181. simtools/schemas/model_parameters/fadc_lg_amplitude.schema.yml +1 -1
  182. simtools/schemas/model_parameters/fadc_lg_compensate_pedestal.schema.yml +1 -1
  183. simtools/schemas/model_parameters/fadc_lg_dev_pedestal.schema.yml +1 -1
  184. simtools/schemas/model_parameters/fadc_lg_err_compensate_pedestal.schema.yml +1 -1
  185. simtools/schemas/model_parameters/fadc_lg_err_pedestal.schema.yml +1 -1
  186. simtools/schemas/model_parameters/fadc_lg_max_signal.schema.yml +1 -1
  187. simtools/schemas/model_parameters/fadc_lg_max_sum.schema.yml +1 -1
  188. simtools/schemas/model_parameters/fadc_lg_noise.schema.yml +1 -1
  189. simtools/schemas/model_parameters/fadc_lg_pedestal.schema.yml +1 -1
  190. simtools/schemas/model_parameters/fadc_lg_sensitivity.schema.yml +1 -1
  191. simtools/schemas/model_parameters/fadc_lg_sysvar_pedestal.schema.yml +1 -1
  192. simtools/schemas/model_parameters/fadc_lg_var_pedestal.schema.yml +1 -1
  193. simtools/schemas/model_parameters/fadc_lg_var_sensitivity.schema.yml +1 -1
  194. simtools/schemas/model_parameters/fadc_long_event_threshold.schema.yml +35 -0
  195. simtools/schemas/model_parameters/fadc_long_sum_bins.schema.yml +41 -0
  196. simtools/schemas/model_parameters/fadc_long_sum_offset.schema.yml +38 -0
  197. simtools/schemas/model_parameters/fadc_max_signal.schema.yml +1 -1
  198. simtools/schemas/model_parameters/fadc_max_sum.schema.yml +1 -1
  199. simtools/schemas/model_parameters/fadc_mhz.schema.yml +1 -1
  200. simtools/schemas/model_parameters/fadc_noise.schema.yml +1 -1
  201. simtools/schemas/model_parameters/fadc_pedestal.schema.yml +1 -1
  202. simtools/schemas/model_parameters/fadc_pulse_shape.schema.yml +13 -1
  203. simtools/schemas/model_parameters/fadc_sensitivity.schema.yml +1 -1
  204. simtools/schemas/model_parameters/fadc_sum_bins.schema.yml +1 -1
  205. simtools/schemas/model_parameters/fadc_sum_offset.schema.yml +1 -1
  206. simtools/schemas/model_parameters/fadc_sysvar_pedestal.schema.yml +1 -1
  207. simtools/schemas/model_parameters/fadc_var_pedestal.schema.yml +1 -1
  208. simtools/schemas/model_parameters/fadc_var_sensitivity.schema.yml +1 -1
  209. simtools/schemas/model_parameters/fake_mirror_list.schema.yml +1 -1
  210. simtools/schemas/model_parameters/flatfielding.schema.yml +1 -1
  211. simtools/schemas/model_parameters/focal_length.schema.yml +1 -1
  212. simtools/schemas/model_parameters/focal_surface_parameters.schema.yml +1 -1
  213. simtools/schemas/model_parameters/focal_surface_ref_radius.schema.yml +1 -1
  214. simtools/schemas/model_parameters/focus_offset.schema.yml +1 -1
  215. simtools/schemas/model_parameters/gain_variation.schema.yml +1 -1
  216. simtools/schemas/model_parameters/geomag_horizontal.schema.yml +1 -1
  217. simtools/schemas/model_parameters/geomag_rotation.schema.yml +1 -1
  218. simtools/schemas/model_parameters/geomag_vertical.schema.yml +1 -1
  219. simtools/schemas/model_parameters/hg_lg_variation.schema.yml +1 -1
  220. simtools/schemas/model_parameters/iobuf_maximum.schema.yml +1 -1
  221. simtools/schemas/model_parameters/iobuf_output_maximum.schema.yml +1 -1
  222. simtools/schemas/model_parameters/laser_events.schema.yml +1 -1
  223. simtools/schemas/model_parameters/laser_external_trigger.schema.yml +1 -1
  224. simtools/schemas/model_parameters/laser_photons.schema.yml +1 -1
  225. simtools/schemas/model_parameters/laser_pulse_exptime.schema.yml +1 -1
  226. simtools/schemas/model_parameters/laser_pulse_offset.schema.yml +1 -1
  227. simtools/schemas/model_parameters/laser_pulse_sigtime.schema.yml +1 -1
  228. simtools/schemas/model_parameters/laser_pulse_twidth.schema.yml +1 -1
  229. simtools/schemas/model_parameters/laser_var_photons.schema.yml +1 -1
  230. simtools/schemas/model_parameters/laser_wavelength.schema.yml +1 -1
  231. simtools/schemas/model_parameters/led_events.schema.yml +1 -1
  232. simtools/schemas/model_parameters/led_photons.schema.yml +1 -1
  233. simtools/schemas/model_parameters/led_pulse_offset.schema.yml +1 -1
  234. simtools/schemas/model_parameters/led_pulse_sigtime.schema.yml +1 -1
  235. simtools/schemas/model_parameters/led_var_photons.schema.yml +1 -1
  236. simtools/schemas/model_parameters/lightguide_efficiency_vs_incidence_angle.schema.yml +11 -1
  237. simtools/schemas/model_parameters/lightguide_efficiency_vs_wavelength.schema.yml +50 -1
  238. simtools/schemas/model_parameters/min_photoelectrons.schema.yml +1 -1
  239. simtools/schemas/model_parameters/min_photons.schema.yml +1 -1
  240. simtools/schemas/model_parameters/mirror_align_random_distance.schema.yml +1 -1
  241. simtools/schemas/model_parameters/mirror_align_random_horizontal.schema.yml +1 -1
  242. simtools/schemas/model_parameters/mirror_align_random_vertical.schema.yml +1 -1
  243. simtools/schemas/model_parameters/mirror_class.schema.yml +1 -1
  244. simtools/schemas/model_parameters/mirror_degraded_reflection.schema.yml +1 -1
  245. simtools/schemas/model_parameters/mirror_focal_length.schema.yml +1 -1
  246. simtools/schemas/model_parameters/mirror_list.schema.yml +1 -1
  247. simtools/schemas/model_parameters/mirror_offset.schema.yml +1 -1
  248. simtools/schemas/model_parameters/mirror_panel_2f_measurements.schema.yml +1 -1
  249. simtools/schemas/model_parameters/mirror_reflection_random_angle.schema.yml +1 -1
  250. simtools/schemas/model_parameters/mirror_reflectivity.schema.yml +11 -1
  251. simtools/schemas/model_parameters/multiplicity_offset.schema.yml +1 -1
  252. simtools/schemas/model_parameters/muon_mono_threshold.schema.yml +1 -1
  253. simtools/schemas/model_parameters/nsb_autoscale_airmass.schema.yml +1 -1
  254. simtools/schemas/model_parameters/nsb_gain_drop_scale.schema.yml +1 -1
  255. simtools/schemas/model_parameters/nsb_offaxis.schema.yml +1 -1
  256. simtools/schemas/model_parameters/nsb_pixel_rate.schema.yml +1 -1
  257. simtools/schemas/model_parameters/nsb_reference_spectrum.schema.yml +13 -1
  258. simtools/schemas/model_parameters/nsb_reference_value.schema.yml +1 -1
  259. simtools/schemas/model_parameters/nsb_scaling_factor.schema.yml +1 -1
  260. simtools/schemas/model_parameters/nsb_sky_map.schema.yml +1 -1
  261. simtools/schemas/model_parameters/nsb_spectrum.schema.yml +1 -1
  262. simtools/schemas/model_parameters/num_gains.schema.yml +1 -1
  263. simtools/schemas/model_parameters/only_triggered_telescopes.schema.yml +1 -1
  264. simtools/schemas/model_parameters/optics_properties.schema.yml +1 -1
  265. simtools/schemas/model_parameters/parabolic_dish.schema.yml +1 -1
  266. simtools/schemas/model_parameters/pedestal_events.schema.yml +1 -1
  267. simtools/schemas/model_parameters/photon_delay.schema.yml +1 -1
  268. simtools/schemas/model_parameters/photons_per_run.schema.yml +1 -1
  269. simtools/schemas/model_parameters/pixel_cells.schema.yml +1 -1
  270. simtools/schemas/model_parameters/pixels_parallel.schema.yml +1 -1
  271. simtools/schemas/model_parameters/pixeltrg_time_step.schema.yml +1 -1
  272. simtools/schemas/model_parameters/pm_average_gain.schema.yml +1 -1
  273. simtools/schemas/model_parameters/pm_collection_efficiency.schema.yml +1 -1
  274. simtools/schemas/model_parameters/pm_gain_index.schema.yml +1 -1
  275. simtools/schemas/model_parameters/pm_photoelectron_spectrum.schema.yml +20 -1
  276. simtools/schemas/model_parameters/pm_transit_time.schema.yml +1 -1
  277. simtools/schemas/model_parameters/pm_voltage_variation.schema.yml +1 -1
  278. simtools/schemas/model_parameters/primary_mirror_degraded_map.schema.yml +1 -1
  279. simtools/schemas/model_parameters/primary_mirror_diameter.schema.yml +1 -1
  280. simtools/schemas/model_parameters/primary_mirror_hole_diameter.schema.yml +1 -1
  281. simtools/schemas/model_parameters/primary_mirror_incidence_angle.schema.yml +11 -1
  282. simtools/schemas/model_parameters/primary_mirror_parameters.schema.yml +1 -1
  283. simtools/schemas/model_parameters/primary_mirror_ref_radius.schema.yml +1 -1
  284. simtools/schemas/model_parameters/primary_mirror_segmentation.schema.yml +1 -1
  285. simtools/schemas/model_parameters/qe_variation.schema.yml +1 -1
  286. simtools/schemas/model_parameters/quantum_efficiency.schema.yml +11 -1
  287. simtools/schemas/model_parameters/random_focal_length.schema.yml +1 -1
  288. simtools/schemas/model_parameters/random_generator.schema.yml +1 -1
  289. simtools/schemas/model_parameters/random_mono_probability.schema.yml +1 -1
  290. simtools/schemas/model_parameters/reference_point_altitude.schema.yml +1 -1
  291. simtools/schemas/model_parameters/reference_point_latitude.schema.yml +1 -1
  292. simtools/schemas/model_parameters/reference_point_longitude.schema.yml +1 -1
  293. simtools/schemas/model_parameters/reference_point_utm_east.schema.yml +1 -1
  294. simtools/schemas/model_parameters/reference_point_utm_north.schema.yml +1 -1
  295. simtools/schemas/model_parameters/sampled_output.schema.yml +1 -1
  296. simtools/schemas/model_parameters/save_pe_with_amplitude.schema.yml +1 -1
  297. simtools/schemas/model_parameters/secondary_mirror_baffle.schema.yml +1 -1
  298. simtools/schemas/model_parameters/secondary_mirror_degraded_map.schema.yml +1 -1
  299. simtools/schemas/model_parameters/secondary_mirror_degraded_reflection.schema.yml +1 -1
  300. simtools/schemas/model_parameters/secondary_mirror_diameter.schema.yml +1 -1
  301. simtools/schemas/model_parameters/secondary_mirror_hole_diameter.schema.yml +1 -1
  302. simtools/schemas/model_parameters/secondary_mirror_incidence_angle.schema.yml +11 -1
  303. simtools/schemas/model_parameters/secondary_mirror_parameters.schema.yml +1 -1
  304. simtools/schemas/model_parameters/secondary_mirror_ref_radius.schema.yml +1 -1
  305. simtools/schemas/model_parameters/secondary_mirror_reflectivity.schema.yml +11 -1
  306. simtools/schemas/model_parameters/secondary_mirror_segmentation.schema.yml +1 -1
  307. simtools/schemas/model_parameters/secondary_mirror_shadow_diameter.schema.yml +1 -1
  308. simtools/schemas/model_parameters/secondary_mirror_shadow_offset.schema.yml +1 -1
  309. simtools/schemas/model_parameters/stars.schema.yml +1 -1
  310. simtools/schemas/model_parameters/store_photoelectrons.schema.yml +1 -1
  311. simtools/schemas/model_parameters/tailcut_scale.schema.yml +1 -1
  312. simtools/schemas/model_parameters/telescope_axis_height.schema.yml +1 -1
  313. simtools/schemas/model_parameters/telescope_random_angle.schema.yml +1 -1
  314. simtools/schemas/model_parameters/telescope_random_error.schema.yml +1 -1
  315. simtools/schemas/model_parameters/telescope_sphere_radius.schema.yml +1 -1
  316. simtools/schemas/model_parameters/telescope_transmission.schema.yml +1 -1
  317. simtools/schemas/model_parameters/teltrig_min_sigsum.schema.yml +1 -1
  318. simtools/schemas/model_parameters/teltrig_min_time.schema.yml +1 -1
  319. simtools/schemas/model_parameters/transit_time_calib_error.schema.yml +1 -1
  320. simtools/schemas/model_parameters/transit_time_compensate_error.schema.yml +1 -1
  321. simtools/schemas/model_parameters/transit_time_compensate_step.schema.yml +1 -1
  322. simtools/schemas/model_parameters/transit_time_error.schema.yml +1 -1
  323. simtools/schemas/model_parameters/transit_time_jitter.schema.yml +1 -1
  324. simtools/schemas/model_parameters/trigger_current_limit.schema.yml +1 -1
  325. simtools/schemas/model_parameters/trigger_delay_compensation.schema.yml +1 -1
  326. simtools/schemas/model_parameters/trigger_pixels.schema.yml +1 -1
  327. simtools/schemas/plot_configuration.metaschema.yml +51 -59
  328. simtools/schemas/production_configuration_metrics.schema.yml +12 -2
  329. simtools/schemas/production_tables.schema.yml +2 -2
  330. simtools/simtel/simtel_config_reader.py +2 -2
  331. simtools/simtel/simtel_config_writer.py +16 -4
  332. simtools/simtel/simtel_io_event_histograms.py +746 -0
  333. simtools/simtel/simtel_io_event_reader.py +16 -43
  334. simtools/simtel/simtel_io_event_writer.py +46 -10
  335. simtools/simtel/simtel_io_histogram.py +3 -1
  336. simtools/simtel/simtel_io_histograms.py +7 -3
  337. simtools/simtel/simtel_io_metadata.py +99 -3
  338. simtools/simtel/simtel_table_reader.py +92 -10
  339. simtools/simtel/simulator_array.py +138 -10
  340. simtools/simtel/simulator_camera_efficiency.py +32 -23
  341. simtools/simtel/simulator_light_emission.py +437 -271
  342. simtools/simtel/simulator_ray_tracing.py +1 -1
  343. simtools/simulator.py +105 -147
  344. simtools/testing/configuration.py +24 -26
  345. simtools/testing/helpers.py +2 -2
  346. simtools/testing/log_inspector.py +50 -0
  347. simtools/testing/validate_output.py +87 -37
  348. simtools/utils/general.py +125 -257
  349. simtools/utils/geometry.py +36 -0
  350. simtools/utils/names.py +72 -3
  351. simtools/visualization/legend_handlers.py +180 -264
  352. simtools/visualization/plot_array_layout.py +20 -8
  353. simtools/visualization/plot_pixels.py +1 -2
  354. simtools/visualization/plot_tables.py +202 -27
  355. simtools/visualization/simtel_event_plots.py +816 -0
  356. simtools/visualization/visualize.py +4 -101
  357. gammasimtools-0.17.0.dist-info/RECORD +0 -374
  358. simtools/production_configuration/derive_corsika_limits_grid.py +0 -189
  359. {gammasimtools-0.17.0.dist-info → gammasimtools-0.19.0.dist-info}/WHEEL +0 -0
  360. {gammasimtools-0.17.0.dist-info → gammasimtools-0.19.0.dist-info}/top_level.txt +0 -0
  361. /simtools/{io_operations → io}/hdf5_handler.py +0 -0
  362. /simtools/{io_operations → io}/legacy_data_handler.py +0 -0
  363. /simtools/{schemas → resources}/array_elements.yml +0 -0
@@ -5,10 +5,11 @@ import re
5
5
  from collections import defaultdict
6
6
 
7
7
  import astropy.io.ascii
8
+ import astropy.units as u
8
9
  import numpy as np
9
10
  from astropy.table import Table
10
11
 
11
- from simtools.io_operations import io_handler
12
+ from simtools.io import io_handler
12
13
  from simtools.model.model_utils import initialize_simulation_models
13
14
  from simtools.simtel.simulator_camera_efficiency import SimulatorCameraEfficiency
14
15
  from simtools.utils import names
@@ -23,32 +24,20 @@ class CameraEfficiency:
23
24
 
24
25
  Parameters
25
26
  ----------
26
- simtel_path: str (or Path)
27
- Location of sim_telarray installation.
28
27
  db_config: dict
29
28
  Configuration for the database.
30
29
  label: str
31
30
  Instance label, optional.
32
31
  config_data: dict.
33
32
  Dict containing the configurable parameters.
34
- test: bool
35
- Is it a test instance (at the moment only affects the location of files).
36
33
  """
37
34
 
38
- def __init__(
39
- self,
40
- simtel_path,
41
- config_data,
42
- label,
43
- db_config,
44
- test=False,
45
- ):
35
+ def __init__(self, config_data, label, db_config):
46
36
  """Initialize the CameraEfficiency class."""
47
37
  self._logger = logging.getLogger(__name__)
48
38
 
49
- self._simtel_path = simtel_path
39
+ self._simtel_path = config_data.get("simtel_path")
50
40
  self.label = label
51
- self.test = test
52
41
 
53
42
  self.io_handler = io_handler.IOHandler()
54
43
  self.telescope_model, self.site_model = initialize_simulation_models(
@@ -66,15 +55,16 @@ class CameraEfficiency:
66
55
  self.config = self._configuration_from_args_dict(config_data)
67
56
  self._file = self._load_files()
68
57
 
58
+ self.nsb_pixel_pe_per_ns = None
59
+ self.nsb_rate_ref_conditions = None
60
+
69
61
  def __repr__(self):
70
62
  """Return string representation of the CameraEfficiency instance."""
71
63
  return f"CameraEfficiency(label={self.label})\n"
72
64
 
73
65
  def _configuration_from_args_dict(self, config_data):
74
66
  """
75
- Extract the configuration data from the args_dict.
76
-
77
- Zenith and azimuth angles are set to default values if not provided.
67
+ Extract configuration data from command line arguments.
78
68
 
79
69
  Parameters
80
70
  ----------
@@ -86,22 +76,9 @@ class CameraEfficiency:
86
76
  dict
87
77
  Configuration data.
88
78
  """
89
- zenith_angle = config_data.get("zenith_angle")
90
- if zenith_angle is not None:
91
- zenith_angle = zenith_angle.to("deg").value
92
- else:
93
- zenith_angle = 20.0
94
- self._logger.info(f"Setting zenith angle to default value {zenith_angle} deg")
95
- azimuth_angle = config_data.get("azimuth_angle")
96
- if azimuth_angle is not None:
97
- azimuth_angle = azimuth_angle.to("deg").value
98
- else:
99
- azimuth_angle = 0.0
100
- self._logger.info(f"Setting azimuth angle to default value {azimuth_angle} deg")
101
-
102
79
  return {
103
- "zenith_angle": zenith_angle,
104
- "azimuth_angle": azimuth_angle,
80
+ "zenith_angle": config_data["zenith_angle"].to("deg").value,
81
+ "azimuth_angle": config_data["azimuth_angle"].to("deg").value,
105
82
  "nsb_spectrum": config_data.get("nsb_spectrum", None),
106
83
  }
107
84
 
@@ -149,7 +126,7 @@ class CameraEfficiency:
149
126
  "skip_correction_to_nsb_spectrum", False
150
127
  ),
151
128
  )
152
- simtel.run(test=self.test)
129
+ simtel.run()
153
130
 
154
131
  def export_model_files(self):
155
132
  """Export model and config files to the output directory."""
@@ -159,6 +136,30 @@ class CameraEfficiency:
159
136
  model_directory=self.telescope_model.config_file_directory
160
137
  )
161
138
 
139
+ def get_nsb_pixel_rate(self, reference_conditions=False):
140
+ """
141
+ Return the expected NSB pixel rate for each camera pixel.
142
+
143
+ This is an approximation, as testeff calculates the expected NSB pixel rate
144
+ for the on-axis pixel only.
145
+
146
+ Returns
147
+ -------
148
+ list
149
+ Expected NSB pixel rate in p.e./ns for the provided NSB spectrum.
150
+ """
151
+ base_rate = (
152
+ self.nsb_rate_ref_conditions if reference_conditions else self.nsb_pixel_pe_per_ns
153
+ )
154
+ # Accept either a plain float (assumed already in GHz) or an astropy Quantity
155
+ if isinstance(base_rate, u.Quantity):
156
+ base_rate_ghz = base_rate.to(u.GHz).value
157
+ else:
158
+ base_rate_ghz = float(base_rate)
159
+
160
+ n_pixels = int(self.telescope_model.get_parameter_value("camera_pixels"))
161
+ return u.Quantity(np.full(n_pixels, base_rate_ghz), u.GHz)
162
+
162
163
  def analyze(self, export=True, force=False):
163
164
  """
164
165
  Analyze camera efficiency output file and store the results in _results.
@@ -243,6 +244,8 @@ class CameraEfficiency:
243
244
  self._results = Table(_results)
244
245
  self._has_results = True
245
246
 
247
+ self.nsb_pixel_pe_per_ns, self.nsb_rate_ref_conditions = self.calc_nsb_rate()
248
+
246
249
  print("\33[40;37;1m")
247
250
  self._logger.info(f"\n{self.results_summary()}")
248
251
  print("\033[0m")
@@ -257,7 +260,6 @@ class CameraEfficiency:
257
260
  Include a header for the zenith/azimuth settings and the NSB spectrum file which was used.
258
261
  The summary includes the various CTAO requirements and the final expected NSB pixel rate.
259
262
  """
260
- nsb_pixel_pe_per_ns, nsb_rate_ref_conditions = self.calc_nsb_rate()
261
263
  nsb_spectrum_text = (
262
264
  f"NSB spectrum file: {self.config['nsb_spectrum']}"
263
265
  if self.config["nsb_spectrum"]
@@ -277,9 +279,9 @@ class CameraEfficiency:
277
279
  "(A-PERF-2025/B-TEL-0090): "
278
280
  f"{self.calc_tot_efficiency(self.calc_tel_efficiency()):.4f}\n"
279
281
  "Expected NSB pixel rate for the provided NSB spectrum: "
280
- f"{nsb_pixel_pe_per_ns:.4f} [p.e./ns]\n"
282
+ f"{self.nsb_pixel_pe_per_ns:.4f} [p.e./ns]\n"
281
283
  "Expected NSB pixel rate for the reference NSB: "
282
- f"{nsb_rate_ref_conditions:.4f} [p.e./ns]\n"
284
+ f"{self.nsb_rate_ref_conditions:.4f} [p.e./ns]\n"
283
285
  )
284
286
 
285
287
  def export_results(self):
@@ -388,10 +390,17 @@ class CameraEfficiency:
388
390
  c2_sum = np.sum(c2_reduced_wl)
389
391
  return c2_sum / c1_sum / self._results["masts"][0]
390
392
 
391
- def calc_nsb_rate(self):
393
+ def calc_nsb_rate(self, wavelength_range=(300 * u.nm, 650 * u.nm)):
392
394
  """
393
395
  Calculate the NSB rate.
394
396
 
397
+ CTAO reference wavelength range is 300-650 nm.
398
+
399
+ Parameters
400
+ ----------
401
+ wavelength_range: tuple
402
+ Wavelength range used for the NSB rate calculation (default: (300 nm, 650 nm)).
403
+
395
404
  Returns
396
405
  -------
397
406
  nsb_rate_provided_spectrum: float
@@ -400,27 +409,34 @@ class CameraEfficiency:
400
409
  NSB pixel rate in p.e./ns for reference conditions
401
410
  (https://jama.cta-observatory.org/perspective.req#/items/26694?projectId=11)
402
411
  """
403
- nsb_rate_provided_spectrum = (
412
+ self.nsb_pixel_pe_per_ns = (
404
413
  np.sum(self._results["N4"])
405
414
  * self.telescope_model.camera.get_pixel_active_solid_angle()
406
415
  * self.telescope_model.get_on_axis_eff_optical_area().to("m2").value
407
416
  / self.telescope_model.get_parameter_value("telescope_transmission")[0]
408
417
  )
409
418
 
410
- # (integral is in ph./(m^2 ns sr) ) from 300 - 650 nm:
411
- n1_reduced_wl = self._results["N1"][[299 < wl_now < 651 for wl_now in self._results["wl"]]]
419
+ wavelength_range = (
420
+ wavelength_range[0].to("nm").value,
421
+ wavelength_range[1].to("nm").value,
422
+ )
423
+
424
+ # (integral is in ph./(m^2 ns sr) ) over wavelength_range
425
+ n1_reduced_wl = self._results["N1"][
426
+ [wavelength_range[0] <= wl_now <= wavelength_range[1] for wl_now in self._results["wl"]]
427
+ ]
412
428
  n1_sum = np.sum(n1_reduced_wl)
413
429
  n1_integral_edges = self._results["N1"][
414
- [wl_now in [300, 650] for wl_now in self._results["wl"]]
430
+ [wl_now in [wavelength_range[0], wavelength_range[1]] for wl_now in self._results["wl"]]
415
431
  ]
416
432
  n1_integral_edges_sum = np.sum(n1_integral_edges)
417
433
  nsb_integral = 0.0001 * (n1_sum - 0.5 * n1_integral_edges_sum)
418
- nsb_rate_ref_conditions = (
419
- nsb_rate_provided_spectrum
434
+ self.nsb_rate_ref_conditions = (
435
+ self.nsb_pixel_pe_per_ns
420
436
  * self.site_model.get_parameter_value("nsb_reference_value")
421
437
  / nsb_integral
422
438
  )
423
- return nsb_rate_provided_spectrum, nsb_rate_ref_conditions
439
+ return self.nsb_pixel_pe_per_ns * u.GHz, self.nsb_rate_ref_conditions * u.GHz
424
440
 
425
441
  def plot_efficiency(self, efficiency_type, save_fig=False):
426
442
  """
@@ -15,7 +15,7 @@ import simtools.data_model.model_data_writer as writer
15
15
  from simtools.constants import MODEL_PARAMETER_SCHEMA_URL, SCHEMA_PATH
16
16
  from simtools.data_model import validate_data
17
17
  from simtools.data_model.metadata_collector import MetadataCollector
18
- from simtools.io_operations import io_handler
18
+ from simtools.io import io_handler
19
19
 
20
20
 
21
21
  class SinglePhotonElectronSpectrum:
@@ -307,6 +307,12 @@ class CommandLineParser(argparse.ArgumentParser):
307
307
  selected_parameters=simulation_configuration["corsika_configuration"],
308
308
  available_parameters=self._get_dictionary_with_shower_configuration(),
309
309
  )
310
+ if "sim_telarray_configuration" in simulation_configuration:
311
+ self._initialize_simulation_configuration(
312
+ group_name="sim_telarray configuration",
313
+ selected_parameters=simulation_configuration["sim_telarray_configuration"],
314
+ available_parameters=self._get_dictionary_with_sim_telarray_configuration(),
315
+ )
310
316
 
311
317
  def _initialize_simulation_software(self):
312
318
  """Initialize simulation software arguments."""
@@ -351,11 +357,13 @@ class CommandLineParser(argparse.ArgumentParser):
351
357
  ),
352
358
  "type": CommandLineParser.azimuth_angle,
353
359
  "required": True,
360
+ "default": 0 * u.deg,
354
361
  },
355
362
  "zenith_angle": {
356
363
  "help": "Zenith angle in degrees (between 0 and 180).",
357
364
  "type": CommandLineParser.zenith_angle,
358
365
  "required": True,
366
+ "default": 20 * u.deg,
359
367
  },
360
368
  "nshow": {
361
369
  "help": "Number of showers per run to simulate.",
@@ -429,6 +437,27 @@ class CommandLineParser(argparse.ArgumentParser):
429
437
  },
430
438
  }
431
439
 
440
+ @staticmethod
441
+ def _get_dictionary_with_sim_telarray_configuration():
442
+ """Return dictionary with sim_telarray configuration parameters."""
443
+ return {
444
+ "sim_telarray_instrument_seeds": {
445
+ "help": (
446
+ "Random seed used for sim_telarray instrument setup. "
447
+ "If '--sim_telarray_random_instrument_instances' is not set: "
448
+ "use as sim_telarray seed ('random_seed' parameter). Otherwise: "
449
+ "use as base seed to generate the random instrument instance seeds."
450
+ ),
451
+ "type": str,
452
+ "required": False,
453
+ },
454
+ "sim_telarray_random_instrument_instances": {
455
+ "help": "Number of random instrument instances initialized in sim_telarray.",
456
+ "type": int,
457
+ "required": False,
458
+ },
459
+ }
460
+
432
461
  def _initialize_simulation_configuration(
433
462
  self, group_name, selected_parameters, available_parameters
434
463
  ):
@@ -474,7 +503,8 @@ class CommandLineParser(argparse.ArgumentParser):
474
503
  _layout_group = job_group.add_mutually_exclusive_group(required=required)
475
504
  _layout_group.add_argument(
476
505
  "--array_layout_name",
477
- help="array layout name (e.g., alpha, subsystem_msts)",
506
+ help="array layout name(s) (e.g., alpha, subsystem_msts)",
507
+ nargs="+",
478
508
  type=str,
479
509
  required=False,
480
510
  )
@@ -11,7 +11,7 @@ from dotenv import load_dotenv
11
11
 
12
12
  import simtools.configuration.commandline_parser as argparser
13
13
  from simtools.db.db_handler import jsonschema_db_dict
14
- from simtools.io_operations import io_handler
14
+ from simtools.io import ascii_handler, io_handler
15
15
  from simtools.utils import general as gen
16
16
 
17
17
  __all__ = [
@@ -280,15 +280,15 @@ class Configurator:
280
280
  try:
281
281
  self._logger.debug(f"Reading configuration from {config_file}")
282
282
  _config_dict = (
283
- gen.collect_data_from_file(file_name=config_file) if config_file else None
283
+ ascii_handler.collect_data_from_file(file_name=config_file) if config_file else None
284
284
  )
285
285
  # yaml parser adds \n in multiline strings, remove them
286
286
  _config_dict = gen.remove_substring_recursively_from_dict(_config_dict, substring="\n")
287
287
  # read configuration for first application
288
- if "CONFIGURATION" in _config_dict.get("CTA_SIMPIPE", {}).get("APPLICATIONS", [{}])[0]:
288
+ if "configuration" in _config_dict.get("applications", [{}])[0]:
289
289
  self._fill_from_config_dict(
290
290
  input_dict=gen.change_dict_keys_case(
291
- _config_dict["CTA_SIMPIPE"]["APPLICATIONS"][0]["CONFIGURATION"],
291
+ _config_dict["applications"][0]["configuration"],
292
292
  ),
293
293
  overwrite=True,
294
294
  )
simtools/constants.py CHANGED
@@ -21,3 +21,5 @@ MODEL_PARAMETER_SCHEMA_URL = (
21
21
  "https://raw.githubusercontent.com/gammasim/simtools/main/src/simtools/schemas/"
22
22
  "/model_parameters"
23
23
  )
24
+ # Path to resource files
25
+ RESOURCE_PATH = files("simtools") / "resources"
@@ -7,7 +7,7 @@ import numpy as np
7
7
  from astropy import units as u
8
8
 
9
9
  from simtools.corsika.primary_particle import PrimaryParticle
10
- from simtools.io_operations import io_handler
10
+ from simtools.io import io_handler
11
11
  from simtools.model.model_parameter import ModelParameter
12
12
 
13
13
  __all__ = [
@@ -39,9 +39,12 @@ class CorsikaConfig:
39
39
  MongoDB configuration.
40
40
  label : str
41
41
  Instance label.
42
+ dummy_simulations : bool
43
+ If True, the configuration is generated for dummy simulations
44
+ (e.g., sim_telarray requires for some run modes a valid CORSIKA input file).
42
45
  """
43
46
 
44
- def __init__(self, array_model, args_dict, db_config=None, label=None):
47
+ def __init__(self, array_model, args_dict, db_config=None, label=None, dummy_simulations=False):
45
48
  """Initialize CorsikaConfig."""
46
49
  self._logger = logging.getLogger(__name__)
47
50
  self._logger.debug("Init CorsikaConfig")
@@ -51,13 +54,13 @@ class CorsikaConfig:
51
54
  self.azimuth_angle = None
52
55
  self._run_number = None
53
56
  self.config_file_path = None
54
- # The following uses the setter defined below, that is why the args_dict is passed
55
- self.primary_particle = args_dict
57
+ self.primary_particle = args_dict # see setter for primary_particle
58
+ self.dummy_simulations = dummy_simulations
56
59
 
57
60
  self.io_handler = io_handler.IOHandler()
58
61
  self.array_model = array_model
59
62
  self.config = self.fill_corsika_configuration(args_dict, db_config)
60
- self._is_file_updated = False
63
+ self.is_file_updated = False
61
64
 
62
65
  def __repr__(self):
63
66
  """CorsikaConfig class representation."""
@@ -110,7 +113,7 @@ class CorsikaConfig:
110
113
  if args_dict is None:
111
114
  return {}
112
115
 
113
- self._is_file_updated = False
116
+ self.is_file_updated = False
114
117
  self.azimuth_angle = int(args_dict["azimuth_angle"].to("deg").value)
115
118
  self.zenith_angle = args_dict["zenith_angle"].to("deg").value
116
119
 
@@ -119,7 +122,10 @@ class CorsikaConfig:
119
122
  )
120
123
 
121
124
  config = {}
122
- config["USER_INPUT"] = self._corsika_configuration_from_user_input(args_dict)
125
+ if self.dummy_simulations:
126
+ config["USER_INPUT"] = self._corsika_configuration_for_dummy_simulations()
127
+ else:
128
+ config["USER_INPUT"] = self._corsika_configuration_from_user_input(args_dict)
123
129
 
124
130
  if db_config is None: # all following parameter require DB
125
131
  return config
@@ -200,6 +206,30 @@ class CorsikaConfig:
200
206
  f"Values are {current_value} and {next_value} respectively."
201
207
  )
202
208
 
209
+ def _corsika_configuration_for_dummy_simulations(self):
210
+ """
211
+ Return CORSIKA configuration for dummy simulations.
212
+
213
+ Settings are such that that the simulations are fast
214
+ and none (or not many) Cherenkov photons are generated.
215
+
216
+ Returns
217
+ -------
218
+ dict
219
+ Dictionary with CORSIKA parameters for dummy simulations.
220
+ """
221
+ return {
222
+ "EVTNR": [1],
223
+ "NSHOW": [1],
224
+ "PRMPAR": [1], # CORSIKA ID 1 for primary gamma
225
+ "ESLOPE": [-2.0],
226
+ "ERANGE": [0.1, 0.1],
227
+ "THETAP": [20.0, 20.0],
228
+ "PHIP": [0.0, 0.0],
229
+ "VIEWCONE": [0.0, 0.0],
230
+ "CSCAT": [1, 0.0, 10.0],
231
+ }
232
+
203
233
  def _corsika_configuration_from_user_input(self, args_dict):
204
234
  """
205
235
  Get CORSIKA configuration from user input.
@@ -492,17 +522,9 @@ class CorsikaConfig:
492
522
  if par_name in values:
493
523
  par_value = values[par_name]
494
524
  if len(par_value) == 0:
495
- self._logger.error(f"Parameter {par_name} is not a CORSIKA config parameter")
496
- raise KeyError
525
+ raise KeyError(f"Parameter {par_name} is not a CORSIKA config parameter")
497
526
  return par_value if len(par_value) > 1 else par_value[0]
498
527
 
499
- def print_config_parameter(self):
500
- """Print CORSIKA config parameters for inspection."""
501
- for parameter_type, parameter_dict in self.config.items():
502
- print(f"Parameter type: {parameter_type}\n")
503
- for par, value in parameter_dict.items():
504
- print(f"{par} = {value}")
505
-
506
528
  @staticmethod
507
529
  def _get_text_single_line(pars, line_begin=""):
508
530
  """
@@ -538,7 +560,7 @@ class CorsikaConfig:
538
560
  the output directly to sim_telarray.
539
561
 
540
562
  """
541
- if self._is_file_updated:
563
+ if self.is_file_updated:
542
564
  self._logger.debug(f"CORSIKA input file already updated: {self.config_file_path}")
543
565
  return self.config_file_path
544
566
  _output_generic_file_name = self.set_output_file_and_directory(use_multipipe=use_multipipe)
@@ -605,7 +627,7 @@ class CorsikaConfig:
605
627
  model_directory=self.array_model.get_config_directory()
606
628
  )
607
629
 
608
- self._is_file_updated = True
630
+ self.is_file_updated = True
609
631
  return self.config_file_path
610
632
 
611
633
  def get_corsika_config_file_name(self, file_type, run_number=None):
@@ -758,9 +780,7 @@ class CorsikaConfig:
758
780
 
759
781
  def validate_run_number(self, run_number):
760
782
  """
761
- Validate run number and return it.
762
-
763
- Return run number from configuration if None.
783
+ Validate run number and return it. Return run number from configuration if None.
764
784
 
765
785
  Parameters
766
786
  ----------
@@ -775,12 +795,12 @@ class CorsikaConfig:
775
795
  Raises
776
796
  ------
777
797
  ValueError
778
- If run_number is not a valid value (e.g., < 1).
798
+ If run_number is not a valid value (< 1 or > 999999).
779
799
  """
780
800
  if run_number is None:
781
801
  return self.run_number
782
802
  if not float(run_number).is_integer() or run_number < 1 or run_number > 999999:
783
- msg = f"Invalid type of run number ({run_number}) - it must be an uint < 1000000."
784
- self._logger.error(msg)
785
- raise ValueError(msg)
803
+ raise ValueError(
804
+ f"Invalid type of run number ({run_number}) - it must be an uint < 1000000."
805
+ )
786
806
  return run_number
@@ -17,9 +17,9 @@ from ctapipe.io import write_table
17
17
  from eventio import IACTFile
18
18
 
19
19
  from simtools import version
20
- from simtools.io_operations import io_handler
21
- from simtools.io_operations.hdf5_handler import fill_hdf5_table
22
- from simtools.utils.general import collect_data_from_file
20
+ from simtools.io import io_handler
21
+ from simtools.io.ascii_handler import collect_data_from_file
22
+ from simtools.io.hdf5_handler import fill_hdf5_table
23
23
  from simtools.utils.geometry import convert_2d_to_radial_distr, rotate
24
24
  from simtools.utils.names import sanitize_name
25
25
 
@@ -752,8 +752,9 @@ class CorsikaHistograms:
752
752
  elif label == "time_altitude":
753
753
  mini_hist = self.hist_time_altitude[i_telescope]
754
754
  hist_values.append(self.hist_time_altitude[i_telescope].view().T)
755
- x_bin_edges.append(mini_hist.axes.edges[0].flatten())
756
- y_bin_edges.append(mini_hist.axes.edges[1].flatten())
755
+ if mini_hist is not None:
756
+ x_bin_edges.append(mini_hist.axes.edges[0].flatten())
757
+ y_bin_edges.append(mini_hist.axes.edges[1].flatten())
757
758
 
758
759
  return np.array(hist_values), np.array(x_bin_edges), np.array(y_bin_edges)
759
760
 
@@ -6,9 +6,9 @@ import astropy.units as u
6
6
  from astropy.io.registry.base import IORegistryError
7
7
  from astropy.table import QTable
8
8
 
9
- import simtools.utils.general as gen
10
9
  from simtools.data_model import validate_data
11
10
  from simtools.data_model.metadata_collector import MetadataCollector
11
+ from simtools.io import ascii_handler
12
12
 
13
13
  __all__ = ["read_table_from_file", "read_value_from_file"]
14
14
 
@@ -56,7 +56,6 @@ def read_table_from_file(file_name, schema_file=None, validate=False, metadata_f
56
56
  metadata = MetadataCollector(
57
57
  args_dict=None,
58
58
  metadata_file_name=(metadata_file if metadata_file is not None else file_name),
59
- data_model_name=None,
60
59
  )
61
60
 
62
61
  _validator = validate_data.DataValidator(
@@ -105,7 +104,7 @@ def read_value_from_file(file_name, schema_file=None, validate=False):
105
104
 
106
105
  """
107
106
  try:
108
- data = gen.collect_data_from_file(file_name=file_name)
107
+ data = ascii_handler.collect_data_from_file(file_name=file_name)
109
108
  except FileNotFoundError as exc:
110
109
  _logger.error("Error reading data from %s", file_name)
111
110
  raise exc