In [1]:
######## 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\x95S\xec\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/plate14_EPIHK_21_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_21_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_21_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_21_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_21_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_21_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_21_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_21_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_22_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_22_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_22_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_22_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_22_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_22_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_22_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_22_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_23_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_23_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_23_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_23_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_23_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_23_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_23_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_23_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_24_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_24_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_24_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_24_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_24_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_24_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_24_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_24_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_25_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_25_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_25_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_25_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_25_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_25_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_25_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_25_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_26_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_26_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_26_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_26_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_26_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_26_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_26_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_26_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_27_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_27_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_27_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_27_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_27_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_27_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_27_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_27_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_28_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_28_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_28_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_28_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_28_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_28_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_28_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_28_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_29_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_29_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_29_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_29_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_29_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_29_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_29_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_29_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_30_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_30_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_30_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_30_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_30_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_30_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_30_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_30_13619.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_31_40.csv\x94\x8c.results/barcode_counts/plate14_EPIHK_31_92.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_31_212.csv\x94\x8c/results/barcode_counts/plate14_EPIHK_31_487.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_31_1119.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_31_2575.csv\x94\x8c0results/barcode_counts/plate14_EPIHK_31_5921.csv\x94\x8c1results/barcode_counts/plate14_EPIHK_31_13619.csv\x94\x8c)results/barcode_counts/plate14_none-1.csv\x94\x8c)results/barcode_counts/plate14_none-2.csv\x94\x8c)results/barcode_counts/plate14_none-3.csv\x94\x8c)results/barcode_counts/plate14_none-4.csv\x94\x8c)results/barcode_counts/plate14_none-5.csv\x94\x8c)results/barcode_counts/plate14_none-6.csv\x94\x8c)results/barcode_counts/plate14_none-7.csv\x94\x8c)results/barcode_counts/plate14_none-8.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_21_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_21_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_21_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_21_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_21_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_21_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_21_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_21_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_22_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_22_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_22_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_22_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_22_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_22_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_22_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_22_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_23_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_23_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_23_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_23_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_23_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_23_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_23_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_23_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_24_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_24_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_24_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_24_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_24_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_24_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_24_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_24_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_25_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_25_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_25_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_25_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_25_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_25_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_25_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_25_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_26_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_26_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_26_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_26_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_26_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_26_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_26_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_26_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_27_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_27_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_27_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_27_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_27_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_27_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_27_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_27_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_28_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_28_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_28_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_28_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_28_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_28_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_28_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_28_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_29_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_29_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_29_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_29_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_29_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_29_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_29_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_29_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_30_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_30_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_30_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_30_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_30_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_30_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_30_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_30_13619.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_31_40.csv\x94\x8c-results/barcode_fates/plate14_EPIHK_31_92.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_31_212.csv\x94\x8c.results/barcode_fates/plate14_EPIHK_31_487.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_31_1119.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_31_2575.csv\x94\x8c/results/barcode_fates/plate14_EPIHK_31_5921.csv\x94\x8c0results/barcode_fates/plate14_EPIHK_31_13619.csv\x94\x8c(results/barcode_fates/plate14_none-1.csv\x94\x8c(results/barcode_fates/plate14_none-2.csv\x94\x8c(results/barcode_fates/plate14_none-3.csv\x94\x8c(results/barcode_fates/plate14_none-4.csv\x94\x8c(results/barcode_fates/plate14_none-5.csv\x94\x8c(results/barcode_fates/plate14_none-6.csv\x94\x8c(results/barcode_fates/plate14_none-7.csv\x94\x8c(results/barcode_fates/plate14_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/plate14/qc_drops.yml\x94\x8c+results/plates/plate14/frac_infectivity.csv\x94\x8c$results/plates/plate14/curvefits.csv\x94\x8c\'results/plates/plate14/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\x13plate14_EPIHK_21_40\x94\x8c\x13plate14_EPIHK_21_92\x94\x8c\x14plate14_EPIHK_21_212\x94\x8c\x14plate14_EPIHK_21_487\x94\x8c\x15plate14_EPIHK_21_1119\x94\x8c\x15plate14_EPIHK_21_2575\x94\x8c\x15plate14_EPIHK_21_5921\x94\x8c\x16plate14_EPIHK_21_13619\x94\x8c\x13plate14_EPIHK_22_40\x94\x8c\x13plate14_EPIHK_22_92\x94\x8c\x14plate14_EPIHK_22_212\x94\x8c\x14plate14_EPIHK_22_487\x94\x8c\x15plate14_EPIHK_22_1119\x94\x8c\x15plate14_EPIHK_22_2575\x94\x8c\x15plate14_EPIHK_22_5921\x94\x8c\x16plate14_EPIHK_22_13619\x94\x8c\x13plate14_EPIHK_23_40\x94\x8c\x13plate14_EPIHK_23_92\x94\x8c\x14plate14_EPIHK_23_212\x94\x8c\x14plate14_EPIHK_23_487\x94\x8c\x15plate14_EPIHK_23_1119\x94\x8c\x15plate14_EPIHK_23_2575\x94\x8c\x15plate14_EPIHK_23_5921\x94\x8c\x16plate14_EPIHK_23_13619\x94\x8c\x13plate14_EPIHK_24_40\x94\x8c\x13plate14_EPIHK_24_92\x94\x8c\x14plate14_EPIHK_24_212\x94\x8c\x14plate14_EPIHK_24_487\x94\x8c\x15plate14_EPIHK_24_1119\x94\x8c\x15plate14_EPIHK_24_2575\x94\x8c\x15plate14_EPIHK_24_5921\x94\x8c\x16plate14_EPIHK_24_13619\x94\x8c\x13plate14_EPIHK_25_40\x94\x8c\x13plate14_EPIHK_25_92\x94\x8c\x14plate14_EPIHK_25_212\x94\x8c\x14plate14_EPIHK_25_487\x94\x8c\x15plate14_EPIHK_25_1119\x94\x8c\x15plate14_EPIHK_25_2575\x94\x8c\x15plate14_EPIHK_25_5921\x94\x8c\x16plate14_EPIHK_25_13619\x94\x8c\x13plate14_EPIHK_26_40\x94\x8c\x13plate14_EPIHK_26_92\x94\x8c\x14plate14_EPIHK_26_212\x94\x8c\x14plate14_EPIHK_26_487\x94\x8c\x15plate14_EPIHK_26_1119\x94\x8c\x15plate14_EPIHK_26_2575\x94\x8c\x15plate14_EPIHK_26_5921\x94\x8c\x16plate14_EPIHK_26_13619\x94\x8c\x13plate14_EPIHK_27_40\x94\x8c\x13plate14_EPIHK_27_92\x94\x8c\x14plate14_EPIHK_27_212\x94\x8c\x14plate14_EPIHK_27_487\x94\x8c\x15plate14_EPIHK_27_1119\x94\x8c\x15plate14_EPIHK_27_2575\x94\x8c\x15plate14_EPIHK_27_5921\x94\x8c\x16plate14_EPIHK_27_13619\x94\x8c\x13plate14_EPIHK_28_40\x94\x8c\x13plate14_EPIHK_28_92\x94\x8c\x14plate14_EPIHK_28_212\x94\x8c\x14plate14_EPIHK_28_487\x94\x8c\x15plate14_EPIHK_28_1119\x94\x8c\x15plate14_EPIHK_28_2575\x94\x8c\x15plate14_EPIHK_28_5921\x94\x8c\x16plate14_EPIHK_28_13619\x94\x8c\x13plate14_EPIHK_29_40\x94\x8c\x13plate14_EPIHK_29_92\x94\x8c\x14plate14_EPIHK_29_212\x94\x8c\x14plate14_EPIHK_29_487\x94\x8c\x15plate14_EPIHK_29_1119\x94\x8c\x15plate14_EPIHK_29_2575\x94\x8c\x15plate14_EPIHK_29_5921\x94\x8c\x16plate14_EPIHK_29_13619\x94\x8c\x13plate14_EPIHK_30_40\x94\x8c\x13plate14_EPIHK_30_92\x94\x8c\x14plate14_EPIHK_30_212\x94\x8c\x14plate14_EPIHK_30_487\x94\x8c\x15plate14_EPIHK_30_1119\x94\x8c\x15plate14_EPIHK_30_2575\x94\x8c\x15plate14_EPIHK_30_5921\x94\x8c\x16plate14_EPIHK_30_13619\x94\x8c\x13plate14_EPIHK_31_40\x94\x8c\x13plate14_EPIHK_31_92\x94\x8c\x14plate14_EPIHK_31_212\x94\x8c\x14plate14_EPIHK_31_487\x94\x8c\x15plate14_EPIHK_31_1119\x94\x8c\x15plate14_EPIHK_31_2575\x94\x8c\x15plate14_EPIHK_31_5921\x94\x8c\x16plate14_EPIHK_31_13619\x94\x8c\x0eplate14_none-1\x94\x8c\x0eplate14_none-2\x94\x8c\x0eplate14_none-3\x94\x8c\x0eplate14_none-4\x94\x8c\x0eplate14_none-5\x94\x8c\x0eplate14_none-6\x94\x8c\x0eplate14_none-7\x94\x8c\x0eplate14_none-8\x94e}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94\x8c\n2025-08-18\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(\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\x08EPIHK_21\x94K\x01j\xcd\x03\x00\x00K\x02j\xcd\x03\x00\x00K\x03j\xcd\x03\x00\x00K\x04j\xcd\x03\x00\x00K\x05j\xcd\x03\x00\x00K\x06j\xcd\x03\x00\x00K\x07j\xcd\x03\x00\x00K\x08\x8c\x08EPIHK_22\x94K\tj\xce\x03\x00\x00K\nj\xce\x03\x00\x00K\x0bj\xce\x03\x00\x00K\x0cj\xce\x03\x00\x00K\rj\xce\x03\x00\x00K\x0ej\xce\x03\x00\x00K\x0fj\xce\x03\x00\x00K\x10\x8c\x08EPIHK_23\x94K\x11j\xcf\x03\x00\x00K\x12j\xcf\x03\x00\x00K\x13j\xcf\x03\x00\x00K\x14j\xcf\x03\x00\x00K\x15j\xcf\x03\x00\x00K\x16j\xcf\x03\x00\x00K\x17j\xcf\x03\x00\x00K\x18\x8c\x08EPIHK_24\x94K\x19j\xd0\x03\x00\x00K\x1aj\xd0\x03\x00\x00K\x1bj\xd0\x03\x00\x00K\x1cj\xd0\x03\x00\x00K\x1dj\xd0\x03\x00\x00K\x1ej\xd0\x03\x00\x00K\x1fj\xd0\x03\x00\x00K \x8c\x08EPIHK_25\x94K!j\xd1\x03\x00\x00K"j\xd1\x03\x00\x00K#j\xd1\x03\x00\x00K$j\xd1\x03\x00\x00K%j\xd1\x03\x00\x00K&j\xd1\x03\x00\x00K\'j\xd1\x03\x00\x00K(\x8c\x08EPIHK_26\x94K)j\xd2\x03\x00\x00K*j\xd2\x03\x00\x00K+j\xd2\x03\x00\x00K,j\xd2\x03\x00\x00K-j\xd2\x03\x00\x00K.j\xd2\x03\x00\x00K/j\xd2\x03\x00\x00K0\x8c\x08EPIHK_27\x94K1j\xd3\x03\x00\x00K2j\xd3\x03\x00\x00K3j\xd3\x03\x00\x00K4j\xd3\x03\x00\x00K5j\xd3\x03\x00\x00K6j\xd3\x03\x00\x00K7j\xd3\x03\x00\x00K8\x8c\x08EPIHK_28\x94K9j\xd4\x03\x00\x00K:j\xd4\x03\x00\x00K;j\xd4\x03\x00\x00K<j\xd4\x03\x00\x00K=j\xd4\x03\x00\x00K>j\xd4\x03\x00\x00K?j\xd4\x03\x00\x00K@\x8c\x08EPIHK_29\x94KAj\xd5\x03\x00\x00KBj\xd5\x03\x00\x00KCj\xd5\x03\x00\x00KDj\xd5\x03\x00\x00KEj\xd5\x03\x00\x00KFj\xd5\x03\x00\x00KGj\xd5\x03\x00\x00KH\x8c\x08EPIHK_30\x94KIj\xd6\x03\x00\x00KJj\xd6\x03\x00\x00KKj\xd6\x03\x00\x00KLj\xd6\x03\x00\x00KMj\xd6\x03\x00\x00KNj\xd6\x03\x00\x00KOj\xd6\x03\x00\x00KP\x8c\x08EPIHK_31\x94KQj\xd7\x03\x00\x00KRj\xd7\x03\x00\x00KSj\xd7\x03\x00\x00KTj\xd7\x03\x00\x00KUj\xd7\x03\x00\x00KVj\xd7\x03\x00\x00KWj\xd7\x03\x00\x00KX\x8c\x04none\x94KYj\xd8\x03\x00\x00KZj\xd8\x03\x00\x00K[j\xd8\x03\x00\x00K\\j\xd8\x03\x00\x00K]j\xd8\x03\x00\x00K^j\xd8\x03\x00\x00K_j\xd8\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/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_1_S1_R1_001.fastq.gz\x94K\x01\x8cs/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_2_S2_R1_001.fastq.gz\x94K\x02\x8cs/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_3_S3_R1_001.fastq.gz\x94K\x03\x8cs/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_4_S4_R1_001.fastq.gz\x94K\x04\x8cs/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_5_S5_R1_001.fastq.gz\x94K\x05\x8cs/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_6_S6_R1_001.fastq.gz\x94K\x06\x8cs/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_7_S7_R1_001.fastq.gz\x94K\x07\x8cs/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_8_S8_R1_001.fastq.gz\x94K\x08\x8cs/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_9_S9_R1_001.fastq.gz\x94K\t\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_10_S10_R1_001.fastq.gz\x94K\n\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_11_S11_R1_001.fastq.gz\x94K\x0b\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_12_S12_R1_001.fastq.gz\x94K\x0c\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_13_S13_R1_001.fastq.gz\x94K\r\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_14_S14_R1_001.fastq.gz\x94K\x0e\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_15_S15_R1_001.fastq.gz\x94K\x0f\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_16_S16_R1_001.fastq.gz\x94K\x10\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_17_S17_R1_001.fastq.gz\x94K\x11\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_18_S18_R1_001.fastq.gz\x94K\x12\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_19_S19_R1_001.fastq.gz\x94K\x13\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_20_S20_R1_001.fastq.gz\x94K\x14\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_21_S21_R1_001.fastq.gz\x94K\x15\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_22_S22_R1_001.fastq.gz\x94K\x16\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_23_S23_R1_001.fastq.gz\x94K\x17\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_24_S24_R1_001.fastq.gz\x94K\x18\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_25_S25_R1_001.fastq.gz\x94K\x19\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_26_S26_R1_001.fastq.gz\x94K\x1a\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_27_S27_R1_001.fastq.gz\x94K\x1b\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_28_S28_R1_001.fastq.gz\x94K\x1c\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_29_S29_R1_001.fastq.gz\x94K\x1d\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_30_S30_R1_001.fastq.gz\x94K\x1e\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_31_S31_R1_001.fastq.gz\x94K\x1f\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_32_S32_R1_001.fastq.gz\x94K \x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_33_S33_R1_001.fastq.gz\x94K!\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_34_S34_R1_001.fastq.gz\x94K"\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_35_S35_R1_001.fastq.gz\x94K#\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_36_S36_R1_001.fastq.gz\x94K$\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_37_S37_R1_001.fastq.gz\x94K%\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_38_S38_R1_001.fastq.gz\x94K&\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_39_S39_R1_001.fastq.gz\x94K\'\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_40_S40_R1_001.fastq.gz\x94K(\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_41_S41_R1_001.fastq.gz\x94K)\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_42_S42_R1_001.fastq.gz\x94K*\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_43_S43_R1_001.fastq.gz\x94K+\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_44_S44_R1_001.fastq.gz\x94K,\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_45_S45_R1_001.fastq.gz\x94K-\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_46_S46_R1_001.fastq.gz\x94K.\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_47_S47_R1_001.fastq.gz\x94K/\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_48_S48_R1_001.fastq.gz\x94K0\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_49_S49_R1_001.fastq.gz\x94K1\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_50_S50_R1_001.fastq.gz\x94K2\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_51_S51_R1_001.fastq.gz\x94K3\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_52_S52_R1_001.fastq.gz\x94K4\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_53_S53_R1_001.fastq.gz\x94K5\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_54_S54_R1_001.fastq.gz\x94K6\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_55_S55_R1_001.fastq.gz\x94K7\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_56_S56_R1_001.fastq.gz\x94K8\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_57_S57_R1_001.fastq.gz\x94K9\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_58_S58_R1_001.fastq.gz\x94K:\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_59_S59_R1_001.fastq.gz\x94K;\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_60_S60_R1_001.fastq.gz\x94K<\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_61_S61_R1_001.fastq.gz\x94K=\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_62_S62_R1_001.fastq.gz\x94K>\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_63_S63_R1_001.fastq.gz\x94K?\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_64_S64_R1_001.fastq.gz\x94K@\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_65_S65_R1_001.fastq.gz\x94KA\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_66_S66_R1_001.fastq.gz\x94KB\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_67_S67_R1_001.fastq.gz\x94KC\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_68_S68_R1_001.fastq.gz\x94KD\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_69_S69_R1_001.fastq.gz\x94KE\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_70_S70_R1_001.fastq.gz\x94KF\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_71_S71_R1_001.fastq.gz\x94KG\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_72_S72_R1_001.fastq.gz\x94KH\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_73_S73_R1_001.fastq.gz\x94KI\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_74_S74_R1_001.fastq.gz\x94KJ\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_75_S75_R1_001.fastq.gz\x94KK\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_76_S76_R1_001.fastq.gz\x94KL\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_77_S77_R1_001.fastq.gz\x94KM\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_78_S78_R1_001.fastq.gz\x94KN\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_79_S79_R1_001.fastq.gz\x94KO\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_80_S80_R1_001.fastq.gz\x94KP\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_81_S81_R1_001.fastq.gz\x94KQ\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_82_S82_R1_001.fastq.gz\x94KR\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_83_S83_R1_001.fastq.gz\x94KS\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_84_S84_R1_001.fastq.gz\x94KT\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_85_S85_R1_001.fastq.gz\x94KU\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_86_S86_R1_001.fastq.gz\x94KV\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_87_S87_R1_001.fastq.gz\x94KW\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_88_S88_R1_001.fastq.gz\x94KX\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_89_S89_R1_001.fastq.gz\x94KY\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_90_S90_R1_001.fastq.gz\x94KZ\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_91_S91_R1_001.fastq.gz\x94K[\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_92_S92_R1_001.fastq.gz\x94K\\\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_93_S93_R1_001.fastq.gz\x94K]\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_94_S94_R1_001.fastq.gz\x94K^\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_95_S95_R1_001.fastq.gz\x94K_\x8cu/shared/ngs/illumina/bloom_lab/250826_VH00699_584_AACW2HHHV/Unaligned/Project_bloom_lab/PlateB_96_S96_R1_001.fastq.gz\x94u\x8c\x0fserum_replicate\x94}\x94(K\x00j\xcd\x03\x00\x00K\x01j\xcd\x03\x00\x00K\x02j\xcd\x03\x00\x00K\x03j\xcd\x03\x00\x00K\x04j\xcd\x03\x00\x00K\x05j\xcd\x03\x00\x00K\x06j\xcd\x03\x00\x00K\x07j\xcd\x03\x00\x00K\x08j\xce\x03\x00\x00K\tj\xce\x03\x00\x00K\nj\xce\x03\x00\x00K\x0bj\xce\x03\x00\x00K\x0cj\xce\x03\x00\x00K\rj\xce\x03\x00\x00K\x0ej\xce\x03\x00\x00K\x0fj\xce\x03\x00\x00K\x10j\xcf\x03\x00\x00K\x11j\xcf\x03\x00\x00K\x12j\xcf\x03\x00\x00K\x13j\xcf\x03\x00\x00K\x14j\xcf\x03\x00\x00K\x15j\xcf\x03\x00\x00K\x16j\xcf\x03\x00\x00K\x17j\xcf\x03\x00\x00K\x18j\xd0\x03\x00\x00K\x19j\xd0\x03\x00\x00K\x1aj\xd0\x03\x00\x00K\x1bj\xd0\x03\x00\x00K\x1cj\xd0\x03\x00\x00K\x1dj\xd0\x03\x00\x00K\x1ej\xd0\x03\x00\x00K\x1fj\xd0\x03\x00\x00K j\xd1\x03\x00\x00K!j\xd1\x03\x00\x00K"j\xd1\x03\x00\x00K#j\xd1\x03\x00\x00K$j\xd1\x03\x00\x00K%j\xd1\x03\x00\x00K&j\xd1\x03\x00\x00K\'j\xd1\x03\x00\x00K(j\xd2\x03\x00\x00K)j\xd2\x03\x00\x00K*j\xd2\x03\x00\x00K+j\xd2\x03\x00\x00K,j\xd2\x03\x00\x00K-j\xd2\x03\x00\x00K.j\xd2\x03\x00\x00K/j\xd2\x03\x00\x00K0j\xd3\x03\x00\x00K1j\xd3\x03\x00\x00K2j\xd3\x03\x00\x00K3j\xd3\x03\x00\x00K4j\xd3\x03\x00\x00K5j\xd3\x03\x00\x00K6j\xd3\x03\x00\x00K7j\xd3\x03\x00\x00K8j\xd4\x03\x00\x00K9j\xd4\x03\x00\x00K:j\xd4\x03\x00\x00K;j\xd4\x03\x00\x00K<j\xd4\x03\x00\x00K=j\xd4\x03\x00\x00K>j\xd4\x03\x00\x00K?j\xd4\x03\x00\x00K@j\xd5\x03\x00\x00KAj\xd5\x03\x00\x00KBj\xd5\x03\x00\x00KCj\xd5\x03\x00\x00KDj\xd5\x03\x00\x00KEj\xd5\x03\x00\x00KFj\xd5\x03\x00\x00KGj\xd5\x03\x00\x00KHj\xd6\x03\x00\x00KIj\xd6\x03\x00\x00KJj\xd6\x03\x00\x00KKj\xd6\x03\x00\x00KLj\xd6\x03\x00\x00KMj\xd6\x03\x00\x00KNj\xd6\x03\x00\x00KOj\xd6\x03\x00\x00KPj\xd7\x03\x00\x00KQj\xd7\x03\x00\x00KRj\xd7\x03\x00\x00KSj\xd7\x03\x00\x00KTj\xd7\x03\x00\x00KUj\xd7\x03\x00\x00KVj\xd7\x03\x00\x00KWj\xd7\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\x0bEPIHK_21_40\x94K\x01\x8c\x0bEPIHK_21_92\x94K\x02\x8c\x0cEPIHK_21_212\x94K\x03\x8c\x0cEPIHK_21_487\x94K\x04\x8c\rEPIHK_21_1119\x94K\x05\x8c\rEPIHK_21_2575\x94K\x06\x8c\rEPIHK_21_5921\x94K\x07\x8c\x0eEPIHK_21_13619\x94K\x08\x8c\x0bEPIHK_22_40\x94K\t\x8c\x0bEPIHK_22_92\x94K\n\x8c\x0cEPIHK_22_212\x94K\x0b\x8c\x0cEPIHK_22_487\x94K\x0c\x8c\rEPIHK_22_1119\x94K\r\x8c\rEPIHK_22_2575\x94K\x0e\x8c\rEPIHK_22_5921\x94K\x0f\x8c\x0eEPIHK_22_13619\x94K\x10\x8c\x0bEPIHK_23_40\x94K\x11\x8c\x0bEPIHK_23_92\x94K\x12\x8c\x0cEPIHK_23_212\x94K\x13\x8c\x0cEPIHK_23_487\x94K\x14\x8c\rEPIHK_23_1119\x94K\x15\x8c\rEPIHK_23_2575\x94K\x16\x8c\rEPIHK_23_5921\x94K\x17\x8c\x0eEPIHK_23_13619\x94K\x18\x8c\x0bEPIHK_24_40\x94K\x19\x8c\x0bEPIHK_24_92\x94K\x1a\x8c\x0cEPIHK_24_212\x94K\x1b\x8c\x0cEPIHK_24_487\x94K\x1c\x8c\rEPIHK_24_1119\x94K\x1d\x8c\rEPIHK_24_2575\x94K\x1e\x8c\rEPIHK_24_5921\x94K\x1f\x8c\x0eEPIHK_24_13619\x94K \x8c\x0bEPIHK_25_40\x94K!\x8c\x0bEPIHK_25_92\x94K"\x8c\x0cEPIHK_25_212\x94K#\x8c\x0cEPIHK_25_487\x94K$\x8c\rEPIHK_25_1119\x94K%\x8c\rEPIHK_25_2575\x94K&\x8c\rEPIHK_25_5921\x94K\'\x8c\x0eEPIHK_25_13619\x94K(\x8c\x0bEPIHK_26_40\x94K)\x8c\x0bEPIHK_26_92\x94K*\x8c\x0cEPIHK_26_212\x94K+\x8c\x0cEPIHK_26_487\x94K,\x8c\rEPIHK_26_1119\x94K-\x8c\rEPIHK_26_2575\x94K.\x8c\rEPIHK_26_5921\x94K/\x8c\x0eEPIHK_26_13619\x94K0\x8c\x0bEPIHK_27_40\x94K1\x8c\x0bEPIHK_27_92\x94K2\x8c\x0cEPIHK_27_212\x94K3\x8c\x0cEPIHK_27_487\x94K4\x8c\rEPIHK_27_1119\x94K5\x8c\rEPIHK_27_2575\x94K6\x8c\rEPIHK_27_5921\x94K7\x8c\x0eEPIHK_27_13619\x94K8\x8c\x0bEPIHK_28_40\x94K9\x8c\x0bEPIHK_28_92\x94K:\x8c\x0cEPIHK_28_212\x94K;\x8c\x0cEPIHK_28_487\x94K<\x8c\rEPIHK_28_1119\x94K=\x8c\rEPIHK_28_2575\x94K>\x8c\rEPIHK_28_5921\x94K?\x8c\x0eEPIHK_28_13619\x94K@\x8c\x0bEPIHK_29_40\x94KA\x8c\x0bEPIHK_29_92\x94KB\x8c\x0cEPIHK_29_212\x94KC\x8c\x0cEPIHK_29_487\x94KD\x8c\rEPIHK_29_1119\x94KE\x8c\rEPIHK_29_2575\x94KF\x8c\rEPIHK_29_5921\x94KG\x8c\x0eEPIHK_29_13619\x94KH\x8c\x0bEPIHK_30_40\x94KI\x8c\x0bEPIHK_30_92\x94KJ\x8c\x0cEPIHK_30_212\x94KK\x8c\x0cEPIHK_30_487\x94KL\x8c\rEPIHK_30_1119\x94KM\x8c\rEPIHK_30_2575\x94KN\x8c\rEPIHK_30_5921\x94KO\x8c\x0eEPIHK_30_13619\x94KP\x8c\x0bEPIHK_31_40\x94KQ\x8c\x0bEPIHK_31_92\x94KR\x8c\x0cEPIHK_31_212\x94KS\x8c\x0cEPIHK_31_487\x94KT\x8c\rEPIHK_31_1119\x94KU\x8c\rEPIHK_31_2575\x94KV\x8c\rEPIHK_31_5921\x94KW\x8c\x0eEPIHK_31_13619\x94KXjA\x04\x00\x00KYjB\x04\x00\x00KZjC\x04\x00\x00K[jD\x04\x00\x00K\\jE\x04\x00\x00K]jF\x04\x00\x00K^jG\x04\x00\x00K_jH\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\x07plate14\x94K\x01j\xa7\x04\x00\x00K\x02j\xa7\x04\x00\x00K\x03j\xa7\x04\x00\x00K\x04j\xa7\x04\x00\x00K\x05j\xa7\x04\x00\x00K\x06j\xa7\x04\x00\x00K\x07j\xa7\x04\x00\x00K\x08j\xa7\x04\x00\x00K\tj\xa7\x04\x00\x00K\nj\xa7\x04\x00\x00K\x0bj\xa7\x04\x00\x00K\x0cj\xa7\x04\x00\x00K\rj\xa7\x04\x00\x00K\x0ej\xa7\x04\x00\x00K\x0fj\xa7\x04\x00\x00K\x10j\xa7\x04\x00\x00K\x11j\xa7\x04\x00\x00K\x12j\xa7\x04\x00\x00K\x13j\xa7\x04\x00\x00K\x14j\xa7\x04\x00\x00K\x15j\xa7\x04\x00\x00K\x16j\xa7\x04\x00\x00K\x17j\xa7\x04\x00\x00K\x18j\xa7\x04\x00\x00K\x19j\xa7\x04\x00\x00K\x1aj\xa7\x04\x00\x00K\x1bj\xa7\x04\x00\x00K\x1cj\xa7\x04\x00\x00K\x1dj\xa7\x04\x00\x00K\x1ej\xa7\x04\x00\x00K\x1fj\xa7\x04\x00\x00K j\xa7\x04\x00\x00K!j\xa7\x04\x00\x00K"j\xa7\x04\x00\x00K#j\xa7\x04\x00\x00K$j\xa7\x04\x00\x00K%j\xa7\x04\x00\x00K&j\xa7\x04\x00\x00K\'j\xa7\x04\x00\x00K(j\xa7\x04\x00\x00K)j\xa7\x04\x00\x00K*j\xa7\x04\x00\x00K+j\xa7\x04\x00\x00K,j\xa7\x04\x00\x00K-j\xa7\x04\x00\x00K.j\xa7\x04\x00\x00K/j\xa7\x04\x00\x00K0j\xa7\x04\x00\x00K1j\xa7\x04\x00\x00K2j\xa7\x04\x00\x00K3j\xa7\x04\x00\x00K4j\xa7\x04\x00\x00K5j\xa7\x04\x00\x00K6j\xa7\x04\x00\x00K7j\xa7\x04\x00\x00K8j\xa7\x04\x00\x00K9j\xa7\x04\x00\x00K:j\xa7\x04\x00\x00K;j\xa7\x04\x00\x00K<j\xa7\x04\x00\x00K=j\xa7\x04\x00\x00K>j\xa7\x04\x00\x00K?j\xa7\x04\x00\x00K@j\xa7\x04\x00\x00KAj\xa7\x04\x00\x00KBj\xa7\x04\x00\x00KCj\xa7\x04\x00\x00KDj\xa7\x04\x00\x00KEj\xa7\x04\x00\x00KFj\xa7\x04\x00\x00KGj\xa7\x04\x00\x00KHj\xa7\x04\x00\x00KIj\xa7\x04\x00\x00KJj\xa7\x04\x00\x00KKj\xa7\x04\x00\x00KLj\xa7\x04\x00\x00KMj\xa7\x04\x00\x00KNj\xa7\x04\x00\x00KOj\xa7\x04\x00\x00KPj\xa7\x04\x00\x00KQj\xa7\x04\x00\x00KRj\xa7\x04\x00\x00KSj\xa7\x04\x00\x00KTj\xa7\x04\x00\x00KUj\xa7\x04\x00\x00KVj\xa7\x04\x00\x00KWj\xa7\x04\x00\x00KXj\xa7\x04\x00\x00KYj\xa7\x04\x00\x00KZj\xa7\x04\x00\x00K[j\xa7\x04\x00\x00K\\j\xa7\x04\x00\x00K]j\xa7\x04\x00\x00K^j\xa7\x04\x00\x00K_j\xa7\x04\x00\x00u\x8c\x0fplate_replicate\x94}\x94(K\x00j\xa7\x04\x00\x00K\x01j\xa7\x04\x00\x00K\x02j\xa7\x04\x00\x00K\x03j\xa7\x04\x00\x00K\x04j\xa7\x04\x00\x00K\x05j\xa7\x04\x00\x00K\x06j\xa7\x04\x00\x00K\x07j\xa7\x04\x00\x00K\x08j\xa7\x04\x00\x00K\tj\xa7\x04\x00\x00K\nj\xa7\x04\x00\x00K\x0bj\xa7\x04\x00\x00K\x0cj\xa7\x04\x00\x00K\rj\xa7\x04\x00\x00K\x0ej\xa7\x04\x00\x00K\x0fj\xa7\x04\x00\x00K\x10j\xa7\x04\x00\x00K\x11j\xa7\x04\x00\x00K\x12j\xa7\x04\x00\x00K\x13j\xa7\x04\x00\x00K\x14j\xa7\x04\x00\x00K\x15j\xa7\x04\x00\x00K\x16j\xa7\x04\x00\x00K\x17j\xa7\x04\x00\x00K\x18j\xa7\x04\x00\x00K\x19j\xa7\x04\x00\x00K\x1aj\xa7\x04\x00\x00K\x1bj\xa7\x04\x00\x00K\x1cj\xa7\x04\x00\x00K\x1dj\xa7\x04\x00\x00K\x1ej\xa7\x04\x00\x00K\x1fj\xa7\x04\x00\x00K j\xa7\x04\x00\x00K!j\xa7\x04\x00\x00K"j\xa7\x04\x00\x00K#j\xa7\x04\x00\x00K$j\xa7\x04\x00\x00K%j\xa7\x04\x00\x00K&j\xa7\x04\x00\x00K\'j\xa7\x04\x00\x00K(j\xa7\x04\x00\x00K)j\xa7\x04\x00\x00K*j\xa7\x04\x00\x00K+j\xa7\x04\x00\x00K,j\xa7\x04\x00\x00K-j\xa7\x04\x00\x00K.j\xa7\x04\x00\x00K/j\xa7\x04\x00\x00K0j\xa7\x04\x00\x00K1j\xa7\x04\x00\x00K2j\xa7\x04\x00\x00K3j\xa7\x04\x00\x00K4j\xa7\x04\x00\x00K5j\xa7\x04\x00\x00K6j\xa7\x04\x00\x00K7j\xa7\x04\x00\x00K8j\xa7\x04\x00\x00K9j\xa7\x04\x00\x00K:j\xa7\x04\x00\x00K;j\xa7\x04\x00\x00K<j\xa7\x04\x00\x00K=j\xa7\x04\x00\x00K>j\xa7\x04\x00\x00K?j\xa7\x04\x00\x00K@j\xa7\x04\x00\x00KAj\xa7\x04\x00\x00KBj\xa7\x04\x00\x00KCj\xa7\x04\x00\x00KDj\xa7\x04\x00\x00KEj\xa7\x04\x00\x00KFj\xa7\x04\x00\x00KGj\xa7\x04\x00\x00KHj\xa7\x04\x00\x00KIj\xa7\x04\x00\x00KJj\xa7\x04\x00\x00KKj\xa7\x04\x00\x00KLj\xa7\x04\x00\x00KMj\xa7\x04\x00\x00KNj\xa7\x04\x00\x00KOj\xa7\x04\x00\x00KPj\xa7\x04\x00\x00KQj\xa7\x04\x00\x00KRj\xa7\x04\x00\x00KSj\xa7\x04\x00\x00KTj\xa7\x04\x00\x00KUj\xa7\x04\x00\x00KVj\xa7\x04\x00\x00KWj\xa7\x04\x00\x00KX\x8c\tplate14-1\x94KY\x8c\tplate14-2\x94KZ\x8c\tplate14-3\x94K[\x8c\tplate14-4\x94K\\\x8c\tplate14-5\x94K]\x8c\tplate14-6\x94K^\x8c\tplate14-7\x94K_\x8c\tplate14-8\x94uuu\x8c\x04png8\x94e}\x94(h\xcc}\x94(\x8c\x0eviral_barcodes\x94K\x00N\x86\x94\x8c\x16neut_standard_barcodes\x94K\x01N\x86\x94jg\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\xb5\x04\x00\x00j\x0c\x01\x00\x00j\xb7\x04\x00\x00j\xbb\x02\x00\x00jg\x03\x00\x00j\xc7\x02\x00\x00j\xba\x04\x00\x00j(\x03\x00\x00j\xbc\x04\x00\x00j\xb2\x04\x00\x00ub\x8c\r_params_types\x94}\x94\x8c\twildcards\x94h\x06\x8c\tWildcards\x94\x93\x94)\x81\x94\x8c\x07plate14\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\xa5\x04\x00\x00j\xc9\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\xdb\x04\x00\x00K\x01j\xdd\x04\x00\x00K\x01j\xdf\x04\x00\x00j\xd8\x04\x00\x00ub\x8c\x03log\x94h\x06\x8c\x03Log\x94\x93\x94)\x81\x94\x8c,results/plates/plate14/process_plate14.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\xed\x04\x00\x00j\xea\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(j\\\x03\x00\x00j]\x03\x00\x00j^\x03\x00\x00j_\x03\x00\x00j`\x03\x00\x00K\x14ja\x03\x00\x00K\x04jb\x03\x00\x00jc\x03\x00\x00u\x8c#default_process_plate_qc_thresholds\x94}\x94(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c%default_process_plate_curvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00]\x94(G?\xe3333333K\x01ejL\x03\x00\x00K\x00jM\x03\x00\x00]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c!default_process_plate_curvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00]\x94jX\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(\x8c\x08plate1-2\x94}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94\x8c\x08datetime\x94\x8c\x04date\x94\x93\x94C\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_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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x08plate2-2\x94}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\x05\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuj\xa7\x04\x00\x00}\x94(j)\x03\x00\x00j*\x03\x00\x00j+\x03\x00\x00jH\x05\x00\x00C\x04\x07\xe9\x08\x12\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\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06ujG\x03\x00\x00}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00ujO\x03\x00\x00}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\x05\x00\x00ujZ\x03\x00\x00}\x94(jd\x03\x00\x00je\x03\x00\x00jf\x03\x00\x00K\x01uu\x8c\x07plate15\x94}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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(j7\x03\x00\x00M\xf4\x01j8\x03\x00\x00G?tz\xe1G\xae\x14{j9\x03\x00\x00}\x94(j;\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-j<\x03\x00\x00K\x04j=\x03\x00\x00K\x02uj>\x03\x00\x00}\x94(j@\x03\x00\x00G?tz\xe1G\xae\x14{jA\x03\x00\x00K\x04jB\x03\x00\x00K\x02ujC\x03\x00\x00M\xe8\x03jD\x03\x00\x00KdjE\x03\x00\x00K\x03jF\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jI\x03\x00\x00K\x01jJ\x03\x00\x00j.\x05\x00\x00jL\x03\x00\x00K\x00jM\x03\x00\x00j/\x05\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(jQ\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00jR\x03\x00\x00}\x94(jT\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00jU\x03\x00\x00G?\xc3333333ujV\x03\x00\x00j3\x05\x00\x00jX\x03\x00\x00j4\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\x94jH\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\x94jH\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\x94jH\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\x94jH\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:

