Statistiques
| Révision :

root / ase / io / __init__.py

Historique | Voir | Annoter | Télécharger (13,86 ko)

1 1 tkerber
import os
2 1 tkerber
import sys
3 1 tkerber
from os.path import basename
4 1 tkerber
from tarfile import is_tarfile
5 1 tkerber
from zipfile import is_zipfile
6 1 tkerber
7 1 tkerber
from ase.atoms import Atoms
8 1 tkerber
from ase.units import Bohr
9 1 tkerber
from ase.io.trajectory import PickleTrajectory
10 1 tkerber
11 1 tkerber
__all__ = ['read', 'write', 'PickleTrajectory']
12 1 tkerber
13 1 tkerber
14 1 tkerber
def read(filename, index=-1, format=None):
15 1 tkerber
    """Read Atoms object(s) from file.
16 1 tkerber

17 1 tkerber
    filename: str
18 1 tkerber
        Name of the file to read from.
19 1 tkerber
    index: int or slice
20 1 tkerber
        If the file contains several configurations, the last configuration
21 1 tkerber
        will be returned by default.  Use index=n to get configuration
22 1 tkerber
        number n (counting from zero).
23 1 tkerber
    format: str
24 1 tkerber
        Used to specify the file-format.  If not given, the
25 1 tkerber
        file-format will be guessed by the *filetype* function.
26 1 tkerber

27 1 tkerber
    Known formats:
28 1 tkerber

29 1 tkerber
    =========================  ===========
30 1 tkerber
    format                     short name
31 1 tkerber
    =========================  ===========
32 1 tkerber
    GPAW restart-file          gpw
33 1 tkerber
    Dacapo netCDF output file  dacapo
34 1 tkerber
    Old ASE netCDF trajectory  nc
35 1 tkerber
    Virtual Nano Lab file      vnl
36 1 tkerber
    ASE pickle trajectory      traj
37 1 tkerber
    GPAW text output           gpaw-text
38 1 tkerber
    CUBE file                  cube
39 1 tkerber
    XCrySDen Structure File    xsf
40 1 tkerber
    Dacapo text output         dacapo-text
41 1 tkerber
    XYZ-file                   xyz
42 1 tkerber
    VASP POSCAR/CONTCAR file   vasp
43 1 tkerber
    VASP OUTCAR file           vasp_out
44 1 tkerber
    Protein Data Bank          pdb
45 1 tkerber
    FHI-aims geometry file     aims
46 1 tkerber
    FHI-aims output file       aims_out
47 1 tkerber
    VTK XML Image Data         vti
48 1 tkerber
    VTK XML Structured Grid    vts
49 1 tkerber
    VTK XML Unstructured Grid  vtu
50 1 tkerber
    TURBOMOLE coord file       tmol
51 1 tkerber
    exciting input             exi
52 1 tkerber
    AtomEye configuration      cfg
53 1 tkerber
    WIEN2k structure file      struct
54 1 tkerber
    DftbPlus input file        dftb
55 1 tkerber
    =========================  ===========
56 1 tkerber

57 1 tkerber
    """
58 1 tkerber
    if isinstance(filename, str):
59 1 tkerber
        p = filename.rfind('@')
60 1 tkerber
        if p != -1:
61 1 tkerber
            try:
62 1 tkerber
                index = string2index(filename[p + 1:])
63 1 tkerber
            except ValueError:
64 1 tkerber
                pass
65 1 tkerber
            else:
66 1 tkerber
                filename = filename[:p]
67 1 tkerber
68 1 tkerber
    if isinstance(index, str):
69 1 tkerber
        index = string2index(index)
70 1 tkerber
71 1 tkerber
    if format is None:
72 1 tkerber
        format = filetype(filename)
73 1 tkerber
74 1 tkerber
    if format.startswith('gpw'):
75 1 tkerber
        import gpaw
76 1 tkerber
        r = gpaw.io.open(filename, 'r')
77 1 tkerber
        positions = r.get('CartesianPositions') * Bohr
78 1 tkerber
        numbers = r.get('AtomicNumbers')
79 1 tkerber
        cell = r.get('UnitCell') * Bohr
80 1 tkerber
        pbc = r.get('BoundaryConditions')
81 1 tkerber
        tags = r.get('Tags')
82 1 tkerber
        magmoms = r.get('MagneticMoments')
83 1 tkerber
84 1 tkerber
        atoms = Atoms(positions=positions,
85 1 tkerber
                      numbers=numbers,
86 1 tkerber
                      cell=cell,
87 1 tkerber
                      pbc=pbc)
88 1 tkerber
        if tags.any():
89 1 tkerber
            atoms.set_tags(tags)
90 1 tkerber
        if magmoms.any():
91 1 tkerber
            atoms.set_initial_magnetic_moments(magmoms)
92 1 tkerber
93 1 tkerber
        return atoms
94 1 tkerber
95 1 tkerber
    if format == 'exi':
96 1 tkerber
        from ase.io.exciting import read_exciting
97 1 tkerber
        return read_exciting(filename, index)
98 1 tkerber
99 1 tkerber
    if format == 'xyz':
100 1 tkerber
        from ase.io.xyz import read_xyz
101 1 tkerber
        return read_xyz(filename, index)
102 1 tkerber
103 1 tkerber
    if format == 'traj':
104 1 tkerber
        from ase.io.trajectory import read_trajectory
105 1 tkerber
        return read_trajectory(filename, index)
106 1 tkerber
107 1 tkerber
    if format == 'cube':
108 1 tkerber
        from ase.io.cube import read_cube
109 1 tkerber
        return read_cube(filename, index)
110 1 tkerber
111 1 tkerber
    if format == 'nc':
112 1 tkerber
        from ase.io.netcdf import read_netcdf
113 1 tkerber
        return read_netcdf(filename, index)
114 1 tkerber
115 1 tkerber
    if format == 'gpaw-text':
116 1 tkerber
        from ase.io.gpawtext import read_gpaw_text
117 1 tkerber
        return read_gpaw_text(filename, index)
118 1 tkerber
119 1 tkerber
    if format == 'dacapo-text':
120 1 tkerber
        from ase.io.dacapo import read_dacapo_text
121 1 tkerber
        return read_dacapo_text(filename)
122 1 tkerber
123 1 tkerber
    if format == 'dacapo':
124 1 tkerber
        from ase.io.dacapo import read_dacapo
125 1 tkerber
        return read_dacapo(filename)
126 1 tkerber
127 1 tkerber
    if format == 'xsf':
128 1 tkerber
        from ase.io.xsf import read_xsf
129 1 tkerber
        return read_xsf(filename, index)
130 1 tkerber
131 1 tkerber
    if format == 'vasp':
132 1 tkerber
        from ase.io.vasp import read_vasp
133 1 tkerber
        return read_vasp(filename)
134 1 tkerber
135 1 tkerber
    if format == 'vasp_out':
136 1 tkerber
        from ase.io.vasp import read_vasp_out
137 1 tkerber
        return read_vasp_out(filename, index)
138 1 tkerber
139 1 tkerber
    if format == 'mol':
140 1 tkerber
        from ase.io.mol import read_mol
141 1 tkerber
        return read_mol(filename)
142 1 tkerber
143 1 tkerber
    if format == 'pdb':
144 1 tkerber
        from ase.io.pdb import read_pdb
145 1 tkerber
        return read_pdb(filename)
146 1 tkerber
147 1 tkerber
    if format == 'cif':
148 1 tkerber
        from ase.io.cif import read_cif
149 1 tkerber
        return read_cif(filename)
150 1 tkerber
151 1 tkerber
    if format == 'struct':
152 1 tkerber
        from ase.io.wien2k import read_struct
153 1 tkerber
        return read_struct(filename)
154 1 tkerber
155 1 tkerber
    if format == 'vti':
156 1 tkerber
        from ase.io.vtkxml import read_vti
157 1 tkerber
        return read_vti(filename)
158 1 tkerber
159 1 tkerber
    if format == 'vts':
