gammasimtools 0.23.0__py3-none-any.whl → 0.25.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 (90) hide show
  1. {gammasimtools-0.23.0.dist-info → gammasimtools-0.25.0.dist-info}/METADATA +1 -1
  2. {gammasimtools-0.23.0.dist-info → gammasimtools-0.25.0.dist-info}/RECORD +89 -85
  3. {gammasimtools-0.23.0.dist-info → gammasimtools-0.25.0.dist-info}/entry_points.txt +1 -0
  4. simtools/_version.py +2 -2
  5. simtools/application_control.py +54 -4
  6. simtools/applications/convert_geo_coordinates_of_array_elements.py +1 -1
  7. simtools/applications/db_add_file_to_db.py +2 -2
  8. simtools/applications/db_add_simulation_model_from_repository_to_db.py +1 -1
  9. simtools/applications/db_add_value_from_json_to_db.py +2 -2
  10. simtools/applications/db_development_tools/write_array_elements_positions_to_repository.py +1 -1
  11. simtools/applications/db_generate_compound_indexes.py +1 -1
  12. simtools/applications/db_get_array_layouts_from_db.py +2 -2
  13. simtools/applications/db_get_file_from_db.py +1 -1
  14. simtools/applications/db_get_parameter_from_db.py +1 -1
  15. simtools/applications/db_inspect_databases.py +4 -2
  16. simtools/applications/db_upload_model_repository.py +1 -1
  17. simtools/applications/derive_ctao_array_layouts.py +1 -1
  18. simtools/applications/derive_psf_parameters.py +5 -0
  19. simtools/applications/derive_pulse_shape_parameters.py +195 -0
  20. simtools/applications/generate_array_config.py +1 -1
  21. simtools/applications/maintain_simulation_model_add_production.py +11 -21
  22. simtools/applications/plot_array_layout.py +63 -1
  23. simtools/applications/production_generate_grid.py +1 -1
  24. simtools/applications/simulate_flasher.py +3 -2
  25. simtools/applications/simulate_pedestals.py +1 -1
  26. simtools/applications/simulate_prod.py +8 -23
  27. simtools/applications/simulate_prod_htcondor_generator.py +7 -0
  28. simtools/applications/submit_array_layouts.py +7 -5
  29. simtools/applications/validate_camera_fov.py +1 -1
  30. simtools/applications/validate_cumulative_psf.py +2 -2
  31. simtools/applications/validate_file_using_schema.py +49 -123
  32. simtools/applications/validate_optics.py +1 -1
  33. simtools/configuration/commandline_parser.py +15 -15
  34. simtools/configuration/configurator.py +1 -1
  35. simtools/corsika/corsika_config.py +199 -91
  36. simtools/data_model/model_data_writer.py +15 -3
  37. simtools/data_model/schema.py +145 -36
  38. simtools/data_model/validate_data.py +82 -48
  39. simtools/db/db_handler.py +61 -294
  40. simtools/db/db_model_upload.py +3 -2
  41. simtools/db/mongo_db.py +626 -0
  42. simtools/dependencies.py +38 -17
  43. simtools/io/eventio_handler.py +128 -0
  44. simtools/job_execution/htcondor_script_generator.py +0 -2
  45. simtools/layout/array_layout.py +7 -7
  46. simtools/layout/array_layout_utils.py +4 -4
  47. simtools/model/array_model.py +72 -72
  48. simtools/model/calibration_model.py +12 -9
  49. simtools/model/model_parameter.py +196 -160
  50. simtools/model/model_repository.py +176 -39
  51. simtools/model/model_utils.py +3 -3
  52. simtools/model/site_model.py +59 -27
  53. simtools/model/telescope_model.py +21 -13
  54. simtools/ray_tracing/mirror_panel_psf.py +4 -4
  55. simtools/ray_tracing/psf_analysis.py +11 -8
  56. simtools/ray_tracing/psf_parameter_optimisation.py +823 -680
  57. simtools/reporting/docs_auto_report_generator.py +1 -1
  58. simtools/reporting/docs_read_parameters.py +72 -11
  59. simtools/runners/corsika_runner.py +12 -3
  60. simtools/runners/corsika_simtel_runner.py +6 -0
  61. simtools/runners/runner_services.py +17 -7
  62. simtools/runners/simtel_runner.py +12 -54
  63. simtools/schemas/model_parameters/flasher_pulse_exp_decay.schema.yml +2 -0
  64. simtools/schemas/model_parameters/flasher_pulse_shape.schema.yml +50 -0
  65. simtools/schemas/model_parameters/flasher_pulse_width.schema.yml +2 -0
  66. simtools/schemas/simulation_models_info.schema.yml +4 -1
  67. simtools/simtel/pulse_shapes.py +268 -0
  68. simtools/simtel/simtel_config_writer.py +179 -21
  69. simtools/simtel/simtel_io_event_writer.py +2 -2
  70. simtools/simtel/simulator_array.py +58 -12
  71. simtools/simtel/simulator_light_emission.py +45 -8
  72. simtools/simulator.py +361 -346
  73. simtools/testing/assertions.py +110 -10
  74. simtools/testing/configuration.py +1 -1
  75. simtools/testing/log_inspector.py +4 -1
  76. simtools/testing/sim_telarray_metadata.py +1 -1
  77. simtools/testing/validate_output.py +46 -15
  78. simtools/utils/names.py +2 -4
  79. simtools/utils/value_conversion.py +10 -5
  80. simtools/version.py +61 -0
  81. simtools/visualization/legend_handlers.py +14 -4
  82. simtools/visualization/plot_array_layout.py +229 -33
  83. simtools/visualization/plot_mirrors.py +837 -0
  84. simtools/visualization/plot_pixels.py +1 -1
  85. simtools/visualization/plot_psf.py +1 -1
  86. simtools/visualization/plot_tables.py +1 -1
  87. simtools/simtel/simtel_io_file_info.py +0 -62
  88. {gammasimtools-0.23.0.dist-info → gammasimtools-0.25.0.dist-info}/WHEEL +0 -0
  89. {gammasimtools-0.23.0.dist-info → gammasimtools-0.25.0.dist-info}/licenses/LICENSE +0 -0
  90. {gammasimtools-0.23.0.dist-info → gammasimtools-0.25.0.dist-info}/top_level.txt +0 -0
@@ -12,6 +12,7 @@ import numpy as np
12
12
  from simtools.io import io_handler
13
13
  from simtools.model.model_utils import initialize_simulation_models
14
14
  from simtools.runners.simtel_runner import SimtelRunner
15
+ from simtools.simtel.simtel_config_writer import SimtelConfigWriter
15
16
  from simtools.utils.general import clear_default_sim_telarray_cfg_directories
16
17
  from simtools.utils.geometry import fiducial_radius_from_shape
17
18
 
@@ -335,18 +336,54 @@ class SimulatorLightEmission(SimtelRunner):
335
336
  def _add_flasher_command_options(self):
336
337
  """Add flasher options for all telescope types (ff-1m style)."""
337
338
  flasher_xyz = self.calibration_model.get_parameter_value_with_unit("flasher_position")
338
- camera_radius = fiducial_radius_from_shape(
339
+ camera_diam_cm = (
339
340
  self.telescope_model.get_parameter_value_with_unit("camera_body_diameter")
340
341
  .to(u.cm)
341
- .value,
342
- self.telescope_model.get_parameter_value("camera_body_shape"),
342
+ .value
343
343
  )
344
+ camera_shape = self.telescope_model.get_parameter_value("camera_body_shape")
345
+ camera_radius = fiducial_radius_from_shape(camera_diam_cm, camera_shape)
344
346
  flasher_wavelength = self.calibration_model.get_parameter_value_with_unit(
345
347
  "flasher_wavelength"
346
348
  )
347
349
  dist_cm = self.calculate_distance_focal_plane_calibration_device().to(u.cm).value
348
350
  angular_distribution = self._get_angular_distribution_string_for_sim_telarray()
349
351
 
352
+ # Build pulse table for ff-1m using model width/exp parameters; else use token.
353
+ pulse_arg = self._get_pulse_shape_string_for_sim_telarray()
354
+ pulse_shape = self.calibration_model.get_parameter_value("flasher_pulse_shape")
355
+ width_q = self.calibration_model.get_parameter_value_with_unit("flasher_pulse_width")
356
+ exp_q = self.calibration_model.get_parameter_value_with_unit("flasher_pulse_exp_decay")
357
+ if (
358
+ isinstance(exp_q, u.Quantity)
359
+ and isinstance(width_q, u.Quantity)
360
+ and pulse_shape == "Gauss-Exponential"
361
+ ):
362
+ try:
363
+ base_dir = self.io_handler.get_output_directory("pulse_shapes")
364
+
365
+ def _sanitize_name(value):
366
+ return "".join(
367
+ ch if (ch.isalnum() or ch in ("-", "_")) else "_" for ch in str(value)
368
+ )
369
+
370
+ tel = self.light_emission_config.get("telescope") or "telescope"
371
+ cal = self.light_emission_config.get("light_source") or "calibration"
372
+ fname = f"flasher_pulse_shape_{_sanitize_name(tel)}_{_sanitize_name(cal)}.dat"
373
+ table_path = base_dir / fname
374
+ fadc_bins = self.telescope_model.get_parameter_value("fadc_sum_bins")
375
+
376
+ SimtelConfigWriter.write_lightpulse_table_gauss_expconv(
377
+ file_path=table_path,
378
+ width_ns=width_q.to(u.ns).value,
379
+ exp_decay_ns=exp_q.to(u.ns).value,
380
+ fadc_sum_bins=fadc_bins,
381
+ time_margin_ns=5.0,
382
+ )
383
+ pulse_arg = str(table_path)
384
+ except (ValueError, OSError) as err:
385
+ self._logger.warning(f"Failed to write pulse shape table, using token: {err}")
386
+
350
387
  return [
351
388
  f"--events {self.light_emission_config['number_of_events']}",
352
389
  f"--photons {self.light_emission_config['flasher_photons']}",
@@ -355,7 +392,7 @@ class SimulatorLightEmission(SimtelRunner):
355
392
  f"--distance {dist_cm}",
356
393
  f"--camera-radius {camera_radius}",
357
394
  f"--spectrum {int(flasher_wavelength.to(u.nm).value)}",
358
- f"--lightpulse {self._get_pulse_shape_string_for_sim_telarray()}",
395
+ f"--lightpulse {pulse_arg}",
359
396
  f"--angular-distribution {angular_distribution}",
360
397
  ]
361
398
 
@@ -475,9 +512,8 @@ class SimulatorLightEmission(SimtelRunner):
475
512
  str
476
513
  The angular distribution string.
477
514
  """
478
- option_string = self.calibration_model.get_parameter_value(
479
- "flasher_angular_distribution"
480
- ).lower()
515
+ opt = self.calibration_model.get_parameter_value("flasher_angular_distribution")
516
+ option_string = str(opt).lower() if opt is not None else ""
481
517
  width = self.calibration_model.get_parameter_value_with_unit(
482
518
  "flasher_angular_distribution_width"
483
519
  )
@@ -492,6 +528,7 @@ class SimulatorLightEmission(SimtelRunner):
492
528
  str
493
529
  The pulse shape string.
494
530
  """
495
- option_string = self.calibration_model.get_parameter_value("flasher_pulse_shape").lower()
531
+ opt = self.calibration_model.get_parameter_value("flasher_pulse_shape")
532
+ option_string = str(opt).lower() if opt is not None else ""
496
533
  width = self.calibration_model.get_parameter_value_with_unit("flasher_pulse_width")
497
534
  return f"{option_string}:{width.to(u.ns).value}" if width is not None else option_string