In [2]:
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:

In [3]:
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='plate14'

Plate has 96 samples (wells)

Data manually specified to drop:
manual_drops: {}
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:

In [4]:
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:

In [5]:
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 or downstream2 for the illuminabarcodeparser), reads that are otherwise valid except for this outer flank. Typically you would be using upstream2 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.

In [6]:
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
Out[6]:

Read barcode counts and apply manually specified drops¶

Read the counts per barcode:

In [7]:
# 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:

In [8]:
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])]

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:

In [9]:
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: ['C10', 'C12']

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.

In [10]:
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)
In [11]:
# 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:

  1. Looking at all viral (but not neut-standard) barcodes only for the no-serum samples (wells).

  2. 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.

In [12]:
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 1 barcodes for failing qc={'min_frac': 0.0001, 'max_fold_change': 4, 'max_wells': 2}: ['CTCTTACGCTCCTACG']


=========================================================================================
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.

In [13]:
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)
In [14]:
# 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.

In [15]:
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)
In [16]:
# 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 4 barcode-wells for failing qc_thresholds['min_no_serum_count_per_viral_barcode_well']=100: [('GATTCAGATGCCCACC', 'A12'), ('CCTTTCTCAAAACATA', 'D12'), ('AGTCCTATCCTCAAAT', 'D12'), ('GATTCAGATGCCCACC', 'H12')]

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:

In [17]:
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:

In [18]:
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:

In [19]:
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"]
)
In [20]:
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)
In [21]:
# 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 232 barcode-wells for failing qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=3: [('AGTCCTATCCTCAAAT', 'F1'), ('ACAAAGTCTCGAGAAG', 'G1'), ('GAGGGGATACGTCACC', 'H1'), ('AGTTTTTATAACTTGC', 'H1'), ('CCCCTCCTCTAAAGTT', 'G2'), ('TCTCAGCTCTTAGCCG', 'G2'), ('TAGCTGATAGTAACTC', 'H2'), ('AATGCGAGCATGTCAA', 'H2'), ('GACCCCTTGTAAGATG', 'H2'), ('AGTCCTATCCTCAAAT', 'H2'), ('GATCGCCACTGATAAG', 'D3'), ('TGTTGAGCCAGTCTGA', 'H3'), ('AACACGTAGAACCGCC', 'H3'), ('GACCCCTTGTAAGATG', 'H3'), ('TCGAGTTAATATGCGC', 'H3'), ('TTAATGTAGCCGCTCC', 'H3'), ('AGACCATCGCACCCAA', 'C4'), ('CACCAATCTTCGAACT', 'D4'), ('ATAGAATCGCAAATTA', 'F4'), ('GATCACGCAGAAAAAG', 'F4'), ('ATCAGGATAATCGCGC', 'F4'), ('GACCCCTTGTAAGATG', 'G4'), ('AACCACCCCAGAGATG', 'H4'), ('CAATTCGCCGTTCCCC', 'C5'), ('ATAGAAAATTATCCGC', 'F5'), ('CACGGCCGGCGAACTC', 'F5'), ('CGATCTTTACGAAAAA', 'G5'), ('CACGGGCTAATGTCTC', 'H5'), ('GACCCCTTGTAAGATG', 'H5'), ('GACCCCTTGTAAGATG', 'C6'), ('CCTTTCTCAAAACATA', 'D6'), ('ACGTCCATTAAGATCA', 'E6'), ('AGGTTCAGACTCTTGC', 'F6'), ('GATCACGCAGAAAAAG', 'F6'), ('GCGAAGTTTCATAGCG', 'F6'), ('TAGCTGATAGTAACTC', 'F6'), ('CCTTTCTCAAAACATA', 'F6'), ('GATTCAGATGCCCACC', 'F6'), ('CACCAATCTTCGAACT', 'G6'), ('CAGAACCTCGTTGTCT', 'H6'), ('CATGGGAATTGCCACT', 'H6'), ('AATGAAACAATCGAAC', 'H6'), ('TTTCAGCGTTGTTTTG', 'H6'), ('ACAAGATTCGGGGGAC', 'H6'), ('CGTTCAGCGATAACGG', 'H6'), ('GTTATTATGACTTCAT', 'H6'), ('CTATCTTAATCTACAG', 'H6'), ('GAAGAAACTATAACCA', 'H6'), ('TGACAACAATACAAAT', 'H6'), ('GTAGAACTGCGGCCCC', 'H6'), ('AGGAAAGAAACTGGAG', 'H6'), ('AGTATTTGCGCTTCAA', 'H6'), ('GCAACGAGGTGTAACC', 'H6'), ('TTTCACAGAACCTATC', 'H6'), ('AAAGCTCTTTTCGTTC', 'H6'), ('ATGGGATTGGAGAAAC', 'H6'), ('TTGACTCACCGAATAA', 'H6'), ('GCATGGAACTAACTCC', 'H6'), ('ATGGCCCACGGGCATA', 'H6'), ('AAGTTAAGAGAAAGTT', 'H6'), ('TATCCAAGGGACGGAC', 'H6'), ('ACTCTGGCTCGCTAAT', 'H6'), ('CGCAGCATTGGTCGCC', 'H6'), ('TAACGTGATTTCTCGA', 'H6'), ('GTGCGATTGTCCGGAA', 'H6'), ('ACAAAGTCTCGAGAAG', 'H6'), ('AAATTCACAATATCCA', 'H6'), ('CGTTTTTGGTTCGAGG', 'H6'), ('GTAAGCTTCATGGAGT', 'H6'), ('GTACCCAGTTCCTGCG', 'H6'), ('TCTTAGTCCTCGTATG', 'H6'), ('CGTACGTATGTCCCAG', 'H6'), ('TCTTGACATAGCGATG', 'H6'), ('AGATCCACCCTATAGT', 'H6'), ('AGGTTCAGACTCTTGC', 'H6'), ('GTGGTATCAAGCCGGG', 'H6'), ('TGCAGTGGTATACATA', 'H6'), ('AGTAAACATGCATTGG', 'H6'), ('AACTTCCGTCGCCTGA', 'H6'), ('TTGAAAAAATCATAAA', 'H6'), ('CCGGATAAATCAGAAC', 'H6'), ('AGATCCCAGGTCCTTT', 'H6'), ('GAAAGTCCCTATGATG', 'H6'), ('AGCTCCTGGGGTATCA', 'H6'), ('ACACGGGTTGGCTGTA', 'H6'), ('ATTTAAATTCGAGGAC', 'H6'), ('AGACCGCCAGTTTCGT', 'H6'), ('TCGAACGAAGTAGGAG', 'H6'), ('TCTTTACCACTGCATC', 'H6'), ('AATTCGTGAGTACTAG', 'H6'), ('CCAAGCTTGGCGCATC', 'H6'), ('AGAGCTAAAAAGAGGA', 'H6'), ('TGCGGTGGTCGATCCG', 'H6'), ('ACAGTCCACCATTGAG', 'H6'), ('GATCACGCAGAAAAAG', 'H6'), ('TGTCCGGATAAAGTAG', 'H6'), ('TTGGGCACTAAATTAA', 'H6'), ('GACAAAAGGGACATAT', 'H6'), ('CTGGAGGCCTGGCCCC', 'H6'), ('TCTAACTCTCGCGGCA', 'H6'), ('ATACACGAGGTTGTGA', 'H6'), ('ATCAGGATAATCGCGC', 'H6'), ('TGTTGAGCCAGTCTGA', 'H6'), ('TGCTATTCCGGCGCGG', 'H6'), ('AGGACTATAGTTGGCA', 'H6'), ('ACGTCCATTAAGATCA', 'H6'), ('TATTAAGAGAAGTGCG', 'H6'), ('ATAACTGAGGGCATTG', 'H6'), ('GAGGGGATACGTCACC', 'H6'), ('GCGAAGTTTCATAGCG', 'H6'), ('TAGCTGATAGTAACTC', 'H6'), ('TATATTAGTAACATAA', 'H6'), ('TTTATATCGAGATTCA', 'H6'), ('TCGCTTCAACTAAAAA', 'H6'), ('AAGGTCCCTATGTAAT', 'H6'), ('CTCAAATAATTGGCGC', 'H6'), ('ACAGTACGATCTACGC', 'H6'), ('CACGGCCGGCGAACTC', 'H6'), ('AAAGTAGCAGAGGATT', 'H6'), ('AATGCGAGCATGTCAA', 'H6'), ('CACGGGCTAATGTCTC', 'H6'), ('CGACTCCACGGACGCC', 'H6'), ('GCCGCTGCGGCGTGTG', 'H6'), ('CGAAACACGTCCCAGT', 'H6'), ('CCGCGCACGTTTAGAG', 'H6'), ('AGTTTTTATAACTTGC', 'H6'), ('ATCCGATTTAAAGGCA', 'H6'), ('ATGGTTTTACGTCCAT', 'H6'), ('GAAATCCCCAAATAAC', 'H6'), ('GACCCCTTGTAAGATG', 'H6'), ('TTAATGTAGCCGCTCC', 'H6'), ('AGTCCTATCCTCAAAT', 'H6'), ('TCGAGTTAATATGCGC', 'H6'), ('TACAAGAGAGGGGTCC', 'H6'), ('GATTCAGATGCCCACC', 'H6'), ('GAAATCCCCAAATAAC', 'D7'), ('ACAGTCCACCATTGAG', 'F7'), ('CGAAACACGTCCCAGT', 'F7'), ('TCGAGTTAATATGCGC', 'F7'), ('AGTTTTTATAACTTGC', 'G7'), ('GACAAAAGGGACATAT', 'H7'), ('GAGGGGATACGTCACC', 'H7'), ('TGTCCGGATAAAGTAG', 'H7'), ('GAGCTTGCTATGGATC', 'H7'), ('ATGGTTTTACGTCCAT', 'H7'), ('GACCCCTTGTAAGATG', 'H7'), ('AACCACCCCAGAGATG', 'D8'), ('ATGGTTTTACGTCCAT', 'D8'), ('CACGGGCTAATGTCTC', 'D8'), ('GACCCCTTGTAAGATG', 'D8'), ('AGTTTTTATAACTTGC', 'D8'), ('GACCCCTTGTAAGATG', 'E8'), ('TCTAACTCTCGCGGCA', 'F8'), ('GACCCCTTGTAAGATG', 'F8'), ('TCGAGTTAATATGCGC', 'F8'), ('GATTCAGATGCCCACC', 'F8'), ('TACATACCGACGCAGT', 'H8'), ('ACAAAGTCTCGAGAAG', 'H8'), ('AAAGTAGCAGAGGATT', 'H8'), ('CCTTTCTCAAAACATA', 'H8'), ('TCGAGTTAATATGCGC', 'C9'), ('AGTTTTTATAACTTGC', 'E9'), ('ATCAGGATAATCGCGC', 'E9'), ('CACCAATCTTCGAACT', 'E9'), ('GATTCAGATGCCCACC', 'E9'), ('AATTCGTGAGTACTAG', 'F9'), ('TTAATGTAGCCGCTCC', 'F9'), ('GATTCAGATGCCCACC', 'F9'), ('TGGAATCGTCACCGAT', 'G9'), ('GCGAAGTTTCATAGCG', 'H9'), ('TGTCCGGATAAAGTAG', 'H9'), ('GACCCCTTGTAAGATG', 'H9'), ('AGTTTTTATAACTTGC', 'H9'), ('TTAATGTAGCCGCTCC', 'H9'), ('CTATCTTAATCTACAG', 'D10'), ('AAGTATTGCTACACAT', 'D10'), ('GTAGAACTGCGGCCCC', 'D10'), ('ACTCTGGCTCGCTAAT', 'D10'), ('GCATGGAACTAACTCC', 'D10'), ('TAACGTGATTTCTCGA', 'D10'), ('TGCTATTCCGGCGCGG', 'D10'), ('ATTTAAATTCGAGGAC', 'D10'), ('ACAGTCCACCATTGAG', 'D10'), ('CAAAAGCAGCACGATA', 'D10'), ('TGCAGTGGTATACATA', 'D10'), ('ACCGATTCACGAATAA', 'D10'), ('TCTTTACCACTGCATC', 'D10'), ('ATCAGGATAATCGCGC', 'D10'), ('ACCCCCGGAGCTTGGC', 'D10'), ('GCGAAGTTTCATAGCG', 'D10'), ('TATTAAGAGAAGTGCG', 'D10'), ('GACCCCTTGTAAGATG', 'D10'), ('CGAAACACGTCCCAGT', 'D10'), ('TTTATATCGAGATTCA', 'D10'), ('GAGGGGATACGTCACC', 'D10'), ('TAGCTGATAGTAACTC', 'D10'), ('CCGCGCACGTTTAGAG', 'D10'), ('TCGAGTTAATATGCGC', 'D10'), ('CGACTCCACGGACGCC', 'D10'), ('AACCACCCCAGAGATG', 'D10'), ('GAGCTTGCTATGGATC', 'D10'), ('AGATCCACCCTATAGT', 'D10'), ('CACGGCCGGCGAACTC', 'D10'), ('CACGGGCTAATGTCTC', 'D10'), ('CTTACTGCGCGAGAGT', 'D10'), ('CACCAATCTTCGAACT', 'D10'), ('AGTTTTTATAACTTGC', 'D10'), ('GCCGGCGTTAGTGTCA', 'D10'), ('GTGCATCCTAGTGACG', 'D10'), ('TTAATGTAGCCGCTCC', 'D10'), ('TACAAGAGAGGGGTCC', 'D10'), ('TAACGTGATTTCTCGA', 'E10'), ('TCGAGTTAATATGCGC', 'E10'), ('TATTAAGAGAAGTGCG', 'F10'), ('AACCACCCCAGAGATG', 'F10'), ('TGTCCGGATAAAGTAG', 'F10'), ('AGTCCTATCCTCAAAT', 'F10'), ('TCGAGTTAATATGCGC', 'F10'), ('CAGATAGTGATGAACA', 'H10'), ('AACCACCCCAGAGATG', 'H10'), ('CCTTTCTCAAAACATA', 'H10'), ('GCCGGCGTTAGTGTCA', 'H10'), ('AGTTTTTATAACTTGC', 'H10'), ('TCGAGTTAATATGCGC', 'H10'), ('AGTCCTATCCTCAAAT', 'D11'), ('CGTACGTATGTCCCAG', 'E11'), ('GCCGGCGTTAGTGTCA', 'E11'), ('TTAATGTAGCCGCTCC', 'E11'), ('AGATCCACCCTATAGT', 'F11'), ('CGAAACACGTCCCAGT', 'F11'), ('AGTCCTATCCTCAAAT', 'F11'), ('TCTCAGCTCTTAGCCG', 'H11')]

