Exemplo n.º 1
0
def identity_matrix_index(matrices):

    from Matrix import is_identity_matrix
    for i in range(len(matrices)):
        if is_identity_matrix(matrices[i]):
            return i
    return None
Exemplo n.º 2
0
def identity_matrix_index(matrices):

    from Matrix import is_identity_matrix
    for i in range(len(matrices)):
        if is_identity_matrix(matrices[i]):
            return i
    return None
Exemplo n.º 3
0
def create_symmetry_copies(mol,
                           csys,
                           tflist,
                           cdist,
                           rdist,
                           exclude_identity=True):

    if exclude_identity:
        from Matrix import is_identity_matrix
        tflist = [tf for tf in tflist if not is_identity_matrix(tf)]

    close_contacts = not cdist is None
    close_centers = not rdist is None
    if not close_contacts and not close_centers:
        transforms = tflist  # Use all transforms
    elif close_contacts and not close_centers:
        transforms = contacting_transforms(mol, csys, tflist, cdist)
    elif close_centers and not close_contacts:
        transforms = close_center_transforms(mol, csys, tflist, rdist)
    else:
        transforms = unique(
            contacting_transforms(mol, csys, tflist, cdist) +
            close_center_transforms(mol, csys, tflist, rdist))

    if hasattr(mol, 'symmetry_copies'):
        remove_symmetry_copies(mol)

    copies = []
    from chimera import openModels, replyobj
    from PDBmatrices import copy_molecule
    from Matrix import chimera_xform
    for tf in transforms:
        copy = copy_molecule(mol)
        copy.symmetry_xform = chimera_xform(tf)
        copies.append(copy)
        replyobj.status('Created symmetry copy %d of %d' %
                        (len(copies), len(transforms)))

    if len(copies) == 0:
        return copies

    openModels.add(copies)
    replyobj.status('')

    mol.symmetry_copies = copies
    mol.symmetry_reference_model = csys

    # TODO: Set xform before opening so that code that detects open sees
    # the correct position.  Currently not possible.  Bug 4486.
    update_symmetry_positions(mol)

    return copies
Exemplo n.º 4
0
def check_orthogonality(matrices, name, tolerance):

    from Matrix import transpose_matrix, multiply_matrices, is_identity_matrix
    for mindex, m in enumerate(matrices):
        mr = zero_translation(m)
        mrt = transpose_matrix(mr)
        p = multiply_matrices(mr, mrt)
        if not is_identity_matrix(p, tolerance):
            print ('%s matrix %d is not orthogonal, tolerance %.3g' %
                   (name, mindex, tolerance))
            print_matrix(m, '%10.5f')
            print '  matrix times transpose = '
            print_matrix(p, '%10.5f')
Exemplo n.º 5
0
def check_orthogonality(matrices, name, tolerance):

    from Matrix import transpose_matrix, multiply_matrices, is_identity_matrix
    for mindex, m in enumerate(matrices):
        mr = zero_translation(m)
        mrt = transpose_matrix(mr)
        p = multiply_matrices(mr, mrt)
        if not is_identity_matrix(p, tolerance):
            print('%s matrix %d is not orthogonal, tolerance %.3g' %
                  (name, mindex, tolerance))
            print_matrix(m, '%10.5f')
            print '  matrix times transpose = '
            print_matrix(p, '%10.5f')
Exemplo n.º 6
0
def create_symmetry_copies(mol, csys, tflist, cdist, rdist,
                           exclude_identity = True):

    if exclude_identity:
        from Matrix import is_identity_matrix
        tflist = [tf for tf in tflist if not is_identity_matrix(tf)]

    close_contacts = not cdist is None
    close_centers = not rdist is None
    if not close_contacts and not close_centers:
        transforms = tflist     # Use all transforms
    elif close_contacts and not close_centers:
        transforms = contacting_transforms(mol, csys, tflist, cdist)
    elif close_centers and not close_contacts:
        transforms = close_center_transforms(mol, csys, tflist, rdist)
    else:
        transforms = unique(contacting_transforms(mol, csys, tflist, cdist) +
                            close_center_transforms(mol, csys, tflist, rdist))

    if hasattr(mol, 'symmetry_copies'):
        remove_symmetry_copies(mol)

    copies = []
    from chimera import openModels, replyobj
    from PDBmatrices import copy_molecule
    from Matrix import chimera_xform
    for tf in transforms:
        copy = copy_molecule(mol)
        copy.symmetry_xform = chimera_xform(tf)
        copies.append(copy)
        replyobj.status('Created symmetry copy %d of %d'
                        % (len(copies), len(transforms)))

    if len(copies) == 0:
        return copies

    openModels.add(copies)
    replyobj.status('')

    mol.symmetry_copies = copies
    mol.symmetry_reference_model = csys

    # TODO: Set xform before opening so that code that detects open sees
    # the correct position.  Currently not possible.  Bug 4486.
    update_symmetry_positions(mol)

    return copies
