| 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) |
|
|