SeaWolf-AI commited on
Commit
8e3e99d
ยท
verified ยท
1 Parent(s): 3166640

Leader table per board; drug-withdrawal board with year-matched controls

Browse files

Front page now lists the current leader on every board, left blank where no entrant has submitted. Adds a post-marketing withdrawal board: withdrawal rate tracks approval decade, so controls are matched on approval year and a year-only predictor is required to score at chance before the board opens. Fixes two places that treated an unmeasured axis as zero.

Files changed (6) hide show
  1. app.py +52 -3
  2. categories.json +3 -1
  3. data/withdrawal_card.json +44 -0
  4. data/withdrawal_test.json +1 -0
  5. i18n.js +12 -0
  6. index.html +53 -6
app.py CHANGED
@@ -95,14 +95,27 @@ def _load_boards():
95
  continue
96
  nf = d.get("noise_floor") or {}
97
  base = d.get("baselines") or {}
98
- best = min(base, key=lambda k: base[k]["mae"]) if base else None
 
 
 
 
 
 
 
 
 
 
 
99
  d["dataset_sha"] = _sha(p)
100
  d["spec"] = SPEC
101
  d["best_baseline"] = best
102
  # ๋ชจ๋ธ ์˜ค์ฐจ๊ฐ€ ์‹คํ—˜ ์˜ค์ฐจ์˜ ๋ช‡ ๋ฐฐ์ธ๊ฐ€. 1 ์— ๋ถ™์„์ˆ˜๋ก ์ธก์ • ํ•œ๊ณ„๋‹ค.
103
- if best and nf.get("sd_single"):
104
  d["error_over_noise"] = round(base[best]["mae"] / nf["sd_single"], 2)
105
- if "์ƒ์ˆ˜ ์˜ˆ์ธก" in base and "Morgan+LightGBM" in base:
 
 
106
  d["beats_constant"] = base["Morgan+LightGBM"]["mae"] < base["์ƒ์ˆ˜ ์˜ˆ์ธก"]["mae"]
107
  if d.get("n_test"):
108
  d["near_pct"] = round(100.0 * d.get("near_threshold", 0) / d["n_test"], 1)
@@ -199,6 +212,42 @@ def api_categories():
199
  "open": len(bd), "ledger": bool(HF_TOKEN)}}
200
 
201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
  @app.get("/api/board/{name}")
203
  def api_board(name: str):
204
  b = boards().get(name)
 
95
  continue
96
  nf = d.get("noise_floor") or {}
97
  base = d.get("baselines") or {}
98
+ # ๋ถ„๋ฅ˜ ์ „์šฉ ๋ถ€๋ฌธ์—๋Š” MAE ๊ธฐ์ค€์„ ์ด ์—†๋‹ค. ๊ทธ๋Ÿด ๋•Œ๋Š” AUROC ๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒƒ์„ ์ตœ์„ ์œผ๋กœ ๋ณธ๋‹ค.
99
+ # ์—†๋Š” ๊ฐ’์„ 0 ์œผ๋กœ ์น˜๋ฉด ๊ทธ ๋ถ€๋ฌธ์ด "๊ฐ€์žฅ ์ •ํ™•ํ•œ ๊ณณ"์œผ๋กœ ํ‘œ์— ์˜ค๋ฅธ๋‹ค.
100
+ with_mae = {k: v for k, v in base.items() if v.get("mae") is not None}
101
+ if with_mae:
102
+ best = min(with_mae, key=lambda k: with_mae[k]["mae"])
103
+ d["metric"] = "mae"
104
+ elif base:
105
+ best = max(base, key=lambda k: base[k].get("auroc") or 0)
106
+ d["metric"] = "auroc"
107
+ else:
108
+ best = None
109
+ d["metric"] = None
110
  d["dataset_sha"] = _sha(p)
111
  d["spec"] = SPEC
112
  d["best_baseline"] = best
113
  # ๋ชจ๋ธ ์˜ค์ฐจ๊ฐ€ ์‹คํ—˜ ์˜ค์ฐจ์˜ ๋ช‡ ๋ฐฐ์ธ๊ฐ€. 1 ์— ๋ถ™์„์ˆ˜๋ก ์ธก์ • ํ•œ๊ณ„๋‹ค.
114
+ if best and nf.get("sd_single") and d["metric"] == "mae":
115
  d["error_over_noise"] = round(base[best]["mae"] / nf["sd_single"], 2)
116
+ if ("์ƒ์ˆ˜ ์˜ˆ์ธก" in base and "Morgan+LightGBM" in base
117
+ and base["Morgan+LightGBM"].get("mae") is not None
118
+ and base["์ƒ์ˆ˜ ์˜ˆ์ธก"].get("mae") is not None):
119
  d["beats_constant"] = base["Morgan+LightGBM"]["mae"] < base["์ƒ์ˆ˜ ์˜ˆ์ธก"]["mae"]
120
  if d.get("n_test"):
121
  d["near_pct"] = round(100.0 * d.get("near_threshold", 0) / d["n_test"], 1)
 
212
  "open": len(bd), "ledger": bool(HF_TOKEN)}}
213
 
214
 
215
+ @app.get("/api/leaders")
216
+ def api_leaders():
217
+ """๋ถ€๋ฌธ๋งˆ๋‹ค ํ˜„์žฌ 1์œ„ ํ•œ ์ค„. ์ฒซ ํ™”๋ฉด์—์„œ ์ „์ฒด๋ฅผ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.
218
+
219
+ ๋ถ€๋ฌธ๋ณ„๋กœ ์ˆœ์œ„ํ‘œ๋ฅผ ๋”ฐ๋กœ ๋ถ€๋ฅด๋ฉด ์™•๋ณต์ด ๋ถ€๋ฌธ ์ˆ˜๋งŒํผ ๋Š˜์–ด๋‚œ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•œ ๋ฒˆ์— ๋ชจ์€๋‹ค.
220
+ **์ฐธ๊ฐ€ ์ œ์ถœ์ด ์—†์œผ๋ฉด ๋น„์›Œ์„œ ๋ณด๋‚ธ๋‹ค** - ๊ธฐ์ค€์„ ์„ 1์œ„ ์ž๋ฆฌ์— ์•‰ํžˆ์ง€ ์•Š๋Š”๋‹ค.
221
+ ๊ธฐ์ค€์„ ์€ ๋„˜์–ด์•ผ ํ•  ์„ ์ด์ง€ ์šฐ์Šน์ž๊ฐ€ ์•„๋‹ˆ๋‹ค.
222
+ """
223
+ def build():
224
+ out = []
225
+ for name, b in boards().items():
226
+ rolled = ledger_read("leaderboard/%s.json" % name.lower(), {}) or {}
227
+ ent = (rolled.get("entries") or [])
228
+ top = ent[0] if ent else None
229
+ nf = (b.get("noise_floor") or {}).get("sd_single")
230
+ base = b.get("baselines") or {}
231
+ row = {"board": name, "n_test": b.get("n_test"),
232
+ "split_grade": b.get("split_grade"), "answer_grade": b.get("answer_grade"),
233
+ "noise_floor": nf, "entries": len(ent),
234
+ "baseline_best": (min((v["mae"] for v in base.values() if v.get("mae") is not None),
235
+ default=None)),
236
+ "baseline_best_auroc": (max((v["auroc"] for v in base.values()
237
+ if v.get("auroc") is not None), default=None)),
238
+ "leader": None}
239
+ if top:
240
+ row["leader"] = {"method": top.get("method"), "user": top.get("user"),
241
+ "mae": top.get("mae"), "auroc": top.get("auroc"),
242
+ "verified": bool(top.get("verified")), "leak": top.get("leak")}
243
+ out.append(row)
244
+ out.sort(key=lambda r: (r["leader"] is None, -(r["n_test"] or 0)))
245
+ return out
246
+ rows = cached("leaders", 60, build)
247
+ return {"spec": SPEC, "n": len(rows), "rows": rows,
248
+ "held": sum(1 for r in rows if r["leader"])}
249
+
250
+
251
  @app.get("/api/board/{name}")
252
  def api_board(name: str):
253
  b = boards().get(name)
categories.json CHANGED
@@ -122,7 +122,9 @@
122
  "icon": "๐Ÿฅ",
123
  "desc": "์‚ฌ๋žŒ ๋ชธ์—์„œ์˜ ๋†๋„ ยท ์•ฝ๋ฌผ ์ถฉ๋Œ ยท ์šฉ๋Ÿ‰. ๊ฒจ๋ฃฐ ํ‘œ๊ฐ€ ์•„์ง ์—†๋Š” ์ž๋ฆฌ",
124
  "planned": 6,
125
- "boards": [],
 
 
126
  "desc_en": "Human exposure, drug-drug interaction and dose โ€” endpoints with no leaderboard yet"