Exemplo n.º 7
0
def make_asu_copies(m, asu_list, crystal):

    xflist = []
    names = []
    from Matrix import is_identity_matrix, chimera_xform
    for asu in asu_list:
        if is_identity_matrix(asu.transform):
            continue
        xflist.append(chimera_xform(asu.transform))
        name = '%s %s' % (m.name, '%d %d %d' % asu.unit_cell_index)
        if len(crystal.smtry_matrices) > 1:
            name += ' sym %d' % asu.smtry_index
        if len(crystal.ncs_matrices) > 1:
            name += ' ncs %d' % asu.ncs_index
        names.append(name)
    cmodels = make_molecule_copies(m, xflist, names)
    return cmodels
Exemplo n.º 8
0
def make_asu_copies(m, asu_list, crystal):

    xflist = []
    names = []
    from Matrix import is_identity_matrix, chimera_xform
    for asu in asu_list:
        if is_identity_matrix(asu.transform):
            continue
        xflist.append(chimera_xform(asu.transform))
        name = '%s %s' % (m.name, '%d %d %d' % asu.unit_cell_index)
        if len(crystal.smtry_matrices) > 1:
            name += ' sym %d' % asu.smtry_index
        if len(crystal.ncs_matrices) > 1:
            name += ' ncs %d' % asu.ncs_index
        names.append(name)
    cmodels = make_molecule_copies(m, xflist, names)
    return cmodels
Exemplo n.º 9
0
def place_molecule_copies(m, tflist):
  
  path, file_type, default_file_type, prefixable_type = m.openedAs
    
  from Molecule import copy_molecule, transform_atom_positions
  from Matrix import is_identity_matrix
  for i,tf in enumerate(tflist):
    if is_identity_matrix(tf):
      continue
    name = m.name + (' #%d' % (i+1))
    c = find_model_by_name(name)
    if c is None:
      c = copy_molecule(m)
      c.name = name
      transform_atom_positions(c.atoms, tf)
      chimera.openModels.add([c])
    else:
      transform_atom_positions(c.atoms, tf, m.atoms)
def place_molecule_copies(m, tflist):

    path, file_type, default_file_type, prefixable_type = m.openedAs

    from Molecule import copy_molecule, transform_atom_positions
    from Matrix import is_identity_matrix
    for i, tf in enumerate(tflist):
        if is_identity_matrix(tf):
            continue
        name = m.name + (' #%d' % (i + 1))
        c = find_model_by_name(name)
        if c is None:
            c = copy_molecule(m)
            c.name = name
            transform_atom_positions(c.atoms, tf)
            chimera.openModels.add([c])
        else:
            transform_atom_positions(c.atoms, tf, m.atoms)
def surface_geometry(plist, tf, pad):

    surfaces = []
    for p in plist:
        surfs = []
        va, ta = p.maskedGeometry(p.Solid)
        na = p.normals
        if isinstance(pad, (float, int)) and pad != 0:
            varray, tarray = offset_surface(va, ta, na, pad)
        elif isinstance(pad, (list, tuple)) and len(pad) == 2:
            varray, tarray = slab_surface(va, ta, na, pad)
        else:
            varray, tarray = va, ta

        if not tf is None:
            from Matrix import xform_matrix, multiply_matrices, is_identity_matrix
            vtf = multiply_matrices(tf, xform_matrix(p.model.openState.xform))
            if not is_identity_matrix(vtf):
                apply_transform(vtf, varray)

        surfaces.append((varray, tarray))

    return surfaces
