Fun with Applescript; automating obstinate programs

Applescript is a rather under-appreciated thing.

I must admit I’m not fond of it’s syntax, which manages to achieve Uncanny Valley-style “natural language” while still being wholly unintuitive. Also, as someone constantly bouncing between OSX and GNU/Linux machines, it makes much more sense to learn a scripting language that I can use on any machine. Still, I have found a couple of difficult tasks recently which are elegantly solved by Applescript.

1. Home working: remote saving of applications

Like many people I use Dropbox to keep files in sync that I need to access at short notice from anywhere.

One of these files is a big LibreOffice spreadsheet, listing details of all the density functional theory calculations in my project. As this includes planned, queuing and currently-running calculations, I frequently need to access this to keep my notation and folder structure straight. One of the benefits of being a PhD student with a computational project is that it offers great flexibility in managing my schedule and working remotely. My workstation (an iMac) is on constantly, and I can log in remotely through an ssh terminal to access my files and tunnel to HPC facilities. However, there is a snag; files are only updated when I save them… There is no great incentive to save frequently when editing a simple spreadsheet on a very stable computer. It is only when I get home that realise that I now cannot edit my catalogue of calculations without running into all kinds of Dropbox conflicts and messy file merges.

Or I could just run this:

#! /usr/bin/osascript                                                                       
tell application "LibreOffice"                                                              
end tell                                                                                    
tell application "System Events"                                                            
tell process "LibreOffice"                                                                  
click menu item "Save" of menu "File" of menu bar 1                                         
end tell                                                                                    
end tell                                                                                    

Yes, that is just as filthy as it looks: remotely click “save”. Wait for Dropbox to sync. Open on local machine, get back to work.

2. Generating a lot of pretty pictures

VESTA is one of the best-looking packages out there for visualising molecule and crystal structures.
In particular it uses hardware acceleration well, draws beautiful isosurfaces and has a range of lighting options. Tragically it lacks any kind of scripting interface (as far as I am aware). For the target audience of solid-state and org chemists, this is perhaps not a huge problem. Computational guys like to think big…

Recently I’ve been looking at allotropes of sulfur. Whether and how different allotropes are bonded is quite interesting, as is the significance of spin polarisation. Having carried out hybrid-level DFT calculations, it occurred to me I had a pretty good map of the molecular orbital structure. But I was damned if I was going to open the File dialogue once for every orbital, let alone do that every time I tried a minor variation of the structure or DFT parameters. About an hour of Stack Exchange and experimentation later:

#! /usr/bin/osascript                                                                       
tell application "VESTA"                                                                    
end tell                                                                                    
tell application "System Events"                                                            
tell process "VESTA"                                                                        
click menu item "Export Raster Image..." of menu "File" of menu bar 1                       
delay 1                                                                                     
keystroke return -- Agree to default filename                                               
delay 1                                                                                     
key code 53 -- "Escape" the scaling dialogue                                                
delay 1                                                                                     
keystroke return -- Get rid of congratulatory "you made a file!" dialogue                   
delay 1                                                                                     
keystroke "w" using command down -- Close file, ready for next one                          
end tell                                                                                    
end tell

Again, absolute filth. A few tips and tricks had to be employed here: key code 53 seems to be the preferred way of sending an “escape” key message.
The 1 second delays are probably longer than necessary but leave time for the dialogue boxes to open.

Simple globbing and for loops with bash allowed me to open a stack of .cube files and paste the output images together with Imagemagick tools. The result is, I think, rather fetching (apologies for length). If you studied molecular orbital theory at school, then you should have a fair stab at interpreting this in terms of combinations of conventional sigma- and pi-bonds. Note that of the 16 combinations of valence orbitals, we have four fully-bonding, four fully-antibonding and eight mixed bonding and antibonding molecular orbitals. They aren’t necessarily in the order you might expect, however!

Valence Kohn-Sham eigenstates of rectangular S4
Kohn-Sham valence eigenstates of rectangular S4. Data from all-electron density functional theory calculation with PBE0 hybrid functional as implemented by the FHI-aims quantum chemistry code. Blue borders indicate occupation by a single electron.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s