File size: 3,321 Bytes
389f6b4
 
1046ab8
eba69c3
1feb7d2
1046ab8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a6883fb
1046ab8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e4602d1
 
f03a5f1
1046ab8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9095451
1046ab8
 
 
8555823
1046ab8
 
 
8555823
b451ff6
 
 
9f596fc
a432522
8555823
e7f5e2d
d0a4145
1046ab8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
af7c643
 
bb695ec
c62cad3
1046ab8
98aa3c9
d9f3a91
1046ab8
 
 
af7c643
 
1046ab8
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from pyuul_kmeans import VolumeMaker 
from pyuul_kmeans import utils 
import os
import zipfile
import pathlib
from sklearn.cluster import KMeans
from collections import OrderedDict
import numpy as np
import pandas as pd
import random
import torch
import os
import shutil
import gradio as gr

# 设置随机数种子
def setup_seed(seed):
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
    np.random.seed(seed)
    random.seed(seed)
    torch.backends.cudnn.deterministic = True
setup_seed(100)
device = "cpu"

def add_file_to_folder(new_file_path, folder):
    ls = os.listdir(new_file_path)
    for line in ls:
        filePath = os.path.join(new_file_path, line)
        if os.path.isfile(filePath):
            shutil.copy(filePath, folder)

def copy(files,folder):
    file = os.listdir(folder)
    for i in file:
        if i not in files:
            file_path = os.path.join(folder, i)
            os.remove(file_path)

def pyuul(folder,n_clusters):
    PDBFile = str(folder)  
    coords, atname, pdbname, pdb_num = utils.parsePDB(PDBFile) 
    print(pdb_num)
    atoms_channel = utils.atomlistToChannels(atname) 
    radius = utils.atomlistToRadius(atname) 

    PointCloudSurfaceObject = VolumeMaker.PointCloudVolume(device=device)

    coords = coords.to(device)
    radius = radius.to(device) 
    atoms_channel = atoms_channel.to(device) 

    SurfacePoitCloud = PointCloudSurfaceObject(coords, radius) 
    feature = SurfacePoitCloud.view(pdb_num,-1).cpu()
    
    kmean = KMeans(n_clusters=n_clusters,n_init=10,init="k-means++",random_state=100)
    y = kmean.fit_predict(feature)

    pairs = zip(pdbname, y)
    result_dict = {key: value for key, value in pairs}
    ligand_class = result_dict['ligands.pdb']

    sheet = []
    for key, value in result_dict.items():
        if value == ligand_class:
            sheet.append(key)
    return sheet

def kmeans(ligand,n_clusters,n_num):
    azip = zipfile.ZipFile("peptides.zip") 
    azip.extractall()
    peptide_folder_path = pathlib.Path(__file__).parent.joinpath("peptides" )
    pdb_folder = pathlib.Path(__file__).parent.joinpath("temp")
    ligand_path = ligand.name
    shutil.copy(ligand_path,pdb_folder)
    n_num = int(n_num)
    n_clusters = int(n_clusters)
    for i in range(1,n_num+1):
        if i == 1:
            add_file_to_folder(peptide_folder_path,pdb_folder)
            output = pyuul(pdb_folder, n_clusters)
            copy(output,pdb_folder)
        else:      
            if pdb_folder != None:
                output = pyuul(pdb_folder, n_clusters)
                copy(output,pdb_folder)

    data = OrderedDict()
    data['Name'] = output
    data = pd.DataFrame(data)
    data.to_csv('outputs.csv', index=False)
    shutil.rmtree(pdb_folder)
    os.mkdir(pdb_folder) 
    return 'outputs.csv'


with open("pyuul_kmeans.md", "r") as f:
    description = f.read()
iface = gr.Interface(fn=kmeans,
                     title="Pyuul_Kmeans",
                     inputs=["file",
                             gr.Textbox(label="n_clusters", placeholder="2", lines=1),
                             gr.Textbox(label="Times", placeholder="2", lines=1)
                             ],
                     outputs= "file",
                     description=description
                     )
iface.launch()