gammasimtools 0.21.0__py3-none-any.whl → 0.23.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 (370) hide show
  1. {gammasimtools-0.21.0.dist-info → gammasimtools-0.23.0.dist-info}/METADATA +3 -3
  2. gammasimtools-0.23.0.dist-info/RECORD +414 -0
  3. {gammasimtools-0.21.0.dist-info → gammasimtools-0.23.0.dist-info}/entry_points.txt +2 -1
  4. simtools/_version.py +2 -2
  5. simtools/application_control.py +118 -0
  6. simtools/applications/calculate_incident_angles.py +17 -25
  7. simtools/applications/convert_all_model_parameters_from_simtel.py +29 -45
  8. simtools/applications/convert_geo_coordinates_of_array_elements.py +26 -45
  9. simtools/applications/convert_model_parameter_from_simtel.py +21 -42
  10. simtools/applications/db_add_file_to_db.py +12 -13
  11. simtools/applications/db_add_simulation_model_from_repository_to_db.py +20 -33
  12. simtools/applications/db_add_value_from_json_to_db.py +28 -23
  13. simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +19 -34
  14. simtools/applications/db_generate_compound_indexes.py +12 -27
  15. simtools/applications/db_get_array_layouts_from_db.py +19 -39
  16. simtools/applications/db_get_file_from_db.py +15 -17
  17. simtools/applications/db_get_parameter_from_db.py +33 -35
  18. simtools/applications/db_inspect_databases.py +10 -11
  19. simtools/applications/db_upload_model_repository.py +104 -0
  20. simtools/applications/derive_ctao_array_layouts.py +16 -21
  21. simtools/applications/derive_mirror_rnda.py +9 -14
  22. simtools/applications/derive_photon_electron_spectrum.py +7 -10
  23. simtools/applications/derive_psf_parameters.py +24 -21
  24. simtools/applications/derive_trigger_rates.py +6 -9
  25. simtools/applications/docs_produce_array_element_report.py +22 -23
  26. simtools/applications/docs_produce_calibration_reports.py +26 -24
  27. simtools/applications/docs_produce_model_parameter_reports.py +15 -22
  28. simtools/applications/docs_produce_simulation_configuration_report.py +21 -22
  29. simtools/applications/generate_array_config.py +14 -33
  30. simtools/applications/generate_corsika_histograms.py +22 -43
  31. simtools/applications/generate_default_metadata.py +15 -36
  32. simtools/applications/generate_regular_arrays.py +11 -15
  33. simtools/applications/generate_simtel_event_data.py +23 -33
  34. simtools/applications/maintain_simulation_model_add_production.py +17 -48
  35. simtools/applications/maintain_simulation_model_compare_productions.py +10 -12
  36. simtools/applications/maintain_simulation_model_verify_production_tables.py +8 -11
  37. simtools/applications/merge_tables.py +15 -24
  38. simtools/applications/plot_array_layout.py +77 -55
  39. simtools/applications/plot_simtel_events.py +11 -13
  40. simtools/applications/plot_tabular_data.py +17 -38
  41. simtools/applications/plot_tabular_data_for_model_parameter.py +16 -23
  42. simtools/applications/print_version.py +14 -42
  43. simtools/applications/production_derive_corsika_limits.py +5 -9
  44. simtools/applications/production_derive_statistics.py +12 -26
  45. simtools/applications/production_generate_grid.py +20 -48
  46. simtools/applications/production_merge_corsika_limits.py +17 -21
  47. simtools/applications/run_application.py +12 -32
  48. simtools/applications/simulate_flasher.py +79 -81
  49. simtools/applications/simulate_illuminator.py +56 -197
  50. simtools/applications/{simulate_calibration_events.py → simulate_pedestals.py} +22 -68
  51. simtools/applications/simulate_prod.py +21 -33
  52. simtools/applications/simulate_prod_htcondor_generator.py +11 -25
  53. simtools/applications/submit_array_layouts.py +15 -18
  54. simtools/applications/submit_data_from_external.py +18 -34
  55. simtools/applications/submit_model_parameter_from_external.py +27 -41
  56. simtools/applications/validate_camera_efficiency.py +23 -22
  57. simtools/applications/validate_camera_fov.py +21 -27
  58. simtools/applications/validate_cumulative_psf.py +28 -37
  59. simtools/applications/validate_file_using_schema.py +35 -45
  60. simtools/applications/validate_optics.py +27 -33
  61. simtools/camera/camera_efficiency.py +8 -13
  62. simtools/configuration/commandline_parser.py +33 -11
  63. simtools/configuration/configurator.py +0 -7
  64. simtools/corsika/corsika_config.py +9 -16
  65. simtools/corsika/corsika_histograms.py +1 -1
  66. simtools/data_model/data_reader.py +0 -2
  67. simtools/data_model/metadata_collector.py +0 -2
  68. simtools/data_model/model_data_writer.py +87 -27
  69. simtools/data_model/schema.py +61 -2
  70. simtools/data_model/validate_data.py +1 -3
  71. simtools/db/db_handler.py +58 -39
  72. simtools/db/db_model_upload.py +210 -5
  73. simtools/io/hdf5_handler.py +0 -5
  74. simtools/io/io_handler.py +31 -83
  75. simtools/io/legacy_data_handler.py +0 -5
  76. simtools/job_execution/job_manager.py +43 -1
  77. simtools/layout/array_layout.py +0 -2
  78. simtools/layout/array_layout_utils.py +1 -5
  79. simtools/layout/telescope_position.py +0 -2
  80. simtools/model/array_model.py +95 -46
  81. simtools/model/calibration_model.py +0 -2
  82. simtools/model/camera.py +0 -2
  83. simtools/model/mirrors.py +0 -2
  84. simtools/model/model_parameter.py +50 -16
  85. simtools/model/model_repository.py +139 -106
  86. simtools/model/model_utils.py +21 -11
  87. simtools/model/site_model.py +0 -2
  88. simtools/model/telescope_model.py +20 -2
  89. simtools/production_configuration/calculate_statistical_uncertainties_grid_point.py +0 -2
  90. simtools/production_configuration/derive_corsika_limits.py +1 -1
  91. simtools/production_configuration/derive_production_statistics.py +0 -2
  92. simtools/production_configuration/interpolation_handler.py +0 -2
  93. simtools/ray_tracing/incident_angles.py +7 -7
  94. simtools/ray_tracing/mirror_panel_psf.py +1 -1
  95. simtools/ray_tracing/psf_analysis.py +0 -2
  96. simtools/ray_tracing/psf_parameter_optimisation.py +180 -73
  97. simtools/ray_tracing/ray_tracing.py +1 -5
  98. simtools/reporting/docs_auto_report_generator.py +108 -0
  99. simtools/reporting/docs_read_parameters.py +168 -104
  100. simtools/resources/array_elements.yml +26 -0
  101. simtools/runners/corsika_runner.py +0 -2
  102. simtools/runners/corsika_simtel_runner.py +11 -19
  103. simtools/runners/runner_services.py +5 -6
  104. simtools/runners/simtel_runner.py +0 -2
  105. simtools/runners/simtools_runner.py +0 -2
  106. simtools/schemas/application_workflow.metaschema.yml +1 -1
  107. simtools/schemas/common_definitions.schema.yml +39 -0
  108. simtools/schemas/model_parameter.metaschema.yml +19 -13
  109. simtools/schemas/model_parameter_and_data_schema.metaschema.yml +6 -12
  110. simtools/schemas/model_parameters/adjust_gain.schema.yml +0 -5
  111. simtools/schemas/model_parameters/altitude.schema.yml +0 -5
  112. simtools/schemas/model_parameters/array_coordinates.schema.yml +0 -5
  113. simtools/schemas/model_parameters/array_coordinates_UTM.schema.yml +0 -5
  114. simtools/schemas/model_parameters/array_element_position_ground.schema.yml +0 -7
  115. simtools/schemas/model_parameters/array_element_position_utm.schema.yml +0 -7
  116. simtools/schemas/model_parameters/array_layouts.schema.yml +0 -5
  117. simtools/schemas/model_parameters/array_triggers.schema.yml +0 -5
  118. simtools/schemas/model_parameters/array_window.schema.yml +0 -7
  119. simtools/schemas/model_parameters/asum_clipping.schema.yml +0 -3
  120. simtools/schemas/model_parameters/asum_offset.schema.yml +0 -7
  121. simtools/schemas/model_parameters/asum_shaping.schema.yml +0 -7
  122. simtools/schemas/model_parameters/asum_threshold.schema.yml +0 -7
  123. simtools/schemas/model_parameters/atmospheric_profile.schema.yml +0 -5
  124. simtools/schemas/model_parameters/atmospheric_transmission.schema.yml +0 -5
  125. simtools/schemas/model_parameters/axes_offsets.schema.yml +0 -7
  126. simtools/schemas/model_parameters/calibration_devices.schema.yml +30 -0
  127. simtools/schemas/model_parameters/camera_body_diameter.schema.yml +0 -7
  128. simtools/schemas/model_parameters/camera_body_shape.schema.yml +0 -7
  129. simtools/schemas/model_parameters/camera_config_file.schema.yml +0 -7
  130. simtools/schemas/model_parameters/camera_config_rotate.schema.yml +0 -7
  131. simtools/schemas/model_parameters/camera_degraded_efficiency.schema.yml +0 -7
  132. simtools/schemas/model_parameters/camera_degraded_map.schema.yml +0 -7
  133. simtools/schemas/model_parameters/camera_depth.schema.yml +0 -7
  134. simtools/schemas/model_parameters/camera_filter.schema.yml +0 -7
  135. simtools/schemas/model_parameters/camera_filter_incidence_angle.schema.yml +0 -3
  136. simtools/schemas/model_parameters/camera_pixels.schema.yml +0 -7
  137. simtools/schemas/model_parameters/camera_transmission.schema.yml +0 -7
  138. simtools/schemas/model_parameters/channels_per_chip.schema.yml +0 -7
  139. simtools/schemas/model_parameters/correct_nsb_spectrum_to_telescope_altitude.schema.yml +0 -7
  140. simtools/schemas/model_parameters/corsika_observation_level.schema.yml +0 -5
  141. simtools/schemas/model_parameters/dark_events.schema.yml +4 -3
  142. simtools/schemas/model_parameters/default_trigger.schema.yml +0 -7
  143. simtools/schemas/model_parameters/design_model.schema.yml +0 -7
  144. simtools/schemas/model_parameters/disc_ac_coupled.schema.yml +0 -7
  145. simtools/schemas/model_parameters/disc_bins.schema.yml +0 -7
  146. simtools/schemas/model_parameters/disc_start.schema.yml +0 -7
  147. simtools/schemas/model_parameters/discriminator_amplitude.schema.yml +0 -7
  148. simtools/schemas/model_parameters/discriminator_fall_time.schema.yml +0 -7
  149. simtools/schemas/model_parameters/discriminator_gate_length.schema.yml +0 -7
  150. simtools/schemas/model_parameters/discriminator_hysteresis.schema.yml +0 -7
  151. simtools/schemas/model_parameters/discriminator_output_amplitude.schema.yml +0 -7
  152. simtools/schemas/model_parameters/discriminator_output_var_percent.schema.yml +0 -7
  153. simtools/schemas/model_parameters/discriminator_pulse_shape.schema.yml +0 -7
  154. simtools/schemas/model_parameters/discriminator_rise_time.schema.yml +0 -7
  155. simtools/schemas/model_parameters/discriminator_scale_threshold.schema.yml +0 -7
  156. simtools/schemas/model_parameters/discriminator_sigsum_over_threshold.schema.yml +0 -7
  157. simtools/schemas/model_parameters/discriminator_threshold.schema.yml +0 -7
  158. simtools/schemas/model_parameters/discriminator_time_over_threshold.schema.yml +1 -9
  159. simtools/schemas/model_parameters/discriminator_var_gate_length.schema.yml +0 -7
  160. simtools/schemas/model_parameters/discriminator_var_sigsum_over_threshold.schema.yml +0 -7
  161. simtools/schemas/model_parameters/discriminator_var_threshold.schema.yml +0 -7
  162. simtools/schemas/model_parameters/discriminator_var_time_over_threshold.schema.yml +0 -7
  163. simtools/schemas/model_parameters/dish_shape_length.schema.yml +0 -5
  164. simtools/schemas/model_parameters/dsum_clipping.schema.yml +1 -5
  165. simtools/schemas/model_parameters/dsum_ignore_below.schema.yml +0 -3
  166. simtools/schemas/model_parameters/dsum_offset.schema.yml +0 -3
  167. simtools/schemas/model_parameters/dsum_pedsub.schema.yml +0 -3
  168. simtools/schemas/model_parameters/dsum_pre_clipping.schema.yml +0 -3
  169. simtools/schemas/model_parameters/dsum_prescale.schema.yml +0 -3
  170. simtools/schemas/model_parameters/dsum_presum_max.schema.yml +0 -3
  171. simtools/schemas/model_parameters/dsum_presum_shift.schema.yml +0 -3
  172. simtools/schemas/model_parameters/dsum_shaping.schema.yml +0 -3
  173. simtools/schemas/model_parameters/dsum_shaping_renormalize.schema.yml +0 -3
  174. simtools/schemas/model_parameters/dsum_threshold.schema.yml +2 -12
  175. simtools/schemas/model_parameters/dsum_zero_clip.schema.yml +0 -3
  176. simtools/schemas/model_parameters/effective_focal_length.schema.yml +0 -7
  177. simtools/schemas/model_parameters/epsg_code.schema.yml +0 -5
  178. simtools/schemas/model_parameters/fadc_ac_coupled.schema.yml +0 -7
  179. simtools/schemas/model_parameters/fadc_amplitude.schema.yml +2 -9
  180. simtools/schemas/model_parameters/fadc_bins.schema.yml +0 -7
  181. simtools/schemas/model_parameters/fadc_compensate_pedestal.schema.yml +0 -7
  182. simtools/schemas/model_parameters/fadc_dev_pedestal.schema.yml +0 -2
  183. simtools/schemas/model_parameters/fadc_err_compensate_pedestal.schema.yml +0 -7
  184. simtools/schemas/model_parameters/fadc_err_pedestal.schema.yml +0 -7
  185. simtools/schemas/model_parameters/fadc_lg_amplitude.schema.yml +2 -9
  186. simtools/schemas/model_parameters/fadc_lg_compensate_pedestal.schema.yml +0 -7
  187. simtools/schemas/model_parameters/fadc_lg_dev_pedestal.schema.yml +0 -2
  188. simtools/schemas/model_parameters/fadc_lg_err_compensate_pedestal.schema.yml +0 -7
  189. simtools/schemas/model_parameters/fadc_lg_err_pedestal.schema.yml +0 -7
  190. simtools/schemas/model_parameters/fadc_lg_max_signal.schema.yml +0 -7
  191. simtools/schemas/model_parameters/fadc_lg_max_sum.schema.yml +0 -2
  192. simtools/schemas/model_parameters/fadc_lg_noise.schema.yml +0 -7
  193. simtools/schemas/model_parameters/fadc_lg_pedestal.schema.yml +0 -7
  194. simtools/schemas/model_parameters/fadc_lg_sensitivity.schema.yml +0 -7
  195. simtools/schemas/model_parameters/fadc_lg_sysvar_pedestal.schema.yml +0 -7
  196. simtools/schemas/model_parameters/fadc_lg_var_pedestal.schema.yml +0 -7
  197. simtools/schemas/model_parameters/fadc_lg_var_sensitivity.schema.yml +0 -7
  198. simtools/schemas/model_parameters/fadc_long_event_threshold.schema.yml +0 -3
  199. simtools/schemas/model_parameters/fadc_long_sum_bins.schema.yml +0 -3
  200. simtools/schemas/model_parameters/fadc_long_sum_offset.schema.yml +0 -3
  201. simtools/schemas/model_parameters/fadc_max_signal.schema.yml +0 -7
  202. simtools/schemas/model_parameters/fadc_max_sum.schema.yml +0 -2
  203. simtools/schemas/model_parameters/fadc_mhz.schema.yml +0 -7
  204. simtools/schemas/model_parameters/fadc_noise.schema.yml +0 -7
  205. simtools/schemas/model_parameters/fadc_pedestal.schema.yml +0 -7
  206. simtools/schemas/model_parameters/fadc_pulse_shape.schema.yml +0 -7
  207. simtools/schemas/model_parameters/fadc_sensitivity.schema.yml +0 -7
  208. simtools/schemas/model_parameters/fadc_sum_bins.schema.yml +0 -7
  209. simtools/schemas/model_parameters/fadc_sum_offset.schema.yml +0 -7
  210. simtools/schemas/model_parameters/fadc_sysvar_pedestal.schema.yml +0 -7
  211. simtools/schemas/model_parameters/fadc_var_pedestal.schema.yml +0 -7
  212. simtools/schemas/model_parameters/fadc_var_sensitivity.schema.yml +0 -7
  213. simtools/schemas/model_parameters/fake_mirror_list.schema.yml +0 -3
  214. simtools/schemas/model_parameters/flasher_angular_distribution.schema.yml +32 -0
  215. simtools/schemas/model_parameters/flasher_angular_distribution_width.schema.yml +32 -0
  216. simtools/schemas/model_parameters/flasher_bunch_size.schema.yml +28 -0
  217. simtools/schemas/model_parameters/flasher_external_trigger.schema.yml +32 -0
  218. simtools/schemas/model_parameters/flasher_photons.schema.yml +34 -0
  219. simtools/schemas/model_parameters/flasher_position.schema.yml +43 -0
  220. simtools/schemas/model_parameters/flasher_pulse_exp_decay.schema.yml +29 -0
  221. simtools/schemas/model_parameters/flasher_pulse_offset.schema.yml +35 -0
  222. simtools/schemas/model_parameters/flasher_pulse_shape.schema.yml +30 -0
  223. simtools/schemas/model_parameters/flasher_pulse_width.schema.yml +32 -0
  224. simtools/schemas/model_parameters/flasher_type.schema.yml +28 -0
  225. simtools/schemas/model_parameters/flasher_var_photons.schema.yml +31 -0
  226. simtools/schemas/model_parameters/flasher_wavelength.schema.yml +33 -0
  227. simtools/schemas/model_parameters/flatfielding.schema.yml +0 -7
  228. simtools/schemas/model_parameters/focal_length.schema.yml +0 -7
  229. simtools/schemas/model_parameters/focal_surface_parameters.schema.yml +0 -3
  230. simtools/schemas/model_parameters/focal_surface_ref_radius.schema.yml +0 -3
  231. simtools/schemas/model_parameters/focus_offset.schema.yml +0 -7
  232. simtools/schemas/model_parameters/gain_variation.schema.yml +0 -7
  233. simtools/schemas/model_parameters/geomag_horizontal.schema.yml +2 -7
  234. simtools/schemas/model_parameters/geomag_rotation.schema.yml +2 -7
  235. simtools/schemas/model_parameters/geomag_vertical.schema.yml +2 -7
  236. simtools/schemas/model_parameters/hg_lg_variation.schema.yml +0 -5
  237. simtools/schemas/model_parameters/iobuf_maximum.schema.yml +0 -7
  238. simtools/schemas/model_parameters/iobuf_output_maximum.schema.yml +0 -7
  239. simtools/schemas/model_parameters/laser_events.schema.yml +4 -3
  240. simtools/schemas/model_parameters/laser_external_trigger.schema.yml +4 -3
  241. simtools/schemas/model_parameters/laser_photons.schema.yml +4 -3
  242. simtools/schemas/model_parameters/laser_pulse_exptime.schema.yml +4 -3
  243. simtools/schemas/model_parameters/laser_pulse_offset.schema.yml +4 -3
  244. simtools/schemas/model_parameters/laser_pulse_sigtime.schema.yml +4 -3
  245. simtools/schemas/model_parameters/laser_pulse_twidth.schema.yml +4 -3
  246. simtools/schemas/model_parameters/laser_var_photons.schema.yml +4 -3
  247. simtools/schemas/model_parameters/laser_wavelength.schema.yml +4 -3
  248. simtools/schemas/model_parameters/led_events.schema.yml +4 -3
  249. simtools/schemas/model_parameters/led_photons.schema.yml +4 -3
  250. simtools/schemas/model_parameters/led_pulse_offset.schema.yml +4 -3
  251. simtools/schemas/model_parameters/led_pulse_sigtime.schema.yml +4 -3
  252. simtools/schemas/model_parameters/led_var_photons.schema.yml +4 -3
  253. simtools/schemas/model_parameters/lightguide_efficiency_vs_incidence_angle.schema.yml +0 -7
  254. simtools/schemas/model_parameters/lightguide_efficiency_vs_wavelength.schema.yml +0 -7
  255. simtools/schemas/model_parameters/min_photoelectrons.schema.yml +0 -7
  256. simtools/schemas/model_parameters/min_photons.schema.yml +0 -7
  257. simtools/schemas/model_parameters/mirror_align_random_distance.schema.yml +0 -5
  258. simtools/schemas/model_parameters/mirror_align_random_horizontal.schema.yml +0 -7
  259. simtools/schemas/model_parameters/mirror_align_random_vertical.schema.yml +0 -7
  260. simtools/schemas/model_parameters/mirror_class.schema.yml +2 -9
  261. simtools/schemas/model_parameters/mirror_degraded_reflection.schema.yml +0 -7
  262. simtools/schemas/model_parameters/mirror_focal_length.schema.yml +0 -5
  263. simtools/schemas/model_parameters/mirror_list.schema.yml +0 -7
  264. simtools/schemas/model_parameters/mirror_offset.schema.yml +0 -7
  265. simtools/schemas/model_parameters/mirror_reflection_random_angle.schema.yml +0 -7
  266. simtools/schemas/model_parameters/mirror_reflectivity.schema.yml +0 -7
  267. simtools/schemas/model_parameters/multiplicity_offset.schema.yml +0 -7
  268. simtools/schemas/model_parameters/muon_mono_threshold.schema.yml +0 -7
  269. simtools/schemas/model_parameters/nsb_autoscale_airmass.schema.yml +0 -7
  270. simtools/schemas/model_parameters/nsb_gain_drop_scale.schema.yml +0 -3
  271. simtools/schemas/model_parameters/nsb_offaxis.schema.yml +0 -7
  272. simtools/schemas/model_parameters/nsb_pixel_rate.schema.yml +0 -7
  273. simtools/schemas/model_parameters/nsb_reference_spectrum.schema.yml +0 -5
  274. simtools/schemas/model_parameters/nsb_reference_value.schema.yml +0 -5
  275. simtools/schemas/model_parameters/nsb_scaling_factor.schema.yml +0 -5
  276. simtools/schemas/model_parameters/nsb_sky_map.schema.yml +0 -5
  277. simtools/schemas/model_parameters/nsb_spectrum.schema.yml +0 -5
  278. simtools/schemas/model_parameters/num_gains.schema.yml +0 -7
  279. simtools/schemas/model_parameters/only_triggered_telescopes.schema.yml +0 -7
  280. simtools/schemas/model_parameters/optics_properties.schema.yml +0 -7
  281. simtools/schemas/model_parameters/parabolic_dish.schema.yml +0 -3
  282. simtools/schemas/model_parameters/pedestal_events.schema.yml +4 -7
  283. simtools/schemas/model_parameters/photon_delay.schema.yml +0 -7
  284. simtools/schemas/model_parameters/photons_per_run.schema.yml +4 -4
  285. simtools/schemas/model_parameters/pixel_cells.schema.yml +0 -3
  286. simtools/schemas/model_parameters/pixels_parallel.schema.yml +0 -3
  287. simtools/schemas/model_parameters/pixeltrg_time_step.schema.yml +0 -7
  288. simtools/schemas/model_parameters/pm_average_gain.schema.yml +0 -5
  289. simtools/schemas/model_parameters/pm_collection_efficiency.schema.yml +0 -5
  290. simtools/schemas/model_parameters/pm_gain_index.schema.yml +0 -5
  291. simtools/schemas/model_parameters/pm_photoelectron_spectrum.schema.yml +0 -7
  292. simtools/schemas/model_parameters/pm_transit_time.schema.yml +4 -9
  293. simtools/schemas/model_parameters/pm_voltage_variation.schema.yml +0 -5
  294. simtools/schemas/model_parameters/primary_mirror_degraded_map.schema.yml +0 -7
  295. simtools/schemas/model_parameters/primary_mirror_diameter.schema.yml +0 -3
  296. simtools/schemas/model_parameters/primary_mirror_hole_diameter.schema.yml +0 -3
  297. simtools/schemas/model_parameters/primary_mirror_incidence_angle.schema.yml +0 -3
  298. simtools/schemas/model_parameters/primary_mirror_parameters.schema.yml +0 -3
  299. simtools/schemas/model_parameters/primary_mirror_ref_radius.schema.yml +0 -3
  300. simtools/schemas/model_parameters/primary_mirror_segmentation.schema.yml +0 -3
  301. simtools/schemas/model_parameters/qe_variation.schema.yml +0 -7
  302. simtools/schemas/model_parameters/quantum_efficiency.schema.yml +0 -7
  303. simtools/schemas/model_parameters/random_focal_length.schema.yml +2 -7
  304. simtools/schemas/model_parameters/random_generator.schema.yml +0 -7
  305. simtools/schemas/model_parameters/random_mono_probability.schema.yml +0 -7
  306. simtools/schemas/model_parameters/reference_point_altitude.schema.yml +0 -5
  307. simtools/schemas/model_parameters/reference_point_latitude.schema.yml +0 -5
  308. simtools/schemas/model_parameters/reference_point_longitude.schema.yml +0 -5
  309. simtools/schemas/model_parameters/reference_point_utm_east.schema.yml +0 -5
  310. simtools/schemas/model_parameters/reference_point_utm_north.schema.yml +0 -5
  311. simtools/schemas/model_parameters/sampled_output.schema.yml +0 -7
  312. simtools/schemas/model_parameters/save_pe_with_amplitude.schema.yml +0 -7
  313. simtools/schemas/model_parameters/secondary_mirror_baffle.schema.yml +0 -3
  314. simtools/schemas/model_parameters/secondary_mirror_degraded_map.schema.yml +0 -3
  315. simtools/schemas/model_parameters/secondary_mirror_degraded_reflection.schema.yml +0 -3
  316. simtools/schemas/model_parameters/secondary_mirror_diameter.schema.yml +0 -3
  317. simtools/schemas/model_parameters/secondary_mirror_hole_diameter.schema.yml +0 -3
  318. simtools/schemas/model_parameters/secondary_mirror_incidence_angle.schema.yml +0 -3
  319. simtools/schemas/model_parameters/secondary_mirror_parameters.schema.yml +0 -3
  320. simtools/schemas/model_parameters/secondary_mirror_ref_radius.schema.yml +0 -3
  321. simtools/schemas/model_parameters/secondary_mirror_reflectivity.schema.yml +0 -3
  322. simtools/schemas/model_parameters/secondary_mirror_segmentation.schema.yml +0 -3
  323. simtools/schemas/model_parameters/secondary_mirror_shadow_diameter.schema.yml +0 -3
  324. simtools/schemas/model_parameters/secondary_mirror_shadow_offset.schema.yml +0 -3
  325. simtools/schemas/model_parameters/stars.schema.yml +0 -5
  326. simtools/schemas/model_parameters/store_photoelectrons.schema.yml +0 -7
  327. simtools/schemas/model_parameters/tailcut_scale.schema.yml +0 -7
  328. simtools/schemas/model_parameters/telescope_axis_height.schema.yml +0 -7
  329. simtools/schemas/model_parameters/telescope_random_angle.schema.yml +0 -7
  330. simtools/schemas/model_parameters/telescope_random_error.schema.yml +0 -7
  331. simtools/schemas/model_parameters/telescope_sphere_radius.schema.yml +0 -7
  332. simtools/schemas/model_parameters/telescope_transmission.schema.yml +0 -7
  333. simtools/schemas/model_parameters/teltrig_min_sigsum.schema.yml +0 -7
  334. simtools/schemas/model_parameters/teltrig_min_time.schema.yml +0 -7
  335. simtools/schemas/model_parameters/transit_time_calib_error.schema.yml +0 -7
  336. simtools/schemas/model_parameters/transit_time_compensate_error.schema.yml +0 -7
  337. simtools/schemas/model_parameters/transit_time_compensate_step.schema.yml +0 -7
  338. simtools/schemas/model_parameters/transit_time_error.schema.yml +0 -7
  339. simtools/schemas/model_parameters/transit_time_jitter.schema.yml +0 -7
  340. simtools/schemas/model_parameters/transit_time_random.schema.yml +29 -0
  341. simtools/schemas/model_parameters/trigger_current_limit.schema.yml +0 -7
  342. simtools/schemas/model_parameters/trigger_delay_compensation.schema.yml +0 -7
  343. simtools/schemas/model_parameters/trigger_pixels.schema.yml +0 -7
  344. simtools/schemas/production_tables.schema.yml +8 -8
  345. simtools/schemas/simulation_models_info.schema.yml +78 -0
  346. simtools/simtel/simtel_config_reader.py +0 -2
  347. simtools/simtel/simtel_config_writer.py +118 -26
  348. simtools/simtel/simtel_io_metadata.py +3 -3
  349. simtools/simtel/simulator_array.py +43 -85
  350. simtools/simtel/simulator_camera_efficiency.py +0 -2
  351. simtools/simtel/simulator_light_emission.py +336 -631
  352. simtools/simtel/simulator_ray_tracing.py +2 -4
  353. simtools/simulator.py +45 -19
  354. simtools/testing/assertions.py +2 -2
  355. simtools/testing/configuration.py +21 -6
  356. simtools/testing/sim_telarray_metadata.py +4 -4
  357. simtools/utils/general.py +5 -13
  358. simtools/utils/geometry.py +34 -5
  359. simtools/utils/names.py +1 -13
  360. simtools/version.py +83 -0
  361. simtools/visualization/plot_array_layout.py +129 -23
  362. simtools/visualization/plot_incident_angles.py +0 -2
  363. simtools/visualization/plot_psf.py +163 -61
  364. simtools/visualization/plot_simtel_events.py +1 -12
  365. simtools/visualization/visualize.py +0 -12
  366. gammasimtools-0.21.0.dist-info/RECORD +0 -396
  367. simtools/model/flasher_model.py +0 -106
  368. {gammasimtools-0.21.0.dist-info → gammasimtools-0.23.0.dist-info}/WHEEL +0 -0
  369. {gammasimtools-0.21.0.dist-info → gammasimtools-0.23.0.dist-info}/licenses/LICENSE +0 -0
  370. {gammasimtools-0.21.0.dist-info → gammasimtools-0.23.0.dist-info}/top_level.txt +0 -0
