######## snakemake preamble start (automatically inserted, do not edit) ########
import sys;sys.path.extend(['/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/lib/python3.13/site-packages', '/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025/seqneut-pipeline', '/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025', '/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/bin', '/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/lib/python3.13', '/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/lib/python3.13/lib-dynload', '/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/lib/python3.13/site-packages', '/home/jbloom/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpfro_n8p6/file/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025/seqneut-pipeline/notebooks', '/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025/seqneut-pipeline/notebooks']);import pickle;from snakemake import script;script.snakemake = pickle.loads(b'\x80\x04\x954\xeb\x00\x00\x00\x00\x00\x00\x8c\x10snakemake.script\x94\x8c\tSnakemake\x94\x93\x94)\x81\x94}\x94(\x8c\x05input\x94\x8c\x0csnakemake.io\x94\x8c\nInputFiles\x94\x93\x94)\x81\x94(\x8c-results/barcode_counts/plate1-2_UWMC-1_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-1_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-1_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-1_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-1_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-1_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-1_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-1_13619.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-2_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-2_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-2_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-2_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-2_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-2_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-2_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-2_13619.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-3_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-3_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-3_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-3_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-3_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-3_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-3_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-3_13619.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-4_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-4_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-4_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-4_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-4_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-4_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-4_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-4_13619.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-5_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-5_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-5_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-5_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-5_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-5_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-5_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-5_13619.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-6_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-6_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-6_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-6_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-6_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-6_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-6_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-6_13619.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-7_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-7_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-7_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-7_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-7_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-7_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-7_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-7_13619.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-8_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-8_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-8_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-8_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-8_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-8_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-8_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-8_13619.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-9_40.csv\x94\x8c-results/barcode_counts/plate1-2_UWMC-9_92.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-9_212.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-9_487.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-9_1119.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-9_2575.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-9_5921.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-9_13619.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-10_40.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-10_92.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-10_212.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-10_487.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-10_1119.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-10_2575.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-10_5921.csv\x94\x8c1results/barcode_counts/plate1-2_UWMC-10_13619.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-11_40.csv\x94\x8c.results/barcode_counts/plate1-2_UWMC-11_92.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-11_212.csv\x94\x8c/results/barcode_counts/plate1-2_UWMC-11_487.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-11_1119.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-11_2575.csv\x94\x8c0results/barcode_counts/plate1-2_UWMC-11_5921.csv\x94\x8c1results/barcode_counts/plate1-2_UWMC-11_13619.csv\x94\x8c*results/barcode_counts/plate1-2_none-1.csv\x94\x8c*results/barcode_counts/plate1-2_none-2.csv\x94\x8c*results/barcode_counts/plate1-2_none-3.csv\x94\x8c*results/barcode_counts/plate1-2_none-4.csv\x94\x8c*results/barcode_counts/plate1-2_none-5.csv\x94\x8c*results/barcode_counts/plate1-2_none-6.csv\x94\x8c*results/barcode_counts/plate1-2_none-7.csv\x94\x8c*results/barcode_counts/plate1-2_none-8.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-1_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-1_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-1_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-1_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-1_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-1_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-1_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-1_13619.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-2_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-2_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-2_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-2_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-2_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-2_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-2_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-2_13619.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-3_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-3_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-3_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-3_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-3_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-3_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-3_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-3_13619.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-4_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-4_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-4_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-4_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-4_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-4_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-4_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-4_13619.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-5_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-5_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-5_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-5_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-5_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-5_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-5_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-5_13619.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-6_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-6_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-6_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-6_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-6_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-6_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-6_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-6_13619.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-7_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-7_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-7_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-7_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-7_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-7_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-7_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-7_13619.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-8_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-8_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-8_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-8_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-8_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-8_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-8_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-8_13619.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-9_40.csv\x94\x8c,results/barcode_fates/plate1-2_UWMC-9_92.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-9_212.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-9_487.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-9_1119.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-9_2575.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-9_5921.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-9_13619.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-10_40.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-10_92.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-10_212.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-10_487.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-10_1119.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-10_2575.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-10_5921.csv\x94\x8c0results/barcode_fates/plate1-2_UWMC-10_13619.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-11_40.csv\x94\x8c-results/barcode_fates/plate1-2_UWMC-11_92.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-11_212.csv\x94\x8c.results/barcode_fates/plate1-2_UWMC-11_487.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-11_1119.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-11_2575.csv\x94\x8c/results/barcode_fates/plate1-2_UWMC-11_5921.csv\x94\x8c0results/barcode_fates/plate1-2_UWMC-11_13619.csv\x94\x8c)results/barcode_fates/plate1-2_none-1.csv\x94\x8c)results/barcode_fates/plate1-2_none-2.csv\x94\x8c)results/barcode_fates/plate1-2_none-3.csv\x94\x8c)results/barcode_fates/plate1-2_none-4.csv\x94\x8c)results/barcode_fates/plate1-2_none-5.csv\x94\x8c)results/barcode_fates/plate1-2_none-6.csv\x94\x8c)results/barcode_fates/plate1-2_none-7.csv\x94\x8c)results/barcode_fates/plate1-2_none-8.csv\x94\x8c\xbb/home/jbloom/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpfro_n8p6/file/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025/seqneut-pipeline/notebook_funcs.py\x94e}\x94(\x8c\x06_names\x94}\x94(\x8c\ncount_csvs\x94K\x00K`\x86\x94\x8c\tfate_csvs\x94K`K\xc0\x86\x94\x8c\x0enotebook_funcs\x94K\xc0N\x86\x94u\x8c\x12_allowed_overrides\x94]\x94(\x8c\x05index\x94\x8c\x04sort\x94eh\xd6h\x06\x8c\x0eAttributeGuard\x94\x93\x94)\x81\x94}\x94\x8c\x04name\x94h\xd6sbh\xd7h\xd9)\x81\x94}\x94h\xdch\xd7sbh\xceh\x06\x8c\tNamedlist\x94\x93\x94)\x81\x94(h\nh\x0bh\x0ch\rh\x0eh\x0fh\x10h\x11h\x12h\x13h\x14h\x15h\x16h\x17h\x18h\x19h\x1ah\x1bh\x1ch\x1dh\x1eh\x1fh h!h"h#h$h%h&h\'h(h)h*h+h,h-h.h/h0h1h2h3h4h5h6h7h8h9h:h;h<h=h>h?h@hAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh[h\\h]h^h_h`hahbhchdhehfhghhhie}\x94(h\xcc}\x94h\xd4]\x94(h\xd6h\xd7eh\xd6h\xd9)\x81\x94}\x94h\xdch\xd6sbh\xd7h\xd9)\x81\x94}\x94h\xdch\xd7sbubh\xd0h\xe0)\x81\x94(hjhkhlhmhnhohphqhrhshthuhvhwhxhyhzh{h|h}h~h\x7fh\x80h\x81h\x82h\x83h\x84h\x85h\x86h\x87h\x88h\x89h\x8ah\x8bh\x8ch\x8dh\x8eh\x8fh\x90h\x91h\x92h\x93h\x94h\x95h\x96h\x97h\x98h\x99h\x9ah\x9bh\x9ch\x9dh\x9eh\x9fh\xa0h\xa1h\xa2h\xa3h\xa4h\xa5h\xa6h\xa7h\xa8h\xa9h\xaah\xabh\xach\xadh\xaeh\xafh\xb0h\xb1h\xb2h\xb3h\xb4h\xb5h\xb6h\xb7h\xb8h\xb9h\xbah\xbbh\xbch\xbdh\xbeh\xbfh\xc0h\xc1h\xc2h\xc3h\xc4h\xc5h\xc6h\xc7h\xc8h\xc9e}\x94(h\xcc}\x94h\xd4]\x94(h\xd6h\xd7eh\xd6h\xd9)\x81\x94}\x94h\xdch\xd6sbh\xd7h\xd9)\x81\x94}\x94h\xdch\xd7sbubh\xd2h\xcaub\x8c\x06output\x94h\x06\x8c\x0bOutputFiles\x94\x93\x94)\x81\x94(\x8c$results/plates/plate1-2/qc_drops.yml\x94\x8c,results/plates/plate1-2/frac_infectivity.csv\x94\x8c%results/plates/plate1-2/curvefits.csv\x94\x8c(results/plates/plate1-2/curvefits.pickle\x94e}\x94(h\xcc}\x94(\x8c\x08qc_drops\x94K\x00N\x86\x94\x8c\x14frac_infectivity_csv\x94K\x01N\x86\x94\x8c\x08fits_csv\x94K\x02N\x86\x94\x8c\x0bfits_pickle\x94K\x03N\x86\x94uh\xd4]\x94(h\xd6h\xd7eh\xd6h\xd9)\x81\x94}\x94h\xdch\xd6sbh\xd7h\xd9)\x81\x94}\x94h\xdch\xd7sbh\xfbh\xf5h\xfdh\xf6h\xffh\xf7j\x01\x01\x00\x00h\xf8ub\x8c\r_params_store\x94h\x06\x8c\x06Params\x94\x93\x94)\x81\x94(}\x94(\x8c\x07barcode\x94}\x94(K\x00\x8c\x10AAACCCATAAGACCCC\x94K\x01\x8c\x10AAAGACCTTTAACTCT\x94K\x02\x8c\x10AAAGCTCTTTTCGTTC\x94K\x03\x8c\x10AAAGGCGCGCCTTCAA\x94K\x04\x8c\x10AAAGTAGCAGAGGATT\x94K\x05\x8c\x10AAATTCACAATATCCA\x94K\x06\x8c\x10AACACGTAGAACCGCC\x94K\x07\x8c\x10AACAGAAGTCCATGTA\x94K\x08\x8c\x10AACCACCCCAGAGATG\x94K\t\x8c\x10AACCGTACCGCGTTTA\x94K\n\x8c\x10AACCTACGAGACGTAA\x94K\x0b\x8c\x10AACGGTTCCGACTAAG\x94K\x0c\x8c\x10AACTGCGTTCATCGAT\x94K\r\x8c\x10AACTTCCCTGACTGCT\x94K\x0e\x8c\x10AACTTCCGTCGCCTGA\x94K\x0f\x8c\x10AAGAAGACTTTGTGAT\x94K\x10\x8c\x10AAGAAGCTATAGAAGT\x94K\x11\x8c\x10AAGATTGATTGAAGTT\x94K\x12\x8c\x10AAGCCCAGCGGGTGAT\x94K\x13\x8c\x10AAGCGGTGATGTGATT\x94K\x14\x8c\x10AAGGGGCCTCATAATG\x94K\x15\x8c\x10AAGGTCCCTATGTAAT\x94K\x16\x8c\x10AAGTATTGCTACACAT\x94K\x17\x8c\x10AAGTTAAGAGAAAGTT\x94K\x18\x8c\x10AAGTTAGTAGACCCAC\x94K\x19\x8c\x10AATCGCTGGCACCCGT\x94K\x1a\x8c\x10AATGAAACAATCGAAC\x94K\x1b\x8c\x10AATGCGAGCATGTCAA\x94K\x1c\x8c\x10AATTCGTGAGTACTAG\x94K\x1d\x8c\x10ACAAAGTCTCGAGAAG\x94K\x1e\x8c\x10ACAAGATTCGGGGGAC\x94K\x1f\x8c\x10ACAATCTGAACCATAC\x94K \x8c\x10ACACGGGTTGGCTGTA\x94K!\x8c\x10ACAGTACGATCTACGC\x94K"\x8c\x10ACAGTCCACCATTGAG\x94K#\x8c\x10ACATTTTCCAATAGGT\x94K$\x8c\x10ACCAGCAATGAGTTGT\x94K%\x8c\x10ACCCCCGGAGCTTGGC\x94K&\x8c\x10ACCGAATGAATCATCC\x94K\'\x8c\x10ACCGATTCACGAATAA\x94K(\x8c\x10ACCGTTGTACACACCA\x94K)\x8c\x10ACGCAAATAGACCGAA\x94K*\x8c\x10ACGGGGATTGGCTGTT\x94K+\x8c\x10ACGTATGATTTTCGAG\x94K,\x8c\x10ACGTCCATTAAGATCA\x94K-\x8c\x10ACGTGTCTCCGAGCAA\x94K.\x8c\x10ACTACGAGGCTACGTA\x94K/\x8c\x10ACTCTGGCTCGCTAAT\x94K0\x8c\x10ACTGTCTAGAAATTTT\x94K1\x8c\x10AGAAAATCTCAGATAC\x94K2\x8c\x10AGACCATCGCACCCAA\x94K3\x8c\x10AGACCGCCAGTTTCGT\x94K4\x8c\x10AGAGCTAAAAAGAGGA\x94K5\x8c\x10AGATCCACCCTATAGT\x94K6\x8c\x10AGATCCCAGGTCCTTT\x94K7\x8c\x10AGCATAGGGATATGTG\x94K8\x8c\x10AGCATCTAACAGATAG\x94K9\x8c\x10AGCCCATGCTGGGGAT\x94K:\x8c\x10AGCGACATCGCCCTTT\x94K;\x8c\x10AGCTCCTGGGGTATCA\x94K<\x8c\x10AGCTGAATTAAGTATG\x94K=\x8c\x10AGGAAAGAAACTGGAG\x94K>\x8c\x10AGGACTATAGTTGGCA\x94K?\x8c\x10AGGAGTATGAAGAGCG\x94K@\x8c\x10AGGCCCGTAAGGACTA\x94KA\x8c\x10AGGTTCAGACTCTTGC\x94KB\x8c\x10AGTAAACATGCATTGG\x94KC\x8c\x10AGTATTTGCGCTTCAA\x94KD\x8c\x10AGTCCTATCCTCAAAT\x94KE\x8c\x10AGTCGTTTAGATAGTT\x94KF\x8c\x10AGTGTTGAATAGGCGA\x94KG\x8c\x10AGTGTTGGCTTGGTTA\x94KH\x8c\x10AGTTCCATAGGCATGG\x94KI\x8c\x10AGTTGGGGTCTCCCTT\x94KJ\x8c\x10AGTTTTTATAACTTGC\x94KK\x8c\x10ATAACGTTTGTGCAAA\x94KL\x8c\x10ATAACTGAGGGCATTG\x94KM\x8c\x10ATACACGAGGTTGTGA\x94KN\x8c\x10ATACACGCATGTGCCA\x94KO\x8c\x10ATAGAAAATTATCCGC\x94KP\x8c\x10ATAGAATCGCAAATTA\x94KQ\x8c\x10ATAGGATATATGGCTG\x94KR\x8c\x10ATATAAAAAACTTAGT\x94KS\x8c\x10ATCAGGATAATCGCGC\x94KT\x8c\x10ATCCGATTTAAAGGCA\x94KU\x8c\x10ATGGCCCACGGGCATA\x94KV\x8c\x10ATGGGATTGGAGAAAC\x94KW\x8c\x10ATGGTTTTACGTCCAT\x94KX\x8c\x10ATTAGATTATAACGTA\x94KY\x8c\x10ATTAGGGCTACGTGAG\x94KZ\x8c\x10ATTATCATATCTAATA\x94K[\x8c\x10ATTCCGAATGGGGTAG\x94K\\\x8c\x10ATTTAAATTCGAGGAC\x94K]\x8c\x10ATTTACTCATTATACG\x94K^\x8c\x10ATTTTTCTATGGCTAC\x94K_\x8c\x10CAAAAGCAGCACGATA\x94K`\x8c\x10CAAAATCTACGGCGAC\x94Ka\x8c\x10CAAATGCTGCATTAGG\x94Kb\x8c\x10CAATTCGCCGTTCCCC\x94Kc\x8c\x10CACAGACAATAAAAAA\x94Kd\x8c\x10CACCAATCTTCGAACT\x94Ke\x8c\x10CACCATCAGCACCTAG\x94Kf\x8c\x10CACCGCGCCGAGCACC\x94Kg\x8c\x10CACCTAGGATCGCACT\x94Kh\x8c\x10CACGGCCGGCGAACTC\x94Ki\x8c\x10CACGGGCTAATGTCTC\x94Kj\x8c\x10CACTAGATGTACAGTC\x94Kk\x8c\x10CAGAACCTCGTTGTCT\x94Kl\x8c\x10CAGATAGTGATGAACA\x94Km\x8c\x10CAGGCTCTAGAGCTCT\x94Kn\x8c\x10CATAAAAGACTGTATA\x94Ko\x8c\x10CATGGGAATTGCCACT\x94Kp\x8c\x10CATGTGGAGCCCAACA\x94Kq\x8c\x10CATTGAGACGCGCAAG\x94Kr\x8c\x10CATTTCTGATGAATTG\x94Ks\x8c\x10CCAACACAAAAAATTA\x94Kt\x8c\x10CCAAGCTTGGCGCATC\x94Ku\x8c\x10CCCCCGCTGTTTAAAA\x94Kv\x8c\x10CCCCTCCTCTAAAGTT\x94Kw\x8c\x10CCCTATGAAATAAGCT\x94Kx\x8c\x10CCCTGCGCGGCTCGGG\x94Ky\x8c\x10CCCTTTACGGATCTCT\x94Kz\x8c\x10CCGCATTAGCGGGAGG\x94K{\x8c\x10CCGCGCACGTTTAGAG\x94K|\x8c\x10CCGGATAAATCAGAAC\x94K}\x8c\x10CCTGGGTTAAGTTGTG\x94K~\x8c\x10CCTTGATGCATTCCCG\x94K\x7f\x8c\x10CCTTTCTCAAAACATA\x94K\x80\x8c\x10CGAAAACATTACAAAT\x94K\x81\x8c\x10CGAAACACGTCCCAGT\x94K\x82\x8c\x10CGAACCGCAGACACGT\x94K\x83\x8c\x10CGACTCCACGGACGCC\x94K\x84\x8c\x10CGATCTTTACGAAAAA\x94K\x85\x8c\x10CGCACTTTACGAGACA\x94K\x86\x8c\x10CGCAGCATTGGTCGCC\x94K\x87\x8c\x10CGCGACACCCTTCCGG\x94K\x88\x8c\x10CGGACCCTAGATGGTA\x94K\x89\x8c\x10CGGCCAGGGAATCAAA\x94K\x8a\x8c\x10CGGGAAATGTAAATGA\x94K\x8b\x8c\x10CGGGAACATACATAAC\x94K\x8c\x8c\x10CGGGAATCTCCCATAC\x94K\x8d\x8c\x10CGGGGACAAGATTGTA\x94K\x8e\x8c\x10CGGTCGGGACTCATCT\x94K\x8f\x8c\x10CGTACAGTGTAATCGA\x94K\x90\x8c\x10CGTACGTATGTCCCAG\x94K\x91\x8c\x10CGTGACCCCCTCCAAC\x94K\x92\x8c\x10CGTGTACCCTTCAGCA\x94K\x93\x8c\x10CGTTAACGGCCTATCC\x94K\x94\x8c\x10CGTTCAGCGATAACGG\x94K\x95\x8c\x10CGTTTTTGGTTCGAGG\x94K\x96\x8c\x10CTAATTTAAGTATCAA\x94K\x97\x8c\x10CTAGCACAGCGTAGGC\x94K\x98\x8c\x10CTATAAACCGTTTGTA\x94K\x99\x8c\x10CTATATTGCCCGGAAG\x94K\x9a\x8c\x10CTATCTTAATCTACAG\x94K\x9b\x8c\x10CTATTTAACAGACGTA\x94K\x9c\x8c\x10CTCAAATAATTGGCGC\x94K\x9d\x8c\x10CTCAATGTCGTAGGAT\x94K\x9e\x8c\x10CTCCTAGGGGACGATT\x94K\x9f\x8c\x10CTCTTACGCTCCTACG\x94K\xa0\x8c\x10CTGAACTTATCTGTGG\x94K\xa1\x8c\x10CTGAACTTGTCGATAT\x94K\xa2\x8c\x10CTGAGCTGCCAATAAG\x94K\xa3\x8c\x10CTGAGGGATTCAACTC\x94K\xa4\x8c\x10CTGGAGGCCTGGCCCC\x94K\xa5\x8c\x10CTGTACCTGCAGTTGA\x94K\xa6\x8c\x10CTTACAGAATACTAGA\x94K\xa7\x8c\x10CTTACTGCGCGAGAGT\x94K\xa8\x8c\x10CTTAGGTATTATATGC\x94K\xa9\x8c\x10CTTCGGCTCTTGATTA\x94K\xaa\x8c\x10CTTTTCTAGTACGCTT\x94K\xab\x8c\x10GAAAGCCCCGTGCAAT\x94K\xac\x8c\x10GAAAGTCCCTATGATG\x94K\xad\x8c\x10GAAATCCCCAAATAAC\x94K\xae\x8c\x10GAAGAAACTATAACCA\x94K\xaf\x8c\x10GAAGTACGCTGAATGA\x94K\xb0\x8c\x10GAAGTGCGTATTGAGT\x94K\xb1\x8c\x10GAAGTGCTGCTGAAGT\x94K\xb2\x8c\x10GAATAATAGAACAGAG\x94K\xb3\x8c\x10GACAAAAGGGACATAT\x94K\xb4\x8c\x10GACCCCTTGTAAGATG\x94K\xb5\x8c\x10GACGGGATGGGCACGT\x94K\xb6\x8c\x10GAGAGCTGCAGAAGCG\x94K\xb7\x8c\x10GAGCTTGCTATGGATC\x94K\xb8\x8c\x10GAGGGGATACGTCACC\x94K\xb9\x8c\x10GAGGGGTAGAGATACG\x94K\xba\x8c\x10GATCACGCAGAAAAAG\x94K\xbb\x8c\x10GATCGCCACTGATAAG\x94K\xbc\x8c\x10GATCGCCATCGACTTC\x94K\xbd\x8c\x10GATCTTGGGGAGAGTC\x94K\xbe\x8c\x10GATTCAGATGCCCACC\x94K\xbf\x8c\x10GCAAACAGTGTAGTTG\x94K\xc0\x8c\x10GCAACGAGGTGTAACC\x94K\xc1\x8c\x10GCAGCGTGCCGGTCAT\x94K\xc2\x8c\x10GCATCCTCAACTCCTA\x94K\xc3\x8c\x10GCATGGAACTAACTCC\x94K\xc4\x8c\x10GCCAGCTCGTATCCCT\x94K\xc5\x8c\x10GCCATTTACTGAAGGG\x94K\xc6\x8c\x10GCCGCTGCGGCGTGTG\x94K\xc7\x8c\x10GCCGGCGTTAGTGTCA\x94K\xc8\x8c\x10GCCTTTGCGCGCAGTC\x94K\xc9\x8c\x10GCGAAGTTTCATAGCG\x94K\xca\x8c\x10GGTTAACTTTGGAAGC\x94K\xcb\x8c\x10GTAAGCAAAGTTGACC\x94K\xcc\x8c\x10GTAAGCTTCATGGAGT\x94K\xcd\x8c\x10GTAATTCGCATGCGGA\x94K\xce\x8c\x10GTACCCAGTTCCTGCG\x94K\xcf\x8c\x10GTAGAACTGCGGCCCC\x94K\xd0\x8c\x10GTAGATACTAGGACCA\x94K\xd1\x8c\x10GTCAAGTTACGGATGG\x94K\xd2\x8c\x10GTCCGTCAGCATAAAC\x94K\xd3\x8c\x10GTCGCATCCTGGAATG\x94K\xd4\x8c\x10GTCGCCGCTAATCCGA\x94K\xd5\x8c\x10GTGAGCGAGAAAAGCA\x94K\xd6\x8c\x10GTGCATCCTAGTGACG\x94K\xd7\x8c\x10GTGCGATTGTCCGGAA\x94K\xd8\x8c\x10GTGGTATCAAGCCGGG\x94K\xd9\x8c\x10GTTATTATGACTTCAT\x94K\xda\x8c\x10GTTGCTCCGACACGCC\x94K\xdb\x8c\x10TAAAAAGCCTCCATGA\x94K\xdc\x8c\x10TAACGTGATTTCTCGA\x94K\xdd\x8c\x10TAATAAGCCAGCAAGA\x94K\xde\x8c\x10TACAAGAGAGGGGTCC\x94K\xdf\x8c\x10TACATACCGACGCAGT\x94K\xe0\x8c\x10TACCAATGTCATTTGA\x94K\xe1\x8c\x10TACCTGCTGCGGAACG\x94K\xe2\x8c\x10TACTAATGCCGTTGTC\x94K\xe3\x8c\x10TACTAGCAATAAAATC\x94K\xe4\x8c\x10TACTGATAACCCTGCG\x94K\xe5\x8c\x10TAGCATTGTCGGAAAG\x94K\xe6\x8c\x10TAGCTGATAGTAACTC\x94K\xe7\x8c\x10TATATTAGTAACATAA\x94K\xe8\x8c\x10TATCCAAGGGACGGAC\x94K\xe9\x8c\x10TATGTCGTATCCACAG\x94K\xea\x8c\x10TATTAAGAGAAGTGCG\x94K\xeb\x8c\x10TATTCCTAACTAGCGA\x94K\xec\x8c\x10TCAATCGGGGGCTAAA\x94K\xed\x8c\x10TCACGACTCGACTAAC\x94K\xee\x8c\x10TCATGGGTGTACGAGA\x94K\xef\x8c\x10TCCACACCCCTAGCTA\x94K\xf0\x8c\x10TCCAGCGCGGTAAGAG\x94K\xf1\x8c\x10TCCCCGTGGTTTGACA\x94K\xf2\x8c\x10TCGAACGAAGTAGGAG\x94K\xf3\x8c\x10TCGAGTTAATATGCGC\x94K\xf4\x8c\x10TCGATTACTAGCCGGA\x94K\xf5\x8c\x10TCGCTTCAACTAAAAA\x94K\xf6\x8c\x10TCGTCCGTTGGGAACT\x94K\xf7\x8c\x10TCGTCGCACTACTGCT\x94K\xf8\x8c\x10TCTAACTCTCGCGGCA\x94K\xf9\x8c\x10TCTCAGCTCTTAGCCG\x94K\xfa\x8c\x10TCTGGAAACGATCCCC\x94K\xfb\x8c\x10TCTTAGAGTGAACGAT\x94K\xfc\x8c\x10TCTTAGTCCTCGTATG\x94K\xfd\x8c\x10TCTTATTAGGCGGCAT\x94K\xfe\x8c\x10TCTTGACATAGCGATG\x94K\xff\x8c\x10TCTTTACCACTGCATC\x94M\x00\x01\x8c\x10TGACAACAATACAAAT\x94M\x01\x01\x8c\x10TGAGTTCATAGCTCCA\x94M\x02\x01\x8c\x10TGATCTGTGACATTGC\x94M\x03\x01\x8c\x10TGATCTTTTACATTTA\x94M\x04\x01\x8c\x10TGCAGTGGTATACATA\x94M\x05\x01\x8c\x10TGCGGTGGTCGATCCG\x94M\x06\x01\x8c\x10TGCTATTCCGGCGCGG\x94M\x07\x01\x8c\x10TGGAATCGTCACCGAT\x94M\x08\x01\x8c\x10TGGTCCGCTTCATGCT\x94M\t\x01\x8c\x10TGTAATAGGCGTCACA\x94M\n\x01\x8c\x10TGTCCGGATAAAGTAG\x94M\x0b\x01\x8c\x10TGTGGAGCGCCCTTAC\x94M\x0c\x01\x8c\x10TGTTGAGCCAGTCTGA\x94M\r\x01\x8c\x10TGTTGTAATCTGAATA\x94M\x0e\x01\x8c\x10TTAATGTAGCCGCTCC\x94M\x0f\x01\x8c\x10TTACGAATTTGATTCC\x94M\x10\x01\x8c\x10TTCATCAAGTTGGTGC\x94M\x11\x01\x8c\x10TTCTGTCCAGACTCGT\x94M\x12\x01\x8c\x10TTGAAAAAATCATAAA\x94M\x13\x01\x8c\x10TTGACTCACCGAATAA\x94M\x14\x01\x8c\x10TTGCAATTGAAACATA\x94M\x15\x01\x8c\x10TTGCTCCTGAGTAGTA\x94M\x16\x01\x8c\x10TTGGGCACTAAATTAA\x94M\x17\x01\x8c\x10TTGGGGAACGGGAAGC\x94M\x18\x01\x8c\x10TTGTATCAGTCGCGCC\x94M\x19\x01\x8c\x10TTTATATCCAACACCA\x94M\x1a\x01\x8c\x10TTTATATCGAGATTCA\x94M\x1b\x01\x8c\x10TTTCACAGAACCTATC\x94M\x1c\x01\x8c\x10TTTCAGCGTTGTTTTG\x94M\x1d\x01\x8c\x10TTTCGTGATACTCACA\x94u\x8c\x06strain\x94}\x94(K\x00\x8c\x19A/Minnesota/126/2024_H3N2\x94K\x01\x8c*A/Singapore/INFIMH-16-0019/2016X-307A_H3N2\x94K\x02\x8c\x18A/Wisconsin/67/2022_H1N1\x94K\x03\x8c\x16A/Lisboa/216/2023_H3N2\x94K\x04\x8c\x14A/Darwin/9/2021_H3N2\x94K\x05\x8c A/Cambodia/e0826360/2020egg_H3N2\x94K\x06\x8c\x15A/Busan/277/2025_H1N1\x94K\x07\x8c"A/New_York/GKISBBBE61555/2025_H3N2\x94K\x08\x8c\x15A/Kansas/14/2017_H3N2\x94K\t\x8c\x14A/Texas/50/2012_H3N2\x94K\n\x8c"A/Wisconsin/NIRC-IS-1028/2024_H3N2\x94K\x0b\x8c\x1aA/Washington/284/2024_H3N2\x94K\x0c\x8c\x16A/Oregon/265/2024_H3N2\x94K\r\x8c\x17A/Victoria/46/2024_H3N2\x94K\x0e\x8c\x16A/Vermont/13/2025_H3N2\x94K\x0f\x8c\x16A/Indiana/46/2024_H3N2\x94K\x10\x8c!A/DistrictOfColumbia/27/2023_H3N2\x94K\x11\x8c\x18A/Tasmania/836/2024_H3N2\x94K\x12\x8c\x19A/Colombia/1851/2024_H3N2\x94K\x13\x8c\x19A/Victoria/3482/2024_H3N2\x94K\x14\x8c\x1cA/BurkinaFaso/3131/2023_H3N2\x94K\x15\x8c\x13A/Utah/39/2025_H1N1\x94K\x16\x8c\x19A/HongKong/4801/2014_H3N2\x94K\x17\x8c!A/Victoria/4897/2022_IVR-238_H1N1\x94K\x18\x8c\x1aA/Texas/ISC-1274/2025_H3N2\x94K\x19\x8c\x17A/Slovenia/49/2024_H3N2\x94K\x1ajH\x02\x00\x00K\x1b\x8c\x14A/Iowa/123/2024_H1N1\x94K\x1c\x8c\x1fA/Uganda/UVRI_KIS6850_2024_H1N1\x94K\x1d\x8c\x17A/Michigan/45/2015_H1N1\x94K\x1e\x8c\x17A/Victoria/96/2025_H3N2\x94K\x1f\x8c&A/Massachusetts/BI_MGH-23147/2025_H3N2\x94K jI\x02\x00\x00K!\x8c\x19A/Victoria/3599/2024_H1N1\x94K"\x8c\x18A/Tennessee/04/2025_H1N1\x94K#\x8c\x1fA/Queensland/IN000692/2024_H3N2\x94K$\x8c#A/Michigan/UM-10062100736/2025_H3N2\x94K%\x8c\x16A/Lisboa/188/2023_H1N1\x94K&\x8c\x1aA/Texas/ISC-1148/2025_H3N2\x94K\'\x8c"A/Massachusetts/ISC-1679/2025_H1N1\x94K(j<\x02\x00\x00K)\x8c\x1aA/Texas/50/2012X-223A_H3N2\x94K*\x8c#A/France/IDF-IPP29542/2023-egg_H3N2\x94K+\x8c$A/Switzerland/860423897313/2023_H3N2\x94K,\x8c\x14A/Ohio/259/2024_H1N1\x94K-\x8c\x1eA/Punta_Arenas/83659/2024_H3N2\x94K.\x8c\x1cA/Pennsylvania/288/2024_H3N2\x94K/\x8c\x1dA/Colorado/ISC-1416/2024_H3N2\x94K0\x8c,A/France/PAC-RELAB-HCL024172122101/2024_H3N2\x94K1\x8c\x1aA/Texas/ISC-1342/2025_H3N2\x94K2\x8c\x16A/Thailand/8/2022_H3N2\x94K3\x8c A/Saskatchewan/RV04835/2024_H3N2\x94K4jF\x02\x00\x00K5\x8c\x18A/Bangkok/P176/2025_H1N1\x94K6\x8c"A/Wisconsin/NIRC-IS-1111/2025_H1N1\x94K7\x8c#A/Sao_Paulo/358026766-IAL/2024_H3N2\x94K8\x8c\x1eA/Rhode_Island/15446/2025_H3N2\x94K9\x8c!A/India/Pune-NIV24_3439/2024_H3N2\x94K:\x8c\x18A/Minnesota/97/2024_H3N2\x94K;jR\x02\x00\x00K<\x8c\x1fA/Switzerland/9715293/2013_H3N2\x94K=j1\x02\x00\x00K>\x8c#A/Saint-Petersburg/RII-04/2025_H1N1\x94K?\x8c\x1dA/Switzerland/47775/2024_H3N2\x94K@\x8c\x19A/Victoria/3480/2024_H3N2\x94KAjJ\x02\x00\x00KB\x8c\x15A/Hawaii/70/2019_H1N1\x94KC\x8c\x1bA/Rhode_Island/66/2024_H3N2\x94KD\x8c\x19A/Wisconsin/588/2019_H1N1\x94KE\x8c\x1cA/Ghana/FS-25-0256/2025_H3N2\x94KF\x8c\x18A/Ecuador/1385/2024_H3N2\x94KGjZ\x02\x00\x00KHj8\x02\x00\x00KI\x8c\x1cA/Amapa/021563-IEC/2024_H3N2\x94KJ\x8c\x1aA/Zacapa/FLU-012/2025_H1N1\x94KKj4\x02\x00\x00KLj`\x02\x00\x00KM\x8c%A/Shanghai-Huangpu/SWL12109/2024_H1N1\x94KN\x8c\x16A/Nevada/216/2024_H3N2\x94KOjU\x02\x00\x00KPjj\x02\x00\x00KQ\x8c%A/Switzerland/9715293/2013NIB-88_H3N2\x94KR\x8c\x15A/Sydney/43/2025_H3N2\x94KS\x8c\x18A/Pakistan/306/2024_H1N1\x94KT\x8c\x17A/Brisbane/02/2018_H1N1\x94KU\x8c\x13A/Utah/94/2024_H3N2\x94KVjT\x02\x00\x00KWj5\x02\x00\x00KX\x8c\x1dA/Cambodia/e0826360/2020_H3N2\x94KY\x8c\x1cA/Manitoba/RV04865/2024_H3N2\x94KZjd\x02\x00\x00K[\x8c\x13A/Utah/87/2024_H3N2\x94K\\\x8c\x18A/Wisconsin/30/2025_H1N1\x94K]\x8c\x1cA/HongKong/4801/2014egg_H3N2\x94K^jE\x02\x00\x00K_j3\x02\x00\x00K`\x8c\x1fA/France/BRE-IPP01880/2025_H3N2\x94Kaj_\x02\x00\x00Kb\x8c\x14A/Darwin/6/2021_H3N2\x94Kcj|\x02\x00\x00Kd\x8c\x1bA/Santiago/101713/2024_H1N1\x94Keje\x02\x00\x00KfjB\x02\x00\x00KgjK\x02\x00\x00KhjX\x02\x00\x00Ki\x8c\x1bA/Hawaii/ISC-1140/2025_H1N1\x94Kjj\x7f\x02\x00\x00Kkjh\x02\x00\x00Klj0\x02\x00\x00Km\x8c\x18A/Tennessee/99/2024_H3N2\x94Knj^\x02\x00\x00KojG\x02\x00\x00Kpjk\x02\x00\x00Kq\x8c\x17A/Qatar/83328/2024_H1N1\x94Kr\x8c\x1cA/Massachusetts/18/2022_H3N2\x94Ks\x8c\x18A/Michigan/120/2024_H3N2\x94Kt\x8c\x19A/Minnesota/131/2024_H1N1\x94Kuj:\x02\x00\x00Kv\x8c\x1fA/Washington/UW-25728/2024_H3N2\x94Kw\x8c\x19A/Colombia/7681/2024_H3N2\x94Kx\x8c\x15A/Busan/461/2025_H3N2\x94Ky\x8c\x1dA/CoteD\'Ivoire/4448/2024_H3N2\x94Kz\x8c\x19A/Maldives/2186/2024_H3N2\x94K{\x8c\x19A/Maldives/2147/2024_H3N2\x94K|\x8c\x1bA/KANAGAWA/AC2408/2025_H1N1\x94K}\x8c\x1cA/Washington/15245/2025_H3N2\x94K~j=\x02\x00\x00K\x7f\x8c\x19A/California/07/2009_H1N1\x94K\x80\x8c\x19A/HongKong/2671/2019_H3N2\x94K\x81\x8c\x16A/Vermont/05/2025_H1N1\x94K\x82\x8c\x17A/New_York/39/2025_H3N2\x94K\x83\x8c\x17A/Ufa/CRIE/47/2024_H1N1\x94K\x84j\x83\x02\x00\x00K\x85j}\x02\x00\x00K\x86\x8c\x1fA/Queensland/IN000803/2024_H3N2\x94K\x87\x8c\x18A/Colorado/218/2024_H1N1\x94K\x88jn\x02\x00\x00K\x89jc\x02\x00\x00K\x8ajs\x02\x00\x00K\x8bjM\x02\x00\x00K\x8cj\x8f\x02\x00\x00K\x8d\x8c\x17A/HongKong/45/2019_H3N2\x94K\x8ejw\x02\x00\x00K\x8f\x8c$A/Singapore/INFIMH-16-0019/2016_H3N2\x94K\x90j^\x02\x00\x00K\x91\x8c\x15A/Oregon/11/2025_H1N1\x94K\x92\x8c\x18A/Tasmania/790/2024_H3N2\x94K\x93j3\x02\x00\x00K\x94\x8c\x1aA/Texas/ISC-1322/2025_H3N2\x94K\x95jt\x02\x00\x00K\x96\x8c\x19A/Wisconsin/172/2024_H3N2\x94K\x97\x8c\x1cA/Massachusetts/93/2024_H3N2\x94K\x98j;\x02\x00\x00K\x99\x8c\x17A/Texas/15550/2024_H3N2\x94K\x9aj~\x02\x00\x00K\x9b\x8c\x18A/Tasmania/788/2024_H3N2\x94K\x9c\x8c\x16A/Oregon/261/2024_H1N1\x94K\x9d\x8c,A/France/ARA-RELAB-HCL025017178801/2025_H3N2\x94K\x9ej\x8d\x02\x00\x00K\x9f\x8c\x16A/Vermont/10/2025_H1N1\x94K\xa0\x8c#A/Michigan/UM-10062069629/2025_H3N2\x94K\xa1j1\x02\x00\x00K\xa2j\x84\x02\x00\x00K\xa3\x8c\x19A/Minnesota/133/2024_H3N2\x94K\xa4\x8c\x17A/Maryland/64/2024_H1N1\x94K\xa5j[\x02\x00\x00K\xa6\x8c\x1dA/Singapore/MOH0547/2024_H1N1\x94K\xa7\x8c%A/NovaScotia/ET1801CP00018S/2025_H1N1\x94K\xa8j2\x02\x00\x00K\xa9j\x98\x02\x00\x00K\xaajr\x02\x00\x00K\xabjV\x02\x00\x00K\xacj\x92\x02\x00\x00K\xad\x8c\x19A/Maldives/2132/2024_H1N1\x94K\xaejl\x02\x00\x00K\xafj\x8b\x02\x00\x00K\xb0j\x9a\x02\x00\x00K\xb1\x8c\x1fA/Croatia/10136RV/2023-egg_H3N2\x94K\xb2j?\x02\x00\x00K\xb3jO\x02\x00\x00K\xb4j\x97\x02\x00\x00K\xb5\x8c"A/Massachusetts/ISC-1684/2025_H3N2\x94K\xb6j\x9d\x02\x00\x00K\xb7\x8c\x1cA/Madagascar/00003/2025_H1N1\x94K\xb8\x8c\x19A/Tambov/160-1V/2024_H1N1\x94K\xb9\x8c\x1dA/Netherlands/01502/2025_H3N2\x94K\xbajq\x02\x00\x00K\xbbj\x87\x02\x00\x00K\xbcj\x91\x02\x00\x00K\xbd\x8c\x18A/New_York/191/2024_H3N2\x94K\xbe\x8c"A/Vladimir/RII-MH223382S/2024_H1N1\x94K\xbfj\x9f\x02\x00\x00K\xc0j7\x02\x00\x00K\xc1jL\x02\x00\x00K\xc2ji\x02\x00\x00K\xc3\x8c&A/Qinghai-Chengzhong/SWL1410/2024_H1N1\x94K\xc4j6\x02\x00\x00K\xc5\x8c"A/Mato_Grosso_do_Sul/518/2025_H3N2\x94K\xc6\x8c\x18A/Norway/12374/2023_H3N2\x94K\xc7j\xa4\x02\x00\x00K\xc8\x8c\x1cA/Badajoz/18680568/2025_H3N2\x94K\xc9j\x80\x02\x00\x00K\xcaj|\x02\x00\x00K\xcbj\xa2\x02\x00\x00K\xccjW\x02\x00\x00K\xcdj0\x02\x00\x00K\xcej\xa6\x02\x00\x00K\xcfjp\x02\x00\x00K\xd0jA\x02\x00\x00K\xd1j\x99\x02\x00\x00K\xd2jQ\x02\x00\x00K\xd3j\xb0\x02\x00\x00K\xd4j\xa7\x02\x00\x00K\xd5\x8c\x18A/Canberra/613/2024_H3N2\x94K\xd6j\x90\x02\x00\x00K\xd7jN\x02\x00\x00K\xd8jD\x02\x00\x00K\xd9j~\x02\x00\x00K\xda\x8c\x17A/Kentucky/57/2024_H3N2\x94K\xdbj\x95\x02\x00\x00K\xdc\x8c\x15A/Ulsan/492/2025_H1N1\x94K\xddjv\x02\x00\x00K\xdej\x85\x02\x00\x00K\xdfj/\x02\x00\x00K\xe0j\x96\x02\x00\x00K\xe1\x8c\x1dA/Netherlands/10563/2023_H3N2\x94K\xe2jC\x02\x00\x00K\xe3j\x96\x02\x00\x00K\xe4\x8c\x1eA/Santa_Catarina/333/2025_H3N2\x94K\xe5j\xb2\x02\x00\x00K\xe6j\xa9\x02\x00\x00K\xe7jl\x02\x00\x00K\xe8j\x95\x02\x00\x00K\xe9j\x93\x02\x00\x00K\xea\x8c\x17A/Illinois/65/2024_H1N1\x94K\xebjb\x02\x00\x00K\xecj9\x02\x00\x00K\xedj\x9b\x02\x00\x00K\xeej\xa1\x02\x00\x00K\xefj\x83\x02\x00\x00K\xf0jP\x02\x00\x00K\xf1jU\x02\x00\x00K\xf2j\x9e\x02\x00\x00K\xf3j\xb4\x02\x00\x00K\xf4jf\x02\x00\x00K\xf5j\xb7\x02\x00\x00K\xf6j\xb3\x02\x00\x00K\xf7j\xb6\x02\x00\x00K\xf8j\x8c\x02\x00\x00K\xf9jS\x02\x00\x00K\xfaj]\x02\x00\x00K\xfbjE\x02\x00\x00K\xfcj\xa0\x02\x00\x00K\xfdj\x8a\x02\x00\x00K\xfejg\x02\x00\x00K\xffj\xaa\x02\x00\x00M\x00\x01jy\x02\x00\x00M\x01\x01j8\x02\x00\x00M\x02\x01j\xa8\x02\x00\x00M\x03\x01j\xb5\x02\x00\x00M\x04\x01j\xa5\x02\x00\x00M\x05\x01\x8c\x1bA/TOKYO/EIS11-277/2024_H1N1\x94M\x06\x01j\x82\x02\x00\x00M\x07\x01jj\x02\x00\x00M\x08\x01\x8c!A/DE/DE-DHSS-901/2025_(H3N2)_H3N2\x94M\t\x01j\x86\x02\x00\x00M\n\x01j\xb8\x02\x00\x00M\x0b\x01j\x81\x02\x00\x00M\x0c\x01ju\x02\x00\x00M\r\x01j4\x02\x00\x00M\x0e\x01ja\x02\x00\x00M\x0f\x01jY\x02\x00\x00M\x10\x01j\x8f\x02\x00\x00M\x11\x01j\xab\x02\x00\x00M\x12\x01jK\x02\x00\x00M\x13\x01jx\x02\x00\x00M\x14\x01jx\x02\x00\x00M\x15\x01j>\x02\x00\x00M\x16\x01jv\x02\x00\x00M\x17\x01\x8c\x1cA/Florida/ISC-1241/2025_H3N2\x94M\x18\x01jo\x02\x00\x00M\x19\x01j\xaf\x02\x00\x00M\x1a\x01j\xad\x02\x00\x00M\x1b\x01j\xb1\x02\x00\x00M\x1c\x01j@\x02\x00\x00M\x1d\x01j\xb9\x02\x00\x00uu}\x94\x8c\x07barcode\x94}\x94(K\x00\x8c\x10AAAAAATTTATGACAA\x94K\x01\x8c\x10AACCACCGAGTGACCG\x94K\x02\x8c\x10AACGACAAACAGTAAG\x94K\x03\x8c\x10CAATTAGAAATACATA\x94K\x04\x8c\x10CATACAGAGTTTGTTG\x94K\x05\x8c\x10CTTTAAATTATAGTCT\x94K\x06\x8c\x10GTACAAACCTGCAAAT\x94K\x07\x8c\x10TACCCTGCAAGCCACT\x94K\x08\x8c\x10TTATCTGTAGAGCGCT\x94us]\x94(\x8c\x12plate1-2_UWMC-1_40\x94\x8c\x12plate1-2_UWMC-1_92\x94\x8c\x13plate1-2_UWMC-1_212\x94\x8c\x13plate1-2_UWMC-1_487\x94\x8c\x14plate1-2_UWMC-1_1119\x94\x8c\x14plate1-2_UWMC-1_2575\x94\x8c\x14plate1-2_UWMC-1_5921\x94\x8c\x15plate1-2_UWMC-1_13619\x94\x8c\x12plate1-2_UWMC-2_40\x94\x8c\x12plate1-2_UWMC-2_92\x94\x8c\x13plate1-2_UWMC-2_212\x94\x8c\x13plate1-2_UWMC-2_487\x94\x8c\x14plate1-2_UWMC-2_1119\x94\x8c\x14plate1-2_UWMC-2_2575\x94\x8c\x14plate1-2_UWMC-2_5921\x94\x8c\x15plate1-2_UWMC-2_13619\x94\x8c\x12plate1-2_UWMC-3_40\x94\x8c\x12plate1-2_UWMC-3_92\x94\x8c\x13plate1-2_UWMC-3_212\x94\x8c\x13plate1-2_UWMC-3_487\x94\x8c\x14plate1-2_UWMC-3_1119\x94\x8c\x14plate1-2_UWMC-3_2575\x94\x8c\x14plate1-2_UWMC-3_5921\x94\x8c\x15plate1-2_UWMC-3_13619\x94\x8c\x12plate1-2_UWMC-4_40\x94\x8c\x12plate1-2_UWMC-4_92\x94\x8c\x13plate1-2_UWMC-4_212\x94\x8c\x13plate1-2_UWMC-4_487\x94\x8c\x14plate1-2_UWMC-4_1119\x94\x8c\x14plate1-2_UWMC-4_2575\x94\x8c\x14plate1-2_UWMC-4_5921\x94\x8c\x15plate1-2_UWMC-4_13619\x94\x8c\x12plate1-2_UWMC-5_40\x94\x8c\x12plate1-2_UWMC-5_92\x94\x8c\x13plate1-2_UWMC-5_212\x94\x8c\x13plate1-2_UWMC-5_487\x94\x8c\x14plate1-2_UWMC-5_1119\x94\x8c\x14plate1-2_UWMC-5_2575\x94\x8c\x14plate1-2_UWMC-5_5921\x94\x8c\x15plate1-2_UWMC-5_13619\x94\x8c\x12plate1-2_UWMC-6_40\x94\x8c\x12plate1-2_UWMC-6_92\x94\x8c\x13plate1-2_UWMC-6_212\x94\x8c\x13plate1-2_UWMC-6_487\x94\x8c\x14plate1-2_UWMC-6_1119\x94\x8c\x14plate1-2_UWMC-6_2575\x94\x8c\x14plate1-2_UWMC-6_5921\x94\x8c\x15plate1-2_UWMC-6_13619\x94\x8c\x12plate1-2_UWMC-7_40\x94\x8c\x12plate1-2_UWMC-7_92\x94\x8c\x13plate1-2_UWMC-7_212\x94\x8c\x13plate1-2_UWMC-7_487\x94\x8c\x14plate1-2_UWMC-7_1119\x94\x8c\x14plate1-2_UWMC-7_2575\x94\x8c\x14plate1-2_UWMC-7_5921\x94\x8c\x15plate1-2_UWMC-7_13619\x94\x8c\x12plate1-2_UWMC-8_40\x94\x8c\x12plate1-2_UWMC-8_92\x94\x8c\x13plate1-2_UWMC-8_212\x94\x8c\x13plate1-2_UWMC-8_487\x94\x8c\x14plate1-2_UWMC-8_1119\x94\x8c\x14plate1-2_UWMC-8_2575\x94\x8c\x14plate1-2_UWMC-8_5921\x94\x8c\x15plate1-2_UWMC-8_13619\x94\x8c\x12plate1-2_UWMC-9_40\x94\x8c\x12plate1-2_UWMC-9_92\x94\x8c\x13plate1-2_UWMC-9_212\x94\x8c\x13plate1-2_UWMC-9_487\x94\x8c\x14plate1-2_UWMC-9_1119\x94\x8c\x14plate1-2_UWMC-9_2575\x94\x8c\x14plate1-2_UWMC-9_5921\x94\x8c\x15plate1-2_UWMC-9_13619\x94\x8c\x13plate1-2_UWMC-10_40\x94\x8c\x13plate1-2_UWMC-10_92\x94\x8c\x14plate1-2_UWMC-10_212\x94\x8c\x14plate1-2_UWMC-10_487\x94\x8c\x15plate1-2_UWMC-10_1119\x94\x8c\x15plate1-2_UWMC-10_2575\x94\x8c\x15plate1-2_UWMC-10_5921\x94\x8c\x16plate1-2_UWMC-10_13619\x94\x8c\x13plate1-2_UWMC-11_40\x94\x8c\x13plate1-2_UWMC-11_92\x94\x8c\x14plate1-2_UWMC-11_212\x94\x8c\x14plate1-2_UWMC-11_487\x94\x8c\x15plate1-2_UWMC-11_1119\x94\x8c\x15plate1-2_UWMC-11_2575\x94\x8c\x15plate1-2_UWMC-11_5921\x94\x8c\x16plate1-2_UWMC-11_13619\x94\x8c\x0fplate1-2_none-1\x94\x8c\x0fplate1-2_none-2\x94\x8c\x0fplate1-2_none-3\x94\x8c\x0fplate1-2_none-4\x94\x8c\x0fplate1-2_none-5\x94\x8c\x0fplate1-2_none-6\x94\x8c\x0fplate1-2_none-7\x94\x8c\x0fplate1-2_none-8\x94e}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94\x8c\n2025-08-07\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c#data/plates/2025-08-11_plate1-2.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x05wells\x94]\x94(\x8c\x02H1\x94\x8c\x02H2\x94\x8c\x02H3\x94\x8c\x02H4\x94\x8c\x02H5\x94\x8c\x02H6\x94\x8c\x02H7\x94\x8c\x02H8\x94\x8c\x02H9\x94\x8c\x03H10\x94\x8c\x03H11\x94\x8c\x03H12\x94es\x8c\rqc_thresholds\x94}\x94(\x8c\x1bavg_barcode_counts_per_well\x94M\xf4\x01\x8c\x1fmin_neut_standard_frac_per_well\x94G?tz\xe1G\xae\x14{\x8c"no_serum_per_viral_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?\x1a6\xe2\xeb\x1cC-\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c!per_neut_standard_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?tz\xe1G\xae\x14{\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c min_neut_standard_count_per_well\x94M\xe8\x03\x8c)min_no_serum_count_per_viral_barcode_well\x94Kd\x8c+max_frac_infectivity_per_viral_barcode_well\x94K\x03\x8c)min_dilutions_per_barcode_serum_replicate\x94K\x06u\x8c\x0fcurvefit_params\x94}\x94(\x8c\x18frac_infectivity_ceiling\x94K\x01\x8c\x06fixtop\x94]\x94(G?\xe3333333K\x01e\x8c\tfixbottom\x94K\x00\x8c\x08fixslope\x94]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c\x0bcurvefit_qc\x94}\x94(\x8c\x1dmax_frac_infectivity_at_least\x94G\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x0fgoodness_of_fit\x94}\x94(\x8c\x06min_R2\x94G?\xe0\x00\x00\x00\x00\x00\x00\x8c\x08max_RMSD\x94G?\xc3333333u\x8c#serum_replicates_ignore_curvefit_qc\x94]\x94\x8c+barcode_serum_replicates_ignore_curvefit_qc\x94]\x94u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\x08upstream\x94\x8c\x1cCCTACAATGTCGGATTTGTATTTAATAG\x94\x8c\ndownstream\x94\x8c\x00\x94\x8c\x04minq\x94K\x14\x8c\x11upstream_mismatch\x94K\x04\x8c\x0ebc_orientation\x94\x8c\x02R2\x94\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01u\x8c\x07samples\x94}\x94(\x8c\x04well\x94}\x94(K\x00\x8c\x02A1\x94K\x01\x8c\x02B1\x94K\x02\x8c\x02C1\x94K\x03\x8c\x02D1\x94K\x04\x8c\x02E1\x94K\x05\x8c\x02F1\x94K\x06\x8c\x02G1\x94K\x07\x8c\x02H1\x94K\x08\x8c\x02A2\x94K\t\x8c\x02B2\x94K\n\x8c\x02C2\x94K\x0b\x8c\x02D2\x94K\x0c\x8c\x02E2\x94K\r\x8c\x02F2\x94K\x0e\x8c\x02G2\x94K\x0f\x8c\x02H2\x94K\x10\x8c\x02A3\x94K\x11\x8c\x02B3\x94K\x12\x8c\x02C3\x94K\x13\x8c\x02D3\x94K\x14\x8c\x02E3\x94K\x15\x8c\x02F3\x94K\x16\x8c\x02G3\x94K\x17\x8c\x02H3\x94K\x18\x8c\x02A4\x94K\x19\x8c\x02B4\x94K\x1a\x8c\x02C4\x94K\x1b\x8c\x02D4\x94K\x1c\x8c\x02E4\x94K\x1d\x8c\x02F4\x94K\x1e\x8c\x02G4\x94K\x1f\x8c\x02H4\x94K \x8c\x02A5\x94K!\x8c\x02B5\x94K"\x8c\x02C5\x94K#\x8c\x02D5\x94K$\x8c\x02E5\x94K%\x8c\x02F5\x94K&\x8c\x02G5\x94K\'\x8c\x02H5\x94K(\x8c\x02A6\x94K)\x8c\x02B6\x94K*\x8c\x02C6\x94K+\x8c\x02D6\x94K,\x8c\x02E6\x94K-\x8c\x02F6\x94K.\x8c\x02G6\x94K/\x8c\x02H6\x94K0\x8c\x02A7\x94K1\x8c\x02B7\x94K2\x8c\x02C7\x94K3\x8c\x02D7\x94K4\x8c\x02E7\x94K5\x8c\x02F7\x94K6\x8c\x02G7\x94K7\x8c\x02H7\x94K8\x8c\x02A8\x94K9\x8c\x02B8\x94K:\x8c\x02C8\x94K;\x8c\x02D8\x94K<\x8c\x02E8\x94K=\x8c\x02F8\x94K>\x8c\x02G8\x94K?\x8c\x02H8\x94K@\x8c\x02A9\x94KA\x8c\x02B9\x94KB\x8c\x02C9\x94KC\x8c\x02D9\x94KD\x8c\x02E9\x94KE\x8c\x02F9\x94KF\x8c\x02G9\x94KG\x8c\x02H9\x94KH\x8c\x03A10\x94KI\x8c\x03B10\x94KJ\x8c\x03C10\x94KK\x8c\x03D10\x94KL\x8c\x03E10\x94KM\x8c\x03F10\x94KN\x8c\x03G10\x94KO\x8c\x03H10\x94KP\x8c\x03A11\x94KQ\x8c\x03B11\x94KR\x8c\x03C11\x94KS\x8c\x03D11\x94KT\x8c\x03E11\x94KU\x8c\x03F11\x94KV\x8c\x03G11\x94KW\x8c\x03H11\x94KX\x8c\x03A12\x94KY\x8c\x03B12\x94KZ\x8c\x03C12\x94K[\x8c\x03D12\x94K\\\x8c\x03E12\x94K]\x8c\x03F12\x94K^\x8c\x03G12\x94K_\x8c\x03H12\x94u\x8c\x05serum\x94}\x94(K\x00\x8c\x06UWMC-1\x94K\x01j\xdb\x03\x00\x00K\x02j\xdb\x03\x00\x00K\x03j\xdb\x03\x00\x00K\x04j\xdb\x03\x00\x00K\x05j\xdb\x03\x00\x00K\x06j\xdb\x03\x00\x00K\x07j\xdb\x03\x00\x00K\x08\x8c\x06UWMC-2\x94K\tj\xdc\x03\x00\x00K\nj\xdc\x03\x00\x00K\x0bj\xdc\x03\x00\x00K\x0cj\xdc\x03\x00\x00K\rj\xdc\x03\x00\x00K\x0ej\xdc\x03\x00\x00K\x0fj\xdc\x03\x00\x00K\x10\x8c\x06UWMC-3\x94K\x11j\xdd\x03\x00\x00K\x12j\xdd\x03\x00\x00K\x13j\xdd\x03\x00\x00K\x14j\xdd\x03\x00\x00K\x15j\xdd\x03\x00\x00K\x16j\xdd\x03\x00\x00K\x17j\xdd\x03\x00\x00K\x18\x8c\x06UWMC-4\x94K\x19j\xde\x03\x00\x00K\x1aj\xde\x03\x00\x00K\x1bj\xde\x03\x00\x00K\x1cj\xde\x03\x00\x00K\x1dj\xde\x03\x00\x00K\x1ej\xde\x03\x00\x00K\x1fj\xde\x03\x00\x00K \x8c\x06UWMC-5\x94K!j\xdf\x03\x00\x00K"j\xdf\x03\x00\x00K#j\xdf\x03\x00\x00K$j\xdf\x03\x00\x00K%j\xdf\x03\x00\x00K&j\xdf\x03\x00\x00K\'j\xdf\x03\x00\x00K(\x8c\x06UWMC-6\x94K)j\xe0\x03\x00\x00K*j\xe0\x03\x00\x00K+j\xe0\x03\x00\x00K,j\xe0\x03\x00\x00K-j\xe0\x03\x00\x00K.j\xe0\x03\x00\x00K/j\xe0\x03\x00\x00K0\x8c\x06UWMC-7\x94K1j\xe1\x03\x00\x00K2j\xe1\x03\x00\x00K3j\xe1\x03\x00\x00K4j\xe1\x03\x00\x00K5j\xe1\x03\x00\x00K6j\xe1\x03\x00\x00K7j\xe1\x03\x00\x00K8\x8c\x06UWMC-8\x94K9j\xe2\x03\x00\x00K:j\xe2\x03\x00\x00K;j\xe2\x03\x00\x00K<j\xe2\x03\x00\x00K=j\xe2\x03\x00\x00K>j\xe2\x03\x00\x00K?j\xe2\x03\x00\x00K@\x8c\x06UWMC-9\x94KAj\xe3\x03\x00\x00KBj\xe3\x03\x00\x00KCj\xe3\x03\x00\x00KDj\xe3\x03\x00\x00KEj\xe3\x03\x00\x00KFj\xe3\x03\x00\x00KGj\xe3\x03\x00\x00KH\x8c\x07UWMC-10\x94KIj\xe4\x03\x00\x00KJj\xe4\x03\x00\x00KKj\xe4\x03\x00\x00KLj\xe4\x03\x00\x00KMj\xe4\x03\x00\x00KNj\xe4\x03\x00\x00KOj\xe4\x03\x00\x00KP\x8c\x07UWMC-11\x94KQj\xe5\x03\x00\x00KRj\xe5\x03\x00\x00KSj\xe5\x03\x00\x00KTj\xe5\x03\x00\x00KUj\xe5\x03\x00\x00KVj\xe5\x03\x00\x00KWj\xe5\x03\x00\x00KX\x8c\x04none\x94KYj\xe6\x03\x00\x00KZj\xe6\x03\x00\x00K[j\xe6\x03\x00\x00K\\j\xe6\x03\x00\x00K]j\xe6\x03\x00\x00K^j\xe6\x03\x00\x00K_j\xe6\x03\x00\x00u\x8c\x0fdilution_factor\x94}\x94(K\x00K(K\x01K\\K\x02K\xd4K\x03M\xe7\x01K\x04M_\x04K\x05M\x0f\nK\x06M!\x17K\x07M35K\x08K(K\tK\\K\nK\xd4K\x0bM\xe7\x01K\x0cM_\x04K\rM\x0f\nK\x0eM!\x17K\x0fM35K\x10K(K\x11K\\K\x12K\xd4K\x13M\xe7\x01K\x14M_\x04K\x15M\x0f\nK\x16M!\x17K\x17M35K\x18K(K\x19K\\K\x1aK\xd4K\x1bM\xe7\x01K\x1cM_\x04K\x1dM\x0f\nK\x1eM!\x17K\x1fM35K K(K!K\\K"K\xd4K#M\xe7\x01K$M_\x04K%M\x0f\nK&M!\x17K\'M35K(K(K)K\\K*K\xd4K+M\xe7\x01K,M_\x04K-M\x0f\nK.M!\x17K/M35K0K(K1K\\K2K\xd4K3M\xe7\x01K4M_\x04K5M\x0f\nK6M!\x17K7M35K8K(K9K\\K:K\xd4K;M\xe7\x01K<M_\x04K=M\x0f\nK>M!\x17K?M35K@K(KAK\\KBK\xd4KCM\xe7\x01KDM_\x04KEM\x0f\nKFM!\x17KGM35KHK(KIK\\KJK\xd4KKM\xe7\x01KLM_\x04KMM\x0f\nKNM!\x17KOM35KPK(KQK\\KRK\xd4KSM\xe7\x01KTM_\x04KUM\x0f\nKVM!\x17KWM35KXNKYNKZNK[NK\\NK]NK^NK_Nu\x8c\treplicate\x94}\x94(K\x00K\x01K\x01K\x01K\x02K\x01K\x03K\x01K\x04K\x01K\x05K\x01K\x06K\x01K\x07K\x01K\x08K\x01K\tK\x01K\nK\x01K\x0bK\x01K\x0cK\x01K\rK\x01K\x0eK\x01K\x0fK\x01K\x10K\x01K\x11K\x01K\x12K\x01K\x13K\x01K\x14K\x01K\x15K\x01K\x16K\x01K\x17K\x01K\x18K\x01K\x19K\x01K\x1aK\x01K\x1bK\x01K\x1cK\x01K\x1dK\x01K\x1eK\x01K\x1fK\x01K K\x01K!K\x01K"K\x01K#K\x01K$K\x01K%K\x01K&K\x01K\'K\x01K(K\x01K)K\x01K*K\x01K+K\x01K,K\x01K-K\x01K.K\x01K/K\x01K0K\x01K1K\x01K2K\x01K3K\x01K4K\x01K5K\x01K6K\x01K7K\x01K8K\x01K9K\x01K:K\x01K;K\x01K<K\x01K=K\x01K>K\x01K?K\x01K@K\x01KAK\x01KBK\x01KCK\x01KDK\x01KEK\x01KFK\x01KGK\x01KHK\x01KIK\x01KJK\x01KKK\x01KLK\x01KMK\x01KNK\x01KOK\x01KPK\x01KQK\x01KRK\x01KSK\x01KTK\x01KUK\x01KVK\x01KWK\x01KXK\x01KYK\x02KZK\x03K[K\x04K\\K\x05K]K\x06K^K\x07K_K\x08u\x8c\x05fastq\x94}\x94(K\x00\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_1_S1_R1_001.fastq.gz\x94K\x01\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_2_S2_R1_001.fastq.gz\x94K\x02\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_3_S3_R1_001.fastq.gz\x94K\x03\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_4_S4_R1_001.fastq.gz\x94K\x04\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_5_S5_R1_001.fastq.gz\x94K\x05\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_6_S6_R1_001.fastq.gz\x94K\x06\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_7_S7_R1_001.fastq.gz\x94K\x07\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_8_S8_R1_001.fastq.gz\x94K\x08\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_9_S9_R1_001.fastq.gz\x94K\t\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_10_S10_R1_001.fastq.gz\x94K\n\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_11_S11_R1_001.fastq.gz\x94K\x0b\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_12_S12_R1_001.fastq.gz\x94K\x0c\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_13_S13_R1_001.fastq.gz\x94K\r\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_14_S14_R1_001.fastq.gz\x94K\x0e\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_15_S15_R1_001.fastq.gz\x94K\x0f\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_16_S16_R1_001.fastq.gz\x94K\x10\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_17_S17_R1_001.fastq.gz\x94K\x11\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_18_S18_R1_001.fastq.gz\x94K\x12\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_19_S19_R1_001.fastq.gz\x94K\x13\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_20_S20_R1_001.fastq.gz\x94K\x14\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_21_S21_R1_001.fastq.gz\x94K\x15\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_22_S22_R1_001.fastq.gz\x94K\x16\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_23_S23_R1_001.fastq.gz\x94K\x17\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_24_S24_R1_001.fastq.gz\x94K\x18\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_25_S25_R1_001.fastq.gz\x94K\x19\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_26_S26_R1_001.fastq.gz\x94K\x1a\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_27_S27_R1_001.fastq.gz\x94K\x1b\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_28_S28_R1_001.fastq.gz\x94K\x1c\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_29_S29_R1_001.fastq.gz\x94K\x1d\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_30_S30_R1_001.fastq.gz\x94K\x1e\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_31_S31_R1_001.fastq.gz\x94K\x1f\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_32_S32_R1_001.fastq.gz\x94K \x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_33_S33_R1_001.fastq.gz\x94K!\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_34_S34_R1_001.fastq.gz\x94K"\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_35_S35_R1_001.fastq.gz\x94K#\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_36_S36_R1_001.fastq.gz\x94K$\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_37_S37_R1_001.fastq.gz\x94K%\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_38_S38_R1_001.fastq.gz\x94K&\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_39_S39_R1_001.fastq.gz\x94K\'\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_40_S40_R1_001.fastq.gz\x94K(\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_41_S41_R1_001.fastq.gz\x94K)\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_42_S42_R1_001.fastq.gz\x94K*\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_43_S43_R1_001.fastq.gz\x94K+\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_44_S44_R1_001.fastq.gz\x94K,\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_45_S45_R1_001.fastq.gz\x94K-\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_46_S46_R1_001.fastq.gz\x94K.\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_47_S47_R1_001.fastq.gz\x94K/\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_48_S48_R1_001.fastq.gz\x94K0\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_49_S49_R1_001.fastq.gz\x94K1\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_50_S50_R1_001.fastq.gz\x94K2\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_51_S51_R1_001.fastq.gz\x94K3\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_52_S52_R1_001.fastq.gz\x94K4\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_53_S53_R1_001.fastq.gz\x94K5\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_54_S54_R1_001.fastq.gz\x94K6\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_55_S55_R1_001.fastq.gz\x94K7\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_56_S56_R1_001.fastq.gz\x94K8\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_57_S57_R1_001.fastq.gz\x94K9\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_58_S58_R1_001.fastq.gz\x94K:\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_59_S59_R1_001.fastq.gz\x94K;\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_60_S60_R1_001.fastq.gz\x94K<\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_61_S61_R1_001.fastq.gz\x94K=\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_62_S62_R1_001.fastq.gz\x94K>\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_63_S63_R1_001.fastq.gz\x94K?\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_64_S64_R1_001.fastq.gz\x94K@\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_65_S65_R1_001.fastq.gz\x94KA\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_66_S66_R1_001.fastq.gz\x94KB\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_67_S67_R1_001.fastq.gz\x94KC\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_68_S68_R1_001.fastq.gz\x94KD\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_69_S69_R1_001.fastq.gz\x94KE\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_70_S70_R1_001.fastq.gz\x94KF\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_71_S71_R1_001.fastq.gz\x94KG\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_72_S72_R1_001.fastq.gz\x94KH\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_73_S73_R1_001.fastq.gz\x94KI\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_74_S74_R1_001.fastq.gz\x94KJ\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_75_S75_R1_001.fastq.gz\x94KK\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_76_S76_R1_001.fastq.gz\x94KL\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_77_S77_R1_001.fastq.gz\x94KM\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_78_S78_R1_001.fastq.gz\x94KN\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_79_S79_R1_001.fastq.gz\x94KO\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_80_S80_R1_001.fastq.gz\x94KP\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_81_S81_R1_001.fastq.gz\x94KQ\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_82_S82_R1_001.fastq.gz\x94KR\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_83_S83_R1_001.fastq.gz\x94KS\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_84_S84_R1_001.fastq.gz\x94KT\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_85_S85_R1_001.fastq.gz\x94KU\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_86_S86_R1_001.fastq.gz\x94KV\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_87_S87_R1_001.fastq.gz\x94KW\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_88_S88_R1_001.fastq.gz\x94KX\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_89_S89_R1_001.fastq.gz\x94KY\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_90_S90_R1_001.fastq.gz\x94KZ\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_91_S91_R1_001.fastq.gz\x94K[\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_92_S92_R1_001.fastq.gz\x94K\\\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_93_S93_R1_001.fastq.gz\x94K]\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_94_S94_R1_001.fastq.gz\x94K^\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_95_S95_R1_001.fastq.gz\x94K_\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00699_581_AAHCLLHM5/Unaligned/Project_bloom_lab/PlateA_96_S96_R1_001.fastq.gz\x94u\x8c\x0fserum_replicate\x94}\x94(K\x00j\xdb\x03\x00\x00K\x01j\xdb\x03\x00\x00K\x02j\xdb\x03\x00\x00K\x03j\xdb\x03\x00\x00K\x04j\xdb\x03\x00\x00K\x05j\xdb\x03\x00\x00K\x06j\xdb\x03\x00\x00K\x07j\xdb\x03\x00\x00K\x08j\xdc\x03\x00\x00K\tj\xdc\x03\x00\x00K\nj\xdc\x03\x00\x00K\x0bj\xdc\x03\x00\x00K\x0cj\xdc\x03\x00\x00K\rj\xdc\x03\x00\x00K\x0ej\xdc\x03\x00\x00K\x0fj\xdc\x03\x00\x00K\x10j\xdd\x03\x00\x00K\x11j\xdd\x03\x00\x00K\x12j\xdd\x03\x00\x00K\x13j\xdd\x03\x00\x00K\x14j\xdd\x03\x00\x00K\x15j\xdd\x03\x00\x00K\x16j\xdd\x03\x00\x00K\x17j\xdd\x03\x00\x00K\x18j\xde\x03\x00\x00K\x19j\xde\x03\x00\x00K\x1aj\xde\x03\x00\x00K\x1bj\xde\x03\x00\x00K\x1cj\xde\x03\x00\x00K\x1dj\xde\x03\x00\x00K\x1ej\xde\x03\x00\x00K\x1fj\xde\x03\x00\x00K j\xdf\x03\x00\x00K!j\xdf\x03\x00\x00K"j\xdf\x03\x00\x00K#j\xdf\x03\x00\x00K$j\xdf\x03\x00\x00K%j\xdf\x03\x00\x00K&j\xdf\x03\x00\x00K\'j\xdf\x03\x00\x00K(j\xe0\x03\x00\x00K)j\xe0\x03\x00\x00K*j\xe0\x03\x00\x00K+j\xe0\x03\x00\x00K,j\xe0\x03\x00\x00K-j\xe0\x03\x00\x00K.j\xe0\x03\x00\x00K/j\xe0\x03\x00\x00K0j\xe1\x03\x00\x00K1j\xe1\x03\x00\x00K2j\xe1\x03\x00\x00K3j\xe1\x03\x00\x00K4j\xe1\x03\x00\x00K5j\xe1\x03\x00\x00K6j\xe1\x03\x00\x00K7j\xe1\x03\x00\x00K8j\xe2\x03\x00\x00K9j\xe2\x03\x00\x00K:j\xe2\x03\x00\x00K;j\xe2\x03\x00\x00K<j\xe2\x03\x00\x00K=j\xe2\x03\x00\x00K>j\xe2\x03\x00\x00K?j\xe2\x03\x00\x00K@j\xe3\x03\x00\x00KAj\xe3\x03\x00\x00KBj\xe3\x03\x00\x00KCj\xe3\x03\x00\x00KDj\xe3\x03\x00\x00KEj\xe3\x03\x00\x00KFj\xe3\x03\x00\x00KGj\xe3\x03\x00\x00KHj\xe4\x03\x00\x00KIj\xe4\x03\x00\x00KJj\xe4\x03\x00\x00KKj\xe4\x03\x00\x00KLj\xe4\x03\x00\x00KMj\xe4\x03\x00\x00KNj\xe4\x03\x00\x00KOj\xe4\x03\x00\x00KPj\xe5\x03\x00\x00KQj\xe5\x03\x00\x00KRj\xe5\x03\x00\x00KSj\xe5\x03\x00\x00KTj\xe5\x03\x00\x00KUj\xe5\x03\x00\x00KVj\xe5\x03\x00\x00KWj\xe5\x03\x00\x00KX\x8c\x06none-1\x94KY\x8c\x06none-2\x94KZ\x8c\x06none-3\x94K[\x8c\x06none-4\x94K\\\x8c\x06none-5\x94K]\x8c\x06none-6\x94K^\x8c\x06none-7\x94K_\x8c\x06none-8\x94u\x8c\x0esample_noplate\x94}\x94(K\x00\x8c\tUWMC-1_40\x94K\x01\x8c\tUWMC-1_92\x94K\x02\x8c\nUWMC-1_212\x94K\x03\x8c\nUWMC-1_487\x94K\x04\x8c\x0bUWMC-1_1119\x94K\x05\x8c\x0bUWMC-1_2575\x94K\x06\x8c\x0bUWMC-1_5921\x94K\x07\x8c\x0cUWMC-1_13619\x94K\x08\x8c\tUWMC-2_40\x94K\t\x8c\tUWMC-2_92\x94K\n\x8c\nUWMC-2_212\x94K\x0b\x8c\nUWMC-2_487\x94K\x0c\x8c\x0bUWMC-2_1119\x94K\r\x8c\x0bUWMC-2_2575\x94K\x0e\x8c\x0bUWMC-2_5921\x94K\x0f\x8c\x0cUWMC-2_13619\x94K\x10\x8c\tUWMC-3_40\x94K\x11\x8c\tUWMC-3_92\x94K\x12\x8c\nUWMC-3_212\x94K\x13\x8c\nUWMC-3_487\x94K\x14\x8c\x0bUWMC-3_1119\x94K\x15\x8c\x0bUWMC-3_2575\x94K\x16\x8c\x0bUWMC-3_5921\x94K\x17\x8c\x0cUWMC-3_13619\x94K\x18\x8c\tUWMC-4_40\x94K\x19\x8c\tUWMC-4_92\x94K\x1a\x8c\nUWMC-4_212\x94K\x1b\x8c\nUWMC-4_487\x94K\x1c\x8c\x0bUWMC-4_1119\x94K\x1d\x8c\x0bUWMC-4_2575\x94K\x1e\x8c\x0bUWMC-4_5921\x94K\x1f\x8c\x0cUWMC-4_13619\x94K \x8c\tUWMC-5_40\x94K!\x8c\tUWMC-5_92\x94K"\x8c\nUWMC-5_212\x94K#\x8c\nUWMC-5_487\x94K$\x8c\x0bUWMC-5_1119\x94K%\x8c\x0bUWMC-5_2575\x94K&\x8c\x0bUWMC-5_5921\x94K\'\x8c\x0cUWMC-5_13619\x94K(\x8c\tUWMC-6_40\x94K)\x8c\tUWMC-6_92\x94K*\x8c\nUWMC-6_212\x94K+\x8c\nUWMC-6_487\x94K,\x8c\x0bUWMC-6_1119\x94K-\x8c\x0bUWMC-6_2575\x94K.\x8c\x0bUWMC-6_5921\x94K/\x8c\x0cUWMC-6_13619\x94K0\x8c\tUWMC-7_40\x94K1\x8c\tUWMC-7_92\x94K2\x8c\nUWMC-7_212\x94K3\x8c\nUWMC-7_487\x94K4\x8c\x0bUWMC-7_1119\x94K5\x8c\x0bUWMC-7_2575\x94K6\x8c\x0bUWMC-7_5921\x94K7\x8c\x0cUWMC-7_13619\x94K8\x8c\tUWMC-8_40\x94K9\x8c\tUWMC-8_92\x94K:\x8c\nUWMC-8_212\x94K;\x8c\nUWMC-8_487\x94K<\x8c\x0bUWMC-8_1119\x94K=\x8c\x0bUWMC-8_2575\x94K>\x8c\x0bUWMC-8_5921\x94K?\x8c\x0cUWMC-8_13619\x94K@\x8c\tUWMC-9_40\x94KA\x8c\tUWMC-9_92\x94KB\x8c\nUWMC-9_212\x94KC\x8c\nUWMC-9_487\x94KD\x8c\x0bUWMC-9_1119\x94KE\x8c\x0bUWMC-9_2575\x94KF\x8c\x0bUWMC-9_5921\x94KG\x8c\x0cUWMC-9_13619\x94KH\x8c\nUWMC-10_40\x94KI\x8c\nUWMC-10_92\x94KJ\x8c\x0bUWMC-10_212\x94KK\x8c\x0bUWMC-10_487\x94KL\x8c\x0cUWMC-10_1119\x94KM\x8c\x0cUWMC-10_2575\x94KN\x8c\x0cUWMC-10_5921\x94KO\x8c\rUWMC-10_13619\x94KP\x8c\nUWMC-11_40\x94KQ\x8c\nUWMC-11_92\x94KR\x8c\x0bUWMC-11_212\x94KS\x8c\x0bUWMC-11_487\x94KT\x8c\x0cUWMC-11_1119\x94KU\x8c\x0cUWMC-11_2575\x94KV\x8c\x0cUWMC-11_5921\x94KW\x8c\rUWMC-11_13619\x94KXjO\x04\x00\x00KYjP\x04\x00\x00KZjQ\x04\x00\x00K[jR\x04\x00\x00K\\jS\x04\x00\x00K]jT\x04\x00\x00K^jU\x04\x00\x00K_jV\x04\x00\x00u\x8c\x06sample\x94}\x94(K\x00j\xc8\x02\x00\x00K\x01j\xc9\x02\x00\x00K\x02j\xca\x02\x00\x00K\x03j\xcb\x02\x00\x00K\x04j\xcc\x02\x00\x00K\x05j\xcd\x02\x00\x00K\x06j\xce\x02\x00\x00K\x07j\xcf\x02\x00\x00K\x08j\xd0\x02\x00\x00K\tj\xd1\x02\x00\x00K\nj\xd2\x02\x00\x00K\x0bj\xd3\x02\x00\x00K\x0cj\xd4\x02\x00\x00K\rj\xd5\x02\x00\x00K\x0ej\xd6\x02\x00\x00K\x0fj\xd7\x02\x00\x00K\x10j\xd8\x02\x00\x00K\x11j\xd9\x02\x00\x00K\x12j\xda\x02\x00\x00K\x13j\xdb\x02\x00\x00K\x14j\xdc\x02\x00\x00K\x15j\xdd\x02\x00\x00K\x16j\xde\x02\x00\x00K\x17j\xdf\x02\x00\x00K\x18j\xe0\x02\x00\x00K\x19j\xe1\x02\x00\x00K\x1aj\xe2\x02\x00\x00K\x1bj\xe3\x02\x00\x00K\x1cj\xe4\x02\x00\x00K\x1dj\xe5\x02\x00\x00K\x1ej\xe6\x02\x00\x00K\x1fj\xe7\x02\x00\x00K j\xe8\x02\x00\x00K!j\xe9\x02\x00\x00K"j\xea\x02\x00\x00K#j\xeb\x02\x00\x00K$j\xec\x02\x00\x00K%j\xed\x02\x00\x00K&j\xee\x02\x00\x00K\'j\xef\x02\x00\x00K(j\xf0\x02\x00\x00K)j\xf1\x02\x00\x00K*j\xf2\x02\x00\x00K+j\xf3\x02\x00\x00K,j\xf4\x02\x00\x00K-j\xf5\x02\x00\x00K.j\xf6\x02\x00\x00K/j\xf7\x02\x00\x00K0j\xf8\x02\x00\x00K1j\xf9\x02\x00\x00K2j\xfa\x02\x00\x00K3j\xfb\x02\x00\x00K4j\xfc\x02\x00\x00K5j\xfd\x02\x00\x00K6j\xfe\x02\x00\x00K7j\xff\x02\x00\x00K8j\x00\x03\x00\x00K9j\x01\x03\x00\x00K:j\x02\x03\x00\x00K;j\x03\x03\x00\x00K<j\x04\x03\x00\x00K=j\x05\x03\x00\x00K>j\x06\x03\x00\x00K?j\x07\x03\x00\x00K@j\x08\x03\x00\x00KAj\t\x03\x00\x00KBj\n\x03\x00\x00KCj\x0b\x03\x00\x00KDj\x0c\x03\x00\x00KEj\r\x03\x00\x00KFj\x0e\x03\x00\x00KGj\x0f\x03\x00\x00KHj\x10\x03\x00\x00KIj\x11\x03\x00\x00KJj\x12\x03\x00\x00KKj\x13\x03\x00\x00KLj\x14\x03\x00\x00KMj\x15\x03\x00\x00KNj\x16\x03\x00\x00KOj\x17\x03\x00\x00KPj\x18\x03\x00\x00KQj\x19\x03\x00\x00KRj\x1a\x03\x00\x00KSj\x1b\x03\x00\x00KTj\x1c\x03\x00\x00KUj\x1d\x03\x00\x00KVj\x1e\x03\x00\x00KWj\x1f\x03\x00\x00KXj \x03\x00\x00KYj!\x03\x00\x00KZj"\x03\x00\x00K[j#\x03\x00\x00K\\j$\x03\x00\x00K]j%\x03\x00\x00K^j&\x03\x00\x00K_j\'\x03\x00\x00u\x8c\x05plate\x94}\x94(K\x00\x8c\x08plate1-2\x94K\x01j\xb5\x04\x00\x00K\x02j\xb5\x04\x00\x00K\x03j\xb5\x04\x00\x00K\x04j\xb5\x04\x00\x00K\x05j\xb5\x04\x00\x00K\x06j\xb5\x04\x00\x00K\x07j\xb5\x04\x00\x00K\x08j\xb5\x04\x00\x00K\tj\xb5\x04\x00\x00K\nj\xb5\x04\x00\x00K\x0bj\xb5\x04\x00\x00K\x0cj\xb5\x04\x00\x00K\rj\xb5\x04\x00\x00K\x0ej\xb5\x04\x00\x00K\x0fj\xb5\x04\x00\x00K\x10j\xb5\x04\x00\x00K\x11j\xb5\x04\x00\x00K\x12j\xb5\x04\x00\x00K\x13j\xb5\x04\x00\x00K\x14j\xb5\x04\x00\x00K\x15j\xb5\x04\x00\x00K\x16j\xb5\x04\x00\x00K\x17j\xb5\x04\x00\x00K\x18j\xb5\x04\x00\x00K\x19j\xb5\x04\x00\x00K\x1aj\xb5\x04\x00\x00K\x1bj\xb5\x04\x00\x00K\x1cj\xb5\x04\x00\x00K\x1dj\xb5\x04\x00\x00K\x1ej\xb5\x04\x00\x00K\x1fj\xb5\x04\x00\x00K j\xb5\x04\x00\x00K!j\xb5\x04\x00\x00K"j\xb5\x04\x00\x00K#j\xb5\x04\x00\x00K$j\xb5\x04\x00\x00K%j\xb5\x04\x00\x00K&j\xb5\x04\x00\x00K\'j\xb5\x04\x00\x00K(j\xb5\x04\x00\x00K)j\xb5\x04\x00\x00K*j\xb5\x04\x00\x00K+j\xb5\x04\x00\x00K,j\xb5\x04\x00\x00K-j\xb5\x04\x00\x00K.j\xb5\x04\x00\x00K/j\xb5\x04\x00\x00K0j\xb5\x04\x00\x00K1j\xb5\x04\x00\x00K2j\xb5\x04\x00\x00K3j\xb5\x04\x00\x00K4j\xb5\x04\x00\x00K5j\xb5\x04\x00\x00K6j\xb5\x04\x00\x00K7j\xb5\x04\x00\x00K8j\xb5\x04\x00\x00K9j\xb5\x04\x00\x00K:j\xb5\x04\x00\x00K;j\xb5\x04\x00\x00K<j\xb5\x04\x00\x00K=j\xb5\x04\x00\x00K>j\xb5\x04\x00\x00K?j\xb5\x04\x00\x00K@j\xb5\x04\x00\x00KAj\xb5\x04\x00\x00KBj\xb5\x04\x00\x00KCj\xb5\x04\x00\x00KDj\xb5\x04\x00\x00KEj\xb5\x04\x00\x00KFj\xb5\x04\x00\x00KGj\xb5\x04\x00\x00KHj\xb5\x04\x00\x00KIj\xb5\x04\x00\x00KJj\xb5\x04\x00\x00KKj\xb5\x04\x00\x00KLj\xb5\x04\x00\x00KMj\xb5\x04\x00\x00KNj\xb5\x04\x00\x00KOj\xb5\x04\x00\x00KPj\xb5\x04\x00\x00KQj\xb5\x04\x00\x00KRj\xb5\x04\x00\x00KSj\xb5\x04\x00\x00KTj\xb5\x04\x00\x00KUj\xb5\x04\x00\x00KVj\xb5\x04\x00\x00KWj\xb5\x04\x00\x00KXj\xb5\x04\x00\x00KYj\xb5\x04\x00\x00KZj\xb5\x04\x00\x00K[j\xb5\x04\x00\x00K\\j\xb5\x04\x00\x00K]j\xb5\x04\x00\x00K^j\xb5\x04\x00\x00K_j\xb5\x04\x00\x00u\x8c\x0fplate_replicate\x94}\x94(K\x00j\xb5\x04\x00\x00K\x01j\xb5\x04\x00\x00K\x02j\xb5\x04\x00\x00K\x03j\xb5\x04\x00\x00K\x04j\xb5\x04\x00\x00K\x05j\xb5\x04\x00\x00K\x06j\xb5\x04\x00\x00K\x07j\xb5\x04\x00\x00K\x08j\xb5\x04\x00\x00K\tj\xb5\x04\x00\x00K\nj\xb5\x04\x00\x00K\x0bj\xb5\x04\x00\x00K\x0cj\xb5\x04\x00\x00K\rj\xb5\x04\x00\x00K\x0ej\xb5\x04\x00\x00K\x0fj\xb5\x04\x00\x00K\x10j\xb5\x04\x00\x00K\x11j\xb5\x04\x00\x00K\x12j\xb5\x04\x00\x00K\x13j\xb5\x04\x00\x00K\x14j\xb5\x04\x00\x00K\x15j\xb5\x04\x00\x00K\x16j\xb5\x04\x00\x00K\x17j\xb5\x04\x00\x00K\x18j\xb5\x04\x00\x00K\x19j\xb5\x04\x00\x00K\x1aj\xb5\x04\x00\x00K\x1bj\xb5\x04\x00\x00K\x1cj\xb5\x04\x00\x00K\x1dj\xb5\x04\x00\x00K\x1ej\xb5\x04\x00\x00K\x1fj\xb5\x04\x00\x00K j\xb5\x04\x00\x00K!j\xb5\x04\x00\x00K"j\xb5\x04\x00\x00K#j\xb5\x04\x00\x00K$j\xb5\x04\x00\x00K%j\xb5\x04\x00\x00K&j\xb5\x04\x00\x00K\'j\xb5\x04\x00\x00K(j\xb5\x04\x00\x00K)j\xb5\x04\x00\x00K*j\xb5\x04\x00\x00K+j\xb5\x04\x00\x00K,j\xb5\x04\x00\x00K-j\xb5\x04\x00\x00K.j\xb5\x04\x00\x00K/j\xb5\x04\x00\x00K0j\xb5\x04\x00\x00K1j\xb5\x04\x00\x00K2j\xb5\x04\x00\x00K3j\xb5\x04\x00\x00K4j\xb5\x04\x00\x00K5j\xb5\x04\x00\x00K6j\xb5\x04\x00\x00K7j\xb5\x04\x00\x00K8j\xb5\x04\x00\x00K9j\xb5\x04\x00\x00K:j\xb5\x04\x00\x00K;j\xb5\x04\x00\x00K<j\xb5\x04\x00\x00K=j\xb5\x04\x00\x00K>j\xb5\x04\x00\x00K?j\xb5\x04\x00\x00K@j\xb5\x04\x00\x00KAj\xb5\x04\x00\x00KBj\xb5\x04\x00\x00KCj\xb5\x04\x00\x00KDj\xb5\x04\x00\x00KEj\xb5\x04\x00\x00KFj\xb5\x04\x00\x00KGj\xb5\x04\x00\x00KHj\xb5\x04\x00\x00KIj\xb5\x04\x00\x00KJj\xb5\x04\x00\x00KKj\xb5\x04\x00\x00KLj\xb5\x04\x00\x00KMj\xb5\x04\x00\x00KNj\xb5\x04\x00\x00KOj\xb5\x04\x00\x00KPj\xb5\x04\x00\x00KQj\xb5\x04\x00\x00KRj\xb5\x04\x00\x00KSj\xb5\x04\x00\x00KTj\xb5\x04\x00\x00KUj\xb5\x04\x00\x00KVj\xb5\x04\x00\x00KWj\xb5\x04\x00\x00KX\x8c\nplate1-2-1\x94KY\x8c\nplate1-2-2\x94KZ\x8c\nplate1-2-3\x94K[\x8c\nplate1-2-4\x94K\\\x8c\nplate1-2-5\x94K]\x8c\nplate1-2-6\x94K^\x8c\nplate1-2-7\x94K_\x8c\nplate1-2-8\x94uuu\x8c\x04png8\x94e}\x94(h\xcc}\x94(\x8c\x0eviral_barcodes\x94K\x00N\x86\x94\x8c\x16neut_standard_barcodes\x94K\x01N\x86\x94ju\x03\x00\x00K\x02N\x86\x94\x8c\x0cplate_params\x94K\x03N\x86\x94\x8c\x14curve_display_method\x94K\x04N\x86\x94uh\xd4]\x94(h\xd6h\xd7eh\xd6h\xd9)\x81\x94}\x94h\xdch\xd6sbh\xd7h\xd9)\x81\x94}\x94h\xdch\xd7sbj\xc3\x04\x00\x00j\x0c\x01\x00\x00j\xc5\x04\x00\x00j\xbb\x02\x00\x00ju\x03\x00\x00j\xc7\x02\x00\x00j\xc8\x04\x00\x00j(\x03\x00\x00j\xca\x04\x00\x00j\xc0\x04\x00\x00ub\x8c\r_params_types\x94}\x94\x8c\twildcards\x94h\x06\x8c\tWildcards\x94\x93\x94)\x81\x94\x8c\x08plate1-2\x94a}\x94(h\xcc}\x94\x8c\x05plate\x94K\x00N\x86\x94sh\xd4]\x94(h\xd6h\xd7eh\xd6h\xd9)\x81\x94}\x94h\xdch\xd6sbh\xd7h\xd9)\x81\x94}\x94h\xdch\xd7sbj\xb3\x04\x00\x00j\xd7\x04\x00\x00ub\x8c\x07threads\x94K\x01\x8c\tresources\x94h\x06\x8c\tResources\x94\x93\x94)\x81\x94(K\x01K\x01\x8c\x15/loc/scratch/30805658\x94e}\x94(h\xcc}\x94(\x8c\x06_cores\x94K\x00N\x86\x94\x8c\x06_nodes\x94K\x01N\x86\x94\x8c\x06tmpdir\x94K\x02N\x86\x94uh\xd4]\x94(h\xd6h\xd7eh\xd6h\xd9)\x81\x94}\x94h\xdch\xd6sbh\xd7h\xd9)\x81\x94}\x94h\xdch\xd7sbj\xe9\x04\x00\x00K\x01j\xeb\x04\x00\x00K\x01j\xed\x04\x00\x00j\xe6\x04\x00\x00ub\x8c\x03log\x94h\x06\x8c\x03Log\x94\x93\x94)\x81\x94\x8c.results/plates/plate1-2/process_plate1-2.ipynb\x94a}\x94(h\xcc}\x94\x8c\x08notebook\x94K\x00N\x86\x94sh\xd4]\x94(h\xd6h\xd7eh\xd6h\xd9)\x81\x94}\x94h\xdch\xd6sbh\xd7h\xd9)\x81\x94}\x94h\xdch\xd7sbj\xfb\x04\x00\x00j\xf8\x04\x00\x00ub\x8c\x06config\x94}\x94(\x8c\x16recent_vaccine_strains\x94}\x94(\x8c\x1fA/Croatia/10136RV/2023-egg_H3N2\x94\x8c\x1b2025-2026 egg-based vaccine\x94\x8c!A/DistrictOfColumbia/27/2023_H3N2\x94\x8c\x1c2025-2026 cell-based vaccine\x94\x8c!A/Victoria/4897/2022_IVR-238_H1N1\x94\x8c\x1b2025-2026 egg-based vaccine\x94\x8c\x18A/Wisconsin/67/2022_H1N1\x94\x8c\x1c2025-2026 cell-based vaccine\x94\x8c\x16A/Thailand/8/2022_H3N2\x94\x8c\x1b2024-2025 egg-based vaccine\x94\x8c\x1cA/Massachusetts/18/2022_H3N2\x94\x8c\x1c2024-2025 cell-based vaccine\x94u\x8c\x1chuman_sera_groups_to_exclude\x94]\x94\x8c\x03FCI\x94a\x8c\x15human_sera_to_exclude\x94]\x94(\x8c\x06SCH_19\x94\x8c\x06SCH_22\x94\x8c\x06SCH_26\x94e\x8c\x17human_sera_plots_params\x94}\x94(\x8c\x0ctiter_cutoff\x94K\x8c\x8c\x11titer_lower_limit\x94K(\x8c\x10min_frac_strains\x94G?\xec\xcc\xcc\xcc\xcc\xcc\xcd\x8c\rmin_frac_sera\x94G?\xe8\x00\x00\x00\x00\x00\x00\x8c\x0fmin_frac_action\x94\x8c\x05raise\x94u\x8c\x10seqneut-pipeline\x94\x8c\x10seqneut-pipeline\x94\x8c\x04docs\x94\x8c\x04docs\x94\x8c\x0bdescription\x94X\x1b\x01\x00\x00# Sequencing-based neutralization assays using human serum samples collected in late 2024-2025 and combined pdmH1N1 and H3N2 influenza library\n\nThe numerical data and computer code are at [https://github.com/jbloomlab/flu-seqneut-2025](https://github.com/jbloomlab/flu-seqneut-2025)\n\x94\x8c\x0fviral_libraries\x94}\x94(\x8c!flu-seqneut-2025_library_designed\x94\x8cDdata/viral_libraries/flu-seqneut-2025-barcode-to-strain_designed.csv\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8cBdata/viral_libraries/flu-seqneut-2025-barcode-to-strain_actual.csv\x94u\x8c\x17viral_strain_plot_order\x94\x8c4data/viral_libraries/flu-seqneut-2025_plot_order.csv\x94\x8c\x12neut_standard_sets\x94}\x94\x8c\x08loes2023\x94\x8c3data/neut_standard_sets/loes2023_neut_standards.csv\x94s\x8c\x1eillumina_barcode_parser_params\x94}\x94(jj\x03\x00\x00jk\x03\x00\x00jl\x03\x00\x00jm\x03\x00\x00jn\x03\x00\x00K\x14jo\x03\x00\x00K\x04jp\x03\x00\x00jq\x03\x00\x00u\x8c#default_process_plate_qc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c%default_process_plate_curvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00]\x94(G?\xe3333333K\x01ejZ\x03\x00\x00K\x00j[\x03\x00\x00]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c!default_process_plate_curvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00]\x94jf\x03\x00\x00]\x94u\x8c\x16default_serum_titer_as\x94\x8c\x08midpoint\x94\x8c\x1bdefault_serum_qc_thresholds\x94}\x94(\x8c\x0emin_replicates\x94K\x01\x8c\x1bmax_fold_change_from_median\x94K\x06\x8c\x11viruses_ignore_qc\x94]\x94u\x8c\x16sera_override_defaults\x94}\x94\x8c\x06plates\x94}\x94(j\xb5\x04\x00\x00}\x94(j)\x03\x00\x00j*\x03\x00\x00j+\x03\x00\x00\x8c\x08datetime\x94\x8c\x04date\x94\x93\x94C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94j-\x03\x00\x00j.\x03\x00\x00j/\x03\x00\x00j0\x03\x00\x00j1\x03\x00\x00j2\x03\x00\x00j3\x03\x00\x00}\x94j5\x03\x00\x00]\x94(j7\x03\x00\x00j8\x03\x00\x00j9\x03\x00\x00j:\x03\x00\x00j;\x03\x00\x00j<\x03\x00\x00j=\x03\x00\x00j>\x03\x00\x00j?\x03\x00\x00j@\x03\x00\x00jA\x03\x00\x00jB\x03\x00\x00esjC\x03\x00\x00}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06ujU\x03\x00\x00}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00uj]\x03\x00\x00}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00ujh\x03\x00\x00}\x94(jr\x03\x00\x00js\x03\x00\x00jt\x03\x00\x00K\x01uu\x8c\x08plate2-2\x94}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c#data/plates/2025-08-11_plate2-2.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate3\x94}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-11_plate3.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate4\x94}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-11_plate4.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GTCTAA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate6\x94}\x94(\x8c\x05group\x94\x8c\x03FCI\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-12_plate6.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\nplate7_FCI\x94}\x94(\x8c\x05group\x94\x8c\x03FCI\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c%data/plates/2025-08-12_plate7_FCI.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\nplate7_SCH\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c%data/plates/2025-08-12_plate7_SCH.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate8\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-12_plate8.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate9\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-13_plate9.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GTCTAA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate10\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-13_plate10.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ACGCTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate11\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-13_plate11.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TATAGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x0bplate12_SCH\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c&data/plates/2025-08-13_plate12_SCH.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CGAGCT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\rplate12_EPIHK\x94}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c(data/plates/2025-08-13_plate12_EPIHK.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CGAGCT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate13\x94}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-18_plate13.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate14\x94}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-18_plate14.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate15\x94}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-18_plate15.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate16\x94}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-18_plate16.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate17\x94}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-20_plate17.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GTCTAA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate18\x94}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-20_plate18.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ACGCTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate19\x94}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-20_plate19.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TATAGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate20\x94}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x1fflu-seqneut-2025_library_actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-20_plate20.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(jE\x03\x00\x00M\xf4\x01jF\x03\x00\x00G?tz\xe1G\xae\x14{jG\x03\x00\x00}\x94(jI\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jJ\x03\x00\x00K\x04jK\x03\x00\x00K\x02ujL\x03\x00\x00}\x94(jN\x03\x00\x00G?tz\xe1G\xae\x14{jO\x03\x00\x00K\x04jP\x03\x00\x00K\x02ujQ\x03\x00\x00M\xe8\x03jR\x03\x00\x00KdjS\x03\x00\x00K\x03jT\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jW\x03\x00\x00K\x01jX\x03\x00\x00j<\x05\x00\x00jZ\x03\x00\x00K\x00j[\x03\x00\x00j=\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j_\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j`\x03\x00\x00}\x94(jb\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jc\x03\x00\x00G?\xc3333333ujd\x03\x00\x00jA\x05\x00\x00jf\x03\x00\x00jB\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CGAGCT\x94\x8c\x12upstream2_mismatch\x94K\x01uuu\x8c\x14miscellaneous_plates\x94}\x94(\x8c\x1520250716_initial_pool\x94}\x94(\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x07\x10\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c!flu-seqneut-2025_library_designed\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c5data/miscellaneous_plates/2025-07-16_initial_pool.csv\x94\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x1620250723_balanced_pool\x94}\x94(\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x07\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c!flu-seqneut-2025_library_designed\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c8data/miscellaneous_plates/2025-07-23_balanced_repool.csv\x94\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c(20250723_H3_and_partial_H1_balanced_pool\x94}\x94(\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x07\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c!flu-seqneut-2025_library_designed\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cJdata/miscellaneous_plates/2025-07-23_H3_and_partial_H1_balanced_repool.csv\x94\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x1620250807_balanced_pool\x94}\x94(\x8c\x04date\x94jR\x05\x00\x00C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c!flu-seqneut-2025_library_designed\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c8data/miscellaneous_plates/2025-08-07_balanced_repool.csv\x94\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuuu\x8c\x04rule\x94\x8c\rprocess_plate\x94\x8c\x0fbench_iteration\x94N\x8c\tscriptdir\x94\x8c`/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025/seqneut-pipeline/notebooks\x94ub.');del script;from snakemake.logging import logger;from snakemake.script import snakemake;import os; os.chdir(r'/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025');
######## snakemake preamble end #########
Process plate counts to get fraction infectivities and fit curves¶
This notebook is designed to be run using snakemake
, and analyzes a plate of sequencing-based neutralization assays.
The plots generated by this notebook are interactive, so you can mouseover points for details, use the mouse-scroll to zoom and pan, and use interactive dropdowns at the bottom of the plots.
Setup¶
Import Python modules:
import pickle
import sys
import warnings
import altair as alt
import matplotlib.pyplot as plt
import matplotlib.style
import neutcurve
from neutcurve.colorschemes import CBPALETTE, CBMARKERS
import numpy
import pandas as pd
import ruamel.yaml as yaml
_ = alt.data_transformers.disable_max_rows()
# avoid clutter w RuntimeWarning during curve fitting
warnings.filterwarnings("ignore", category=RuntimeWarning)
# faster plotting of neut curves
matplotlib.style.use("fast")
Get the variables passed by snakemake
:
count_csvs = snakemake.input.count_csvs
fate_csvs = snakemake.input.fate_csvs
notebook_funcs = snakemake.input.notebook_funcs
qc_drops_yaml = snakemake.output.qc_drops
frac_infectivity_csv = snakemake.output.frac_infectivity_csv
fits_csv = snakemake.output.fits_csv
fits_pickle = snakemake.output.fits_pickle
viral_barcodes = snakemake.params.viral_barcodes
neut_standard_barcodes = snakemake.params.neut_standard_barcodes
samples = snakemake.params.samples
plate = snakemake.wildcards.plate
plate_params = snakemake.params.plate_params
curve_display_method = snakemake.params.curve_display_method
# get thresholds turning lists into tuples as needed
manual_drops = {
filter_type: [tuple(w) if isinstance(w, list) else w for w in filter_drops]
for (filter_type, filter_drops) in plate_params["manual_drops"].items()
}
group = plate_params["group"]
qc_thresholds = plate_params["qc_thresholds"]
curvefit_params = plate_params["curvefit_params"]
curvefit_qc = plate_params["curvefit_qc"]
curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"] = [
tuple(w) for w in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
]
print(f"Processing {plate=}")
samples_df = pd.DataFrame(plate_params["samples"])
print(f"\nPlate has {len(samples)} samples (wells)")
assert all(
(len(samples_df) == samples_df[c].nunique())
for c in ["well", "sample", "sample_noplate"]
)
assert len(samples_df) == len(
samples_df.groupby(["serum_replicate", "dilution_factor"])
)
assert len(samples) == len(count_csvs) == len(fate_csvs) == len(samples_df)
for d, key, title in [
(manual_drops, "manual_drops", "Data manually specified to drop:"),
(qc_thresholds, "qc_thresholds", "QC thresholds applied to data:"),
(curvefit_params, "curvefit_params", "Curve-fitting parameters:"),
(curvefit_qc, "curvefit_qc", "Curve-fitting QC:"),
]:
print(f"\n{title}")
yaml.YAML(typ="rt").dump({key: d}, stream=sys.stdout)
Processing plate='plate1-2' Plate has 96 samples (wells) Data manually specified to drop: manual_drops: wells: - H1 - H2 - H3 - H4 - H5 - H6 - H7 - H8 - H9 - H10 - H11 - H12
QC thresholds applied to data: qc_thresholds: avg_barcode_counts_per_well: 500 min_neut_standard_frac_per_well: 0.005 no_serum_per_viral_barcode_filters: min_frac: 0.0001 max_fold_change: 4 max_wells: 2 per_neut_standard_barcode_filters: min_frac: 0.005 max_fold_change: 4 max_wells: 2 min_neut_standard_count_per_well: 1000 min_no_serum_count_per_viral_barcode_well: 100 max_frac_infectivity_per_viral_barcode_well: 3 min_dilutions_per_barcode_serum_replicate: 6
Curve-fitting parameters: curvefit_params: frac_infectivity_ceiling: 1 fixtop: - 0.6 - 1 fixbottom: 0 fixslope: - 0.8 - 10
Curve-fitting QC: curvefit_qc: max_frac_infectivity_at_least: 0.0 goodness_of_fit: min_R2: 0.5 max_RMSD: 0.15 serum_replicates_ignore_curvefit_qc: [] barcode_serum_replicates_ignore_curvefit_qc: []
Load the notebook functions:
print(f"Loading {notebook_funcs=}")
%run {notebook_funcs}
Loading notebook_funcs='/home/jbloom/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpfro_n8p6/file/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025/seqneut-pipeline/notebook_funcs.py'
Set up dictionary to keep track of wells, barcodes, well-barcodes, and serum-replicates that are dropped:
qc_drops = {
"wells": {},
"barcodes": {},
"barcode_wells": {},
"barcode_serum_replicates": {},
"serum_replicates": {},
}
assert set(manual_drops).issubset(
qc_drops
), f"{manual_drops.keys()=}, {qc_drops.keys()}"
Statistics on barcode-parsing for each sample¶
Make interactive chart of the "fates" of the sequencing reads parsed for each sample on the plate.
If most sequencing reads are not "valid barcodes", this could potentially indicate some problem in the sequencing or barcode set you are parsing.
Potential fates are:
- valid barcode: barcode that matches a known virus or neutralization standard, we hope most reads are this.
- invalid barcode: a barcode with proper flanking sequences, but does not match a known virus or neutralization standard. If you have a lot of reads of this type, it is probably a good idea to look at the invalid barcode CSVs (in the
./results/barcode_invalid/
subdirectory created by the pipeline) to see what these invalid barcodes are. - unparseable barcode: could not parse a barcode from this read as there was not a sequence of the correct length with the appropriate flanking sequence.
- invalid outer flank: if using an outer upstream or downstream region (
upstream2
ordownstream2
for the illuminabarcodeparser), reads that are otherwise valid except for this outer flank. Typically you would be usingupstream2
if you have a plate index embedded in your primer, and reads with this classification correspond to a different index than the one for this plate. - low quality barcode: low-quality or
N
nucleotides in barcode, could indicate problem with sequencing. - failed chastity filter: reads that failed the Illumina chastity filter, if these are reported in the FASTQ (they may not be).
Also, if the number of reads per sample is very uneven, that could indicate that you did not do a good job of balancing the different samples in the Illumina sequencing.
fates = (
pd.concat([pd.read_csv(f).assign(sample=s) for f, s in zip(fate_csvs, samples)])
.merge(samples_df, validate="many_to_one", on="sample")
.assign(
fate_counts=lambda x: x.groupby("fate")["count"].transform("sum"),
sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")",
)
.query("fate_counts > 0")[ # only keep fates with at least one count
["fate", "count", "well", "serum_replicate", "sample_well", "dilution_factor"]
]
)
assert len(fates) == len(fates.drop_duplicates())
serum_replicates = sorted(fates["serum_replicate"].unique())
sample_wells = list(
fates.sort_values(["serum_replicate", "dilution_factor"])["sample_well"]
)
serum_selection = alt.selection_point(
fields=["serum_replicate"],
bind=alt.binding_select(
options=[None] + serum_replicates,
labels=["all"] + serum_replicates,
name="serum",
),
)
fates_chart = (
alt.Chart(fates)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X("count", scale=alt.Scale(nice=False, padding=3)),
alt.Y(
"sample_well",
title=None,
sort=sample_wells,
),
alt.Color("fate", sort=sorted(fates["fate"].unique(), reverse=True)),
alt.Order("fate", sort="descending"),
tooltip=fates.columns.tolist(),
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=200,
title=f"Barcode parsing for {plate}",
)
.configure_axis(grid=False)
)
fates_chart
Read barcode counts and apply manually specified drops¶
Read the counts per barcode:
# get barcode counts
counts = (
pd.concat([pd.read_csv(c).assign(sample=s) for c, s in zip(count_csvs, samples)])
.merge(samples_df, validate="many_to_one", on="sample")
.drop(columns=["replicate", "plate", "fastq"])
.assign(sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")")
)
# classify barcodes as viral or neut standard
barcode_class = pd.concat(
[
pd.DataFrame(viral_barcodes).assign(neut_standard=False),
pd.DataFrame(neut_standard_barcodes).assign(neut_standard=True, strain=pd.NA),
],
ignore_index=True,
)
# merge counts and classification of barcodes
assert set(counts["barcode"]) == set(barcode_class["barcode"])
counts = counts.merge(barcode_class, on="barcode", validate="many_to_one")
assert set(sample_wells) == set(counts["sample_well"])
assert set(serum_replicates) == set(counts["serum_replicate"])
Apply any manually specified data drops:
for filter_type, filter_drops in manual_drops.items():
print(f"\nDropping {len(filter_drops)} {filter_type} specified in manual_drops")
assert filter_type in qc_drops
qc_drops[filter_type].update(
{w: "manual_drop" for w in filter_drops if not isinstance(w, list)}
)
if filter_type == "barcode_wells":
counts = counts[
~counts.assign(
barcode_well=lambda x: x.apply(
lambda r: (r["barcode"], r["well"]), axis=1
)
)["barcode_well"].isin(qc_drops[filter_type])
]
elif filter_type == "barcode_serum_replicates":
counts = counts[
~counts.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops[filter_type])
]
elif filter_type == "wells":
counts = counts[~counts["well"].isin(qc_drops[filter_type])]
elif filter_type == "barcodes":
counts = counts[~counts["barcode"].isin(qc_drops[filter_type])]
elif filter_type == "serum_replicates":
counts = counts[~counts["serum_replicate"].isin(qc_drops[filter_type])]
elif filter_type == "barcode_serum_replicates":
counts = counts[~counts["barcode_serum_replicate"].isin(qc_drops[filter_type])]
else:
assert filter_type in set(counts.columns)
counts = counts[~counts[filter_type].isin(qc_drops[filter_type])]
Dropping 12 wells specified in manual_drops
Average counts per barcode in each well¶
Plot average counts per barcode. If a sample has inadequate barcode counts, it may not have good enough statistics for accurate analysis, and a QC-threshold is applied:
avg_barcode_counts = (
counts.groupby(
["well", "serum_replicate", "sample_well"],
dropna=False,
as_index=False,
)
.aggregate(avg_count=pd.NamedAgg("count", "mean"))
.assign(
fails_qc=lambda x: (
x["avg_count"] < qc_thresholds["avg_barcode_counts_per_well"]
),
)
)
avg_barcode_counts_chart = (
alt.Chart(avg_barcode_counts)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"avg_count",
title="average barcode counts per well",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['avg_barcode_counts_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
alt.Tooltip(c, format=".3g") if avg_barcode_counts[c].dtype == float else c
for c in avg_barcode_counts.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Average barcode counts per well for {plate}",
)
.configure_axis(grid=False)
)
display(avg_barcode_counts_chart)
# drop wells failing QC
avg_barcode_counts_per_well_drops = list(avg_barcode_counts.query("fails_qc")["well"])
print(
f"\nDropping {len(avg_barcode_counts_per_well_drops)} wells for failing "
f"{qc_thresholds['avg_barcode_counts_per_well']=}: "
+ str(avg_barcode_counts_per_well_drops)
)
qc_drops["wells"].update(
{w: "avg_barcode_counts_per_well" for w in avg_barcode_counts_per_well_drops}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 2 wells for failing qc_thresholds['avg_barcode_counts_per_well']=500: ['B11', 'F2']
Fraction of counts from neutralization standard¶
Determine the fraction of counts from the neutralization standard in each sample, and make sure this fraction passess the QC threshold.
neut_standard_fracs = (
counts.assign(
neut_standard_count=lambda x: x["count"] * x["neut_standard"].astype(int)
)
.groupby(
["well", "serum_replicate", "sample_well"],
dropna=False,
as_index=False,
)
.aggregate(
total_count=pd.NamedAgg("count", "sum"),
neut_standard_count=pd.NamedAgg("neut_standard_count", "sum"),
)
.assign(
neut_standard_frac=lambda x: x["neut_standard_count"] / x["total_count"],
fails_qc=lambda x: (
x["neut_standard_frac"] < qc_thresholds["min_neut_standard_frac_per_well"]
),
)
)
neut_standard_fracs_chart = (
alt.Chart(neut_standard_fracs)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"neut_standard_frac",
title="frac counts from neutralization standard per well",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['min_neut_standard_frac_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
alt.Tooltip(c, format=".3g") if neut_standard_fracs[c].dtype == float else c
for c in neut_standard_fracs.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Neutralization-standard fracs per well for {plate}",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(neut_standard_fracs_chart)
# drop wells failing QC
min_neut_standard_frac_per_well_drops = list(
neut_standard_fracs.query("fails_qc")["well"]
)
print(
f"\nDropping {len(min_neut_standard_frac_per_well_drops)} wells for failing "
f"{qc_thresholds['min_neut_standard_frac_per_well']=}: "
+ str(min_neut_standard_frac_per_well_drops)
)
qc_drops["wells"].update(
{
w: "min_neut_standard_frac_per_well"
for w in min_neut_standard_frac_per_well_drops
}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_frac_per_well']=0.005: []
Consistency and minimum fractions for barcodes¶
We examine the fraction of counts attributable to each barcode. We do this splitting the data two ways:
Looking at all viral (but not neut-standard) barcodes only for the no-serum samples (wells).
Looking at just the neut-standard barcodes for all samples (wells).
The reasons is that if the experiment is set up perfectly, these fractions should be the same across all samples for each barcode. (We do not expect viral barcodes to have consistent fractions across no-serum samples as they will be neutralized differently depending on strain).
We plot these fractions in interactive plots (you can mouseover points and zoom) so you can identify barcodes that fail the expected consistency QC thresholds.
We also make sure the barcodes meet specified QC minimum thresholds for all samples, and flag any that do not.
barcode_selection = alt.selection_point(fields=["barcode"], on="mouseover", empty=False)
# look at all samples for neut standard barcodes, or no-serum samples for all barcodes
for is_neut_standard, df in counts.groupby("neut_standard"):
if is_neut_standard:
print(
f"\n\n{'=' * 89}\nAnalyzing neut-standard barcodes from all samples (wells)"
)
qc_name = "per_neut_standard_barcode_filters"
else:
print(f"\n\n{'=' * 89}\nAnalyzing all barcodes from no-serum samples (wells)")
qc_name = "no_serum_per_viral_barcode_filters"
df = df.query("serum == 'none'")
df = df.assign(
sample_counts=lambda x: x.groupby("sample")["count"].transform("sum"),
count_frac=lambda x: x["count"] / x["sample_counts"],
median_count_frac=lambda x: x.groupby("barcode")["count_frac"].transform(
"median"
),
fold_change_from_median=lambda x: numpy.where(
x["count_frac"] > x["median_count_frac"],
x["count_frac"] / x["median_count_frac"],
x["median_count_frac"] / x["count_frac"],
),
)[
[
"barcode",
"count",
"sample_well",
"count_frac",
"fold_change_from_median",
]
+ ([] if is_neut_standard else ["strain"])
]
# barcode fails QC if fails in sufficient wells
qc = qc_thresholds[qc_name]
print(f"Apply QC {qc_name}: {qc}\n")
fails_qc = (
df.assign(
fails_qc=lambda x: ~(
(x["count_frac"] >= qc["min_frac"])
& (x["fold_change_from_median"] <= qc["max_fold_change"])
),
)
.groupby("barcode", as_index=False)
.aggregate(n_wells_fail_qc=pd.NamedAgg("fails_qc", "sum"))
.assign(fails_qc=lambda x: x["n_wells_fail_qc"] >= qc["max_wells"])[
["barcode", "fails_qc"]
]
)
df = df.merge(fails_qc, on="barcode", validate="many_to_one")
# make chart
evenness_chart = (
alt.Chart(df)
.add_params(barcode_selection)
.encode(
alt.X(
"count_frac",
title=(
"barcode's fraction of neut standard counts"
if is_neut_standard
else "barcode's fraction of non-neut standard counts"
),
scale=alt.Scale(nice=False, padding=5),
),
alt.Y("sample_well", sort=sample_wells),
alt.Fill(
"fails_qc",
title=f"fails {qc_name}",
legend=alt.Legend(titleLimit=500),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".2g") if df[c].dtype == float else c
for c in df.columns
],
)
.mark_circle(fillOpacity=0.45, stroke="black", strokeOpacity=1)
.properties(
height=alt.Step(10),
width=300,
title=alt.TitleParams(
(
f"{plate} all samples, neut-standard barcodes"
if is_neut_standard
else f"{plate} no-serum samples, all barcodes"
),
subtitle="x-axis is zoomable (use mouse scroll/pan)",
),
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.interactive()
)
display(evenness_chart)
# drop barcodes failing QC
barcode_drops = list(fails_qc.query("fails_qc")["barcode"])
print(
f"\nDropping {len(barcode_drops)} barcodes for failing {qc=}: {barcode_drops}"
)
qc_drops["barcodes"].update(
{bc: "min_neut_standard_frac_per_well" for bc in barcode_drops}
)
counts = counts[~counts["barcode"].isin(qc_drops["barcodes"])]
========================================================================================= Analyzing all barcodes from no-serum samples (wells) Apply QC no_serum_per_viral_barcode_filters: {'min_frac': 0.0001, 'max_fold_change': 4, 'max_wells': 2}
Dropping 0 barcodes for failing qc={'min_frac': 0.0001, 'max_fold_change': 4, 'max_wells': 2}: [] ========================================================================================= Analyzing neut-standard barcodes from all samples (wells) Apply QC per_neut_standard_barcode_filters: {'min_frac': 0.005, 'max_fold_change': 4, 'max_wells': 2}
Dropping 0 barcodes for failing qc={'min_frac': 0.005, 'max_fold_change': 4, 'max_wells': 2}: []
Compute fraction infectivity¶
The fraction infectivity for viral barcode $v_b$ in sample $s$ is computed as: $$ F_{v_b,s} = \frac{c_{v_b,s} / \left(\sum_{n_b} c_{n_b,s}\right)}{{\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]} $$ where
- $c_{v_b,s}$ is the counts of viral barcode $v_b$ in sample $s$.
- $\sum_{n_b} c_{n_b,s}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for sample $s$.
- $c_{v_b,s_0}$ is the counts of viral barcode $v_b$ in no-serum sample $s_0$.
- $\sum_{n_b} c_{n_b,s_0}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for no-serum sample $s_0$.
- ${\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]$ is the median taken across all no-serum samples of the counts of viral barcode $v_b$ versus the total counts for all neutralization standard barcodes.
First, compute the total neutralization-standard counts for each sample (well). Plot these, and drop any wells that do not meet the QC threshold.
neut_standard_counts = (
counts.query("neut_standard")
.groupby(
["well", "serum_replicate", "sample_well", "dilution_factor"],
dropna=False,
as_index=False,
)
.aggregate(neut_standard_count=pd.NamedAgg("count", "sum"))
.assign(
fails_qc=lambda x: (
x["neut_standard_count"] < qc_thresholds["min_neut_standard_count_per_well"]
),
)
)
neut_standard_counts_chart = (
alt.Chart(neut_standard_counts)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"neut_standard_count",
title="counts from neutralization standard",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['min_neut_standard_count_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if neut_standard_counts[c].dtype == float
else c
)
for c in neut_standard_counts.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Neutralization-standard counts for {plate}",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(neut_standard_counts_chart)
# drop wells failing QC
min_neut_standard_count_per_well_drops = list(
neut_standard_counts.query("fails_qc")["well"]
)
print(
f"\nDropping {len(min_neut_standard_count_per_well_drops)} wells for failing "
f"{qc_thresholds['min_neut_standard_count_per_well']=}: "
+ str(min_neut_standard_count_per_well_drops)
)
qc_drops["wells"].update(
{
w: "min_neut_standard_count_per_well"
for w in min_neut_standard_count_per_well_drops
}
)
neut_standard_counts = neut_standard_counts[
~neut_standard_counts["well"].isin(qc_drops["wells"])
]
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_count_per_well']=1000: []
Compute and plot the no-serum sample viral barcode counts and check if they pass the QC filters.
no_serum_counts = (
counts.query("serum == 'none'")
.query("not neut_standard")
.merge(neut_standard_counts, validate="many_to_one")[
["barcode", "strain", "well", "sample_well", "count", "neut_standard_count"]
]
.assign(
fails_qc=lambda x: (
x["count"] <= qc_thresholds["min_no_serum_count_per_viral_barcode_well"]
),
)
)
strains = sorted(no_serum_counts["strain"].unique())
strain_selection_dropdown = alt.selection_point(
fields=["strain"],
bind=alt.binding_select(
options=[None] + strains,
labels=["all"] + strains,
name="virus strain",
),
)
# make chart
no_serum_counts_plot_df = no_serum_counts.drop(columns=["well", "neut_standard_count"])
no_serum_counts_chart = (
alt.Chart(no_serum_counts_plot_df)
.add_params(barcode_selection, strain_selection_dropdown)
.transform_filter(strain_selection_dropdown)
.encode(
alt.X(
"count", title="viral barcode count", scale=alt.Scale(nice=False, padding=5)
),
alt.Y("sample_well", sort=sample_wells),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}",
legend=alt.Legend(titleLimit=500),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
tooltip=no_serum_counts_plot_df.columns.tolist(),
)
.mark_circle(fillOpacity=0.6, stroke="black", strokeOpacity=1)
.properties(
height=alt.Step(10),
width=400,
title=f"{plate} viral barcode counts in no-serum samples",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.interactive()
)
display(no_serum_counts_chart)
# drop barcode / wells failing QC
min_no_serum_count_per_viral_barcode_well_drops = list(
no_serum_counts.query("fails_qc")[["barcode", "well"]].itertuples(
index=False, name=None
)
)
print(
f"\nDropping {len(min_no_serum_count_per_viral_barcode_well_drops)} barcode-wells for failing "
f"{qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}: "
+ str(min_no_serum_count_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
{
w: "min_no_serum_count_per_viral_barcode_well"
for w in min_no_serum_count_per_viral_barcode_well_drops
}
)
no_serum_counts = no_serum_counts[
~no_serum_counts.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
counts = counts[
~counts.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 0 barcode-wells for failing qc_thresholds['min_no_serum_count_per_viral_barcode_well']=100: []
Compute and plot the median ratio of viral barcode count to neut standard counts across no-serum samples. If library composition is equal, all of these values should be similar:
median_no_serum_ratio = (
no_serum_counts.assign(ratio=lambda x: x["count"] / x["neut_standard_count"])
.groupby(["barcode", "strain"], as_index=False)
.aggregate(median_no_serum_ratio=pd.NamedAgg("ratio", "median"))
)
strain_selection = alt.selection_point(fields=["strain"], on="mouseover", empty=False)
median_no_serum_ratio_chart = (
alt.Chart(median_no_serum_ratio)
.add_params(strain_selection)
.encode(
alt.X(
"median_no_serum_ratio",
title="median ratio of counts",
scale=alt.Scale(nice=False, padding=5),
),
alt.Y(
"barcode",
sort=alt.SortField("median_no_serum_ratio", order="descending"),
axis=alt.Axis(labelFontSize=5),
),
color=alt.condition(strain_selection, alt.value("orange"), alt.value("gray")),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if median_no_serum_ratio[c].dtype == float
else c
)
for c in median_no_serum_ratio.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(5),
width=250,
title=f"{plate} no-serum median ratio viral barcode to neut-standard barcode",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(median_no_serum_ratio_chart)
Compute the actual fraction infectivities. We compute both the raw fraction infectivities and the ones with the ceiling applied:
frac_infectivity = (
counts.query("not neut_standard")
.query("serum != 'none'")
.merge(median_no_serum_ratio, validate="many_to_one")
.merge(neut_standard_counts, validate="many_to_one")
.assign(
frac_infectivity_raw=lambda x: (
(x["count"] / x["neut_standard_count"]) / x["median_no_serum_ratio"]
),
frac_infectivity_ceiling=lambda x: x["frac_infectivity_raw"].clip(
upper=curvefit_params["frac_infectivity_ceiling"]
),
concentration=lambda x: 1 / x["dilution_factor"],
plate_barcode=lambda x: x["plate_replicate"] + "-" + x["barcode"],
)[
[
"barcode",
"plate_barcode",
"well",
"strain",
"serum",
"serum_replicate",
"dilution_factor",
"concentration",
"frac_infectivity_raw",
"frac_infectivity_ceiling",
]
]
)
assert len(
frac_infectivity.groupby(["serum", "plate_barcode", "dilution_factor"])
) == len(frac_infectivity)
assert frac_infectivity["dilution_factor"].notnull().all()
assert frac_infectivity["frac_infectivity_raw"].notnull().all()
assert frac_infectivity["frac_infectivity_ceiling"].notnull().all()
Plot the fraction infectivities, both the raw values and with the ceiling applied:
frac_infectivity_cols = {
"frac_infectivity_raw": "raw fraction infectivity",
"frac_infectivity_ceiling": f"fraction infectivity with ceiling at {curvefit_params['frac_infectivity_ceiling']}",
}
frac_infectivity_chart_df = frac_infectivity.assign(
fails_qc=lambda x: (
x["frac_infectivity_raw"]
> qc_thresholds["max_frac_infectivity_per_viral_barcode_well"]
),
)[
[
"barcode",
"strain",
"well",
"serum_replicate",
"dilution_factor",
"fails_qc",
*list(frac_infectivity_cols),
]
].rename(
columns=frac_infectivity_cols
)
# some manipulations to shrink data frame plotted by altair below by putting
# them in smaller data frames that are used via transform_lookup
barcode_lookup_df = frac_infectivity[["barcode", "strain"]].drop_duplicates()
assert len(barcode_lookup_df) == barcode_lookup_df["barcode"].nunique()
well_lookup_df = frac_infectivity[
["well", "serum_replicate", "dilution_factor"]
].drop_duplicates()
assert len(well_lookup_df) == well_lookup_df["well"].nunique()
frac_infectivity_chart_df = frac_infectivity_chart_df.drop(
columns=["strain", "serum_replicate", "dilution_factor"]
)
frac_infectivity_chart = (
alt.Chart(frac_infectivity_chart_df)
.transform_lookup(
lookup="barcode",
from_=alt.LookupData(barcode_lookup_df, key="barcode", fields=["strain"]),
)
.transform_lookup(
lookup="well",
from_=alt.LookupData(
well_lookup_df, key="well", fields=["serum_replicate", "dilution_factor"]
),
)
.transform_fold(
frac_infectivity_cols.values(), ["ceiling_applied", "frac_infectivity"]
)
.add_params(strain_selection_dropdown, barcode_selection)
.transform_filter(strain_selection_dropdown)
.encode(
alt.X(
"dilution_factor:Q",
title="dilution factor",
scale=alt.Scale(nice=False, padding=5, type="log"),
),
alt.Y(
"frac_infectivity:Q",
title="fraction infectivity",
scale=alt.Scale(nice=False, padding=5),
),
alt.Column(
"ceiling_applied:N",
sort="descending",
title=None,
header=alt.Header(labelFontSize=13, labelFontStyle="bold", labelPadding=2),
),
alt.Row(
"serum_replicate:N",
title=None,
spacing=3,
header=alt.Header(labelFontSize=13, labelFontStyle="bold"),
),
alt.Detail("barcode"),
alt.Shape(
"fails_qc",
title=f"fails {qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}",
legend=alt.Legend(titleLimit=500, orient="bottom"),
),
color=alt.condition(
barcode_selection, alt.value("black"), alt.value("MediumBlue")
),
strokeWidth=alt.condition(barcode_selection, alt.value(3), alt.value(1)),
opacity=alt.condition(barcode_selection, alt.value(1), alt.value(0.25)),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if frac_infectivity_chart_df[c].dtype == float
else c
)
for c in frac_infectivity_chart_df.columns
]
+ [
alt.Tooltip("strain:N"),
alt.Tooltip("serum_replicate:N"),
alt.Tooltip("dilution_factor:Q"),
],
)
.mark_line(point=True)
.properties(
height=150,
width=250,
title=f"Fraction infectivities for {plate}",
)
.interactive(bind_x=False)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.configure_point(size=50)
.resolve_scale(x="independent", y="independent")
)
display(frac_infectivity_chart)
# drop barcode / wells failing QC
max_frac_infectivity_per_viral_barcode_well_drops = list(
frac_infectivity_chart_df.query("fails_qc")[["barcode", "well"]]
.drop_duplicates()
.itertuples(index=False, name=None)
)
print(
f"\nDropping {len(max_frac_infectivity_per_viral_barcode_well_drops)} barcode-wells for failing "
f"{qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}: "
+ str(max_frac_infectivity_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
{
w: "max_frac_infectivity_per_viral_barcode_well"
for w in max_frac_infectivity_per_viral_barcode_well_drops
}
)
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 7 barcode-wells for failing qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=3: [('AGACCATCGCACCCAA', 'G2'), ('CTCTTACGCTCCTACG', 'G3'), ('CCGCATTAGCGGGAGG', 'G3'), ('AGACCATCGCACCCAA', 'G4'), ('TTAATGTAGCCGCTCC', 'C9'), ('TCGAGTTAATATGCGC', 'F9'), ('GTAATTCGCATGCGGA', 'D11')]
Check how many dilutions we have per barcode / serum-replicate:
n_dilutions = (
frac_infectivity.groupby(["serum_replicate", "strain", "barcode"], as_index=False)
.aggregate(**{"number of dilutions": pd.NamedAgg("dilution_factor", "nunique")})
.assign(
fails_qc=lambda x: (
x["number of dilutions"]
< qc_thresholds["min_dilutions_per_barcode_serum_replicate"]
),
)
)
n_dilutions_chart = (
alt.Chart(n_dilutions)
.add_params(barcode_selection)
.encode(
alt.X("number of dilutions", scale=alt.Scale(nice=False, padding=4)),
alt.Y("strain", title=None),
alt.Column(
"serum_replicate",
title=None,
header=alt.Header(labelFontSize=12, labelFontStyle="bold", labelPadding=0),
),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}",
legend=alt.Legend(titleLimit=500, orient="bottom"),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".3g") if n_dilutions[c].dtype == float else c
for c in n_dilutions.columns
],
)
.mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.45)
.properties(
height=alt.Step(10),
width=120,
title=alt.TitleParams(
"number of dilutions for each barcode for each serum-replicate", dy=-2
),
)
)
display(n_dilutions_chart)
# drop barcode / serum-replicates failing QC
min_dilutions_per_barcode_serum_replicate_drops = list(
n_dilutions.query("fails_qc")[["barcode", "serum_replicate"]].itertuples(
index=False, name=None
)
)
print(
f"\nDropping {len(min_dilutions_per_barcode_serum_replicate_drops)} barcode/serum-replicates for failing "
f"{qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}: "
+ str(min_dilutions_per_barcode_serum_replicate_drops)
)
qc_drops["barcode_serum_replicates"].update(
{
w: "min_dilutions_per_barcode_serum_replicate"
for w in min_dilutions_per_barcode_serum_replicate_drops
}
)
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Dropping 2 barcode/serum-replicates for failing qc_thresholds['min_dilutions_per_barcode_serum_replicate']=6: [('GTAATTCGCATGCGGA', 'UWMC-11'), ('AGACCATCGCACCCAA', 'UWMC-2')]
Fit neutralization curves without applying QC to curves¶
First fit curves to all serum replicates, then we will apply QC on the curve fits. Note that the fitting is done to the fraction infectivities with the ceiling:
fits_noqc = neutcurve.CurveFits(
frac_infectivity.rename(
columns={
"frac_infectivity_ceiling": "fraction infectivity",
"concentration": "serum concentration",
}
),
conc_col="serum concentration",
fracinf_col="fraction infectivity",
virus_col="strain",
serum_col="serum_replicate",
replicate_col="barcode",
fixtop=curvefit_params["fixtop"],
fixbottom=curvefit_params["fixbottom"],
fixslope=curvefit_params["fixslope"],
)
Determine which fits fail the curve fitting QC, and plot them. Note the plot indicates as failing QC any barcode / serum-replicate that fails, even if we are also specified to ignore the QC for that one (so it will not be removed later):
goodness_of_fit = curvefit_qc["goodness_of_fit"]
fit_params_noqc = (
frac_infectivity.groupby(["serum_replicate", "barcode"], as_index=False)
.aggregate(max_frac_infectivity=pd.NamedAgg("frac_infectivity_ceiling", "max"))
.merge(
fits_noqc.fitParams(average_only=False, no_average=True)[
["serum", "virus", "replicate", "r2", "rmsd"]
].rename(columns={"serum": "serum_replicate", "replicate": "barcode"}),
validate="one_to_one",
)
.assign(
fails_max_frac_infectivity_at_least=lambda x: (
x["max_frac_infectivity"] < curvefit_qc["max_frac_infectivity_at_least"]
),
fails_goodness_of_fit=lambda x: (
(x["r2"] < goodness_of_fit["min_R2"])
& (x["rmsd"] > goodness_of_fit["max_RMSD"])
),
fails_qc=lambda x: (
x["fails_max_frac_infectivity_at_least"] | x["fails_goodness_of_fit"]
),
ignore_qc=lambda x: x.apply(
lambda r: (
(
r["serum_replicate"]
in curvefit_qc["serum_replicates_ignore_curvefit_qc"]
)
or (
(r["barcode"], r["serum_replicate"])
in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
)
),
axis=1,
),
)
)
print(f"Plotting barcode / serum-replicates that fail {curvefit_qc=}\n")
fit_params_noqc_base_chart = alt.Chart(fit_params_noqc).add_params(barcode_selection)
fit_params_noqc_chart = []
for prop, col in [
("max frac infectivity", "max_frac_infectivity"),
("curve fit R2", "r2"),
("curve fit RMSD", "rmsd"),
]:
fit_params_noqc_chart.append(
fit_params_noqc_base_chart.encode(
alt.X(col, title=prop, scale=alt.Scale(nice=False, padding=4)),
alt.Y("virus", title=None),
alt.Fill("fails_qc"),
alt.Column(
"serum_replicate",
title=None,
header=alt.Header(
labelFontSize=12, labelFontStyle="bold", labelPadding=0
),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".3g") if fit_params_noqc[c].dtype == float else c
for c in fit_params_noqc.columns
],
)
.mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.55)
.properties(
height=alt.Step(10),
width=90,
title=alt.TitleParams(f"{prop} for each barcode serum-replicate", dy=-2),
)
)
alt.vconcat(*fit_params_noqc_chart)
Plotting barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0.0, 'goodness_of_fit': {'min_R2': 0.5, 'max_RMSD': 0.15}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
Now plot curves for all virus vs serum-replicates that have a barcode that fails any of the QC. In these plots, the suffix on the barcode name in the color key indicates if it passed or failed QC:
barcode_serum_replicates_fail_qc = fit_params_noqc.query("fails_qc").reset_index(
drop=True
)
print(f"Here are barcode / serum-replicates that fail {curvefit_qc=}")
display(barcode_serum_replicates_fail_qc)
if len(barcode_serum_replicates_fail_qc):
print(
"\nCurves for virus vs serum-replicates with at least one failed barcode."
"\nColor key labels indicate if barcodes failed or passed QC."
)
plots = {}
ncol = 6
for iplot, (serum, virus, failed_barcodes) in enumerate(
barcode_serum_replicates_fail_qc.groupby(
["serum_replicate", "virus"], as_index=False
)
.aggregate(barcodes=pd.NamedAgg("barcode", list))
.itertuples(index=False)
):
passed_barcodes = [
bc
for bc in fits_noqc.replicates[serum, virus]
if (bc not in failed_barcodes) and (bc != "average")
]
curvelist = []
assert len(CBMARKERS) >= len(failed_barcodes + passed_barcodes)
assert len(CBPALETTE) >= len(failed_barcodes + passed_barcodes)
for replicate, marker, color in zip(
failed_barcodes + passed_barcodes, CBMARKERS, CBPALETTE
):
curvelist.append(
{
"serum": serum,
"virus": virus,
"replicate": replicate,
"label": replicate
+ ("-fail" if replicate in failed_barcodes else "-pass"),
"color": color,
"marker": marker,
}
)
plots[iplot // ncol, iplot % ncol] = (f"{serum} vs {virus}", curvelist)
fig, _ = fits_noqc.plotGrid(
plots,
attempt_shared_legend=False,
legendfontsize=8,
titlesize=9,
ticksize=10,
draw_in_bounds=True,
)
display_curve_fig(fig, curve_display_method)
plt.close(fig)
Here are barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0.0, 'goodness_of_fit': {'min_R2': 0.5, 'max_RMSD': 0.15}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
serum_replicate | barcode | max_frac_infectivity | virus | r2 | rmsd | fails_max_frac_infectivity_at_least | fails_goodness_of_fit | fails_qc | ignore_qc | |
---|---|---|---|---|---|---|---|---|---|---|
0 | UWMC-1 | ATTAGATTATAACGTA | 0.679142 | A/Cambodia/e0826360/2020_H3N2 | 0.435607 | 0.202672 | False | True | True | False |
1 | UWMC-10 | AAAGGCGCGCCTTCAA | 0.968735 | A/Lisboa/216/2023_H3N2 | 0.117920 | 0.197525 | False | True | True | False |
2 | UWMC-10 | AAGAAGACTTTGTGAT | 1.000000 | A/Indiana/46/2024_H3N2 | 0.390281 | 0.161480 | False | True | True | False |
3 | UWMC-10 | AAGCCCAGCGGGTGAT | 1.000000 | A/Colombia/1851/2024_H3N2 | 0.493602 | 0.212483 | False | True | True | False |
4 | UWMC-10 | ATACACGCATGTGCCA | 1.000000 | A/Nevada/216/2024_H3N2 | 0.083331 | 0.189859 | False | True | True | False |
5 | UWMC-10 | ATTTTTCTATGGCTAC | 0.789014 | A/HongKong/4801/2014_H3N2 | 0.448081 | 0.200110 | False | True | True | False |
6 | UWMC-10 | CAAAAGCAGCACGATA | 1.000000 | A/Darwin/9/2021_H3N2 | 0.460109 | 0.193204 | False | True | True | False |
7 | UWMC-10 | CAGATAGTGATGAACA | 0.609980 | A/Singapore/INFIMH-16-0019/2016X-307A_H3N2 | 0.484210 | 0.166385 | False | True | True | False |
8 | UWMC-10 | CAGGCTCTAGAGCTCT | 1.000000 | A/Tennessee/99/2024_H3N2 | 0.251960 | 0.211656 | False | True | True | False |
9 | UWMC-10 | CATGGGAATTGCCACT | 1.000000 | A/Texas/ISC-1274/2025_H3N2 | 0.444071 | 0.199172 | False | True | True | False |
10 | UWMC-10 | CCCCTCCTCTAAAGTT | 1.000000 | A/Washington/UW-25728/2024_H3N2 | 0.076381 | 0.200916 | False | True | True | False |
11 | UWMC-10 | CCCTTTACGGATCTCT | 1.000000 | A/CoteD'Ivoire/4448/2024_H3N2 | 0.470006 | 0.183055 | False | True | True | False |
12 | UWMC-10 | CGGTCGGGACTCATCT | 1.000000 | A/Utah/94/2024_H3N2 | 0.450804 | 0.176424 | False | True | True | False |
13 | UWMC-10 | CGTACGTATGTCCCAG | 0.619922 | A/Thailand/8/2022_H3N2 | 0.163959 | 0.150339 | False | True | True | False |
14 | UWMC-10 | CTGAACTTGTCGATAT | 0.923683 | A/Wisconsin/67/2022_H1N1 | 0.436614 | 0.180873 | False | True | True | False |
15 | UWMC-10 | GAAAGCCCCGTGCAAT | 1.000000 | A/France/IDF-IPP29542/2023-egg_H3N2 | -0.443544 | 0.303989 | False | True | True | False |
16 | UWMC-10 | GAAGTACGCTGAATGA | 0.996385 | A/Maldives/2147/2024_H3N2 | 0.068389 | 0.158680 | False | True | True | False |
17 | UWMC-10 | GAAGTGCTGCTGAAGT | 0.972288 | A/Croatia/10136RV/2023-egg_H3N2 | 0.365312 | 0.211206 | False | True | True | False |
18 | UWMC-10 | GACGGGATGGGCACGT | 0.935457 | A/Massachusetts/ISC-1684/2025_H3N2 | 0.302287 | 0.168271 | False | True | True | False |
19 | UWMC-10 | GCCATTTACTGAAGGG | 1.000000 | A/Mato_Grosso_do_Sul/518/2025_H3N2 | 0.254115 | 0.186147 | False | True | True | False |
20 | UWMC-10 | GCCGCTGCGGCGTGTG | 1.000000 | A/Norway/12374/2023_H3N2 | 0.132552 | 0.187304 | False | True | True | False |
21 | UWMC-10 | GTAGATACTAGGACCA | 1.000000 | A/Colombia/1851/2024_H3N2 | 0.319361 | 0.179854 | False | True | True | False |
22 | UWMC-10 | TCTCAGCTCTTAGCCG | 0.902529 | A/Texas/ISC-1148/2025_H3N2 | 0.481568 | 0.164263 | False | True | True | False |
23 | UWMC-10 | TTCTGTCCAGACTCGT | 1.000000 | A/Netherlands/01502/2025_H3N2 | 0.225075 | 0.236364 | False | True | True | False |
24 | UWMC-10 | TTGCTCCTGAGTAGTA | 0.950293 | A/Indiana/46/2024_H3N2 | 0.253315 | 0.176360 | False | True | True | False |
25 | UWMC-10 | TTTATATCCAACACCA | 0.986032 | A/Mato_Grosso_do_Sul/518/2025_H3N2 | 0.235460 | 0.201867 | False | True | True | False |
26 | UWMC-11 | AGACCATCGCACCCAA | 1.000000 | A/Thailand/8/2022_H3N2 | 0.418769 | 0.225857 | False | True | True | False |
27 | UWMC-11 | ATGGCCCACGGGCATA | 0.882936 | A/Utah/94/2024_H3N2 | 0.451496 | 0.167752 | False | True | True | False |
28 | UWMC-11 | CTATCTTAATCTACAG | 1.000000 | A/Darwin/6/2021_H3N2 | 0.497080 | 0.215417 | False | True | True | False |
29 | UWMC-11 | CTCTTACGCTCCTACG | 1.000000 | A/Vermont/10/2025_H1N1 | 0.199985 | 0.322144 | False | True | True | False |
30 | UWMC-11 | TCGATTACTAGCCGGA | 1.000000 | A/Switzerland/9715293/2013_H3N2 | 0.479312 | 0.184154 | False | True | True | False |
31 | UWMC-3 | AACCACCCCAGAGATG | 1.000000 | A/Kansas/14/2017_H3N2 | 0.479500 | 0.227856 | False | True | True | False |
32 | UWMC-3 | AGCCCATGCTGGGGAT | 1.000000 | A/India/Pune-NIV24_3439/2024_H3N2 | 0.490765 | 0.175147 | False | True | True | False |
33 | UWMC-3 | AGGAGTATGAAGAGCG | 1.000000 | A/Switzerland/47775/2024_H3N2 | 0.373263 | 0.189301 | False | True | True | False |
34 | UWMC-3 | ATACACGCATGTGCCA | 1.000000 | A/Nevada/216/2024_H3N2 | 0.418673 | 0.204387 | False | True | True | False |
35 | UWMC-3 | CAATTCGCCGTTCCCC | 1.000000 | A/Darwin/6/2021_H3N2 | 0.129699 | 0.317281 | False | True | True | False |
36 | UWMC-3 | CACCGCGCCGAGCACC | 1.000000 | A/Victoria/3482/2024_H3N2 | 0.242842 | 0.164432 | False | True | True | False |
37 | UWMC-3 | CCGCATTAGCGGGAGG | 0.894100 | A/Maldives/2186/2024_H3N2 | 0.406349 | 0.168063 | False | True | True | False |
38 | UWMC-3 | CTAATTTAAGTATCAA | 0.903619 | A/Wisconsin/172/2024_H3N2 | 0.479166 | 0.171351 | False | True | True | False |
39 | UWMC-3 | GATCGCCACTGATAAG | 0.970220 | A/Colombia/7681/2024_H3N2 | 0.144686 | 0.168456 | False | True | True | False |
40 | UWMC-3 | TGTGGAGCGCCCTTAC | 0.817048 | A/Tennessee/99/2024_H3N2 | -0.108692 | 0.265930 | False | True | True | False |
41 | UWMC-3 | TTGCAATTGAAACATA | 1.000000 | A/Cambodia/e0826360/2020_H3N2 | -0.018918 | 0.236767 | False | True | True | False |
42 | UWMC-6 | AACCACCCCAGAGATG | 0.847485 | A/Kansas/14/2017_H3N2 | -0.060714 | 0.152063 | False | True | True | False |
43 | UWMC-6 | AGCGACATCGCCCTTT | 0.651461 | A/Minnesota/97/2024_H3N2 | -0.010643 | 0.211985 | False | True | True | False |
44 | UWMC-6 | ATTAGGGCTACGTGAG | 0.553616 | A/Manitoba/RV04865/2024_H3N2 | 0.312710 | 0.158777 | False | True | True | False |
45 | UWMC-6 | CATGGGAATTGCCACT | 0.704222 | A/Texas/ISC-1274/2025_H3N2 | 0.197466 | 0.184133 | False | True | True | False |
46 | UWMC-6 | CCCCTCCTCTAAAGTT | 0.996909 | A/Washington/UW-25728/2024_H3N2 | 0.225790 | 0.206164 | False | True | True | False |
47 | UWMC-6 | CCCTTTACGGATCTCT | 0.845319 | A/CoteD'Ivoire/4448/2024_H3N2 | 0.459521 | 0.169348 | False | True | True | False |
48 | UWMC-6 | CGCACTTTACGAGACA | 0.953918 | A/France/BRE-IPP01880/2025_H3N2 | 0.363629 | 0.175666 | False | True | True | False |
49 | UWMC-6 | CTATAAACCGTTTGTA | 1.000000 | A/Oregon/265/2024_H3N2 | 0.446081 | 0.152950 | False | True | True | False |
50 | UWMC-6 | CTCAATGTCGTAGGAT | 0.699114 | A/France/ARA-RELAB-HCL025017178801/2025_H3N2 | 0.366359 | 0.188251 | False | True | True | False |
51 | UWMC-6 | GCAGCGTGCCGGTCAT | 1.000000 | A/Victoria/96/2025_H3N2 | 0.440720 | 0.258125 | False | True | True | False |
52 | UWMC-6 | GTAAGCTTCATGGAGT | 0.758000 | A/Switzerland/860423897313/2023_H3N2 | 0.419619 | 0.180031 | False | True | True | False |
53 | UWMC-6 | GTCCGTCAGCATAAAC | 0.779846 | A/Michigan/UM-10062100736/2025_H3N2 | 0.174788 | 0.187953 | False | True | True | False |
54 | UWMC-6 | TACTAGCAATAAAATC | 0.848512 | A/Singapore/INFIMH-16-0019/2016_H3N2 | 0.467981 | 0.192958 | False | True | True | False |
55 | UWMC-6 | TGGTCCGCTTCATGCT | 1.000000 | A/DE/DE-DHSS-901/2025_(H3N2)_H3N2 | 0.408127 | 0.202626 | False | True | True | False |
56 | UWMC-7 | CGATCTTTACGAAAAA | 0.542956 | A/Massachusetts/18/2022_H3N2 | 0.183181 | 0.177918 | False | True | True | False |
57 | UWMC-7 | GATCGCCACTGATAAG | 0.619305 | A/Colombia/7681/2024_H3N2 | 0.499120 | 0.164704 | False | True | True | False |
58 | UWMC-9 | CAATTCGCCGTTCCCC | 1.000000 | A/Darwin/6/2021_H3N2 | 0.484762 | 0.284855 | False | True | True | False |
59 | UWMC-9 | TGATCTGTGACATTGC | 1.000000 | A/Massachusetts/ISC-1684/2025_H3N2 | 0.485266 | 0.197503 | False | True | True | False |
Curves for virus vs serum-replicates with at least one failed barcode. Color key labels indicate if barcodes failed or passed QC.
# drop barcode / serum-replicates failing QC
for qc_filter in ["max_frac_infectivity_at_least", "goodness_of_fit"]:
fits_qc_drops = list(
fit_params_noqc.query(f"fails_{qc_filter} and (not ignore_qc)")[
["barcode", "serum_replicate"]
].itertuples(index=False, name=None)
)
print(
f"\nDropping {len(fits_qc_drops)} barcode/serum-replicates for failing "
f"{qc_filter}={curvefit_qc[qc_filter]}: " + str(fits_qc_drops)
)
qc_drops["barcode_serum_replicates"].update({w: qc_filter for w in fits_qc_drops})
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
fit_params_noqc = fit_params_noqc[
~fit_params_noqc.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Dropping 0 barcode/serum-replicates for failing max_frac_infectivity_at_least=0.0: [] Dropping 60 barcode/serum-replicates for failing goodness_of_fit={'min_R2': 0.5, 'max_RMSD': 0.15}: [('ATTAGATTATAACGTA', 'UWMC-1'), ('AAAGGCGCGCCTTCAA', 'UWMC-10'), ('AAGAAGACTTTGTGAT', 'UWMC-10'), ('AAGCCCAGCGGGTGAT', 'UWMC-10'), ('ATACACGCATGTGCCA', 'UWMC-10'), ('ATTTTTCTATGGCTAC', 'UWMC-10'), ('CAAAAGCAGCACGATA', 'UWMC-10'), ('CAGATAGTGATGAACA', 'UWMC-10'), ('CAGGCTCTAGAGCTCT', 'UWMC-10'), ('CATGGGAATTGCCACT', 'UWMC-10'), ('CCCCTCCTCTAAAGTT', 'UWMC-10'), ('CCCTTTACGGATCTCT', 'UWMC-10'), ('CGGTCGGGACTCATCT', 'UWMC-10'), ('CGTACGTATGTCCCAG', 'UWMC-10'), ('CTGAACTTGTCGATAT', 'UWMC-10'), ('GAAAGCCCCGTGCAAT', 'UWMC-10'), ('GAAGTACGCTGAATGA', 'UWMC-10'), ('GAAGTGCTGCTGAAGT', 'UWMC-10'), ('GACGGGATGGGCACGT', 'UWMC-10'), ('GCCATTTACTGAAGGG', 'UWMC-10'), ('GCCGCTGCGGCGTGTG', 'UWMC-10'), ('GTAGATACTAGGACCA', 'UWMC-10'), ('TCTCAGCTCTTAGCCG', 'UWMC-10'), ('TTCTGTCCAGACTCGT', 'UWMC-10'), ('TTGCTCCTGAGTAGTA', 'UWMC-10'), ('TTTATATCCAACACCA', 'UWMC-10'), ('AGACCATCGCACCCAA', 'UWMC-11'), ('ATGGCCCACGGGCATA', 'UWMC-11'), ('CTATCTTAATCTACAG', 'UWMC-11'), ('CTCTTACGCTCCTACG', 'UWMC-11'), ('TCGATTACTAGCCGGA', 'UWMC-11'), ('AACCACCCCAGAGATG', 'UWMC-3'), ('AGCCCATGCTGGGGAT', 'UWMC-3'), ('AGGAGTATGAAGAGCG', 'UWMC-3'), ('ATACACGCATGTGCCA', 'UWMC-3'), ('CAATTCGCCGTTCCCC', 'UWMC-3'), ('CACCGCGCCGAGCACC', 'UWMC-3'), ('CCGCATTAGCGGGAGG', 'UWMC-3'), ('CTAATTTAAGTATCAA', 'UWMC-3'), ('GATCGCCACTGATAAG', 'UWMC-3'), ('TGTGGAGCGCCCTTAC', 'UWMC-3'), ('TTGCAATTGAAACATA', 'UWMC-3'), ('AACCACCCCAGAGATG', 'UWMC-6'), ('AGCGACATCGCCCTTT', 'UWMC-6'), ('ATTAGGGCTACGTGAG', 'UWMC-6'), ('CATGGGAATTGCCACT', 'UWMC-6'), ('CCCCTCCTCTAAAGTT', 'UWMC-6'), ('CCCTTTACGGATCTCT', 'UWMC-6'), ('CGCACTTTACGAGACA', 'UWMC-6'), ('CTATAAACCGTTTGTA', 'UWMC-6'), ('CTCAATGTCGTAGGAT', 'UWMC-6'), ('GCAGCGTGCCGGTCAT', 'UWMC-6'), ('GTAAGCTTCATGGAGT', 'UWMC-6'), ('GTCCGTCAGCATAAAC', 'UWMC-6'), ('TACTAGCAATAAAATC', 'UWMC-6'), ('TGGTCCGCTTCATGCT', 'UWMC-6'), ('CGATCTTTACGAAAAA', 'UWMC-7'), ('GATCGCCACTGATAAG', 'UWMC-7'), ('CAATTCGCCGTTCCCC', 'UWMC-9'), ('TGATCTGTGACATTGC', 'UWMC-9')]
Fit neutralization curves after applying QC¶
No we re-fit curves after applying all the QC:
fits_qc = neutcurve.CurveFits(
frac_infectivity.rename(
columns={
"frac_infectivity_ceiling": "fraction infectivity",
"concentration": "serum concentration",
}
),
conc_col="serum concentration",
fracinf_col="fraction infectivity",
virus_col="strain",
serum_col="serum",
replicate_col="plate_barcode",
fixtop=curvefit_params["fixtop"],
fixbottom=curvefit_params["fixbottom"],
fixslope=curvefit_params["fixslope"],
)
fit_params_qc = fits_qc.fitParams(average_only=False, no_average=True)
assert len(fit_params_qc) <= len(
fits_noqc.fitParams(average_only=False, no_average=True)
)
print(f"Assigning fits for this plate to {group}")
fit_params_qc.insert(0, "group", group)
Assigning fits for this plate to UWMC
Plot all the curves that passed QC:
if fits_qc.sera:
fig, _ = fits_qc.plotReplicates(
attempt_shared_legend=False,
legendfontsize=8,
titlesize=9,
ticksize=10,
ncol=6,
draw_in_bounds=True,
)
display_curve_fig(fig, curve_display_method)
plt.close(fig)
else:
print("No sera passed QC.")
Save results to files¶
print(f"Writing fraction infectivities to {frac_infectivity_csv}")
(
frac_infectivity[
[
"serum",
"strain",
"plate_barcode",
"dilution_factor",
"frac_infectivity_raw",
"frac_infectivity_ceiling",
]
]
.sort_values(["serum", "plate_barcode", "dilution_factor"])
.to_csv(frac_infectivity_csv, index=False, float_format="%.4g")
)
print(f"\nWriting fit parameters to {fits_csv}")
(
fit_params_qc.drop(columns=["nreplicates", "ic50_str"]).to_csv(
fits_csv, index=False, float_format="%.4g"
)
)
print(f"\nPickling neutcurve.CurveFits object for these data to {fits_pickle}")
with open(fits_pickle, "wb") as f:
pickle.dump(fits_qc, f)
print(f"\nWriting QC drops to {qc_drops_yaml}")
def tup_to_str(x):
return " ".join(x) if isinstance(x, tuple) else x
qc_drops_for_yaml = {
key: {tup_to_str(key2): val2 for key2, val2 in val.items()}
for key, val in qc_drops.items()
}
with open(qc_drops_yaml, "w") as f:
yaml.YAML(typ="rt").dump(qc_drops_for_yaml, f)
print("\nHere are the QC drops:\n***************************")
yaml.YAML(typ="rt").dump(qc_drops_for_yaml, sys.stdout)
Writing fraction infectivities to results/plates/plate1-2/frac_infectivity.csv Writing fit parameters to results/plates/plate1-2/curvefits.csv Pickling neutcurve.CurveFits object for these data to results/plates/plate1-2/curvefits.pickle
Writing QC drops to results/plates/plate1-2/qc_drops.yml Here are the QC drops: *************************** wells: H1: manual_drop H2: manual_drop H3: manual_drop H4: manual_drop H5: manual_drop H6: manual_drop H7: manual_drop H8: manual_drop H9: manual_drop H10: manual_drop H11: manual_drop H12: manual_drop B11: avg_barcode_counts_per_well F2: avg_barcode_counts_per_well barcodes: {} barcode_wells: AGACCATCGCACCCAA G2: max_frac_infectivity_per_viral_barcode_well CTCTTACGCTCCTACG G3: max_frac_infectivity_per_viral_barcode_well CCGCATTAGCGGGAGG G3: max_frac_infectivity_per_viral_barcode_well AGACCATCGCACCCAA G4: max_frac_infectivity_per_viral_barcode_well TTAATGTAGCCGCTCC C9: max_frac_infectivity_per_viral_barcode_well TCGAGTTAATATGCGC F9: max_frac_infectivity_per_viral_barcode_well GTAATTCGCATGCGGA D11: max_frac_infectivity_per_viral_barcode_well barcode_serum_replicates: GTAATTCGCATGCGGA UWMC-11: min_dilutions_per_barcode_serum_replicate AGACCATCGCACCCAA UWMC-2: min_dilutions_per_barcode_serum_replicate ATTAGATTATAACGTA UWMC-1: goodness_of_fit AAAGGCGCGCCTTCAA UWMC-10: goodness_of_fit AAGAAGACTTTGTGAT UWMC-10: goodness_of_fit AAGCCCAGCGGGTGAT UWMC-10: goodness_of_fit ATACACGCATGTGCCA UWMC-10: goodness_of_fit ATTTTTCTATGGCTAC UWMC-10: goodness_of_fit CAAAAGCAGCACGATA UWMC-10: goodness_of_fit CAGATAGTGATGAACA UWMC-10: goodness_of_fit CAGGCTCTAGAGCTCT UWMC-10: goodness_of_fit CATGGGAATTGCCACT UWMC-10: goodness_of_fit CCCCTCCTCTAAAGTT UWMC-10: goodness_of_fit CCCTTTACGGATCTCT UWMC-10: goodness_of_fit CGGTCGGGACTCATCT UWMC-10: goodness_of_fit CGTACGTATGTCCCAG UWMC-10: goodness_of_fit CTGAACTTGTCGATAT UWMC-10: goodness_of_fit GAAAGCCCCGTGCAAT UWMC-10: goodness_of_fit GAAGTACGCTGAATGA UWMC-10: goodness_of_fit GAAGTGCTGCTGAAGT UWMC-10: goodness_of_fit GACGGGATGGGCACGT UWMC-10: goodness_of_fit GCCATTTACTGAAGGG UWMC-10: goodness_of_fit GCCGCTGCGGCGTGTG UWMC-10: goodness_of_fit GTAGATACTAGGACCA UWMC-10: goodness_of_fit TCTCAGCTCTTAGCCG UWMC-10: goodness_of_fit TTCTGTCCAGACTCGT UWMC-10: goodness_of_fit TTGCTCCTGAGTAGTA UWMC-10: goodness_of_fit TTTATATCCAACACCA UWMC-10: goodness_of_fit AGACCATCGCACCCAA UWMC-11: goodness_of_fit ATGGCCCACGGGCATA UWMC-11: goodness_of_fit CTATCTTAATCTACAG UWMC-11: goodness_of_fit CTCTTACGCTCCTACG UWMC-11: goodness_of_fit TCGATTACTAGCCGGA UWMC-11: goodness_of_fit AACCACCCCAGAGATG UWMC-3: goodness_of_fit AGCCCATGCTGGGGAT UWMC-3: goodness_of_fit AGGAGTATGAAGAGCG UWMC-3: goodness_of_fit ATACACGCATGTGCCA UWMC-3: goodness_of_fit CAATTCGCCGTTCCCC UWMC-3: goodness_of_fit CACCGCGCCGAGCACC UWMC-3: goodness_of_fit CCGCATTAGCGGGAGG UWMC-3: goodness_of_fit CTAATTTAAGTATCAA UWMC-3: goodness_of_fit GATCGCCACTGATAAG UWMC-3: goodness_of_fit TGTGGAGCGCCCTTAC UWMC-3: goodness_of_fit TTGCAATTGAAACATA UWMC-3: goodness_of_fit AACCACCCCAGAGATG UWMC-6: goodness_of_fit AGCGACATCGCCCTTT UWMC-6: goodness_of_fit ATTAGGGCTACGTGAG UWMC-6: goodness_of_fit CATGGGAATTGCCACT UWMC-6: goodness_of_fit CCCCTCCTCTAAAGTT UWMC-6: goodness_of_fit CCCTTTACGGATCTCT UWMC-6: goodness_of_fit CGCACTTTACGAGACA UWMC-6: goodness_of_fit CTATAAACCGTTTGTA UWMC-6: goodness_of_fit CTCAATGTCGTAGGAT UWMC-6: goodness_of_fit GCAGCGTGCCGGTCAT UWMC-6: goodness_of_fit GTAAGCTTCATGGAGT UWMC-6: goodness_of_fit GTCCGTCAGCATAAAC UWMC-6: goodness_of_fit TACTAGCAATAAAATC UWMC-6: goodness_of_fit TGGTCCGCTTCATGCT UWMC-6: goodness_of_fit CGATCTTTACGAAAAA UWMC-7: goodness_of_fit GATCGCCACTGATAAG UWMC-7: goodness_of_fit CAATTCGCCGTTCCCC UWMC-9: goodness_of_fit TGATCTGTGACATTGC UWMC-9: goodness_of_fit serum_replicates: {}