Choosing the lowest-risk way to control a harmful algae bloom.

A free, open-source tool that compares bloom treatments by their predicted risk to non-target organisms, using published toxicity data.

Cite (DOI) Lab validation planned

The problem

Control is one question. Risk is the other.

Toxic cyanobacteria blooms can close beaches, threaten drinking water, and harm pets and wildlife. Several treatments can control a bloom, and choosing between them is a real decision.

Jordan Lake, North Carolina, June 2022

Dogs became ill after swimming at Jordan Lake, and at least one died. Chatham County issued a public warning about toxic algae in the water, and told people to keep themselves and their pets out of it.

ABC11: dog death linked to water toxins at Jordan Lake

Treatments are usually compared on how well they control the bloom. This tool adds a comparison of predicted risk to green algae, zooplankton, and fish, to help identify the lowest-risk option.

Each of the three groups is scored because it plays a distinct role in the lake:

Green algae

Primary producers at the base of the food web, and the standard non-target algae in toxicity testing.

Water fleas

Zooplankton that graze algae and feed fish, which makes them part of the lake’s natural check on algae.

Fish

The visible top of the system, and the reason most people care about the lake in the first place.

Most comparisons ask which treatment controls the bloom. This tool also asks which one does it with the lowest predicted risk to everything else.

How it works

Score the trade-off, keep the axes separate, then predict the pairs.

The tool combines two established methods (selectivity indices from toxicology and Bliss independence from combination pharmacology) into one framework for bloom control. Three steps, no black boxes.

1

Score

Selectivity Index = non-target EC50 divided by target EC50

SI = EC50 (bystander) ÷ EC50 (bloom)

EC50 is the dose that causes a 50% effect. It runs backwards from intuition: a low EC50 means harm arrives at a small dose, so a low number is a sensitive organism, not a safe one.

The ideal treatment kills the bloom at a low dose and only touches the bystanders at a much higher dose. That gap is the selectivity window, and SI measures it as a single number.

Dose response curves showing a selectivity window The bloom responds at a low dose while the bystander organism responds only at a much higher dose. The gap between the two half-effect doses is the selectivity window. 50% effect selectivity window bloom is dying, bystanders are not EC50 bloom EC50 bystander bloom bystander dose (increasing) effect
A favorable treatment (illustrated). The bloom hits 50% effect at a low dose, the bystander only at a much higher one. The wider that gap, the higher the SI.
SI above 1: good

The bloom dies first. There is a dose that controls the bloom before the bystander is meaningfully harmed.

SI below 1: flagged

In the published tests, the bystander responded at a lower dose than the bloom did. The tool flags that axis.

2

Separate

Three non-target axes, tracked independently and never averaged

Green alga

Raphidocelis subcapitata

The primary producer. If it goes, the food web loses its base.

Water flea

Daphnia magna

The grazer. It eats algae and feeds fish, so it sits in the middle of everything.

Fish

Danio rerio

The vertebrate check. Standard proxy for vertebrate safety, including ours.

A treatment can score well for one group and poorly for another. Copper is the clearest case: it looks excellent against the green alga and much weaker against the water flea. Average those two numbers together and you get one comfortable-looking score that hides exactly the trade-off a lake manager needs to see.

So the axes are reported separately, and the headline number is min-SI, the worst axis of the three.

You are only as selective as your weakest link.

3

Combine

Predict what treatment pairs will do, before anyone runs the experiment

effect(A+B) = A + B − (A × B)

This is Bliss independence: the effect of A, plus the effect of B, minus the overlap you would otherwise count twice. It assumes the two agents act independently, which is a stated assumption rather than a claim.

Why it matters here: since the headline score is the weakest axis, the way to improve a treatment is to lift that axis. Pair something strong on the green alga axis with something strong on the water flea axis and the pair can outrank either one alone. The tool generates every single treatment and every pair, scores them on the same scale, and ranks them together.

Pairing lifts the weakest axis Treatment A is strong on the alga axis and weak on the Daphnia axis. Treatment B is the reverse. The predicted pair sits between them on both axes, so its weakest axis is higher than either treatment alone. Treatment A strong on alga weak on Daphnia Treatment B weak on alga strong on Daphnia Predicted A + B alga holds Daphnia lifted above failing
Bar length is selectivity on that axis (illustrative, not data). The pair gives up some of A's best axis and buys back the axis that was failing, which is what raises its min-SI.

Who it is for

Anyone who has to choose a treatment and then live with the lake afterward.

The output is a ranked table with the reasoning attached, so it can be read, argued with, and reproduced.

Lake managers

Comparing treatment options for a specific waterbody.

Water utilities

Protecting source water while weighing non-target risk.

Watershed nonprofits

Asking informed questions about a proposed treatment plan.

Researchers

Generating testable hypotheses about treatment combinations.

Regulators

Weighing permit decisions against non-target impact.

Results

What the tool predicts for Microcystis

Every treatment and predicted pair scored against Microcystis aeruginosa, ranked by min-SI, the worst of its non-target axes. A score below 1 would be flagged; no current entry falls below 1.

Selectivity ranking of bloom treatments against Microcystis aeruginosa
Rank Treatment or combination min-SI Green alga SI Daphnia SI
1 Copper sulfate + Diquat dibromide predicted combo 6.24 9.1 6.2
2 Diquat dibromide 4.87 4.9 18.4
3 Hydrogen peroxide + Diquat dibromide predicted combo 4.82 6.8 4.8
4 Copper sulfate 3.43 29.7 3.4
5 Hydrogen peroxide + Copper sulfate predicted combo 2.89 16.1 2.9
6 Hydrogen peroxide 2.48 10.6 2.5

These are predictions, not measurements. Values are computed from published toxicity data under stated assumptions (Bliss independence, Hill slope of 1, equipotent-on-target mixing) and are awaiting laboratory validation. Combinations are model output and have not been tested. Scored here on the two lab-testable axes for this target.

Scroll the table sideways to see every column.

min-SI above 1, passes min-SI below 1, flagged (none currently) predicted combination

Three findings

What shows up once you actually score the trade-off.

None of these are visible when treatments are compared on bloom control alone.

Finding 01

Copper's effective dose rises with bloom density.

Published work (Tsai 2016; Kinley et al. 2017) shows the concentration needed to control Microcystis rises as cell density increases. That narrows copper's margin against Daphnia, which is already its weakest axis in the table above. Copper's score is the one most sensitive to the conditions of a real bloom.

SI 3.4Daphnia axis, at test cell density

Finding 02

The ranking depends on which data you pair.

Our first version paired a short-test average across five cyanobacteria with a longer growth test on a single green alga, and ranked diquat last. Using matched values from one study (Peterson et al. 1997), diquat ranks second. Mismatched test lengths and endpoints can move a treatment from last to near first.

6th to 2nddiquat rank, mismatched vs. matched data

Finding 03

The data to answer this question barely exists.

Compiling published toxicity data across 13 treatments and 4 cyanobacteria genera, only 13 of 52 target-kill cells could be filled. The non-target side of the ledger is comparatively rich, because harm to fish, water fleas, and green algae is what regulatory testing is built to measure. How well a chemical kills the bloom itself is measured far less consistently.

13 of 52target-kill cells filled

Where the numbers come fromThe published values behind each score.

Each selectivity index is a non-target EC50 divided by the Microcystis EC50. A lower EC50 means the organism responds at a lower dose.

Diquat dibromide

OrganismEC50Source
Microcystis0.098, 0.105 mg/LPeterson et al. 1997Carbon-uptake test, about 22 h
Green alga0.492 mg/LPeterson et al. 1997Same study and test (value used)
Green alga0.032 mg/LEPA ECOTOX72 to 96 h growth (not used)
Green alga0.13 mg/LReward product safety data sheet72 h, as formulated product (not used)
Daphnia1.86 mg/LEPA ECOTOX
Fish50.2 mg/LEPA ECOTOX

