19 import os, tempfile, ftplib, httplib
22 from ost
import mol, geom, conop, seq
31 return IOProfileRegistry.Instance().Get(key)
34 if isinstance(value, str):
35 value=self[value].Copy()
36 IOProfileRegistry.Instance().Set(key, value)
40 return len(self.
_dict)
43 return self._dict.__iter__()
47 if conop.GetDefaultLib():
51 profiles[
'STRICT']=
IOProfile(dialect=
'PDB', fault_tolerant=
False,
52 quack_mode=
False, processor=processor.Copy())
53 profiles[
'SLOPPY']=
IOProfile(dialect=
'PDB', fault_tolerant=
True,
54 quack_mode=
True, processor=processor.Copy())
55 profiles[
'CHARMM']=
IOProfile(dialect=
'CHARMM', fault_tolerant=
True,
56 quack_mode=
False, processor=processor.Copy())
57 profiles[
'DEFAULT']=
'STRICT'
59 def _override(val1, val2):
65 def LoadPDB(filename, restrict_chains="", no_hetatms=None,
66 fault_tolerant=
None, load_multi=
False, quack_mode=
None,
67 join_spread_atom_records=
None, calpha_only=
None,
68 profile=
'DEFAULT', remote=
False, remote_repo=
'pdb',
69 dialect=
None, seqres=
False, bond_feasibility_check=
None):
71 Load PDB file from disk and return one or more entities. Several options
72 allow to customize the exact behaviour of the PDB import. For more information
73 on these options, see :doc:`profile`.
75 Residues are flagged as ligand if they are mentioned in a HET record.
77 :param restrict_chains: If not an empty string, only chains listed in the
78 string will be imported.
80 :param fault_tolerant: Enable/disable fault-tolerant import. If set, overrides
81 the value of :attr:`IOProfile.fault_tolerant`.
83 :param no_hetatms: If set to True, HETATM records will be ignored. Overrides
84 the value of :attr:`IOProfile.no_hetatms`
86 :param load_multi: If set to True, a list of entities will be returned instead
87 of only the first. This is useful when dealing with multi-PDB files.
89 :param join_spread_atom_records: If set, overrides the value of
90 :attr:`IOProfile.join_spread_atom_records`.
92 :param remote: If set to True, the method tries to load the pdb from the
93 remote repository given as *remote_repo*. The filename is then
94 interpreted as the entry id as further specified for the *remote_repo*
97 :param remote_repo: Remote repository to fetch structure if *remote* is True.
98 Must be one in ['pdb', 'smtl', 'pdb_redo']. In case of
99 'pdb' and 'pdb_redo', the entry must be given as lower
100 case pdb id, which loads the deposited assymetric unit
101 (e.g. '1ake'). In case of 'smtl', the entry must also
102 specify the desired biounit (e.g. '1ake.1').
104 :rtype: :class:`~ost.mol.EntityHandle` or a list thereof if `load_multi` is
107 :param dialect: Specifies the particular dialect to use. If set, overrides
108 the value of :attr:`IOProfile.dialect`
110 :param seqres: Whether to read SEQRES records. If set to True, the loaded
111 entity and seqres entry will be returned as a tuple.
113 :type dialect: :class:`str`
116 :raises: :exc:`~ost.io.IOException` if the import fails due to an erroneous or
119 def _override(val1, val2):
124 if isinstance(profile, str):
125 prof=profiles[profile].Copy()
126 elif isinstance(profile, IOProfile):
129 raise TypeError(
'profile must be of type string or IOProfile, '+\
130 'instead of %s'%type(profile))
131 if dialect
not in (
None,
'PDB',
'CHARMM',):
132 raise ValueError(
'dialect must be PDB or CHARMM')
133 prof.calpha_only=_override(prof.calpha_only, calpha_only)
134 prof.no_hetatms=_override(prof.no_hetatms, no_hetatms)
135 prof.dialect=_override(prof.dialect, dialect)
136 prof.quack_mode=_override(prof.quack_mode, quack_mode)
138 prof.processor.check_bond_feasibility=_override(prof.processor.check_bond_feasibility,
139 bond_feasibility_check)
140 prof.fault_tolerant=_override(prof.fault_tolerant, fault_tolerant)
141 prof.join_spread_atom_records=_override(prof.join_spread_atom_records,
142 join_spread_atom_records)
146 if remote_repo
not in [
'pdb',
'smtl',
'pdb_redo']:
147 raise IOError(
"remote_repo must be in ['pdb', 'smtl', 'pdb_redo']")
149 tmp_file =
RemoteGet(filename, from_repo=remote_repo)
150 filename = tmp_file.name
152 conop_inst=conop.Conopology.Instance()
154 if prof.dialect==
'PDB':
155 prof.processor.dialect=conop.PDB_DIALECT
156 elif prof.dialect==
'CHARMM':
157 prof.processor.dialect=conop.CHARMM_DIALECT
159 reader.read_seqres=seqres
163 while reader.HasNext():
164 ent=mol.CreateEntity()
165 reader.Import(ent, restrict_chains)
167 prof.processor.Process(ent)
170 raise IOError(
"File '%s' doesn't contain any entities" % filename)
173 ent=mol.CreateEntity()
175 reader.Import(ent, restrict_chains)
177 prof.processor.Process(ent)
179 raise IOError(
"File '%s' doesn't contain any entities" % filename)
181 return ent, reader.seqres
186 def SavePDB(models, filename, dialect=None, pqr=False, profile='DEFAULT'):
188 Save entity or list of entities to disk. If a list of entities is supplied
189 the PDB file will be saved as a multi PDB file. Each of the entities is
190 wrapped into a MODEL/ENDMDL pair.
192 If the atom number exceeds 99999, '*****' is used.
194 :param models: The entity or list of entities (handles or views) to be saved
195 :param filename: The filename
196 :type filename: string
197 :raises: IOException if the restrictions of the PDB format are not satisfied
198 (with the exception of atom numbers, see above):
200 * Chain names with more than one character
201 * Atom positions with coordinates outside range [-999.99, 9999.99]
202 * Residue names longer than three characters
203 * Atom names longer than four characters
204 * Numeric part of :class:`ost.mol.ResNum` outside range [-999, 9999]
205 * Alternative atom indicators longer than one character
207 if not getattr(models,
'__len__',
None):
209 if isinstance(profile, str):
210 profile=profiles[profile].Copy()
211 elif isinstance(profile, IOProfile):
214 raise TypeError(
'profile must be of type string or IOProfile, '+\
215 'instead of %s'%type(profile))
216 profile.dialect=_override(profile.dialect, dialect)
220 writer.write_multi_model=
True
237 image_list.append(image)
240 LoadMapList=LoadImageList
243 lazy_load=
False, stride=1,
244 dialect=
None, detect_swap=
True,swap_bytes=
False):
246 Load CHARMM trajectory file.
248 :param crd: EntityHandle or filename of the (PDB) file containing the
249 structure. The structure must have the same number of atoms as the
251 :param dcd_file: The filename of the DCD file. If not set, and crd is a
252 string, the filename is set to the <crd>.dcd
253 :param layz_load: Whether the trajectory should be loaded on demand. Instead
254 of loading the complete trajectory into memory, the trajectory frames are
255 loaded from disk when requested.
256 :param stride: The spacing of the frames to load. When set to 2, for example,
257 every second frame is loaded from the trajectory. By default, every frame
259 :param dialect: The dialect for the PDB file to use. See :func:`LoadPDB`. If
260 set, overrides the value of the profile
261 :param profile: The IO profile to use for loading the PDB file. See
263 :param detect_swap: if True (the default), then automatic detection of endianess
264 is attempted, otherwise the swap_bytes parameter is used
265 :param swap_bytes: is detect_swap is False, this flag determines whether bytes
266 are swapped upon loading or not
270 dcd_file=
'%s.dcd' % os.path.splitext(crd)[0]
271 crd=
LoadPDB(crd, profile=profile, dialect=dialect)
275 raise ValueError(
"No DCD filename given")
276 return LoadCHARMMTraj_(crd, dcd_file, stride, lazy_load, detect_swap, swap_bytes)
278 def LoadMMCIF(filename, fault_tolerant=None, calpha_only=None, profile='DEFAULT', remote=False, seqres=False, info=False):
280 Load MMCIF file from disk and return one or more entities. Several options
281 allow to customize the exact behaviour of the MMCIF import. For more
282 information on these options, see :doc:`profile`.
284 Residues are flagged as ligand if they are mentioned in a HET record.
286 :param fault_tolerant: Enable/disable fault-tolerant import. If set, overrides
287 the value of :attr:`IOProfile.fault_tolerant`.
289 :param remote: If set to True, the method tries to load the pdb from the
290 remote pdb repository www.pdb.org. The filename is then interpreted as the
293 :rtype: :class:`~ost.mol.EntityHandle` (or tuple if *seqres* or *info* are
296 :param seqres: Whether to read SEQRES records. If True, a
297 :class:`~ost.seq.SequenceList` object is returned as the second
298 item. The sequences in the list are named according to the
300 This feature requires a default
301 :class:`compound library <ost.conop.CompoundLib>`
302 to be defined and accessible via
303 :func:`~ost.conop.GetDefaultLib` or an empty list is returned.
305 :param info: Whether to return an info container with the other output.
306 If True, a :class:`MMCifInfo` object is returned as last item.
308 :raises: :exc:`~ost.io.IOException` if the import fails due to an erroneous
309 or non-existent file.
311 def _override(val1, val2):
316 if isinstance(profile, str):
317 prof = profiles[profile].Copy()
319 prof = profile.Copy()
321 prof.calpha_only=_override(prof.calpha_only, calpha_only)
322 prof.fault_tolerant=_override(prof.fault_tolerant, fault_tolerant)
326 tmp_file =
RemoteGet(filename, from_repo=
'cif')
327 filename = tmp_file.name
330 ent = mol.CreateEntity()
332 reader.read_seqres = seqres
341 prof.processor.Process(ent)
345 return ent, reader.seqres, reader.info
347 return ent, reader.seqres
349 return ent, reader.info
360 def _PDBize(biounit, asu, seqres=None, min_polymer_size=10,
361 transformation=
False):
364 chains = biounit.GetChainList()
365 c_intvls = biounit.GetChainIntervalList()
366 o_intvls = biounit.GetOperationsIntervalList()
369 ss = seq.CreateSequenceList()
374 operations = biounit.GetOperations()
375 for i
in range(0,len(c_intvls)):
377 l_operations = operations[o_intvls[i][0]:o_intvls[i][1]]
378 if len(l_operations) > 0:
379 for op
in l_operations[0]:
381 rot.PasteRotation(op.rotation)
383 trans.PasteTranslation(op.translation)
386 trans_matrices.append(tr)
387 for op_n
in range(1, len(l_operations)):
389 for o
in l_operations[op_n]:
391 rot.PasteRotation(o.rotation)
393 trans.PasteTranslation(o.translation)
396 for t_o
in trans_matrices:
399 trans_matrices = tmp_ops
401 assu = asu.Select(
'cname='+
','.join(mol.QueryQuoteName(name) \
403 chains[c_intvls[i][0]:c_intvls[i][1]]))
404 pdbizer.Add(assu, trans_matrices, ss)
405 pdb_bu = pdbizer.Finish(transformation)
407 return pdb_bu, pdb_bu.GetTransformationMatrix()
410 MMCifInfoBioUnit.PDBize = _PDBize
DLLEXPORT_OST_IO img::ImageHandle LoadImage(const boost::filesystem::path &loc)
Function that loads an image from a file.
std::vector< Mat4 > Mat4List
mol::CoordGroupHandle DLLEXPORT_OST_IO LoadCHARMMTraj(const mol::EntityHandle &ent, const String &trj_filename, unsigned int stride=1, bool lazy_load=false, bool detect_swap=true, bool byte_swap=false)
import a CHARMM trajectory in dcd format with an existing entity requires the existing entity and the...
reader for the mmcif file format
Manages a collection of images.