Check how many dilutions we have per barcode / serum-replicate:

In [22]:
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 7 barcode/serum-replicates for failing qc_thresholds['min_dilutions_per_barcode_serum_replicate']=6: [('GACCCCTTGTAAGATG', 'EPIHK_28'), ('TATTAAGAGAAGTGCG', 'EPIHK_30'), ('AACCACCCCAGAGATG', 'EPIHK_30'), ('GCCGGCGTTAGTGTCA', 'EPIHK_30'), ('TAACGTGATTTCTCGA', 'EPIHK_30'), ('TCGAGTTAATATGCGC', 'EPIHK_30'), ('AGTTTTTATAACTTGC', 'EPIHK_30')]

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:

In [23]:
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):

In [24]:
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,
        ),
    )
)
In [25]:
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': []}

Out[25]:

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:

In [26]:
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 EPIHK_21 ATTAGATTATAACGTA 1.000000 A/Cambodia/e0826360/2020_H3N2 0.391997 0.255988 False True True False
1 EPIHK_22 CACCAATCTTCGAACT 1.000000 A/Santiago/101713/2024_H1N1 0.406019 0.329441 False True True False
2 EPIHK_22 GCCTTTGCGCGCAGTC 1.000000 A/Badajoz/18680568/2025_H3N2 0.411758 0.245029 False True True False
3 EPIHK_23 TATTCCTAACTAGCGA 1.000000 A/Sao_Paulo/358026766-IAL/2024_H3N2 0.421019 0.258296 False True True False
4 EPIHK_24 AACCACCCCAGAGATG 1.000000 A/Kansas/14/2017_H3N2 0.487544 0.221085 False True True False
5 EPIHK_24 AGACCATCGCACCCAA 1.000000 A/Thailand/8/2022_H3N2 0.090634 0.229401 False True True False
6 EPIHK_24 CCGCATTAGCGGGAGG 1.000000 A/Maldives/2186/2024_H3N2 0.477631 0.194010 False True True False
7 EPIHK_24 CGTACGTATGTCCCAG 1.000000 A/Thailand/8/2022_H3N2 0.339967 0.158303 False True True False
8 EPIHK_25 AAAGTAGCAGAGGATT 1.000000 A/Darwin/9/2021_H3N2 0.427708 0.212994 False True True False
9 EPIHK_25 CGTTCAGCGATAACGG 1.000000 A/Texas/ISC-1322/2025_H3N2 0.367346 0.212619 False True True False
10 EPIHK_25 TATCCAAGGGACGGAC 0.959487 A/HongKong/45/2019_H3N2 0.230388 0.195379 False True True False
11 EPIHK_30 AGACCATCGCACCCAA 1.000000 A/Thailand/8/2022_H3N2 0.460224 0.190681 False True True False
12 EPIHK_30 CAAAATCTACGGCGAC 1.000000 A/France/BRE-IPP01880/2025_H3N2 0.498215 0.182009 False True True False
13 EPIHK_31 AGACCATCGCACCCAA 1.000000 A/Thailand/8/2022_H3N2 0.328650 0.187406 False True True False
14 EPIHK_31 CCTTTCTCAAAACATA 1.000000 A/California/07/2009_H1N1 0.443221 0.269941 False True True False
15 EPIHK_31 CGTTAACGGCCTATCC 1.000000 A/Darwin/9/2021_H3N2 0.075512 0.181724 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.
figure
In [27]:
# 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 16 barcode/serum-replicates for failing goodness_of_fit={'min_R2': 0.5, 'max_RMSD': 0.15}: [('ATTAGATTATAACGTA', 'EPIHK_21'), ('CACCAATCTTCGAACT', 'EPIHK_22'), ('GCCTTTGCGCGCAGTC', 'EPIHK_22'), ('TATTCCTAACTAGCGA', 'EPIHK_23'), ('AACCACCCCAGAGATG', 'EPIHK_24'), ('AGACCATCGCACCCAA', 'EPIHK_24'), ('CCGCATTAGCGGGAGG', 'EPIHK_24'), ('CGTACGTATGTCCCAG', 'EPIHK_24'), ('AAAGTAGCAGAGGATT', 'EPIHK_25'), ('CGTTCAGCGATAACGG', 'EPIHK_25'), ('TATCCAAGGGACGGAC', 'EPIHK_25'), ('AGACCATCGCACCCAA', 'EPIHK_30'), ('CAAAATCTACGGCGAC', 'EPIHK_30'), ('AGACCATCGCACCCAA', 'EPIHK_31'), ('CCTTTCTCAAAACATA', 'EPIHK_31'), ('CGTTAACGGCCTATCC', 'EPIHK_31')]