Copper sulfate

OrganismEC50Source
Microcystis0.063 mg Cu/LTsai 2016Matched 96 h growth
Green alga1.873 mg Cu/LTsai 2016Matched 96 h growth
Daphnia0.216 mg Cu/LEPA ECOTOX Knowledgebase
Fish0.317 mg Cu/LEPA ECOTOX Knowledgebase

Hydrogen peroxide

OrganismEC50Source
Microcystis2.62 mg/LWeenink et al. 2022
Green alga27.7 mg/LWeenink et al. 2022
Daphnia6.51 mg/LWeenink et al. 2022

EC50 values differ between studies because of test length, endpoint, strain, and water chemistry. Rankings should be read as comparisons, not predictions for a specific pond.

LimitationsWhat this tool does not tell you.

Read this before using the output. Every item here is a constraint we can state precisely, which is the point: each one is testable, and the planned lab work is designed to test them.

Predictions are not measurements.

Every combination value in the ranking is a hypothesis generated under stated assumptions. None of the combinations has been measured in a lab. Validation is planned, and both agreement and disagreement with the predictions are reportable results.

The input data is sparse.

The published literature contains comparable target-kill values for only a fraction of treatment and organism pairs. The rankings rest on relatively few fully scored treatments, so a single new measurement can move them.

Exposure durations do not always match.

Some published values compare target and non-target toxicity measured over different exposure times and endpoints. Because the target value sits in the denominator of the index, a mismatch inflates apparent selectivity. Affected entries are flagged in the code.

Bliss independence can be violated.

The combination model assumes the two agents act independently. Agents that share a mechanism (copper and hydrogen peroxide both act partly through oxidative stress) may not. Where the lab disagrees with the prediction, that disagreement is the finding.

It ranks by selectivity, not efficacy.

A treatment can kill the target extremely well and still rank poorly here. That is intended behavior, not a bug. This tool answers one question (what is the predicted risk to non-target organisms) and should sit alongside efficacy, cost, and permitting, not replace them.

Water chemistry changes toxicity.

Toxicity varies with water chemistry. Copper in particular is far more toxic in soft, low-alkalinity water than in hard water.

Strains differ.

Microcystis strains respond differently to the same product.

Microcystis is not the only bloom organism.

Other bloom organisms occur in North Carolina (for example Euglena and Prymnesium), and some treatments target green algae blooms instead.

Copper products are not all alike.

Chelated copper products are generally lower risk than copper sulfate. Copper is also toxic to mollusks, which this tool does not score.

Lab water is not lake water.

Lab values measured in clean water can differ substantially from values in natural water.

Try it yourself

Run the ranking in your browser.

The same math as the archived Python tool, running locally on this page, with the corrected diquat values. Change the metric, drop an axis, remove a treatment, and watch the ranking reorder.

Important: This tool is for education and research. It is not a treatment recommendation. Registered products have undergone EPA risk assessment, and the product label governs how they may be used. Consult a licensed aquatic applicator or your state agency before treating any water body.

Rank by

Non-target axes

Fish is off by default because that axis cannot be lab validated here.

Treatments

Removing a treatment also removes every combination containing it.

Which published green-alga value for diquat?

Same treatment, different published study, very different ranking. This is why matched data matters.

Rank Treatment or combination min-SI geo mean Per-axis SI

Scroll the table sideways to see every column.

Ranked by the weakest non-target axis. A treatment is only as selective as its worst link.

Under Bliss independence, each of a combination's scores falls between its two ingredients' scores. When two treatments are weak on different organisms, the combination's weakest score can end up higher than either one alone. With the matched diquat values, copper plus diquat does exactly that. Lab testing would show whether the prediction holds, or whether the pair interacts.

