plokmii commited on
Commit
c1ce249
·
verified ·
1 Parent(s): 7aca93e

Upload app.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. app.py +34 -11
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
- # 分組: sero groups + DQA1/DQB1/DPA1/DPB1 獨立
 
 
 
 
 
 
 
370
  sero_groups = {}
371
- allele_groups = {'DQA1': set(), 'DQB1': set(), 'DPA1': set(), 'DPB1': set()}
372
 
373
  for ag in confident_alleles:
374
- # DQA1/DQB1/DPA1/DPB1 alleles 獨立分組
375
- prefix = ag.split('*')[0] if '*' in ag else ''
376
  if prefix in allele_groups:
377
- allele_groups[prefix].add(ag)
 
378
  else:
 
379
  sero = a2s.get(ag)
 
 
380
  if sero:
381
- sero_groups.setdefault(sero, set()).add(ag)
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/DQB1/DPA1/DPB1 allele groups
424
- for prefix in ['DQA1', 'DQB1', 'DPA1', 'DPB1']:
425
  alleles = allele_groups[prefix]
426
  if alleles:
427
- short = sorted('*' + a.split('*')[1] for a in alleles)
428
- parts.append(f'{prefix}({" ".join(short)})')
 
 
 
 
 
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