Fit neutralization curves after applying QC¶

No we re-fit curves after applying all the QC:

In [28]:
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 EPIHK

Plot all the curves that passed QC:

In [29]:
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.")
figure

Save results to files¶

In [30]:
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/plate14/frac_infectivity.csv

Writing fit parameters to results/plates/plate14/curvefits.csv

Pickling neutcurve.CurveFits object for these data to results/plates/plate14/curvefits.pickle
Writing QC drops to results/plates/plate14/qc_drops.yml

Here are the QC drops:
***************************
wells:
  C10: avg_barcode_counts_per_well
  C12: avg_barcode_counts_per_well
barcodes:
  CTCTTACGCTCCTACG: min_neut_standard_frac_per_well
barcode_wells:
  GATTCAGATGCCCACC A12: min_no_serum_count_per_viral_barcode_well
  CCTTTCTCAAAACATA D12: min_no_serum_count_per_viral_barcode_well
  AGTCCTATCCTCAAAT D12: min_no_serum_count_per_viral_barcode_well
  GATTCAGATGCCCACC H12: min_no_serum_count_per_viral_barcode_well
  AGTCCTATCCTCAAAT F1: max_frac_infectivity_per_viral_barcode_well
  ACAAAGTCTCGAGAAG G1: max_frac_infectivity_per_viral_barcode_well
  GAGGGGATACGTCACC H1: max_frac_infectivity_per_viral_barcode_well
  AGTTTTTATAACTTGC H1: max_frac_infectivity_per_viral_barcode_well
  CCCCTCCTCTAAAGTT G2: max_frac_infectivity_per_viral_barcode_well
  TCTCAGCTCTTAGCCG G2: max_frac_infectivity_per_viral_barcode_well
  TAGCTGATAGTAACTC H2: max_frac_infectivity_per_viral_barcode_well
  AATGCGAGCATGTCAA H2: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG H2: max_frac_infectivity_per_viral_barcode_well
  AGTCCTATCCTCAAAT H2: max_frac_infectivity_per_viral_barcode_well
  GATCGCCACTGATAAG D3: max_frac_infectivity_per_viral_barcode_well
  TGTTGAGCCAGTCTGA H3: max_frac_infectivity_per_viral_barcode_well
  AACACGTAGAACCGCC H3: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG H3: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC H3: max_frac_infectivity_per_viral_barcode_well
  TTAATGTAGCCGCTCC H3: max_frac_infectivity_per_viral_barcode_well
  AGACCATCGCACCCAA C4: max_frac_infectivity_per_viral_barcode_well
  CACCAATCTTCGAACT D4: max_frac_infectivity_per_viral_barcode_well
  ATAGAATCGCAAATTA F4: max_frac_infectivity_per_viral_barcode_well
  GATCACGCAGAAAAAG F4: max_frac_infectivity_per_viral_barcode_well
  ATCAGGATAATCGCGC F4: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG G4: max_frac_infectivity_per_viral_barcode_well
  AACCACCCCAGAGATG H4: max_frac_infectivity_per_viral_barcode_well
  CAATTCGCCGTTCCCC C5: max_frac_infectivity_per_viral_barcode_well
  ATAGAAAATTATCCGC F5: max_frac_infectivity_per_viral_barcode_well
  CACGGCCGGCGAACTC F5: max_frac_infectivity_per_viral_barcode_well
  CGATCTTTACGAAAAA G5: max_frac_infectivity_per_viral_barcode_well
  CACGGGCTAATGTCTC H5: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG H5: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG C6: max_frac_infectivity_per_viral_barcode_well
  CCTTTCTCAAAACATA D6: max_frac_infectivity_per_viral_barcode_well
  ACGTCCATTAAGATCA E6: max_frac_infectivity_per_viral_barcode_well
  AGGTTCAGACTCTTGC F6: max_frac_infectivity_per_viral_barcode_well
  GATCACGCAGAAAAAG F6: max_frac_infectivity_per_viral_barcode_well
  GCGAAGTTTCATAGCG F6: max_frac_infectivity_per_viral_barcode_well
  TAGCTGATAGTAACTC F6: max_frac_infectivity_per_viral_barcode_well
  CCTTTCTCAAAACATA F6: max_frac_infectivity_per_viral_barcode_well
  GATTCAGATGCCCACC F6: max_frac_infectivity_per_viral_barcode_well
  CACCAATCTTCGAACT G6: max_frac_infectivity_per_viral_barcode_well
  CAGAACCTCGTTGTCT H6: max_frac_infectivity_per_viral_barcode_well
  CATGGGAATTGCCACT H6: max_frac_infectivity_per_viral_barcode_well
  AATGAAACAATCGAAC H6: max_frac_infectivity_per_viral_barcode_well
  TTTCAGCGTTGTTTTG H6: max_frac_infectivity_per_viral_barcode_well
  ACAAGATTCGGGGGAC H6: max_frac_infectivity_per_viral_barcode_well
  CGTTCAGCGATAACGG H6: max_frac_infectivity_per_viral_barcode_well
  GTTATTATGACTTCAT H6: max_frac_infectivity_per_viral_barcode_well
  CTATCTTAATCTACAG H6: max_frac_infectivity_per_viral_barcode_well
  GAAGAAACTATAACCA H6: max_frac_infectivity_per_viral_barcode_well
  TGACAACAATACAAAT H6: max_frac_infectivity_per_viral_barcode_well
  GTAGAACTGCGGCCCC H6: max_frac_infectivity_per_viral_barcode_well
  AGGAAAGAAACTGGAG H6: max_frac_infectivity_per_viral_barcode_well
  AGTATTTGCGCTTCAA H6: max_frac_infectivity_per_viral_barcode_well
  GCAACGAGGTGTAACC H6: max_frac_infectivity_per_viral_barcode_well
  TTTCACAGAACCTATC H6: max_frac_infectivity_per_viral_barcode_well
  AAAGCTCTTTTCGTTC H6: max_frac_infectivity_per_viral_barcode_well
  ATGGGATTGGAGAAAC H6: max_frac_infectivity_per_viral_barcode_well
  TTGACTCACCGAATAA H6: max_frac_infectivity_per_viral_barcode_well
  GCATGGAACTAACTCC H6: max_frac_infectivity_per_viral_barcode_well
  ATGGCCCACGGGCATA H6: max_frac_infectivity_per_viral_barcode_well
  AAGTTAAGAGAAAGTT H6: max_frac_infectivity_per_viral_barcode_well
  TATCCAAGGGACGGAC H6: max_frac_infectivity_per_viral_barcode_well
  ACTCTGGCTCGCTAAT H6: max_frac_infectivity_per_viral_barcode_well
  CGCAGCATTGGTCGCC H6: max_frac_infectivity_per_viral_barcode_well
  TAACGTGATTTCTCGA H6: max_frac_infectivity_per_viral_barcode_well
  GTGCGATTGTCCGGAA H6: max_frac_infectivity_per_viral_barcode_well
  ACAAAGTCTCGAGAAG H6: max_frac_infectivity_per_viral_barcode_well
  AAATTCACAATATCCA H6: max_frac_infectivity_per_viral_barcode_well
  CGTTTTTGGTTCGAGG H6: max_frac_infectivity_per_viral_barcode_well
  GTAAGCTTCATGGAGT H6: max_frac_infectivity_per_viral_barcode_well
  GTACCCAGTTCCTGCG H6: max_frac_infectivity_per_viral_barcode_well
  TCTTAGTCCTCGTATG H6: max_frac_infectivity_per_viral_barcode_well
  CGTACGTATGTCCCAG H6: max_frac_infectivity_per_viral_barcode_well
  TCTTGACATAGCGATG H6: max_frac_infectivity_per_viral_barcode_well
  AGATCCACCCTATAGT H6: max_frac_infectivity_per_viral_barcode_well
  AGGTTCAGACTCTTGC H6: max_frac_infectivity_per_viral_barcode_well
  GTGGTATCAAGCCGGG H6: max_frac_infectivity_per_viral_barcode_well
  TGCAGTGGTATACATA H6: max_frac_infectivity_per_viral_barcode_well
  AGTAAACATGCATTGG H6: max_frac_infectivity_per_viral_barcode_well
  AACTTCCGTCGCCTGA H6: max_frac_infectivity_per_viral_barcode_well
  TTGAAAAAATCATAAA H6: max_frac_infectivity_per_viral_barcode_well
  CCGGATAAATCAGAAC H6: max_frac_infectivity_per_viral_barcode_well
  AGATCCCAGGTCCTTT H6: max_frac_infectivity_per_viral_barcode_well
  GAAAGTCCCTATGATG H6: max_frac_infectivity_per_viral_barcode_well
  AGCTCCTGGGGTATCA H6: max_frac_infectivity_per_viral_barcode_well
  ACACGGGTTGGCTGTA H6: max_frac_infectivity_per_viral_barcode_well
  ATTTAAATTCGAGGAC H6: max_frac_infectivity_per_viral_barcode_well
  AGACCGCCAGTTTCGT H6: max_frac_infectivity_per_viral_barcode_well
  TCGAACGAAGTAGGAG H6: max_frac_infectivity_per_viral_barcode_well
  TCTTTACCACTGCATC H6: max_frac_infectivity_per_viral_barcode_well
  AATTCGTGAGTACTAG H6: max_frac_infectivity_per_viral_barcode_well
  CCAAGCTTGGCGCATC H6: max_frac_infectivity_per_viral_barcode_well
  AGAGCTAAAAAGAGGA H6: max_frac_infectivity_per_viral_barcode_well
  TGCGGTGGTCGATCCG H6: max_frac_infectivity_per_viral_barcode_well
  ACAGTCCACCATTGAG H6: max_frac_infectivity_per_viral_barcode_well
  GATCACGCAGAAAAAG H6: max_frac_infectivity_per_viral_barcode_well
  TGTCCGGATAAAGTAG H6: max_frac_infectivity_per_viral_barcode_well
  TTGGGCACTAAATTAA H6: max_frac_infectivity_per_viral_barcode_well
  GACAAAAGGGACATAT H6: max_frac_infectivity_per_viral_barcode_well
  CTGGAGGCCTGGCCCC H6: max_frac_infectivity_per_viral_barcode_well
  TCTAACTCTCGCGGCA H6: max_frac_infectivity_per_viral_barcode_well
  ATACACGAGGTTGTGA H6: max_frac_infectivity_per_viral_barcode_well
  ATCAGGATAATCGCGC H6: max_frac_infectivity_per_viral_barcode_well
  TGTTGAGCCAGTCTGA H6: max_frac_infectivity_per_viral_barcode_well
  TGCTATTCCGGCGCGG H6: max_frac_infectivity_per_viral_barcode_well
  AGGACTATAGTTGGCA H6: max_frac_infectivity_per_viral_barcode_well
  ACGTCCATTAAGATCA H6: max_frac_infectivity_per_viral_barcode_well
  TATTAAGAGAAGTGCG H6: max_frac_infectivity_per_viral_barcode_well
  ATAACTGAGGGCATTG H6: max_frac_infectivity_per_viral_barcode_well
  GAGGGGATACGTCACC H6: max_frac_infectivity_per_viral_barcode_well
  GCGAAGTTTCATAGCG H6: max_frac_infectivity_per_viral_barcode_well
  TAGCTGATAGTAACTC H6: max_frac_infectivity_per_viral_barcode_well
  TATATTAGTAACATAA H6: max_frac_infectivity_per_viral_barcode_well
  TTTATATCGAGATTCA H6: max_frac_infectivity_per_viral_barcode_well
  TCGCTTCAACTAAAAA H6: max_frac_infectivity_per_viral_barcode_well
  AAGGTCCCTATGTAAT H6: max_frac_infectivity_per_viral_barcode_well
  CTCAAATAATTGGCGC H6: max_frac_infectivity_per_viral_barcode_well
  ACAGTACGATCTACGC H6: max_frac_infectivity_per_viral_barcode_well
  CACGGCCGGCGAACTC H6: max_frac_infectivity_per_viral_barcode_well
  AAAGTAGCAGAGGATT H6: max_frac_infectivity_per_viral_barcode_well
  AATGCGAGCATGTCAA H6: max_frac_infectivity_per_viral_barcode_well
  CACGGGCTAATGTCTC H6: max_frac_infectivity_per_viral_barcode_well
  CGACTCCACGGACGCC H6: max_frac_infectivity_per_viral_barcode_well
  GCCGCTGCGGCGTGTG H6: max_frac_infectivity_per_viral_barcode_well
  CGAAACACGTCCCAGT H6: max_frac_infectivity_per_viral_barcode_well
  CCGCGCACGTTTAGAG H6: max_frac_infectivity_per_viral_barcode_well
  AGTTTTTATAACTTGC H6: max_frac_infectivity_per_viral_barcode_well
  ATCCGATTTAAAGGCA H6: max_frac_infectivity_per_viral_barcode_well
  ATGGTTTTACGTCCAT H6: max_frac_infectivity_per_viral_barcode_well
  GAAATCCCCAAATAAC H6: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG H6: max_frac_infectivity_per_viral_barcode_well
  TTAATGTAGCCGCTCC H6: max_frac_infectivity_per_viral_barcode_well
  AGTCCTATCCTCAAAT H6: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC H6: max_frac_infectivity_per_viral_barcode_well
  TACAAGAGAGGGGTCC H6: max_frac_infectivity_per_viral_barcode_well
  GATTCAGATGCCCACC H6: max_frac_infectivity_per_viral_barcode_well
  GAAATCCCCAAATAAC D7: max_frac_infectivity_per_viral_barcode_well
  ACAGTCCACCATTGAG F7: max_frac_infectivity_per_viral_barcode_well
  CGAAACACGTCCCAGT F7: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC F7: max_frac_infectivity_per_viral_barcode_well
  AGTTTTTATAACTTGC G7: max_frac_infectivity_per_viral_barcode_well
  GACAAAAGGGACATAT H7: max_frac_infectivity_per_viral_barcode_well
  GAGGGGATACGTCACC H7: max_frac_infectivity_per_viral_barcode_well
  TGTCCGGATAAAGTAG H7: max_frac_infectivity_per_viral_barcode_well
  GAGCTTGCTATGGATC H7: max_frac_infectivity_per_viral_barcode_well
  ATGGTTTTACGTCCAT H7: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG H7: max_frac_infectivity_per_viral_barcode_well
  AACCACCCCAGAGATG D8: max_frac_infectivity_per_viral_barcode_well
  ATGGTTTTACGTCCAT D8: max_frac_infectivity_per_viral_barcode_well
  CACGGGCTAATGTCTC D8: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG D8: max_frac_infectivity_per_viral_barcode_well
  AGTTTTTATAACTTGC D8: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG E8: max_frac_infectivity_per_viral_barcode_well
  TCTAACTCTCGCGGCA F8: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG F8: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC F8: max_frac_infectivity_per_viral_barcode_well
  GATTCAGATGCCCACC F8: max_frac_infectivity_per_viral_barcode_well
  TACATACCGACGCAGT H8: max_frac_infectivity_per_viral_barcode_well
  ACAAAGTCTCGAGAAG H8: max_frac_infectivity_per_viral_barcode_well
  AAAGTAGCAGAGGATT H8: max_frac_infectivity_per_viral_barcode_well
  CCTTTCTCAAAACATA H8: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC C9: max_frac_infectivity_per_viral_barcode_well
  AGTTTTTATAACTTGC E9: max_frac_infectivity_per_viral_barcode_well
  ATCAGGATAATCGCGC E9: max_frac_infectivity_per_viral_barcode_well
  CACCAATCTTCGAACT E9: max_frac_infectivity_per_viral_barcode_well
  GATTCAGATGCCCACC E9: max_frac_infectivity_per_viral_barcode_well
  AATTCGTGAGTACTAG F9: max_frac_infectivity_per_viral_barcode_well
  TTAATGTAGCCGCTCC F9: max_frac_infectivity_per_viral_barcode_well
  GATTCAGATGCCCACC F9: max_frac_infectivity_per_viral_barcode_well
  TGGAATCGTCACCGAT G9: max_frac_infectivity_per_viral_barcode_well
  GCGAAGTTTCATAGCG H9: max_frac_infectivity_per_viral_barcode_well
  TGTCCGGATAAAGTAG H9: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG H9: max_frac_infectivity_per_viral_barcode_well
  AGTTTTTATAACTTGC H9: max_frac_infectivity_per_viral_barcode_well
  TTAATGTAGCCGCTCC H9: max_frac_infectivity_per_viral_barcode_well
  CTATCTTAATCTACAG D10: max_frac_infectivity_per_viral_barcode_well
  AAGTATTGCTACACAT D10: max_frac_infectivity_per_viral_barcode_well
  GTAGAACTGCGGCCCC D10: max_frac_infectivity_per_viral_barcode_well
  ACTCTGGCTCGCTAAT D10: max_frac_infectivity_per_viral_barcode_well
  GCATGGAACTAACTCC D10: max_frac_infectivity_per_viral_barcode_well
  TAACGTGATTTCTCGA D10: max_frac_infectivity_per_viral_barcode_well
  TGCTATTCCGGCGCGG D10: max_frac_infectivity_per_viral_barcode_well
  ATTTAAATTCGAGGAC D10: max_frac_infectivity_per_viral_barcode_well
  ACAGTCCACCATTGAG D10: max_frac_infectivity_per_viral_barcode_well
  CAAAAGCAGCACGATA D10: max_frac_infectivity_per_viral_barcode_well
  TGCAGTGGTATACATA D10: max_frac_infectivity_per_viral_barcode_well
  ACCGATTCACGAATAA D10: max_frac_infectivity_per_viral_barcode_well
  TCTTTACCACTGCATC D10: max_frac_infectivity_per_viral_barcode_well
  ATCAGGATAATCGCGC D10: max_frac_infectivity_per_viral_barcode_well
  ACCCCCGGAGCTTGGC D10: max_frac_infectivity_per_viral_barcode_well
  GCGAAGTTTCATAGCG D10: max_frac_infectivity_per_viral_barcode_well
  TATTAAGAGAAGTGCG D10: max_frac_infectivity_per_viral_barcode_well
  GACCCCTTGTAAGATG D10: max_frac_infectivity_per_viral_barcode_well
  CGAAACACGTCCCAGT D10: max_frac_infectivity_per_viral_barcode_well
  TTTATATCGAGATTCA D10: max_frac_infectivity_per_viral_barcode_well
  GAGGGGATACGTCACC D10: max_frac_infectivity_per_viral_barcode_well
  TAGCTGATAGTAACTC D10: max_frac_infectivity_per_viral_barcode_well
  CCGCGCACGTTTAGAG D10: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC D10: max_frac_infectivity_per_viral_barcode_well
  CGACTCCACGGACGCC D10: max_frac_infectivity_per_viral_barcode_well
  AACCACCCCAGAGATG D10: max_frac_infectivity_per_viral_barcode_well
  GAGCTTGCTATGGATC D10: max_frac_infectivity_per_viral_barcode_well
  AGATCCACCCTATAGT D10: max_frac_infectivity_per_viral_barcode_well
  CACGGCCGGCGAACTC D10: max_frac_infectivity_per_viral_barcode_well
  CACGGGCTAATGTCTC D10: max_frac_infectivity_per_viral_barcode_well
  CTTACTGCGCGAGAGT D10: max_frac_infectivity_per_viral_barcode_well
  CACCAATCTTCGAACT D10: max_frac_infectivity_per_viral_barcode_well
  AGTTTTTATAACTTGC D10: max_frac_infectivity_per_viral_barcode_well
  GCCGGCGTTAGTGTCA D10: max_frac_infectivity_per_viral_barcode_well
  GTGCATCCTAGTGACG D10: max_frac_infectivity_per_viral_barcode_well
  TTAATGTAGCCGCTCC D10: max_frac_infectivity_per_viral_barcode_well
  TACAAGAGAGGGGTCC D10: max_frac_infectivity_per_viral_barcode_well
  TAACGTGATTTCTCGA E10: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC E10: max_frac_infectivity_per_viral_barcode_well
  TATTAAGAGAAGTGCG F10: max_frac_infectivity_per_viral_barcode_well
  AACCACCCCAGAGATG F10: max_frac_infectivity_per_viral_barcode_well
  TGTCCGGATAAAGTAG F10: max_frac_infectivity_per_viral_barcode_well
  AGTCCTATCCTCAAAT F10: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC F10: max_frac_infectivity_per_viral_barcode_well
  CAGATAGTGATGAACA H10: max_frac_infectivity_per_viral_barcode_well
  AACCACCCCAGAGATG H10: max_frac_infectivity_per_viral_barcode_well
  CCTTTCTCAAAACATA H10: max_frac_infectivity_per_viral_barcode_well
  GCCGGCGTTAGTGTCA H10: max_frac_infectivity_per_viral_barcode_well
  AGTTTTTATAACTTGC H10: max_frac_infectivity_per_viral_barcode_well
  TCGAGTTAATATGCGC H10: max_frac_infectivity_per_viral_barcode_well
  AGTCCTATCCTCAAAT D11: max_frac_infectivity_per_viral_barcode_well
  CGTACGTATGTCCCAG E11: max_frac_infectivity_per_viral_barcode_well
  GCCGGCGTTAGTGTCA E11: max_frac_infectivity_per_viral_barcode_well
  TTAATGTAGCCGCTCC E11: max_frac_infectivity_per_viral_barcode_well
  AGATCCACCCTATAGT F11: max_frac_infectivity_per_viral_barcode_well
  CGAAACACGTCCCAGT F11: max_frac_infectivity_per_viral_barcode_well
  AGTCCTATCCTCAAAT F11: max_frac_infectivity_per_viral_barcode_well
  TCTCAGCTCTTAGCCG H11: max_frac_infectivity_per_viral_barcode_well