Exemplo n.º 12
0
def surface_geometry(plist, tf, pad):

  surfaces = []
  for p in plist:
    surfs = []
    va, ta = p.maskedGeometry(p.Solid)
    na = p.normals
    if isinstance(pad, (float,int)) and pad != 0:
      varray, tarray = offset_surface(va, ta, na, pad)
    elif isinstance(pad, (list,tuple)) and len(pad) == 2:
      varray, tarray = slab_surface(va, ta, na, pad)
    else:
      varray, tarray = va, ta

    if not tf is None:
      from Matrix import xform_matrix, multiply_matrices, is_identity_matrix
      vtf = multiply_matrices(tf, xform_matrix(p.model.openState.xform))
      if not is_identity_matrix(vtf):
        apply_transform(vtf, varray)

    surfaces.append((varray, tarray))

  return surfaces
Exemplo n.º 13
0
def group_symmetries(group, center, axis, mol):

    from Commands import CommandError

    g0 = group[:1].lower()
    if g0 in ('c', 'd'):
        # Cyclic or dihedral symmetry: C<n>, D<n>
        try:
            n = int(group[1:])
        except ValueError:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        if n < 2:
            raise CommandError, 'Cn or Dn with n = %d < 2' % (n,)
        if g0 == 'c':
            tflist = cyclic_symmetries(n)
        else:
            tflist = dihedral_symmetries(n)
    elif g0 == 'i':
        # Icosahedral symmetry: i[,<orientation>]
        import Icosahedron as icos
        gfields = group.split(',')
        if len(gfields) == 1:
            orientation = '222'
        elif len(gfields) == 2:
            orientation = gfields[1]
            if not orientation in icos.coordinate_system_names:
                raise CommandError, ('Unknown icosahedron orientation "%s"'
                                     % orientation)
        else:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        tflist = icos.icosahedral_symmetry_matrices(orientation)
    elif g0 == 'h':
        # Helical symmetry: h,<repeat>,<rise>[,<angle>[,<n>,<offet>]]
        gfields = group.split(',')
        nf = len(gfields)
        if nf < 3 or nf > 6:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        try:
            param = [float(f) for f in gfields[1:]]
        except ValueError:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        if len(param) == 2:
            param.append(360.0)
        if len(param) == 3:
            param.append(int(param[0]))
        if len(param) == 4:
            param.append(0)
        repeat, rise, angle, n, offset = param
        tflist = helical_symmetry(repeat, rise, angle, n, offset)
    elif g0 == 't':
        # Translation symmetry: t,<n>,<distance> or t,<n>,<dx>,<dy>,<dz>
        gfields = group.split(',')
        nf = len(gfields)
        if nf != 3 and nf != 5:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        try:
            param = [float(f) for f in gfields[1:]]
        except ValueError:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        n = param[0]
        if n != int(n):
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        if nf == 3:
          delta = (0,0,param[1])
        else:
          delta = param[1:]
        tflist = translation_symmetry(n, delta)
    elif group.lower() == 'biomt':
        # BIOMT biological unit matrices from PDB file header.
        if not hasattr(mol, 'pdbHeaders'):
            msg = 'Molecule %s has no BIOMT matrices or PDB headers' % mol.name
            raise CommandError, msg
        from PDBmatrices import pdb_biomt_matrices
        tflist = pdb_biomt_matrices(mol.pdbHeaders)
        if len(tflist) == 0:
            msg = 'Molecule %s has no BIOMT matrices in PDB header' % mol.name
            raise CommandError, msg
        from Matrix import is_identity_matrix
        if len(tflist) == 1 and is_identity_matrix(tflist[0]):
            msg = 'Molecule %s has only identity BIOMT matrix in PDB header' % mol.name
            raise CommandError, msg
    else:
        raise CommandError, 'Unknown symmetry group "%s"' % group

    # Apply center and axis transformation.
    if tuple(center) != (0,0,0) or tuple(axis) != (0,0,1):
        import Matrix as m
        tf = m.multiply_matrices(m.vector_rotation_transform(axis, (0,0,1)),
                                 m.translation_matrix([-c for c in center]))
        tfinv = m.invert_matrix(tf)
        tflist = [m.multiply_matrices(tfinv, t, tf) for t in tflist]

    return tflist
Exemplo n.º 14
0
mc = molecule_center(molecule)
tflist = Crystal.pack_unit_cell(uc, gorigin, mc, tflist)

# Make multiple unit cells
#nc = self.number_of_cells()
nc = (3, 3, 3)
#if nc != (1,1,1) and uc:
# Compute origin.
oc_val = (1, 1, 1)
oc = tuple((((o + n - 1) % n) - (n - 1)) for o, n in zip(oc_val, nc))
tflist = Crystal.unit_cell_translations(uc, oc, nc, tflist)

