#load modules
import os
import subprocess
import time
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import pandas as pd
#go to working directory
work_dir='/nagyvinyok/adat84/sotejedlik/ribli/dt40/method/gatk/mutect_pair_pon_wt_ko'
subprocess.call(['mkdir',work_dir])
os.chdir(work_dir)
#gallus reference
galref="/home/ribli/input/index/gallus/complete/Gallus_gallus.Galgal4.74.dna.toplevel.fa"
input_dir='/nagyvinyok/adat83/sotejedlik/orsi/bam_all_links_methodpaper/'
output_dir=work_dir
%%bash
java -jar /nagyvinyok/adat88/kozos/sotejedlik/usr/gatk/picard.jar \
CreateSequenceDictionary \
REFERENCE=/home/ribli/input/index/gallus/complete/Gallus_gallus.Galgal4.74.dna.toplevel.fa \
OUTPUT=/home/ribli/input/index/gallus/complete/Gallus_gallus.Galgal4.74.dna.toplevel.dict
Defining a function to run the generation of vcf-s needed for PoN
Running the function
def run_mutect_artif_detect(sample,input_dir,output_dir,ref_genome):
#input,output,log,scipt_file
sample_bam=input_dir+sample+'_RMdup_picard_realign.bam '
log=output_dir+'/'+sample+'.gatkVcf.log '
script_fname=sample+'gatk1'+'.sh'
#gatk command
cmd='time java -Xmx2g -jar /nagyvinyok/adat88/kozos/sotejedlik/usr/gatk/mutect-1.1.7.jar '
cmd+=' -T MuTect '
cmd+=' -R '+ ref_genome
cmd+=' -I:tumor '+ sample_bam
cmd+=' --artifact_detection_mode '
cmd+=' -vcf ' + sample + '.call_stats.vcf'
cmd+=' --coverage_file '+sample+'.coverage.wig.txt'
cmd+=' 2> '+ log
print cmd,'\n'
#write scriptfile
with open(script_fname,'w') as f:
f.write('#!/bin/bash\n')
f.write(cmd+'\n')
#submit script to sbatch
print subprocess.check_output(['sbatch','--mem','3000',script_fname],
stderr=subprocess.STDOUT),'\n'
#########################################################################
samples=['S01','S02','S03','S04','S05','S06','S07','S08',
'S09','S10','S11','S12','S13','S14','S15']
samples+=['S16','S17','S18','S19','S20','S21','S22','S23',
'S24','S25','S26','S27','S28','S29','S30']
for sample in samples:
run_mutect_artif_detect(sample,input_dir,output_dir,ref_genome=galref)
%%bash
tail -n1 *Vcf.log
The guidelines used described the PoN generation without using the --genotypemergeoption UNIQUIFY option. However, this resulted in the following error message:
To overcome the issue, the --genotypemergeoption UNIQUIFY option was invoked.
def run_mutect_cobine_into_pon(sample,samples,input_dir,ref_genome):
#input,output,log,scipt_file
output=sample+'_PoN.vcf'
log=sample+'.gatkCombine.log '
script_fname=sample+'_PoN_combine.sh'
#gatk command
cmd='time java -Xmx3g -jar /nagyvinyok/adat88/kozos/sotejedlik/usr/gatk/GenomeAnalysisTK.jar '
cmd+=' -T CombineVariants '
cmd+=' -R '+ ref_genome
for other_sample in samples:
if (other_sample != sample):
cmd+=' -V '+other_sample+'.call_stats.vcf'
cmd+=' -minN 2 '
cmd+=' --filteredrecordsmergetype KEEP_IF_ANY_UNFILTERED '
cmd+=' --filteredAreUncalled '
cmd+=' --genotypemergeoption UNIQUIFY '
cmd+=' -o ' + output
cmd+=' 2> '+ log
print cmd,'\n'
#write scriptfile
with open(script_fname,'w') as f:
f.write('#!/bin/bash\n')
f.write(cmd+'\n')
#submit script to sbatch
print subprocess.check_output(['sbatch','-C','jimgray83','--mem','3000',script_fname],
stderr=subprocess.STDOUT),'\n'
#########################################################################
samples=['S01','S02','S03','S04','S05','S06','S07','S08',
'S09','S10','S11','S12','S13','S14','S15']
samples+=['S16','S17','S18','S19','S20','S21','S22','S23',
'S24','S25','S26','S27','S28','S29','S30']
for sample in samples:
run_mutect_cobine_into_pon(sample,samples,input_dir,ref_genome=galref)
%%bash
tail -n2 *Combine.log
def run_mutect_w_pair_and_pon(sample,normal_sample,input_dir,ref_genome):
#input,output,log,scipt_file
normal_sample_bam=input_dir+normal_sample+'_RMdup_picard_realign.bam '
sample_bam=input_dir+sample+'_RMdup_picard_realign.bam '
pon_file= sample+'_PoN.vcf'
cov_file= sample+'_w_pair_and_PoN.coverage.wig.txt'
output= sample+'_w_pair_and_PoN.call_stats.txt'
log=sample+'.mutect_w_pair_and_PoN.log'
script_fname=sample+'_w_pair_and_PoN.sh'
#gatk command
cmd='time java -Xmx3g -jar /nagyvinyok/adat88/kozos/sotejedlik/usr/gatk/mutect-1.1.7.jar '
cmd+=' -T MuTect '
cmd+=' -R '+ ref_genome
cmd+=' -I:normal '+ normal_sample_bam
cmd+=' -I:tumor '+ sample_bam
cmd+=' --normal_panel '+ pon_file
cmd+=' --coverage_file ' + cov_file
cmd+=' -o ' + output
cmd+=' 2> '+ log
print cmd,'\n'
#write scriptfile
with open(script_fname,'w') as f:
f.write('#!/bin/bash\n')
f.write(cmd+'\n')
#submit script to sbatch
print subprocess.check_output(['sbatch','-C','jimgray83','--mem','3000',script_fname],
stderr=subprocess.STDOUT),'\n'
#########################################################################
samples= ['S01','S02','S03','S04','S05','S06','S07',
'S08','S09','S10','S11','S12','S13','S14','S15']
normal_samples=['S02','S01','S01','S01','S15','S15','S15',
'S15','S15','S15','S15','S15','S15','S15','S12']
samples+= ['S16','S17','S18','S19','S20','S21','S22','S23',
'S24','S25','S26','S27','S28','S29','S30']
normal_samples+= ['S18','S16','S16','S16','S21','S20','S20','S20',
'S20','S20','S20','S30','S20','S20','S27']
for sample,normal_sample in zip(samples,normal_samples):
run_mutect_w_pair_and_pon(sample,normal_sample,input_dir,ref_genome=galref)
%%bash
tail -n2 *mutect_w_pair_and_PoN.log
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']
for sample in samples:
subprocess.check_output('grep -v REJECT '+ sample+'_w_pair_and_PoN.call_stats.txt > ' +
sample+'_w_pair_and_PoN_no_REJECT.call_stats.txt',shell=True)
chroms=set(map(str,range(1,28)+[32]) + ['W','Z'])
mut_outputs=[]
for sample in samples:
mut_outputs.append(pd.read_csv(+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]
##define sample groups
control_idx=[0,4,13]+ [15,26,29]
weak_idx=[5,6,7]+[19,20,21]
strong_idx=[1,2,3,8,9,10,11,12,14]+[16,17,18,22,23,24,25,27,28]
def plot_muts(muts):
fig,ax=plt.subplots()
fig.set_size_inches(12,9)
#starting clones and controls
ax.bar(control_idx,muts[control_idx],
facecolor='dodgerblue',edgecolor='none',label='starting clone and controls')
#weak treatment
ax.bar(weak_idx,muts[weak_idx],
facecolor='salmon',edgecolor='none',label='weak mutagenic treatment')
#strong treatment
ax.bar(strong_idx,muts[strong_idx],
facecolor='lightgreen',edgecolor='none',label='strong mutagenic treatment')
#samples labels
ax.set_xticks(0.4+np.arange(len(samples)))
ax.set_xticklabels(samples,rotation='vertical',fontsize=14)
#axis, and legend
ax.set_xlabel(r'samples',fontsize=18)
ax.set_ylabel(r'Mutations detected',fontsize=18)
dump=ax.legend(loc='best',fancybox='true',fontsize=16)
muts=[]
for output in mut_outputs:
filt_idx= np.array([x in chroms for x in map(str,output['contig']) ])
muts.append(len(output[filt_idx]))
muts=np.array(muts)
plot_muts(muts)
#set cols
cols=['lightgreen' for i in xrange(30)]
for i in control_idx:
cols[i]='dodgerblue'
for i in weak_idx:
cols[i]='salmon'
#linscale
fig,ax=plt.subplots()
fig.set_size_inches(12,9)
for output,sample,col in zip(mut_outputs,samples,cols):
lod_vals=output.sort([u't_lod_fstar'])[u't_lod_fstar']
ax.plot(lod_vals,len(lod_vals)-np.arange(len(lod_vals)),c=col,lw=4,label='')
ax.set_xlabel(r'LOD-value threshold',fontsize=16)
ax.set_ylabel(r'Mutations found',fontsize=16)
ax.set_xlim(5,60)
ax.set_ylim(1,5e3)
ax.grid()
#dump=ax.legend(loc='upper right',fancybox='true',fontsize=16)
#logscale
fig,ax=plt.subplots()
fig.set_size_inches(12,9)
for output,sample,col in zip(mut_outputs,samples,cols):
lod_vals=output.sort([u't_lod_fstar'])[u't_lod_fstar']
ax.plot(lod_vals,len(lod_vals)-np.arange(len(lod_vals)),c=col,lw=4,label='')
ax.set_xlabel(r'LOD-value threshold',fontsize=16)
ax.set_ylabel(r'Mutations found',fontsize=16)
ax.set_xlim(5,60)
ax.set_ylim(1,5e3)
ax.set_yscale('log')
ax.grid()
#dump=ax.legend(loc='upper right',fancybox='true',fontsize=16)
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']>20))
muts.append(len(output[filt_idx]))
muts=np.array(muts)
plot_muts(muts)