Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
9e070e3
Add event-level production comparison CLI
GernotMaier May 11, 2026
6caa7c8
Remove unrelated planning files from PR
GernotMaier May 11, 2026
500d4a5
Add changelog for PR 2181
GernotMaier May 11, 2026
ec4a513
Merge branch 'main' into event-level-comparision
GernotMaier May 12, 2026
8990ae1
improved plots
GernotMaier May 13, 2026
0e8060a
compare productions
GernotMaier May 13, 2026
05fe632
unit tests
GernotMaier May 13, 2026
4229f04
complexity
GernotMaier May 13, 2026
7ad1a01
missed application
GernotMaier May 13, 2026
8d6a0d2
simplify
GernotMaier May 13, 2026
176a0b9
sonar
GernotMaier May 13, 2026
b050ae7
simplification
GernotMaier May 13, 2026
e453194
sonar and sphinx, my best friends
GernotMaier May 13, 2026
5f27531
obsolete test
GernotMaier May 13, 2026
44d6b3b
sonar
GernotMaier May 13, 2026
831c6f7
unit test
GernotMaier May 13, 2026
3f5d84e
Merge branch 'main' into event-level-comparision
GernotMaier May 13, 2026
de39536
copilot
GernotMaier May 13, 2026
d19cb81
Merge branch 'main' into event-level-comparision
GernotMaier May 13, 2026
e2b0342
report comparision statistics [skip ci]
GernotMaier May 18, 2026
3bfdc5f
chi2/n [skip ci]
GernotMaier May 18, 2026
8841720
fixed binning
GernotMaier May 18, 2026
52446c8
Merge pull request #2186 from gammasim/event-level-comparison-statistics
GernotMaier May 18, 2026
dd275df
statistics module
GernotMaier May 18, 2026
ca3582f
unit tests
GernotMaier May 18, 2026
b1971aa
unit tests
GernotMaier May 18, 2026
167c1b2
sonar
GernotMaier May 18, 2026
8f8c29a
sonar
GernotMaier May 18, 2026
765e76f
docs
GernotMaier May 18, 2026
f4d6422
remove chi2s; unit tests
GernotMaier May 19, 2026
0348eeb
unit tests
GernotMaier May 19, 2026
64b82c2
Merge branch 'main' into event-level-comparision
GernotMaier May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/changes/2181.feature.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add an event-level production comparison application with multi-production trigger-distribution plots.
1 change: 1 addition & 0 deletions docs/source/api-reference/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ reporting
runners
sim_events
sim_telarray
statistics
simulators
testing
trigger
Expand Down
9 changes: 9 additions & 0 deletions docs/source/api-reference/sim_events.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,12 @@ Provide tools for reading, writing, and processing simulated shower and telescop
.. automodule:: simtools.sim_events.output_validator
:members:
```

## Production comparison

(sim_events_production_comparison-1)=

```{eval-rst}
.. automodule:: simtools.sim_events.production_comparison
:members:
```
14 changes: 14 additions & 0 deletions docs/source/api-reference/statistics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
(statistics)=

# Statistics

Statistical helper functions for comparing distributions and aligned histograms.

## statistics

(statisticsmodule)=

```{eval-rst}
.. automodule:: simtools.statistics
:members:
```
7 changes: 7 additions & 0 deletions docs/source/api-reference/visualization.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,10 @@ the visualization module.
.. automodule:: visualization.camera_plot_utils
:members:
```

## plot_event_level_production_comparison

```{eval-rst}
.. automodule:: visualization.plot_event_level_production_comparison
:members:
```
1 change: 1 addition & 0 deletions docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ def get_python_version_from_pyproject():
nitpick_ignore = [
("py:class", "astropy.table.table.Table"),
("py:class", "astropy.units.quantity.Quantity"),
("py:class", "collections.Counter"),
("py:class", "logging.Logger"),
("py:class", "numpy.float64"),
("py:class", "numpy.ndarray"),
Expand Down
1 change: 1 addition & 0 deletions docs/source/user-guide/applications.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ Parameters with the same functionality are named consistently the same among all
:glob: true
:maxdepth: 1

simtools-compare-productions <applications/simtools-compare-productions>
simtools-convert-all-model-parameters-from-simtel <applications/simtools-convert-all-model-parameters-from-simtel>
simtools-convert-geo-coordinates-of-array-elements <applications/simtools-convert-geo-coordinates-of-array-elements>
simtools-convert-model-parameter-from-simtel <applications/simtools-convert-model-parameter-from-simtel>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

simtools-compare-productions
============================

.. automodule:: compare_productions
:members:
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ optional-dependencies.tests = [
urls."bug tracker" = "https://github.com/gammasim/simtools/issues"
urls.documentation = "https://gammasim.github.io/simtools/"
urls.repository = "https://github.com/gammasim/simtools"
scripts.simtools-compare-productions = "simtools.applications.compare_productions:main"
scripts.simtools-convert-all-model-parameters-from-simtel = "simtools.applications.convert_all_model_parameters_from_simtel:main"
scripts.simtools-convert-geo-coordinates-of-array-elements = "simtools.applications.convert_geo_coordinates_of_array_elements:main"
scripts.simtools-convert-model-parameter-from-simtel = "simtools.applications.convert_model_parameter_from_simtel:main"
Expand Down
75 changes: 75 additions & 0 deletions src/simtools/applications/compare_productions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#!/usr/bin/python3

r"""Compare simulation productions at different comparison levels.

The application accepts repeated production descriptors and dispatches to
comparison-level specific implementations.

Command line arguments
----------------------
production (repeated, required)
Production descriptor in two fields:
1) label
2) comma-separated event data file patterns
comparison_level (str, optional)
Comparison level selector. Supported values are:
- events
- signals
- compute
output_path (str, required)
Output directory for generated comparison plots.
"""

from simtools.application_control import build_application
from simtools.sim_events.production_comparison import (
collect_production_metrics,
parse_production_arguments,
)
from simtools.visualization import plot_event_level_production_comparison


def _add_arguments(parser):
"""Register application-specific command line arguments."""
parser.initialize_application_arguments(["output_path"])
parser.add_argument(
"--production",
action="append",
nargs="+",
metavar=("LABEL", "EVENT_DATA_FILES"),
required=True,
help=(
"Production descriptor. "
"Use as: --production <label> <comma-separated file patterns>. "
"Repeat this argument as needed for multiple productions."
),
)
parser.add_argument(
"--comparison_level",
choices=["events", "signals", "compute"],
default="events",
help="Comparison level to execute.",
)


def main():
"""See CLI description."""
app_context = build_application(
initialization_kwargs={"db_config": False, "output": True},
)

output_directory = app_context.io_handler.get_output_directory()
production_descriptors = parse_production_arguments(app_context.args["production"])

comparison_level = app_context.args["comparison_level"]
if comparison_level == "events":
metrics_per_production = collect_production_metrics(production_descriptors)
plot_event_level_production_comparison.plot(
metrics_per_production,
output_path=output_directory,
)
else:
raise NotImplementedError(f"Comparison level '{comparison_level}' is not implemented yet.")


if __name__ == "__main__":
main()
Loading
Loading