from Molecule import copy_molecule, transform_atom_positions
from Matrix import is_identity_matrix
for i, tf in enumerate(tflist):
    if is_identity_matrix(tf):
        continue
    name = m.name + (' #%d' % (i + 1))
    c = copy_molecule(m)
    c.name = name
    c.unit_cell_copy = m
    transform_atom_positions(c.atoms, tf)
    chimera.openModels.add([c])
    # else:
    #  transform_atom_positions(c.atoms, tf, m.atoms)
    c.openState.xform = m.openState.xform
    mlist.append(c)

# Write PDB file with transformed copies of molecule
import Midas
out_path = 'unitcell.pdb'
Exemplo n.º 15
0
def group_symmetries(group, center, axis, mol):

    from Commands import CommandError

    g0 = group[:1].lower()
    if g0 in ('c', 'd'):
        # Cyclic or dihedral symmetry: C<n>, D<n>
        try:
            n = int(group[1:])
        except ValueError:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        if n < 2:
            raise CommandError, 'Cn or Dn with n = %d < 2' % (n, )
        if g0 == 'c':
            tflist = cyclic_symmetries(n)
        else:
            tflist = dihedral_symmetries(n)
    elif g0 == 'i':
        # Icosahedral symmetry: i[,<orientation>]
        import Icosahedron as icos
        gfields = group.split(',')
        if len(gfields) == 1:
            orientation = '222'
        elif len(gfields) == 2:
            orientation = gfields[1]
            if not orientation in icos.coordinate_system_names:
                raise CommandError, ('Unknown icosahedron orientation "%s"' %
                                     orientation)
        else:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        tflist = icos.icosahedral_symmetry_matrices(orientation)
    elif g0 == 'h':
        # Helical symmetry: h,<repeat>,<rise>[,<angle>[,<n>,<offet>]]
        gfields = group.split(',')
        nf = len(gfields)
        if nf < 3 or nf > 6:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        try:
            param = [float(f) for f in gfields[1:]]
        except ValueError:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        if len(param) == 2:
            param.append(360.0)
        if len(param) == 3:
            param.append(int(param[0]))
        if len(param) == 4:
            param.append(0)
        repeat, rise, angle, n, offset = param
        tflist = helical_symmetry(repeat, rise, angle, n, offset)
    elif g0 == 't':
        # Translation symmetry: t,<n>,<distance> or t,<n>,<dx>,<dy>,<dz>
        gfields = group.split(',')
        nf = len(gfields)
        if nf != 3 and nf != 5:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        try:
            param = [float(f) for f in gfields[1:]]
        except ValueError:
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        n = param[0]
        if n != int(n):
            raise CommandError, 'Invalid symmetry group syntax "%s"' % group
        if nf == 3:
            delta = (0, 0, param[1])
        else:
            delta = param[1:]
        tflist = translation_symmetry(n, delta)
    elif group.lower() == 'biomt':
        # BIOMT biological unit matrices from PDB file header.
        if not hasattr(mol, 'pdbHeaders'):
            msg = 'Molecule %s has no BIOMT matrices or PDB headers' % mol.name
            raise CommandError, msg
        from PDBmatrices import pdb_biomt_matrices
        tflist = pdb_biomt_matrices(mol.pdbHeaders)
        if len(tflist) == 0:
            msg = 'Molecule %s has no BIOMT matrices in PDB header' % mol.name
            raise CommandError, msg
        from Matrix import is_identity_matrix
        if len(tflist) == 1 and is_identity_matrix(tflist[0]):
            msg = 'Molecule %s has only identity BIOMT matrix in PDB header' % mol.name
            raise CommandError, msg
    else:
        raise CommandError, 'Unknown symmetry group "%s"' % group

    # Apply center and axis transformation.
    if tuple(center) != (0, 0, 0) or tuple(axis) != (0, 0, 1):
        import Matrix as m
        tf = m.multiply_matrices(m.vector_rotation_transform(axis, (0, 0, 1)),
                                 m.translation_matrix([-c for c in center]))
        tfinv = m.invert_matrix(tf)
        tflist = [m.multiply_matrices(tfinv, t, tf) for t in tflist]

    return tflist