liquid chromatography of photosynthetic pigments

I’m developing a method for quantifying photosynthetic pigments with liquid chromatography. I started out just mashing up a couple of leaves from some plants in the teaching lab. A begonia leaf and a tobacco leaf. Here’s the begonia leaf before grinding:

begonia leaf pigment extraction 2

And after grinding in acetone:

begonia leaf pigment extraction

I centrifuged the liquid to remove particulates and diluted some of the supernatant in a little more acetone as that bright green colour was probably too concentrated to inject directly.

I initially tried using the diode array detector and the mass spectrometer in tandem so that I could confirm identities of DAD peaks with the mass spectrum but I think the sensitivity of the mass spec was too low. The pigments absorb light pretty strongly, as you might expect, so you don’t need to inject high concentrations to get a signal from an absorbance detector. So I gave up using the mass spec and just looked for peaks in the DAD. Initially I just infused them straight through the DAD without using an LC column so that I could confirm that I could see peaks at the right wavelengths. Plant pigments fall into several different categories. I was expecting to see chlorophylls, which are common to all plants, as well as some xanthophylls and/or carotenoids. We happened to have some carotene in our chemical store so I prepared a standard dissolved in acetone to inject as a reference.

The direct injections worked well with large peaks visible at 440nm (xanthophylls/carotenoids) and 640nm wavelengths (chlorophyll). The carotene showed up very nicely at 440nm, as expected, with nothing visible at 640nm. Next I wanted to see how many different pigments I could separate but I wanted to do it really quickly, without setting up a full LC gradient. So I ended up trying just a Phenomenex C8 guard column in a holder instead of an actual analytical LC column and set a 1 minute gradient from 20 to 100% isopropanol. I had to use isopropanol, instead of the more usual acetonitrile or methanol, because these pigments are quite hydrophobic. This seemed to work well so I stretched the gradient out to 6 minutes and ran them again (yes, I ended up running a full gradient after all but it was worth building up to it). As you can see from my quick-and-dirty method it actually worked beautifully:

pigments HPLC C8 guard column

This rather busy chromatogram shows several different plots. The two relevant ones are the pink one (440nm) and the black one just above it (640nm). The peaks in these plots represent different pigments in their respective classes. There’s five xanthophylls or carotenoids and at least three chlorophyll peaks (the last one is two peaks coeluting). The last of the pink peaks happens to coelute perfectly with my carotene standard and they shared the same absorbance spectra. Each pigment tends to have a unique absorbance spectra corresponding to its role in absorbing different wavelengths of light. The plot below shows the five xanthophyll/carotenoid peaks and their respective absorbance spectra.

pigments HPLC C8 guard column - xantho & caro peak spectra

All in all a pretty successful day’s HPLC! I’m looking forward to applying this to some marine benthic sediments tomorrow to see what sort of pigments are present in the microphytobenthos. I’m also now well set up to investigate the pigments in the giant springtails I mentioned recently.

A useful paper for background and huge amounts of detail about pigment HPLC is Bidigaire et al, (2005):

Bidigare, R. R., L. Van Heukelem and C. C. Trees. 2005. Analysis of algal pigments by high-performance liquid chromatography. In: Algal Culturing Techniques (R. A. Andersen, Ed.), Academic Press, New York, pp. 327-345.

new bee pathogen associated with collapse of Coromandel bee hives

Yet another problem facing New Zealand beekeepers is the discovery of a new pathogen, Lotmaria passim, in hives from the Coromandel. The following is the text of a press release:

A Gisborne company, dnature diagnostics & research Ltd, developed the new diagnostics tests that were used to discover the presence of Lotmaria passim in New Zealand. The company is at pains to point out however that the new detection does not necessarily mean a new incursion, it may have quietly existed while no-one was looking for it.

However, L. passim – a trypanosome (a small single cell parasitic organism with corkscrew movements) – has been associated with overseas hive deaths especially in conjunction with Nosema ceranae – a fungal-like gut organism in honeybees – that has been in New Zealand since at least 2010 when it was first detected. L. passim scars the gut of the bees possibly allowing better colonisation of the Nosema ceranae.

Dnature has also recently discovered a number of areas in NZ have seen extraordinarily high levels of the two Nosema species in honeybees: Nosema ceranae and Nosema apis; the combination of which has been shown to markedly decrease bee lifespan and affect their homing ability. In short, the bees go out to forage and don’t find their way back to the hive and are dying at a younger age.

However as these agents were also found in hives that did not appear to be in poor health, additional tests were developed by dnature for organisms known as trypanosomes. Two were known in honeybees: Crithidia mellificae (since 1967) and Lotmaria passim (January this year) and had been described as showing worse effects when together with Nosema ceranae. Prompted by the new report and with the encouragement of the affected beekeeper scientist in Coromandel, John Mackay (technical director of dnature) designed new quantitative DNA tests to detect the presence of both species. Upon finding positives a second novel test was used to confirm that the positives were the more prevalent species worldwide: Lotmaria passim.

At the same time, samples from around the North Island were tested along with samples going back to 2012. Lotmaria passim was found in a number of them indicating that the pathogen was more widespread than the Coromandel and had been here for several years at least.

What does it mean? In essence, too early to tell. More testing from different areas is required along with repeated sampling from sites over the course of a beekeeping season. The organism has only been described and named since January this year and so very little is known about it. But the rapid and quantitative tests developed by dnature will go some way to helping answer the questions arising.

Dnature has been DNA testing a suite of bee viruses, including nosema species for several years. These tests, along with Lotmaria passim, are available from dnature and can be supplied in a kit format for other laboratories for testing.

For general information, please contact: Belinda Mackay – General Manager mob 021 415 100

For technical information, please contact: John Mackay – Technical Director mob 027 362 8873

The Beekeepers’ Association would like beekeepers to monitor their hives for symptoms of disease and report them to assist tracking of the prevalence of this pathogen.

Dnature are offering free tests for L. passim alongside all Nosema tests.

Research Update

Having meant to write several posts about exciting things that have gone on in the past couple of weeks I am now faced with combining them all, for efficiency’s sake, into another “research update”.

This week I have received an enquiry about analysing pigments and toxins found in the colourful tips of New Zealand giant springtailsHolacanthella. This could be a really cool little piece of analysis if it works. I’m going to have to head out into the Waitakeres to poke some lumps of rotting wood in the hope of finding some of these punk woodlice to play with.

After a visit from Don MacLeod of the NZ Beekeeper’s Association last week I am testing out some more extractions of neonicotinoid pesticides. A new paper was published this week in Environmental Chemistry documenting the occurrence of these pesticides in pollen and honey from hives across the US. The paper was written by Alex Chensheng Lu et al (2015), who kindly shared a copy with me. The paper reports that, during the Summer months, several neonicotinoids were present in pollen at concentrations of several ng/g; concentrations that may be acutely toxic to bees (Laycock et al 2012). The authors discovered measurable concentrations of at least one neonicotinoid pesticide in >70% of honey and pollen samples. I am hoping I can repeat their analysis in New Zealand samples to see if we have a similar issue here.

I have also been developing a method for the quantification of bile acids by LC-MS, which is causing me headaches as certain compounds won’t stay in solution (lithocholic acid, I’m looking at you), some seem to have a very low response in the instrument and others are playing hide-and-seek! The solution, as ever, is a bigger chicken.

I have also been plotting further awesome research plans for the future, submitting an application for a Summer studentship to get someone to look at polysaccharide structures, again with LC-MS. My life seems to revolve around the instrument sometimes but this week has not been all about the liquid phase. I have also been emailing around the results of some test analyses I conducted using methyl chloroformate derivatisation and GC-MS to try and expand the use of this very nice little method within the school. Consequently I found myself preparing samples of mangrove leaf extract, lamb and wagyu beef, fermented mussel liquor and hydrolysed beef protein. I was meant to have a go at some polyamines for another of the PhD students but I forgot their sample. Doh.

Apart from this mass-spectrometry-based fun I may have a student looking to measure total triacylglycerol content and fatty acid profiles of fish oocytes at some point. I’ve also had a really awesome kick-off meeting for my new PhD student, who is going to be studying plant phenology. We are kicking about ideas for the acquisition and installation of a phenocam.

Its been a crazy busy week!


Chensheng (Alex) Lu, Chi-Hsuan Chang, Lin Tao and Mei Chen (2015). Distributions of neonicotinoid insecticides in the Commonwealth of Massachusetts: a temporal and spatial variation analysis for pollen and honey samples. Environmental Chemistry

Laycock I, Lenthall KM, Barratt AT, Cresswell JE (2012). Effects of imidacloprid, a neonicotinoid pesticide, on reproduction in worker bumble bees (Bombus terrestris). Ecotoxicology 21(7):1937-45.

working through the Wikipedia ANOVA example in Processing using the Papaya library

There’s a worked one-way ANOVA example on Wikipedia and I used it as a template to work out the calculations in Processing. The reason I did this, beyond poops and giggles, is because I was having difficulty getting to grips with the ANOVA example in the Papaya library and I wanted to work through an example with pre-determined results to validate each step of the calculations. It would be great if I could refine the process to handle unbalanced data, to include pre-processing such as transforms, pre-tests for homoscedasticity and normality (although ANOVA is relatively robust towards non-normally distributed data), automated plotting of the data and further post-hoc testing.

/* one-way ANOVA example

This sketch performs a 1-way ANOVA on a CSV file of data copied from the worked 1-way ANOVA example on Wikipedia. The whole process is based upon that worked example.

The table of example data needs to be saved into a CSV file called test1.csv and placed in the sketch folder.
You will also need to install the Papaya statistics library created by Adila Faruk.

AUT School of Applied Science
June 2015

released under GPLv3 licence –

import papaya.*;
Table table;
table = loadTable(“test1.csv”, “header”);
int groups = table.getColumnCount();
println(“groups: ” + groups);
int n = table.getRowCount();
println(“rows: ” + n);
float[] groupMeans = new float[groups];
// Step 1: Calculate the mean within each group
for(int i = 0; i < groups; i++) {
float sum = 0;
for(int e = 0; e < n; e++) {
sum = sum + table.getFloat(e, i);
println(“group ” + (i +1) + ” mean = ” + (sum / n));
groupMeans[i] = sum /n;
// Step 2: Calculate the overall mean
float overallMean = 0;
for(int i = 0; i < groups; i++) {
overallMean = overallMean + groupMeans[i];
overallMean = overallMean / groups;
println(“overall mean = ” + overallMean);
// Step 3: Calculate the “between-group” sum of squared differences:
float Sb = 0;
for(int i = 0; i < groups; i++) {
Sb = Sb + n * sq(groupMeans[i] – overallMean);
println(“between-group sum of squared differences (Sb) = ” + Sb);
// between-group degrees of freedom is one less than the number of groups
int fb = groups -1;
println(“degrees of freedom between groups (fb) = ” + fb);

// between-group mean square value
int MSb = int(Sb) / fb;
println(“between-group mean square value (MSb) = ” + MSb);
// Step 4: Calculate the “within-group” sum of squares
float Sw = 0;
for(int i = 0; i < groups; i++) {
for(int e = 0; e < n; e++) {
Sw = Sw + sq(table.getFloat(e, i)-groupMeans[i]);
println(“within-group sum of squares (Sw) = ” + Sw);

// within-group degrees of freedom
int fw = groups * (n-1);
println(“within-group degrees of freedom (fw) = ” + fw);

// within-group mean square value
float MSw = Sw / fw;
println(“within-group mean square value (MSw) = ” + MSw);
// F-ratio
float F = MSb / MSw;
println(“F-ratio (F) = ” + F);

// area under the F density function from F to infinity
// this is the really important bit where you need to quantify the area under the curve of the F function
// this gives you your P-value estimate
println(“F” + fb + “,” + fw + ” = ” + F + “, P = ” + Probability.fcdfComplemented(F, fb, fw));
//println(Probability.finv(0.05, fb, fw));


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.