Choose Phages for Breadth of Activity, Depth of Activity, and Breadth of Depth
by Stephen T. Abedon Ph.D.Steve Abedon, Ph.D., has taught well over 100 individual classes and ~10 individual courses over his 30+ years as a college professor. He has over 150 publications, including multiple monographs, and is ranked in the top 1 or 2 percent among researchers of all disciplines worldwide. His research focuses on bacteriophage biology and phage therapy. (abedon.1@osu.edu)
phage.org | phage-therapy.org | biologyaspoetry.org | abedon.phage.org | google scholar | publications
Jump to: 🔑 Why a Cocktail? | 📋 Host Range | 🧭 Approaches & Inputs | 🎛️ Optimizer | 💡 Breadth and Depth | 🕸️ Molina | 🎯 Bono | 🔍 Abedon | 🔗 Menor-Flores | 🧫 PhageCocktail | 🤝 SocialViruses | 🔢 Omwega | 🧪 Analyze | 🧬 Other Approaches | 📖 Methods | 🧮 More Calculators
cocktailoptimizer.phage-therapy.org · Abedon’s Books
How can I improve this page? contact: cocktailoptimizer@phage-therapy.org
A phage cocktail holds more than one kind of phage. It is worth being clear, before choosing any phages, that a cocktail is assembled for either or both of two reasons — and the two do not necessarily overlap. Keeping them apart is the single most important distinction in cocktail design, and one not everyone draws cleanly.
No single phage lyses every strain. Combining phages whose host ranges differ lets the cocktail reach strains that any one of them would miss — which matters most when the cocktail must be given before the infecting strain has been identified. This is a demand for wide coverage across strains, and it is met by breadth.
Even against a strain a single phage lyses, bacteria that survive will multiply, and some are resistant. Lysing that one strain with more than one independent phage means a bacterium escaping the first is still killed by the next. This is a demand for redundancy against any one strain, and it is met by depth.
These are genuinely different goals, and a cocktail can serve one well while barely serving the other. A mixture broad enough to treat many strains empirically may give almost no protection against resistance in any single one of them; a mixture deep enough to hold down resistance in one strain may reach very few. A designer who does not keep the two reasons separate can optimize for one while believing the cocktail has the other (Abedon, Danis-Wlodarczyk & Wozniak, 2021; Abedon, 2025).
The two reasons map onto the three measures this tool computes.
So breadth serves empirical-treatment effectiveness, depth serves the suppression of resistance evolution, and breadth of depth is the stringent goal that asks for both at once. The Breadth and Depth tab works through why more than one phage lowers the chance of resistance, and defines each measure precisely.
The two reasons differ not only in what they optimize but in how much they demand of you to measure. Breadth needs only the host-range table, which any phage laboratory already produces. Depth needs more: you must know which phages a bacterium can lose together — the cross-resistance groups — and determining that is laborious.
Determining it across a diversity of target strains is harder still, and this is the part most easily skipped. A bacterium’s cross-resistance groups need not be the same from strain to strain: two phages a bacterium of one strain escapes together may be escaped separately by another. Breadth of depth, done properly, requires cross-resistance measured across the strains the cocktail is meant to reach. Measure it in one strain and assume the rest, and the breadth-of-depth figure rests on the assumption that what holds for that strain holds for all of them — which need not be true (Abedon, 2025). The tool lets you work with whatever grouping you have, but a depth above one is only as trustworthy as the cross-resistance behind it, strain by strain.
The methods gathered in this tool do not all aim at the same thing, and the split follows the two reasons above. Most strive for breadth — coverage across bacterial strains. The greedy search (Bono 2021) and the infection-network methods (Molina 2021, Menor-Flores 2022, PhageCocktail 2022), along with the coverage side of SocialViruses 2025, all choose phages to lyse as many strains as possible, differing mainly in how they search. Only Abedon 2021 also strives for depth, choosing phages a bacterium cannot escape together. (Omwega 2026 asks a third question — whether a measured combination is synergistic — rather than breadth or depth directly.)
The genome- and sequence-based methods on the Other Approaches tab divide the same way. Those that predict host range in order to cover more strains (Keith 2024) strive for breadth. The receptor-based one (Unnikrishnan 2023) reaches toward depth: by choosing phages that use different receptors, it picks phages a bacterium is less likely to escape together — the cross-resistance idea in receptor terms, though the article frames it as receptor diversity rather than depth as such.
Depth and breadth of depth can be scored for any cocktail once cross-resistance groups are known, so a cocktail chosen for breadth by one method can still be measured for depth after the fact. That is how these methods are most fairly judged side by side: on the same data, scored on the same measures.
Enter your host-range table on the Host Range tab; breadth is available from that alone. If you also know, or can determine, cross-resistance groups across your strains, the depth and breadth-of-depth measures open up. The Approaches & Inputs tab sorts the several design methods here by how much information each one needs, so you can see which you are in a position to run; the Abedon 2021 tab searches your phages by breadth, depth, or breadth of depth directly.
Everything on this page starts from a host-range table: one row for each bacterial strain tested, one column for each phage, and in each cell a 1 if the phage lyses the strain (the strain is within the phage’s host range) or a 0 if it does not. What counts as a 1 is up to you, and is discussed below under What Counts as a Hit. Host range itself — how it is determined, and the bacterial resistance that bounds it — is reviewed by Hyman & Abedon (2010); the methods used to establish it are surveyed more recently by Hyman (2025), and a phage’s host range can itself be deliberately altered (Stanchek & Hyman, 2026). Only the strains the cocktail is meant to target belong in the table: a cocktail aimed at Pseudomonas aeruginosa should be entered against P. aeruginosa strains, not padded out with strains it was never meant to reach.
Breadth is the fraction of the strains in the table that a cocktail lyses, so listing bacteria no phage was ever likely to reach does not test the cocktail — it simply lowers every cocktail’s breadth and shrinks the differences between them. If 1,000 strains were entered but only 100 could plausibly be hosts, breadth could not rise above about 10%, and the best cocktail would look little better than the worst.
This is only about what goes in the table, not about what you do at the bench. Testing phages against a wide range of bacteria, including ones you expect not to be hosts, is ordinary and useful. The trouble comes only from carrying those non-host bacteria into the calculator as target strains; leave them out here, and the breadth figures mean what they should.
Enter data in any of four ways: load an example, paste from a spreadsheet, start a blank table and click cells to change them, or load a JSON file saved earlier (on the Save & Load tab). Your work is also kept automatically in this browser. Once a table is in place, the Host-Range Matrix below is where you edit it.
This is the table itself: which phages lyse which strains. It asks only what every host-range experiment already produces, and on its own it answers the first reason for a cocktail — how broadly the phages together cover your strains. That is a complete and legitimate endpoint in its own right, the one that matters for empirical treatment; depth and cross-resistance, in the section below, go further toward holding down resistance, but they are a second goal, not a correction to this one. Rows are bacterial strains and columns are phages; phage names take on the color of their cross-resistance group once you assign groups in the section below. Click a cell to switch it between 1 and 0. Clear a strain’s box to leave it out of every calculation without deleting it. The bottom row gives each phage’s host-range breadth, the percentage of strains in use that it lyses, and the right-hand column the number of phages lysing each strain.
This is a second, more demanding layer of information, and the reason it comes after the matrix: it asks not just whether phages lyse a strain but whether a bacterium could lose them together. Phages whose host ranges overlap add depth to a cocktail only if a bacterium is unlikely to become resistant to all of them through a single, easily acquired step. When one easily acquired change, such as the loss of a shared receptor, can make a bacterium resistant to several phages at once, those phages belong to one cross-resistance group, and together they contribute a depth of only 1 against any strain they lyse (Abedon, Danis-Wlodarczyk & Wozniak, 2021). Give phages known to share a group the same group label. A phage left without a label is treated as a group of its own. Rarer changes that happen to disable unrelated phages together are accepted; the aim is to reduce cross-resistance, not necessarily to eliminate it, which may not be possible.
A host-range table falls out of experiments any phage laboratory already runs. Cross-resistance groups do not: establishing that two phages can be escaped together takes resistance testing against every strain targeted, which is laborious (Abedon, 2025). Many groups will not have done it, which is why the matrix above stands on its own and this section is optional.
With no groups assigned, every phage counts as its own group, so depth is simply the number of phages lysing a strain. Any cross-resistance found later can only merge groups and so lower depth, never raise it. Depths calculated before cross-resistance has been tested are therefore the most that the cocktail could achieve, not what it will achieve.
The role of each phage tells the optimizer what it may do with it: a candidate may be chosen or not, a phage marked always include is placed in every cocktail considered (useful when building on a cocktail that already exists), and a phage marked leave out is never chosen.
A 1 in the table means that the phage has the strain within its host range, however host range has been defined; a 0 means that it does not. The calculations here use only that distinction, so deciding what result counts as a 1 is the most consequential choice you make. Host range is most often determined by spot tests, by efficiency of plating (EOP), or in liquid culture by following optical density.
If your table holds numbers rather than 1s and 0s, set the cutoff here; a value at or above it counts as a hit. The matrix above can show either the 1/0 interpretation or the numbers as entered.
Applies only to cells that hold numbers other than 0 and 1. Cells already entered as 1 or 0, + or −, are left as they are. For EOP data a cutoff such as 0.1 is common.
Every method on this page answers the same question — which phages should a cocktail contain? — but they do not start from the same data, and they do not optimize the same thing. The most useful way to sort them is by how much information they require, because that is what decides whether a given group can use them at all. A laboratory may know only what you knew in the breadth-and-depth work: whether each phage stopped each bacterium from growing, a table of yes and no. That is the least any of these methods asks. Others need measurements such a table does not contain — how phages interfere with one another, or how strongly a mixture inhibits growth — and each added requirement is more bench work, so fewer groups will have it.
The methods are therefore laid out below from the least information required to the most. A method you can feed is worth more to you than a more elaborate one you cannot, so it is worth starting at the top of this list and working down only as far as your data reach.
| Approach (tab) | What it optimizes | In this tool |
|---|---|---|
| Least — only a host-range table (did each phage stop each bacterium growing, yes or no) | ||
| Abedon 2021 — breadth & depth | Breadth of activity (and, if you also record which phages share a cross-resistance group, depth and breadth of depth) | Runs now on the Host Range table |
| Bono 2021 — greedy search | Breadth of activity | Runs now on the Host Range table |
| Molina 2021 — infection-network pipeline | Coverage, via nestedness and clustering | Runs now on the Host Range table |
| Menor-Flores 2022 | Coverage (two methods) | Runs now on the Host Range table |
| PhageCocktail 2022 | Coverage (four algorithms) | Runs now on the Host Range table |
| More — the host-range table and a phage–phage interaction matrix (how every pair of phages behaves together) | ||
| SocialViruses 2025 | Coverage while avoiding interference between phages | Runs once you enter the interaction matrix on its tab |
| More still — measured inhibition of each phage alone and of each cocktail mixed | ||
| Omwega 2026 | Synergy or antagonism among the phages | Lists combinations now; classifies synergy once you enter the measurements on its tab |
| A different kind of data — bacterial genomes or phage sequences, and models trained on them | ||
| Other Approaches — Mageeney, Unnikrishnan, Keith | Predicted host range, receptors, or new phages | Described, not run (a different input entirely) |
Within the first group the five methods ask for the same thing — the host-range table — and differ only in what they do with it, so any of them is open to a group that has that table. Each group below it adds a requirement, and with it narrows the set of laboratories that can run the method.
The one input every host-range method shares is the table on the Host Range tab: a 1 where a phage lyses a strain and a 0 where it does not. Enter it once and the Abedon, Bono, Molina, Menor-Flores, and PhageCocktail tabs all read it. This is the least you need, and five of the methods ask for nothing more.
Host range is often measured as a number rather than a yes or no — an efficiency of plating, say. You can enter those numbers in the same table and set, on the Host Range tab, the cutoff above which a value counts as a hit. The methods still work on the resulting 1s and 0s, but keeping the numbers lets you change the cutoff and see how the cocktails shift.
Depth, in the Abedon method, counts only phages a bacterium cannot escape together in one easily acquired step. Telling the tool which phages share a cross-resistance group (also on the Host Range tab) is therefore an extra input that only the depth-aware method uses; left blank, every phage is treated as its own group, which gives the most optimistic depth.
Two phages lysing the same bacterium can get in each other’s way — competing for a shared receptor, or, once both have adsorbed, excluding or interfering with one another (superinfection exclusion, mutual exclusion, or altered lysis timing; Abedon, 1994) — or can help each other. This is interference among the lytic phages a cocktail is built from, not the repressor-based immunity of temperate phages, and none of it is visible in a host-range table, which records only phage against bacterium, not phage against phage. SocialViruses (Molina et al., 2025) adds a second table, a phage–phage interaction matrix, and chooses cocktails that cover the strains while avoiding antagonistic pairings, since such interference can make a cocktail underperform (Molina et al., 2022). Its tab takes that matrix as its own input.
Omwega et al. (2026) ask a different measured question: when phages are actually combined, do they inhibit the bacterium more or less than the best of them would alone? Answering it needs the inhibition each phage causes on its own and the inhibition each combination causes when mixed. Comparing the two (the highest-single-agent model) says whether a cocktail is synergistic or antagonistic. The combinations can be listed from the host-range table, but the synergy verdict needs those measurements, which the Omwega tab lets you enter.
One caution, and it goes to the heart of this tool. A combination scored as better than its best single phage can mean either of two things, and an endpoint reading — a single measurement after some fixed incubation — cannot tell them apart. The combination may simply kill the bacteria present more completely, an ecological gain of immediate antibacterial potency. Or it may hold down the phage-resistant bacteria that would otherwise grow out, an evolutionary gain, which is exactly the depth this tool is built around. The incubation time all but decides which: a short endpoint, around two hours, reflects the killing of phage-susceptible bacteria, while a 24-hour endpoint almost always reflects whether phage-resistant bacteria were kept from growing out. So a synergy verdict means little without the time scale behind it, and the same number can be an ecological result or an evolutionary one.
A last group of methods does not use host-range data at all. They work from bacterial genome sequence, or from a phage’s receptor-binding protein sequence, to predict what a phage will lyse or which receptor it uses, or to produce new phages from prophages in sequenced genomes. These are a different kind of tool with a different input, and are described, not run, on the Other Approaches tab.
Enter your host-range table on the Host Range tab. That alone runs the five host-range methods, which you can compare directly since they read the same data. If you have measured how phages interfere with one another, the SocialViruses tab will use it; if you have measured how combinations inhibit growth, the Omwega tab will use that. Any cocktail a method proposes can be carried to the Analyze a Cocktail tab to see it strain by strain.
This is where the methods are run together. Each model tab chooses a cocktail from the same host-range table, but they do not all choose the same one. Set a cocktail size, run them, and every resulting cocktail is scored on the same yardstick so the picks can be read side by side. Enter your data on the Host Range tab first.
Each method can also be run on its own tab, where it is explained and offers its own options: Abedon 2021 · Bono 2021 · Molina 2021 · Menor-Flores 2022 · PhageCocktail 2022. This tab just runs them at once and compares them.
Every method that takes a size is run at this size. Methods that choose their own size are shown at their natural size (see below).
Off by default for a simpler, breadth-only comparison — the reading most people want. Turn it on to add the depth columns and the depth-optimized cocktail (Abedon 2021), the one choosing for breadth alone gives up.
Run to compare the methods on your data.
Most of these methods optimize breadth (coverage across bacterial strains) and differ only in how they search, so several often land on the same or nearly the same cocktail. With breadth of depth turned on, a cocktail chosen to be broad can still be measured for depth after the fact, which shows what breadth-first choosing gives up; only Abedon 2021 chooses for depth. Depth and breadth of depth use the cross-resistance groups set on the Host Range tab; with no groups, every phage is its own group and depth is simply the number of phages lysing a strain. Any cocktail in the table can go to the Analyze a Cocktail tab to see its depth strain by strain.
Why do some methods end up with different sizes? The ones that take a size are all run at the size you set. But the clustering pipelines (Molina 2021, PhageCocktail) decide their own number of groups from the shape of the data — a nestedness and elbow test — and take one phage per group, so their cocktail is however many groups they found, shown as a natural size. A greedy method can also stop short of the set size if it already lyses every strain before reaching it.
Two methods are left out of this breadth-and-depth comparison because they answer a different question and need data a host-range table does not hold. SocialViruses 2025 chooses cocktails that cover strains while avoiding antagonistic phage pairings, which needs a phage–phage interaction matrix; Omwega 2026 asks whether a measured combination is synergistic, which needs inhibition measurements. Run those on their own tabs.
This is the cocktail-design pipeline of Molina et al. (2021). It reads the same host-range table as the other tabs, treated as a phage–bacterium infection network, and works in three stages: it measures how nested the network is and from that suggests a cocktail size (Φ); it groups the phages by host-range similarity so that near-redundant phages fall together; and it then picks the broadest phage from each group and searches those representatives for the best cocktail. Later work by the same group packaged these steps as the PhageCocktail tool (next tab).
A nested network is one in which the strains a narrow phage lyses are a subset of those a broad phage lyses. The pipeline measures departure from perfect nesting as a “temperature” (0 = perfectly nested, 100 = not at all) and combines it with how full the matrix is to suggest a cocktail size Φ. The original computes the temperature with BinMatNest; this page uses a standard nestedness-temperature calculator, whose value can differ, so Φ here is a suggestion you can override with the size limit below. The clustering and the search that follow are exact.
Caps the suggested Φ and the search. Phages marked “leave out” on the Host Range tab are excluded.
Run the pipeline to see the nestedness analysis, clustering, and cocktail.
This is the cocktail-design method of Bono et al. (2021), one of several on this page. It builds a cocktail one phage at a time: it starts with the single phage that lyses the largest fraction of your strains, then at each step adds whichever remaining phage most increases the fraction of strains lysed, stopping once a target coverage is reached or the cocktail reaches its size limit. It reads the same host-range table as the other tabs, binarized by the hit cutoff you set on the Host Range tab.
A greedy method takes the locally best step each time, the phage that looks best on its own at that moment, without reconsidering earlier choices. This is fast even for large phage sets, but it is not guaranteed to find the best cocktail of a given size, because the best cocktail need not be built from the phages that looked best one at a time. The breadth-and-depth tab instead scores every allowed combination and so returns the true best, but needs the candidate pool kept small enough to enumerate. The two are complementary: a greedy pass can winnow a large pool to a shortlist the exhaustive search then explores fully. This method also optimizes breadth of activity alone; it does not count depth or cross-resistance, so its breadth of depth is reported below only to show what the greedy cocktail happens to achieve, not because the method sought it.
The search stops once this fraction of strains in use is lysed by at least one cocktail phage, or when the size limit below is reached.
Bono et al. capped efficient cocktails at ten phages.
Phages marked always include on the Host Range tab seed the cocktail and the search fills the rest; phages marked leave out are never chosen. The hit cutoff is set on the Host Range tab (currently 1).
Each row is one step: the phage added, why (the coverage it brought), and the running breadth of activity. The first row is the single broadest phage the search started from.
Run the search to see the build.
Run the search above.
Breadth of activity climbs steeply at first, then flattens as the broadly active phages are used up, the diminishing return that makes small cocktails attractive.
This method’s central idea is depth, and depth is built on cross-resistance, so it is worth stating plainly before the search. Two phages lysing a strain only count as a depth of two if a bacterium cannot escape both of them in a single easily acquired step. When one easily acquired change — the loss of a shared receptor, say — makes a bacterium resistant to several phages at once, those phages belong to one cross-resistance group and together add only a depth of one. So on this tab depth is the number of distinct cross-resistance groups lysing a strain, never simply the number of phages (Abedon, Danis-Wlodarczyk & Wozniak, 2021; Abedon, 2025). A rarer change can still cost a bacterium two otherwise unrelated phages at once, and that is accepted: the aim is to reduce the chance of cross-resistance, not necessarily to eliminate it, which may not be possible. Taking this into account is what the earlier Cross-Resistance Avoider page did, and it is built into every depth figure here.
You set the groups on the Host Range tab, by giving phages known to share a group the same label. A phage left unlabeled is treated as a group of its own, which gives the most optimistic depth, since any cross-resistance discovered later can only merge groups and lower depth. Cross-resistance groups must in principle be determined against each target strain, not one: the groups can differ from strain to strain, so phages a bacterium of one strain escapes together may be escaped separately by another. A depth above one is therefore only as trustworthy as the grouping behind it, and a breadth of depth computed from a single strain’s groups quietly assumes the rest behave the same.
With all your candidate phages taken as one cocktail, this compares the depth counted the naive way, one per phage lysing a strain, against the true depth that counts cross-resistance groups. The gap is the depth that cross-resistance removes — the point the Cross-Resistance Avoider was built to make.
This tab searches combinations of your candidate phages and ranks them by one of four measures, every one of which (except plain breadth of activity) rests on the cross-resistance depth just described. Pick the measure, the cocktail size, and how many results to show, then run the search. Larger candidate pools and larger cocktails mean many more combinations, so the search can take a while; the count below updates as you choose.
Phages marked always include are counted within this size and placed in every cocktail; the search fills the remaining places from the candidates.
When two cocktails score equally on the chosen measure, the one lysing strains more deeply is ranked first. Breadth and depth often pull in different directions, so a cocktail broad at depth ≥ 1 is not always the one broadest at depth ≥ 2.
Each row is a cocktail. The columns report breadth of activity (depth ≥ 1), breadth of depth at your chosen minimum, and mean depth, so a cocktail ranked by one measure can be weighed against the others. Choose a cocktail to carry it to the Analyze a Cocktail tab, where it is shown strain by strain.
Run a search to see results.
For each cocktail size from one phage up to the size chosen above, this shows the best breadth attainable, both at depth ≥ 1 and at your chosen minimum depth. Added phages help breadth less and less as the broadly active phages are used up, and depth demands more phages than breadth does, so its curve sits below and rises later.
Menor-Flores et al. (2022) compared two ways of choosing cocktail phages from a phage–bacterium infection network. The network-metrics method adds phages in order of how many strains each lyses, until coverage stops improving or a size limit is reached, giving an answer immediately. The exhaustive method instead scores every possible combination up to a given size and keeps the best at each, which is slower but cannot be bettered for the data entered. Both read the host-range table on the Host Range tab.
The exhaustive search is capped at seven phages, as in the published comparison.
Choose a method and run.
Díaz-Galián et al. (2022) released PhageCocktail, an R package that designs cocktails from a phage–bacterium infection network by any of four methods. The two exhaustive methods score every combination; the two clustering methods first group phages by host-range similarity and keep one representative per group, then search those, which is much faster for large phage sets. Each method comes in a plain form and a “Φ” form that uses the nestedness-based size suggestion. This tab reimplements all four, reading the Host Range tab’s table.
The package caps exhaustive search at seven phages.
Choose an algorithm and run.
Omwega et al. (2026) take a small set of phages, form every possible three-phage cocktail, and test each one, then judge whether the phages help or hinder one another: a cocktail that kills more than its phages would be expected to on their own is called synergistic, one that kills less is antagonistic. In their panel most three-phage cocktails were neutral or antagonistic, and only one was synergistic, which is why they argue the combinations must be tested rather than assumed.
Every three-phage combination of your candidate phages, ranked by strains lysed.
Enumerate to list the three-phage combinations.
This is the part of the method that needs measurement. Enter how much each phage inhibits the target on its own, then enter what a cocktail actually achieved when the phages were combined. The tool compares the observed inhibition against the highest-single-agent expectation — the best any one member manages alone — and reports the difference Δ: a cocktail is synergistic when Δ is above +5%, antagonistic below −5%, and neutral in between (Omwega et al., 2026). Without these measurements there is nothing to classify; the enumeration above is as far as a host-range table can take the method.
A combination that inhibits more than its best single phage can be doing either of two different things, and an endpoint reading — one measurement after a fixed incubation — cannot separate them. The cocktail may simply kill the bacteria present more completely, an ecological effect of immediate potency; or it may hold down the phage-resistant bacteria that would otherwise grow out, an evolutionary effect, which is the depth this tool is built around. The incubation time all but decides which: a short endpoint, around two hours, shows the killing of phage-susceptible bacteria, while a 24-hour endpoint almost always shows whether phage-resistant bacteria were held in check. Read a synergy verdict with its time scale in mind — the same number can be an ecological result or an evolutionary one.
Choose the phages of a cocktail and see what it does to your strains, one strain at a time. A cocktail chosen on the Optimize tab arrives here ready to inspect; you can also build one by clicking phages below. The depth reported for a strain is the number of different cross-resistance groups in the cocktail that lyse it, so two phages of the same group count once.
Choose at least one phage above.
Each strain is shown with the cocktail phages that lyse it and the resulting depth, the count of distinct cross-resistance groups among those phages. Strains are grouped by depth so that the weak points, the strains lysed shallowly or not at all, stand out; these are where resistance is most likely to emerge or where the cocktail simply misses.
A phage cocktail, by definition, holds more than one type of phage (Abedon, 2025). The Why a Cocktail? tab gives the short version of why a cocktail is built this way; this tab works through the reasoning behind it. The short of it: a single phage faces two separate resistance problems, and the two call for different things from the cocktail.
The first problem is resistance that is already present when treatment begins. In a group of bacterial strains, some will lie outside any one phage’s host range from the start. This is community resistance, the term Dąbrowska & Abedon (2019) introduced for resistance already dominant before treatment: it is what must be overcome to treat an infection before the strain causing it has been identified. A cocktail beats it by breadth, by holding phages whose host ranges, taken together, cover as many strains as possible.
The second problem is resistance that evolves during treatment, as bacteria that survive the first phage multiply. This is treatment resistance (Dąbrowska & Abedon, 2019). A cocktail beats it by depth, by lysing each strain with more than one phage, so that a bacterium becoming resistant to one phage is still lysed by another (Abedon, 2025). The reason more than one phage helps is a matter of probability, worked through below.
The order matters. With community resistance, a majority of the bacteria to be treated are already resistant at the start, so it has to be overcome first or treatment never gets going. Treatment resistance is different: the resistant bacteria are present only at low frequency at the outset, and they become a problem only once the susceptible majority has been killed off, that is, only after community resistance has already been beaten (Abedon, 2025). So breadth is what a cocktail needs to begin working across many strains, and depth is what it needs to keep working against any one of them.
Suppose a bacterium becomes resistant to a given phage through a single change at a rate of about one cell in a million, which is 10−6. If a bacterial strain is lysed by only one phage in the cocktail, then roughly one cell in a million can already resist the whole cocktail, and in a large bacterial population such cells are all but certain to be present and to grow out once the phage removes their neighbors.
Now suppose two phages in the cocktail both lyse the strain, and that becoming resistant to each happens independently, again at about 10−6. To resist both at once, a single bacterium would need both changes, and the chance of that is the product of the two: 10−6 × 10−6, which is 10−12, one cell in a trillion (Abedon, Danis-Wlodarczyk & Wozniak, 2021). That is a million times rarer than resistance to either phage alone, the two rates having multiplied. Put as counts, a billion bacteria would hold about a thousand already resistant to a given single phage, but a bacterium resistant to both at once would be expected only about once in every thousand such billion-cell populations. Adding a third independent phage multiplies in another 10−6, taking the chance to 10−18. Each phage that independently lyses a strain thus makes complete resistance dramatically less likely, which is what "depth" measures: the number of phages that lyse a strain, counting only phages a bacterium cannot escape together in one easily acquired step.
A cocktail does not have one depth; it has a depth against each bacterial strain, and these need not agree. Here are four bacterial strains scored against one cocktail. A 1 means a cocktail phage lyses the strain; the three phages shown belong to three different cross-resistance groups, so for these strains depth is simply the count of 1s in the row.
Reading down the depth column: one strain of the four is lysed at depth 2, two are lysed at depth 1, and one is not lysed at all. Those counts become the measures below. Three of the four strains are lysed by at least one phage, so breadth of activity is three-quarters, or 75%. Only one of the four is lysed at depth 2 or more, so breadth of depth, at a minimum depth of 2, is one-quarter, or 25% (Abedon, Danis-Wlodarczyk & Wozniak, 2021). The same cocktail is broad but shallow: good against community resistance across these strains, weak against treatment resistance for all but one of them.
Because depth is strain-specific in this way, breadth of depth done properly asks for cross-resistance groups determined across the diversity of target strains, not carried over from a single one. The groups themselves can change from strain to strain, so a breadth-of-depth figure built on one strain’s groups rests on the assumption that what holds for that strain holds for all of them (Abedon, 2025). Determining cross-resistance against many strains is laborious, which is the real cost of designing for depth rather than breadth alone.
The Why a Cocktail? tab introduced these three measures; here are their exact definitions. Write N for the number of bacterial strains in use. For a chosen cocktail, each strain has a depth, the number of its cross-resistance groups that lyse it.
The fraction of bacterial strains lysed at a depth of at least 1, that is, lysed by at least one cocktail phage. This is the usual, intuitive sense of how broad a cocktail is (Abedon, Danis-Wlodarczyk & Wozniak, 2021).
For a single bacterial strain, the number of different cross-resistance groups in the cocktail that lyse it. Across all strains it can be summarized by its mean, or by its minimum, the depth of the worst-covered strain in use, which is a stringent, worst-case way to judge a cocktail. Breadth of depth, next, is built directly on it.
The fraction of bacterial strains lysed at a depth of at least some chosen minimum d, usually 2. At d = 2 it is the fraction of strains that the cocktail can both lyse and keep from evolving resistance to the whole cocktail (Abedon, 2025). It is never larger than breadth of activity and is usually much smaller, because reaching many strains with two independent phages is harder than reaching them with one.
A ready-made ("prêt-à-porter") cocktail, prepared before the infecting strain is known, must do well against many possible strains at once, and it is far harder to reach every strain at depth 2 than to reach every strain at depth 1 (Abedon, 2025, after Pirnay et al., 2011). Breadth of depth measures exactly that harder goal. A personalized ("sur-mesure") cocktail, made for one known strain, has an easier task, since it need only reach that single strain deeply. The depth providing breadth of depth need not come from the same phages in every strain: what matters is that many strains are each lysed by two or more phages from different cross-resistance groups, not which phages do it (Abedon, 2025).
Why a cocktail is being built decides which of these measures matters most, a distinction Pirnay et al. (2011) framed as prêt-à-porter against sur-mesure — ready-made against made-to-measure. A ready-made cocktail is a fixed, defined preparation made in advance and given off the shelf, before the infecting strain has been identified; it must therefore work across many possible strains at once, which is a demand on breadth, and on breadth of depth if it is also to hold down resistance across them. A personalized cocktail is assembled or adapted for one patient and one known strain; its task is far easier, since it need only reach that single strain, and reach it deeply. Pirnay et al. argued that both approaches are workable and can even be complementary, and the two make very different demands on a design method: reaching every strain at depth two is much harder than reaching one strain at depth two, which is why breadth of depth is the stringent goal a ready-made cocktail is held to.
The breadth-and-depth framing was not arrived at in isolation. The usefulness of combining phages, and of choosing them so that bacteria cannot escape the whole combination at once, had been set out earlier (Chan & Abedon, 2012; Chan, Abedon & Loc-Carrillo, 2013), and around 2020 to 2022 several groups converged on formal, quantitative ways to choose cocktail phages from host-range data without citing one another: a greedy host-range search (Bono et al., 2021), infection-network analysis (Molina et al., 2021), and the breadth and depth of activity used here (Abedon, Danis-Wlodarczyk & Wozniak, 2021). More recent reviews gather these strands together (Abedon, 2025; Kaneko et al., 2026). The model tabs on this page let the common host-range data be run through several of these methods and their results compared.
This is the host-range data set from Figure 2 of Abedon, Danis-Wlodarczyk & Wozniak (2021): twelve phages against forty-five bacterial strains. Load it on the Host Range tab (it is the first example) and press the button below to reproduce the figure. The bars show, for cocktail sizes from six phages down to two, the best breadth attainable when a strain counts as covered at depth ≥ 1 and, separately, at depth ≥ 2. The depth ≥ 2 bars sit lower and the best cocktails at the two depths are made of different phages, the point of the whole exercise: the broadest cocktail is not the one that best resists evolution.
Breadth and depth are one of several computational approaches to cocktail design, each starting from different information. Rather than repeat them here, the Approaches & Inputs tab lays them out side by side, sorted by how much each one needs to run, and the Methods tab gives the fuller account and references.
The model tabs here all begin from one thing: a host-range table of which phages lyse which strains. Several other computational approaches to cocktail design begin instead from bacterial or phage genome and sequence data, and some depend on models trained on large datasets specific to their study. These are not something this tool can run on a host-range table, so they are described here rather than implemented, in order of publication. If you want to pursue one, follow its reference.
Rather than choosing from phages already in hand, this approach starts from bacterial and phage genome sequences. A computational step identifies prophages and other integrated elements mapped within sequenced genomes, and molecular-biology and microbiology steps then produce phages able to target a given bacterial isolate. The authors describe it as a technology platform for on-demand production of phages against nearly any bacterial pathogen, combining computation with bench work; it is therefore not a host-range scoring method but a pipeline for obtaining phages in the first place.
This approach predicts, from a phage’s receptor-binding protein sequences, which bacterial surface receptor the phage uses. A machine-learning classifier, a random forest performing best among those tried, is trained on sequence features of known receptor-binding proteins and then applied to new phages. The predicted receptors inform which phages to combine, the idea being that phages using different receptors are less likely to be escaped together — which is the depth idea in receptor terms, since phages escaped only by separate changes sit in different cross-resistance groups, though the article frames it as receptor diversity rather than depth as such. The input is phage genome and protein sequence, not a host-range table, and the prediction depends on the trained model, so the method sits outside what a host-range calculator can reproduce.
This approach trains machine-learning models on thousands of measured phage–bacterium interactions, using features drawn from each bacterium’s sequenced genome, so that a model for each phage predicts whether it will act on a bacterium from that bacterium’s genome alone. The per-phage predictions are then combined to propose a cocktail expected to cover a set of strains, including strains never tested, with the more generalist phages predicted most reliably. Because the models are trained on genomic features and a large interaction dataset, the method predicts host range rather than taking it as input, and so is a different kind of tool from the host-range models here.
A host-range table and a genome are different starting points, and a model trained on one laboratory’s strains and phages does not transfer to arbitrary data the way a host-range score does. Reproducing these methods faithfully would mean building tools around sequence input and supplying their trained models, which would be separate from the cocktail-from-host-range tools gathered here. They are listed so that the picture of how cocktails are designed computationally is complete.
Everything you enter, the strains, phages, cross-resistance groups, host-range values, roles, and the hit cutoff, can be saved to a single JSON file and loaded back later or shared with a colleague. The file is plain text and can also be read or edited by other programs. Your work is kept automatically in this browser as well, so a reload does not lose it, but a saved file is the way to keep a copy you control.
The host-range matrix and the ranked cocktails can also be saved as comma-separated values (CSV), which opens in Excel or Google Sheets, or copied as a tab-separated block to paste straight into a spreadsheet or document.
The JSON below is a live view of your current data; saving writes exactly this. It lists the phages with their cross-resistance groups and roles, the strains with whether each is in use, and the host-range values. You can edit it by hand and load it back, which is sometimes the quickest way to fix a large table.
{}
The tool reduces everything to one host-range table of 1s and 0s. A cell is a 1 (a hit) when the phage lyses the strain and a 0 otherwise. Values entered as 1 or 0, as + or −, or as yes or no are taken directly; a value entered as a number, such as an efficiency of plating, becomes a 1 when it is at or above the cutoff set on the Host Range tab, and a 0 otherwise. Strains that are switched off are left out of every calculation but kept in the table.
For a given cocktail, the depth against one strain is the number of distinct cross-resistance groups in the cocktail that lyse that strain. Two phages lysing the strain contribute a depth of 2 only when they belong to different groups; sharing a group, they contribute 1. A phage left without a group label is treated as its own group, so with no groups assigned, depth is simply the count of cocktail phages lysing the strain. From the per-strain depths, writing N for the number of strains in use:
The Optimize tab scores combinations of candidate phages. A phage marked always include is placed in every combination and counts toward the cocktail size; a phage marked leave out is never used; the rest are candidates from which the remaining places are filled. The number of combinations is the number of ways to choose those remaining places from the candidates, which grows quickly, so the tool shows the count before you run and declines searches too large to finish in the browser. Winnowing candidate phages by host-range breadth first, by eye or with the sort button, keeps the search manageable.
Every combination is scored by all measures; the ranking uses the one you choose, and ties are broken by overall depth when that option is on. Because breadth and depth can favor different cocktails, the broadest cocktail at depth ≥ 1 is often not the broadest at depth ≥ 2, and the results table reports both so the trade-off is visible. The search is exact: it scores every allowed combination rather than sampling or estimating, so the ranked cocktails are the genuine best by the chosen measure for the data entered.
Choosing phages one at a time by whichever adds the most coverage, a greedy approach, is fast but can miss the best cocktail, because a phage that looks weak alone may be the one that completes a strong combination. For the cocktail sizes and candidate numbers usual in practice, scoring every combination is quick enough to be worth the certainty. When the candidate pool is large, the honest response is to reduce it rather than to trade exactness for speed quietly, which is why the tool asks you to winnow instead of switching methods on its own.
The calculations take the host-range table as given, so the judgments that matter most happen before the data are entered and are left to you.
Designing a cocktail from breadth and depth of host range, the approach here, is one of several computational approaches that have been proposed, and they draw on different information and aim at different things. The tool begins with this one, and is intended to take in others over time. In outline, the published approaches fall into a few families.
These differ in what they require, how much experimental work they presuppose, and whether they aim at a ready-made cocktail for many strains or a personalized one for a single strain (Pirnay et al., 2011; Lood et al., 2022). Their references are below. Suggestions of approaches to add are welcome at the contact address in the page header.
Below, the computational methods for choosing cocktail phages are described individually, so that each can be compared with the breadth-and-depth approach used here. This catalog will grow as further methods are added.
Working from a host-range matrix of efficiency-of-plating values, binarized by an adjustable efficiency cutoff in the same way as here, this method builds a cocktail one phage at a time. It starts with the single phage that lyses the largest fraction of strains, then at each step adds whichever unused phage most increases the fraction of strains lysed, stopping once a target coverage is reached (the algorithm, written in MATLAB, is given in that paper’s appendix). Applied to 30 Pseudomonas aeruginosa phages tested against 14 strains, it selected a two-phage cocktail that was expected to lyse 12 of the 14 strains, and three-phage cocktails expected to reach 13. This is a “greedy” heuristic: it follows the locally best choice at each step and so finds a good cocktail quickly even from a large phage set, but it is not guaranteed to find the best cocktail of a given size, since the best cocktail need not be built from the phages that looked best one at a time. It optimizes breadth of activity alone, without depth or cross-resistance.
The two methods make opposite trade-offs. A greedy search scales to large candidate pools, where scoring every combination would be infeasible, but can miss the best cocktail. The exhaustive search on the Optimize tab scores every allowed combination, so for the cocktail sizes and candidate numbers it can finish, it returns the genuine best by the chosen measure, at the cost of needing the candidate pool kept small enough to enumerate. The two are complementary rather than in competition: a greedy pass can winnow a large pool down to a shortlist that an exhaustive search then explores completely. The greedy method also scores breadth only, whereas the search here can rank by depth and breadth of depth, taking cross-resistance into account. The published greedy study is also notable for a separate finding that bears on cocktail design generally: among the 30 phages, roughly a fifth were “generalists” lysing eight or more of the strains, so extreme host specificity is not the universal rule it is sometimes assumed to be.
Three infection-network methods are reimplemented on this page as their own tabs, each reading the same host-range table. Molina et al. (2021) measure how nested the network is, use that to suggest a cocktail size (Φ), cluster the phages by host-range similarity, and search one representative per cluster. Menor-Flores et al. (2022) compare adding phages by host range against an exhaustive search. Díaz-Galián et al. (2022) packaged these as the PhageCocktail R package, whose four algorithms (ExhaustiveSearch, ExhaustivePhi, ClusteringSearch, ClusteringPhi) are reimplemented in full. The deterministic parts — the exhaustive search, the Ward clustering and its representative selection — are exact; the nestedness temperature behind Φ is computed with a standard calculator rather than the original BinMatNest, so Φ is shown as an overridable size suggestion, as the Molina and PhageCocktail tabs state.
Two further methods have tabs but are only partly runnable here, because they require data a binary host-range table does not hold. SocialViruses (Molina et al., 2025) adds a phage–phage interaction network to the infection network; Omwega et al. (2026) classify three-phage cocktails as synergistic or antagonistic from measured inhibition against an independence model. The Omwega tab enumerates the three-phage combinations the host-range table does support, and both tabs state plainly which measured input their full method needs. Keith et al. (2024) and the other sequence-based methods remain on the Other Approaches tab.