Changing default atom colors in VESTA to ASE/Jmol colors

Vesta is a 3D visualization package for atomic models, volumetric data like charge densities, etc. I mostly use the ase-gui for visualization because it can be automated in python (and often render the images with povray), but sometimes Vesta is useful for plotting things like charge density differences 1, or for making more sophisticated images showing bonds, polyhedra, etc. The issue is that ase-gui and Vesta use different colors for the atoms which lead to inconsistent colors if one uses both. Here is a methanol molecule with the old VESTA colors.

methanol-old.png

I like the ASE colors, so here I modify the VESTA color list to be consistent with ASE. To do this we need to modify the elements.ini file, located at VESTA/VESTA.app/Contents/Resources on my Mac (the relative path in the directory is probably different on my linux machine).

Here is what the structure of the file looks like

head ../files/elements.ini
1  H  0.46  1.20  0.200    1.00000    0.80000    0.80000
1  D  0.46  1.20  0.200    0.80000    0.80000    1.00000
2 He  1.22  1.40  1.220    0.98907    0.91312    0.81091
3 Li  1.57  1.40  0.590    0.52731    0.87953    0.45670
4 Be  1.12  1.40  0.270    0.37147    0.84590    0.48292
5  B  0.81  1.40  0.110    0.12490    0.63612    0.05948
6  C  0.77  1.70  0.150    0.50430    0.28659    0.16236
7  N  0.74  1.55  1.460    0.69139    0.72934    0.90280
8  O  0.74  1.52  1.400    0.99997    0.01328    0.00000
9  F  0.72  1.47  1.330    0.69139    0.72934    0.90280

The first three columns after the elements seem to be values for the atomic, van der Waals, and ionic radii. The next three numbers are the colors. They are basically rgb colors normalized by 255. All we have to do is to replace these numbers by the corresponding jmol colors. Here is some code that does that.

from ase.data.colors import jmol_colors

with open('../files/elements.ini') as f:
    lines = f.readlines()

with open ('../files/new_elements.ini', 'w') as f:
    for line in lines:
	num, sym, r1, r2, r3, c1, c2, c3 = line.split()

	if sym is 'D':
	    # Rewrite the old line
	    new_line = [num, sym, r1, r2, r3, c1, c2, c3, '\n']
	    f.write(line)        
	    continue

	if sym is 'XX':
	    new_c1, new_c2, new_c3 = jmol_colors[0]

	else:
	    new_c1, new_c2, new_c3 = jmol_colors[int(num)]

	    new_line = [num, sym, r1, r2, r3, new_c1, new_c2, new_c3]
	    # Get the right pretty printed format with this ugly 
	    # looking command
	    f.write('''{0:>3} {1:>2}  {2}  {3}  {4}    \
{5:1.5f}    {6:1.5f}    {7:1.5f}\n'''.format(*new_line))

Let's look at the new file to see if it looks correct.

head ../files/new_elements.ini
1  H  0.46  1.20  0.200    1.00000    1.00000    1.00000
1  D  0.46  1.20  0.200    0.80000    0.80000    1.00000
2 He  1.22  1.40  1.220    0.85100    1.00000    1.00000
3 Li  1.57  1.40  0.590    0.80000    0.50200    1.00000
4 Be  1.12  1.40  0.270    0.76100    1.00000    0.00000
5  B  0.81  1.40  0.110    1.00000    0.71000    0.71000
6  C  0.77  1.70  0.150    0.56500    0.56500    0.56500
7  N  0.74  1.55  1.460    0.18800    0.31400    0.97300
8  O  0.74  1.52  1.400    1.00000    0.05100    0.05100
9  F  0.72  1.47  1.330    0.56500    0.87800    0.31400

We can now replace our old file with this one and get the colors we want. You can find the file here.

Here is the new methanol image. That looks a lot more like I'm used to!

methanol-new.png

Footnotes:

1

Of course one can also do this using Mayavi in python.

Hello Org!

Here I try to make an example post using org-mode. I am using the orgmode plugin for Nikola found here.

First let's embed a code block. The org extension to Nikola uses pygments to colorize code blocks. To do that we need to make some modifications to the css file provided by my theme zen-jinja.

pygmentize -S default -a .highlight -f html >> custom.css
cat custom.css >> ../themes/zen-jinja/assets/css/main.css
rm custom.css

Now we can have a python code block that makes a plot.

import matplotlib.pyplot as plt

plt.plot([1,2,4], [1,2,4])
plt.savefig('../images/demo-plot.png')

demo-plot.png

To get this to show up on the website I had to specify the image link as

[[file:../../images/demo-plot.png]]

This is a little weird since the path in link is different from where I actually save the image. This is because when nikola builds the post it is saved as /output/posts/hello-org/index.html and the image path is two levels up in /output/images/. It will probably require some rearrangement in conf.py to get the images to show up both inline in my org file and in the exported html.

Now let's add an equation to see if it gets rendered with MathJax.

\begin{equation} y = e^{x} \end{equation}

I had to set

MATHJAX_CONFIG = '''
<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script>
'''

in the conf.py file to get this to work.