diff --git a/data/benchmark_pipeline.py b/data/benchmark_pipeline.py new file mode 100644 index 00000000..6cf465f0 --- /dev/null +++ b/data/benchmark_pipeline.py @@ -0,0 +1,99 @@ +from argparse import ArgumentParser +import pandas as pd +from pathlib import Path + +def filter_sample(clusters_csv,benchmark_clusters,t): + cl_bench=benchmark_clusters.loc[:,'cluster'].value_counts() + new_bench=benchmark_clusters['id'].tolist() + bench_deleted=[] + cluster_deleted=pd.DataFrame() + for _,row in benchmark_clusters.iterrows(): + if row['size']/cl_bench[row['cluster']]>t: + new_bench.remove(row['id']) + bench_deleted.append(row['id']) + else: + cluster_deleted=pd.concat([cluster_deleted,clusters_csv[clusters_csv[clustering_regions].isin([row['cluster']])]]) + clusters_csv=clusters_csv[~clusters_csv[clustering_regions].isin([row['cluster']])] + return clusters_csv,pd.Series(new_bench),cluster_deleted,pd.Series(bench_deleted) + + +def benchmark_statistics(benchmark_path,clusters_path,save=False): + benchmark_csv=pd.read_csv(benchmark_path,header=None) + clusters_csv=pd.read_csv(clusters_path,sep='\t') + benchmark_clusters_csv=pd.DataFrame() + #d=pd.DataFrame() + for _,v in benchmark_csv.iterrows(): + for _,row in clusters_csv.iterrows(): + if v.values[0] in row['id']: + benchmark_clusters_csv.loc[row['id'],'id_complex']=v.values[0] + benchmark_clusters_csv.loc[row['id'],'id']=row['id'] + benchmark_clusters_csv.loc[row['id'],'cluster']=row[clustering_regions] + benchmark_clusters_csv.loc[row['id'],'size']=(row[clustering_regions]==clusters_csv[clustering_regions]).sum() + + benchmark_clusters_csv['size']=benchmark_clusters_csv['size'].astype(int) + if save: + benchmark_clusters_csv.sort_values('cluster').to_csv(f'benchmark_clusters_{clustering_regions}.tsv',sep='\t',index=False) + return benchmark_clusters_csv + +def is_in_benchmark(clusters_path,benchmark_clusters_csv,save=False): + clusters_csv=pd.read_csv(clusters_path,sep='\t') + clusters=clusters_csv[clustering_regions].unique() + in_benchmark=pd.DataFrame() + + for cl in clusters: + ids_of_clusters=clusters_csv.loc[clusters_csv[clustering_regions]==cl] + if set(ids_of_clusters[clustering_regions].tolist()).intersection(set(benchmark_clusters_csv['cluster'])): + in_benchmark.loc[cl,'in_benchmark']=True + in_benchmark.loc[cl,'size']=benchmark_clusters_csv.loc[benchmark_clusters_csv['cluster']==cl,'size'].iloc[0] + else: + in_benchmark.loc[cl,'in_benchmark']=False + in_benchmark.loc[cl,'size']=0 + in_benchmark['0']=in_benchmark.index + in_benchmark['size']=in_benchmark['size'].astype(int) + in_benchmark=in_benchmark[['0','in_benchmark','size']].dropna() + + if save: + in_benchmark.sort_values('0').to_csv(f'in_benchmark_{clustering_regions}.tsv',sep='\t',index=False) + return in_benchmark + + +if __name__=='__main__': + parser=ArgumentParser('Create fastas for clustering via MMseqs') + parser.add_argument('--benchmark_path', type=str,default=Path('rabd_benchmark.txt')) + parser.add_argument('--clusters_path', type=str,default=Path("MMseq/joined_clusters.tsv")) + parser.add_argument('--clustering_regions',default='renamed_clusterRes_0.5_DB_CDR_H3.fasta_cluster') + parser.add_argument('--threshhold',default=30) + parser.add_argument('--sample_dir',default=Path('train_val_test'),type=Path) + + # parser.add_argument('--identity',default=0.5,type=float) + # parser.add_argument('--result_folder',default='MMseq',type=Path) + args=parser.parse_args() + benchmark_path=args.benchmark_path + clusters_path=args.clusters_path + clustering_regions=args.clustering_regions + t=args.threshhold + sample_dir=args.sample_dir + + benchmark_clusters_csv=benchmark_statistics(benchmark_path,clusters_path,True) + + benchmark_csv=pd.read_csv(benchmark_path,header=None) + clusters_csv=pd.read_csv(clusters_path,sep='\t') + + + in_benchmark=is_in_benchmark(clusters_path,benchmark_clusters_csv,True) + + + + + + train,test,del_train,del_test=filter_sample(clusters_csv,benchmark_clusters_csv,t) + + sample_dir.mkdir(exist_ok=True,parents=True) + train[['id',clustering_regions]].to_csv(sample_dir/f'train_and_val_{clustering_regions}.tsv',sep='\t',index=False) + test.to_csv(sample_dir/f'test_{clustering_regions}.tsv',sep='\t',index=False,header=False) + del_train['id'].to_csv(sample_dir/f'deleted_train_and_val_{clustering_regions}.tsv',sep='\t',index=False,header=False) + del_test.to_csv(sample_dir/f'deleted_test_{clustering_regions}.tsv',sep='\t',index=False,header=False) + + s=set(train['id'].values.tolist())|set(test.values.tolist())|set(del_train['id'].values.tolist())|set(del_test.values.tolist()) + s=set(s) + assert len(s)==pd.read_csv(clusters_path,sep='\t').shape[0] \ No newline at end of file diff --git a/data/create_clusters_table.py b/data/create_clusters_table.py new file mode 100644 index 00000000..32e24b62 --- /dev/null +++ b/data/create_clusters_table.py @@ -0,0 +1,24 @@ +from pathlib import Path +import pandas as pd +from argparse import ArgumentParser + +if __name__=='__main__': + parser=ArgumentParser('Join tsvs') + parser.add_argument('--tsvs',type=Path,nargs='+') + parser.add_argument('--joined_tsv',type=Path,default=Path('MMseq/joined_clusters.tsv')) + args=parser.parse_args() + tsvs=args.tsvs + joined_tsv=args.joined_tsv + df_list=[pd.read_csv(t,sep='\t',header=None,names=[t.stem,'id']) for t in tsvs] + df_joined=df_list[0].copy() + for df in df_list[1:]: + df_joined=df_joined.merge(df,on='id',how='outer',suffixes=('_x', '_y')) + cols=['id'] + for col in df_joined.columns: + if col!='id': + cols.append(col) + df_joined=df_joined[cols] + if joined_tsv.exists(): + raise ValueError(f"file with path {joined_tsv} already exists, change output_file variable or delete file {joined_tsv}") + else: + df_joined.to_csv(joined_tsv,sep='\t',index=False) diff --git a/data/create_fastas_for_mmseqs2.py b/data/create_fastas_for_mmseqs2.py new file mode 100644 index 00000000..e080250a --- /dev/null +++ b/data/create_fastas_for_mmseqs2.py @@ -0,0 +1,97 @@ +from pathlib import Path +from enum import Enum +from tqdm import tqdm +import logging +import traceback +from pathlib import Path +from typing import Iterable, cast +from argparse import ArgumentParser +import pandas as pd +import subprocess + +from proteinlib.structure.antibody_antigen_complex import AntibodyAntigenComplex, NumberingScheme + +class Regions(Enum): + FR_L1=0 + CDR_L1=1 + FR_L2=2 + CDR_L2=3 + FR_L3=4 + CDR_L3=5 + FR_L4=6 + + FR_H1=7 + CDR_H1=8 + FR_H2=9 + CDR_H2=10 + FR_H3=11 + CDR_H3=12 + FR_H4=13 + +if __name__=='__main__': + logging.basicConfig(filename='creating_fastas.log', level=logging.DEBUG) + + parser=ArgumentParser('Create fastas for clustering via MMseqs') + parser.add_argument('--summary_csv', type=str,default=Path('/mnt/sabdab/summary.csv')) + parser.add_argument('--chothia_subdir', type=str,default=Path("/mnt/sabdab/chothia")) + parser.add_argument('--regions',default=['CDR_L1','CDR_L2','CDR_L3','CDR_H1','CDR_H2','CDR_H3'],nargs='*') + parser.add_argument('--identity',default=0.5,type=float) + parser.add_argument('--result_folder',default='MMseq',type=Path) + args=parser.parse_args() + + summary_csv=args.summary_csv + chothia_subdir=args.chothia_subdir + regions_list=args.regions + + # only protein and peptide antigens + df = ( + pd.read_csv( + summary_csv, + sep="\t", + usecols=["pdb", "Hchain", "Lchain", "antigen_chain", "antigen_type"], + ) + .query("antigen_type in ('protein', 'peptide', 'protein | peptide', 'peptide | protein')") + .dropna() + .reset_index() + ) + print(f"Summary records: {df.shape[0]}") + d={} + for i, row in tqdm(cast(Iterable[tuple[int, pd.Series]], df.iterrows()),total=df.shape[0]): + uid = f'{row["pdb"]}_{row["Hchain"]}+{row["Lchain"]}-{row["antigen_chain"]}' + try: + sequences: list[tuple[str, str]] = [] + # row = cast(pd.Series, row) + antigen_chains = tuple(map(lambda s: s.strip(), str(row["antigen_chain"]).split(" | "))) + ab_complex = AntibodyAntigenComplex.from_pdb( + pdb=chothia_subdir / f"{row['pdb']}.pdb", + heavy_chain_id=str(row["Hchain"]), + light_chain_id=str(row["Lchain"]), + antigen_chain_ids=antigen_chains, + numbering=NumberingScheme.CHOTHIA, + ) + # get regions + vh_regions = [region.sequence for region in list(ab_complex.antibody.heavy_chain.regions)] + vl_regions = [region.sequence for region in list(ab_complex.antibody.light_chain.regions)] + all_regions = [*vl_regions, *vh_regions] + + for region in regions_list: + sequences.append(all_regions[getattr(Regions,region).value]) + d[uid]=''.join(sequences) + except FileNotFoundError: + continue + except Exception as err: + logging.warning(f"In complex {uid}: {traceback.format_exception(err)}") + print(f"In complex {uid}: {traceback.format_exception(err)}") + continue + fasta_str='' + for k,v in d.items(): + fasta_str='\n'.join([fasta_str,f">{k}\n{v}"]) + + fasta_str=fasta_str.strip() + dir=Path(args.result_folder)/'__'.join(args.regions) + dir.mkdir(exist_ok=True,parents=True) + fasta_file=dir/f'DB_{"_".join(regions_list)}.fasta' + output_path=Path(fasta_file) + output_path.write_text(fasta_str) + + subprocess.run(['mmseqs', 'easy-cluster', f'{fasta_file}', str(dir/f'clusterRes_{args.identity}_{fasta_file.name}'), 'tmp', '--min-seq-id', f'{args.identity}', '-c', '0.8', '--cov-mode', '1']) diff --git a/data/mark_clusters.py b/data/mark_clusters.py new file mode 100644 index 00000000..47e79552 --- /dev/null +++ b/data/mark_clusters.py @@ -0,0 +1,28 @@ +import pandas as pd +from pathlib import Path + +if __name__=='__main__': + benchmark_path=Path('benchmark_clusters.tsv') + clusters_path=Path('/mnt/sabdab/clusters.tsv') + + clusters_csv=pd.read_csv(clusters_path,sep='\t')#.dropna() + benchmark_csv=pd.read_csv(benchmark_path,sep='\t') + + clusters=clusters_csv['renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster'].unique() + clusters_size=clusters_csv['renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster'].value_counts() + in_benchmark=pd.DataFrame() + + for cl in clusters: + ids_of_clusters=clusters_csv.loc[clusters_csv['renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster']==cl] + if set(ids_of_clusters['renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster'].tolist()).intersection(set(benchmark_csv['cluster'])): + + in_benchmark.loc[cl,'in_benchmark']=True#ids_of_clusters['renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster'].isin(benchmark_csv['cluster'])#.any() + in_benchmark.loc[cl,'size']=benchmark_csv.loc[benchmark_csv['cluster']==cl,'size'].iloc[0] + else: + in_benchmark.loc[cl,'in_benchmark']=False + in_benchmark.loc[cl,'size']=0 + #in_benchmark=pd.concat([in_benchmark,ser]) + in_benchmark['0']=in_benchmark.index + in_benchmark['size']=in_benchmark['size'].astype(int) + in_benchmark=in_benchmark[['0','in_benchmark','size']] + in_benchmark.sort_values('0').to_csv('in_benchmark.tsv',sep='\t',index=False) \ No newline at end of file diff --git a/data/plot_by_threshhold.py b/data/plot_by_threshhold.py new file mode 100644 index 00000000..97fdfcef --- /dev/null +++ b/data/plot_by_threshhold.py @@ -0,0 +1,57 @@ +import pandas as pd +from pathlib import Path +from tqdm import tqdm + +def filter_sample(clusters_csv,benchmark_clusters,t): + #ids_bench=in_benchmark.dropna().loc[in_benchmark['in_benchmark'],'0'].to_list() + cl_bench=benchmark_clusters.loc[:,'cluster'].value_counts() + new_bench=benchmark_clusters['id'].tolist() + for _,row in benchmark_clusters.iterrows(): + if row['size']/cl_bench[row['cluster']]>t: + new_bench.remove(row['id']) + else: + clusters_csv=clusters_csv[~clusters_csv[clustering_regions].isin([row['cluster']])] + return clusters_csv,pd.Series(new_bench) + + +if __name__=='__main__': + # %% + import pandas as pd + from pathlib import Path + from tqdm import tqdm + + def filter_sample(clusters_csv,benchmark_clusters,t): + #ids_bench=in_benchmark.dropna().loc[in_benchmark['in_benchmark'],'0'].to_list() + cl_bench=benchmark_clusters.loc[:,'cluster'].value_counts() + new_bench=benchmark_clusters['id'].tolist() + for _,row in benchmark_clusters.iterrows(): + if row['size']/cl_bench[row['cluster']]>t: + new_bench.remove(row['id']) + else: + clusters_csv=clusters_csv[~clusters_csv[clustering_regions].isin([row['cluster']])] + return clusters_csv,pd.Series(new_bench) + + clusters_path=Path('/mnt/sabdab/clusters_with_1w72.tsv') + clusters_csv=pd.read_csv(clusters_path,sep='\t')#.dropna() + + clustering_regions='renamed_clusterRes_0.5_DB_CDR_H1_CDR_H2_CDR_H3_CDR_L1_CDR_L2_CDR_L3.fasta_cluster' + clustering_regions='renamed_clusterRes_0.5_DB_CDR_H3.fasta_cluster' + benchmark_path=f'/data/user/shapoval/ProteinMPNN/benchmark_clusters_{clustering_regions}.tsv' + benchmark_clusters_csv=pd.read_csv(benchmark_path,sep='\t') + + T=range(200) + train_size,test_size=[],[] + for t in tqdm(T): + train,test=filter_sample(clusters_csv,benchmark_clusters_csv,t) + train_size.append(train.shape[0]) + test_size.append(test.shape[0]) + + import matplotlib.pyplot as plt + + plt.plot(train_size,test_size) + #plt.title(clustering_regions[19:67]) + plt.title(clustering_regions[19:]) + plt.grid() + plt.xlabel('train size') + plt.ylabel('test size') + plt.show() diff --git a/data/remove_benchmark_from_sample.py b/data/remove_benchmark_from_sample.py new file mode 100644 index 00000000..b4e3de62 --- /dev/null +++ b/data/remove_benchmark_from_sample.py @@ -0,0 +1,18 @@ +import pandas as pd + +if __name__=='__main__': + in_bench=pd.read_csv('in_benchmark.tsv',sep='\t').dropna() + clusters_csv=pd.read_csv('/mnt/sabdab/clusters.tsv',sep='\t').dropna() + df=pd.DataFrame() + l=[] + # for _,row in in_bench.iterrows(): + # #print(row['in_benchmark']) + # if row['in_benchmark']: + # l.append(row[0]) + ids_bench=in_bench.loc[in_bench['in_benchmark'],'0'].to_list() + + df_del=clusters_csv[~clusters_csv['renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster'].isin(ids_bench)] + # for _,row in clusters_csv.iterrows(): + # if row['renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster'] not in ids_bench: + # df=pd.concat([df,row.to_list()],ignore_index=True) + df_del.to_csv('filtered_sample.tsv',sep='\t',index=False) \ No newline at end of file diff --git a/data/replace_cluster_names.py b/data/replace_cluster_names.py new file mode 100644 index 00000000..0b44e497 --- /dev/null +++ b/data/replace_cluster_names.py @@ -0,0 +1,44 @@ +import pandas as pd +from pathlib import Path +from argparse import ArgumentParser + +def df_to_dict(df): + d={} + for row in df.iterrows(): + k,v=row[1].values + if k not in d: + d[k]=[v] + else: + d[k].append(v) + return d + +def get_sorted_names(d): + d_sort={} + for k,v in d.items(): + d_sort[k]=min(v) + return d_sort + +def rename_clusters(df,d_sorted): + df_new=pd.DataFrame() + for row in df.iterrows(): + k,_=row[1].values + #df_new=pd.concat([df_new,pd.DataFrame({'0':d_sorted[k],'1':row[1].values[1]})]) + df_new=pd.concat([df_new,pd.DataFrame({0:d_sorted[k],1:row[1].values[1]},index=[0])],ignore_index=True) + return df_new + +if __name__=='__main__': + parser=ArgumentParser('Rename clusters') + parser.add_argument('--cluster_tsv',type=Path) + args=parser.parse_args() + cluster_csv=args.cluster_tsv + renamed_csv=Path(f'{str(cluster_csv.parent)}/renamed_{cluster_csv.name}') + df=pd.read_csv(cluster_csv,sep="\t",header=None) + d=df_to_dict(df) + d_sorted=get_sorted_names(d) + df_clusters_renamed=rename_clusters(df,d_sorted) + assert df_clusters_renamed.shape[0]==df.shape[0] + if renamed_csv.exists(): + raise ValueError(f"file with path {renamed_csv} already exists, change output_file variable or delete file {renamed_csv}") + else: + df_clusters_renamed.to_csv(renamed_csv,sep='\t',header=False,index=False) + print(renamed_csv) diff --git a/data/train_test_val_split.py b/data/train_test_val_split.py new file mode 100644 index 00000000..31647d33 --- /dev/null +++ b/data/train_test_val_split.py @@ -0,0 +1,45 @@ + +from argparse import ArgumentParser +from pathlib import Path +import random +import pandas as pd + + +def train_test_split(df,test_part=0.2,seed=42): + random.seed(seed) + train,test=[],[] + df.columns=[0,1] + clusters=df[1].value_counts() + i=0 + while len(test)test_part: + train+=df.loc[I,0].values.tolist() + else: + test+=df.loc[I,0].values.tolist() + i+=1 + if it:\n", + " if row[1] not in d:\n", + " d[row[1]]=df.loc[df[0]==row[0],1].values.tolist()\n", + " else:\n", + " d[row[1]]+=df.loc[df[0]==row[0],1].values.tolist()\n", + " elif row[1] not in d:\n", + " d[row[1]]=df.loc[df[0]==row[0],1].values.tolist()\n", + " else:\n", + " d[row[1]]+=df.loc[df[0]==row[0],1].values.tolist()\n", + " return d\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8b5732b4-f1d2-4f9e-9b5d-31ad4129528d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DEBUG:matplotlib:matplotlib data path: /data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data\n", + "DEBUG:matplotlib:CONFIGDIR=/data/user/shapoval/.config/matplotlib\n", + "DEBUG:matplotlib:interactive is False\n", + "DEBUG:matplotlib:platform is linux\n", + "DEBUG:matplotlib:CACHEDIR=/data/user/shapoval/.cache/matplotlib\n", + "DEBUG:matplotlib.font_manager:Using fontManager instance from /data/user/shapoval/.cache/matplotlib/fontlist-v330.json\n", + "DEBUG:matplotlib.pyplot:Loaded backend module://matplotlib_inline.backend_inline version unknown.\n", + "DEBUG:matplotlib.pyplot:Loaded backend module://matplotlib_inline.backend_inline version unknown.\n", + "DEBUG:matplotlib.font_manager:findfont: Matching sans\\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0.\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmsy10.ttf', name='cmsy10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf', name='DejaVu Sans', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 0.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymBol.ttf', name='STIXSizeThreeSym', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUniIta.ttf', name='STIXNonUnicode', style='italic', variant='normal', weight=400, stretch='normal', size='scalable')) = 11.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUni.ttf', name='STIXNonUnicode', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralItalic.ttf', name='STIXGeneral', style='italic', variant='normal', weight=400, stretch='normal', size='scalable')) = 11.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymBol.ttf', name='STIXSizeOneSym', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymReg.ttf', name='STIXSizeTwoSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymReg.ttf', name='STIXSizeFourSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Bold.ttf', name='DejaVu Sans', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 0.33499999999999996\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymBol.ttf', name='STIXSizeFourSym', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono.ttf', name='DejaVu Sans Mono', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Bold.ttf', name='DejaVu Serif', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizFiveSymReg.ttf', name='STIXSizeFiveSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymReg.ttf', name='STIXSizeOneSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-BoldOblique.ttf', name='DejaVu Sans Mono', style='oblique', variant='normal', weight=700, stretch='normal', size='scalable')) = 11.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralBol.ttf', name='STIXGeneral', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymReg.ttf', name='STIXSizeThreeSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmr10.ttf', name='cmr10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmex10.ttf', name='cmex10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-BoldItalic.ttf', name='DejaVu Serif', style='italic', variant='normal', weight=700, stretch='normal', size='scalable')) = 11.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralBolIta.ttf', name='STIXGeneral', style='italic', variant='normal', weight=700, stretch='normal', size='scalable')) = 11.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Oblique.ttf', name='DejaVu Sans Mono', style='oblique', variant='normal', weight=400, stretch='normal', size='scalable')) = 11.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneral.ttf', name='STIXGeneral', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUniBolIta.ttf', name='STIXNonUnicode', style='italic', variant='normal', weight=700, stretch='normal', size='scalable')) = 11.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif.ttf', name='DejaVu Serif', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmmi10.ttf', name='cmmi10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerifDisplay.ttf', name='DejaVu Serif Display', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymBol.ttf', name='STIXSizeTwoSym', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmss10.ttf', name='cmss10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmb10.ttf', name='cmb10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Oblique.ttf', name='DejaVu Sans', style='oblique', variant='normal', weight=400, stretch='normal', size='scalable')) = 1.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUniBol.ttf', name='STIXNonUnicode', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmtt10.ttf', name='cmtt10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansDisplay.ttf', name='DejaVu Sans Display', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-BoldOblique.ttf', name='DejaVu Sans', style='oblique', variant='normal', weight=700, stretch='normal', size='scalable')) = 1.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Bold.ttf', name='DejaVu Sans Mono', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Italic.ttf', name='DejaVu Serif', style='italic', variant='normal', weight=400, stretch='normal', size='scalable')) = 11.05\n", + "DEBUG:matplotlib.font_manager:findfont: Matching sans\\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans ('/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000.\n", + "DEBUG:matplotlib.font_manager:findfont: Matching sans\\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0.\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmsy10.ttf', name='cmsy10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf', name='DejaVu Sans', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 0.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymBol.ttf', name='STIXSizeThreeSym', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUniIta.ttf', name='STIXNonUnicode', style='italic', variant='normal', weight=400, stretch='normal', size='scalable')) = 11.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUni.ttf', name='STIXNonUnicode', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralItalic.ttf', name='STIXGeneral', style='italic', variant='normal', weight=400, stretch='normal', size='scalable')) = 11.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymBol.ttf', name='STIXSizeOneSym', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymReg.ttf', name='STIXSizeTwoSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymReg.ttf', name='STIXSizeFourSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Bold.ttf', name='DejaVu Sans', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 0.33499999999999996\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizFourSymBol.ttf', name='STIXSizeFourSym', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono.ttf', name='DejaVu Sans Mono', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Bold.ttf', name='DejaVu Serif', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizFiveSymReg.ttf', name='STIXSizeFiveSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizOneSymReg.ttf', name='STIXSizeOneSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-BoldOblique.ttf', name='DejaVu Sans Mono', style='oblique', variant='normal', weight=700, stretch='normal', size='scalable')) = 11.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralBol.ttf', name='STIXGeneral', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizThreeSymReg.ttf', name='STIXSizeThreeSym', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmr10.ttf', name='cmr10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmex10.ttf', name='cmex10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-BoldItalic.ttf', name='DejaVu Serif', style='italic', variant='normal', weight=700, stretch='normal', size='scalable')) = 11.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralBolIta.ttf', name='STIXGeneral', style='italic', variant='normal', weight=700, stretch='normal', size='scalable')) = 11.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Oblique.ttf', name='DejaVu Sans Mono', style='oblique', variant='normal', weight=400, stretch='normal', size='scalable')) = 11.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneral.ttf', name='STIXGeneral', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUniBolIta.ttf', name='STIXNonUnicode', style='italic', variant='normal', weight=700, stretch='normal', size='scalable')) = 11.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif.ttf', name='DejaVu Serif', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmmi10.ttf', name='cmmi10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerifDisplay.ttf', name='DejaVu Serif Display', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXSizTwoSymBol.ttf', name='STIXSizeTwoSym', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmss10.ttf', name='cmss10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmb10.ttf', name='cmb10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Oblique.ttf', name='DejaVu Sans', style='oblique', variant='normal', weight=400, stretch='normal', size='scalable')) = 1.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/STIXNonUniBol.ttf', name='STIXNonUnicode', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/cmtt10.ttf', name='cmtt10', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansDisplay.ttf', name='DejaVu Sans Display', style='normal', variant='normal', weight=400, stretch='normal', size='scalable')) = 10.05\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-BoldOblique.ttf', name='DejaVu Sans', style='oblique', variant='normal', weight=700, stretch='normal', size='scalable')) = 1.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Bold.ttf', name='DejaVu Sans Mono', style='normal', variant='normal', weight=700, stretch='normal', size='scalable')) = 10.335\n", + "DEBUG:matplotlib.font_manager:findfont: score(FontEntry(fname='/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Italic.ttf', name='DejaVu Serif', style='italic', variant='normal', weight=400, stretch='normal', size='scalable')) = 11.05\n", + "DEBUG:matplotlib.font_manager:findfont: Matching sans\\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0 to DejaVu Sans ('/data/user/shapoval/.conda/envs/test_abdesign/envs/abdesign/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.050000.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGxCAYAAABIjE2TAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABBVElEQVR4nO3deXRUVb728acyVGUgFIQMlUiIAQEVECUgAiqgCERBaVRUbAW1aW2Ge2lBWxzRuy6x9Tq9TYMjiIoNbbegtjigQJBGlFEmWwMEAUmIIBkJGff7B6akMkBCqnIqyfez1lmLOmdX1e+crtV53HuffWzGGCMAAAA/EmB1AQAAAFURUAAAgN8hoAAAAL9DQAEAAH6HgAIAAPwOAQUAAPgdAgoAAPA7BBQAAOB3CCgAAMDvEFAAH9u6davuuOMOJSUlKSQkRK1atVKvXr301FNP6eeff3a3GzRokAYNGuSzOubMmaPXX3/dZ59/po4cOaIZM2bo/PPPV3h4uJxOp84991zddttt2rp1q7vd66+/LpvNpr1791pXbB1UVFTozTff1JAhQxQVFaXg4GDFxMRoxIgR+uCDD1RRUSFJ2rt3r2w2m3sLDg5Wu3bt1KdPH/3xj3/Ujh07qn32qlWrPN4TGBio6OhojRw5Uhs2bGjsUwV8KsjqAoDm7JVXXtHEiRPVtWtX3XfffTr//PNVWlqqDRs26MUXX9SXX36pJUuWNEotc+bMUVRUlMaPH98o31cXBQUFuuSSS1RQUKD77rtPPXv2VFFRkb7//nu9++672rJliy644AJJ0jXXXKMvv/xScXFxFlddu+PHj2vUqFH69NNPdfPNN2vu3LlyuVz66aef9PHHH+vGG2/U4sWLdd1117nfM2XKFI0dO1YVFRXKycnR5s2bNW/ePP3lL39Ramqq7rvvvmrfM2vWLA0ePFilpaXavHmzHn/8cQ0cOFBbtmxR586dG/OUAd8xAHxi7dq1JjAw0AwfPtwcP3682vHi4mLz3nvvuV8PHDjQDBw40Gf1dOvWzeufX1FRYY4dO3bG7583b56RZFasWFHj8fLy8jP+bCv84Q9/MJLMggULajz+/fffm2+++cYYY0xGRoaRZJ5++ulq7Y4dO2aGDx9uJJlly5a5969cudJIMu+8845H+wULFhhJ5tFHH/Xi2QDWYogH8JFZs2bJZrPp5ZdflsPhqHbcbrfr2muvrfX9ld35q1at8thfOTRw8nDNnj17dPPNNys+Pl4Oh0OxsbG68sortWXLFknS2WefrR07digtLc09PHD22We735+Xl6fp06crKSlJdrtdZ511lqZOnarCwkKP77bZbJo8ebJefPFFnXfeeXI4HFqwYIEkae7cuerZs6datWqliIgInXvuuXrwwQdPeY2OHDkiSbX2igQE/Pp/UVWHeKoOd5y8nXxukrR48WL169dP4eHhatWqlYYNG6bNmzefsrb6ysrK0quvvqphw4bp9ttvr7FN586d3T1CpxIaGqrXXntNwcHBevrpp0/bvnfv3pKkQ4cO1a9owI8xxAP4QHl5uVasWKHk5GQlJCT4/PuuvvpqlZeX66mnnlKHDh10+PBhrV27Vjk5OZKkJUuW6IYbbpDT6dScOXMkyR2ajh07poEDB+rAgQN68MEHdcEFF2jHjh169NFHtW3bNn322Wey2Wzu71q6dKm++OILPfroo3K5XIqJidGiRYs0ceJETZkyRf/3f/+ngIAA7dq1Szt37jxl3f369ZMk3X777XrwwQd12WWXqV27dnU65169eunLL7/02Jeenq677rpL3bp1c++bNWuWHn74Yd1xxx16+OGHVVJSoqefflqXXXaZvv76a51//vl1+r7TWblypUpLSzVq1CivfF58fLySk5O1du1alZWVKSio9v+7zsjIkCR16dLFK98N+AWru3CA5igrK8tIMjfffHOd31N1iKeyO3/lypUe7SqHBubPn2+MMebw4cNGknn++edP+fm1DfGkpqaagIAAs379eo/9//jHP6oNMUgyTqfT/Pzzzx5tJ0+ebNq0aXP6k6zBE088Yex2u5FkJJmkpCRzzz33uIdCKs2fP99IMhkZGTV+zqFDh0zHjh1Nt27dzNGjR40xxuzbt88EBQWZKVOmeLTNz883LpfLjBkz5oxqrsmTTz5pJJmPP/64Tu1PNcRT6aabbjKSzKFDh4wxv/4mFi9ebEpLS82xY8fMv//9b9O1a1dz/vnnu88baA4Y4gGauMjISHXq1ElPP/20nn32WW3evNl9p0hd/Otf/1L37t114YUXqqyszL0NGzasxiGmK664Qm3btvXYd/HFFysnJ0e33HKL3nvvPR0+fLjO3//II49o3759mjdvnu6++261atVKL774opKTk/W3v/2tTp9RWFioa665RsePH9dHH32kNm3aSJI++eQTlZWV6fbbb/c4t5CQEA0cOLDaufkbY0yN+2+66SYFBwcrLCxMAwYMUF5enj788EP3eQPNAQEF8IGoqCiFhYW5u959yWaz6fPPP9ewYcP01FNPqVevXoqOjtZ//dd/KT8//7TvP3TokLZu3arg4GCPLSIiQsaYamGjpvkit912m+bNm6cffvhB119/vWJiYtS3b18tX768TucQGxurO+64Qy+++KK2bt2qtLQ02e12/fd///dp31tWVqYbbrhB33//vZYtW+YxpFY5J6NPnz7Vzm/x4sX1ClKn06FDB0ny6v/mP/zwgxwOhyIjIz32//nPf9b69euVlpamhx56SIcOHdKoUaNUXFzste8GrMYcFMAHAgMDdeWVV+qjjz7SgQMH1L59+3p/RkhIiCRV+6NT0x/VxMREvfbaa5Kk77//Xn//+981c+ZMlZSU6MUXXzzl90RFRSk0NFTz5s2r9fjJTp6PcrI77rhDd9xxhwoLC7V69Wo99thjGjFihL7//nslJiaesoaqLr/8cg0dOlRLly5Vdna2YmJiam37+9//Xp9//rmWLVumnj171lj7P/7xj3rXUF+DBw9WcHCwli5dqnvuuafBn/fjjz9q48aNGjhwYLX5Jx07dnRPjL388ssVGhqqhx9+WH/5y180ffr0Bn834A/oQQF8ZMaMGTLGaMKECSopKal2vLS0VB988EGt76+8E+Xkxcok6f333z/l93bp0kUPP/ywevTooU2bNrn3OxwOFRUVVWs/YsQI7d69W+3atVPv3r2rbVXviDmd8PBwpaSk6KGHHlJJSUmNC45VOnToUI3DUeXl5UpPT1dYWNgphy0efvhhzZ8/X6+++qqGDBlS7fiwYcMUFBSk3bt313hulX/kvcHlcul3v/udPvnkE73xxhs1ttm9e3e1/z1rUlRUpN/97ncqKyvT/ffff9r2999/v8455xw9+eSTdeo1A5oCelAAH+nXr5/mzp2riRMnKjk5WX/4wx/UrVs39+JaL7/8srp3766RI0fW+H6Xy6UhQ4YoNTVVbdu2VWJioj7//HO9++67Hu22bt2qyZMn68Ybb1Tnzp1lt9u1YsUKbd26VQ888IC7XY8ePbRo0SItXrxYHTt2VEhIiHr06KGpU6fqn//8py6//HL98Y9/1AUXXKCKigrt27dPn376qaZNm6a+ffue8lwnTJig0NBQDRgwQHFxccrKylJqaqqcTqf69OlT6/vefPNNvfTSSxo7dqz69Okjp9OpAwcO6NVXX3XfSWS322t87zvvvKP//d//1Q033KAuXbpo3bp17mMOh0MXXXSRzj77bD3xxBN66KGHtGfPHg0fPlxt27bVoUOH9PXXXys8PFyPP/74Kc+tPp599lnt2bNH48eP1yeffKLf/OY3io2N1eHDh7V8+XLNnz9fixYt8rjVeN++fVq3bp0qKiqUm5vrXqjthx9+0DPPPKOhQ4ee9nuDg4M1a9YsjRkzRi+88IIefvhhr50TYBmLJ+kCzd6WLVvMuHHjTIcOHYzdbjfh4eHmoosuMo8++qjJzs52t6tpobbMzExzww03mMjISON0Os1vf/tbs2HDBo+7eA4dOmTGjx9vzj33XBMeHm5atWplLrjgAvPcc8+ZsrIy92ft3bvXDB061ERERBhJJjEx0X2soKDAPPzww6Zr167Gbrcbp9NpevToYf74xz+arKwsdztJZtKkSdXOccGCBWbw4MEmNjbW2O12Ex8fb8aMGWO2bt16ymuzc+dOM23aNNO7d28THR1tgoKCTNu2bc3AgQPNm2++6dG26l08jz32mPvOn6rbyedmjDFLly41gwcPNq1btzYOh8MkJiaaG264wXz22WenrO9MlJWVmQULFpgrrrjCREZGmqCgIBMdHW1SUlLM22+/7V58rvIunsotMDDQtG3b1iQnJ5upU6eaHTt2VPvs2hZqq9S3b1/Ttm1bk5OT4/XzAhqbzZhapokDAABYhDkoAADA7zAHBUCLZoxReXn5KdvYbLZa1ySpPB4YGOjt0oAWjR4UAC1aWlpatTVSqm6dOnU65fErr7zS6tMAmh3moABo0fLz8/Xdd9+dsk1hYaHCw8NrPR4REaGuXbt6uzSgRSOgAAAAv8MQDwAA8DtNcpJsRUWFDh48qIiIiFqX3QYAAP7FGKP8/HzFx8crIODUfSRNMqAcPHjQ44FgAACg6di/f/9pn1HWJANKRESEpBMn2Lp1a4urAQAAdZGXl6eEhAT33/FTaZIBpXJYp3Xr1gQUAACamLpMz2CSLAAA8DsEFAAA4HcIKAAAwO8QUAAAgN8hoAAAAL9DQAEAAH6nXgElNTVVffr0UUREhGJiYjRq1KhqD9kyxmjmzJmKj49XaGioBg0apB07dni0KS4u1pQpUxQVFaXw8HBde+21OnDgQMPPBgAANAv1CihpaWmaNGmS1q1bp+XLl6usrExDhw5VYWGhu81TTz2lZ599VrNnz9b69evlcrl01VVXKT8/391m6tSpWrJkiRYtWqQ1a9aooKBAI0aMUHl5uffODAAANFkNeprxTz/9pJiYGKWlpenyyy+XMUbx8fGaOnWq/vSnP0k60VsSGxurP//5z7r77ruVm5ur6Ohovfnmm7rpppsk/bp0/bJlyzRs2LDTfm9eXp6cTqdyc3NZqA0AgCaiPn+/GzQHJTc3V5IUGRkpScrIyFBWVpaGDh3qbuNwODRw4ECtXbtWkrRx40aVlpZ6tImPj1f37t3dbaoqLi5WXl6exwYAAJqvMw4oxhjde++9uvTSS9W9e3dJUlZWliQpNjbWo21sbKz7WFZWlux2u9q2bVtrm6pSU1PldDrdGw8KBACgeTvjgDJ58mRt3bpVf/vb36odq7rGvjHmtOvun6rNjBkzlJub6972799/pmUDAIAm4IwCypQpU/T+++9r5cqVHo9LdrlcklStJyQ7O9vdq+JyuVRSUqKjR4/W2qYqh8PhfjCgLx8Q+FN+sZ74YKee/Og/Pvl8AABQN/UKKMYYTZ48We+++65WrFihpKQkj+NJSUlyuVxavny5e19JSYnS0tLUv39/SVJycrKCg4M92mRmZmr79u3uNlbJO16qef/O0Ntf/WBpHQAAtHRB9Wk8adIkvf3223rvvfcUERHh7ilxOp0KDQ2VzWbT1KlTNWvWLHXu3FmdO3fWrFmzFBYWprFjx7rb3nXXXZo2bZratWunyMhITZ8+XT169NCQIUO8f4b1EBRwYoipvOKMb2wCAABeUK+AMnfuXEnSoEGDPPbPnz9f48ePlyTdf//9Kioq0sSJE3X06FH17dtXn376qSIiItztn3vuOQUFBWnMmDEqKirSlVdeqddff12BgYENO5sGCqwMKGd+5zUAAPCCBq2DYhVfrYOSlXtcl6R+ruBAm9L/92qvfS4AAGjEdVCam8oelDKGeAAAsBQB5SSVc1CMkSoIKQAAWIaAcpKAgF/XYaEXBQAA6xBQThJ0UkDhTh4AAKxDQDlJ4MkBpenNHQYAoNkgoJzEowelnIACAIBVCCgnCfSYg1JhYSUAALRsBJST2Gy2XxdrYw4KAACWIaBUEWhjLRQAAKxGQKmCHhQAAKxHQKmCBwYCAGA9AkoVgYEM8QAAYDUCShX0oAAAYD0CShW/PjCQ24wBALAKAaWKyrt46EEBAMA6BJQqmIMCAID1CChVBAWcuCQVBBQAACxDQKni1zkoBBQAAKxCQKmCu3gAALAeAaUKelAAALAeAaWKX5e65zZjAACsQkCpwt2DUk4PCgAAViGgVFE5B6XCEFAAALAKAaUK5qAAAGA9AkoVleugcBcPAADWIaBUwRwUAACsR0CpIpB1UAAAsBwBpQrmoAAAYD0CShXulWS5iwcAAMsQUKpwD/GUs1AbAABWIaBUEcQQDwAAliOgVBHIbcYAAFiu3gFl9erVGjlypOLj42Wz2bR06VKP4zabrcbt6aefdrcZNGhQteM333xzg0/GGwJ/uSL0oAAAYJ16B5TCwkL17NlTs2fPrvF4ZmamxzZv3jzZbDZdf/31Hu0mTJjg0e6ll146szPwMnpQAACwXlB935CSkqKUlJRaj7tcLo/X7733ngYPHqyOHTt67A8LC6vW1h8EsQ4KAACW8+kclEOHDunDDz/UXXfdVe3YwoULFRUVpW7dumn69OnKz8+v9XOKi4uVl5fnsfkKC7UBAGC9eveg1MeCBQsUERGh0aNHe+y/9dZblZSUJJfLpe3bt2vGjBn65ptvtHz58ho/JzU1VY8//rgvS3XjLh4AAKzn04Ayb9483XrrrQoJCfHYP2HCBPe/u3fvrs6dO6t3797atGmTevXqVe1zZsyYoXvvvdf9Oi8vTwkJCT6pOTCwsgeFdVAAALCKzwLKF198oe+++06LFy8+bdtevXopODhY6enpNQYUh8Mhh8PhizKrCbTRgwIAgNV8NgfltddeU3Jysnr27Hnatjt27FBpaani4uJ8VU6dMUkWAADr1bsHpaCgQLt27XK/zsjI0JYtWxQZGakOHTpIOjEE88477+iZZ56p9v7du3dr4cKFuvrqqxUVFaWdO3dq2rRpuuiiizRgwIAGnIp3cJsxAADWq3dA2bBhgwYPHux+XTk3ZNy4cXr99dclSYsWLZIxRrfccku199vtdn3++ed64YUXVFBQoISEBF1zzTV67LHHFBgYeIan4T1BgfSgAABgtXoHlEGDBsmc5km/v//97/X73/++xmMJCQlKS0ur79c2mkDu4gEAwHI8i6cK5qAAAGA9AkoVAdzFAwCA5QgoVQSxDgoAAJYjoFTBUvcAAFiPgFIFc1AAALAeAaWKynVQmIMCAIB1CChV0IMCAID1CChVBFSug1JOQAEAwCoElCroQQEAwHoElCrcd/GcZrVcAADgOwSUKoJY6h4AAMsRUKr4dR0UFmoDAMAqBJQqgipvM2aSLAAAliGgVPFLPmGSLAAAFiKgVFHZg0JAAQDAOgSUKriLBwAA6xFQqghioTYAACxHQKmCpxkDAGA9AkoVQYGsgwIAgNUIKFUE2lgHBQAAqxFQqghkJVkAACxHQKmi8jbjCgIKAACWIaBUEcgcFAAALEdAqSKIu3gAALAcAaWKk+egGBZrAwDAEgSUKirv4pEkOlEAALAGAaWKyjkoklTGrcYAAFiCgFJF5RwUSSKfAABgDQJKFYEB9KAAAGA1AkoVleugSNzJAwCAVQgoVZzUgcJaKAAAWISAUoXNZuOJxgAAWKzeAWX16tUaOXKk4uPjZbPZtHTpUo/j48ePl81m89guueQSjzbFxcWaMmWKoqKiFB4ermuvvVYHDhxo0Il4E8/jAQDAWvUOKIWFherZs6dmz55da5vhw4crMzPTvS1btszj+NSpU7VkyRItWrRIa9asUUFBgUaMGKHy8vL6n4EPVN7Jw/N4AACwRlB935CSkqKUlJRTtnE4HHK5XDUey83N1WuvvaY333xTQ4YMkSS99dZbSkhI0GeffaZhw4ZVe09xcbGKi4vdr/Py8upbdr3QgwIAgLV8Mgdl1apViomJUZcuXTRhwgRlZ2e7j23cuFGlpaUaOnSoe198fLy6d++utWvX1vh5qampcjqd7i0hIcEXZbv9+jwebjMGAMAKXg8oKSkpWrhwoVasWKFnnnlG69ev1xVXXOHuAcnKypLdblfbtm093hcbG6usrKwaP3PGjBnKzc11b/v37/d22R4Cf7nVmB4UAACsUe8hntO56aab3P/u3r27evfurcTERH344YcaPXp0re8zxsh20nNwTuZwOORwOLxdaq0Cf4ltZeUEFAAArODz24zj4uKUmJio9PR0SZLL5VJJSYmOHj3q0S47O1uxsbG+LqdOKhdr4zZjAACs4fOAcuTIEe3fv19xcXGSpOTkZAUHB2v58uXuNpmZmdq+fbv69+/v63LqxL0OiiGgAABghXoP8RQUFGjXrl3u1xkZGdqyZYsiIyMVGRmpmTNn6vrrr1dcXJz27t2rBx98UFFRUfrNb34jSXI6nbrrrrs0bdo0tWvXTpGRkZo+fbp69OjhvqvHakEs1AYAgKXqHVA2bNigwYMHu1/fe++9kqRx48Zp7ty52rZtm9544w3l5OQoLi5OgwcP1uLFixUREeF+z3PPPaegoCCNGTNGRUVFuvLKK/X6668rMDDQC6fUcO7bjJmDAgCAJWzGNL1xjLy8PDmdTuXm5qp169Ze//zhz6/Wf7Ly9dZdfXVp5yivfz4AAC1Rff5+8yyeGvy6UBvroAAAYAUCSg2YgwIAgLUIKDWo7EEpZQ4KAACWIKDUICT4xGTd4jL/eHghAAAtDQGlBu6AUsocFAAArEBAqUFI8InLUlRKDwoAAFYgoNSgsgflOAEFAABLEFBq8GtAYYgHAAArEFBqEPpLQGGIBwAAaxBQalA5B4UhHgAArEFAqUFIEHNQAACwEgGlBqF2AgoAAFYioNTAwSRZAAAsRUCpAZNkAQCwFgGlBkySBQDAWgSUGjBJFgAAaxFQavDrJFnmoAAAYAUCSg3cQzw8zRgAAEsQUGpQudR9UQkBBQAAKxBQasDDAgEAsBYBpQY8LBAAAGsRUGpQuQ5KSXmFyiuMxdUAANDyEFBqUDlJVpKKmSgLAECjI6DUoHIdFImJsgAAWIGAUoOAAJvsQZW3GjMPBQCAxkZAqUUotxoDAGAZAkoteB4PAADWIaDUovJWYybJAgDQ+Agotfh1iIc5KAAANDYCSi0crCYLAIBlCCi1CP1lDkoRAQUAgEZX74CyevVqjRw5UvHx8bLZbFq6dKn7WGlpqf70pz+pR48eCg8PV3x8vG6//XYdPHjQ4zMGDRokm83msd18880NPhlv4nk8AABYp94BpbCwUD179tTs2bOrHTt27Jg2bdqkRx55RJs2bdK7776r77//Xtdee221thMmTFBmZqZ7e+mll87sDHykcrE21kEBAKDxBdX3DSkpKUpJSanxmNPp1PLlyz32/eUvf9HFF1+sffv2qUOHDu79YWFhcrlc9f36RhNq/yWgsA4KAACNzudzUHJzc2Wz2dSmTRuP/QsXLlRUVJS6deum6dOnKz8/v9bPKC4uVl5ensfma6yDAgCAderdg1Ifx48f1wMPPKCxY8eqdevW7v233nqrkpKS5HK5tH37ds2YMUPffPNNtd6XSqmpqXr88cd9WWo1lXNQmCQLAEDj81lAKS0t1c0336yKigrNmTPH49iECRPc/+7evbs6d+6s3r17a9OmTerVq1e1z5oxY4buvfde9+u8vDwlJCT4qnRJJ0+SZQ4KAACNzScBpbS0VGPGjFFGRoZWrFjh0XtSk169eik4OFjp6ek1BhSHwyGHw+GLUmv16yRZelAAAGhsXg8oleEkPT1dK1euVLt27U77nh07dqi0tFRxcXHeLueMhdp/mYPCJFkAABpdvQNKQUGBdu3a5X6dkZGhLVu2KDIyUvHx8brhhhu0adMm/etf/1J5ebmysrIkSZGRkbLb7dq9e7cWLlyoq6++WlFRUdq5c6emTZumiy66SAMGDPDemTWQe4iHHhQAABpdvQPKhg0bNHjwYPfryrkh48aN08yZM/X+++9Lki688EKP961cuVKDBg2S3W7X559/rhdeeEEFBQVKSEjQNddco8cee0yBgYENOBXvahtmlyQdyiu2uBIAAFqeegeUQYMGyRhT6/FTHZOkhIQEpaWl1fdrG12n6FaSpF3ZBTLGyGazWVwRAAAtB8/iqUXH6HAF2KTcolIdLiixuhwAAFoUAkotQoIDlRAZJklKz659ETkAAOB9BJRTOOeXYZ7d2QUWVwIAQMtCQDmFc2JPBJR0AgoAAI2KgHIK55w0URYAADQeAsopdI6NkEQPCgAAjY2AcgqdosMlST/lF+vHnCKLqwEAoOUgoJxCREiwLukYKUlavH6/xdUAANByEFBOY2zfREnS4vX7VFbOk40BAGgMBJTTGNYtVu3C7TqUV6wV/8m2uhwAAFoEAsppOIICdd2FZ0mSPv+WgAIAQGMgoNTB5V2iJElrdh0+7bOGAABAwxFQ6qBvUjvZAwP0Y06RMg4XWl0OAADNHgGlDkLtgUpObCvpRC8KAADwLQJKHV3a+cQwzxfpBBQAAHyNgFJHFyedWA9l58E8iysBAKD5I6DUUfu2oZKkQ3nHVV7BRFkAAHyJgFJHMREhCgywqazC6Kf8YqvLAQCgWSOg1FFggE2u1iGSpIO5PJcHAABfIqDUQ3ybXwIKDw4EAMCnCCj1EN/mxDyUzJzjFlcCAEDzRkCphzjniYDyIz0oAAD4FAGlHs76ZYgnkzkoAAD4FAGlHip7UA4yxAMAgE8RUOqhcg4Kk2QBAPAtAko9nPVLQDlSWKLjpeUWVwMAQPNFQKmH1qFBCrMHSqIXBQAAXyKg1IPNZlPH6HBJ0rYfcy2uBgCA5ouAUk8DOvFUYwAAfI2AUk+Xdj4RUNakH5YxPDQQAABfIKDUU5+zI2UPClBW3nHtyi6wuhwAAJolAko9hQQH6uKzIyVJ4+Z9reeWf29xRQAAND/1DiirV6/WyJEjFR8fL5vNpqVLl3ocN8Zo5syZio+PV2hoqAYNGqQdO3Z4tCkuLtaUKVMUFRWl8PBwXXvttTpw4ECDTqQxDe/ukiQdzD2uuat2W1wNAADNT70DSmFhoXr27KnZs2fXePypp57Ss88+q9mzZ2v9+vVyuVy66qqrlJ+f724zdepULVmyRIsWLdKaNWtUUFCgESNGqLy8aawtMvbiDnrjzoslSSXlFSotr7C4IgAAmpeg+r4hJSVFKSkpNR4zxuj555/XQw89pNGjR0uSFixYoNjYWL399tu6++67lZubq9dee01vvvmmhgwZIkl66623lJCQoM8++0zDhg1rwOk0joAAm/p2jHS/LiotV3Ago2UAAHiLV/+qZmRkKCsrS0OHDnXvczgcGjhwoNauXStJ2rhxo0pLSz3axMfHq3v37u42VRUXFysvL89js5o9MEABthP/Pl7SNHp+AABoKrwaULKysiRJsbGxHvtjY2Pdx7KysmS329W2bdta21SVmpoqp9Pp3hISErxZ9hmx2WwKDT6xqmwRy94DAOBVPhmXsNlsHq+NMdX2VXWqNjNmzFBubq57279/v9dqbYhQ+4kRsmP0oAAA4FVeDSgu14m7W6r2hGRnZ7t7VVwul0pKSnT06NFa21TlcDjUunVrj80fhNpPXD56UAAA8C6vBpSkpCS5XC4tX77cva+kpERpaWnq37+/JCk5OVnBwcEebTIzM7V9+3Z3m6bCPcRDDwoAAF5V77t4CgoKtGvXLvfrjIwMbdmyRZGRkerQoYOmTp2qWbNmqXPnzurcubNmzZqlsLAwjR07VpLkdDp11113adq0aWrXrp0iIyM1ffp09ejRw31XT1NROcRDQAEAwLvqHVA2bNigwYMHu1/fe++9kqRx48bp9ddf1/3336+ioiJNnDhRR48eVd++ffXpp58qIiLC/Z7nnntOQUFBGjNmjIqKinTllVfq9ddfV2BgoBdOqfGEBjPEAwCAL9hME3ziXV5enpxOp3Jzcy2dj3LH/K+18ruf9NT1F2hMH+vvLAIAwJ/V5+83q4s1QFjlEA89KAAAeBUBpQFCWAcFAACfIKA0QOVtxqyDAgCAdxFQGqByiOc4PSgAAHgVAaUBQlgHBQAAnyCgNEDlQm0M8QAA4F0ElAYIs58IKAzxAADgXQSUBuBpxgAA+AYBpQFC7JVDPGUWVwIAQPNCQGmAMHcPSoXFlQAA0LwQUBog1F55Fw89KAAAeBMBpQFYSRYAAN8goDRAmLsHhSEeAAC8iYDSAO67eBjiAQDAqwgoDeCeg1JaLmOMxdUAANB8EFAaoDKgVBippJxhHgAAvIWA0gCVQzwSz+MBAMCbCCgNEBwYoKAAmyTu5AEAwJsIKA3061ooBBQAALyFgNJAPNEYAADvI6A0EE80BgDA+wgoDcRqsgAAeB8BpYFC7QzxAADgbQSUBgq3B0mSCotZTRYAAG8hoDSQMyxYkpRzrNTiSgAAaD4IKA3U1h1QSiyuBACA5oOA0kBtw+ySpKP0oAAA4DUElAZq4w4o9KAAAOAtBJQGahN6Yognt4geFAAAvIWA0kBtw08EFHpQAADwHgJKA7mHeArpQQEAwFu8HlDOPvts2Wy2atukSZMkSePHj6927JJLLvF2GY2mcpIsd/EAAOA9Qd7+wPXr16u8/NdVVbdv366rrrpKN954o3vf8OHDNX/+fPdru93u7TIaTeVtxoUl5Sopq5A9iE4pAAAayusBJTo62uP1k08+qU6dOmngwIHufQ6HQy6Xy9tfbYnWIcGy2SRjpJyiEsVEhFhdEgAATZ5P/3O/pKREb731lu68807ZbDb3/lWrVikmJkZdunTRhAkTlJ2dfcrPKS4uVl5ensfmLwICbHKGsposAADe5NOAsnTpUuXk5Gj8+PHufSkpKVq4cKFWrFihZ555RuvXr9cVV1yh4uLiWj8nNTVVTqfTvSUkJPiy7HpzL9ZWyDwUAAC8wWaMMb768GHDhslut+uDDz6otU1mZqYSExO1aNEijR49usY2xcXFHgEmLy9PCQkJys3NVevWrb1ed339Zs6/tXlfjl78bbKGd28eQ1cAAHhbXl6enE5nnf5+e30OSqUffvhBn332md59991TtouLi1NiYqLS09NrbeNwOORwOLxdotdwJw8AAN7lsyGe+fPnKyYmRtdcc80p2x05ckT79+9XXFycr0rxuTaVDwxkNVkAALzCJwGloqJC8+fP17hx4xQU9GsnTUFBgaZPn64vv/xSe/fu1apVqzRy5EhFRUXpN7/5jS9KaRRteR4PAABe5ZMhns8++0z79u3TnXfe6bE/MDBQ27Zt0xtvvKGcnBzFxcVp8ODBWrx4sSIiInxRSqOofB5PDqvJAgDgFT4JKEOHDlVNc29DQ0P1ySef+OIrLdUmnB4UAAC8iWVPvSC61YmA8lNB7bdKAwCAuiOgeEGcM1SSlJlz3OJKAABoHggoXhDf5kRAOZR/XKXlFRZXAwBA00dA8YJ24XbZAwNkjJSVSy8KAAANRUDxgoAAm+LanHhIYCYBBQCABiOgeEn8L/NQDuYUWVwJAABNHwHFSyp7UH4koAAA0GAEFC8565eJspm5BBQAABqKgOIlce4hHuagAADQUAQUL4n/ZYiHOSgAADQcAcVLKod4CCgAADQcAcVL4n4JKHnHy1gLBQCABiKgeEkrR5C6xbeWJE352yaVlLGiLAAAZ4qA4kX/75aLFOEI0vq9RzXv3xlWlwMAQJNFQPGiTtGt9NA150mSFn71gyoqjMUVAQDQNBFQvOy6C89SREiQ9v9cpC92Hba6HAAAmiQCipeF2gN1fa/2kqS3v/rB4moAAGiaCCg+MLrXWZKkdXt+ljEM8wAAUF8EFB/oEhuhAJuUW1SqnwqKrS4HAIAmh4DiAyHBgUqIDJMk7cousLgaAACaHgKKj5wT3UoSAQUAgDNBQPGRc2IJKAAAnCkCio/QgwIAwJkjoPhI59gISVI6AQUAgHojoPhIp+hwSdJP+cXKLSq1uBoAAJoWAoqPRIQEK84ZIknaeiDH2mIAAGhiCCg+NPjcGEnS4vX7La4EAICmhYDiQ2Mv7iBJ+mRHlg6zYBsAAHVGQPGh7mc51TOhjUrLjf6x8YDV5QAA0GQQUHzsxuQTDw78bOchiysBAKDpIKD42MAu0ZKkzftzlH+cu3kAAKgLAoqPJUSG6ex2YSqvMPpy9xGrywEAoEnwekCZOXOmbDabx+ZyudzHjTGaOXOm4uPjFRoaqkGDBmnHjh3eLsOvXNo5SpK0ZtdhiysBAKBp8EkPSrdu3ZSZmenetm3b5j721FNP6dlnn9Xs2bO1fv16uVwuXXXVVcrPz/dFKX7h0nNODPOsSSegAABQFz4JKEFBQXK5XO4tOvrEH2hjjJ5//nk99NBDGj16tLp3764FCxbo2LFjevvtt31Ril/of0472QMDtOdwIYu2AQBQBz4JKOnp6YqPj1dSUpJuvvlm7dmzR5KUkZGhrKwsDR061N3W4XBo4MCBWrt2ba2fV1xcrLy8PI+tKWkdEqzh3U8Mc7391T6LqwEAwP95PaD07dtXb7zxhj755BO98sorysrKUv/+/XXkyBFlZWVJkmJjYz3eExsb6z5Wk9TUVDmdTveWkJDg7bJ97ta+JxZte/+bg8rjbh4AAE7J6wElJSVF119/vXr06KEhQ4boww8/lCQtWLDA3cZms3m8xxhTbd/JZsyYodzcXPe2f3/TWzr+4qRInRPTSsdKyvXe5h+tLgcAAL/m89uMw8PD1aNHD6Wnp7vv5qnaW5KdnV2tV+VkDodDrVu39tiaGpvN5l76fuFX+2SMsbgiAAD8l88DSnFxsb799lvFxcUpKSlJLpdLy5cvdx8vKSlRWlqa+vfv7+tSLHd9r/ZyBAXoP1n52rQvx+pyAADwW14PKNOnT1daWpoyMjL01Vdf6YYbblBeXp7GjRsnm82mqVOnatasWVqyZIm2b9+u8ePHKywsTGPHjvV2KX7HGRasERfES5JeXr2bXhQAAGoR5O0PPHDggG655RYdPnxY0dHRuuSSS7Ru3TolJiZKku6//34VFRVp4sSJOnr0qPr27atPP/1UERER3i7FL90x4Gwt3fKjPtlxSK+tydDvLutodUkAAPgdm2mC/xmfl5cnp9Op3NzcJjkfZd6aDD3xr50KDLBp5bRB6tAuzOqSAADwufr8/eZZPBa4Y8DZGnBOO5VXGP1tPeuiAABQFQHFAjabTbddcrYk6Z0N+1VSVmFtQQAA+BkCikWuPC9GMREOHS4o0ac7a1+kDgCAloiAYpHgwABd2/PEHT3r9hyxuBoAAPwLAcVC58WdmCC0K7vA4koAAPAvBBQLnRPTSpK0K7vQ4koAAPAvBBQLdfoloBwuKFbOsRKLqwEAwH8QUCzUyhGkeGeIJIZ5AAA4GQHFYpW9KOkEFAAA3AgoFuscc2KJf3pQAAD4ldefxYP6qZwou27PEb2zYb97/wXt26irq2U8nwgAgKoIKBbrEnsioOw4mKf7/rHVvT/CEaT1Dw9RSHCgVaUBAGAZAorFenVoq7suTdKen34d4lm7+4jyi8u090ihznU1vYchAgDQUAQUiwUE2PTIiPM99o2e829t2pej9EMFBBQAQIvEJFk/9OsCbkycBQC0TAQUP0RAAQC0dAQUP8StxwCAlo6A4ocqe1AyDheqrLzC4moAAGh8BBQ/dFabUIUEB6ikvEL7fj5mdTkAADQ6AoofCgiwqVP0iV6UbzPzLa4GAIDGR0DxU706tJUkzVr2rY4UFFtcDQAAjYuA4qemD+2qs9uF6cecIk16e5NKmYsCAGhBCCh+yhkWrJdv761we6DW7flZUxdv0cKvflBBcZnVpQEA4HMEFD/WJTZCz910oSTpw62ZemjJdj398X+sLQoAgEZAQPFzQ7u59OJvk3XV+bGSpH9u+lGF9KIAAJo5AkoTMLy7Sy/9NllntwtTQXGZlmz+UeUVxuqyAADwGQJKExEQYNPYvh0kSQ8v3a4BT67Q5n1HLa4KAADfIKA0ITcmJyjOGSJJyso7rrvf3Kh/bT2oj7dn6uuMn2UMvSoAgObBZprgX7W8vDw5nU7l5uaqdevWVpfTqMrKK/TzsRLd+spXSq/yrJ67Lk3SIyPOt6gyAABOrT5/v4MaqSZ4SVBggGIiQjRvfB89+dF/lJ1/XBVG2vjDUb22JkNZeccVbg9UuCNIdw5IUkJkmNUlAwBQb/SgNBPPfvqd/t+KXR77OkSG6f3JA9QmzG5RVQAA/IoelBZo6pAuOjeutfYeKZQkvf3VPu37+Zim/G2z5o/vo6BAphsBAJoOr//VSk1NVZ8+fRQREaGYmBiNGjVK3333nUeb8ePHy2azeWyXXHKJt0tpUQICbLq6R5wmDjpHEwedo1du763Q4EB9kX5YT/xrp77NzGMSLQCgyfB6QElLS9OkSZO0bt06LV++XGVlZRo6dKgKCws92g0fPlyZmZnubdmyZd4upUU7L661nhnTU5L0xpc/KOWFL3TXgg0q45k+AIAmwOtDPB9//LHH6/nz5ysmJkYbN27U5Zdf7t7vcDjkcrm8/fU4ydU94vTEdd302poMHcwp0or/ZOvPH/9HD13DnT4AAP/m84kJubm5kqTIyEiP/atWrVJMTIy6dOmiCRMmKDs7u9bPKC4uVl5enseGurm939lKu2+wnr/pIknSK19kaOnmHy2uCgCAU/PpXTzGGF133XU6evSovvjiC/f+xYsXq1WrVkpMTFRGRoYeeeQRlZWVaePGjXI4HNU+Z+bMmXr88cer7ecunvp56uP/aM6q3XIEBegf9/RXj/ZOq0sCALQg9bmLx6cBZdKkSfrwww+1Zs0atW/fvtZ2mZmZSkxM1KJFizR69Ohqx4uLi1VcXOx+nZeXp4SEBAJKPZVXGP1uwXqt/O4nxTlD9P7kSxUdUT0QAgDgC/UJKD4b4pkyZYref/99rVy58pThRJLi4uKUmJio9PT0Go87HA61bt3aY0P9BQbY9MItF6ljVLgyc49r4sKNKilj0iwAwP94fZKsMUZTpkzRkiVLtGrVKiUlJZ32PUeOHNH+/fsVFxfn7XJQReuQYL18e2/95q//1vq9RzXtnW902TlR7uMuZ4gu6xwlm81mYZUAgJbO60M8EydO1Ntvv6333ntPXbt2de93Op0KDQ1VQUGBZs6cqeuvv15xcXHau3evHnzwQe3bt0/ffvutIiIiTvsdrCTbcJ9/e0i/e2ODavpf/+6BHTUj5bzGLwoA0KxZOgeltv/ynj9/vsaPH6+ioiKNGjVKmzdvVk5OjuLi4jR48GD9z//8jxISEur0HQQU7/hwa6aWbD6gil9+AaXlFfoi/bAk6YpzY2QPDJAzNFiTrziHZ/oAABrMbybJ+goBxXdSP/pWL6Xt8djXMSpcSyYNkDM02KKqAADNAQEFZ6yiwijt+5/0Y06RjKS5K3fpYO5xBQXY1Cm6lf56ay+dE9PK6jIBAE0QAQVes/3HXI2b97WOFJZIOtGbMvPaburqilBs6xCLqwMANCUEFHjV8dJy7f/5mG6f97Uyc49LktqF27X6/sEKd/BAbABA3fjFOihoPkKCA9U5NkKvjeuj/p3aqZUjSEcKS/TBNwetLg0A0EwRUFBn58e31tsTLtF/XXmOJOntr/dZXBEAoLkioKDebkhOkD0wQFsP5GrjDz9bXQ4AoBkioKDeIsPtGtkzXpL034u26OdfJtACAOAtBBSckUdGnKcOkWE6cLRIk9/epLJynukDAPAeAgrOSJswu165vbfC7IFau/uIpi7eor+v369jJWVWlwYAaAYIKDhjXV0RenbMhZKkf23N1P3/3KrfLdhAbwoAoMFYBwUN9vH2TH28PUuf7jykYyXlOj+utdqEBcsRFKDfX95J/Tq1s7pEAIAfYKE2WOLj7Zm6561NHvvC7IH6+939PJbHtwcGKCCg5odKAgCaLwIKLPNdVr7+k5UnSfrb1/u0bk/125CTosI1f3wfnR0V3tjlAQAsxEqysExXV4Suu/AsXXfhWZp7a7IuaO+s1ibjcKEmvLFBBcVMqAUA1IweFPiUMUaFJeXu10cLS3TDi2t1KK9YQ8+P1Yu/TWa4BwBaCIZ44Nc27zuqm15ap5LyCg3sEq3oCEe1NgE2adRFZ6l/pygLKgQA+AIBBX7v7xv26/5/bD1lm+BAmxb9/hIlJ0Y2UlUAAF+qz9/voEaqCfAwpneC4pwh2v5jXo3H1+4+rC/SD+uWl79SrNOhPw0/VyMuiG/kKgEAVqEHBX6psLhMY19Zp28O5Eqq7E3pp+TEthZXBgA4U9zFgyYv3BGkJRMHaPkfL1dKd5dKy43ueWujsnKPW10aAKARMMQDvxUQYFPn2Aj93409teenQn13KF93vr5eQ86PrbF9x6hwXdsznruCAKAZIKDA74U7gvTy7cm6dva/tTMzTzsza563Ikm7sgs0fVjXRqwOAOALzEFBk/FdVr4Wr9+v0hoeRlhQXKYlm3+UJHWLb60AW/VelNahQbp/2LnqmdDG16UCAGrAXTxolrq6IvToyPNrPR4d4dDLq/dox8Hae1juzFyvhRP6KjLcXmubNqF22YOYngUAVqIHBc2GMUbbfszVkcKSGg5KT3/y3SmHhyq5WofozbsuVufYCB9UCQAtFz0oaJFsNpsuaN+m1uOdY1vpdws26LtD+bW2MUbKyjuuCW9s0D0DO6mGkaLTCg4M0JDzY9U6JLj+bwYASKIHBfBwpKBY187+t37MKWrQ53SKDtfSSQMUQUgBADeWugcaYPdPBfrril3KO156Ru/fsj9HhwtKdK4rQontwrxSU3SEQ/91ZWfFRIR45fMAwAoEFMBCWw/k6IYXv1RJWfW7jRqiZ3unFt/dTyHBgV79XABoLAQUwGJ7firQl3uOeOWzKiqMnln+vXKOlSowwKbGWIduYJcYzR57EWEIgFcxSRawWMfoVuoY3cqrn3fPWxuVf7xM5V771Np99u0h3fePrRrTu30jfFvzkBQVrvZtvTOkB8DiHpQ5c+bo6aefVmZmprp166bnn39el1122WnfRw8KWqJjJWXKLTqzeTH1sePHPN391kaVVzS5zlVLBQbY9Mrtybri3JofxQCgiQzxLF68WLfddpvmzJmjAQMG6KWXXtKrr76qnTt3qkOHDqd8LwEF8K0PvjmoV7/Yo5JyQkpdFBaXad/PxxThCNL1ye3P6PZ0wN9EtXJo0uBzvPqZTSKg9O3bV7169dLcuXPd+8477zyNGjVKqampp3wvAQWAPykpq9Ctr67T+r1HrS4F8JqO0eFaMW2QVz/T7+eglJSUaOPGjXrggQc89g8dOlRr166t1r64uFjFxcXu13l5p18NFAAaiz0oQK+O66O/r9+vnKIaVjIGmqC2YbU/EqQxWBJQDh8+rPLycsXGeo7VxsbGKisrq1r71NRUPf74441VHgDUmzM0WBMu72h1GUCzYekT0WxVBmqNMdX2SdKMGTOUm5vr3vbv399YJQIAAAtY0oMSFRWlwMDAar0l2dnZ1XpVJMnhcMjhcDRWeQAAwGKW9KDY7XYlJydr+fLlHvuXL1+u/v37W1ESAADwI5Yt1HbvvffqtttuU+/evdWvXz+9/PLL2rdvn+655x6rSgIAAH7CsoBy00036ciRI3riiSeUmZmp7t27a9myZUpMTLSqJAAA4Cd4Fg8AAGgU9fn7beldPAAAADUhoAAAAL9DQAEAAH6HgAIAAPwOAQUAAPgdAgoAAPA7BBQAAOB3LFuorSEql27Jy8uzuBIAAFBXlX+367IEW5MMKPn5+ZKkhIQEiysBAAD1lZ+fL6fTeco2TXIl2YqKCh08eFARERGy2Wxe/ey8vDwlJCRo//79rFL7C65JdVyT6rgm1XFNquOaVNeSrokxRvn5+YqPj1dAwKlnmTTJHpSAgAC1b9/ep9/RunXrZv9DqS+uSXVck+q4JtVxTarjmlTXUq7J6XpOKjFJFgAA+B0CCgAA8DsElCocDocee+wxORwOq0vxG1yT6rgm1XFNquOaVMc1qY5rUrMmOUkWAAA0b/SgAAAAv0NAAQAAfoeAAgAA/A4BBQAA+B0CCgAA8DsElJPMmTNHSUlJCgkJUXJysr744gurS2o0M2fOlM1m89hcLpf7uDFGM2fOVHx8vEJDQzVo0CDt2LHDwoq9b/Xq1Ro5cqTi4+Nls9m0dOlSj+N1uQbFxcWaMmWKoqKiFB4ermuvvVYHDhxoxLPwrtNdk/Hjx1f73VxyySUebZrTNUlNTVWfPn0UERGhmJgYjRo1St99951Hm5b2O6nLNWlpv5O5c+fqggsucK8M269fP3300Ufu4y3tN3KmCCi/WLx4saZOnaqHHnpImzdv1mWXXaaUlBTt27fP6tIaTbdu3ZSZmenetm3b5j721FNP6dlnn9Xs2bO1fv16uVwuXXXVVe4HNzYHhYWF6tmzp2bPnl3j8bpcg6lTp2rJkiVatGiR1qxZo4KCAo0YMULl5eWNdRpedbprIknDhw/3+N0sW7bM43hzuiZpaWmaNGmS1q1bp+XLl6usrExDhw5VYWGhu01L+53U5ZpILet30r59ez355JPasGGDNmzYoCuuuELXXXedO4S0tN/IGTMwxhhz8cUXm3vuucdj37nnnmseeOABiypqXI899pjp2bNnjccqKiqMy+UyTz75pHvf8ePHjdPpNC+++GIjVdi4JJklS5a4X9flGuTk5Jjg4GCzaNEid5sff/zRBAQEmI8//rjRaveVqtfEGGPGjRtnrrvuulrf09yvSXZ2tpFk0tLSjDH8Toypfk2M4XdijDFt27Y1r776Kr+ReqAHRVJJSYk2btyooUOHeuwfOnSo1q5da1FVjS89PV3x8fFKSkrSzTffrD179kiSMjIylJWV5XF9HA6HBg4c2GKuT12uwcaNG1VaWurRJj4+Xt27d2/W12nVqlWKiYlRly5dNGHCBGVnZ7uPNfdrkpubK0mKjIyUxO9Eqn5NKrXU30l5ebkWLVqkwsJC9evXj99IPRBQJB0+fFjl5eWKjY312B8bG6usrCyLqmpcffv21RtvvKFPPvlEr7zyirKystS/f38dOXLEfQ1a8vWpyzXIysqS3W5X27Zta23T3KSkpGjhwoVasWKFnnnmGa1fv15XXHGFiouLJTXva2KM0b333qtLL71U3bt3l8TvpKZrIrXM38m2bdvUqlUrORwO3XPPPVqyZInOP//8Fv8bqY8gqwvwJzabzeO1MabavuYqJSXF/e8ePXqoX79+6tSpkxYsWOCezNaSr0+lM7kGzfk63XTTTe5/d+/eXb1791ZiYqI+/PBDjR49utb3NYdrMnnyZG3dulVr1qypdqyl/k5quyYt8XfStWtXbdmyRTk5OfrnP/+pcePGKS0tzX28pf5G6oMeFElRUVEKDAyslkyzs7OrpdyWIjw8XD169FB6err7bp6WfH3qcg1cLpdKSkp09OjRWts0d3FxcUpMTFR6erqk5ntNpkyZovfff18rV65U+/bt3ftb8u+ktmtSk5bwO7Hb7TrnnHPUu3dvpaamqmfPnnrhhRda9G+kvggoOvFDSk5O1vLlyz32L1++XP3797eoKmsVFxfr22+/VVxcnJKSkuRyuTyuT0lJidLS0lrM9anLNUhOTlZwcLBHm8zMTG3fvr3FXKcjR45o//79iouLk9T8rokxRpMnT9a7776rFStWKCkpyeN4S/ydnO6a1KS5/05qYoxRcXFxi/yNnDELJub6pUWLFpng4GDz2muvmZ07d5qpU6ea8PBws3fvXqtLaxTTpk0zq1atMnv27DHr1q0zI0aMMBEREe7zf/LJJ43T6TTvvvuu2bZtm7nllltMXFycycvLs7hy78nPzzebN282mzdvNpLMs88+azZv3mx++OEHY0zdrsE999xj2rdvbz777DOzadMmc8UVV5iePXuasrIyq06rQU51TfLz8820adPM2rVrTUZGhlm5cqXp16+fOeuss5rtNfnDH/5gnE6nWbVqlcnMzHRvx44dc7dpab+T012Tlvg7mTFjhlm9erXJyMgwW7duNQ8++KAJCAgwn376qTGm5f1GzhQB5SR//etfTWJiorHb7aZXr14et8k1dzfddJOJi4szwcHBJj4+3owePdrs2LHDfbyiosI89thjxuVyGYfDYS6//HKzbds2Cyv2vpUrVxpJ1bZx48YZY+p2DYqKiszkyZNNZGSkCQ0NNSNGjDD79u2z4Gy841TX5NixY2bo0KEmOjraBAcHmw4dOphx48ZVO9/mdE1quhaSzPz5891tWtrv5HTXpCX+Tu68807335Lo6Ghz5ZVXusOJMS3vN3KmbMYY03j9NQAAAKfHHBQAAOB3CCgAAMDvEFAAAIDfIaAAAAC/Q0ABAAB+h4ACAAD8DgEFAAD4HQIKAADwOwQUAADgdwgoAADA7xBQAACA3/n/sPpthBX25skAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pathlib import Path\n", + "import logging\n", + "import sys\n", + "from pathlib import Path\n", + "import pandas as pd\n", + "\n", + "logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)\n", + "id='_CDR'\n", + "summary_csv = Path(f\"/data/user/shapoval/ProteinMPNN/clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster.tsv\")\n", + "#chothia_subdir = Path(\"/mnt/sabdab/chothia\")\n", + "# only protein and peptide antigens\n", + "df = pd.read_csv(summary_csv,sep=\"\\t\",header=None)\n", + "clusters=df[0].value_counts()\n", + "pd.Series(clusters.values).plot(title=f'Clusters Size_{id}')\n", + "d=df_to_dict(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "41c329cb-decd-421f-b3e6-868142d81cd5", + "metadata": {}, + "outputs": [], + "source": [ + "t=9\n", + "d_gr=group_freq(df,t) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c7a06003-ea7d-42b4-a2fa-4c19382c461a", + "metadata": {}, + "outputs": [], + "source": [ + "ide='_FR_08'\n", + "summary_csv = Path(f\"/data/user/shapoval/ProteinMPNN/clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster.tsv\")\n", + "#chothia_subdir = Path(\"/mnt/sabdab/chothia\")\n", + "# only protein and peptide antigens\n", + "de = pd.read_csv(summary_csv,sep=\"\\t\",header=None)\n", + "dde=df_to_dict(de)\n", + "dde_gr=group_freq(de,t)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9e1686ed-e7bf-42aa-ac7e-6847f0c58916", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3522\n" + ] + } + ], + "source": [ + "s=0\n", + "for k,v in d_gr.items():\n", + " s+=len(v)\n", + "print(s)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "709c2ee0-f63c-44c0-8d76-f162a345e8e3", + "metadata": {}, + "outputs": [], + "source": [ + "dec=de[0].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "18e701f2-781b-49f5-89e0-770edf5fde84", + "metadata": {}, + "outputs": [], + "source": [ + "d_answ=pd.DataFrame(index=list(d_gr.keys()),columns=list(dde_gr.keys()))\n", + "for k_d,v_d in d_gr.items():\n", + " for k_e,v_e in dde_gr.items():\n", + " d_answ.loc[k_d,k_e]=len((set(v_d)).intersection(set(v_e)))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "03db6d5e-f144-4263-bddb-7e7b296ab87f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
195162115113979365605954...10987654321
198265801621080...9121224713414
1444003906035010...2002000011
1223011000000...1319138286
11710138900000...2002100342
115010300000000...0000000010
1121010001000...0010140052
10531315000000...10181715474
102053171813000...1091616719
8201020000030...2192540133
7110230402070...3050110132
6430300000016...0017613442
6307047000000...0200001020
6180502000200...9000201121
560000000400...0050100430
540121200000...1207000010
51150900017000...1000000001
490000000000...0080600023
470001100000...6000001021
460000000000...0020200010
4400100100004...0033001303
39101510500040...5088009462
340000000000...0000000000
338010000000...0200010011
32001000291400...0000100201
300000300200...6023210712
2922300100340...1013101061
286060006020...0001024335
270010000500...0000004011
2600200024000...0000411010
250000000000...0010300000
243000000000...2020013012
234050007000...0004000001
2213510300010...0010201741
210000000700...1010008122
200030000300...0308200221
190000000000...0011205323
171000100000...0001010000
160005000002...0041001030
150100000000...0085000000
140000600002...3030110102
1303000001210...6140002232
122000100000...0000040001
110000000700...10050654086
100010100000...0010021211
90010000030...0010000111
87003000000...0087100004
79000000000...0008253223
60100700020...4011752004
53000300000...14121103323
41010600010...001020017742
32020101000...00133361294
220231202220...230304352011
13220602130...24223014752
\n", + "

53 rows × 51 columns

\n", + "
" + ], + "text/plain": [ + " 195 162 115 113 97 93 65 60 59 54 ... 10 9 8 7 6 5 4 \\\n", + "198 26 5 8 0 16 2 1 0 8 0 ... 9 1 2 1 22 4 7 \n", + "144 40 0 39 0 6 0 35 0 1 0 ... 2 0 0 2 0 0 0 \n", + "122 3 0 1 1 0 0 0 0 0 0 ... 1 3 1 9 1 3 8 \n", + "117 10 1 3 8 9 0 0 0 0 0 ... 2 0 0 2 1 0 0 \n", + "115 0 103 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 \n", + "112 1 0 1 0 0 0 1 0 0 0 ... 0 0 1 0 1 4 0 \n", + "105 3 1 3 15 0 0 0 0 0 0 ... 10 1 8 1 7 1 5 \n", + "102 0 5 3 17 1 81 3 0 0 0 ... 1 0 9 1 6 1 6 \n", + "82 0 1 0 2 0 0 0 0 0 30 ... 2 1 9 2 5 4 0 \n", + "71 10 2 3 0 4 0 2 0 7 0 ... 3 0 5 0 1 1 0 \n", + "64 3 0 3 0 0 0 0 0 0 16 ... 0 0 1 7 6 1 3 \n", + "63 0 7 0 47 0 0 0 0 0 0 ... 0 2 0 0 0 0 1 \n", + "61 8 0 5 0 2 0 0 0 20 0 ... 9 0 0 0 2 0 1 \n", + "56 0 0 0 0 0 0 0 4 0 0 ... 0 0 5 0 1 0 0 \n", + "54 0 1 2 1 2 0 0 0 0 0 ... 1 2 0 7 0 0 0 \n", + "51 15 0 9 0 0 0 17 0 0 0 ... 1 0 0 0 0 0 0 \n", + "49 0 0 0 0 0 0 0 0 0 0 ... 0 0 8 0 6 0 0 \n", + "47 0 0 0 1 1 0 0 0 0 0 ... 6 0 0 0 0 0 1 \n", + "46 0 0 0 0 0 0 0 0 0 0 ... 0 0 2 0 2 0 0 \n", + "44 0 0 1 0 0 10 0 0 0 4 ... 0 0 3 3 0 0 1 \n", + "39 10 1 5 10 5 0 0 0 4 0 ... 5 0 8 8 0 0 9 \n", + "34 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 \n", + "33 8 0 1 0 0 0 0 0 0 0 ... 0 2 0 0 0 1 0 \n", + "32 0 0 1 0 0 0 29 14 0 0 ... 0 0 0 0 1 0 0 \n", + "30 0 0 0 0 3 0 0 2 0 0 ... 6 0 2 3 2 1 0 \n", + "29 2 23 0 0 1 0 0 3 4 0 ... 1 0 1 3 1 0 1 \n", + "28 6 0 6 0 0 0 6 0 2 0 ... 0 0 0 1 0 2 4 \n", + "27 0 0 1 0 0 0 0 5 0 0 ... 0 0 0 0 0 0 4 \n", + "26 0 0 2 0 0 0 24 0 0 0 ... 0 0 0 0 4 1 1 \n", + "25 0 0 0 0 0 0 0 0 0 0 ... 0 0 1 0 3 0 0 \n", + "24 3 0 0 0 0 0 0 0 0 0 ... 2 0 2 0 0 1 3 \n", + "23 4 0 5 0 0 0 7 0 0 0 ... 0 0 0 4 0 0 0 \n", + "22 13 5 1 0 3 0 0 0 1 0 ... 0 0 1 0 2 0 1 \n", + "21 0 0 0 0 0 0 0 7 0 0 ... 1 0 1 0 0 0 8 \n", + "20 0 0 3 0 0 0 0 3 0 0 ... 0 3 0 8 2 0 0 \n", + "19 0 0 0 0 0 0 0 0 0 0 ... 0 0 1 1 2 0 5 \n", + "17 1 0 0 0 1 0 0 0 0 0 ... 0 0 0 1 0 1 0 \n", + "16 0 0 0 5 0 0 0 0 0 2 ... 0 0 4 1 0 0 1 \n", + "15 0 1 0 0 0 0 0 0 0 0 ... 0 0 8 5 0 0 0 \n", + "14 0 0 0 0 6 0 0 0 0 2 ... 3 0 3 0 1 1 0 \n", + "13 0 3 0 0 0 0 0 12 1 0 ... 6 1 4 0 0 0 2 \n", + "12 2 0 0 0 1 0 0 0 0 0 ... 0 0 0 0 0 4 0 \n", + "11 0 0 0 0 0 0 0 7 0 0 ... 10 0 5 0 6 5 4 \n", + "10 0 0 1 0 1 0 0 0 0 0 ... 0 0 1 0 0 2 1 \n", + "9 0 0 1 0 0 0 0 0 3 0 ... 0 0 1 0 0 0 0 \n", + "8 7 0 0 3 0 0 0 0 0 0 ... 0 0 8 7 1 0 0 \n", + "7 9 0 0 0 0 0 0 0 0 0 ... 0 0 0 8 2 5 3 \n", + "6 0 1 0 0 7 0 0 0 2 0 ... 4 0 1 1 7 5 2 \n", + "5 3 0 0 0 3 0 0 0 0 0 ... 1 4 1 2 1 10 3 \n", + "4 1 0 1 0 6 0 0 0 1 0 ... 0 0 10 2 0 0 17 \n", + "3 2 0 2 0 1 0 1 0 0 0 ... 0 0 1 3 3 3 6 \n", + "2 2 0 2 3 12 0 2 2 2 0 ... 2 3 0 3 0 4 3 \n", + "1 3 2 2 0 6 0 2 1 3 0 ... 2 4 2 2 3 0 1 \n", + "\n", + " 3 2 1 \n", + "198 13 4 14 \n", + "144 0 1 1 \n", + "122 2 8 6 \n", + "117 3 4 2 \n", + "115 0 1 0 \n", + "112 0 5 2 \n", + "105 4 7 4 \n", + "102 7 1 9 \n", + "82 1 3 3 \n", + "71 1 3 2 \n", + "64 4 4 2 \n", + "63 0 2 0 \n", + "61 1 2 1 \n", + "56 4 3 0 \n", + "54 0 1 0 \n", + "51 0 0 1 \n", + "49 0 2 3 \n", + "47 0 2 1 \n", + "46 0 1 0 \n", + "44 3 0 3 \n", + "39 4 6 2 \n", + "34 0 0 0 \n", + "33 0 1 1 \n", + "32 2 0 1 \n", + "30 7 1 2 \n", + "29 0 6 1 \n", + "28 3 3 5 \n", + "27 0 1 1 \n", + "26 0 1 0 \n", + "25 0 0 0 \n", + "24 0 1 2 \n", + "23 0 0 1 \n", + "22 7 4 1 \n", + "21 1 2 2 \n", + "20 2 2 1 \n", + "19 3 2 3 \n", + "17 0 0 0 \n", + "16 0 3 0 \n", + "15 0 0 0 \n", + "14 1 0 2 \n", + "13 2 3 2 \n", + "12 0 0 1 \n", + "11 0 8 6 \n", + "10 2 1 1 \n", + "9 1 1 1 \n", + "8 0 0 4 \n", + "7 2 2 3 \n", + "6 0 0 4 \n", + "5 3 2 3 \n", + "4 7 4 2 \n", + "3 12 9 4 \n", + "2 5 20 11 \n", + "1 4 7 52 \n", + "\n", + "[53 rows x 51 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d_answ" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e3d4852f-fda6-48e3-b602-5621d0ab0127", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DEBUG:matplotlib.colorbar:locator: \n" + ] + }, + { + "data": { + "text/plain": [ + "[Text(0.5, 23.52222222222222, 'FRs cluster size'),\n", + " Text(50.722222222222214, 0.5, 'CDRs cluster size')]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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pThKpWbKpRCG+NSVjNsyjVjLwusES8blUqDlPtPi2war61RBaZqwkpRVOT7uXpJxuTRje66mrGRVYFunpSv5XJSmIZeUWf5MbpRKp0/LfZ5S0zfYm71X9gbg0L0fatB8D8rdSktL8fnnn+P555+HTibHnYiIyKEJoc7moDTfg3K3TZs24fr16xg1apS9q0JERGRbTt6D4lANlOXLlyMuLg5hYWGKjmMwGGAwmHexC2GETmbWQyIiIqodDvOLnJ2djZ07d+KFF15QfKyUlBT4+/ubbddu5apQSyIiIpUwi8cxpKWlITg4GAMGDFB8rKSkJBQUFJhtAd7SN8kSERHVKmFUZ3NQDjHEYzQakZaWhoSEBLi5mVf52rVrOH/+PC5evAgAyMzMBACEhoYiNLTqRoder4deb74IFYd3iIiItMMhGig7d+7E+fPn8fzzz1eKbdmyBaNHjzY9HjZsGABgxowZSE5OrvY5coquScalUs6k0nyrQ0l6I6AsHe5S0XXJeJf6zSXjByRWarb3isByq5lKUbqSstLP1JZsuSqw3Psm911R8j3TRFqoBXKrPOeXFErGbfldUnI9yKUJy01jIPeZyb0vUinSri7K/tGpievJgYdn1OAQDZTY2FgIC1/QUaNGMauHiIjuPw6cIqwGjmsQERGR5jhEDwoREZHT4RAPERERaY6TN1A4xENERESawx4UIiIiLXLgOUzUwAbKf8ml2kmly8ml6n5T71HJeP987a4Y/NPlTHtXocbsneZMlSlJ3dRE2mcNya3iLEcqZV7uOpdfrVj6b5+S1dLl/jYqVVp+22LMWCb9vjhC2rowOvffMDZQiIiItIj3oBAREREBZWVleOuttxAZGQkvLy80adIE7777Lox3NZaEEEhOTkZYWBi8vLwQExODX3/9VfW6sIFCRESkRXZYi2fu3LlYsmQJFi1ahJMnT2LevHl4//338be//c30nHnz5mH+/PlYtGgRDhw4gNDQUPTt2xc3byobyrwXh3iIiIi0yA73oPz4448YPHiwaWHexo0bY/Xq1Th48CCAO70nqampmD59OoYOHQoAWLlyJUJCQrBq1SqMGzdOtbpovgfljz/+wF/+8hcEBgbC29sbHTp0wKFDh0zxDRs2oF+/fggKCoJOp0NGRob9KktERKQxBoMBN27cMNsMBkOVz+3Rowe+++47nDp1Z521o0ePYu/evejfvz8AICsrC7m5uYiNjTWV0ev16NmzJ/bt26dqvTXdQMnPz0f37t3h7u6OrVu34sSJE/jwww9Rt25d03OKiorQvXt3zJkzx34VJSIiUpvRqMqWkpICf39/sy0lJaXKU77++usYPnw4WrRoAXd3d3Ts2BGTJ0/G8OHDAQC5ubkAgJCQELNyISEhpphaND3EM3fuXDRq1AhpaWmmfY0bNzZ7Tnx8PADg3Llzis4V5hsgGb9YaHm147qePpJl5dKI7ZnuFhvaXjK+Pfeozc6tZXIrIculdmo5hVEq7VSuXlpIvdQiW3/eSlLm5dKIw+sES8aVruwtxZbvm5LVzNUorwqVsniSkpKQmJhotk+v11f53LVr1+Lzzz/HqlWr0Lp1a2RkZGDy5MkICwtDQkKC6Xm6e94fIUSlfUppugdly5YtiI6OxtNPP43g4GB07NgRy5Yts3e1iIiIHIZer0edOnXMNksNlKlTp+KNN97AsGHD0LZtW8THx+PVV1819biEhoYCQKXekry8vEq9KkppuoFy9uxZLF68GFFRUfj222/x4osvYtKkSfj000/tXTUiIiLbEkKdzQq3bt2Ci4t508DV1dWUZhwZGYnQ0FDs2LHDFC8tLUV6ejq6deum/DXfRdNDPEajEdHR0Zg9ezYAoGPHjvj111+xePFiPPfcczU+rsFgqHSDkBBG6HSabq8REZEzscNEbQMHDsR7772H8PBwtG7dGkeOHMH8+fPx/PPPA7gztDN58mTMnj0bUVFRiIqKwuzZs+Ht7Y0RI0aoWhdNN1AaNGiAVq1ame1r2bIl1q9fr+i4KSkpmDlzptm+Op714e+lbvcUERGRI/nb3/6Gt99+Gy+//DLy8vIQFhaGcePG4Z133jE9Z9q0aSguLsbLL7+M/Px8dOnSBdu3b4efn5+qddF0A6V79+7IzDRfC+bUqVOIiIhQdNyqbhhqHdFV0TGJiIhUZYd5UPz8/JCamorU1FSLz9HpdEhOTkZycrJN66LpBsqrr76Kbt26Yfbs2XjmmWfw888/Y+nSpVi6dKnpOdeuXcP58+dx8eJFADA1aEJDQ00389xLr9dXukGIwztERKQpTr6asU4IbS/5+tVXXyEpKQmnT59GZGQkEhMTMXbsWFN8xYoVGD16dKVyM2bMsKp15+bxgBrV1RwfD0/JeFFpSS3VpLJI/6obkBWyCqRz6pWkhsuRSzFsFxApGc+4erbG576faTn9WoqWv0f2JDfFwvWSIsm40nR+KXKfWbnM/R1y6dllpX9YXSdr3Zpb+betJrxfT5N/kgZpugcFAJ544gk88cQTFuOjRo3CqFGjaq9CREREZHOab6AQERE5I2GHLB4tYQOFiIhIi+xwk6yW8M5QIiIi0hz2oBAREWmRk2fxsIFCRESkRU4+xMMGSjVJpcO5yMyhYpRpBcuVV5J6qeX0R7k0YjlyacRSKa1y76lceqPSNOIewS0txvbmnVR0bDlS17KStM7q0GoaMSD9vsh9j+yZPh1VV3qKhAuFlyXjpeW3JeNSf5/k0ohDfOpKxi8VXZeMKyH3mWlitWKSxAYKERGRFjGLh4iIiDTHyYd4mMVDREREmsMeFCIiIi1y8iweTfegJCcnQ6fTmW13LwC4YcMG9OvXD0FBQdDpdMjIyLBfZYmIiNRkFOpsDkrzPSitW7fGzp07TY9dXf93t3xRURG6d++Op59+2mwBQSIiIkfHqe41zs3NzazX5G7x8fEAgHPnzik+T3RQlGT84JXTFmMN/QIly56/kScZNwplKYj2TFnVMnumtMqlnUp9LrZc4VVpeU83D8m43Aqwtn5tSig5t9xUArZ0+rqyVXXlPhMl3yNbphErJfd5Mw3Z/jQ9xAMAp0+fRlhYGCIjIzFs2DCcPctl7ImIyAk4+RCPphsoXbp0waeffopvv/0Wy5YtQ25uLrp164arV6/au2pERES25eQNFE0P8cTFxZn+v23btujatSsefPBBrFy5EomJiTU+rsFggMFgMNtnFEbZGV2JiIiodjjUL7KPjw/atm2L06ct3w9SHSkpKfD39zfbLhaeV6mWREREKhBGdTYH5VANFIPBgJMnT6JBgwaKjpOUlISCggKzLcw3XKVaEhERqYBDPNo1ZcoUDBw4EOHh4cjLy8OsWbNw48YNJCQkAACuXbuG8+fP4+LFiwCAzMxMAEBoaKjFzB8A0Ov10Ov1Zvs4vENERKQdmm6g/P777xg+fDiuXLmC+vXr45FHHsH+/fsREREBANiyZQtGjx5tev6wYcMAADNmzEBycrJV55JKI5Yjl0Zsa86cSqxVSlIz7ZlqK0cujViOll+bErZ+Xc+FdbUYW3/liGRZuVV9ldQ9zDdAMi634nigl59k/GrxTavrVF1yUwHIxWuDcODeDzVouoGyZs0ayfioUaMwatSo2qkMERFRbXLyBgrHNYiIiEhzNN2DQkRE5LQ41T0RERFpjpMP8bCBQkREpEVO3kDhPShERESkOexBqQVKV8W8X1MzbS2q7gMWY5GeQZJlt+ceVbs6BG2vZmxPcqtEf3rxR5udW0mqr1wasRylacRS15PSa6m0/Lai8moQTvp9qMAGChERkRZxiIeIiIhIW9iDQkREpEVO3oPCBgoREZEGOftU9w41xJOSkgKdTofJkyeb7T958iQGDRoEf39/+Pn54ZFHHsH58+ftU0kiIiJSzGF6UA4cOIClS5eiXbt2Zvt/++039OjRA2PGjMHMmTPh7++PkydPwtPT0041JSIiUoGT96DUqIFSVlaG3bt347fffsOIESPg5+eHixcvok6dOvD19VW7jigsLMTIkSOxbNkyzJo1yyw2ffp09O/fH/PmzTPta9Kkiep1UMJZUyft7a+ezSzGpubukizr4yHdwJVbIZaqxu9C1ZSuEq2EklRfuRV/5Vb1VlpeyfVkFNLTyGviWnXume6tH+LJzs5G27ZtMXjwYIwfPx6XL18GAMybNw9TpkxRvYIAMH78eAwYMAB9+vQx2280GvH111+jWbNm6NevH4KDg9GlSxds2rTJJvUgIiKi2mF1A+WVV15BdHQ08vPz4eXlZdr/5JNP4rvvvlO1cgCwZs0aHD58GCkpKZVieXl5KCwsxJw5c/D4449j+/btePLJJzF06FCkp6erXhciIqLaIoxClc1RWT3Es3fvXvzf//0fPDzMZz6MiIjAH3/8oVrFAODChQt45ZVXsH379irvKTH+d6XHwYMH49VXXwUAdOjQAfv27cOSJUvQs2fPKo9rMBhgMBjM9gkhoFM44ysREZFqHLhxoQare1CMRiPKyyuPC/7+++/w85OeMtlahw4dQl5eHjp16gQ3Nze4ubkhPT0dCxcuhJubGwIDA+Hm5oZWrVqZlWvZsqVkFk9KSgr8/f3NNmFUNuUyERGRqowqbQ7K6gZK3759kZqaanqs0+lQWFiIGTNmoH///mrWDb1798bx48eRkZFh2qKjozFy5EhkZGRAr9ejc+fOyMzMNCt36tQpREREWDxuUlISCgoKzDadi7qNKyIiIqo5q4d4FixYgF69eqFVq1YoKSnBiBEjcPr0aQQFBWH16tWqVs7Pzw9t2rQx2+fj44PAwEDT/qlTp+LZZ5/FY489hl69emHbtm348ssvsXv3bovH1ev10Ov1Zvs4vENERFriyPePqMHqBkpYWBgyMjKwevVqHD58GEajEWPGjMHIkSPNbpqtLU8++SSWLFmClJQUTJo0Cc2bN8f69evRo0ePWquDrVdojfQPlYxnFeQqOr4UR063lUoltud7Cth2FVYt42rGVXPU75lcmrBcXGl6tdT15OHqrujccitM1woHHp5Rg044+3rO/+Xm8UCNy7KB4njYQLEPNlCq5qjfM6U/4o7cQCm8lSUZV0P+n2NUOU699btVOU5ts/oeFFdXV/Tq1QvXrl0z23/p0iW4ukq3lomIiKh6nD3N2OoGihACBoMB0dHR+OWXXyrFiIiISAXM4rGOTqfD+vXrMXDgQHTr1g2bN282ixEREREpVaMeFFdXV3z00Uf44IMP8Oyzz2LWrFnsPSEiIlKRMKqzOSpFqxn/9a9/RbNmzfDUU09xankiIiI1OXDjQg1WN1AiIiLMboaNiYnB/v37MXDgQFUrVtvksjqyb1yyGKuj95YsW08vPQlcvkF6FlstZ+loORslNaSXxVhK4RHJskpXWbVlVkaIT13J+KWi65JxqewEe66qa29Sn5nc51XX00cyfsNwq0Z1qiCX/SRF7nsoV/frJUUWYwGeylavv1h4Tf5JEhr61bcYu1pyQ7JsoJf03+UChZ8ZKWd1AyUrq3JqVdOmTXHkyBFcumT5R5yIiIiqz5GHZ9SgaIjnbp6enpLTyxMREZEV2ECRFxAQgFOnTiEoKAj16tWTzNa5d34UIiIish57UKphwYIFppWKFyxYUGvpxIsXL8bixYtx7tw5AEDr1q3xzjvvIC4urtJzx40bh6VLl2LBggWYPHlyrdSPiIiIbKNaDZSEhATT/48aNcpWdamkYcOGmDNnDpo2bQoAWLlyJQYPHowjR46gdevWpudt2rQJP/30E8LCwmqtbkRERLbk7D0oVs+DcvjwYRw/ftz0ePPmzRgyZAjefPNNlJaqmwEwcOBA9O/fH82aNUOzZs3w3nvvwdfXF/v37zc9548//sCECRPwr3/9C+7u0msvEBEROQrOg2KlcePG4Y033kDbtm1x9uxZPPvssxg6dCjWrVuHW7duITU11QbVBMrLy7Fu3ToUFRWha9euAACj0Yj4+HhMnTrVrEelJpSk8kql4VUnbk9KFyGzdyqxlMmXLK9mbGu2XNxNLo1Yjj1TiW15vcSGtpeMb889KhlX8pkp/Y5H+Un3/mZcPavo+FKU1F1pmrBS52/k1bhsEbS5ACP9j9U9KKdOnUKHDh0AAOvWrUPPnj2xatUqrFixAuvXr1e7fjh+/Dh8fX2h1+vx4osvYuPGjWjVqhUAYO7cuXBzc8OkSZNUPy8REZFdCZ06m4OyugdFCAGj8U6f0c6dO/HEE08AABo1aoQrV66oWzsAzZs3R0ZGBq5fv47169cjISEB6enpKC4uxkcffYTDhw9bfdOuwWCAwWAw2yeE4FpCRESkGY48PKMGq3tQoqOjMWvWLHz22WdIT0/HgAEDANyZwC0kJET1Cnp4eKBp06aIjo5GSkoK2rdvj48++gg//PAD8vLyEB4eDjc3N7i5uSE7OxuvvfYaGjduLHnMlJQU+Pv7m23CKD2bKxERkTP4448/8Je//AWBgYHw9vZGhw4dcOjQIVNcCIHk5GSEhYXBy8sLMTEx+PXXX1Wvh9UNlNTUVBw+fBgTJkzA9OnTTRk2X3zxBbp166Z6Be8lhIDBYEB8fDyOHTuGjIwM0xYWFoapU6fi22+/lTxGUlISCgoKzDadi/S0x0RERLVJGHWqbNbIz89H9+7d4e7ujq1bt+LEiRP48MMPUbduXdNz5s2bh/nz52PRokU4cOAAQkND0bdvX9y8qe4/9K0e4mnXrp1ZFk+F999/32yNHjW8+eabiIuLQ6NGjXDz5k2sWbMGu3fvxrZt2xAYGIjAwECz57u7uyM0NBTNmzeXPK5er4derzfbx+EdIiLSEnsM8cydOxeNGjVCWlqaad/doxJCCKSmpmL69OkYOnQogDtTgISEhGDVqlUYN26canWxugfFEk9PT9XTfC9duoT4+Hg0b94cvXv3xk8//YRt27ahb9++qp6HiIiIgC1btiA6OhpPP/00goOD0bFjRyxbtswUz8rKQm5uLmJjY0379Ho9evbsiX379qlaF9XW4rGF5cuXW/X8ihlnayLMN0AyLpVOJ7fSqJZTcYnu5sjXslwacYfAJpJxW6byylFybluunA1Ir+wtt6q3Ura8HpWsEF1bhEoZOFUlhlQ1kgAAZ8+exeLFi5GYmIg333wTP//8MyZNmgS9Xo/nnnsOubl3puS4957TkJAQZGdnq1LfCqr1oBAREZF61JqorarEkJSUlCrPaTQa8dBDD2H27Nno2LEjxo0bh7Fjx2Lx4sVmz7v3tghbZMJqugeFiIjIWVl7g6slSUlJSExMNNtXVe8JADRo0MA011iFli1bmuY5Cw0NBQDk5uaiQYMGpufk5eWpnslrVQ/K7du30aRJE5w4cULVShAREZFt6PV61KlTx2yz1EDp3r07MjMzzfadOnUKERERAIDIyEiEhoZix44dpnhpaSnS09NVz+S1qgfF3d0dBoOBGS9EREQ2Zo9bvl599VV069YNs2fPxjPPPIOff/4ZS5cuxdKlSwHcGdqZPHkyZs+ejaioKERFRWH27Nnw9vbGiBEjVK2L1UM8EydOxNy5c/GPf/wDbm4cISIiIrIFtYZ4rNG5c2ds3LgRSUlJePfddxEZGYnU1FSMHDnS9Jxp06ahuLgYL7/8MvLz89GlSxds374dfn7qziemE8K6NtqTTz6J7777Dr6+vmjbti18fHzM4hs2bFC1grUlPKCtZJxZPOQM7udrWctZPEowi8c2x5ZTavhdUfnqyH6ojyrHiTi8U5Xj1Daru0Dq1q2LP//5z7aoi13Ze1VOJcaHPWox9n+GPyTLOuofZQDwdPOQjNty1V5b/uGU+kEAbPuj4MgNEDlKrnW5z7u+t79kXOkK1FKKbxsk40qvVVteb1r+HmkhDdkePShaYnUD5e7Z5YiIiMg27uN/L1RLjeZBKSsrw86dO/H3v//dNPf+xYsXUVhYqGrliIiIyDlZ3YOSnZ2Nxx9/HOfPn4fBYEDfvn3h5+eHefPmoaSkBEuWLLFFPYmIiJyKsw/xWN2D8sorryA6Ohr5+fnw8vIy7a+4eVZNixcvRrt27Ux52127dsXWrVtN8dpa8pmIiKi2CaFTZXNUVjdQ9u7di7feegseHuY3KEZEROCPP6RvyLRWw4YNMWfOHBw8eBAHDx7En/70JwwePNjUCKmtJZ+JiIiodlndQDEajSgvr3z38++//656DvTAgQPRv39/NGvWDM2aNcN7770HX19f7N+/v9KSz23atMHKlStx69YtrFq1StV6EBER1Ta11uJxVFbfg9K3b1+kpqaazSpXWFiIGTNmoH///qpXsEJ5eTnWrVuHoqIidO3aVXbJ53HjxtmsLvdSmpqpNF3244s/WIzJpdopJZWKZ+uUVVumEcux5WtTmtZpz7lM5ObkiPILk4z/km95NVRbz7khRe49KzDcqqWaWK+O3lsy7qqT/nfq1WLLPdJyf1+Up8xL/7pKfS6BXtL/YL58q0Ay7iLzvtQGowMPz6jB6gbKggUL0KtXL7Rq1QolJSUYMWIETp8+jaCgIKxevVr1Ch4/fhxdu3ZFSUkJfH19sXHjRrRq1Qr79u0DUDtLPhMREdU2R75/RA1WN1DCwsKQkZGBNWvW4NChQzAajRgzZgxGjhxpdtOsWpo3b46MjAxcv34d69evR0JCAtLT003xmiz5bDAYYDCYT25ki6WiiYiIqGasbqDs2bMH3bp1w+jRozF69GjT/rKyMuzZswePPfaYqhX08PBA06ZNAQDR0dE4cOAAPvroI7z++usAarbkc0pKCmbOnGm2T+fiC51rHVXrTkREVFNMM7ZSr169cO1a5WnhCwoK0KtXL1UqJUUIAYPBoGjJ56SkJBQUFJhtOhd1b/AlIiJSQgh1NkdldQ+KpaGQq1evVlo4UKk333wTcXFxaNSoEW7evIk1a9Zg9+7d2LZtm6Iln/V6PfR6vdk+Du8QERFpR7UbKEOHDgVw54d81KhRZj/w5eXlOHbsmGzPhbUuXbqE+Ph45OTkwN/fH+3atcO2bdvQt29fALW35DMREVFtc/YhHp0Q1esAqrjfZOXKlXjmmWfMboj18PBA48aNMXbsWAQFBdmmpjbm6RkuGR8c8pDF2PqcA4rObcu0ULkUZlcX6VE+pUu125Lc+yaVJqg0ZdWeKw7bk1zqplRKKqDsfVN6biXk6h1ZJ1Qy/lvBRUXnl/obIPc9kEszviGTIq3k3B6u7pLx0vLbNT633PnlyspdT/kl0mvLlRp+l4yr4ZcmT6hynDZnv1LlOLWt2j0oFasYN27cGFOmTFF9OIeIiIiogtX3oEybNg13d7pkZ2eb5ia5e9I0IiIiqjlnnwfF6iyewYMH49NPPwUAXL9+HQ8//DA+/PBDDB48GIsXL1a9gkRERM7I2bN4rG6gHD58GI8++igA4IsvvkBoaCiys7Px6aefYuHChapXkIiIiJyP1UM8t27dMmXJbN++HUOHDoWLiwseeeQRTjFPRESkEmdfi8fqHpSmTZti06ZNuHDhAr799lvTfSd5eXmoU4czsRIREalBCJ0qm6OyugflnXfewYgRI/Dqq6+id+/e6Nq1K4A7vSkdO3ZUvYK1xV8mFU8qlVhp+qPS1WWlzq807VPL5N43o7Bdqq9cGrGS1PG6ntIZckrSQpWSu55CfOpKxi8VXbfZuWND20vGv8/7RTJulFiXXu7zNhiVpcsqIXfs6yVFdju30jRiub9PejfLaczlRumVkItuGyTjcunZtcGR7x9Rg9UNlKeeego9evRATk4O2rf/3x+E3r1748knn1S1ckREROScrG6gAEBoaChCQ80nJnr44YdVqRARERHxHhSrGyi9evWSXLfm+++/V1QhIiIi4jwoVt8k26FDB7Rv3960tWrVCqWlpTh8+DDatm2rauVSUlLQuXNn+Pn5ITg4GEOGDEFmZqbZc3Q6XZXb+++/r2pdiIiIqPZY3YOyYMGCKvcnJyejsFB67QJrpaenY/z48ejcuTPKysowffp0xMbG4sSJE6ap9nNycszKbN26FWPGjMGf//xnVetCRERUmzjEo5K//OUvePjhh/HBBx+odUhs27bN7HFaWhqCg4Nx6NAhPPbYYwBQ6V6YzZs3o1evXmjSpIlq9SAiIqptTp7Eo14D5ccff4Snp6dah6tSQUEBACAgIKDK+KVLl/D1119j5cqVVh9byUqocqte2ppU3eVSVm2ZgmhrWl5RWElaqSN/JnJpxLZcuXt77tEal1VK7yK9aq892fI9l6P02HLfYT0sv+8lZaWSZeXeF7kUabI9qxsoQ4cONXsshEBOTg4OHjyIt99+W7WK3UsIgcTERPTo0QNt2rSp8jkrV66En59fpToSERE5Gg7xWMnf39/ssYuLC5o3b453333XpqsZT5gwAceOHcPevXstPuef//wnRo4cKduTYzAYYDCYT9IjhJDMTiIiIqpNzp7FY3UDJS0tzRb1kDRx4kRs2bIFe/bsQcOGDat8zg8//IDMzEysXbtW9ngpKSmYOXOm2T6diy90rpyqn4iISAusTjOuTUIITJgwARs2bMD333+PyMhIi89dvnw5OnXqZDa7rSVJSUkoKCgw23Qu0tPVExER1SajSpujqlYPSr169ao9/HHt2jVFFbrb+PHjsWrVKmzevBl+fn7Izc0FcGeYycvLy/S8GzduYN26dfjwww+rdVy9Xg+9Xm+2j8M7RESkJQLO/btUrQZKamqqjatRtcWLFwMAYmJizPanpaVh1KhRpsdr1qyBEALDhw+vxdoRERHZjtHJ84x1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L774oigtLRXvv/++KesqJiamyq7pu505c0Y8++yzws/Pz9Rd7u7uLrp16ybZNZycnCxWr15tMf7mm2+KoUOHyr6Ge993LZC73uRU9zOviaqu9cOHD5victe6peGK6hg1apTZ9u9//9ssPmXKFNGvXz+L5ZVeMxs2bBCfffaZxfi1a9fEihUrJF4Bkf1wHhQ7s/dkSKdPn4bBYECLFi3g5qasQ83DwwNHjx6t8XwWSsorPXdJSQlu375tcV6HqgghkJeXB6PRiKCgILi7u9fo3BVu3boFV1dX6PV6Rcehqql5raulqKgIrq6u8PT0rFF5XjN0P9PGt9TOlE46JkVqEql7J0M6deqUaTKkKVOmYPny5RYnQzpy5Ajq1q1rGtP+/PPPsXjxYpw/fx4RERGYMGEChg0bJlu/qKgoANZNhJSYmFjl/vLycsyZMweBgYEAgPnz56teXum5gf9N4tStWzc0b97c6kmcqir/7rvvVqu80gmkiouLcejQIQQEBJgNFQB3Gln//ve/8dxzz9mkvCOfG/jftX4vpRNvKSl/7do1Ree+evWq3epOZHN27sGxO6VzJMiRmtRHyWRIHTt2FN9//70QQohly5YJLy8vMWnSJLF48WIxefJk4evrK5YvX26xXkomQtLpdKJDhw4iJibGbNPpdKJz584iJiZG9OrVy+K5lZRXem6lkzgpKa/03JmZmSIiIsI0VNGzZ09x8eJFUzw3N1cyu0BJeUc+txylE28pKW/Pc6tRnsiWnH6Ip3///ggPD8cnn3wCFxcXzJkzB3v27ME333yD06dPIzY2FgkJCUhOTq6y/LFjxySP/5///AfDhw83u2mrgre3N3755Rc0adIEAGA0GuHp6YkLFy4gJCQEO3bswKhRo/DHH39UKuvj44OTJ08iPDwcDz30EF588UX89a9/NcVXrVqF9957D7/++muV9arIOAoODsbw4cORm5uLr7/+Gt7e3jAYDHjqqafg6emJdevWVSqbkpKCZcuW4R//+IfZv/jd3d1x9OjRSv/CVbO80nN369YNf/rTnzBr1iysWbMGL7/8Ml566SW89957AGC66XX79u2ql1d67ieffBJlZWVIS0vD9evXkZiYiF9++QW7d+9GeHg4Ll26hLCwsCqvNaXlHfncW7ZsqXJ/hbNnz+K1116zSXl7nluN8kR2Ze8Wkr2pMUdC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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import seaborn as sns\n", + "\n", + "d_answ=d_answ.astype(int)\n", + "d_answ.dtypes\n", + "hm=sns.heatmap(d_answ)\n", + "hm.set(xlabel='FRs cluster size', ylabel='CDRs cluster size')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5940213f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
195162115113979365605954...10987654321
198265801621080...9121224713414
1444003906035010...2002000011
1223011000000...1319138286
11710138900000...2002100342
115010300000000...0000000010
1121010001000...0010140052
10531315000000...10181715474
102053171813000...1091616719
8201020000030...2192540133
7110230402070...3050110132
6430300000016...0017613442
6307047000000...0200001020
6180502000200...9000201121
560000000400...0050100430
540121200000...1207000010
51150900017000...1000000001
490000000000...0080600023
470001100000...6000001021
460000000000...0020200010
4400100100004...0033001303
39101510500040...5088009462
340000000000...0000000000
338010000000...0200010011
32001000291400...0000100201
300000300200...6023210712
2922300100340...1013101061
286060006020...0001024335
270010000500...0000004011
2600200024000...0000411010
250000000000...0010300000
243000000000...2020013012
234050007000...0004000001
2213510300010...0010201741
210000000700...1010008122
200030000300...0308200221
190000000000...0011205323
171000100000...0001010000
160005000002...0041001030
150100000000...0085000000
140000600002...3030110102
1303000001210...6140002232
122000100000...0000040001
110000000700...10050654086
100010100000...0010021211
90010000030...0010000111
87003000000...0087100004
79000000000...0008253223
60100700020...4011752004
53000300000...14121103323
41010600010...001020017742
32020101000...00133361294
220231202220...230304352011
13220602130...24223014752
\n", + "

53 rows × 51 columns

\n", + "
" + ], + "text/plain": [ + " 195 162 115 113 97 93 65 60 59 54 ... 10 9 8 \\\n", + "198 26 5 8 0 16 2 1 0 8 0 ... 9 1 2 \n", + "144 40 0 39 0 6 0 35 0 1 0 ... 2 0 0 \n", + "122 3 0 1 1 0 0 0 0 0 0 ... 1 3 1 \n", + "117 10 1 3 8 9 0 0 0 0 0 ... 2 0 0 \n", + "115 0 103 0 0 0 0 0 0 0 0 ... 0 0 0 \n", + "112 1 0 1 0 0 0 1 0 0 0 ... 0 0 1 \n", + "105 3 1 3 15 0 0 0 0 0 0 ... 10 1 8 \n", + "102 0 5 3 17 1 81 3 0 0 0 ... 1 0 9 \n", + "82 0 1 0 2 0 0 0 0 0 30 ... 2 1 9 \n", + "71 10 2 3 0 4 0 2 0 7 0 ... 3 0 5 \n", + "64 3 0 3 0 0 0 0 0 0 16 ... 0 0 1 \n", + "63 0 7 0 47 0 0 0 0 0 0 ... 0 2 0 \n", + "61 8 0 5 0 2 0 0 0 20 0 ... 9 0 0 \n", + "56 0 0 0 0 0 0 0 4 0 0 ... 0 0 5 \n", + "54 0 1 2 1 2 0 0 0 0 0 ... 1 2 0 \n", + "51 15 0 9 0 0 0 17 0 0 0 ... 1 0 0 \n", + "49 0 0 0 0 0 0 0 0 0 0 ... 0 0 8 \n", + "47 0 0 0 1 1 0 0 0 0 0 ... 6 0 0 \n", + "46 0 0 0 0 0 0 0 0 0 0 ... 0 0 2 \n", + "44 0 0 1 0 0 10 0 0 0 4 ... 0 0 3 \n", + "39 10 1 5 10 5 0 0 0 4 0 ... 5 0 8 \n", + "34 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", + "33 8 0 1 0 0 0 0 0 0 0 ... 0 2 0 \n", + "32 0 0 1 0 0 0 29 14 0 0 ... 0 0 0 \n", + "30 0 0 0 0 3 0 0 2 0 0 ... 6 0 2 \n", + "29 2 23 0 0 1 0 0 3 4 0 ... 1 0 1 \n", + "28 6 0 6 0 0 0 6 0 2 0 ... 0 0 0 \n", + "27 0 0 1 0 0 0 0 5 0 0 ... 0 0 0 \n", + "26 0 0 2 0 0 0 24 0 0 0 ... 0 0 0 \n", + "25 0 0 0 0 0 0 0 0 0 0 ... 0 0 1 \n", + "24 3 0 0 0 0 0 0 0 0 0 ... 2 0 2 \n", + "23 4 0 5 0 0 0 7 0 0 0 ... 0 0 0 \n", + "22 13 5 1 0 3 0 0 0 1 0 ... 0 0 1 \n", + "21 0 0 0 0 0 0 0 7 0 0 ... 1 0 1 \n", + "20 0 0 3 0 0 0 0 3 0 0 ... 0 3 0 \n", + "19 0 0 0 0 0 0 0 0 0 0 ... 0 0 1 \n", + "17 1 0 0 0 1 0 0 0 0 0 ... 0 0 0 \n", + "16 0 0 0 5 0 0 0 0 0 2 ... 0 0 4 \n", + "15 0 1 0 0 0 0 0 0 0 0 ... 0 0 8 \n", + "14 0 0 0 0 6 0 0 0 0 2 ... 3 0 3 \n", + "13 0 3 0 0 0 0 0 12 1 0 ... 6 1 4 \n", + "12 2 0 0 0 1 0 0 0 0 0 ... 0 0 0 \n", + "11 0 0 0 0 0 0 0 7 0 0 ... 10 0 5 \n", + "10 0 0 1 0 1 0 0 0 0 0 ... 0 0 1 \n", + "9 0 0 1 0 0 0 0 0 3 0 ... 0 0 1 \n", + "8 7 0 0 3 0 0 0 0 0 0 ... 0 0 8 \n", + "7 9 0 0 0 0 0 0 0 0 0 ... 0 0 0 \n", + "6 0 1 0 0 7 0 0 0 2 0 ... 4 0 1 \n", + "5 3 0 0 0 3 0 0 0 0 0 ... 1 4 1 \n", + "4 1 0 1 0 6 0 0 0 1 0 ... 0 0 10 \n", + "3 2 0 2 0 1 0 1 0 0 0 ... 0 0 1 \n", + "2 2 0 2 3 12 0 2 2 2 0 ... 2 3 0 \n", + "1 3 2 2 0 6 0 2 1 3 0 ... 2 4 2 \n", + "\n", + " 7 6 5 4 3 2 1 \n", + "198 1 22 4 7 13 4 14 \n", + "144 2 0 0 0 0 1 1 \n", + "122 9 1 3 8 2 8 6 \n", + "117 2 1 0 0 3 4 2 \n", + "115 0 0 0 0 0 1 0 \n", + "112 0 1 4 0 0 5 2 \n", + "105 1 7 1 5 4 7 4 \n", + "102 1 6 1 6 7 1 9 \n", + "82 2 5 4 0 1 3 3 \n", + "71 0 1 1 0 1 3 2 \n", + "64 7 6 1 3 4 4 2 \n", + "63 0 0 0 1 0 2 0 \n", + "61 0 2 0 1 1 2 1 \n", + "56 0 1 0 0 4 3 0 \n", + "54 7 0 0 0 0 1 0 \n", + "51 0 0 0 0 0 0 1 \n", + "49 0 6 0 0 0 2 3 \n", + "47 0 0 0 1 0 2 1 \n", + "46 0 2 0 0 0 1 0 \n", + "44 3 0 0 1 3 0 3 \n", + "39 8 0 0 9 4 6 2 \n", + "34 0 0 0 0 0 0 0 \n", + "33 0 0 1 0 0 1 1 \n", + "32 0 1 0 0 2 0 1 \n", + "30 3 2 1 0 7 1 2 \n", + "29 3 1 0 1 0 6 1 \n", + "28 1 0 2 4 3 3 5 \n", + "27 0 0 0 4 0 1 1 \n", + "26 0 4 1 1 0 1 0 \n", + "25 0 3 0 0 0 0 0 \n", + "24 0 0 1 3 0 1 2 \n", + "23 4 0 0 0 0 0 1 \n", + "22 0 2 0 1 7 4 1 \n", + "21 0 0 0 8 1 2 2 \n", + "20 8 2 0 0 2 2 1 \n", + "19 1 2 0 5 3 2 3 \n", + "17 1 0 1 0 0 0 0 \n", + "16 1 0 0 1 0 3 0 \n", + "15 5 0 0 0 0 0 0 \n", + "14 0 1 1 0 1 0 2 \n", + "13 0 0 0 2 2 3 2 \n", + "12 0 0 4 0 0 0 1 \n", + "11 0 6 5 4 0 8 6 \n", + "10 0 0 2 1 2 1 1 \n", + "9 0 0 0 0 1 1 1 \n", + "8 7 1 0 0 0 0 4 \n", + "7 8 2 5 3 2 2 3 \n", + "6 1 7 5 2 0 0 4 \n", + "5 2 1 10 3 3 2 3 \n", + "4 2 0 0 17 7 4 2 \n", + "3 3 3 3 6 12 9 4 \n", + "2 3 0 4 3 5 20 11 \n", + "1 2 3 0 1 4 7 52 \n", + "\n", + "[53 rows x 51 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d_answ" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d4471620", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idrenamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_clusterrenamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_clusterrenamed_clusterRes_0.5_DB_CDR_H3.fasta_cluster
07u0e_A+B-D7u0e_A+B-D6db5_H+L-P7u0e_A+B-D
17uaq_H+L-A5ifj_J+K-L5ifj_J+K-L7uap_M+N-B
25ifj_J+K-L5ifj_J+K-L5ifj_J+K-L5ifj_J+K-L
35ig7_G+H-I5ifj_J+K-L5ifj_J+K-L5ifj_J+K-L
47rkv_D+H-B5ifj_J+K-L5ifj_J+K-L7rks_H+L-R
...............
35175fcu_H+L-G3iyw_H+L-A3thm_H+L-F4rfn_B+C-A
35184rfn_B+C-A3iyw_H+L-A3thm_H+L-F4rfn_B+C-A
35196t3f_H+L-F6t3f_H+L-F4jo1_H+L-P6t3f_H+L-F
35205bk0_B+A-E5bk0_B+A-E4dtg_H+L-K5bk0_B+A-E
35217u09_H+L-ANaN7u09_H+L-A7u09_H+L-A
\n", + "

3522 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " id \\\n", + "0 7u0e_A+B-D \n", + "1 7uaq_H+L-A \n", + "2 5ifj_J+K-L \n", + "3 5ig7_G+H-I \n", + "4 7rkv_D+H-B \n", + "... ... \n", + "3517 5fcu_H+L-G \n", + "3518 4rfn_B+C-A \n", + "3519 6t3f_H+L-F \n", + "3520 5bk0_B+A-E \n", + "3521 7u09_H+L-A \n", + "\n", + " renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster \\\n", + "0 7u0e_A+B-D \n", + "1 5ifj_J+K-L \n", + "2 5ifj_J+K-L \n", + "3 5ifj_J+K-L \n", + "4 5ifj_J+K-L \n", + "... ... \n", + "3517 3iyw_H+L-A \n", + "3518 3iyw_H+L-A \n", + "3519 6t3f_H+L-F \n", + "3520 5bk0_B+A-E \n", + "3521 NaN \n", + "\n", + " renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster \\\n", + "0 6db5_H+L-P \n", + "1 5ifj_J+K-L \n", + "2 5ifj_J+K-L \n", + "3 5ifj_J+K-L \n", + "4 5ifj_J+K-L \n", + "... ... \n", + "3517 3thm_H+L-F \n", + "3518 3thm_H+L-F \n", + "3519 4jo1_H+L-P \n", + "3520 4dtg_H+L-K \n", + "3521 7u09_H+L-A \n", + "\n", + " renamed_clusterRes_0.5_DB_CDR_H3.fasta_cluster \n", + "0 7u0e_A+B-D \n", + "1 7uap_M+N-B \n", + "2 5ifj_J+K-L \n", + "3 5ifj_J+K-L \n", + "4 7rks_H+L-R \n", + "... ... \n", + "3517 4rfn_B+C-A \n", + "3518 4rfn_B+C-A \n", + "3519 6t3f_H+L-F \n", + "3520 5bk0_B+A-E \n", + "3521 7u09_H+L-A \n", + "\n", + "[3522 rows x 4 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "df=pd.read_csv('/mnt/sabdab/clusters.tsv',sep='\\t')\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "f4c1ba0e", + "metadata": {}, + "outputs": [], + "source": [ + "import statsmodels.api as sm\n", + "\n", + "#data = df[[\"renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster\", \"renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster\"]]\n", + "\n", + "crosstab = pd.crosstab(df[\"renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_CDR_L1_CDR_L2_CDR_L3.fasta_cluster\"], df[\"renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "3c1a4581", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Chi2ContingencyResult(statistic=508208.18755402847, pvalue=0.0, dof=147804, expected_freq=array([[1.85625000e+00, 2.19375000e+00, 6.35625000e+00, ...,\n", + " 5.62500000e-02, 5.62500000e-02, 5.62500000e-02],\n", + " [4.40625000e-01, 5.20738636e-01, 1.50880682e+00, ...,\n", + " 1.33522727e-02, 1.33522727e-02, 1.33522727e-02],\n", + " [3.65625000e-01, 4.32102273e-01, 1.25198864e+00, ...,\n", + " 1.10795455e-02, 1.10795455e-02, 1.10795455e-02],\n", + " ...,\n", + " [9.37500000e-03, 1.10795455e-02, 3.21022727e-02, ...,\n", + " 2.84090909e-04, 2.84090909e-04, 2.84090909e-04],\n", + " [9.37500000e-03, 1.10795455e-02, 3.21022727e-02, ...,\n", + " 2.84090909e-04, 2.84090909e-04, 2.84090909e-04],\n", + " [9.37500000e-03, 1.10795455e-02, 3.21022727e-02, ...,\n", + " 2.84090909e-04, 2.84090909e-04, 2.84090909e-04]]))" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import scipy.stats as stats\n", + "\n", + "stats.chi2_contingency(crosstab)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8f622a07", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "df 147804\n", + "pvalue 1.0\n", + "statistic 49495.96799750064\n" + ] + } + ], + "source": [ + "rslt = table.test_nominal_association()\n", + "print(rslt)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9e67f7f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1a14_H+L-N \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 50.300288 \n", + "1a2y_B+A-C 0.043624 \n", + "1a3r_H+L-P 0.031549 \n", + "1acy_H+L-P 0.054638 \n", + "1adq_H+L-A 0.017010 \n", + "... ... \n", + "7u8g_D+E-A 0.008001 \n", + "7ur4_I+J-A 0.008001 \n", + "7y0v_H+L-R 0.008001 \n", + "7z3a_H+L-D 0.008001 \n", + "7zfa_M+N-D 0.008001 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1a2y_B+A-C \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 8.960676 \n", + "1a2y_B+A-C 154.879042 \n", + "1a3r_H+L-P 0.037659 \n", + "1acy_H+L-P 0.117423 \n", + "1adq_H+L-A 0.021549 \n", + "... ... \n", + "7u8g_D+E-A 0.011190 \n", + "7ur4_I+J-A 0.011190 \n", + "7y0v_H+L-R 0.011190 \n", + "7z3a_H+L-D 0.011190 \n", + "7zfa_M+N-D 0.011190 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1a3r_H+L-P \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.555275 \n", + "1a2y_B+A-C 0.003753 \n", + "1a3r_H+L-P 91.974331 \n", + "1acy_H+L-P 0.230575 \n", + "1adq_H+L-A 0.139235 \n", + "... ... \n", + "7u8g_D+E-A 0.109591 \n", + "7ur4_I+J-A 0.109591 \n", + "7y0v_H+L-R 0.109591 \n", + "7z3a_H+L-D 0.109591 \n", + "7zfa_M+N-D 0.109591 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1acy_H+L-P \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.137734 \n", + "1a2y_B+A-C 0.009900 \n", + "1a3r_H+L-P 0.004691 \n", + "1acy_H+L-P 3.309049 \n", + "1adq_H+L-A 0.000464 \n", + "... ... \n", + "7u8g_D+E-A 0.000373 \n", + "7ur4_I+J-A 0.000373 \n", + "7y0v_H+L-R 0.000373 \n", + "7z3a_H+L-D 0.000373 \n", + "7zfa_M+N-D 0.000373 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1adq_H+L-A \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.194521 \n", + "1a2y_B+A-C 0.027889 \n", + "1a3r_H+L-P 0.018461 \n", + "1acy_H+L-P 0.036781 \n", + "1adq_H+L-A 0.330970 \n", + "... ... \n", + "7u8g_D+E-A 0.002294 \n", + "7ur4_I+J-A 0.002294 \n", + "7y0v_H+L-R 0.002294 \n", + "7z3a_H+L-D 0.002294 \n", + "7zfa_M+N-D 0.002294 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1afv_H+L-A \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.322525 \n", + "1a2y_B+A-C 0.082967 \n", + "1a3r_H+L-P 0.065801 \n", + "1acy_H+L-P 298.735491 \n", + "1adq_H+L-A 0.043665 \n", + "... ... \n", + "7u8g_D+E-A 0.028140 \n", + "7ur4_I+J-A 0.028140 \n", + "7y0v_H+L-R 0.028140 \n", + "7z3a_H+L-D 0.028140 \n", + "7zfa_M+N-D 0.028140 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1ar1_C+D-B \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.171545 \n", + "1a2y_B+A-C 9.358281 \n", + "1a3r_H+L-P 0.012113 \n", + "1acy_H+L-P 0.027511 \n", + "1adq_H+L-A 0.003975 \n", + "... ... \n", + "7u8g_D+E-A 0.000492 \n", + "7ur4_I+J-A 0.000492 \n", + "7y0v_H+L-R 0.000492 \n", + "7z3a_H+L-D 0.000492 \n", + "7zfa_M+N-D 0.000492 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1bgx_H+L-T \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.175032 \n", + "1a2y_B+A-C 0.021075 \n", + "1a3r_H+L-P 0.289738 \n", + "1acy_H+L-P 45.288835 \n", + "1adq_H+L-A 0.004498 \n", + "... ... \n", + "7u8g_D+E-A 0.000686 \n", + "7ur4_I+J-A 0.000686 \n", + "7y0v_H+L-R 0.000686 \n", + "7z3a_H+L-D 0.000686 \n", + "7zfa_M+N-D 0.000686 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1bj1_H+L-W \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 5.434446 \n", + "1a2y_B+A-C 0.011667 \n", + "1a3r_H+L-P 0.005928 \n", + "1acy_H+L-P 0.017606 \n", + "1adq_H+L-A 0.000902 \n", + "... ... \n", + "7u8g_D+E-A 0.000117 \n", + "7ur4_I+J-A 0.000117 \n", + "7y0v_H+L-R 0.000117 \n", + "7z3a_H+L-D 0.000117 \n", + "7zfa_M+N-D 0.000117 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 1bog_B+A-C \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.012066 \n", + "1a2y_B+A-C 0.021075 \n", + "1a3r_H+L-P 0.013016 \n", + "1acy_H+L-P 0.209148 \n", + "1adq_H+L-A 0.004498 \n", + "... ... \n", + "7u8g_D+E-A 0.000686 \n", + "7ur4_I+J-A 0.000686 \n", + "7y0v_H+L-R 0.000686 \n", + "7z3a_H+L-D 0.000686 \n", + "7zfa_M+N-D 0.000686 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster ... \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... ... \n", + "1a14_H+L-N ... \n", + "1a2y_B+A-C ... \n", + "1a3r_H+L-P ... \n", + "1acy_H+L-P ... \n", + "1adq_H+L-A ... \n", + "... ... \n", + "7u8g_D+E-A ... \n", + "7ur4_I+J-A ... \n", + "7y0v_H+L-R ... \n", + "7z3a_H+L-D ... \n", + "7zfa_M+N-D ... \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 7z3a_H+L-D \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.551452 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 7zlk_Q+R-C \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 8a1e_B+C-A \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 8d47_H+L-C \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 8d6z_C+D-K \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 8dcy_A+B-C \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 8ddk_A+B-C \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.032561 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 8dfi_H+L-A \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 8gx9_P+M-A \\\n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.464136 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "renamed_clusterRes_0.8_DB_FR_H1_FR_H2_FR_H3_FR_L1_FR_L2_FR_L3.fasta_cluster 8hhy_H+L-A \n", + "renamed_clusterRes_0.5_DB_CDR_H3_CDR_H2_CDR_H1_... \n", + "1a14_H+L-N 0.134466 \n", + "1a2y_B+A-C 0.009063 \n", + "1a3r_H+L-P 0.004121 \n", + "1acy_H+L-P 0.014366 \n", + "1adq_H+L-A 0.000298 \n", + "... ... \n", + "7u8g_D+E-A 0.000557 \n", + "7ur4_I+J-A 0.000557 \n", + "7y0v_H+L-R 0.000557 \n", + "7z3a_H+L-D 0.000557 \n", + "7zfa_M+N-D 0.000557 \n", + "\n", + "[328 rows x 453 columns]\n" + ] + } + ], + "source": [ + "print(table.chi2_contribs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b0772e5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}