* Updated the Structure system tests for the [http://www.nmr-relax.com/manual/structure_align.html structure.align] and [http://www.nmr-relax.com/manual/structure_superimpose.html structure.superimpose] user function merger.
* Fix for the [http://www.nmr-relax.com/manual/structure_sequence_alignment.html structure.sequence_alignment user function]. The alignment data should be stored in ds.sequence_alignments rather than ds.sequence_alignment.
* Sequence alignments can now be retrieved without supplying the algorithm settings. This is in the [http://www.nmr-relax.com/api/3.3/data_store.seq_align.Sequence_alignments-class.html#find_alignment data_store.seq_align.Sequence_alignments.find_alignment() method]. The change allows for the retrieval of pre-existing sequence alignments at any stage.* Added a function for assemble the common atomic coordinates taking sequence alignments into account. This is the new [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates pipe_control.structure.main.assemble_structural_coordinates() function]. It takes the sequence alignment logic out of the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.coordinates-module.html#assemble_coord_array lib.structure.internal.coordinates.assemble_coord_array() function] so that sequence alignments in the relax data store can be used. The logic has also been redefined as: 1, use a sequence alignment from the relax data store if present; 2, use no sequence alignment if coordinates only come from structural models; 3, fall back to a residue number based alignment. The residue number based alignment is yet to be implemented. As a consequence, the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.coordinates-module.html#assemble_coord_array lib.structure.internal.coordinates.assemble_coord_array() function] has been greatly simplified. It no longer handles sequence alignments, but instead expects the residue skipping data structure, built from the alignment, as an argument. The seq_info_flag argument has also been eliminated in this function as well as the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html pipe_control.structure.main module].* Updated the [http://www.nmr-relax.com/manual/structure_displacement.html structure.displacement user function] for the changed atomic assembly logic. This now uses the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates assemble_structural_coordinates() function ] of the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main -module .html pipe_control.structure.main module] to obtain the common coordinates based on pre-existing sequence alignments, no-alignment, or the default of a residue number based alignment.* Updated the [http://www.nmr-relax.com/manual/structure_find_pivot.html structure.find_pivot user function] for the changed atomic assembly logic. This now uses the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates assemble_structural_coordinates() function ] of the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main -module .html pipe_control.structure.main module] to obtain the common coordinates based on pre-existing sequence alignments, no-alignment, or the default of a residue number based alignment.* Updated the [http://www.nmr-relax.com/manual/structure_atomic_fluctuations.html structure.atomic_fluctuations user function] for the changed atomic assembly logic. This now uses the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates assemble_structural_coordinates() function ] of the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html pipe_control.structure.main module ] to obtain the common coordinates based on pre-existing sequence alignments, no-alignment, or the default of a residue number based alignment.* Updated the [http://www.nmr-relax.com/manual/structure_rmsd.html structure.rmsd user function] for the changed atomic assembly logic. This now uses the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates assemble_structural_coordinates() function ] of the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html pipe_control.structure.main module ] to obtain the common coordinates based on pre-existing sequence alignments, no-alignment, or the default of a residue number based alignment.* Updated the [http://www.nmr-relax.com/manual/structure_web_of_motion.html structure.web_of_motion user function] for the changed atomic assembly logic. This now uses the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates assemble_structural_coordinates() function ] of the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html pipe_control.structure.main module ] to obtain the common coordinates based on pre-existing sequence alignments, no-alignment, or the default of a residue number based alignment.
* Fix for the [http://www.nmr-relax.com/manual/structure_superimpose.html structure.superimpose user function] if no data pipes are supplied. This reintroduces the pipes list construction.
* Fix for the new [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates pipe_control.structure.main.assemble_structural_coordinates() function]. The atom_id argument is now passed into the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.coordinates-module.html#assemble_atomic_coordinates assemble_atomic_coordinates() function] of the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.coordinates-module.html lib.structure.internal.coordinates module] so that atom subsets are once again recognised.* Another fix for the new [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates pipe_control.structure.main.assemble_structural_coordinates() function]. The logic for determining if only models will be superimposed was incorrect.* Implemented the residue number based alignment in the atomic assembly function. This is in the new [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates pipe_control.structure.main.assemble_structural_coordinates() function]. The code for creating the residue skipping data structure is now shared between the three sequence alignment options.* Implemented the multiple sequence alignment method based on residue numbers. This is the new [http://www.nmr-relax.com/api/3.3/lib.sequence_alignment.msa-module.html#msa_residue_numbers msa_residue_numbers() function ] in the [http://www.nmr-relax.com/api/3.3/lib.sequence_alignment.msa -module.html lib.sequence_alignment.msa module]. The logic is rather basic in that the alignment is based on a residue number range from the lowest residue number to the highest - i.e. it does not take into account gaps in common between all input sequences.* The residue number based sequence alignment is now executed when assembling atomic coordinates. This is in the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates assemble_structural_coordinates() function ] of the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html pipe_control.structure.main module].* Modified the internal structural object [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#one_letter_codes one_letter_codes() method]. This now validates the models to make sure all models match, and the method requires the selection object so that residue subsets can be handled.* The [http://www.nmr-relax.com/api/3.3/lib.structure.internal.coordinates-module.html#assemble_atomic_coordinates assemble_atomic_coordinates() function] now calls [http://www.nmr-relax.com/api/3.3/lib.structure.internal.object.Internal-class.html#one_letter_codes one_letter_codes() ] with the selection object. This is the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.coordinates-module.html lib.structure.internal.coordinates module] function.* Fix for the residue number based sequence alignment when assembling structural coordinates. This is in the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates assemble_structural_coordinates() function ] of the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html pipe_control.structure.main module]. The sequences of the different molecules can be of different lengths.* Shifted the residue skipping data structure construction into the relax library. The code was originally in [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates pipe_control.structure.main.assemble_structural_coordinates() ] but has been shifted into the new [http://www.nmr-relax.com/api/3.3/lib.sequence_alignment.msa-module.html#msa_residue_skipping lib.sequence_alignment.msa.msa_residue_skipping() function]. This will also for greater code reuse. The [http://www.nmr-relax.com/api/3.3/lib.sequence_alignment.msa-module.html lib.sequence_alignment.msa module ] is also a better location for such functionality.* Renamed the Structure.test_sequence_alignment_molecules system test. The new name is [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_sequence_alignment_central_star_nw70_blosum62Structure.test_sequence_alignment_central_star_nw70_blosum62], to better reflect what the test is doing.* Modified the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_sequence_alignment_central_star_nw70_blosum62 Structure.test_sequence_alignment_central_star_nw70_blosum62 system test]. Some residues are now deleted so that the sequences are not identical.* Created the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_sequence_alignment_residue_number Structure.test_sequence_alignment_residue_number system test]. This will be used to test the [http://www.nmr-relax.com/manual/structure_sequence_alignment.html structure.sequence_alignment user function] together with the 'residue number' MSA algorithm. This is simply a copy of the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_sequence_alignment_central_star_nw70_blosum62 Structure.test_sequence_alignment_central_star_nw70_blosum62 system test ] with a few small changes.* Corrections and simplifications for the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_sequence_alignment_residue_number Structure.test_sequence_alignment_residue_number system test].
* Modified the [http://www.nmr-relax.com/manual/structure_sequence_alignment.html structure.sequence_alignment user function] arguments. The pairwise_algorithm and matrix arguments can no be None, and they default to None.
* Updated the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_align_CaM_BLOSUM62 Structure.test_align_CaM_BLOSUM62 system test] script. The MSA algorithm and pairwise alignment algorithms are now specified in the [http://www.nmr-relax.com/manual/structure_sequence_alignment.html structure.sequence_alignment user function] calls.
* Creation of the [http://www.nmr-relax.com/api/3.3/lib.sequence_alignment.msa-module.html#msa_general lib.sequence_alignment.msa.msa_general() function]. This consists of code from the [http://www.nmr-relax.com/manual/structure_sequence_alignment.html structure.sequence_alignment user function] backend function [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#sequence_alignment pipe_control.structure.main.sequence_alignment() ] for selecting between the different sequence alignment methods.
* The [http://www.nmr-relax.com/manual/structure_sequence_alignment.html structure.sequence_alignment user function] now sets some arguments to None before storage. This is for all arguments not used in the sequence alignment. For example the residue number based alignment does not use the gap penalties, pairwise alignment algorithm or the substitution matrices.
* Fix for the [http://www.nmr-relax.com/api/3.3/lib.sequence_alignment.msa-module.html#msa_residue_skipping lib.sequence_alignment.msa.msa_residue_skipping() function]. The sequences argument for passing in the one letter codes has been removed. The per molecule loop should be over the alignment strings rather than one letter codes, otherwise the loop will be too short.* Fix for the internal structural object atomic coordinate assembly function. This is the [http://www.nmr-relax.com/api/3.3/pipe_control.structure.main-module.html#assemble_structural_coordinates pipe_control.structure.main.assemble_structural_coordinates() function]. The case of no sequence alignment being required as only models are being handled is now functional. The strings and gaps data structures passed into the [http://www.nmr-relax.com/api/3.3/lib.sequence_alignment.msa-module.html#msa_residue_skipping lib.sequence_alignment.msa.msa_residue_skipping() function ] for generating the residue skipping data structure are now set to the one letter codes and an empty structure of zeros respectively.
* Test data directory renaming. The test_suite/shared_data/diffusion_tensor/spheroid directory has been renamed to spheroid_prolate. This is in preparation for creating oblate spheroid diffusion relaxation data.
* Creation of oblate spheroid diffusion relaxation data. This will be used in the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_create_diff_tensor_pdb_oblate Structure.test_create_diff_tensor_pdb_oblate system test].
* Fix for the oblate spheroid diffusion relaxation data. The diffusion parameters are constrained as D<sub>x</sub> ≤ D<sub>y</sub> ≤ D<sub>z</sub>.
* More fixes for the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_create_diff_tensor_pdb_oblate Structure.test_create_diff_tensor_pdb_oblate system test]. The initial Diso value is now set to the real final Diso, and the PDB file contents have been updated for the fixed oblate spheroidal diffusion relaxation data.* Updates for many of the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.diffusion_tensor.Diffusion_tensor-class.html Diffusion_tensor system tests]. This is due to the changed directory names in test_suite/shared_data/diffusion_tensor/. The ds.diff_dir variable has been introduced to point to the correct data directory.* Large improvement for the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI test tearDown() clean up method], fixing the tests on wxPython 2.8. The user function window destruction has been shifted into a new [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows clean_up_windows() method ] which is executed via wx.CallAfter() to avoid racing conditions. In addition, the spin viewer window is destroyed between tests. The spin viewer window change allows the GUI tests to pass on wxPython 2.8 again. This also allows the GUI tests to progress much further on Mac OS X systems before they crash again for some other reason. This could simply be hiding a problem in the spin viewer window. However it is likely to be a racing problem only triggered by the super fast speed of the GUI tests and a normal user would never be able to operate the GUI on the millisecond timescale and hence may never see it.
* Reverted the wxPython 2.8 warning printout when starting relax, introduced in [[relax 3.3.5]].
* Reverted the skipping of the GUI tests on wxPython 2.8, introduced in [[relax 3.3.5]].
* Reverted the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.general.General-class.html#test_bug_23187_residue_delete_gui General.test_bug_23187_residue_delete_gui GUI test ] disabling, introduced in [[relax 3.3.5]]. The 'Bus Error' on Mac OS X due to this test is no longer an issue, as the spin viewer window is now destroyed after each GUI test.* Created a special Destroy() method for [http://www.nmr-relax.com/api/3.3/gui.spin_viewer.frame.Spin_view_window-class.html#Destroy Destroy() method for the spin viewer window]. This is for greater control of the spin viewer window destruction. First the methods registered with the observer objects are unregistered, then the children of the spin viewer window are destroyed, and finally the main spin viewer window is destroyed. This change saves a lot of GUI resources in the GUI tests (there is a large reduction in 'User Objects' and 'GDI Objects' used on MS Windows systems, hence an equivalent resource reduction on other operating systems).* Fix for the GUI test clean_up_windows() [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows GUI test clean_up_windows() method ] called from tearDown()[http://www.nmr-relax. The user function window com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown tearDown(Wiz_window) must be closed before the ]. The user function page window (Uf_page), so that the [http://www.nmr-relax.com/api/3.3/gui.wizards.wiz_objects.Wiz_window-class._handler_close(html Wiz_window]) can still operate the methods of must be closed before the user function page ([http://www.nmr-relax.com/api/3.3/gui.uf_objects.Uf_page-class. This avoids a huge quantity of these errors: Traceback (most recent call lasthtml Uf_page]), so that the [http: __getattr__ wx//www.nmr-relax._corecom/api/3.PyDeadObjectError: The C++ part 3/gui.wizards.wiz_objects.Wiz_window-class.html#_handler_close Wiz_window._handler_close()] can still operate the methods of the Uf_page object has been deleted, attribute access no longer allowed[http://www.* Simplification of the Dead_uf_pagesnmr-relax.test_mol_create GUI testcom/api/3. The RelaxError cannot be caught from the GUI user function window, therefore the try statement has been eliminated3/gui.uf_objects.* More memory saving improvements for the GUI test suite tearDown() methodUf_page-class.html Uf_page]. The clean_up_windowsThis avoids a huge quantity of these errors: Traceback (most recent call last) method now loops through all top level windows (frames, dialogs, panels, etc: __getattr__ wx._core.) and calls their Destroy() methodPyDeadObjectError: The C++ part of the Uf_page object has been deleted, attribute access no longer allowed.* Created Simplification of the gui[http://www.uf_objectsnmr-relax.Uf_objectcom/api/3.Destroy() method3/test_suite. This will be used to cleanly destroy the user function objectgui_tests.* Modified the dead_uf_pages.Dead_uf_pages-class.html#test_mol_create Dead_uf_pages.test_mol_create GUI test suite _execute_uf() method]. This The RelaxError cannot be caught from the GUI user function execution method now calls window, therefore the user function GUI object Destroy() method to clean up all GUI objectstry statement has been eliminated. This should save * More memory saving improvements for GUI objects in the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI test suite.* Modified the GUI test suite tearDowntearDown() method]. The [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows clean_up_windows() method called by tearDown() ] now prints out a lost of loops through all of the living top level windows instead of trying to destroy them (which causes frames, dialogs, panels, etc.) and calls their Destroy() method.* Created the running of the GUI tests in the GUI to cause the GUI to be destroyed)[http://www. The printouts will be used for debugging purposesnmr-relax.* Fixes for the custom Wiz_windowcom/api/3.3/gui.uf_objects.Uf_object-class.html#Destroy gui.uf_objects.Uf_object.Destroy() method]. This will now first close be used to cleanly destroy the wizard window via user function object.* Modified the Close[http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#_execute_uf GUI test suite _execute_uf() method to make sure all of the wizard pages are properly updated]. In This user function execution method now calls the end the wizard DestroyChildren([http://www.nmr-relax.com/api/3.3/gui.uf_objects.Uf_object-class.html#Destroy user function GUI object Destroy() method is called ] to clean up all child wx GUI objects, and finally Destroy() is called to eliminate . This should save memory for GUI objects in the wizard GUI objecttest suite.* The Modified the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI test suite tearDown() method now calls the user function GUI wizard Destroy() method]. This is for better handling of user function eliminationThe [http://www.* Fixes for the user function GUI object Destroy() methodnmr-relax. This matches the code just deleted in the GUI test suite tearDowncom/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows clean_up_windows() method for handing the user function page object] called by [http://www.nmr-relax.* More fixes for the user function GUI object Destroy() methodcom/api/3. This page GUI object is destroyed by the wizard window Destroy3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown tearDown() method, so destroying again causes wxPython runtime errors.* Spacing printout for ] now prints out a lost of all of the list living windows instead of still open GUI window elements. This is for the GUI test tearDowntrying to destroy them () method.* Shifted which causes the printouts from running of the GUI tests suite clean_up_windows() method in the GUI to cause the tearDown(GUI to be destroyed) method. This change means that the The printouts are not within a wx.CallAfter() call, but rather at the end of the tearDown() method just prior to starting the next testwill be used for debugging purposes.* Simplification of Fixes for the GUI analysis post_resetcustom [http://www.nmr-relax.com/api/3.3/gui.wizards.wiz_objects.Wiz_window-class.html#Destroy Wiz_window.Destroy() method]. This will now uses first close the wizard window via the delete_allClose() and hence delete_analysis() methods method to clean up make sure all of the GUIwizard pages are properly updated. The reset argument has been added to skip In the manipulation of relax data store data, as end the data store is empty after a reset. However the calling of the delete_analysis() method now ensures that the analysis specific delete(wizard DestroyChildren() method is now called so that to clean up all child wx objects, and finally Destroy() is called to eliminate the wizard GUI elements can be properly destroyedobject.* Proper destruction of the peak analysis wizard of the NOE GUI analysisThe [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class. The peak wizard's Destroyhtml#tearDown GUI test suite tearDown() method is ] now called and calls the self[http://www.nmr-relax.com/api/3.peak_wizard object deleted in the NOE 3/gui.wizards.wiz_objects.Wiz_window-class.html#Destroy user function GUI analysis deletewizard Destroy() method]. This is for better handling of user function elimination.* Improved memory management in Fixes for the NOE GUI analysis peak_wizard_launch() method[http://www.nmr-relax. This method was just overwriting the selfcom/api/3.peak_wizard object with a new 3/gui.uf_objects.Uf_object-class.html#Destroy user function GUI objectDestroy() method]. However this does not destroy This matches the code just deleted in the wxPython window[http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes. Now if a peak wizard is detected, its DestroyGuiTestCase-class.html#tearDown GUI test suite tearDown() method is called before overwriting ] for handing the user function page object.* Improved GUI clean up when terminating GUI testsMore fixes for the [http://www.nmr-relax.com/api/3.3/gui.uf_objects. The clean_up_windows() method, called from tearDownUf_object-class.html#Destroy user function GUI object Destroy(), now also destroys method]. This page GUI object is destroyed by the pipe editor window, the results viewer window, and the prompt window[http://www. This ensures that all of the major nmr-relax windows are destroyed between GUI tests.* Improved memory management in the relaxation curvecom/api/3.3/gui.wizards.wiz_objects.Wiz_window-fitting GUI analysisclass. The peak intensity loading html#Destroy wizard is now properly destroyed. This is both via the delete() function for terminating the analysis calling the wizard Deletewindow Destroy() method], and in so destroying again causes wxPython runtime errors.* Spacing printout for the peak_wizard_launch() method calling the wizard Delete() method prior to overwriting list of still open GUI window elements. This is for the self[http://www.nmr-relax.peak_wizard object with a new GUI wizardcom/api/3.* Improved memory management in the model3/test_suite.gui_tests.base_classes.GuiTestCase-free class.html#tearDown GUI analysistest tearDown() method]. The dipole-dipole interaction wizard is now properly destroyed. This is both via * Shifted the delete() function for terminating printouts from the analysis calling the wizard Delete[http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows GUI tests suite clean_up_windows() method, and in ] to the setup_dipole_pair[http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown tearDown() method calling ]. This change means that the wizard Delete(printouts are not within a wx.CallAfter() method prior to overwriting call, but rather at the end of the self[http://www.nmr-relax.dipole_wizard object with a new GUI wizardcom/api/3.3/test_suite.gui_tests.base_classes.* Improved memory management in the modelGuiTestCase-free GUI analysisclass. The analysis mode selection window (a wxhtml#tearDown tearDown() method] just prior to starting the next test.Dialog) is now being destroyed in * Simplification of the [http://www.nmr-relax.com/api/3.3/gui.analyses.Analysis_controller-class.html#post_reset GUI analysis deletepost_reset() method]. This appears to work on Linux, Windows, and Mac systemsnow uses the [http://www.* Improved memory management in the modelnmr-free GUI analysisrelax.com/api/3. The local tm and model3/gui.analyses.Analysis_controller-free model windows are now destroyed in the GUI analysis deleteclass.html#delete_all delete_all() method] and hence [http://www.* Improved termination of nmr-relax.com/api/3.3/gui.analyses.Analysis_controller-class.html#delete_analysis delete_analysis()] methods to clean up the GUI tests. The clean_up_windows(reset argument has been added to skip the manipulation of relax data store data, as the data store is empty after a reset. However the calling of the delete_analysis() method now ensures that the analysis specific delete() method is now called so that the GUI elements can be properly destroyed.* Proper destruction of the peak analysis wizard of the NOE GUI analysis. The peak wizard's Destroy() method is now called and the self.peak_wizard object deleted in the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_noe.Auto_noe-class.html#delete NOE GUI analysis delete() method].* Improved memory management in the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_noe.Auto_noe-class.html#peak_wizard_launch NOE GUI analysis peak_wizard_launch() method]. This method was just overwriting the self.peak_wizard object with a new object. However this does not destroy the wxPython window. Now if a peak wizard is detected, its Destroy() method is called before overwriting the object.* Improved GUI clean up when terminating GUI tests. The [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows clean_up_windows() method], called from [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown tearDown()], now also destroys the pipe editor window, the results viewer window, and the prompt window. This ensures that all of the major relax windows are destroyed between GUI tests.* Improved memory management in the relaxation curve-fitting GUI analysis. The peak intensity loading wizard is now properly destroyed. This is both via the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_rx_base.Auto_rx-class.html#delete delete() function] for terminating the analysis calling the wizard Delete() method, and in the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_rx_base.Auto_rx-class.html#peak_wizard_launch peak_wizard_launch() method] calling the wizard Delete() method prior to overwriting the self.peak_wizard object with a new GUI wizard.* Improved memory management in the model-free GUI analysis. The dipole-dipole interaction wizard is now properly destroyed. This is both via the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_model_free.Auto_model_free-class.html#delete delete() function] for terminating the analysis calling the wizard Delete() method, and in the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_model_free.Auto_model_free-class.html#setup_dipole_pair setup_dipole_pair() method] calling the wizard Delete() method prior to overwriting the self.dipole_wizard object with a new GUI wizard.* Improved memory management in the model-free GUI analysis. The analysis mode selection window (a wx.Dialog) is now being destroyed in the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_model_free.Auto_model_free-class.html#delete analysis delete() method]. This appears to work on Linux, Windows, and Mac systems.* Improved memory management in the model-free GUI analysis. The local tm and model-free model windows are now destroyed in the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_model_free.Auto_model_free-class.html#delete GUI analysis delete() method].* Improved termination of the GUI tests. The [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows clean_up_windows() method] now calls the results viewer and pipe editor window handler_close() methods. This ensures that all observer objects are cleared out so that the methods of the dead windows can no longer be called.
* Fix for the previous commit, calls to wx.Yield() are required to flush the calls on the observer objects after unregisteristing them and deleting the results and pipe editor windows.
* Improved memory management in the relaxation dispersion GUI analysis. The peak intensity loading wizard is now properly destroyed. This is both via the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_relax_disp.Auto_relax_disp-class.html#delete delete() function ] for terminating the analysis calling the wizard Delete() method, and in the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_relax_disp.Auto_relax_disp-class.html#peak_wizard_launch peak_wizard_launch() method ] calling the wizard Delete() method prior to overwriting the self.peak_wizard object with a new GUI wizard.* Created custom Destroy() methods for the [http://www.nmr-relax.com/api/3.3/gui.relax_prompt.Prompt-class.html#Destroy pipe editor ] and results viewer GUI windows.* Improved memory management in the relaxation dispersion GUI analysis. The dispersion model list window is now destroyed in the [http://www.nmr-relax.com/api/3.3/gui.analyses.auto_relax_disp.Auto_relax_disp-class.html#delete GUI analysis delete() method].
* Fixes for the custom Destroy() methods for the pipe editor and results viewer GUI windows. The event argument is now a keyword argument which defaults to None. This allows the Destroy() methods to be called without arguments.
* Temporary disablement of the results viewer window destruction in the GUI tests. This currently, for some unknown reason, causes segfault crashes of the GUI tests on Linux systems.
* Changes for how the main GUI windows are destroyed by the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI test tearDown() method]. These changes revert some of the code of previous commits. The recently introduced pipe editor and results viewer windows Delete() methods have been deleted. Instead the Close() methods are called in the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown tearDown() method ] to unregister the windows from the observer objects, followed by a wx.Yield() call to flush the wx events, and then the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows clean_up_windows() GUI test base method ] is called within a wx.CallAfter() call. This avoids the racing induced segfaults in the GUI tests.* Improved memory management in the spin viewer window. The spin loading wizard is now destroyed in the [http://www.nmr-relax.com/api/3.3/gui.spin_viewer.frame.Spin_view_window-class.html#Destroy Destroy() method ] as well as before reinitialising the wizard in the [http://www.nmr-relax.com/api/3.3/gui.spin_viewer.frame.Spin_view_window-class.html#load_spins_wizard load_spins_wizard() method].* The [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI tests tearDown() method ] now prints out the Wizard windows title, if not destroyed.
* The Wizard window title is now being stored as a class instance variable.
* Improved memory management in the relaxation data list GUI element, as well as the base list object. The relaxation data loading wizard is now destroyed in the [http://www.nmr-relax.com/api/3.3/gui.components.base_list.Base_list-class.html#delete Base_list.delete() method], or any wizard for that matter. In addition, the relaxation data loading wizard is destroyed before reinitialising the wizard in the [http://www.nmr-relax.com/api/3.3/gui.components.relax_data.Relax_data_list-class.html#wizard_exec wizard_exec() method].* Better memory management for the [http://www.nmr-relax.com/api/3.3/gui.message.Missing_data-class.html missing data dialog in the GUI analyses]. The dialog is now stored as the class variable missing_data, and then is destroyed in the analysis delete() method. Without this, the wxPython dialog would remain in memory for the lifetime of the program.* Improved memory management for the [http://www.nmr-relax.com/api/3.3/gui.input_elements.sequence.Sequence-class.html Sequence ] and [http://www.nmr-relax.com/api/3.3/gui.input_elements.sequence_2D.Sequence_2D -class.html Sequence_2D] input GUI elements. These are mainly used in the user function GUI windows. The dialogs are now destroyed before a second is opened.* Improved memory management for the GUI user function windows. The [http://www.nmr-relax.com/api/3.3/gui.uf_objects.Uf_object-class.html#Destroy Destroy() method ] will now destroy any [http://www.nmr-relax.com/api/3.3/gui.input_elements.sequence.Sequence-class.html Sequence ] or [http://www.nmr-relax.com/api/3.3/gui.input_elements.sequence_2D.Sequence_2D-class.html Sequence_2D ] windows used for the user function arguments.* The [http://www.nmr-relax.com/api/3.3/gui.relax_prompt.Prompt-class.html relax prompt window ] is now being destroyed by the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI test suite tearDown() method]. The window is first closed in the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown tearDown() method ] and then destroyed in the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows clean_up_windows() method].* Added memory management checking to the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI test suite tearDown() method]. If any top level windows are present, excluding the main GUI window and the relax controller, then a RelaxError will be raised. Such a check will significantly help in future GUI coding, as now there will be feedback if not all windows are properly destroyed.
* Popup menus are now properly destroyed in the GUI tests. In many instances, the wx.Menu.Destroy() method was only being called when the GUI is shown. This causes memory leaking in the GUI tests.
* Changed the title for the user function GUI windows. To better help identify what the window is, the title is now the user function name together with text saying that it is a user function.
* Removed the wx.CallAfter() call in the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI tests tearDown() method]. This was used to call the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows clean_up_windows() method]. However the value of wx.Thread_IsMain() shows that the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown tearDown() method ] executes in the main GUI thread. Therefore the wx.CallAfter() call for avoiding racing conditions is not needed.* Fix for the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#clean_up_windows GUI tests clean_up_windows() tearDown method]. After destroying all of the main GUI windows, a wx.Yield() call is made to flush the wxPython event queue. This seems to help with the memory management.* Temporary disabling of the memory management check in the [http://www.nmr-relax.com/api/3.3/test_suite.gui_tests.base_classes.GuiTestCase-class.html#tearDown GUI tests tearDown() method]. For some reason, it appears as if it is not possible to destroy wx Windows on MS Windows.* Created the [http://www.nmr-relax.com/api/3.3/gui.relax_prompt.Prompt-class.html#Destroy relax GUI prompt Destroy() method]. This is used to cleanly destroy the GUI prompt by first unregistering with the observer objects, destroying then deleting the wx.py.shell.Shell instance, and finally destroying the window.
* Modified the manual_c_module.py developer script so that the path can be supplied on the command line.
* Removed some unused imports, as found by devel_scripts/find_unused_imports.py.
* Removal of unused imports from the GUI user function memory testing scripts.
* Created a script for testing the memory management when calling the time GUI user function.
* Large memory management improvement for the relax GUI wizards and GUI user functions. The pympler.muppy based memory management scripts in devel_scripts/memory_management for testing the GUI user function windows was showing that for each GUI user function call, 28 wx._core.BoxSizer elements were remaining in memory. This was traced back to the [http://www.nmr-relax.com/api/3.3/gui.wizards.wiz_objects.Wiz_window -class.html gui.wizards.wiz_objects.Wiz_window class], specifically the self._page_sizers and self._button_sizers lists storing wx.BoxSizer instances. The problem was that 16 page sizers and 16 button sizers were initialised each time for later use, however the [http://www.nmr-relax.com/api/3.3/gui.wizards.wiz_objects.Wiz_window-class.html#add_page add_page() method ] only added a small subset of these to the self._main_sizer wx.BoxSizer object. But the Destroy() method was only capable of destroying the wx.BoxSizer instances associated with another wxPython object. The fix was to add all page and button sizers to the self._main_sizer object upon initialisation. This will solve many memory issues in the GUI, especially in the GUI tests on Mac OS X systems causing 'memory error' or 'bus error' messages and on MS Windows due to 'USER Object' and 'GDI object' limitations.
* The maximum number of pages in the GUI wizard is no longer hardcoded. The max_pages argument has been added to allow this value to be changed.
* Fix for GUI wizards and GUI user functions. The recent memory management changes caused the wizard windows to have an incorrect layout so that the wizard pages were not visible. Reperforming a layout of the GUI elements did not help. The solution is to not initialise sets of max_pages of wx.BoxSizer elements in the [http://www.nmr-relax.com/api/3.3/gui.wizards.wiz_objects.Wiz_window-class.html#__init__ wizard __init__() method], but to generate and append these dynamically via the [http://www.nmr-relax.com/api/3.3/gui.wizards.wiz_objects.Wiz_window-class.html#add_page add_page() method]. The change now means that there are no longer multiple unused wx.BoxSizer instances generated for each wizard window created.* Fix for the [http://www.nmr-relax.com/api/3.3/gui.wizards.wiz_objects.Wiz_window-class.html#_go_next GUI wizard _go_next() method]. The way to determine if there are no more pages needs to be changed, as there are now no empty list elements at the end of the wizard storage objects.* Another fix for the now variable sized wizard page list. This time the fix is in the [http://www.nmr-relax.com/api/3.3/prompt.uf_objects.Uf_object-class.html#__call__ GUI user function __call__() method].* Created the [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.relax_fit.Relax_fit-class.html#test_bug_23244_Iinf_graph Relax_fit.test_bug_23244_Iinf_graph system test]. This is to catch [https://gna.org/bugs/?23244 bug #23244].
<section end=changes/>
<section begin=bugfixes/>
* Bug fix for the [http://www.nmr-relax.com/manual/structure_align.html structure.align user function]. The addition of the molecule name to the displacement ID is now correctly performed.
* Fix for the new [http://www.nmr-relax.com/api/3.3/lib.structure.internal.selection.Internal_selection-class.html#count_atoms Internal_selection.count_atoms() internal structural object selection method]. The method was previously returning the total number of molecules, not the total number of atoms in the selection.
* Printout fix for the backend of the [http://www.nmr-relax.com/manual/structure_translate.html structure.translate] and [http://www.nmr-relax.com/manual/structure_rotate.html structure.rotate] user functions. Model numbers of zero were not correctly identified. This also affects the [http://www.nmr-relax.com/manual/structure_align.html structure.align] and [http://www.nmr-relax.com/manual/structure_superimpose.html structure.superimpose] user functions which uses this backend code.
* Another fix for the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.selection.Internal_selection-class.html#count_atoms Internal_selection.count_atoms() internal structural object selection method].
* Small fix for the [http://www.nmr-relax.com/api/3.3/lib.structure.internal.coordinates-module.html#assemble_coord_array lib.structure.internal.coordinates.assemble_coord_array() function]. The termination condition for determining the residues in common between all structures was incorrect.
* The [http://www.nmr-relax.com/api/3.3/test_suite.system_tests.structure.Structure-class.html#test_create_diff_tensor_pdb_oblate Structure.test_create_diff_tensor_pdb_oblate system test] now uses oblate diffusion relaxation data. This fixes [https://gna.org/bugs/?23232 bug #23232, the failure of this system test on Mac OS X]. The problem was that the system test was previously using relaxation data for prolate spheroidal diffusion and fitting an oblate tensor to that data. This caused the solution to be slightly different on different CPUs, operating systems, Python versions, etc. and hence the PDB file representation of the diffusion would be slightly different.* Big bug fix for the GUI tests on MS Windows systems. On MS Windows systems, the GUI tests were unable to complete without crashing. This is because each GUI element requires one 'User object', and MS Windows has a maximum limit of 10,000 of these objects. The GUI tests were taking more than 10,000 and then Windows would say - relax, you die now. The solution is that after each GUI test, all user function windows are destroyed. The user function page is a wx.Panel object, so this requires a Destroy() call. But the window is a [http://www.nmr-relax.com/api/3.3/gui.uf_objects.Uf_page-class.html Uf_page instance ] which inherits from [http://www.nmr-relax.com/api/3.3/gui.wizards.wiz_objects.Wiz_page -class.html Wiz_page] which inherits from wx.Dialog. Calling Destroy() on MS Windows and Linux works fine, but is fatal on Mac OS X systems. So the solution is to call Close() instead.* Fix for the default grid_inc argument for the [http://www.nmr-relax.com/api/3.3/auto_analyses.relax_fit-module.html relaxation curve-fitting auto-analysis]. This needs to be an integer.* Fix for [https://gna.org/bugs/?23244 bug #23244]. The [http://www.nmr-relax.com/api/3.3/auto_analyses.relax_fit-module.html relaxation curve-fitting auto-analysis ] now outputs text files and Grace graphs for the I<sub>0</sub> parameter and the I<sub>∞</sub> parameter if it exists.* Fixes for the package checking unit tests on MS Windows for the [http://www.nmr-relax.com/api/3.3/target_functions-module.html target_functions package]. The compiled relaxation curve-fitting file is called target_functions\relax_fit.pyd on MS Windows. The package checking was only taking into account *.so compiled files and not *.pyd file.
<section end=bugfixes/>