Skip to content

Commit 218616c

Browse files
committed
separating the building of conformational states from the covariance matrices and entropy calculations.
1 parent 80ced0c commit 218616c

2 files changed

Lines changed: 113 additions & 51 deletions

File tree

CodeEntropy/entropy.py

Lines changed: 34 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,25 @@ def execute(self):
4747
"""
4848
start, end, step = self._get_trajectory_bounds()
4949
number_frames = self._get_number_frames(start, end, step)
50+
ve = VibrationalEntropy(
51+
self._run_manager,
52+
self._args,
53+
self._universe,
54+
self._data_logger,
55+
self._level_manager,
56+
)
57+
ce = ConformationalEntropy(
58+
self._run_manager,
59+
self._args,
60+
self._universe,
61+
self._data_logger,
62+
self._level_manager,
63+
)
5064

5165
self._handle_water_entropy(start, end, step)
5266
reduced_atom, number_molecules, levels = self._initialize_molecules()
5367

54-
force_matrices, torque_matrices, states_ua, states_res = (
68+
force_matrices, torque_matrices = (
5569
self._level_manager.build_covariance_matrices(
5670
self,
5771
reduced_atom,
@@ -64,6 +78,21 @@ def execute(self):
6478
)
6579
)
6680

81+
states_ua, states_res = (
82+
self._level_manager.build_conformational_states(
83+
self,
84+
reduced_atom,
85+
number_molecules,
86+
levels,
87+
start,
88+
end,
89+
step,
90+
number_frames,
91+
self._args.bin_width,
92+
ce,
93+
)
94+
)
95+
6796
self._compute_entropies(
6897
reduced_atom,
6998
number_molecules,
@@ -76,6 +105,8 @@ def execute(self):
76105
start,
77106
end,
78107
step,
108+
ve,
109+
ce,
79110
)
80111

81112
self._finalize_molecule_results()
@@ -136,6 +167,8 @@ def _compute_entropies(
136167
start,
137168
end,
138169
step,
170+
ve,
171+
ce,
139172
):
140173
"""
141174
Compute vibrational and conformational entropies for all molecules and levels.
@@ -163,51 +196,13 @@ def _compute_entropies(
163196
step (int): Step size for frame iteration.
164197
"""
165198
bin_width = self._args.bin_width
166-
ve = VibrationalEntropy(
167-
self._run_manager,
168-
self._args,
169-
self._universe,
170-
self._data_logger,
171-
self._level_manager,
172-
)
173-
ce = ConformationalEntropy(
174-
self._run_manager,
175-
self._args,
176-
self._universe,
177-
self._data_logger,
178-
self._level_manager,
179-
)
180199

181200
for mol_id in range(number_molecules):
182201
mol = self._get_molecule_container(reduced_atom, mol_id)
183202
for level in levels[mol_id]:
184203
highest = level == levels[mol_id][-1]
185204

186205
if level == "united_atom":
187-
for res_id, residue in enumerate(mol.residues):
188-
key = (mol_id, res_id)
189-
res_container = self._run_manager.new_U_select_atom(
190-
mol,
191-
f"index {residue.atoms.indices[0]}:"
192-
f"{residue.atoms.indices[-1]}",
193-
)
194-
heavy_res = self._run_manager.new_U_select_atom(
195-
res_container, "not name H*"
196-
)
197-
198-
states_ua[key] = (
199-
self._level_manager.compute_dihedral_conformations(
200-
heavy_res,
201-
level,
202-
ce,
203-
number_frames,
204-
bin_width,
205-
start,
206-
end,
207-
step,
208-
)
209-
)
210-
211206
self._process_united_atom_entropy(
212207
mol_id,
213208
mol,
@@ -222,10 +217,6 @@ def _compute_entropies(
222217
)
223218

224219
elif level == "residue":
225-
states_res = self._level_manager.compute_dihedral_conformations(
226-
mol, level, ce, number_frames, bin_width, start, end, step
227-
)
228-
229220
self._process_vibrational_entropy(
230221
mol_id,
231222
mol,

CodeEntropy/levels.py

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def select_levels(self, data_container):
4646

4747
# fragments is MDAnalysis terminology for what chemists would call molecules
4848
number_molecules = len(data_container.atoms.fragments)
49-
logger.debug("The number of molecules is {}.".format(number_molecules))
49+
logger.debug(f"The number of molecules is {number_molecules}.")
5050

5151
fragments = data_container.atoms.fragments
5252
levels = [[] for _ in range(number_molecules)]
@@ -265,20 +265,19 @@ def compute_dihedral_conformations(
265265
self,
266266
selector,
267267
level,
268-
ce,
269268
number_frames,
270269
bin_width,
271270
start,
272271
end,
273272
step,
273+
ce,
274274
):
275275
"""
276276
Compute dihedral conformations for a given selector and entropy level.
277277
278278
Parameters:
279279
selector (AtomGroup): Atom selection to compute dihedrals for.
280280
level (str): Entropy level ("united_atom" or "residue").
281-
ce (ConformationalEntropy): Conformational entropy calculator.
282281
number_frames (int): Number of frames to process.
283282
bin_width (float): Bin width for dihedral angle discretization.
284283
start (int): Start frame index.
@@ -750,8 +749,6 @@ def build_covariance_matrices(
750749
tuple: A tuple containing:
751750
- force_matrices (dict): Force covariance matrices by level.
752751
- torque_matrices (dict): Torque covariance matrices by level.
753-
- states_ua (dict): Conformational states at the united-atom level.
754-
- states_res (list): Conformational states at the residue level.
755752
"""
756753
force_matrices = {
757754
"ua": {},
@@ -763,8 +760,6 @@ def build_covariance_matrices(
763760
"res": [None] * number_molecules,
764761
"poly": [None] * number_molecules,
765762
}
766-
states_ua = {}
767-
states_res = [None] * number_molecules
768763

769764
for timestep in reduced_atom.trajectory[start:end:step]:
770765
time_index = timestep.frame - start
@@ -784,7 +779,7 @@ def build_covariance_matrices(
784779
torque_matrices,
785780
)
786781

787-
return force_matrices, torque_matrices, states_ua, states_res
782+
return force_matrices, torque_matrices
788783

789784
def update_force_torque_matrices(
790785
self,
@@ -896,3 +891,79 @@ def filter_zero_rows_columns(self, arg_matrix):
896891
logger.debug(f"arg_matrix: {arg_matrix}")
897892

898893
return arg_matrix
894+
895+
def build_conformational_states(
896+
self,
897+
entropy_manager,
898+
reduced_atom,
899+
number_molecules,
900+
levels,
901+
start,
902+
end,
903+
step,
904+
number_frames,
905+
bin_width,
906+
ce,
907+
):
908+
"""
909+
Construct the conformational states for each molecule at
910+
relevant levels.
911+
912+
Parameters:
913+
entropy_manager (EntropyManager): Instance of the EntropyManager
914+
reduced_atom (Universe): The reduced atom selection.
915+
number_molecules (int): Number of molecules in the system.
916+
levels (list): List of entropy levels per molecule.
917+
start (int): Start frame index.
918+
end (int): End frame index.
919+
step (int): Step size for frame iteration.
920+
number_frames (int): Total number of frames to process.
921+
922+
Returns:
923+
tuple: A tuple containing:
924+
- states_ua (dict): Conformational states at the united-atom level.
925+
- states_res (list): Conformational states at the residue level.
926+
"""
927+
states_ua = {}
928+
states_res = [None] * number_molecules
929+
930+
for mol_id in range(number_molecules):
931+
mol = entropy_manager._get_molecule_container(reduced_atom, mol_id)
932+
for level in levels[mol_id]:
933+
if level == "united_atom":
934+
for res_id, residue in enumerate(mol.residues):
935+
key = (mol_id, res_id)
936+
937+
res_container = entropy_manager._run_manager.new_U_select_atom(
938+
mol,
939+
f"index {residue.atoms.indices[0]}:"
940+
f"{residue.atoms.indices[-1]}",
941+
)
942+
heavy_res = entropy_manager._run_manager.new_U_select_atom(
943+
res_container, "not name H*"
944+
)
945+
946+
states_ua[key] = self.compute_dihedral_conformations(
947+
heavy_res,
948+
level,
949+
number_frames,
950+
bin_width,
951+
start,
952+
end,
953+
step,
954+
ce,
955+
)
956+
957+
if level == "res":
958+
states_res = self.compute_dihedral_conformations(
959+
mol,
960+
level,
961+
number_frames,
962+
bin_width,
963+
start,
964+
end,
965+
step,
966+
ce,
967+
)
968+
969+
return states_ua, states_res

0 commit comments

Comments
 (0)