Upload app.py with huggingface_hub
Browse files
app.py
CHANGED
|
@@ -200,11 +200,14 @@ def get_confident_alleles(bead_results, bead_hla_map):
|
|
| 200 |
例: A*11:01 在 X2 → 排除 A*11:01
|
| 201 |
A*11:02 只在 X8 → 保留 A*11:02 → 報告寫 A11(A*11:02)
|
| 202 |
"""
|
|
|
|
|
|
|
|
|
|
| 203 |
x6x8 = set()
|
| 204 |
not_x6x8 = set() # Rxn=1, 2, 4 全部排除
|
| 205 |
for bid, r in bead_results.items():
|
| 206 |
hla = bead_hla_map.get(bid, {})
|
| 207 |
-
alleles = _parse_allele_list(hla.get('allele', ''))
|
| 208 |
if r['rxn'] >= 6:
|
| 209 |
x6x8.update(alleles)
|
| 210 |
else:
|
|
@@ -259,7 +262,11 @@ def _build_allele_to_sero(bead_hla_map):
|
|
| 259 |
alleles = allele_by_locus.get(locus, [])
|
| 260 |
for i, ag in enumerate(alleles):
|
| 261 |
if i < len(seros):
|
|
|
|
| 262 |
mapping[ag] = seros[i]
|
|
|
|
|
|
|
|
|
|
| 263 |
return mapping
|
| 264 |
|
| 265 |
|
|
@@ -366,19 +373,30 @@ def generate_specificity(confident_alleles, bead_hla_map):
|
|
| 366 |
if sero:
|
| 367 |
all_alleles_per_sero.setdefault(sero, set()).add(ag)
|
| 368 |
|
| 369 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 370 |
sero_groups = {}
|
| 371 |
-
allele_groups = {'DQA1': set(), '
|
| 372 |
|
| 373 |
for ag in confident_alleles:
|
| 374 |
-
|
| 375 |
-
prefix =
|
| 376 |
if prefix in allele_groups:
|
| 377 |
-
|
|
|
|
| 378 |
else:
|
|
|
|
| 379 |
sero = a2s.get(ag)
|
|
|
|
|
|
|
| 380 |
if sero:
|
| 381 |
-
sero_groups.setdefault(sero, set()).add(
|
| 382 |
|
| 383 |
# 排序: 按 locus 再按數字
|
| 384 |
import re as _re
|
|
@@ -420,12 +438,17 @@ def generate_specificity(confident_alleles, bead_hla_map):
|
|
| 420 |
# 兩個以上 allele → 全部列出
|
| 421 |
parts.append(f'{sero}({" ".join(sorted(conf))})')
|
| 422 |
|
| 423 |
-
# DQA1/
|
| 424 |
-
for prefix in ['DQA1', '
|
| 425 |
alleles = allele_groups[prefix]
|
| 426 |
if alleles:
|
| 427 |
-
|
| 428 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 429 |
|
| 430 |
return ' '.join(parts)
|
| 431 |
|
|
|
|
| 200 |
例: A*11:01 在 X2 → 排除 A*11:01
|
| 201 |
A*11:02 只在 X8 → 保留 A*11:02 → 報告寫 A11(A*11:02)
|
| 202 |
"""
|
| 203 |
+
def _clean(ag):
|
| 204 |
+
return ag.split('/')[0] if '/' in ag else ag
|
| 205 |
+
|
| 206 |
x6x8 = set()
|
| 207 |
not_x6x8 = set() # Rxn=1, 2, 4 全部排除
|
| 208 |
for bid, r in bead_results.items():
|
| 209 |
hla = bead_hla_map.get(bid, {})
|
| 210 |
+
alleles = {_clean(a) for a in _parse_allele_list(hla.get('allele', ''))}
|
| 211 |
if r['rxn'] >= 6:
|
| 212 |
x6x8.update(alleles)
|
| 213 |
else:
|
|
|
|
| 262 |
alleles = allele_by_locus.get(locus, [])
|
| 263 |
for i, ag in enumerate(alleles):
|
| 264 |
if i < len(seros):
|
| 265 |
+
# 同時建立原始和清理後的 mapping
|
| 266 |
mapping[ag] = seros[i]
|
| 267 |
+
clean_ag = ag.split('/')[0] if '/' in ag else ag
|
| 268 |
+
if clean_ag != ag:
|
| 269 |
+
mapping[clean_ag] = seros[i]
|
| 270 |
return mapping
|
| 271 |
|
| 272 |
|
|
|
|
| 373 |
if sero:
|
| 374 |
all_alleles_per_sero.setdefault(sero, set()).add(ag)
|
| 375 |
|
| 376 |
+
# 清理 allele 名稱(移除 /276N, /163N 等後綴)
|
| 377 |
+
def clean_allele(ag):
|
| 378 |
+
return ag.split('/')[0] if '/' in ag else ag
|
| 379 |
+
|
| 380 |
+
# 分組:
|
| 381 |
+
# DQA1/DPA1 (alpha chain, 無 sero) → allele 格式
|
| 382 |
+
# DQB1/DPB1 (beta chain, 有 sero) → 回歸 sero 對照
|
| 383 |
+
# 其他 → sero 對照
|
| 384 |
sero_groups = {}
|
| 385 |
+
allele_groups = {'DQA1': set(), 'DPA1': set()}
|
| 386 |
|
| 387 |
for ag in confident_alleles:
|
| 388 |
+
ag_clean = clean_allele(ag)
|
| 389 |
+
prefix = ag_clean.split('*')[0] if '*' in ag_clean else ''
|
| 390 |
if prefix in allele_groups:
|
| 391 |
+
# DQA1/DPA1 → allele 格式
|
| 392 |
+
allele_groups[prefix].add(ag_clean)
|
| 393 |
else:
|
| 394 |
+
# DQB1/DPB1 和其他 → sero 對照
|
| 395 |
sero = a2s.get(ag)
|
| 396 |
+
if not sero:
|
| 397 |
+
sero = a2s.get(ag_clean)
|
| 398 |
if sero:
|
| 399 |
+
sero_groups.setdefault(sero, set()).add(ag_clean)
|
| 400 |
|
| 401 |
# 排序: 按 locus 再按數字
|
| 402 |
import re as _re
|
|
|
|
| 438 |
# 兩個以上 allele → 全部列出
|
| 439 |
parts.append(f'{sero}({" ".join(sorted(conf))})')
|
| 440 |
|
| 441 |
+
# DQA1/DPA1 allele groups (alpha chain, 無 sero 對照)
|
| 442 |
+
for prefix in ['DQA1', 'DPA1']:
|
| 443 |
alleles = allele_groups[prefix]
|
| 444 |
if alleles:
|
| 445 |
+
if len(alleles) == 1:
|
| 446 |
+
# 單一 allele → 不加括號: DQA1*01:03
|
| 447 |
+
parts.append(list(alleles)[0])
|
| 448 |
+
else:
|
| 449 |
+
# 多個 → 加括號: DQA1(*01:03 *05:05)
|
| 450 |
+
short = sorted('*' + a.split('*')[1] for a in alleles)
|
| 451 |
+
parts.append(f'{prefix}({" ".join(short)})')
|
| 452 |
|
| 453 |
return ' '.join(parts)
|
| 454 |
|