triggerflow 0.3.0__tar.gz → 0.3.2__tar.gz

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 (118) hide show
  1. {triggerflow-0.3.0/src/triggerflow.egg-info → triggerflow-0.3.2}/PKG-INFO +1 -1
  2. {triggerflow-0.3.0 → triggerflow-0.3.2}/pyproject.toml +1 -1
  3. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/trigger_loader/loader.py +14 -19
  4. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/trigger_loader/processor.py +5 -4
  5. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/core.py +0 -1
  6. {triggerflow-0.3.0/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local → triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base}/catalog.yml +6 -6
  7. {triggerflow-0.3.0/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base → triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local}/catalog.yml +8 -2
  8. triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/condor_config.json +11 -0
  9. triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/cuda_config.json +4 -0
  10. triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples.json +28 -0
  11. triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/settings.json +8 -0
  12. triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/test.root +0 -0
  13. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/environment.yml +2 -0
  14. triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/base_loader.py +101 -0
  15. triggerflow-0.3.2/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/{{ cookiecutter.python_package }}_loader.py +32 -0
  16. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/pipeline.py +1 -1
  17. {triggerflow-0.3.0 → triggerflow-0.3.2/src/triggerflow.egg-info}/PKG-INFO +1 -1
  18. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow.egg-info/SOURCES.txt +8 -1
  19. triggerflow-0.3.2/tests/test_starter.py +31 -0
  20. triggerflow-0.3.0/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples.json +0 -15
  21. {triggerflow-0.3.0 → triggerflow-0.3.2}/MANIFEST.in +0 -0
  22. {triggerflow-0.3.0 → triggerflow-0.3.2}/README.md +0 -0
  23. {triggerflow-0.3.0 → triggerflow-0.3.2}/setup.cfg +0 -0
  24. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/trigger_dataset/__init__.py +0 -0
  25. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/trigger_dataset/core.py +0 -0
  26. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/trigger_loader/__init__.py +0 -0
  27. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/trigger_loader/cluster_manager.py +0 -0
  28. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/__init__.py +0 -0
  29. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/cli.py +0 -0
  30. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/interfaces/__init__.py +0 -0
  31. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/interfaces/uGT.py +0 -0
  32. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/mlflow_wrapper.py +0 -0
  33. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/.gitignore +0 -0
  34. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/README.md +0 -0
  35. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/cookiecutter.json +0 -0
  36. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/prompts.yml +0 -0
  37. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.dvcignore +0 -0
  38. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.gitignore +0 -0
  39. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.gitlab-ci.yml +0 -0
  40. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/README.md +0 -0
  41. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/README.md +0 -0
  42. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters.yml +0 -0
  43. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_compile.yml +0 -0
  44. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_data_processing.yml +0 -0
  45. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_load_data.yml +0 -0
  46. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_model_training.yml +0 -0
  47. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_model_validation.yml +0 -0
  48. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters.yml +0 -0
  49. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_compile.yml +0 -0
  50. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_data_processing.yml +0 -0
  51. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_load_data.yml +0 -0
  52. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_model_training.yml +0 -0
  53. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_model_validation.yml +0 -0
  54. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/logging.yml +0 -0
  55. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/.gitkeep +0 -0
  56. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples_dummy.json +0 -0
  57. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/02_loaded/.gitkeep +0 -0
  58. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/03_preprocessed/.gitkeep +0 -0
  59. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/04_models/.gitkeep +0 -0
  60. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/05_validation/.gitkeep +0 -0
  61. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/06_compile/.gitkeep +0 -0
  62. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/07_reporting/.gitkeep +0 -0
  63. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/dvc.yaml +0 -0
  64. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/pyproject.toml +0 -0
  65. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/__init__.py +0 -0
  66. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/__main__.py +0 -0
  67. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/any_object.py +0 -0
  68. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/base_dataset.py +0 -0
  69. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/meta_dataset.py +0 -0
  70. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/{{ cookiecutter.python_package }}_dataset.py +0 -0
  71. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/__init__.py +0 -0
  72. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/base_model.py +0 -0
  73. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/{{ cookiecutter.python_package }}_model.py +0 -0
  74. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipeline_registry.py +0 -0
  75. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/__init__.py +0 -0
  76. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/nodes.py +0 -0
  77. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/pipeline.py +0 -0
  78. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/__init__.py +0 -0
  79. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/nodes.py +0 -0
  80. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/pipeline.py +0 -0
  81. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/__init__.py +0 -0
  82. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/nodes.py +0 -0
  83. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/__init__.py +0 -0
  84. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/nodes.py +0 -0
  85. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/pipeline.py +0 -0
  86. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/__init__.py +0 -0
  87. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/nodes.py +0 -0
  88. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/pipeline.py +0 -0
  89. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/settings.py +0 -0
  90. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/__init__.py +0 -0
  91. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/metric.py +0 -0
  92. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/plotting.py +0 -0
  93. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/__init__.py +0 -0
  94. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/__init__.py +0 -0
  95. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/compile/__init__.py +0 -0
  96. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/compile/test_pipeline.py +0 -0
  97. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/data_processing/__init__.py +0 -0
  98. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/data_processing/test_pipeline.py +0 -0
  99. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/load_data/__init__.py +0 -0
  100. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/load_data/test_pipeline.py +0 -0
  101. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_training/__init__.py +0 -0
  102. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_training/test_pipeline.py +0 -0
  103. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_validation/__init__.py +0 -0
  104. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_validation/test_pipeline.py +0 -0
  105. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/test_run.py +0 -0
  106. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/templates/build_ugt.tcl +0 -0
  107. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/templates/data_types.h +0 -0
  108. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/templates/makefile +0 -0
  109. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/templates/makefile_version +0 -0
  110. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/templates/model-gt.cpp +0 -0
  111. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/templates/model_template.cpp +0 -0
  112. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow/templates/scales.h +0 -0
  113. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow.egg-info/dependency_links.txt +0 -0
  114. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow.egg-info/entry_points.txt +0 -0
  115. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow.egg-info/requires.txt +0 -0
  116. {triggerflow-0.3.0 → triggerflow-0.3.2}/src/triggerflow.egg-info/top_level.txt +0 -0
  117. {triggerflow-0.3.0 → triggerflow-0.3.2}/tests/test.py +0 -0
  118. {triggerflow-0.3.0 → triggerflow-0.3.2}/tests/test_loader.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: triggerflow
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Utilities for ML models targeting hardware triggers
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "triggerflow"
7
- version = "0.3.0"
7
+ version = "0.3.2"
8
8
  description = "Utilities for ML models targeting hardware triggers"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -12,8 +12,6 @@ from coffea.nanoevents import NanoAODSchema
