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