From 60cff4e1244e7317117a3459a3a82f3f6a7f5ffd Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 00:07:44 +0200 Subject: [PATCH 01/30] Initialized register_data. --- src/dynsight/_internal/logs.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 6bf9afe6..4742e5c1 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -2,7 +2,7 @@ from datetime import datetime, timezone from pathlib import Path - +from dynsight.trajectory import Insight class Logger: """Creates and save human-readible log.""" @@ -24,6 +24,8 @@ def clear(self) -> None: def get(self) -> str: return "\n".join(self._log) - + + def register_data(self, insight: Insight) -> None: + self.log(f"Registered data: {insight}") logger = Logger() From b9fe8725eea176faffbc29b28cca6dad82892a27 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 00:20:23 +0200 Subject: [PATCH 02/30] Added extraction. --- src/dynsight/_internal/logs.py | 45 +++++++++++++++++++- src/dynsight/_internal/trajectory/insight.py | 3 ++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 4742e5c1..8ed431d6 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -1,14 +1,19 @@ """logging package.""" +from __future__ import annotations + from datetime import datetime, timezone from pathlib import Path -from dynsight.trajectory import Insight +import numpy as np + +from dynsight.trajectory import Insight class Logger: """Creates and save human-readible log.""" def __init__(self) -> None: self._log: list[str] = [] + self._registered_data: list[Insight] = [] def log(self, msg: str) -> None: timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") @@ -21,11 +26,49 @@ def save(self, filename: Path) -> None: def clear(self) -> None: self._log = [] + self._registered_data = [] def get(self) -> str: return "\n".join(self._log) def register_data(self, insight: Insight) -> None: + self._registered_data.append(insight) self.log(f"Registered data: {insight}") + + def extract_datasets( + self, + output_dir: Path | str = Path("output"), + ) -> list[Path]: + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + + saved_paths: list[Path] = [] + for index, insight in enumerate(self._registered_data, start=1): + base_name = insight.meta.get("name") if isinstance(insight.meta, dict) else None + if isinstance(base_name, str) and base_name: + sanitized = "".join( + ch if ch.isalnum() or ch in {"-", "_"} else "_" + for ch in base_name + ).strip("_") + base_filename = sanitized or f"dataset_{index}" + else: + base_filename = f"dataset_{index}" + + filename = output_path / f"{base_filename}.npy" + + counter = 1 + candidate = filename + while candidate.exists(): + candidate = output_path / f"{base_filename}_{counter}.npy" + counter += 1 + filename = candidate + + np.save(filename, insight.dataset) + saved_paths.append(filename) + self.log(f"Dataset saved to {filename}.") + + self._registered_data = [] + + return saved_paths logger = Logger() diff --git a/src/dynsight/_internal/trajectory/insight.py b/src/dynsight/_internal/trajectory/insight.py index 577a7cce..9a75e768 100644 --- a/src/dynsight/_internal/trajectory/insight.py +++ b/src/dynsight/_internal/trajectory/insight.py @@ -32,6 +32,9 @@ class Insight: dataset: NDArray[np.float64] meta: dict[str, Any] = field(default_factory=dict) + def __post_init__(self) -> None: + logger.register_data(self) + def dump_to_json(self, file_path: Path) -> None: """Save the Insight to a JSON file and .npy file.""" # Save dataset as .npy From 41654bf8664ce2a40064b6b2db5e9d0373cef75c Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 00:25:40 +0200 Subject: [PATCH 03/30] Fixed circular input. --- src/dynsight/_internal/logs.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 8ed431d6..3702c408 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -5,15 +5,19 @@ from datetime import datetime, timezone from pathlib import Path +from typing import TYPE_CHECKING + import numpy as np -from dynsight.trajectory import Insight +if TYPE_CHECKING: + from dynsight.trajectory import Insight + class Logger: """Creates and save human-readible log.""" def __init__(self) -> None: self._log: list[str] = [] - self._registered_data: list[Insight] = [] + self._registered_data: list["Insight"] = [] def log(self, msg: str) -> None: timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") @@ -31,7 +35,7 @@ def clear(self) -> None: def get(self) -> str: return "\n".join(self._log) - def register_data(self, insight: Insight) -> None: + def register_data(self, insight: "Insight") -> None: self._registered_data.append(insight) self.log(f"Registered data: {insight}") From 5dbec45491efae98cb000032658680267a2a1208 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 00:43:54 +0200 Subject: [PATCH 04/30] Updated meta and dataset names. --- src/dynsight/_internal/logs.py | 24 ++++++++++++------- src/dynsight/_internal/trajectory/insight.py | 4 ++++ .../_internal/trajectory/trajectory.py | 10 ++++---- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 3702c408..7e05faa3 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -48,15 +48,21 @@ def extract_datasets( saved_paths: list[Path] = [] for index, insight in enumerate(self._registered_data, start=1): - base_name = insight.meta.get("name") if isinstance(insight.meta, dict) else None - if isinstance(base_name, str) and base_name: - sanitized = "".join( - ch if ch.isalnum() or ch in {"-", "_"} else "_" - for ch in base_name - ).strip("_") - base_filename = sanitized or f"dataset_{index}" - else: - base_filename = f"dataset_{index}" + base_filename = f"dataset_{index}" + if isinstance(insight.meta, dict) and insight.meta: + sanitized_values = [] + + for value in insight.meta.values(): + value_str = str(value) + sanitized = "".join( + ch if ch.isalnum() or ch in {"-", "_"} else "_" + for ch in value_str + ).strip("_") + if sanitized: + sanitized_values.append(sanitized) + + if sanitized_values: + base_filename = "_".join(sanitized_values) filename = output_path / f"{base_filename}.npy" diff --git a/src/dynsight/_internal/trajectory/insight.py b/src/dynsight/_internal/trajectory/insight.py index 9a75e768..5699cf3f 100644 --- a/src/dynsight/_internal/trajectory/insight.py +++ b/src/dynsight/_internal/trajectory/insight.py @@ -145,6 +145,10 @@ def get_angular_velocity(self, delay: int = 1) -> Insight: theta = dynsight.soap.timesoap(self.dataset, delay=delay) attr_dict = self.meta.copy() attr_dict.update({"delay": delay}) + if self.meta.get("name") == "soap": + attr_dict.update({"name": "timesoap"}) + else: + attr_dict.update({"name": "angular_velocity"}) logger.log(f"Computed angular velocity with args {attr_dict}.") return Insight(dataset=theta, meta=attr_dict) diff --git a/src/dynsight/_internal/trajectory/trajectory.py b/src/dynsight/_internal/trajectory/trajectory.py index d45d3e29..e020963d 100644 --- a/src/dynsight/_internal/trajectory/trajectory.py +++ b/src/dynsight/_internal/trajectory/trajectory.py @@ -156,7 +156,7 @@ def get_coord_number( delay=delay, ) - attr_dict = {"r_cut": r_cut, "delay": delay, "selection": selection} + attr_dict = {"name":"coord_number", "r_cut": r_cut, "delay": delay, "selection": selection} logger.log(f"Computed coord_number using args {attr_dict}.") return neigcounts, Insight( dataset=nn.astype(np.float64), @@ -193,7 +193,7 @@ def get_lens( delay=delay, ) - attr_dict = {"r_cut": r_cut, "delay": delay, "selection": selection} + attr_dict = {"name":"lens", "r_cut": r_cut, "delay": delay, "selection": selection} logger.log(f"Computed LENS using args {attr_dict}.") return neigcounts, Insight( @@ -228,6 +228,7 @@ def get_soap( trajslice=self.trajslice, ) attr_dict = { + "name":"soap", "r_cut": r_cut, "n_max": n_max, "l_max": l_max, @@ -267,7 +268,7 @@ def get_orientational_op( order=order, ) - attr_dict = {"r_cut": r_cut, "order": order, "selection": selection} + attr_dict = {"name":"orientational_op", "r_cut": r_cut, "order": order, "selection": selection} logger.log( f"Computed orientational order parameter using args {attr_dict}." @@ -305,7 +306,7 @@ def get_velocity_alignment( neigh_list_per_frame=neigcounts, ) - attr_dict = {"r_cut": r_cut, "selection": selection} + attr_dict = {"name":"velocity_alignement", "r_cut": r_cut, "selection": selection} logger.log( f"Computed average velocity alignment using args {attr_dict}." @@ -348,6 +349,7 @@ def get_rdf( step=trajslice.step, ) attr_dict = { + "name":"rdf", "distances_range": distances_range, "s1": s1, "s2": s2, From 0c801c77c25c79c93bef0c0fc0dec4974c62c892 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 10:44:47 +0200 Subject: [PATCH 05/30] added get_timesoap(). --- src/dynsight/_internal/logs.py | 11 +-- src/dynsight/_internal/trajectory/insight.py | 5 +- .../_internal/trajectory/trajectory.py | 77 +++++++++++++++++-- 3 files changed, 78 insertions(+), 15 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 7e05faa3..541e74e1 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -4,7 +4,6 @@ from datetime import datetime, timezone from pathlib import Path - from typing import TYPE_CHECKING import numpy as np @@ -12,12 +11,13 @@ if TYPE_CHECKING: from dynsight.trajectory import Insight + class Logger: """Creates and save human-readible log.""" def __init__(self) -> None: self._log: list[str] = [] - self._registered_data: list["Insight"] = [] + self._registered_data: list[Insight] = [] def log(self, msg: str) -> None: timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") @@ -34,11 +34,11 @@ def clear(self) -> None: def get(self) -> str: return "\n".join(self._log) - - def register_data(self, insight: "Insight") -> None: + + def register_data(self, insight: Insight) -> None: self._registered_data.append(insight) self.log(f"Registered data: {insight}") - + def extract_datasets( self, output_dir: Path | str = Path("output"), @@ -81,4 +81,5 @@ def extract_datasets( return saved_paths + logger = Logger() diff --git a/src/dynsight/_internal/trajectory/insight.py b/src/dynsight/_internal/trajectory/insight.py index 5699cf3f..520e5c14 100644 --- a/src/dynsight/_internal/trajectory/insight.py +++ b/src/dynsight/_internal/trajectory/insight.py @@ -145,10 +145,7 @@ def get_angular_velocity(self, delay: int = 1) -> Insight: theta = dynsight.soap.timesoap(self.dataset, delay=delay) attr_dict = self.meta.copy() attr_dict.update({"delay": delay}) - if self.meta.get("name") == "soap": - attr_dict.update({"name": "timesoap"}) - else: - attr_dict.update({"name": "angular_velocity"}) + attr_dict.update({"name": "angular_velocity"}) logger.log(f"Computed angular velocity with args {attr_dict}.") return Insight(dataset=theta, meta=attr_dict) diff --git a/src/dynsight/_internal/trajectory/trajectory.py b/src/dynsight/_internal/trajectory/trajectory.py index e020963d..e34a7fa0 100644 --- a/src/dynsight/_internal/trajectory/trajectory.py +++ b/src/dynsight/_internal/trajectory/trajectory.py @@ -156,7 +156,12 @@ def get_coord_number( delay=delay, ) - attr_dict = {"name":"coord_number", "r_cut": r_cut, "delay": delay, "selection": selection} + attr_dict = { + "name": "coord_number", + "r_cut": r_cut, + "delay": delay, + "selection": selection, + } logger.log(f"Computed coord_number using args {attr_dict}.") return neigcounts, Insight( dataset=nn.astype(np.float64), @@ -193,7 +198,12 @@ def get_lens( delay=delay, ) - attr_dict = {"name":"lens", "r_cut": r_cut, "delay": delay, "selection": selection} + attr_dict = { + "name": "lens", + "r_cut": r_cut, + "delay": delay, + "selection": selection, + } logger.log(f"Computed LENS using args {attr_dict}.") return neigcounts, Insight( @@ -228,7 +238,7 @@ def get_soap( trajslice=self.trajslice, ) attr_dict = { - "name":"soap", + "name": "soap", "r_cut": r_cut, "n_max": n_max, "l_max": l_max, @@ -239,6 +249,52 @@ def get_soap( logger.log(f"Computed SOAP with args {attr_dict}.") return Insight(dataset=soap, meta=attr_dict) + def get_timesoap( + self, + r_cut: float, + n_max: int, + l_max: int, + selection: str = "all", + centers: str = "all", + respect_pbc: bool = True, + n_core: int = 1, + delay: int = 1, + ) -> tuple[Insight, Insight]: + """Compute SOAP and then timeSOAP on the trajectory. + + The returned Insights contain the following meta: name, r_cut, n_max, + l_max, respect_pbc, centers, selection. + For the timeSOAP Insight, also delay is included. + """ + soap_matrix = dynsight.soap.saponify_trajectory( + self.universe, + soaprcut=r_cut, + soapnmax=n_max, + soaplmax=l_max, + selection=selection, + soap_respectpbc=respect_pbc, + centers=centers, + n_core=n_core, + trajslice=self.trajslice, + ) + attr_dict = { + "name": "soap", + "r_cut": r_cut, + "n_max": n_max, + "l_max": l_max, + "respect_pbc": respect_pbc, + "selection": selection, + "centers": centers, + } + soap = Insight(dataset=soap_matrix, meta=attr_dict) + logger.log(f"Computed SOAP with args {soap.meta}.") + + timesoap = soap.get_angular_velocity(delay=delay) + timesoap.meta.update({"name": "timesoap"}) + + logger.log(f"Computed timeSOAP with args {timesoap.meta}.") + return soap, timesoap + def get_orientational_op( self, r_cut: float, @@ -268,7 +324,12 @@ def get_orientational_op( order=order, ) - attr_dict = {"name":"orientational_op", "r_cut": r_cut, "order": order, "selection": selection} + attr_dict = { + "name": "orientational_op", + "r_cut": r_cut, + "order": order, + "selection": selection, + } logger.log( f"Computed orientational order parameter using args {attr_dict}." @@ -306,7 +367,11 @@ def get_velocity_alignment( neigh_list_per_frame=neigcounts, ) - attr_dict = {"name":"velocity_alignement", "r_cut": r_cut, "selection": selection} + attr_dict = { + "name": "velocity_alignement", + "r_cut": r_cut, + "selection": selection, + } logger.log( f"Computed average velocity alignment using args {attr_dict}." @@ -349,7 +414,7 @@ def get_rdf( step=trajslice.step, ) attr_dict = { - "name":"rdf", + "name": "rdf", "distances_range": distances_range, "s1": s1, "s2": s2, From 2a21aebb9e12de813456a576439de437ceeae1c1 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 10:57:49 +0200 Subject: [PATCH 06/30] added zip compression. --- src/dynsight/_internal/logs.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 541e74e1..ee0a158f 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -3,7 +3,9 @@ from __future__ import annotations from datetime import datetime, timezone +from io import BytesIO from pathlib import Path +from zipfile import ZIP_DEFLATED, ZipFile from typing import TYPE_CHECKING import numpy as np @@ -64,16 +66,21 @@ def extract_datasets( if sanitized_values: base_filename = "_".join(sanitized_values) - filename = output_path / f"{base_filename}.npy" + filename = output_path / f"{base_filename}.zip" counter = 1 candidate = filename while candidate.exists(): - candidate = output_path / f"{base_filename}_{counter}.npy" + candidate = output_path / f"{base_filename}_{counter}.zip" counter += 1 filename = candidate - np.save(filename, insight.dataset) + buffer = BytesIO() + np.save(buffer, insight.dataset) + buffer.seek(0) + + with ZipFile(filename, "w", compression=ZIP_DEFLATED) as archive: + archive.writestr(f"{base_filename}.npy", buffer.getvalue()) saved_paths.append(filename) self.log(f"Dataset saved to {filename}.") From 8914f350b46cf728543a49dbafe9cafeaeb8c12d Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 11:33:56 +0200 Subject: [PATCH 07/30] Fixed zip compression. --- src/dynsight/_internal/logs.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index ee0a158f..965f236c 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -3,7 +3,6 @@ from __future__ import annotations from datetime import datetime, timezone -from io import BytesIO from pathlib import Path from zipfile import ZIP_DEFLATED, ZipFile from typing import TYPE_CHECKING @@ -66,25 +65,39 @@ def extract_datasets( if sanitized_values: base_filename = "_".join(sanitized_values) - filename = output_path / f"{base_filename}.zip" + filename = output_path / f"{base_filename}.npy" counter = 1 candidate = filename while candidate.exists(): - candidate = output_path / f"{base_filename}_{counter}.zip" + candidate = output_path / f"{base_filename}_{counter}.npy" counter += 1 filename = candidate - buffer = BytesIO() - np.save(buffer, insight.dataset) - buffer.seek(0) - - with ZipFile(filename, "w", compression=ZIP_DEFLATED) as archive: - archive.writestr(f"{base_filename}.npy", buffer.getvalue()) + np.save(filename, insight.dataset) saved_paths.append(filename) self.log(f"Dataset saved to {filename}.") self._registered_data = [] + + if saved_paths: + zip_base = output_path.name + zip_filename = output_path.parent / f"{zip_base}.zip" + + counter = 1 + candidate = zip_filename + while candidate.exists(): + candidate = output_path.parent / f"{zip_base}_{counter}.zip" + counter += 1 + zip_filename = candidate + + with ZipFile(zip_filename, "w", compression=ZIP_DEFLATED) as archive: + for file_path in sorted(output_path.rglob("*")): + if file_path.is_file(): + archive.write(file_path, arcname=file_path.relative_to(output_path)) + + saved_paths.append(zip_filename) + self.log(f"Output directory zipped to {zip_filename}.") return saved_paths From 5928489bcb68154998b0e2cbd67746f045d21e86 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 11:53:08 +0200 Subject: [PATCH 08/30] Simplified function complexity. --- src/dynsight/_internal/logs.py | 116 ++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 52 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 965f236c..383bba4c 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -4,8 +4,9 @@ from datetime import datetime, timezone from pathlib import Path -from zipfile import ZIP_DEFLATED, ZipFile +from tempfile import TemporaryDirectory from typing import TYPE_CHECKING +from zipfile import ZIP_DEFLATED, ZipFile import numpy as np @@ -45,61 +46,72 @@ def extract_datasets( output_dir: Path | str = Path("output"), ) -> list[Path]: output_path = Path(output_dir) - output_path.mkdir(parents=True, exist_ok=True) + zip_parent = output_path.parent + zip_parent.mkdir(parents=True, exist_ok=True) saved_paths: list[Path] = [] - for index, insight in enumerate(self._registered_data, start=1): - base_filename = f"dataset_{index}" - if isinstance(insight.meta, dict) and insight.meta: - sanitized_values = [] - - for value in insight.meta.values(): - value_str = str(value) - sanitized = "".join( - ch if ch.isalnum() or ch in {"-", "_"} else "_" - for ch in value_str - ).strip("_") - if sanitized: - sanitized_values.append(sanitized) - - if sanitized_values: - base_filename = "_".join(sanitized_values) - - filename = output_path / f"{base_filename}.npy" - - counter = 1 - candidate = filename - while candidate.exists(): - candidate = output_path / f"{base_filename}_{counter}.npy" - counter += 1 - filename = candidate - - np.save(filename, insight.dataset) - saved_paths.append(filename) - self.log(f"Dataset saved to {filename}.") - - self._registered_data = [] - - if saved_paths: - zip_base = output_path.name - zip_filename = output_path.parent / f"{zip_base}.zip" - - counter = 1 - candidate = zip_filename - while candidate.exists(): - candidate = output_path.parent / f"{zip_base}_{counter}.zip" - counter += 1 - zip_filename = candidate - - with ZipFile(zip_filename, "w", compression=ZIP_DEFLATED) as archive: - for file_path in sorted(output_path.rglob("*")): - if file_path.is_file(): - archive.write(file_path, arcname=file_path.relative_to(output_path)) - - saved_paths.append(zip_filename) - self.log(f"Output directory zipped to {zip_filename}.") + dataset_files: list[Path] = [] + + with TemporaryDirectory( + dir=zip_parent, prefix=f"{output_path.name}_" + ) as temp_dir: + temp_path = Path(temp_dir) + + for index, insight in enumerate(self._registered_data, start=1): + base_filename = f"dataset_{index}" + if isinstance(insight.meta, dict) and insight.meta: + sanitized_values = [] + for value in insight.meta.values(): + value_str = str(value) + sanitized = "".join( + ch if ch.isalnum() or ch in {"-", "_"} else "_" + for ch in value_str + ).strip("_") + if sanitized: + sanitized_values.append(sanitized) + if sanitized_values: + base_filename = "_".join(sanitized_values) + + filename = temp_path / f"{base_filename}.npy" + counter = 1 + while filename.exists(): + filename = temp_path / f"{base_filename}_{counter}.npy" + counter += 1 + + np.save(filename, insight.dataset) + dataset_files.append(filename) + self.log(f"Dataset prepared: {filename.name}.") + + self._registered_data = [] + + if dataset_files: + zip_filename = self._create_zip_archive( + dataset_files, output_path, zip_parent + ) + saved_paths.append(zip_filename) + self.log(f"Output directory zipped to {zip_filename}.") return saved_paths + def _create_zip_archive( + self, + dataset_files: list[Path], + output_path: Path, + zip_parent: Path, + ) -> Path: + zip_base = output_path.name + zip_filename = zip_parent / f"{zip_base}.zip" + + counter = 1 + while zip_filename.exists(): + zip_filename = zip_parent / f"{zip_base}_{counter}.zip" + counter += 1 + + with ZipFile(zip_filename, "w", compression=ZIP_DEFLATED) as archive: + for file_path in sorted(dataset_files): + archive.write(file_path, arcname=file_path.name) + + return zip_filename + logger = Logger() From b8cfe25e3cac1e163f12fadb8c688f311d85e93a Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 9 Oct 2025 11:56:29 +0200 Subject: [PATCH 09/30] changed name of the zip archive. --- src/dynsight/_internal/logs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 383bba4c..276b69bd 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -43,7 +43,7 @@ def register_data(self, insight: Insight) -> None: def extract_datasets( self, - output_dir: Path | str = Path("output"), + output_dir: Path | str = Path("analysis_archive"), ) -> list[Path]: output_path = Path(output_dir) zip_parent = output_path.parent From e6cfdd4a80f79e1b5d40e60a30ac9eaf8a9d3cb1 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 30 Oct 2025 11:42:28 +0100 Subject: [PATCH 10/30] Added check of the existence of a premade SOAP dataset. --- .../_internal/trajectory/trajectory.py | 67 +++++++++++-------- tests/tsoap/test_tsoap.py | 4 +- 2 files changed, 42 insertions(+), 29 deletions(-) diff --git a/src/dynsight/_internal/trajectory/trajectory.py b/src/dynsight/_internal/trajectory/trajectory.py index e34a7fa0..ba351821 100644 --- a/src/dynsight/_internal/trajectory/trajectory.py +++ b/src/dynsight/_internal/trajectory/trajectory.py @@ -251,9 +251,10 @@ def get_soap( def get_timesoap( self, - r_cut: float, - n_max: int, - l_max: int, + r_cut: float | None = None, + n_max: int | None = None, + l_max: int | None = None, + soap_insight: Insight | None = None, selection: str = "all", centers: str = "all", respect_pbc: bool = True, @@ -262,32 +263,42 @@ def get_timesoap( ) -> tuple[Insight, Insight]: """Compute SOAP and then timeSOAP on the trajectory. - The returned Insights contain the following meta: name, r_cut, n_max, - l_max, respect_pbc, centers, selection. - For the timeSOAP Insight, also delay is included. + The returned Insights (soap and timesoap) contain the following meta: + name, r_cut, n_max, l_max, respect_pbc, centers, selection. + Regarding the timeSOAP Insight, the delay used is also included. """ - soap_matrix = dynsight.soap.saponify_trajectory( - self.universe, - soaprcut=r_cut, - soapnmax=n_max, - soaplmax=l_max, - selection=selection, - soap_respectpbc=respect_pbc, - centers=centers, - n_core=n_core, - trajslice=self.trajslice, - ) - attr_dict = { - "name": "soap", - "r_cut": r_cut, - "n_max": n_max, - "l_max": l_max, - "respect_pbc": respect_pbc, - "selection": selection, - "centers": centers, - } - soap = Insight(dataset=soap_matrix, meta=attr_dict) - logger.log(f"Computed SOAP with args {soap.meta}.") + if soap_insight is not None: + msg = "" + if getattr(soap_insight, "meta", {}).get("name") != "soap": + msg = ( + f"soap_insight.meta['name'] must be 'soap', found: " + f"{soap_insight.meta.get('name', None)}" + ) + raise ValueError(msg) + msg = ( + "Loaded existing soap_insight: parameters r_cut, n_max, l_max," + " selection, centers, and respect_pbc will be ignored." + ) + logger.log(msg) + soap = soap_insight + else: + if r_cut is None or n_max is None or l_max is None: + msg = ( + "r_cut, n_max e l_max cannot be None" + " if the soap_insight is not provided." + ) + raise ValueError(msg) + + soap = self.get_soap( + r_cut=r_cut, + n_max=n_max, + l_max=l_max, + selection=selection, + centers=centers, + respect_pbc=respect_pbc, + n_core=n_core, + ) + logger.log(f"Computed SOAP with args {soap.meta}.") timesoap = soap.get_angular_velocity(delay=delay) timesoap.meta.update({"name": "timesoap"}) diff --git a/tests/tsoap/test_tsoap.py b/tests/tsoap/test_tsoap.py index f8658ed8..c3b7157a 100644 --- a/tests/tsoap/test_tsoap.py +++ b/tests/tsoap/test_tsoap.py @@ -26,7 +26,9 @@ def test_tsoap(case_data: TimeSOAPCaseData) -> None: l_max=4, ) - test_tsoap = test_soap.get_angular_velocity(delay=case_data.delay) + _, test_tsoap = example_trj.get_timesoap( + soap_insight=test_soap, delay=case_data.delay + ) if not expected_tsoap.exists(): np.save(expected_tsoap, test_tsoap.dataset) From b0ac6e69ec0040e9116e82f3a880c86afe5a6c67 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 30 Oct 2025 12:00:13 +0100 Subject: [PATCH 11/30] Update docs with new meta. --- src/dynsight/_internal/trajectory/trajectory.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/dynsight/_internal/trajectory/trajectory.py b/src/dynsight/_internal/trajectory/trajectory.py index ba351821..12a4c86e 100644 --- a/src/dynsight/_internal/trajectory/trajectory.py +++ b/src/dynsight/_internal/trajectory/trajectory.py @@ -142,7 +142,7 @@ def get_coord_number( * neighcounts: a list[list[AtomGroup]], it can be used to speed up subsequent descriptors' computations. * An Insight containing the number of neighbors. It has the - following meta: r_cut, selection. + following meta: name, r_cut, delay, selection. """ if neigcounts is None: neigcounts = dynsight.lens.list_neighbours_along_trajectory( @@ -183,7 +183,7 @@ def get_lens( * neighcounts: a list[list[AtomGroup]], it can be used to speed up subsequent descriptors' computations. * An Insight containing LENS. It has the following meta: - r_cut, selection. + name, r_cut, delay, selection. """ if neigcounts is None: neigcounts = dynsight.lens.list_neighbours_along_trajectory( @@ -223,8 +223,8 @@ def get_soap( ) -> Insight: """Compute SOAP on the trajectory. - The returned Insight contains the following meta: r_cut, n_max, l_max, - respect_pbc, centers, selection. + The returned Insight contains the following meta: name, r_cut, n_max, + l_max, respect_pbc, selection, centers. """ soap = dynsight.soap.saponify_trajectory( self.universe, @@ -264,7 +264,7 @@ def get_timesoap( """Compute SOAP and then timeSOAP on the trajectory. The returned Insights (soap and timesoap) contain the following meta: - name, r_cut, n_max, l_max, respect_pbc, centers, selection. + name, r_cut, n_max, l_max, respect_pbc, selection, centers. Regarding the timeSOAP Insight, the delay used is also included. """ if soap_insight is not None: @@ -320,7 +320,7 @@ def get_orientational_op( * neighcounts: a list[list[AtomGroup]], it can be used to speed up subsequent descriptors' computations. * An Insight containing the orientational order parameter. - It has the following meta: r_cut, order, selection. + It has the following meta: name, r_cut, order, selection. """ if neigcounts is None: neigcounts = dynsight.lens.list_neighbours_along_trajectory( @@ -364,7 +364,7 @@ def get_velocity_alignment( * neighcounts: a list[list[AtomGroup]], it can be used to speed up subsequent descriptors' computations. * An Insight containing the average velocities alignment. - It has the following meta: r_cut, selection. + It has the following meta: name, r_cut, selection. """ if neigcounts is None: neigcounts = dynsight.lens.list_neighbours_along_trajectory( From f1f4a719dd563900fdaabbdee044bbfb2d2aa75d Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 30 Oct 2025 14:23:07 +0100 Subject: [PATCH 12/30] Added zip archive test. --- src/dynsight/_internal/logs.py | 4 +-- tests/logger/test_logger.py | 56 ++++++++++++++++++++++++++++++++++ tests/tsoap/test_tsoap.py | 8 ++--- 3 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 tests/logger/test_logger.py diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 276b69bd..91a914e3 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -44,7 +44,7 @@ def register_data(self, insight: Insight) -> None: def extract_datasets( self, output_dir: Path | str = Path("analysis_archive"), - ) -> list[Path]: + ) -> None: output_path = Path(output_dir) zip_parent = output_path.parent zip_parent.mkdir(parents=True, exist_ok=True) @@ -91,8 +91,6 @@ def extract_datasets( saved_paths.append(zip_filename) self.log(f"Output directory zipped to {zip_filename}.") - return saved_paths - def _create_zip_archive( self, dataset_files: list[Path], diff --git a/tests/logger/test_logger.py b/tests/logger/test_logger.py new file mode 100644 index 00000000..4a8ee73c --- /dev/null +++ b/tests/logger/test_logger.py @@ -0,0 +1,56 @@ +from __future__ import annotations + +import zipfile +from pathlib import Path + +from dynsight.logs import logger +from dynsight.trajectory import Trj + + +def test_zip_arch() -> None: + """Ensure the zip archive is created and contains the expected files.""" + logger.clear() + + original_dir = Path(__file__).absolute().parent + lens_trajectory_file = original_dir / "../systems/2_particles.xyz" + tsoap_topology_file = original_dir / "../systems/balls_7_nvt.gro" + tsoap_trajectory_file = original_dir / "../systems/balls_7_nvt.xtc" + + lens_traj = Trj.init_from_xyz(lens_trajectory_file, dt=1) + tsoap_traj = Trj.init_from_xtc(tsoap_trajectory_file, tsoap_topology_file) + + lens_traj.get_lens(r_cut=4, num_processes=1) + tsoap_traj.get_timesoap(r_cut=4, n_max=4, l_max=4) + + logger.extract_datasets(original_dir / "archive") + + zip_files = list(original_dir.glob("*.zip")) + assert zip_files, f"No zip archive found in {original_dir}" + + zip_path = zip_files[0] + + try: + assert zip_path.exists(), f"Archive not found: {zip_path}" + + with zipfile.ZipFile(zip_path, "r") as zf: + names = [ + Path(name).stem + for name in zf.namelist() + if not name.endswith("/") + ] + n_insight_computed = 3 + assert len(names) == n_insight_computed, ( + f"Expected {n_insight_computed}" + f" files in archive, found {len(names)}: {names}" + ) + expected = { + "lens_4_1_all", + "soap_4_4_4_True_all_all", + "timesoap_4_4_4_True_all_all_1", + } + assert set(names) == expected, f"Unexpected file names: {names}" + + finally: + if zip_path.exists(): + zip_path.unlink(missing_ok=True) + logger.clear() diff --git a/tests/tsoap/test_tsoap.py b/tests/tsoap/test_tsoap.py index c3b7157a..9576c07a 100644 --- a/tests/tsoap/test_tsoap.py +++ b/tests/tsoap/test_tsoap.py @@ -12,10 +12,10 @@ def test_tsoap(case_data: TimeSOAPCaseData) -> None: - oritinal_dir = Path(__file__).resolve().parent - topology_file = oritinal_dir / "../systems/balls_7_nvt.gro" - trajectory_file = oritinal_dir / "../systems/balls_7_nvt.xtc" - expected_tsoap = oritinal_dir / "test_tsoap" / case_data.expected_tsoap + original_dir = Path(__file__).resolve().parent + topology_file = original_dir / "../systems/balls_7_nvt.gro" + trajectory_file = original_dir / "../systems/balls_7_nvt.xtc" + expected_tsoap = original_dir / "test_tsoap" / case_data.expected_tsoap universe = MDAnalysis.Universe(topology_file, trajectory_file) example_trj = Trj(universe) From b5cade722f900c8f5893d3b005a3c3628074d43e Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 30 Oct 2025 15:12:24 +0100 Subject: [PATCH 13/30] Fix synt_dataset exporting functions. --- .../_internal/vision/label_tool/script.js | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/dynsight/_internal/vision/label_tool/script.js b/src/dynsight/_internal/vision/label_tool/script.js index 79b6f9de..8174e41d 100644 --- a/src/dynsight/_internal/vision/label_tool/script.js +++ b/src/dynsight/_internal/vision/label_tool/script.js @@ -327,6 +327,7 @@ exportAllBtn.onclick = async () => { } const numTrain = Math.floor(images.length * (trainPercent / 100)); const zip = new JSZip(); + const datasetName = "yolo_dataset"; const imgTrain = zip.folder("images/train"); const imgVal = zip.folder("images/val"); const lblTrain = zip.folder("labels/train"); @@ -372,18 +373,19 @@ exportAllBtn.onclick = async () => { } const names = Object.keys(labelMap); - const yaml = `path: . - train: images/train - val: images/val - nc: ${names.length} - names: [${names.map((n) => `'${n}'`).join(", ")}] - `; + const yaml = [ + `path: ${datasetName}`, + "train: images/train", + "val: images/val", + `nc: ${names.length}`, + `names: [${names.map((n) => `'${n}'`).join(", ")}]`, + ].join("\n"); zip.file("dataset.yaml", yaml); const content = await zip.generateAsync({ type: "blob" }); const a = document.createElement("a"); a.href = URL.createObjectURL(content); - a.download = "yolo_dataset.zip"; + a.download = `${datasetName}.zip`; a.click(); URL.revokeObjectURL(a.href); }; @@ -400,20 +402,27 @@ synthBtn.onclick = async () => { ); const width = parseInt(prompt("Image width?", "640"), 10); const height = parseInt(prompt("Image height?", "640"), 10); - + const requestedPerImage = parseInt( + prompt("Number of objects per image?", "10"), + 10, + ); if ( !numImages || Number.isNaN(numImages) || !width || Number.isNaN(width) || !height || - Number.isNaN(height) + Number.isNaN(height) || + !requestedPerImage || + Number.isNaN(requestedPerImage) || + requestedPerImage < 1 ) { alert("Invalid parameters."); return; } const crops = []; + const datasetName = "synt_dataset"; const labelMap = {}; let nextId = 0; for (const file of images) { @@ -460,8 +469,7 @@ synthBtn.onclick = async () => { ctx.fillRect(0, 0, width, height); const placed = []; - const numObj = Math.min(5, crops.length); - for (let i = 0; i < numObj; i++) { + for (let i = 0; i < requestedPerImage; i++) { const crop = crops[Math.floor(Math.random() * crops.length)]; const img = await loadImage(crop.file); const c = document.createElement("canvas"); @@ -479,9 +487,7 @@ synthBtn.onclick = async () => { crop.height, ); - const scale = - (0.15 + 0.15 * Math.random()) * - (Math.min(width, height) / Math.max(crop.width, crop.height)); + const scale = 1 const w = crop.width * scale; const h = crop.height * scale; @@ -539,18 +545,19 @@ synthBtn.onclick = async () => { } const names = Object.keys(labelMap); - const yaml = `path: . - train: images/train - val: images/val - nc: ${names.length} - names: [${names.map((n) => `'${n}'`).join(", ")}] - `; + const yaml = [ + `path: ${datasetName}`, + "train: images/train", + "val: images/val", + `nc: ${names.length}`, + `names: [${names.map((n) => `'${n}'`).join(", ")}]`, + ].join("\n"); zip.file("dataset.yaml", yaml); const content = await zip.generateAsync({ type: "blob" }); const a = document.createElement("a"); a.href = URL.createObjectURL(content); - a.download = "synt_dataset.zip"; + a.download = `${datasetName}.zip`; a.click(); URL.revokeObjectURL(a.href); }; From a62cf051610f47f66e57cb6d248dff9a833b94d6 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 3 Nov 2025 10:07:50 +0100 Subject: [PATCH 14/30] Removed useless msg variable. --- src/dynsight/_internal/trajectory/trajectory.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dynsight/_internal/trajectory/trajectory.py b/src/dynsight/_internal/trajectory/trajectory.py index 12a4c86e..081160df 100644 --- a/src/dynsight/_internal/trajectory/trajectory.py +++ b/src/dynsight/_internal/trajectory/trajectory.py @@ -268,7 +268,6 @@ def get_timesoap( Regarding the timeSOAP Insight, the delay used is also included. """ if soap_insight is not None: - msg = "" if getattr(soap_insight, "meta", {}).get("name") != "soap": msg = ( f"soap_insight.meta['name'] must be 'soap', found: " From 940a7afc796250cf8b12bd2c9621ba5cdcbf0706 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 3 Nov 2025 11:03:56 +0100 Subject: [PATCH 15/30] Updated citations and Acknowledgements. --- docs/source/index.rst | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 3ae663ba..4561fdb8 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -119,19 +119,19 @@ There are examples throughout the documentation and available in the ``examples/`` directory of this repository. There are also examples available in the ``cpctools`` repository -`here ` +`here `_ How To Cite =========== -If you use ``dynsight`` please cite +If you use ``dynsight`` please cite: - https://github.com/GMPavanLab/dynsight +S. Martino, M. Becchi, A. Tarzia, D. Rapetti, G. M. Pavan +*dynsight: an open Python platform for simulation and experimental trajectory data analysis* +arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ -and - - TBD +``dynsight`` uses many different open-source packages. Please cite them when appropriate: * Most modules also use MDAnalysis, https://www.mdanalysis.org/pages/citations/ * If you use SOAP, please cite https://doi.org/10.1103/PhysRevB.87.184115 and DScribe https://singroup.github.io/dscribe/latest/citing.html @@ -146,14 +146,13 @@ and Acknowledgements ================ -We developed this code when working in the Pavan group, -https://www.gmpavanlab.polito.it/, whose members often provide very valuable -feedback, which we gratefully acknowledge. - -Much of the original code in ``cpctools`` was written by Daniele Rapetti (Iximiel). - -The work was funded by the European Union and ERC under projects DYNAPOL and the -NextGenerationEU project, CAGEX. +``dynsight`` is developed by the Pavan group at Politecnico di Torino, https://www.gmpavanlab.polito.it/. +Many group members have provided and continuously provide with their daily work useful feedbacks, +which we gratefully acknowledge. +This work is made possible thanks to the funding received by the European Research Council +under the European Union’s Horizon 2020 research and innovation program +(Grant Agreement No. 818776 - DYNAPOL, to G.M.P.), which G.M.P. and the whole Pavan +group thankfully acknowledge. Indices and tables ------------------ From 4282e14f9b115cbd39e5b09946fc5693a2f194c1 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 3 Nov 2025 16:59:21 +0100 Subject: [PATCH 16/30] Initialized logs doc. --- docs/source/index.rst | 1 + docs/source/logs.rst | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 docs/source/logs.rst diff --git a/docs/source/index.rst b/docs/source/index.rst index 4561fdb8..7c60a5c5 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -16,6 +16,7 @@ analysis data processing HDF5er + logs .. toctree:: :hidden: diff --git a/docs/source/logs.rst b/docs/source/logs.rst new file mode 100644 index 00000000..cfd874ef --- /dev/null +++ b/docs/source/logs.rst @@ -0,0 +1,13 @@ +Logs +==== + +dynsight logging system. + +----- +Usage +----- + +.. toctree:: + :maxdepth: 1 + + Logs <_autosummary/dynsight.logs.rst> From fb2918f9d50de645977edf5f722e43c1eb94a443 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 3 Nov 2025 17:02:07 +0100 Subject: [PATCH 17/30] Initializing memory checks. --- src/dynsight/_internal/logs.py | 89 ++++++++++++++++++++++++++++++---- tests/logger/test_logger.py | 4 +- 2 files changed, 82 insertions(+), 11 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 91a914e3..745ae2ae 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -2,6 +2,7 @@ from __future__ import annotations +import sys from datetime import datetime, timezone from pathlib import Path from tempfile import TemporaryDirectory @@ -13,6 +14,46 @@ if TYPE_CHECKING: from dynsight.trajectory import Insight +import logging + +COLORS = { + "DEBUG": "\033[36m", + "INF": "\033[32m", + "WRN": "\033[33m", + "ERR": "\033[31m", + "CRT": "\033[41m", +} +RESET = "\033[0m" + +LEVEL_ALIASES = { + "DEBUG": "DBG", + "INFO": "INF", + "WARNING": "WRN", + "ERROR": "ERR", + "CRITICAL": "CRT", +} + + +class ColorFormatter(logging.Formatter): + def format(self, record: logging.LogRecord) -> str: + alias = LEVEL_ALIASES.get(record.levelname, record.levelname) + color = COLORS.get(alias, "") + record.levelname = f"{color}{alias:^3}{RESET}" + record.msg = f"{color}{record.msg}{RESET}" + return super().format(record) + + +handler = logging.StreamHandler(sys.stdout) +formatter = ColorFormatter( + fmt="%(asctime)s | %(levelname)s | %(message)s", datefmt="%Y-%m-%d %H:%M" +) +handler.setFormatter(formatter) + +console = logging.getLogger(__name__) +console.setLevel(logging.DEBUG) +console.addHandler(handler) +console.propagate = False + class Logger: """Creates and save human-readible log.""" @@ -23,14 +64,15 @@ def __init__(self) -> None: def log(self, msg: str) -> None: timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") - entry = f"[{timestamp}] {msg}" - self._log.append(entry) + history_entry = f"[{timestamp}] {msg}" + console.info(msg) + self._log.append(history_entry) - def save(self, filename: Path) -> None: + def save_history(self, filename: Path) -> None: with filename.open("w", encoding="utf-8") as f: f.write("\n".join(self._log)) - def clear(self) -> None: + def clear_history(self) -> None: self._log = [] self._registered_data = [] @@ -38,8 +80,41 @@ def get(self) -> str: return "\n".join(self._log) def register_data(self, insight: Insight) -> None: + for existing in self._registered_data: + if existing.meta == insight.meta: + console.warning("Insight already registered, skipping.") + return + + insight_bytes = insight.dataset.nbytes self._registered_data.append(insight) - self.log(f"Registered data: {insight}") + + total_bytes = sum( + x.dataset.nbytes + if isinstance(x.dataset, np.ndarray) + else sys.getsizeof(x.dataset) + for x in self._registered_data + ) + + bytes_in_kb = 1024 + bytes_in_mb = bytes_in_kb**2 + bytes_in_gb = bytes_in_kb**3 + + def _format_size(bytes_val: int) -> str: + gb = bytes_val / bytes_in_gb + mb = bytes_val / bytes_in_mb + kb = bytes_val / bytes_in_kb + thr = 0.5 + if gb >= thr: + return f"{gb:.2f} GB" + if mb >= thr: + return f"{mb:.2f} MB" + return f"{kb:.2f} KB" + + added_size = _format_size(insight_bytes) + total_size = _format_size(total_bytes) + + console.warning(f"Registering dataset with size: {added_size}.") + console.warning(f"RAM occupied by dynsight datasets: {total_size}.") def extract_datasets( self, @@ -73,10 +148,6 @@ def extract_datasets( base_filename = "_".join(sanitized_values) filename = temp_path / f"{base_filename}.npy" - counter = 1 - while filename.exists(): - filename = temp_path / f"{base_filename}_{counter}.npy" - counter += 1 np.save(filename, insight.dataset) dataset_files.append(filename) diff --git a/tests/logger/test_logger.py b/tests/logger/test_logger.py index 4a8ee73c..4b96a74d 100644 --- a/tests/logger/test_logger.py +++ b/tests/logger/test_logger.py @@ -9,7 +9,7 @@ def test_zip_arch() -> None: """Ensure the zip archive is created and contains the expected files.""" - logger.clear() + logger.clear_history() original_dir = Path(__file__).absolute().parent lens_trajectory_file = original_dir / "../systems/2_particles.xyz" @@ -53,4 +53,4 @@ def test_zip_arch() -> None: finally: if zip_path.exists(): zip_path.unlink(missing_ok=True) - logger.clear() + logger.clear_history() From 15cccee715c519b23896f15cd0cbf09727d000ad Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 3 Nov 2025 17:34:00 +0100 Subject: [PATCH 18/30] fix error in timesoap name (log). --- src/dynsight/_internal/trajectory/insight.py | 5 ++++- src/dynsight/_internal/trajectory/trajectory.py | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dynsight/_internal/trajectory/insight.py b/src/dynsight/_internal/trajectory/insight.py index 520e5c14..5699cf3f 100644 --- a/src/dynsight/_internal/trajectory/insight.py +++ b/src/dynsight/_internal/trajectory/insight.py @@ -145,7 +145,10 @@ def get_angular_velocity(self, delay: int = 1) -> Insight: theta = dynsight.soap.timesoap(self.dataset, delay=delay) attr_dict = self.meta.copy() attr_dict.update({"delay": delay}) - attr_dict.update({"name": "angular_velocity"}) + if self.meta.get("name") == "soap": + attr_dict.update({"name": "timesoap"}) + else: + attr_dict.update({"name": "angular_velocity"}) logger.log(f"Computed angular velocity with args {attr_dict}.") return Insight(dataset=theta, meta=attr_dict) diff --git a/src/dynsight/_internal/trajectory/trajectory.py b/src/dynsight/_internal/trajectory/trajectory.py index 081160df..0f178790 100644 --- a/src/dynsight/_internal/trajectory/trajectory.py +++ b/src/dynsight/_internal/trajectory/trajectory.py @@ -300,7 +300,6 @@ def get_timesoap( logger.log(f"Computed SOAP with args {soap.meta}.") timesoap = soap.get_angular_velocity(delay=delay) - timesoap.meta.update({"name": "timesoap"}) logger.log(f"Computed timeSOAP with args {timesoap.meta}.") return soap, timesoap From 6a7a54136cc4bc9843c70c6362888758ac66ab47 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 3 Nov 2025 17:45:00 +0100 Subject: [PATCH 19/30] avoiding RAM linear occupancy. --- src/dynsight/_internal/logs.py | 125 +++++++++++++++++++++------------ 1 file changed, 81 insertions(+), 44 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 745ae2ae..e47d6564 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -3,10 +3,11 @@ from __future__ import annotations import sys +from dataclasses import dataclass from datetime import datetime, timezone from pathlib import Path from tempfile import TemporaryDirectory -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any from zipfile import ZIP_DEFLATED, ZipFile import numpy as np @@ -55,12 +56,20 @@ def format(self, record: logging.LogRecord) -> str: console.propagate = False +@dataclass +class RegisteredDataset: + meta: Any + path: Path + + class Logger: """Creates and save human-readible log.""" def __init__(self) -> None: self._log: list[str] = [] - self._registered_data: list[Insight] = [] + self._registered_data: list[RegisteredDataset] = [] + self._temp_dir: TemporaryDirectory[str] | None = None + self._temp_path: Path | None = None def log(self, msg: str) -> None: timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") @@ -74,6 +83,7 @@ def save_history(self, filename: Path) -> None: def clear_history(self) -> None: self._log = [] + self._cleanup_temp_dir() self._registered_data = [] def get(self) -> str: @@ -86,13 +96,21 @@ def register_data(self, insight: Insight) -> None: return insight_bytes = insight.dataset.nbytes - self._registered_data.append(insight) + + temp_path = self._ensure_temp_dir() + + base_filename = self._build_base_filename(insight) + filename = self._make_unique_filename(temp_path, base_filename) + + np.save(filename, insight.dataset) + + dataset_entry = RegisteredDataset(meta=insight.meta, path=filename) + self._registered_data.append(dataset_entry) total_bytes = sum( - x.dataset.nbytes - if isinstance(x.dataset, np.ndarray) - else sys.getsizeof(x.dataset) - for x in self._registered_data + entry.path.stat().st_size + for entry in self._registered_data + if entry.path.exists() ) bytes_in_kb = 1024 @@ -114,7 +132,8 @@ def _format_size(bytes_val: int) -> str: total_size = _format_size(total_bytes) console.warning(f"Registering dataset with size: {added_size}.") - console.warning(f"RAM occupied by dynsight datasets: {total_size}.") + console.warning(f"Disk used by dynsight datasets: {total_size}.") + self.log(f"Dataset prepared: {filename.name}.") def extract_datasets( self, @@ -125,42 +144,22 @@ def extract_datasets( zip_parent.mkdir(parents=True, exist_ok=True) saved_paths: list[Path] = [] - dataset_files: list[Path] = [] - - with TemporaryDirectory( - dir=zip_parent, prefix=f"{output_path.name}_" - ) as temp_dir: - temp_path = Path(temp_dir) - - for index, insight in enumerate(self._registered_data, start=1): - base_filename = f"dataset_{index}" - if isinstance(insight.meta, dict) and insight.meta: - sanitized_values = [] - for value in insight.meta.values(): - value_str = str(value) - sanitized = "".join( - ch if ch.isalnum() or ch in {"-", "_"} else "_" - for ch in value_str - ).strip("_") - if sanitized: - sanitized_values.append(sanitized) - if sanitized_values: - base_filename = "_".join(sanitized_values) - - filename = temp_path / f"{base_filename}.npy" - - np.save(filename, insight.dataset) - dataset_files.append(filename) - self.log(f"Dataset prepared: {filename.name}.") - - self._registered_data = [] - - if dataset_files: - zip_filename = self._create_zip_archive( - dataset_files, output_path, zip_parent - ) - saved_paths.append(zip_filename) - self.log(f"Output directory zipped to {zip_filename}.") + + dataset_files = [ + entry.path + for entry in self._registered_data + if entry.path.exists() + ] + + if dataset_files: + zip_filename = self._create_zip_archive( + dataset_files, output_path, zip_parent + ) + saved_paths.append(zip_filename) + self.log(f"Output directory zipped to {zip_filename}.") + + self._cleanup_temp_dir() + self._registered_data = [] def _create_zip_archive( self, @@ -182,5 +181,43 @@ def _create_zip_archive( return zip_filename + def _ensure_temp_dir(self) -> Path: + if self._temp_dir is None or self._temp_path is None: + self._temp_dir = TemporaryDirectory(prefix="analysis_archive_") + self._temp_path = Path(self._temp_dir.name) + return self._temp_path + + def _cleanup_temp_dir(self) -> None: + if self._temp_dir is not None: + self._temp_dir.cleanup() + self._temp_dir = None + self._temp_path = None + + def _build_base_filename(self, insight: Insight) -> str: + base_filename = "dataset" + if isinstance(insight.meta, dict) and insight.meta: + sanitized_values = [] + for value in insight.meta.values(): + value_str = str(value) + sanitized = "".join( + ch if ch.isalnum() or ch in {"-", "_"} else "_" + for ch in value_str + ).strip("_") + if sanitized: + sanitized_values.append(sanitized) + if sanitized_values: + base_filename = "_".join(sanitized_values) + return base_filename + + def _make_unique_filename( + self, temp_path: Path, base_filename: str + ) -> Path: + filename = temp_path / f"{base_filename}.npy" + counter = 1 + while filename.exists(): + filename = temp_path / f"{base_filename}_{counter}.npy" + counter += 1 + return filename + logger = Logger() From 912aa985f4461eeed7ad330a8879cf84ff517da0 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Tue, 4 Nov 2025 17:55:23 +0100 Subject: [PATCH 20/30] Added auto_register toggle. --- src/dynsight/_internal/logs.py | 21 ++++++++++++++++++-- src/dynsight/_internal/trajectory/insight.py | 3 ++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index e47d6564..bcf62ad7 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -65,11 +65,26 @@ class RegisteredDataset: class Logger: """Creates and save human-readible log.""" - def __init__(self) -> None: + def __init__( + self, + *, + auto_register: bool = True, + ) -> None: self._log: list[str] = [] self._registered_data: list[RegisteredDataset] = [] self._temp_dir: TemporaryDirectory[str] | None = None self._temp_path: Path | None = None + self.auto_register = auto_register + + def configure( + self, + *, + auto_register: bool | None = None, + ) -> None: + if auto_register is not None: + self.auto_register = auto_register + state = "enabled" if auto_register else "disabled" + console.info(f"Automatic dataset registration {state}.") def log(self, msg: str) -> None: timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") @@ -139,12 +154,14 @@ def extract_datasets( self, output_dir: Path | str = Path("analysis_archive"), ) -> None: + if self._registered_data == []: + console.error("No datasets to extract.") + return output_path = Path(output_dir) zip_parent = output_path.parent zip_parent.mkdir(parents=True, exist_ok=True) saved_paths: list[Path] = [] - dataset_files = [ entry.path for entry in self._registered_data diff --git a/src/dynsight/_internal/trajectory/insight.py b/src/dynsight/_internal/trajectory/insight.py index 5699cf3f..183dc50d 100644 --- a/src/dynsight/_internal/trajectory/insight.py +++ b/src/dynsight/_internal/trajectory/insight.py @@ -33,7 +33,8 @@ class Insight: meta: dict[str, Any] = field(default_factory=dict) def __post_init__(self) -> None: - logger.register_data(self) + if logger.auto_register: + logger.register_data(self) def dump_to_json(self, file_path: Path) -> None: """Save the Insight to a JSON file and .npy file.""" From 2627de210f67cb7e4ff3d1b7272060f40f5e41a8 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Sat, 8 Nov 2025 11:55:23 +0100 Subject: [PATCH 21/30] Added docs. --- docs/source/logs.rst | 14 +++++++++++ src/dynsight/_internal/logs.py | 45 ++++++++++++++++++++++++++++++---- src/dynsight/logs.py | 3 ++- 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/docs/source/logs.rst b/docs/source/logs.rst index cfd874ef..0a2eb9d8 100644 --- a/docs/source/logs.rst +++ b/docs/source/logs.rst @@ -3,6 +3,20 @@ Logs dynsight logging system. +.. warning:: + + A default instance of :class:`Logger` is **automatically created** when importing the ``dynsight`` package. + This instance is available as ``dynsight.logs.logger``. + + You can configure it, for example to disable the automatic registration of datasets, using: + + .. code-block:: python + + import dynsight + dynsight.logs.logger.configure(auto_register=False) + + You can also access all its attributes and methods described in the Logs page below. + ----- Usage ----- diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index bcf62ad7..2c90e84c 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -79,32 +79,61 @@ def __init__( def configure( self, *, - auto_register: bool | None = None, + auto_register: bool = True, ) -> None: - if auto_register is not None: - self.auto_register = auto_register - state = "enabled" if auto_register else "disabled" - console.info(f"Automatic dataset registration {state}.") + """Adjusts the runtime configuration of the logger. + + Parameters: + auto_register: + Enables or disables automatic dataset registration. + When set to `True`, every processed dataset will be + automatically saved into a temporary archive. + When `False`, datasets must be explicitly registered + via `register_data()`. + """ + self.auto_register = auto_register + state = "enabled" if auto_register else "disabled" + console.info(f"Automatic dataset registration {state}.") def log(self, msg: str) -> None: + """Records an informational message to the log. + + Parameters: + msg: + The message to record. + """ timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") history_entry = f"[{timestamp}] {msg}" console.info(msg) self._log.append(history_entry) def save_history(self, filename: Path) -> None: + """Saves the current log history to a text file. + + Parameters: + filename: + The file path where the log history will be written. + """ with filename.open("w", encoding="utf-8") as f: f.write("\n".join(self._log)) def clear_history(self) -> None: + """Clears the current log history and registered datasets.""" self._log = [] self._cleanup_temp_dir() self._registered_data = [] def get(self) -> str: + """Retrieves the current log history as a string.""" return "\n".join(self._log) def register_data(self, insight: Insight) -> None: + """Registers and saves a dataset associated with an `Insight` instance. + + Parameters: + insight: + the `Insight` to be registered. + """ for existing in self._registered_data: if existing.meta == insight.meta: console.warning("Insight already registered, skipping.") @@ -154,6 +183,12 @@ def extract_datasets( self, output_dir: Path | str = Path("analysis_archive"), ) -> None: + """Exports all registered datasets into a ZIP archive. + + Parameters: + output_dir: + The directory where the ZIP archive will be saved. + """ if self._registered_data == []: console.error("No datasets to extract.") return diff --git a/src/dynsight/logs.py b/src/dynsight/logs.py index 00128318..1b5f082f 100644 --- a/src/dynsight/logs.py +++ b/src/dynsight/logs.py @@ -1,7 +1,8 @@ """logging package.""" -from dynsight._internal.logs import logger +from dynsight._internal.logs import Logger, logger __all__ = [ + "Logger", "logger", ] From 0b2e4335d4b5601444d87a6fb6c6c32cdaed4491 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Sat, 8 Nov 2025 12:17:51 +0100 Subject: [PATCH 22/30] Fixing arguments name issues. --- src/dynsight/_internal/trajectory/trajectory.py | 5 ++--- tests/logger/test_logger.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/dynsight/_internal/trajectory/trajectory.py b/src/dynsight/_internal/trajectory/trajectory.py index 8a114a09..b7ff5ea7 100644 --- a/src/dynsight/_internal/trajectory/trajectory.py +++ b/src/dynsight/_internal/trajectory/trajectory.py @@ -160,7 +160,6 @@ def get_coord_number( attr_dict = { "name": "coord_number", "r_cut": r_cut, - "delay": delay, "selection": selection, } logger.log(f"Computed coord_number using args {attr_dict}.") @@ -259,7 +258,7 @@ def get_timesoap( selection: str = "all", centers: str = "all", respect_pbc: bool = True, - n_core: int = 1, + n_jobs: int = 1, delay: int = 1, ) -> tuple[Insight, Insight]: """Compute SOAP and then timeSOAP on the trajectory. @@ -296,7 +295,7 @@ def get_timesoap( selection=selection, centers=centers, respect_pbc=respect_pbc, - n_core=n_core, + n_jobs=n_jobs, ) logger.log(f"Computed SOAP with args {soap.meta}.") diff --git a/tests/logger/test_logger.py b/tests/logger/test_logger.py index 4b96a74d..27328385 100644 --- a/tests/logger/test_logger.py +++ b/tests/logger/test_logger.py @@ -19,7 +19,7 @@ def test_zip_arch() -> None: lens_traj = Trj.init_from_xyz(lens_trajectory_file, dt=1) tsoap_traj = Trj.init_from_xtc(tsoap_trajectory_file, tsoap_topology_file) - lens_traj.get_lens(r_cut=4, num_processes=1) + lens_traj.get_lens(r_cut=4) tsoap_traj.get_timesoap(r_cut=4, n_max=4, l_max=4) logger.extract_datasets(original_dir / "archive") From 2f85fb84f443891a29dffe3bd0037163b6a90ebd Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 10 Nov 2025 13:54:06 +0100 Subject: [PATCH 23/30] changing term registration with recording. --- docs/source/logs.rst | 4 +- src/dynsight/_internal/logs.py | 44 ++++++++++---------- src/dynsight/_internal/trajectory/insight.py | 4 +- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/source/logs.rst b/docs/source/logs.rst index 0a2eb9d8..57f030a6 100644 --- a/docs/source/logs.rst +++ b/docs/source/logs.rst @@ -8,12 +8,12 @@ dynsight logging system. A default instance of :class:`Logger` is **automatically created** when importing the ``dynsight`` package. This instance is available as ``dynsight.logs.logger``. - You can configure it, for example to disable the automatic registration of datasets, using: + You can configure it, for example to disable the automatic recording of datasets, using: .. code-block:: python import dynsight - dynsight.logs.logger.configure(auto_register=False) + dynsight.logs.logger.configure(auto_recording=False) You can also access all its attributes and methods described in the Logs page below. diff --git a/src/dynsight/_internal/logs.py b/src/dynsight/_internal/logs.py index 2c90e84c..a448f0f2 100644 --- a/src/dynsight/_internal/logs.py +++ b/src/dynsight/_internal/logs.py @@ -57,43 +57,43 @@ def format(self, record: logging.LogRecord) -> str: @dataclass -class RegisteredDataset: +class RecordedDataset: meta: Any path: Path class Logger: - """Creates and save human-readible log.""" + """Create and save human-readible log.""" def __init__( self, *, - auto_register: bool = True, + auto_recording: bool = True, ) -> None: self._log: list[str] = [] - self._registered_data: list[RegisteredDataset] = [] + self._recorded_data: list[RecordedDataset] = [] self._temp_dir: TemporaryDirectory[str] | None = None self._temp_path: Path | None = None - self.auto_register = auto_register + self.auto_recording = auto_recording def configure( self, *, - auto_register: bool = True, + auto_recording: bool = True, ) -> None: """Adjusts the runtime configuration of the logger. Parameters: - auto_register: - Enables or disables automatic dataset registration. + auto_recording: + Enables or disables automatic dataset recording. When set to `True`, every processed dataset will be automatically saved into a temporary archive. When `False`, datasets must be explicitly registered via `register_data()`. """ - self.auto_register = auto_register - state = "enabled" if auto_register else "disabled" - console.info(f"Automatic dataset registration {state}.") + self.auto_recording = auto_recording + state = "enabled" if auto_recording else "disabled" + console.info(f"Automatic dataset recording {state}.") def log(self, msg: str) -> None: """Records an informational message to the log. @@ -121,20 +121,20 @@ def clear_history(self) -> None: """Clears the current log history and registered datasets.""" self._log = [] self._cleanup_temp_dir() - self._registered_data = [] + self._recorded_data = [] def get(self) -> str: """Retrieves the current log history as a string.""" return "\n".join(self._log) - def register_data(self, insight: Insight) -> None: - """Registers and saves a dataset associated with an `Insight` instance. + def record_data(self, insight: Insight) -> None: + """Record and save a dataset associated with an `Insight` instance. Parameters: insight: the `Insight` to be registered. """ - for existing in self._registered_data: + for existing in self._recorded_data: if existing.meta == insight.meta: console.warning("Insight already registered, skipping.") return @@ -148,12 +148,12 @@ def register_data(self, insight: Insight) -> None: np.save(filename, insight.dataset) - dataset_entry = RegisteredDataset(meta=insight.meta, path=filename) - self._registered_data.append(dataset_entry) + dataset_entry = RecordedDataset(meta=insight.meta, path=filename) + self._recorded_data.append(dataset_entry) total_bytes = sum( entry.path.stat().st_size - for entry in self._registered_data + for entry in self._recorded_data if entry.path.exists() ) @@ -183,13 +183,13 @@ def extract_datasets( self, output_dir: Path | str = Path("analysis_archive"), ) -> None: - """Exports all registered datasets into a ZIP archive. + """Exports all recorded datasets into a ZIP archive. Parameters: output_dir: The directory where the ZIP archive will be saved. """ - if self._registered_data == []: + if self._recorded_data == []: console.error("No datasets to extract.") return output_path = Path(output_dir) @@ -199,7 +199,7 @@ def extract_datasets( saved_paths: list[Path] = [] dataset_files = [ entry.path - for entry in self._registered_data + for entry in self._recorded_data if entry.path.exists() ] @@ -211,7 +211,7 @@ def extract_datasets( self.log(f"Output directory zipped to {zip_filename}.") self._cleanup_temp_dir() - self._registered_data = [] + self._recorded_data = [] def _create_zip_archive( self, diff --git a/src/dynsight/_internal/trajectory/insight.py b/src/dynsight/_internal/trajectory/insight.py index a3ee38ee..bcc793af 100644 --- a/src/dynsight/_internal/trajectory/insight.py +++ b/src/dynsight/_internal/trajectory/insight.py @@ -33,8 +33,8 @@ class Insight: meta: dict[str, Any] = field(default_factory=dict) def __post_init__(self) -> None: - if logger.auto_register: - logger.register_data(self) + if logger.auto_recording: + logger.record_data(self) def dump_to_json(self, file_path: Path) -> None: """Save the Insight to a JSON file and .npy file.""" From ab4e5877f9c6d99c65105ec76ab3b10039d1bf62 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 10 Nov 2025 14:59:02 +0100 Subject: [PATCH 24/30] added test for auto_record toggle. --- docs/source/_static/info_plot.png | Bin 141627 -> 147707 bytes src/dynsight/_internal/logs.py | 4 +--- tests/logger/test_logger.py | 24 ++++++++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/docs/source/_static/info_plot.png b/docs/source/_static/info_plot.png index 5a8c2a4c90b220dc2fab8431399ef67734facf4e..def462fd11c611923d5dd4e37d0ed070d274ad7e 100644 GIT binary patch literal 147707 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 syx)JXp}&sD-@ELu^U{ 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�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 None: if zip_path.exists(): zip_path.unlink(missing_ok=True) logger.clear_history() + + +def test_disabling_auto_record() -> None: + """Ensure no zip archive is created if auto_recording is disabled.""" + logger.clear_history() + logger.configure(auto_recording=False) + + original_dir = Path(__file__).absolute().parent + lens_trajectory_file = original_dir / "../systems/2_particles.xyz" + tsoap_topology_file = original_dir / "../systems/balls_7_nvt.gro" + tsoap_trajectory_file = original_dir / "../systems/balls_7_nvt.xtc" + + lens_traj = Trj.init_from_xyz(lens_trajectory_file, dt=1) + tsoap_traj = Trj.init_from_xtc(tsoap_trajectory_file, tsoap_topology_file) + + lens_traj.get_lens(r_cut=4) + tsoap_traj.get_timesoap(r_cut=4, n_max=4, l_max=4) + + logger.extract_datasets(original_dir / "archive") + + zip_files = list(original_dir.glob("*.zip")) + assert not zip_files, f"Unexpected zip archive(s) found: {zip_files}" + + logger.clear_history() From 8a526664f7a8cd5b8e941a6ba183f569dd634c2b Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Mon, 10 Nov 2025 15:52:47 +0100 Subject: [PATCH 25/30] updated README. --- README.rst | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.rst b/README.rst index 17961984..87cd8759 100644 --- a/README.rst +++ b/README.rst @@ -77,16 +77,19 @@ There are examples throughout the documentation and available in the ``examples/`` directory of this repository. There are also examples available in the ``cpctools`` repository -`here ` +`here `_ + How To Cite =========== -If you use ``dynsight`` please cite +If you use ``dynsight`` please cite: - https://github.com/GMPavanLab/dynsight +S. Martino, M. Becchi, A. Tarzia, D. Rapetti, G. M. Pavan +*dynsight: an open Python platform for simulation and experimental trajectory data analysis* +arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ - https://doi.org/10.48550/arXiv.2510.23493 +``dynsight`` uses many different open-source packages. Please cite them when appropriate: * Most modules also use MDAnalysis, https://www.mdanalysis.org/pages/citations/ * If you use SOAP, please cite https://doi.org/10.1103/PhysRevB.87.184115 and DScribe https://singroup.github.io/dscribe/latest/citing.html @@ -96,19 +99,16 @@ If you use ``dynsight`` please cite * If you use tICA, please cite ``deeptime`` https://deeptime-ml.github.io/latest/index.html * If you use ``dynsight.vision``, please cite Ultralytics YOLO https://docs.ultralytics.com/it/models/yolo11/#usage-examples * If you use ``dynsight.track``, please cite Trackpy https://soft-matter.github.io/trackpy/dev/introduction.html -* Entropy calculations are based on ``infomeasure`` https://doi.org/10.1038/s41598-025-14053-5 Acknowledgements ================ -We developed this code when working in the Pavan group, -https://www.gmpavanlab.polito.it/, whose members often provide very valuable -feedback, which we gratefully acknowledge. - -Much of the original code in ``cpctools`` was written by Daniele Rapetti (Iximiel). - -The work was funded by the European Union and ERC under projects DYNAPOL and the -NextGenerationEU project, CAGEX. +``dynsight`` is developed by the Pavan group at Politecnico di Torino, https://www.gmpavanlab.polito.it/. +Many group members have provided and continuously provide with their daily work useful feedbacks, +which we gratefully acknowledge. +This work is made possible thanks to the funding received by the European Research Council +under the European Union’s Horizon 2020 research and innovation program +(Grant Agreement No. 818776 - DYNAPOL, to G.M.P.), which G.M.P. and the whole Pavan +group thankfully acknowledge. -.. figure:: docs/source/_static/EU_image.png From 7c2ee0b9ec315caa568562d7ca41b9656cd20b09 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 13 Nov 2025 12:19:41 +0100 Subject: [PATCH 26/30] Refined main page. --- README.rst | 38 ++++++++++++----------------- docs/source/index.rst | 56 ++++++++++++++++++++----------------------- 2 files changed, 41 insertions(+), 53 deletions(-) diff --git a/README.rst b/README.rst index 87cd8759..215fad0a 100644 --- a/README.rst +++ b/README.rst @@ -1,9 +1,3 @@ -:maintainers: - `andrewtarzia `_; - `matteobecchi `_; - `simonemartino `_ -:documentation: https://dynsight.readthedocs.io - Overview ======== @@ -14,9 +8,14 @@ performing time-series clustering and conducting various auxiliary analyses. To achieve this, dynsight is organized into specialized modules, each addressing a specific aspect of this workflow. -Previously in `cpctools`_. +Complete documentation at `dynsight.readthedocs.io `_ -.. _`cpctools`: https://github.com/GMPavanLab/cpctools + +If you use ``dynsight`` please cite: + +S. Martino, M. Becchi, A. Tarzia, D. Rapetti, G. M. Pavan, +*dynsight: an open Python platform for simulation and experimental trajectory data analysis*, +arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ Installation ============ @@ -80,14 +79,8 @@ There are also examples available in the ``cpctools`` repository `here `_ -How To Cite -=========== - -If you use ``dynsight`` please cite: - -S. Martino, M. Becchi, A. Tarzia, D. Rapetti, G. M. Pavan -*dynsight: an open Python platform for simulation and experimental trajectory data analysis* -arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ +Related works and packages +========================== ``dynsight`` uses many different open-source packages. Please cite them when appropriate: @@ -104,11 +97,10 @@ arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ -.. _`cpctools`: https://github.com/GMPavanLab/cpctools +If you use ``dynsight`` please cite: + +S. Martino, M. Becchi, A. Tarzia, D. Rapetti, G. M. Pavan, +*dynsight: an open Python platform for simulation and experimental trajectory data analysis*, +arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ Installation ============ -To get :mod:`.dynsight`, you can install it with pip:: - - $ pip install dynsight +To get ``dynsight``, you can install it with pip:: + $ pip install dynsight Optional Dependancies --------------------- -Old versions :mod:`dynsight` used :mod:`cpctools` for SOAP calculations, if -you are using Python 3.10 and below, you can use :mod:`cpctools` to access -:mod:`SOAPify` and :mod:`hd5er` using :: +Old versions ``dynsight`` used ``cpctools`` for SOAP calculations, if +you are using Python 3.10 and below, you can use ``cpctools`` to access +``SOAPify`` and ``hd5er`` using :: $ pip install cpctools +If you want to use the ``dynsight.vision`` and ``dynsight.track`` modules +you will need to install a series of packages. This can be done with with pip:: + + $ pip install ultralytics PyYAML How to get started ------------------ We suggest you give a read to the ``dynsight.trajectory`` module documentation, -which offers a compact and easy way of using most of the ``dynsight`` tools. +which offers a compact and easy way of using most of the ``dynsight`` tools. Also, the documentation offers some copiable Recipes and Examples for the most common analyses. @@ -104,15 +109,12 @@ Developer Setup $ just dev - #. Run code checks:: $ just check - .. _`just`: https://github.com/casey/just - Examples ======== @@ -123,14 +125,8 @@ There are also examples available in the ``cpctools`` repository `here `_ -How To Cite -=========== - -If you use ``dynsight`` please cite: - -S. Martino, M. Becchi, A. Tarzia, D. Rapetti, G. M. Pavan -*dynsight: an open Python platform for simulation and experimental trajectory data analysis* -arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ +Related works and packages +========================== ``dynsight`` uses many different open-source packages. Please cite them when appropriate: @@ -147,13 +143,13 @@ arXiv (2025), DOI: `10.48550/arXiv.2510.23493 Date: Thu, 13 Nov 2025 16:45:52 +0100 Subject: [PATCH 27/30] changed overview. --- README.rst | 43 +++++++++++++++++-------------------------- docs/source/index.rst | 40 ++++++++++++++++------------------------ 2 files changed, 33 insertions(+), 50 deletions(-) diff --git a/README.rst b/README.rst index 215fad0a..ba3c15fb 100644 --- a/README.rst +++ b/README.rst @@ -1,21 +1,21 @@ Overview ======== -``dynsight`` is structured to support a wide range of tasks commonly -encountered in the analysis of many-body dynamical systems. These tasks -include handling trajectory data, computing single-particle descriptors, -performing time-series clustering and conducting various auxiliary analyses. -To achieve this, dynsight is organized into specialized modules, each -addressing a specific aspect of this workflow. - -Complete documentation at `dynsight.readthedocs.io `_ - - -If you use ``dynsight`` please cite: - -S. Martino, M. Becchi, A. Tarzia, D. Rapetti, G. M. Pavan, -*dynsight: an open Python platform for simulation and experimental trajectory data analysis*, -arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ +``dynsight`` is an open Python platform built to support a wide range of tasks commonly encountered +in the analysis of complex dynamical systems. The software contains and combines modules that allows +resolving and handling trajectory data, computing single-particle descriptors obtaining time-series +data that are easier to analyze, performing time-series data clustering, and extracting relevant information out of them. +dynsight contains also various auxiliary tools useful to data analysis, including, e.g., modules (:doc:`vision ` and :doc:`track `) +for resolving individual-object trajectories for many-body systems - e.g., experimental ones - for which these are +not readily available, denoising algorithms, and tools for assessing maximum information extraction from data. + +The documentation is available at: `dynsight.readthedocs.io `_ + +If you use ``dynsight``, please to cite the associated scientific paper: + +| S. Martino, M. Becchi, A. Tarzia, D. Rapetti & G. M. Pavan +| "dynsight: an open Python platform for simulation and experimental trajectory data analysis" +| arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ Installation ============ @@ -75,10 +75,6 @@ Examples There are examples throughout the documentation and available in the ``examples/`` directory of this repository. -There are also examples available in the ``cpctools`` repository -`here `_ - - Related works and packages ========================== @@ -97,10 +93,5 @@ Related works and packages Acknowledgements ================ -``dynsight`` is developed and mantained by the Pavan group at Politecnico di Torino, https://www.gmpavanlab.polito.it/. -Many group members provide, with their daily work, useful feedback that we gratefully acknowledge. - - -Previously in `cpctools`_. - -.. _`cpctools`: https://github.com/GMPavanLab/cpctools +``dynsight`` is developed and mantained by the G. M. Pavan group at Politecnico di Torino, https://www.gmpavanlab.polito.it/. +Many group members continuously provide, with their daily work, useful feedback that we gratefully acknowledge. diff --git a/docs/source/index.rst b/docs/source/index.rst index 188799c8..d935b3b5 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -47,21 +47,21 @@ Overview ======== -``dynsight`` is structured to support a wide range of tasks commonly -encountered in the analysis of many-body dynamical systems. These tasks -include handling trajectory data, computing single-particle descriptors, -performing time-series clustering and conducting various auxiliary analyses. -To achieve this, dynsight is organized into specialized modules, each -addressing a specific aspect of this workflow. - +``dynsight`` is an open Python platform built to support a wide range of tasks commonly encountered +in the analysis of complex dynamical systems. The software contains and combines modules that allows +resolving and handling trajectory data, computing single-particle descriptors obtaining time-series +data that are easier to analyze, performing time-series data clustering, and extracting relevant information out of them. +dynsight contains also various auxiliary tools useful to data analysis, including, e.g., modules (:doc:`vision ` and :doc:`track `) +for resolving individual-object trajectories for many-body systems - e.g., experimental ones - for which these are +not readily available, denoising algorithms, and tools for assessing maximum information extraction from data. + The software is available at: `www.github.com/GMPavanLab/dynsight `_ - - -If you use ``dynsight`` please cite: - -S. Martino, M. Becchi, A. Tarzia, D. Rapetti, G. M. Pavan, -*dynsight: an open Python platform for simulation and experimental trajectory data analysis*, -arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ + +If you use ``dynsight``, please to cite the associated scientific paper: + +| S. Martino, M. Becchi, A. Tarzia, D. Rapetti & G. M. Pavan +| "dynsight: an open Python platform for simulation and experimental trajectory data analysis" +| arXiv (2025), DOI: `10.48550/arXiv.2510.23493 `_ Installation ============ @@ -121,10 +121,6 @@ Examples There are examples throughout the documentation and available in the ``examples/`` directory of this repository. -There are also examples available in the ``cpctools`` repository -`here `_ - - Related works and packages ========================== @@ -143,13 +139,9 @@ Related works and packages Acknowledgements ================ -``dynsight`` is developed and mantained by the Pavan group at Politecnico di Torino, https://www.gmpavanlab.polito.it/. -Many group members provide, with their daily work, useful feedback that we gratefully acknowledge. - - -Previously in `cpctools`_. +``dynsight`` is developed and mantained by the G. M. Pavan group at Politecnico di Torino, https://www.gmpavanlab.polito.it/. +Many group members continuously provide, with their daily work, useful feedback that we gratefully acknowledge. -.. _`cpctools`: https://github.com/GMPavanLab/cpctools Indices and tables ------------------ From 9450e041e626481b1b265e39ec3747f2b5306571 Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 13 Nov 2025 16:58:21 +0100 Subject: [PATCH 28/30] Minor fix. --- README.rst | 2 +- docs/source/index.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index ba3c15fb..2e14b473 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ Overview in the analysis of complex dynamical systems. The software contains and combines modules that allows resolving and handling trajectory data, computing single-particle descriptors obtaining time-series data that are easier to analyze, performing time-series data clustering, and extracting relevant information out of them. -dynsight contains also various auxiliary tools useful to data analysis, including, e.g., modules (:doc:`vision ` and :doc:`track `) +``dynsight`` contains also various auxiliary tools useful to data analysis, including, e.g., modules (:doc:`vision ` and :doc:`track `) for resolving individual-object trajectories for many-body systems - e.g., experimental ones - for which these are not readily available, denoising algorithms, and tools for assessing maximum information extraction from data. diff --git a/docs/source/index.rst b/docs/source/index.rst index d935b3b5..2687cc1e 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -51,7 +51,7 @@ Overview in the analysis of complex dynamical systems. The software contains and combines modules that allows resolving and handling trajectory data, computing single-particle descriptors obtaining time-series data that are easier to analyze, performing time-series data clustering, and extracting relevant information out of them. -dynsight contains also various auxiliary tools useful to data analysis, including, e.g., modules (:doc:`vision ` and :doc:`track `) +``dynsight`` contains also various auxiliary tools useful to data analysis, including, e.g., modules (:doc:`vision ` and :doc:`track `) for resolving individual-object trajectories for many-body systems - e.g., experimental ones - for which these are not readily available, denoising algorithms, and tools for assessing maximum information extraction from data. From 5fdd3468b6b23a0f5dce9935147d244da2deba3d Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 13 Nov 2025 17:22:50 +0100 Subject: [PATCH 29/30] Fixing infomeasure doc conflict. --- README.rst | 2 +- docs/source/index.rst | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 2e14b473..358107a3 100644 --- a/README.rst +++ b/README.rst @@ -88,7 +88,7 @@ Related works and packages * If you use tICA, please cite ``deeptime`` https://deeptime-ml.github.io/latest/index.html * If you use ``dynsight.vision``, please cite Ultralytics YOLO https://docs.ultralytics.com/it/models/yolo11/#usage-examples * If you use ``dynsight.track``, please cite Trackpy https://soft-matter.github.io/trackpy/dev/introduction.html - +* Entropy calculations are based on ``infomeasure`` https://doi.org/10.1038/s41598-025-14053-5 Acknowledgements ================ diff --git a/docs/source/index.rst b/docs/source/index.rst index 2687cc1e..a96c2d9f 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -134,6 +134,7 @@ Related works and packages * If you use tICA, please cite ``deeptime`` https://deeptime-ml.github.io/latest/index.html * If you use ``dynsight.vision``, please cite Ultralytics YOLO https://docs.ultralytics.com/it/models/yolo11/#usage-examples * If you use ``dynsight.track``, please cite Trackpy https://soft-matter.github.io/trackpy/dev/introduction.html +* Entropy calculations are based on ``infomeasure`` https://doi.org/10.1038/s41598-025-14053-5 Acknowledgements From e552ccff845532c16919569d24e285a215a163ad Mon Sep 17 00:00:00 2001 From: SimoneMartino98 Date: Thu, 13 Nov 2025 17:29:30 +0100 Subject: [PATCH 30/30] fixed readme links. --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 358107a3..7fde8945 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,8 @@ Overview in the analysis of complex dynamical systems. The software contains and combines modules that allows resolving and handling trajectory data, computing single-particle descriptors obtaining time-series data that are easier to analyze, performing time-series data clustering, and extracting relevant information out of them. -``dynsight`` contains also various auxiliary tools useful to data analysis, including, e.g., modules (:doc:`vision ` and :doc:`track `) +``dynsight`` contains also various auxiliary tools useful to data analysis, including, e.g., modules +(`vision `_ and `track `_) for resolving individual-object trajectories for many-body systems - e.g., experimental ones - for which these are not readily available, denoising algorithms, and tools for assessing maximum information extraction from data.