Example #1
0
def average_position(structure=None, models=None, sim=None):
    """Shift the given structural object to the average position.

    @keyword structure: The structural object to operate on.
    @type structure:    lib.structure.internal.object.Internal instance
    @keyword models:    The list of models to shift.
    @type models:       list of int
    @keyword sim:       A flag which if True will use the Monte Carlo simulation results.  In this case, the model list should be set to the simulation indices plus 1 and the structural object should have one model per simulation already set up.
    @type sim:          bool
    """

    # The selection object.
    selection = structure.selection(atom_id=domain_moving())

    # Loop over each model.
    for i in range(len(models)):
        # First rotate the moving domain to the average position.
        R = zeros((3, 3), float64)
        if hasattr(cdp, 'ave_pos_alpha'):
            if sim:
                euler_to_R_zyz(cdp.ave_pos_alpha_sim[i],
                               cdp.ave_pos_beta_sim[i],
                               cdp.ave_pos_gamma_sim[i], R)
            else:
                euler_to_R_zyz(cdp.ave_pos_alpha, cdp.ave_pos_beta,
                               cdp.ave_pos_gamma, R)
        else:
            if sim:
                euler_to_R_zyz(0.0, cdp.ave_pos_beta_sim[i],
                               cdp.ave_pos_gamma_sim[i], R)
            else:
                euler_to_R_zyz(0.0, cdp.ave_pos_beta, cdp.ave_pos_gamma, R)
        origin = pipe_centre_of_mass(atom_id=domain_moving(),
                                     verbosity=0,
                                     missing_error=False)
        structure.rotate(R=R,
                         origin=origin,
                         model=models[i],
                         selection=selection)

        # Then translate the moving domain.
        if sim:
            T = [
                cdp.ave_pos_x_sim[i], cdp.ave_pos_y_sim[i],
                cdp.ave_pos_z_sim[i]
            ]
        else:
            T = [cdp.ave_pos_x, cdp.ave_pos_y, cdp.ave_pos_z]
        structure.translate(T=T, model=models[i], selection=selection)
Example #2
0
File: api.py Project: tlinnet/relax
    def base_data_loop(self):
        """Generator method for looping over the base data - RDCs and PCSs.

        This loop yields the following:

            - The RDC identification data for the interatomic data container and alignment.
            - The PCS identification data for the spin data container and alignment.

        @return:    The base data type ('rdc' or 'pcs'), the spin or interatomic data container information (either one or two spin hashes), and the alignment ID string.
        @rtype:     list of str
        """

        # Loop over the interatomic data containers for the moving domain (for the RDC data).
        for interatom in interatomic_loop(selection1=domain_moving()):
            # Skip deselected containers.
            if not interatom.select:
                continue

            # No RDC, so skip.
            if not hasattr(interatom, 'rdc'):
                continue

            # Loop over the alignment IDs.
            for align_id in cdp.rdc_ids:
                # Yield the info set.
                if align_id in interatom.rdc and interatom.rdc[
                        align_id] != None:
                    yield [
                        'rdc', interatom._spin_hash1, interatom._spin_hash2,
                        align_id
                    ]

        # Loop over the spin containers for the moving domain (for the PCS data).
        for spin, spin_id in spin_loop(selection=domain_moving(),
                                       return_id=True):
            # Skip deselected spins.
            if not spin.select:
                continue

            # No PCS, so skip.
            if not hasattr(spin, 'pcs'):
                continue

            # Loop over the alignment IDs.
            for align_id in cdp.pcs_ids:
                # Yield the info set.
                if align_id in spin.pcs and spin.pcs[align_id] != None:
                    yield ['pcs', spin_id, align_id]
Example #3
0
    def overfit_deselect(self, data_check=True, verbose=True):
        """Deselect spins which have insufficient data to support minimisation.

        @keyword data_check:    A flag to signal if the presence of base data is to be checked for.
        @type data_check:       bool
        @keyword verbose:       A flag which if True will allow printouts.
        @type verbose:          bool
        """

        # Nothing to do.
        if not data_check:
            return

        # Loop over spin data, checking for PCS data.
        ids = []
        for spin, spin_id in spin_loop(return_id=True, skip_desel=True):
            if not hasattr(spin, 'pcs'):
                spin.select = False
                ids.append(spin_id)
        if verbose and len(ids):
            warn(RelaxWarning("No PCS data is present, deselecting the spins %s." % ids))

        # Loop over the interatomic data containers, checking for RDC data.
        ids = []
        for interatom in interatomic_loop(selection1=domain_moving()):
            if not hasattr(interatom, 'rdc'):
                interatom.select = False
                ids.append("%s - %s" % (interatom.spin_id1, interatom.spin_id2))
        if verbose and len(ids):
            warn(RelaxWarning("No RDC data is present, deselecting the interatomic data containers between spin pairs %s." % ids))
Example #4
0
    def base_data_loop(self):
        """Generator method for looping over the base data - RDCs and PCSs.

        This loop yields the following:

            - The RDC identification data for the interatomic data container and alignment.
            - The PCS identification data for the spin data container and alignment.

        @return:    The base data type ('rdc' or 'pcs'), the spin or interatomic data container information (either one or two spin IDs), and the alignment ID string.
        @rtype:     list of str
        """

        # Loop over the interatomic data containers for the moving domain (for the RDC data).
        for interatom in interatomic_loop(selection1=domain_moving()):
            # Skip deselected containers.
            if not interatom.select:
                continue

            # No RDC, so skip.
            if not hasattr(interatom, 'rdc'):
                continue

            # Loop over the alignment IDs.
            for align_id in cdp.rdc_ids:
                # Yield the info set.
                if align_id in interatom.rdc and interatom.rdc[align_id] != None:
                    yield ['rdc', interatom.spin_id1, interatom.spin_id2, align_id]

        # Loop over the spin containers for the moving domain (for the PCS data).
        for spin, spin_id in spin_loop(selection=domain_moving(), return_id=True):
            # Skip deselected spins.
            if not spin.select:
                continue

            # No PCS, so skip.
            if not hasattr(spin, 'pcs'):
                continue

            # Loop over the alignment IDs.
            for align_id in cdp.pcs_ids:
                # Yield the info set.
                if align_id in spin.pcs and spin.pcs[align_id] != None:
                    yield ['pcs', spin_id, align_id]
Example #5
0
def average_position(structure=None, models=None, sim=None):
    """Shift the given structural object to the average position.

    @keyword structure: The structural object to operate on.
    @type structure:    lib.structure.internal.object.Internal instance
    @keyword models:    The list of models to shift.
    @type models:       list of int
    @keyword sim:       A flag which if True will use the Monte Carlo simulation results.  In this case, the model list should be set to the simulation indices plus 1 and the structural object should have one model per simulation already set up.
    @type sim:          bool
    """

    # The selection object.
    selection = structure.selection(atom_id=domain_moving())

    # Loop over each model.
    for i in range(len(models)):
        # First rotate the moving domain to the average position.
        R = zeros((3, 3), float64)
        if hasattr(cdp, 'ave_pos_alpha'):
            if sim:
                euler_to_R_zyz(cdp.ave_pos_alpha_sim[i], cdp.ave_pos_beta_sim[i], cdp.ave_pos_gamma_sim[i], R)
            else:
                euler_to_R_zyz(cdp.ave_pos_alpha, cdp.ave_pos_beta, cdp.ave_pos_gamma, R)
        else:
            if sim:
                euler_to_R_zyz(0.0, cdp.ave_pos_beta_sim[i], cdp.ave_pos_gamma_sim[i], R)
            else:
                euler_to_R_zyz(0.0, cdp.ave_pos_beta, cdp.ave_pos_gamma, R)
        origin = pipe_centre_of_mass(atom_id=domain_moving(), verbosity=0, missing_error=False)
        structure.rotate(R=R, origin=origin, model=models[i], selection=selection)

        # Then translate the moving domain.
        if sim:
            T = [cdp.ave_pos_x_sim[i], cdp.ave_pos_y_sim[i], cdp.ave_pos_z_sim[i]]
        else:
            T = [cdp.ave_pos_x, cdp.ave_pos_y, cdp.ave_pos_z]
        structure.translate(T=T, model=models[i], selection=selection)