@@ -36,34 +36,19 @@ r"""
36
36
 
37
37
  """
38
38
 
39
- import logging
40
- from pathlib import Path
41
-
42
39
  import simtools.data_model.model_data_writer as writer
43
- import simtools.utils.general as gen
40
+ from simtools.application_control import get_application_label, startup_application
44
41
  from simtools.configuration import configurator
45
42
  from simtools.data_model import validate_data
46
43
  from simtools.data_model.metadata_collector import MetadataCollector
47
44
 
48
45
 
49
- def _parse(label, description):
50
- """
51
- Parse command line configuration.
52
-
53
- Parameters
54
- ----------
55
- label: str
56
- Label describing application.
57
- description: str
58
- Description of application.
59
-
60
- Returns
61
- -------
62
- CommandLineParser
63
- Command line parser object
64
-
65
- """
66
- config = configurator.Configurator(label=label, description=description)
46
+ def _parse():
47
+ """Parse command line configuration."""
48
+ config = configurator.Configurator(
49
+ label=get_application_label(__file__),
50
+ description="Submit and validate data (e.g., input data to tools, model parameters).",
51
+ )
67
52
 
68
53
  config.parser.add_argument(
69
54
  "--input_meta",
@@ -92,26 +77,25 @@ def _parse(label, description):
92
77
  return config.initialize(output=True)
93
78
 
94
79
 
95
- def main(): # noqa: D103
96
- args_dict, _ = _parse(
97
- label=Path(__file__).stem,
98
- description="Submit and validate data (e.g., input data to tools, model parameters).",
99
- )
80
+ def main():
81
+ """Submit and validate data (e.g., input data to tools, model parameters)."""
82
+ app_context = startup_application(_parse)
100
83
 
101
- logger = logging.getLogger()
102
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
103
-
104
- _metadata = None if args_dict.get("ignore_metadata") else MetadataCollector(args_dict)
84
+ _metadata = (
85
+ None if app_context.args.get("ignore_metadata") else MetadataCollector(app_context.args)
86
+ )
105
87
 
106
88
  data_validator = validate_data.DataValidator(
107
89
  schema_file=(
108
- _metadata.get_data_model_schema_file_name() if _metadata else args_dict.get("schema")
90
+ _metadata.get_data_model_schema_file_name()
91
+ if _metadata
92
+ else app_context.args.get("schema")
109
93
  ),
110
- data_file=args_dict["input"],
94
+ data_file=app_context.args["input"],
111
95
  )
112
96
 
113
97
  writer.ModelDataWriter.dump(
114
- args_dict=args_dict,
98
+ args_dict=app_context.args,
115
99
  metadata=_metadata,
116
100
  product_data=data_validator.validate_and_transform(),
117
101
  )
@@ -38,32 +38,19 @@ r"""
38
38
 
39
39
  """
40
40
 
41
- import logging
42
41
  from pathlib import Path
43
42
 
44
43
  import simtools.data_model.model_data_writer as writer
45
- import simtools.utils.general as gen
44
+ from simtools.application_control import get_application_label, startup_application
46
45
  from simtools.configuration import configurator
47
46
 
48
47
 
49
- def _parse(label, description):
50
- """
51
- Parse command line configuration.
52
-
53
- Parameters
54
- ----------
55
- label: str
56
- Label describing application.
57
- description: str
58
- Description of application.
59
-
60
- Returns
61
- -------
62
- CommandLineParser
63
- Command line parser object
64
-
65
- """
66
- config = configurator.Configurator(label=label, description=description)
48
+ def _parse():
49
+ """Parse command line configuration."""
50
+ config = configurator.Configurator(
51
+ label=get_application_label(__file__),
52
+ description="Submit and validate a model parameter.",
53
+ )
67
54
 
68
55
  config.parser.add_argument(
69
56
  "--parameter", type=str, required=True, help="Parameter for simulation model"
@@ -98,31 +85,30 @@ def _parse(label, description):
98
85
  return config.initialize(output=True, db_config=True)
99
86
 
100
87
 
101
- def main(): # noqa: D103
102
- args_dict, db_config = _parse(
103
- label=Path(__file__).stem,
104
- description="Submit and validate a model parameters).",
105
- )
106
-
107
- logger = logging.getLogger()
108
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
88
+ def main():
89
+ """Submit and validate a model parameter value and metadata."""
90
+ app_context = startup_application(_parse)
109
91
 
110
- output_path = (
111
- Path(args_dict["output_path"]) / args_dict["parameter"]
112
- if args_dict.get("output_path")
113
- else None
114
- )
92
+ if app_context.args.get("output_path"):
93
+ output_path = app_context.io_handler.get_output_directory(
94
+ sub_dir=app_context.args.get("parameter")
95
+ )
96
+ else:
97
+ output_path = None
115
98
 
116
99
  writer.ModelDataWriter.dump_model_parameter(
117
- parameter_name=args_dict["parameter"],
118
- value=args_dict["value"],
119
- instrument=args_dict["instrument"],
120
- parameter_version=args_dict["parameter_version"],
121
- output_file=Path(args_dict["parameter"] + "-" + args_dict["parameter_version"] + ".json"),
100
+ parameter_name=app_context.args["parameter"],
101
+ value=app_context.args["value"],
102
+ instrument=app_context.args["instrument"],
103
+ parameter_version=app_context.args["parameter_version"],
104
+ output_file=Path(
105
+ app_context.args["parameter"] + "-" + app_context.args["parameter_version"] + ".json"
106
+ ),
122
107
  output_path=output_path,
123
- use_plain_output_path=args_dict.get("use_plain_output_path"),
124
- metadata_input_dict=args_dict,
125
- db_config=db_config if args_dict.get("check_parameter_version") else None,
108
+ metadata_input_dict=app_context.args,
109
+ db_config=app_context.db_config
110
+ if app_context.args.get("check_parameter_version")
111
+ else None,
126
112
  )
127
113
 
128
114
 
@@ -44,19 +44,18 @@ r"""
44
44
  The output is saved in simtools-output/validate_camera_efficiency.
45
45
  """
46
46
 
47
- import logging
48
47
  from pathlib import Path
49
48
 
50
49
  import simtools.data_model.model_data_writer as writer
51
- import simtools.utils.general as gen
50
+ from simtools.application_control import get_application_label, startup_application
52
51
  from simtools.camera.camera_efficiency import CameraEfficiency
53
52
  from simtools.configuration import configurator
54
53
 
55
54
 
56
- def _parse(label):
55
+ def _parse():
57
56
  """Parse command line configuration."""
58
57
  config = configurator.Configurator(
59
- label=label,
58
+ label=get_application_label(__file__),
60
59
  description=(
61
60
  "Calculate the camera efficiency and NSB pixel rates. "
62
61
  "Plot the camera efficiency vs wavelength for Cherenkov and NSB light."
@@ -91,29 +90,26 @@ def _parse(label):
91
90
  action="store_true",
92
91
  required=False,
93
92
  )
94
- _args_dict, _db_config = config.initialize(
93
+ args_dict, db_config = config.initialize(
95
94
  db_config=True,
96
95
  simulation_model=["telescope", "model_version", "parameter_version"],
97
96
  simulation_configuration={"corsika_configuration": ["zenith_angle", "azimuth_angle"]},
98
97
  )
99
- if _args_dict["site"] is None or _args_dict["telescope"] is None:
98
+ if args_dict["site"] is None or args_dict["telescope"] is None:
100
99
  config.parser.print_help()
101
100
  print("\n\nSite and telescope must be provided\n\n")
102
101
  raise RuntimeError("Site and telescope must be provided")
103
- return _args_dict, _db_config
102
+ return args_dict, db_config
104
103
 
105
104
 
106
- def main(): # noqa: D103
107
- label = Path(__file__).stem
108
- args_dict, db_config = _parse(label)
109
-
110
- logger = logging.getLogger()
111
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
105
+ def main():
106
+ """Calculate the camera efficiency and NSB pixel rates."""
107
+ app_context = startup_application(_parse)
112
108
 
113
109
  ce = CameraEfficiency(
114
- db_config=db_config,
115
- label=args_dict.get("label", label),
116
- config_data=args_dict,
110
+ db_config=app_context.db_config,
111
+ label=app_context.args.get("label"),
112
+ config_data=app_context.args,
117
113
  )
118
114
  ce.simulate()
119
115
  ce.analyze(force=True)
@@ -123,13 +119,18 @@ def main(): # noqa: D103
123
119
  writer.ModelDataWriter.dump_model_parameter(
124
120
  parameter_name="nsb_pixel_rate",
125
121
  value=ce.get_nsb_pixel_rate(
126
- reference_conditions=args_dict.get("write_reference_nsb_rate_as_parameter", False)
122
+ reference_conditions=app_context.args.get(
123
+ "write_reference_nsb_rate_as_parameter", False
124
+ )
125
+ ),
126
+ instrument=app_context.args["telescope"],
127
+ parameter_version=app_context.args.get("parameter_version", "0.0.0"),
128
+ output_file=Path(
129
+ f"nsb_pixel_rate-{app_context.args.get('parameter_version', '0.0.0')}.json"
127
130
  ),
128
- instrument=args_dict["telescope"],
129
- parameter_version=args_dict.get("parameter_version", "0.0.0"),
130
- output_file=Path(f"nsb_pixel_rate-{args_dict.get('parameter_version', '0.0.0')}.json"),
131
- output_path=Path(args_dict["output_path"]) / args_dict["telescope"] / "nsb_pixel_rate",
132
- use_plain_output_path=args_dict.get("use_plain_output_path"),
131
+ output_path=app_context.io_handler.get_output_directory()
132
+ / app_context.args["telescope"]
133
+ / "nsb_pixel_rate",
133
134
  )
134
135
 
135
136
 
@@ -47,19 +47,16 @@ r"""
47
47
 
48
48
  """
49
49
 
50
- import logging
51
- from pathlib import Path
52
-
53
- import simtools.utils.general as gen
50
+ from simtools.application_control import get_application_label, startup_application
54
51
  from simtools.configuration import configurator
55
- from simtools.io import io_handler
56
52
  from simtools.model.telescope_model import TelescopeModel
57
53
  from simtools.visualization import plot_camera, visualize
58
54
 
59
55
 
60
56
  def _parse():
57
+ """Parse command line configuration."""
61
58
  config = configurator.Configurator(
62
- label=Path(__file__).stem,
59
+ label=get_application_label(__file__),
63
60
  description=(
64
61
  "Calculate the camera FoV of the telescope requested. "
65
62
  "Plot the camera, as seen for an observer facing the camera."
@@ -86,52 +83,49 @@ def _parse():
86
83
  return config.initialize(db_config=True, simulation_model=["telescope", "model_version"])
87
84
 
88
85
 
89
- def main(): # noqa: D103
90
- args_dict, db_config = _parse()
86
+ def main():
87
+ """Validate camera field of view."""
88
+ app_context = startup_application(_parse)
91
89
 
92
90
  label = "validate_camera_fov"
93
91
 
94
- logger = logging.getLogger()
95
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
96
-
97
- # Output directory to save files related directly to this app
98
- _io_handler = io_handler.IOHandler()
99
- output_dir = _io_handler.get_output_directory(label, sub_dir="application-plots")
100
-
101
92
  tel_model = TelescopeModel(
102
- site=args_dict["site"],
103
- telescope_name=args_dict["telescope"],
104
- mongo_db_config=db_config,
105
- model_version=args_dict["model_version"],
93
+ site=app_context.args["site"],
94
+ telescope_name=app_context.args["telescope"],
95
+ mongo_db_config=app_context.db_config,
96
+ model_version=app_context.args["model_version"],
106
97
  label=label,
107
98
  )
108
99
  tel_model.export_model_files()
109
100
 
110
- print(f"\nValidating the camera FoV of {tel_model.name}\n")
101
+ app_context.logger.info(f"\nValidating the camera FoV of {tel_model.name}\n")
111
102
 
112
103
  focal_length = tel_model.get_telescope_effective_focal_length("cm")
113
104
  camera = tel_model.camera
114
105
 
115
106
  fov, r_edge_avg = camera.calc_fov()
116
107
 
117
- print("\nEffective focal length = " + f"{focal_length:.3f} cm")
118
- print(f"{tel_model.name} FoV = {fov:.3f} deg")
119
- print(f"Avg. edge radius = {r_edge_avg:.3f} cm\n")
108
+ app_context.logger.info(f"\nEffective focal length = {focal_length:.3f} cm")
109
+ app_context.logger.info(f"{tel_model.name} FoV = {fov:.3f} deg")
110
+ app_context.logger.info(f"Avg. edge radius = {r_edge_avg:.3f} cm\n")
120
111
 
121
112
  # Now plot the camera as well
122
113
  try:
123
- pixel_ids_to_print = int(args_dict["print_pixels_id"])
114
+ pixel_ids_to_print = int(app_context.args["print_pixels_id"])
124
115
  if pixel_ids_to_print == 0:
125
116
  pixel_ids_to_print = -1 # so not print the zero pixel
126
117
  except ValueError as exc:
127
- if args_dict["print_pixels_id"].lower() == "all":
118
+ if app_context.args["print_pixels_id"].lower() == "all":
128
119
  pixel_ids_to_print = camera.get_number_of_pixels()
129
120
  else:
130
121
  raise ValueError(
131
- f"The value provided to --print_pixels_id ({args_dict['print_pixels_id']}) "
122
+ f"The value provided to --print_pixels_id ({app_context.args['print_pixels_id']}) "
132
123
  "should be an integer or All"
133
124
  ) from exc
134
- fig = plot_camera.plot_pixel_layout(camera, args_dict["camera_in_sky_coor"], pixel_ids_to_print)
125
+ fig = plot_camera.plot_pixel_layout(
126
+ camera, app_context.args["camera_in_sky_coor"], pixel_ids_to_print
127
+ )
128
+ output_dir = app_context.io_handler.get_output_directory()
135
129
  plot_file_prefix = output_dir.joinpath(f"{label}_{tel_model.name}_pixel_layout")
136
130
  visualize.save_figure(fig, f"{plot_file_prefix!s}", log_title="camera")
137
131
 
@@ -69,25 +69,24 @@
69
69
 
70
70
  """
71
71
 
72
- import logging
73
72
  from collections import OrderedDict
74
- from pathlib import Path
75
73
 
76
74
  import astropy.units as u
77
75
  import matplotlib.pyplot as plt
78
76
  import numpy as np
79
77
 
80
78
  import simtools.utils.general as gen
79
+ from simtools.application_control import get_application_label, startup_application
81
80
  from simtools.configuration import configurator
82
- from simtools.io import io_handler
83
81
  from simtools.model.model_utils import initialize_simulation_models
84
82
  from simtools.ray_tracing.ray_tracing import RayTracing
85
83
  from simtools.visualization import visualize
86
84
 
87
85
 
88
- def _parse(label):
86
+ def _parse():
87
+ """Parse command line configuration."""
89
88
  config = configurator.Configurator(
90
- label=label,
89
+ label=get_application_label(__file__),
91
90
  description=(
92
91
  "Calculate and plot the PSF and eff. mirror area as a function of off-axis angle "
93
92
  "of the telescope requested."
@@ -125,55 +124,47 @@ def load_data(datafile):
125
124
  return data
126
125
 
127
126
 
128
- def main(): # noqa: D103
129
- label = Path(__file__).stem
130
- args_dict, db_config = _parse(label)
127
+ def main():
128
+ """Validate the cumulative PSF of a telescope model against data."""
129
+ app_context = startup_application(_parse)
131
130
 
132
- logger = logging.getLogger()
133
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
134
-
135
- # Output directory to save files related directly to this app
136
- _io_handler = io_handler.IOHandler()
137
- output_dir = _io_handler.get_output_directory(label, sub_dir="application-plots")
138
-
139
- tel_model, site_model = initialize_simulation_models(
140
- label=label,
141
- db_config=db_config,
142
- site=args_dict["site"],
143
- telescope_name=args_dict["telescope"],
144
- model_version=args_dict["model_version"],
131
+ tel_model, site_model, _ = initialize_simulation_models(
132
+ label=app_context.args.get("label"),
133
+ db_config=app_context.db_config,
134
+ site=app_context.args["site"],
135
+ telescope_name=app_context.args["telescope"],
136
+ model_version=app_context.args["model_version"],
145
137
  )
146
138
 
147
- if args_dict.get("telescope_model_file"):
148
- tel_model.change_multiple_parameters_from_file(args_dict["telescope_model_file"])
139
+ if app_context.args.get("telescope_model_file"):
140
+ tel_model.change_multiple_parameters_from_file(app_context.args["telescope_model_file"])
149
141
 
150
142
  ray = RayTracing(
151
143
  telescope_model=tel_model,
152
144
  site_model=site_model,
153
- simtel_path=args_dict["simtel_path"],
154
- zenith_angle=args_dict["zenith"] * u.deg,
155
- source_distance=args_dict["src_distance"] * u.km,
145
+ simtel_path=app_context.args["simtel_path"],
146
+ zenith_angle=app_context.args["zenith"] * u.deg,
147
+ source_distance=app_context.args["src_distance"] * u.km,
156
148
  off_axis_angle=[0.0] * u.deg,
157
149
  )
158
150
 
159
- ray.simulate(test=args_dict["test"], force=False)
151
+ ray.simulate(test=app_context.args["test"], force=False)
160
152
  ray.analyze(force=False)
161
153
 
162
154
  # Plotting cumulative PSF
163
155
  im = ray.images()[0]
164
156
 
165
- print(f"d80 in cm = {im.get_psf()}")
157
+ app_context.logger.info(f"d80 in cm = {im.get_psf()}")
166
158
 
167
- # Plotting cumulative PSF
168
- # Measured cumulative PSF
159
+ # Plotting measured cumulative PSF
169
160
  data_to_plot = OrderedDict()
170
161
  radius = None
171
- if args_dict.get("data", None):
172
- data_file = gen.find_file(args_dict["data"], args_dict["model_path"])
162
+ if app_context.args.get("data", None):
163
+ data_file = gen.find_file(app_context.args["data"], app_context.args["model_path"])
173
164
  data_to_plot["measured"] = load_data(data_file)
174
165
  radius = data_to_plot["measured"]["Radius [cm]"]
175
166
 
176
- # Simulated cumulative PSF
167
+ # Plotting simulated cumulative PSF
177
168
  if radius is not None:
178
169
  data_to_plot[r"sim$\_$telarray"] = im.get_cumulative_data(radius * u.cm)
179
170
  else:
@@ -182,8 +173,8 @@ def main(): # noqa: D103
182
173
  fig = visualize.plot_1d(data_to_plot)
183
174
  fig.gca().set_ylim(0, 1.05)
184
175
 
185
- plot_file_name = label + "_" + tel_model.name + "_cumulative_PSF"
186
- plot_file = output_dir.joinpath(plot_file_name)
176
+ plot_file_name = app_context.args.get("label") + "_" + tel_model.name + "_cumulative_PSF"
177
+ plot_file = app_context.io_handler.get_output_file(plot_file_name)
187
178
  visualize.save_figure(fig, plot_file)
188
179
 
189
180
  # Plotting image
@@ -193,8 +184,8 @@ def main(): # noqa: D103
193
184
  fig.gca().add_artist(circle)
194
185
  fig.gca().set_aspect("equal")
195
186
 
196
- plot_file_name = label + "_" + tel_model.name + "_image"
197
- plot_file = output_dir.joinpath(plot_file_name)
187
+ plot_file_name = app_context.args.get("label") + "_" + tel_model.name + "_image"
188
+ plot_file = app_context.io_handler.get_output_file(plot_file_name)
198
189
  visualize.save_figure(fig, plot_file)
199
190
 
200
191
 
@@ -32,41 +32,31 @@ r"""
32
32
 
33
33
  """
34
34
 
35
- import logging
36
35
  import re
37
36
  from pathlib import Path
38
37
 
39
- import simtools.utils.general as gen
38
+ from simtools.application_control import get_application_label, startup_application
40
39
  from simtools.configuration import configurator
41
40
  from simtools.constants import MODEL_PARAMETER_SCHEMA_PATH
42
41
  from simtools.data_model import metadata_collector, schema, validate_data
43
42
  from simtools.io import ascii_handler
44
43
 
45
44
 
46
- def _parse(label, description):
47
- """
48
- Parse command line configuration.
49
-
50
- Parameters
51
- ----------
52
- label (str)
53
- application label
54
- description (str)
55
- application description
56
-
57
- Returns
58
- -------
59
- config (Configurator)
60
- application configuration
61
-
62
- """
63
- config = configurator.Configurator(label=label, description=description)
64
- group = config.parser.add_mutually_exclusive_group(required=True)
65
- group.add_argument("--file_name", help="File to be validated")
66
- group.add_argument(
45
+ def _parse():
46
+ """Parse command line configuration."""
47
+ config = configurator.Configurator(
48
+ label=get_application_label(__file__),
49
+ description="Validate a file (metadata, schema, or data file) using a schema.",
50
+ )
51
+ config.parser.add_argument(
52
+ "--file_name",
53
+ help="File to be validated (full path or name pattern, e.g., '*.json')",
54
+ default="*.json",
55
+ )
56
+ config.parser.add_argument(
67
57
  "--file_directory",
68
58
  help=(
69
- "Directory with json files to be validated. "
59
+ "Directory with files to be validated. "
70
60
  "If no schema file is provided, the assumption is that model "
71
61
  "parameters are validated and the schema files are taken from "
72
62
  f"{MODEL_PARAMETER_SCHEMA_PATH}."
@@ -84,6 +74,11 @@ def _parse(label, description):
84
74
  help="Require exact data type for validation",
85
75
  action="store_true",
86
76
  )
77
+ config.parser.add_argument(
78
+ "--ignore_software_version",
79
+ help="Ignore software version check.",
80
+ action="store_true",
81
+ )
87
82
  return config.initialize(paths=False)
88
83
 
89
84
 
@@ -115,11 +110,11 @@ def _get_schema_file_name(args_dict, data_dict=None):
115
110
  return schema_file
116
111
 
117
112
 
118
- def _get_json_file_list(file_directory=None, file_name=None):
119
- """Return list of json files in a directory."""
113
+ def _get_file_list(file_directory=None, file_name="*.json"):
114
+ """Return list of files in a directory."""
120
115
  file_list = []
121
116
  if file_directory is not None:
122
- file_list = list(Path(file_directory).rglob("*.json"))
117
+ file_list = list(Path(file_directory).rglob(file_name))
123
118
  if not file_list:
124
119
  raise FileNotFoundError(f"No files found in {file_directory}")
125
120
  elif file_name is not None:
@@ -137,9 +132,7 @@ def validate_dict_using_schema(args_dict, logger):
137
132
  the metadata section of the data dictionary.
138
133
 
139
134
  """
140
- for file_name in _get_json_file_list(
141
- args_dict.get("file_directory"), args_dict.get("file_name")
142
- ):
135
+ for file_name in _get_file_list(args_dict.get("file_directory"), args_dict.get("file_name")):
143
136
  try:
144
137
  data = ascii_handler.collect_data_from_file(file_name=file_name)
145
138
  except FileNotFoundError as exc:
@@ -148,7 +141,9 @@ def validate_dict_using_schema(args_dict, logger):
148
141
  try:
149
142
  for data_dict in data:
150
143
  schema.validate_dict_using_schema(
151
- data_dict, _get_schema_file_name(args_dict, data_dict)
144
+ data_dict,
145
+ _get_schema_file_name(args_dict, data_dict),
146
+ ignore_software_version=args_dict.get("ignore_software_version", False),
152
147
  )
153
148
  except Exception as exc:
154
149
  raise ValueError(f"Validation of file {file_name} failed") from exc
@@ -159,7 +154,7 @@ def validate_data_files(args_dict, logger):
159
154
  """Validate data files."""
160
155
  if args_dict.get("file_directory") is not None:
161
156
  tmp_args_dict = {}
162
- for file_name in _get_json_file_list(args_dict.get("file_directory")):
157
+ for file_name in _get_file_list(args_dict.get("file_directory")):
163
158
  tmp_args_dict["file_name"] = file_name
164
159
  parameter_name = re.sub(r"-\d+\.\d+\.\d+", "", file_name.stem)
165
160
  schema_file = schema.get_model_parameter_schema_file(f"{parameter_name}")
@@ -192,21 +187,16 @@ def validate_metadata(args_dict, logger):
192
187
  logger.info(f"Successful validation of metadata {args_dict['file_name']}")
193
188
 
194
189
 
195
- def main(): # noqa: D103
196
- label = Path(__file__).stem
197
- args_dict, _ = _parse(
198
- label, description="Validate a file (metadata, schema, or data file) using a schema."
199
- )
200
-
201
- logger = logging.getLogger()
202
- logger.setLevel(gen.get_log_level_from_user(args_dict["log_level"]))
190
+ def main():
191
+ """Validate a file or files in a directory using a schema."""
192
+ app_context = startup_application(_parse)
203
193
 
204
- if args_dict["data_type"].lower() == "metadata":
205
- validate_metadata(args_dict, logger)
206
- elif args_dict["data_type"].lower() == "schema":
207
- validate_dict_using_schema(args_dict, logger)
194
+ if app_context.args["data_type"].lower() == "metadata":
195
+ validate_metadata(app_context.args, app_context.logger)
196
+ elif app_context.args["data_type"].lower() == "schema":
197
+ validate_dict_using_schema(app_context.args, app_context.logger)
208
198
  else:
209
- validate_data_files(args_dict, logger)
199
+ validate_data_files(app_context.args, app_context.logger)
210
200
 
211
201
 
212
202
  if __name__ == "__main__":