12
12
  from .cluster_manager import ClusterManager
13
13
  from .processor import TriggerProcessor
14
14
 
15
- logger = logging.getLogger(__name__)
16
-
17
15
 
18
16
  class TriggerLoader:
19
17
  def __init__(self,
@@ -21,8 +19,9 @@ class TriggerLoader:
21
19
  transform: callable,
22
20
  output_path: str,
23
21
  ):
22
+ self.logger = logging.getLogger(__name__)
24
23
  self.transform = transform
25
- self.fileset = self._load_sample_json(sample_json)
24
+ self.fileset, self.meta_data = self._load_sample_json(sample_json)
26
25
  self.output_path = output_path
27
26
  self.run_uuid = str(uuid.uuid4())
28
27
 
@@ -62,41 +61,38 @@ class TriggerLoader:
62
61
  full_data = json.load(f)
63
62
  dataset_metadata = full_data.get("samples", full_data)
64
63
 
65
- fileset = {}
64
+ fileset, meta_data = {}, {}
66
65
  for ds_name, ds_info in dataset_metadata.items():
67
66
  files = []
68
-
69
67
  if "files" in ds_info:
70
68
  file_info = ds_info["files"]
71
-
72
69
  if isinstance(file_info, list):
73
70
  files = file_info
74
-
75
71
  elif isinstance(file_info, str):
76
72
  if os.path.isdir(file_info):
77
73
  path_glob = os.path.join(file_info, "*.root")
78
74
  files = glob.glob(path_glob)
79
- logger.info(f"Resolved {len(files)} files from directory {file_info}.")
75
+ self.logger.info(f"Resolved {len(files)} files from directory {file_info}.")
80
76
  else:
81
77
  files = [file_info]
82
-
83
78
  if files:
84
- logger.info(f"Using {len(files)} local/explicit files for {ds_name}.")
85
-
79
+ self.logger.info(f"Using {len(files)} local/explicit files for {ds_name}.")
80
+
86
81
  if not files and "DAS" in ds_info:
87
82
  try:
88
83
  files = _fetch_files_from_das(ds_info["DAS"])
89
- logger.info(f"Resolved {len(files)} files via DAS for {ds_name}.")
84
+ self.logger.info(f"Resolved {len(files)} files via DAS for {ds_name}.")
90
85
  except NameError:
91
- logger.error("DAS fetching skipped: _fetch_files_from_das is not defined.")
86
+ self.logger.info("DAS fetching skipped: _fetch_files_from_das is not defined.")
92
87
 
93
88
  if not files:
94
- logger.warning(f"No files found for dataset: {ds_name}. Skipping.")
89
+ self.logger.warning(f"No files found for dataset: {ds_name}. Skipping.")
95
90
  continue
96
91
 
97
92
  fileset[ds_name] = files
93
+ meta_data[ds_name] = {"files": files, "is_signal": ds_info["is_signal"]}
98
94
 
99
- return fileset
95
+ return fileset, meta_data
100
96
 
101
97
  def _write_run_metadata_file(self, path: str, duration_s: float | None = None):
102
98
  meta_path = f"{path}/run_metadata.json"
@@ -108,11 +104,10 @@ class TriggerLoader:
108
104
  json.dump(data, f, indent=2)
109
105
 
110
106
  def _run(self, runner: processor.Runner, label: str):
111
- logger.log(logging.INFO, f"Starting processing ({label})...")
107
+ self.logger.info(f"Starting processing ({label})...")
112
108
  start = time.time()
113
109
  proc = self._build_processor()
114
- print(self.fileset)
115
-
110
+
116
111
  acc = runner(
117
112
  self.fileset,
118
113
  treename="Events",
@@ -120,7 +115,7 @@ class TriggerLoader:
120
115
  )
121
116
  elapsed = time.time() - start
122
117
  self._write_run_metadata_file(self.output_path, elapsed)
123
- logger.log(logging.INFO, f"Finished in {elapsed:.2f}s (run_uuid={self.run_uuid})")
118
+ self.logger.info(f"Finished in {elapsed:.2f}s (run_uuid={self.run_uuid})")
124
119
  return acc
125
120
 
126
121
  def run_distributed(self, cluster_type: str, cluster_config: dict,
@@ -32,7 +32,7 @@ class TriggerProcessor(processor.ProcessorABC):
32
32
  filename_template: str = "{dataset}_{fileuuid}_{start}-{stop}.parquet",
33
33
  add_uuid: bool = False,
34
34
  write_manifest: bool = True,
35
- manifest_name: str = "manifest.jsonl",
35
+ manifest_name: str = "manifest.json",
36
36
  run_uuid: str | None = None,
37
37
  run_metadata: dict | None = None,
38
38
  preserve_event_metadata: bool = True,
@@ -64,6 +64,7 @@ class TriggerProcessor(processor.ProcessorABC):
64
64
  self.run_uuid = run_uuid or str(uuid.uuid4())
65
65
  self.run_metadata = run_metadata or {}
66
66
  self.preserve_event_metadata = preserve_event_metadata
67
+ self.output_file = ""
67
68
 
68
69
  # Initialize output directory and paths
69
70
  os.makedirs(self.output_path, exist_ok=True)
@@ -90,7 +91,7 @@ class TriggerProcessor(processor.ProcessorABC):
90
91
 
91
92
  # Extract event metadata
92
93
  event_meta = self._extract_event_metadata(events)
93
- output_file = self._generate_output_filename(event_meta)
94
+ self.output_file = self._generate_output_filename(event_meta)
94
95
 
95
96
  # Convert to Arrow table
96
97
  table = ak.to_arrow_table(data)
@@ -100,11 +101,11 @@ class TriggerProcessor(processor.ProcessorABC):
100
101
  table = self._embed_metadata_in_schema(table, file_meta, events.metadata)
101
102
 
102
103
  # Write Parquet file
103
- self._write_parquet(table, output_file)
104
+ self._write_parquet(table, self.output_file)
104
105
 
105
106
  # Write manifest entry
106
107
  if self.write_manifest:
107
- self._write_manifest_entry(output_file, file_meta)
108
+ self._write_manifest_entry(self.output_file, file_meta)
108
109
 
109
110
  return {}
110
111
 
@@ -105,7 +105,6 @@ class HLS4MLStrategy(CompilerStrategy):
105
105
  )
106
106
 
107
107
  firmware_model.compile()
108
- firmware_model.save(workspace / "firmware_model.fml")
109
108
  return firmware_model
110
109
 
111
110
 
@@ -1,18 +1,18 @@
1
1
  {{ cookiecutter.python_package }}_meta_data:
