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