๊ธฐ๋ฅ ์์ธ ๋ณด๊ณ
๊ธฐ๋ฅ ๋ถ์ ๋ณด๊ณ ์ โ ADMET Surrogate + pepADMET ๋ ์ฑ (hc50 ๊ฒ์ดํธ)
๋์ ๋ชจ๋:
pyrosetta_flow/multiobjective.py,pyrosetta_flow/pepadmet_runner.py,pyrosetta_flow/pepadmet_toxicity.py,pyrosetta_flow/pepadmet_infer_script.py,backend/admet.py์ธ์ฉ ๊ท์น: ๋ชจ๋ ๋์ ์ฃผ์ฅ์
file_path:line์ผ๋ก ๊ทผ๊ฑฐ๋ฅผ ๋จ๋ค. ์ฝ๋์์ ์ง์ ํ์ธ๋์ง ์์ ํญ๋ชฉ์ "๋ฏธ๊ฒ์ฆ"์ผ๋ก ๋ช ์ํ๋ค. ๋ณธ ๋ฌธ์๋ ์ฝ๊ธฐ ์ ์ฉ ๋ถ์์ด๋ฉฐ ์ฝ๋๋ฅผ ์์ ํ์ง ์์๋ค.๋จ์ ๋ฉด์ฑ (๊ฐ์ฅ ์ค์): pepADMET HC50 ์ถ๋ ฅ์ ์ ๋ ๋จ์(ฮผg/mL vs ฮผM)๋ ์๋ ผ๋ฌธ ๋๋น ๋ฏธ๊ฒ์ฆ์ด๋ค (
pyrosetta_flow/pepadmet_toxicity.py:24-30,pyrosetta_flow/pepadmet_toxicity.py:40). ๋ฐ๋ผ์ hc50 ์ ๋๊ฐ ํด์์ ๊ธ์ง๋๋ฉฐ, native SST-14 ๊ธฐ์ค์ ๋๋น ์๋ ๋น๊ต ์ ์ฉ์ผ๋ก๋ง ์ฌ์ฉ๋๋ค.
โ ๋์ ์๋ฆฌ
1-A. ADMET surrogate (๋ฌผ์ฑ ๊ธฐ๋ฐ ํฉ๋ฆฌ์ฑ ์ ์)
๋ ๊ฐ๋์ ADMET ๊ณ์ฐ์ด ๊ณต์กดํ๋ค.
(a) backend/admet.py โ ์์ด ์ ์ฉ ์์ ํ์ด์ฌ ๋ฌผ์ฑ/์ฝ๋ฌผ์ ์ฌ์ฑ (์ธ๋ถ ์์กด ์์, backend/admet.py:7)
- ๋ถ์๋(monoisotopic residue weight ํฉ + H2O): backend/admet.py:74
- pH 7.4 net charge (K/R = +1, D/E = โ1, H = +0.1, Nํญ +1ยทCํญ โ1): backend/admet.py:77-89
- H-bond donor/acceptor (์ฌ์ด๋์ฒด์ธ + backbone): backend/admet.py:91-97
- Kyte-Doolittle ํ๊ท ์์์ฑ + amphipathicity(๋ถ์ฐ): backend/admet.py:99-107
- druglikeness_score (0~100, 25์ ร4 ๊ท์น): MW 1200~2000 / |charge|โค3 / ์์์ฑ [โ2,+1] /
3์ฐ์ ๋์ผ ์๊ธฐ ์์ โ backend/admet.py:113-136
- ์ ์ฅ๋
์ฑ(PRRT renal retention) ์ํ: cationic ์๊ธฐ(K/R/H) ๊ธฐ๋ฐ ์ ์,
min(100, (n_lys+n_arg)*20 + max(0,net_charge)*15) โ backend/admet.py:188-200.
๊ทผ๊ฑฐ๋ก DOTATATE(~25, Low)๋ฅผ ๋ ํผ๋ฐ์ค๋ก ๋ (backend/admet.py:155-156).
(b) multiobjective.admet_reasonableness() โ ๋ค๋ชฉ์ ๋ญํน์ฉ 0~1 ํฉ๋ฆฌ์ฑ ์ ์ (pyrosetta_flow/multiobjective.py:64-90)
- ์
๋ ฅ: instability_index, gravy, boman_index, pi 4๊ฐ ๋ฌผ์ฑ (pyrosetta_flow/multiobjective.py:69-72).
์ด ๋ฌผ์ฑ์ AG_src.pipeline.pharma_properties.PharmaProperties ๊ฐ ๊ณ์ฐ (pyrosetta_flow/multiobjective.py:46,
pyrosetta_flow/multiobjective.py:135-147). Cys3-Cys14 SS bond ๋ pI ๊ณ์ฐ ์ ํด๋น Cys ๋ฅผ ์ ์ธ
(pyrosetta_flow/multiobjective.py:138-140, pyrosetta_flow/multiobjective.py:146).
- ๋ถ๋ถ์ ์ ๋ณํ + ๊ฐ์ค ํ๊ท :
- Instability: <40 ๋ง์ , 40~80 ์ ํ ๊ฐ์ , >80 0์ (pyrosetta_flow/multiobjective.py:75)
- GRAVY: โคโ1 ๋ง์ (์น์), 0โ0.5, โฅ1 0์ (pyrosetta_flow/multiobjective.py:77)
- Boman: <1 ๊ฒฐํฉ๊ฒฝํฅ ์ฝํจ(์ ๋ฐ ์ค์ผ์ผ), 1~4 ์ ํ, >4 ๋ง์ (pyrosetta_flow/multiobjective.py:79-84)
- pI: 6~8 ๋ง์ , ๋ฉ์ด์ง์๋ก ์ ํ ๊ฐ์ (pyrosetta_flow/multiobjective.py:86)
- ๊ฐ์ค: 0.35*II + 0.30*GRAVY + 0.15*Boman + 0.20*pI โ ์์ ์ฑยท์ฉํด๋ฅผ ๋ ์ค์
(pyrosetta_flow/multiobjective.py:88-89). ์๊ณ๊ฐ/๋ฒ์๋ ๋ชจ๋ ๋ฌธํ ํด๋ฆฌ์คํฑ
(pyrosetta_flow/multiobjective.py:57-62).
- ์ด ์ ์๋ cheap_objectives() ์ admet_score ๊ฐ ๋๊ณ (pyrosetta_flow/multiobjective.py:154),
enrich_candidates() ๊ฐ ํ๋ณด์ druggability ํค๋ก ๋งคํ (pyrosetta_flow/multiobjective.py:264-265).
honest disclaimer (VR-cycle-09 / H-06):
half_life_h,admet_score๋ ๋ญํน์ฉ surrogate ์ด๋ฉฐ ์์ ๋ฐ๊ฐ๊ธฐยท์์ ADMET ์์น๊ฐ ์๋๋ค (pyrosetta_flow/multiobjective.py:15-18). in-vitro assay ๊ฒ์ฆ ์์.
1-B. pepADMET GNN ๋ ์ฑ ์ถ๋ก
๋ชจ๋ธ: toxicity_early_stop.pth โ MLR-GAT (RGCN + MLP + Attention), JCIM 2026, 66, 936-946
(pyrosetta_flow/pepadmet_toxicity.py:4-7). 4๊ฐ ๋ฉํฐํ์คํฌ ์ถ๋ ฅ:
binary toxicity / 6-class type / 4-class neurotoxicity / HC50 (pyrosetta_flow/pepadmet_infer_script.py:110-112).
์คํ ๊ฒฉ๋ฆฌ(conda subprocess): bio-tools env ์ runner ๊ฐ pepadmet env(DGL 0.4.3)๋ฅผ subprocess ๋ก ํธ์ถ
(pyrosetta_flow/pepadmet_runner.py:1-5). conda run --no-capture-output -n pepadmet python3 pepadmet_infer_script.py <json>
(pyrosetta_flow/pepadmet_runner.py:77-81), timeout 120s (pyrosetta_flow/pepadmet_runner.py:80).
inline -c ๋์ ํ์ผ ์ง์ ํธ์ถ๋ก ๋ฒํผ๋ง hang ๋ฐฉ์ง (pyrosetta_flow/pepadmet_runner.py:76,
pyrosetta_flow/pepadmet_runner.py:32). stdout ๋ง์ง๋ง JSON ๋ผ์ธ ํ์ฑ (pyrosetta_flow/pepadmet_runner.py:88-92).
๊ทธ๋ํ ๋น๋: SMILES โ RDKit Mol โ DGL ๊ทธ๋ํ (pyrosetta_flow/pepadmet_infer_script.py:74-78,
51-71). SMILES ํ์ฑ ์คํจ ์ ์ ํ ํด๋ฐฑ Chem.MolFromSequence (pyrosetta_flow/pepadmet_infer_script.py:81-102,
131-135) โ ์ด ๊ฒฝ์ฐ graph_note="linear_sequence_fallback" ๊ฐ ๊ธฐ๋ก๋๊ณ
(cyclic/SS bond ๊ตฌ์กฐ ์์ค), descriptor ๋ 2133์ฐจ์ ํ
์(์คํจ ์ zero) (pyrosetta_flow/pepadmet_infer_script.py:23-48).
SMILES ๋ณํ: runner ๊ฐ smiles_converter.sequence_to_smiles() ๋ก Cys3-Cys14 ์ดํฉํ ์ฌ์ดํด๋ฆญ SMILES ์์ฑ
์๋ (pyrosetta_flow/pepadmet_runner.py:61-66, pyrosetta_flow/smiles_converter.py:1-5,
pyrosetta_flow/smiles_converter.py:55-60).
์ถ๋ ฅ ํ: binary_toxicity(sigmoid), is_toxic(>0.5), toxicity_type(6-class argmax),
neurotoxicity_type(4-class argmax), hc50(task_3 ํ๊ท) โ pyrosetta_flow/pepadmet_infer_script.py:151-168.
์ ๊ทํ ๋ ์ด์ด๊ฐ hc50_unit, hc50_reliable ํ๋๊ทธ ๋ถ์ฐฉ (pyrosetta_flow/pepadmet_toxicity.py:40-43).
1-C. hc50 nativeยฑ5 ๋ฐด๋ ๊ฒ์ดํธ (ํต์ฌ)
apply_toxicity_to_extra() ๊ฐ pepADMET ๊ฒฐ๊ณผ๋ฅผ extra_scores ์ ๊ธฐ๋กํ๊ณ admet_score ์ ํ๋ํฐ๋ฅผ ๋ฐ์ํ๋ค
(pyrosetta_flow/multiobjective.py:206-241). ๋ก์ง:
- fail-closed:
available๊ฐ ์๋๋ฉด admet_score ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์(๊ฐ์ง ์์ ํ์ ๊ธ์ง) (pyrosetta_flow/multiobjective.py:217-218). - binary ๋ ๊ธฐ๋ก๋ง, ๊ฒ์ดํธ ๋ฏธ์ฌ์ฉ โ
pepadmet_toxic/binary_toxicity๊ธฐ๋ก๋์ง๋ง ๊ฒ์ดํธ์ ์ฐ์ด์ง ์์ (pyrosetta_flow/multiobjective.py:219-221, ์ฃผ์pyrosetta_flow/multiobjective.py:211-212). - ์ ๋ขฐ๋ ๊ฒ์ดํธ(VR-A2, 2026-06-17):
graph_note == "linear_sequence_fallback"์ด๋ฉด cyclic ๊ตฌ์กฐ ์์ค๋ก hc50 ์ ๋ขฐ ๋ถ๊ฐ โhc50_reliable=False๊ธฐ๋ก ํ ๊ฒ์ดํธ skip(fail-open: ๊ฐ์ง ๋ ์ฑํ์ ๋ฐฉ์ง) (pyrosetta_flow/multiobjective.py:225-230). - native ๋๋น ์๋(home-advantage) ๊ฒ์ดํธ:
- native hc50 ๊ธฐ์ค์ ๋ก๋ (
native_toxicity_baseline.json, hc50 = โ55.6816,_native_hc50_baseline()pyrosetta_flow/multiobjective.py:171-185). -delta = hc50 โ native_hc50(pyrosetta_flow/multiobjective.py:232), >0 ์์ / <0 ๋ ์ฑโ. - native ยฑ5 ๋ฐด๋(_HC50_NATIVE_TOLERANCE = 5.0)๋ "๋๊ธ"์ผ๋ก ๋ฌดํ๋ํฐ (pyrosetta_flow/multiobjective.py:166,pyrosetta_flow/multiobjective.py:234). - ๋ฐด๋ ์ด๊ณผ ๋ ์ฑ์ผ ๋๋ง ์ด๊ณผ๋ถ์ ์ ํ ๋น๋ก ํ๋ํฐ,factor = max(0.4, 1 โ excess/200)(_TOXIC_ADMET_PENALTY=0.4,_HC50_PENALTY_SCALE=200.0) ๋ก admet_score ๊ณฑ์ ๊ฐ์ (pyrosetta_flow/multiobjective.py:163,167,236-241). -hc50_vs_native,more_toxic_than_native๊ธฐ๋ก (pyrosetta_flow/multiobjective.py:233-235).
์ด ๊ฒ์ดํธ ์ฐ์ถ๋ฌผ์ ๊ธ๋ก๋ฒ ๋ฆฌ๋๋ณด๋ ํต๊ณผ ํ์ ์ ์ง์ ์ฐ์ธ๋ค โ
count_passing() ์ ๋
์ฑ์ more_toxic_than_native is False(๋ช
์์ ์ธก์ )๋ง ํต๊ณผ๋ก ์ธ์
(pyrosetta_flow/global_leaderboard.py:167-176, ํ๋ ์ ์ฌ pyrosetta_flow/global_leaderboard.py:104-106).
ํ์ดํ๋ผ์ธ ๋ฐฐ์ ์ scoring_pipeline.py:98-117 (Step 0.5, ๋ฐฐ์น ์ถ๋ก ํ ํ๋ํฐ ๋ฐ์, ์คํจ ์ graceful skip).
โก ์ํฅ โ binary โ hc50 ๊ต์ฒด๋ก "์ฅ์ํ ์ /native ์คํ" ํด๊ฒฐ
๊ฒฝ์(์ ํํ):
- ๋ฌธ์ : pepADMET
is_toxic(binary)๊ฐ ๋น๋ณ๋ณ์ โ ์์ ์์ ํฉํ์ด๋(oxytocin), native SST-14, ๋ฒ๋ (melittin) ์ ์ ๋ถ toxic=True ๋ก ํ์ (baseline note,data/somatostatin_receptor/curated/native_toxicity_baseline.jsonnote; ์ฝ๋ ์ฃผ์pyrosetta_flow/multiobjective.py:164,pyrosetta_flow/multiobjective.py:211). ์ด binary ๊ฒ์ดํธ๊ฐ in-loop ์ ํ์ฑ run ์์ "์ธก์ ํ๋ณด ์ ์ toxic โ admetร0.4 โ full gate ํ๋ฝ" ์ ์์ธ์ด์๋ค(๋ฉ๋ชจ๋ฆฌ sstr2-selectivity-goal ๊ธฐ๋ก). - ๊ด์ฐฐ๋ ๋ณ๋ณ๋ ฅ: ๋์ผ ๋ชจ๋ธ์ hc50 ์ฐ์๊ฐ์ ์๋ฌผํ์ ์ผ๋ก ์ ํํ ์์ โ oxytocin(โ14.5, ์์ ) < native(โ55.7) < melittin(โ292.7, ๋ ์ฑ) (baseline json note ์ ๋์กฐ๊ตฐ ์์น).
- ๊ต์ฒด: ๊ฒ์ดํธ๋ฅผ binary ์์ hc50 โ native_hc50 ์๋(home-advantage) ๋ก ์ ํ
(
pyrosetta_flow/multiobjective.py:211-241). ฮmargin(์ ํ์ฑ) ๊ณผ ๋์ผ ์ฒ ํ โ "native ๋ฅผ ๊ธฐ์ค์ ์ผ๋ก ๋๊ณ ๊ทธ๋ณด๋ค ๋์ ํ๋ณด๋ง ๋ฒ์ ". - ํจ๊ณผ: native ๋๊ธ(ยฑ5) ํ๋ณด๋ is_toxic=True ๋ผ๋ ๋ฌดํ๋ํฐ๊ฐ ๋์ด
(
test_apply_toxicity_native_comparable_no_penaltypyrosetta_flow/tests/test_multiobjective.py:118-126), native ๊ธ ์ฐ์ ํ๋ณด๊ฐ admetร0.4 ๋ก ๋ถ๋น ํ๋ฝํ๋ ๋ฌธ์ ๊ฐ ํด์๋์๋ค(์์ด์ ํธ ๋ญํน ์ ์ํ). ์ฌํ๊ฐ ์ ์ธก์ 8ํ๋ณด ์ค 7๊ฐ๊ฐ "๋ ์ฑโคnative"(๋ฌดํ๋ํฐ)๋ก ์ ์ํ๋จ(๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ก).
์ฃผ์(๋ฏธ๊ฒ์ฆ): ์ oxytocin/native/melittin ๋์กฐ ์์น๋
native_toxicity_baseline.json์ note ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋ก๋ ๊ฐ์ด๋ฉฐ, ๋ณธ ๋ถ์์์ ๋ชจ๋ธ์ ์ฌ์คํํด ์ฌํํ์ง๋ ์์๋ค(์ฝ๊ธฐ ์ ์ฉ). ๋ฐ๋ผ์ "binary ๋น๋ณ๋ณ์ฑ"๊ณผ "hc50 ๋ณ๋ณ๋ ฅ"์ ๊ธฐ๋ก๋ ์ธก์ ๊ฒฐ๊ณผ์ ๊ทผ๊ฑฐํ ์ฃผ์ฅ์ด์ง ๋ณธ ์ธ์ ์์ ์ฌ๊ฒ์ฆ๋ ๊ฒ์ ์๋๋ค.
โข ๊ด๋ จ Action Item
| ํญ๋ชฉ | ๋ด์ฉ | ์ํ/๊ทผ๊ฑฐ |
|---|---|---|
| B (pepADMET ํตํฉ) | pepADMET GNN(toxicity_early_stop.pth)์ pepadmet conda env subprocess ๋ฐฐ์น ์ถ๋ก ์ผ๋ก ๋ค๋ชฉ์ ๋ญํน์ ์ฐ๊ฒฐ | ๊ตฌํ ์๋ฃ. scoring_pipeline.py:98-117(Step 0.5), pyrosetta_flow/multiobjective.py:158-203, runner/infer ์ ์ฒด. ๋ฐฑ์๋ API ๋ merge_pepadmet_into_admet_results ๋ก ์ฐ๊ฒฐ (backend/admet.py:242-276, backend/routers/admet.py:17-21) |
| hc50 ๊ฒ์ดํธ ์์ (2026-06-10) | binaryโhc50 native ์๋ ๊ฒ์ดํธ๋ก ๊ต์ฒด | ์๋ฃ. pyrosetta_flow/multiobjective.py:206-241, baseline json, ํ๊ท ํ
์คํธ ๊ฐฑ์ /์ ์ค (pyrosetta_flow/tests/test_multiobjective.py:93-141) |
| hc50 ์ ๋ขฐ๋ ๊ฒ์ดํธ (VR-A2, 2026-06-17) | SMILES ์ ํ ํด๋ฐฑ(cyclic ์์ค) ์ hc50 ์ ๋ขฐ๋ถ๊ฐ โ ๊ฒ์ดํธ skip | ์๋ฃ. pyrosetta_flow/multiobjective.py:225-230, pyrosetta_flow/pepadmet_toxicity.py:24-43, ํ
์คํธ pyrosetta_flow/tests/test_multiobjective.py:107-115 |
| HC50 ๋จ์ ๋ฉด์ฑ (VR-A2) | hc50 ์ ๋๋จ์ ๋ฏธ๊ฒ์ฆ ๋ช ์, ์๋๋น๊ต ์ ์ฉ ๊ฐ์ | ์๋ฃ(๋ฌธ์ํ). pyrosetta_flow/pepadmet_toxicity.py:24-30, pyrosetta_flow/pepadmet_toxicity.py:40 |
๋จ์ ๊ณผ์ (์ฝ๋ ๊ธฐ์ค ๋ฏธํด๊ฒฐ):
- hc50 ์ ๋ ๋จ์ ๊ฒ์ฆ(ฮผg/mL vs ฮผM, ์๋
ผ๋ฌธ task_3 ํ๊น๊ณผ ๋์กฐ) โ ํ์ฌ ๋ฏธ๊ฒ์ฆ ๋ฉด์ฑ
์ผ๋ก๋ง ํํผ
(pyrosetta_flow/pepadmet_toxicity.py:24-30).
- SMILES ๋ณํ ์ฑ๊ณต๋ฅ โ ์ฌ์ดํด๋ฆญ SMILES ์คํจ ์ ์ ํ ํด๋ฐฑ๋๋ฉด hc50 ๊ฒ์ดํธ๊ฐ ํต์งธ๋ก skip ๋์ด
๋
์ฑ ์ ํธ๊ฐ ์ฌ๋ผ์ง (pyrosetta_flow/multiobjective.py:225-230). ํด๋ฐฑ ๋น๋/์ํฅ์ ๋ฏธ์ธก์ .
โฃ ์์ฑ๋ ํ๊ฐ
์ฝ 75%
๊ทผ๊ฑฐ(๊ฐ์ ):
- ๋ฐ์ดํฐ ํ๋ฆ end-to-end ์ฐ๊ฒฐ๋จ: cheap_objectives โ enrich โ pepADMET ์ถ๋ก โ hc50 ๊ฒ์ดํธ โ
๋ฆฌ๋๋ณด๋ ํต๊ณผ ํ์ (pyrosetta_flow/multiobjective.py:101-266, scoring_pipeline.py:98-117,
global_leaderboard.py:167-176).
- ๊ฒฌ๊ณ ํ ์คํจ ์ฒ๋ฆฌ: import/subprocess/timeout/JSON ํ์ฑ ๋ชจ๋ graceful, fail-closed(๊ฐ์ง ์์ ) vs
fail-open(์ ๋ขฐ๋ถ๊ฐ hc50) ๊ตฌ๋ถ ๋ช
ํ (pyrosetta_flow/pepadmet_runner.py:54-99,
pyrosetta_flow/multiobjective.py:217-230).
- ํ๊ท ํ
์คํธ 5์ข
์ด ๊ฒ์ดํธ ๋ถ๊ธฐ๋ฅผ ๋ชจ๋ ์ปค๋ฒ(ํ๋ํฐ/ํด๋ฐฑ skip/๋๊ธ ๋ฌดํ๋ํฐ/๋น๋
์ฑ/unavailable)
(pyrosetta_flow/tests/test_multiobjective.py:93-141).
- ์ ์ง์ฑ ๋ฉ์ปค๋์ฆ: surrogate disclaimer, ๋จ์ ๋ฉด์ฑ
, home-advantage ๋ณด์ .
๊ฐ์ :
- hc50 ์ ๋ ๋จ์ ๋ฏธ๊ฒ์ฆ(โ), ์๋๋น๊ต๋ก๋ง ์ฐํ (pyrosetta_flow/pepadmet_toxicity.py:24-30).
- ์ ํ ํด๋ฐฑ ์ ๋
์ฑ ๊ฒ์ดํธ ํต์งธ skip โ cyclic ํฉํ์ด๋์ธ๋ฐ SMILES ๋ณํ์ด ์์ฃผ ์คํจํ๋ฉด
๋
์ฑ ํ๊ฐ๊ฐ ๋ฌด๋ ฅํ๋ ์ ์์(๋น๋ ๋ฏธ์ธก์ ) (pyrosetta_flow/multiobjective.py:225-230).
- binary/type/neurotoxicity ์ถ๋ ฅ์ ๊ธฐ๋ก๋ง ๋๊ณ ๊ฒ์ดํธ์ ๋ฏธ๋ฐ์ โ 4๊ฐ ๋ฉํฐํ์คํฌ ์ค 1๊ฐ(hc50)๋ง ์์ฌ๊ฒฐ์ ์ ์ฌ์ฉ
(pyrosetta_flow/multiobjective.py:219-221).
- backend/admet.py ์ ์ฅ๋
์ฑ ์ ์์ ๊ณ์(20/15)๋ ๋จ์ผ ๋ ํผ๋ฐ์ค(DOTATATE) ์ธ ๋ณด์ ๊ทผ๊ฑฐ ๋ถ์ฌ
(backend/admet.py:188).
โค ํ์ ์ ๊ฐ์น
- home-advantage ์๋ ๊ฒ์ดํธ: ์ ๋๊ฐ์ด ๋น๋ณ๋ณ/๋ฏธ๊ฒ์ฆ์ธ ๋ชจ๋ธ ์ถ๋ ฅ์ ํ๊ธฐํ์ง ์๊ณ
"native ๊ธฐ์ค์ ๋๋น ฮ" ๋ก ์ฌ๊ตฌ์ฑํด ๋ณ๋ณ๋ ฅ์ ํ๋ณตํ ์ค๊ณ๋ ์ผ๋ฐํ ๊ฐ์น๊ฐ ์๋ค โ ์ ํ์ฑ ฮmargin ๊ณผ
๋์ผ ํจํด์ผ๋ก ๋์นญ(
pyrosetta_flow/multiobjective.py:211-214). - ๋ค์ค ์ ๋ขฐ ๊ฒ์ดํธ: available(fail-closed) โ graph_note(fail-open) โ native-band ์ 3์ธต ๊ฒ์ดํธ๋ก
"ํ๊ฐ๋ ์์ /๋
์ฑ ํ์ "์ ์๋ฐฉํฅ ์ฐจ๋จ (
pyrosetta_flow/multiobjective.py:217-241). - ์ ์งํ ํ๊ณ ๋
ธ์ถ: surrogate disclaimer ์ ๋จ์ ๋ฉด์ฑ
์ ์ฝ๋ ์ฃผ์์ผ๋ก ๋ช
๋ฌธํ โ ์ฌํ์ฑยท์ ๋ขฐ์ฑ ๋ณด๊ณ ์ ๋ชจ๋ฒ
(
pyrosetta_flow/multiobjective.py:15-18,pyrosetta_flow/pepadmet_toxicity.py:24-30). - ํ๊ณ: ๋จ์ผ ๋ชจ๋ธ(pepADMET) ์์กด, ์ ๋ ๋จ์ ๋ฏธ๊ฒ์ฆ, in-vitro/in-vivo cross-validation ๋ถ์ฌ โ ํ์ฌ๋ก์ ๋ญํน ๋ณด์กฐ ์ ํธ๋ก์์ ๊ฐ์น์ด์ง ์์ ์์ธก ๊ฐ์น๋ ์ฃผ์ฅ ๋ถ๊ฐ.
โฅ ์ฌ์ฉ๋ฒ
๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ค๋ชฉ์ ํ์ดํ๋ผ์ธ ๋ด๋ถ) โ ์๋ ํธ์ถ๋จ:
from pyrosetta_flow.multiobjective import (
cheap_objectives, enrich_candidates,
predict_toxicity_for_sequences, apply_toxicity_to_extra,
)
enrich_candidates(candidates) # admet_score/druggability ์ฑ์
tox = predict_toxicity_for_sequences([seq]) # pepADMET ๋ฐฐ์น ์ถ๋ก
apply_toxicity_to_extra(cand["extra_scores"], tox[seq]) # hc50 ๊ฒ์ดํธ ์ ์ฉ
(pyrosetta_flow/multiobjective.py:188-241)
๋จ๊ฑด ๋ ์ฑ ์์ธก:
from pyrosetta_flow.pepadmet_toxicity import predict_toxicity
r = predict_toxicity("AGCKNFFWKTFTSC") # smiles ์๋ต ์ ์๋ ๋ณํ
(pyrosetta_flow/pepadmet_toxicity.py:59-80)
๋ฐฑ์๋ REST API:
- GET /admet/{sequence} โ ๋ฌผ์ฑ+์ ์ฅ๋
์ฑ+pepADMET ๋ณํฉ (backend/routers/admet.py:24-26)
- POST /admet/batch โ ๋ฐฐ์น (backend/routers/admet.py:29-30)
ํ๊ฒฝ ๋ณ์:
- SKIP_PEPADMET=1 โ pepADMET ํธ์ถ ์๋ต(ํ
์คํธ/๋น ๋ฅธ ์๋ต) (backend/admet.py:250-251)
- PEPADMET_REPO โ pepADMET repo ๊ฒฝ๋ก ์ค๋ฒ๋ผ์ด๋ (pyrosetta_flow/pepadmet_runner.py:26-30)
ํ์ ์ ์ : pepadmet conda env + local_models/pepadmet/repo + model/toxicity_early_stop.pth
์กด์ฌ (pyrosetta_flow/pepadmet_runner.py:19-23, pyrosetta_flow/pepadmet_infer_script.py:105).
๋ฏธ์กด์ฌ ์ available=False ๋ก graceful skip.
โฆ ํ์ ์ด์
- ์ ํ์ฑ๋ง์ผ๋ก๋ ๋ถ์กฑ: SSTR2 ์ ํ์ฑ์ด ์ฐ์ํด๋ ๋
์ฑยท์งง์ ๋ฐ๊ฐ๊ธฐยท๋ฎ์ ์ฉํด ํ๋ณด๋ ์ฝ๋ฌผ์ด ๋ ์ ์๋ค.
ADMET surrogate(
admet_score)์ pepADMET ๋ ์ฑ์ด ๋ค๋ชฉ์ ๊ฒ์ดํธ์ ์ผ๋ถ๋ก ์์ ์ฑยท์ฝ๋ฌผ์ ์ฌ์ฑ์ ๋ญํน์ ์ฃผ์ ํ๋ค (pyrosetta_flow/multiobjective.py:1-9, ObjectiveWeights.admet=0.15pyrosetta_flow/multiobjective.py:278). - ๋ฐฉ์ฌ์ฑ์์ฝํ(PRRT) ํน์ด ์ํ: ์ ์ฅ ์ฌํก์์ ์ํ ์ ์ฅ๋
์ฑ์ PRRT ์ ์ฉ๋ ์ ํ ๋
์ฑ โ
cationic ํจ๋ ๊ธฐ๋ฐ ์ํ ์ ์๊ฐ ์ด๋ฅผ ์กฐ๊ธฐ ๊ฒฝ๊ณ (
backend/admet.py:150-217). - ํ๊ฐ/์คํ ์ฐจ๋จ: binary ๋น๋ณ๋ณ์ฑ์ผ๋ก ์ธํ native/oxytocin ์คํ์ด ์ฐ์ ํ๋ณด๋ฅผ ๋ถ๋น ํ๋ฝ์ํค๋ ๋ฌธ์ ๋ฅผ
hc50 home-advantage ๊ฒ์ดํธ๊ฐ ๊ต์ ํด, ์์ด์ ํธ์ ์์จ ๋ญํน์ด ์ ์ ์๋ํ๋๋ก ํ๋ค
(ยงโก ์ฐธ์กฐ,
pyrosetta_flow/multiobjective.py:206-241).
๊ฒ์ฆ ์ธ์ฉ ๋ชฉ๋ก
- ๋์ ํ์ธ(์ง์ ์ฝ๋):
pyrosetta_flow/multiobjective.py:64-90โ admet_reasonableness ๊ฐ์ค/์๊ณ๊ฐpyrosetta_flow/multiobjective.py:101-155โ cheap_objectives, PharmaProperties, SS bond pI ์ฒ๋ฆฌpyrosetta_flow/multiobjective.py:163-185โ ํ๋ํฐ ์์, native_hc50 ๊ธฐ์ค์ ๋ก๋pyrosetta_flow/multiobjective.py:206-241โ apply_toxicity_to_extra (binary ๋ฏธ์ฌ์ฉยทhc50 ๊ฒ์ดํธยท์ ๋ขฐ๋ skip)pyrosetta_flow/pepadmet_runner.py:54-99โ subprocess/conda ํธ์ถ, ์คํจ ์ฒ๋ฆฌpyrosetta_flow/pepadmet_infer_script.py:105-170โ MGA ๋ชจ๋ธ ๋ก๋, 4ํ์คํฌ ์ถ๋ ฅ, ์ ํ ํด๋ฐฑpyrosetta_flow/pepadmet_toxicity.py:22-56โ ์ ๊ทํ, hc50_unit/hc50_reliablebackend/admet.py:54-228โ ๋ฌผ์ฑ/์ฝ๋ฌผ์ ์ฌ์ฑ/์ ์ฅ๋ ์ฑ ๊ณ์ฐbackend/admet.py:242-276,backend/routers/admet.py:13-30โ pepADMET ๋ณํฉยทRESTpyrosetta_flow/global_leaderboard.py:104-106,167-176โ ๋ ์ฑ ํต๊ณผ ํ์ ํ๋/๋ก์งpyrosetta_flow/scoring_pipeline.py:98-117โ ํ์ดํ๋ผ์ธ Step 0.5 ๋ฐฐ์data/somatostatin_receptor/curated/native_toxicity_baseline.jsonโ hc50=โ55.6816, ๋์กฐ๊ตฐ note-
ํ ์คํธ:
pyrosetta_flow/tests/test_multiobjective.py:39-141,pyrosetta_flow/tests/test_continuous_discovery.py:28-45 -
๋ฏธ๊ฒ์ฆ / ์ธก์ ๋ฏธ์ฌํ(์ฝ๊ธฐ ์ ์ฉ ํ๊ณ):
- HC50 ์ ๋ ๋จ์(ฮผg/mL vs ฮผM) โ ์๋
ผ๋ฌธ ๋๋น ๋ฏธ๊ฒ์ฆ, ์๋๋น๊ต ์ ์ฉ (
pyrosetta_flow/pepadmet_toxicity.py:24-30,40) - oxytocin(โ14.5)/native(โ55.7)/melittin(โ292.7) ๋์กฐ ์์น โ baseline json noteยท๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ก ๊ทผ๊ฑฐ, ๋ณธ ์ธ์ ๋ชจ๋ธ ์ฌ์คํ ๋ฏธ์ํ
- "binary ์ ์ toxic" ๋น๋ณ๋ณ์ฑ โ ๊ธฐ๋ก๋ ์ธก์ ๊ฒฐ๊ณผ ๊ทผ๊ฑฐ, ๋ณธ ์ธ์ ์ฌํ ์ ํจ
- SMILES ์ฌ์ดํด๋ฆญ ๋ณํ ์ฑ๊ณต๋ฅ / ์ ํ ํด๋ฐฑ ๋ฐ์ ๋น๋ โ ๋ฏธ์ธก์
- admet_reasonableness ์๊ณ๊ฐยท๊ฐ์ค(0.35/0.30/0.15/0.20), ์ ์ฅ๋ ์ฑ ๊ณ์(20/15) ์ ๋ฌธํ ์ ๋ ๋ณด์ ๊ทผ๊ฑฐ โ ์ฝ๋ ์ฃผ์์ ํด๋ฆฌ์คํฑ ํ๊ธฐ ์ธ ์ธ๋ถ ๊ฒ์ฆ ๋ฏธํ์ธ