IsoMut performs better on the 30 samples analysed
IsoMut scales better for lower sample number in case on the 15 WT samples, and it scales much better in the case of the 15 Mutant 1 samples!
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import matplotlib
matplotlib.rc('font', size=18)
matplotlib.rcParams['xtick.labelsize'] = 14
matplotlib.rcParams['ytick.labelsize'] = 14
def plot_quasy_roc(our_output,control_idx,not_control_idx,ax,label,color,linestyle,
xmin=-1e-3,xmax=15e-3,ymin=0,ymax=1.3):
scan_vals=np.linspace(0,10,200)
fp, tp = [0 for i in scan_vals ],[0 for i in scan_vals ]
for score_lim,j in zip(scan_vals,xrange(len(scan_vals))):
muts=[]
for i in xrange(len(control_idx+not_control_idx)):
try:
filt_idx = (our_output['#sample'] == i)
except:
filt_idx = (our_output['#sample_idx'] == i)
filt_idx = filt_idx & ((our_output['score']>score_lim))
muts.append(len(our_output[filt_idx]))
muts=np.array(muts)
fp[j] ,tp[j]=1e-3*np.mean(muts[control_idx]),1e-3*np.mean(muts[not_control_idx])
ax.plot(fp,tp,c=color,lw=4,label=label,linestyle=linestyle)
ax.legend(fancybox=True,loc='center left', bbox_to_anchor=(1, 0.5),fontsize=16)
ax.set_xlim(xmin,xmax)
ax.set_ylim(ymin,ymax)
ax.set_xlabel('false positive mutations 1/Mbp',fontsize=18)
dump=ax.set_ylabel('mutations detected 1/Mbp',fontsize=18)
def plot_mutect(mutect_outputs,control_idx,not_control_idx,ax,color,linestyle):
scan_vals=range(0,200)
fp, tp = [0 for i in scan_vals ],[0 for i in scan_vals ]
for lod_lim,j in zip(scan_vals,xrange(len(scan_vals))):
muts=[]
for output in mut_outputs:
filt_idx= np.array([x in chroms for x in map(str,output['contig']) ])
filt_idx=filt_idx & ((output['t_lod_fstar']>lod_lim))
muts.append(len(output[filt_idx]))
muts=np.array(muts)
fp[j] ,tp[j]=1e-3*np.mean(muts[control_idx]),1e-3*np.mean(muts[not_control_idx])
ax.plot(fp,tp,c=color,lw=4,linestyle=linestyle,label='MuTect, with pair and PoN')
ax.legend(fancybox=True,loc='center left', bbox_to_anchor=(1, 0.5),fontsize=16)
ax.set_xlim(-1e-3,15e-3)
ax.set_ylim(0,1.3)
ax.set_xlabel('false positive mutations 1/Mbp',fontsize=18)
dump=ax.set_ylabel('mutations detected 1/Mbp',fontsize=18)
chroms=set(map(str,range(1,28)+[32]) + ['W','Z'])
cols = sns.color_palette("husl", 2)
samples= ['S01','S02','S03','S04','S05','S06','S07','S08','S09','S10','S11','S12','S13','S14','S15', 'S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30']
control_idx=[0,11,14]+ [15,26,29]
not_control_idx=[1,2,3,4,5,6,7,8,9,10,12,13]+[16,17,18,19,20,21,22,23,24,25,27,28]
For details on usage see
(When run individually, please adjust input file names and directories.)
output_30=pd.read_csv('../post_proc_weak_sample_strong_noise/isomut/output/all_SNVs.isomut',sep='\t',header=0)
mut_outputs=[]
mut_input_dir='/nagyvinyok/adat84/sotejedlik/ribli/dt40/method/gatk/mutect_pair_pon_wt_ko/'
for sample in samples:
mut_outputs.append(pd.read_csv(mut_input_dir+sample+'_w_pair_and_PoN_no_REJECT.call_stats.txt',sep='\t',header=1))
filt_idx= np.array([x in chroms for x in map(str,mut_outputs[-1]['contig']) ])
mut_outputs[-1]=mut_outputs[-1][filt_idx]
fig,ax=plt.subplots()
fig.set_size_inches(15,9)
box=ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
plot_mutect(mut_outputs,control_idx,not_control_idx,ax,cols[0],'dashed')
plot_quasy_roc(output_30,control_idx,not_control_idx,ax,
'IsoMut',cols[1],'solid',xmax=5e-2)
samples= ['S01','S02','S03','S04','S05','S06','S07','S08','S09','S10','S11','S12','S13','S14','S15']
control_idx=[0,11,14]
not_control_idx=[1,2,3,4,5,6,7,8,9,10,12,13]
output_15WT=pd.read_csv('../wt_test/isomut/isomut/output/all_SNVs.isomut',sep='\t',header=0)
mut_outputs=[]
mut_input_dir='/nagyvinyok/adat84/sotejedlik/ribli/dt40/method/gatk/mutect_pair_pon_wt/'
for sample in samples:
mut_outputs.append(pd.read_csv(mut_input_dir+sample+'_w_pair_and_PoN_no_REJECT.call_stats.txt',sep='\t',header=1))
filt_idx= np.array([x in chroms for x in map(str,mut_outputs[-1]['contig']) ])
mut_outputs[-1]=mut_outputs[-1][filt_idx]
fig,ax=plt.subplots()
fig.set_size_inches(15,9)
box=ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
plot_mutect(mut_outputs,control_idx,not_control_idx,ax,cols[0],'dashed')
plot_quasy_roc(output_15WT,control_idx,not_control_idx,ax,
'IsoMut',cols[1],'solid',xmax=5e-2,ymax=1.0)
samples= ['S16', 'S17', 'S18', 'S19', 'S20', 'S21', 'S22', 'S23', 'S24', 'S25', 'S26', 'S27', 'S28', 'S29', 'S30']
control_idx=[0,11,14]
not_control_idx=[1,2,3,4,5,6,7,8,9,10,12,13]
output_15KO=pd.read_csv('../ko_test/isomut/isomut/output/all_SNVs.isomut',sep='\t',header=0)
mut_outputs=[]
mut_input_dir='/nagyvinyok/adat84/sotejedlik/ribli/dt40/method/gatk/mutect_pair_pon/'
for sample in samples:
mut_outputs.append(pd.read_csv(mut_input_dir+sample+'_w_pair_and_PoN_no_REJECT.call_stats.txt',sep='\t',header=1))
filt_idx= np.array([x in chroms for x in map(str,mut_outputs[-1]['contig']) ])
mut_outputs[-1]=mut_outputs[-1][filt_idx]
fig,ax=plt.subplots()
fig.set_size_inches(15,9)
box=ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
plot_mutect(mut_outputs,control_idx,not_control_idx,ax,cols[0],'dashed')
plot_quasy_roc(output_15KO,control_idx,not_control_idx,ax,
'IsoMut',cols[1],'solid',xmax=5e-2,ymax=2.0)