barcode_serum_replicates:
  GACCCCTTGTAAGATG EPIHK_28: min_dilutions_per_barcode_serum_replicate
  TATTAAGAGAAGTGCG EPIHK_30: min_dilutions_per_barcode_serum_replicate
  AACCACCCCAGAGATG EPIHK_30: min_dilutions_per_barcode_serum_replicate
  GCCGGCGTTAGTGTCA EPIHK_30: min_dilutions_per_barcode_serum_replicate
  TAACGTGATTTCTCGA EPIHK_30: min_dilutions_per_barcode_serum_replicate
  TCGAGTTAATATGCGC EPIHK_30: min_dilutions_per_barcode_serum_replicate
  AGTTTTTATAACTTGC EPIHK_30: min_dilutions_per_barcode_serum_replicate
  ATTAGATTATAACGTA EPIHK_21: goodness_of_fit
  CACCAATCTTCGAACT EPIHK_22: goodness_of_fit
  GCCTTTGCGCGCAGTC EPIHK_22: goodness_of_fit
  TATTCCTAACTAGCGA EPIHK_23: goodness_of_fit
  AACCACCCCAGAGATG EPIHK_24: goodness_of_fit
  AGACCATCGCACCCAA EPIHK_24: goodness_of_fit
  CCGCATTAGCGGGAGG EPIHK_24: goodness_of_fit
  CGTACGTATGTCCCAG EPIHK_24: goodness_of_fit
  AAAGTAGCAGAGGATT EPIHK_25: goodness_of_fit
  CGTTCAGCGATAACGG EPIHK_25: goodness_of_fit
  TATCCAAGGGACGGAC EPIHK_25: goodness_of_fit
  AGACCATCGCACCCAA EPIHK_30: goodness_of_fit
  CAAAATCTACGGCGAC EPIHK_30: goodness_of_fit
  AGACCATCGCACCCAA EPIHK_31: goodness_of_fit
  CCTTTCTCAAAACATA EPIHK_31: goodness_of_fit
  CGTTAACGGCCTATCC EPIHK_31: goodness_of_fit
serum_replicates: {}
In [ ]: