๊ธฐ๋ฅ ์์ธ ๋ณด๊ณ
๋ค์์ฑ ๊ด๋ฆฌ + ํด๋ฌ์คํฐ๋ง (A~E tier) โ ๊ธฐ๋ฅ ๋ถ์
๋ถ์ ๋ฃจํธ:
AgenticAI4SCIENCE_pyrosetta_track/repos/ai4sci-kaeri๋์ ํ์ผ: -pyrosetta_flow/cluster_report.py(A~E tier ๋ถ๋ฅ, ๊ฒฐ์ ๋ก ์ ) -AG_src/agents/diversity_manager.py(๊ตฌ์กฐ/์์ด ๋ค์์ฑ ๊ด๋ฆฌ ์์ด์ ํธ) -AG_src/tools/mcp/foldmason_server.py(FoldMason CLI MCP ๋ํผ) -AG_src/pipeline/step07_analysis.py(FoldMason ์คํธ์ถ ๊ฒฝ๋ก) - ํธ์ถ๋ถ:pyrosetta_flow/runner.py,AG_src/pipeline/orchestrator.py,run_pipeline_live.py,backend/routers/cluster.py๋ชจ๋ ์์นยท๋์์ ์์ค ์ง๋ ์ธ์ฉ. ๋ฏธํ์ธ ํญ๋ชฉ์ "๋ฏธ๊ฒ์ฆ" ๋ช ์.
์ค์: ๋ณธ ๋ถ์์ ์๋ก ๋ค๋ฅธ ๋ ์์คํ
์ ๋ค๋ฃฌ๋ค.
1. A~E tier ๋ถ๋ฅ (cluster_report.py) โ ์ฝ๋ฆฌ/๊ตฌ์กฐ ์์น ์๊ณ๊ฐ ๊ธฐ๋ฐ ๊ฒฐ์ ๋ก ์ 5๋ถ๋ฅ.
2. ๋ค์์ฑ ๊ด๋ฆฌ ํด๋ฌ์คํฐ๋ง (diversity_manager.py) โ ์ ์ฌ ํ๋ณด ๊ทธ๋ฃนํยท์ค๋ณต ์ ๊ฑฐ.
์ด๋ฆ์ ๋ ๋ค "cluster"์ด์ง๋ง ๋ชฉ์ ยท์๊ณ ๋ฆฌ์ฆยทtier ์๋ฏธ๊ฐ ์ ํ ๋ค๋ฅด๋ค (โข ์ฐธ์กฐ).
โ ๋์ ์๋ฆฌ
1.1 A~E tier ๋ถ๋ฅ (cluster_report.py)
ํ๋ณด 1๊ฑด์ ์ฝ๋ฆฌ/๊ตฌ์กฐ ์์น ์๊ณ๊ฐ์ผ๋ก ์ฐ์ ์์ A > B > C > D > E ๋จ์ผ ๋ฐฐ์ ํ๋ค
(cluster_report.py:24-25, classify_cluster() :252-336). ์ธ๋ถ ์์กด ์๋ ์์ ํจ์.
tier ์ ์ (cluster_report.py:9-22 docstring + ์ค์ criteria ํจ์):
- A โ High Affinity Core (
_criteria_a:159-188):ddG โค -8.0ANDclash_score โค 5.0ANDpLDDT โฅ 75AND FWKT ์ ์ด ์ ์ง. - pLDDT๋ ์ต์
์ฒ๋ฆฌ: None/0/NaN(ESMFold ๋ฏธ๊ฐ๋ PyRosetta-only ๋ชจ๋)์ด๋ฉด
ํด๋น ๊ธฐ์ค์ True๋ก ์คํต(
:177-179) โ ๋๋จธ์ง 3๊ธฐ์ค์ผ๋ก A ์๊ฒฉ ๋ถ์ฌ. - FWKT ํ์ :
structural_rules.rules.fwkt_pharmacophore.pass๋ถ๋ฆฌ์ธ(_fwkt_contact_maintained:70-87). - B โ Selectivity-Optimised (
_criteria_b:191-206):selectivity_margin โฅ 3.0ANDddG < -5.0("SSTR2 binding present"๋ก operationalize,:201). - C โ Stability-Enhanced (
_criteria_c:209-226):instability_index < 30ANDBLOSUM62 total โฅ 0ANDprotease_sites โค 9(SST-14 native baseline_SST14_PROTEASE_BASELINE=9,:56,:220). - D โ Radiochemistry-Optimal (
_criteria_d:229-246):GRAVY โ [-1.0, +0.5]AND|net_charge_ph74| โค 1.0AND chelator site ๊ฐ์ฉ. - chelator ํ์ (
_chelator_site_from_candidate:125-153): sequence ์ฐ์ โ N-๋ง๋จ non-Pro(ฮฑ-NHโ) ๋๋ Lys ์กด์ฌ(ฮต-NHโ)์ด๋ฉด True. sequence ์์ ๋๋งmetal_coordination.n_strong โฅ 1fallback. - ์ด๋ P2-1 ์์ (
:133-141): ๊ธฐ์กด n_strong ๋ก์ง์ด SS-bond Cys thiol์ chelation ๋ถ์๋ก ๊ณผ๋ํ๊ฐํ๋ ๋ฒ๊ทธ๋ฅผ ์ฝ๋ฆฌํ ๊ธฐ์ค(Krenning 1992; de Jong 2002; Maecke 2005)์ผ๋ก ๊ต์ฒด. - E โ Exploratory (
:325-336): A~D ๋ฏธ์ถฉ์กฑ ์ ๋ถ.
๋ฐฐ์น ๋ถ๋ฅ batch_classify() (:339-381): ํ๋ณด๋ณ ๋ถ๋ฅ + tier๋ณ ๋ถํฌ ์นด์ดํธ/ํผ์ผํธ
+ tierโ์๋ณ์ ๊ทธ๋ฃน๋งต ๋ฐํ. ์๋ณ์๋ nameโsequenceโcandidate_{idx} ์(:360).
๊ฐ criteria ํจ์๋ ๊ฐ๋ณ ๋ถ๋ฆฌ์ธ dict๋ฅผ ๋ฐํํ๊ณ all(...) ์ผ๋ก ํต๊ณผ ํ์ โ ์ฆ
์ด๋ ํญ๋ชฉ์ด ์ ๋จ์ด์ก๋์ง ์ถ์ ๊ฐ๋ฅ(criteria_met ํ๋, :277,:290 ๋ฑ).
1.2 ๋ค์์ฑ ๊ด๋ฆฌ (diversity_manager.py โ DiversityManagerAgent)
QC ๊ฒ์ดํธ ํต๊ณผ ํ๋ณด๊ฐ ์ถฉ๋ถํ ๋ค์ํ ๊ตฌ์กฐ ๊ณต๊ฐ์ ์ฐจ์งํ๋์ง ๋ณด์ฅํ๊ณ ์ ์ฌ ํ๋ณด ์ค๋ณต์
์ ๊ฑฐํ๋ค(:1-11, :72-96). ํตํฉ ์์น: QC apply_gates() ์ดํ โ ์ต์ข
ranking ์ด์ (:10,:85).
4๊ฐ ๊ณต๊ฐ ๋ฉ์๋:
cluster_candidates()(:122-157): ํ๋ณด๋ฅผ ์ ์ฌ๋ ๊ธฐ๋ฐ ๊ทธ๋ฃนํ.method="foldmason"ANDtool_fn์ฃผ์ ๋จ โ_cluster_by_foldmason()(lDDT ํ๋ ฌ greedy).method="hybrid"AND tool_fn โ_cluster_hybrid().- ๊ทธ ์ธ(๋๋ tool_fn ์์) โ
_cluster_by_sequence()์์ด greedy fallback, ์ด๋ ๊ฒฝ๊ณ ๋ก๊ทธ "FoldMason tool ๋ฏธ๋ฑ๋ก - ์์ด ๊ธฐ๋ฐ ๊ทผ์ฌโฆ"(:151-152). select_diverse_set(clusters, n)(:159-208): โ ๊ฐ ํด๋ฌ์คํฐ ๋ํ 1๊ฐ์ฉ ์ ํ โ โก๋ถ์กฑํ๋ฉด ํฐ ํด๋ฌ์คํฐ 2๋ฒ์งธ ๋ฉค๋ฒ ์ถ๊ฐ โ โขfinal_score๋ด๋ฆผ์ฐจ์ ๋ฐํ.compute_diversity_score()(:210-250): ๋ชจ๋ ํ๋ณด์ lDDT ์ฑ์์ก์ผ๋ฉดdiversity = 1 - mean_lDDT(:229-234), ์๋๋ฉด ํ๊ท ์์ด๋์ผ์ฑ ๊ธฐ๋ฐdiversity = 1 - mean_identity(:236-250). 1์ ๊ฐ๊น์ธ์๋ก ๋ค์.flag_redundant()(:252-291): final_score ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ณด์กด, ์์ด๋์ผ์ฑ โฅ threshold(๊ธฐ๋ณธ 0.8,:100)์ธ ๋ฎ์ ์ ์ ์ชฝ์ ์ค๋ณต ํ์.
greedy ํด๋ฌ์คํฐ๋ง ๊ณตํต ํจํด(_cluster_by_sequence :382-419,
_cluster_by_foldmason :421-490): final_score ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ โ ๊ณ ๋์ seed๊ฐ ๋ํ โ
๋ฏธ๋ฐฐ์ ํ๋ณด ์ค ์ ์ฌ๋ โฅ threshold๋ฉด ๊ฐ์ ํด๋ฌ์คํฐ์ ํก์. ๊ฒฐ๊ณผ๋ ํฌ๊ธฐ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ(:155).
์์ด๋์ผ์ฑ์ ์ ๋ ฌ ์๋ ์์น๋ณ ๋จ์ ๋น๊ต(_sequence_identity :507-521):
์งง์ ์ชฝ ๊ธฐ์ค ๋งค์นญ / ๊ธด ์ชฝ ๊ธธ์ด โ ๊ธธ์ด์ฐจ ํจ๋ํฐ ํฌํจ. (์ ๋ ฌ ๋ฏธ์ํ์ ํ๊ณ, โค ์ฐธ์กฐ.)
1.3 FoldMason ๊ตฌ์กฐ ํด๋ฌ์คํฐ๋ง โ ์ค์ ํธ์ถ ์ฌ๋ถ
ํต์ฌ ํ์ธ ๊ฒฐ๊ณผ: FoldMason ๋ฐ์ด๋๋ฆฌ ๋ํผ๋ 2๊ณณ์ ์กด์ฌํ๋, DiversityManager ๊ฒฝ๋ก์์๋
์คํธ์ถ๋์ง ์๋๋ค.
foldmason_server.py(MCP ๋ํผ):easy_msa/compute_lddt/refine_msa/cluster_structures4ํด์subprocess.run([foldmason, โฆ])๋ก ์ค์ CLI ํธ์ถํ๋๋ก ์ ์(:47-69,:265-401). ๋จ docstring์ด_compute_lddt/_refine_msa/_cluster_structures๋ฅผ "IMPLEMENTATION SKELETON"์ผ๋ก ๋ช ์(:314,:342,:365) โ ์คํ์ฑ์ ๋ฏธ๊ฒ์ฆ. ํ์ผ ์๋จ๋ "This is an interface definition"(:11).step07_analysis.py:run_foldmason_alignment()(:186-254):conda run -n <env> foldmason easy-msa โฆ --alignment-type 3Di+AA๋ฅผ ์ค์ subprocess ํธ์ถ(:212-223). ์คํจ ์ placeholder lDDT(0.0/1.0)๋ก fallback(:236-237,:247-254). ์ด ๊ฒฐ๊ณผ๋ orchestrator์์Candidate.lddt๋ก ํ๋ฌ๋ค์ด๊ฐ(orchestrator.py:1096).- ๊ทธ๋ฌ๋
DiversityManagerAgent์tool_fn(=run_foldmason ์ฝ๋ฌ๋ธ)์ ์ด๋ค ํธ์ถ๋ถ์์๋ ์ฃผ์ ๋์ง ์๋๋ค. ์ ํธ์ถ ์ง์ : run_pipeline_live.py:1020DiversityManagerAgent(llm_provider=llm)โ tool_fn ์์.AG_src/pipeline/orchestrator.py:851๋์ผ โ tool_fn ์์.runs/run_live_demo.py:747๋์ผ โ tool_fn ์์. โ ๋ฐ๋ผ์method="foldmason"์ ์ง์ ํด๋(run_pipeline_live.py:1021) ํญ์_cluster_by_sequence()์์ด fallback์ผ๋ก ๋ถ๊ธฐ(diversity_manager.py:145-153).- ์ถ๊ฐ๋ก ํ๊ฒฝ์
foldmason๋ฐ์ด๋๋ฆฌ ์์ฒด๊ฐ PATH์ ์์(๋ณธ ๋ถ์ ์์ which foldmasonโ NOT FOUND).foldmason_server.py:44๋ ๋ฏธ๋ฐ๊ฒฌ ์ ๋ฌธ์์ด"foldmason"๋ก ํด๋ฐฑ.
์ฆ ํ์ฌ ์ด์ ๋ค์์ฑ ํด๋ฌ์คํฐ๋ง์ 100% ์์ด ๊ธฐ๋ฐ์ด๋ฉฐ, ๊ตฌ์กฐ(3Di/lDDT) ํด๋ฌ์คํฐ๋ง์ ์ฝ๋์ ๊ฐ๋ฅํ๋ ๋นํ์ฑ ์ํ๋ค(๋ฏธ๊ฒ์ฆ: foldmason ์ค์น๋ ๋ณ๋ ํ๊ฒฝ ์กด์ฌ ์ฌ๋ถ).
1.4 ํ์ดํ๋ผ์ธ ํตํฉ ํ๋ฆ
- PyRosetta runner(A~E tier):
runner.py:1163-1188โ pharma enrich ํ_batch_classify(cluster_input)ํธ์ถ, ๊ฒฐ๊ณผ๋ฅผ candidate manifestentry["cluster"]์ ๋ถ์ฐฉ._HAS_CLUSTER and _HAS_PHARMA๋์ ๊ฐ์ฉ ์์๋ง(:1163), ์คํจ๋ best-effort ํก์(:1187-1188). - AG ์์ด์ ํธ ํ์ดํ๋ผ์ธ(๋ค์์ฑ):
orchestrator.py:626-644โ Step05b ์ ํ์ฑ ์ดํ_invoke_agent("diversity_manager", {docking_results})โ_adapt_agent_context๊ฐdocking_resultsโcandidates๋ก ๋ณํ(:96-105),n_select=configdiversity_top_n(๊ธฐ๋ณธ 20). ๊ฒฐ๊ณผdiverse_candidatesโselected_seq_ids์ญ๋งคํ(:1045-1054)์ผ๋ก ํ๋ณด ์ถ์. - ๋ฐฑ์๋ API:
backend/routers/cluster.py:7-27POST /cluster/classifyโbatch_classify์ง์ ๋ ธ์ถ, ๋ชจ๋ ๋ถ์ฌ ์ 503.
โก ์ํฅ
- Local optimum ํํผ: ๋ค์์ฑ ๊ด๋ฆฌ๊ฐ ์ ์ฌ ์์ด์ ํ ํด๋ฌ์คํฐ๋ก ๋ฌถ๊ณ ๋ํ๋ง ๋จ๊ฒจ
(
select_diverse_set), ์คํ ์ฌ๋กฏ์ด ๊ฑฐ์ ๋์ผํ ํ๋ณด๋ก ์ฑ์์ง๋ ๊ฒ์ ๋ฐฉ์งํ๋ค. greedy seed๊ฐ final_score ์ต์์๋ผ "์ข์ผ๋ฉด์๋ ์๋ก ๋ค๋ฅธ" ์งํฉ์ ์งํฅ. - ๋จ ๊ตฌ์กฐ ๋ค์์ฑ์ด ์๋ ์์ด ๋ค์์ฑ๋ง ์คํจ(โขยท1.3) โ ๋์ผ ์์ด์ ์๋ก ๋ค๋ฅธ backbone/conformer๋ ๋ค์ํ๋ค๊ณ ์ธ์ํ์ง ๋ชปํจ. local optimum ํํผ๋ ฅ์ ์ ํ์ .
- ํ๋ณด ๋ถ๋ฅ(triage): A~E tier๊ฐ ํ๋ณด๋ฅผ ์ฝ๋ฆฌ/๋ชฉ์ ๋ณ๋ก ๋ฌถ์ด ๋ค์ด์คํธ๋ฆผ ์ฐ์ ์์์
๋์๋ณด๋ ํ์(
runner.py:1190-1209์ดํ enrichment)์ ์ฌ์ฉ. A=์นํ๋, B=์ ํ์ฑ, C=์์ ์ฑ, D=๋ฐฉ์ฌํํ, E=ํ์์ผ๋ก ์์ฌ๊ฒฐ์ ์๊ฐ ํ๋ณด ์ฑ๊ฒฉ์ ์ฆ์ ํ์ . - ์ค๋ณต ์ ๊ฑฐ ํจ์จ:
flag_redundant๊ฐ ๋์ผ/์ ์ฌ ํ๋ณด ์ค ์ ์ ์ ์ธก์ ์ ๊ฑฐํด ๋ํน/์ ๋ฐํ ๋น์ฉ ์ ๊ฐ(diversity_manager.py:252-291).
โข ๊ด๋ จ Action Item
๋ช
์์ ์ผ๋ก ๋ฑ๋ก๋ Action Item(_workspace ๋ด AI-/R๋ฒํธ ๋ฑ)๊ณผ ๋ณธ ๊ธฐ๋ฅ์ ์ง์ ์ฐ๊ฒฐํ๋
๋ฌธ์๋ ๊ฒ์ ๊ฒฐ๊ณผ ๋ฐ๊ฒฌ๋์ง ์์(_workspace/CONTINUOUS_DISCOVERY.md์ divers/cluster/
foldmason ๊ด๋ จ Action Item grep โ ๊ฒฐ๊ณผ ์์). ๋ฐ๋ผ์ ์ง์ ๋ฌด๊ด์ผ๋ก ํ์ ํ๋,
์๋ ์ฝ๋ ์์ฒด์์ ๋๋ฌ๋ ๊ฐญ(์ ์ฌ Action Item ํ๋ณด)์ ๊ธฐ๋กํ๋ค:
- (์ ์ฌ) FoldMason tool_fn ๋ฏธ์ฃผ์
โ
method="foldmason"์ง์ ์๋ ํญ์ ์์ด fallback (1.3). ๊ตฌ์กฐ ํด๋ฌ์คํฐ๋ง์ ์ค์ ๋ก ์ฐ๋ ค๋ฉด ํธ์ถ๋ถ์์tool_fn=run_foldmason_alignment๋ฑ์ ์ฃผ์ ํด์ผ ํจ. ํ์ฌ ๋ฏธ์ฐ๊ฒฐ. - (์ ์ฌ) ๋ "cluster" ๊ฐ๋
ํผ๋ ์ํ โ
cluster_report(A~E tier)์diversity_manager(๊ตฌ์กฐ ๊ทธ๋ฃน)๋ ๋ณ๊ฐ์ธ๋ฐ ์ด๋ฆยท๋์๋ณด๋ ๋ผ๋ฒจ์ด ๋ชจ๋ "Cluster" (backend/routers/pipelines.py:59step07="Cluster",agents.py:44diversity= "foldmason ํด๋ฌ์คํฐ๋ง"). ๋ฌธ์/๋ค์ด๋ฐ ๋ถ๋ฆฌ ๊ถ์ฅ. - (์ ์ฌ) foldmason_server skeleton โ
_compute_lddt/_cluster_structuresํ์ฑ์ด skeleton ํ๊ธฐ(1.3). ์ค TSV ํฌ๋งท ๊ฒ์ฆ ํ์.
โฃ ์์ฑ๋ % + ๊ทผ๊ฑฐ
| ๊ตฌ์ฑ์์ | ์์ฑ๋ | ๊ทผ๊ฑฐ |
|---|---|---|
A~E tier ๋ถ๋ฅ (cluster_report.py) |
~95% | 5 criteria ์ ๋ถ ๊ตฌํ, P2-1 chelator ๋ฒ๊ทธ ์์ ๋ฐ์, ๊ฒฐ์ ๋ก ์ , runnerยทAPIยทํ
์คํธ(65๊ฐ test, test_cluster_report.py) ์ฐ๊ฒฐ. ์์ฌ: pLDDT ์คํตยทddG operationalize ๋ฑ ๊ธฐ์ค์ด spec ๊ทผ์ฌ. |
| ๋ค์์ฑ ๊ด๋ฆฌ โ ์์ด ๊ฒฝ๋ก | ~85% | cluster/select/score/redundant 4๋ฉ์๋ + execute ์๋น, orchestratorยทlive ์ฐ๊ฒฐ. ์์ฌ: ์์ด๋์ผ์ฑ์ด ์ ๋ ฌ ์๋ ์์น ๋น๊ต(:511)๋ผ indel์ ์ทจ์ฝ. |
| ๋ค์์ฑ ๊ด๋ฆฌ โ FoldMason ๊ตฌ์กฐ ๊ฒฝ๋ก | ~40% | _cluster_by_foldmason ๋ก์ง ์กด์ฌํ๋ tool_fn ๋ฏธ์ฃผ์
์ผ๋ก ๋นํ์ฑ, ๋ฐ์ด๋๋ฆฌ PATH ๋ถ์ฌ(1.3). ์ฝ๋๋ ์์ผ๋ ์ด์ ๋ฏธ๊ฐ๋. |
| FoldMason MCP ๋ํผ | ~60% | easy_msa ์คํธ์ถ ๊ตฌํ, ๊ทธ๋ฌ๋ lddt/cluster ํธ๋ค๋ฌ "skeleton" ํ๊ธฐ(foldmason_server.py:314๋ฑ), ์ถ๋ ฅ ํ์ฑ ๋ฏธ๊ฒ์ฆ. |
| step07 FoldMason ์ ๋ ฌ | ~80% | ์ค subprocess + ์คํจ fallback ๊ตฌํ(step07_analysis.py:212-254), lddt JSON ํ์ฑ์ sidecar ์กด์ฌ ๊ฐ์ . |
์ข ํฉ: A~E tier๋ ์ด์๊ธ, ๋ค์์ฑ ๊ด๋ฆฌ๋ ์์ด ๋ชจ๋ ํ์ ์ด์๊ธ, ๊ตฌ์กฐ ํด๋ฌ์คํฐ๋ง์ ๋ฏธ๊ฐ๋.
โค ํ์ ๊ฐ์น
- A~E tier: ๋ฐฉ์ฌ์ฑ์์ฝํ ํ๋ณด๋ฅผ ์ฝ๋ฆฌ ๋ชฉ์ (์นํ๋/์ ํ์ฑ/์์ ์ฑ/๋ฐฉ์ฌํํ/ํ์)์ผ๋ก
๋ถ๋ฅํ๋ ๊ฒฐ์ ๋ก ์ triage๋ ๋ค๋ชฉ์ ์ต์ ํ ํ๋ณด ํด์์ ์ ์ฉ. chelator ํ์ ์ ์ฝ๋ฆฌํ์
๊ต์ (SS-bond Cys ์ ์ธ, N-term/Lys ๊ธฐ๋ฐ,
:142๋ฌธํ ์ธ์ฉ)์ ๋ฐฉ๋ฒ๋ก ์ ์ผ๋ก ์ ์ง. - ๋ค์์ฑ ๊ด๋ฆฌ: ๊ตฌ์กฐ ๊ธฐ๋ฐ MSA(FoldMason 3Di) ํด๋ฌ์คํฐ๋ง ์์ด๋์ด๋ ์ ์์ด๋์ผ์ฑ ํฉํ์ด๋ ๋ณ์ด์ฒด์ ์ ํฉํ ์ ํ. ๋จ ํ์ฌ ์ค์ธก์ ์์ด๋์ผ์ฑ ๊ธฐ๋ฐ์ด๋ผ ํ์ ์ฃผ์ฅ ์ "๊ตฌ์กฐ ๋ค์์ฑ" ํํ์ ๊ณผ์ฅ โ ์์ด ๋ค์์ฑ์ผ๋ก ํ์ ํด์ผ ํจ.
- ํ๊ณ(์ ์ง์ฑ): ์์ด๋์ผ์ฑ์ด ์ ๋ ฌ ์๋ ์์น๋ณ ๋น๊ต(
_sequence_identity:507-521) โ ๊ธธ์ด ๋ณ์ดยท์ฝ์ /๊ฒฐ์ค์ด ์๋ ํ๋ณด๊ตฐ์์ ์ ์ฌ๋ ๊ณผ์ํ๊ฐ ๊ฐ๋ฅ. compute_diversity_score์ lDDT ๋ถ๊ธฐ๋ lDDT๊ฐ ์ ํ๋ณด์ ์ฑ์์ง ๊ฒฝ์ฐ์๋ง ์๋(:228-229).
โฅ ์ฌ์ฉ๋ฒ
A~E tier ๋ถ๋ฅ (๋ผ์ด๋ธ๋ฌ๋ฆฌ):
from pyrosetta_flow.cluster_report import classify_cluster, batch_classify
res = classify_cluster({"sequence": "AGCKNFFWKTFTSC", "ddG": -9.0,
"clash_score": 3, "structural_rules": {...}, ...})
# res["cluster"] in {"A".."E"}, res["criteria_met"], res["note"]
batch = batch_classify([cand1, cand2, ...]) # batch["statistics"]["distribution"]
API:
curl -X POST .../cluster/classify -d '{"candidates": [ {...}, {...} ]}'
๋ค์์ฑ ๊ด๋ฆฌ:
from AG_src.agents.diversity_manager import DiversityManagerAgent
mgr = DiversityManagerAgent(similarity_threshold=0.8, clustering_method="foldmason",
tool_fn=run_foldmason) # tool_fn ๋ฏธ์ฃผ์
์ ์์ด fallback
out = mgr.execute({"candidates": cand_list, "n_select": 20, "method": "foldmason"})
# out["diverse_candidates"], out["clusters"], out["diversity_report"], out["redundant_ids"]
ํ์ดํ๋ผ์ธ์์๋ ๋ณ๋ ํธ์ถ ๋ถํ์ โ runner(A~E)ยทorchestrator(๋ค์์ฑ)์ ์๋ ํตํฉ.
โฆ ํ์ ์ด์
- ๋ค์์ฑ ๊ด๋ฆฌ: ๋ฌดํ ๋ฐ๊ตด ์์ง์ ์ ์ฌ ๋ณ์ด๋ฅผ ๋๋ ์์ฑํ๋ฏ๋ก, ์ค๋ณต ํ๋ณด๊ฐ ์คํยท๋ํน ์ฌ๋กฏ์ ์ ์ํ๋ฉด ํ์ ํจ์จ์ด ๊ธ๊ฐํ๋ค. ๋ํ ์ ํยท์ค๋ณต ์ ๊ฑฐ๊ฐ local optimum ๊ณ ์ฐฉ์ ๋ฆ์ถ๊ณ ์ ํ๋ wetlab ์ฌ๋กฏ์ ์๋ก ๋ค๋ฅธ ํ๋ณด๋ก ์ฑ์ด๋ค.
- A~E tier: ๋จ์ผ ์ค์นผ๋ผ ์ ์๋ง์ผ๋ก๋ "์ ์ด ํ๋ณด๊ฐ ์ข์๊ฐ"๋ฅผ ์ค๋ช ๋ชป ํ๋ค. ๋ชฉ์ ๋ณ tier๊ฐ ์์ฌ๊ฒฐ์ ์์๊ฒ ํ๋ณด ์ฑ๊ฒฉ(๊ณ ์นํ vs ์ ํ์ vs ์์ vs ๋ฐฉ์ฌํํ)์ ์ฆ์ ์ ๊ณตํด ๋ค๋ชฉ์ trade-off ์์ฌ๊ฒฐ์ ์ ์ง์ํ๋ค.
๊ฒ์ฆ ์ธ์ฉ ๋ชฉ๋ก
- A~E tier ์ ์/์ฐ์ ์์:
cluster_report.py:9-25,:47-53 - criteria A~D:
cluster_report.py:159-188,:191-206,:209-226,:229-246 - pLDDT ์ต์
์คํต:
cluster_report.py:177-179 - chelator P2-1 ์์ :
cluster_report.py:125-153 - batch ํต๊ณ:
cluster_report.py:339-381 - DiversityManager ๋ถ๊ธฐ(foldmason/hybrid/sequence):
diversity_manager.py:145-153 - tool_fn ๋ฏธ์ฃผ์
์ ๊ฒฝ๊ณ :
diversity_manager.py:151-152 - _cluster_by_foldmason / _cluster_by_sequence:
diversity_manager.py:421-490,:382-419 - select_diverse_set / compute_diversity_score / flag_redundant:
diversity_manager.py:159-208,:210-250,:252-291 - ์์ด๋์ผ์ฑ(์ ๋ ฌ ์์):
diversity_manager.py:507-521 - DiversityManager ์์ฑ(์ ๋ถ tool_fn ์์):
run_pipeline_live.py:1020,orchestrator.py:851,runs/run_live_demo.py:747 - live์์ method="foldmason" ์ง์ :
run_pipeline_live.py:1021 - FoldMason MCP ์ค subprocess + skeleton ํ๊ธฐ:
foldmason_server.py:47-69,:265-401,:11,:314,:342,:365,:44 - step07 FoldMason ์คํธ์ถ/fallback:
step07_analysis.py:186-254,:212-223,:236-254 - lddt โ Candidate:
orchestrator.py:1096 - runner A~E ํตํฉ:
runner.py:1162-1188 - orchestrator ๋ค์์ฑ ํตํฉ:
orchestrator.py:626-644,:96-105,:1045-1054 - ๋ฐฑ์๋ cluster API:
backend/routers/cluster.py:7-27 - ํ๊ฒฝ ํ์ธ:
which foldmasonโ NOT FOUND (๋ณธ ๋ถ์ ์์ ) - ๋ฏธ๊ฒ์ฆ: foldmason TSV/JSON ์คํ์ฑ ๊ฒฐ๊ณผ, ๋ณ๋ conda env์ foldmason ์ค์น ์ฌ๋ถ, step07 ์คํ ์๊ฐยท์ค์ lDDT ๊ฐ