Making Size Exclusion Chromatography columns

My summer student, Kalita, has been digesting oligosaccharides, derivatising them and injecting them into the mass spectrometers in an effort to derive structural information from these complex molecules. We had hoped to use acrylamide gel electrophoresis to visualise the performance of our digests, in the way of Pomin et al (2005).

Screenshot from 2016-03-03 20:30:41.png

This figure from the paper shows the effect of their hydrolysis technique upon the molecular weight of the oligomer. Note the banding patterns resulting from selective hydrolysis of certain glycosidic bonds. This produces a regular reduction in size of the fragments. We wanted to use this feature to produce polymeric fragments in the <10kDa size rage. These would be amenable to LC-MS/MS, as in Lang et al (2014), allowing us to infer the sequence, functionalisation and bonding of the monomers within the oligomer.

As it turned out our acrylamide gels got lost somewhere amidst The Great Bureaucracy and so, with time running out we cast around for alternate technologies. Enter Yang, et al (2009), who used a similar technique in their paper, but also deployed Size Exclusion Chromatography to illustrate the size-class of fragments produced.

Screenshot from 2016-03-03 21:11:31.png

The thing is we didn’t have any GPC or SEC columns.  😦

 

So we decided to try making our own!  😀

 

Fortunately or chemical store had a shelf of old bottles of dextran and other GPC or ion-exchange substrates. We dug up a protocol from an MSc thesis by Wilfred Mak in which he’d used an anion exchange substrate to determine the molecular weight of intact sulfated fucan oligosaccharides, rifled through the stores to find some substrates that looked about right and away we went!

We started out with a biuret:

IMG_20160302_172848.jpg

At the bottom, hidden by the blue compression screw, is a plug of deactivated glass wool with a few mL of sand on top of that and then the white dextran gel. This was the first addition of substrate and settling. After topping it up we have a column of about 40cm length. This type of column is purely gravity-fed. You add sample and running buffer at the top and wait for the head of fluid to pass through the column, collecting fractions through the tap at the bottom. This can take hours.

While Kalita was putting this together I was looking at some of the old silica particle LC columns I had and wondering if I might dismantle them, remove the packing and repack them with the dextran to give a real, high-pressure column. This could be plumbed into one of our conventional LC setups, allowing us to push samples through at a faster rate and giving the option of automated sample injection, data and fraction collection. I had something of a brain wave and realised that I had some Swagelok fittings which would allow me to fit a piece of 1/4″ polypropylene air line with pressure-tight caps and LC fittings at either end to fulfil exactly that function. A couple of hours later Kalita and I were the proud parents of monstrous creation on the left!

IMG_20160303_162725.jpg

The white tube held between the two clamps on the left hand retort is the air line packed with hydrated dextran. The line at the top comes from the Shimadzu LC pump on the right, which is pumping Tris buffer through the column to settle the packing material. We can get a flow of 2 mL/min through the column with a back pressure of about 5 bar. Plenty for LC!

For now our creation is parked until we can get round to doing something cool with it on Monday but watch this space to see the outcome. Our intention is to add an autosampler to the front for sample injection, a Refractive Index Detector and maybe even an electrochemical detector on the outflow to detect what came off the column and possibly even a fraction collector for downstream LC-MS/MS analysis of the fractions! Fun!

Our first goal is to validate the SEC function by injecting a range of proteins stained with Bradford Reagent. We can also try some di- and tri-saccharides along with our oligo digests.

 

References cited

Lang et al (2014). Applications of Mass Spectrometry to Structural Analysis of
Marine Oligosaccharides. Mar. Drugs 2014, 12, 4005-4030
doi:10.3390/md12074005

Pomin et al (2005). Mild acid hydrolysis of sulfated fucans: a selective 2-desulfation reaction and an alternative approach for preparing tailored sulfated oligosaccharides. Glycobiology vol. 15 no. 12 pp. 1376–1385, 2005
doi:10.1093/glycob/cwj030

Yang et al (2009). Mechanism of mild acid hydrolysis of galactan polysaccharides with highly ordered disaccharide repeats leading to a complete series of exclusively odd-numbered oligosaccharides. FEBS Journal 276 (2009) 2125–2137
doi:10.1111/j.1742-4658.2009.06947.x

Bee hive mass logger

11-03-2016: This project hit a problem. See update at the bottom.

Following on from my bathroom scales hack I spent this evening sawing and screwing together the platform for it to sit on. This was an urgent task as the bee hive is being moved to a new location tomorrow and so this would be an ideal opportunity to get the scales in place without having to arrange another movement of the hive. Bees are incredibly precise creatures, I am discovering. If you move their hive a just a few meters away when foragers are out, they will return to the location they are familiar with and won’t be able to find their way home! If beekeepers have to move their hives such a short distance they’ll move them a couple of kilometers away for a week and then move them to the new spot.

The scales will sit on a plywood deck raised off the roof’s surface to provide a thermal insulation gap for the hive. I drew up the rough schematic below to illustrate this.

beehive mass monitor schematic

My final design was slightly different, with the pallet being a little smaller than the plywood shelf. This is because, as well as the four strips of ply that keep the shelf securely fitted over the scales, I also added a plywood curtain around the edge of the shelf that hung down below the pallet to prevent rain being driven in to the scales. The ply is 12mm and very solid. I sized it to be ever so slightly smaller than the footprint of the hive so that it will fit perfectly on top. Here’s some build pics:

shelf (upside down), scales, pallet

IMG_20160229_201128.jpg

scales on the pallet

IMG_20160229_201230.jpg

This next one is upside down but illustrates how the four strips of ply keep the top shelf secure. You can also see the curtains. The notches at the back are for wires to exit.

IMG_20160229_201303.jpg

final assembly

IMG_20160229_201403

 

Looking forward to testing this!

 

Update, 11-03-2016

Unfortunately there is a major flaw with my design. When Matt went to put the bee hive on top of it it turned out to be unstable due to the small footprint of the scales relative to the hive. The hive is only one box at the moment but Matt intends to add another soon and that would definitely make it vulnerable to being blown over by a gust of wind! Not a desirable situation. I am going to have to look at designing a larger platform to the corners of which I can attach the load cells. This is contrary to the advice on the MakeZine blog that inspired this project, however I cannot see any other solution besides buying an industrial-size set of scales. I want to try the DIY option first before I spend a couple of hundred dollars.

Hacking bathroom scales with an HX711 breakout

Hopefully this will be the start of a series of posts on the Internet of Bees, or the #IOBee. In case you didn’t realise, this is a play on the Internet of Things, or IoT. My intent with the IOBee is to document my application of some basic sensor technology to monitoring the health of bee hives.

There is an excellent writeup here of a conversion of a set of luggage scales to a real-time bee hive mass monitor. I have been wondering if I can do the same thing to monitor the mass of experimental bee hives in some research I’m planning looking at the effects of neonicotinoids upon honey bee colonies. In order to test this out I ventured onto eBay and bought a couple of HX711 breakouts, which you can get for just a couple of dollars.

HX711 breakout

I also bought a cheap set of bathroom scales from the Warehouse, despite the advice on MakeZine, which advised not to skimp. I intended this to be a proof-of-concept so I wasn’t going to be spending big bucks just yet.

bathroom scales

This turned out to be an excellent hacking subject. After taking the back off I found a circuit board carrying the integrated circuit, some components and some wires.

IMG_20160221_155644

The two black pads you can see are the rubber feet on the bottom of the load cells. I prised one out to show you the other side.

IMG_20160221_155936.jpg

The red white and blue wires coming from each of the four load cells needed to be joined together carefully according to the first image in this excellent post on StackExchange that I located after a modest amount of googling. I also found this how-to from SparkFun to be informative.

Once I had soldered the blue and white wires together to mimic the pattern shown and the red ones to the appropriate pads on the HX711 breakout I was left with this:

IMG_20160221_175642

I also soldered the wires from a length of USB cable from an old mouse to the other side of the breakout. The four tabs and their wires were to VCC (red), GND (black), CLK (white) and SDA (green). I drilled a hole in the plastic chassis to pass the cable through and put a cable tie around it on the inside to prevent the wires being pulled off the board. The mount holes in the breakout board ( I love mount holes!) happened to be just the right width to allow me to screw it to the chassis through two of the holes that the original PCB was mounted on. The white thing is a piece of polyethylene milk bottle wall that I cut out and used to insulate the connections of the breakout and to hold it down as the screw heads were nearly as small as the holes. This arrangement allowed the breakout to be seen through the glass window where the LCD used to be. A nice touch. 😀

IMG_20160221_204630.jpg

Having wired everything together I needed an electronic brain for my creation to talk to so I hooked it up to the Arduino Nano I’ve been using as a receiver for my solar-powered, wireless monitoring testbed. Ignore the BME280 and the NRF24 coming off it. VCC went to 5V, GND to GND, SCK to D4 and SDA to D5.

IMG_20160223_212825.jpg

I downloaded the HX711 library written by bogde (thanks!) and also the HX711 breakout sketches from the SparkFun how-to linked above. I was pretty impressed to see numbers appear straight away on the serial monitor although this turned to mild disappointment when I placed a mass on the scales and the number went negative! Apparently I had got the polarity of the signal wires the wrong way around. 😦

Five minutes of soldering later I was back reading numbers and this time they went up with the mass on the scales. According to the instructions on the test sketch I kept adjusting the calibration factor until the scales read the correct mass for the object I’d put on it. Then came the acid test: now it was calibrated, would it get my mass right?