Example #6
0
File: api.py Project: tlinnet/relax
    def overfit_deselect(self, data_check=True, verbose=True):
        """Deselect spins which have insufficient data to support minimisation.

        @keyword data_check:    A flag to signal if the presence of base data is to be checked for.
        @type data_check:       bool
        @keyword verbose:       A flag which if True will allow printouts.
        @type verbose:          bool
        """

        # Nothing to do.
        if not data_check:
            return

        # Loop over spin data, checking for PCS data.
        ids = []
        for spin, spin_id in spin_loop(return_id=True, skip_desel=True):
            if not hasattr(spin, 'pcs'):
                spin.select = False
                ids.append(spin_id)
        if verbose and len(ids):
            warn(
                RelaxWarning(
                    "No PCS data is present, deselecting the spins %s." % ids))

        # Loop over the interatomic data containers, checking for RDC data.
        ids = []
        for interatom in interatomic_loop(selection1=domain_moving()):
            if not hasattr(interatom, 'rdc'):
                interatom.select = False
                ids.append("%s - %s" %
                           (interatom.spin_id1, interatom.spin_id2))
        if verbose and len(ids):
            warn(
                RelaxWarning(
                    "No RDC data is present, deselecting the interatomic data containers between spin pairs %s."
                    % ids))
Example #7
0
def distribute(file="distribution.pdb.bz2", dir=None, atom_id=None, total=1000, max_rotations=100000, model=1, force=True):
    """Create a uniform distribution of structures for the frame order motions.

    @keyword file:          The PDB file for storing the frame order motional distribution.  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 atom_id:       The atom identification string to allow the distribution to be a subset of all atoms.
    @type atom_id:          None or str
    @keyword total:         The total number of states/model/structures in the distribution.
    @type total:            int
    @keyword max_rotations: The maximum number of rotations to generate the distribution from.  This prevents an execution for an infinite amount of time when a frame order amplitude parameter is close to zero so that the subset of all rotations within the distribution is close to zero.
    @type max_rotations:    int
    @keyword model:         Only one model from an analysed ensemble of structures can be used for the distribution, as the corresponding PDB file consists of one model per state.
    @type model:            int
    @keyword force:         A flag which, if set to True, will overwrite the any pre-existing file.
    @type force:            bool
    """

    # Printout.
    print("Uniform distribution of structures representing the frame order motions.")

    # Check the total.
    if total > 9999:
        raise RelaxError("A maximum of 9999 models is allowed in the PDB format.")

    # Checks.
    check_pipe()
    check_model()
    check_domain()
    check_parameters()
    check_pivot()

    # Skip the rigid model.
    if cdp.model == MODEL_RIGID:
        print("Skipping the rigid model.")
        return

    # Open the output file.
    file = open_write_file(file_name=file, dir=dir, force=force)

    # The parameter values.
    values = assemble_param_vector()
    params = {}
    i = 0
    for name in cdp.params:
        params[name] = values[i]
        i += 1

    # The structure.
    structure = deepcopy(cdp.structure)
    if structure.num_models() > 1:
        structure.collapse_ensemble(model_num=model)

    # The pivot points.
    num_states = 1
    if cdp.model == MODEL_DOUBLE_ROTOR:
        num_states = 2
    pivot = zeros((num_states, 3), float64)
    for i in range(num_states):
        pivot[i] = generate_pivot(order=i+1, pdb_limit=True)

    # Shift to the average position.
    average_position(structure=structure, models=[None])

    # The motional eigenframe.
    frame = generate_axis_system()

    # Only work with a subset.
    if atom_id:
        # The inverted selection.
        selection = structure.selection(atom_id=atom_id, inv=True)

        # Delete the data.
        structure.delete(selection=selection, verbosity=0)

    # Create the distribution.
    uniform_distribution(file=file, model=cdp.model, structure=structure, parameters=params, eigenframe=frame, pivot=pivot, atom_id=domain_moving(), total=total, max_rotations=max_rotations)

    # Close the file.
    file.close()
