* Improvements for the Docker container scripts and documentation in devel_scripts/Docker/.
* Automated testing of relax via Travis-CI.
* New user function [http://www.nmr-relax.com/manual/frame_order_decompose.html frame_order.decompose user function] for a new representation of the frame order analysis results.* Addition of the new user functions [http://www.nmr-relax.com/manual/structure_add_helix.html structure.add_helix ] and [http://www.nmr-relax.com/manual/structure_add_sheet.html structure.add_sheet ] for manually defining secondary structure.* Speed up of the 'fit to first' algorithm in the [http://www.nmr-relax.com/manual/structure_superimpose.html structure.superimpose ] user function.
* Significant improvements to the checking of arguments passed into user functions, and the resultant error messages for invalid arguments.
* Improvements and fixes for the RelaxError messages to better explain user errors.
* Added release instructions for creating the README.rst files for the download area. This is for using the custom html2rest at ttps://sourceforge.net/p/nmr-relax/code-python-html2rest to automatically generate the reStructuredText file from the wiki release notes.
* Expanded the release checklist instructions for creating the README.rst files.
* Updates to many frame order test suite shared data relax scripts. These scripts are used for data generation and display, and are not part of the test suite. The updates are for the [http://www.nmr-relax.com/manual/frame_order_pdb_model.html frame_order.pdb_model ] and [http://www.nmr-relax.com/manual/pymol_frame_order.html pymol.frame_order ] user functions which no longer support the 'dist' keyword argument (this functionality was shifted into the [http://www.nmr-relax.com/manual/frame_order_simulate.html frame_order.simulate user function]).
* First commit after the svn to git migration: Created a .gitignore file for the new git repository.
* Documented the svn to git repository migration. All of the scripts used and detailed instructions have been included.
* Cosmetic change for the test___all__() unit test base class method. The files are now sorted.
* Blacklisted missing files are now skipped in the test___all__() unit test base class method. This allows for the test_suite.unit_tests._target_functions.test___init__.Test___init__() unit test to pass when the relaxation curve-fitting C modules are not compiled.
* Changed the relax state file name for the [http://www.nmr-relax.com/manual/state_save.html state.save user function ] calls in the sample scripts. This is to make it clearer what the files are. The old '*save.bz2' notation has been removed and the files are now generally called 'state.bz2'.
* Update to FSF compliant copyright notices for the external Sobol package. An explicit README file has been added to clarify the copyright status of all files.
* Added a trivial relax script to help regenerate the pec_diag.eps diagram.
* Improved documentation for the DIFF_MODEL variable in the dauvergne_protocol.py sample script. The fact that it can be supplied as a list is now mentioned in the script docstring, and the default value is now a list with all of the global models.
* Support for NMR proton pseudo-atom identification from PDB files in the internal structural object. The standard pseudo-atoms are now identified as being protons.
* Removed a duplicated proton frequency check in the [http://www.nmr-relax.com/manual/relax_data_read.html relax_data.read user function]. This resulted duplicated RelaxWarnings being printed out.
* Huge improvement for the responsiveness of the relax GUI. The relax controller window log panel was being updated with a wx.CallAfter() call after every write to the IO streams. If a relax analysis was proceeding very quickly, which is the case in most analyses, this created a huge backlog of GUI updates. The result was that the GUI would freeze, running at 100% CPU usage in its own thread, with the analysis running at 100% on another thread. The fix was to shift the log panel write() call to be triggered by the Timer already being used by the gauges, rather than by the IO stream write() methods. The text was already placed on a Queue object, so this change is very simple. Another small change was made to the log panel write() method to avoid a number of unneeded wx calls. This should also have a s
* Saved state file name change for the steady-state NOE and relaxation curve-fitting auto-analyses. The names are now simply 'state.bz2'. This is so the file is easier to identify as being a relax state file that can be loaded with the [http://www.nmr-relax.com/manual/state_load.html state.load user function].
* The relaxation curve-fitting sample script now timestamps the data pipe bundle name.
* Redesign of Troels' grace2images.py script. The executable script creation has been shifted from the relaxation curve-fitting auto-analysis (auto_analyses.relax_fit) into the new function lib.plotting.grace.create_grace2images(). This is now also used by the steady-state NOE auto-analysis. The content of the script has also been shifted into the lib.plotting.grace.GRACE2IMAGES variable to allow for easier code editing. The grace2images.py script itself has been heavily modified: The script now uses Python3 by default; The depreciated optparse module has been changed to argparse; A copyright notice has been placed at the top of the script; The top comment has been converted into a docstring; The default format is now EPS rather than PNG, as PNG is often not supported as an output device; Bug fix in
* Conversion of all return_spin() calls with interatom spin IDs to use the spin_hash argument instead. This should slightly speed up the spin lookups.
* Improved the formatting of the interatomic data container list to help with debugging. The data is now presented with the format_table() function of the lib.text.table module.
* Data container hash cross-reference recreation. This is used by the [http://www.nmr-relax.com/manual/model_selection.html model_selection], [http://www.nmr-relax.com/manual/pipe_copy.html pipe.copy], [http://www.nmr-relax.com/manual/result_read.html result.read ] and [http://www.nmr-relax.com/manual/state_read.html state.read ] user functions. The cross referencing recreation is for both spin containers and interatomic data containers. The old pipe_control.mol_res_spin.metadata_update() and new pipe_control.interatomic.metadata_update() functions are called after the loading a results or state file, or a data pipe copy, so that the data structures properly cross-reference each other's hashes.
* Huge speed up of the interatomic data container handling. The pipe_control.interatomic.create_interatom(), return_interatom(), and return_interatom_list() functions now operate with the unique spin hashes rather than spin IDs. This avoids the expensive calls to the now deleted pipe_control.interatomic.id_match() function.
* Fixes for the copying of spin or interatomic data containers. The data_store.prototype methods Prototype.__clone__() and Prototype.__deepcopy__() will now regenerate the unique hash if a _generate_hash() function is present. This function has been added to SpinContainer and InteratomContainer.
* Changed the spin ID printout for the [http://www.nmr-relax.com/manual/rdc_read.html rdc.read user function ] to be the unique ID rather than file ID. This is to help with debugging.
* Bug fix for the N_state_model.test_CaM_IQ_tensor_fit system test. Some of the RDC data contained RDCs between two @N spins rather than an @N and @H spin. This bug was only uncovered by the switch to the spin and interatomic data container hashes for fast lookups.
* Fix for the data store _back_compat_hook() method when creating interatomic data containers. The pipe_control.interatomic module define() function has been renamed to define_dipole_pair() for clarity and it now accepts two spin containers as arguments, overriding the spin ID arguments. This fixes the State.test_old_state_loading GUI test that was failing after the conversion to spin and interatomic data container hashes for fast lookups.
* Printout fix for the check_read_results_1_3() method of the Mf system tests.
* The interatomic_loop() function now uses the spin hash fast lookup table rather than spin IDs.
* Redesign of the create_spin() function of the pipe_control.mol_res_spin module. This function is the backend of the [http://www.nmr-relax.com/manual/spin_create.html spin.create user function ] and is also used throughout relax. Instead of creating a single residue or spin, if only a name and not number is supplied, now multiple spins are created. If the residue name is supplied but not the residue number, now all residues matching the given name will have new spins created. For example creating the spin with the name 'NE1' and only specifying the residue name 'TRP', then all tryptophans in all molecules will have NE1 indole side-chain spins created. This makes the operation of the [http://www.nmr-relax.com/manual/spin_create.html spin.create user function ] more logical for the user.
* Support for catching segfaults and other errors from Modelfree4. This allows for non-silent exiting from the Popen() class. All signals are now reported via RelaxErrors.
* Added the text of the LGPLv3 licence to the extern.sobol package.
* Added travis build shield to README.
* Adding system-tests to be executed with travis.
* Creation of a large set of system tests for implementing the [http://www.nmr-relax.com/manual/frame_order_decompose.html frame_order.decompose user function]. The tests have been copied from Frame_order.test_distribute_* and include: Frame_order.test_decompose_free_rotor_z_axis, Frame_order.test_decompose_iso_cone_z_axis, Frame_order.test_decompose_iso_cone_xz_plane_tilt, Frame_order.test_decompose_iso_cone_free_rotor_z_axis, Frame_order.test_decompose_iso_cone_torsionless_z_axis, Frame_order.test_decompose_pseudo_ellipse_xz_plane_tilt, Frame_order.test_decompose_pseudo_ellipse_z_axis, Frame_order.test_decompose_pseudo_ellipse_free_rotor_z_axis, Frame_order.test_decompose_pseudo_ellipse_torsionless_z_axis, Frame_order.test_decompose_rotor_z_axis.* Creation of the [http://www.nmr-relax.com/manual/frame_order_decompose.html frame_order.decompose user function ] front end.* Implementation of the [http://www.nmr-relax.com/manual/frame_order_decompose.html frame_order.decompose user function ] backend.
* Scons: Fixes for the manual compilation. The relax manual cannot be compiled if one of the sys.path values contains a 'docs/' directory. Instead of appending the relax docs/ path to sys.path, it is now prepended. The documentation Python module __all__ lists have also been filled out.
* Renamed the relax default repository version from "repository checkout" to "repository commit". This general text is more appropriate for a git repository.
* GUI: Fix for a wxPython 2.9 issue found via the Relax_disp.test_bug_missing_replicates GUI test. The spectrum ID wx.ListCtrl element cannot be queried for item 0 when empty.
* Development scripts: Rewrote the python_seek.py script to report all import errors.
* Creation of a large set of system tests for expanding the [http://www.nmr-relax.com/manual/frame_order_decompose.html frame_order.decompose user function]. The tests have been copied from Frame_order.test_decompose_* and modified to include the new 'total' 'reverse', and 'mirror' user function keywords. The tests include: Frame_order.test_decompose2_free_rotor_z_axis, Frame_order.test_decompose2_iso_cone_z_axis, Frame_order.test_decompose2_iso_cone_xz_plane_tilt, Frame_order.test_decompose2_iso_cone_free_rotor_z_axis, Frame_order.test_decompose2_iso_cone_torsionless_z_axis, Frame_order.test_decompose2_pseudo_ellipse_xz_plane_tilt, Frame_order.test_decompose2_pseudo_ellipse_z_axis, Frame_order.test_decompose2_pseudo_ellipse_free_rotor_z_axis, Frame_order.test_decompose2_pseudo_ellipse_torsionless_z_axis, Frame_order.tes
* User function frame_order.decompose: Implementation of the 'total', 'reverse' and 'mirror' params. This allows a fixed number of structures to be generated over the distribution, for the model order to be reversed, and for the models to step from the negative angle to positive angle and then return to the negative angle. The original code has been simplified by switching from numpy.arange() to numpy.linspace() for generating the range of angles. This function is far more reliable than arange() which has end point instability issues.
* Creation of the Test_object.test_add_model unit test. This is within the _lib._structure._internal.test_object test module. The aim is to reveal issues with the model number accounting within the internal structural object.
* System test: Addition of Structure.test_add_secondary_structure. This will be used to quickly implement the new [http://www.nmr-relax.com/manual/structure_add_helix.html structure.add_helix ] and [http://www.nmr-relax.com/manual/structure_add_sheet.html structure.add_sheet ] user functions.
* User function: Implementation of structure.add_helix for defining alpha helices.
* User function: Implementation of structure.add_sheet for defining beta sheets.
* lib.arg_check module: Creation of the generic validate_arg() function. A large number of associated unit tests have been added to test all combinations. The _lib.test_arg_check unit tests include: Test_arg_check.test_validate_arg_all_basic_types, Test_arg_check.test_validate_arg_all_basic_types_and_all_containers, Test_arg_check.test_validate_arg_all_containers, Test_arg_check.test_validate_arg_bool, Test_arg_check.test_validate_arg_bool_list, Test_arg_check.test_validate_arg_bool_list_rank2, Test_arg_check.test_validate_arg_bool_or_bool_list, Test_arg_check.test_validate_arg_float, Test_arg_check.test_validate_arg_float_list, Test_arg_check.test_validate_arg_float_list_rank2, Test_arg_check.test_validate_arg_float_or_float_list, Test_arg_check.test_validate_arg_func, Test_arg_check.test_validat
* lib.arg_check module: Fixes for handling empty numpy arrays. This is for the is_float_array() and is_float_matrix() functions.
* lib.arg_check module: Removal of the is_list_val_or_list_of_list_val() function. This was never completely implemented, and was only used by the 'point' argument of the [http://www.nmr-relax.com/manual/dx_map.html dx.map user function]. The user function py_type "list_val_or_list_of_list_val" value has been renamed to 'num_list_or_num_list_of_lists' and the call to is_list_val_or_list_of_list_val() replaced by a call to validate_arg(). The 'dim' argument for the 'point' argument of the [http://www.nmr-relax.com/manual/dx_map.html dx.map user function ] has been modified to match the validate_arg() function syntax.
* User function definition redesign, increasing the argument setting flexibility. The 'py_type' argument definition has been replaced by 'basic_types', 'container_types', and sometimes 'dim'. This matches the new validate_arg() function in the lib.arg_check module and allows for far greater flexibility in defining a parameter together with more extensive parameter checking than previously possible.
* specific_analyses.consistency_tests.api module: Missing RelaxWarning import.
* User function definitions: Support for checking file lists (from arg_type='file sel multi'). The new RelaxStrFileListStrFileError object has been created for this check (and the RelaxStrListError also added for completeness).
* User function definitions: Overrides for arguments with 'arg_type' set. The 'arg_type' argument is now fully documented in the user_functions.objects module Uf_container.add_keyarg() function docstring. The value is now checked, and a few unimplemented values have been eliminated. Overrides for the 'dim', 'basic_types', and 'container_types' are now set for almost all arguments with 'arg_type' set. And checks that these are not set in the user function definition have been added.
* [http://www.nmr-relax.com/manual/system_cd.html system.cd user function]: Removal of the incorrect wiz_filesel_style argument in the definition.
* User function definitions: Split of the 'file sel' arg_type value into readable and writable. The arg_type value is now either 'file sel read' or 'file sel write'. The 'file sel multi' value has also been split into 'file sel multi read' and 'file sel multi write'. This is used for checking if file objects supplied to the user function are correctly readable or writable. And it is used in the GUI to automatically set the file selection dialog style. Hence the redundant 'wiz_filesel_style' argument has been removed from the user function definitions. The is_filetype_readable(), is_filetype_rw(), and is_filetype_writable() functions have been added to the lib.check_types module to check the file objects from within the lib.arg_check module validate_arg() function.
* Test suite: Zero times reported on MS Windows with --time no longer have a negative sign.
<section begin=bugfixes/>
* Bug fix for the [http://www.nmr-relax.com/manual/pcs_structural_error.html pcs.structural_error user function]. The user function now uses a real multivariate normal distribution for sampling atomic positions. The previous random unit vector + univariate Gaussian sampling does not correctly reproduce the multivariate normal distribution.
* Python 3 bugfix for the Relax_disp.test_bug_24601_r2eff_missing_data system test. Tab characters rather than spaces made the system test script unloadable in Python 3.
* Python 3 fixes for the gui.misc module. This is for text formatting using the "x"*num logic. In Python 3, num is often a float so this does not work and an explicit int() function call is required.
* Python 3 fix for the combo list sequence elements. Comparison of integers to values of None are not allowed.
* Bug fix for "Tools->System information" GUI menu item. The user function has been renamed from sys_info to [http://www.nmr-relax.com/manual/system_sys_info.html system.sys_info].
* Python >= 3.4 fix by removing an unused types.ListType import.
* Bug fix allowing for spaces in file paths in the GUI open_file() function. This used by the file preview buttons and the results viewer window.