File: ligands_water.py

package info (click to toggle)
python-ihm 2.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,368 kB
  • sloc: python: 30,422; ansic: 5,990; sh: 24; makefile: 20
file content (84 lines) | stat: -rw-r--r-- 3,809 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# This example demonstrates how non-polymeric entities (ligands, water)
# are handled by the Python IHM library. See the simple-docking.py example
# for an introduction to the library.

import ihm
import ihm.dumper
import ihm.protocol
import ihm.representation
import ihm.model

system = ihm.System()

# An entity corresponding to an amino acid (polyalanine) sequence
entity_protein = ihm.Entity('AAA', description='Subunit A')

# An entity corresponding to an RNA sequence
entity_rna = ihm.Entity('ACG', alphabet=ihm.RNAAlphabet,
                        description='RNA chain')

# An entity corresponding to a DNA sequence
entity_dna = ihm.Entity(['DA', 'DC', 'DG'], alphabet=ihm.DNAAlphabet,
                        description='DNA chain')

# Non-polymers such as ligands or water should each live in their own Entity:

# A ligand entity (in this case, heme)
heme = ihm.NonPolymerChemComp("HEM", name='PROTOPORPHYRIN IX CONTAINING FE',
                              formula='C34 H32 Fe N4 O4')
entity_heme = ihm.Entity([heme], description='Heme')

# Water
entity_h2o = ihm.Entity([ihm.WaterChemComp()], description='Water')

system.entities.extend((entity_protein, entity_rna, entity_dna, entity_heme,
                        entity_h2o))

# Next, we define asymmetric units for everything we modeled.
# Here, we have a single instance of each protein, RNA and DNA, two hemes,
# plus crystal waters. Note that waters must use the WaterAsymUnit class rather
# than AsymUnit, as the number of waters in the unit must be specified.
asym_protein = ihm.AsymUnit(entity_protein, details='Subunit A')
asym_rna = ihm.AsymUnit(entity_rna, details='RNA chain')
asym_dna = ihm.AsymUnit(entity_dna, details='DNA chain')
asym_heme1 = ihm.AsymUnit(entity_heme, details='First heme')
asym_heme2 = ihm.AsymUnit(entity_heme, details='Second heme')
asym_h2o = ihm.WaterAsymUnit(entity_h2o, number=2, details='Crystal waters')
system.asym_units.extend((asym_protein, asym_rna, asym_dna, asym_heme1,
                          asym_heme2, asym_h2o))

# Just as in the simple-docking.py example, we can add models with coordinates.
# Here we define an atomic model containing just the two hemes and the water.
assembly = ihm.Assembly((asym_heme1, asym_heme2, asym_h2o),
                        name="Modeled assembly")
rep = ihm.representation.Representation(
    [ihm.representation.AtomicSegment(asym_heme1, rigid=False),
     ihm.representation.AtomicSegment(asym_heme2, rigid=False),
     ihm.representation.AtomicSegment(asym_h2o, rigid=False)])
protocol = ihm.protocol.Protocol(name='Modeling')


class MyModel(ihm.model.Model):
    def get_atoms(self):
        # seq_id only makes sense for polymers and waters;
        # for ligands it should be None
        yield ihm.model.Atom(asym_unit=asym_heme1, type_symbol='FE', het=True,
                             seq_id=None, atom_id='FE', x=0., y=0., z=0.)
        yield ihm.model.Atom(asym_unit=asym_heme2, type_symbol='FE', het=True,
                             seq_id=None, atom_id='FE', x=10., y=10., z=10.)
        yield ihm.model.Atom(asym_unit=asym_h2o, type_symbol='O', het=True,
                             seq_id=1, atom_id='O', x=20., y=20., z=20.)
        yield ihm.model.Atom(asym_unit=asym_h2o, type_symbol='O', het=True,
                             seq_id=2, atom_id='O', x=30., y=30., z=30.)


# We have only a single model in a single state:
model = MyModel(assembly=assembly, protocol=protocol, representation=rep,
                name='Best model')
model_group = ihm.model.ModelGroup([model], name='All models')
state = ihm.model.State([model_group])
system.state_groups.append(ihm.model.StateGroup([state]))

# Once the system is complete, we can write it out to an mmCIF file:
with open('output.cif', 'w') as fh:
    ihm.dumper.write(fh, [system])