File size: 2,293 Bytes
9d6a2a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import argparse
import os

import numpy as np
import pandas as pd
from scipy.stats import pearsonr
from sklearn import linear_model
from sklearn.metrics import mean_squared_error

from _common import add_model_args, formatter, score_preprocessed


def parse_args():
    parser = argparse.ArgumentParser(
        description="Run GenScore CASF-2016 scoring/ranking benchmark.",
        formatter_class=formatter(),
    )
    add_model_args(parser)
    parser.add_argument("--data-dir", required=True, help="Directory containing preprocessed CASF tensors.")
    parser.add_argument("--test-prefix", default="v2020_casf")
    parser.add_argument("--coreset-file", required=True, help="Path to CASF-2016 CoreSet.dat.")
    parser.add_argument("--outdir", required=True, help="Output directory for CASF ranking .dat file.")
    return parser.parse_args()


def obtain_metrics(df):
    regr = linear_model.LinearRegression()
    regr.fit(df.score.values.reshape(-1, 1), df.logKa.values.reshape(-1, 1))
    preds = regr.predict(df.score.values.reshape(-1, 1))
    rp = pearsonr(df.logKa, df.score)[0]
    mse = mean_squared_error(df.logKa, preds)
    num = df.shape[0]
    sd = np.sqrt((mse * num) / (num - 1))
    print("The regression equation: logKa = %.2f + %.2f * Score" % (float(regr.coef_), float(regr.intercept_)))
    print("Number of favorable sample (N): %d" % num)
    print("Pearson correlation coefficient (R): %.3f" % rp)
    print("Standard deviation in fitting (SD): %.2f" % sd)


def main():
    args = parse_args()
    prots = os.path.join(args.data_dir, f"{args.test_prefix}_prot.pt")
    ligs = os.path.join(args.data_dir, f"{args.test_prefix}_lig.pt")
    ids = os.path.join(args.data_dir, f"{args.test_prefix}_ids.npy")

    _, preds = score_preprocessed(ids, prots, ligs, args)

    core = pd.read_csv(args.coreset_file, sep=r"[,,\t, ]+", header=0, engine="python")
    df_score = pd.DataFrame(zip(np.load(ids, allow_pickle=True)[0], preds), columns=["#code", "score"])
    testdf = pd.merge(core, df_score, on="#code")

    os.makedirs(args.outdir, exist_ok=True)
    testdf[["#code", "score"]].to_csv(
        os.path.join(args.outdir, f"{args.outprefix}.dat"),
        index=False,
        sep="\t",
    )
    obtain_metrics(testdf)


if __name__ == "__main__":
    main()