Example #8
0
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
    """

    # Printout.
    print("Pseudo-Brownian dynamics simulation of the frame order motions.")

    # Checks.
    check_pipe()
    check_model()
    check_domain()
    check_parameters()
    check_pivot()

    # Skip the rigid model.
    if cdp.model == MODEL_RIGID:
        print("Skipping the rigid model.")
        return

    # Open the output file.
    file = open_write_file(file_name=file, dir=dir, force=force)

    # The parameter values.
    values = assemble_param_vector()
    params = {}
    i = 0
    for name in cdp.params:
        params[name] = values[i]
        i += 1

    # The structure.
    structure = deepcopy(cdp.structure)
    if structure.num_models() > 1:
        structure.collapse_ensemble(model_num=model)

    # The pivot points.
    num_states = 1
    if cdp.model == MODEL_DOUBLE_ROTOR:
        num_states = 2
    pivot = zeros((num_states, 3), float64)
    for i in range(num_states):
        pivot[i] = generate_pivot(order=i+1, pdb_limit=True)

    # Shift to the average position.
    average_position(structure=structure, models=[None])

    # The motional eigenframe.
    frame = generate_axis_system()

    # Create the distribution.
    brownian(file=file, model=cdp.model, structure=structure, parameters=params, eigenframe=frame, pivot=pivot, atom_id=domain_moving(), step_size=step_size, snapshot=snapshot, total=total)

    # Close the file.
    file.close()
Example #9
0
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
    """

    # Printout.
    print("Pseudo-Brownian dynamics simulation of the frame order motions.")

    # Checks.
    check_pipe()
    check_model()
    check_domain()
    check_parameters()
    check_pivot()

    # Skip the rigid model.
    if cdp.model == MODEL_RIGID:
        print("Skipping the rigid model.")
        return

    # Open the output file.
    file = open_write_file(file_name=file, dir=dir, force=force)

    # The parameter values.
    values = assemble_param_vector()
    params = {}
    i = 0
    for name in cdp.params:
        params[name] = values[i]
        i += 1

    # The structure.
    structure = deepcopy(cdp.structure)
    if structure.num_models() > 1:
        structure.collapse_ensemble(model_num=model)

    # The pivot points.
    num_states = 1
    if cdp.model == MODEL_DOUBLE_ROTOR:
        num_states = 2
    pivot = zeros((num_states, 3), float64)
    for i in range(num_states):
        pivot[i] = generate_pivot(order=i + 1, pdb_limit=True)

    # Shift to the average position.
    average_position(structure=structure, models=[None])

    # The motional eigenframe.
    frame = generate_axis_system()

    # Create the distribution.
    brownian(file=file,
             model=cdp.model,
             structure=structure,
             parameters=params,
             eigenframe=frame,
             pivot=pivot,
             atom_id=domain_moving(),
             step_size=step_size,
             snapshot=snapshot,
             total=total)

    # Close the file.
    file.close()
Example #10
0
def distribute(file="distribution.pdb.bz2",
               dir=None,
               atom_id=None,
               total=1000,
               max_rotations=100000,
               model=1,
               force=True):
    """Create a uniform distribution of structures for the frame order motions.

    @keyword file:          The PDB file for storing the frame order motional distribution.  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 atom_id:       The atom identification string to allow the distribution to be a subset of all atoms.
    @type atom_id:          None or str
    @keyword total:         The total number of states/model/structures in the distribution.
    @type total:            int
    @keyword max_rotations: The maximum number of rotations to generate the distribution from.  This prevents an execution for an infinite amount of time when a frame order amplitude parameter is close to zero so that the subset of all rotations within the distribution is close to zero.
    @type max_rotations:    int
    @keyword model:         Only one model from an analysed ensemble of structures can be used for the distribution, as the corresponding PDB file consists of one model per state.
    @type model:            int
    @keyword force:         A flag which, if set to True, will overwrite the any pre-existing file.
    @type force:            bool
    """

    # Printout.
    print(
        "Uniform distribution of structures representing the frame order motions."
    )

    # Check the total.
    if total > 9999:
        raise RelaxError(
            "A maximum of 9999 models is allowed in the PDB format.")

    # Checks.
    check_pipe()
    check_model()
    check_domain()
    check_parameters()
    check_pivot()

    # Skip the rigid model.
    if cdp.model == MODEL_RIGID:
        print("Skipping the rigid model.")
        return

    # Open the output file.
    file = open_write_file(file_name=file, dir=dir, force=force)

    # The parameter values.
    values = assemble_param_vector()
    params = {}
    i = 0
    for name in cdp.params:
        params[name] = values[i]
        i += 1

    # The structure.
    structure = deepcopy(cdp.structure)
    if structure.num_models() > 1:
        structure.collapse_ensemble(model_num=model)

    # The pivot points.
    num_states = 1
    if cdp.model == MODEL_DOUBLE_ROTOR:
        num_states = 2
    pivot = zeros((num_states, 3), float64)
    for i in range(num_states):
        pivot[i] = generate_pivot(order=i + 1, pdb_limit=True)

    # Shift to the average position.
    average_position(structure=structure, models=[None])

    # The motional eigenframe.
    frame = generate_axis_system()

    # Only work with a subset.
    if atom_id:
        # The inverted selection.
        selection = structure.selection(atom_id=atom_id, inv=True)

        # Delete the data.
        structure.delete(selection=selection, verbosity=0)

    # Create the distribution.
    uniform_distribution(file=file,
                         model=cdp.model,
                         structure=structure,
                         parameters=params,
                         eigenframe=frame,
                         pivot=pivot,
                         atom_id=domain_moving(),
                         total=total,
                         max_rotations=max_rotations)

    # Close the file.
    file.close()
