Agilent Infinity Series liquid chromatograph and 6420 triple quadrupole mass spectrometer

Here’s a picture of our LC-MS.


Its a triple quadrupole instrument, so its designed for quantitative analysis of any compound you can solubilise and ionise, which includes pretty much anything relevant to metabolism, physiology, pharmacology and biochemistry.

Its a conventional pressure LC stack featuring thermostatted autosampler for 100 x 2ml vials, a thermostatted column compartment and a diode array detector at the bottom, if needed. We also have a fluorescence detector which isn’t shown.

We have two sources for the MS, a conventional electrospray ionisation [ESI] source and a Multi Mode Ionisation [MMI] source which can be set for full ESI, full Atmospheric Pressure Chemical Ionisation [APCI] or a mixture of the two, with full control over the corona current and charging voltage.

This instrument is currently analysing sugar derivatives and has previously been used to quantify phenolic compounds and anthocyanins in cherries, triglycerides in human plasma and serum and neonicotinoid pesticides. I am currently developing a method to target 15 bile acids in human samples and another to target lignin-derived phenolics in estuarine plant material and sediment.

Scraping molecular information from ChemSpider using Processing.

I’ve spent the evening knocking out this little sketch to scrape molecular information from ChemSpider to inform my mass spectrometry. Until now I’ve been doing this by hand or getting the students to, when they are able, but this is the start of my attempt to automate the process. Ultimately I will just want to feed it a text file of compound names and it will parse the output into a document.

Open a Processing window, copy the code below into it, edit the first string to contain the name of the compound of your choice and click run. Here’s an image of example output.

Processing ChemSpider sketch output

// sketch to grab molecular information from a named compound from ChemSpider
// AUT School of Applied Science
// June 2015
// released under GPLv3 licence –

// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
// enter the compound name you want information for
String compound = “caffeine”;
// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

// sketch continues
PImage webImg;

String URL = “”;
String nameURL = URL + compound;
String[] html1 = loadStrings(nameURL);

String CSID = “CSID”;
String formula = “formula”;
String MIM = “MIM”;
String solubility = “solubility”;
String logKow = “logKow”;
int imageSize = 400;
void setup() {
size(imageSize, imageSize);

for(String i:html1) { // iterate through each string in the array
// println(i);
int line = i.indexOf(“CSID:”); // identifies CSID line by searching for this string

if(line > 0) { // if you find that string
String[] trim1 = split(i, ‘,’); // split off the junk
// for(int i = 0; i < trim1.length; i++) { // println(trim[i]); // } String[] trim2 = split(trim1[0], ‘:’); // split off more junk CSID = trim2[1]; // set the CSID break; } } String imageURL = “; + CSID + “&w=” + imageSize + “&h=” + imageSize; webImg = loadImage(imageURL, “jpg”); String CSIDURL = “; + CSID + “.html”; // use the CSID to construct the url to that molecule’s entry String[] html2 = loadStrings(CSIDURL); // grab the html //println(html2); for(String i:html2) { // this is the main part of the macro // println(i); int MIMLine = i.indexOf(“Monoisotopic mass”); // identifies MIM line int formulaLine = i.indexOf(“Molecular-Formula”); // identifies the formula line int solubilityLine = i.indexOf(“Solubility at 25 deg C (mg/L):”); // etc int logKowLine = i.indexOf(“Log Kow (KOWWIN”); // etc if(formulaLine > 0) {
String[] trim1 = split(i, ‘/’);
// for(int e = 0; e < trim1.length; e++) { // println(trim1[e]); // } String[] trim2 = split(trim1[2], ‘”‘); formula = trim2[0]; } if(MIMLine > 0) {
String[] trim1 = split(i, ‘>’);
// for(int e = 0; e < trim1.length; e++) { // println(trim1[e]); // } String[] trim2 = split(trim1[3], ‘ ‘); MIM = trim2[0]; } if(solubilityLine > 0) {
String[] trim1 = split(i, ‘ ‘);
// for(int e = 0; e < trim1.length; e++) { // println(trim1[e]); // } solubility = trim1[12]; } if(logKowLine > 0) {
String[] trim1 = split(i, ‘ ‘);
// for(int e = 0; e < trim1.length; e++) {
// println(trim1[e]);
// }
logKow = trim1[11];
print(“the formula for ” + compound + ” is “);

print(“the monoisotopic mass of ” + compound + ” is “);
println(MIM + ” Da”);

print(“the estimated log Kow of ” + compound + ” is “);

print(“the solubility of ” + compound + ” at 25C is “);
println(solubility + ” mg/l”);
void draw() {
image(webImg, 0, 0);

research update

I’ve been meaning to write a post for a couple of weeks detailing the state of play of my current analytical projects but I’ve been awfully busy helping my MSc student get the last of her LC-MS data on cherry anthocyanins and phenolics. We managed it in the end and she has a lovely result so I spent last week broadening my focus again and picking up some of the projects I’d had to put aside. Most of last week I also spent trying to derivatise reducing sugars for a collaboration with some lovely people from the Human Potential Centre at AUT’s Millenium Institute. This is a really exciting capability as sugars are notoriously hard targets to analyse chromatographically. We currently use a gas chromatographic method which involves a quite lengthy and fiddly acetylation procedure but I’ve found a compound that works really nicely for liquid chromatography with a relatively simple derivatisation procedure. There’s also lots of potential to push the analysis into larger oligosaccharides and glycans, with at least two exciting projects already on the table. I’m hoping this might result in two publications, the first being method development and the second an application.

I’ve also started developing a quantitative method for bile acids and have been approached to quantify lignin-derived phenolic compounds in sediment and plant material from estuarine habitats across the South Pacific. Very exotic! At some point I’d like to get some more method development done on neonicotinoid pesticides as I’ve developed a very cool and powerful extraction method which may solve the recovery and sensitivity problems. Again, definite options to present this as a method development and validation paper so no details yet.



As a follow-up to this earlier post I think its important to note that I have discovered how to search the entire NIST library from AMDIS! It is odd but this doesn’t seem to be well described in the manual so maybe I can help other GC-MS ninjas to get the most out of their data by describing it here.

The first thing you have to do after loading a results file, is to analyse it. You don’t need to use any particular library to do this, you just need AMDIS to identify all the component scans in the sample. Any identities assigned to targets in this step will be overwritten in the following one.

Next you have to select the “Search NIST Library…” option from the “Analyze” [sic] menu.


This will give you a bunch of familiar options. If you haven’t set any reasonably stringent conditions in your earlier analysis step then you might want to specify a threshold to the intensity of the spectra it searches in the highlighted box in the image below. This will save you quite a lot of time. Just make sure you’ve got the mainlib selected in the drop-down box at the bottom left.


I’ve tried this before and it just gave me an error message so I assumed it was a bug. Analytical software tends to be ridden with bugs and bits of it often just don’t work. As long as you try it on a file that’s already been analysed it will work though.

The output is exactly the same as that from any other AMDIS analysis. The only difference that I can see is that there is no way to automate this process,for batches of results files, unlike when using a custom library. At this stage I am prepared to accept this trade off for the extra hits you get from being able to exploit the ENTIRE NIST LIBRARY.


You can see here that I’ve had identities returned for 57 targets, using the filters mentioned above. This particular sample is giant squid ink that has been derivatised with MCF*. When I analyse it using the custom library for MCF derivatives I get 114 targets identified. This is pretty good for MCF derv, but when I use the full NIST library to search for matches for all 2592 components I get 192 target matches!

I haven’t done any robust investigations of the accuracy of the full NIST results but they seem superficially relevant. I’m confident the results will at least compliment the MCF-specific results. Watch this space for more detail.

*How awesome is that?

Antarctic cyanobacterial mat

Cyanobacteria are crazily robust organisms. They can thrive pretty much anywhere damp: The surface of desert rocks, oceans, in soil, lakes, the trunks of trees and even your house. Seriously, there’ll be a few squillion of them living in the biofilm that flourishes in the damp corners of the external surfaces of your house. 

I’ve been lucky enough to get to work with some of the samples of cyanobacterial mat from Antarctica that were brought back from a recent research expedition there that AUT School of Applied Sciences were involved in.


The idea is to establish what photosynthetic pigments they contain as a way of identifying them and of ground-truthing the hyperspectral data collected by the UAV Len was flying down there. So I’ve spent much of today grinding, weighing and pouring alternately liquid nitrogen and acetone. Scientific fun!


The extracts are in the fridge, in the dark, awaiting spectrophotometric, fluorometric and LC-DAD-FLD-MS analyses tomorrow. 

One of the engineers came to me today with the print head of a 3D printer that had become blocked with the polylactic acid [PLA] the printer dispenses. He wanted to know if U had any solvents to dissolve the blockage. Time to roll out some dichloromethane and a little bit of tetrahydrofuran! They’ll dissolve most plastics: THF will even dissolve teflon!

AMDIS and metabolite profiling by GC-MS

AMDIS, the Automated Mass spectral Deconvolution and Identification System, is a piece of freeware produced by NIST in the USA. In combination with an appropriate library of reference spectra the software identifies features in your GC-MS data and compares them to library spectra in order to assigns identities to them. This is fantastically useful for metabolite profiling, or metabolomics, as the data typically contain hundreds of features, each feature being a unique molecular structure present within your samples. It is possible to achieve similar results using other GC-MS software and associated libraries but none of them seem to be able to automate the process in the way that AMDIS does. That’s because AMDIS also has a batch process function in which you can select a whole set of data files and the software will churn through them, producing a single summary file of data. I have a suspicion that MassHunter might have a similar capability but I have never used it so I cannot comment further. We have a Thermo Finnigan GC-MS so I am using their Xcalibur software to acquire the data. The Xcalibur browser software allows me to view the collected data and search an associated library to identify peaks but the selection of peaks and the identification process is all manual. It has no facility for automatically identifying more subtle chromatographic features such as small peaks coeluting beneath larger ones. Therefore not only would it take me a lot longer to get the same information by processing these data files manually, I would inevitably fail to spot features. As the concentration of a metabolite- and concsequently the size of the peak it produces in the chromatogram are not necessarily related to their biological function this means I could be missing all the important data. 

So AMDIS is a wonderful tool. It is, sadly, flawed too. The Xcalibur software uses a NIST library of reference spectra containing over 200,000 spectra. This massive amount of data makes it very good for identifying peaks. Oddly, AMDIS, which is written and maintained by the same people who curate the reference library, cannot use that library. Fortunately NIST publish a file converter program which allows you to convert your NIST libraries into a format AMDIS can access. However, AMDIS still cannot cope with a library larger then about 25,000 spectra and throws an error if you try to analyse data with a larger one. This is only about 12.5% of the full NIST library so, unless you’re prepared to analyse all of your samples eight times, it makes it unusable!

The solution seems to be for researchers conducting metabolite profiling to build their own reference libraries for AMDIS to use based on the derivatisation and analysis of pure standard compounds. Derivatisation is the process of chemically modifying metabolites which would otherwise be non-volatile to make them volatile and, therefore, amenable to gas chromatographic separation. The two most common ways of derivatising metabolites are to add a methyl or trimethylsiloxy groups by an ester linkage by treatment with one of a diverse range of derivatising reagents. The reagent I currently use is methyl chloroformate, which, in the presence of methanol and pyridine, converts amine groups  into carbamates and carboxyl groups into methyl esters. It does not react with alcohols so it does not allow me to analyse sugars, for example, which require trimethylsilation. 

The practical upshot of this is that some of the molecules which are produced by methyl chloroformate derivatisation are not encountered in nature or in industry. As a result there might not be reference spectra for that molecule in the NIST library, making their identification impossible without some expert-level interpretation of their spectra. Even this will not give a definitive answer but may suggest an identity which will have to then be confirmed by derivatisation and analysis of a pure standard. 

Fortunately the potential of GC-MS metabolite profiling is such that several research groups have invested the time and effort over the last ten years or so to build their own reference libraries for use with AMDIS. Two notable examples are the Golm Metabolome Database mass spectrum library [GMD] and Silas Villas-Boas’ group at Auckland University. Silas published a library in the supporting information of a paper describing the application of methyl chloroformate derivatisation for metabolite profiling. I have been using their libraries, as well as bits of the NIST library to try and assign identities to peaks in my own samples using AMDIS. The version of the GMD library I downloaded contains 2,594 spectra whereas the SVB library contains 223.SVB library gave me 125 hits from an MCF-derivatised sample of human urine and the GMD library gave me only 5. There are several reasons for this discrepancy: firstly the GMD library was composed for plant metabolite profiling and not cells, as was the SVB library. Secondly, the GMB library contains TMS derivatives as well as MCF derivatives and so not all of those 2,594 are applicable to my samples. Thirdly, I don’t know what instrument the data for the GMD library was collected on but I know that Silas’ group over the road at the University of Auckland use a Thermo Finnigan GC-MS that is very similar to mine so their reference spectra are going to be very similar. This is not the case with two quite different GC-MSs, which can produce quite different spectra. 

I’ve tried analysing the same data using 25,000 spectra

chunks of the NIST library and I’ve found some very dubious results which I’m pretty sure aren’t in my urine. Such as methamphetamine-d5! This is an excellent example of the problem with this type of analysis: if you search a large enough number of reference spectra you will always end up with “false positives”. This is pointed out in a paper I read today which presents an alternative to AMDIS for processing GC-MS metabolite profiling data and that was also produced by Silas Villas-Boas’ group at the UoA: Identifying and quantifying metabolites by scoring peaks of GC-MS data. So tomorrow I will be mostly playing with R and trying to get some example analysis done using the tools presented in this paper. Hopefully no deuterated methamphetamine will be involved! 

Arduino GSM shield

This week’s project: setting up this Arduino with GSM shield to monitor the UPS that powers my mass specs. If we get a power cut (or when- this is Auckland after all) it will send me an SMS so I can race in and shut the mass specs down before they crash. Full write up when I’ve managed to make it all work.


NB Apologies for the repost but tumblr didn’t want to load the image for yesterday’s post.