######## snakemake preamble start (automatically inserted, do not edit) ########
import sys;sys.path.extend(['/home/ckikawa/miniforge3/envs/seqneut-pipeline/lib/python3.12/site-packages', '/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/seqneut-pipeline', '/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024', '/home/ckikawa/miniforge3/envs/seqneut-pipeline/bin', '/home/ckikawa/miniforge3/envs/seqneut-pipeline/lib/python3.12', '/home/ckikawa/miniforge3/envs/seqneut-pipeline/lib/python3.12/lib-dynload', '/home/ckikawa/miniforge3/envs/seqneut-pipeline/lib/python3.12/site-packages', '/home/ckikawa/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpx1s2iqt0/file/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/seqneut-pipeline/notebooks', '/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/seqneut-pipeline/notebooks']);import pickle;from snakemake import script;script.snakemake = pickle.loads(b'\x80\x04\x95\xbbS\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/plate28/curvefits.pickle\x94\x8c\'results/plates/plate30/curvefits.pickle\x94e}\x94(\x8c\x06_names\x94}\x94\x8c\x07pickles\x94K\x00K\x02\x86\x94s\x8c\x12_allowed_overrides\x94]\x94(\x8c\x05index\x94\x8c\x04sort\x94eh\x13h\x06\x8c\x0eAttributeGuard\x94\x93\x94)\x81\x94}\x94\x8c\x04name\x94h\x13sbh\x14h\x16)\x81\x94}\x94h\x19h\x14sbh\x0fh\x06\x8c\tNamedlist\x94\x93\x94)\x81\x94(h\nh\x0be}\x94(h\r}\x94h\x11]\x94(h\x13h\x14eh\x13h\x16)\x81\x94}\x94h\x19h\x13sbh\x14h\x16)\x81\x94}\x94h\x19h\x14sbubub\x8c\x06output\x94h\x06\x8c\x0bOutputFiles\x94\x93\x94)\x81\x94(\x8cMresults/sera/PennVaccineCohort_PENN23_y1981_s053_d28/titers_per_replicate.csv\x94\x8c?results/sera/PennVaccineCohort_PENN23_y1981_s053_d28/titers.csv\x94\x8c?results/sera/PennVaccineCohort_PENN23_y1981_s053_d28/curves.pdf\x94\x8cEresults/sera/PennVaccineCohort_PENN23_y1981_s053_d28/curvefits.pickle\x94\x8cAresults/sera/PennVaccineCohort_PENN23_y1981_s053_d28/qc_drops.yml\x94e}\x94(h\r}\x94(\x8c\x0eper_rep_titers\x94K\x00N\x86\x94\x8c\x06titers\x94K\x01N\x86\x94\x8c\ncurves_pdf\x94K\x02N\x86\x94\x8c\x06pickle\x94K\x03N\x86\x94\x8c\x08qc_drops\x94K\x04N\x86\x94uh\x11]\x94(h\x13h\x14eh\x13h\x16)\x81\x94}\x94h\x19h\x13sbh\x14h\x16)\x81\x94}\x94h\x19h\x14sbh1h*h3h+h5h,h7h-h9h.ub\x8c\x06params\x94h\x06\x8c\x06Params\x94\x93\x94)\x81\x94(]\x94(\x8c\x15A/Texas/50/2012X-223A\x94\x8c\x0fA/Texas/50/2012\x94\x8c\x1aA/Switzerland/9715293/2013\x94\x8c A/Switzerland/9715293/2013NIB-88\x94\x8c\x10A/Kansas/14/2017\x94\x8c\x17A/HongKong/4801/2014egg\x94\x8c\x14A/HongKong/4801/2014\x94\x8c%A/Singapore/INFIMH-16-0019/2016X-307A\x94\x8c\x1fA/Singapore/INFIMH-16-0019/2016\x94\x8c\x14A/HongKong/2671/2019\x94\x8c\x12A/HongKong/45/2019\x94\x8c\x18A/Cambodia/e0826360/2020\x94\x8c\x1bA/Cambodia/e0826360/2020egg\x94\x8c\x14A/TECPAN/017FLU/2023\x94\x8c\x19A/SouthAfrica/R06506/2023\x94\x8c\x19A/SouthAfrica/R07073/2023\x94\x8c\x19A/SouthAfrica/R05384/2023\x94\x8c\x16A/SuratThani/P152/2023\x94\x8c\x10A/Jeju/1047/2023\x94\x8c\x15A/SouthDakota/22/2023\x94\x8c\x16A/Luga/RII-11393S/2023\x94\x8c\x10A/SENDAI/45/2023\x94\x8c\x12A/YAMAGATA/98/2023\x94\x8c\x15A/Romania/543634/2022\x94\x8c\x1bA/Schleswig-Holstein/4/2023\x94\x8c\x0fA/EHIME/50/2023\x94\x8c\x0fA/Darwin/9/2021\x94\x8c\x0fA/Darwin/6/2021\x94\x8c\x11A/Busan/1301/2023\x94\x8c\x13A/Brisbane/429/2023\x94\x8c\x19A/SouthAfrica/R06359/2023\x94\x8c\x16A/KANAGAWA/IC2239/2023\x94\x8c\x16A/KANAGAWA/AC2316/2023\x94\x8c\x12A/Finland/391/2023\x94\x8c\x1aA/Catalonia/2041146NS/2023\x94\x8c\x1bA/Bhutan/FLU-BTG-00988/2022\x94\x8c\x12A/Bhutan/0006/2023\x94\x8c\x15A/SouthSudan/631/2023\x94\x8c\x15A/SouthSudan/642/2023\x94\x8c\x12A/Finland/399/2023\x94\x8c\x1fA/Saint-Petersburg/RII-166/2023\x94\x8c\x11A/Thailand/8/2022\x94\x8c\x18A/Netherlands/01685/2023\x94\x8c\x18A/Netherlands/01760/2023\x94\x8c\x1dA/SamutSongkhram/THIS061/2023\x94\x8c\x14A/Bangkok/P3599/2023\x94\x8c\x12A/Bhutan/0845/2023\x94\x8c\x19A/Solwezi/13-NIC-001/2023\x94\x8c\x11A/Sydney/332/2023\x94\x8c\x18A/Netherlands/01693/2023\x94\x8c\x16A/Ontario/RV00796/2023\x94\x8c\x14A/Bangkok/P3755/2023\x94\x8c\x17A/Massachusetts/18/2022\x94\x8c\x14A/Townsville/68/2023\x94\x8c\x11A/Georgia/40/2023\x94\x8c\x14A/California/81/2023\x94\x8c\x10A/Oman/3011/2023\x94\x8c\x1eA/Catalonia/NSVH102124476/2023\x94\x8c\x14A/Victoria/1033/2023\x94\x8c\x11A/Sydney/749/2023\x94\x8c\x14A/AbuDhabi/6753/2023\x94\x8c\x14A/Krabi/THIS050/2023\x94\x8c\x1fA/Saskatchewan/SKFLU317847/2023\x94\x8c\x11A/Sydney/710/2023\x94\x8c\x13A/Wisconsin/27/2023\x94\x8c\x13A/Maldives/852/2023\x94\x8c\x1cA/Guangdong-Futian/1980/2023\x94\x8c\x11A/Sydney/715/2023\x94\x8c\x1cA/Malaysia/IMR-SARI1989/2023\x94\x8c\x19A/Chipata/15-NIC-001/2023\x94\x8c\x19A/SouthAfrica/R05510/2023\x94\x8c\x1aA/SouthAfrica/K056872/2023\x94\x8c\x1bA/SOUTHAFRICA/R07876/202023\x94\x8c\x1aA/SouthAfrica/K056863/2023\x94\x8c\x1bA/SouthAfrica/PET28931/2023\x94\x8c\x19A/SouthAfrica/R06240/2023\x94\x8c\x19A/SouthAfrica/R06477/2023\x94\x8c\x19A/SouthAfrica/R07188/2023\x94e\x8c\x08midpoint\x94}\x94(\x8c\x0emin_replicates\x94K\x02\x8c\x1bmax_fold_change_from_median\x94K\x06\x8c\x11viruses_ignore_qc\x94]\x94ue}\x94(h\r}\x94(\x8c\x17viral_strain_plot_order\x94K\x00N\x86\x94\x8c\x0eserum_titer_as\x94K\x01N\x86\x94\x8c\rqc_thresholds\x94K\x02N\x86\x94uh\x11]\x94(h\x13h\x14eh\x13h\x16)\x81\x94}\x94h\x19h\x13sbh\x14h\x16)\x81\x94}\x94h\x19h\x14sbh\x9bhDh\x9dh\x93h\x9fh\x94ub\x8c\twildcards\x94h\x06\x8c\tWildcards\x94\x93\x94)\x81\x94(\x8c\x11PennVaccineCohort\x94\x8c\x15PENN23_y1981_s053_d28\x94e}\x94(h\r}\x94(\x8c\x05group\x94K\x00N\x86\x94\x8c\x05serum\x94K\x01N\x86\x94uh\x11]\x94(h\x13h\x14eh\x13h\x16)\x81\x94}\x94h\x19h\x13sbh\x14h\x16)\x81\x94}\x94h\x19h\x14sb\x8c\x05group\x94h\xaa\x8c\x05serum\x94h\xabub\x8c\x07threads\x94K\x01\x8c\tresources\x94h\x06\x8c\tResources\x94\x93\x94)\x81\x94(K\x01K\x01\x8c\x14/loc/scratch/1700788\x94e}\x94(h\r}\x94(\x8c\x06_cores\x94K\x00N\x86\x94\x8c\x06_nodes\x94K\x01N\x86\x94\x8c\x06tmpdir\x94K\x02N\x86\x94uh\x11]\x94(h\x13h\x14eh\x13h\x16)\x81\x94}\x94h\x19h\x13sbh\x14h\x16)\x81\x94}\x94h\x19h\x14sbh\xc1K\x01h\xc3K\x01h\xc5h\xbeub\x8c\x03log\x94h\x06\x8c\x03Log\x94\x93\x94)\x81\x94\x8ciresults/sera/PennVaccineCohort_PENN23_y1981_s053_d28/PennVaccineCohort_PENN23_y1981_s053_d28_titers.ipynb\x94a}\x94(h\r}\x94\x8c\x08notebook\x94K\x00N\x86\x94sh\x11]\x94(h\x13h\x14eh\x13h\x16)\x81\x94}\x94h\x19h\x13sbh\x14h\x16)\x81\x94}\x94h\x19h\x14sbh\xd3h\xd0ub\x8c\x06config\x94}\x94(\x8c\x10seqneut-pipeline\x94\x8c\x10seqneut-pipeline\x94\x8c\x04docs\x94\x8c\x04docs\x94\x8c\x0bdescription\x94X\n\x01\x00\x00# Sequencing-based neutralization assays of 2023-2024 human serum samples versus H3N2 influenza libraries\n\nThe numerical data and computer code are at [https://github.com/jbloomlab/flu_seqneut_H3N2_2023-2024](https://github.com/jbloomlab/flu_seqneut_H3N2_2023-2024)\n\x94\x8c\x0fviral_libraries\x94}\x94(\x8c\x0cH3N2_library\x94\x8c)data/viral_libraries/2023_H3N2_Kikawa.csv\x94\x8c\x0cH1N1_library\x94\x8c-data/viral_libraries/pdmH1N1_lib2023_loes.csv\x94u\x8c\x17viral_strain_plot_order\x94\x8c+data/H3N2library_2023-2024_strain_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\x94h\x93\x8c\x1bdefault_serum_qc_thresholds\x94h\x94\x8c\x16sera_override_defaults\x94}\x94\x8c\x06plates\x94}\x94(\x8c\x07plate15\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94\x8c\x08datetime\x94\x8c\x04date\x94\x93\x94C\x04\x07\xe8\x03\x1c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-03-28_plate_mapping_file15.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00uu\x8c\x07plate16\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x04\t\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-09_plate_mapping_file16.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00uu\x8c\x07plate17\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x04\x0b\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-11_plate_mapping_file17.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x05wells\x94]\x94\x8c\x02A9\x94as\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00uu\x8c\x07plate18\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x04\x0b\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-11_plate_mapping_file18.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00uu\x8c\x0cplate19_100k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x04\x10\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-23_plate_mapping_file21.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00uu\x8c\x0cplate20_150k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x04\x10\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-23_plate_mapping_file22.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00uu\x8c\x0cplate21_200k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x04\x10\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-23_plate_mapping_file23.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00uu\x8c\x07plate22\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x04\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-18_plate_mapping_file19.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate23\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x04\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-18_plate_mapping_file20.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate24\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x02\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-02_plate_mapping_file24.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00uu\x8c\x07plate25\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-20_plate_mapping_file27.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate26\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-20_plate_mapping_file28.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate27\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x11\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-17_plate_mapping_file26.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?PbM\xd2\xf1\xa9\xfch\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate28\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x11\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-17_plate_mapping_file25.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?PbM\xd2\xf1\xa9\xfch\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate29\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x1c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-28_plate_mapping_file30.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate30\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x1c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-28_plate_mapping_file29.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate31\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x1e\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-30_plate_mapping_file31.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate32\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x1e\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-30_plate_mapping_file32.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x08barcodes\x94]\x94\x8c\x10CCAATCCCAGCCTTTA\x94as\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate33\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x06\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-06-04_plate_mapping_file34.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate34\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x06\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-06-04_plate_mapping_file33.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate35\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x06\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-07-02_plate_mapping_file36.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate36\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x05\x1e\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-07-02_plate_mapping_file35.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate37\x94}\x94(\x8c\x05group\x94\x8c\x10AusVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\t\x18\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-24_plate_mapping_file37.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate38\x94}\x94(\x8c\x05group\x94\x8c\nPooledSera\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\t\x18\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-24_plate_mapping_file38.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate39\x94}\x94(\x8c\x05group\x94\x8c\nPooledSera\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\t\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-25_plate_mapping_file40.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate40\x94}\x94(\x8c\x05group\x94\x8c\x10AusVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\t\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-25_plate_mapping_file41.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x05wells\x94]\x94(\x8c\x03C10\x94\x8c\x03C11\x94es\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate41\x94}\x94(\x8c\x05group\x94\x8c\x10AusVaccineCohort\x94\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\t\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-25_plate_mapping_file39.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xfaM\xf4\x01h\xfbG?tz\xe1G\xae\x14{h\xfc}\x94(h\xfeG?\x1a6\xe2\xeb\x1cC-h\xffK\x04j\x00\x01\x00\x00K\x02uj\x01\x01\x00\x00}\x94(j\x03\x01\x00\x00G?tz\xe1G\xae\x14{j\x04\x01\x00\x00K\x04j\x05\x01\x00\x00K\x02uj\x06\x01\x00\x00M\xe8\x03j\x07\x01\x00\x00Kdj\x08\x01\x00\x00K\x03j\t\x01\x00\x00K\x06u\x8c\x0fcurvefit_params\x94}\x94(j\x0c\x01\x00\x00K\x01j\r\x01\x00\x00j\x0e\x01\x00\x00j\x0f\x01\x00\x00K\x00j\x10\x01\x00\x00j\x11\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x14\x01\x00\x00G\x00\x00\x00\x00\x00\x00\x00\x00j\x15\x01\x00\x00}\x94(j\x17\x01\x00\x00G?\xe0\x00\x00\x00\x00\x00\x00j\x18\x01\x00\x00G?\xc3333333uj\x19\x01\x00\x00j\x1a\x01\x00\x00j\x1b\x01\x00\x00j\x1c\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uuu\x8c\x14miscellaneous_plates\x94}\x94(\x8c\x13240111_initial_H3N2\x94}\x94(\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x01\x0b\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c=data/miscellaneous_plates/H3N2library_initialPool_samples.csv\x94u\x8c\x12240124_repool_H3N2\x94}\x94(\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x01\x18\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cGdata/miscellaneous_plates/2024-01-22_H3N2_sampleData_rePool_MOItest.csv\x94u\x8c\x12240207_repool_H3N2\x94}\x94(\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x02\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cGdata/miscellaneous_plates/2024-02-07_H3N2_sampleData_rePool_MOItest.csv\x94u\x8c\x12240207_repool_H1N1\x94}\x94(\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x02\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH1N1_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cGdata/miscellaneous_plates/2024-02-07_H1N1_sampleData_rePool_MOItest.csv\x94u\x8c\x1f240328_repool_H3N2_variableCell\x94}\x94(\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\x03\x1c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cBdata/miscellaneous_plates/2024-03-28_H3N2_MOItest_variableCell.csv\x94u\x8c\x1c240924_repool_H3N2_balancing\x94}\x94(\x8c\x04date\x94j*\x01\x00\x00C\x04\x07\xe8\t\x18\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c>data/miscellaneous_plates/2024-09-24_repool_H3N2_balancing.csv\x94\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuuu\x8c\x04rule\x94\x8c\x12group_serum_titers\x94\x8c\x0fbench_iteration\x94N\x8c\tscriptdir\x94\x8ck/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/seqneut-pipeline/notebooks\x94ub.');del script;from snakemake.logging import logger;from snakemake.script import snakemake; logger.printshellcmds = False;import os; os.chdir(r'/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024');
######## snakemake preamble end #########
Titers for a serum in a group¶
Analyze titers for a serum assigned to a group, aggregating replicates which may be across multiple plates.
import pickle
import sys
import altair as alt
import matplotlib.pyplot as plt
import neutcurve
import numpy
import pandas as pd
import ruamel.yaml as yaml
_ = alt.data_transformers.disable_max_rows()
Get variables from snakemake
:
pickle_fits = snakemake.input.pickles
per_rep_titers_csv = snakemake.output.per_rep_titers
titers_csv = snakemake.output.titers
curves_pdf = snakemake.output.curves_pdf
output_pickle = snakemake.output.pickle
qc_drops_file = snakemake.output.qc_drops
viral_strain_plot_order = snakemake.params.viral_strain_plot_order
serum_titer_as = snakemake.params.serum_titer_as
qc_thresholds = snakemake.params.qc_thresholds
serum = snakemake.wildcards.serum
group = snakemake.wildcards.group
print(f"Processing {group=}, {serum=}")
Processing group='PennVaccineCohort', serum='PENN23_y1981_s053_d28'
Get all titers for this plate¶
Combine all the pickled neutcurve.CurveFits
from plates for this serum into a single neutcurve.CurveFits
:
print(f"Combining the curve fits for {group=}, {serum=} from {pickle_fits=}")
fits_to_combine = []
for fname in pickle_fits:
with open(fname, "rb") as f:
fits_to_combine.append(pickle.load(f))
fits_noqc = neutcurve.CurveFits.combineCurveFits(fits_to_combine, sera=[serum])
Combining the curve fits for group='PennVaccineCohort', serum='PENN23_y1981_s053_d28' from pickle_fits=['results/plates/plate28/curvefits.pickle', 'results/plates/plate30/curvefits.pickle']
Indicate how we are calculating the titer:
print(f"Calculating with {serum_titer_as=}")
assert serum_titer_as in {"nt50", "midpoint"}
Calculating with serum_titer_as='midpoint'
Get all the per-replicate fit params with the titers. We also convert the IC50 to NT50, and take inverse of midpoint to get it on same scale as NT50s:
per_rep_titers = fits_noqc.fitParams(average_only=False, no_average=True).assign(
group=group,
nt50=lambda x: 1 / x["ic50"],
midpoint=lambda x: 1 / x["midpoint_bound"],
titer=lambda x: x["midpoint"] if serum_titer_as == "midpoint" else x["nt50"],
titer_bound=lambda x: (
x["midpoint_bound_type"] if serum_titer_as == "midpoint" else x["ic50_bound"]
).map({"lower": "upper", "upper": "lower", "interpolated": "interpolated"}),
titer_as=serum_titer_as,
)[
[
"group",
"serum",
"virus",
"replicate",
"titer",
"titer_bound",
"titer_as",
"nt50",
"midpoint",
"top",
"bottom",
"slope",
]
]
assert per_rep_titers.notnull().all().all()
if len(invalid_titer_as := per_rep_titers.query("(titer_as == 'nt50') and top <= 0.5")):
raise ValueError(
f"There are titers computed as nt50 when curve top <= 0.5:\n{invalid_titer_as}"
)
assert len(per_rep_titers) == per_rep_titers["replicate"].nunique()
# get viruses in the order to plot them
viruses = sorted(per_rep_titers["virus"].unique())
if viral_strain_plot_order is not None:
if not set(viruses).issubset(viral_strain_plot_order):
raise ValueError(
"`viral_strain_plot_order` lacks some viruses with titers:\n"
+ str(set(viruses) - set(viral_strain_plot_order))
)
viruses = [v for v in viral_strain_plot_order if v in viruses]
print(f"{serum=} has titers for a total of {len(viruses)} viruses")
serum='PENN23_y1981_s053_d28' has titers for a total of 78 viruses
Correlate NT50s with midpoints of curves¶
Plot the correlation of the NT50s with the midpoint (this is an interactive plot, mouse over points for details).
This plot can help you determine if you made the correct choice of serum_titer_as
when choosing to use the midpoint or NT50 for the titer.
For titers where they are well correlated it should not matter which you chose.
But if there are titers far from the correlation line, you should look at those measurements and curves to make sure you made the correct choice of calculating the titer as the NT50 versus midpoint:
virus_selection = alt.selection_point(fields=["virus"], on="mouseover", empty=False)
midpoint_vs_nt50_chart = (
alt.Chart(per_rep_titers)
.add_params(virus_selection)
.encode(
alt.X("nt50", scale=alt.Scale(type="log", nice=False, padding=8)),
alt.Y("midpoint", scale=alt.Scale(type="log", nice=False, padding=8)),
alt.Color("titer_bound"),
strokeWidth=alt.condition(virus_selection, alt.value(3), alt.value(0)),
size=alt.condition(virus_selection, alt.value(100), alt.value(60)),
tooltip=[
alt.Tooltip(c, format=".2g") if per_rep_titers[c].dtype == float else c
for c in per_rep_titers.columns
if c not in {"group", "serum", "titer_as"}
],
)
.mark_circle(stroke="black", fillOpacity=0.45, color="black")
.properties(
width=350,
height=350,
title=f"NT50 versus midpoint for {group} {serum}",
)
.configure_axis(grid=False)
)
midpoint_vs_nt50_chart
Write the individual per-replicate titers to a file, this is before any QC has been applied:
print(f"Writing per-replicate titers (without QC filtering) to {per_rep_titers_csv=}")
per_rep_titers.to_csv(per_rep_titers_csv, index=False, float_format="%.4g")
Writing per-replicate titers (without QC filtering) to per_rep_titers_csv='results/sera/PennVaccineCohort_PENN23_y1981_s053_d28/titers_per_replicate.csv'
Plot median titers and determine if they pass QC¶
Get the median titers for each virus across replicates, then add these median titers to the per-replicate titers and calculate the fold-change in titer between each replicate and its median. Finally, for each virus indicates whether it passes the QC:
print(f"Using the following {qc_thresholds=}")
def get_median_bound(s):
"""Get the bound on titer when taking median."""
s = list(s)
if len(s) % 2:
return s[len(s) // 2]
else:
bounds = s[len(s) // 2 - 1 : len(s) // 2 + 1]
assert len(bounds) == 2
if len(set(bounds)) == 1:
return bounds[0]
elif "interpolated" in bounds:
return [b for b in bounds if b != "interpolated"][0]
else:
return "inconsistent"
median_titers_noqc = (
per_rep_titers.sort_values("titer") # for getting median bound
.groupby(["group", "serum", "virus", "titer_as"], as_index=False)
.aggregate(
titer=pd.NamedAgg("titer", "median"),
n_replicates=pd.NamedAgg("replicate", "count"),
titer_sem=pd.NamedAgg("titer", "sem"),
titer_bound=pd.NamedAgg("titer_bound", get_median_bound),
)
)
per_rep_titers_w_fc = (
per_rep_titers.merge(
median_titers_noqc[["group", "serum", "virus", "titer"]].rename(
columns={"titer": "median_titer"}
),
validate="many_to_one",
on=["group", "serum", "virus"],
)
.assign(
fc_from_median=lambda x: numpy.where(
x["titer"] > x["median_titer"],
x["titer"] / x["median_titer"],
x["median_titer"] / x["titer"],
),
)
.drop(columns=["group", "serum", "titer_as", "median_titer"])
)
median_titers_noqc = median_titers_noqc.merge(
per_rep_titers_w_fc.groupby("virus", as_index=False).aggregate(
max_fc_from_median=pd.NamedAgg("fc_from_median", "max")
),
on="virus",
validate="one_to_one",
).assign(
fails_min_reps=lambda x: x["n_replicates"] < qc_thresholds["min_replicates"],
fails_max_fc=lambda x: (
x["max_fc_from_median"] >= qc_thresholds["max_fold_change_from_median"]
),
fails_qc=lambda x: x["fails_min_reps"] | x["fails_max_fc"],
fails_qc_reason=lambda x: (
x.apply(
lambda r: ", ".join(
(["min_replicates"] if r["fails_min_reps"] else [])
+ (["max_fold_change_from_median"] if r["fails_max_fc"] else [])
),
axis=1,
)
),
)
# get viruses failing QC in order to plot
viruses_failing_qc = (
median_titers_noqc.query("fails_qc").set_index("virus")["fails_qc_reason"].to_dict()
)
viruses_failing_qc = {
v: viruses_failing_qc[v] for v in viruses if v in viruses_failing_qc
}
median_titers_noqc = median_titers_noqc.drop(
columns=["fails_min_reps", "fails_max_fc", "fails_qc_reason"]
)
per_rep_titers_w_fc = per_rep_titers_w_fc.merge(
median_titers_noqc[["virus", "fails_qc"]],
on="virus",
validate="many_to_one",
)
Using the following qc_thresholds={'min_replicates': 2, 'max_fold_change_from_median': 6, 'viruses_ignore_qc': []}
Now plot the per-replicate and median titers, indicating any viruses that failed QC.
Note that potentially some of these titers may still be retained if the viruses in question are specified in viruses_ignore_qc
of qc_thresholds
.
virus_selection = alt.selection_point(fields=["virus"], on="mouseover", empty=False)
per_rep_chart = (
alt.Chart(per_rep_titers_w_fc)
.encode(
alt.X("titer", scale=alt.Scale(nice=False, padding=5, type="log")),
alt.Y("virus", sort=viruses),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_replicates']=}, {qc_thresholds['max_fold_change_from_median']=}",
legend=alt.Legend(titleLimit=500),
),
alt.Shape("titer_bound"),
strokeWidth=alt.condition(virus_selection, alt.value(2), alt.value(0)),
tooltip=[
alt.Tooltip(c, format=".3g") if per_rep_titers_w_fc[c].dtype == float else c
for c in per_rep_titers_w_fc
],
)
.mark_point(
size=35,
filled=True,
fillOpacity=0.5,
strokeOpacity=1,
stroke="black",
)
)
median_chart = (
alt.Chart(median_titers_noqc)
.encode(
alt.X("titer", scale=alt.Scale(nice=False, padding=5, type="log")),
alt.Y("virus", sort=viruses),
alt.Fill("fails_qc"),
alt.Shape("titer_bound"),
strokeWidth=alt.condition(virus_selection, alt.value(2), alt.value(0.5)),
tooltip=[
alt.Tooltip(c, format=".3g") if median_titers_noqc[c].dtype == float else c
for c in median_titers_noqc
],
)
.mark_point(
size=75,
filled=True,
fillOpacity=0.9,
strokeOpacity=1,
stroke="black",
)
)
titer_chart = (
(per_rep_chart + median_chart)
.add_params(virus_selection)
.properties(
height=alt.Step(11),
width=250,
title=f"{group} {serum} median (large points) and per-replicate (small points) titers",
)
.configure_axis(grid=False)
)
titer_chart
Plot individual curves for any viruses failing QC¶
Plot individual curves for viruses failing QC.
Note that potentially some of these titers may still be retained if the viruses in question are specified in viruses_ignore_qc
of qc_thresholds
.
print(f"Neutralization curves for the {len(viruses_failing_qc)} viruses failing QC:")
if len(viruses_failing_qc):
fig, _ = fits_noqc.plotReplicates(
viruses=viruses_failing_qc,
attempt_shared_legend=False,
legendfontsize=8,
ncol=4,
heightscale=1.2,
widthscale=1.2,
subplot_titles="{virus}",
draw_in_bounds=True,
)
_ = fig.suptitle(
f"neutralization curves for viruses failing QC for {group} {serum}",
y=1,
fontsize=18,
fontweight="bold",
)
fig.tight_layout()
Neutralization curves for the 0 viruses failing QC:
Get the viruses to drop for QC failures¶
Drop any viruses that fail QC and are not specified in viruses_ignore_qc
of qc_thresholds
:
viruses_to_drop = {
v: reason
for (v, reason) in viruses_failing_qc.items()
if v not in qc_thresholds["viruses_ignore_qc"]
}
print(f"Dropping {len(viruses_to_drop)} viruses for failing QC:")
yaml.YAML(typ="rt").dump(viruses_to_drop, sys.stdout)
if nkept := (len(viruses_failing_qc) - len(viruses_to_drop)):
print(
f"\nRetaining {nkept} viruses that fail QC because they are in `viruses_ignore_qc`:"
)
print(
{
v: reason
for (v, reason) in viruses_failing_qc.items()
if v in qc_thresholds["viruses_ignore_qc"]
}
)
print(f"\nWriting QC drops to {qc_drops_file}")
with open(qc_drops_file, "w") as f:
yaml.YAML(typ="rt").dump(viruses_to_drop, f)
Dropping 0 viruses for failing QC: {}
Writing QC drops to results/sera/PennVaccineCohort_PENN23_y1981_s053_d28/qc_drops.yml
Get and plot the neutralization curves for all retained viruses¶
First, get the CurveFits
for just those retained viruses (dropping ones that fail QC), and plot:
fits_qc = neutcurve.CurveFits.combineCurveFits(
[fits_noqc],
viruses=[v for v in viruses if v not in viruses_to_drop],
)
assert len(viruses) == len(fits_qc.viruses[serum]) + len(viruses_to_drop)
fig, _ = fits_qc.plotReplicates(
attempt_shared_legend=False,
legendfontsize=8,
ncol=4,
heightscale=1.2,
widthscale=1.2,
subplot_titles="{virus}",
viruses=[v for v in viruses if v not in viruses_to_drop],
draw_in_bounds=True,
)
_ = fig.suptitle(
f"neutralization curves for retained viruses for {group} {serum}",
y=1,
fontsize=18,
fontweight="bold",
)
fig.tight_layout()
display(fig)
print(f"Saving to plot of curves to {curves_pdf}")
fig.savefig(curves_pdf)
plt.close(fig)
Saving to plot of curves to results/sera/PennVaccineCohort_PENN23_y1981_s053_d28/curves.pdf
Save the CurveFits
to a pickle file:
with open(output_pickle, "wb") as f:
pickle.dump(fits_qc, f)
Write the titers (excluding QC dropped viruses) to a CSV:
print(f"Writing titers to {titers_csv}")
(
median_titers_noqc.query("virus not in @viruses_to_drop")[
[
"group",
"serum",
"virus",
"titer",
"titer_bound",
"titer_sem",
"n_replicates",
"titer_as",
]
].to_csv(titers_csv, index=False, float_format="%.4g")
)
Writing titers to results/sera/PennVaccineCohort_PENN23_y1981_s053_d28/titers.csv