@@ -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