Skip to content

Commit e2d8402

Browse files
committed
Fix issues after rebase
1 parent 1a384fa commit e2d8402

12 files changed

Lines changed: 80 additions & 51 deletions

File tree

MDANSE/Src/MDANSE/Framework/Converters/MDAnalysis.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ class MDAnalysis(Converter):
7171
choices=mda._READERS.keys() | {None}, aliases={"AUTO": None}, default=None
7272
)
7373
continuous = Boolean(label="Continuous frame stitching", default=False)
74-
coordinate_files = ManyPath(
74+
coordinate_files = ManyPath[MDAnalysisTopology](
7575
mode="r",
7676
label="Coordinate file",
77-
depends={
77+
on_set_depends={
7878
"topology_format": "topology_format",
7979
"coordinate_format": "coordinate_format",
8080
"topology": "topology_file",

MDANSE/Src/MDANSE/Framework/Jobs/DynamicIncoherentStructureFactor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def initialize(self):
9292

9393
self.generator = self.q_vectors.generator
9494
self.numberOfSteps = len(self.trajectory.atom_indices)
95-
self._nQShells = self.generator.n_shells
95+
self._nQShells = len(self.generator.q_vectors)
9696
self._nFrames = self.frame_window.n_frames
9797
self._atoms = self.trajectory.atom_names
9898
self.resolution = self.instrument_resolution.run_resolution
@@ -213,7 +213,7 @@ def run_step(self, index):
213213

214214
disf_per_q_shell = {
215215
q: np.zeros((self._nFrames,), dtype=np.float64)
216-
for q in self.generator.shells
216+
for q in self.generator.q_vectors
217217
}
218218

219219
n_configs = self.frame_window.n_configs

MDANSE/Src/MDANSE/Framework/Jobs/IJob.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717

1818
import abc
1919
import json
20-
import multiprocessing
21-
import os
2220
import pprint
2321
import queue
2422
import random
@@ -41,7 +39,7 @@
4139
from MDANSE.Framework.Jobs.JobStatus import JobStates, JobStatus
4240
from MDANSE.Framework.OutputVariables.IOutputVariable import OutputData
4341
from MDANSE.Framework.Parameters.Parameters import Configurable
44-
from MDANSE.MLogging import FMT, LOG
42+
from MDANSE.MLogging import FMT, LOG, LogLevels
4543

4644
if TYPE_CHECKING:
4745
from collections.abc import Sequence
@@ -650,7 +648,7 @@ def finalize(self):
650648
return None
651649
return templateFile
652650

653-
def add_log_file_handler(self, filename: Path, level: str) -> None:
651+
def add_log_file_handler(self, filename: Path, level: LogLevels) -> None:
654652
"""Adds a file handle which is used to write the jobs logs.
655653
656654
Parameters
@@ -668,7 +666,7 @@ def add_log_file_handler(self, filename: Path, level: str) -> None:
668666
# with multiprocessing jobs
669667
fh.set_name(str(filename))
670668
fh.setFormatter(FMT)
671-
fh.setLevel(level)
669+
fh.setLevel(level.value)
672670
LOG.addHandler(fh)
673671
LOG.debug(f"Log handler added for {filename}.")
674672

MDANSE/Src/MDANSE/Framework/Parameters/BaseTypes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ def validate(self, value: Path | str, deps: Depends, /) -> Path | None:
427427
return value
428428

429429

430-
class ManyPath(PathParam):
430+
class ManyPath(PathParam[CB]):
431431
"""Parameter for specifying multiple files simultaneously.
432432
433433
Files can be defined as either a Sequence of paths or

MDANSE/Src/MDANSE/Framework/Parameters/Choices.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,5 @@ def validate(self, value: str | type[SC], deps: Depends) -> SC:
197197
value = cast("type[SC]", super().validate(value, deps))
198198
# Instantiate the object.
199199
return value(
200-
**{
201-
key: deps[arg] if isinstance(arg, DescID) else arg
202-
for key, arg in self.instance_args.items()
203-
}
200+
**{key: deps.get(arg, arg) for key, arg in self.instance_args.items()}
204201
)

MDANSE/Src/MDANSE/Framework/Parameters/Parameters.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def description_summary(self) -> str:
8686
@property
8787
def texttable_lengths(self) -> tuple[int, int, int]:
8888
"""Return lengths of columns in texttable."""
89-
return len(self.name), len(self.default), 50
89+
return len(self.name), len(str(self.default)), 50
9090

9191

9292
@runtime_checkable
@@ -375,7 +375,7 @@ def build_doc_texttable(cls, doclist: Iterable[ParamInfo]) -> str:
375375
columns = ("Parameter", "Default value", "Description")
376376

377377
size_iter = prepend(map(len, columns), (v.texttable_lengths for v in doclist))
378-
len_name, len_default, len_desc = unzip(size_iter)
378+
len_name, len_default, len_desc = unzip([(x, y, z) for x, y, z in size_iter])
379379
sizes = (max(len_name), max(len_default), max(len_desc))
380380

381381
data_line = "| " + "| ".join(f"{{}}:<{size}" for size in sizes) + "|\n"
@@ -904,7 +904,7 @@ def validate(self, value: P, deps: Depends, /) -> T:
904904

905905
elif self.choices and is_enum(self.choices): # Enum
906906
try:
907-
out = self.choices(out).value
907+
out = self.choices(out)
908908
except ValueError:
909909
raise ConfigError(
910910
f"Value ({out!r}) not in choices ({cjoin(choice.name for choice in self.choices)})."

MDANSE/Src/MDANSE/Framework/Parameters/QVectors.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@
1515
#
1616
from __future__ import annotations
1717

18-
from typing import Any
18+
from typing import TYPE_CHECKING, Any
1919

2020
from MDANSE.Framework.Parameters.Choices import SubclassChoice
21-
from MDANSE.Framework.Parameters.Parameters import ConfigError, Configurable
21+
from MDANSE.Framework.Parameters.Parameters import (
22+
ConfigError,
23+
Configurable,
24+
ConfigureDescriptor,
25+
CustomConfig,
26+
)
27+
from MDANSE.Framework.Parameters.UtilTypes import Depends, DescID, PredictionResult
2228
from MDANSE.Framework.QVectors.IQVectors import IQVectors
2329

24-
from .Parameters import CustomConfig
25-
from .UtilTypes import DescID
30+
if TYPE_CHECKING:
31+
from collections.abc import Iterator
2632

2733

2834
class QVectors(CustomConfig):
@@ -48,7 +54,8 @@ def __set__(self, owner: Configurable, value):
4854

4955
match value:
5056
case (generator, params):
51-
self.generator, self.generator.configuration = generator, params
57+
self.generator = generator
58+
self.generator.configuration = params
5259
case dict():
5360
self.generator.configuration = value
5461
case IQVectors():
@@ -58,9 +65,18 @@ def __set__(self, owner: Configurable, value):
5865
case _:
5966
super().__set__(owner, value)
6067

61-
def vaidate(self, value: Configurable):
68+
def validate(self, conf: ConfigureDescriptor, value: Configurable):
6269
try:
63-
self.generator.generate()
64-
except Exception as err:
65-
raise ConfigError("Invalid or incomplete QVector configuration.") from err
66-
return value
70+
return self.generator.validate(conf, value)
71+
except Exception:
72+
return value
73+
74+
def preview_output_axis(self) -> Iterator[PredictionResult]:
75+
"""Output the values of |Q| from current parameters.
76+
77+
Yields
78+
------
79+
PredictionResult
80+
Prediction.
81+
"""
82+
yield PredictionResult("Q Shells", self.generator.shells, "1/nm")

MDANSE/Src/MDANSE/Framework/Parsers/MDAnalysis.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class MDAnalysisTopology(Parser):
4343

4444
def __init__(self, _desc, filename: Sequence[Path | str], deps: Depends):
4545
self.filename = tuple(Path(pth).expanduser() for pth in filename)
46+
print(_desc, filename, deps)
4647
self.trajectory = self.load(deps)
4748

4849
def load(self, deps):

MDANSE/Src/MDANSE/Framework/QVectors/GridQVectors.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from more_itertools import map_reduce
2222

2323
from MDANSE.Framework.Parameters import Float, Range
24+
from MDANSE.Framework.QVectors.IQVectors import IQVectors
2425
from MDANSE.Framework.QVectors.LatticeQVectors import LatticeQVectors
2526

2627

@@ -54,17 +55,19 @@ class GridQVectors(LatticeQVectors):
5455
default=0.01,
5556
)
5657

57-
def _generate(self):
58+
def _get_grid(self):
5859
nh = len(self.hrange)
5960
nk = len(self.krange)
6061
nl = len(self.lrange)
6162

62-
hkls = np.mgrid[
63+
return np.mgrid[
6364
self.hrange[0] : self.hrange[-1] + 1,
6465
self.krange[0] : self.krange[-1] + 1,
6566
self.lrange[0] : self.lrange[-1] + 1,
66-
]
67-
hkls = hkls.reshape(3, nh * nk * nl)
67+
].reshape(3, nh * nk * nl)
68+
69+
def _get_qgroups(self):
70+
hkls = self._get_grid()
6871

6972
# The k matrix (3,n_hkls)
7073
vects = self.hkl_to_qvectors(hkls, self._unit_cell)
@@ -78,7 +81,12 @@ def _generate(self):
7881
inds = np.digitize(dists, bins) - 1
7982

8083
dists = enumerate(bins[inds])
84+
8185
q_groups = map_reduce(dists, itemgetter(1), itemgetter(0))
86+
return hkls, vects, {key: q_groups[key] for key in sorted(q_groups)}
87+
88+
def _generate(self):
89+
hkls, vects, q_groups = self._get_qgroups()
8290
# Functions rely on ordered dicts for some reason?
8391
self.q_groups = {key: q_groups[key] for key in sorted(q_groups)}
8492

@@ -102,4 +110,4 @@ def _generate(self):
102110

103111
@property
104112
def shells(self):
105-
return list(self.q_groups.keys())
113+
return sorted(self.q_vectors)

MDANSE/Src/MDANSE/Framework/QVectors/IQVectors.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@
1515
#
1616
from __future__ import annotations
1717

18-
import abc
1918
from typing import TYPE_CHECKING
2019

2120
import numpy as np
2221

2322
from MDANSE.Core.SubclassFactory import SubclassFactory
24-
from MDANSE.Framework.Parameters.Parameters import Configurable
25-
from MDANSE.Framework.Parameters.UtilTypes import PredictionResult
23+
from MDANSE.Framework.Parameters.Parameters import (
24+
ConfigError,
25+
Configurable,
26+
ConfigureDescriptor,
27+
)
2628
from MDANSE.MLogging import LOG
2729
from MDANSE.MolecularDynamics.Trajectory import Trajectory
2830

2931
if TYPE_CHECKING:
30-
from collections.abc import Iterator
31-
3232
from MDANSE.Framework.OutputVariables.IOutputVariable import OutputData
3333
from MDANSE.MolecularDynamics.UnitCell import UnitCell
3434

@@ -68,6 +68,18 @@ def generate(self) -> bool:
6868
)
6969
return False
7070

71+
def validate(self, conf: ConfigureDescriptor, value: Configurable):
72+
try:
73+
# Force the setting (if we've reached this far)
74+
setattr(self, conf.private_name, value)
75+
self.generate()
76+
except Exception as err:
77+
import traceback
78+
79+
traceback.print_exception(err)
80+
raise ConfigError("Invalid or incomplete QVector configuration.") from err
81+
return value
82+
7183
@staticmethod
7284
def qvectors_to_hkl(
7385
vector_array: np.array,
@@ -161,13 +173,3 @@ def write_vectors_to_file(self, output_data: OutputData):
161173
units="au",
162174
axis="vector_generator/coordinates|index",
163175
)
164-
165-
def preview_output_axis(self) -> Iterator[PredictionResult]:
166-
"""Output the values of |Q| from current parameters.
167-
168-
Yields
169-
------
170-
PredictionResult
171-
Prediction.
172-
"""
173-
yield PredictionResult("Q Shells", self.shells, "1/nm")

0 commit comments

Comments
 (0)