import json import pandas as pd import os AAs = set('ACDEFGHIKLMNPQRSTVWY') seqs_abs = { 'cr6261_vh': 'EVQLVESGAEVKKPGSSVKVSCKASGGPFRSYAISWVRQAPGQGPEWMGGIIPIFGTTKYAPKFQGRVTITADDFAGTVYMELSSLRSEDTAMYYCAKHMGYQVRETMDVWGKGTTVTVSS', 'cr9114_vh': 'QVQLVQSGAEVKKPGSSVKVSCKSSGGTSNNYAISWVRQAPGQGLDWMGGISPIFGSTAYAQKFQGRVTISADIFSNTAYMELNSLTSEDTAVYFCARHGNYYYYSGMDVWGQGTTVTVSS', 'g6_vh': 'EVQLVESGGGLVQPGGSLRLSCAASGFTISDYWIHWVRQAPGKGLEWVAGITPAGGYTYYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCARFVFFLPYAMDYWGQGTLVTV', 'g6_vl': 'DIQMTQSPSSLSASVGDRVTITCRASQDVSTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSGSGTDFTLTISSLQPEDFATYYCQQSYTTPPTFGQGTKVEIK', 'beb_vh': 'QITLKESGPTLVKPTQTLTLTCTFSGFSLSISGVGVGWLRQPPGKALEWLALIYWDDDKRYSPSLKSRLTISKDTSKNQVVLKMTNIDPVDTATYYCAHHSISTIFDHWGQGTLVTVSS', 'beb_vl' : 'QSALTQPASVSGSPGQSITISCTATSSDVGDYNYVSWYQQHPGKAPKLMIFEVSDRPSGISNRFSGSKSGNTASLTISGLQAEDEADYYCSSYTTSSAVFGGGTKLTVL', 'sa58_vh': 'QVQLAQSGSELRKPGASVKVSCDTSGHSFTSNAIHWVRQAPGQGLEWMGWINTDTGTPTYAQGFTGRFVFSLDTSARTAYLQISSLKADDTAVFYCARERDYSDYFFDYWGQGTLVTVSS', 'sa58_vl': 'EVVMTQSPASLSVSPGERATLSCRARASLGISTDLAWYQQRPGQAPRLLIYGASTRATGIPARFSGSGSGTEFTLTISSLQSEDSAVYYCQQYSNWPLTFGGGTKVEIK', } def parse_abysis(seq, seq_name): fname = f'data/abysis/abysis_counts_{seq_name}.json' with open(fname) as f: json_data = json.load(f) data = [] for idx, freq_table in enumerate(json_data['frequencies']): wt = seq[idx] total = freq_table['total'] for entry in freq_table['counts']: if entry['aa'] == seq[idx]: wt_frac = entry['c'] / total aa_to_freq, seen = {}, set() for entry in freq_table['counts']: mt = entry['aa'] seen.add(mt) counts = entry['c'] frac = entry['c'] / total ratio = frac / wt_frac data.append([ idx + 1, wt, mt, counts, frac, ratio ]) for mt in AAs - seen: data.append([ idx + 1, wt, mt, 0, 0., 0. ]) df = pd.DataFrame(data, columns=[ 'pos', 'wt', 'mt', 'counts', 'fraction', 'likelihood_ratio', ]) if any(prefix in seq_name for prefix in ['cr6261', 'cr9114', 'g6']): subdirectory = seq_name.split('_')[0] else: subdirectory = '' output_dir = os.path.join('output', 'ab_mutagenesis_expts', subdirectory) os.makedirs(output_dir, exist_ok=True) output_path = os.path.join(output_dir, f'abysis_counts_{seq_name}.txt') df.to_csv(output_path, sep='\t') if __name__ == '__main__': for seq_name in seqs_abs: seq = seqs_abs[seq_name] parse_abysis(seq, seq_name)