######## 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\x95N\xe8\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/plate9_SCH_16_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_16_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_16_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_16_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_16_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_16_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_16_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_16_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_17_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_17_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_17_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_17_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_17_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_17_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_17_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_17_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_18_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_18_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_18_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_18_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_18_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_18_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_18_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_18_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_19_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_19_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_19_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_19_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_19_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_19_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_19_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_19_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_20_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_20_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_20_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_20_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_20_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_20_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_20_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_20_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_21_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_21_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_21_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_21_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_21_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_21_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_21_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_21_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_22_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_22_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_22_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_22_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_22_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_22_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_22_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_22_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_23_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_23_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_23_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_23_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_23_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_23_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_23_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_23_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_24_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_24_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_24_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_24_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_24_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_24_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_24_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_24_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_25_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_25_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_25_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_25_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_25_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_25_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_25_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_25_13619.csv\x94\x8c+results/barcode_counts/plate9_SCH_26_40.csv\x94\x8c+results/barcode_counts/plate9_SCH_26_92.csv\x94\x8c,results/barcode_counts/plate9_SCH_26_212.csv\x94\x8c,results/barcode_counts/plate9_SCH_26_487.csv\x94\x8c-results/barcode_counts/plate9_SCH_26_1119.csv\x94\x8c-results/barcode_counts/plate9_SCH_26_2575.csv\x94\x8c-results/barcode_counts/plate9_SCH_26_5921.csv\x94\x8c.results/barcode_counts/plate9_SCH_26_13619.csv\x94\x8c(results/barcode_counts/plate9_none-1.csv\x94\x8c(results/barcode_counts/plate9_none-2.csv\x94\x8c(results/barcode_counts/plate9_none-3.csv\x94\x8c(results/barcode_counts/plate9_none-4.csv\x94\x8c(results/barcode_counts/plate9_none-5.csv\x94\x8c(results/barcode_counts/plate9_none-6.csv\x94\x8c(results/barcode_counts/plate9_none-7.csv\x94\x8c(results/barcode_counts/plate9_none-8.csv\x94\x8c*results/barcode_fates/plate9_SCH_16_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_16_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_16_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_16_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_16_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_16_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_16_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_16_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_17_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_17_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_17_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_17_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_17_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_17_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_17_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_17_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_18_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_18_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_18_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_18_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_18_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_18_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_18_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_18_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_19_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_19_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_19_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_19_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_19_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_19_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_19_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_19_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_20_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_20_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_20_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_20_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_20_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_20_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_20_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_20_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_21_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_21_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_21_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_21_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_21_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_21_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_21_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_21_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_22_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_22_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_22_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_22_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_22_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_22_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_22_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_22_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_23_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_23_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_23_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_23_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_23_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_23_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_23_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_23_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_24_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_24_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_24_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_24_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_24_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_24_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_24_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_24_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_25_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_25_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_25_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_25_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_25_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_25_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_25_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_25_13619.csv\x94\x8c*results/barcode_fates/plate9_SCH_26_40.csv\x94\x8c*results/barcode_fates/plate9_SCH_26_92.csv\x94\x8c+results/barcode_fates/plate9_SCH_26_212.csv\x94\x8c+results/barcode_fates/plate9_SCH_26_487.csv\x94\x8c,results/barcode_fates/plate9_SCH_26_1119.csv\x94\x8c,results/barcode_fates/plate9_SCH_26_2575.csv\x94\x8c,results/barcode_fates/plate9_SCH_26_5921.csv\x94\x8c-results/barcode_fates/plate9_SCH_26_13619.csv\x94\x8c\'results/barcode_fates/plate9_none-1.csv\x94\x8c\'results/barcode_fates/plate9_none-2.csv\x94\x8c\'results/barcode_fates/plate9_none-3.csv\x94\x8c\'results/barcode_fates/plate9_none-4.csv\x94\x8c\'results/barcode_fates/plate9_none-5.csv\x94\x8c\'results/barcode_fates/plate9_none-6.csv\x94\x8c\'results/barcode_fates/plate9_none-7.csv\x94\x8c\'results/barcode_fates/plate9_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/plate9/qc_drops.yml\x94\x8c*results/plates/plate9/frac_infectivity.csv\x94\x8c#results/plates/plate9/curvefits.csv\x94\x8c&results/plates/plate9/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\x10plate9_SCH_16_40\x94\x8c\x10plate9_SCH_16_92\x94\x8c\x11plate9_SCH_16_212\x94\x8c\x11plate9_SCH_16_487\x94\x8c\x12plate9_SCH_16_1119\x94\x8c\x12plate9_SCH_16_2575\x94\x8c\x12plate9_SCH_16_5921\x94\x8c\x13plate9_SCH_16_13619\x94\x8c\x10plate9_SCH_17_40\x94\x8c\x10plate9_SCH_17_92\x94\x8c\x11plate9_SCH_17_212\x94\x8c\x11plate9_SCH_17_487\x94\x8c\x12plate9_SCH_17_1119\x94\x8c\x12plate9_SCH_17_2575\x94\x8c\x12plate9_SCH_17_5921\x94\x8c\x13plate9_SCH_17_13619\x94\x8c\x10plate9_SCH_18_40\x94\x8c\x10plate9_SCH_18_92\x94\x8c\x11plate9_SCH_18_212\x94\x8c\x11plate9_SCH_18_487\x94\x8c\x12plate9_SCH_18_1119\x94\x8c\x12plate9_SCH_18_2575\x94\x8c\x12plate9_SCH_18_5921\x94\x8c\x13plate9_SCH_18_13619\x94\x8c\x10plate9_SCH_19_40\x94\x8c\x10plate9_SCH_19_92\x94\x8c\x11plate9_SCH_19_212\x94\x8c\x11plate9_SCH_19_487\x94\x8c\x12plate9_SCH_19_1119\x94\x8c\x12plate9_SCH_19_2575\x94\x8c\x12plate9_SCH_19_5921\x94\x8c\x13plate9_SCH_19_13619\x94\x8c\x10plate9_SCH_20_40\x94\x8c\x10plate9_SCH_20_92\x94\x8c\x11plate9_SCH_20_212\x94\x8c\x11plate9_SCH_20_487\x94\x8c\x12plate9_SCH_20_1119\x94\x8c\x12plate9_SCH_20_2575\x94\x8c\x12plate9_SCH_20_5921\x94\x8c\x13plate9_SCH_20_13619\x94\x8c\x10plate9_SCH_21_40\x94\x8c\x10plate9_SCH_21_92\x94\x8c\x11plate9_SCH_21_212\x94\x8c\x11plate9_SCH_21_487\x94\x8c\x12plate9_SCH_21_1119\x94\x8c\x12plate9_SCH_21_2575\x94\x8c\x12plate9_SCH_21_5921\x94\x8c\x13plate9_SCH_21_13619\x94\x8c\x10plate9_SCH_22_40\x94\x8c\x10plate9_SCH_22_92\x94\x8c\x11plate9_SCH_22_212\x94\x8c\x11plate9_SCH_22_487\x94\x8c\x12plate9_SCH_22_1119\x94\x8c\x12plate9_SCH_22_2575\x94\x8c\x12plate9_SCH_22_5921\x94\x8c\x13plate9_SCH_22_13619\x94\x8c\x10plate9_SCH_23_40\x94\x8c\x10plate9_SCH_23_92\x94\x8c\x11plate9_SCH_23_212\x94\x8c\x11plate9_SCH_23_487\x94\x8c\x12plate9_SCH_23_1119\x94\x8c\x12plate9_SCH_23_2575\x94\x8c\x12plate9_SCH_23_5921\x94\x8c\x13plate9_SCH_23_13619\x94\x8c\x10plate9_SCH_24_40\x94\x8c\x10plate9_SCH_24_92\x94\x8c\x11plate9_SCH_24_212\x94\x8c\x11plate9_SCH_24_487\x94\x8c\x12plate9_SCH_24_1119\x94\x8c\x12plate9_SCH_24_2575\x94\x8c\x12plate9_SCH_24_5921\x94\x8c\x13plate9_SCH_24_13619\x94\x8c\x10plate9_SCH_25_40\x94\x8c\x10plate9_SCH_25_92\x94\x8c\x11plate9_SCH_25_212\x94\x8c\x11plate9_SCH_25_487\x94\x8c\x12plate9_SCH_25_1119\x94\x8c\x12plate9_SCH_25_2575\x94\x8c\x12plate9_SCH_25_5921\x94\x8c\x13plate9_SCH_25_13619\x94\x8c\x10plate9_SCH_26_40\x94\x8c\x10plate9_SCH_26_92\x94\x8c\x11plate9_SCH_26_212\x94\x8c\x11plate9_SCH_26_487\x94\x8c\x12plate9_SCH_26_1119\x94\x8c\x12plate9_SCH_26_2575\x94\x8c\x12plate9_SCH_26_5921\x94\x8c\x13plate9_SCH_26_13619\x94\x8c\rplate9_none-1\x94\x8c\rplate9_none-2\x94\x8c\rplate9_none-3\x94\x8c\rplate9_none-4\x94\x8c\rplate9_none-5\x94\x8c\rplate9_none-6\x94\x8c\rplate9_none-7\x94\x8c\rplate9_none-8\x94e}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94\x8c\n2025-08-13\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(\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\x06GTCTAA\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\x06SCH_16\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\x06SCH_17\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\x06SCH_18\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\x06SCH_19\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\x06SCH_20\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\x06SCH_21\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\x06SCH_22\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\x06SCH_23\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\x06SCH_24\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\x06SCH_25\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\x06SCH_26\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/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_1_S1_R1_001.fastq.gz\x94K\x01\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_2_S2_R1_001.fastq.gz\x94K\x02\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_3_S3_R1_001.fastq.gz\x94K\x03\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_4_S4_R1_001.fastq.gz\x94K\x04\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_5_S5_R1_001.fastq.gz\x94K\x05\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_6_S6_R1_001.fastq.gz\x94K\x06\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_7_S7_R1_001.fastq.gz\x94K\x07\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_8_S8_R1_001.fastq.gz\x94K\x08\x8cs/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_9_S9_R1_001.fastq.gz\x94K\t\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_10_S10_R1_001.fastq.gz\x94K\n\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_11_S11_R1_001.fastq.gz\x94K\x0b\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_12_S12_R1_001.fastq.gz\x94K\x0c\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_13_S13_R1_001.fastq.gz\x94K\r\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_14_S14_R1_001.fastq.gz\x94K\x0e\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_15_S15_R1_001.fastq.gz\x94K\x0f\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_16_S16_R1_001.fastq.gz\x94K\x10\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_17_S17_R1_001.fastq.gz\x94K\x11\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_18_S18_R1_001.fastq.gz\x94K\x12\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_19_S19_R1_001.fastq.gz\x94K\x13\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_20_S20_R1_001.fastq.gz\x94K\x14\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_21_S21_R1_001.fastq.gz\x94K\x15\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_22_S22_R1_001.fastq.gz\x94K\x16\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_23_S23_R1_001.fastq.gz\x94K\x17\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_24_S24_R1_001.fastq.gz\x94K\x18\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_25_S25_R1_001.fastq.gz\x94K\x19\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_26_S26_R1_001.fastq.gz\x94K\x1a\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_27_S27_R1_001.fastq.gz\x94K\x1b\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_28_S28_R1_001.fastq.gz\x94K\x1c\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_29_S29_R1_001.fastq.gz\x94K\x1d\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_30_S30_R1_001.fastq.gz\x94K\x1e\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_31_S31_R1_001.fastq.gz\x94K\x1f\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_32_S32_R1_001.fastq.gz\x94K \x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_33_S33_R1_001.fastq.gz\x94K!\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_34_S34_R1_001.fastq.gz\x94K"\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_35_S35_R1_001.fastq.gz\x94K#\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_36_S36_R1_001.fastq.gz\x94K$\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_37_S37_R1_001.fastq.gz\x94K%\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_38_S38_R1_001.fastq.gz\x94K&\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_39_S39_R1_001.fastq.gz\x94K\'\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_40_S40_R1_001.fastq.gz\x94K(\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_41_S41_R1_001.fastq.gz\x94K)\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_42_S42_R1_001.fastq.gz\x94K*\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_43_S43_R1_001.fastq.gz\x94K+\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_44_S44_R1_001.fastq.gz\x94K,\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_45_S45_R1_001.fastq.gz\x94K-\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_46_S46_R1_001.fastq.gz\x94K.\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_47_S47_R1_001.fastq.gz\x94K/\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_48_S48_R1_001.fastq.gz\x94K0\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_49_S49_R1_001.fastq.gz\x94K1\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_50_S50_R1_001.fastq.gz\x94K2\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_51_S51_R1_001.fastq.gz\x94K3\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_52_S52_R1_001.fastq.gz\x94K4\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_53_S53_R1_001.fastq.gz\x94K5\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_54_S54_R1_001.fastq.gz\x94K6\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_55_S55_R1_001.fastq.gz\x94K7\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_56_S56_R1_001.fastq.gz\x94K8\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_57_S57_R1_001.fastq.gz\x94K9\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_58_S58_R1_001.fastq.gz\x94K:\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_59_S59_R1_001.fastq.gz\x94K;\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_60_S60_R1_001.fastq.gz\x94K<\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_61_S61_R1_001.fastq.gz\x94K=\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_62_S62_R1_001.fastq.gz\x94K>\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_63_S63_R1_001.fastq.gz\x94K?\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_64_S64_R1_001.fastq.gz\x94K@\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_65_S65_R1_001.fastq.gz\x94KA\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_66_S66_R1_001.fastq.gz\x94KB\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_67_S67_R1_001.fastq.gz\x94KC\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_68_S68_R1_001.fastq.gz\x94KD\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_69_S69_R1_001.fastq.gz\x94KE\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_70_S70_R1_001.fastq.gz\x94KF\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_71_S71_R1_001.fastq.gz\x94KG\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_72_S72_R1_001.fastq.gz\x94KH\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_73_S73_R1_001.fastq.gz\x94KI\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_74_S74_R1_001.fastq.gz\x94KJ\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_75_S75_R1_001.fastq.gz\x94KK\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_76_S76_R1_001.fastq.gz\x94KL\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_77_S77_R1_001.fastq.gz\x94KM\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_78_S78_R1_001.fastq.gz\x94KN\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_79_S79_R1_001.fastq.gz\x94KO\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_80_S80_R1_001.fastq.gz\x94KP\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_81_S81_R1_001.fastq.gz\x94KQ\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_82_S82_R1_001.fastq.gz\x94KR\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_83_S83_R1_001.fastq.gz\x94KS\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_84_S84_R1_001.fastq.gz\x94KT\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_85_S85_R1_001.fastq.gz\x94KU\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_86_S86_R1_001.fastq.gz\x94KV\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_87_S87_R1_001.fastq.gz\x94KW\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_88_S88_R1_001.fastq.gz\x94KX\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_89_S89_R1_001.fastq.gz\x94KY\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_90_S90_R1_001.fastq.gz\x94KZ\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_91_S91_R1_001.fastq.gz\x94K[\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_92_S92_R1_001.fastq.gz\x94K\\\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_93_S93_R1_001.fastq.gz\x94K]\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_94_S94_R1_001.fastq.gz\x94K^\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_95_S95_R1_001.fastq.gz\x94K_\x8cu/shared/ngs/illumina/bloom_lab/250819_VH00319_577_AACVTTYHV/Unaligned/Project_bloom_lab/PlateA_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\tSCH_16_40\x94K\x01\x8c\tSCH_16_92\x94K\x02\x8c\nSCH_16_212\x94K\x03\x8c\nSCH_16_487\x94K\x04\x8c\x0bSCH_16_1119\x94K\x05\x8c\x0bSCH_16_2575\x94K\x06\x8c\x0bSCH_16_5921\x94K\x07\x8c\x0cSCH_16_13619\x94K\x08\x8c\tSCH_17_40\x94K\t\x8c\tSCH_17_92\x94K\n\x8c\nSCH_17_212\x94K\x0b\x8c\nSCH_17_487\x94K\x0c\x8c\x0bSCH_17_1119\x94K\r\x8c\x0bSCH_17_2575\x94K\x0e\x8c\x0bSCH_17_5921\x94K\x0f\x8c\x0cSCH_17_13619\x94K\x10\x8c\tSCH_18_40\x94K\x11\x8c\tSCH_18_92\x94K\x12\x8c\nSCH_18_212\x94K\x13\x8c\nSCH_18_487\x94K\x14\x8c\x0bSCH_18_1119\x94K\x15\x8c\x0bSCH_18_2575\x94K\x16\x8c\x0bSCH_18_5921\x94K\x17\x8c\x0cSCH_18_13619\x94K\x18\x8c\tSCH_19_40\x94K\x19\x8c\tSCH_19_92\x94K\x1a\x8c\nSCH_19_212\x94K\x1b\x8c\nSCH_19_487\x94K\x1c\x8c\x0bSCH_19_1119\x94K\x1d\x8c\x0bSCH_19_2575\x94K\x1e\x8c\x0bSCH_19_5921\x94K\x1f\x8c\x0cSCH_19_13619\x94K \x8c\tSCH_20_40\x94K!\x8c\tSCH_20_92\x94K"\x8c\nSCH_20_212\x94K#\x8c\nSCH_20_487\x94K$\x8c\x0bSCH_20_1119\x94K%\x8c\x0bSCH_20_2575\x94K&\x8c\x0bSCH_20_5921\x94K\'\x8c\x0cSCH_20_13619\x94K(\x8c\tSCH_21_40\x94K)\x8c\tSCH_21_92\x94K*\x8c\nSCH_21_212\x94K+\x8c\nSCH_21_487\x94K,\x8c\x0bSCH_21_1119\x94K-\x8c\x0bSCH_21_2575\x94K.\x8c\x0bSCH_21_5921\x94K/\x8c\x0cSCH_21_13619\x94K0\x8c\tSCH_22_40\x94K1\x8c\tSCH_22_92\x94K2\x8c\nSCH_22_212\x94K3\x8c\nSCH_22_487\x94K4\x8c\x0bSCH_22_1119\x94K5\x8c\x0bSCH_22_2575\x94K6\x8c\x0bSCH_22_5921\x94K7\x8c\x0cSCH_22_13619\x94K8\x8c\tSCH_23_40\x94K9\x8c\tSCH_23_92\x94K:\x8c\nSCH_23_212\x94K;\x8c\nSCH_23_487\x94K<\x8c\x0bSCH_23_1119\x94K=\x8c\x0bSCH_23_2575\x94K>\x8c\x0bSCH_23_5921\x94K?\x8c\x0cSCH_23_13619\x94K@\x8c\tSCH_24_40\x94KA\x8c\tSCH_24_92\x94KB\x8c\nSCH_24_212\x94KC\x8c\nSCH_24_487\x94KD\x8c\x0bSCH_24_1119\x94KE\x8c\x0bSCH_24_2575\x94KF\x8c\x0bSCH_24_5921\x94KG\x8c\x0cSCH_24_13619\x94KH\x8c\tSCH_25_40\x94KI\x8c\tSCH_25_92\x94KJ\x8c\nSCH_25_212\x94KK\x8c\nSCH_25_487\x94KL\x8c\x0bSCH_25_1119\x94KM\x8c\x0bSCH_25_2575\x94KN\x8c\x0bSCH_25_5921\x94KO\x8c\x0cSCH_25_13619\x94KP\x8c\tSCH_26_40\x94KQ\x8c\tSCH_26_92\x94KR\x8c\nSCH_26_212\x94KS\x8c\nSCH_26_487\x94KT\x8c\x0bSCH_26_1119\x94KU\x8c\x0bSCH_26_2575\x94KV\x8c\x0bSCH_26_5921\x94KW\x8c\x0cSCH_26_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\x06plate9\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\x08plate9-1\x94KY\x8c\x08plate9-2\x94KZ\x8c\x08plate9-3\x94K[\x8c\x08plate9-4\x94K\\\x8c\x08plate9-5\x94K]\x8c\x08plate9-6\x94K^\x8c\x08plate9-7\x94K_\x8c\x08plate9-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\x06plate9\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/plate9/process_plate9.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\x01uuj\xa7\x04\x00\x00}\x94(j)\x03\x00\x00j*\x03\x00\x00j+\x03\x00\x00jH\x05\x00\x00C\x04\x07\xe9\x08\r\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\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\x01uu\x8c\x07plate14\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_plate14.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\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:
import pickle
import sys
import warnings
import altair as alt
import matplotlib.pyplot as plt
import matplotlib.style
import neutcurve
from neutcurve.colorschemes import CBPALETTE, CBMARKERS
import numpy
import pandas as pd
import ruamel.yaml as yaml
_ = alt.data_transformers.disable_max_rows()
# avoid clutter w RuntimeWarning during curve fitting
warnings.filterwarnings("ignore", category=RuntimeWarning)
# faster plotting of neut curves
matplotlib.style.use("fast")
Get the variables passed by snakemake
:
count_csvs = snakemake.input.count_csvs
fate_csvs = snakemake.input.fate_csvs
notebook_funcs = snakemake.input.notebook_funcs
qc_drops_yaml = snakemake.output.qc_drops
frac_infectivity_csv = snakemake.output.frac_infectivity_csv
fits_csv = snakemake.output.fits_csv
fits_pickle = snakemake.output.fits_pickle
viral_barcodes = snakemake.params.viral_barcodes
neut_standard_barcodes = snakemake.params.neut_standard_barcodes
samples = snakemake.params.samples
plate = snakemake.wildcards.plate
plate_params = snakemake.params.plate_params
curve_display_method = snakemake.params.curve_display_method
# get thresholds turning lists into tuples as needed
manual_drops = {
filter_type: [tuple(w) if isinstance(w, list) else w for w in filter_drops]
for (filter_type, filter_drops) in plate_params["manual_drops"].items()
}
group = plate_params["group"]
qc_thresholds = plate_params["qc_thresholds"]
curvefit_params = plate_params["curvefit_params"]
curvefit_qc = plate_params["curvefit_qc"]
curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"] = [
tuple(w) for w in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
]
print(f"Processing {plate=}")
samples_df = pd.DataFrame(plate_params["samples"])
print(f"\nPlate has {len(samples)} samples (wells)")
assert all(
(len(samples_df) == samples_df[c].nunique())
for c in ["well", "sample", "sample_noplate"]
)
assert len(samples_df) == len(
samples_df.groupby(["serum_replicate", "dilution_factor"])
)
assert len(samples) == len(count_csvs) == len(fate_csvs) == len(samples_df)
for d, key, title in [
(manual_drops, "manual_drops", "Data manually specified to drop:"),
(qc_thresholds, "qc_thresholds", "QC thresholds applied to data:"),
(curvefit_params, "curvefit_params", "Curve-fitting parameters:"),
(curvefit_qc, "curvefit_qc", "Curve-fitting QC:"),
]:
print(f"\n{title}")
yaml.YAML(typ="rt").dump({key: d}, stream=sys.stdout)
Processing plate='plate9' 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:
print(f"Loading {notebook_funcs=}")
%run {notebook_funcs}
Loading notebook_funcs='/home/jbloom/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpfro_n8p6/file/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025/seqneut-pipeline/notebook_funcs.py'
Set up dictionary to keep track of wells, barcodes, well-barcodes, and serum-replicates that are dropped:
qc_drops = {
"wells": {},
"barcodes": {},
"barcode_wells": {},
"barcode_serum_replicates": {},
"serum_replicates": {},
}
assert set(manual_drops).issubset(
qc_drops
), f"{manual_drops.keys()=}, {qc_drops.keys()}"
Statistics on barcode-parsing for each sample¶
Make interactive chart of the "fates" of the sequencing reads parsed for each sample on the plate.
If most sequencing reads are not "valid barcodes", this could potentially indicate some problem in the sequencing or barcode set you are parsing.
Potential fates are:
- valid barcode: barcode that matches a known virus or neutralization standard, we hope most reads are this.
- invalid barcode: a barcode with proper flanking sequences, but does not match a known virus or neutralization standard. If you have a lot of reads of this type, it is probably a good idea to look at the invalid barcode CSVs (in the
./results/barcode_invalid/
subdirectory created by the pipeline) to see what these invalid barcodes are. - unparseable barcode: could not parse a barcode from this read as there was not a sequence of the correct length with the appropriate flanking sequence.
- invalid outer flank: if using an outer upstream or downstream region (
upstream2
ordownstream2
for the illuminabarcodeparser), reads that are otherwise valid except for this outer flank. Typically you would be usingupstream2
if you have a plate index embedded in your primer, and reads with this classification correspond to a different index than the one for this plate. - low quality barcode: low-quality or
N
nucleotides in barcode, could indicate problem with sequencing. - failed chastity filter: reads that failed the Illumina chastity filter, if these are reported in the FASTQ (they may not be).
Also, if the number of reads per sample is very uneven, that could indicate that you did not do a good job of balancing the different samples in the Illumina sequencing.
fates = (
pd.concat([pd.read_csv(f).assign(sample=s) for f, s in zip(fate_csvs, samples)])
.merge(samples_df, validate="many_to_one", on="sample")
.assign(
fate_counts=lambda x: x.groupby("fate")["count"].transform("sum"),
sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")",
)
.query("fate_counts > 0")[ # only keep fates with at least one count
["fate", "count", "well", "serum_replicate", "sample_well", "dilution_factor"]
]
)
assert len(fates) == len(fates.drop_duplicates())
serum_replicates = sorted(fates["serum_replicate"].unique())
sample_wells = list(
fates.sort_values(["serum_replicate", "dilution_factor"])["sample_well"]
)
serum_selection = alt.selection_point(
fields=["serum_replicate"],
bind=alt.binding_select(
options=[None] + serum_replicates,
labels=["all"] + serum_replicates,
name="serum",
),
)
fates_chart = (
alt.Chart(fates)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X("count", scale=alt.Scale(nice=False, padding=3)),
alt.Y(
"sample_well",
title=None,
sort=sample_wells,
),
alt.Color("fate", sort=sorted(fates["fate"].unique(), reverse=True)),
alt.Order("fate", sort="descending"),
tooltip=fates.columns.tolist(),
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=200,
title=f"Barcode parsing for {plate}",
)
.configure_axis(grid=False)
)
fates_chart
Read barcode counts and apply manually specified drops¶
Read the counts per barcode:
# get barcode counts
counts = (
pd.concat([pd.read_csv(c).assign(sample=s) for c, s in zip(count_csvs, samples)])
.merge(samples_df, validate="many_to_one", on="sample")
.drop(columns=["replicate", "plate", "fastq"])
.assign(sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")")
)
# classify barcodes as viral or neut standard
barcode_class = pd.concat(
[
pd.DataFrame(viral_barcodes).assign(neut_standard=False),
pd.DataFrame(neut_standard_barcodes).assign(neut_standard=True, strain=pd.NA),
],
ignore_index=True,
)
# merge counts and classification of barcodes
assert set(counts["barcode"]) == set(barcode_class["barcode"])
counts = counts.merge(barcode_class, on="barcode", validate="many_to_one")
assert set(sample_wells) == set(counts["sample_well"])
assert set(serum_replicates) == set(counts["serum_replicate"])
Apply any manually specified data drops:
for filter_type, filter_drops in manual_drops.items():
print(f"\nDropping {len(filter_drops)} {filter_type} specified in manual_drops")
assert filter_type in qc_drops
qc_drops[filter_type].update(
{w: "manual_drop" for w in filter_drops if not isinstance(w, list)}
)
if filter_type == "barcode_wells":
counts = counts[
~counts.assign(
barcode_well=lambda x: x.apply(
lambda r: (r["barcode"], r["well"]), axis=1
)
)["barcode_well"].isin(qc_drops[filter_type])
]
elif filter_type == "barcode_serum_replicates":
counts = counts[
~counts.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops[filter_type])
]
elif filter_type == "wells":
counts = counts[~counts["well"].isin(qc_drops[filter_type])]
elif filter_type == "barcodes":
counts = counts[~counts["barcode"].isin(qc_drops[filter_type])]
elif filter_type == "serum_replicates":
counts = counts[~counts["serum_replicate"].isin(qc_drops[filter_type])]
elif filter_type == "barcode_serum_replicates":
counts = counts[~counts["barcode_serum_replicate"].isin(qc_drops[filter_type])]
else:
assert filter_type in set(counts.columns)
counts = counts[~counts[filter_type].isin(qc_drops[filter_type])]
Average counts per barcode in each well¶
Plot average counts per barcode. If a sample has inadequate barcode counts, it may not have good enough statistics for accurate analysis, and a QC-threshold is applied:
avg_barcode_counts = (
counts.groupby(
["well", "serum_replicate", "sample_well"],
dropna=False,
as_index=False,
)
.aggregate(avg_count=pd.NamedAgg("count", "mean"))
.assign(
fails_qc=lambda x: (
x["avg_count"] < qc_thresholds["avg_barcode_counts_per_well"]
),
)
)
avg_barcode_counts_chart = (
alt.Chart(avg_barcode_counts)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"avg_count",
title="average barcode counts per well",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['avg_barcode_counts_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
alt.Tooltip(c, format=".3g") if avg_barcode_counts[c].dtype == float else c
for c in avg_barcode_counts.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Average barcode counts per well for {plate}",
)
.configure_axis(grid=False)
)
display(avg_barcode_counts_chart)
# drop wells failing QC
avg_barcode_counts_per_well_drops = list(avg_barcode_counts.query("fails_qc")["well"])
print(
f"\nDropping {len(avg_barcode_counts_per_well_drops)} wells for failing "
f"{qc_thresholds['avg_barcode_counts_per_well']=}: "
+ str(avg_barcode_counts_per_well_drops)
)
qc_drops["wells"].update(
{w: "avg_barcode_counts_per_well" for w in avg_barcode_counts_per_well_drops}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 1 wells for failing qc_thresholds['avg_barcode_counts_per_well']=500: ['F2']
Fraction of counts from neutralization standard¶
Determine the fraction of counts from the neutralization standard in each sample, and make sure this fraction passess the QC threshold.
neut_standard_fracs = (
counts.assign(
neut_standard_count=lambda x: x["count"] * x["neut_standard"].astype(int)
)
.groupby(
["well", "serum_replicate", "sample_well"],
dropna=False,
as_index=False,
)
.aggregate(
total_count=pd.NamedAgg("count", "sum"),
neut_standard_count=pd.NamedAgg("neut_standard_count", "sum"),
)
.assign(
neut_standard_frac=lambda x: x["neut_standard_count"] / x["total_count"],
fails_qc=lambda x: (
x["neut_standard_frac"] < qc_thresholds["min_neut_standard_frac_per_well"]
),
)
)
neut_standard_fracs_chart = (
alt.Chart(neut_standard_fracs)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"neut_standard_frac",
title="frac counts from neutralization standard per well",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['min_neut_standard_frac_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
alt.Tooltip(c, format=".3g") if neut_standard_fracs[c].dtype == float else c
for c in neut_standard_fracs.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Neutralization-standard fracs per well for {plate}",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(neut_standard_fracs_chart)
# drop wells failing QC
min_neut_standard_frac_per_well_drops = list(
neut_standard_fracs.query("fails_qc")["well"]
)
print(
f"\nDropping {len(min_neut_standard_frac_per_well_drops)} wells for failing "
f"{qc_thresholds['min_neut_standard_frac_per_well']=}: "
+ str(min_neut_standard_frac_per_well_drops)
)
qc_drops["wells"].update(
{
w: "min_neut_standard_frac_per_well"
for w in min_neut_standard_frac_per_well_drops
}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_frac_per_well']=0.005: []
Consistency and minimum fractions for barcodes¶
We examine the fraction of counts attributable to each barcode. We do this splitting the data two ways:
Looking at all viral (but not neut-standard) barcodes only for the no-serum samples (wells).
Looking at just the neut-standard barcodes for all samples (wells).
The reasons is that if the experiment is set up perfectly, these fractions should be the same across all samples for each barcode. (We do not expect viral barcodes to have consistent fractions across no-serum samples as they will be neutralized differently depending on strain).
We plot these fractions in interactive plots (you can mouseover points and zoom) so you can identify barcodes that fail the expected consistency QC thresholds.
We also make sure the barcodes meet specified QC minimum thresholds for all samples, and flag any that do not.
barcode_selection = alt.selection_point(fields=["barcode"], on="mouseover", empty=False)
# look at all samples for neut standard barcodes, or no-serum samples for all barcodes
for is_neut_standard, df in counts.groupby("neut_standard"):
if is_neut_standard:
print(
f"\n\n{'=' * 89}\nAnalyzing neut-standard barcodes from all samples (wells)"
)
qc_name = "per_neut_standard_barcode_filters"
else:
print(f"\n\n{'=' * 89}\nAnalyzing all barcodes from no-serum samples (wells)")
qc_name = "no_serum_per_viral_barcode_filters"
df = df.query("serum == 'none'")
df = df.assign(
sample_counts=lambda x: x.groupby("sample")["count"].transform("sum"),
count_frac=lambda x: x["count"] / x["sample_counts"],
median_count_frac=lambda x: x.groupby("barcode")["count_frac"].transform(
"median"
),
fold_change_from_median=lambda x: numpy.where(
x["count_frac"] > x["median_count_frac"],
x["count_frac"] / x["median_count_frac"],
x["median_count_frac"] / x["count_frac"],
),
)[
[
"barcode",
"count",
"sample_well",
"count_frac",
"fold_change_from_median",
]
+ ([] if is_neut_standard else ["strain"])
]
# barcode fails QC if fails in sufficient wells
qc = qc_thresholds[qc_name]
print(f"Apply QC {qc_name}: {qc}\n")
fails_qc = (
df.assign(
fails_qc=lambda x: ~(
(x["count_frac"] >= qc["min_frac"])
& (x["fold_change_from_median"] <= qc["max_fold_change"])
),
)
.groupby("barcode", as_index=False)
.aggregate(n_wells_fail_qc=pd.NamedAgg("fails_qc", "sum"))
.assign(fails_qc=lambda x: x["n_wells_fail_qc"] >= qc["max_wells"])[
["barcode", "fails_qc"]
]
)
df = df.merge(fails_qc, on="barcode", validate="many_to_one")
# make chart
evenness_chart = (
alt.Chart(df)
.add_params(barcode_selection)
.encode(
alt.X(
"count_frac",
title=(
"barcode's fraction of neut standard counts"
if is_neut_standard
else "barcode's fraction of non-neut standard counts"
),
scale=alt.Scale(nice=False, padding=5),
),
alt.Y("sample_well", sort=sample_wells),
alt.Fill(
"fails_qc",
title=f"fails {qc_name}",
legend=alt.Legend(titleLimit=500),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".2g") if df[c].dtype == float else c
for c in df.columns
],
)
.mark_circle(fillOpacity=0.45, stroke="black", strokeOpacity=1)
.properties(
height=alt.Step(10),
width=300,
title=alt.TitleParams(
(
f"{plate} all samples, neut-standard barcodes"
if is_neut_standard
else f"{plate} no-serum samples, all barcodes"
),
subtitle="x-axis is zoomable (use mouse scroll/pan)",
),
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.interactive()
)
display(evenness_chart)
# drop barcodes failing QC
barcode_drops = list(fails_qc.query("fails_qc")["barcode"])
print(
f"\nDropping {len(barcode_drops)} barcodes for failing {qc=}: {barcode_drops}"
)
qc_drops["barcodes"].update(
{bc: "min_neut_standard_frac_per_well" for bc in barcode_drops}
)
counts = counts[~counts["barcode"].isin(qc_drops["barcodes"])]
========================================================================================= Analyzing all barcodes from no-serum samples (wells) Apply QC no_serum_per_viral_barcode_filters: {'min_frac': 0.0001, 'max_fold_change': 4, 'max_wells': 2}
Dropping 0 barcodes for failing qc={'min_frac': 0.0001, 'max_fold_change': 4, 'max_wells': 2}: []
========================================================================================= Analyzing neut-standard barcodes from all samples (wells) Apply QC per_neut_standard_barcode_filters: {'min_frac': 0.005, 'max_fold_change': 4, 'max_wells': 2}
Dropping 0 barcodes for failing qc={'min_frac': 0.005, 'max_fold_change': 4, 'max_wells': 2}: []
Compute fraction infectivity¶
The fraction infectivity for viral barcode $v_b$ in sample $s$ is computed as: $$ F_{v_b,s} = \frac{c_{v_b,s} / \left(\sum_{n_b} c_{n_b,s}\right)}{{\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]} $$ where
- $c_{v_b,s}$ is the counts of viral barcode $v_b$ in sample $s$.
- $\sum_{n_b} c_{n_b,s}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for sample $s$.
- $c_{v_b,s_0}$ is the counts of viral barcode $v_b$ in no-serum sample $s_0$.
- $\sum_{n_b} c_{n_b,s_0}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for no-serum sample $s_0$.
- ${\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]$ is the median taken across all no-serum samples of the counts of viral barcode $v_b$ versus the total counts for all neutralization standard barcodes.
First, compute the total neutralization-standard counts for each sample (well). Plot these, and drop any wells that do not meet the QC threshold.
neut_standard_counts = (
counts.query("neut_standard")
.groupby(
["well", "serum_replicate", "sample_well", "dilution_factor"],
dropna=False,
as_index=False,
)
.aggregate(neut_standard_count=pd.NamedAgg("count", "sum"))
.assign(
fails_qc=lambda x: (
x["neut_standard_count"] < qc_thresholds["min_neut_standard_count_per_well"]
),
)
)
neut_standard_counts_chart = (
alt.Chart(neut_standard_counts)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"neut_standard_count",
title="counts from neutralization standard",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['min_neut_standard_count_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if neut_standard_counts[c].dtype == float
else c
)
for c in neut_standard_counts.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Neutralization-standard counts for {plate}",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(neut_standard_counts_chart)
# drop wells failing QC
min_neut_standard_count_per_well_drops = list(
neut_standard_counts.query("fails_qc")["well"]
)
print(
f"\nDropping {len(min_neut_standard_count_per_well_drops)} wells for failing "
f"{qc_thresholds['min_neut_standard_count_per_well']=}: "
+ str(min_neut_standard_count_per_well_drops)
)
qc_drops["wells"].update(
{
w: "min_neut_standard_count_per_well"
for w in min_neut_standard_count_per_well_drops
}
)
neut_standard_counts = neut_standard_counts[
~neut_standard_counts["well"].isin(qc_drops["wells"])
]
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_count_per_well']=1000: []
Compute and plot the no-serum sample viral barcode counts and check if they pass the QC filters.
no_serum_counts = (
counts.query("serum == 'none'")
.query("not neut_standard")
.merge(neut_standard_counts, validate="many_to_one")[
["barcode", "strain", "well", "sample_well", "count", "neut_standard_count"]
]
.assign(
fails_qc=lambda x: (
x["count"] <= qc_thresholds["min_no_serum_count_per_viral_barcode_well"]
),
)
)
strains = sorted(no_serum_counts["strain"].unique())
strain_selection_dropdown = alt.selection_point(
fields=["strain"],
bind=alt.binding_select(
options=[None] + strains,
labels=["all"] + strains,
name="virus strain",
),
)
# make chart
no_serum_counts_plot_df = no_serum_counts.drop(columns=["well", "neut_standard_count"])
no_serum_counts_chart = (
alt.Chart(no_serum_counts_plot_df)
.add_params(barcode_selection, strain_selection_dropdown)
.transform_filter(strain_selection_dropdown)
.encode(
alt.X(
"count", title="viral barcode count", scale=alt.Scale(nice=False, padding=5)
),
alt.Y("sample_well", sort=sample_wells),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}",
legend=alt.Legend(titleLimit=500),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
tooltip=no_serum_counts_plot_df.columns.tolist(),
)
.mark_circle(fillOpacity=0.6, stroke="black", strokeOpacity=1)
.properties(
height=alt.Step(10),
width=400,
title=f"{plate} viral barcode counts in no-serum samples",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.interactive()
)
display(no_serum_counts_chart)
# drop barcode / wells failing QC
min_no_serum_count_per_viral_barcode_well_drops = list(
no_serum_counts.query("fails_qc")[["barcode", "well"]].itertuples(
index=False, name=None
)
)
print(
f"\nDropping {len(min_no_serum_count_per_viral_barcode_well_drops)} barcode-wells for failing "
f"{qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}: "
+ str(min_no_serum_count_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
{
w: "min_no_serum_count_per_viral_barcode_well"
for w in min_no_serum_count_per_viral_barcode_well_drops
}
)
no_serum_counts = no_serum_counts[
~no_serum_counts.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
counts = counts[
~counts.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 4 barcode-wells for failing qc_thresholds['min_no_serum_count_per_viral_barcode_well']=100: [('GATTCAGATGCCCACC', 'D12'), ('CACCAATCTTCGAACT', 'D12'), ('CTCTTACGCTCCTACG', 'F12'), ('TTAATGTAGCCGCTCC', '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:
median_no_serum_ratio = (
no_serum_counts.assign(ratio=lambda x: x["count"] / x["neut_standard_count"])
.groupby(["barcode", "strain"], as_index=False)
.aggregate(median_no_serum_ratio=pd.NamedAgg("ratio", "median"))
)
strain_selection = alt.selection_point(fields=["strain"], on="mouseover", empty=False)
median_no_serum_ratio_chart = (
alt.Chart(median_no_serum_ratio)
.add_params(strain_selection)
.encode(
alt.X(
"median_no_serum_ratio",
title="median ratio of counts",
scale=alt.Scale(nice=False, padding=5),
),
alt.Y(
"barcode",
sort=alt.SortField("median_no_serum_ratio", order="descending"),
axis=alt.Axis(labelFontSize=5),
),
color=alt.condition(strain_selection, alt.value("orange"), alt.value("gray")),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if median_no_serum_ratio[c].dtype == float
else c
)
for c in median_no_serum_ratio.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(5),
width=250,
title=f"{plate} no-serum median ratio viral barcode to neut-standard barcode",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(median_no_serum_ratio_chart)
Compute the actual fraction infectivities. We compute both the raw fraction infectivities and the ones with the ceiling applied:
frac_infectivity = (
counts.query("not neut_standard")
.query("serum != 'none'")
.merge(median_no_serum_ratio, validate="many_to_one")
.merge(neut_standard_counts, validate="many_to_one")
.assign(
frac_infectivity_raw=lambda x: (
(x["count"] / x["neut_standard_count"]) / x["median_no_serum_ratio"]
),
frac_infectivity_ceiling=lambda x: x["frac_infectivity_raw"].clip(
upper=curvefit_params["frac_infectivity_ceiling"]
),
concentration=lambda x: 1 / x["dilution_factor"],
plate_barcode=lambda x: x["plate_replicate"] + "-" + x["barcode"],
)[
[
"barcode",
"plate_barcode",
"well",
"strain",
"serum",
"serum_replicate",
"dilution_factor",
"concentration",
"frac_infectivity_raw",
"frac_infectivity_ceiling",
]
]
)
assert len(
frac_infectivity.groupby(["serum", "plate_barcode", "dilution_factor"])
) == len(frac_infectivity)
assert frac_infectivity["dilution_factor"].notnull().all()
assert frac_infectivity["frac_infectivity_raw"].notnull().all()
assert frac_infectivity["frac_infectivity_ceiling"].notnull().all()
Plot the fraction infectivities, both the raw values and with the ceiling applied:
frac_infectivity_cols = {
"frac_infectivity_raw": "raw fraction infectivity",
"frac_infectivity_ceiling": f"fraction infectivity with ceiling at {curvefit_params['frac_infectivity_ceiling']}",
}
frac_infectivity_chart_df = frac_infectivity.assign(
fails_qc=lambda x: (
x["frac_infectivity_raw"]
> qc_thresholds["max_frac_infectivity_per_viral_barcode_well"]
),
)[
[
"barcode",
"strain",
"well",
"serum_replicate",
"dilution_factor",
"fails_qc",
*list(frac_infectivity_cols),
]
].rename(
columns=frac_infectivity_cols
)
# some manipulations to shrink data frame plotted by altair below by putting
# them in smaller data frames that are used via transform_lookup
barcode_lookup_df = frac_infectivity[["barcode", "strain"]].drop_duplicates()
assert len(barcode_lookup_df) == barcode_lookup_df["barcode"].nunique()
well_lookup_df = frac_infectivity[
["well", "serum_replicate", "dilution_factor"]
].drop_duplicates()
assert len(well_lookup_df) == well_lookup_df["well"].nunique()
frac_infectivity_chart_df = frac_infectivity_chart_df.drop(
columns=["strain", "serum_replicate", "dilution_factor"]
)
frac_infectivity_chart = (
alt.Chart(frac_infectivity_chart_df)
.transform_lookup(
lookup="barcode",
from_=alt.LookupData(barcode_lookup_df, key="barcode", fields=["strain"]),
)
.transform_lookup(
lookup="well",
from_=alt.LookupData(
well_lookup_df, key="well", fields=["serum_replicate", "dilution_factor"]
),
)
.transform_fold(
frac_infectivity_cols.values(), ["ceiling_applied", "frac_infectivity"]
)
.add_params(strain_selection_dropdown, barcode_selection)
.transform_filter(strain_selection_dropdown)
.encode(
alt.X(
"dilution_factor:Q",
title="dilution factor",
scale=alt.Scale(nice=False, padding=5, type="log"),
),
alt.Y(
"frac_infectivity:Q",
title="fraction infectivity",
scale=alt.Scale(nice=False, padding=5),
),
alt.Column(
"ceiling_applied:N",
sort="descending",
title=None,
header=alt.Header(labelFontSize=13, labelFontStyle="bold", labelPadding=2),
),
alt.Row(
"serum_replicate:N",
title=None,
spacing=3,
header=alt.Header(labelFontSize=13, labelFontStyle="bold"),
),
alt.Detail("barcode"),
alt.Shape(
"fails_qc",
title=f"fails {qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}",
legend=alt.Legend(titleLimit=500, orient="bottom"),
),
color=alt.condition(
barcode_selection, alt.value("black"), alt.value("MediumBlue")
),
strokeWidth=alt.condition(barcode_selection, alt.value(3), alt.value(1)),
opacity=alt.condition(barcode_selection, alt.value(1), alt.value(0.25)),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if frac_infectivity_chart_df[c].dtype == float
else c
)
for c in frac_infectivity_chart_df.columns
]
+ [
alt.Tooltip("strain:N"),
alt.Tooltip("serum_replicate:N"),
alt.Tooltip("dilution_factor:Q"),
],
)
.mark_line(point=True)
.properties(
height=150,
width=250,
title=f"Fraction infectivities for {plate}",
)
.interactive(bind_x=False)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.configure_point(size=50)
.resolve_scale(x="independent", y="independent")
)
display(frac_infectivity_chart)
# drop barcode / wells failing QC
max_frac_infectivity_per_viral_barcode_well_drops = list(
frac_infectivity_chart_df.query("fails_qc")[["barcode", "well"]]
.drop_duplicates()
.itertuples(index=False, name=None)
)
print(
f"\nDropping {len(max_frac_infectivity_per_viral_barcode_well_drops)} barcode-wells for failing "
f"{qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}: "
+ str(max_frac_infectivity_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
{
w: "max_frac_infectivity_per_viral_barcode_well"
for w in max_frac_infectivity_per_viral_barcode_well_drops
}
)
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 67 barcode-wells for failing qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=3: [('GCCGGCGTTAGTGTCA', 'D1'), ('GATCGCCACTGATAAG', 'F1'), ('CACCAATCTTCGAACT', 'F1'), ('CACCAATCTTCGAACT', 'D2'), ('AACCACCCCAGAGATG', 'E2'), ('CACCAATCTTCGAACT', 'E2'), ('AAGTATTGCTACACAT', 'G2'), ('CACTAGATGTACAGTC', 'G2'), ('GTGCATCCTAGTGACG', 'G2'), ('AGTCCTATCCTCAAAT', 'G2'), ('TCGAACGAAGTAGGAG', 'C3'), ('TTGGGCACTAAATTAA', 'C3'), ('ACGTCCATTAAGATCA', 'D3'), ('CGTGACCCCCTCCAAC', 'D3'), ('ACAAAGTCTCGAGAAG', 'E3'), ('TAATAAGCCAGCAAGA', 'E3'), ('TCGAACGAAGTAGGAG', 'E3'), ('GACCCCTTGTAAGATG', 'E3'), ('AGTCCTATCCTCAAAT', 'E3'), ('TAATAAGCCAGCAAGA', 'F3'), ('ACAGTCCACCATTGAG', 'F3'), ('GACCCCTTGTAAGATG', 'F3'), ('CCTTTCTCAAAACATA', 'G3'), ('AGCTCCTGGGGTATCA', 'H3'), ('CATAAAAGACTGTATA', 'H3'), ('CGGGAATCTCCCATAC', 'H3'), ('ACCGATTCACGAATAA', 'H3'), ('TCGAACGAAGTAGGAG', 'H3'), ('CACTAGATGTACAGTC', 'H3'), ('CGTGACCCCCTCCAAC', 'H3'), ('CACGGGCTAATGTCTC', 'H3'), ('GAGCTTGCTATGGATC', 'H3'), ('GTGCATCCTAGTGACG', 'H3'), ('CACCAATCTTCGAACT', 'H3'), ('TTTATATCCAACACCA', 'F4'), ('GAAGTGCGTATTGAGT', 'F4'), ('AGGAAAGAAACTGGAG', 'F4'), ('GCCATTTACTGAAGGG', 'F4'), ('GTAGAACTGCGGCCCC', 'F4'), ('CGGGGACAAGATTGTA', 'F4'), ('GCCTTTGCGCGCAGTC', 'F4'), ('TTGACTCACCGAATAA', 'F4'), ('AAAGCTCTTTTCGTTC', 'F4'), ('TAACGTGATTTCTCGA', 'F4'), ('TATTAAGAGAAGTGCG', 'F4'), ('CGTGACCCCCTCCAAC', 'F4'), ('ATAACTGAGGGCATTG', 'F4'), ('CACTAGATGTACAGTC', 'F4'), ('GCCGCTGCGGCGTGTG', 'F4'), ('CTCAAATAATTGGCGC', 'F4'), ('CCGCATTAGCGGGAGG', 'F4'), ('TCGAGTTAATATGCGC', 'F4'), ('GCCGGCGTTAGTGTCA', 'F4'), ('ACGCAAATAGACCGAA', 'H5'), ('CAAAAGCAGCACGATA', 'C7'), ('GAAATCCCCAAATAAC', 'E8'), ('GATCACGCAGAAAAAG', 'F8'), ('TATCCAAGGGACGGAC', 'G8'), ('AACCACCCCAGAGATG', 'F9'), ('ATTAGATTATAACGTA', 'E10'), ('CCTTTCTCAAAACATA', 'F10'), ('CGTACGTATGTCCCAG', 'G10'), ('GCCGGCGTTAGTGTCA', 'G10'), ('AAAGTAGCAGAGGATT', 'D11'), ('CGTTAACGGCCTATCC', 'E11'), ('AACACGTAGAACCGCC', 'F11'), ('AGTCCTATCCTCAAAT', 'G11')]
Check how many dilutions we have per barcode / serum-replicate:
n_dilutions = (
frac_infectivity.groupby(["serum_replicate", "strain", "barcode"], as_index=False)
.aggregate(**{"number of dilutions": pd.NamedAgg("dilution_factor", "nunique")})
.assign(
fails_qc=lambda x: (
x["number of dilutions"]
< qc_thresholds["min_dilutions_per_barcode_serum_replicate"]
),
)
)
n_dilutions_chart = (
alt.Chart(n_dilutions)
.add_params(barcode_selection)
.encode(
alt.X("number of dilutions", scale=alt.Scale(nice=False, padding=4)),
alt.Y("strain", title=None),
alt.Column(
"serum_replicate",
title=None,
header=alt.Header(labelFontSize=12, labelFontStyle="bold", labelPadding=0),
),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}",
legend=alt.Legend(titleLimit=500, orient="bottom"),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".3g") if n_dilutions[c].dtype == float else c
for c in n_dilutions.columns
],
)
.mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.45)
.properties(
height=alt.Step(10),
width=120,
title=alt.TitleParams(
"number of dilutions for each barcode for each serum-replicate", dy=-2
),
)
)
display(n_dilutions_chart)
# drop barcode / serum-replicates failing QC
min_dilutions_per_barcode_serum_replicate_drops = list(
n_dilutions.query("fails_qc")[["barcode", "serum_replicate"]].itertuples(
index=False, name=None
)
)
print(
f"\nDropping {len(min_dilutions_per_barcode_serum_replicate_drops)} barcode/serum-replicates for failing "
f"{qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}: "
+ str(min_dilutions_per_barcode_serum_replicate_drops)
)
qc_drops["barcode_serum_replicates"].update(
{
w: "min_dilutions_per_barcode_serum_replicate"
for w in min_dilutions_per_barcode_serum_replicate_drops
}
)
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Dropping 2 barcode/serum-replicates for failing qc_thresholds['min_dilutions_per_barcode_serum_replicate']=6: [('CACCAATCTTCGAACT', 'SCH_17'), ('TCGAACGAAGTAGGAG', 'SCH_18')]
Fit neutralization curves without applying QC to curves¶
First fit curves to all serum replicates, then we will apply QC on the curve fits. Note that the fitting is done to the fraction infectivities with the ceiling:
fits_noqc = neutcurve.CurveFits(
frac_infectivity.rename(
columns={
"frac_infectivity_ceiling": "fraction infectivity",
"concentration": "serum concentration",
}
),
conc_col="serum concentration",
fracinf_col="fraction infectivity",
virus_col="strain",
serum_col="serum_replicate",
replicate_col="barcode",
fixtop=curvefit_params["fixtop"],
fixbottom=curvefit_params["fixbottom"],
fixslope=curvefit_params["fixslope"],
)
Determine which fits fail the curve fitting QC, and plot them. Note the plot indicates as failing QC any barcode / serum-replicate that fails, even if we are also specified to ignore the QC for that one (so it will not be removed later):
goodness_of_fit = curvefit_qc["goodness_of_fit"]
fit_params_noqc = (
frac_infectivity.groupby(["serum_replicate", "barcode"], as_index=False)
.aggregate(max_frac_infectivity=pd.NamedAgg("frac_infectivity_ceiling", "max"))
.merge(
fits_noqc.fitParams(average_only=False, no_average=True)[
["serum", "virus", "replicate", "r2", "rmsd"]
].rename(columns={"serum": "serum_replicate", "replicate": "barcode"}),
validate="one_to_one",
)
.assign(
fails_max_frac_infectivity_at_least=lambda x: (
x["max_frac_infectivity"] < curvefit_qc["max_frac_infectivity_at_least"]
),
fails_goodness_of_fit=lambda x: (
(x["r2"] < goodness_of_fit["min_R2"])
& (x["rmsd"] > goodness_of_fit["max_RMSD"])
),
fails_qc=lambda x: (
x["fails_max_frac_infectivity_at_least"] | x["fails_goodness_of_fit"]
),
ignore_qc=lambda x: x.apply(
lambda r: (
(
r["serum_replicate"]
in curvefit_qc["serum_replicates_ignore_curvefit_qc"]
)
or (
(r["barcode"], r["serum_replicate"])
in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
)
),
axis=1,
),
)
)
print(f"Plotting barcode / serum-replicates that fail {curvefit_qc=}\n")
fit_params_noqc_base_chart = alt.Chart(fit_params_noqc).add_params(barcode_selection)
fit_params_noqc_chart = []
for prop, col in [
("max frac infectivity", "max_frac_infectivity"),
("curve fit R2", "r2"),
("curve fit RMSD", "rmsd"),
]:
fit_params_noqc_chart.append(
fit_params_noqc_base_chart.encode(
alt.X(col, title=prop, scale=alt.Scale(nice=False, padding=4)),
alt.Y("virus", title=None),
alt.Fill("fails_qc"),
alt.Column(
"serum_replicate",
title=None,
header=alt.Header(
labelFontSize=12, labelFontStyle="bold", labelPadding=0
),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".3g") if fit_params_noqc[c].dtype == float else c
for c in fit_params_noqc.columns
],
)
.mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.55)
.properties(
height=alt.Step(10),
width=90,
title=alt.TitleParams(f"{prop} for each barcode serum-replicate", dy=-2),
)
)
alt.vconcat(*fit_params_noqc_chart)
Plotting barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0.0, 'goodness_of_fit': {'min_R2': 0.5, 'max_RMSD': 0.15}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
Now plot curves for all virus vs serum-replicates that have a barcode that fails any of the QC. In these plots, the suffix on the barcode name in the color key indicates if it passed or failed QC:
barcode_serum_replicates_fail_qc = fit_params_noqc.query("fails_qc").reset_index(
drop=True
)
print(f"Here are barcode / serum-replicates that fail {curvefit_qc=}")
display(barcode_serum_replicates_fail_qc)
if len(barcode_serum_replicates_fail_qc):
print(
"\nCurves for virus vs serum-replicates with at least one failed barcode."
"\nColor key labels indicate if barcodes failed or passed QC."
)
plots = {}
ncol = 6
for iplot, (serum, virus, failed_barcodes) in enumerate(
barcode_serum_replicates_fail_qc.groupby(
["serum_replicate", "virus"], as_index=False
)
.aggregate(barcodes=pd.NamedAgg("barcode", list))
.itertuples(index=False)
):
passed_barcodes = [
bc
for bc in fits_noqc.replicates[serum, virus]
if (bc not in failed_barcodes) and (bc != "average")
]
curvelist = []
assert len(CBMARKERS) >= len(failed_barcodes + passed_barcodes)
assert len(CBPALETTE) >= len(failed_barcodes + passed_barcodes)
for replicate, marker, color in zip(
failed_barcodes + passed_barcodes, CBMARKERS, CBPALETTE
):
curvelist.append(
{
"serum": serum,
"virus": virus,
"replicate": replicate,
"label": replicate
+ ("-fail" if replicate in failed_barcodes else "-pass"),
"color": color,
"marker": marker,
}
)
plots[iplot // ncol, iplot % ncol] = (f"{serum} vs {virus}", curvelist)
fig, _ = fits_noqc.plotGrid(
plots,
attempt_shared_legend=False,
legendfontsize=8,
titlesize=9,
ticksize=10,
draw_in_bounds=True,
)
display_curve_fig(fig, curve_display_method)
plt.close(fig)
Here are barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0.0, 'goodness_of_fit': {'min_R2': 0.5, 'max_RMSD': 0.15}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
serum_replicate | barcode | max_frac_infectivity | virus | r2 | rmsd | fails_max_frac_infectivity_at_least | fails_goodness_of_fit | fails_qc | ignore_qc | |
---|---|---|---|---|---|---|---|---|---|---|
0 | SCH_16 | AAACCCATAAGACCCC | 0.624492 | A/Minnesota/126/2024_H3N2 | 4.629890e-01 | 0.171664 | False | True | True | False |
1 | SCH_16 | AAATTCACAATATCCA | 0.523484 | A/Cambodia/e0826360/2020egg_H3N2 | 4.534223e-01 | 0.153128 | False | True | True | False |
2 | SCH_16 | AACAGAAGTCCATGTA | 0.674145 | A/New_York/GKISBBBE61555/2025_H3N2 | 4.639704e-01 | 0.163748 | False | True | True | False |
3 | SCH_16 | ACTGTCTAGAAATTTT | 0.654493 | A/France/PAC-RELAB-HCL024172122101/2024_H3N2 | 4.950709e-01 | 0.155799 | False | True | True | False |
4 | SCH_16 | CCCTATGAAATAAGCT | 0.659316 | A/Colombia/7681/2024_H3N2 | 4.628465e-01 | 0.160768 | False | True | True | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
365 | SCH_26 | TTGCAATTGAAACATA | 1.000000 | A/Cambodia/e0826360/2020_H3N2 | -1.016800e-10 | 0.212099 | False | True | True | False |
366 | SCH_26 | TTGCTCCTGAGTAGTA | 1.000000 | A/Indiana/46/2024_H3N2 | 3.182924e-01 | 0.192754 | False | True | True | False |
367 | SCH_26 | TTTATATCCAACACCA | 1.000000 | A/Mato_Grosso_do_Sul/518/2025_H3N2 | 4.212612e-01 | 0.208681 | False | True | True | False |
368 | SCH_26 | TTTCACAGAACCTATC | 1.000000 | A/Badajoz/18680568/2025_H3N2 | 1.989249e-01 | 0.200760 | False | True | True | False |
369 | SCH_26 | TTTCGTGATACTCACA | 1.000000 | A/DE/DE-DHSS-901/2025_(H3N2)_H3N2 | 0.000000e+00 | 0.207134 | False | True | True | False |
370 rows × 10 columns
Curves for virus vs serum-replicates with at least one failed barcode. Color key labels indicate if barcodes failed or passed QC.
# drop barcode / serum-replicates failing QC
for qc_filter in ["max_frac_infectivity_at_least", "goodness_of_fit"]:
fits_qc_drops = list(
fit_params_noqc.query(f"fails_{qc_filter} and (not ignore_qc)")[
["barcode", "serum_replicate"]
].itertuples(index=False, name=None)
)
print(
f"\nDropping {len(fits_qc_drops)} barcode/serum-replicates for failing "
f"{qc_filter}={curvefit_qc[qc_filter]}: " + str(fits_qc_drops)
)
qc_drops["barcode_serum_replicates"].update({w: qc_filter for w in fits_qc_drops})
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
fit_params_noqc = fit_params_noqc[
~fit_params_noqc.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Dropping 0 barcode/serum-replicates for failing max_frac_infectivity_at_least=0.0: [] Dropping 370 barcode/serum-replicates for failing goodness_of_fit={'min_R2': 0.5, 'max_RMSD': 0.15}: [('AAACCCATAAGACCCC', 'SCH_16'), ('AAATTCACAATATCCA', 'SCH_16'), ('AACAGAAGTCCATGTA', 'SCH_16'), ('ACTGTCTAGAAATTTT', 'SCH_16'), ('CCCTATGAAATAAGCT', 'SCH_16'), ('CCGCATTAGCGGGAGG', 'SCH_16'), ('CGTTTTTGGTTCGAGG', 'SCH_16'), ('CTATAAACCGTTTGTA', 'SCH_16'), ('TACCTGCTGCGGAACG', 'SCH_16'), ('TCAATCGGGGGCTAAA', 'SCH_16'), ('TTACGAATTTGATTCC', 'SCH_16'), ('TTTCACAGAACCTATC', 'SCH_16'), ('GACGGGATGGGCACGT', 'SCH_17'), ('CGGGGACAAGATTGTA', 'SCH_18'), ('AAAGGCGCGCCTTCAA', 'SCH_19'), ('AACAGAAGTCCATGTA', 'SCH_19'), ('AACCTACGAGACGTAA', 'SCH_19'), ('AACTTCCCTGACTGCT', 'SCH_19'), ('AACTTCCGTCGCCTGA', 'SCH_19'), ('AAGAAGACTTTGTGAT', 'SCH_19'), ('AATCGCTGGCACCCGT', 'SCH_19'), ('AATGAAACAATCGAAC', 'SCH_19'), ('ACAAGATTCGGGGGAC', 'SCH_19'), ('ACCAGCAATGAGTTGT', 'SCH_19'), ('ACGTATGATTTTCGAG', 'SCH_19'), ('ACTCTGGCTCGCTAAT', 'SCH_19'), ('AGAAAATCTCAGATAC', 'SCH_19'), ('AGACCATCGCACCCAA', 'SCH_19'), ('AGCATAGGGATATGTG', 'SCH_19'), ('AGTCGTTTAGATAGTT', 'SCH_19'), ('AGTGTTGAATAGGCGA', 'SCH_19'), ('AGTGTTGGCTTGGTTA', 'SCH_19'), ('ATACACGCATGTGCCA', 'SCH_19'), ('ATTCCGAATGGGGTAG', 'SCH_19'), ('CAAAATCTACGGCGAC', 'SCH_19'), ('CACAGACAATAAAAAA', 'SCH_19'), ('CATGGGAATTGCCACT', 'SCH_19'), ('CATTTCTGATGAATTG', 'SCH_19'), ('CCCCCGCTGTTTAAAA', 'SCH_19'), ('CCCCTCCTCTAAAGTT', 'SCH_19'), ('CCCTTTACGGATCTCT', 'SCH_19'), ('CCGCGCACGTTTAGAG', 'SCH_19'), ('CCTTGATGCATTCCCG', 'SCH_19'), ('CGCACTTTACGAGACA', 'SCH_19'), ('CGGACCCTAGATGGTA', 'SCH_19'), ('CGGCCAGGGAATCAAA', 'SCH_19'), ('CGGTCGGGACTCATCT', 'SCH_19'), ('CGTTTTTGGTTCGAGG', 'SCH_19'), ('CTAATTTAAGTATCAA', 'SCH_19'), ('CTATAAACCGTTTGTA', 'SCH_19'), ('CTATATTGCCCGGAAG', 'SCH_19'), ('CTATTTAACAGACGTA', 'SCH_19'), ('CTCAATGTCGTAGGAT', 'SCH_19'), ('CTGAACTTATCTGTGG', 'SCH_19'), ('CTGAGGGATTCAACTC', 'SCH_19'), ('CTTTTCTAGTACGCTT', 'SCH_19'), ('GAAGTACGCTGAATGA', 'SCH_19'), ('GAAGTGCGTATTGAGT', 'SCH_19'), ('GAAGTGCTGCTGAAGT', 'SCH_19'), ('GACGGGATGGGCACGT', 'SCH_19'), ('GAGAGCTGCAGAAGCG', 'SCH_19'), ('GCAAACAGTGTAGTTG', 'SCH_19'), ('GCAGCGTGCCGGTCAT', 'SCH_19'), ('GCCGCTGCGGCGTGTG', 'SCH_19'), ('GTAAGCAAAGTTGACC', 'SCH_19'), ('GTAAGCTTCATGGAGT', 'SCH_19'), ('GTCAAGTTACGGATGG', 'SCH_19'), ('GTTGCTCCGACACGCC', 'SCH_19'), ('TACATACCGACGCAGT', 'SCH_19'), ('TACCTGCTGCGGAACG', 'SCH_19'), ('TAGCATTGTCGGAAAG', 'SCH_19'), ('TATTCCTAACTAGCGA', 'SCH_19'), ('TCGTCCGTTGGGAACT', 'SCH_19'), ('TCTCAGCTCTTAGCCG', 'SCH_19'), ('TGTAATAGGCGTCACA', 'SCH_19'), ('TGTGGAGCGCCCTTAC', 'SCH_19'), ('TTACGAATTTGATTCC', 'SCH_19'), ('TTGCTCCTGAGTAGTA', 'SCH_19'), ('TTTCACAGAACCTATC', 'SCH_19'), ('TTTCGTGATACTCACA', 'SCH_19'), ('AAAGGCGCGCCTTCAA', 'SCH_20'), ('AACTTCCCTGACTGCT', 'SCH_20'), ('AAGAAGACTTTGTGAT', 'SCH_20'), ('AAGAAGCTATAGAAGT', 'SCH_20'), ('AAGATTGATTGAAGTT', 'SCH_20'), ('AAGCGGTGATGTGATT', 'SCH_20'), ('AATCGCTGGCACCCGT', 'SCH_20'), ('ACAAGATTCGGGGGAC', 'SCH_20'), ('AGACCGCCAGTTTCGT', 'SCH_20'), ('AGCATAGGGATATGTG', 'SCH_20'), ('AGGAGTATGAAGAGCG', 'SCH_20'), ('AGTGTTGGCTTGGTTA', 'SCH_20'), ('AGTTCCATAGGCATGG', 'SCH_20'), ('ATATAAAAAACTTAGT', 'SCH_20'), ('ATGGCCCACGGGCATA', 'SCH_20'), ('CAAAATCTACGGCGAC', 'SCH_20'), ('CAATTCGCCGTTCCCC', 'SCH_20'), ('CCAACACAAAAAATTA', 'SCH_20'), ('CCCCTCCTCTAAAGTT', 'SCH_20'), ('CCGCATTAGCGGGAGG', 'SCH_20'), ('CCGCGCACGTTTAGAG', 'SCH_20'), ('CCTTGATGCATTCCCG', 'SCH_20'), ('CGCACTTTACGAGACA', 'SCH_20'), ('CGGGGACAAGATTGTA', 'SCH_20'), ('CGTTTTTGGTTCGAGG', 'SCH_20'), ('CTAGCACAGCGTAGGC', 'SCH_20'), ('CTATTTAACAGACGTA', 'SCH_20'), ('CTCAATGTCGTAGGAT', 'SCH_20'), ('CTTTTCTAGTACGCTT', 'SCH_20'), ('GAAGTGCGTATTGAGT', 'SCH_20'), ('GAATAATAGAACAGAG', 'SCH_20'), ('GACGGGATGGGCACGT', 'SCH_20'), ('GAGAGCTGCAGAAGCG', 'SCH_20'), ('GATCGCCACTGATAAG', 'SCH_20'), ('GCAACGAGGTGTAACC', 'SCH_20'), ('GCCGCTGCGGCGTGTG', 'SCH_20'), ('GTAAGCAAAGTTGACC', 'SCH_20'), ('TCGTCCGTTGGGAACT', 'SCH_20'), ('TCTTATTAGGCGGCAT', 'SCH_20'), ('TGATCTGTGACATTGC', 'SCH_20'), ('TGTAATAGGCGTCACA', 'SCH_20'), ('TTTCACAGAACCTATC', 'SCH_20'), ('TTTCAGCGTTGTTTTG', 'SCH_20'), ('AAGCGGTGATGTGATT', 'SCH_21'), ('AGCGACATCGCCCTTT', 'SCH_21'), ('CAATTCGCCGTTCCCC', 'SCH_21'), ('CCCCCGCTGTTTAAAA', 'SCH_21'), ('CCGCGCACGTTTAGAG', 'SCH_21'), ('CGTTCAGCGATAACGG', 'SCH_21'), ('CGTTTTTGGTTCGAGG', 'SCH_21'), ('GAAGTACGCTGAATGA', 'SCH_21'), ('GCCATTTACTGAAGGG', 'SCH_21'), ('GTAGATACTAGGACCA', 'SCH_21'), ('GTGAGCGAGAAAAGCA', 'SCH_21'), ('TATTCCTAACTAGCGA', 'SCH_21'), ('TTGACTCACCGAATAA', 'SCH_21'), ('TTTCACAGAACCTATC', 'SCH_21'), ('AAATTCACAATATCCA', 'SCH_22'), ('AACCACCCCAGAGATG', 'SCH_22'), ('AACCGTACCGCGTTTA', 'SCH_22'), ('AACGGTTCCGACTAAG', 'SCH_22'), ('AACTGCGTTCATCGAT', 'SCH_22'), ('AACTTCCCTGACTGCT', 'SCH_22'), ('AACTTCCGTCGCCTGA', 'SCH_22'), ('AAGAAGACTTTGTGAT', 'SCH_22'), ('AAGAAGCTATAGAAGT', 'SCH_22'), ('AAGATTGATTGAAGTT', 'SCH_22'), ('AAGCCCAGCGGGTGAT', 'SCH_22'), ('AAGCGGTGATGTGATT', 'SCH_22'), ('AATGAAACAATCGAAC', 'SCH_22'), ('ACCGTTGTACACACCA', 'SCH_22'), ('ACGTATGATTTTCGAG', 'SCH_22'), ('ACGTGTCTCCGAGCAA', 'SCH_22'), ('ACTACGAGGCTACGTA', 'SCH_22'), ('AGACCATCGCACCCAA', 'SCH_22'), ('AGCATAGGGATATGTG', 'SCH_22'), ('AGCCCATGCTGGGGAT', 'SCH_22'), ('AGTCGTTTAGATAGTT', 'SCH_22'), ('AGTGTTGGCTTGGTTA', 'SCH_22'), ('ATAACGTTTGTGCAAA', 'SCH_22'), ('ATACACGCATGTGCCA', 'SCH_22'), ('ATATAAAAAACTTAGT', 'SCH_22'), ('ATGGCCCACGGGCATA', 'SCH_22'), ('ATTAGATTATAACGTA', 'SCH_22'), ('ATTTACTCATTATACG', 'SCH_22'), ('CAAAATCTACGGCGAC', 'SCH_22'), ('CAATTCGCCGTTCCCC', 'SCH_22'), ('CACCGCGCCGAGCACC', 'SCH_22'), ('CAGAACCTCGTTGTCT', 'SCH_22'), ('CCAACACAAAAAATTA', 'SCH_22'), ('CCCTATGAAATAAGCT', 'SCH_22'), ('CCGCGCACGTTTAGAG', 'SCH_22'), ('CCTGGGTTAAGTTGTG', 'SCH_22'), ('CCTTGATGCATTCCCG', 'SCH_22'), ('CGAAAACATTACAAAT', 'SCH_22'), ('CGCACTTTACGAGACA', 'SCH_22'), ('CGGGAATCTCCCATAC', 'SCH_22'), ('CGGGGACAAGATTGTA', 'SCH_22'), ('CGTACGTATGTCCCAG', 'SCH_22'), ('CGTTTTTGGTTCGAGG', 'SCH_22'), ('CTATAAACCGTTTGTA', 'SCH_22'), ('CTATTTAACAGACGTA', 'SCH_22'), ('CTGAACTTATCTGTGG', 'SCH_22'), ('GAATAATAGAACAGAG', 'SCH_22'), ('GAGAGCTGCAGAAGCG', 'SCH_22'), ('GATCGCCACTGATAAG', 'SCH_22'), ('GCAACGAGGTGTAACC', 'SCH_22'), ('GCCGCTGCGGCGTGTG', 'SCH_22'), ('GGTTAACTTTGGAAGC', 'SCH_22'), ('GTAAGCAAAGTTGACC', 'SCH_22'), ('GTAAGCTTCATGGAGT', 'SCH_22'), ('GTAATTCGCATGCGGA', 'SCH_22'), ('GTCCGTCAGCATAAAC', 'SCH_22'), ('GTGAGCGAGAAAAGCA', 'SCH_22'), ('GTTATTATGACTTCAT', 'SCH_22'), ('GTTGCTCCGACACGCC', 'SCH_22'), ('TAAAAAGCCTCCATGA', 'SCH_22'), ('TACATACCGACGCAGT', 'SCH_22'), ('TACCTGCTGCGGAACG', 'SCH_22'), ('TCACGACTCGACTAAC', 'SCH_22'), ('TCATGGGTGTACGAGA', 'SCH_22'), ('TCGTCGCACTACTGCT', 'SCH_22'), ('TCTTATTAGGCGGCAT', 'SCH_22'), ('TGAGTTCATAGCTCCA', 'SCH_22'), ('TGGTCCGCTTCATGCT', 'SCH_22'), ('TTACGAATTTGATTCC', 'SCH_22'), ('TTCTGTCCAGACTCGT', 'SCH_22'), ('TTGCAATTGAAACATA', 'SCH_22'), ('TTTATATCCAACACCA', 'SCH_22'), ('TTTCACAGAACCTATC', 'SCH_22'), ('TTTCGTGATACTCACA', 'SCH_22'), ('CCGCGCACGTTTAGAG', 'SCH_23'), ('GAAGTACGCTGAATGA', 'SCH_23'), ('AGCTGAATTAAGTATG', 'SCH_24'), ('ATTTACTCATTATACG', 'SCH_24'), ('GTAATTCGCATGCGGA', 'SCH_24'), ('TCTTAGAGTGAACGAT', 'SCH_24'), ('TTGACTCACCGAATAA', 'SCH_24'), ('AACAGAAGTCCATGTA', 'SCH_25'), ('AACTGCGTTCATCGAT', 'SCH_25'), ('AACTTCCCTGACTGCT', 'SCH_25'), ('AACTTCCGTCGCCTGA', 'SCH_25'), ('AAGAAGACTTTGTGAT', 'SCH_25'), ('AAGGGGCCTCATAATG', 'SCH_25'), ('AATCGCTGGCACCCGT', 'SCH_25'), ('AATGAAACAATCGAAC', 'SCH_25'), ('ACAAGATTCGGGGGAC', 'SCH_25'), ('ACCGTTGTACACACCA', 'SCH_25'), ('ACTACGAGGCTACGTA', 'SCH_25'), ('ACTCTGGCTCGCTAAT', 'SCH_25'), ('AGCATAGGGATATGTG', 'SCH_25'), ('AGGAGTATGAAGAGCG', 'SCH_25'), ('AGTGTTGAATAGGCGA', 'SCH_25'), ('ATACACGCATGTGCCA', 'SCH_25'), ('ATATAAAAAACTTAGT', 'SCH_25'), ('ATGGCCCACGGGCATA', 'SCH_25'), ('ATTATCATATCTAATA', 'SCH_25'), ('CAAAATCTACGGCGAC', 'SCH_25'), ('CACCGCGCCGAGCACC', 'SCH_25'), ('CAGATAGTGATGAACA', 'SCH_25'), ('CATGTGGAGCCCAACA', 'SCH_25'), ('CCCTATGAAATAAGCT', 'SCH_25'), ('CCCTTTACGGATCTCT', 'SCH_25'), ('CCGCGCACGTTTAGAG', 'SCH_25'), ('CCTTGATGCATTCCCG', 'SCH_25'), ('CGCACTTTACGAGACA', 'SCH_25'), ('CGGGGACAAGATTGTA', 'SCH_25'), ('CGTTAACGGCCTATCC', 'SCH_25'), ('CGTTTTTGGTTCGAGG', 'SCH_25'), ('CTAGCACAGCGTAGGC', 'SCH_25'), ('CTATAAACCGTTTGTA', 'SCH_25'), ('CTATATTGCCCGGAAG', 'SCH_25'), ('CTATTTAACAGACGTA', 'SCH_25'), ('CTCAATGTCGTAGGAT', 'SCH_25'), ('CTTTTCTAGTACGCTT', 'SCH_25'), ('GAAGTACGCTGAATGA', 'SCH_25'), ('GAGAGCTGCAGAAGCG', 'SCH_25'), ('GCAAACAGTGTAGTTG', 'SCH_25'), ('GTAATTCGCATGCGGA', 'SCH_25'), ('GTTGCTCCGACACGCC', 'SCH_25'), ('TAAAAAGCCTCCATGA', 'SCH_25'), ('TACCAATGTCATTTGA', 'SCH_25'), ('TACTGATAACCCTGCG', 'SCH_25'), ('TATCCAAGGGACGGAC', 'SCH_25'), ('TCGATTACTAGCCGGA', 'SCH_25'), ('TCTCAGCTCTTAGCCG', 'SCH_25'), ('TCTTATTAGGCGGCAT', 'SCH_25'), ('TGTAATAGGCGTCACA', 'SCH_25'), ('TGTGGAGCGCCCTTAC', 'SCH_25'), ('TTACGAATTTGATTCC', 'SCH_25'), ('AAAGGCGCGCCTTCAA', 'SCH_26'), ('AAATTCACAATATCCA', 'SCH_26'), ('AACTGCGTTCATCGAT', 'SCH_26'), ('AACTTCCCTGACTGCT', 'SCH_26'), ('AACTTCCGTCGCCTGA', 'SCH_26'), ('AAGAAGACTTTGTGAT', 'SCH_26'), ('AAGCGGTGATGTGATT', 'SCH_26'), ('AAGTATTGCTACACAT', 'SCH_26'), ('AATGAAACAATCGAAC', 'SCH_26'), ('ACAAGATTCGGGGGAC', 'SCH_26'), ('ACCAGCAATGAGTTGT', 'SCH_26'), ('ACCGAATGAATCATCC', 'SCH_26'), ('ACGTATGATTTTCGAG', 'SCH_26'), ('ACTACGAGGCTACGTA', 'SCH_26'), ('ACTGTCTAGAAATTTT', 'SCH_26'), ('AGAAAATCTCAGATAC', 'SCH_26'), ('AGACCATCGCACCCAA', 'SCH_26'), ('AGACCGCCAGTTTCGT', 'SCH_26'), ('AGCATAGGGATATGTG', 'SCH_26'), ('AGCCCATGCTGGGGAT', 'SCH_26'), ('AGCGACATCGCCCTTT', 'SCH_26'), ('AGGAGTATGAAGAGCG', 'SCH_26'), ('AGTGTTGAATAGGCGA', 'SCH_26'), ('AGTGTTGGCTTGGTTA', 'SCH_26'), ('AGTTCCATAGGCATGG', 'SCH_26'), ('ATAACGTTTGTGCAAA', 'SCH_26'), ('ATACACGCATGTGCCA', 'SCH_26'), ('ATATAAAAAACTTAGT', 'SCH_26'), ('ATGGCCCACGGGCATA', 'SCH_26'), ('ATTAGATTATAACGTA', 'SCH_26'), ('ATTATCATATCTAATA', 'SCH_26'), ('ATTCCGAATGGGGTAG', 'SCH_26'), ('CAAAATCTACGGCGAC', 'SCH_26'), ('CACCATCAGCACCTAG', 'SCH_26'), ('CAGATAGTGATGAACA', 'SCH_26'), ('CAGGCTCTAGAGCTCT', 'SCH_26'), ('CCAACACAAAAAATTA', 'SCH_26'), ('CCCCCGCTGTTTAAAA', 'SCH_26'), ('CCCCTCCTCTAAAGTT', 'SCH_26'), ('CCCTATGAAATAAGCT', 'SCH_26'), ('CCCTGCGCGGCTCGGG', 'SCH_26'), ('CCCTTTACGGATCTCT', 'SCH_26'), ('CCGCGCACGTTTAGAG', 'SCH_26'), ('CCTTGATGCATTCCCG', 'SCH_26'), ('CGCACTTTACGAGACA', 'SCH_26'), ('CGCAGCATTGGTCGCC', 'SCH_26'), ('CGGACCCTAGATGGTA', 'SCH_26'), ('CGGGGACAAGATTGTA', 'SCH_26'), ('CGGTCGGGACTCATCT', 'SCH_26'), ('CGTACAGTGTAATCGA', 'SCH_26'), ('CGTTTTTGGTTCGAGG', 'SCH_26'), ('CTAATTTAAGTATCAA', 'SCH_26'), ('CTAGCACAGCGTAGGC', 'SCH_26'), ('CTATAAACCGTTTGTA', 'SCH_26'), ('CTATTTAACAGACGTA', 'SCH_26'), ('CTCCTAGGGGACGATT', 'SCH_26'), ('CTGAACTTATCTGTGG', 'SCH_26'), ('CTGAGGGATTCAACTC', 'SCH_26'), ('GAAGTACGCTGAATGA', 'SCH_26'), ('GAATAATAGAACAGAG', 'SCH_26'), ('GACGGGATGGGCACGT', 'SCH_26'), ('GAGGGGTAGAGATACG', 'SCH_26'), ('GATCGCCACTGATAAG', 'SCH_26'), ('GCAACGAGGTGTAACC', 'SCH_26'), ('GCCATTTACTGAAGGG', 'SCH_26'), ('GCCTTTGCGCGCAGTC', 'SCH_26'), ('GGTTAACTTTGGAAGC', 'SCH_26'), ('GTAAGCAAAGTTGACC', 'SCH_26'), ('GTAAGCTTCATGGAGT', 'SCH_26'), ('GTCAAGTTACGGATGG', 'SCH_26'), ('GTCCGTCAGCATAAAC', 'SCH_26'), ('GTCGCCGCTAATCCGA', 'SCH_26'), ('GTTGCTCCGACACGCC', 'SCH_26'), ('TAAAAAGCCTCCATGA', 'SCH_26'), ('TAATAAGCCAGCAAGA', 'SCH_26'), ('TACCAATGTCATTTGA', 'SCH_26'), ('TACCTGCTGCGGAACG', 'SCH_26'), ('TACTAATGCCGTTGTC', 'SCH_26'), ('TACTAGCAATAAAATC', 'SCH_26'), ('TAGCATTGTCGGAAAG', 'SCH_26'), ('TATCCAAGGGACGGAC', 'SCH_26'), ('TATTCCTAACTAGCGA', 'SCH_26'), ('TCAATCGGGGGCTAAA', 'SCH_26'), ('TCATGGGTGTACGAGA', 'SCH_26'), ('TCGTCCGTTGGGAACT', 'SCH_26'), ('TCTTAGAGTGAACGAT', 'SCH_26'), ('TCTTATTAGGCGGCAT', 'SCH_26'), ('TGAGTTCATAGCTCCA', 'SCH_26'), ('TGGTCCGCTTCATGCT', 'SCH_26'), ('TGTAATAGGCGTCACA', 'SCH_26'), ('TGTGGAGCGCCCTTAC', 'SCH_26'), ('TGTTGTAATCTGAATA', 'SCH_26'), ('TTACGAATTTGATTCC', 'SCH_26'), ('TTCTGTCCAGACTCGT', 'SCH_26'), ('TTGACTCACCGAATAA', 'SCH_26'), ('TTGCAATTGAAACATA', 'SCH_26'), ('TTGCTCCTGAGTAGTA', 'SCH_26'), ('TTTATATCCAACACCA', 'SCH_26'), ('TTTCACAGAACCTATC', 'SCH_26'), ('TTTCGTGATACTCACA', 'SCH_26')]
Fit neutralization curves after applying QC¶
No we re-fit curves after applying all the QC:
fits_qc = neutcurve.CurveFits(
frac_infectivity.rename(
columns={
"frac_infectivity_ceiling": "fraction infectivity",
"concentration": "serum concentration",
}
),
conc_col="serum concentration",
fracinf_col="fraction infectivity",
virus_col="strain",
serum_col="serum",
replicate_col="plate_barcode",
fixtop=curvefit_params["fixtop"],
fixbottom=curvefit_params["fixbottom"],
fixslope=curvefit_params["fixslope"],
)
fit_params_qc = fits_qc.fitParams(average_only=False, no_average=True)
assert len(fit_params_qc) <= len(
fits_noqc.fitParams(average_only=False, no_average=True)
)
print(f"Assigning fits for this plate to {group}")
fit_params_qc.insert(0, "group", group)
Assigning fits for this plate to SCH
Plot all the curves that passed QC:
if fits_qc.sera:
fig, _ = fits_qc.plotReplicates(
attempt_shared_legend=False,
legendfontsize=8,
titlesize=9,
ticksize=10,
ncol=6,
draw_in_bounds=True,
)
display_curve_fig(fig, curve_display_method)
plt.close(fig)
else:
print("No sera passed QC.")
Save results to files¶
print(f"Writing fraction infectivities to {frac_infectivity_csv}")
(
frac_infectivity[
[
"serum",
"strain",
"plate_barcode",
"dilution_factor",
"frac_infectivity_raw",
"frac_infectivity_ceiling",
]
]
.sort_values(["serum", "plate_barcode", "dilution_factor"])
.to_csv(frac_infectivity_csv, index=False, float_format="%.4g")
)
print(f"\nWriting fit parameters to {fits_csv}")
(
fit_params_qc.drop(columns=["nreplicates", "ic50_str"]).to_csv(
fits_csv, index=False, float_format="%.4g"
)
)
print(f"\nPickling neutcurve.CurveFits object for these data to {fits_pickle}")
with open(fits_pickle, "wb") as f:
pickle.dump(fits_qc, f)
print(f"\nWriting QC drops to {qc_drops_yaml}")
def tup_to_str(x):
return " ".join(x) if isinstance(x, tuple) else x
qc_drops_for_yaml = {
key: {tup_to_str(key2): val2 for key2, val2 in val.items()}
for key, val in qc_drops.items()
}
with open(qc_drops_yaml, "w") as f:
yaml.YAML(typ="rt").dump(qc_drops_for_yaml, f)
print("\nHere are the QC drops:\n***************************")
yaml.YAML(typ="rt").dump(qc_drops_for_yaml, sys.stdout)
Writing fraction infectivities to results/plates/plate9/frac_infectivity.csv Writing fit parameters to results/plates/plate9/curvefits.csv
Pickling neutcurve.CurveFits object for these data to results/plates/plate9/curvefits.pickle Writing QC drops to results/plates/plate9/qc_drops.yml Here are the QC drops: *************************** wells: F2: avg_barcode_counts_per_well barcodes: {} barcode_wells: GATTCAGATGCCCACC D12: min_no_serum_count_per_viral_barcode_well CACCAATCTTCGAACT D12: min_no_serum_count_per_viral_barcode_well CTCTTACGCTCCTACG F12: min_no_serum_count_per_viral_barcode_well TTAATGTAGCCGCTCC H12: min_no_serum_count_per_viral_barcode_well GCCGGCGTTAGTGTCA D1: max_frac_infectivity_per_viral_barcode_well GATCGCCACTGATAAG F1: max_frac_infectivity_per_viral_barcode_well CACCAATCTTCGAACT F1: max_frac_infectivity_per_viral_barcode_well CACCAATCTTCGAACT D2: max_frac_infectivity_per_viral_barcode_well AACCACCCCAGAGATG E2: max_frac_infectivity_per_viral_barcode_well CACCAATCTTCGAACT E2: max_frac_infectivity_per_viral_barcode_well AAGTATTGCTACACAT G2: max_frac_infectivity_per_viral_barcode_well CACTAGATGTACAGTC G2: max_frac_infectivity_per_viral_barcode_well GTGCATCCTAGTGACG G2: max_frac_infectivity_per_viral_barcode_well AGTCCTATCCTCAAAT G2: max_frac_infectivity_per_viral_barcode_well TCGAACGAAGTAGGAG C3: max_frac_infectivity_per_viral_barcode_well TTGGGCACTAAATTAA C3: max_frac_infectivity_per_viral_barcode_well ACGTCCATTAAGATCA D3: max_frac_infectivity_per_viral_barcode_well CGTGACCCCCTCCAAC D3: max_frac_infectivity_per_viral_barcode_well ACAAAGTCTCGAGAAG E3: max_frac_infectivity_per_viral_barcode_well TAATAAGCCAGCAAGA E3: max_frac_infectivity_per_viral_barcode_well TCGAACGAAGTAGGAG E3: max_frac_infectivity_per_viral_barcode_well GACCCCTTGTAAGATG E3: max_frac_infectivity_per_viral_barcode_well AGTCCTATCCTCAAAT E3: max_frac_infectivity_per_viral_barcode_well TAATAAGCCAGCAAGA F3: max_frac_infectivity_per_viral_barcode_well ACAGTCCACCATTGAG F3: max_frac_infectivity_per_viral_barcode_well GACCCCTTGTAAGATG F3: max_frac_infectivity_per_viral_barcode_well CCTTTCTCAAAACATA G3: max_frac_infectivity_per_viral_barcode_well AGCTCCTGGGGTATCA H3: max_frac_infectivity_per_viral_barcode_well CATAAAAGACTGTATA H3: max_frac_infectivity_per_viral_barcode_well CGGGAATCTCCCATAC H3: max_frac_infectivity_per_viral_barcode_well ACCGATTCACGAATAA H3: max_frac_infectivity_per_viral_barcode_well TCGAACGAAGTAGGAG H3: max_frac_infectivity_per_viral_barcode_well CACTAGATGTACAGTC H3: max_frac_infectivity_per_viral_barcode_well CGTGACCCCCTCCAAC H3: max_frac_infectivity_per_viral_barcode_well CACGGGCTAATGTCTC H3: max_frac_infectivity_per_viral_barcode_well GAGCTTGCTATGGATC H3: max_frac_infectivity_per_viral_barcode_well GTGCATCCTAGTGACG H3: max_frac_infectivity_per_viral_barcode_well CACCAATCTTCGAACT H3: max_frac_infectivity_per_viral_barcode_well TTTATATCCAACACCA F4: max_frac_infectivity_per_viral_barcode_well GAAGTGCGTATTGAGT F4: max_frac_infectivity_per_viral_barcode_well AGGAAAGAAACTGGAG F4: max_frac_infectivity_per_viral_barcode_well GCCATTTACTGAAGGG F4: max_frac_infectivity_per_viral_barcode_well GTAGAACTGCGGCCCC F4: max_frac_infectivity_per_viral_barcode_well CGGGGACAAGATTGTA F4: max_frac_infectivity_per_viral_barcode_well GCCTTTGCGCGCAGTC F4: max_frac_infectivity_per_viral_barcode_well TTGACTCACCGAATAA F4: max_frac_infectivity_per_viral_barcode_well AAAGCTCTTTTCGTTC F4: max_frac_infectivity_per_viral_barcode_well TAACGTGATTTCTCGA F4: max_frac_infectivity_per_viral_barcode_well TATTAAGAGAAGTGCG F4: max_frac_infectivity_per_viral_barcode_well CGTGACCCCCTCCAAC F4: max_frac_infectivity_per_viral_barcode_well ATAACTGAGGGCATTG F4: max_frac_infectivity_per_viral_barcode_well CACTAGATGTACAGTC F4: max_frac_infectivity_per_viral_barcode_well GCCGCTGCGGCGTGTG F4: max_frac_infectivity_per_viral_barcode_well CTCAAATAATTGGCGC F4: max_frac_infectivity_per_viral_barcode_well CCGCATTAGCGGGAGG F4: max_frac_infectivity_per_viral_barcode_well TCGAGTTAATATGCGC F4: max_frac_infectivity_per_viral_barcode_well GCCGGCGTTAGTGTCA F4: max_frac_infectivity_per_viral_barcode_well ACGCAAATAGACCGAA H5: max_frac_infectivity_per_viral_barcode_well CAAAAGCAGCACGATA C7: max_frac_infectivity_per_viral_barcode_well GAAATCCCCAAATAAC E8: max_frac_infectivity_per_viral_barcode_well GATCACGCAGAAAAAG F8: max_frac_infectivity_per_viral_barcode_well TATCCAAGGGACGGAC G8: max_frac_infectivity_per_viral_barcode_well AACCACCCCAGAGATG F9: max_frac_infectivity_per_viral_barcode_well ATTAGATTATAACGTA E10: max_frac_infectivity_per_viral_barcode_well CCTTTCTCAAAACATA F10: max_frac_infectivity_per_viral_barcode_well CGTACGTATGTCCCAG G10: max_frac_infectivity_per_viral_barcode_well GCCGGCGTTAGTGTCA G10: max_frac_infectivity_per_viral_barcode_well AAAGTAGCAGAGGATT D11: max_frac_infectivity_per_viral_barcode_well CGTTAACGGCCTATCC E11: max_frac_infectivity_per_viral_barcode_well AACACGTAGAACCGCC F11: max_frac_infectivity_per_viral_barcode_well AGTCCTATCCTCAAAT G11: max_frac_infectivity_per_viral_barcode_well barcode_serum_replicates: CACCAATCTTCGAACT SCH_17: min_dilutions_per_barcode_serum_replicate TCGAACGAAGTAGGAG SCH_18: min_dilutions_per_barcode_serum_replicate AAACCCATAAGACCCC SCH_16: goodness_of_fit AAATTCACAATATCCA SCH_16: goodness_of_fit AACAGAAGTCCATGTA SCH_16: goodness_of_fit ACTGTCTAGAAATTTT SCH_16: goodness_of_fit CCCTATGAAATAAGCT SCH_16: goodness_of_fit CCGCATTAGCGGGAGG SCH_16: goodness_of_fit CGTTTTTGGTTCGAGG SCH_16: goodness_of_fit CTATAAACCGTTTGTA SCH_16: goodness_of_fit TACCTGCTGCGGAACG SCH_16: goodness_of_fit TCAATCGGGGGCTAAA SCH_16: goodness_of_fit TTACGAATTTGATTCC SCH_16: goodness_of_fit TTTCACAGAACCTATC SCH_16: goodness_of_fit GACGGGATGGGCACGT SCH_17: goodness_of_fit CGGGGACAAGATTGTA SCH_18: goodness_of_fit AAAGGCGCGCCTTCAA SCH_19: goodness_of_fit AACAGAAGTCCATGTA SCH_19: goodness_of_fit AACCTACGAGACGTAA SCH_19: goodness_of_fit AACTTCCCTGACTGCT SCH_19: goodness_of_fit AACTTCCGTCGCCTGA SCH_19: goodness_of_fit AAGAAGACTTTGTGAT SCH_19: goodness_of_fit AATCGCTGGCACCCGT SCH_19: goodness_of_fit AATGAAACAATCGAAC SCH_19: goodness_of_fit ACAAGATTCGGGGGAC SCH_19: goodness_of_fit ACCAGCAATGAGTTGT SCH_19: goodness_of_fit ACGTATGATTTTCGAG SCH_19: goodness_of_fit ACTCTGGCTCGCTAAT SCH_19: goodness_of_fit AGAAAATCTCAGATAC SCH_19: goodness_of_fit AGACCATCGCACCCAA SCH_19: goodness_of_fit AGCATAGGGATATGTG SCH_19: goodness_of_fit AGTCGTTTAGATAGTT SCH_19: goodness_of_fit AGTGTTGAATAGGCGA SCH_19: goodness_of_fit AGTGTTGGCTTGGTTA SCH_19: goodness_of_fit ATACACGCATGTGCCA SCH_19: goodness_of_fit ATTCCGAATGGGGTAG SCH_19: goodness_of_fit CAAAATCTACGGCGAC SCH_19: goodness_of_fit CACAGACAATAAAAAA SCH_19: goodness_of_fit CATGGGAATTGCCACT SCH_19: goodness_of_fit CATTTCTGATGAATTG SCH_19: goodness_of_fit CCCCCGCTGTTTAAAA SCH_19: goodness_of_fit CCCCTCCTCTAAAGTT SCH_19: goodness_of_fit CCCTTTACGGATCTCT SCH_19: goodness_of_fit CCGCGCACGTTTAGAG SCH_19: goodness_of_fit CCTTGATGCATTCCCG SCH_19: goodness_of_fit CGCACTTTACGAGACA SCH_19: goodness_of_fit CGGACCCTAGATGGTA SCH_19: goodness_of_fit CGGCCAGGGAATCAAA SCH_19: goodness_of_fit CGGTCGGGACTCATCT SCH_19: goodness_of_fit CGTTTTTGGTTCGAGG SCH_19: goodness_of_fit CTAATTTAAGTATCAA SCH_19: goodness_of_fit CTATAAACCGTTTGTA SCH_19: goodness_of_fit CTATATTGCCCGGAAG SCH_19: goodness_of_fit CTATTTAACAGACGTA SCH_19: goodness_of_fit CTCAATGTCGTAGGAT SCH_19: goodness_of_fit CTGAACTTATCTGTGG SCH_19: goodness_of_fit CTGAGGGATTCAACTC SCH_19: goodness_of_fit CTTTTCTAGTACGCTT SCH_19: goodness_of_fit GAAGTACGCTGAATGA SCH_19: goodness_of_fit GAAGTGCGTATTGAGT SCH_19: goodness_of_fit GAAGTGCTGCTGAAGT SCH_19: goodness_of_fit GACGGGATGGGCACGT SCH_19: goodness_of_fit GAGAGCTGCAGAAGCG SCH_19: goodness_of_fit GCAAACAGTGTAGTTG SCH_19: goodness_of_fit GCAGCGTGCCGGTCAT SCH_19: goodness_of_fit GCCGCTGCGGCGTGTG SCH_19: goodness_of_fit GTAAGCAAAGTTGACC SCH_19: goodness_of_fit GTAAGCTTCATGGAGT SCH_19: goodness_of_fit GTCAAGTTACGGATGG SCH_19: goodness_of_fit GTTGCTCCGACACGCC SCH_19: goodness_of_fit TACATACCGACGCAGT SCH_19: goodness_of_fit TACCTGCTGCGGAACG SCH_19: goodness_of_fit TAGCATTGTCGGAAAG SCH_19: goodness_of_fit TATTCCTAACTAGCGA SCH_19: goodness_of_fit TCGTCCGTTGGGAACT SCH_19: goodness_of_fit TCTCAGCTCTTAGCCG SCH_19: goodness_of_fit TGTAATAGGCGTCACA SCH_19: goodness_of_fit TGTGGAGCGCCCTTAC SCH_19: goodness_of_fit TTACGAATTTGATTCC SCH_19: goodness_of_fit TTGCTCCTGAGTAGTA SCH_19: goodness_of_fit TTTCACAGAACCTATC SCH_19: goodness_of_fit TTTCGTGATACTCACA SCH_19: goodness_of_fit AAAGGCGCGCCTTCAA SCH_20: goodness_of_fit AACTTCCCTGACTGCT SCH_20: goodness_of_fit AAGAAGACTTTGTGAT SCH_20: goodness_of_fit AAGAAGCTATAGAAGT SCH_20: goodness_of_fit AAGATTGATTGAAGTT SCH_20: goodness_of_fit AAGCGGTGATGTGATT SCH_20: goodness_of_fit AATCGCTGGCACCCGT SCH_20: goodness_of_fit ACAAGATTCGGGGGAC SCH_20: goodness_of_fit AGACCGCCAGTTTCGT SCH_20: goodness_of_fit AGCATAGGGATATGTG SCH_20: goodness_of_fit AGGAGTATGAAGAGCG SCH_20: goodness_of_fit AGTGTTGGCTTGGTTA SCH_20: goodness_of_fit AGTTCCATAGGCATGG SCH_20: goodness_of_fit ATATAAAAAACTTAGT SCH_20: goodness_of_fit ATGGCCCACGGGCATA SCH_20: goodness_of_fit CAAAATCTACGGCGAC SCH_20: goodness_of_fit CAATTCGCCGTTCCCC SCH_20: goodness_of_fit CCAACACAAAAAATTA SCH_20: goodness_of_fit CCCCTCCTCTAAAGTT SCH_20: goodness_of_fit CCGCATTAGCGGGAGG SCH_20: goodness_of_fit CCGCGCACGTTTAGAG SCH_20: goodness_of_fit CCTTGATGCATTCCCG SCH_20: goodness_of_fit CGCACTTTACGAGACA SCH_20: goodness_of_fit CGGGGACAAGATTGTA SCH_20: goodness_of_fit CGTTTTTGGTTCGAGG SCH_20: goodness_of_fit CTAGCACAGCGTAGGC SCH_20: goodness_of_fit CTATTTAACAGACGTA SCH_20: goodness_of_fit CTCAATGTCGTAGGAT SCH_20: goodness_of_fit CTTTTCTAGTACGCTT SCH_20: goodness_of_fit GAAGTGCGTATTGAGT SCH_20: goodness_of_fit GAATAATAGAACAGAG SCH_20: goodness_of_fit GACGGGATGGGCACGT SCH_20: goodness_of_fit GAGAGCTGCAGAAGCG SCH_20: goodness_of_fit GATCGCCACTGATAAG SCH_20: goodness_of_fit GCAACGAGGTGTAACC SCH_20: goodness_of_fit GCCGCTGCGGCGTGTG SCH_20: goodness_of_fit GTAAGCAAAGTTGACC SCH_20: goodness_of_fit TCGTCCGTTGGGAACT SCH_20: goodness_of_fit TCTTATTAGGCGGCAT SCH_20: goodness_of_fit TGATCTGTGACATTGC SCH_20: goodness_of_fit TGTAATAGGCGTCACA SCH_20: goodness_of_fit TTTCACAGAACCTATC SCH_20: goodness_of_fit TTTCAGCGTTGTTTTG SCH_20: goodness_of_fit AAGCGGTGATGTGATT SCH_21: goodness_of_fit AGCGACATCGCCCTTT SCH_21: goodness_of_fit CAATTCGCCGTTCCCC SCH_21: goodness_of_fit CCCCCGCTGTTTAAAA SCH_21: goodness_of_fit CCGCGCACGTTTAGAG SCH_21: goodness_of_fit CGTTCAGCGATAACGG SCH_21: goodness_of_fit CGTTTTTGGTTCGAGG SCH_21: goodness_of_fit GAAGTACGCTGAATGA SCH_21: goodness_of_fit GCCATTTACTGAAGGG SCH_21: goodness_of_fit GTAGATACTAGGACCA SCH_21: goodness_of_fit GTGAGCGAGAAAAGCA SCH_21: goodness_of_fit TATTCCTAACTAGCGA SCH_21: goodness_of_fit TTGACTCACCGAATAA SCH_21: goodness_of_fit TTTCACAGAACCTATC SCH_21: goodness_of_fit AAATTCACAATATCCA SCH_22: goodness_of_fit AACCACCCCAGAGATG SCH_22: goodness_of_fit AACCGTACCGCGTTTA SCH_22: goodness_of_fit AACGGTTCCGACTAAG SCH_22: goodness_of_fit AACTGCGTTCATCGAT SCH_22: goodness_of_fit AACTTCCCTGACTGCT SCH_22: goodness_of_fit AACTTCCGTCGCCTGA SCH_22: goodness_of_fit AAGAAGACTTTGTGAT SCH_22: goodness_of_fit AAGAAGCTATAGAAGT SCH_22: goodness_of_fit AAGATTGATTGAAGTT SCH_22: goodness_of_fit AAGCCCAGCGGGTGAT SCH_22: goodness_of_fit AAGCGGTGATGTGATT SCH_22: goodness_of_fit AATGAAACAATCGAAC SCH_22: goodness_of_fit ACCGTTGTACACACCA SCH_22: goodness_of_fit ACGTATGATTTTCGAG SCH_22: goodness_of_fit ACGTGTCTCCGAGCAA SCH_22: goodness_of_fit ACTACGAGGCTACGTA SCH_22: goodness_of_fit AGACCATCGCACCCAA SCH_22: goodness_of_fit AGCATAGGGATATGTG SCH_22: goodness_of_fit AGCCCATGCTGGGGAT SCH_22: goodness_of_fit AGTCGTTTAGATAGTT SCH_22: goodness_of_fit AGTGTTGGCTTGGTTA SCH_22: goodness_of_fit ATAACGTTTGTGCAAA SCH_22: goodness_of_fit ATACACGCATGTGCCA SCH_22: goodness_of_fit ATATAAAAAACTTAGT SCH_22: goodness_of_fit ATGGCCCACGGGCATA SCH_22: goodness_of_fit ATTAGATTATAACGTA SCH_22: goodness_of_fit ATTTACTCATTATACG SCH_22
: goodness_of_fit CAAAATCTACGGCGAC SCH_22: goodness_of_fit CAATTCGCCGTTCCCC SCH_22: goodness_of_fit CACCGCGCCGAGCACC SCH_22: goodness_of_fit CAGAACCTCGTTGTCT SCH_22: goodness_of_fit CCAACACAAAAAATTA SCH_22: goodness_of_fit CCCTATGAAATAAGCT SCH_22: goodness_of_fit CCGCGCACGTTTAGAG SCH_22: goodness_of_fit CCTGGGTTAAGTTGTG SCH_22: goodness_of_fit CCTTGATGCATTCCCG SCH_22: goodness_of_fit CGAAAACATTACAAAT SCH_22: goodness_of_fit CGCACTTTACGAGACA SCH_22: goodness_of_fit CGGGAATCTCCCATAC SCH_22: goodness_of_fit CGGGGACAAGATTGTA SCH_22: goodness_of_fit CGTACGTATGTCCCAG SCH_22: goodness_of_fit CGTTTTTGGTTCGAGG SCH_22: goodness_of_fit CTATAAACCGTTTGTA SCH_22: goodness_of_fit CTATTTAACAGACGTA SCH_22: goodness_of_fit CTGAACTTATCTGTGG SCH_22: goodness_of_fit GAATAATAGAACAGAG SCH_22: goodness_of_fit GAGAGCTGCAGAAGCG SCH_22: goodness_of_fit GATCGCCACTGATAAG SCH_22: goodness_of_fit GCAACGAGGTGTAACC SCH_22: goodness_of_fit GCCGCTGCGGCGTGTG SCH_22: goodness_of_fit GGTTAACTTTGGAAGC SCH_22: goodness_of_fit GTAAGCAAAGTTGACC SCH_22: goodness_of_fit GTAAGCTTCATGGAGT SCH_22: goodness_of_fit GTAATTCGCATGCGGA SCH_22: goodness_of_fit GTCCGTCAGCATAAAC SCH_22: goodness_of_fit GTGAGCGAGAAAAGCA SCH_22: goodness_of_fit GTTATTATGACTTCAT SCH_22: goodness_of_fit GTTGCTCCGACACGCC SCH_22: goodness_of_fit TAAAAAGCCTCCATGA SCH_22: goodness_of_fit TACATACCGACGCAGT SCH_22: goodness_of_fit TACCTGCTGCGGAACG SCH_22: goodness_of_fit TCACGACTCGACTAAC SCH_22: goodness_of_fit TCATGGGTGTACGAGA SCH_22: goodness_of_fit TCGTCGCACTACTGCT SCH_22: goodness_of_fit TCTTATTAGGCGGCAT SCH_22: goodness_of_fit TGAGTTCATAGCTCCA SCH_22: goodness_of_fit TGGTCCGCTTCATGCT SCH_22: goodness_of_fit TTACGAATTTGATTCC SCH_22: goodness_of_fit TTCTGTCCAGACTCGT SCH_22: goodness_of_fit TTGCAATTGAAACATA SCH_22: goodness_of_fit TTTATATCCAACACCA SCH_22: goodness_of_fit TTTCACAGAACCTATC SCH_22: goodness_of_fit TTTCGTGATACTCACA SCH_22: goodness_of_fit CCGCGCACGTTTAGAG SCH_23: goodness_of_fit GAAGTACGCTGAATGA SCH_23: goodness_of_fit AGCTGAATTAAGTATG SCH_24: goodness_of_fit ATTTACTCATTATACG SCH_24: goodness_of_fit GTAATTCGCATGCGGA SCH_24: goodness_of_fit TCTTAGAGTGAACGAT SCH_24: goodness_of_fit TTGACTCACCGAATAA SCH_24: goodness_of_fit AACAGAAGTCCATGTA SCH_25: goodness_of_fit AACTGCGTTCATCGAT SCH_25: goodness_of_fit AACTTCCCTGACTGCT SCH_25: goodness_of_fit AACTTCCGTCGCCTGA SCH_25: goodness_of_fit AAGAAGACTTTGTGAT SCH_25: goodness_of_fit AAGGGGCCTCATAATG SCH_25: goodness_of_fit AATCGCTGGCACCCGT SCH_25: goodness_of_fit AATGAAACAATCGAAC SCH_25: goodness_of_fit ACAAGATTCGGGGGAC SCH_25: goodness_of_fit ACCGTTGTACACACCA SCH_25: goodness_of_fit ACTACGAGGCTACGTA SCH_25: goodness_of_fit ACTCTGGCTCGCTAAT SCH_25: goodness_of_fit AGCATAGGGATATGTG SCH_25: goodness_of_fit AGGAGTATGAAGAGCG SCH_25: goodness_of_fit AGTGTTGAATAGGCGA SCH_25: goodness_of_fit ATACACGCATGTGCCA SCH_25: goodness_of_fit ATATAAAAAACTTAGT SCH_25: goodness_of_fit ATGGCCCACGGGCATA SCH_25: goodness_of_fit ATTATCATATCTAATA SCH_25: goodness_of_fit CAAAATCTACGGCGAC SCH_25: goodness_of_fit CACCGCGCCGAGCACC SCH_25: goodness_of_fit CAGATAGTGATGAACA SCH_25: goodness_of_fit CATGTGGAGCCCAACA SCH_25: goodness_of_fit CCCTATGAAATAAGCT SCH_25: goodness_of_fit CCCTTTACGGATCTCT SCH_25: goodness_of_fit CCGCGCACGTTTAGAG SCH_25: goodness_of_fit CCTTGATGCATTCCCG SCH_25: goodness_of_fit CGCACTTTACGAGACA SCH_25: goodness_of_fit CGGGGACAAGATTGTA SCH_25: goodness_of_fit CGTTAACGGCCTATCC SCH_25: goodness_of_fit CGTTTTTGGTTCGAGG SCH_25: goodness_of_fit CTAGCACAGCGTAGGC SCH_25: goodness_of_fit CTATAAACCGTTTGTA SCH_25: goodness_of_fit CTATATTGCCCGGAAG SCH_25: goodness_of_fit CTATTTAACAGACGTA SCH_25: goodness_of_fit CTCAATGTCGTAGGAT SCH_25: goodness_of_fit CTTTTCTAGTACGCTT SCH_25: goodness_of_fit GAAGTACGCTGAATGA SCH_25: goodness_of_fit GAGAGCTGCAGAAGCG SCH_25: goodness_of_fit GCAAACAGTGTAGTTG SCH_25: goodness_of_fit GTAATTCGCATGCGGA SCH_25: goodness_of_fit GTTGCTCCGACACGCC SCH_25: goodness_of_fit TAAAAAGCCTCCATGA SCH_25: goodness_of_fit TACCAATGTCATTTGA SCH_25: goodness_of_fit TACTGATAACCCTGCG SCH_25: goodness_of_fit TATCCAAGGGACGGAC SCH_25: goodness_of_fit TCGATTACTAGCCGGA SCH_25: goodness_of_fit TCTCAGCTCTTAGCCG SCH_25: goodness_of_fit TCTTATTAGGCGGCAT SCH_25: goodness_of_fit TGTAATAGGCGTCACA SCH_25: goodness_of_fit TGTGGAGCGCCCTTAC SCH_25: goodness_of_fit TTACGAATTTGATTCC SCH_25: goodness_of_fit AAAGGCGCGCCTTCAA SCH_26: goodness_of_fit AAATTCACAATATCCA SCH_26: goodness_of_fit AACTGCGTTCATCGAT SCH_26: goodness_of_fit AACTTCCCTGACTGCT SCH_26: goodness_of_fit AACTTCCGTCGCCTGA SCH_26: goodness_of_fit AAGAAGACTTTGTGAT SCH_26: goodness_of_fit AAGCGGTGATGTGATT SCH_26: goodness_of_fit AAGTATTGCTACACAT SCH_26: goodness_of_fit AATGAAACAATCGAAC SCH_26: goodness_of_fit ACAAGATTCGGGGGAC SCH_26: goodness_of_fit ACCAGCAATGAGTTGT SCH_26: goodness_of_fit ACCGAATGAATCATCC SCH_26: goodness_of_fit ACGTATGATTTTCGAG SCH_26: goodness_of_fit ACTACGAGGCTACGTA SCH_26: goodness_of_fit ACTGTCTAGAAATTTT SCH_26: goodness_of_fit AGAAAATCTCAGATAC SCH_26: goodness_of_fit AGACCATCGCACCCAA SCH_26: goodness_of_fit AGACCGCCAGTTTCGT SCH_26: goodness_of_fit AGCATAGGGATATGTG SCH_26: goodness_of_fit AGCCCATGCTGGGGAT SCH_26: goodness_of_fit AGCGACATCGCCCTTT SCH_26: goodness_of_fit AGGAGTATGAAGAGCG SCH_26: goodness_of_fit AGTGTTGAATAGGCGA SCH_26: goodness_of_fit AGTGTTGGCTTGGTTA SCH_26: goodness_of_fit AGTTCCATAGGCATGG SCH_26: goodness_of_fit ATAACGTTTGTGCAAA SCH_26: goodness_of_fit ATACACGCATGTGCCA SCH_26: goodness_of_fit ATATAAAAAACTTAGT SCH_26: goodness_of_fit ATGGCCCACGGGCATA SCH_26: goodness_of_fit ATTAGATTATAACGTA SCH_26: goodness_of_fit ATTATCATATCTAATA SCH_26: goodness_of_fit ATTCCGAATGGGGTAG SCH_26: goodness_of_fit CAAAATCTACGGCGAC SCH_26: goodness_of_fit CACCATCAGCACCTAG SCH_26: goodness_of_fit CAGATAGTGATGAACA SCH_26: goodness_of_fit CAGGCTCTAGAGCTCT SCH_26: goodness_of_fit CCAACACAAAAAATTA SCH_26: goodness_of_fit CCCCCGCTGTTTAAAA SCH_26: goodness_of_fit CCCCTCCTCTAAAGTT SCH_26: goodness_of_fit CCCTATGAAATAAGCT SCH_26: goodness_of_fit CCCTGCGCGGCTCGGG SCH_26: goodness_of_fit CCCTTTACGGATCTCT SCH_26: goodness_of_fit CCGCGCACGTTTAGAG SCH_26: goodness_of_fit CCTTGATGCATTCCCG SCH_26: goodness_of_fit CGCACTTTACGAGACA SCH_26: goodness_of_fit CGCAGCATTGGTCGCC SCH_26: goodness_of_fit CGGACCCTAGATGGTA SCH_26: goodness_of_fit CGGGGACAAGATTGTA SCH_26: goodness_of_fit CGGTCGGGACTCATCT SCH_26: goodness_of_fit CGTACAGTGTAATCGA SCH_26: goodness_of_fit CGTTTTTGGTTCGAGG SCH_26: goodness_of_fit CTAATTTAAGTATCAA SCH_26: goodness_of_fit CTAGCACAGCGTAGGC SCH_26: goodness_of_fit CTATAAACCGTTTGTA SCH_26: goodness_of_fit CTATTTAACAGACGTA SCH_26: goodness_of_fit CTCCTAGGGGACGATT SCH_26: goodness_of_fit CTGAACTTATCTGTGG SCH_26: goodness_of_fit CTGAGGGATTCAACTC SCH_26: goodness_of_fit GAAGTACGCTGAATGA SCH_26: goodness_of_fit GAATAATAGAACAGAG SCH_26: goodness_of_fit GACGGGATGGGCACGT SCH_26: goodness_of_fit GAGGGGTAGAGATACG SCH_26: goodness_of_fit GATCGCCACTGATAAG SCH_26: goodness_of_fit GCAACGAGGTGTAACC SCH_26: goodness_of_fit GCCATTTACTGAAGGG SCH_26: goodness_of_fit GCCTTTGCGCGCAGTC SCH_26: goodness_of_fit GGTTAACTTTGGAAGC SCH_26: goodness_of_fit GTAAGCAAAGTTGACC SCH_26: goodness_of_fit GTAAGCTTCATGGAGT SCH_26: goodness_of_fit GTCAAGTTACGGATGG SCH_26: goodness_of_fit GTCCGTCAGCATAAAC SCH_26: goodness_of_fit GTCGCCGCTAATCCGA SCH_26: goodness_of_fit GTTGCTCCGACACGCC SCH_26: goodness_of_fit TAAAAAGCCTCCATGA SCH_26: goodness_of_fit TAATAAGCCAGCAAGA SCH_26: goodness_of_fit TACCAATGTCATTTGA SCH_26: goodness_of_fit TACCTGCTGCGGAACG SCH_26: goodness_of_fit TACTAATGCCGTTGTC SCH_26: goodness_of_fit TACTAGCAATAAAATC SCH_26: goodness_of_fit TAGCATTGTCGGAAAG SCH_26: goodness_of_fit TATCCAAGGGACGGAC SCH_26: goodness_of_fit TATTCCTAACTAGCGA SCH_26: goodness_of_fit TCAATCGGGGGCTAAA SCH_26: goodness_of_fit TCATGGGTGTACGAGA SCH_26: goodness_of_fit TCGTCCGTTGGGAACT SCH_26: goodness_of_fit TCTTAGAGTGAACGAT SCH_26: goodness_of_fit TCTTATTAGGCGGCAT SCH_26: goodness_of_fit TGAGTTCATAGCTCCA SCH_26: goodness_of_fit TGGTCCGCTTCATGCT SCH_26: goodness_of_fit TGTAATAGGCGTCACA SCH_26: goodness_of_fit TGTGGAGCGCCCTTAC SCH_26: goodness_of_fit TGTTGTAATCTGAATA SCH_26: goodness_of_fit TTACGAATTTGATTCC SCH_26: goodness_of_fit TTCTGTCCAGACTCGT SCH_26: goodness_of_fit TTGACTCACCGAATAA SCH_26: goodness_of_fit TTGCAATTGAAACATA SCH_26: goodness_of_fit TTGCTCCTGAGTAGTA SCH_26: goodness_of_fit TTTATATCCAACACCA SCH_26: goodness_of_fit TTTCACAGAACCTATC SCH_26: goodness_of_fit TTTCGTGATACTCACA SCH_26: goodness_of_fit serum_replicates: {}