Author: bugman Date: Fri Sep 19 18:26:26 2014 New Revision: 25926 URL: http://svn.gna.org/viewcvs/relax?rev=25926&view=rev Log: Spun out part of the frame_order.pdb_model user function into the new frame_order.simulate. The new user function arguments required for properly creating the pseudo-Brownian dynamics simulation would have made the frame_order.pdb_model user function too complicated. Therefore this part has been spun out into the new frame_order.simulate user function. The frame_order.simulate frontend fully describes the algorithm that will be used to simulate the dynamic content of the PCS and RDC data, and warns that not all modes of motion are visible and present. Modified: branches/frame_order_cleanup/specific_analyses/frame_order/uf.py branches/frame_order_cleanup/user_functions/frame_order.py Modified: branches/frame_order_cleanup/specific_analyses/frame_order/uf.py URL: http://svn.gna.org/viewcvs/relax/branches/frame_order_cleanup/specific_analyses/frame_order/uf.py?rev=25926&r1=25925&r2=25926&view=diff ============================================================================== --- branches/frame_order_cleanup/specific_analyses/frame_order/uf.py (original) +++ branches/frame_order_cleanup/specific_analyses/frame_order/uf.py Fri Sep 19 18:26:26 2014 @@ -43,7 +43,7 @@ from specific_analyses.frame_order.variables import MODEL_ISO_CONE, MODEL_ISO_CONE_FREE_ROTOR, MODEL_ISO_CONE_TORSIONLESS, MODEL_LIST, MODEL_LIST_FREE_ROTORS, MODEL_LIST_ISO_CONE, MODEL_LIST_PSEUDO_ELLIPSE, MODEL_LIST_RESTRICTED_TORSION, MODEL_PSEUDO_ELLIPSE, MODEL_PSEUDO_ELLIPSE_TORSIONLESS, MODEL_RIGID -def pdb_model(ave_pos="ave_pos", rep="frame_order", dist="domain_distribution", dir=None, compress_type=0, size=30.0, inc=36, model=1, force=False): +def pdb_model(ave_pos="ave_pos", rep="frame_order", dir=None, compress_type=0, size=30.0, inc=36, model=1, force=False): """Create 3 different PDB files for representing the frame order dynamics of the system. @keyword ave_pos: The file root for the average molecule structure. @@ -85,10 +85,6 @@ if rep: create_geometric_rep(file=rep, dir=dir, compress_type=compress_type, size=size, inc=inc, force=force) - # Create the distribution. - if dist: - create_distribution(file=dist, dir=dir, compress_type=compress_type, model=model, force=force) - def permute_axes(permutation='A'): """Permute the axes of the motional eigenframe to switch between local minima. @@ -367,6 +363,29 @@ update_model() +def simulate(file="simulation.pdb.bz2", dir=None, step_size=2.0, snapshot=10, total=1000, model=1, force=True): + """Pseudo-Brownian dynamics simulation of the frame order motions. + + @keyword file: The PDB file for storing the frame order pseudo-Brownian dynamics simulation. The compression is determined automatically by the file extensions '*.pdb', '*.pdb.gz', and '*.pdb.bz2'. + @type file: str + @keyword dir: The directory name to place the file into. + @type dir: str or None + @keyword step_size: The rotation will be of a random direction but with this fixed angle. The value is in degrees. + @type step_size: float + @keyword snapshot: The number of steps in the simulation when snapshots will be taken. + @type snapshot: int + @keyword total: The total number of snapshots to take before stopping the simulation. + @type total: int + @keyword model: Only one model from an analysed ensemble of structures can be used for the pseudo-Brownian simulation, as the simulation and corresponding PDB file consists of one model per simulation. + @type model: int + @keyword force: A flag which, if set to True, will overwrite the any pre-existing file. + @type force: bool + """ + + # Create the distribution. + create_distribution(file=dist, dir=dir, model=model, force=force) + + def sobol_setup(max_num=200, oversample=100): """Oversampling setup for the quasi-random Sobol' sequence used for numerical PCS integration. Modified: branches/frame_order_cleanup/user_functions/frame_order.py URL: http://svn.gna.org/viewcvs/relax/branches/frame_order_cleanup/user_functions/frame_order.py?rev=25926&r1=25925&r2=25926&view=diff ============================================================================== --- branches/frame_order_cleanup/user_functions/frame_order.py (original) +++ branches/frame_order_cleanup/user_functions/frame_order.py Fri Sep 19 18:26:26 2014 @@ -22,14 +22,23 @@ # Module docstring. """The frame_order user function definitions.""" +# Python module imports. +import dep_check +if dep_check.wx_module: + from wx import FD_OPEN, FD_SAVE +else: + FD_OPEN = -1 + FD_SAVE = -1 + # relax module imports. from graphics import WIZARD_IMAGE_PATH from specific_analyses.frame_order.optimisation import count_sobol_points -from specific_analyses.frame_order.uf import sobol_setup, pdb_model, permute_axes, pivot, ref_domain, select_model +from specific_analyses.frame_order.uf import sobol_setup, pdb_model, permute_axes, pivot, ref_domain, select_model, simulate from specific_analyses.frame_order.variables import MODEL_DOUBLE_ROTOR, MODEL_FREE_ROTOR, MODEL_ISO_CONE, MODEL_ISO_CONE_FREE_ROTOR, MODEL_ISO_CONE_TORSIONLESS, MODEL_PSEUDO_ELLIPSE, MODEL_PSEUDO_ELLIPSE_FREE_ROTOR, MODEL_PSEUDO_ELLIPSE_TORSIONLESS, MODEL_RIGID, MODEL_ROTOR from user_functions.data import Uf_info; uf_info = Uf_info() from user_functions.data import Uf_tables; uf_tables = Uf_tables() from user_functions.objects import Desc_container +from user_functions.wildcards import WILDCARD_RELAX_SAVE # The user function class. @@ -73,15 +82,6 @@ arg_type = "str", desc_short = "PDB representation file root", desc = "The file root of the PDB file for the geometric object representation of the frame order dynamics.", - can_be_none = True -) -uf.add_keyarg( - name = "dist", - default = "domain_distribution", - py_type = "str", - arg_type = "str", - desc_short = "distribution file root", - desc = "The file root of the file which will contain multiple models spanning the full dynamics distribution of the frame order model.", can_be_none = True ) uf.add_keyarg( @@ -132,7 +132,7 @@ min = 1, py_type = "int", desc_short = "structural model", - desc = "Only one model from an analysed ensemble can be used for the PDB representation of the Monte Carlo simulations of the average domain position, as these consists of one model per simulation, and also for the distribution of structures.", + desc = "Only one model from an analysed ensemble can be used for the PDB representation of the Monte Carlo simulations of the average domain position, as these consists of one model per simulation.", wiz_element_type = "spin" ) uf.add_keyarg( @@ -144,15 +144,15 @@ ) # Description. uf.desc.append(Desc_container()) -uf.desc[-1].add_paragraph("This function creates a set of PDB files for representing the frame order cone models. This includes a file for the average position of the molecule, a file containing a geometric representation of the frame order motions, and a file containing a distribution of structures which sample the motional modes.") +uf.desc[-1].add_paragraph("This function creates a set of PDB files for representing the frame order cone models. This includes a file for the average position of the molecule and a file containing a geometric representation of the frame order motions.") uf.desc[-1].add_paragraph("The three files are specified via the file root whereby the extensions '.pdb', '.pdb.gz', etc. should not be provided. This is important for the geometric representation whereby different files are created for the positive and negative representations (due to symmetry in the NMR data, these cannot be differentiated), and for the Monte Carlo simulations. For example if the file root is 'frame_order', the positive and negative representations will be placed in the 'frame_order_pos.pdb.gz' and 'frame_order_neg.pdb.gz' files and the Monte Carlo simulations in the 'frame_order_sim_pos.pdb.gz' and 'frame_order_sim_neg.pdb.gz' files. For models where there is no difference in representation between the positive and negative directions, the files 'frame_order.pdb.gz' and 'frame_order_sim.pdb.gz' will be produced.") uf.desc[-1].add_paragraph("There are four different types of residue within the PDB. The pivot point is represented as as a single carbon atom of the residue 'PIV'. The cone consists of numerous H atoms of the residue 'CON'. The cone axis vector is presented as the residue 'AXE' with one carbon atom positioned at the pivot and the other x Angstroms away on the cone axis (set by the geometric object size). Finally, if Monte Carlo have been performed, there will be multiple 'MCC' residues representing the cone for each simulation, and multiple 'MCA' residues representing the multiple cone axes.") uf.desc[-1].add_paragraph("To create the diffusion in a cone PDB representation, a uniform distribution of vectors on a sphere is generated using spherical coordinates with the polar angle defined by the cone axis. By incrementing the polar angle using an arccos distribution, a radial array of vectors representing latitude are created while incrementing the azimuthal angle evenly creates the longitudinal vectors. These are all placed into the PDB file as H atoms and are all connected using PDB CONECT records. Each H atom is connected to its two neighbours on the both the longitude and latitude. This creates a geometric PDB object with longitudinal and latitudinal lines representing the filled cone.") -uf.desc[-1].add_paragraph("The PDB representation of the Monte Carlo simulations consists of one model per simulation. And the distribution of structures consists of one model per motional simulation step. Therefore if an ensemble of structures has been analysed ,only one model from the ensemble can be used for either representation. This defaults to model number 1, but this can be changed.") +uf.desc[-1].add_paragraph("The PDB representation of the Monte Carlo simulations consists of one model per simulation. Therefore if an ensemble of structures has been analysed, only one model from the ensemble can be used for the representation. This defaults to model number 1, but this can be changed.") uf.backend = pdb_model uf.menu_text = "pdb_&model" uf.gui_icon = "oxygen.actions.document-save" -uf.wizard_height_desc = 370 +uf.wizard_height_desc = 400 uf.wizard_size = (1000, 750) uf.wizard_image = WIZARD_IMAGE_PATH + 'frame_order.png' @@ -333,6 +333,94 @@ uf.wizard_image = WIZARD_IMAGE_PATH + 'frame_order.png' +# The frame_order.simulate user function. +uf = uf_info.add_uf('frame_order.simulate') +uf.title = "Pseudo-Brownian dynamics simulation of the frame order motions." +uf.title_short = "Frame order pseudo-Brownian dynamics simulation." +uf.add_keyarg( + name = "file", + default = "simulation.pdb.bz2", + py_type = "str", + arg_type = "file sel", + desc_short = "simulation file", + desc = "The PDB file for storing the frame order pseudo-Brownian dynamics simulation. The compression is determined automatically by the file extensions '*.pdb', '*.pdb.gz', and '*.pdb.bz2'.", + wiz_filesel_wildcard = WILDCARD_RELAX_SAVE, + wiz_filesel_style = FD_OPEN, + wiz_filesel_preview = False +) +uf.add_keyarg( + name = "dir", + py_type = "str", + arg_type = "dir", + desc_short = "directory name", + desc = "The directory where the files are to be located.", + can_be_none = True +) +uf.add_keyarg( + name = "step_size", + default = 2.0, + py_type = "float", + desc_short = "angle of rotation", + desc = "The rotation will be of a random direction but with this fixed angle. The value is in degrees." +) +uf.add_keyarg( + name = "snapshot", + default = 10, + min = 1, + max = 1000000, + py_type = "int", + desc_short = "number of steps per snapshot", + desc = "The number of steps in the simulation when snapshots will be taken." +) +uf.add_keyarg( + name = "total", + default = 1000, + min = 1, + max = 1000000, + py_type = "int", + desc_short = "total number of snapshots", + desc = "The total number of snapshots to take before stopping the simulation.", + wiz_element_type = "spin" +) +uf.add_keyarg( + name = "model", + default = 1, + min = 1, + py_type = "int", + desc_short = "original structural model", + desc = "Only one model from an analysed ensemble of structures can be used for the pseudo-Brownian simulation, as the simulation and corresponding PDB file consists of one model per simulation.", + wiz_element_type = "spin" +) +uf.add_keyarg( + name = "force", + default = False, + py_type = "bool", + desc_short = "force flag", + desc = "A flag which, if set to True, will overwrite the any pre-existing file." +) +# Description. +uf.desc.append(Desc_container()) +uf.desc[-1].add_paragraph("To visualise the frame order motions, this user function performs a type of simulation whereby structures are randomly rotated by a fixed angle within the bounds of the uniform distribution of the frame order model. This can be thought of as a pseudo-Brownian dynamics simulation. It is in no way a real molecular or Brownian dynamics simulation.") +uf.desc[-1].add_paragraph("Note that the RDC and PCS data does not contain information about all parts of the real distribution of structures. Therefore the snapshots in this simulation only represent the components of the distribution present in the data, as modelled by the frame order models.") +uf.desc[-1].add_paragraph("The simulation algorithm is as follows. The current state is initially defined as the identity matrix I. The maximum opening angle theta or the torsion angle sigma are defined by the parameter values of the frame order model. The algorithm for one step of the simulation is:") +uf.desc[-1].add_item_list_element("1", "Generate a random vector in 3D.") +uf.desc[-1].add_item_list_element("2", "Construct a rotation matrix from the random vector and the fixed rotation angle.") +uf.desc[-1].add_item_list_element("3", "Pre-multiply the current state by the rotation matrix.") +uf.desc[-1].add_item_list_element("4", "Decompose the new state into the torsion-tilt angles.") +uf.desc[-1].add_item_list_element("5", "If theta or sigma are greater than model parameter values, set them to these maximum values.") +uf.desc[-1].add_item_list_element("6", "Back convert the modified torsion-tilt angles to a rotation matrix - this is the current state.") +uf.desc[-1].add_item_list_element("7", "Store a snapshot if the correct number of iterations has been reached. This consists of rotating a new model about the pivot(s), as defined by the frame order model.") +uf.desc[-1].add_item_list_element("8", "Terminate the loop if the maximum number of snapshots has been reached.") +uf.desc[-1].add_paragraph("The setting of the steps outside of the distribution to the maximum parameter values is specifically to allow for models with parameter values close to zero. Without this, the simulation would take a huge amount of time to complete.") +uf.desc[-1].add_paragraph("As the simulation consists of one model per snapshot, if an ensemble of structures has been analysed, only one model from the ensemble can be used for the representation. This defaults to model number 1, but this can be changed.") +uf.backend = simulate +uf.menu_text = "simula&te" +uf.gui_icon = "oxygen.actions.document-save" +uf.wizard_height_desc = 420 +uf.wizard_size = (1000, 750) +uf.wizard_image = WIZARD_IMAGE_PATH + 'frame_order.png' + + # The frame_order.sobol_setup user function. uf = uf_info.add_uf('frame_order.sobol_setup') uf.title = "Set up the quasi-random Sobol' sequence points for numerical PCS integration."