160 1 tkerber
        from ase.io.vtkxml import read_vts
161 1 tkerber
        return read_vts(filename)
162 1 tkerber
163 1 tkerber
    if format == 'vtu':
164 1 tkerber
        from ase.io.vtkxml import read_vtu
165 1 tkerber
        return read_vtu(filename)
166 1 tkerber
167 1 tkerber
    if format == 'aims':
168 1 tkerber
        from ase.io.aims import read_aims
169 1 tkerber
        return read_aims(filename)
170 1 tkerber
171 1 tkerber
    if format == 'aims_out':
172 1 tkerber
        from ase.io.aims import read_aims_output
173 1 tkerber
        return read_aims_output(filename, index)
174 1 tkerber
175 1 tkerber
    if format == 'iwm':
176 1 tkerber
        from ase.io.iwm import read_iwm
177 1 tkerber
        return read_iwm(filename)
178 1 tkerber
179 1 tkerber
    if format == 'Cmdft':
180 1 tkerber
        from ase.io.cmdft import read_I_info
181 1 tkerber
        return read_I_info(filename)
182 1 tkerber
183 1 tkerber
    if format == 'tmol':
184 1 tkerber
        from ase.io.turbomole import read_turbomole
185 1 tkerber
        return read_turbomole(filename)
186 1 tkerber
187 1 tkerber
    if format == 'cfg':
188 1 tkerber
        from ase.io.cfg import read_cfg
189 1 tkerber
        return read_cfg(filename)
190 1 tkerber
191 1 tkerber
    if format == 'dftb':
192 1 tkerber
        from ase.io.dftb import read_dftb
193 1 tkerber
        return read_dftb(filename)
194 1 tkerber
195 1 tkerber
    if format == 'sdf':
196 1 tkerber
        from ase.io.sdf import read_sdf
197 1 tkerber
        return read_sdf(filename)
198 1 tkerber
199 1 tkerber
    raise RuntimeError('File format descriptor '+format+' not recognized!')
200 1 tkerber
201 1 tkerber
202 1 tkerber
def write(filename, images, format=None, **kwargs):
203 1 tkerber
    """Write Atoms object(s) to file.
204 1 tkerber

205 1 tkerber
    filename: str
206 1 tkerber
        Name of the file to write to.
207 1 tkerber
    images: Atoms object or list of Atoms objects
208 1 tkerber
        A single Atoms object or a list of Atoms objects.
209 1 tkerber
    format: str
210 1 tkerber
        Used to specify the file-format.  If not given, the
211 1 tkerber
        file-format will be taken from suffix of the filename.
212 1 tkerber

213 1 tkerber
    The accepted output formats:
214 1 tkerber

215 1 tkerber
    =========================  ===========
216 1 tkerber
    format                     short name
217 1 tkerber
    =========================  ===========
218 1 tkerber
    ASE pickle trajectory      traj
219 1 tkerber
    CUBE file                  cube
220 1 tkerber
    XYZ-file                   xyz
221 1 tkerber
    VASP POSCAR/CONTCAR file   vasp
222 1 tkerber
    Protein Data Bank          pdb
223 1 tkerber
    XCrySDen Structure File    xsf
224 1 tkerber
    FHI-aims geometry file     aims
225 1 tkerber
    gOpenMol .plt file         plt
226 1 tkerber
    Python script              py
227 1 tkerber
    Encapsulated Postscript    eps
228 1 tkerber
    Portable Network Graphics  png
229 1 tkerber
    Persistance of Vision      pov
230 1 tkerber
    VTK XML Image Data         vti
231 1 tkerber
    VTK XML Structured Grid    vts
232 1 tkerber
    VTK XML Unstructured Grid  vtu
233 1 tkerber
    TURBOMOLE coord file       tmol
234 1 tkerber
    exciting                   exi
235 1 tkerber
    AtomEye configuration      cfg
236 1 tkerber
    WIEN2k structure file      struct
237 1 tkerber
    DftbPlus input file        dftb
238 1 tkerber
    =========================  ===========
239 1 tkerber

240 1 tkerber
    The use of additional keywords is format specific.
241 1 tkerber

242 1 tkerber
    The ``cube`` and ``plt`` formats accept (plt requires it) a ``data``
243 1 tkerber
    keyword, which can be used to write a 3D array to the file along
244 1 tkerber
    with the nuclei coordinates.
245 1 tkerber

246 1 tkerber
    The ``vti``, ``vts`` and ``vtu`` formats are all specifically directed
247 1 tkerber
    for use with MayaVi, and the latter is designated for visualization of
248 1 tkerber
    the atoms whereas the two others are intended for volume data. Further,
249 1 tkerber
    it should be noted that the ``vti`` format is intended for orthogonal
250 1 tkerber
    unit cells as only the grid-spacing is stored, whereas the ``vts`` format
251 1 tkerber
    additionally stores the coordinates of each grid point, thus making it
252 1 tkerber
    useful for volume date in more general unit cells.
253 1 tkerber

254 1 tkerber
    The ``eps``, ``png``, and ``pov`` formats are all graphics formats,
255 1 tkerber
    and accept the additional keywords:
256 1 tkerber

257 1 tkerber
    rotation: str (default '')
258 1 tkerber
      The rotation angles, e.g. '45x,70y,90z'.
259 1 tkerber

260 1 tkerber
    show_unit_cell: int (default 0)
261 1 tkerber
      Can be 0, 1, 2 to either not show, show, or show all of the unit cell.
262 1 tkerber

263 1 tkerber
    radii: array or float (default 1.0)
264 1 tkerber
      An array of same length as the list of atoms indicating the sphere radii.
265 1 tkerber
      A single float specifies a uniform scaling of the default covalent radii.
266 1 tkerber

267 1 tkerber
    bbox: 4 floats (default None)
268 1 tkerber
      Set the bounding box to (xll, yll, xur, yur) (lower left, upper right).
269 1 tkerber

270 1 tkerber
    colors: array (default None)
271 1 tkerber
      An array of same length as the list of atoms, indicating the rgb color
272 1 tkerber
      code for each atom. Default is the jmol_colors of ase/data/colors.
273 1 tkerber

274 1 tkerber
    scale: int (default 20)
275 1 tkerber
      Number of pixels per Angstrom.
276 1 tkerber

277 1 tkerber
    For the ``pov`` graphics format, ``scale`` should not be specified.
278 1 tkerber
    The elements of the color array can additionally be strings, or 4
279 1 tkerber
    and 5 vectors for named colors, rgb + filter, and rgb + filter + transmit
280 1 tkerber
    specification. This format accepts the additional keywords:
281 1 tkerber

282 1 tkerber
    ``run_povray``, ``display``, ``pause``, ``transparent``,
283 1 tkerber
    ``canvas_width``, ``canvas_height``, ``camera_dist``,
284 1 tkerber
    ``image_plane``, ``camera_type``, ``point_lights``,
285 1 tkerber
    ``area_light``, ``background``, ``textures``, ``celllinewidth``,
286 1 tkerber
    ``bondlinewidth``, ``bondatoms``
287 1 tkerber
    """
288 1 tkerber
289 1 tkerber
    if format is None:
290 1 tkerber
        if filename == '-':
291 1 tkerber
            format = 'xyz'
292 1 tkerber
            filename = sys.stdout
293 1 tkerber
        elif 'POSCAR' in filename or 'CONTCAR' in filename:
294 1 tkerber
            format = 'vasp'
295 1 tkerber
        elif 'OUTCAR' in filename:
296 1 tkerber
            format = 'vasp_out'
297 1 tkerber
        else:
298 1 tkerber
            suffix = filename.split('.')[-1]
299 1 tkerber
            format = {}.get(suffix, suffix) # XXX this does not make sense
300 1 tkerber
            # Maybe like this:
301 1 tkerber
##             format = {'traj': 'trajectory',
302 1 tkerber
##                       'nc': 'netcdf',
303 1 tkerber
##                       'exi': 'exciting',
304 1 tkerber
##                       'in': 'aims',
305 1 tkerber
##                       'tmol': 'turbomole',
306 1 tkerber
##                       }.get(suffix, suffix)
307 1 tkerber
308 1 tkerber
    if format == 'exi':
