In [1]:
######## snakemake preamble start (automatically inserted, do not edit) ########
import sys;sys.path.extend(['/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/lib/python3.13/site-packages', '/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025/seqneut-pipeline', '/fh/fast/bloom_j/computational_notebooks/jbloom/2025/flu-seqneut-2025', '/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/bin', '/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/lib/python3.13', '/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/lib/python3.13/lib-dynload', '/fh/fast/bloom_j/software/miniforge3/envs/seqneut-pipeline/lib/python3.13/site-packages', '/home/jbloom/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpd1rhxp5w/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\x95\xcfw\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/plates/plate1-2/qc_drops.yml\x94\x8c$results/plates/plate2-2/qc_drops.yml\x94\x8c"results/plates/plate3/qc_drops.yml\x94\x8c"results/plates/plate4/qc_drops.yml\x94\x8c"results/plates/plate6/qc_drops.yml\x94\x8c&results/plates/plate7_FCI/qc_drops.yml\x94\x8c&results/plates/plate7_SCH/qc_drops.yml\x94\x8c"results/plates/plate8/qc_drops.yml\x94\x8c"results/plates/plate9/qc_drops.yml\x94\x8c#results/plates/plate10/qc_drops.yml\x94\x8c#results/plates/plate11/qc_drops.yml\x94\x8c\'results/plates/plate12_SCH/qc_drops.yml\x94\x8c)results/plates/plate12_EPIHK/qc_drops.yml\x94\x8c#results/plates/plate13/qc_drops.yml\x94\x8c#results/plates/plate14/qc_drops.yml\x94\x8c#results/plates/plate15/qc_drops.yml\x94\x8c#results/plates/plate16/qc_drops.yml\x94\x8c#results/plates/plate17/qc_drops.yml\x94\x8c#results/plates/plate18/qc_drops.yml\x94\x8c#results/plates/plate19/qc_drops.yml\x94\x8c#results/plates/plate20/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_1/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_10/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_11/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_12/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_13/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_14/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_15/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_16/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_17/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_18/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_19/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_2/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_20/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_21/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_22/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_23/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_24/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_25/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_26/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_27/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_28/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_29/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_3/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_30/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_31/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_32/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_33/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_34/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_35/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_36/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_37/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_38/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_39/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_4/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_40/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_41/qc_drops.yml\x94\x8c(results/sera/EPIHK_EPIHK_42/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_5/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_6/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_7/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_8/qc_drops.yml\x94\x8c\'results/sera/EPIHK_EPIHK_9/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_1/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_10/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_11/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_12/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_13/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_14/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_15/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_16/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_17/qc_drops.yml\x94\x8c$results/sera/FCI_FCI_18/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_2/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_3/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_4/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_5/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_6/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_7/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_8/qc_drops.yml\x94\x8c#results/sera/FCI_FCI_9/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_1/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_10/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_11/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_12/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_13/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_14/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_15/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_16/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_17/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_18/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_19/qc_drops.yml\x94\x8c*results/sera/NIID_NIID_1_post/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_2/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_20/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_21/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_22/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_23/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_24/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_25/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_26/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_27/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_28/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_29/qc_drops.yml\x94\x8c*results/sera/NIID_NIID_2_post/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_3/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_30/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_31/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_32/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_33/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_34/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_35/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_36/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_37/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_38/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_39/qc_drops.yml\x94\x8c*results/sera/NIID_NIID_3_post/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_4/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_40/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_41/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_42/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_43/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_44/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_45/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_46/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_47/qc_drops.yml\x94\x8c&results/sera/NIID_NIID_48/qc_drops.yml\x94\x8c*results/sera/NIID_NIID_4_post/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_5/qc_drops.yml\x94\x8c*results/sera/NIID_NIID_5_post/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_6/qc_drops.yml\x94\x8c*results/sera/NIID_NIID_6_post/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_7/qc_drops.yml\x94\x8c*results/sera/NIID_NIID_7_post/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_8/qc_drops.yml\x94\x8c%results/sera/NIID_NIID_9/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_1/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_10/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_11/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_12/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_13/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_14/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_15/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_16/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_17/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_18/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_19/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_2/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_20/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_21/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_22/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_23/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_24/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_25/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_26/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_27/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_28/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_29/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_3/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_30/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_31/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_32/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_33/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_34/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_35/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_36/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_37/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_38/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_39/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_4/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_40/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_41/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_42/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_43/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_44/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_45/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_46/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_47/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_48/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_49/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_5/qc_drops.yml\x94\x8c$results/sera/SCH_SCH_50/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_6/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_7/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_8/qc_drops.yml\x94\x8c#results/sera/SCH_SCH_9/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-1/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-10/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-11/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-12/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-13/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-14/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-15/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-16/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-17/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-18/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-19/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-2/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-20/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-21/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-22/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-23/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-24/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-25/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-26/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-27/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-28/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-29/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-3/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-30/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-31/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-32/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-33/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-34/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-35/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-36/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-37/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-38/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-39/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-4/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-40/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-41/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-42/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-43/qc_drops.yml\x94\x8c&results/sera/UWMC_UWMC-44/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-5/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-6/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-7/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-8/qc_drops.yml\x94\x8c%results/sera/UWMC_UWMC-9/qc_drops.yml\x94e}\x94(\x8c\x06_names\x94}\x94(\x8c\x0eplate_qc_drops\x94K\x00K\x15\x86\x94\x8c\x14groups_sera_qc_drops\x94K\x15K\xe6\x86\x94u\x8c\x12_allowed_overrides\x94]\x94(\x8c\x05index\x94\x8c\x04sort\x94eh\xf9h\x06\x8c\x0eAttributeGuard\x94\x93\x94)\x81\x94}\x94\x8c\x04name\x94h\xf9sbh\xfah\xfc)\x81\x94}\x94h\xffh\xfasbh\xf3h\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\x1ee}\x94(h\xf1}\x94h\xf7]\x94(h\xf9h\xfaeh\xf9h\xfc)\x81\x94}\x94h\xffh\xf9sbh\xfah\xfc)\x81\x94}\x94h\xffh\xfasbubh\xf5j\x03\x01\x00\x00)\x81\x94(h\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`hahbhchdhehfhghhhihjhkhlhmhnhohphqhrhshthuhvhwhxhyhzh{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\xc9h\xcah\xcbh\xcch\xcdh\xceh\xcfh\xd0h\xd1h\xd2h\xd3h\xd4h\xd5h\xd6h\xd7h\xd8h\xd9h\xdah\xdbh\xdch\xddh\xdeh\xdfh\xe0h\xe1h\xe2h\xe3h\xe4h\xe5h\xe6h\xe7h\xe8h\xe9h\xeah\xebh\xech\xedh\xeeh\xefe}\x94(h\xf1}\x94h\xf7]\x94(h\xf9h\xfaeh\xf9h\xfc)\x81\x94}\x94h\xffh\xf9sbh\xfah\xfc)\x81\x94}\x94h\xffh\xfasbubub\x8c\x06output\x94h\x06\x8c\x0bOutputFiles\x94\x93\x94)\x81\x94(\x8c#results/qc_drops/plate_qc_drops.yml\x94\x8c%results/qc_drops/barcode_qc_drops.yml\x94\x8c)results/qc_drops/groups_sera_qc_drops.yml\x94e}\x94(h\xf1}\x94(h\xf3K\x00N\x86\x94\x8c\x10barcode_qc_drops\x94K\x01N\x86\x94h\xf5K\x02N\x86\x94uh\xf7]\x94(h\xf9h\xfaeh\xf9h\xfc)\x81\x94}\x94h\xffh\xf9sbh\xfah\xfc)\x81\x94}\x94h\xffh\xfasbh\xf3j\x18\x01\x00\x00j\x1e\x01\x00\x00j\x19\x01\x00\x00h\xf5j\x1a\x01\x00\x00ub\x8c\r_params_store\x94h\x06\x8c\x06Params\x94\x93\x94)\x81\x94(]\x94(\x8c\x08plate1-2\x94\x8c\x08plate2-2\x94\x8c\x06plate3\x94\x8c\x06plate4\x94\x8c\x06plate6\x94\x8c\nplate7_FCI\x94\x8c\nplate7_SCH\x94\x8c\x06plate8\x94\x8c\x06plate9\x94\x8c\x07plate10\x94\x8c\x07plate11\x94\x8c\x0bplate12_SCH\x94\x8c\rplate12_EPIHK\x94\x8c\x07plate13\x94\x8c\x07plate14\x94\x8c\x07plate15\x94\x8c\x07plate16\x94\x8c\x07plate17\x94\x8c\x07plate18\x94\x8c\x07plate19\x94\x8c\x07plate20\x94e]\x94(\x8c\x05EPIHK\x94\x8c\x07EPIHK_1\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_10\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_11\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_12\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_13\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_14\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_15\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_16\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_17\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_18\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_19\x94\x86\x94jA\x01\x00\x00\x8c\x07EPIHK_2\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_20\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_21\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_22\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_23\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_24\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_25\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_26\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_27\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_28\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_29\x94\x86\x94jA\x01\x00\x00\x8c\x07EPIHK_3\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_30\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_31\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_32\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_33\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_34\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_35\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_36\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_37\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_38\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_39\x94\x86\x94jA\x01\x00\x00\x8c\x07EPIHK_4\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_40\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_41\x94\x86\x94jA\x01\x00\x00\x8c\x08EPIHK_42\x94\x86\x94jA\x01\x00\x00\x8c\x07EPIHK_5\x94\x86\x94jA\x01\x00\x00\x8c\x07EPIHK_6\x94\x86\x94jA\x01\x00\x00\x8c\x07EPIHK_7\x94\x86\x94jA\x01\x00\x00\x8c\x07EPIHK_8\x94\x86\x94jA\x01\x00\x00\x8c\x07EPIHK_9\x94\x86\x94\x8c\x03FCI\x94\x8c\x05FCI_1\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_10\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_11\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_12\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_13\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_14\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_15\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_16\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_17\x94\x86\x94j\x96\x01\x00\x00\x8c\x06FCI_18\x94\x86\x94j\x96\x01\x00\x00\x8c\x05FCI_2\x94\x86\x94j\x96\x01\x00\x00\x8c\x05FCI_3\x94\x86\x94j\x96\x01\x00\x00\x8c\x05FCI_4\x94\x86\x94j\x96\x01\x00\x00\x8c\x05FCI_5\x94\x86\x94j\x96\x01\x00\x00\x8c\x05FCI_6\x94\x86\x94j\x96\x01\x00\x00\x8c\x05FCI_7\x94\x86\x94j\x96\x01\x00\x00\x8c\x05FCI_8\x94\x86\x94j\x96\x01\x00\x00\x8c\x05FCI_9\x94\x86\x94\x8c\x04NIID\x94\x8c\x06NIID_1\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_10\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_11\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_12\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_13\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_14\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_15\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_16\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_17\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_18\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_19\x94\x86\x94j\xbb\x01\x00\x00\x8c\x0bNIID_1_post\x94\x86\x94j\xbb\x01\x00\x00\x8c\x06NIID_2\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_20\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_21\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_22\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_23\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_24\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_25\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_26\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_27\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_28\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_29\x94\x86\x94j\xbb\x01\x00\x00\x8c\x0bNIID_2_post\x94\x86\x94j\xbb\x01\x00\x00\x8c\x06NIID_3\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_30\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_31\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_32\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_33\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_34\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_35\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_36\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_37\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_38\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_39\x94\x86\x94j\xbb\x01\x00\x00\x8c\x0bNIID_3_post\x94\x86\x94j\xbb\x01\x00\x00\x8c\x06NIID_4\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_40\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_41\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_42\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_43\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_44\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_45\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_46\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_47\x94\x86\x94j\xbb\x01\x00\x00\x8c\x07NIID_48\x94\x86\x94j\xbb\x01\x00\x00\x8c\x0bNIID_4_post\x94\x86\x94j\xbb\x01\x00\x00\x8c\x06NIID_5\x94\x86\x94j\xbb\x01\x00\x00\x8c\x0bNIID_5_post\x94\x86\x94j\xbb\x01\x00\x00\x8c\x06NIID_6\x94\x86\x94j\xbb\x01\x00\x00\x8c\x0bNIID_6_post\x94\x86\x94j\xbb\x01\x00\x00\x8c\x06NIID_7\x94\x86\x94j\xbb\x01\x00\x00\x8c\x0bNIID_7_post\x94\x86\x94j\xbb\x01\x00\x00\x8c\x06NIID_8\x94\x86\x94j\xbb\x01\x00\x00\x8c\x06NIID_9\x94\x86\x94\x8c\x03SCH\x94\x8c\x05SCH_1\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_10\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_11\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_12\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_13\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_14\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_15\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_16\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_17\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_18\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_19\x94\x86\x94j*\x02\x00\x00\x8c\x05SCH_2\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_20\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_21\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_22\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_23\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_24\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_25\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_26\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_27\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_28\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_29\x94\x86\x94j*\x02\x00\x00\x8c\x05SCH_3\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_30\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_31\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_32\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_33\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_34\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_35\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_36\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_37\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_38\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_39\x94\x86\x94j*\x02\x00\x00\x8c\x05SCH_4\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_40\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_41\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_42\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_43\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_44\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_45\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_46\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_47\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_48\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_49\x94\x86\x94j*\x02\x00\x00\x8c\x05SCH_5\x94\x86\x94j*\x02\x00\x00\x8c\x06SCH_50\x94\x86\x94j*\x02\x00\x00\x8c\x05SCH_6\x94\x86\x94j*\x02\x00\x00\x8c\x05SCH_7\x94\x86\x94j*\x02\x00\x00\x8c\x05SCH_8\x94\x86\x94j*\x02\x00\x00\x8c\x05SCH_9\x94\x86\x94\x8c\x04UWMC\x94\x8c\x06UWMC-1\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-10\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-11\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-12\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-13\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-14\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-15\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-16\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-17\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-18\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-19\x94\x86\x94j\x8f\x02\x00\x00\x8c\x06UWMC-2\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-20\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-21\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-22\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-23\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-24\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-25\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-26\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-27\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-28\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-29\x94\x86\x94j\x8f\x02\x00\x00\x8c\x06UWMC-3\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-30\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-31\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-32\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-33\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-34\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-35\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-36\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-37\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-38\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-39\x94\x86\x94j\x8f\x02\x00\x00\x8c\x06UWMC-4\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-40\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-41\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-42\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-43\x94\x86\x94j\x8f\x02\x00\x00\x8c\x07UWMC-44\x94\x86\x94j\x8f\x02\x00\x00\x8c\x06UWMC-5\x94\x86\x94j\x8f\x02\x00\x00\x8c\x06UWMC-6\x94\x86\x94j\x8f\x02\x00\x00\x8c\x06UWMC-7\x94\x86\x94j\x8f\x02\x00\x00\x8c\x06UWMC-8\x94\x86\x94j\x8f\x02\x00\x00\x8c\x06UWMC-9\x94\x86\x94ee}\x94(h\xf1}\x94(\x8c\x06plates\x94K\x00N\x86\x94\x8c\x0bgroups_sera\x94K\x01N\x86\x94uh\xf7]\x94(h\xf9h\xfaeh\xf9h\xfc)\x81\x94}\x94h\xffh\xf9sbh\xfah\xfc)\x81\x94}\x94h\xffh\xfasbj\xea\x02\x00\x00j*\x01\x00\x00j\xec\x02\x00\x00j@\x01\x00\x00ub\x8c\r_params_types\x94}\x94\x8c\twildcards\x94h\x06\x8c\tWildcards\x94\x93\x94)\x81\x94}\x94(h\xf1}\x94h\xf7]\x94(h\xf9h\xfaeh\xf9h\xfc)\x81\x94}\x94h\xffh\xf9sbh\xfah\xfc)\x81\x94}\x94h\xffh\xfasbub\x8c\x07threads\x94K\x01\x8c\tresources\x94h\x06\x8c\tResources\x94\x93\x94)\x81\x94(K\x01K\x01\x8c\x15/loc/scratch/31392017\x94e}\x94(h\xf1}\x94(\x8c\x06_cores\x94K\x00N\x86\x94\x8c\x06_nodes\x94K\x01N\x86\x94\x8c\x06tmpdir\x94K\x02N\x86\x94uh\xf7]\x94(h\xf9h\xfaeh\xf9h\xfc)\x81\x94}\x94h\xffh\xf9sbh\xfah\xfc)\x81\x94}\x94h\xffh\xfasbj\x08\x03\x00\x00K\x01j\n\x03\x00\x00K\x01j\x0c\x03\x00\x00j\x05\x03\x00\x00ub\x8c\x03log\x94h\x06\x8c\x03Log\x94\x93\x94)\x81\x94\x8c)results/qc_drops/aggregate_qc_drops.ipynb\x94a}\x94(h\xf1}\x94\x8c\x08notebook\x94K\x00N\x86\x94sh\xf7]\x94(h\xf9h\xfaeh\xf9h\xfc)\x81\x94}\x94h\xffh\xf9sbh\xfah\xfc)\x81\x94}\x94h\xffh\xfasbj\x1a\x03\x00\x00j\x17\x03\x00\x00ub\x8c\x06config\x94}\x94(\x8c\x08subtypes\x94]\x94(\x8c\x04H1N1\x94\x8c\x04H3N2\x94e\x8c\x17circulating_strain_type\x94\x8c\x10circulating_2025\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\x94XK\x03\x00\x00# Near real-time mapping of the human neutralizing antibody landscape to influenza virus to inform vaccine-strain selection in September 2025\n\nExperiments and analysis performed by Caroline Kikawa in the [Bloom lab](https://jbloomlab.github.io/) using the sequencing-based neutralization assay described in [Loes et al (2024)](https://journals.asm.org/doi/10.1128/jvi.00689-24) and [Kikawa et al (2025)](https://elifesciences.org/reviewed-preprints/106811).\n\nBriefly, this study measured neutralization titers to influenza viruses with HA from seasonal H3N2 and H1N1 viruses representative of those circulating in the summer of 2025 against a set of human sera collected in late 2024 to spring of 2025.\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\x08designed\x94\x8cDdata/viral_libraries/flu-seqneut-2025-barcode-to-strain_designed.csv\x94\x8c\x06actual\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(\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\x94u\x8c#default_process_plate_qc_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%default_process_plate_curvefit_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!default_process_plate_curvefit_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\x16default_serum_titer_as\x94\x8c\x08midpoint\x94\x8c\x1bdefault_serum_qc_thresholds\x94}\x94(\x8c\x0emin_replicates\x94K\x01\x8c\x1bmax_fold_change_from_median\x94K\x06\x8c\x11viruses_ignore_qc\x94]\x94u\x8c\x16sera_override_defaults\x94}\x94\x8c\x06plates\x94}\x94(j+\x01\x00\x00}\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\x06actual\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(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uuj,\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c#data/plates/2025-08-11_plate2-2.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uuj-\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-11_plate3.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uuj.\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x04UWMC\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-11_plate4.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GTCTAA\x94\x8c\x12upstream2_mismatch\x94K\x01uuj/\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x03FCI\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-12_plate6.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uuj0\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x03FCI\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c%data/plates/2025-08-12_plate7_FCI.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uuj1\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c%data/plates/2025-08-12_plate7_SCH.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uuj2\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-12_plate8.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uuj3\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/2025-08-13_plate9.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GTCTAA\x94\x8c\x12upstream2_mismatch\x94K\x01uuj4\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-13_plate10.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ACGCTG\x94\x8c\x12upstream2_mismatch\x94K\x01uuj5\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-13_plate11.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TATAGC\x94\x8c\x12upstream2_mismatch\x94K\x01uuj6\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c&data/plates/2025-08-13_plate12_SCH.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CGAGCT\x94\x8c\x12upstream2_mismatch\x94K\x01uuj7\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\r\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c(data/plates/2025-08-13_plate12_EPIHK.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CGAGCT\x94\x8c\x12upstream2_mismatch\x94K\x01uuj8\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-18_plate13.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuj9\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-18_plate14.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uuj:\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x05EPIHK\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-18_plate15.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uuj;\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-18_plate16.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uuj<\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-20_plate17.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GTCTAA\x94\x8c\x12upstream2_mismatch\x94K\x01uuj=\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-20_plate18.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ACGCTG\x94\x8c\x12upstream2_mismatch\x94K\x01uuj>\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-20_plate19.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TATAGC\x94\x8c\x12upstream2_mismatch\x94K\x01uuj?\x01\x00\x00}\x94(\x8c\x05group\x94\x8c\x04NIID\x94\x8c\x04date\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x06actual\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/2025-08-20_plate20.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(je\x03\x00\x00M\xf4\x01jf\x03\x00\x00G?tz\xe1G\xae\x14{jg\x03\x00\x00}\x94(ji\x03\x00\x00G?\x1a6\xe2\xeb\x1cC-jj\x03\x00\x00K\x04jk\x03\x00\x00K\x02ujl\x03\x00\x00}\x94(jn\x03\x00\x00G?tz\xe1G\xae\x14{jo\x03\x00\x00K\x04jp\x03\x00\x00K\x02ujq\x03\x00\x00M\xe8\x03jr\x03\x00\x00Kdjs\x03\x00\x00K\x03jt\x03\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(jw\x03\x00\x00K\x01jx\x03\x00\x00jy\x03\x00\x00jz\x03\x00\x00K\x00j{\x03\x00\x00j|\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x7f\x03\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x80\x03\x00\x00}\x94(j\x82\x03\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x83\x03\x00\x00G?\xc3333333uj\x84\x03\x00\x00j\x85\x03\x00\x00j\x86\x03\x00\x00j\x87\x03\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\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x07\x10\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x08designed\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\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x07\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x08designed\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\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x07\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x08designed\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\x94j\x9a\x03\x00\x00C\x04\x07\xe9\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x08designed\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\x12aggregate_qc_drops\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 #########

Aggregate and analyze the drops from QC-ing the plates and sera¶

In [2]:
import altair as alt

import pandas as pd

from ruamel.yaml import YAML

yaml = YAML(typ="rt")

_ = alt.data_transformers.disable_max_rows()

Get variables from snakemake:

In [3]:
input_plate_qc_drops = snakemake.input.plate_qc_drops
input_groups_sera_qc_drops = snakemake.input.groups_sera_qc_drops
output_plate_qc_drops = snakemake.output.plate_qc_drops
output_barcode_qc_drops = snakemake.output.barcode_qc_drops
output_groups_sera_qc_drops = snakemake.output.groups_sera_qc_drops
plates = snakemake.params.plates
groups_sera = snakemake.params.groups_sera

Analyze plate QC drops¶

Read QC drops for individual plates into a merged dictionary, write it to YAML, and also convert to a DataFrame. If you really want to look into the details of what is being dropped, you will want to look at that merged YAML file.

In [4]:
# read dictionary of QC drops
assert len(plates) == len(input_plate_qc_drops)
plate_qc_drops = {}
for plate, qc_drops_yaml in zip(plates, input_plate_qc_drops):
    with open(qc_drops_yaml) as f:
        plate_qc_drops[plate] = yaml.load(f)
assert len(plate_qc_drops) == len(input_plate_qc_drops)

print(f"Writing merged plate drops to {output_plate_qc_drops}")
with open(output_plate_qc_drops, "w") as f:
    yaml.dump(plate_qc_drops, stream=f)

# convert dictionary of QC drops into list of tuples
plate_qc_drop_tups = [
    (plate_key, droptype_key, drop_key, reason)
    for (plate_key, plate_val) in plate_qc_drops.items()
    for droptype_key, droptype_val in plate_val.items()
    for drop_key, reason in droptype_val.items()
]

# create data frame of QC drops
plate_qc_drops_df = pd.DataFrame(
    plate_qc_drop_tups,
    columns=["plate", "drop type", "drop", "reason"],
)
Writing merged plate drops to results/qc_drops/plate_qc_drops.yml
In [5]:
plate_qc_drop_counts = plate_qc_drops_df.groupby(
    ["plate", "drop type", "reason"], as_index=False
).aggregate(n_drops=pd.NamedAgg("drop", "nunique"))
assert plate_qc_drop_counts["n_drops"].sum() == len(plate_qc_drops_df)

Now plot the number of drops for each plate. You should be worried (maybe re-do or discard) any plates with a very large number of drops:

In [6]:
plate_selection = alt.selection_point(fields=["plate"], on="mouseover", empty=False)

plate_qc_drop_counts_chart = (
    alt.Chart(plate_qc_drop_counts)
    .add_params(plate_selection)
    .encode(
        alt.X(
            "n_drops",
            title="number of drops",
        ),
        alt.Y(
            "plate",
            sort=plates,
            title=None,
            axis=alt.Axis(labelFontStyle="bold", labelFontSize=11),
        ),
        alt.Column(
            "drop type",
            title=None,
            spacing=5,
            header=alt.Header(labelFontSize=12, labelFontStyle="bold", labelPadding=1),
        ),
        alt.Color(
            "reason",
            legend=alt.Legend(
                orient="top", columns=1, labelLimit=230, title=None, padding=1
            ),
        ),
        strokeWidth=alt.condition(plate_selection, alt.value(3), alt.value(0.5)),
        tooltip=plate_qc_drop_counts.columns.tolist(),
    )
    .mark_bar(height={"band": 0.8}, stroke="black")
    .properties(
        width=230,
        height=alt.Step(16),
        title=alt.TitleParams(
            "Number of QC drops when processing plates", anchor="middle", dy=-2
        ),
    )
    .configure_axis(grid=False)
    .resolve_scale(color="independent", x="independent")
)

plate_qc_drop_counts_chart
Out[6]:

Analyze barcode QC drops¶

If a barcode is dropped especially often across plates, that could indicate something problematic with that barcode such that it should be removed altogether from the library analysis.

First, write a YAML with this information:

In [7]:
barcode_qc_drops = {}

for plate, plate_d in plate_qc_drops.items():
    for key, val in [
        tup for tup in plate_d.items() if tup[0].startswith("barcode") and tup[1]
    ]:
        for desc, reason in val.items():
            desc_entries = desc.split(None, maxsplit=1)
            barcode = desc_entries[0]
            if len(desc_entries) == 2:
                description = f"{plate} {desc_entries[1]}"
            elif len(desc_entries) == 1:
                description = plate
            else:
                raise RuntimeError("should not get here")
            if barcode not in barcode_qc_drops:
                barcode_qc_drops[barcode] = {}
            if key not in barcode_qc_drops[barcode]:
                barcode_qc_drops[barcode][key] = {}
            barcode_qc_drops[barcode][key][description] = reason


# sort keys
def sort_nested(d):
    if isinstance(d, dict):
        return dict(sorted((key, sort_nested(val)) for (key, val) in d.items()))
    else:
        return d


barcode_qc_drops = sort_nested(barcode_qc_drops)

print(f"Writing merged barcode drops to {output_barcode_qc_drops}")
with open(output_barcode_qc_drops, "w") as f:
    yaml.dump(barcode_qc_drops, stream=f)
Writing merged barcode drops to results/qc_drops/barcode_qc_drops.yml

Now make a plot showing how often each barcode is dropped for each reason:

In [8]:
barcode_drops = (
    plate_qc_drops_df.query("`drop type`.str.startswith('barcode')")
    .assign(barcode=lambda x: x["drop"].str.split().str[0])
    .groupby(["drop type", "barcode"], as_index=False)
    .aggregate(
        plates_where_dropped=pd.NamedAgg("plate", "nunique"),
        total_drops=pd.NamedAgg("plate", "count"),
    )
)
In [9]:
barcode_selection = alt.selection_point(fields=["barcode"], on="mouseover", empty=False)

barcode_drops_chart = (
    alt.Chart(barcode_drops)
    .add_params(barcode_selection)
    .encode(
        alt.X(
            "total_drops",
            title="times barcode dropped",
        ),
        alt.Y(
            "barcode",
            sort=alt.SortField("total_drops", order="descending"),
            axis=alt.Axis(labelFontSize=9),
        ),
        alt.Column(
            "drop type",
            title=None,
            spacing=8,
            header=alt.Header(labelFontSize=12, labelFontStyle="bold", labelPadding=1),
        ),
        strokeWidth=alt.condition(barcode_selection, alt.value(3), alt.value(0.5)),
        tooltip=barcode_drops.columns.tolist(),
    )
    .mark_bar(height={"band": 0.8}, stroke="black")
    .properties(
        width=200,
        height=alt.Step(10),
        title=alt.TitleParams(
            "Number of QC drops when processing plates", anchor="middle", dy=-2
        ),
    )
    .configure_axis(grid=False)
    .resolve_scale(color="independent", x="independent", y="independent")
)

barcode_drops_chart
Out[9]:

Analyze the groups/sera QC¶

Analyze the QC performed on the groups/sera, which involves completely dropping titers for certain virus-sera pairs.

Read the QC for different groups/sera into a merged dictionary, write it to YAML, and also convert to a DataFrame. If you really want to look into the details of what is being dropped, you will want to look at that merged YAML file.

In [10]:
# read dictionary of QC drops
assert len(groups_sera) == len(input_groups_sera_qc_drops)
groups_sera_qc_drops = {}
for (group, serum), qc_drops_yaml in zip(groups_sera, input_groups_sera_qc_drops):
    if group not in groups_sera_qc_drops:
        groups_sera_qc_drops[group] = {}
    with open(qc_drops_yaml) as f:
        groups_sera_qc_drops[group][serum] = yaml.load(f)

print(f"Writing merged groups/sera drops to {output_groups_sera_qc_drops}")
with open(output_groups_sera_qc_drops, "w") as f:
    yaml.dump(groups_sera_qc_drops, stream=f)

# convert dictionary of QC drops into list of tuples
groups_sera_qc_drop_tups = [
    (group_key, serum_key, virus, reason)
    for (group_key, group_val) in groups_sera_qc_drops.items()
    for (serum_key, serum_val) in group_val.items()
    for virus, reason in serum_val.items()
]

# create data frame of QC drops
groups_sera_qc_drops_df = pd.DataFrame(
    groups_sera_qc_drop_tups,
    columns=["group", "serum", "virus", "reason"],
)
Writing merged groups/sera drops to results/qc_drops/groups_sera_qc_drops.yml

Plot the number of viruses dropped for each group/serum. If a group/serum has many missed viruses, then you will lack a lot of titers and so it may be worth reviewing the cause of the drops.

In [11]:
groups_sera_n_drops = groups_sera_qc_drops_df.groupby(
    ["group", "serum", "reason"], as_index=False
).aggregate(n_viruses=pd.NamedAgg("virus", "nunique"))
assert groups_sera_n_drops["n_viruses"].sum() == len(groups_sera_qc_drops_df)

groups_sera_n_drops_chart = (
    alt.Chart(groups_sera_n_drops)
    .encode(
        alt.X("n_viruses", title="number of viruses dropped"),
        alt.Y("serum"),
        alt.Row("group"),
        alt.Color("reason", title="reason dropped", legend=alt.Legend(labelLimit=350)),
        tooltip=groups_sera_n_drops.columns.tolist(),
    )
    .mark_bar(height={"band": 0.8})
    .properties(
        width=250,
        height=alt.Step(13),
        title="Number of viruses dropped at serum QC for each serum",
    )
    .configure_axis(grid=False)
    .resolve_scale(y="independent", x="independent")
)

groups_sera_n_drops_chart
Out[11]:

Plot the number of sera for which each virus is dropped during serum QC. If a virus is dropped for many sera, that may indicate some issue with that virus in assays:

In [12]:
virus_n_drops = groups_sera_qc_drops_df.groupby(
    ["group", "virus", "reason"], as_index=False
).aggregate(n_sera=pd.NamedAgg("serum", "nunique"))
assert virus_n_drops["n_sera"].sum() == len(groups_sera_qc_drops_df)

virus_n_drops_chart = (
    alt.Chart(virus_n_drops)
    .encode(
        alt.X("n_sera", title="number of sera for which virus is dropped"),
        alt.Y("virus", sort=alt.SortField("n_sera", order="descending")),
        alt.Row("group"),
        alt.Color("reason", title="reason dropped", legend=alt.Legend(labelLimit=350)),
        tooltip=virus_n_drops.columns.tolist(),
    )
    .mark_bar(height={"band": 0.8})
    .properties(
        width=250,
        height=alt.Step(13),
        title="Number of sera for which each virus is dropped at serum QC",
    )
    .configure_axis(grid=False)
    .resolve_scale(y="independent", x="independent")
)

virus_n_drops_chart
Out[12]:
In [ ]: