diff --git a/nomad/app/v1/routers/systems.py b/nomad/app/v1/routers/systems.py index 393a5bccb70c9a864d733105c93663e28739f43f..ce0cf3957eba6a443848f9830ff4158b2f6b00db 100644 --- a/nomad/app/v1/routers/systems.py +++ b/nomad/app/v1/routers/systems.py @@ -123,7 +123,7 @@ def write_xyz(atoms: NOMADAtoms, entry_id: str, formula: str = None) -> str: """For writing an XYZ file.""" stream = StringIO() atoms = ase_atoms_from_nomad_atoms(atoms) - ase.io.write(stream, atoms, format='xyz') + ase.io.write(stream, atoms, format='extxyz') stream.seek(0) content = stream.read() if entry_id is not None: diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index 99b5263a09a9a09089a13c239d65f202b98e2b42..59e554b9a31e582c3d1dd908e7588032f10f45b3 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -1613,7 +1613,11 @@ class MSection( dimensions = len(quantity_def.shape) if dimensions == 0: value = self.__set_normalize(quantity_def, value) - if value == _unset_value: + value_unset = value == _unset_value + if isinstance(value_unset, np.ndarray): + if value_unset.any(): + return + elif value_unset: return elif dimensions == 1: @@ -1714,7 +1718,11 @@ class MSection( m_quantity.value = self.__set_normalize( quantity_def, m_quantity.value ) - if m_quantity.value == _unset_value: + value_unset = value == _unset_value + if isinstance(value_unset, np.ndarray): + if value_unset.any(): + return + elif value_unset: return elif dimensions == 1: diff --git a/pyproject.toml b/pyproject.toml index 21539d6332060006b9f30e22ac8305b292ea269e..77d06b01b299e2d3641743b8f6e26e5939b68613 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ requires-python = ">=3.9" dependencies = [ 'aniso8601>=7.0.0', - 'ase~=3.19.0', + 'ase~=3.22.0', 'bitarray>=2.3.5', 'cachetools>=4.2.4', 'click>=7.1.2', @@ -32,7 +32,7 @@ dependencies = [ 'mdanalysis==2.5.0', 'networkx==2.6.3', 'nptyping~=1.4.4', - 'numpy~=1.22.4', + 'numpy>=1.22.4,<2.0.0', 'openpyxl>=3.0.0', 'orjson', 'pandas>=1.3.5,<2.0.0', diff --git a/requirements-dev.txt b/requirements-dev.txt index 0adf9d9b242e192d3fc038610a4b1c3ac50405f1..58be104eabc724c1c1a00f467835b6238591f3de 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -11,7 +11,7 @@ argon2-cffi==23.1.0 # via jupyter-server, -r requirements.txt argon2-cffi-bindings==21.2.0 # via argon2-cffi, -r requirements.txt arrow==1.3.0 # via isoduration, -r requirements.txt asciitree==0.3.3 # via zarr, -r requirements.txt -ase==3.19.3 # via asr, ifes-apt-tc-data-modeling, matid, pynxtools, quippy-ase, -r requirements.txt, nomad-lab (pyproject.toml) +ase==3.22.1 # via asr, ifes-apt-tc-data-modeling, matid, pynxtools, quippy-ase, -r requirements.txt, nomad-lab (pyproject.toml) asgiref==3.8.1 # via -r requirements.txt, nomad-lab (pyproject.toml) asr==0.4.1 # via -r requirements.txt, nomad-lab (pyproject.toml) asteval==0.9.33 # via lmfit, -r requirements.txt @@ -51,7 +51,7 @@ comm==0.2.2 # via ipykernel, ipywidgets, -r requirements.txt commonmark==0.9.1 # via recommonmark, -r requirements.txt contourpy==1.2.1 # via matplotlib, -r requirements.txt coverage==7.5.3 # via pytest-cov -cryptography==42.0.7 # via jwcrypto, pyjwt, pyopenssl, rfc3161ng, secretstorage, -r requirements.txt +cryptography==42.0.8 # via jwcrypto, pyjwt, pyopenssl, rfc3161ng, secretstorage, -r requirements.txt cycler==0.12.1 # via matplotlib, -r requirements.txt dask==2024.5.2 # via hyperspy, kikuchipy, orix, pyxem, rosettasciio, -r requirements.txt debugpy==1.8.1 # via ipykernel, -r requirements.txt @@ -108,7 +108,7 @@ httpx==0.27.0 # via jupyterlab, -r requirements.txt, nomad-lab (pypr hyperspy==1.7.5 # via kikuchipy, pyxem, -r requirements.txt idna==3.7 # via anyio, email-validator, httpx, jsonschema, requests, -r requirements.txt ifes-apt-tc-data-modeling==0.2.2 # via pynxtools-apm, -r requirements.txt -igor2==0.5.2 # via pynxtools-xps, -r requirements.txt +igor2==0.5.6 # via pynxtools-xps, -r requirements.txt imageio==2.27.0 # via hyperspy, kikuchipy, nionswift, nionswift-io, nionui, scikit-image, -r requirements.txt imagesize==1.4.1 # via sphinx, -r requirements.txt importlib-metadata==7.1.0 # via build, dask, flask, hyperspy, jupyter-client, jupyter-lsp, jupyterhub, jupyterlab, jupyterlab-server, keyring, markdown, mkdocs, mkdocs-get-deps, nbconvert, pynxtools, sphinx, twine, -r requirements.txt, nomad-lab (pyproject.toml) @@ -165,7 +165,7 @@ mako==1.3.5 # via alembic, -r requirements.txt markdown==3.6 # via mkdocs, mkdocs-click, mkdocs-material, pymdown-extensions markupsafe==2.1.5 # via jinja2, mako, mkdocs, nbconvert, werkzeug, -r requirements.txt, nomad-lab (pyproject.toml) matid==2.0.1 # via -r requirements.txt, nomad-lab (pyproject.toml) -matplotlib==3.8.4 # via ase, asr, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, phonopy, pyfai, pymatgen, pyxem, radioactivedecay, -r requirements.txt +matplotlib==3.9.0 # via ase, asr, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, phonopy, pyfai, pymatgen, pyxem, radioactivedecay, -r requirements.txt matplotlib-inline==0.1.7 # via ipykernel, ipython, -r requirements.txt matplotlib-scalebar==0.8.1 # via orix, -r requirements.txt mda-xdrlib==0.2.0 # via pyedr, -r requirements.txt @@ -201,10 +201,10 @@ nest-asyncio==1.6.0 # via ipykernel, -r requirements.txt netcdf4==1.6.5 # via -r requirements.txt, nomad-lab (pyproject.toml) networkx==2.6.3 # via matid, mdanalysis, pymatgen, radioactivedecay, scikit-image, -r requirements.txt, nomad-lab (pyproject.toml) nh3==0.2.17 # via readme-renderer -niondata==0.15.5 # via nionswift, nionswift-io, -r requirements.txt -nionswift==0.16.8 # via pynxtools-em, -r requirements.txt -nionswift-io==0.15.1 # via nionswift, -r requirements.txt -nionui==0.6.11 # via nionswift, -r requirements.txt +niondata==15.6.2 # via nionswift, nionswift-io, -r requirements.txt +nionswift==16.10.0 # via pynxtools-em, -r requirements.txt +nionswift-io==15.2.1 # via nionswift, -r requirements.txt +nionui==7.0.3 # via nionswift, -r requirements.txt nionutils==0.4.10 # via niondata, nionswift, nionswift-io, nionui, -r requirements.txt notebook==7.1.3 # via jupyter, -r requirements.txt notebook-shim==0.2.4 # via jupyterlab, notebook, -r requirements.txt @@ -212,7 +212,7 @@ nptyping==1.4.4 # via -r requirements.txt, nomad-lab (pyproject.toml) numba==0.59.1 # via diffsims, hyperspy, kikuchipy, orix, pyxem, sparse, -r requirements.txt numcodecs==0.12.1 # via zarr, -r requirements.txt numexpr==2.10.0 # via hyperspy, pyfai, pyxem, tables, -r requirements.txt -numpy==1.22.4 # via ase, biopython, blosc2, cftime, contourpy, dask, diffsims, f90wrap, fabio, findiff, griddataformats, gsd, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, igor2, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, phonopy, pycifrw, pyedr, pyfai, pymatgen, pynxtools, pywavelets, pyxem, quippy-ase, radioactivedecay, rdkit, rosettasciio, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, xarray, xraydb, zarr, -r requirements.txt, nomad-lab (pyproject.toml) +numpy==1.26.4 # via ase, biopython, blosc2, cftime, contourpy, dask, diffsims, f90wrap, fabio, findiff, griddataformats, gsd, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, igor2, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, phonopy, pycifrw, pyedr, pyfai, pymatgen, pynxtools, pywavelets, pyxem, quippy-ase, radioactivedecay, rdkit, rosettasciio, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, xarray, xraydb, zarr, -r requirements.txt, nomad-lab (pyproject.toml) numpy-quaternion==2023.0.3 # via orix, -r requirements.txt oauthenticator==15.1.0 # via -r requirements.txt, nomad-lab (pyproject.toml) oauthlib==3.2.2 # via jupyterhub, -r requirements.txt @@ -260,7 +260,7 @@ pyedr==0.8.0 # via panedr, -r requirements.txt pyfai==2024.5.0 # via pyxem, -r requirements.txt pygments==2.18.0 # via devtools, ipython, jupyter-console, mkdocs-material, nbconvert, qtconsole, readme-renderer, sphinx, -r requirements.txt pyjwt==2.6.0 # via -r requirements.txt, nomad-lab (pyproject.toml) -pymatgen==2023.9.25 # via asr, -r requirements.txt, nomad-lab (pyproject.toml) +pymatgen==2024.5.31 # via asr, -r requirements.txt, nomad-lab (pyproject.toml) pymdown-extensions==10.8.1 # via mkdocs-material pymongo==4.6.3 # via mongoengine, optimade, -r requirements.txt, nomad-lab (pyproject.toml) pynxtools==0.3.1 # via pynxtools-apm, pynxtools-ellips, pynxtools-em, pynxtools-mpes, pynxtools-stm, pynxtools-xps, pynxtools-xrd, -r requirements.txt, nomad-lab (pyproject.toml) @@ -285,7 +285,7 @@ python-dateutil==2.9.0.post0 # via arrow, celery, elasticsearch-dsl, ghp-import python-dotenv==1.0.1 # via uvicorn, -r requirements.txt python-gitlab==2.10.1 # via nomad-lab (pyproject.toml) python-json-logger==2.0.2 # via jupyter-events, jupyter-telemetry, -r requirements.txt, nomad-lab (pyproject.toml) -python-keycloak==4.0.0 # via -r requirements.txt, nomad-lab (pyproject.toml) +python-keycloak==4.0.1 # via -r requirements.txt, nomad-lab (pyproject.toml) python-logstash==0.4.6 # via -r requirements.txt, nomad-lab (pyproject.toml) python-magic==0.4.24 # via -r requirements.txt, nomad-lab (pyproject.toml) python-multipart==0.0.9 # via -r requirements.txt, nomad-lab (pyproject.toml) @@ -388,9 +388,9 @@ websockets==12.0 # via uvicorn, -r requirements.txt werkzeug==3.0.3 # via flask, -r requirements.txt widgetsnbextension==4.0.11 # via ipywidgets, -r requirements.txt wrapt==1.16.0 # via -r requirements.txt, nomad-lab (pyproject.toml) -xarray==2023.12.0 # via pynxtools, pynxtools-mpes, pynxtools-xps, -r requirements.txt, nomad-lab (pyproject.toml) +xarray==2024.3.0 # via pynxtools, pynxtools-mpes, pynxtools-xps, -r requirements.txt, nomad-lab (pyproject.toml) xmltodict==0.13.0 # via ifes-apt-tc-data-modeling, pynxtools-em, -r requirements.txt xraydb==4.5.4 # via pynxtools-em, -r requirements.txt -zarr==2.17.1 # via hyperspy, -r requirements.txt +zarr==2.18.2 # via hyperspy, -r requirements.txt zipp==3.19.2 # via importlib-metadata, importlib-resources, -r requirements.txt zipstream-new==1.1.5 # via -r requirements.txt, nomad-lab (pyproject.toml) diff --git a/requirements.txt b/requirements.txt index 8cae6447c15c40ad380f3169cd9bc0c29989c296..e051c2ab63732f755811e2edd362757e8610a5f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ argon2-cffi==23.1.0 # via jupyter-server argon2-cffi-bindings==21.2.0 # via argon2-cffi arrow==1.3.0 # via isoduration asciitree==0.3.3 # via zarr -ase==3.19.3 # via asr, ifes-apt-tc-data-modeling, matid, pynxtools, quippy-ase, nomad-lab (pyproject.toml) +ase==3.22.1 # via asr, ifes-apt-tc-data-modeling, matid, pynxtools, quippy-ase, nomad-lab (pyproject.toml) asgiref==3.8.1 # via nomad-lab (pyproject.toml) asr==0.4.1 # via nomad-lab (pyproject.toml) asteval==0.9.33 # via lmfit @@ -44,7 +44,7 @@ cloudpickle==3.0.0 # via dask comm==0.2.2 # via ipykernel, ipywidgets commonmark==0.9.1 # via recommonmark contourpy==1.2.1 # via matplotlib -cryptography==42.0.7 # via jwcrypto, pyjwt, pyopenssl, rfc3161ng +cryptography==42.0.8 # via jwcrypto, pyjwt, pyopenssl, rfc3161ng cycler==0.12.1 # via matplotlib dask==2024.5.2 # via hyperspy, kikuchipy, orix, pyxem, rosettasciio debugpy==1.8.1 # via ipykernel @@ -97,7 +97,7 @@ httpx==0.27.0 # via jupyterlab, nomad-lab (pyproject.toml) hyperspy==1.7.5 # via kikuchipy, pyxem idna==3.7 # via anyio, email-validator, httpx, jsonschema, requests ifes-apt-tc-data-modeling==0.2.2 # via pynxtools-apm -igor2==0.5.2 # via pynxtools-xps +igor2==0.5.6 # via pynxtools-xps imageio==2.27.0 # via hyperspy, kikuchipy, nionswift, nionswift-io, nionui, scikit-image imagesize==1.4.1 # via sphinx importlib-metadata==7.1.0 # via dask, flask, hyperspy, jupyter-client, jupyter-lsp, jupyterhub, jupyterlab, jupyterlab-server, nbconvert, pynxtools, sphinx, nomad-lab (pyproject.toml) @@ -147,7 +147,7 @@ m2r==0.2.1 # via nomad-lab (pyproject.toml) mako==1.3.5 # via alembic markupsafe==2.1.5 # via jinja2, mako, nbconvert, werkzeug matid==2.0.1 # via nomad-lab (pyproject.toml) -matplotlib==3.8.4 # via ase, asr, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, phonopy, pyfai, pymatgen, pyxem, radioactivedecay +matplotlib==3.9.0 # via ase, asr, diffsims, hyperspy, kikuchipy, matplotlib-scalebar, mdanalysis, orix, phonopy, pyfai, pymatgen, pyxem, radioactivedecay matplotlib-inline==0.1.7 # via ipykernel, ipython matplotlib-scalebar==0.8.1 # via orix mda-xdrlib==0.2.0 # via pyedr @@ -169,10 +169,10 @@ ndindex==1.8 # via blosc2 nest-asyncio==1.6.0 # via ipykernel netcdf4==1.6.5 # via nomad-lab (pyproject.toml) networkx==2.6.3 # via matid, mdanalysis, pymatgen, radioactivedecay, scikit-image, nomad-lab (pyproject.toml) -niondata==0.15.5 # via nionswift, nionswift-io -nionswift==0.16.8 # via pynxtools-em -nionswift-io==0.15.1 # via nionswift -nionui==0.6.11 # via nionswift +niondata==15.6.2 # via nionswift, nionswift-io +nionswift==16.10.0 # via pynxtools-em +nionswift-io==15.2.1 # via nionswift +nionui==7.0.3 # via nionswift nionutils==0.4.10 # via niondata, nionswift, nionswift-io, nionui notebook==7.1.3 # via jupyter notebook-shim==0.2.4 # via jupyterlab, notebook @@ -180,7 +180,7 @@ nptyping==1.4.4 # via nomad-lab (pyproject.toml) numba==0.59.1 # via diffsims, hyperspy, kikuchipy, orix, pyxem, sparse numcodecs==0.12.1 # via zarr numexpr==2.10.0 # via hyperspy, pyfai, pyxem, tables -numpy==1.22.4 # via ase, biopython, blosc2, cftime, contourpy, dask, diffsims, f90wrap, fabio, findiff, griddataformats, gsd, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, igor2, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, phonopy, pycifrw, pyedr, pyfai, pymatgen, pynxtools, pywavelets, pyxem, quippy-ase, radioactivedecay, rdkit, rosettasciio, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, xarray, xraydb, zarr, nomad-dos-fingerprints (dependencies/nomad-dos-fingerprints/pyproject.toml), nomad-lab (pyproject.toml) +numpy==1.26.4 # via ase, biopython, blosc2, cftime, contourpy, dask, diffsims, f90wrap, fabio, findiff, griddataformats, gsd, h5grove, h5py, hyperspy, ifes-apt-tc-data-modeling, igor2, imageio, kikuchipy, lmfit, matid, matplotlib, mdanalysis, mrcfile, netcdf4, niondata, nionswift, nionswift-io, nionui, nptyping, numba, numcodecs, numexpr, numpy-quaternion, orix, pandas, phonopy, pycifrw, pyedr, pyfai, pymatgen, pynxtools, pywavelets, pyxem, quippy-ase, radioactivedecay, rdkit, rosettasciio, scikit-image, scikit-learn, scipy, silx, sparse, spglib, tables, tifffile, xarray, xraydb, zarr, nomad-dos-fingerprints (dependencies/nomad-dos-fingerprints/pyproject.toml), nomad-lab (pyproject.toml) numpy-quaternion==2023.0.3 # via orix oauthenticator==15.1.0 # via nomad-lab (pyproject.toml) oauthlib==3.2.2 # via jupyterhub @@ -223,7 +223,7 @@ pyedr==0.8.0 # via panedr pyfai==2024.5.0 # via pyxem pygments==2.18.0 # via ipython, jupyter-console, nbconvert, qtconsole, sphinx pyjwt==2.6.0 # via nomad-lab (pyproject.toml) -pymatgen==2023.9.25 # via asr, nomad-lab (pyproject.toml) +pymatgen==2024.5.31 # via asr, nomad-lab (pyproject.toml) pymongo==4.6.3 # via mongoengine, optimade, nomad-lab (pyproject.toml) pynxtools==0.3.1 # via pynxtools-apm, pynxtools-ellips, pynxtools-em, pynxtools-mpes, pynxtools-stm, pynxtools-xps, pynxtools-xrd, nomad-lab (pyproject.toml) pynxtools-apm==0.2 # via pynxtools @@ -240,7 +240,7 @@ python-box==6.1.0 # via rosettasciio python-dateutil==2.9.0.post0 # via arrow, celery, elasticsearch-dsl, hyperspy, ipyparallel, jupyter-client, jupyterhub, matplotlib, pandas, pybis, rfc3161ng, rosettasciio python-dotenv==1.0.1 # via uvicorn python-json-logger==2.0.2 # via jupyter-events, jupyter-telemetry, nomad-lab (pyproject.toml) -python-keycloak==4.0.0 # via nomad-lab (pyproject.toml) +python-keycloak==4.0.1 # via nomad-lab (pyproject.toml) python-logstash==0.4.6 # via nomad-lab (pyproject.toml) python-magic==0.4.24 # via nomad-lab (pyproject.toml) python-multipart==0.0.9 # via nomad-lab (pyproject.toml) @@ -331,9 +331,9 @@ websockets==12.0 # via uvicorn werkzeug==3.0.3 # via flask widgetsnbextension==4.0.11 # via ipywidgets wrapt==1.16.0 # via nomad-lab (pyproject.toml) -xarray==2023.12.0 # via pynxtools, pynxtools-mpes, pynxtools-xps, nomad-lab (pyproject.toml) +xarray==2024.3.0 # via pynxtools, pynxtools-mpes, pynxtools-xps, nomad-lab (pyproject.toml) xmltodict==0.13.0 # via ifes-apt-tc-data-modeling, pynxtools-em xraydb==4.5.4 # via pynxtools-em -zarr==2.17.1 # via hyperspy +zarr==2.18.2 # via hyperspy zipp==3.19.2 # via importlib-metadata, importlib-resources zipstream-new==1.1.5 # via nomad-lab (pyproject.toml) diff --git a/tests/app/v1/routers/test_systems.py b/tests/app/v1/routers/test_systems.py index baaec11448deefef698e21703093714b58053c31..40beb917bac514fb283090be6d0ce436ac9e7118 100644 --- a/tests/app/v1/routers/test_systems.py +++ b/tests/app/v1/routers/test_systems.py @@ -38,7 +38,7 @@ from .common import assert_response, assert_browser_download_headers def ase_atoms(content, format): """Creates an ase.Atoms object given given file contents and format.""" - format = {'pdb': 'proteindatabank'}.get(format, format) + format = {'pdb': 'proteindatabank', 'xyz': 'extxyz'}.get(format, format) atoms = ase.io.read(StringIO(content), format=format) return atoms @@ -237,6 +237,8 @@ END 'cif', """# NOMAD ENTRY ID: systems_entry_1 data_CH +_chemical_formula_structural CH +_chemical_formula_sum "C1 H1" _cell_length_a 5 _cell_length_b 5 _cell_length_c 5 @@ -244,24 +246,23 @@ _cell_angle_alpha 90 _cell_angle_beta 90 _cell_angle_gamma 90 -_symmetry_space_group_name_H-M "P 1" -_symmetry_int_tables_number 1 +_space_group_name_H-M_alt "P 1" +_space_group_IT_number 1 loop_ - _symmetry_equiv_pos_as_xyz + _space_group_symop_operation_xyz 'x, y, z' loop_ + _atom_site_type_symbol _atom_site_label - _atom_site_occupancy + _atom_site_symmetry_multiplicity _atom_site_fract_x _atom_site_fract_y _atom_site_fract_z - _atom_site_thermal_displace_type - _atom_site_B_iso_or_equiv - _atom_site_type_symbol - C1 1.0000 0.00000 0.00000 0.00000 Biso 1.000 C - H1 1.0000 0.20000 0.20000 0.20000 Biso 1.000 H + _atom_site_occupancy + C C1 1.0 0.00000 0.00000 0.00000 1.0000 + H H1 1.0 0.20000 0.20000 0.20000 1.0000 """, 'CH.cif', id='cif', @@ -322,17 +323,18 @@ END 'cif', """# NOMAD ENTRY ID: systems_entry_1 data_NO +_chemical_formula_structural NO +_chemical_formula_sum "N1 O1" loop_ + _atom_site_type_symbol _atom_site_label - _atom_site_occupancy + _atom_site_symmetry_multiplicity _atom_site_Cartn_x _atom_site_Cartn_y _atom_site_Cartn_z - _atom_site_thermal_displace_type - _atom_site_B_iso_or_equiv - _atom_site_type_symbol - N1 1.0000 0.00000 0.00000 0.00000 Biso 1.000 N - O1 1.0000 1.00000 1.00000 1.00000 Biso 1.000 O + _atom_site_occupancy + N N1 1.0 0.00000 0.00000 0.00000 1.0000 + O O1 1.0 1.00000 1.00000 1.00000 1.0000 """, 'NO.cif', id='cif',