######## snakemake preamble start (automatically inserted, do not edit) ########
import sys; sys.path.extend(['/home/aloes/miniconda3/envs/seqneut-pipeline/lib/python3.12/site-packages', '/fh/fast/bloom_j/computational_notebooks/aloes/2024/flu_seqneut_DRIVE_2021-22_repeat_vax/seqneut-pipeline', '/fh/fast/bloom_j/computational_notebooks/aloes/2024/flu_seqneut_DRIVE_2021-22_repeat_vax', '/home/aloes/miniconda3/envs/seqneut-pipeline/bin', '/home/aloes/miniconda3/envs/seqneut-pipeline/lib/python3.12', '/home/aloes/miniconda3/envs/seqneut-pipeline/lib/python3.12/lib-dynload', '/home/aloes/miniconda3/envs/seqneut-pipeline/lib/python3.12/site-packages', '/home/aloes/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpzg9btu6h/file/fh/fast/bloom_j/computational_notebooks/aloes/2024/flu_seqneut_DRIVE_2021-22_repeat_vax/seqneut-pipeline/notebooks', '/fh/fast/bloom_j/computational_notebooks/aloes/2024/flu_seqneut_DRIVE_2021-22_repeat_vax/seqneut-pipeline/notebooks']); import pickle; snakemake = pickle.loads(b'\x80\x04\x95\x1eH\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/qc_drops.yml\x94\x8c"results/plates/plate2/qc_drops.yml\x94\x8c"results/plates/plate3/qc_drops.yml\x94\x8c"results/plates/plate4/qc_drops.yml\x94\x8c"results/plates/plate5/qc_drops.yml\x94\x8c"results/plates/plate6/qc_drops.yml\x94\x8c"results/plates/plate7/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/plate13/qc_drops.yml\x94\x8c&results/plates/plate14lib/qc_drops.yml\x94\x8c*results/plates/plate14halflib/qc_drops.yml\x94\x8c(results/plates/plate14no5a1/qc_drops.yml\x94\x8c(results/plates/plate14no5a2/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10002d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10002d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10007d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10007d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10007d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10011d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10011d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10011d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10041d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10041d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10041d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10042d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10042d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10042d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10054d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10054d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10054d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10066d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10066d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10066d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10107d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10107d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10117d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10117d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10117d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10159d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10159d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10159d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10175d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10175d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10175d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10181d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10181d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10181d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10191d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10191d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10191d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10193d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10193d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10193d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10212d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10212d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10212d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10220d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10220d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10241d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10241d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10244d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10244d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10244d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10253d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10253d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10256d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10256d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10291d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10291d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10309d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10309d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10309d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10318d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10318d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10318d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10323d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10323d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10323d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10366d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10366d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10366d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10378d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10378d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10378d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10384d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10384d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10384d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10396d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10396d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10417d0/qc_drops.yml\x94\x8c*results/sera/DRIVE_D10417d182/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10417d30/qc_drops.yml\x94\x8c(results/sera/DRIVE_D10426d0/qc_drops.yml\x94\x8c)results/sera/DRIVE_D10426d30/qc_drops.yml\x94\x8c0results/sera/Validation_fulllibconc/qc_drops.yml\x94\x8c0results/sera/Validation_halflibconc/qc_drops.yml\x94\x8c*results/sera/Validation_no5a1/qc_drops.yml\x94\x8c*results/sera/Validation_no5a2/qc_drops.yml\x94e}\x94(\x8c\x06_names\x94}\x94(\x8c\x0eplate_qc_drops\x94K\x00K\x10\x86\x94\x8c\x14groups_sera_qc_drops\x94K\x10Ke\x86\x94u\x8c\x12_allowed_overrides\x94]\x94(\x8c\x05index\x94\x8c\x04sort\x94ehx\x8c\tfunctools\x94\x8c\x07partial\x94\x93\x94h\x06\x8c\x19Namedlist._used_attribute\x94\x93\x94\x85\x94R\x94(h~)}\x94\x8c\x05_name\x94hxsNt\x94bhyh|h~\x85\x94R\x94(h~)}\x94h\x82hysNt\x94bhrh\x06\x8c\tNamedlist\x94\x93\x94)\x81\x94(h\nh\x0bh\x0ch\rh\x0eh\x0fh\x10h\x11h\x12h\x13h\x14h\x15h\x16h\x17h\x18h\x19e}\x94(hp}\x94hv]\x94(hxhyehxh|h~\x85\x94R\x94(h~)}\x94h\x82hxsNt\x94bhyh|h~\x85\x94R\x94(h~)}\x94h\x82hysNt\x94bubhth\x89)\x81\x94(h\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`hahbhchdhehfhghhhihjhkhlhmhne}\x94(hp}\x94hv]\x94(hxhyehxh|h~\x85\x94R\x94(h~)}\x94h\x82hxsNt\x94bhyh|h~\x85\x94R\x94(h~)}\x94h\x82hysNt\x94bubub\x8c\x06output\x94h\x06\x8c\x0bOutputFiles\x94\x93\x94)\x81\x94(\x8c#results/qc_drops/plate_qc_drops.yml\x94\x8c)results/qc_drops/groups_sera_qc_drops.yml\x94e}\x94(hp}\x94(hrK\x00N\x86\x94htK\x01N\x86\x94uhv]\x94(hxhyehxh|h~\x85\x94R\x94(h~)}\x94h\x82hxsNt\x94bhyh|h~\x85\x94R\x94(h~)}\x94h\x82hysNt\x94bhrh\xa6hth\xa7ub\x8c\x06params\x94h\x06\x8c\x06Params\x94\x93\x94)\x81\x94(]\x94(\x8c\x06plate1\x94\x8c\x06plate2\x94\x8c\x06plate3\x94\x8c\x06plate4\x94\x8c\x06plate5\x94\x8c\x06plate6\x94\x8c\x06plate7\x94\x8c\x06plate8\x94\x8c\x06plate9\x94\x8c\x07plate10\x94\x8c\x07plate11\x94\x8c\x07plate13\x94\x8c\nplate14lib\x94\x8c\x0eplate14halflib\x94\x8c\x0cplate14no5a1\x94\x8c\x0cplate14no5a2\x94e]\x94(\x8c\x05DRIVE\x94\x8c\x08D10002d0\x94\x86\x94h\xcb\x8c\tD10002d30\x94\x86\x94h\xcb\x8c\x08D10007d0\x94\x86\x94h\xcb\x8c\nD10007d182\x94\x86\x94h\xcb\x8c\tD10007d30\x94\x86\x94h\xcb\x8c\x08D10011d0\x94\x86\x94h\xcb\x8c\nD10011d182\x94\x86\x94h\xcb\x8c\tD10011d30\x94\x86\x94h\xcb\x8c\x08D10041d0\x94\x86\x94h\xcb\x8c\nD10041d182\x94\x86\x94h\xcb\x8c\tD10041d30\x94\x86\x94h\xcb\x8c\x08D10042d0\x94\x86\x94h\xcb\x8c\nD10042d182\x94\x86\x94h\xcb\x8c\tD10042d30\x94\x86\x94h\xcb\x8c\x08D10054d0\x94\x86\x94h\xcb\x8c\nD10054d182\x94\x86\x94h\xcb\x8c\tD10054d30\x94\x86\x94h\xcb\x8c\x08D10066d0\x94\x86\x94h\xcb\x8c\nD10066d182\x94\x86\x94h\xcb\x8c\tD10066d30\x94\x86\x94h\xcb\x8c\x08D10107d0\x94\x86\x94h\xcb\x8c\tD10107d30\x94\x86\x94h\xcb\x8c\x08D10117d0\x94\x86\x94h\xcb\x8c\nD10117d182\x94\x86\x94h\xcb\x8c\tD10117d30\x94\x86\x94h\xcb\x8c\x08D10159d0\x94\x86\x94h\xcb\x8c\nD10159d182\x94\x86\x94h\xcb\x8c\tD10159d30\x94\x86\x94h\xcb\x8c\x08D10175d0\x94\x86\x94h\xcb\x8c\nD10175d182\x94\x86\x94h\xcb\x8c\tD10175d30\x94\x86\x94h\xcb\x8c\x08D10181d0\x94\x86\x94h\xcb\x8c\nD10181d182\x94\x86\x94h\xcb\x8c\tD10181d30\x94\x86\x94h\xcb\x8c\x08D10191d0\x94\x86\x94h\xcb\x8c\nD10191d182\x94\x86\x94h\xcb\x8c\tD10191d30\x94\x86\x94h\xcb\x8c\x08D10193d0\x94\x86\x94h\xcb\x8c\nD10193d182\x94\x86\x94h\xcb\x8c\tD10193d30\x94\x86\x94h\xcb\x8c\x08D10212d0\x94\x86\x94h\xcb\x8c\nD10212d182\x94\x86\x94h\xcb\x8c\tD10212d30\x94\x86\x94h\xcb\x8c\x08D10220d0\x94\x86\x94h\xcb\x8c\tD10220d30\x94\x86\x94h\xcb\x8c\x08D10241d0\x94\x86\x94h\xcb\x8c\tD10241d30\x94\x86\x94h\xcb\x8c\x08D10244d0\x94\x86\x94h\xcb\x8c\nD10244d182\x94\x86\x94h\xcb\x8c\tD10244d30\x94\x86\x94h\xcb\x8c\x08D10253d0\x94\x86\x94h\xcb\x8c\tD10253d30\x94\x86\x94h\xcb\x8c\x08D10256d0\x94\x86\x94h\xcb\x8c\tD10256d30\x94\x86\x94h\xcb\x8c\x08D10291d0\x94\x86\x94h\xcb\x8c\tD10291d30\x94\x86\x94h\xcb\x8c\x08D10309d0\x94\x86\x94h\xcb\x8c\nD10309d182\x94\x86\x94h\xcb\x8c\tD10309d30\x94\x86\x94h\xcb\x8c\x08D10318d0\x94\x86\x94h\xcb\x8c\nD10318d182\x94\x86\x94h\xcb\x8c\tD10318d30\x94\x86\x94h\xcb\x8c\x08D10323d0\x94\x86\x94h\xcb\x8c\nD10323d182\x94\x86\x94h\xcb\x8c\tD10323d30\x94\x86\x94h\xcb\x8c\x08D10366d0\x94\x86\x94h\xcb\x8c\nD10366d182\x94\x86\x94h\xcb\x8c\tD10366d30\x94\x86\x94h\xcb\x8c\x08D10378d0\x94\x86\x94h\xcb\x8c\nD10378d182\x94\x86\x94h\xcb\x8c\tD10378d30\x94\x86\x94h\xcb\x8c\x08D10384d0\x94\x86\x94h\xcb\x8c\nD10384d182\x94\x86\x94h\xcb\x8c\tD10384d30\x94\x86\x94h\xcb\x8c\x08D10396d0\x94\x86\x94h\xcb\x8c\tD10396d30\x94\x86\x94h\xcb\x8c\x08D10417d0\x94\x86\x94h\xcb\x8c\nD10417d182\x94\x86\x94h\xcb\x8c\tD10417d30\x94\x86\x94h\xcb\x8c\x08D10426d0\x94\x86\x94h\xcb\x8c\tD10426d30\x94\x86\x94\x8c\nValidation\x94\x8c\x0bfulllibconc\x94\x86\x94jn\x01\x00\x00\x8c\x0bhalflibconc\x94\x86\x94jn\x01\x00\x00\x8c\x05no5a1\x94\x86\x94jn\x01\x00\x00\x8c\x05no5a2\x94\x86\x94ee}\x94(hp}\x94(\x8c\x06plates\x94K\x00N\x86\x94\x8c\x0bgroups_sera\x94K\x01N\x86\x94uhv]\x94(hxhyehxh|h~\x85\x94R\x94(h~)}\x94h\x82hxsNt\x94bhyh|h~\x85\x94R\x94(h~)}\x94h\x82hysNt\x94bjy\x01\x00\x00h\xb9j{\x01\x00\x00h\xcaub\x8c\twildcards\x94h\x06\x8c\tWildcards\x94\x93\x94)\x81\x94}\x94(hp}\x94hv]\x94(hxhyehxh|h~\x85\x94R\x94(h~)}\x94h\x82hxsNt\x94bhyh|h~\x85\x94R\x94(h~)}\x94h\x82hysNt\x94bub\x8c\x07threads\x94K\x01\x8c\tresources\x94h\x06\x8c\tResources\x94\x93\x94)\x81\x94(K\x01K\x01\x8c\x15/loc/scratch/58619952\x94e}\x94(hp}\x94(\x8c\x06_cores\x94K\x00N\x86\x94\x8c\x06_nodes\x94K\x01N\x86\x94\x8c\x06tmpdir\x94K\x02N\x86\x94uhv]\x94(hxhyehxh|h~\x85\x94R\x94(h~)}\x94h\x82hxsNt\x94bhyh|h~\x85\x94R\x94(h~)}\x94h\x82hysNt\x94bj\x9d\x01\x00\x00K\x01j\x9f\x01\x00\x00K\x01j\xa1\x01\x00\x00j\x9a\x01\x00\x00ub\x8c\x03log\x94h\x06\x8c\x03Log\x94\x93\x94)\x81\x94\x8c)results/qc_drops/aggregate_qc_drops.ipynb\x94a}\x94(hp}\x94\x8c\x08notebook\x94K\x00N\x86\x94shv]\x94(hxhyehxh|h~\x85\x94R\x94(h~)}\x94h\x82hxsNt\x94bhyh|h~\x85\x94R\x94(h~)}\x94h\x82hysNt\x94bj\xb3\x01\x00\x00j\xb0\x01\x00\x00ub\x8c\x06config\x94}\x94(\x8c\x10seqneut-pipeline\x94\x8c\x10seqneut-pipeline\x94\x8c\x04docs\x94\x8c\x04docs\x94\x8c\x0bdescription\x94X\xfa\x01\x00\x00# Sequencing-based neutralization assays of 2021-2022 DRIVE samples versus H1N1 influenza libraries\nStudy by Loes et al of samples from the DRIVE cohort using sequencing-based neutralization assay developed in the Bloom lab.\n\nSee [Loes et al (2024)](https://doi.org/10.1101/2024.03.08.584176) for the citation for this study.\n\nThe numerical data and computer code are at [https://github.com/jbloomlab/flu_seqneut_DRIVE_2021-22_repeat_vax](https://github.com/jbloomlab/flu_seqneut_DRIVE_2021-22_repeat_vax)\n\x94\x8c\x0fviral_libraries\x94}\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c-data/viral_libraries/pdmH1N1_lib2023_loes.csv\x94s\x8c\x0finitial_pooling\x94\x8c4data/initialpool/2022_pdmH1N1library_initialPool.csv\x94\x8c\x17viral_strain_plot_order\x94\x8c data/viral_strain_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\xe8\x03\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?@bM\xd2\xf1\xa9\xfc\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\x94M\xf4\x01\x8c+max_frac_infectivity_per_viral_barcode_well\x94K\x05\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?\xe0\x00\x00\x00\x00\x00\x00K\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?\xe0\x00\x00\x00\x00\x00\x00\x8c\x0fgoodness_of_fit\x94}\x94(\x8c\x06min_R2\x94G?\xe3333333\x8c\x08max_RMSD\x94G?\xb9\x99\x99\x99\x99\x99\x9au\x8c#serum_replicates_ignore_curvefit_qc\x94]\x94\x8c+barcode_serum_replicates_ignore_curvefit_qc\x94]\x94u\x8c\x06plates\x94}\x94(h\xba}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94\x8c\x08datetime\x94\x8c\x04date\x94\x93\x94C\x04\x07\xe7\x08\x01\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate1_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xbb}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x01\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate2_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xbc}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x02\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate3_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xbd}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x02\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate4_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xbe}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate5_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x18barcode_serum_replicates\x94]\x94]\x94(\x8c\x10TCTGTTCCGGCCCGAA\x94\x8c\nD10042d182\x94eas\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xbf}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate6_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94(\x8c\rbarcode_wells\x94]\x94]\x94(\x8c\x10TAATGAGCTTTATGGT\x94\x8c\x02F5\x94ea\x8c\x18barcode_serum_replicates\x94]\x94]\x94(\x8c\x10ACGACATGATCAAACG\x94\x8c\nD10212d182\x94eau\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xc0}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x05\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate7_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xc1}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x05\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate8_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94(\x8c\rbarcode_wells\x94]\x94(]\x94(\x8c\x10TAGTATAATAGAGCAG\x94\x8c\x02D5\x94e]\x94(\x8c\x10CAGTTCTGCGACCAGC\x94\x8c\x02D9\x94ee\x8c\x18barcode_serum_replicates\x94]\x94(]\x94(\x8c\x10ACGGAATCCCCTGAGA\x94\x8c\x08D10396d0\x94e]\x94(\x8c\x10GGATAAGAAAACTACT\x94\x8c\x08D10396d0\x94e]\x94(\x8c\x10GTAACATTATACGATT\x94\x8c\x08D10396d0\x94e]\x94(\x8c\x10GACTCAATAATCACAC\x94\x8c\x08D10396d0\x94e]\x94(\x8c\x10CTATTAATCATGCAAA\x94\x8c\x08D10396d0\x94e]\x94(\x8c\x10TGGAATCGTCACCGAT\x94\x8c\tD10396d30\x94eeu\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xc2}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x05\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate9_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x18barcode_serum_replicates\x94]\x94]\x94(\x8c\x10CGGATAAAAATGATAT\x94\x8c\tD10417d30\x94eas\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xc3}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x06\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate10_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x18barcode_serum_replicates\x94]\x94(]\x94(\x8c\x10CGGATAAAAATGATAT\x94\x8c\tD10041d30\x94e]\x94(\x8c\x10GTTTGACAATCACTAC\x94\x8c\tD10041d30\x94e]\x94(\x8c\x10AGCAGCCTGAAAATAT\x94\x8c\tD10175d30\x94e]\x94(\x8c\x10GACTCAATAATCACAC\x94\x8c\nD10175d182\x94ees\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xc4}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\t\x1a\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate11_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x18barcode_serum_replicates\x94]\x94(]\x94(\x8c\x10ACGGAATCCCCTGAGA\x94\x8c\tD10041d30\x94e]\x94(\x8c\x10GATCCGTACTTTGATT\x94\x8c\x08D10256d0\x94e]\x94(\x8c\x10CATCAACCGCCATTTC\x94\x8c\x08D10256d0\x94ees\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xc5}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x0c\x01\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate13_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00uuh\xc6}\x94(\x8c\x05group\x94\x8c\nValidation\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c&data/plates/plate14fulllib_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuh\xc7}\x94(\x8c\x05group\x94\x8c\nValidation\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\'data/plates/plate14fhalflib_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuh\xc8}\x94(\x8c\x05group\x94\x8c\nValidation\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate14no5a1_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuh\xc9}\x94(\x8c\x05group\x94\x8c\nValidation\x94\x8c\x04date\x94j\t\x02\x00\x00C\x04\x07\xe7\x08\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x14pdmH1N1_lib2023_loes\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate14no5a2_samples.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\xde\x01\x00\x00M\xe8\x03j\xdf\x01\x00\x00G?tz\xe1G\xae\x14{j\xe0\x01\x00\x00}\x94(j\xe2\x01\x00\x00G?@bM\xd2\xf1\xa9\xfcj\xe3\x01\x00\x00K\x04j\xe4\x01\x00\x00K\x02uj\xe5\x01\x00\x00}\x94(j\xe7\x01\x00\x00G?tz\xe1G\xae\x14{j\xe8\x01\x00\x00K\x04j\xe9\x01\x00\x00K\x02uj\xea\x01\x00\x00M\xe8\x03j\xeb\x01\x00\x00M\xf4\x01j\xec\x01\x00\x00K\x05j\xed\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\xf0\x01\x00\x00K\x01j\xf1\x01\x00\x00j\xf2\x01\x00\x00j\xf3\x01\x00\x00K\x00j\xf4\x01\x00\x00j\xf5\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\xf8\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\xf9\x01\x00\x00}\x94(j\xfb\x01\x00\x00G?\xe3333333j\xfc\x01\x00\x00G?\xb9\x99\x99\x99\x99\x99\x9auj\xfd\x01\x00\x00j\xfe\x01\x00\x00j\xff\x01\x00\x00j\x00\x02\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuu\x8c\x16default_serum_titer_as\x94\x8c\x08midpoint\x94\x8c\x1bdefault_serum_qc_thresholds\x94}\x94(\x8c\x0emin_replicates\x94K\x02\x8c\x1bmax_fold_change_from_median\x94K\n\x8c\x11viruses_ignore_qc\x94]\x94u\x8c\x16sera_override_defaults\x94}\x94u\x8c\x04rule\x94\x8c\x12aggregate_qc_drops\x94\x8c\x0fbench_iteration\x94N\x8c\tscriptdir\x94\x8cs/fh/fast/bloom_j/computational_notebooks/aloes/2024/flu_seqneut_DRIVE_2021-22_repeat_vax/seqneut-pipeline/notebooks\x94ub.'); from snakemake.logging import logger; logger.printshellcmds = False; import os; os.chdir(r'/fh/fast/bloom_j/computational_notebooks/aloes/2024/flu_seqneut_DRIVE_2021-22_repeat_vax');
######## snakemake preamble end #########
Aggregate and analyze the drops from QC-ing the plates and sera¶
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
:
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_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.
# 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
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:
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
Look for barcodes dropped especially often in plate QC¶
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.
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"),
)
)
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
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.
# 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.
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
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:
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