triggerflow 0.2.9__tar.gz → 0.3.1__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.
- {triggerflow-0.2.9/src/triggerflow.egg-info → triggerflow-0.3.1}/PKG-INFO +1 -1
- {triggerflow-0.2.9 → triggerflow-0.3.1}/pyproject.toml +1 -1
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/trigger_loader/loader.py +14 -19
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/trigger_loader/processor.py +5 -4
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/core.py +6 -5
- {triggerflow-0.2.9/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local → triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base}/catalog.yml +6 -6
- {triggerflow-0.2.9/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base → triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local}/catalog.yml +8 -2
- triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/condor_config.json +11 -0
- triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/cuda_config.json +4 -0
- triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples.json +28 -0
- triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/settings.json +8 -0
- triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/test.root +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/environment.yml +2 -0
- triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/base_loader.py +101 -0
- triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/{{ cookiecutter.python_package }}_loader.py +32 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/pipeline.py +1 -1
- {triggerflow-0.2.9 → triggerflow-0.3.1/src/triggerflow.egg-info}/PKG-INFO +1 -1
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow.egg-info/SOURCES.txt +8 -1
- {triggerflow-0.2.9 → triggerflow-0.3.1}/tests/test.py +1 -0
- triggerflow-0.3.1/tests/test_starter.py +31 -0
- triggerflow-0.2.9/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples.json +0 -15
- {triggerflow-0.2.9 → triggerflow-0.3.1}/MANIFEST.in +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/README.md +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/setup.cfg +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/trigger_dataset/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/trigger_dataset/core.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/trigger_loader/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/trigger_loader/cluster_manager.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/cli.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/interfaces/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/interfaces/uGT.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/mlflow_wrapper.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/.gitignore +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/README.md +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/cookiecutter.json +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/prompts.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.dvcignore +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.gitignore +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.gitlab-ci.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/README.md +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/README.md +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_compile.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_data_processing.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_load_data.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_model_training.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_model_validation.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_compile.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_data_processing.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_load_data.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_model_training.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_model_validation.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/logging.yml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/.gitkeep +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples_dummy.json +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/02_loaded/.gitkeep +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/03_preprocessed/.gitkeep +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/04_models/.gitkeep +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/05_validation/.gitkeep +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/06_compile/.gitkeep +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/07_reporting/.gitkeep +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/dvc.yaml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/pyproject.toml +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/__main__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/any_object.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/base_dataset.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/meta_dataset.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/{{ cookiecutter.python_package }}_dataset.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/base_model.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/{{ cookiecutter.python_package }}_model.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipeline_registry.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/nodes.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/nodes.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/nodes.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/nodes.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/nodes.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/settings.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/metric.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/plotting.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/compile/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/compile/test_pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/data_processing/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/data_processing/test_pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/load_data/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/load_data/test_pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_training/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_training/test_pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_validation/__init__.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_validation/test_pipeline.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/test_run.py +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/templates/build_ugt.tcl +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/templates/data_types.h +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/templates/makefile +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/templates/makefile_version +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/templates/model-gt.cpp +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/templates/model_template.cpp +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow/templates/scales.h +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow.egg-info/dependency_links.txt +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow.egg-info/entry_points.txt +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow.egg-info/requires.txt +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/src/triggerflow.egg-info/top_level.txt +0 -0
- {triggerflow-0.2.9 → triggerflow-0.3.1}/tests/test_loader.py +0 -0
|
@@ -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.
|
|
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.
|
|
107
|
+
self.logger.info(f"Starting processing ({label})...")
|
|
112
108
|
start = time.time()
|
|
113
109
|
proc = self._build_processor()
|
|
114
|
-
|
|
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.
|
|
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.
|
|
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
|
|
|
@@ -232,9 +232,10 @@ class ConverterFactory:
|
|
|
232
232
|
@staticmethod
|
|
233
233
|
def create_converter(ml_backend: str, compiler: str) -> ModelConverter:
|
|
234
234
|
if ml_backend.lower() == "keras" and compiler.lower() == "hls4ml":
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
235
|
+
import keras
|
|
236
|
+
if not keras.__version__.startswith("3"):
|
|
237
|
+
return KerasToQONNXConverter()
|
|
238
|
+
return NoOpConverter()
|
|
238
239
|
|
|
239
240
|
|
|
240
241
|
class CompilerFactory:
|
|
@@ -284,7 +285,7 @@ class WorkspaceManager:
|
|
|
284
285
|
def save_native_model(self, model, ml_backend: str):
|
|
285
286
|
"""Save the native model to workspace"""
|
|
286
287
|
if ml_backend.lower() == "keras":
|
|
287
|
-
model.save(self.workspace / "keras_model")
|
|
288
|
+
model.save(self.workspace / "keras_model.h5")
|
|
288
289
|
elif ml_backend.lower() == "xgboost":
|
|
289
290
|
model.save_model(str(self.workspace / "xgb_model.json"))
|
|
290
291
|
|
|
@@ -609,4 +610,4 @@ class TriggerModel:
|
|
|
609
610
|
obj.converter = ConverterFactory.create_converter(obj.ml_backend, obj.compiler)
|
|
610
611
|
obj.dataset_object = None
|
|
611
612
|
|
|
612
|
-
return obj
|
|
613
|
+
return obj
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{{ cookiecutter.python_package }}_meta_data:
|
|
2
|
-
filepath: data/01_raw/
|
|
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/
|
|
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/
|
|
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:
|
triggerflow-0.3.1/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples.json
ADDED
|
@@ -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
|
+
}
|
|
Binary file
|
|
@@ -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 }}
|
|
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
|
)
|
|
@@ -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)
|
triggerflow-0.2.9/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples.json
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|