309 1 tkerber
        from ase.io.exciting import write_exciting
310 1 tkerber
        write_exciting(filename, images)
311 1 tkerber
        return
312 1 tkerber
313 1 tkerber
314 1 tkerber
    if format == 'xyz':
315 1 tkerber
        from ase.io.xyz import write_xyz
316 1 tkerber
        write_xyz(filename, images)
317 1 tkerber
        return
318 1 tkerber
    elif format == 'in':
319 1 tkerber
        format = 'aims'
320 1 tkerber
    elif format == 'tmol':
321 1 tkerber
        from ase.io.turbomole import write_turbomole
322 1 tkerber
        write_turbomole(filename, images)
323 1 tkerber
        return
324 1 tkerber
    elif format == 'dftb':
325 1 tkerber
        from ase.io.dftb import write_dftb
326 1 tkerber
        write_dftb(filename, images)
327 1 tkerber
        return
328 1 tkerber
    elif format == 'struct':
329 1 tkerber
        from ase.io.wien2k import write_struct
330 1 tkerber
        write_struct(filename, images, **kwargs)
331 1 tkerber
        return
332 1 tkerber
333 1 tkerber
    format = {'traj': 'trajectory', 'nc': 'netcdf'}.get(format, format)
334 1 tkerber
    name = 'write_' + format
335 1 tkerber
336 1 tkerber
    if format in ['vti', 'vts', 'vtu']:
337 1 tkerber
        format = 'vtkxml'
338 1 tkerber
339 1 tkerber
    if format is None:
340 1 tkerber
        format = filetype(filename)
341 1 tkerber
342 1 tkerber
    try:
343 1 tkerber
        write = getattr(__import__('ase.io.%s' % format, {}, {}, [name]), name)
344 1 tkerber
    except ImportError:
345 1 tkerber
        raise TypeError('Unknown format: "%s".' % format)
346 1 tkerber
347 1 tkerber
    write(filename, images, **kwargs)
348 1 tkerber
349 1 tkerber
350 1 tkerber
def string2index(string):
351 1 tkerber
    if ':' not in string:
352 1 tkerber
        return int(string)
353 1 tkerber
    i = []
354 1 tkerber
    for s in string.split(':'):
355 1 tkerber
        if s == '':
356 1 tkerber
            i.append(None)
357 1 tkerber
        else:
358 1 tkerber
            i.append(int(s))
359 1 tkerber
    i += (3 - len(i)) * [None]
360 1 tkerber
    return slice(*i)
361 1 tkerber
362 1 tkerber
363 1 tkerber
def filetype(filename):
364 1 tkerber
    """Try to guess the type of the file."""
365 1 tkerber
    fileobj = open(filename)
366 1 tkerber
    s3 = fileobj.read(3)
367 1 tkerber
    if len(s3) == 0:
368 1 tkerber
        raise IOError('Empty file: ' + filename)
369 1 tkerber
370 1 tkerber
    if is_tarfile(filename):
371 1 tkerber
        return 'gpw'
372 1 tkerber
373 1 tkerber
    if s3 == 'CDF':
374 1 tkerber
        from ase.io.pupynere import NetCDFFile
375 1 tkerber
        nc = NetCDFFile(filename)
376 1 tkerber
        if 'number_of_dynamic_atoms' in nc.dimensions:
377 1 tkerber
            return 'dacapo'
378 1 tkerber
379 1 tkerber
        history = nc.history
380 1 tkerber
        if history == 'GPAW restart file':
381 1 tkerber
            return 'gpw-nc'
382 1 tkerber
        if history == 'ASE trajectory':
383 1 tkerber
            return 'nc'
384 1 tkerber
        if history == 'Dacapo':
385 1 tkerber
            return 'dacapo'
386 1 tkerber
        raise IOError('Unknown netCDF file!')
387 1 tkerber
388 1 tkerber
389 1 tkerber
    if is_zipfile(filename):
