@@ -1065,6 +1065,73 @@ def test_update_force_torque_matrices_united_atom(self):
10651065 np .testing .assert_array_equal (torque_avg ["ua" ][key ], t_mat_mock )
10661066 self .assertEqual (frame_counts ["ua" ][key ], 1 )
10671067
1068+ def test_update_force_torque_matrices_united_atom_increment (self ):
1069+ """
1070+ Test that `update_force_torque_matrices` correctly updates force and torque
1071+ matrices for the 'united_atom' level when the key already exists.
1072+ """
1073+ level_manager = LevelManager ()
1074+ entropy_manager = MagicMock ()
1075+ mol = MagicMock ()
1076+
1077+ # Simulate one residue with two atoms
1078+ residue = MagicMock ()
1079+ residue .atoms .indices = [0 , 1 ]
1080+ mol .residues = [residue ]
1081+ mol .trajectory .__getitem__ .return_value = None
1082+
1083+ selected_atoms = MagicMock ()
1084+ entropy_manager ._run_manager .new_U_select_atom .return_value = selected_atoms
1085+ selected_atoms .trajectory .__getitem__ .return_value = None
1086+
1087+ f_mat_1 = np .array ([[1.0 ]], dtype = np .float64 )
1088+ t_mat_1 = np .array ([[2.0 ]], dtype = np .float64 )
1089+ f_mat_2 = np .array ([[3.0 ]], dtype = np .float64 )
1090+ t_mat_2 = np .array ([[4.0 ]], dtype = np .float64 )
1091+
1092+ level_manager .get_matrices = MagicMock (return_value = (f_mat_1 , t_mat_1 ))
1093+
1094+ force_avg = {"ua" : {}, "res" : [None ], "poly" : [None ]}
1095+ torque_avg = {"ua" : {}, "res" : [None ], "poly" : [None ]}
1096+ frame_counts = {"ua" : {}, "res" : [None ], "poly" : [None ]}
1097+
1098+ # First call: initialize
1099+ level_manager .update_force_torque_matrices (
1100+ entropy_manager = entropy_manager ,
1101+ mol = mol ,
1102+ group_id = 0 ,
1103+ level = "united_atom" ,
1104+ level_list = ["residue" , "united_atom" ],
1105+ time_index = 0 ,
1106+ num_frames = 10 ,
1107+ force_avg = force_avg ,
1108+ torque_avg = torque_avg ,
1109+ frame_counts = frame_counts ,
1110+ )
1111+
1112+ # Second call: update
1113+ level_manager .get_matrices = MagicMock (return_value = (f_mat_2 , t_mat_2 ))
1114+
1115+ level_manager .update_force_torque_matrices (
1116+ entropy_manager = entropy_manager ,
1117+ mol = mol ,
1118+ group_id = 0 ,
1119+ level = "united_atom" ,
1120+ level_list = ["residue" , "united_atom" ],
1121+ time_index = 1 ,
1122+ num_frames = 10 ,
1123+ force_avg = force_avg ,
1124+ torque_avg = torque_avg ,
1125+ frame_counts = frame_counts ,
1126+ )
1127+
1128+ expected_force = f_mat_1 + (f_mat_2 - f_mat_1 ) / 2
1129+ expected_torque = t_mat_1 + (t_mat_2 - t_mat_1 ) / 2
1130+
1131+ np .testing .assert_array_almost_equal (force_avg ["ua" ][(0 , 0 )], expected_force )
1132+ np .testing .assert_array_almost_equal (torque_avg ["ua" ][(0 , 0 )], expected_torque )
1133+ self .assertEqual (frame_counts ["ua" ][(0 , 0 )], 2 )
1134+
10681135 def test_update_force_torque_matrices_residue (self ):
10691136 """
10701137 Test that `update_force_torque_matrices` correctly updates force and torque
0 commit comments