1
2
3
4
5
6
7 from PDBExceptions import PDBConstructionException
8 from Entity import Entity, DisorderedEntityWrapper
9
10
11 __doc__="Residue class, used by Structure objects."
12
13
14 _atom_name_dict={}
15 _atom_name_dict["N"]=1
16 _atom_name_dict["CA"]=2
17 _atom_name_dict["C"]=3
18 _atom_name_dict["O"]=4
19
20
22 """
23 Represents a residue. A Residue object stores atoms.
24 """
26 self.level="R"
27 self.disordered=0
28 self.resname=resname
29 self.segid=segid
30 Entity.__init__(self, id)
31
32
33
35 resname=self.get_resname()
36 hetflag, resseq, icode=self.get_id()
37 full_id=(resname, hetflag, resseq, icode)
38 return "<Residue %s het=%s resseq=%s icode=%s>" % full_id
39
40
41
43 """Sort the Atom objects.
44
45 Atoms are sorted alphabetically according to their name,
46 but N, CA, C, O always come first.
47
48 Arguments:
49 o a1, a2 - Atom objects
50 """
51 name1=a1.get_name()
52 name2=a2.get_name()
53 if name1==name2:
54 return(cmp(a1.get_altloc(), a2.get_altloc()))
55 if _atom_name_dict.has_key(name1):
56 index1=_atom_name_dict[name1]
57 else:
58 index1=None
59 if _atom_name_dict.has_key(name2):
60 index2=_atom_name_dict[name2]
61 else:
62 index2=None
63 if index1 and index2:
64 return cmp(index1, index2)
65 if index1:
66 return -1
67 if index2:
68 return 1
69 return cmp(name1, name2)
70
71
72
73 - def add(self, atom):
74 """Add an Atom object.
75
76 Checks for adding duplicate atoms, and raises a
77 PDBConstructionException if so.
78 """
79 atom_id=atom.get_id()
80 if self.has_id(atom_id):
81 raise PDBConstructionException( \
82 "Atom %s defined twice in residue %s" % (atom_id, self))
83 Entity.add(self, atom)
84
87
89 "Set the disordered flag."
90 self.disordered=1
91
93 "Return 1 if the residue contains disordered atoms."
94 return self.disordered
95
98
100 """
101 Returns the list of all atoms, unpack DisorderedAtoms."
102 """
103 atom_list=self.get_list()
104 undisordered_atom_list=[]
105 for atom in atom_list:
106 if atom.is_disordered():
107 undisordered_atom_list=(undisordered_atom_list+ atom.disordered_get_list())
108 else:
109 undisordered_atom_list.append(atom)
110 return undisordered_atom_list
111
114
115
117 """
118 DisorderedResidue is a wrapper around two or more Residue objects. It is
119 used to represent point mutations (e.g. there is a Ser 60 and a Cys 60 residue,
120 each with 50 % occupancy).
121 """
124
126 resname=self.get_resname()
127 hetflag, resseq, icode=self.get_id()
128 full_id=(resname, hetflag, resseq, icode)
129 return "<DisorderedResidue %s het=%s resseq=%i icode=%s>" % full_id
130
131 - def add(self, atom):
144
146 "Sort the atoms in the child Residue objects."
147 for residue in self.disordered_get_list():
148 residue.sort()
149
163