Example #11
0
File: uf.py Project: tlinnet/relax
def decompose(root="decomposed", dir=None, atom_id=None, model=1, force=True):
    """Structural representation of the individual frame order motional components.

    @keyword root:          The file root for the PDB files created.  Each motional component will be represented by a different PDB file appended with '_mode1.pdb', '_mode2.pdb', '_mode3.pdb', etc.
    @type root:             str
    @keyword dir:           The directory name to place the file into.
    @type dir:              str or None
    @keyword atom_id:       The atom identification string to allow the decomposition to be applied to subset of all atoms.
    @type atom_id:          None or str
    @keyword model:         Only one model from an analysed ensemble of structures can be used for the decomposition, as the corresponding PDB file consists of one model per state.
    @type model:            int
    @keyword force:         A flag which, if set to True, will overwrite the any pre-existing file.
    @type force:            bool
    """

    # Printout.
    print(
        "PDB representation of the individual components of the frame order motions."
    )

    # Checks.
    check_pipe()
    check_model()
    check_domain()
    check_parameters()
    check_pivot()

    # Skip any unsupported models.
    unsupported = [MODEL_RIGID, MODEL_DOUBLE_ROTOR]
    if cdp.model in unsupported:
        print("Skipping the unsupported '%s' model." % cdp.model)
        return

    # Initialise the angle vector (cone opening angle 1, cone opening angle 2, torsion angle).
    angles = zeros(3, float64)

    # Cone opening.
    if cdp.model in MODEL_LIST_ISO_CONE:
        angles[0] = angles[1] = cdp.cone_theta
    elif cdp.model in MODEL_LIST_PSEUDO_ELLIPSE:
        angles[0] = cdp.cone_theta_y
        angles[1] = cdp.cone_theta_x

    # Non-zero torsion angle.
    if cdp.model in MODEL_LIST_FREE_ROTORS:
        angles[2] = pi
    elif cdp.model in MODEL_LIST_RESTRICTED_TORSION:
        angles[2] = cdp.cone_sigma_max

    # The motional eigenframe.
    frame = generate_axis_system()

    # Mode ordering from largest to smallest.
    indices = argsort(angles)
    angles = angles[indices[::-1]]
    frame = transpose(transpose(frame)[indices[::-1]])

    # The pivot point.
    pivot = generate_pivot(order=1, pdb_limit=True)

    # Loop over each mode.
    for i in range(3):
        # Skip modes with no motion.
        if angles[i] < 1e-7:
            continue

        # Open the output file.
        file_name = "%s_mode%i.pdb" % (root, i + 1)
        file = open_write_file(file_name=file_name, dir=dir, force=force)

        # The structure.
        structure = deepcopy(cdp.structure)
        if structure.num_models() > 1:
            structure.collapse_ensemble(model_num=model)

        # Shift to the average position.
        average_position(structure=structure, models=[None])

        # Create the representation.
        mode_distribution(file=file,
                          structure=structure,
                          axis=frame[:, i],
                          angle=angles[i],
                          pivot=pivot,
                          atom_id=domain_moving())

        # Close the file.
        file.close()