# How to determine the Bravais lattice and atom basis vectors from a CIF file?

Say I have a CIF file describing some material in terms of its symmetry space group, lattice parameters and in-cell atom positions. A simple example might be,

data_global
_chemical_name 'Graphene'
_cell_length_a                 2.46
_cell_length_b                 2.46
_cell_length_c                 1
_cell_angle_alpha              90
_cell_angle_beta               90
_cell_angle_gamma              120
_symmetry_space_group_name_H-M 'P 3 m 1'
loop_
_atom_site_label
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
C  0.00000   0.00000   0.00000
C  0.33333   0.66667   0.00000


I would like to extract from this Bravais lattice vectors and atom basis vectors. For this specific example, this might look like,

 2.456   0.0     0.0
-1.228   2.126   0.0
C
0.0      0.0      0.0
0.0      1.418    0.0


where the first two lines give the two lattice vectors (in some basis), while the next two give the positions of the atoms in the unit cell.

I have tried using Open Babel for this, converting from the CIF format to a VASP one. This works well for the example above, but fails for a material such as tin sulfide (SnS), which has a structure similar to black phosphorus---four atoms in a unit cell, only two of which are explicitly listed in the CIF file. The positions of the other two are implied by the symmetry group, and programs such as Mercury correctly visualize the structure based on the CIF file. However, converting the CIF into VASP only gives you two of the four unit cell atoms. I tried all other formats in Open Babel, with no success.

Is there a reliable way to convert a CIF file into a description in terms of a Bravais lattice plus atom basis vectors?

You can use Open Babel. You just need to "fill" the unit cell (i.e., generate all the symmetric atoms).

You just need the --fillUC option, documented here:

For a crystal structure, add atoms to fill the entire unit cell based on the unique positions, the unit cell and the spacegroup. The parameter can either be strict (the default), which only keeps atoms inside the unit cell, or keepconnect, which fills the unit cell but keeps the original connectivity.

e.g.,:

obabel SnS.cif -oVASP --fillUC >POSCAR

Result is:

Herzenbergite
1.000
4.330000000000000   0.000000000000000   0.000000000000000
0.000000000000001  11.180000000000000   0.000000000000000
0.000000000000000   0.000000000000000   3.980000000000000
Sn  S   Sn  S
1   1   3   3
Cartesian
0.4979500000000001148      1.3192399999999999682      0.9949999999999999956
2.0697400000000003573      9.5030000000000001137      0.9949999999999999956
0.4979500000000001148      1.3192399999999999682      0.9949999999999999956
0.4979500000000001148      1.3192399999999999682      0.9949999999999999956
0.4979500000000001148      1.3192399999999999682      0.9949999999999999956
2.0697400000000003573      9.5030000000000001137      0.9949999999999999956
2.0697400000000003573      9.5030000000000001137      0.9949999999999999956
2.0697400000000003573      9.5030000000000001137      0.9949999999999999956


I would recommend you to use vesta (http://jp-minerals.org/vesta/en/). It can allow you to convert almost all types of quantum chemical coordinate file to your desitred one. To get VASP format, just drag you CIF file on vesta and it will show you the structure and then you can save it as POSCAR format.