<section begin=description/>
This is a minor feature and bugfix release. It includes the addition of the [http://www.nmr-relax.com/manual/error_analysis_covariance_matrix.html error_analysis.covariance_matrix], [http://www.nmr-relax.com/manual/structure_align.html structure.align], and [http://www.nmr-relax.com/manual/structure_mean.html structure.mean] user functions and expanded functionality for the [http://www.nmr-relax.com/manual/structure_com.html structure.com] and [http://www.nmr-relax.com/manual/structure_delete.html structure.delete] user functions. Many operations involving the internal structural object are now orders of magnitude faster, with the [http://www.nmr-relax.com/manual/interatom_define.html interatom.define user function] showing the greatest speed ups. There are also improvements for helping to upgrade relax scripts to newer relax versions. The numdifftools package is now bundled with relax for allowing numerical gradient, Hessian and Jacobian matrices to be calculated. And the release includes the start of a [http://www.nmr-relax.com/api/3.3/auto_analyses.relax_disp_repeat_cpmg-module.html new protocol for iteratively analysing repetitive relaxation dispersion experiments].
<section end=description/>
<section begin=features/>
* Initial [http://www.nmr-relax.com/api/3.3/auto_analyses.relax_disp_repeat_cpmg-module.html auto-analysis support for a highly repetitive protocol for analysing relaxation dispersion data].
* Addition of the docs/user_function_changes.txt file which documents all user function changes from [[relax 1.0.1]] to [[relax 3.3.1|3.3.1]] to help with upgrading scripts to newer relax versions.
* Updated the [http://www.nmr-relax.com/api/3.3/user_functions-module.html#uf_translation_table translation table used to identify no longer existing user functions ] and explain what the new user function is called for all relax versions from [[relax 1.3.1|1.3.1]] to [[relax 3.3.1|3.3.1]].
* The [http://www.nmr-relax.com/manual/structure_delete.html structure.delete user function can now delete individual models as well as select atoms in individual models].
* Addition of the [http://www.nmr-relax.com/manual/error_analysis_covariance_matrix.html error_analysis.covariance_matrix user function for determining parameter errors via the covariance matrix]. This is currently only implemented for the relaxation curve-fitting analysis.
* Bundling of the Numdifftools 0.6.0 package with relax (https://code.google.com/p/numdifftools/) for numerically testing implementations of gradients, Hessians, and Jacobians.
* Implementation of the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#collapse_ensemble internal structural object collapse_ensemble() method ] to allow for all but one model to be deleted.* Massive speed up of the internal structural object by [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#selection pre-processing the atom ID string into a special atom selection object]. This speeds up the [http://www.nmr-relax.com/manual/interatom_define.html interatom.define], [http://www.nmr-relax.com/manual/structure_delete.html structure.delete], [http://www.nmr-relax.com/manual/structure_rotate.html structure.rotate], [http://www.nmr-relax.com/manual/structure_translate.html structure.translate] and many other user functions which loop over structural data.
* Many orders of magnitude speed up of the [http://www.nmr-relax.com/manual/structure_add_model.html structure.add_model user function].
* Implementation of the [http://www.nmr-relax.com/manual/structure_mean.html structure.mean user function to calculate the mean structure from the atomic coordinates of all loaded models].
* Created the Structure.test_get_model system test. This demonstrates that the internal structural object get_model() method is not working as it should.
* Added a few more checks to the Structure.test_get_model system test.
* Created the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_collapse_ensemble Structure.test_collapse_ensemble system test]. This is used to test a planned feature of the internal structural object. The [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#collapse_ensemble collapse_ensemble() method ] will be created to remove all but one model in the structural ensemble.
* Modified the Structure.test_collapse_ensemble system test to check the initial values. This is for sanity reasons as the test coverage of the [http://www.nmr-relax.com/manual/structure_add_atom.html structure.add_atom user function] is poor.
* Implemented the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#collapse_ensemble internal structural object collapse_ensemble() method]. This allows the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_collapse_ensemble Structure.test_collapse_ensemble system test ] to pass.
* Created a basic text based progress meter in the new [http://www.nmr-relax.com/api/3.3/lib.text.progress-module.html lib.text.progress module]. This is taken from the script test_suite/shared_data/frame_order/cam/generate_base.py.
* Modifications to the User_functions.test_structure_add_atom GUI test. As lists of lists are now accepted by the [http://www.nmr-relax.com/manual/structure_add_atom.html structure.add_atom user function], the operation in the GUI is now significantly different. Therefore many checks have been removed from the GUI test.
* Implemented writing out of particular correlation plots to file. [https://gna.org/task/?7826 Task #7826: Write a Python class for the repeated analysis of dispersion data].
* Created a special internal structural object selection object. This will be used for massively speeding up the internal structural object. The use of the [http://www.nmr-relax.com/api/3.3/lib.selection-module.html lib.selection module] by the internal structural object is currently very slow as a huge number of calls to re.search() are required. The idea is to avoid this by using [http://www.nmr-relax.com/api/3.3/lib.selection-module.html lib.selection] once to populate this new selection object, and then reusing this object to loop over molecules and atoms.
* Added the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#selection selection() method to the internal structural object]. This parses the atom ID string using the [http://www.nmr-relax.com/api/3.3/lib.selection-module.html lib.selection module], loops over the molecules and atoms, performs matches using re.search() via [http://www.nmr-relax.com/api/3.3/lib.selection-module.html lib.selection], and populates and returns the new [http://www.nmr-relax.com/api/3.3/lib.structure.internal.selection.Internal_selection-class.html Internal_selection object]. This can be used to pre-process the atom ID string to save huge amounts of time.
* The internal structural object validate_models() method now accepts the verbosity argument. This is used to silence printouts.
* Fixes for the new structural object [http://www.nmr-relax.com/api/3.3/lib.structure.internal.selection.Internal_selection-class.html Internal_selection object]. The atom indices are not stored via the molecule index.* Converted the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#rotate rotate() ] and [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#translate translate() ] structural object methods to use the new selection object. The atom_id arguments have been replaced with selection arguments. Therefore all parts of relax which call these methods must first call [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#selection selection() ] to obtain the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.selection.Internal_selection-class.html Internal_selection instance].* Created the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.selection.Internal_selection-class.html#mol_loop structural object Internal_selection.mol_loop() method]. This is to simply quickly loop over all molecule indices of the selection object.
* Converted all structural object methods to use the selection object rather that atom ID strings. This should have a significant impact on the speed of certain operations within relax. The most obvious effect will be a huge speed up of the [http://www.nmr-relax.com/manual/interatom_define.html interatom.define user function]. There should be speed ups with a number of other user functions relating to structural information. All parts of relax have been updated for the change.
* Implemented the sampling sparseness instead of NI on the graph axis. [https://gna.org/task/?7826 Task #7826: Write a Python class for the repeated analysis of dispersion data].