Edit on GitHub

starplast.phenotype_screen

The arrayed imaging screen: what a parasite looks like when a gene is switched off.

Every other fitness measurement in this map is a growth rate. A gene whose loss stops the parasite growing gets a number, and the number says nothing about WHY. This screen is the other kind: 320 genes disrupted one per well, imaged, and each well given a phenotype by eye -- so a gene can fail at egress specifically rather than merely fail.

The category codes, which had to be worked out rather than read

The table gives each gene one or more codes -- E3, F1 A2, R2 -- and the archive carries no legend; it lives in a figure that ships as an image. Guessing what a letter means is exactly how a column ends up labelled with the wrong biology, so the mapping here is verified twice over:

  • The paper names its phenotype categories in three independent places and names the same four each time: replication, apicoplast, F-actin, and egress. Four categories, four letters, one initial each, one-to-one.
  • Then the check that does not depend on initials at all. The paper names exactly two genes as the egress mutants it went on to characterise -- CGP (TGGT1_240380) and SLF (TGGT1_208420) -- and both of them carry an E code in this table and nothing else does the work. If E meant anything other than egress, those two rows would not read that way. tests/test_phenotype_screen.py asserts it, so the mapping is a claim the suite can lose.

The SUBSCRIPT is not interpreted. E3 and E4 differ in something the paper does not define in any text available here -- severity, penetrance, or which replicate -- and a severity column invented out of a digit would be a number with no measurement behind it. Only the presence of a category is read.

Why absence means two different things, and why that had to be encoded

320 genes were screened and 99 got a phenotype. A gene in the library with no E was looked at and did not have an egress defect; a gene outside the library was never looked at. Those are opposite statements and both would arrive as an empty cell. So the screened set carries False and everything else stays missing -- without that, "not tested" would read as "tested and normal" across 7,800 genes.

What this does not cover

The screen's own figure legend calls it a screen for actin dynamics, apicoplast segregation and egress. Invasion appears in the abstract as a property of hits characterised afterwards, not as a category anything was scored into. So this fills the egress half of its slot and the detail says so; a per-gene invasion phenotype for Toxoplasma is still not published.

SOURCE = '41564_2022_1114_MOESM4_ESM.xlsx'
LIBRARY = ('Table 2 library gRNAs', 2)
CALLS = ('Table 3B', 4)
CATEGORIES = {'E': 'egress', 'F': 'actin', 'A': 'apicoplast', 'R': 'replication'}
SCORERS = ('inv1', 'inv2')
def categories(cell) -> set:

Every phenotype category named in one investigator's cell.

A cell holds one clone's calls, or several separated by / when the gene was picked more than once. The letter is what is read; the digit after it is deliberately ignored.

def screen( base: str, log=<built-in function print>, resolve=None) -> pandas.DataFrame:

One row per screened gene, with a boolean per phenotype category.