Spaces:
Sleeping
Sleeping
import glob | |
import ssbio.utils | |
import subprocess | |
import ssbio | |
import os.path as op | |
from add_3Dalignment import * | |
import os | |
from pathlib import Path | |
import gzip | |
import shutil | |
import streamlit as st | |
def run_freesasa(infile, outfile, include_hetatms=True, outdir=None, force_rerun=False, file_type = 'gzip'): | |
if not outdir: | |
outdir = '' | |
outfile = op.join(outdir, outfile) | |
if file_type == 'pdb': | |
if ssbio.utils.force_rerun(flag=force_rerun, outfile=outfile): | |
if include_hetatms: | |
shell_command = 'freesasa --format=rsa --hetatm {} -o {}'.format(infile, outfile) | |
else: | |
shell_command = 'freesasa --format=rsa {} -o {}'.format(infile, outfile) | |
command = subprocess.Popen(shell_command, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE, | |
shell=True) | |
out, err = command.communicate() | |
elif file_type == 'gzip': | |
with gzip.open(infile, 'rb') as f_in: | |
with open('file_temp.pdb', 'wb') as f_out: | |
shutil.copyfileobj(f_in, f_out) | |
infile = 'file_temp.pdb' | |
if ssbio.utils.force_rerun(flag=force_rerun, outfile=outfile): | |
if include_hetatms: | |
shell_command = 'freesasa --format=rsa --hetatm {} -o {}'.format(infile, outfile) | |
else: | |
shell_command = 'freesasa --format=rsa {} -o {}'.format(infile, outfile) | |
command = subprocess.Popen(shell_command, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.PIPE, | |
shell=True) | |
out, err = command.communicate() | |
return outfile | |
def calculate_freesasa(ID, model_num, existing_free_sasa, path_to_input,path_to_output_files, file_type = 'gzip'): | |
print('Calculating surface area...\n') | |
file_base = str(Path(path_to_input / '*')) | |
file_str = glob.glob(file_base)[0].split('-')[-1].split('.')[0] | |
if file_type == 'gzip': | |
if ID not in existing_free_sasa: | |
fullID = f'AF-{ID}-F{model_num}-{file_str }.pdb.gz' | |
run_freesasa(Path(path_to_input / fullID), | |
Path(path_to_output_files / f'freesasa_files/{fullID}.txt'), include_hetatms=True, | |
outdir=None, force_rerun=False) | |
elif file_type == 'pdb': | |
if ID not in existing_free_sasa: | |
fullID = f'AF-{ID}-F{model_num}-model_v1.pdb' | |
run_freesasa(Path(path_to_input / fullID), | |
Path(path_to_output_files / f'freesasa_files/{fullID}.txt'), include_hetatms=True, | |
outdir=None, force_rerun=False) | |
def sasa(source, pdbID, uniprotID, sasa_pos, wt, mode, path_to_output_files,file_type = 'gzip'): | |
if mode == 1: | |
sasa = 'nan' | |
for filename in list(Path(path_to_output_files / 'freesasa_files').glob("*")): | |
if source == 'PDB': | |
fname = str(filename).split('.')[0].split('/')[-1].upper() | |
elif source == 'MODBASE': | |
fname = str(filename).split('.')[0].split('/')[-1] | |
elif source == 'SWISSSMODEL': | |
fname = str(filename).split('_')[2] | |
if pdbID == fname: | |
files = open(filename, 'r') | |
file = files.readlines() | |
for k in file: | |
if k.strip()[10:13] == sasa_pos: | |
residue = str(k[4:7].strip()) | |
if wt == threeToOne(residue): | |
sasa = str(k[22:28]).strip('\n') | |
return (sasa) | |
elif wt != threeToOne(residue): | |
sasa = str(k[22:28]).strip('\n') + '*' | |
return (sasa) | |
else: | |
return 'nan' ####### | |
if mode == 2: | |
if sasa_pos != np.NaN: | |
sasa = 'nan' | |
if file_type == 'pdb': | |
for filename in list(Path(path_to_output_files / 'freesasa_files').glob("*")): | |
fname = list(filter(None, filename.split('.'))).split('/')[-1].upper() | |
if uniprotID == fname: | |
files = open(filename, 'r') | |
file = files.readlines() | |
for k in file: | |
if k.strip()[10:13] == sasa_pos: | |
residue = str(k[4:7].strip()) | |
if wt == threeToOne(residue): | |
sasa = str(k[22:28]).strip('\n') | |
elif wt != threeToOne(residue): | |
sasa = str(k[22:28]).strip('\n') + '*' | |
return sasa | |
elif file_type == 'gzip': | |
for filename in list(Path(path_to_output_files / 'freesasa_files').glob("*")): | |
fname = list(filter(None, str(filename).split('.')))[0].split('/')[-1].split('-')[1].upper() | |
if uniprotID == fname: | |
files = open(filename, 'r') | |
file = files.readlines() | |
for k in file: | |
if str(k.strip()[10:13]) == str(sasa_pos): | |
residue = str(k[4:7].strip()) | |
if wt == threeToOne(residue): | |
sasa = str(k[22:28]).strip('\n') | |
elif wt != threeToOne(residue): | |
sasa = str(k[22:28]).strip('\n') + '*' | |
else: | |
sasa = 'nan' | |
return sasa | |
else: | |
sasa = 'nan' | |
return sasa |