These are predictions from published data, not measurements. The Python implementation archived at the DOI is the citable reference for the method. The diquat values on this page were corrected in September 2026 and differ from the archived release.

Field Visit

Inside the Plant

Our visit to the Cary/Apex Water Treatment Facility

On September 30, 2026, we toured the Cary/Apex Water Treatment Facility, which treats Jordan Lake water for more than 310,000 people in Cary, Apex, Morrisville, and part of Research Triangle Park. The visit changed how we frame our project. Jordan Lake is operated by the US Army Corps of Engineers, and algae is not treated in the lake itself. Instead, the plant manages it on site, adjusting activated carbon to measured taste-and-odor compounds and using ozone and biofiltration. That is why our tool is aimed at ponds and smaller lakes, where in-lake treatment actually happens.

Settling basins, where clumped particles separate from the water.
Settling basins, where clumped particles separate from the water.
A microscope in the plant's laboratory.
A microscope in the plant's laboratory.
Analytical equipment in the state-certified laboratory, which runs about 100,000 tests a year.
Analytical equipment in the state-certified laboratory, which runs about 100,000 tests a year.
A row of labeled sample taps running into a lab sink, each piped from a different stage of treatment.
Sample taps in the lab. Each faucet is piped from a different stage of treatment, such as the filters, the clearwells, and the finished water leaving the plant, and runs nonstop so the sample is always fresh. Staff test each stream for things like turbidity, pH, and chlorine, which shows how much every step improved the water and lets operators adjust before it reaches homes.
Covered storage tanks on the plant grounds.
Covered storage tanks on the plant grounds.
Chemical storage tanks used in the treatment process.
Chemical storage tanks used in the treatment process.
Large white sodium hypochlorite tanks on raised containment pads inside the chemical building.
Sodium hypochlorite tanks in the chemical building. This chlorine solution disinfects the water after filtration, and the plant later converts it to chloramine, which lasts longer in the pipes. The curbed concrete pads hold any spill.
Large pumps that move water through the plant.
Large pumps that move water through the plant.
Standby generators that keep the plant running during power outages.
Standby generators that keep the plant running during power outages.

Thank you to the facility's laboratory team for hosting us. Facility figures are from the Town of Cary's virtual tour.

About us

Two Green Level seniors from Cary.

We are Arjun Pendharkar and Siddharth Santhosh, seniors at Green Level High School who both live in the Cary area. We built this tool under the supervision of Dr. Bharati Pandi.

Why we did it

It started with a news story. In June 2022, ABC11 reported that dogs became ill after swimming at Jordan Lake, and at least one died, after toxic algae turned up in the water. That one hit close to home. Arjun's dog, Oreo, goes on regular walks near Jordan Lake, and it was easy to picture Oreo being one of those dogs. We wanted to know how a bloom like that gets treated, and whether the treatment itself could hurt the rest of the lake. The question turned out to be the perfect mix of biology and technology, which let us combine both of our specialties: the ecology and toxicology behind each score, and the code that turns published data into a ranking anyone can run.

Arjun Pendharkar and Siddharth Santhosh inside the Cary/Apex Water Treatment Facility.
Arjun and Siddharth at the Cary/Apex Water Treatment Facility, September 2026.

Contact

What's next and how to reach us

Reach out

Tell us where this is wrong.

We would rather hear that the framework misses something than have it sit unexamined. If any of the following applies to you, we would genuinely like to hear from you.

You manage a waterbody

Does this reflect how treatment decisions actually get made, or is it missing a constraint that matters in practice?

You have data that contradicts the rankings

That is the most useful thing anyone could send us. Measurements beat predictions.

You work on cyanobacteria or aquatic toxicology

We are particularly interested in target-kill values we have not found, and in where the assumptions break down.

You want to use it

It is free and MIT licensed. Tell us what would make it more usable.

Email the authors