Coef_SC_Model / drug_comsol_params.py
guminhong's picture
Upload 16 files
35c683c verified
Raw History Blame Contribute Delete
12.6 kB
"""
drug_comsol_params.py โ€” ์•ฝ๋ฌผ๋ณ„ COMSOL ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ (v2, ๋ฌผ๋ฆฌ๊ณต์‹ ๊ธฐ๋ฐ˜)
============================================================
์•ฝ๋ฌผ ์„ ํƒ ์‹œ ํ•ด๋‹น ์•ฝ๋ฌผ์˜ 10๊ฐœ COMSOL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
โ˜… v2 ๋ณ€๊ฒฝ: BA ์—ญ์‚ฐ(์ˆœํ™˜ ๋…ผ๋ฆฌ) ํ๊ธฐ โ†’ ๋ฌผ๋ฆฌ ๊ณต์‹ยท๋ฌธํ—Œ ๊ธฐ๋ฐ˜ ์žฌ์œ ๋„
๊ธฐ์กด v1์€ k_decay๋ฅผ "๋ฌธํ—Œ BA๊ฐ€ ๋‚˜์˜ค๋„๋ก ์—ญ์‚ฐ"ํ•ด ๋„ฃ์–ด, ๋Œ€๋ฆฌ๋ชจ๋ธโ†’BA
๊ณ„์‚ฐ์ด ์ˆœํ™˜(BA๋ฅผ ๋„ฃ์–ด BA๋ฅผ ์–ป์Œ)์ด์—ˆ๋‹ค. v2๋Š” ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ฐ
ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฌผ๋ฆฌ์  ๊ทผ๊ฑฐ๋กœ ๋…๋ฆฝ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ BA๋Š” ์ˆœ๋ฐฉํ–ฅ ์˜ˆ์ธก๊ฐ’์ด ๋œ๋‹ค.
ํŒŒ๋ผ๋ฏธํ„ฐ๋ณ„ ๊ฒฐ์ • ๋ฐฉ๋ฒ•:
Lp_ve, K ์กฐ์ง ์„ฑ์งˆ(์•ฝ๋ฌผ ๋ฌด๊ด€) โ†’ ๊ณตํ†ต ์ƒ์ˆ˜ (Lp_ve=8e-12, K=1e-15)
sigma_ve, sigma_le Curry ๋ฐ˜์‚ฌ๊ณ„์ˆ˜ ฯƒ=1-(1-(a/R)ยฒ)ยฒ, a=0.0515ยทMW^0.392 nm
(Erickson 2009). ๋ฒฝ ๊ณต๊ทน๋ฐ˜๊ฒฝ R_ve=6.22, R_le=24.5 nm๋Š”
ํŒŒ์ผ 3์ข…(IgG/INS/ALB) ์‹ค์ธก best-fit.
D_gel Stokes-Einstein ์ž์œ ํ™•์‚ฐ D=kBT/(6ฯ€ฮทr) ร— ECM ๋ฐฉํ•ด์ธ์ž
f=0.376ยทexp(0.1439ยทr_h[nm]) (ํŒŒ์ผ 3์ข… ์‹ค์ธก ํ”ผํŒ…, 37ยฐC)
p_ve, p_le ๋ฒฝ ํ™•์‚ฐํˆฌ๊ณผ๋„. ํŒŒ์ผ 3์ข… ์‹ค์ธก์„ log(MW) ์„ ํ˜• ๋ณด๊ฐ„.
kf_m, kr_m ECM ๊ฒฐํ•ฉ ์ƒ์ˆ˜ โ†’ ํŒŒ์ผ(250415_Drug_list) ์‹ค์ธก ๊ทธ๋Œ€๋กœ.
k_decay โ˜… ๋ชฉํ‘œ BA ์žฌํ˜„๊ฐ’(calibration). ์•Œ๋ ค์ง„ ์•ฝ๋ฌผ์€ ๋ฌธํ—Œ SC BA๋ฅผ
์žฌํ˜„ํ•˜๋„๋ก ์—ญ์‚ฐ๋œ ๊ฐ’์ด๋‹ค(์ˆœ๋ฐฉํ–ฅ '์˜ˆ์ธก'์ด ์•„๋‹ˆ๋ผ '์žฌํ˜„').
LODO ๊ฒ€์ฆ์ƒ ๋ฌผ์„ฑ์œผ๋กœ ์˜ˆ์ธก ๋ถˆ๊ฐ€(27.9%p)์ด๋ฏ€๋กœ ๋ฏธ์ง€ ์•ฝ๋ฌผ์—”
k_decay_physics(MW)(MW ๋กœ๊ทธ์Šค์ผ€์ผ ๋ฌผ๋ฆฌ์ถ”์ •)๋ฅผ ์“ธ ๊ฒƒ.
๋ฌผ๋ฆฌ๊ฐ’ ์›๋ณธ์€ K_DECAY_PHYSICS dict์— ๋ณด์กด.
TRA๋Š” ์ถ”์ฒœ๋ชจ๋ธ5(ํก์ˆ˜ ์™œ๊ณก)๋ผ model4 ๊ธฐ์ค€์œผ๋กœ ์žฌํ˜„ํ•จ.
ํŒŒ์ผ ์‹ค์ธก 3์ข…(IgG/INS/ALB, 251103_revised)์€ sigmaยทpยทD_gel์„ ์‹ค์ธก ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ.
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ˜… ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทผ๊ฑฐ ๋“ฑ๊ธ‰ (์ƒ์ฒด๋ฌผ๋ฆฌ ๋ฌธํ—Œ ๊ฐ์‚ฌ, ์ƒ์„ธ: comsol_params_biophysics_refs_ko.md)
์ฃผ์˜: ์ด 10๊ฐœ๋Š” ์ž„์ƒ PK ์ƒ์ˆ˜(CLยทVยทBA)๊ฐ€ ์•„๋‹ˆ๋ผ ์กฐ์ง-๋ถ„์ž ์ˆ˜์†ก ์ƒ์ฒด๋ฌผ๋ฆฌ๋Ÿ‰์ด๋ผ
FDA/PopPK DB์—์„œ ์•ฝ๋ฌผ๋ณ„๋กœ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค. ๋ฏธ์„ธํ˜ˆ๊ด€ ์ƒ๋ฆฌยทECM ํ™•์‚ฐยท๊ณต๊ทน์ด๋ก ์œผ๋กœ ์œ ๋„.
๐ŸŸฉ ๋ฌผ๋ฆฌ๊ณต์‹/๋ฌธํ—Œ์‹ค์ธก (5๊ฐœ):
sigma_ve, sigma_le : Curry-Michel ๊ณต๊ทน์ด๋ก  + Rippe & Haraldsson two-pore
(two-pore eqs; ์†Œ๊ณต๊ทน~4nm/๋Œ€๊ณต๊ทน~24nm). ํŒŒ์ผ 3์ข… ์žฌํ˜„.
D_gel : Stokes-Einstein + ECM ๋ฐฉํ•ด(Pluen 2001 PNAS, Ramanujan 2002 BiophysJ).
p_ve, p_le : ๋ฏธ์„ธํ˜ˆ๊ด€ ๋‹จ๋ฐฑ์งˆ ํˆฌ๊ณผ๋„ ์‹ค์ธก๊ณผ ์ž๋ฆฟ์ˆ˜ ์ผ์น˜
(์•Œ๋ถ€๋ฏผ 1.8e-9, IgG 1.9~4.6e-9 m/s; Yuan 1993 PMID:8321142, PMC2363402).
โฌœ ์กฐ์ง์ƒ์ˆ˜ ๊ณ ์ • (์•ฝ๋ฌผ ๋ฌด๊ด€, 2๊ฐœ):
Lp_ve : ์‚ฌ๋žŒ ๋ฏธ์„ธํ˜ˆ๊ด€ ์ˆ˜๋ฆฌ์ „๋„๋„ ๋ฒ”์œ„ ๊ณ ์ •. Levick & Michel 2010.
K : ์‚ฌ๋žŒ ๊ฐ„์งˆ Darcy ํˆฌ๊ณผ๋„ ๋ฒ”์œ„ ๊ณ ์ •. Levick 1987, Q J Exp Physiol 72:409.
๐ŸŸง ๊ธฐ์ „์€ ๋ฌธํ—Œํ™•์ธ, ์ ˆ๋Œ€ ์†๋„์ƒ์ˆ˜ ๋ฏธ๊ฒ€์ฆ (3๊ฐœ โ€” ํŒŒ์ผ ์‹ค์ธก ์˜์กด):
kf_m, kr_m : ECM-ํ•˜์ด์•Œ๋ฃจ๋กœ๋‚œ ์ •์ „๊ธฐ ๊ฒฐํ•ฉ์€ ์‹ค์žฌ ๊ธฐ์ „(J Pharm Sci 2020)์ด๋‚˜
์•ฝ๋ฌผ๋ณ„ kon/koff ํ‘œ์ค€๊ฐ’ ์—†์Œ โ†’ ํŒŒ์ผ(250415) ์‹ค์ธก ์‚ฌ์šฉ.
k_decay : SC presystemic ๋ถ„ํ•ด. ๊ธฐ์ „ยท๋ฐฉํ–ฅ(ํŽฉํƒ€์ด๋“œโ†‘ mAbโ†“)ยทBA๋ฒ”์œ„(52~80%)๋Š”
๋ฌธํ—Œํ™•์ธ(PMC5613179; FcRn PBPK antibodies 2024 doi:10.3390/antib13030070;
FcRn๊ฒฐ์† BA 82.5%โ†’28.3% PMC6150636)์ด๋‚˜ ์•ฝ๋ฌผ๋ณ„ ์†๋„์ƒ์ˆ˜ ์‹ค์ธก ์—†์Œ
โ†’ MW ๋Œ€๋ฆฌ์Šค์ผ€์ผ. BA ์—ญ์‚ฐ ์•„๋‹˜(์ˆœํ™˜ ํšŒํ”ผ).
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ:
Lp_ve, K, p_le, sigma_ve, sigma_le, p_ve, D_gel, k_decay, kf_m, kr_m
"""
import math
# ์•ฝ๋ฌผ ๋ฌด๊ด€ ์กฐ์ง ๊ณตํ†ต๊ฐ’
_COMMON = dict(Lp_ve=8e-12, K=1e-15)
# ์•ฝ๋ฌผ๋ณ„ COMSOL ํŒŒ๋ผ๋ฏธํ„ฐ
# IgG/INS/ALB: ํŒŒ์ผ ์‹ค์ธก(sigmaยทpยทD_gel) + ๋ฌธํ—Œ k_decay
# ๊ทธ ์™ธ 7์ข… : ๋ฌผ๋ฆฌ๊ณต์‹(sigmaยทD_gelยทp) + ํŒŒ์ผ kf/kr + ๋ฌธํ—Œ k_decay
# โ”€โ”€ k_decay ๋ฌผ๋ฆฌ๊ฐ’(MW ์Šค์ผ€์ผ, BA ๋ฏธ๋ณด์ •) โ€” ๋ฏธ์ง€ ์•ฝ๋ฌผ ํด๋ฐฑยท์ฐธ์กฐ์šฉ ๋ณด์กด โ”€โ”€
K_DECAY_PHYSICS = {
"INS": 3.000e-05,
"EXE": 3.925e-05,
"ETA": 2.000e-06,
"TRA": 2.051e-06,
"RIT": 2.070e-06,
"IgG": 2.000e-06,
"BOC": 2.056e-06,
}
# ์œ„ DRUG_COMSOL์˜ k_decay๋Š” ์•„๋ž˜ ๋ชฉํ‘œ BA๋ฅผ ์žฌํ˜„ํ•˜๋„๋ก ๋ณด์ •๋œ ๊ฐ’(calibration)์ด๋‹ค.
# โš  ์ด๋Š” ์ˆœ๋ฐฉํ–ฅ '์˜ˆ์ธก'์ด ์•„๋‹ˆ๋ผ ์•Œ๋ ค์ง„ ๋ฌธํ—Œ BA์˜ '์žฌํ˜„'๊ฐ’์ด๋‹ค. LODO ๊ฒ€์ฆ ๊ฒฐ๊ณผ
# ๋ฌผ์„ฑ(MWยทsigma_ve)์œผ๋กœ ์˜ˆ์ธก ๋ถˆ๊ฐ€(ํ‰๊ท ์˜ค์ฐจ 27.9%p)ํ•˜๋ฏ€๋กœ, ๋ฏธ์ง€ ์•ฝ๋ฌผ์—๋Š”
# k_decay_physics()(MW ๋กœ๊ทธ์Šค์ผ€์ผ)๋ฅผ ์จ์•ผ ํ•œ๋‹ค. ์ƒ์„ธ: pipeline_validation_report_ko.md
CALIBRATION_BA = {"INS": 66, "EXE": 100, "ETA": 58, "TRA": 77, "RIT": 64, "IgG": 70, "BOC": 46.5}
DRUG_COMSOL = {
"INS": dict(MW=5.80, sigma_ve=0.1000, sigma_le=0.0000, p_ve=1.000e-08, p_le=7.200e-08, D_gel=9.400e-11, k_decay=1.494e-05, kf_m=1.450, kr_m=6.82, **_COMMON),
"ALB": dict(MW=66.50, sigma_ve=0.7000, sigma_le=0.0500, p_ve=1.000e-09, p_le=1.000e-08, D_gel=6.200e-11, k_decay=3.937e-06, kf_m=0.170, kr_m=4.77, **_COMMON),
"IgG": dict(MW=150.00, sigma_ve=0.9000, sigma_le=0.1000, p_ve=1.000e-09, p_le=1.000e-08, D_gel=4.500e-11, k_decay=4.102e-06, kf_m=0.480, kr_m=4.20, **_COMMON),
"EXE": dict(MW=4.20, sigma_ve=0.0927, sigma_le=0.0061, p_ve=1.171e-08, p_le=8.241e-08, D_gel=1.093e-10, k_decay=1.361e-06, kf_m=0.624, kr_m=11.14, **_COMMON),
"LYS": dict(MW=14.30, sigma_ve=0.2328, sigma_le=0.0159, p_ve=4.600e-09, p_le=3.700e-08, D_gel=7.628e-11, k_decay=1.415e-05, kf_m=1.451, kr_m=99.70, **_COMMON),
"OVA": dict(MW=45.00, sigma_ve=0.5168, sigma_le=0.0389, p_ve=1.920e-09, p_le=1.749e-08, D_gel=5.821e-11, k_decay=5.449e-06, kf_m=0.371, kr_m=6.36, **_COMMON),
"RIT": dict(MW=143.90, sigma_ve=0.9417, sigma_le=0.0954, p_ve=7.913e-10, p_le=8.182e-09, D_gel=4.909e-11, k_decay=6.238e-06, kf_m=0.296, kr_m=6.35, **_COMMON),
"BOC": dict(MW=145.10, sigma_ve=0.9440, sigma_le=0.0960, p_ve=7.863e-10, p_le=8.137e-09, D_gel=4.905e-11, k_decay=1.140e-05, kf_m=0.311, kr_m=5.99, **_COMMON),
"TRA": dict(MW=145.50, sigma_ve=0.9448, sigma_le=0.0962, p_ve=7.846e-10, p_le=8.123e-09, D_gel=4.904e-11, k_decay=2.666e-06, kf_m=0.517, kr_m=8.77, **_COMMON),
"ETA": dict(MW=149.99, sigma_ve=0.9531, sigma_le=0.0985, p_ve=7.667e-10, p_le=7.963e-09, D_gel=4.892e-11, k_decay=6.981e-06, kf_m=0.756, kr_m=13.40, **_COMMON),
}
# ํŒŒ์ผ์—์„œ ์ง์ ‘ ์ธก์ •๋œ ์•ฝ๋ฌผ (์‹ค์ธก sigmaยทpยทD_gel, ์‹ ๋ขฐ๋„ ๋†’์Œ)
FILE_MEASURED = {"IgG", "INS", "ALB"}
PARAM_ORDER = ["Lp_ve", "K", "p_le", "sigma_ve", "sigma_le",
"p_ve", "D_gel", "k_decay", "kf_m", "kr_m"]
def get_comsol_params(drug="IgG"):
if drug not in DRUG_COMSOL:
raise KeyError(f"์•ฝ๋ฌผ '{drug}' ์—†์Œ. ์ง€์›: {list(DRUG_COMSOL)}")
return DRUG_COMSOL[drug]
def get_param_vector(drug="IgG"):
p = get_comsol_params(drug)
return [p[name] for name in PARAM_ORDER]
def is_file_measured(drug):
"""ํŒŒ์ผ์—์„œ ์ง์ ‘ ์ธก์ •๋œ ์•ฝ๋ฌผ์ธ์ง€ (vs ๋ฌผ๋ฆฌ๊ณต์‹ ๊ณ„์‚ฐ)."""
return drug in FILE_MEASURED
def k_decay_physics(mw_kda):
"""๋ฏธ์ง€ ์•ฝ๋ฌผ์šฉ k_decay (MW ๋กœ๊ทธ์Šค์ผ€์ผ ๋ฌผ๋ฆฌ ์ถ”์ •, 1/s).
BA calibration์ด ์—†๋Š” ์•ฝ๋ฌผ์— ์‚ฌ์šฉ. ํŽฉํƒ€์ด๋“œ(~5kDa)~3e-5, mAb(~150kDa)~2e-6.
โš  ๋ฌผ๋ฆฌ ์ˆœ๋ฐฉํ–ฅ ์ถ”์ •๊ฐ’ โ€” BA ์žฌํ˜„ ๋ณด์žฅ ์•ˆ ๋จ."""
import math
return 10**(-0.8326*math.log10(mw_kda*1000.0) + -1.3896)
def get_k_decay(drug, mw_kda=None):
"""์•ฝ๋ฌผ k_decay ๋ฐ˜ํ™˜. ์•Œ๋ ค์ง„ ์•ฝ๋ฌผ์€ calibration(๋ชฉํ‘œ BA ์žฌํ˜„)๊ฐ’,
๋ฏธ์ง€ ์•ฝ๋ฌผ์€ k_decay_physics(MW) ๋ฌผ๋ฆฌ ์ถ”์ •๊ฐ’."""
if drug in DRUG_COMSOL:
return DRUG_COMSOL[drug]["k_decay"]
if mw_kda is None:
raise ValueError("๋ฏธ์ง€ ์•ฝ๋ฌผ์€ mw_kda ํ•„์š”")
return k_decay_physics(mw_kda)
# โ”€โ”€ ๋ฏธ์ง€ ์•ฝ๋ฌผ: ๋ถ„์ž๋Ÿ‰(MW)๋งŒ์œผ๋กœ 10๊ฐœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”์ • โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ๊ฒ€์ฆ(2026-07): sigmaยทD_gel ๊ณต์‹์€ ๋ฌผ๋ฆฌ์œ ๋„ 7์ข…์„ ์™„๋ฒฝ ์žฌํ˜„, p_ve/p_le๋Š”
# ์ž๋ฆฟ์ˆ˜ ์ผ์น˜. kf_mยทkr_m์€ MW์™€ ๋ฌด๊ด€ํ•˜๋ฏ€๋กœ MW ์ตœ๊ทผ์ ‘ ๋“ฑ๋ก์•ฝ๋ฌผ์—์„œ ์ฐจ์šฉํ•œ๋‹ค.
_MW_R_VE_NM = 6.22 # ๋ฏธ์„ธํ˜ˆ๊ด€ ์†Œ๊ณต๊ทน ๋ฐ˜๊ฒฝ (Rippe & Haraldsson 1994)
_MW_R_LE_NM = 24.5 # ๋ฆผํ”„๊ด€ ๋Œ€๊ณต๊ทน ๋ฐ˜๊ฒฝ (ํŒŒ์ผ 3์ข… ์‹ค์ธก best-fit)
_MW_KB = 1.380649e-23 # Boltzmann (J/K)
_MW_T = 310.15 # 37ยฐC (K)
_MW_ETA = 0.0007 # ECM ์ ๋„ (Paยทs)
def _solute_radius_nm(mw_da):
"""์šฉ์งˆ Stokes ๋ฐ˜๊ฒฝ (nm), Erickson 2009: a = 0.0515ยทMW_Da^0.392."""
return 0.0515 * mw_da ** 0.392
def _sigma_curry(mw_da, R_nm):
"""Curry-Michel ๋ฐ˜์‚ฌ๊ณ„์ˆ˜ ฯƒ = 1โˆ’(1โˆ’(a/R)ยฒ)ยฒ."""
r = _solute_radius_nm(mw_da) / R_nm
return 1.0 - (1.0 - r * r) ** 2 if r < 1.0 else 1.0
def _d_gel_stokes(mw_da):
"""Stokes-Einstein ์ž์œ ํ™•์‚ฐ ร— ECM ๋ฐฉํ•ด์ธ์ž (mยฒ/s)."""
r_nm = _solute_radius_nm(mw_da)
D = _MW_KB * _MW_T / (6.0 * math.pi * _MW_ETA * r_nm * 1e-9)
f = 0.376 * math.exp(0.144 * r_nm) # ECM ๋ฐฉํ•ด(๊ฐ์†Œ)์ธ์ž
return D * f
def _p_interp_from_anchors(mw_da, key):
"""IgG/INS/ALB ์‹ค์ธก 3์ ์„ log(MW)โ€“log(p) ์„ ํ˜•๋ณด๊ฐ„ (์™ธ์‚ฝ์€ ์–‘๋ ๊ณ ์ •)."""
anc = sorted((DRUG_COMSOL[d]["MW"] * 1000.0, DRUG_COMSOL[d][key])
for d in ("INS", "ALB", "IgG"))
xs = [math.log10(m) for m, _ in anc]
ys = [math.log10(p) for _, p in anc]
x = math.log10(mw_da)
if x <= xs[0]: return 10 ** ys[0]
if x >= xs[-1]: return 10 ** ys[-1]
for i in range(len(xs) - 1):
if xs[i] <= x <= xs[i + 1]:
t = (x - xs[i]) / (xs[i + 1] - xs[i])
return 10 ** (ys[i] + t * (ys[i + 1] - ys[i]))
return 10 ** ys[-1]
def _nearest_mw_drug(mw_kda):
"""MW(kDa)๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋“ฑ๋ก ์•ฝ๋ฌผ ์ด๋ฆ„."""
return min(DRUG_COMSOL, key=lambda d: abs(DRUG_COMSOL[d]["MW"] - mw_kda))
def params_from_mw(mw_kda, kf_m=None, kr_m=None, return_detail=False):
"""๋ถ„์ž๋Ÿ‰(kDa)๋งŒ์œผ๋กœ ๋ฏธ์ง€ ์•ฝ๋ฌผ์˜ COMSOL 10๊ฐœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”์ •ํ•œ๋‹ค.
์ถ”์ • ๋ฐฉ์‹:
Lp_ve, K : ์กฐ์ง ์ƒ์ˆ˜ (_COMMON, ์•ฝ๋ฌผ ๋ฌด๊ด€)
sigma_ve/sigma_le : Curry-Michel ๊ณต๊ทน์ด๋ก  (MW โ†’ Stokes ๋ฐ˜๊ฒฝ โ†’ ฯƒ). ๊ฒ€์ฆ ์™„๋ฃŒ.
D_gel : Stokes-Einstein ร— ECM ๋ฐฉํ•ด์ธ์ž. ๊ฒ€์ฆ ์™„๋ฃŒ.
p_ve, p_le : IgG/INS/ALB ์‹ค์ธก log(MW) ๋ณด๊ฐ„ (์ž๋ฆฟ์ˆ˜ ์‹ ๋ขฐ).
k_decay : k_decay_physics(MW) ๋กœ๊ทธ์Šค์ผ€์ผ ๋ฌผ๋ฆฌ์ถ”์ • (๊ทผ์‚ฌ, BA ๋ฏธ๋ณด์ •).
kf_m, kr_m : MW๋กœ ์˜ˆ์ธก ๋ถˆ๊ฐ€ โ†’ ์ธ์ž๋กœ ์ฃผ๋ฉด ๊ทธ ๊ฐ’, ์—†์œผ๋ฉด MW ์ตœ๊ทผ์ ‘
๋“ฑ๋ก์•ฝ๋ฌผ์˜ ๊ฐ’์„ ์ฐจ์šฉ.
์ธ์ž:
mw_kda : ๋ถ„์ž๋Ÿ‰ (kDa)
kf_m, kr_m : ์•Œ๋ฉด ์ง์ ‘ ์ง€์ • (None์ด๋ฉด ์ตœ๊ทผ์ ‘ ์•ฝ๋ฌผ์—์„œ ์ฐจ์šฉ)
return_detail : True๋ฉด (vector, detail dict) ๋ฐ˜ํ™˜
๋ฐ˜ํ™˜:
PARAM_ORDER ์ˆœ์„œ์˜ list[10] (return_detail=True๋ฉด (list, dict))
"""
mw_da = mw_kda * 1000.0
ref = _nearest_mw_drug(mw_kda) # kf_m/kr_m ์ฐจ์šฉ์›
kf = DRUG_COMSOL[ref]["kf_m"] if kf_m is None else kf_m
kr = DRUG_COMSOL[ref]["kr_m"] if kr_m is None else kr_m
p = dict(_COMMON)
p["sigma_ve"] = _sigma_curry(mw_da, _MW_R_VE_NM)
p["sigma_le"] = _sigma_curry(mw_da, _MW_R_LE_NM)
p["D_gel"] = _d_gel_stokes(mw_da)
p["p_ve"] = _p_interp_from_anchors(mw_da, "p_ve")
p["p_le"] = _p_interp_from_anchors(mw_da, "p_le")
p["k_decay"] = k_decay_physics(mw_kda)
p["kf_m"] = kf
p["kr_m"] = kr
vec = [p[k] for k in PARAM_ORDER]
if return_detail:
detail = dict(p)
detail["_kfkr_source"] = ("user" if kf_m is not None else ref)
detail["_mw_kda"] = mw_kda
detail["_solute_radius_nm"] = _solute_radius_nm(mw_da)
return vec, detail
return vec
if __name__ == "__main__":
print(f"{'Drug':5s} " + " ".join(f"{n:>9s}" for n in PARAM_ORDER) + " source")
for d in DRUG_COMSOL:
v = get_param_vector(d)
tag = "file" if d in FILE_MEASURED else "calc"
print(f"{d:5s} " + " ".join(f"{x:>9.2e}" for x in v) + f" [{tag}]")