Author: bugman Date: Mon Dec 14 17:53:08 2009 New Revision: 10095 URL: http://svn.gna.org/viewcvs/relax?rev=10095&view=rev Log: Added a catch for bug #14941 (https://gna.org/bugs/index.php?14941) to the relax system tests. This uses truncated data (first 2 residues), also randomised, to reproduce the bug. Added: 1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/ 1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/local_tm_trunc.bz2 (with props) 1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/sphere_trunc.bz2 (with props) 1.3/test_suite/system_tests/scripts/model_free/ 1.3/test_suite/system_tests/scripts/model_free/bug_14941_local_tm_global_selection.py Modified: 1.3/test_suite/system_tests/model_free.py 1.3/test_suite/unit_tests/_maths_fns/test_rotation_matrix.py Added: 1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/local_tm_trunc.bz2 URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/local_tm_trunc.bz2?rev=10095&view=auto ============================================================================== Binary file - no diff available. Propchange: 1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/local_tm_trunc.bz2 ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: 1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/sphere_trunc.bz2 URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/sphere_trunc.bz2?rev=10095&view=auto ============================================================================== Binary file - no diff available. Propchange: 1.3/test_suite/shared_data/model_free/bug_14941_local_tm_global_selection/sphere_trunc.bz2 ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Modified: 1.3/test_suite/system_tests/model_free.py URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/system_tests/model_free.py?rev=10095&r1=10094&r2=10095&view=diff ============================================================================== --- 1.3/test_suite/system_tests/model_free.py (original) +++ 1.3/test_suite/system_tests/model_free.py Mon Dec 14 17:53:08 2009 @@ -164,6 +164,13 @@ # Execute the script. self.relax.interpreter.run(script_file=sys.path[-1] + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'bug_14872_unicode_selection.py') + + + def test_bug_14941_local_tm_global_selection(self): + """Test catching bug #14941, the local tm global model selection problem as submitted by Mikaela Stewart (mikaela dot stewart att gmail dot com).""" + + # Execute the script. + self.relax.interpreter.run(script_file=sys.path[-1] + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'model_free'+sep+'bug_14941_local_tm_global_selection.py') def test_bugs_12582_12591_12607(self): Added: 1.3/test_suite/system_tests/scripts/model_free/bug_14941_local_tm_global_selection.py URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/system_tests/scripts/model_free/bug_14941_local_tm_global_selection.py?rev=10095&view=auto ============================================================================== --- 1.3/test_suite/system_tests/scripts/model_free/bug_14941_local_tm_global_selection.py (added) +++ 1.3/test_suite/system_tests/scripts/model_free/bug_14941_local_tm_global_selection.py Mon Dec 14 17:53:08 2009 @@ -1,0 +1,31 @@ +"""This system test catches the local tm global model selection bug submitted by Mikaela Stewart (mikaela dot stewart att gmail dot com). + +The bug is: + - Bug #14941 (https://gna.org/bugs/?14941). +""" + +# Python module imports. +from os import sep +import sys + + +# Path of the files. +path = sys.path[-1] + sep+'test_suite'+sep+'shared_data'+sep+'model_free'+sep+'bug_14941_local_tm_global_selection' + +# Local tm data. +pipe.create(pipe_name='local_tm', pipe_type='mf') +results.read(file='local_tm_trunc', dir=path) + +# Sphere data. +pipe.create(pipe_name='sphere', pipe_type='mf') +results.read(file='sphere_trunc', dir=path) + +# Model selection. +model_selection(method='AIC', modsel_pipe='final', pipes=['local_tm', 'sphere']) +results.write(file='devnull', dir=None, compress_type=1, force=True) + +# Monte Carlo simulation setup. +monte_carlo.setup(number=200) +monte_carlo.create_data(method='back_calc') +monte_carlo.initial_values() + Modified: 1.3/test_suite/unit_tests/_maths_fns/test_rotation_matrix.py URL: http://svn.gna.org/viewcvs/relax/1.3/test_suite/unit_tests/_maths_fns/test_rotation_matrix.py?rev=10095&r1=10094&r2=10095&view=diff ============================================================================== --- 1.3/test_suite/unit_tests/_maths_fns/test_rotation_matrix.py (original) +++ 1.3/test_suite/unit_tests/_maths_fns/test_rotation_matrix.py Mon Dec 14 17:53:08 2009 @@ -58,6 +58,10 @@ # Print out. print("\n\n# Checking the %s() and %s() conversions.\n" % (euler_to_R.__name__, R_to_euler.__name__)) + + # A small number. + epsilon = 1e-15 + # End angles. if alpha_end == None: alpha_end = alpha_start @@ -71,6 +75,11 @@ print(("\talpha: %s" % alpha_start)) print(("\tbeta: %s" % beta_start)) print(("\tgamma: %s\n" % gamma_start)) + print("End angles:") + print(("\talpha: %s" % alpha_end)) + print(("\tbeta: %s" % beta_end)) + print(("\tgamma: %s\n" % gamma_end)) + # Generate the rotation matrix. euler_to_R(alpha_start, beta_start, gamma_start, R) @@ -86,15 +95,38 @@ print(("\tgamma: %s\n" % gamma_new)) # Wrap the angles. - alpha_new = wrap_angles(alpha_new, 0, 2*pi) - beta_new = wrap_angles(beta_new, 0, 2*pi) - gamma_new = wrap_angles(gamma_new, 0, 2*pi) + alpha_new = wrap_angles(alpha_new, 0-epsilon, 2*pi-epsilon) + beta_new = wrap_angles(beta_new, 0-epsilon, 2*pi-epsilon) + gamma_new = wrap_angles(gamma_new, 0-epsilon, 2*pi-epsilon) # Print out. print("New angles (wrapped):") print(("\talpha: %s" % alpha_new)) print(("\tbeta: %s" % beta_new)) print(("\tgamma: %s\n" % gamma_new)) + + # Second solution required! + if abs(beta_end - beta_new) > 1e-7: + # Collapse the multiple beta solutions. + if beta_new < pi: + alpha_new = alpha_new + pi + beta_new = pi - beta_new + gamma_new = gamma_new + pi + else: + alpha_new = alpha_new + pi + beta_new = 3*pi - beta_new + gamma_new = gamma_new + pi + + # Wrap the angles. + alpha_new = wrap_angles(alpha_new, 0-epsilon, 2*pi-epsilon) + beta_new = wrap_angles(beta_new, 0-epsilon, 2*pi-epsilon) + gamma_new = wrap_angles(gamma_new, 0-epsilon, 2*pi-epsilon) + + # Print out. + print("New angles (second solution):") + print(("\talpha: %s" % alpha_new)) + print(("\tbeta: %s" % beta_new)) + print(("\tgamma: %s\n" % gamma_new)) # Checks. self.assertAlmostEqual(alpha_end, alpha_new) @@ -570,13 +602,15 @@ self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 0.0, 0.0, 0.0) self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, 0.0, 0.0) self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 0.0, 1.0, 0.0) - self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 0.0, 0.0, 1.0, alpha_end=1.0, gamma_end=0.0) + self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 0.0, 0.0, 1.0) self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, 1.0, 0.0) self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 0.0, 1.0, 1.0) - self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, 0.0, 1.0, alpha_end=2.0, gamma_end=0.0) + self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, 0.0, 1.0) self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, 1.0, 1.0) - self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, pi/2, 0.5, alpha_end=0.5, gamma_end=0.0) + self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, pi/2, 0.5) self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, pi, 0.5) + self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, -pi/2, 0.5, beta_end=-pi/2+2*pi) + self.check_return_conversion(euler_zxy_to_R, R_to_euler_zxy, 1.0, 1.5*pi, 0.5, beta_end=pi/2) def test_R_to_euler_zxz(self): @@ -600,6 +634,7 @@ """Test the rotation matrix to zyx Euler angle conversion.""" # Check random numbers, then the problematic angles. + self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, 5.0, 2.0, 1.0) self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, uniform(0, 2*pi), uniform(0, pi), uniform(0, 2*pi)) self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, 0.0, 0.0, 0.0) self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, 1.0, 0.0, 0.0) @@ -610,7 +645,7 @@ self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, 1.0, 0.0, 1.0) self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, 1.0, 1.0, 1.0) self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, 1.0, pi/2, 0.5) - self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, 1.0, pi, 0.5) + self.check_return_conversion(euler_zyx_to_R, R_to_euler_zyx, 1.0, pi, 0.5, alpha_end=1.0+pi, beta_end=0.0, gamma_end=0.5+pi) def test_R_to_euler_zyz(self):