import streamlit as st
import zipfile
import urllib.request
import glob
import SigProfilerMatrixGenerator
from SigProfilerMatrixGenerator import install as genInstall
import shutil
import os
import re
from SigProfilerExtractor import sigpro as sig
from SigProfilerMatrixGenerator.scripts import SigProfilerMatrixGeneratorFunc as datadump
import sys
import numpy as np
import pandas as pd
import base64
import streamlit.components.v1 as components
from liftover import get_lifter
converter = get_lifter('hg38', 'hg19')
curdir= os.getcwd()
def remove_old_vcf():
vcfrem=glob.glob('input/*.vcf')
for filepath in vcfrem:
os.remove(filepath)
vcfrem=glob.glob('input/input/*.vcf')
for filepath in vcfrem:
os.remove(filepath)
def show_pdf(file_path):
with open(file_path,"rb") as f:
base64_pdf = base64.b64encode(f.read()).decode('utf-8')
pdf_display = f''
st.markdown(pdf_display, unsafe_allow_html=True)
def showdl_counts(file_to_lookat,to_dl_sbs96,to_dl_sbs1536):
for j in np.arange(0,len(to_dl_sbs96)):
if to_dl_sbs96[j] != []:
download_link1 = f'Download {file_to_lookat[j].name} Single Base Substition (96) table'
download_link2 = f'Download {file_to_lookat[j].name} Single Base Substition (1536) table'
st.markdown(download_link1, unsafe_allow_html=True)
st.markdown(download_link2, unsafe_allow_html=True)
#@st.cache_data(experimental_allow_widgets=True)
def showdl(file_to_lookat,to_dl_sbs,to_dl_indel,to_dl_dbs,to_dl_sbs_text,to_dl_indel_text,to_dl_dbs_text,to_dl_sbs_summary_text,to_dl_id_summary_text,to_dl_dbs_summary_text):
for j in np.arange(0,len(to_dl_sbs)):
if to_dl_sbs[j] != []:
download_link1 = f'Download {file_to_lookat[j].name} Single Base Substition pdf'
download_link2 = f'Download {file_to_lookat[j].name} Single Base Substition table'
download_link3 = f'Download {file_to_lookat[j].name} Summary Single Base Substition table'
st.markdown(download_link1, unsafe_allow_html=True)
st.markdown(download_link2, unsafe_allow_html=True)
st.markdown(download_link3, unsafe_allow_html=True)
for j in np.arange(0,len(to_dl_indel)):
if to_dl_indel[j] != []:
download_link4 = f'Download {file_to_lookat[j].name} indel pdf'
download_link5 = f'Download {file_to_lookat[j].name} indel table'
download_link6 = f'Download {file_to_lookat[j].name} summary indel table'
st.markdown(download_link4, unsafe_allow_html=True)
st.markdown(download_link5, unsafe_allow_html=True)
st.markdown(download_link6, unsafe_allow_html=True)
for j in np.arange(0,len(to_dl_dbs)):
if to_dl_dbs[j] !=[]:
download_link7 = f'Download {file_to_lookat[j].name} Double Base Substitution pdf'
download_link8 = f'Download {file_to_lookat[j].name} Double Base Substitution table'
download_link9 = f'Download {file_to_lookat[j].name} summary Double Base Substitution table'
st.markdown(download_link7, unsafe_allow_html=True)
st.markdown(download_link8, unsafe_allow_html=True)
st.markdown(download_link9, unsafe_allow_html=True)
#st.download_button(label="Download image with single base substitution profiles", key=j,
# data=to_dl_sbs[j],
# file_name="SBS.pdf",
# mime='application/octet-stream')
#st.download_button(label="Download image with indel profiles", key=0.5+j,
# data=to_dl_indel[j],
# file_name="idel.pdf",
# mime='application/octet-stream')
def dl_counts(valforkey):
with open("sbs96.txt","rb") as txt_file:
sbs96_all_bytes = txt_file.read()
txt_file.close()
with open("sbs1536.txt","rb") as txt_file:
sbs1536_all_bytes = txt_file.read()
txt_file.close()
return sbs96_all_bytes, sbs1536_all_bytes
def dl(valforkey):
#breakpoint()
seev=glob.glob('output/SBS96/Suggested_Solution/COSMIC_SBS96_Decomposed_Solution/*pdf')
for i in seev:
st.write('pdf file with sbs96 output is here: '+i)
with open("output/SBS96/Suggested_Solution/COSMIC_SBS96_Decomposed_Solution/SBS96_Decomposition_Plots.pdf", "rb") as pdf_file:
PDFbyte1 = pdf_file.read()
with open("output/SBS96/Samples.txt","rb") as txt_file:
Txtbyte1 = txt_file.read()
txt_file.close()
hh=pd.read_table('output/SBS96/Samples.txt')
hh['nums']=hh.iloc[:,1]
hh['mutation_simple']=hh['MutationType'].apply(lambda x: re.sub('].$','',re.sub('^.\[','',x)))
summary_table_sbs_all=hh.groupby('mutation_simple').apply(lambda x: x.sum())[['nums']]
summary_table_sbs_all.to_csv('sbs_summary.txt',sep='\t',header=False,index=True)
with open("sbs_summary.txt","rb") as txt_file:
summary_table_sbs_all_bytes = txt_file.read()
txt_file.close()
#st.download_button(label="Download image with single base substitution profiles", key=valforkey,
# data=PDFbyte1,
# file_name="SBS.pdf",
# mime='application/octet-stream')
if glob.glob('output/ID83/Suggested_Solution/COSMIC_ID83_Decomposed_Solution/ID83_Decomposition_Plots.pdf') != []:
with open("output/ID83/Suggested_Solution/COSMIC_ID83_Decomposed_Solution/ID83_Decomposition_Plots.pdf", "rb") as pdf_file:
PDFbyte2 = pdf_file.read()
with open("output/ID83/Samples.txt","rb") as txt_file:
Txtbyte2 = txt_file.read()
hh2=pd.read_table('output/ID83/Samples.txt')
hh2['nums']=hh2.iloc[:,1]
hh2['mutation_simple']=hh2['MutationType'].apply(lambda x: re.sub('].$','',re.sub('^.\[','',x)))
summary_table_id_all=hh2.groupby('mutation_simple').apply(lambda x: x.sum())[['nums']]
summary_table_id_all.to_csv('id_summary.txt',sep='\t',header=False,index=True)
with open("id_summary.txt","rb") as txt_file:
summary_table_id_all_bytes = txt_file.read()
txt_file.close()
else:
PDFbyte2 = []
Txtbyte2 = []
summary_table_id_all_bytes=[]
if glob.glob("output/DBS78/Suggested_Solution/COSMIC_DBS78_Decomposed_Solution/DBS78_Decomposition_Plots.pdf") != []:
with open("output/DBS78/Suggested_Solution/COSMIC_DBS78_Decomposed_Solution/DBS78_Decomposition_Plots.pdf", "rb") as pdf_file:
PDFbyte3 = pdf_file.read()
with open("output/DBS78/Samples.txt","rb") as txt_file:
Txtbyte3 = txt_file.read()
hh3=pd.read_table('output/DBS78/Samples.txt')
hh3['nums']=hh3.iloc[:,1]
hh3['mutation_simple']=hh3['MutationType'].apply(lambda x: re.sub('].$','',re.sub('^.\[','',x)))
summary_table_dbs_all=hh3.groupby('mutation_simple').apply(lambda x: x.sum())[['nums']]
summary_table_dbs_all.to_csv('dbs_summary.txt',sep='\t',header=False,index=True)
with open("dbs_summary.txt","rb") as txt_file:
summary_table_dbs_all_bytes = txt_file.read()
txt_file.close()
else:
PDFbyte3 = []
Txtbyte3=[]
summary_table_dbs_all_bytes=[]
os.system('rm -r output')
os.system('rm -r input')
#os.remove("output/SBS96/Suggested_Solution/COSMIC_SBS96_Decomposed_Solution/SBS96_Decomposition_Plots.pdf")
#os.remove("output/SBS96/Suggested_Solution/COSMIC_SBS96_Decomposed_Solution/*")
#os.remove("output/SBS96/Samples.txt")
#os.remove("output/ID83/Suggested_Solution/COSMIC_ID83_Decomposed_Solution/ID83_Decomposition_Plots.pdf")
#os.remove("output/ID83/Samples.txt")
#os.remove("output/DBS78/Suggested_Solution/COSMIC_DBS78_Decomposed_Solution/DBS78_Decomposition_Plots.pdf")
#os.remove("output/DBS78/Samples.txt")
#st.download_button(label="Download image with indel profiles", key=0.5+valforkey,
# data=PDFbyte2,
# file_name="idel.pdf",
# mime='application/octet-stream')
return PDFbyte1,PDFbyte2,PDFbyte3,Txtbyte1,Txtbyte2,Txtbyte3, summary_table_sbs_all_bytes, summary_table_id_all_bytes,summary_table_dbs_all_bytes
#st.write(glob.glob(os.path.join(os.path.dirname(SigProfilerMatrixGenerator.__file__),'references/*txt')))
with st.form('get signature'):
if glob.glob(os.path.join(os.path.dirname(SigProfilerMatrixGenerator.__file__),'references/chromosomes/tsb/GRCh3[78]/')+'*txt') == []:
st.write('There is no reference genome, we need to download this')
refdownload=True
else:
st.write('using reference from here:'+glob.glob(os.path.join(os.path.dirname(SigProfilerMatrixGenerator.__file__),'references/chromosomes/tsb/GRCh3[78]/'))[0])
refdownload=False
no_profiles_only_counts = st.radio('Do Not Perform COSMIC profile analysis',[False, True])
referencegenome =st.radio('reference',['hg19','GRCh38'])
file_to_lookat=st.file_uploader('VCF upload here',type=[".vcf","xlsx"],accept_multiple_files=True)
remove_old_vcf()
sub=st.form_submit_button('submit input')
if file_to_lookat !=[] and sub:
#if st.button('get reference genome'):
#st.write(os.path.dirname(SigProfilerMatrixGenerator.__file__))
dirtest=os.path.dirname(SigProfilerMatrixGenerator.__file__)
#st.write(sys.path)
if refdownload==True:
if referencegenome=='GRCh38':
st.write('using liftover with hg19 instead of downloading Grch38')
with st.spinner('downloading hg19 reference'):
urllib.request.urlretrieve('https://dl.dropboxusercontent.com/s/et97ewsct862x7m/references.zip?dl=0','references.zip')
with zipfile.ZipFile('references.zip', 'r') as zip_ref:
zip_ref.extractall(dirtest)
#elif refdownload==True and referencegenome=='GRCh38':
#with st.spinner('downloading GRCh38 reference'):
# genInstall.install('GRCh38')
#seev=glob.glob(dirtest+'/references/chromosomes/tsb/GRCh37/*txt')
#for i in seev:
# st.write(i)
##genInstall.install('GRCh37')
to_dl_sbs=[]
to_dl_indel=[]
to_dl_dbs=[]
to_dl_sbs_text=[]
to_dl_indel_text=[]
to_dl_dbs_text=[]
to_dl_sbs_summary_text=[]
to_dl_id_summary_text=[]
to_dl_dbs_summary_text=[]
to_dl_sbs96=[]
to_dl_sbs1536=[]
for j in np.arange(0,len(file_to_lookat)):
if not os.path.exists('input'):
os.mkdir('input')
if not os.path.exists('input/input'):
os.mkdir('input/input')
remove_old_vcf()
if re.findall('vcf$',file_to_lookat[j].name) != []:
bytes_data=file_to_lookat[j].read()
with open(os.path.join("input",file_to_lookat[j].name),"wb") as f:
f.write(bytes_data)
f.close()
seev=glob.glob('input/*')
else:
table_of_penn_file=pd.read_excel(file_to_lookat[j])
tovcf=pd.DataFrame()
table_of_penn_file=table_of_penn_file.iloc[1:,:]
tt=table_of_penn_file[['Chrom','Pos']].apply(lambda x: converter[x[0]][int(x[1])][0],axis=1)
table_of_penn_file['Chrom']= [a[0] for a in tt]
table_of_penn_file['Pos']= [a[1] for a in tt]
tovcf['Chrom']=table_of_penn_file['Chrom']
tovcf['Pos']=table_of_penn_file['Pos']
tovcf['db']='.'
tovcf['ref']=table_of_penn_file['Ref']
tovcf['alt']=table_of_penn_file['Alt']
nameuse=re.sub('xlsx$','vcf',file_to_lookat[j].name)
tovcf.to_csv(nameuse,sep='\t',header=False, index=False)
st.write('file after liftover:')
st.write(tovcf)
#st.write(nameuse)
with open(nameuse,"rb") as txt_file:
bytes_data=txt_file.read()
txt_file.close()
with open(os.path.join("input",nameuse),"wb") as f:
f.write(bytes_data)
f.close()
seev=glob.glob('input/*')
#st.write(pd.read_csv(os.path.join("input",nameuse) ))
#vcfuse=glob.glob('file_to_lookat[0].name')[0]
#shutil.copy2(vcfuse,'input/'+vcfuse)
#pdb.set_trace()
if no_profiles_only_counts == True:
refgen="GRCh37"
project = "input"
project_name = project.split("/")[-1]
with st.spinner('computing counts only'):
data = datadump.SigProfilerMatrixGeneratorFunc(project_name, refgen, project, exome=False, bed_file=None, chrom_based=False, plot=False, gs=False)
data['96'].to_csv('sbs96.txt',sep='\t',header=False,index=True)
data['1536'].to_csv('sbs1536.txt',sep='\t',header=False,index=True)
sbs96_result,sbs1536_result=dl_counts(j)
#st.write(data['96'])
#st.write(data['1536'])
to_dl_sbs96.append(sbs96_result)
to_dl_sbs1536.append(sbs1536_result)
remove_old_vcf()
else:
with st.spinner('computing signatures'):
sig.sigProfilerExtractor("vcf", "output", "input", minimum_signatures=1, maximum_signatures=3,nmf_test_conv= 1000,nmf_tolerance= 1e-10,max_nmf_iterations=100000,min_nmf_iterations= 1000)
if file_to_lookat !=[] and glob.glob('output/SBS96/Suggested_Solution/COSMIC_SBS96_Decomposed_Solution/*pdf'):
sbs_result,indel_result,dbs_result,sbs_text,indel_text,dbs_text,summary_sbs,summary_id,summary_dbs=dl(j)
to_dl_sbs.append(sbs_result)
to_dl_sbs_text.append(sbs_text)
to_dl_indel.append(indel_result)
to_dl_indel_text.append(indel_text)
to_dl_dbs.append(dbs_result)
to_dl_dbs_text.append(dbs_text)
to_dl_sbs_summary_text.append(summary_sbs)
to_dl_id_summary_text.append(summary_id)
to_dl_dbs_summary_text.append(summary_dbs)
#show_pdf('output/SBS96/Suggested_Solution/COSMIC_SBS96_Decomposed_Solution/SBS96_Decomposition_Plots.pdf')
remove_old_vcf()
if no_profiles_only_counts == True:
showdl_counts(file_to_lookat,to_dl_sbs96,to_dl_sbs1536)
else:
showdl(file_to_lookat,to_dl_sbs,to_dl_indel,to_dl_dbs,to_dl_sbs_text,to_dl_indel_text,to_dl_dbs_text,to_dl_sbs_summary_text,to_dl_id_summary_text,to_dl_dbs_summary_text)
components.iframe("https://cancer.sanger.ac.uk/signatures/sbs/", height=3000,width=800)
#show_pdf('output/ID83/Suggested_Solution/COSMIC_ID83_Decomposed_Solution/ID83_Decomposition_Plots.pdf')
#components.iframe("https://cancer.sanger.ac.uk/signatures/id/",height=1000,width=800)