gammasimtools 0.18.0__py3-none-any.whl → 0.20.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 (367) hide show
  1. {gammasimtools-0.18.0.dist-info → gammasimtools-0.20.0.dist-info}/METADATA +24 -69
  2. gammasimtools-0.20.0.dist-info/RECORD +395 -0
  3. {gammasimtools-0.18.0.dist-info → gammasimtools-0.20.0.dist-info}/entry_points.txt +11 -4
  4. {gammasimtools-0.18.0.dist-info → gammasimtools-0.20.0.dist-info}/licenses/LICENSE +1 -1
  5. simtools/_version.py +16 -3
  6. simtools/applications/calculate_incident_angles.py +182 -0
  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 +17 -14
  10. simtools/applications/db_add_value_from_json_to_db.py +8 -10
  11. simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +8 -13
  12. simtools/applications/db_generate_compound_indexes.py +65 -0
  13. simtools/applications/db_get_file_from_db.py +12 -24
  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 +17 -11
  17. simtools/applications/derive_psf_parameters.py +59 -309
  18. simtools/applications/derive_trigger_rates.py +91 -0
  19. simtools/applications/docs_produce_array_element_report.py +1 -1
  20. simtools/applications/docs_produce_calibration_reports.py +1 -1
  21. simtools/applications/docs_produce_model_parameter_reports.py +1 -1
  22. simtools/applications/docs_produce_simulation_configuration_report.py +1 -1
  23. simtools/applications/generate_corsika_histograms.py +1 -1
  24. simtools/applications/generate_default_metadata.py +8 -24
  25. simtools/applications/generate_simtel_event_data.py +11 -11
  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 +2 -2
  30. simtools/applications/plot_array_layout.py +3 -3
  31. simtools/applications/plot_simtel_events.py +421 -0
  32. simtools/applications/plot_tabular_data.py +9 -2
  33. simtools/applications/plot_tabular_data_for_model_parameter.py +2 -1
  34. simtools/applications/print_version.py +8 -9
  35. simtools/applications/production_derive_corsika_limits.py +6 -7
  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 +9 -5
  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 +46 -11
  55. simtools/configuration/configurator.py +4 -4
  56. simtools/corsika/corsika_config.py +45 -25
  57. simtools/corsika/corsika_histograms.py +6 -5
  58. simtools/data_model/data_reader.py +2 -3
  59. simtools/data_model/metadata_collector.py +32 -36
  60. simtools/data_model/metadata_model.py +15 -12
  61. simtools/data_model/model_data_writer.py +13 -32
  62. simtools/data_model/schema.py +74 -24
  63. simtools/data_model/validate_data.py +42 -12
  64. simtools/db/db_handler.py +125 -62
  65. simtools/db/db_model_upload.py +14 -19
  66. simtools/dependencies.py +98 -30
  67. simtools/io/ascii_handler.py +279 -0
  68. simtools/{io_operations → io}/io_handler.py +25 -3
  69. simtools/job_execution/htcondor_script_generator.py +15 -4
  70. simtools/layout/array_layout.py +1 -1
  71. simtools/layout/array_layout_utils.py +51 -12
  72. simtools/model/array_model.py +41 -5
  73. simtools/model/flasher_model.py +106 -0
  74. simtools/model/model_parameter.py +4 -4
  75. simtools/model/model_repository.py +197 -2
  76. simtools/model/site_model.py +25 -0
  77. simtools/model/telescope_model.py +3 -1
  78. simtools/production_configuration/derive_corsika_limits.py +336 -427
  79. simtools/production_configuration/derive_production_statistics_handler.py +7 -6
  80. simtools/production_configuration/generate_production_grid.py +9 -11
  81. simtools/production_configuration/merge_corsika_limits.py +528 -0
  82. simtools/ray_tracing/incident_angles.py +706 -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/runners/corsika_runner.py +1 -1
  88. simtools/runners/corsika_simtel_runner.py +14 -5
  89. simtools/runners/runner_services.py +10 -5
  90. simtools/runners/simtools_runner.py +267 -0
  91. simtools/schemas/application_workflow.metaschema.yml +101 -68
  92. simtools/schemas/input/MST_mirror_2f_measurements.schema.yml +1 -1
  93. simtools/schemas/input/single_pe_spectrum.schema.yml +1 -1
  94. simtools/schemas/metadata.metaschema.yml +577 -3
  95. simtools/schemas/model_parameter.metaschema.yml +6 -6
  96. simtools/schemas/model_parameter_and_data_schema.metaschema.yml +4 -4
  97. simtools/schemas/model_parameters/adjust_gain.schema.yml +1 -1
  98. simtools/schemas/model_parameters/altitude.schema.yml +1 -1
  99. simtools/schemas/model_parameters/array_coordinates.schema.yml +1 -1
  100. simtools/schemas/model_parameters/array_coordinates_UTM.schema.yml +1 -1
  101. simtools/schemas/model_parameters/array_element_position_ground.schema.yml +1 -1
  102. simtools/schemas/model_parameters/array_element_position_utm.schema.yml +1 -1
  103. simtools/schemas/model_parameters/array_layouts.schema.yml +1 -1
  104. simtools/schemas/model_parameters/array_triggers.schema.yml +1 -1
  105. simtools/schemas/model_parameters/array_window.schema.yml +1 -1
  106. simtools/schemas/model_parameters/asum_clipping.schema.yml +1 -1
  107. simtools/schemas/model_parameters/asum_offset.schema.yml +1 -1
  108. simtools/schemas/model_parameters/asum_shaping.schema.yml +1 -1
  109. simtools/schemas/model_parameters/asum_threshold.schema.yml +1 -1
  110. simtools/schemas/model_parameters/atmospheric_profile.schema.yml +1 -1
  111. simtools/schemas/model_parameters/atmospheric_transmission.schema.yml +1 -1
  112. simtools/schemas/model_parameters/axes_offsets.schema.yml +1 -1
  113. simtools/schemas/model_parameters/camera_body_diameter.schema.yml +1 -1
  114. simtools/schemas/model_parameters/camera_body_shape.schema.yml +1 -1
  115. simtools/schemas/model_parameters/camera_config_file.schema.yml +1 -1
  116. simtools/schemas/model_parameters/camera_config_rotate.schema.yml +1 -1
  117. simtools/schemas/model_parameters/camera_degraded_efficiency.schema.yml +1 -1
  118. simtools/schemas/model_parameters/camera_degraded_map.schema.yml +1 -1
  119. simtools/schemas/model_parameters/camera_depth.schema.yml +1 -1
  120. simtools/schemas/model_parameters/camera_filter.schema.yml +1 -1
  121. simtools/schemas/model_parameters/camera_filter_incidence_angle.schema.yml +1 -1
  122. simtools/schemas/model_parameters/camera_pixels.schema.yml +1 -1
  123. simtools/schemas/model_parameters/camera_transmission.schema.yml +1 -1
  124. simtools/schemas/model_parameters/channels_per_chip.schema.yml +1 -1
  125. simtools/schemas/model_parameters/correct_nsb_spectrum_to_telescope_altitude.schema.yml +1 -1
  126. simtools/schemas/model_parameters/corsika_cherenkov_photon_bunch_size.schema.yml +1 -1
  127. simtools/schemas/model_parameters/corsika_cherenkov_photon_wavelength_range.schema.yml +1 -1
  128. simtools/schemas/model_parameters/corsika_first_interaction_height.schema.yml +1 -1
  129. simtools/schemas/model_parameters/corsika_iact_io_buffer.schema.yml +1 -1
  130. simtools/schemas/model_parameters/corsika_iact_max_bunches.schema.yml +1 -1
  131. simtools/schemas/model_parameters/corsika_iact_split_auto.schema.yml +1 -1
  132. simtools/schemas/model_parameters/corsika_longitudinal_shower_development.schema.yml +1 -1
  133. simtools/schemas/model_parameters/corsika_observation_level.schema.yml +1 -1
  134. simtools/schemas/model_parameters/corsika_particle_kinetic_energy_cutoff.schema.yml +1 -1
  135. simtools/schemas/model_parameters/corsika_starting_grammage.schema.yml +3 -3
  136. simtools/schemas/model_parameters/dark_events.schema.yml +1 -1
  137. simtools/schemas/model_parameters/default_trigger.schema.yml +1 -1
  138. simtools/schemas/model_parameters/design_model.schema.yml +1 -1
  139. simtools/schemas/model_parameters/disc_ac_coupled.schema.yml +1 -1
  140. simtools/schemas/model_parameters/disc_bins.schema.yml +1 -1
  141. simtools/schemas/model_parameters/disc_start.schema.yml +1 -1
  142. simtools/schemas/model_parameters/discriminator_amplitude.schema.yml +1 -1
  143. simtools/schemas/model_parameters/discriminator_fall_time.schema.yml +1 -1
  144. simtools/schemas/model_parameters/discriminator_gate_length.schema.yml +1 -1
  145. simtools/schemas/model_parameters/discriminator_hysteresis.schema.yml +1 -1
  146. simtools/schemas/model_parameters/discriminator_output_amplitude.schema.yml +1 -1
  147. simtools/schemas/model_parameters/discriminator_output_var_percent.schema.yml +1 -1
  148. simtools/schemas/model_parameters/discriminator_pulse_shape.schema.yml +1 -1
  149. simtools/schemas/model_parameters/discriminator_rise_time.schema.yml +1 -1
  150. simtools/schemas/model_parameters/discriminator_scale_threshold.schema.yml +1 -1
  151. simtools/schemas/model_parameters/discriminator_sigsum_over_threshold.schema.yml +1 -1
  152. simtools/schemas/model_parameters/discriminator_threshold.schema.yml +1 -1
  153. simtools/schemas/model_parameters/discriminator_time_over_threshold.schema.yml +1 -1
  154. simtools/schemas/model_parameters/discriminator_var_gate_length.schema.yml +1 -1
  155. simtools/schemas/model_parameters/discriminator_var_sigsum_over_threshold.schema.yml +1 -1
  156. simtools/schemas/model_parameters/discriminator_var_threshold.schema.yml +1 -1
  157. simtools/schemas/model_parameters/discriminator_var_time_over_threshold.schema.yml +1 -1
  158. simtools/schemas/model_parameters/dish_shape_length.schema.yml +1 -1
  159. simtools/schemas/model_parameters/dsum_clipping.schema.yml +1 -1
  160. simtools/schemas/model_parameters/dsum_ignore_below.schema.yml +1 -1
  161. simtools/schemas/model_parameters/dsum_offset.schema.yml +1 -1
  162. simtools/schemas/model_parameters/dsum_pedsub.schema.yml +1 -1
  163. simtools/schemas/model_parameters/dsum_pre_clipping.schema.yml +1 -1
  164. simtools/schemas/model_parameters/dsum_prescale.schema.yml +1 -1
  165. simtools/schemas/model_parameters/dsum_presum_max.schema.yml +1 -1
  166. simtools/schemas/model_parameters/dsum_presum_shift.schema.yml +1 -1
  167. simtools/schemas/model_parameters/dsum_shaping.schema.yml +1 -1
  168. simtools/schemas/model_parameters/dsum_shaping_renormalize.schema.yml +1 -1
  169. simtools/schemas/model_parameters/dsum_threshold.schema.yml +2 -2
  170. simtools/schemas/model_parameters/dsum_zero_clip.schema.yml +1 -1
  171. simtools/schemas/model_parameters/effective_focal_length.schema.yml +1 -1
  172. simtools/schemas/model_parameters/epsg_code.schema.yml +1 -1
  173. simtools/schemas/model_parameters/fadc_ac_coupled.schema.yml +1 -1
  174. simtools/schemas/model_parameters/fadc_amplitude.schema.yml +1 -1
  175. simtools/schemas/model_parameters/fadc_bins.schema.yml +1 -1
  176. simtools/schemas/model_parameters/fadc_compensate_pedestal.schema.yml +1 -1
  177. simtools/schemas/model_parameters/fadc_dev_pedestal.schema.yml +1 -1
  178. simtools/schemas/model_parameters/fadc_err_compensate_pedestal.schema.yml +1 -1
  179. simtools/schemas/model_parameters/fadc_err_pedestal.schema.yml +1 -1
  180. simtools/schemas/model_parameters/fadc_lg_amplitude.schema.yml +1 -1
  181. simtools/schemas/model_parameters/fadc_lg_compensate_pedestal.schema.yml +1 -1
  182. simtools/schemas/model_parameters/fadc_lg_dev_pedestal.schema.yml +1 -1
  183. simtools/schemas/model_parameters/fadc_lg_err_compensate_pedestal.schema.yml +1 -1
  184. simtools/schemas/model_parameters/fadc_lg_err_pedestal.schema.yml +1 -1
  185. simtools/schemas/model_parameters/fadc_lg_max_signal.schema.yml +1 -1
  186. simtools/schemas/model_parameters/fadc_lg_max_sum.schema.yml +1 -1
  187. simtools/schemas/model_parameters/fadc_lg_noise.schema.yml +1 -1
  188. simtools/schemas/model_parameters/fadc_lg_pedestal.schema.yml +1 -1
  189. simtools/schemas/model_parameters/fadc_lg_sensitivity.schema.yml +1 -1
  190. simtools/schemas/model_parameters/fadc_lg_sysvar_pedestal.schema.yml +1 -1
  191. simtools/schemas/model_parameters/fadc_lg_var_pedestal.schema.yml +1 -1
  192. simtools/schemas/model_parameters/fadc_lg_var_sensitivity.schema.yml +1 -1
  193. simtools/schemas/model_parameters/fadc_long_event_threshold.schema.yml +35 -0
  194. simtools/schemas/model_parameters/fadc_long_sum_bins.schema.yml +41 -0
  195. simtools/schemas/model_parameters/fadc_long_sum_offset.schema.yml +38 -0
  196. simtools/schemas/model_parameters/fadc_max_signal.schema.yml +1 -1
  197. simtools/schemas/model_parameters/fadc_max_sum.schema.yml +1 -1
  198. simtools/schemas/model_parameters/fadc_mhz.schema.yml +1 -1
  199. simtools/schemas/model_parameters/fadc_noise.schema.yml +1 -1
  200. simtools/schemas/model_parameters/fadc_pedestal.schema.yml +1 -1
  201. simtools/schemas/model_parameters/fadc_pulse_shape.schema.yml +1 -1
  202. simtools/schemas/model_parameters/fadc_sensitivity.schema.yml +1 -1
  203. simtools/schemas/model_parameters/fadc_sum_bins.schema.yml +1 -1
  204. simtools/schemas/model_parameters/fadc_sum_offset.schema.yml +1 -1
  205. simtools/schemas/model_parameters/fadc_sysvar_pedestal.schema.yml +1 -1
  206. simtools/schemas/model_parameters/fadc_var_pedestal.schema.yml +1 -1
  207. simtools/schemas/model_parameters/fadc_var_sensitivity.schema.yml +1 -1
  208. simtools/schemas/model_parameters/fake_mirror_list.schema.yml +1 -1
  209. simtools/schemas/model_parameters/flatfielding.schema.yml +1 -1
  210. simtools/schemas/model_parameters/focal_length.schema.yml +1 -1
  211. simtools/schemas/model_parameters/focal_surface_parameters.schema.yml +1 -1
  212. simtools/schemas/model_parameters/focal_surface_ref_radius.schema.yml +1 -1
  213. simtools/schemas/model_parameters/focus_offset.schema.yml +1 -1
  214. simtools/schemas/model_parameters/gain_variation.schema.yml +1 -1
  215. simtools/schemas/model_parameters/geomag_horizontal.schema.yml +1 -1
  216. simtools/schemas/model_parameters/geomag_rotation.schema.yml +1 -1
  217. simtools/schemas/model_parameters/geomag_vertical.schema.yml +1 -1
  218. simtools/schemas/model_parameters/hg_lg_variation.schema.yml +1 -1
  219. simtools/schemas/model_parameters/iobuf_maximum.schema.yml +1 -1
  220. simtools/schemas/model_parameters/iobuf_output_maximum.schema.yml +1 -1
  221. simtools/schemas/model_parameters/laser_events.schema.yml +1 -1
  222. simtools/schemas/model_parameters/laser_external_trigger.schema.yml +1 -1
  223. simtools/schemas/model_parameters/laser_photons.schema.yml +1 -1
  224. simtools/schemas/model_parameters/laser_pulse_exptime.schema.yml +1 -1
  225. simtools/schemas/model_parameters/laser_pulse_offset.schema.yml +1 -1
  226. simtools/schemas/model_parameters/laser_pulse_sigtime.schema.yml +1 -1
  227. simtools/schemas/model_parameters/laser_pulse_twidth.schema.yml +1 -1
  228. simtools/schemas/model_parameters/laser_var_photons.schema.yml +1 -1
  229. simtools/schemas/model_parameters/laser_wavelength.schema.yml +1 -1
  230. simtools/schemas/model_parameters/led_events.schema.yml +1 -1
  231. simtools/schemas/model_parameters/led_photons.schema.yml +1 -1
  232. simtools/schemas/model_parameters/led_pulse_offset.schema.yml +1 -1
  233. simtools/schemas/model_parameters/led_pulse_sigtime.schema.yml +1 -1
  234. simtools/schemas/model_parameters/led_var_photons.schema.yml +1 -1
  235. simtools/schemas/model_parameters/lightguide_efficiency_vs_incidence_angle.schema.yml +1 -1
  236. simtools/schemas/model_parameters/lightguide_efficiency_vs_wavelength.schema.yml +50 -1
  237. simtools/schemas/model_parameters/min_photoelectrons.schema.yml +1 -1
  238. simtools/schemas/model_parameters/min_photons.schema.yml +1 -1
  239. simtools/schemas/model_parameters/mirror_align_random_distance.schema.yml +1 -1
  240. simtools/schemas/model_parameters/mirror_align_random_horizontal.schema.yml +1 -1
  241. simtools/schemas/model_parameters/mirror_align_random_vertical.schema.yml +1 -1
  242. simtools/schemas/model_parameters/mirror_class.schema.yml +1 -1
  243. simtools/schemas/model_parameters/mirror_degraded_reflection.schema.yml +1 -1
  244. simtools/schemas/model_parameters/mirror_focal_length.schema.yml +1 -1
  245. simtools/schemas/model_parameters/mirror_list.schema.yml +1 -1
  246. simtools/schemas/model_parameters/mirror_offset.schema.yml +1 -1
  247. simtools/schemas/model_parameters/mirror_panel_2f_measurements.schema.yml +1 -1
  248. simtools/schemas/model_parameters/mirror_reflection_random_angle.schema.yml +1 -1
  249. simtools/schemas/model_parameters/mirror_reflectivity.schema.yml +1 -1
  250. simtools/schemas/model_parameters/multiplicity_offset.schema.yml +1 -1
  251. simtools/schemas/model_parameters/muon_mono_threshold.schema.yml +1 -1
  252. simtools/schemas/model_parameters/nsb_autoscale_airmass.schema.yml +1 -1
  253. simtools/schemas/model_parameters/nsb_gain_drop_scale.schema.yml +1 -1
  254. simtools/schemas/model_parameters/nsb_offaxis.schema.yml +1 -1
  255. simtools/schemas/model_parameters/nsb_pixel_rate.schema.yml +1 -1
  256. simtools/schemas/model_parameters/nsb_reference_spectrum.schema.yml +2 -2
  257. simtools/schemas/model_parameters/nsb_reference_value.schema.yml +1 -1
  258. simtools/schemas/model_parameters/nsb_scaling_factor.schema.yml +1 -1
  259. simtools/schemas/model_parameters/nsb_sky_map.schema.yml +1 -1
  260. simtools/schemas/model_parameters/nsb_spectrum.schema.yml +23 -30
  261. simtools/schemas/model_parameters/num_gains.schema.yml +1 -1
  262. simtools/schemas/model_parameters/only_triggered_telescopes.schema.yml +1 -1
  263. simtools/schemas/model_parameters/optics_properties.schema.yml +1 -1
  264. simtools/schemas/model_parameters/parabolic_dish.schema.yml +1 -1
  265. simtools/schemas/model_parameters/pedestal_events.schema.yml +1 -1
  266. simtools/schemas/model_parameters/photon_delay.schema.yml +1 -1
  267. simtools/schemas/model_parameters/photons_per_run.schema.yml +1 -1
  268. simtools/schemas/model_parameters/pixel_cells.schema.yml +1 -1
  269. simtools/schemas/model_parameters/pixels_parallel.schema.yml +1 -1
  270. simtools/schemas/model_parameters/pixeltrg_time_step.schema.yml +1 -1
  271. simtools/schemas/model_parameters/pm_average_gain.schema.yml +1 -1
  272. simtools/schemas/model_parameters/pm_collection_efficiency.schema.yml +1 -1
  273. simtools/schemas/model_parameters/pm_gain_index.schema.yml +1 -1
  274. simtools/schemas/model_parameters/pm_photoelectron_spectrum.schema.yml +1 -1
  275. simtools/schemas/model_parameters/pm_transit_time.schema.yml +1 -1
  276. simtools/schemas/model_parameters/pm_voltage_variation.schema.yml +1 -1
  277. simtools/schemas/model_parameters/primary_mirror_degraded_map.schema.yml +1 -1
  278. simtools/schemas/model_parameters/primary_mirror_diameter.schema.yml +1 -1
  279. simtools/schemas/model_parameters/primary_mirror_hole_diameter.schema.yml +1 -1
  280. simtools/schemas/model_parameters/primary_mirror_incidence_angle.schema.yml +11 -1
  281. simtools/schemas/model_parameters/primary_mirror_parameters.schema.yml +1 -1
  282. simtools/schemas/model_parameters/primary_mirror_ref_radius.schema.yml +1 -1
  283. simtools/schemas/model_parameters/primary_mirror_segmentation.schema.yml +1 -1
  284. simtools/schemas/model_parameters/qe_variation.schema.yml +1 -1
  285. simtools/schemas/model_parameters/quantum_efficiency.schema.yml +1 -1
  286. simtools/schemas/model_parameters/random_focal_length.schema.yml +1 -1
  287. simtools/schemas/model_parameters/random_generator.schema.yml +1 -1
  288. simtools/schemas/model_parameters/random_mono_probability.schema.yml +1 -1
  289. simtools/schemas/model_parameters/reference_point_altitude.schema.yml +1 -1
  290. simtools/schemas/model_parameters/reference_point_latitude.schema.yml +1 -1
  291. simtools/schemas/model_parameters/reference_point_longitude.schema.yml +1 -1
  292. simtools/schemas/model_parameters/reference_point_utm_east.schema.yml +1 -1
  293. simtools/schemas/model_parameters/reference_point_utm_north.schema.yml +1 -1
  294. simtools/schemas/model_parameters/sampled_output.schema.yml +1 -1
  295. simtools/schemas/model_parameters/save_pe_with_amplitude.schema.yml +1 -1
  296. simtools/schemas/model_parameters/secondary_mirror_baffle.schema.yml +1 -1
  297. simtools/schemas/model_parameters/secondary_mirror_degraded_map.schema.yml +1 -1
  298. simtools/schemas/model_parameters/secondary_mirror_degraded_reflection.schema.yml +1 -1
  299. simtools/schemas/model_parameters/secondary_mirror_diameter.schema.yml +1 -1
  300. simtools/schemas/model_parameters/secondary_mirror_hole_diameter.schema.yml +1 -1
  301. simtools/schemas/model_parameters/secondary_mirror_incidence_angle.schema.yml +11 -1
  302. simtools/schemas/model_parameters/secondary_mirror_parameters.schema.yml +1 -1
  303. simtools/schemas/model_parameters/secondary_mirror_ref_radius.schema.yml +1 -1
  304. simtools/schemas/model_parameters/secondary_mirror_reflectivity.schema.yml +11 -1
  305. simtools/schemas/model_parameters/secondary_mirror_segmentation.schema.yml +1 -1
  306. simtools/schemas/model_parameters/secondary_mirror_shadow_diameter.schema.yml +1 -1
  307. simtools/schemas/model_parameters/secondary_mirror_shadow_offset.schema.yml +1 -1
  308. simtools/schemas/model_parameters/stars.schema.yml +2 -2
  309. simtools/schemas/model_parameters/store_photoelectrons.schema.yml +1 -1
  310. simtools/schemas/model_parameters/tailcut_scale.schema.yml +1 -1
  311. simtools/schemas/model_parameters/telescope_axis_height.schema.yml +1 -1
  312. simtools/schemas/model_parameters/telescope_random_angle.schema.yml +1 -1
  313. simtools/schemas/model_parameters/telescope_random_error.schema.yml +1 -1
  314. simtools/schemas/model_parameters/telescope_sphere_radius.schema.yml +1 -1
  315. simtools/schemas/model_parameters/telescope_transmission.schema.yml +1 -1
  316. simtools/schemas/model_parameters/teltrig_min_sigsum.schema.yml +1 -1
  317. simtools/schemas/model_parameters/teltrig_min_time.schema.yml +1 -1
  318. simtools/schemas/model_parameters/transit_time_calib_error.schema.yml +1 -1
  319. simtools/schemas/model_parameters/transit_time_compensate_error.schema.yml +1 -1
  320. simtools/schemas/model_parameters/transit_time_compensate_step.schema.yml +1 -1
  321. simtools/schemas/model_parameters/transit_time_error.schema.yml +1 -1
  322. simtools/schemas/model_parameters/transit_time_jitter.schema.yml +1 -1
  323. simtools/schemas/model_parameters/trigger_current_limit.schema.yml +1 -1
  324. simtools/schemas/model_parameters/trigger_delay_compensation.schema.yml +1 -1
  325. simtools/schemas/model_parameters/trigger_pixels.schema.yml +1 -1
  326. simtools/schemas/plot_configuration.metaschema.yml +5 -2
  327. simtools/schemas/production_configuration_metrics.schema.yml +12 -2
  328. simtools/schemas/production_tables.schema.yml +7 -2
  329. simtools/simtel/simtel_config_reader.py +2 -2
  330. simtools/simtel/simtel_config_writer.py +33 -23
  331. simtools/simtel/simtel_io_event_histograms.py +483 -0
  332. simtools/simtel/simtel_io_event_reader.py +65 -43
  333. simtools/simtel/simtel_io_event_writer.py +40 -20
  334. simtools/simtel/simtel_io_metadata.py +1 -1
  335. simtools/simtel/simtel_table_reader.py +95 -13
  336. simtools/simtel/simulator_array.py +138 -10
  337. simtools/simtel/simulator_camera_efficiency.py +32 -23
  338. simtools/simtel/simulator_light_emission.py +437 -271
  339. simtools/simtel/simulator_ray_tracing.py +1 -1
  340. simtools/simulator.py +105 -147
  341. simtools/telescope_trigger_rates.py +119 -0
  342. simtools/testing/configuration.py +24 -26
  343. simtools/testing/helpers.py +2 -2
  344. simtools/testing/log_inspector.py +52 -0
  345. simtools/testing/validate_output.py +87 -37
  346. simtools/utils/general.py +125 -255
  347. simtools/utils/geometry.py +56 -0
  348. simtools/utils/names.py +1 -1
  349. simtools/visualization/legend_handlers.py +180 -264
  350. simtools/visualization/plot_array_layout.py +20 -8
  351. simtools/visualization/plot_incident_angles.py +431 -0
  352. simtools/visualization/plot_pixels.py +1 -1
  353. simtools/visualization/plot_simtel_event_histograms.py +376 -0
  354. simtools/visualization/plot_simtel_events.py +816 -0
  355. simtools/visualization/plot_tables.py +133 -37
  356. simtools/visualization/visualize.py +1 -100
  357. gammasimtools-0.18.0.dist-info/RECORD +0 -376
  358. simtools/applications/calculate_trigger_rate.py +0 -187
  359. simtools/applications/generate_sim_telarray_histograms.py +0 -196
  360. simtools/production_configuration/derive_corsika_limits_grid.py +0 -232
  361. simtools/simtel/simtel_io_histogram.py +0 -621
  362. simtools/simtel/simtel_io_histograms.py +0 -552
  363. {gammasimtools-0.18.0.dist-info → gammasimtools-0.20.0.dist-info}/WHEEL +0 -0
  364. {gammasimtools-0.18.0.dist-info → gammasimtools-0.20.0.dist-info}/top_level.txt +0 -0
  365. /simtools/{io_operations → io}/hdf5_handler.py +0 -0
  366. /simtools/{io_operations → io}/legacy_data_handler.py +0 -0
  367. /simtools/{io_operations/io_table_handler.py → io/table_handler.py} +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:
@@ -222,6 +222,13 @@ class CommandLineParser(argparse.ArgumentParser):
222
222
  required=False,
223
223
  default=None,
224
224
  )
225
+ _job_group.add_argument(
226
+ "--db_simulation_model_version",
227
+ help="version of simulation model database",
228
+ type=str.strip,
229
+ required=False,
230
+ default=None,
231
+ )
225
232
 
226
233
  def initialize_simulation_model_arguments(self, model_options):
227
234
  """
@@ -307,6 +314,12 @@ class CommandLineParser(argparse.ArgumentParser):
307
314
  selected_parameters=simulation_configuration["corsika_configuration"],
308
315
  available_parameters=self._get_dictionary_with_shower_configuration(),
309
316
  )
317
+ if "sim_telarray_configuration" in simulation_configuration:
318
+ self._initialize_simulation_configuration(
319
+ group_name="sim_telarray configuration",
320
+ selected_parameters=simulation_configuration["sim_telarray_configuration"],
321
+ available_parameters=self._get_dictionary_with_sim_telarray_configuration(),
322
+ )
310
323
 
311
324
  def _initialize_simulation_software(self):
312
325
  """Initialize simulation software arguments."""
@@ -351,11 +364,13 @@ class CommandLineParser(argparse.ArgumentParser):
351
364
  ),
352
365
  "type": CommandLineParser.azimuth_angle,
353
366
  "required": True,
367
+ "default": 0 * u.deg,
354
368
  },
355
369
  "zenith_angle": {
356
370
  "help": "Zenith angle in degrees (between 0 and 180).",
357
371
  "type": CommandLineParser.zenith_angle,
358
372
  "required": True,
373
+ "default": 20 * u.deg,
359
374
  },
360
375
  "nshow": {
361
376
  "help": "Number of showers per run to simulate.",
@@ -429,6 +444,27 @@ class CommandLineParser(argparse.ArgumentParser):
429
444
  },
430
445
  }
431
446
 
447
+ @staticmethod
448
+ def _get_dictionary_with_sim_telarray_configuration():
449
+ """Return dictionary with sim_telarray configuration parameters."""
450
+ return {
451
+ "sim_telarray_instrument_seeds": {
452
+ "help": (
453
+ "Random seed used for sim_telarray instrument setup. "
454
+ "If '--sim_telarray_random_instrument_instances' is not set: "
455
+ "use as sim_telarray seed ('random_seed' parameter). Otherwise: "
456
+ "use as base seed to generate the random instrument instance seeds."
457
+ ),
458
+ "type": str,
459
+ "required": False,
460
+ },
461
+ "sim_telarray_random_instrument_instances": {
462
+ "help": "Number of random instrument instances initialized in sim_telarray.",
463
+ "type": int,
464
+ "required": False,
465
+ },
466
+ }
467
+
432
468
  def _initialize_simulation_configuration(
433
469
  self, group_name, selected_parameters, available_parameters
434
470
  ):
@@ -711,28 +747,27 @@ class CommandLineParser(argparse.ArgumentParser):
711
747
  @staticmethod
712
748
  def parse_quantity_pair(string):
713
749
  """
714
- Parse a string representing a pair of astropy quantities separated by a space.
715
-
716
- Args:
717
- string: The input string (e.g., "0 deg 1.5 deg").
750
+ Parse a string representing a pair of astropy quantities.
718
751
 
719
752
  Returns
720
753
  -------
721
- tuple: A tuple containing two astropy.units.Quantity objects.
754
+ tuple
755
+ A tuple of two astropy.units.Quantity objects.
722
756
 
723
757
  Raises
724
758
  ------
725
- ValueError: If the string is not formatted correctly (e.g., missing space).
759
+ ValueError
760
+ If the string cannot be parsed into exactly two quantities.
726
761
  """
727
- pattern = r"(\d+\.?\d*)\s*([a-zA-Z]+)"
762
+ pattern = r"(?>[\d\.eE+-]+)\s*(?>[A-Za-z]+)"
728
763
  matches = re.findall(pattern, string)
729
764
  if len(matches) != 2:
730
765
  raise ValueError("Input string does not contain exactly two quantities.")
731
766
 
732
- return (
733
- u.Quantity(float(matches[0][0]), matches[0][1]),
734
- u.Quantity(float(matches[1][0]), matches[1][1]),
735
- )
767
+ try:
768
+ return tuple(u.Quantity(m) for m in matches)
769
+ except Exception as exc:
770
+ raise ValueError(f"Could not parse quantities: {exc}") from exc
736
771
 
737
772
  @staticmethod
738
773
  def parse_integer_and_quantity(input_string):
@@ -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
  )
@@ -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