IMG_20160221_210139.jpg

As you can see it worked almost perfectly. And I am somewhat overweight. :-/

A useful edit I made to the SparkFun code was to change the line

Serial.print(scale.get_units(), 1);

To

Serial.print(scale.get_units(), 3);

This gave me three decimal places instead of one and significantly more information. I was particularly pleased to see that these scales read quite consistently. The numbers for my weight jump about quite a lot because I wasn’t too worried about keeping still to get a stable reading but when I placed a fixed mass on the scales the second decimal place was pretty stable and only the third flicked up and down by 1-3 units. These scales were advertised as being accurate to +/- 100g so my results indicate I can do much better than that. And that’s without any of the tricks you can use with microprocessors to improve the accuracy of otherwise low resolution tools, such as polling them and taking a moving average.

More on the application of this very cool hack another day, once I’ve validated the calibration as described on MakeZine.

Jake Martin’s Citizen Science Spectrophotometer

Jake Martin was an MSc student at the University of Auckland School of Chemical Sciences, now a PhD candidate at Cambridge University in the UK. Jake has developed a simple spectrophotometer– a device which measures the transmittance or absorbance of light at specific wavelengths- made from lasercut plastic and a handful of electronic components. Jake has been kind enough to share his design with me because I have a background and ongoing professional interest in environmental monitoring. I am very impressed with the potential of this technology and am keen to promote it further to any public body or community interested in doing their own environmental monitoring.

Jake’s initial application was measuring nitrate concentration in water. This is a highly topical issue in New Zealand, where freshwater habitats have suffered significant degradation in recent years, often due to increasing nitrate inputsassociated with the expansion of dairy farming. The urine from thousands of cattle and the fertilisers used to stimulate pasture growth for them to graze on raises the concentration of nitrate and nitrite in streams, rivers, lakes, wetlands and groundwater. This causes nuisance algal and microbial growth, such as rock slime, phytoplankton and cyanobacteria blooms and periphyton growth. These compounds can also have sublethal and lethal effects upon animals if their concentrations rise high enough.

The ability for members of the public to go out and measure nitrogen concentrations in their own back yard is a huge step in connecting people and communities with their environments. It is also a valuable tool for farmers, many of whom are concerned about the consequences of nitrate emissions from their farms.  In order to develop practices to minimise fluxes of nitrate into freshwater habitats, such as planting riparian margins, farmers need to be able to measure it cheaply and rapidly.

Jake’s design is wonderfully simple anyone can pick it up in about two minutes. I am going to be demonstrating it and handing out free kits at the Sea Week 2016 event at Cornwallis on Saturday 5th March. Anyone who is interested in the quality of freshwater and marine habitats in New Zealand should come down and check it out. On the day we also hope to be able to show people how to measure phosphate concentrations and water turbidity, two other major water quality parameters that can indicate just how clean and safe your environment is.

I will present my testing of the spectrophotometer and a detailed how-to in another post.

nonstructural carbohydrates and FTIR

Non-structural carbohydrates [NSC] are important to tree growth and survival. Their quantification can be achieved by several analytical methodologies of varying accuracy. I am currently applying one of these – LC-MS – to elucidate the structure of algal oligosaccharides. However, these advanced analytical techniques require some fairly high-tech equipment and some careful sample preparation.

Recently it has been proposed that near-infrared spectroscopy can be used to quantify NSC with no sample preparation beyond homogenisation in a ball mill, or similar (Ramirez et al 2015). One of my students wants to try this method so I showed her how to put samples into the Fourier Transform InfraRed [FTIR] spectroscope. The referenced paper used a rigorous process of parallel biochemical analysis to determine the NSC content of the samples analysed and used these to determine the relationship between the NSC content and the FTIR properties. I have proposed a standard analytical process to eliminate this complex validation process, known as Standard Addition. Using this technique the student will add varying concentrations of the different NSC components to her samples and determine how this addition affects their FTIR properties. This should obviate the need to conduct biochemical or chemical analysis in parallel.

 

 

Ramirez et al, 2015: Near-infrared spectroscopy (NIRS) predicts non-structural carbohydrate concentrations in different tissue types of a broad range of tree speciesMethods in Ecology and Evolution 2015, 6, 1018–1025 doi: 10.1111/2041-210X.12391

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!

Refs

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 Chemistryhttp://dx.doi.org/10.1071/EN15064

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. http://link.springer.com/article/10.1007%2Fs10646-012-0927-y

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.
https://en.wikipedia.org/wiki/F-test#One-way_ANOVA_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.
http://adilapapaya.com/papayastatistics/

AUT School of Applied Science
June 2015
drchrispook@gmail.com

released under GPLv3 licence – https://gnu.org/licenses/quick-guide-gplv3.html
*/

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));

exit();