|
|
import MDAnalysis as mda |
|
|
import numpy as np |
|
|
from MDAnalysis.analysis.dihedrals import Ramachandran |
|
|
import os |
|
|
import re |
|
|
import pandas as pd |
|
|
import matplotlib.pyplot as plt |
|
|
|
|
|
|
|
|
def ramachandran_eval(all_paths, pdb_file, output_dir): |
|
|
angle_results_all = [] |
|
|
|
|
|
for dirpath in all_paths: |
|
|
pdb_path = os.path.join(dirpath,pdb_file) |
|
|
|
|
|
u = mda.Universe(pdb_path) |
|
|
protein = u.select_atoms('protein') |
|
|
|
|
|
|
|
|
ramachandran = Ramachandran(protein) |
|
|
ramachandran.run() |
|
|
angle_results = ramachandran.results.angles |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
angle_results_all.append(angle_results.reshape([-1,2])) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
points1 = angle_results_all[0] |
|
|
grid_size = 360 |
|
|
x_bins = np.linspace(-180, 180, grid_size) |
|
|
y_bins = np.linspace(-180, 180, grid_size) |
|
|
result_tmp={} |
|
|
for idx in range(len(angle_results_all[1:])): |
|
|
idx = idx + 1 |
|
|
points2 = angle_results_all[idx] |
|
|
|
|
|
|
|
|
hist1, _, _ = np.histogram2d(points1[:, 0], points1[:, 1], bins=[x_bins, y_bins]) |
|
|
hist2, _, _ = np.histogram2d(points2[:, 0], points2[:, 1], bins=[x_bins, y_bins]) |
|
|
|
|
|
|
|
|
mask1 = hist1 > 0 |
|
|
mask2 = hist2 > 0 |
|
|
|
|
|
intersection = np.logical_and(mask1, mask2).sum() |
|
|
all_mask2 = mask2.sum() |
|
|
val_ratio = intersection / all_mask2 |
|
|
print(os.path.basename(all_paths[idx]), "val_ratio:", val_ratio) |
|
|
|
|
|
|
|
|
result_tmp[os.path.basename(all_paths[idx])] = val_ratio |
|
|
result_tmp['file'] = pdb_file |
|
|
|
|
|
return result_tmp |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
key1 = 'P2DFlow_epoch19' |
|
|
all_paths = [ |
|
|
"/cluster/home/shiqian/frame-flow-test1/valid/evaluate/ATLAS_valid", |
|
|
|
|
|
"/cluster/home/shiqian/frame-flow-test1/valid/evaluate/alphaflow_pred", |
|
|
"/cluster/home/shiqian/frame-flow-test1/valid/evaluate/Str2Str_pred", |
|
|
|
|
|
f'/cluster/home/shiqian/frame-flow-test1/valid/evaluate/{key1}', |
|
|
|
|
|
] |
|
|
output_dir = '/cluster/home/shiqian/frame-flow-test1/valid/evaluate/Ramachandran' |
|
|
os.makedirs(output_dir, exist_ok=True) |
|
|
results={ |
|
|
'file':[], |
|
|
|
|
|
'alphaflow_pred':[], |
|
|
'Str2Str_pred':[], |
|
|
|
|
|
key1:[], |
|
|
} |
|
|
for file in os.listdir(all_paths[0]): |
|
|
if re.search('\.pdb',file): |
|
|
|
|
|
pdb_file = file |
|
|
print(file) |
|
|
result_tmp = ramachandran_eval( |
|
|
all_paths=all_paths, |
|
|
pdb_file=pdb_file, |
|
|
output_dir=output_dir |
|
|
) |
|
|
for key in results.keys(): |
|
|
results[key].append(result_tmp[key]) |
|
|
|
|
|
out_total_df = pd.DataFrame(results) |
|
|
out_total_df.to_csv(os.path.join(output_dir,f'Ramachandran_plot_validity_{key1}.csv'),index=False) |
|
|
|