2
- filepath: data/01_raw/samples_dummy.json
2
+ filepath: data/01_raw/samples.json
3
3
  sample_key: samples
4
4
  type: {{ cookiecutter.python_package }}.datasets.meta_dataset.MetaDataset
5
5
 
6
- {{ cookiecutter.python_package }}_data:
7
- sample_info: data/01_raw/samples_dummy.json
8
- sample_key: samples
9
- type: {{ cookiecutter.python_package }}.datasets.{{ cookiecutter.python_package }}_dataset.{{ cookiecutter.project_name }}Dataset
10
-
11
6
  {{ cookiecutter.python_package }}_meta_data_loaded:
12
7
  filepath: data/02_loaded/{{ cookiecutter.python_package }}_meta_data.json
13
8
  sample_key: samples
14
9
  type: {{ cookiecutter.python_package }}.datasets.meta_dataset.MetaDataset
15
10
 
11
+ {{ cookiecutter.python_package }}_data:
12
+ sample_info: data/01_raw/samples.json
13
+ sample_key: samples
14
+ type: {{ cookiecutter.python_package }}.datasets.{{ cookiecutter.python_package }}_dataset.{{ cookiecutter.project_name }}Dataset
15
+
16
16
  {{ cookiecutter.python_package }}_data_loaded:
17
17
  filepath: data/02_loaded/{{ cookiecutter.python_package }}_data.csv
18
18
  save_args:
@@ -1,10 +1,10 @@
1
1
  {{ cookiecutter.python_package }}_meta_data:
2
- filepath: data/01_raw/samples_dummy.json
2
+ filepath: data/01_raw/samples.json
3
3
  sample_key: samples
4
4
  type: {{ cookiecutter.python_package }}.datasets.meta_dataset.MetaDataset
5
5
 
6
6
  {{ cookiecutter.python_package }}_data:
7
- sample_info: data/01_raw/samples_dummy.json
7
+ sample_info: data/01_raw/samples.json
8
8
  sample_key: samples
9
9
  type: {{ cookiecutter.python_package }}.datasets.{{ cookiecutter.python_package }}_dataset.{{ cookiecutter.project_name }}Dataset
10
10
 
@@ -13,6 +13,12 @@
13
13
  sample_key: samples
14
14
  type: {{ cookiecutter.python_package }}.datasets.meta_dataset.MetaDataset
15
15
 
16
+ {{ cookiecutter.python_package }}_loader:
17
+ sample_json: data/01_raw/samples.json
18
+ settings: data/01_raw/settings.json
19
+ config: data/01_raw/condor_config.json
20
+ type: {{ cookiecutter.python_package }}.datasets.{{ cookiecutter.python_package }}_loader.{{ cookiecutter.project_name }}Loader
21
+
16
22
  {{ cookiecutter.python_package }}_data_loaded:
17
23
  filepath: data/02_loaded/{{ cookiecutter.python_package }}_data.csv
18
24
  save_args:
@@ -0,0 +1,11 @@
1
+ {
2
+ "log_directory": "./condor_logs",
3
+ "cores": 2,
4
+ "memory": "2GB",
5
+ "disk": "2GB",
6
+ "job_extra_directives": {
7
+ "+JobFlavour": "longlunch",
8
+ "getenv": true
9
+ },
10
+ "death_timeout": "60"
11
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "n_workers": 2,
3
+ "device_memory_limit": "16GB"
4
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "samples" : {
3
+ "signal" : {
4
+ "all_file_path":"data/01_raw/test.root",
5
+ "files":"data/01_raw/test.root",
6
+ "path":"data/01_raw/test.root",
7
+ "file_pattern":["test.root"],
8
+ "DAS" : "Blabla",
9
+ "type" : "123",
10
+ "data" : false,
11
+ "era" : "phase1",
12
+ "run" : "run3",
13
+ "is_signal": true
14
+ },
15
+ "background" : {
16
+ "all_file_path":"data/01_raw/test.root",
17
+ "files":"data/01_raw/test.root",
18
+ "path":"data/01_raw/test.root",
19
+ "file_pattern":["test.root"],
20
+ "DAS" : "Blabla",
21
+ "type" : "123",
22
+ "data" : false,
23
+ "era" : "phase1",
24
+ "run" : "run3",
25
+ "is_signal": false
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "output_dir": "./data/02_loaded/",
3
+ "run_local": true,
4
+ "num_workers": 4,
5
+ "chunksize": 50000,
6
+ "cluster_type": "local",
7
+ "jobs": 4
8
+ }
@@ -19,3 +19,5 @@ dependencies:
19
19
  - uproot
20
20
  - awkward
21
21
  - triggerflow
22
+ - coffea
23
+ - dask[distributed]
@@ -0,0 +1,101 @@
1
+ import logging, json
2
+ from abc import abstractmethod
3
+ from kedro.io import AbstractDataset
4
+ from trigger_loader.loader import TriggerLoader
5
+ import pandas as pd
6
+ import numpy as np
7
+ from pathlib import Path
8
+
9
+
10
+ class BaseLoader(AbstractDataset):
11
+ """
12
+ Abstract Base Class for using the TriggerLoader.
13
+
14
+ Users must inherit from this class and implement the abstract methods.
15
+ The core processing logic in `_load` is fixed and cannot be overridden.
16
+ """
17
+
18
+ def __init__(self, sample_json: str, settings: str, config: str):
19
+ self.sample_json = sample_json
20
+ with open(settings, "r") as f:
21
+ self.settings = json.load(f)
22
+ with open(config, "r") as f:
23
+ self.config = json.load(f)
24
+
25
+ # get logger for reporting
26
+ self.logger = logging.getLogger(__name__)
27
+ self.logger.info(f"Initializing loader: {self.__class__.__name__}")
28
+
29
+ @abstractmethod
30
+ def transform(self, events):
31
+ """
32
+ USER MUST IMPLEMENT.
33
+ """
34
+ pass
35
+
36
+ def _load(self) -> pd.DataFrame:
37
+ """
38
+ CORE LOGIC (NOT OVERRIDABLE): Loads and processes a single ROOT file.
39
+ """
40
+
41
+ self.logger.info(f"Start Loading...")
42
+ loader = TriggerLoader(
43
+ sample_json=self.sample_json,
44
+ transform=self.transform,
45
+ output_path=self.settings["output_dir"]
46
+ )
47
+
48
+ if self.settings["run_local"]:
49
+ loader.run_local(
50
+ num_workers=self.settings["num_workers"],
51
+ chunksize=self.settings["chunksize"]
52
+ )
53
+ else:
54
+ loader.run_distributed(
55
+ cluster_type=self.settings["cluster_type"],
56
+ cluster_config=self.config,
57
+ chunksize=self.settings["chunksize"],
58
+ jobs=self.settings["jobs"]
59
+ )
60
+
61
+ # load last parquet file from manifest file for each dataset key
62
+ # from the meta_data
63
+ dataset_keys = set(loader.meta_data.keys())
64
+ manifest_path = Path(self.settings["output_dir"]) / "manifest.json"
65
+
66
+ last_records = {key: None for key in dataset_keys}
67
+
68
+ with manifest_path.open() as f:
69
+ for line in f:
70
+ record = json.loads(line)
71
+ dataset = record.get("dataset")
72
+
73
+ if dataset in last_records:
74
+ last_records[dataset] = record
75
+
76
+ # sanity check
77
+ missing = [k for k, v in last_records.items() if v is None]
78
+ if missing:
79
+ raise ValueError(f"No manifest entry found for datasets: {missing}")
80
+
81
+ final_dfs = []
82
+ for dataset_key, record in last_records.items():
83
+ file_path = record["parquet_file"]
84
+ df = pd.read_parquet(file_path)
85
+
86
+ if loader.meta_data[dataset_key]["is_signal"]:
87
+ df["is_signal"] = np.ones(len(df), dtype=int)
88
+ df["y"] = np.ones(len(df), dtype=int)
89
+ else:
90
+ df["is_signal"] = np.zeros(len(df), dtype=int)
91
+ df["y"] = np.zeros(len(df), dtype=int)
92
+
93
+ final_dfs.append(df)
94
+
95
+ return pd.concat(final_dfs, ignore_index=True)
96
+
97
+ def _save(self, data: pd.DataFrame) -> pd.DataFrame:
98
+ return data
99
+
100
+ def _describe(self) -> dict:
101
+ return {"sample_json": self.sample_json, "settings": self.settings, "config": self.config}
@@ -0,0 +1,32 @@
1
+ import pandas as pd
2
+ import awkward as ak
3
+ from .base_loader import BaseLoader
4
+
5
+
6
+ class {{ cookiecutter.python_package }}Loader(BaseLoader):
7
+ """
8
+ A custom loader example.
9
+ """
10
+
11
+ def transform(self, events):
12
+
13
+ jets = events.Jet
14
+ pt = ak.fill_none(ak.pad_none(jets.pt , 2, axis=1, clip=True), -9999.9)
15
+ eta = ak.fill_none(ak.pad_none(jets.eta, 2, axis=1, clip=True), -9999.9)
16
+ phi = ak.fill_none(ak.pad_none(jets.phi, 2, axis=1, clip=True), -9999.9)
17
+
18
+ met = events.MET
19
+
20
+ result = ak.zip({
21
+ "event": events.event,
22
+ "jet_pt_1": pt[:, 0],
23
+ "jet_pt_2": pt[:, 1],
24
+ "jet_eta_1": eta[:, 0],
25
+ "jet_eta_2": eta[:, 1],
26
+ "jet_phi_1": phi[:, 0],
27
+ "jet_phi_2": phi[:, 1],
28
+ "met_pt": met.pt,
29
+ "met_phi": met.phi,
30
+ })
31
+
32
+ return result
@@ -12,7 +12,7 @@ def create_pipeline(**kwargs) -> Pipeline:
12
12
  [
13
13
  node(
14
14
  func=load_data,
15
- inputs=["{{ cookiecutter.python_package }}_data", "{{ cookiecutter.python_package }}_meta_data"],
15
+ inputs=["{{ cookiecutter.python_package }}_loader", "{{ cookiecutter.python_package }}_meta_data"],
16
16
  outputs=["{{ cookiecutter.python_package }}_data_loaded", "{{ cookiecutter.python_package }}_meta_data_loaded"],
17
17
  name="load_data",
18
18
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: triggerflow
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Utilities for ML models targeting hardware triggers
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -47,8 +47,12 @@ src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_load_
47
47
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_model_training.yml
48
48
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_model_validation.yml
49
49
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/.gitkeep
50
+ src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/condor_config.json
51
+ src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/cuda_config.json
50
52
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples.json
51
53
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples_dummy.json
54
+ src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/settings.json
55
+ src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/test.root
52
56
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/02_loaded/.gitkeep
53
57
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/03_preprocessed/.gitkeep
54
58
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/04_models/.gitkeep
@@ -61,8 +65,10 @@ src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_
61
65
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/settings.py
62
66
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/any_object.py
63
67
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/base_dataset.py
68
+ src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/base_loader.py
64
69
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/meta_dataset.py
65
70
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/{{ cookiecutter.python_package }}_dataset.py
71
+ src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/{{ cookiecutter.python_package }}_loader.py
66
72
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/__init__.py
67
73
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/base_model.py
68
74
  src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/{{ cookiecutter.python_package }}_model.py
@@ -105,4 +111,5 @@ src/triggerflow/templates/model-gt.cpp
105
111
  src/triggerflow/templates/model_template.cpp
106
112
  src/triggerflow/templates/scales.h
107
113
  tests/test.py
108
- tests/test_loader.py
114
+ tests/test_loader.py
115
+ tests/test_starter.py
@@ -0,0 +1,31 @@
1
+ # tests/test_starter_demo.py
2
+ import subprocess
3
+ import shutil
4
+ from pathlib import Path
5
+
6
+
7
+ def run(cmd, cwd=None):
8
+ """Run a shell command and stream output live."""
9
+ subprocess.run(
10
+ cmd,
11
+ cwd=cwd,
12
+ shell=True,
13
+ check=True,
14
+ stdout=None, # inherit terminal stdout
15
+ stderr=None, # inherit terminal stderr
16
+ )
17
+
18
+ def test_triggerflow_starter_demo():
19
+ project_dir = Path("test_demo")
20
+
21
+ try:
22
+ # triggerflow new test_demo
23
+ run("triggerflow new test_demo")
24
+
25
+ # kedro run
26
+ run("kedro run", cwd=project_dir)
27
+
28
+ finally:
29
+ # cleanup (always)
30
+ if project_dir.exists():
31
+ shutil.rmtree(project_dir)
@@ -1,15 +0,0 @@
1
- {
2
- "samples" : {
3
- "testSample" : {
4
- "all_file_path":"data/01_raw/test.root",
5
- "path":"data/01_raw/test.root",
6
- "file_pattern":["test.root"],
7
- "DAS" : "Blabla",
8
- "type" : "123",
9
- "data" : false,
10
- "era" : "phase1",
11
- "run" : "run3",
12
- "is_signal": true
13
- }
14
- }
15
- }
File without changes
File without changes
File without changes
File without changes