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, dialect=
None,
69 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 pdb repository www.pdb.org. The filename is then interpreted as the
96 :rtype: :class:`~ost.mol.EntityHandle` or a list thereof if `load_multi` is
99 :param dialect: Specifies the particular dialect to use. If set, overrides
100 the value of :attr:`IOProfile.dialect`
102 :param seqres: Whether to read SEQRES records. If set to True, the loaded
103 entity and seqres entry will be returned as a tuple.
105 :type dialect: :class:`str`
108 :raises: :exc:`~ost.io.IOException` if the import fails due to an erroneous or
111 def _override(val1, val2):
116 if isinstance(profile, str):
117 prof=profiles[profile].Copy()
118 elif isinstance(profile, IOProfile):
121 raise TypeError(
'profile must be of type string or IOProfile, '+\
122 'instead of %s'%type(profile))
123 if dialect
not in (
None,
'PDB',
'CHARMM',):
124 raise ValueError(
'dialect must be PDB or CHARMM')
125 prof.calpha_only=_override(prof.calpha_only, calpha_only)
126 prof.no_hetatms=_override(prof.no_hetatms, no_hetatms)
127 prof.dialect=_override(prof.dialect, dialect)
128 prof.quack_mode=_override(prof.quack_mode, quack_mode)
130 prof.processor.check_bond_feasibility=_override(prof.processor.check_bond_feasibility,
131 bond_feasibility_check)
132 prof.fault_tolerant=_override(prof.fault_tolerant, fault_tolerant)
133 prof.join_spread_atom_records=_override(prof.join_spread_atom_records,
134 join_spread_atom_records)
140 filename = tmp_file.name
142 conop_inst=conop.Conopology.Instance()
144 if prof.dialect==
'PDB':
145 prof.processor.dialect=conop.PDB_DIALECT
146 elif prof.dialect==
'CHARMM':
147 prof.processor.dialect=conop.CHARMM_DIALECT
149 reader.read_seqres=seqres
153 while reader.HasNext():
154 ent=mol.CreateEntity()
155 reader.Import(ent, restrict_chains)
157 prof.processor.Process(ent)
160 raise IOError(
"File '%s' doesn't contain any entities" % filename)
163 ent=mol.CreateEntity()
165 reader.Import(ent, restrict_chains)
167 prof.processor.Process(ent)
169 raise IOError(
"File '%s' doesn't contain any entities" % filename)
171 return ent, reader.seqres
176 def SavePDB(models, filename, dialect=None, pqr=False, profile='DEFAULT'):
178 Save entity or list of entities to disk. If a list of entities is supplied
179 the PDB file will be saved as a multi PDB file. Each of the entities is
180 wrapped into a MODEL/ENDMDL pair.
182 If the atom number exceeds 99999, '*****' is used.
184 :param models: The entity or list of entities (handles or views) to be saved
185 :param filename: The filename
186 :type filename: string
187 :raises: IOException if the restrictions of the PDB format are not satisfied
188 (with the exception of atom numbers, see above):
190 * Chain names with more than one character
191 * Atom positions with coordinates outside range [-999.99, 9999.99]
192 * Residue names longer than three characters
193 * Atom names longer than four characters
194 * Numeric part of :class:`ost.mol.ResNum` outside range [-999, 9999]
195 * Alternative atom indicators longer than one character
197 if not getattr(models,
'__len__',
None):
199 if isinstance(profile, str):
200 profile=profiles[profile].Copy()
201 elif isinstance(profile, IOProfile):
204 raise TypeError(
'profile must be of type string or IOProfile, '+\
205 'instead of %s'%type(profile))
206 profile.dialect=_override(profile.dialect, dialect)
210 writer.write_multi_model=
True
227 image_list.append(image)
230 LoadMapList=LoadImageList
233 lazy_load=
False, stride=1,
234 dialect=
None, detect_swap=
True,swap_bytes=
False):
236 Load CHARMM trajectory file.
238 :param crd: EntityHandle or filename of the (PDB) file containing the
239 structure. The structure must have the same number of atoms as the
241 :param dcd_file: The filename of the DCD file. If not set, and crd is a
242 string, the filename is set to the <crd>.dcd
243 :param layz_load: Whether the trajectory should be loaded on demand. Instead
244 of loading the complete trajectory into memory, the trajectory frames are
245 loaded from disk when requested.
246 :param stride: The spacing of the frames to load. When set to 2, for example,
247 every second frame is loaded from the trajectory. By default, every frame
249 :param dialect: The dialect for the PDB file to use. See :func:`LoadPDB`. If
250 set, overrides the value of the profile
251 :param profile: The IO profile to use for loading the PDB file. See
253 :param detect_swap: if True (the default), then automatic detection of endianess
254 is attempted, otherwise the swap_bytes parameter is used
255 :param swap_bytes: is detect_swap is False, this flag determines whether bytes
256 are swapped upon loading or not
260 dcd_file=
'%s.dcd' % os.path.splitext(crd)[0]
261 crd=
LoadPDB(crd, profile=profile, dialect=dialect)
265 raise ValueError(
"No DCD filename given")
266 return LoadCHARMMTraj_(crd, dcd_file, stride, lazy_load, detect_swap, swap_bytes)
268 def LoadMMCIF(filename, fault_tolerant=None, calpha_only=None, profile='DEFAULT', remote=False, seqres=False, info=False):
270 Load MMCIF file from disk and return one or more entities. Several options
271 allow to customize the exact behaviour of the MMCIF import. For more
272 information on these options, see :doc:`profile`.
274 Residues are flagged as ligand if they are mentioned in a HET record.
276 :param fault_tolerant: Enable/disable fault-tolerant import. If set, overrides
277 the value of :attr:`IOProfile.fault_tolerant`.
279 :param remote: If set to True, the method tries to load the pdb from the
280 remote pdb repository www.pdb.org. The filename is then interpreted as the
283 :rtype: :class:`~ost.mol.EntityHandle`.
285 :param seqres: Whether to read SEQRES records. If set to True, the loaded
286 entity and seqres entry will be returned as second item.
288 :param info: Whether to return an info container with the other output.
289 Returns a :class:`MMCifInfo` object as last item.
291 :raises: :exc:`~ost.io.IOException` if the import fails due to an erroneous
292 or non-existent file.
294 def _override(val1, val2):
299 if isinstance(profile, str):
300 prof = profiles[profile].Copy()
302 prof = profile.Copy()
304 prof.calpha_only=_override(prof.calpha_only, calpha_only)
305 prof.fault_tolerant=_override(prof.fault_tolerant, fault_tolerant)
309 tmp_file =
RemoteGet(filename, from_repo=
'cif')
310 filename = tmp_file.name
313 ent = mol.CreateEntity()
315 reader.read_seqres = seqres
324 prof.processor.Process(ent)
328 return ent, reader.seqres, reader.info
330 return ent, reader.seqres
332 return ent, reader.info
343 def _PDBize(biounit, asu, seqres=None, min_polymer_size=10,
344 transformation=
False):
347 chains = biounit.GetChainList()
348 c_intvls = biounit.GetChainIntervalList()
349 o_intvls = biounit.GetOperationsIntervalList()
352 ss = seq.CreateSequenceList()
357 operations = biounit.GetOperations()
358 for i
in range(0,len(c_intvls)):
360 l_operations = operations[o_intvls[i][0]:o_intvls[i][1]]
361 if len(l_operations) > 0:
362 for op
in l_operations[0]:
364 rot.PasteRotation(op.rotation)
366 trans.PasteTranslation(op.translation)
369 trans_matrices.append(tr)
370 for op_n
in range(1, len(l_operations)):
372 for o
in l_operations[op_n]:
374 rot.PasteRotation(o.rotation)
376 trans.PasteTranslation(o.translation)
379 for t_o
in trans_matrices:
382 trans_matrices = tmp_ops
384 assu = asu.Select(
'cname='+
','.join(mol.QueryQuoteName(name) \
386 chains[c_intvls[i][0]:c_intvls[i][1]]))
387 pdbizer.Add(assu, trans_matrices, ss)
388 pdb_bu = pdbizer.Finish(transformation)
390 return pdb_bu, pdb_bu.GetTransformationMatrix()
393 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.