# AdipoLipoKinetics (아디포라이포카이네틱스)

Ex vivo 지방조직 explant / 분리 지방세포(isolated adipocyte) **지방분해
(lipolysis) 어세이**를 분석하는 단독 실행형 Streamlit 도구.
원자료(glycerol·NEFA plate-reader 데이터)로부터 방출율·재에스터화 보정·
β-작용제 EC50·인슐린 항지방분해 IC50·정규화·코호트 통계를 산출한다.

- **도메인**: Obesity (비만대사질환)
- **카테고리**: 동물실험 도구 (animal experiment tool)
- **대상 사용자**: 내분비·대사·비만·약리 동물실험 연구실

> ⚠ **참고용 · 연구용 도구입니다 (for reference / research use only).**
> 본 도구의 계산 결과는 동물실험(ex vivo 지방분해 어세이) 데이터 분석
> 보조용이며, 임상 진단·치료 목적으로 사용할 수 없습니다.

---

## 한 줄 요약

glycerol·NEFA plate-reader export(흡광/형광), 표준곡선, 0–120분 시계열을
입력하면 → 표준곡선을 자동 적합하고, 선형 구간을 자동 탐지해 방출율을 회귀하며,
재에스터화 분율을 추정하고, β-작용제 EC50·인슐린 IC50를 4PL로 산출하며,
depot/모델 참조 QC와 코호트 통계·기전 분류·리포트(KO/EN, docx)까지 제공한다.

---

## 5개 핵심 기능

| # | 기능 | 설명 |
|---|------|------|
| 1 | **plate-reader 원자료 + 표준곡선 입력** | glycerol·NEFA 비색/형광 plate-reader export(흡광/형광) CSV 입력 → 표준곡선 자동 적합(선형 또는 4PL) · R² QC · blank 차감 → 시점별 매질 농도 산출 |
| 2 | **방출율 + 재에스터화 보정** | 0–120분 시계열의 선형 구간 자동 탐지 → 기울기 회귀로 glycerol·NEFA 방출율 계산 · glycerol 기반(재에스터화 비의존) vs NEFA 기반 비교로 재에스터화 분율 추정 · 조직중량/DNA/단백/세포수 정규화 |
| 3 | **용량-반응 + 인슐린 항지방분해** | isoproterenol/CL316243/forskolin 용량-반응 4PL 적합 → EC50, Emax, fold-stimulation · ± 인슐린 농도 시리즈 → 항지방분해 IC50 및 최대 억제율 |
| 4 | **depot/모델 참조 + QC** | eWAT·iWAT·scWAT·BAT depot 및 DIO/HFD/ob/ob/aging 모델별 전형적 기저/자극 지방분해 참조 범위 내장 · 표준곡선 R² 미달, 시계열 비선형, glycerol/NEFA 비정상 괴리 자동 경고 |
| 5 | **코호트 통계 + 리포트** | group × depot × stimulus 방출율 two-way ANOVA / 혼합효과모형(statsmodels) · EC50/IC50 그룹 비교 · 기전 분류("lipolysis-promoting / insulin-antilipolytic-improving / catecholamine-resistance-improving") · method+result 리포트(KO/EN) docx export |

---

## 실행 방법

```bash
# 1. 의존성 설치
pip install -r requirements.txt

# 2. (선택) 합성 샘플 데이터 재생성 — 이미 data/ 에 포함되어 있음
python3 generate_sample_data.py

# 3. 앱 실행
streamlit run app.py
```

브라우저에서 자동으로 열리며, 사이드바에서 **"데모 데이터 로드"**를 선택하면
업로드 없이 합성 데이터로 모든 기능을 바로 확인할 수 있다(완전 오프라인 동작).

> `statsmodels`는 선택 의존성입니다. 미설치 시 two-way ANOVA·혼합효과모형만
> 비활성화되고, 표준곡선·방출율·EC50/IC50·일원배치 ANOVA·쌍별 비교 등 나머지
> 기능은 scipy 기반으로 정상 동작합니다. `python-docx` 미설치 시 docx export만
> 비활성화되고 .md/.csv export는 정상 동작합니다.

---

## 파일 구성

