Download scripts/process_feature/get_dssp.py from OneScience-Group/MVGNN-PPIS: direct link, hf CLI and curl.
- Browser
- Download file 2.54 kB
-
https://huggingface.co/OneScience-Group/MVGNN-PPIS/resolve/main/scripts/process_feature/get_dssp.py
- Command line
-
hf download hf://OneScience-Group/MVGNN-PPIS/scripts/process_feature/get_dssp.py
-
curl -L -o get_dssp.py https://huggingface.co/OneScience-Group/MVGNN-PPIS/resolve/main/scripts/process_feature/get_dssp.py
2.54 kB
| import os, pickle | |
| import numpy as np | |
| from Bio import pairwise2 | |
| from pad_feature import parse_fasta_file | |
| software_path = "./Software/" | |
| def process_dssp(dssp_file): | |
| aa_type = "ACDEFGHIKLMNPQRSTVWY" | |
| SS_type = "HBEGITSC" | |
| rASA_std = [115, 135, 150, 190, 210, 75, 195, 175, 200, 170, | |
| 185, 160, 145, 180, 225, 115, 140, 155, 255, 230] | |
| with open(dssp_file, "r") as f: | |
| lines = f.readlines() | |
| seq = "" | |
| dssp_feature = [] | |
| p = 0 | |
| while lines[p].strip()[0] != "#": | |
| p += 1 | |
| for i in range(p + 1, len(lines)): | |
| aa = lines[i][13] | |
| if aa == "!" or aa == "*": | |
| continue | |
| seq += aa | |
| SS = lines[i][16] | |
| if SS == " ": | |
| SS = "C" | |
| SS_vec = np.zeros(9) # The last dim represents "Unknown" for missing residues | |
| SS_vec[SS_type.find(SS)] = 1 | |
| PHI = float(lines[i][103:109].strip()) | |
| PSI = float(lines[i][109:115].strip()) | |
| ACC = float(lines[i][34:38].strip()) | |
| ASA = min(100, round(ACC / rASA_std[aa_type.find(aa)] * 100)) / 100 | |
| dssp_feature.append(np.concatenate((np.array([PHI, PSI, ASA]), SS_vec))) | |
| return seq, dssp_feature | |
| def match_dssp(seq, dssp, ref_seq): | |
| alignments = pairwise2.align.globalxx(ref_seq, seq) | |
| ref_seq = alignments[0].seqA | |
| seq = alignments[0].seqB | |
| SS_vec = np.zeros(9) # The last dim represent "Unknown" for missing residues | |
| SS_vec[-1] = 1 | |
| padded_item = np.concatenate((np.array([360, 360, 0]), SS_vec)) | |
| new_dssp = [] | |
| for aa in seq: | |
| if aa == "-": | |
| new_dssp.append(padded_item) | |
| else: | |
| new_dssp.append(dssp.pop(0)) | |
| matched_dssp = [] | |
| for i in range(len(ref_seq)): | |
| if ref_seq[i] == "-": | |
| continue | |
| matched_dssp.append(new_dssp[i]) | |
| return matched_dssp | |
| def transform_dssp(dssp_feature): | |
| dssp_feature = np.array(dssp_feature) | |
| angle = dssp_feature[:,0:2] | |
| ASA_SS = dssp_feature[:,2:] | |
| radian = angle * (np.pi / 180) | |
| dssp_feature = np.concatenate([np.sin(radian), np.cos(radian), ASA_SS], axis = 1) | |
| return dssp_feature | |
| def get_dssp(ID, ref_seq): | |
| os.system("{}dssp-2.0.4/mkdssp -i ../datasets/alphafold3pdb/{}.pdb -o ./dssp/{}.dssp".format(software_path, ID, ID)) | |
| dssp_seq, dssp_matrix = process_dssp("./dssp/" + ID + ".dssp") | |
| if dssp_seq != ref_seq: | |
| dssp_matrix = match_dssp(dssp_seq, dssp_matrix, ref_seq) | |
| np.save("./dssp/" + ID, transform_dssp(dssp_matrix)) | |
| os.system("rm ./dssp/" + ID + ".dssp") | |