Work out whether a yeast selection is enough for a batch.
Liquid packs are assumed to hold 100 billion cells at manufacture (Wyeast and
White Labs both quote ~100 billion) unless the selection says otherwise. Dry
sachets are counted as gramsPerPack × cellsPerGramBillion, defaulting to
the commonly published 6 billion cells per gram when the catalog has no
figure.
A row that carries a starter
A saved starter is something the brewer has decided about this pitch, like
the manufacture date, so this function reports the cells it produces. The
steps are grown through starterGrowth: step one is pitched with that
row's viable pack cells, each later step with all of the previous step's
output, and the last step's total replaces the pack count for that row.
The yield isn't stored. It's recomputed every time on Braukaiser's model,
which its author puts at ±15 % or worse. A starter can still leave a pitch
short, and that's correct: a two-litre flask isn't automatically enough for
a lager, so the shortfall check still runs.
Dry yeast is the exception: its starter is ignored. A starter uses up
the sterols and unsaturated fatty acids dry yeast is packed with, so a dry
row's starter is ignored and a note says so. See dryYeastSachets for the
full reasoning. We enforce this here and not in the document schema because
every caller gets its cell count from this function. An imported file, a
tool call or a row switched from liquid to dry can all produce a dry row
with a starter, and none of them should be able to inflate a pitch.
Work out whether a yeast selection is enough for a batch.
Liquid packs are assumed to hold 100 billion cells at manufacture (Wyeast and White Labs both quote ~100 billion) unless the selection says otherwise. Dry sachets are counted as
gramsPerPack × cellsPerGramBillion, defaulting to the commonly published 6 billion cells per gram when the catalog has no figure.A row that carries a starter
A saved starter is something the brewer has decided about this pitch, like the manufacture date, so this function reports the cells it produces. The steps are grown through starterGrowth: step one is pitched with that row's viable pack cells, each later step with all of the previous step's output, and the last step's total replaces the pack count for that row.
The yield isn't stored. It's recomputed every time on Braukaiser's model, which its author puts at ±15 % or worse. A starter can still leave a pitch short, and that's correct: a two-litre flask isn't automatically enough for a lager, so the shortfall check still runs.
Dry yeast is the exception: its starter is ignored. A starter uses up the sterols and unsaturated fatty acids dry yeast is packed with, so a dry row's starter is ignored and a note says so. See
dryYeastSachetsfor the full reasoning. We enforce this here and not in the document schema because every caller gets its cell count from this function. An imported file, a tool call or a row switched from liquid to dry can all produce a dry row with a starter, and none of them should be able to inflate a pitch.