```
2026-05-25-2-adipo-lipo-kinetics/
├── app.py                  # Streamlit 앱 (메인 진입점, 5개 기능 탭)
├── lipo_core.py            # 순수 Python 계산 모듈 (4PL/Steele류 회귀 등, 단독 테스트 가능)
├── generate_sample_data.py # 합성 샘플 데이터 생성 스크립트 (재현용)
├── requirements.txt        # 고정 버전 의존성
├── data/
│   ├── standard_curves.csv      # glycerol/NEFA 표준곡선 (농도 vs OD)
│   ├── lipolysis_timecourse.csv # 0–120분 매질 glycerol/NEFA 신호 시계열
│   ├── dose_response.csv        # β-작용제 자극 + 인슐린 항지방분해 용량-반응
│   └── sample_meta.csv          # 샘플 메타(그룹/모델/depot/중량/DNA/단백/세포수)
├── README.md
└── QA.md                   # QA 점검 로그
```

### 입력 CSV 스키마

**standard_curves.csv**: `analyte(glycerol/NEFA), concentration,
concentration_unit, signal, signal_type, blank_signal`

**lipolysis_timecourse.csv**: `sample_id, group, model, depot, time_min,
glycerol_signal_OD, nefa_signal_OD, glycerol_blank_OD, nefa_blank_OD`

**dose_response.csv**: `sample_id, group, model, depot, stimulus
(isoproterenol/insulin), dose_M, glycerol_signal_OD, glycerol_blank_OD`

**sample_meta.csv**: `sample_id, group, model, depot, tissue_weight_mg,
dna_ug, protein_mg, cell_number`

---

## 핵심 계산식

- **표준곡선(선형)**: `signal = slope·conc + intercept`, 역변환으로 농도 산출
- **표준곡선(4PL)**: `y = bottom + (top−bottom)/(1+(x/EC50)^hill)`
- **방출율**: 선형 구간(R² 기준) 자동 탐지 후 농도-시간 회귀 기울기
- **재에스터화 분율**: `(3·glycerol_rate − NEFA_rate) / (3·glycerol_rate)`
  (완전 지방분해 1 TG → 1 glycerol + 3 NEFA; glycerol은 재에스터화 비의존)
- **EC50/IC50**: glycerol release의 용량-반응 4PL 적합
- **정규화**: 방출율 ÷ (조직중량/DNA/단백/세포수)

---

## QA 체크리스트

- [x] 모든 `.py` 파일 Python 구문 검사 (`ast.parse`)
- [x] `generate_sample_data.py` 실행 → CSV 4종 생성 확인
- [x] 생성된 CSV pandas 로드/파싱 확인
- [x] `lipo_core.py` 단독 import (streamlit 불필요)
- [x] `lipo_core.py` 자체 검증 (`python3 lipo_core.py`)
- [x] 전체 파이프라인 스모크 테스트 (표준곡선→방출율→EC50/IC50, 36 well)
- [x] 오프라인 동작 — 외부 네트워크/API 호출 없음
- [x] 앱·README에 참고용·연구용 면책 문구 표기

자세한 결과는 `QA.md` 참조.

---

## 데이터 출처

`data/` 의 CSV는 모두 **합성(synthetic) 데이터**이며,
`generate_sample_data.py`가 고정 시드(20260525)로 생성한다.
실제 동물 데이터가 아니며, 외부 데이터를 다운로드하지 않는다.

depot/모델별 참조 범위(`lipo_core.DEPOT_REFERENCE`, `lipo_core.MODEL_REFERENCE`)는
지방분해 문헌의 전형적 값을 근사한 상대 스케일이며, 정밀 분석 시 각 실험실
기준값으로 교체 권장.

---

## 한계 및 주의

- 합성 데이터 기반 MVP — 실제 실험 데이터로의 적용 전 검증 필요.
- 재에스터화 분율은 glycerol/NEFA 3:1 화학량론 가정의 근사이며, glycerol
  재흡수·glycerol kinase 활성·매질 교환 등은 단순화 적용.
- EC50/IC50 4PL 적합은 용량점 수·분산에 민감 — 최소 4점, 충분한 plateau 권장.
- 본 도구는 **연구 보조용**이며 임상적 판단을 대체하지 않는다.

---

*2026 metabolic daily idea pipeline · 2026-05-25 · Obesity 동물실험 도구*