390 1 tkerber
        return 'vnl'
391 1 tkerber
392 1 tkerber
    fileobj.seek(0)
393 1 tkerber
    lines = fileobj.readlines(1000)
394 1 tkerber
395 1 tkerber
    if lines[0].startswith('PickleTrajectory'):
396 1 tkerber
        return 'traj'
397 1 tkerber
398 1 tkerber
    if lines[1].startswith('OUTER LOOP:') or filename.lower().endswith('.cube'):
399 1 tkerber
        return 'cube'
400 1 tkerber
401 1 tkerber
    if '  ___ ___ ___ _ _ _  \n' in lines:
402 1 tkerber
        return 'gpaw-text'
403 1 tkerber
404 1 tkerber
    if (' &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n'
405 1 tkerber
        in lines[:90]):
406 1 tkerber
        return 'dacapo-text'
407 1 tkerber
408 1 tkerber
    for word in ['ANIMSTEPS', 'CRYSTAL', 'SLAB', 'POLYMER', 'MOLECULE']:
409 1 tkerber
        if lines[0].startswith(word):
410 1 tkerber
            return 'xsf'
411 1 tkerber
412 1 tkerber
    filename_v = basename(filename)
413 1 tkerber
    if 'POSCAR' in filename_v or 'CONTCAR' in filename_v:
414 1 tkerber
        return 'vasp'
415 1 tkerber
416 1 tkerber
    if 'OUTCAR' in filename_v:
417 1 tkerber
        return 'vasp_out'
418 1 tkerber
419 1 tkerber
    if filename.lower().endswith('.exi'):
420 1 tkerber
        return 'exi'
421 1 tkerber
422 1 tkerber
    if filename.lower().endswith('.mol'):
423 1 tkerber
        return 'mol'
424 1 tkerber
425 1 tkerber
    if filename.lower().endswith('.pdb'):
426 1 tkerber
        return 'pdb'
427 1 tkerber
428 1 tkerber
    if filename.lower().endswith('.cif'):
429 1 tkerber
        return 'cif'
430 1 tkerber
431 1 tkerber
    if filename.lower().endswith('.struct'):
432 1 tkerber
        return 'struct'
433 1 tkerber
434 1 tkerber
    if filename.lower().endswith('.in'):
435 1 tkerber
        return 'aims'
436 1 tkerber
437 1 tkerber
    if filename.lower().endswith('.out'):
438 1 tkerber
        return 'aims_out'
439 1 tkerber
440 1 tkerber
    if filename.lower().endswith('.cfg'):
441 1 tkerber
        return 'cfg'
442 1 tkerber
443 1 tkerber
    if os.path.split(filename)[1] == 'atoms.dat':
444 1 tkerber
        return 'iwm'
445 1 tkerber
446 1 tkerber
    if filename.endswith('I_info'):
447 1 tkerber
        return 'Cmdft'
448 1 tkerber
449 1 tkerber
    if lines[0].startswith('$coord'):
450 1 tkerber
        return 'tmol'
451 1 tkerber
452 1 tkerber
    if lines[0].startswith('Geometry'):
453 1 tkerber
        return 'dftb'
454 1 tkerber
455 1 tkerber
    if s3 == '<?x':
456 1 tkerber
        from ase.io.vtkxml import probe_vtkxml
457 1 tkerber
        xmltype = probe_vtkxml(filename)
458 1 tkerber
        if xmltype == 'ImageData':
459 1 tkerber
            return 'vti'
460 1 tkerber
        elif xmltype == 'StructuredGrid':
461 1 tkerber
            return 'vts'
462 1 tkerber
        elif xmltype == 'UnstructuredGrid':
463 1 tkerber
            return 'vtu'
464 1 tkerber
        elif xmltype is not None:
465 1 tkerber
            raise IOError('Unknown VTK XML file!')
466 1 tkerber
467 1 tkerber
    if filename.lower().endswith('.sdf'):
468 1 tkerber
        return 'sdf'
469 1 tkerber
470 1 tkerber
    return 'xyz'