127
  },
128
  {
 
122
  "icon": "๐Ÿฅ",
123
  "desc": "์‚ฌ๋žŒ ๋ชธ์—์„œ์˜ ๋†๋„ ยท ์•ฝ๋ฌผ ์ถฉ๋Œ ยท ์šฉ๋Ÿ‰. ๊ฒจ๋ฃฐ ํ‘œ๊ฐ€ ์•„์ง ์—†๋Š” ์ž๋ฆฌ",
124
  "planned": 6,
125
+ "boards": [
126
+ "Withdrawal"
127
+ ],
128
  "desc_en": "Human exposure, drug-drug interaction and dose โ€” endpoints with no leaderboard yet"
129
  },
130
  {
data/withdrawal_card.json ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "board": "Withdrawal",
3
+ "target": "โ€”",
4
+ "type": "์‹œํŒ ํ›„ ํ‡ด์ถœ ์—ฌ๋ถ€",
5
+ "cut": null,
6
+ "threshold": 0.5,
7
+ "n_train": 408,
8
+ "n_test": 184,
9
+ "positive_rate": 0.27717391304347827,
10
+ "noise_floor": {
11
+ "sd_single": 0.044457723625306804,
12
+ "pairs": 400,
13
+ "compounds": 184,
14
+ "median": 0.044457723625306804,
15
+ "mean": 0.044457723625306804,
16
+ "p90": 0.07291066674550316,
17
+ "kind": "metric_bootstrap"
18
+ },
19
+ "control_year_auroc": 0.5038425249573899,
20
+ "baselines": {
21
+ "์ƒ์ˆ˜ ์˜ˆ์ธก": {
22
+ "auroc": 0.5,
23
+ "prauc": 0.27717391304347827,
24
+ "mae": null
25
+ },
26
+ "์ตœ๊ทผ์ ‘ ์ด์›ƒ": {
27
+ "auroc": 0.5530738611233966,
28
+ "prauc": 0.3059462915601023,
29
+ "mae": null
30
+ },
31
+ "Morgan+LightGBM": {
32
+ "auroc": 0.5928055432699395,
33
+ "prauc": 0.36923077992989084,
34
+ "mae": null
35
+ }
36
+ },
37
+ "near_threshold": 0,
38
+ "split_grade": "S",
39
+ "split_grade_note": "๊ณจ๊ฒฉ ๋ถ„ํ•  ยท ์Šน์ธ ์—ฐ๋„ ์ง์ง“๊ธฐ",
40
+ "answer_grade": "P1",
41
+ "answer_grade_note": "ํ‡ด์ถœ ๊ธฐ๋ก์€ ๊ณต๊ฐœ ์ž๋ฃŒ๋‹ค. ์กฐํšŒ ๋ฐฉ์–ด๋Š” 8์กฐ๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค",
42
+ "source": "ChEMBL_37 ์Šน์ธยทํ‡ด์ถœ ๊ธฐ๋ก",
43
+ "built": "2026-08-22"
44
+ }
data/withdrawal_test.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"board": "Withdrawal", "n": 184, "source": "ChEMBL_37 (EMBL-EBI)", "source_url": "https://www.ebi.ac.uk/chembl/", "license": "CC BY-SA 3.0 Unported", "license_url": "https://creativecommons.org/licenses/by-sa/3.0/", "attribution": "Derived from ChEMBL (EMBL-EBI), licensed CC BY-SA 3.0.", "note": "๊ตฌ์กฐ์™€ ์Šน์ธ ์—ฐ๋„๋งŒ ํฌํ•จํ•œ๋‹ค. ํ‡ด์ถœ ์—ฌ๋ถ€๋Š” ๋ฐฐํฌํ•˜์ง€ ์•Š๋Š”๋‹ค.", "compounds": [{"compound_id": "LB-2D0DB1BD3BB2", "smiles": "CC(C)(C)c1nc(-c2cccc(NS(=O)(=O)c3c(F)cccc3F)c2F)c(-c2ccnc(N)n2)s1", "approval_year": 2013}, {"compound_id": "LB-D55611596516", "smiles": "CC(C)[C@H](N)C(=O)OCCOCn1cnc2c(=O)nc(N)[nH]c21.Cl", "approval_year": 1995}, {"compound_id": "LB-4D5B0A121C97", "smiles": "NC1=NC(=O)C(c2ccccc2)O1", "approval_year": 1975}, {"compound_id": "LB-B7773C13AC21", "smiles": "CN1CCN(CCCN2c3ccccc3Sc3ccc(C(F)(F)F)cc32)CC1.Cl.Cl", "approval_year": 1959}, {"compound_id": "LB-75B87500DB03", "smiles": "CC(=O)c1ccc2c(c1)N(CCCN1CCN(CCO)CC1)c1ccccc1S2.O=C(O)/C=C\\C(=O)O.O=C(O)/C=C\\C(=O)O", "approval_year": 1961}, {"compound_id": "LB-C1B1F3F49953", "smiles": "CCCCCCC(=O)OCCN1CCN(CCCN2c3ccccc3Sc3ccc(C(F)(F)F)cc32)CC1", "approval_year": 1967}, {"compound_id": "LB-6C203EC954E3", "smiles": "O=C(O)COc1ccc(C(=O)c2cccs2)c(Cl)c1Cl", "approval_year": 1979}, {"compound_id": "LB-29C4F7252DBC", "smiles": "CC(C(=O)O)c1ccc(C(=O)c2cccs2)cc1", "approval_year": 1985}, {"compound_id": "LB-B8CDC264D9A8", "smiles": "Nc1ccc(/N=N/c2ccccc2)c(N)n1", "approval_year": 1987}, {"compound_id": "LB-9B483E11B27D", "smiles": "CC(C)(O/N=C(\\C(=O)N[C@@H]1C(=O)N2C(C(=O)[O-])=C(C[n+]3ccccc3)CS[C@H]12)c1csc(N)n1)C(=O)[O-].[Na+]", "approval_year": 1989}, {"compound_id": "LB-32993042D2E8", "smiles": "N#Cc1cccc([C@@H](NCC2CC2)c2ccc(F)c(NC(=O)c3cc(C(F)(F)F)nn3-c3cccc(CN)c3)c2)c1", "approval_year": 2020}, {"compound_id": "LB-A727206109F5", "smiles": "O=C1NCCN1CCN1CCC(c2cn(-c3ccc(F)cc3)c3ccc(Cl)cc23)CC1", "approval_year": 1996}, {"compound_id": "LB-EBFFF30B78DC", "smiles": "Cl.O=C1CC[C@@]2(O)[C@H]3Cc4ccc(O)c5c4[C@@]2(CCN3CC2CC2)[C@H]1O5", "approval_year": 1984}, {"compound_id": "LB-57F338637FEA", "smiles": "COc1ccc(CCN2CCC(Nc3nc4ccccc4n3Cc3ccc(F)cc3)CC2)cc1", "approval_year": 1988}, {"compound_id": "LB-FB0A96B47472", "smiles": "O=C1O[C@H]([C@@H](O)CO)C(O)=C1O", "approval_year": 1985}, {"compound_id": "LB-5DA2740C7C19", "smiles": "CCN[C@@H]1C[C@H](N)[C@@H](O[C@H]2OC(CN)=CC[C@H]2N)[C@H](O)[C@H]1O[C@H]1OC[C@](C)(O)[C@H](NC)[C@H]1O", "approval_year": 1983}, {"compound_id": "LB-C52555B25E23", "smiles": "O=c1[nH]c(=O)n([C@H]2C[C@H](O)[C@@H](CO)O2)cc1F", "approval_year": 1970}, {"compound_id": "LB-75BBADA0C099", "smiles": "CO/N=C(\\C(=O)N[C@@H]1C(=O)N2C(C(=O)OC(C)OC(C)=O)=C(COC(N)=O)CS[C@H]12)c1ccco1", "approval_year": 1987}, {"compound_id": "LB-09548458B21C", "smiles": "C=CC(=O)N1CCC([C@@H]2CCNc3c(C(N)=O)c(-c4ccc(Oc5ccccc5)cc4)nn32)CC1", "approval_year": 2019}, {"compound_id": "LB-A041C8F7DA86", "smiles": "CNC(=O)c1c(I)c(C(=O)NCC(=O)Nc2c(I)c(C(=O)[O-])c(I)c(C(=O)NCCO)c2I)c(I)c(N(C)C(C)=O)c1I.[Na+]", "approval_year": 1985}, {"compound_id": "LB-F4EBF5EB4DBB", "smiles": "CN(C)CCC=C1c2ccccc2CCc2ccccc21", "approval_year": 1961}, {"compound_id": "LB-DFAE1B675DC7", "smiles": "CNCCC=C1c2ccccc2CCc2ccccc21", "approval_year": 1964}, {"compound_id": "LB-BBCAA75E1A5C", "smiles": "O=C(NCC1CCCCN1)c1cc(OCC(F)(F)F)ccc1OCC(F)(F)F", "approval_year": 1985}, {"compound_id": "LB-3367D3EF3B0F", "smiles": "Cc1cccc(C)c1NC(=O)C1CCCCN1C", "approval_year": 1960}, {"compound_id": "LB-35BD9836E948", "smiles": "COc1ccc2c(c1)c(CC(=O)O)c(C)n2C(=O)c1ccc(Cl)cc1", "approval_year": 1965}, {"compound_id": "LB-B13BF1A2674A", "smiles": "CC(C)n1nccc1-c1ncccc1COc1cccc(O)c1C=O", "approval_year": 2019}, {"compound_id": "LB-FB8CCF9EDFE8", "smiles": "CNCCCN1c2ccccc2CCc2ccccc21.Cl", "approval_year": 1964}, {"compound_id": "LB-D06B630E822A", "smiles": "COc1cc(C(=O)NS(=O)(=O)c2ccccc2C)ccc1Cc1cn(C)c2ccc(NC(=O)OC3CCCC3)cc12", "approval_year": 1996}, {"compound_id": "LB-8B19F412232A", "smiles": "CCCS(=O)(=O)N[C@H]1C[C@@H](N(C)c2ncnc3[nH]ccc23)C1", "approval_year": 2021}, {"compound_id": "LB-A840DD1B169A", "smiles": "CC[N+](C)(CC)CCOC(=O)C1c2ccccc2Oc2ccccc21", "approval_year": 1951}, {"compound_id": "LB-74C66313102D", "smiles": "COc1cc(N)c(Cl)cc1C(=O)NC1CCN(CCCOc2ccc(F)cc2)CC1OC", "approval_year": 1993}, {"compound_id": "LB-F5705D78392C", "smiles": "COc1cc(N)c(Cl)cc1C(=O)NC1CCN(CCCOc2ccc(F)cc2)CC1OC.O", "approval_year": 1993}, {"compound_id": "LB-94E066FF6439", "smiles": "OCCOCCN1CCN(C(c2ccccc2)c2ccc(Cl)cc2)CC1", "approval_year": 1956}, {"compound_id": "LB-BB8564F0F37D", "smiles": "Cl.Cl.O=C(O)COCCN1CCN(C(c2ccccc2)c2ccc(Cl)cc2)CC1", "approval_year": 1995}, {"compound_id": "LB-3E77D0C64408", "smiles": "Cl.OC(CCN1CCCCC1)(c1ccccc1)C1CC2C=CC1C2", "approval_year": 1959}, {"compound_id": "LB-A03FBC571415", "smiles": "CC(O)C(=O)O.OC(CCN1CCCCC1)(c1ccccc1)C1CC2C=CC1C2", "approval_year": 1961}, {"compound_id": "LB-C49109F11770", "smiles": "CCOC(=O)c1ccc(C#Cc2ccc3c(c2)C(C)(C)CCS3)nc1", "approval_year": 1997}, {"compound_id": "LB-FFBC0D98BCF7", "smiles": "Cc1cnc(C(=O)NCCc2ccc(S(=O)(=O)NC(=O)NC3CCCCC3)cc2)cn1", "approval_year": 1984}, {"compound_id": "LB-07B624AF8A5A", "smiles": "CC[C@@H](CO)NC(=O)[C@@H]1C=C2c3cccc4c3c(cn4C)C[C@H]2N(C)C1", "approval_year": 1962}, {"compound_id": "LB-81267B14DD17", "smiles": "C[C@H]1O[C@@H](O[C@H]2CC[C@@]3(C)[C@H](CC[C@@H]4[C@@H]3C[C@@H](O)[C@]3(C)[C@@H](C5=CC(=O)OC5)CC[C@]43O)C2)C[C@H](O)[C@@H]1O[C@H]1C[C@H](O)[C@H](O[C@H]2C[C@H](O)[C@H](O[C@@H]3O[C@H](CO)[C@@H](O)[C@H](O)[C@H]3O)[C@@H](C)O2)[C@@H](C)O1", "approval_year": 1982}, {"compound_id": "LB-7D3CCBA9DA94", "smiles": "CCCc1cc(=O)[nH]c(=S)[nH]1", "approval_year": 1947}, {"compound_id": "LB-D71259C5BD67", "smiles": "CC(Cc1cccc(C(F)(F)F)c1)NCCOC(=O)c1ccccc1", "approval_year": 1974}, {"compound_id": "LB-582B0B9A109C", "smiles": "COC(=O)C1=C(C)NC(C)=C(C(=O)OCCN(C)Cc2ccccc2)C1c1cccc([N+](=O)[O-])c1", "approval_year": 1988}, {"compound_id": "LB-4B61F62E685B", "smiles": "c1ccc(CC2=NCCN2)cc1", "approval_year": 1985}, {"compound_id": "LB-17F76D36DF64", "smiles": "Cc1cc(C(C)(C)C)c(O)c(C)c1CC1=NCCN1.Cl", "approval_year": 1986}, {"compound_id": "LB-8C3A4C712E71", "smiles": "CCN[C@H]1C[C@H](C)S(=O)(=O)c2sc(S(N)(=O)=O)cc21", "approval_year": 1994}, {"compound_id": "LB-F94346F87A5E", "smiles": "CC1(C)S[C@@H]2[C@H](NC(=O)C(C(=O)Oc3ccc4c(c3)CCC4)c3ccccc3)C(=O)N2[C@H]1C(=O)[O-].[Na+]", "approval_year": 1972}, {"compound_id": "LB-04E7B04E595C", "smiles": "C#C[C@]1(O)CC[C@H]2[C@@H]3CCC4=C(CCC(=O)C4)[C@H]3CC[C@@]21C", "approval_year": 1961}, {"compound_id": "LB-1D9407CA58B6", "smiles": "CN(C)[C@@H]1C([O-])=C(C(N)=O)C(=O)[C@@]2(O)C(O)=C3C(=O)c4c(O)cccc4[C@@](C)(O)[C@H]3[C@H](O)[C@@H]12.CN(C)[C@@H]1C([O-])=C(C(N)=O)C(=O)[C@@]2(O)C(O)=C3C(=O)c4c(O)cccc4[C@@](C)(O)[C@H]3[C@H](O)[C@@H]12.[Ca+2]", "approval_year": 1982}, {"compound_id": "LB-A7FBA97A04EC", "smiles": "CC(CN1c2ccccc2Sc2ccccc21)N(C)C", "approval_year": 1951}, {"compound_id": "LB-1BFCE96D6283", "smiles": "CN(C)CCCN1c2ccccc2Sc2ccc(Cl)cc21.Cl", "approval_year": 1957}, {"compound_id": "LB-EBE581D86602", "smiles": "CN(C)CCCN1c2ccccc2Sc2ccccc21.Cl", "approval_year": 1956}, {"compound_id": "LB-AAB0653AB330", "smiles": "CN(C)CCCN1c2ccccc2Sc2ccc(C(F)(F)F)cc21.Cl", "approval_year": 1957}, {"compound_id": "LB-FE0915B15B45", "smiles": "CCC(=O)c1ccc2c(c1)N(CC(C)N(C)C)c1ccccc1S2", "approval_year": 1960}, {"compound_id": "LB-C5E7336A86C0", "smiles": "N[C@@H]1C[C@H]1c1ccccc1.N[C@H]1C[C@@H]1c1ccccc1.O=S(=O)(O)O", "approval_year": 1961}, {"compound_id": "LB-BDA884938E52", "smiles": "COc1ccnc(C[S+]([O-])c2nc3cc(OC(F)F)ccc3[nH]2)c1OC", "approval_year": 2000}, {"compound_id": "LB-5C9856DB867A", "smiles": "CC(=O)OCC(CCn1cnc2cnc(N)nc21)COC(C)=O", "approval_year": 1994}, {"compound_id": "LB-A7E924303334", "smiles": "Nc1nc([O-])c2ncn(CCC(CO)CO)c2n1.[Na+]", "approval_year": 1996}, {"compound_id": "LB-8F3EC627D603", "smiles": "CCOc1ccc(Cc2cc([C@@H]3O[C@H](SC)[C@@H](O)[C@H](O)[C@H]3O)ccc2Cl)cc1", "approval_year": 2019}, {"compound_id": "LB-8B8E9E47CC4A", "smiles": "CN1C2CCCC1CC(NC(=O)c1nn(C)c3ccccc13)C2.Cl", "approval_year": 1993}, {"compound_id": "LB-37AB46F75E08", "smiles": "CCCC(C)C1(CC)C(=O)N=C([O-])NC1=O.[Na+]", "approval_year": 1973}, {"compound_id": "LB-3F9DEE4AC2B5", "smiles": "COc1ccc(CCN(C)CCCC(C#N)(c2ccc(OC)c(OC)c2)C(C)C)cc1OC", "approval_year": 1981}, {"compound_id": "LB-D7D06F3E8EF6", "smiles": "Cl.Oc1ccc(CCCCNC[C@H](O)c2ccc(O)c(O)c2)cc1", "approval_year": 1997}, {"compound_id": "LB-4E51D1B8AEF2", "smiles": "COc1ccc(CC2c3cc(OC)c(OC)cc3CC[N+]2(C)CCC(=O)OCCCCCOC(=O)CC[N+]2(C)CCc3cc(OC)c(OC)cc3C2Cc2ccc(OC)c(OC)c2)cc1OC", "approval_year": 1983}, {"compound_id": "LB-C518E61AA8CA", "smiles": "C=CCC1(C(C)CCC)C(=O)NC(=O)NC1=O", "approval_year": 1950}, {"compound_id": "LB-A3AAAA80475A", "smiles": "CCCC(C)C1(CC)C(=O)NC(=O)NC1=O", "approval_year": 1973}, {"compound_id": "LB-0561A13CBCB7", "smiles": "NC12CC3CC(CC(C3)C1)C2", "approval_year": 1968}, {"compound_id": "LB-51506A735086", "smiles": "CC12CC3CC(C)(C1)CC(N)(C3)C2.Cl", "approval_year": 2002}, {"compound_id": "LB-05043FA5E86E", "smiles": "CC(=O)Oc1ccccc1C(=O)O", "approval_year": 1950}, {"compound_id": "LB-4A02EC0F9338", "smiles": "Nc1ccc(C(=O)O)c(O)c1", "approval_year": 1950}, {"compound_id": "LB-3EFC271C8F61", "smiles": "CCC(Cc1c(I)cc(I)c(N)c1I)C(=O)O", "approval_year": 1951}, {"compound_id": "LB-74D586C7FFDF", "smiles": "O=C(N[C@H](CO)[C@H](O)c1ccc([N+](=O)[O-])cc1)C(Cl)Cl", "approval_year": 1950}, {"compound_id": "LB-E5731E0BDA1D", "smiles": "CCN(CC)CC(=O)Nc1c(C)cccc1C", "approval_year": 1948}, {"compound_id": "LB-3841656AD8C7", "smiles": "CCCN(CCC)S(=O)(=O)c1ccc(C(=O)O)cc1", "approval_year": 1951}, {"compound_id": "LB-E6E8F39FA856", "smiles": "CCCOc1ccc(C(=O)OCCN(CC)CC)cc1N", "approval_year": 1953}, {"compound_id": "LB-50788BD23AC0", "smiles": "COc1ccccc1OCC(O)COC(N)=O", "approval_year": 1957}, {"compound_id": "LB-7521FD2CCCE5", "smiles": "CC(N)C(O)c1ccccc1", "approval_year": 1958}, {"compound_id": "LB-526E93E2F0F0", "smiles": "CC(N)C(O)c1ccccc1.Cl", "approval_year": 1958}, {"compound_id": "LB-543775A59053", "smiles": "CC(C)(N)Cc1ccccc1", "approval_year": 1959}, {"compound_id": "LB-7E6F98419121", "smiles": "CCN(CC)C(C)C(=O)c1ccccc1.Cl", "approval_year": 1959}, {"compound_id": "LB-B74FF978CE13", "smiles": "CCN(CC)C(C)C(=O)c1ccccc1", "approval_year": 1959}, {"compound_id": "LB-476B2232695C", "smiles": "CNC(=O)c1c(I)c(NC(C)=O)c(I)c(C(=O)O)c1I", "approval_year": 1962}, {"compound_id": "LB-CB2CFBD8C366", "smiles": "CC(CN(C)C)C(C)(O)Cc1ccc(Cl)cc1", "approval_year": 1961}, {"compound_id": "LB-23EEC4A6877A", "smiles": "CCOC(=O)[C@@](C)(N)Cc1ccc(O)c(O)c1", "approval_year": 1962}, {"compound_id": "LB-4E0A3DF30545", "smiles": "CCCNC(C)C(=O)Nc1ccccc1C.Cl", "approval_year": 1965}, {"compound_id": "LB-D7CC7B630792", "smiles": "CNC[C@H](O)c1ccc(O)c(O)c1.O=C(O)C(O)C(O)C(=O)O", "approval_year": 1965}, {"compound_id": "LB-8073F3A4E5A8", "smiles": "CCNC(C)Cc1cccc(C(F)(F)F)c1", "approval_year": 1963}, {"compound_id": "LB-1C764F41CA37", "smiles": "CCNC(C)Cc1cccc(C(F)(F)F)c1.Cl", "approval_year": 1963}, {"compound_id": "LB-71FAD8F96658", "smiles": "CCOC(=O)C(C)(C)Oc1ccc(Cl)cc1", "approval_year": 1967}, {"compound_id": "LB-9573ABD842F6", "smiles": "CCCC(=O)Nc1c(I)cc(I)c(CC(CC)C(=O)O)c1I", "approval_year": 1969}, {"compound_id": "LB-F04252C02108", "smiles": "CC(C)NCC(O)c1cc(O)cc(O)c1", "approval_year": 1973}, {"compound_id": "LB-0F2D5BADD1A1", "smiles": "NCCc1ccc(O)c(O)c1", "approval_year": 1974}, {"compound_id": "LB-F0A5164EBABD", "smiles": "CC(C)(C)NCC(O)c1cc(O)cc(O)c1", "approval_year": 1974}, {"compound_id": "LB-871F8EFE80D0", "smiles": "N[C@@H](Cc1ccc(O)c(O)c1)C(=O)O", "approval_year": 1970}, {"compound_id": "LB-FBAA681E876C", "smiles": "C[C@@](Cc1ccc(O)c(O)c1)(NN)C(=O)O.O", "approval_year": 1975}, {"compound_id": "LB-74891FAF939F", "smiles": "CNC[C@H](O)c1cccc(O)c1.O=C(O)C(O)C(O)C(=O)O", "approval_year": 1973}, {"compound_id": "LB-3F0378FC379F", "smiles": "CCCCCCCCNC(C)C(O)c1ccc(SC(C)C)cc1", "approval_year": 1979}, {"compound_id": "LB-56F08422E2F3", "smiles": "C#CCN(C)Cc1ccccc1.Cl", "approval_year": 1982}, {"compound_id": "LB-9A08D759B56C", "smiles": "CC[N+](CC)(CC)CCOc1cccc(OCC[N+](CC)(CC)CC)c1OCC[N+](CC)(CC)CC.[I-].[I-].[I-]", "approval_year": 1982}, {"compound_id": "LB-2011E87B145C", "smiles": "Nc1ccc(C(=O)NCC(=O)O)cc1", "approval_year": 1982}, {"compound_id": "LB-BDA8C371A35C", "smiles": "N[C@@H](Cc1ccc(O)cc1)C(=O)O", "approval_year": 1982}, {"compound_id": "LB-D5EBC3A2E1CB", "smiles": "CCOC(=O)/C=C(C)/C=C/C=C(C)/C=C/c1c(C)cc(OC)c(C)c1C", "approval_year": 1986}, {"compound_id": "LB-B37DAE18B3DB", "smiles": "COC(=O)CCc1ccc(OCC(O)CNC(C)C)cc1", "approval_year": 1986}, {"compound_id": "LB-94934B9D7D53", "smiles": "CC(C)c1cccc(C(C)C)c1O", "approval_year": 1989}, {"compound_id": "LB-C832261F584B", "smiles": "C=CCOc1ccccc1OCC(O)CNC(C)C.Cl", "approval_year": 1983}, {"compound_id": "LB-760942CF59A5", "smiles": "COC(=O)CCc1ccc(OCC(O)CNC(C)C)cc1.Cl", "approval_year": 1986}, {"compound_id": "LB-B73BE9F05D21", "smiles": "O=C([O-])Cc1ccccc1.[Na+]", "approval_year": 1987}, {"compound_id": "LB-496EA1B8FF5F", "smiles": "Cl.N=C(N)NC(=O)Cc1c(Cl)cccc1Cl", "approval_year": 1986}, {"compound_id": "LB-A4A91A00836E", "smiles": "CC(=O)N(CC(O)CO)c1c(I)c(C(=O)NCC(O)CO)c(I)c(C(=O)NCC(O)CO)c1I", "approval_year": 1985}, {"compound_id": "LB-9E8B6BB6F8E9", "smiles": "Nc1ccc(O)c(C(=O)O)c1", "approval_year": 1987}, {"compound_id": "LB-CA34BE5C6F4D", "smiles": "CC(=O)Oc1c(C)cc(OCC(O)CNC(C)C)c(C)c1C", "approval_year": 1989}, {"compound_id": "LB-CE99EEEF9B9D", "smiles": "CC(=O)Oc1c(C)cc(OCC(O)CNC(C)C)c(C)c1C.Cl", "approval_year": 1989}, {"compound_id": "LB-A501076E701F", "smiles": "NC(=O)OCC(COC(N)=O)c1ccccc1", "approval_year": 1993}, {"compound_id": "LB-ADB003C8EB53", "smiles": "CC(C)Cc1ccc([C@H](C)C(=O)O)cc1", "approval_year": 1994}, {"compound_id": "LB-9FF0888ED943", "smiles": "N#Cc1cc(NC(=O)C(=O)O)c(Cl)c(NC(=O)C(=O)O)c1", "approval_year": 1993}, {"compound_id": "LB-793A2D8AFC67", "smiles": "O=P(O)(O)C(Sc1ccc(Cl)cc1)P(=O)(O)O", "approval_year": 1997}, {"compound_id": "LB-56E579A43F4D", "smiles": "O=C([O-])CCCc1ccccc1.[Na+]", "approval_year": 1996}, {"compound_id": "LB-C387206677FF", "smiles": "C[C@H](N)Cc1ccccc1.O=C(O)[C@@H](O)[C@@H](O)[C@H](O)[C@@H](O)C(=O)O", "approval_year": 1996}, {"compound_id": "LB-2EC202613B71", "smiles": "COCCCC/C(=N\\OCCN)c1ccc(C(F)(F)F)cc1", "approval_year": 1994}, {"compound_id": "LB-A6EB0AF99B03", "smiles": "CC(C)(C)NC[C@H](O)c1ccc(O)c(CO)c1.Cl", "approval_year": 1999}, {"compound_id": "LB-009996B01551", "smiles": "CCN(C)C(=O)Oc1cccc([C@H](C)N(C)C)c1.O=C(O)[C@H](O)[C@@H](O)C(=O)O", "approval_year": 1998}, {"compound_id": "LB-ADE353CC89BF", "smiles": "Oc1ccc(O)cc1", "approval_year": 2002}, {"compound_id": "LB-18EDBA8120AC", "smiles": "Br.CC(NC(C)(C)C)C(=O)c1cccc(Cl)c1", "approval_year": 2008}, {"compound_id": "LB-82907546432B", "smiles": "CN[C@@H](C)[C@H](O)c1ccccc1", "approval_year": 2016}, {"compound_id": "LB-84E2CD64D954", "smiles": "COc1cc(/C=C/C(=O)N2CCN(CC(=O)N3CCCC3)CC2)cc(OC)c1OC", "approval_year": 1980}, {"compound_id": "LB-5F7A64267BAF", "smiles": "COC(=O)[C@H](c1ccccc1Cl)N1CCc2sccc2C1.O=S(=O)(O)c1ccccc1", "approval_year": 2009}, {"compound_id": "LB-85B99C10D1ED", "smiles": "O=P(O)(O)O.c1ccc(CN(CC2=NCCN2)c2ccccc2)cc1", "approval_year": 1994}, {"compound_id": "LB-B5DFB6561F21", "smiles": "C=CC[N+]1([C@H]2C[C@H]3[C@@H]4CC[C@H]5C[C@H](OC(C)=O)[C@@H](N6CCCCC6)C[C@]5(C)[C@H]4CC[C@]3(C)[C@H]2OC(=O)CC)CCCCC1.[Br-]", "approval_year": 1999}, {"compound_id": "LB-6271E9C58BCF", "smiles": "C=CC[N+]1([C@H]2C[C@H]3[C@@H]4CC[C@H]5C[C@H](OC(C)=O)[C@@H](N6CCCCC6)C[C@]5(C)[C@H]4CC[C@]3(C)[C@H]2OC(=O)CC)CCCCC1", "approval_year": 1999}, {"compound_id": "LB-CBE894929602", "smiles": "Cc1nnc2n1-c1sc(Br)cc1C(c1ccccc1Cl)=NC2", "approval_year": 1984}, {"compound_id": "LB-30D3C4A88162", "smiles": "Clc1ccc(COC(Cn2ccnc2)c2ccc(Cl)cc2Cl)cc1", "approval_year": 1982}, {"compound_id": "LB-73851B154805", "smiles": "CC(C(=O)O)c1ccc2oc(-c3ccc(Cl)cc3)nc2c1", "approval_year": 1982}, {"compound_id": "LB-9AA2EDE5E4AA", "smiles": "CN1CC[C@]23CCCC[C@H]2[C@H]1Cc1ccc(O)cc13.O.O.O=C(O)C(O)C(O)C(=O)O", "approval_year": 1991}, {"compound_id": "LB-1194545589EC", "smiles": "CC1=C(/C=C/C(C)=C/C=C/C(C)=C/C=C/C=C(C)/C=C/C=C(C)/C=C/C2=C(C)CCCC2(C)C)C(C)(C)CCC1", "approval_year": 1982}, {"compound_id": "LB-CBCA79841B80", "smiles": "CC(C)Oc1ccc(-c2nn([C@@H](C)c3oc4ccc(F)cc4c(=O)c3-c3cccc(F)c3)c3ncnc(N)c23)cc1F", "approval_year": 2021}, {"compound_id": "LB-2E73E20A28D7", "smiles": "C[N+]12CCC(CC1)C(OC(=O)C(O)(c1ccccc1)c1ccccc1)C2", "approval_year": 1982}, {"compound_id": "LB-D21636830F4E", "smiles": "CCC1(c2ccccc2)C(=O)NC(=O)NC1=O", "approval_year": 2022}, {"compound_id": "LB-44EC44B6BAB3", "smiles": "N=C(N)c1ccc(/C=C/c2ccc(C(=N)N)cc2O)cc1.O=S(=O)(O)CCO.O=S(=O)(O)CCO", "approval_year": 1953}, {"compound_id": "LB-68C25A488211", "smiles": "Cc1c(C)c2c(c(C)c1O)CCC(C)(COc1ccc(CC3SC(=O)NC3=O)cc1)O2", "approval_year": 1997}, {"compound_id": "LB-39DEBA2D2FB4", "smiles": "Cc1cc2c(cc1CC(=O)c1sccc1S(=O)(=O)[N-]c1onc(C)c1Cl)OCO2.[Na+]", "approval_year": 2006}, {"compound_id": "LB-5238256F5C50", "smiles": "COc1ccc(C2C(=O)c3ccccc3C2=O)cc1", "approval_year": 1957}, {"compound_id": "LB-D1B07C4677CD", "smiles": "CCc1nn(CCCN2CCN(c3cccc(Cl)c3)CC2)c(=O)n1CCOc1ccccc1", "approval_year": 1994}, {"compound_id": "LB-D34B460DDAA5", "smiles": "CCc1nn(CCCN2CCN(c3cccc(Cl)c3)CC2)c(=O)n1CCOc1ccccc1.Cl", "approval_year": 1994}, {"compound_id": "LB-C5B6734131A6", "smiles": "NS(=O)(=O)c1cc2c(cc1Cl)N=C[N-]S2(=O)=O.[Na+]", "approval_year": 1958}, {"compound_id": "LB-EB7C46CC9C2E", "smiles": "CCCN[C@H]1CCc2nc(N)sc2C1", "approval_year": 1997}, {"compound_id": "LB-0D56D3142136", "smiles": "CCCCC(=O)N(Cc1ccc(-c2ccccc2-c2nnn[nH]2)cc1)[C@H](C(=O)O)C(C)C", "approval_year": 1996}, {"compound_id": "LB-308EA583F473", "smiles": "CC[C@H]1[C@@H](O)[C@@H]2[C@H](CC[C@]3(C)[C@@H]([C@H](C)CCC(=O)O)CC[C@@H]23)[C@@]2(C)CC[C@@H](O)C[C@@H]12", "approval_year": 2016}, {"compound_id": "LB-CE41A9432FB2", "smiles": "C[C@H](CCC(=O)O)[C@H]1CC[C@H]2[C@@H]3CC[C@@H]4C[C@H](O)CC[C@]4(C)[C@H]3C[C@H](O)[C@]12C", "approval_year": 2015}, {"compound_id": "LB-82D843DC404A", "smiles": "CNS(=O)(=O)CCc1ccc2[nH]cc(C3CCN(C)CC3)c2c1.Cl", "approval_year": 1998}, {"compound_id": "LB-29B5C740B1D4", "smiles": "N[C@@H](C(=O)N[C@@H]1C(=O)N2C(C(=O)O)=C(Cl)CC[C@H]12)c1ccccc1.O", "approval_year": 1991}, {"compound_id": "LB-A6772BD10653", "smiles": "O[C@@H]1CO[C@H]2[C@@H]1OC[C@@H]2O", "approval_year": 1974}, {"compound_id": "LB-E80DB013A19E", "smiles": "O=[N+]([O-])O[C@H]1CO[C@H]2[C@@H]1OC[C@H]2O[N+](=O)[O-]", "approval_year": 1986}, {"compound_id": "LB-341E08C6D340", "smiles": "CC(C(=O)O)c1ccc2c(c1)[nH]c1ccc(Cl)cc12", "approval_year": 1987}, {"compound_id": "LB-1A95AAFE3CB6", "smiles": "Fc1ccccc1C1=NCC(=S)N(CC(F)(F)F)c2ccc(Cl)cc21", "approval_year": 1985}, {"compound_id": "LB-CDC4096AC1B4", "smiles": "Cl[C@H]1[C@H](Cl)[C@@H](Cl)[C@@H](Cl)[C@H](Cl)[C@H]1Cl", "approval_year": 1974}, {"compound_id": "LB-2ABD2C74649B", "smiles": "C#CC1(OC(N)=O)CCCCC1", "approval_year": 1982}, {"compound_id": "LB-0F9854AC87A8", "smiles": "Cc1cc2c(s1)Nc1ccccc1N=C2N1CCN(C)CC1.O.O=C(O)c1cc2ccccc2c(Cc2c(O)c(C(=O)O)cc3ccccc23)c1O", "approval_year": 2008}, {"compound_id": "LB-97BDA723BA60", "smiles": "CC1(C)O[C@@H]2C[C@H]3[C@@H]4C[C@H](F)C5=CC(=O)C=C[C@]5(C)[C@@]4(F)[C@@H](O)C[C@]3(C)[C@]2(C(=O)CO)O1", "approval_year": 1963}, {"compound_id": "LB-E2D8D6568994", "smiles": "CC(C)(C)CC(=O)OCC(=O)[C@@]12OC(C)(C)O[C@@H]1C[C@H]1[C@@H]3CCC4=CC(=O)C=C[C@]4(C)[C@@]3(F)[C@@H](O)C[C@@]12C", "approval_year": 1969}, {"compound_id": "LB-5A74E6A446AF", "smiles": "CC(=O)OCC(=O)[C@@]12OC(C)(C)O[C@@H]1C[C@H]1[C@@H]3C[C@H](F)C4=CC(=O)C=C[C@]4(C)[C@@]3(F)[C@@H](O)C[C@@]12C", "approval_year": 1971}, {"compound_id": "LB-D11E9E238C84", "smiles": "CCCC1O[C@@H]2C[C@H]3[C@@H]4CCC5=CC(=O)C=C[C@]5(C)[C@H]4[C@@H](O)C[C@]3(C)[C@]2(C(=O)CO)O1", "approval_year": 1994}, {"compound_id": "LB-7447E2F8B9CB", "smiles": "O=C1NC(=O)C(c2ccccc2)(c2ccccc2)N1", "approval_year": 1953}, {"compound_id": "LB-5DC377F3A031", "smiles": "O=C1OCCN1/N=C/c1ccc([N+](=O)[O-])o1", "approval_year": 1958}, {"compound_id": "LB-44232DEE3E57", "smiles": "CC[C@H]1OC(=O)[C@H](C)[C@@H](O[C@H]2C[C@@](C)(OC)[C@@H](O)[C@H](C)O2)[C@H](C)[C@@H](O[C@@H]2O[C@H](C)C[C@H](N(C)C)[C@H]2O)[C@](C)(O)C[C@@H](C)CN(C)[C@H](C)[C@@H](O)[C@]1(C)O", "approval_year": 1991}, {"compound_id": "LB-EF384F74B304", "smiles": "CNC1(c2ccccc2Cl)CCCCC1=O.Cl", "approval_year": 1970}, {"compound_id": "LB-9B6B4948745A", "smiles": "CCC(=O)O[C@H]1[C@H](O[C@@H]2[C@@H](C)[C@H](O[C@H]3C[C@@](C)(OC)[C@@H](O)[C@H](C)O3)[C@@H](C)C(=O)O[C@H](CC)[C@@](C)(O)[C@H](O)[C@@H](C)C(=O)[C@H](C)C[C@@]2(C)O)O[C@H](C)C[C@@H]1N(C)C.CCCCCCCCCCCCOS(=O)(=O)O", "approval_year": 1967}, {"compound_id": "LB-3FE0D1A7F2E9", "smiles": "CCC(=O)O[C@H]1[C@H](O[C@@H]2[C@@H](C)[C@H](O[C@H]3C[C@@](C)(OC)[C@@H](O)[C@H](C)O3)[C@@H](C)C(=O)O[C@H](CC)[C@@](C)(O)[C@H](O)[C@@H](C)C(=O)[C@H](C)C[C@@]2(C)O)O[C@H](C)C[C@@H]1N(C)C", "approval_year": 1967}, {"compound_id": "LB-57D020D47344", "smiles": "OCc1cc(C(O)CNCCCCCCOCCCCc2ccccc2)ccc1O", "approval_year": 1994}, {"compound_id": "LB-E1F9AFD3C661", "smiles": "Cn1c(=O)c2c(ncn2CC(O)CO)n(C)c1=O", "approval_year": 1951}, {"compound_id": "LB-EEB18FF5019D", "smiles": "CC(=O)CCCCn1c(=O)c2c(ncn2C)n(C)c1=O", "approval_year": 1984}, {"compound_id": "LB-D4528CD90F2E", "smiles": "CC(C)(C(=O)c1cccnc1)c1cccnc1", "approval_year": 1961}, {"compound_id": "LB-1F1DC15CD00E", "smiles": "CN1C[C@H](C(=O)N[C@]2(C)O[C@@]3(O)[C@@H]4CCCN4C(=O)[C@H](Cc4ccccc4)N3C2=O)C=C2c3cccc4[nH]cc(c34)C[C@H]21.CN1C[C@H](C(=O)N[C@]2(C)O[C@@]3(O)[C@@H]4CCCN4C(=O)[C@H](Cc4ccccc4)N3C2=O)C=C2c3cccc4[nH]cc(c34)C[C@H]21.O=C(O)C(O)C(O)C(=O)O", "approval_year": 1948}, {"compound_id": "LB-E5D058B05B95", "smiles": "CC(C)c1nc(CN(C)C(=O)N[C@H](C(=O)N[C@@H](Cc2ccccc2)C[C@H](O)[C@H](Cc2ccccc2)NC(=O)OCc2cncs2)C(C)C)cs1", "approval_year": 1996}, {"compound_id": "LB-03C776830277", "smiles": "O=C1CCC(N2C(=O)c3ccccc3C2=O)C(=O)N1", "approval_year": 1956}, {"compound_id": "LB-B716789F071F", "smiles": "Oc1c(Cl)cc(Cl)c(Cl)c1Cc1c(O)c(Cl)cc(Cl)c1Cl", "approval_year": 1949}, {"compound_id": "LB-3F7E1F936B98", "smiles": "CCC(=O)C(CC(C)N(C)C)(c1ccccc1)c1ccccc1", "approval_year": 1947}, {"compound_id": "LB-94A025AAE26E", "smiles": "CC(C)[N+](C)(CCC(C(N)=O)(c1ccccc1)c1ccccc1)C(C)C", "approval_year": 1957}, {"compound_id": "LB-FFA70C8AE80E", "smiles": "Cc1ccccc1C(OCCN(C)C)c1ccccc1.O=C(O)CC(O)(CC(=O)O)C(=O)O", "approval_year": 1959}, {"compound_id": "LB-60EE6A30B006", "smiles": "Cc1ccccc1C(OCCN(C)C)c1ccccc1", "approval_year": 1957}, {"compound_id": "LB-E15EC412CE1C", "smiles": "CN(C)CCC(O)(c1ccccc1)c1ccccc1Cl.Cl", "approval_year": 1982}, {"compound_id": "LB-8C75E317499E", "smiles": "CC(CC(c1ccccc1)c1ccccc1)NC(C)(C)C", "approval_year": 1986}, {"compound_id": "LB-C7C7E017EA20", "smiles": "CC(CC(c1ccccc1)c1ccccc1)NC(C)(C)C.Cl", "approval_year": 1986}, {"compound_id": "LB-A3A078FA2BBA", "smiles": "CC[C@H](OC(C)=O)C(C[C@H](C)N(C)C)(c1ccccc1)c1ccccc1", "approval_year": 1993}, {"compound_id": "LB-3692EA0B272F", "smiles": "CC(C)C(=O)Oc1ccc(CO)cc1[C@H](CCN(C(C)C)C(C)C)c1ccccc1.O=C(O)/C=C/C(=O)O", "approval_year": 2007}]}
i18n.js CHANGED
@@ -21,6 +21,12 @@ ko: {
21
  statBoards: "๊ฐœ์„ค ๋ถ€๋ฌธ", statCompounds: "ํ…Œ์ŠคํŠธ ํ™”ํ•ฉ๋ฌผ", statFields: "๋ถ„์•ผ",
22
  statClauses: "๊ทœ๊ฒฉ ์กฐํ•ญ", statPlanned: "๊ณ„ํš ๋ถ€๋ฌธ",
23
 
 
 
 
 
 
 
24
  secBrowse: "๋ถ„์•ผ", secBrowseLead: "๋ถ„์•ผ๋ฅผ ์„ ํƒํ•˜๋ฉด ์†Œ์† ๋ถ€๋ฌธ์˜ ์ˆœ์œ„ํ‘œ์™€ ์ œ์ถœ ์ฐฝ๊ตฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.",
25
  secEvidence: "์ธก์ • ํ•œ๊ณ„ ์ง€ํ˜•",
26
  secEvidenceLead: "๊ฐ€๋กœ์ถ•์€ <b>๊ธฐ์ค€์„  ์˜ค์ฐจ รท ์‹คํ—˜ ์žฌํ˜„ ์˜ค์ฐจ</b>์ž…๋‹ˆ๋‹ค. 1.0 ์— ๊ทผ์ ‘ํ• ์ˆ˜๋ก " +
@@ -185,6 +191,12 @@ en: {
185
  statBoards: "open boards", statCompounds: "test compounds", statFields: "disciplines",
186
  statClauses: "spec clauses", statPlanned: "planned boards",
187
 
 
 
 
 
 
 
188
  secBrowse: "Disciplines",
189
  secBrowseLead: "Select a discipline to reach its boards, leaderboards and submission desk.",
190
  secEvidence: "Measurement-limit landscape",
 
21
  statBoards: "๊ฐœ์„ค ๋ถ€๋ฌธ", statCompounds: "ํ…Œ์ŠคํŠธ ํ™”ํ•ฉ๋ฌผ", statFields: "๋ถ„์•ผ",
22
  statClauses: "๊ทœ๊ฒฉ ์กฐํ•ญ", statPlanned: "๊ณ„ํš ๋ถ€๋ฌธ",
23
 
24
+ secLeaders: "๋ถ€๋ฌธ๋ณ„ 1์œ„",
25
+ secLeadersLead: "๊ฐ ๋ถ€๋ฌธ์˜ ํ˜„์žฌ ์„ ๋‘์ž…๋‹ˆ๋‹ค. ์ฐธ๊ฐ€ ์ œ์ถœ์ด ์—†๋Š” ๋ถ€๋ฌธ์€ ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค โ€” ๊ธฐ์ค€์„ ์€ ๋„˜์–ด์•ผ ํ•  ์„ ์ด์ง€ ์šฐ์Šน์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.",
26
+ thBoard: "๋ถ€๋ฌธ", thBest: "1์œ„", thScore: "์ ์ˆ˜", thVs: "๊ธฐ์ค€์„  ๋Œ€๋น„", thN: "ํ…Œ์ŠคํŠธ",
27
+ noLeader: "์•„์ง ์—†์Œ",
28
+ leadersEmpty: n => `${n}๊ฐœ ๋ถ€๋ฌธ ๋ชจ๋‘ ์ฐธ๊ฐ€ ์ œ์ถœ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.`,
29
+ leadersSome: (a, b) => `${b}๊ฐœ ๋ถ€๋ฌธ ์ค‘ ${a}๊ฐœ์— ์„ ๋‘๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.`,
30
  secBrowse: "๋ถ„์•ผ", secBrowseLead: "๋ถ„์•ผ๋ฅผ ์„ ํƒํ•˜๋ฉด ์†Œ์† ๋ถ€๋ฌธ์˜ ์ˆœ์œ„ํ‘œ์™€ ์ œ์ถœ ์ฐฝ๊ตฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.",
31
  secEvidence: "์ธก์ • ํ•œ๊ณ„ ์ง€ํ˜•",
32
  secEvidenceLead: "๊ฐ€๋กœ์ถ•์€ <b>๊ธฐ์ค€์„  ์˜ค์ฐจ รท ์‹คํ—˜ ์žฌํ˜„ ์˜ค์ฐจ</b>์ž…๋‹ˆ๋‹ค. 1.0 ์— ๊ทผ์ ‘ํ• ์ˆ˜๋ก " +
 
191
  statBoards: "open boards", statCompounds: "test compounds", statFields: "disciplines",
192
  statClauses: "spec clauses", statPlanned: "planned boards",
193
 
194
+ secLeaders: "Current leaders",
195
+ secLeadersLead: "The leading entry on each board. Boards without an entrant are left blank โ€” a baseline is a line to cross, not a winner.",
196
+ thBoard: "Board", thBest: "Leader", thScore: "Score", thVs: "vs baseline", thN: "Test",
197
+ noLeader: "none yet",
198
+ leadersEmpty: n => `All ${n} boards are awaiting their first entry.`,
199
+ leadersSome: (a, b) => `${a} of ${b} boards have a leader.`,
200
  secBrowse: "Disciplines",
201
  secBrowseLead: "Select a discipline to reach its boards, leaderboards and submission desk.",
202
  secEvidence: "Measurement-limit landscape",
index.html CHANGED
@@ -171,6 +171,8 @@
171
  border-radius:8px;background:var(--bg2);font-size:12px;font-weight:750}
172
  .rk.g1{background:#f0c44a26;color:#9c7710}.rk.g2{background:#aab4c426;color:#77828f}
173
  .rk.g3{background:#c9885526;color:#95612f}
 
 
174
  .mini{display:inline-block;height:6px;border-radius:3px;background:var(--acc);opacity:.5;
175
  vertical-align:middle;margin-right:7px}
176
 
@@ -286,7 +288,14 @@ function terrain(items,link){
286
  <i>0</i><i>โ† ${t.terrLeft} ยท 1.0 ยท ${t.terrRight} โ†’</i><i>${MAX.toFixed(1)}</i>
287
  </span><span></span></div></div>`;
288
  }
289
- const ratioOf=b=>Math.min(...Object.values(b.baselines).map(v=>v.mae))/b.noise_floor.sd_single;
 
 
 
 
 
 
 
290
 
291
  async function boot(){
292
  try{ME=await j("/api/me");}catch(e){}
@@ -309,7 +318,8 @@ function route(){
309
  /* โ•โ•โ• ํ—ˆ๋ธŒ โ•โ•โ• */
310
  function hub(){
311
  const T0=CATS.totals, bs=Object.values(BOARDS);
312
- const items=bs.map(b=>({board:b.board,ratio:ratioOf(b)})).sort((a,b)=>a.ratio-b.ratio);
 
313
  const inside=items.filter(x=>x.ratio<1.3).length;
314
  const lost=bs.filter(b=>b.beats_constant===false).length;
315
  app.innerHTML=W(`
@@ -339,6 +349,9 @@ function hub(){
339
  <div class="find"><b>${t.found3t}</b><p>${t.found3d}</p></div>
340
  </div></div>
341
 
 
 
 
342
  <div class="sec"><h2>${t.secBrowse}</h2><p class="lead2">${t.secBrowseLead}</p>
343
  <div class="grid">${CATS.categories.map(cardHTML).join("")}</div></div>
344
 
@@ -374,6 +387,39 @@ function hub(){
374
  <div class="note n">${t.dataNote}<br><br>
375
  ${t.srcLabel} ยท <a href="https://www.ebi.ac.uk/chembl/">ChEMBL_37 (EMBL-EBI)</a> ยท
376
  <a href="https://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA 3.0 Unported</a></div></div>`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
377
  }
378
 
379
  function cardHTML(c){
@@ -392,7 +438,8 @@ function cardHTML(c){
392
  function category(id){
393
  const c=CATS.categories.find(x=>x.id===id); if(!c)return hub();
394
  const bs=(c.board_cards||[]).slice().sort((a,b)=>b.n_test-a.n_test);
395
- const items=bs.map(b=>({board:b.board,ratio:ratioOf(b)})).sort((a,b)=>a.ratio-b.ratio);
 
396
  const nm=L==="ko"?c.name:c.en;
397
  app.innerHTML=W(`
398
  <div class="crumb"><a href="#/">${t.all}</a> โ€บ ${esc(nm)}</div>
@@ -412,9 +459,9 @@ function boardMini(b){
412
  const bl=b.baselines[b.best_baseline]||{};
413
  return `<a class="cc" href="#/b/${encodeURIComponent(b.board)}">
414
  <div class="nm">${esc(b.board)}<span class="chip">${b.split_grade}/${b.answer_grade}</span></div>
415
- <div class="ds">${t.cardCompounds(b.n_test.toLocaleString())} ยท ${t.noiseH} ${f(b.noise_floor.sd_single)}<br>
416
- ${esc(b.best_baseline)} ${f(bl.mae)}</div>
417
- <div class="mt"><span>${esc(b.source)}</span><span>${f(ratioOf(b),2)}ร—</span></div></a>`;
418
  }
419
 
420
  /* โ•โ•โ• ๋ถ€๋ฌธ โ•โ•โ• */
 
171
  border-radius:8px;background:var(--bg2);font-size:12px;font-weight:750}
172
  .rk.g1{background:#f0c44a26;color:#9c7710}.rk.g2{background:#aab4c426;color:#77828f}
173
  .rk.g3{background:#c9885526;color:#95612f}
174
+ .gain{color:var(--good);font-weight:700}
175
+ .loss{color:var(--bad);font-weight:700}
176
  .mini{display:inline-block;height:6px;border-radius:3px;background:var(--acc);opacity:.5;
177
  vertical-align:middle;margin-right:7px}
178
 
 
288
  <i>0</i><i>โ† ${t.terrLeft} ยท 1.0 ยท ${t.terrRight} โ†’</i><i>${MAX.toFixed(1)}</i>
289
  </span><span></span></div></div>`;
290
  }
291
+ /* ๋ถ„๋ฅ˜ ์ „์šฉ ๋ถ€๋ฌธ์€ MAE ๊ธฐ์ค€์„ ์ด ์—†๋‹ค. ๊ทธ๋Ÿฐ ๋ถ€๋ฌธ์„ 0 ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ง€ํ˜•๋„ ๋งจ ์™ผ์ชฝ์—
292
+ ๋ถ™์–ด "์ธก์ • ํ•œ๊ณ„์— ๋„๋‹ฌํ–ˆ๋‹ค"๋กœ ๋ณด์ธ๋‹ค. ์žฌ์ง€ ๋ชปํ•œ ๊ฒƒ๊ณผ ์žฌ์„œ ์ž‘์€ ๊ฒƒ์€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋น„์šด๋‹ค. */
293
+ const ratioOf=b=>{
294
+ const nf=(b.noise_floor||{}).sd_single;
295
+ const maes=Object.values(b.baselines||{}).map(v=>v.mae).filter(v=>v!=null);
296
+ if(!nf||!maes.length) return null;
297
+ return Math.min(...maes)/nf;
298
+ };
299
 
300
  async function boot(){
301
  try{ME=await j("/api/me");}catch(e){}
 
318
  /* โ•โ•โ• ํ—ˆ๋ธŒ โ•โ•โ• */
319
  function hub(){
320
  const T0=CATS.totals, bs=Object.values(BOARDS);
321
+ const items=bs.map(b=>({board:b.board,ratio:ratioOf(b)}))
322
+ .filter(x=>x.ratio!=null).sort((a,b)=>a.ratio-b.ratio);
323
  const inside=items.filter(x=>x.ratio<1.3).length;
324
  const lost=bs.filter(b=>b.beats_constant===false).length;
325
  app.innerHTML=W(`
 
349
  <div class="find"><b>${t.found3t}</b><p>${t.found3d}</p></div>
350
  </div></div>
351
 
352
+ <div class="sec"><h2>${t.secLeaders}</h2><p class="lead2">${t.secLeadersLead}</p>
353
+ <div id="leaders"><div class="skel" style="height:200px"></div></div></div>
354
+
355
  <div class="sec"><h2>${t.secBrowse}</h2><p class="lead2">${t.secBrowseLead}</p>
356
  <div class="grid">${CATS.categories.map(cardHTML).join("")}</div></div>
357
 
 
387
  <div class="note n">${t.dataNote}<br><br>
388
  ${t.srcLabel} ยท <a href="https://www.ebi.ac.uk/chembl/">ChEMBL_37 (EMBL-EBI)</a> ยท
389
  <a href="https://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA 3.0 Unported</a></div></div>`);
390
+ paintLeaders();
391
+ }
392
+
393
+ /* ๋ถ€๋ฌธ๋ณ„ 1์œ„ ํ‘œ. ๋น„๋™๊ธฐ๋กœ ์ฑ„์šด๋‹ค - ์›์žฅ์„ ๋ถ€๋ฌธ ์ˆ˜๋งŒํผ ์ฝ์–ด์•ผ ํ•ด์„œ ์ฒซ ๊ทธ๋ฆผ์„ ๋ง‰์œผ๋ฉด ์•ˆ ๋œ๋‹ค. */
394
+ async function paintLeaders(){
395
+ const el=$("#leaders"); if(!el)return;
396
+ let d; try{ d=await j("/api/leaders"); }catch(e){ el.innerHTML=""; return; }
397
+ const rows=d.rows.map(r=>{
398
+ const L=r.leader;
399
+ // ์ ์ˆ˜๋Š” ๋ถ€๋ฌธ๋งˆ๋‹ค ์ฃผ์ง€ํ‘œ๊ฐ€ ๋‹ค๋ฅด๋‹ค. ํšŒ๊ท€ ๋ถ€๋ฌธ์€ MAE, ๋ถ„๋ฅ˜ ์ „์šฉ ๋ถ€๋ฌธ์€ AUROC.
400
+ const reg=r.baseline_best!=null;
401
+ const score=L?(reg?L.mae:L.auroc):null;
402
+ const bas=reg?r.baseline_best:r.baseline_best_auroc;
403
+ let vs="โ€”";
404
+ if(L&&score!=null&&bas!=null){
405
+ const better=reg?score<bas:score>bas;
406
+ const gap=reg?(bas-score):(score-bas);
407
+ vs=`<span class="${better?"gain":"loss"}">${better?"โ–ฒ":"โ–ผ"} ${Math.abs(gap).toFixed(3)}</span>`;
408
+ }
409
+ return `<tr>
410
+ <td style="text-align:left"><a href="#/b/${encodeURIComponent(r.board)}">${esc(r.board)}</a>
411
+ <span class="chip g" style="margin-left:6px">${r.split_grade}/${r.answer_grade}</span></td>
412
+ <td style="text-align:left">${L?esc(L.method):`<span class="dim">${t.noLeader}</span>`}</td>
413
+ <td style="text-align:left">${L?esc(L.user):"โ€”"}</td>
414
+ <td>${score!=null?f(score):"โ€”"}</td>
415
+ <td>${vs}</td>
416
+ <td>${(r.n_test||0).toLocaleString()}</td></tr>`;}).join("");
417
+ el.innerHTML=`<div class="tw"><table><thead><tr>
418
+ <th style="text-align:left;width:auto">${t.thBoard}</th>
419
+ <th style="text-align:left">${t.thBest}</th><th style="text-align:left">${t.thUser}</th>
420
+ <th>${t.thScore}</th><th>${t.thVs}</th><th>${t.thN}</th></tr></thead>
421
+ <tbody>${rows}</tbody></table></div>
422
+ <p class="dim" style="font-size:13px">${d.held?t.leadersSome(d.held,d.n):t.leadersEmpty(d.n)}</p>`;
423
  }
424
 
425
  function cardHTML(c){
 
438
  function category(id){
439
  const c=CATS.categories.find(x=>x.id===id); if(!c)return hub();
440
  const bs=(c.board_cards||[]).slice().sort((a,b)=>b.n_test-a.n_test);
441
+ const items=bs.map(b=>({board:b.board,ratio:ratioOf(b)}))
442
+ .filter(x=>x.ratio!=null).sort((a,b)=>a.ratio-b.ratio);
443
  const nm=L==="ko"?c.name:c.en;
444
  app.innerHTML=W(`
445
  <div class="crumb"><a href="#/">${t.all}</a> โ€บ ${esc(nm)}</div>
 
459
  const bl=b.baselines[b.best_baseline]||{};
460
  return `<a class="cc" href="#/b/${encodeURIComponent(b.board)}">
461
  <div class="nm">${esc(b.board)}<span class="chip">${b.split_grade}/${b.answer_grade}</span></div>
462
+ <div class="ds">${t.cardCompounds(b.n_test.toLocaleString())} ยท ${t.noiseH} ${f((b.noise_floor||{}).sd_single)}<br>
463
+ ${esc(b.best_baseline)} ${bl.mae!=null?f(bl.mae):f(bl.auroc)}</div>
464
+ <div class="mt"><span>${esc(b.source)}</span><span>${ratioOf(b)==null?"โ€”":f(ratioOf(b),2)+"ร—"}</span></div></a>`;
465
  }
466
 
467
  /* โ•โ•โ• ๋ถ€๋ฌธ โ•โ•โ• */