SNP2HLA HAN.MHC参考的使用

一段时间以来,一直困惑于这个HLA填充参考怎么使用,直到看到了这篇论文课题组的博士论文《中国汉族人白癜风 MHC 区域精细定位研究》。文中较详细描述了怎样使用这个参考,具体过程如下:

1.下载数据集

数据集的原始数据在这里:http://gigadb.org/dataset/100156

只提供了两个文件,感觉和其他的参考数据集的所不同,缺少好几个文件的样子,我也是一直这样困惑,以为作者故意公开信息不全,为了自己的博硕毕业考虑?后来才发现这两个文件已经包含了全部的文件信息。

#下载这两个文件并解压和重命名
wget ftp://parrot.genomics.cn/gigadb/pub/10.5524/100001_101000/100156/HAN.MHC.reference.panel.bgl.gz
gunzip HAN.MHC.reference.panel.bgl.gz
wget ftp://parrot.genomics.cn/gigadb/pub/10.5524/100001_101000/100156/HAN.MHC.reference.panel.markers

2.参考数据集的处理

核心就是这段代码啦,还是挺有用的,自己处理也是可以的,不过有现成的工具就更好啦!

将 bgl.phased 文件转换为 PLINK 软件的 ped 和 map 格式数据;然后,再进一步用 PLINK 软件将上述数据转成二进制的 bed、bim 和 fam 格式文件,再计算每个位点的等位基因频率,得到 FRQ.frq 文件。最终得到 SNP2HLA 软件要求的 MHC区 域 参 考 数 据 集 的 所 有 文 件 , 即 含 有 10,689 例 样 本 的 MHC 区 域(chr6:28,477,833~33,448,188bp)29,948 个位点信息的 markers、bgl.phased、bed、bim、fam 和 FRQ.frq 六个文件,其中的位点包括 HLA 等位基因、HLA 基因对应的氨基酸位点、SNPs 和 Indels 四种类型。

