Skip to content

Commit 444701d

Browse files
committed
fix unit tests for PR #200:
- Ensured that all classes and functions are using instances correctly - fix all unit and integration test
1 parent 2cb7a25 commit 444701d

File tree

9 files changed

+339
-165
lines changed

9 files changed

+339
-165
lines changed

CodeEntropy/dihedral_tools.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010
TimeElapsedColumn,
1111
)
1212

13-
from CodeEntropy.mda_universe_operations import UniverseOperations
14-
1513
logger = logging.getLogger(__name__)
1614

1715

@@ -21,10 +19,11 @@ class DihedralAnalysis:
2119
states needed for the conformational entropy functions.
2220
"""
2321

24-
def __init__(self):
22+
def __init__(self, universe_operations=None):
2523
"""
2624
Initialise with placeholders.
2725
"""
26+
self._universe_operations = universe_operations
2827
self.data_container = None
2928
self.states_ua = None
3029
self.states_res = None
@@ -67,7 +66,7 @@ def build_conformational_states(
6766

6867
for group_id in groups.keys():
6968
molecules = groups[group_id]
70-
mol = UniverseOperations.get_molecule_container(data_container, 0)
69+
mol = self._universe_operations.get_molecule_container(data_container, 0)
7170
num_residues = len(mol.residues)
7271
dihedrals_ua = [[] for _ in range(num_residues)]
7372
peaks_ua = [{} for _ in range(num_residues)]
@@ -80,11 +79,11 @@ def build_conformational_states(
8079
for res_id in range(num_residues):
8180
selection1 = mol.residues[res_id].atoms.indices[0]
8281
selection2 = mol.residues[res_id].atoms.indices[-1]
83-
res_container = UniverseOperations.new_U_select_atom(
82+
res_container = self._universe_operations.new_U_select_atom(
8483
mol,
8584
f"index {selection1}:" f"{selection2}",
8685
)
87-
heavy_res = UniverseOperations.new_U_select_atom(
86+
heavy_res = self._universe_operations.new_U_select_atom(
8887
res_container, "prop mass > 1.1"
8988
)
9089

@@ -265,7 +264,7 @@ def _identify_peaks(
265264
# loop over all molecules in the averaging group
266265
# dihedral angle values have a range from -180 to 180
267266
for molecule in molecules:
268-
mol = UniverseOperations.get_molecule_container(
267+
mol = self._universe_operations.get_molecule_container(
269268
data_container, molecule
270269
)
271270
number_frames = len(mol.trajectory)
@@ -342,7 +341,9 @@ def _assign_states(
342341
# get the values of the angle for the dihedral
343342
# dihedral angle values have a range from -180 to 180
344343
for molecule in molecules:
345-
mol = UniverseOperations.get_molecule_container(data_container, molecule)
344+
mol = self._universe_operations.get_molecule_container(
345+
data_container, molecule
346+
)
346347
number_frames = len(mol.trajectory)
347348
R = Dihedral(dihedrals).run()
348349
for dihedral_index in range(len(dihedrals)):

CodeEntropy/entropy.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
)
1616

1717
from CodeEntropy.config.logging_config import LoggingConfig
18-
from CodeEntropy.mda_universe_operations import UniverseOperations
1918

2019
logger = logging.getLogger(__name__)
2120
console = LoggingConfig.get_console()
@@ -36,6 +35,7 @@ def __init__(
3635
level_manager,
3736
group_molecules,
3837
dihedral_analysis,
38+
universe_operations,
3939
):
4040
"""
4141
Initializes the EntropyManager with required components.
@@ -56,6 +56,7 @@ def __init__(
5656
self._level_manager = level_manager
5757
self._group_molecules = group_molecules
5858
self._dihedral_analysis = dihedral_analysis
59+
self._universe_operations = universe_operations
5960
self._GAS_CONST = 8.3144598484848
6061

6162
def execute(self):
@@ -85,6 +86,7 @@ def execute(self):
8586
self._level_manager,
8687
self._group_molecules,
8788
self._dihedral_analysis,
89+
self._universe_operations,
8890
)
8991
ce = ConformationalEntropy(
9092
self._run_manager,
@@ -94,6 +96,7 @@ def execute(self):
9496
self._level_manager,
9597
self._group_molecules,
9698
self._dihedral_analysis,
99+
self._universe_operations,
97100
)
98101

