Titers for a serum in a group

Analyze titers for a serum assigned to a group, aggregating replicates which may be across multiple plates.

Processing group='human', serum='flu-seqneut-2026-VIDRL-212_post-vax'

Get all titers for this plate

Combine all the pickled neutcurve.CurveFits from plates for this serum into a single neutcurve.CurveFits:

Combining the curve fits for group='human', serum='flu-seqneut-2026-VIDRL-212_post-vax' from pickle_fits=['results/plates/plate42/curvefits.pickle']

Get the plate that each replicate was measured on. Each plate records this in its curvefits.csv, so it does not have to be parsed out of the replicate name (a plate_barcode), which would be ambiguous when one plate name is a prefix of another:

flu-seqneut-2026-VIDRL-212_post-vax was measured on 1 plate(s): ['plate42']

Indicate how we are calculating the titer:

Calculating with serum_titer_as='midpoint'

Get all the per-replicate fit params with the titers. We also convert the IC50 to NT50, and take inverse of midpoint to get it on same scale as NT50s:

flu-seqneut-2026-VIDRL-212_post-vax has titers for a total of 148 viruses

Correlate NT50s with midpoints of curves

Plot the correlation of the NT50s with the midpoint (this is an interactive plot, mouse over points for details). This plot can help you determine if you made the correct choice of serum_titer_as when choosing to use the midpoint or NT50 for the titer. For titers where they are well correlated it should not matter which you chose. But if there are titers far from the correlation line, you should look at those measurements and curves to make sure you made the correct choice of calculating the titer as the NT50 versus midpoint:

Plot median titers and determine if they pass QC

Get the median titers for each virus across replicates, then add these median titers to the per-replicate titers and calculate the fold-change in titer between each replicate and its median. Finally, for each virus indicate whether it passes the QC:

Using the following qc_thresholds={'min_replicates': 1, 'max_fold_change_from_median': 6, 'viruses_ignore_qc': []}

Now plot the per-replicate and median titers, indicating any viruses that failed QC. Note that potentially some of these titers may still be retained if the viruses in question are specified in viruses_ignore_qc of qc_thresholds.

Plot individual curves for any viruses failing QC

Plot individual curves for viruses failing QC. Note that potentially some of these titers may still be retained if the viruses in question are specified in viruses_ignore_qc of qc_thresholds.

Neutralization curves for the 0 viruses failing QC:

No curves fail QC

Get the viruses to drop for QC failures

Drop any viruses that fail QC and are not specified in viruses_ignore_qc of qc_thresholds.

Dropping 0 viruses for failing QC:

{}

Writing QC drops to results/sera/human_flu-seqneut-2026-VIDRL-212_post-vax/qc_drops.yml

Write the individual per-replicate titers to a file. These are all of the replicates that passed the QC applied when their plate was processed, and so are not filtered by the per-serum QC just applied above. Instead, the dropped_by_qc column indicates whether a replicate's virus was dropped by that per-serum QC, making this file a superset of the titers written below. Note that the per-serum QC drops a virus rather than an individual replicate, so this column has the same value for all replicates of a virus:

Writing per-replicate titers to results/sera/human_flu-seqneut-2026-VIDRL-212_post-vax/titers_per_replicate.csv

Plate-to-plate correlation of titers

If this serum was measured on more than one plate, compare the titers between each pair of plates to assess plate-to-plate reproducibility. The titer for a strain on a plate is the median over all of that plate's barcodes, all of which have already passed the per-plate QC applied when the plate was processed.

All strains are shown, colored by whether they are retained in the final titers or were dropped just above by the per-serum QC on replicate-to-replicate variation. Use the show strains dropdown at the bottom of the plots to show only the retained or only the dropped strains, and set it back to all to show all of them. Note that a strain listed in viruses_ignore_qc of qc_thresholds is colored as retained even if it fails the QC, because it is kept in the final titers; mouse over a point for the details. The Pearson correlation is reported both over all strains and over just the retained strains, and the dashed line is y = x.

flu-seqneut-2026-VIDRL-212_post-vax was measured on only one plate (plate42), so there is no plate-to-plate correlation to show.

Get and plot the neutralization curves for all retained viruses

First, get the CurveFits for just those retained viruses (dropping ones that fail QC), and plot:

image/svg+xml Matplotlib v3.11.1, https://matplotlib.org/ 0.0 0.2 0.4 0.6 0.8 1.0 A/Andalucia/PMC-00977/2025_H1N1 plate42-A/Andalucia/PMC-00977/2025_H1N1 A/Andalucia/PMC-01217/2025_H1N1 plate42-A/Andalucia/PMC-01217/2025_H1N1 A/Andalucia/PMC-01495/2025_H1N1 plate42-A/Andalucia/PMC-01495/2025_H1N1 A/Arizona/40/2026_H1N1 plate42-A/Arizona/40/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Astrakhan/RII-MH273373S/2025_H3N2 plate42-A/Astrakhan/RII-MH273373S/2025_H3N2 A/Asturias/232590913/2025_H1N1 plate42-A/Asturias/232590913/2025_H1N1 A/Badajoz/18738342/2026_H3N2 plate42-A/Badajoz/18738342/2026_H3N2 A/Badajoz/18811358/2026_H3N2 plate42-A/Badajoz/18811358/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Badajoz/18813527/2026_H3N2 plate42-A/Badajoz/18813527/2026_H3N2 A/Bangkok/P2390/2025_H3N2 plate42-A/Bangkok/P2390/2025_H3N2 A/Bangkok/P2391/2025_H3N2 plate42-A/Bangkok/P2391/2025_H3N2 A/Blaenavon/6687/2026_H3N2 plate42-A/Blaenavon/6687/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Bolivia/OR5702/2025_H3N2 plate42-A/Bolivia/OR5702/2025_H3N2 A/BritishColumbia/RV00022-26/2025_H1N1 plate42-A/BritishColumbia/RV00022-26/2025_H1N1 A/BritishColumbia/RV00279-26/2025_H3N2 plate42-A/BritishColumbia/RV00279-26/2025_H3N2 A/BritishColumbia/RV01350-26/2026_H1N1 plate42-A/BritishColumbia/RV01350-26/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/BritishColumbia/RV05508-25/2025_H1N1 plate42-A/BritishColumbia/RV05508-25/2025_H1N1 A/California/GKISBBBH79910/2026_H3N2 plate42-A/California/GKISBBBH79910/2026_H3N2 A/California/NIRC-IS-1019/2026_H1N1 plate42-A/California/NIRC-IS-1019/2026_H1N1 A/California/NIRC-IS-1059/2026_H3N2 plate42-A/California/NIRC-IS-1059/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/California/NIRC-IS-1067/2026_H3N2 plate42-A/California/NIRC-IS-1067/2026_H3N2 A/California/NIRC-IS-1356/2025_H1N1 plate42-A/California/NIRC-IS-1356/2025_H1N1 A/Castellon/VAHNSI_02_02400/2025_H3N2 plate42-A/Castellon/VAHNSI_02_02400/2025_H3N2 A/Colombia/1851/2024_H3N2 plate42-A/Colombia/1851/2024_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Colorado/218/2024_H1N1 plate42-A/Colorado/218/2024_H1N1 A/Connecticut/5/2026_H3N2 plate42-A/Connecticut/5/2026_H3N2 A/Croatia/10136RV/2023_H3N2 plate42-A/Croatia/10136RV/2023_H3N2 A/Darwin/1415/2025_H3N2 plate42-A/Darwin/1415/2025_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Darwin/1454/2025_H3N2 plate42-A/Darwin/1454/2025_H3N2 A/Denmark/3940/2025_H3N2 plate42-A/Denmark/3940/2025_H3N2 A/Denmark/4547/2025_H1N1 plate42-A/Denmark/4547/2025_H1N1 A/Denmark/4774/2025_H1N1 plate42-A/Denmark/4774/2025_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/District_Of_Columbia/27/2023_H3N2 plate42-A/District_Of_Columbia/27/2023_H3N2 A/Distrito_Federal/250106000728/2025_H3N2 plate42-A/Distrito_Federal/250106000728/2025_H3N2 A/England/1893256/2026_H1N1 plate42-A/England/1893256/2026_H1N1 A/Florida/ISC-1069/2026_H3N2 plate42-A/Florida/ISC-1069/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/France/ARA-HCL025195259501/2025_H1N1 plate42-A/France/ARA-HCL025195259501/2025_H1N1 A/France/ARA-HCL026031894402/2026_H3N2 plate42-A/France/ARA-HCL026031894402/2026_H3N2 A/France/GES-IPP00659/2026_H1N1 plate42-A/France/GES-IPP00659/2026_H1N1 A/France/GES-IPP01077/2026_H3N2 plate42-A/France/GES-IPP01077/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/France/HDF-IPP01550/2026_H3N2 plate42-A/France/HDF-IPP01550/2026_H3N2 A/France/HDF-RELAB-IPP00300/2026_H3N2 plate42-A/France/HDF-RELAB-IPP00300/2026_H3N2 A/France/HDF-RELAB-IPP00303/2026_H3N2 plate42-A/France/HDF-RELAB-IPP00303/2026_H3N2 A/France/HDF-RELAB-IPP07969/2025_H1N1 plate42-A/France/HDF-RELAB-IPP07969/2025_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/France/NAQ-HCL026010957001/2026_H3N2 plate42-A/France/NAQ-HCL026010957001/2026_H3N2 A/France/NAQ-HCL026046169102/2025_H1N1 plate42-A/France/NAQ-HCL026046169102/2025_H1N1 A/France/OCC-HCL026013263701/2026_H3N2 plate42-A/France/OCC-HCL026013263701/2026_H3N2 A/France/PAC-RELAB-HCL026021993801/2026_H3N2 plate42-A/France/PAC-RELAB-HCL026021993801/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Galicia/GA-CHUAC-451/2025_H3N2 plate42-A/Galicia/GA-CHUAC-451/2025_H3N2 A/Galicia/GA-CHUAC-612/2025_H1N1 plate42-A/Galicia/GA-CHUAC-612/2025_H1N1 A/Germany/LRMC_0104/2025_H3N2 plate42-A/Germany/LRMC_0104/2025_H3N2 A/Germany/LRMC_0113/2025_H3N2 plate42-A/Germany/LRMC_0113/2025_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Hawaii/70/2019_H1N1 plate42-A/Hawaii/70/2019_H1N1 A/Hawaii/ISC-1140/2025_H1N1 plate42-A/Hawaii/ISC-1140/2025_H1N1 A/Hessen/18/2026_H1N1 plate42-A/Hessen/18/2026_H1N1 A/Ireland/91576/2025_H3N2 plate42-A/Ireland/91576/2025_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Kentucky/80/2025_H1N1 plate42-A/Kentucky/80/2025_H1N1 A/Lisboa/216/2023_H3N2 plate42-A/Lisboa/216/2023_H3N2 A/Luxembourg/LNS9132577/2026_H3N2 plate42-A/Luxembourg/LNS9132577/2026_H3N2 A/Maine/25/2026_H1N1 plate42-A/Maine/25/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Malaysia/IMR/SARI/2406/2025_H3N2 plate42-A/Malaysia/IMR/SARI/2406/2025_H3N2 A/Massachusetts/18/2022_H3N2 plate42-A/Massachusetts/18/2022_H3N2 A/Massachusetts/ISC-1856/2025_H3N2 plate42-A/Massachusetts/ISC-1856/2025_H3N2 A/Mauritius/26000203/2026_H1N1 plate42-A/Mauritius/26000203/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Michigan/8/2026_H3N2 plate42-A/Michigan/8/2026_H3N2 A/Michigan/UM-10068071276/2025_H3N2 plate42-A/Michigan/UM-10068071276/2025_H3N2 A/Michigan/UM-10068134090/2025_H3N2 plate42-A/Michigan/UM-10068134090/2025_H3N2 A/Michigan/UM-10068449788/2025_H3N2 plate42-A/Michigan/UM-10068449788/2025_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Michigan/UM-10068456988/2025_H3N2 plate42-A/Michigan/UM-10068456988/2025_H3N2 A/Michigan/UM-10068747355/2026_H3N2 plate42-A/Michigan/UM-10068747355/2026_H3N2 A/MinasGerais/410/2026_H1N1 plate42-A/MinasGerais/410/2026_H1N1 A/MinasGerais/671/2026_H1N1 plate42-A/MinasGerais/671/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Mississippi/20/2026_H1N1 plate42-A/Mississippi/20/2026_H1N1 A/Missouri/11/2025_cell_H1N1 plate42-A/Missouri/11/2025_cell_H1N1 A/Missouri/11/2025_egg_H1N1 plate42-A/Missouri/11/2025_egg_H1N1 A/Missouri/NIRC-AV-1003/2025_H3N2 plate42-A/Missouri/NIRC-AV-1003/2025_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Montana/51/2025_H3N2 plate42-A/Montana/51/2025_H3N2 A/NakhonPhanom/P495/2026_H3N2 plate42-A/NakhonPhanom/P495/2026_H3N2 A/Navarra/260009/2025_H3N2 plate42-A/Navarra/260009/2025_H3N2 A/Nebraska/34/2026_H1N1 plate42-A/Nebraska/34/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Netherlands/10008/2026_H1N1 plate42-A/Netherlands/10008/2026_H1N1 A/Netherlands/2398/2025_H1N1 plate42-A/Netherlands/2398/2025_H1N1 A/Netherlands/543/2026_H1N1 plate42-A/Netherlands/543/2026_H1N1 A/Netherlands/864/2026_H1N1 plate42-A/Netherlands/864/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Netherlands/888/2026_H3N2 plate42-A/Netherlands/888/2026_H3N2 A/Netherlands/968/2026_H3N2 plate42-A/Netherlands/968/2026_H3N2 A/NewBrunswick/NBPHLFLUA10B-MM00057R/2026_H1N1 plate42-A/NewBrunswick/NBPHLFLUA10B-MM00057R/2026_H1N1 A/NewYork/NIRC-IS-1086/2026_H3N2 plate42-A/NewYork/NIRC-IS-1086/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/NordrheinWestfalen/54/2026_H3N2 plate42-A/NordrheinWestfalen/54/2026_H3N2 A/NordrheinWestfalen/96/2026_H1N1 plate42-A/NordrheinWestfalen/96/2026_H1N1 A/Norway/9556/2025_H1N1 plate42-A/Norway/9556/2025_H1N1 A/NovaScotia/25-365-06099/2025_H3N2 plate42-A/NovaScotia/25-365-06099/2025_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Ohio/259/2024_H1N1 plate42-A/Ohio/259/2024_H1N1 A/Ontario/PHL202550193/2025_H3N2 plate42-A/Ontario/PHL202550193/2025_H3N2 A/Oregon/81/2025_H3N2 plate42-A/Oregon/81/2025_H3N2 A/PaisVasco/70369726/2026_H1N1 plate42-A/PaisVasco/70369726/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Parana/416133590/2026_H3N2 plate42-A/Parana/416133590/2026_H3N2 A/Peru/ANC-INS-062/2026_H3N2 plate42-A/Peru/ANC-INS-062/2026_H3N2 A/Rhode_Island/11/2026_H1N1 plate42-A/Rhode_Island/11/2026_H1N1 A/RiodeJaneiro/331/2026_H3N2 plate42-A/RiodeJaneiro/331/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Romania/612042/2026_H3N2 plate42-A/Romania/612042/2026_H3N2 A/SantaCatarina/508/2026_H3N2 plate42-A/SantaCatarina/508/2026_H3N2 A/Saskatchewan/SKFLU477299/2025_H3N2 plate42-A/Saskatchewan/SKFLU477299/2025_H3N2 A/Saskatchewan/SKFLU477727/2025_H3N2 plate42-A/Saskatchewan/SKFLU477727/2025_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Saskatchewan/SKFLU490586/2026_H1N1 plate42-A/Saskatchewan/SKFLU490586/2026_H1N1 A/Singapore/GP20238/2024_H3N2 plate42-A/Singapore/GP20238/2024_H3N2 A/Singapore/KK2768/2025_H1N1 plate42-A/Singapore/KK2768/2025_H1N1 A/Singapore/MOH0547/2024_H1N1 plate42-A/Singapore/MOH0547/2024_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Singapore/NTF0577/2025_H3N2 plate42-A/Singapore/NTF0577/2025_H3N2 A/Singapore/SAR8915/2025_H3N2 plate42-A/Singapore/SAR8915/2025_H3N2 A/SouthAfrica/NHLS-SU-CERI-C075557/2026_H1N1 plate42-A/SouthAfrica/NHLS-SU-CERI-C075557/2026_H1N1 A/SouthAfrica/NICD-R01647/2026_H1N1 plate42-A/SouthAfrica/NICD-R01647/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/SouthAfrica/NICD-R01668/2026_H1N1 plate42-A/SouthAfrica/NICD-R01668/2026_H1N1 A/SouthAfrica/PATH-CERI-C073358/2025_H1N1 plate42-A/SouthAfrica/PATH-CERI-C073358/2025_H1N1 A/SouthAfrica/PATH-CERI-C073366/2025_H1N1 plate42-A/SouthAfrica/PATH-CERI-C073366/2025_H1N1 A/SouthAfrica/PATH-CERI-C075119/2026_H1N1 plate42-A/SouthAfrica/PATH-CERI-C075119/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/SouthAustralia/2605715552/2026_H3N2 plate42-A/SouthAustralia/2605715552/2026_H3N2 A/SouthCarolina/USAFSAM-17046/2026_H3N2 plate42-A/SouthCarolina/USAFSAM-17046/2026_H3N2 A/South_Australia/2523812314/2025_H3N2 plate42-A/South_Australia/2523812314/2025_H3N2 A/South_Australia/2527213276/2025_H3N2 plate42-A/South_Australia/2527213276/2025_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/StPetersburg/RII-25-2042S/2025_H3N2 plate42-A/StPetersburg/RII-25-2042S/2025_H3N2 A/StPetersburg/RII-25-2321S/2025_H3N2 plate42-A/StPetersburg/RII-25-2321S/2025_H3N2 A/StPetersburg/RII-25-2506S/2026_H3N2 plate42-A/StPetersburg/RII-25-2506S/2026_H3N2 A/StPetersburg/RII-25-2600S/2026_H3N2 plate42-A/StPetersburg/RII-25-2600S/2026_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Switzerland/UN-SNRCI-HUG-053/2025_H1N1 plate42-A/Switzerland/UN-SNRCI-HUG-053/2025_H1N1 A/Sydney/1359/2024_H3N2 plate42-A/Sydney/1359/2024_H3N2 A/Sydney/50/2026_H1N1 plate42-A/Sydney/50/2026_H1N1 A/Texas/29/2026_H1N1 plate42-A/Texas/29/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Thailand/8/2022_H3N2 plate42-A/Thailand/8/2022_H3N2 A/Thuringen/16/2026_H3N2 plate42-A/Thuringen/16/2026_H3N2 A/Thuringen/39/2026_H3N2 plate42-A/Thuringen/39/2026_H3N2 A/Tokyo/EIS11-277/2024_H1N1 plate42-A/Tokyo/EIS11-277/2024_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Trieste/257/2025_H3N2 plate42-A/Trieste/257/2025_H3N2 A/Trieste/380/2026_H3N2 plate42-A/Trieste/380/2026_H3N2 A/Ukraine/5214/2026_H1N1 plate42-A/Ukraine/5214/2026_H1N1 A/Uppsala/SE26-01293/2026_H1N1 plate42-A/Uppsala/SE26-01293/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 A/Valencia/VAHNSI_09_02564/2025_H1N1 plate42-A/Valencia/VAHNSI_09_02564/2025_H1N1 A/Victoria/2948/2025_H3N2 plate42-A/Victoria/2948/2025_H3N2 A/Victoria/4897/2022_IVR-238_H1N1 plate42-A/Victoria/4897/2022_IVR-238_H1N1 A/Vietnam/F7324/2024_H3N2 plate42-A/Vietnam/F7324/2024_H3N2 0.0 0.2 0.4 0.6 0.8 1.0 A/Vietnam/PF125413/2025_H1N1 plate42-A/Vietnam/PF125413/2025_H1N1 A/Vietnam/PF126009/2026_H1N1 plate42-A/Vietnam/PF126009/2026_H1N1 A/Virginia/82/2025_H1N1 plate42-A/Virginia/82/2025_H1N1 A/Wisconsin/588/2019_H1N1 plate42-A/Wisconsin/588/2019_H1N1 1 0 4 1 0 3 1 0 2 0.0 0.2 0.4 0.6 0.8 1.0 A/Wisconsin/67/2022_H1N1 plate42-A/Wisconsin/67/2022_H1N1 1 0 4 1 0 3 1 0 2 A/Zacapa/FLU-012/2025_H1N1 plate42-A/Zacapa/FLU-012/2025_H1N1 1 0 4 1 0 3 1 0 2 A/Zambia/6-NIC-014/2026_H1N1 plate42-A/Zambia/6-NIC-014/2026_H1N1 1 0 4 1 0 3 1 0 2 A/Zambia/7-NIC-313/2026_H1N1 plate42-A/Zambia/7-NIC-313/2026_H1N1 0.0 0.2 0.4 0.6 0.8 1.0 concentration 0.0 0.2 0.4 0.6 0.8 1.0 fraction infectivity neutralization curves for retained viruses for human flu-seqneut-2026-VIDRL-212_post-vax

Saving plot of curves to results/sera/human_flu-seqneut-2026-VIDRL-212_post-vax/curves.pdf

Save the CurveFits to a pickle file:

Writing curve fits to results/sera/human_flu-seqneut-2026-VIDRL-212_post-vax/curvefits.pickle

Write the titers (excluding QC dropped viruses) to a CSV:

Writing titers to results/sera/human_flu-seqneut-2026-VIDRL-212_post-vax/titers.csv