#bgl to ped map 
#!/usr/bin/perl 
use 5.010; 
open IN, "$ARGV[0]"; 
%hash; 
@sample; 
@sex; 
$famid=readline IN; 
@famid=split/\s+/,$famid; 
$nn=1; 
$mm=($#famid-1)/2; 
for($nn..$mm){ 
  push (@sample, $famid[2*$_+1]); 
} 
readline IN; 
readline IN; 
readline IN; 
$gender=readline IN; 
@gender=split/\s+/,$gender; 
$nn=1; 
$mm=($#gender-1)/2; 
for($nn..$mm){ 
  push (@sex, $gender[2*$_+1]); 
} 
for(0..$#sample){ 
  $sexid{$sample[$_]}="$sex[$_]"; 
} 
 
@snp=(); 
while(<IN>){ 
  $line=$_; 
  @line=split/\s+/,$line; 
  $nn=($#line-1)/2; 
  push (@snp,$line[1]); 
  for(1..$nn){ 
   $hash{$famid[$_*2].$line[1]}="$line[$_*2]\t$line[$_*2+1]"; 
  } 
} 
say "@snp"; 
close IN; 
#打印 map 文件 
open IB,">map.txt"; 
foreach my $snp (@snp){ 
  chmop; 
  my @map = qw (0); 
  push (@map,$snp,0,0); 
  say IB "@map"; 
} 
#打印 ped 文件 
open IC,">ped.txt"; 
foreach my $sam (@sample){ 
  chmop; 
  my @new = (); 
  push (@new,$sam,$sam,0,0,$sexid{$sam},1); 
  foreach my $snp (@snp){ 
    chmop; 
   if(defined($hash{$sam.$snp})){        
          push (@new,$hash{$sam.$snp}); 
   }else{ 
    $null=null; 
    push (@new,$null,$null); 
   } 
  } 
say IC "@new"; 
} 

perl bgl2ped.pl HAN.MHC.reference.panel.bgl系统资源消耗还是挺大的, 一般的个人电脑是hold不住的,得上服务器。


运行完成后就获得了map.txt和ped.txt两个文件,生成后重命名到你喜欢的名字就好啦!

mv ped.txt ped.ped
mv map.txt ped.map
plink --file ped --make-bed --out HAN.MHC
plink --bfile HAN.MHC --freq --out HAN.MHC

到这里就获得了参考的全部文件啦,下面需要处理的就是处理你的文件以适应这个参考了。根据nature那篇论文,参考是基于hg18的,SNP2HLA只识别SNP名,不管位置的,所以我们只要把SNP名字改成完全一致的就好啦。

3. 调整数据以适应参考

1)坐标转换

一般我们的芯片是基于hg38/hg19的,所以首先就是把参考中的SNP位置转换到我们的位置。
Lift Genome Annotations (ucsc.edu)
我是用这个网页工具解决的,3万位点左右还是OK的。

2)调整bim文件

这里我用的是自己写的一个简单python脚本解决的,详细如下:

# let snp_name suit for HAN.MHC ref

# get dict
dic = {}
i = 0
maker = ''
with open('dict_hg19-HG18_SY.txt') as f1:
    for line in f1:
        if i ==0:
            i += 1
            continue
        else:
            if line.strip() != "":
                marker = line.strip().split('\t')[5]
                dic[marker] = ''
                dic[marker] = line.strip().split('\t')[0]

    
j = 0
fout = open('changed.bim',"w")
with open('8k.bim') as f:
    for line in f:
        #print(line.strip().split('\t')[0])
        #break
        if line.strip().split('\t')[0] !='6':
            fout.write(line)
        else:
            if line.strip() != "":
                snp = line.strip().split('\t')[1]
                if snp in dic.keys():
                    line = line.strip().split(snp)[0] + dic[snp] + line.strip().split(snp)[1] + '\n'
                    print(line)
                    fout.write(line)
                    #break
                    j += 1
                else:
                    fout.write(line)
print(j)
fout.close()

一般不填充的芯片大概MHC区域大概有几千位点啦!

4.运行

发现基本上十几个样本要运行8个个小时左右的样子,这里我分配了160G的内存,实际看下来十几个样本需要30多G左右。

nohup ~/biosoft/SNP2HLA_package_v1.0.3/SNP2HLA/SNP2HLA.csh ./hla_16  ~/biodata/HAN.MHC/HAN.MHC 16_results ~/data_home/biosoft/SNP2HLA_package_v1.0.3/SNP2HLA/plink 160000 1000 &

5. 结果整理

这里编写了一个R脚本,方便简单提取结果,未填充成功的,多个结果的,均标记为了NA.

# ########################################
# ####Date 2021.12.25#####################
# ####Author ZJD #########################
# ####Version 1.09########################
# ##SNP2HLA结果计算脚本###################
# ########################################
library(tidyverse)
# 读取填充文件
hla_raw <- read.table('./16_results.bgl.phased', sep = ' ', header=TRUE)
# 预备两个结果文件,选择有用行列
hla.2digits.result <- hla_raw[c(1,4),-c(1,2)]
hla.4digits.result <- hla_raw[c(1,4),-c(1,2)]
# 去除多余行
hla_raw <- hla_raw[-c(1,2,3,4),]
# 找到含有HLA的行
hla_raw.2 <- hla_raw[grepl("*HLA*P*",hla_raw[,2]),]
# 提取基因座名
HLA_name <- hla_raw.2[,2] 
# 判断是否有结果
get_na_or_result <- function(result){
  if (length(result)>1) {
    result <- NA
  }
  result
}
# 获得一个基因座的2位和4位结果
get_hla_genotype <- function(hla_one_hap, HLA.gene){
  HLA.gene.2digits.result <- hla_one_hap[grepl(paste0(HLA.gene,'_[0-9][0-9]$'), 
                                               hla_one_hap[,1]),1]
  HLA.gene.2digits.result <- get_na_or_result(HLA.gene.2digits.result)
  if (length(HLA.gene.2digits.result)==0) {
    HLA.gene.2digits.result=NA
  }
  HLA.gene.4digits.result <- hla_one_hap[grepl(paste0(HLA.gene, 
                                                      '_[0-9][0-9][0-9][0-9]$'), 
                                               hla_one_hap[,1]),1]
  HLA.gene.4digits.result <- get_na_or_result(HLA.gene.4digits.result) 
  if (length(HLA.gene.4digits.result)==0) {
    HLA.gene.4digits.result=NA
  }
  HLA.one_gene.result <- list(HLA.gene.2digits.result=HLA.gene.2digits.result, 
                              HLA.gene.4digits.result=HLA.gene.4digits.result)
}
# 主程序,获得每个样本每个基因的分型
for (s in colnames(hla_result)[-c(1,2)]) {
  # 获得每个样本的结果
  hla_one_hap <- hla_raw.2[grepl("P",hla_raw.2[,s]),c("pedigree",s)]
  hla.gene.li <- c('HLA_A', 'HLA_C', 'HLA_B', 'HLA_DRB1', 'HLA_DQA1', 
                   'HLA_DQB1', 'HLA_DPA1', 'HLA_DPB1')
  for (HLA.gene in hla.gene.li) {
    HLA.one_gene.result <- get_hla_genotype(hla_one_hap, HLA.gene)
    hla.2digits.result[HLA.gene,s] <- HLA.one_gene.result$HLA.gene.2digits.result
    hla.4digits.result[HLA.gene,s] <- HLA.one_gene.result$HLA.gene.4digits.result
  }
}
# 文件写出
write.table(hla.2digits.result, 'hla.2digits.result.txt', quote=FALSE)
write.table(hla.4digits.result, 'hla.4digits.result.txt', quote=FALSE)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容