99102
reduced_atom, number_molecules, levels, groups = self._initialize_molecules()
@@ -274,7 +277,7 @@ def _compute_entropies(
274277
)
275278

276279
for group_id in groups.keys():
277-
mol = UniverseOperations.get_molecule_container(
280+
mol = self._universe_operations.get_molecule_container(
278281
reduced_atom, groups[group_id][0]
279282
)
280283

@@ -284,7 +287,7 @@ def _compute_entropies(
284287
group_residue_count = len(groups[group_id])
285288
group_atom_count = 0
286289
for mol_id in groups[group_id]:
287-
each_mol = UniverseOperations.get_molecule_container(
290+
each_mol = self._universe_operations.get_molecule_container(
288291
reduced_atom, mol_id
289292
)
290293
group_atom_count += len(each_mol.atoms)
@@ -398,7 +401,7 @@ def _get_reduced_universe(self):
398401
# Otherwise create a new (smaller) universe based on the selection
399402
u = self._universe
400403
selection_string = self._args.selection_string
401-
reduced = UniverseOperations.new_U_select_atom(u, selection_string)
404+
reduced = self._universe_operations.new_U_select_atom(u, selection_string)
402405
name = f"{len(reduced.trajectory)}_frame_dump_atom_selection"
403406
self._run_manager.write_universe(reduced, name)
404407

@@ -810,6 +813,7 @@ def __init__(
810813
level_manager,
811814
group_molecules,
812815
dihedral_analysis,
816+
universe_operations,
813817
):
814818
"""
815819
Initializes the VibrationalEntropy manager with all required components and
@@ -823,6 +827,7 @@ def __init__(
823827
level_manager,
824828
group_molecules,
825829
dihedral_analysis,
830+
universe_operations,
826831
)
827832
self._PLANCK_CONST = 6.62607004081818e-34
828833

@@ -958,6 +963,7 @@ def __init__(
958963
level_manager,
959964
group_molecules,
960965
dihedral_analysis,
966+
universe_operations,
961967
):
962968
"""
963969
Initializes the ConformationalEntropy manager with all required components and
@@ -971,6 +977,7 @@ def __init__(
971977
level_manager,
972978
group_molecules,
973979
dihedral_analysis,
980+
universe_operations,
974981
)
975982

976983
def conformational_entropy_calculation(self, states):
@@ -1028,6 +1035,7 @@ def __init__(
10281035
level_manager,
10291036
group_molecules,
10301037
dihedral_analysis,
1038+
universe_operations,
10311039
):
10321040
"""
10331041
Initializes the OrientationalEntropy manager with all required components and
@@ -1041,6 +1049,7 @@ def __init__(
10411049
level_manager,
10421050
group_molecules,
10431051
dihedral_analysis,
1052+
universe_operations,
10441053
)
10451054

10461055
def orientational_entropy_calculation(self, neighbours_dict):

CodeEntropy/levels.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
TimeElapsedColumn,
1010
)
1111

12-
from CodeEntropy.mda_universe_operations import UniverseOperations
13-
1412
logger = logging.getLogger(__name__)
1513

1614

@@ -24,7 +22,7 @@ class LevelManager:
2422
analysis.
2523
"""
2624

27-
def __init__(self):
25+
def __init__(self, universe_operations):
2826
"""
2927
Initializes the LevelManager with placeholders for level-related data,
3028
including translational and rotational axes, number of beads, and a
@@ -35,6 +33,7 @@ def __init__(self):
3533
self._trans_axes = None
3634
self._rot_axes = None
3735
self._number_of_beads = None
36+
self._universe_operations = universe_operations
3837

3938
def select_levels(self, data_container):
4039
"""
@@ -699,7 +698,7 @@ def build_covariance_matrices(
699698
for time_index, _ in zip(indices, reduced_atom.trajectory[start:end:step]):
700699
for group_id, molecules in groups.items():
701700
for mol_id in molecules:
702-
mol = UniverseOperations.get_molecule_container(
701+
mol = self._universe_operations.get_molecule_container(
703702
reduced_atom, mol_id
704703
)
705704
for level in levels[mol_id]:
@@ -804,7 +803,7 @@ def update_force_torque_matrices(
804803
if level == "united_atom":
805804
for res_id, residue in enumerate(mol.residues):
806805
key = (group_id, res_id)
807-
res = UniverseOperations.new_U_select_atom(
806+
res = self._universe_operations.new_U_select_atom(
808807
mol, f"index {residue.atoms.indices[0]}:{residue.atoms.indices[-1]}"
809808
)
810809

CodeEntropy/mda_universe_operations.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def __init__(self):
1818
"""
1919
self._universe = None
2020

21-
def new_U_select_frame(u, start=None, end=None, step=1):
21+
def new_U_select_frame(self, u, start=None, end=None, step=1):
2222
"""Create a reduced universe by dropping frames according to
2323
user selection.
2424
@@ -60,7 +60,7 @@ def new_U_select_frame(u, start=None, end=None, step=1):
6060

6161
return u2
6262

63-
def new_U_select_atom(u, select_string="all"):
63+
def new_U_select_atom(self, u, select_string="all"):
6464
"""Create a reduced universe by dropping atoms according to
6565
user selection.
6666
@@ -95,7 +95,7 @@ def new_U_select_atom(u, select_string="all"):
9595

9696
return u2
9797

98-
def get_molecule_container(universe, molecule_id):
98+
def get_molecule_container(self, universe, molecule_id):
9999
"""
100100
Extracts the atom group corresponding to a single molecule from the universe.
101101
@@ -110,12 +110,9 @@ def get_molecule_container(universe, molecule_id):
110110
frag = universe.atoms.fragments[molecule_id]
111111
selection_string = f"index {frag.indices[0]}:{frag.indices[-1]}"
112112

113-
# Build a new universe with only the one molecule
114-
u2 = UniverseOperations.new_U_select_atom(universe, selection_string)
113+
return self.new_U_select_atom(universe, selection_string)
115114

116-
return u2
117-
118-
def merge_forces(tprfile, trrfile, forcefile, fileformat=None, kcal=False):
115+
def merge_forces(self, tprfile, trrfile, forcefile, fileformat=None, kcal=False):
119116
"""
120117
Creates a universe by merging the coordinates and forces from
121118
different input files.

CodeEntropy/run.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,24 +251,29 @@ def run_entropy_workflow(self):
251251
fileformat = args.file_format
252252
kcal_units = args.kcal_force_units
253253

254+
# Create shared UniverseOperations instance
255+
universe_operations = UniverseOperations()
256+
254257
if forcefile is None:
255258
logger.debug(f"Loading Universe with {tprfile} and {trrfile}")
256259
u = mda.Universe(tprfile, trrfile, format=fileformat)
257260
else:
258-
u = UniverseOperations.merge_forces(
261+
u = universe_operations.merge_forces(
259262
tprfile, trrfile, forcefile, fileformat, kcal_units
260263
)
261264

262265
self._config_manager.input_parameters_validation(u, args)
263266

264267
# Create LevelManager instance
265-
level_manager = LevelManager()
268+
level_manager = LevelManager(universe_operations)
266269

267270
# Create GroupMolecules instance
268271
group_molecules = GroupMolecules()
269272

270-
# Create DihedralAnalysis instance
271-
dihedral_analysis = DihedralAnalysis()
273+
# Create shared DihedralAnalysis with injected universe_operations
274+
dihedral_analysis = DihedralAnalysis(
275+
universe_operations=universe_operations
276+
)
272277

273278
# Inject all dependencies into EntropyManager
274279
entropy_manager = EntropyManager(
@@ -279,6 +284,7 @@ def run_entropy_workflow(self):
279284
level_manager=level_manager,
280285
group_molecules=group_molecules,
281286
dihedral_analysis=dihedral_analysis,
287+
universe_operations=universe_operations,
282288
)
283289

284290
entropy_manager.execute()

0 commit comments

Comments
 (0)