如何在IGV上使用BLAT搜索非模式物种

IGV提供了BLAT,用于进行序列搜索,但可惜我一直用不上,因为它默认是调用了UCSC的CGI工具,将我们的输入序列发送到https://genome.ucsc.edu/cgi-bin/hgBlat处理,处理后返回JSON文件用于展示。因此,除非我们自己搭建一个UCSC类似的网站,否则,无法用到IGV的这个功能。

徒有其表的按钮

我觉得肯定不只是我一个人有这个问题,所以我就去谷歌上用关键词 "custom genome BLAT IGV" 进行检索, 果然发现有很多人都有类似的需求,我找到最早一条是2016年,但是距今6年了,仍旧没有一个直观有条理的文章介绍应该怎么做。于是就有了这篇文章。

之所以没有一篇合适的教程,是因为很多人(包括我在内)都冲着自建UCSC的网页服务,然而这条路非常的艰难。但是经过我的检索和测试后,我发现,我们实际上只需要做到向服务器发送一条请求,然后得到包含所需信息的JSON即可。

本篇教程要求

  • Windows10的WSL或者Linux虚拟机或者有管理员权限的Linux服务器(ubuntu系统)

  • IGV ≥ 2.10.3

配置BLAT

我们可以用其他工具代替BLAT,只要保证返回的输出结果是PSL格式或者能转成PSL格式即可。

首先,安装BLAT

wget https://users.soe.ucsc.edu/~kent/src/blatSrc35.zip
unzip blatSrc35.zip

export MACHTYPE=x86_64
mkdir -p ~/bin/$MACHTYPE

# 软件安装在$HOME/bin/x86_64下
make -j 

接着,将fa转成2bit格式,方便blat调用

# 家目录
mkdir genomes
cd genoems
mkdir twoBit
# 设置参考基因组组, 例如Athaliana
ref=Athaliana.fa
$HOME/bin/x86_64/faToTwoBit $ref twoBit/Athaliana.2bit

配置Apache CGI

在安装了blat之后,下一个问题就是如何让服务器调用。这里我使用的是Apache的CGI服务。CGI全称是Common Gateway Interface,公共网关接口,根据维基百科的定义,CGI就是用于让服务器执行外部程序,特别是处理用户的请求

In computing, Common Gateway Interface (CGI) is an interface specification that enables web servers to execute an external program, typically to process user requests.[1]

首先,我们需要安装Apache。Ubuntu就是运行如下的命令

sudo apt install apache2

默认apache的配置文件在 /etc/apache2下,没有启用CGI模块,因此我们需要先启动这个模块

#该目录记录的是哪些模块被启用了
cd /etc/apache2/mods-enabled
# 添加cgi.load
sudo ln -s ../mods-available/cgi.load .

重新加载即可

sudo service apache2 reload

为了测试CGI服务器是否打开,我们创建一个 hw.sh 进行测试,将其复制到 /usr/lib/cgi-bin

#!/bin/bash
printf "Content-type: text/html\n\n"
printf "Hello World!\n"

通过curl向我们的网页服务器发送一个请求,会返回 Hello World!.

# 启用cgi-bin
$ curl http://127.0.0.1/cgi-bin/hw.sh
Hello World!

在确认CGI服务器启动之后,那么就可以将我用Python编写用于处理BLAT请求的CGI脚本,我将其命名为 myBlat ,复制到/usr/lib/cgi-bin下。

该代码比较简陋,没有考虑多个参考基因组的情况,也没有各种报错检测,但至少能运行了

#!/usr/bin/env python3
import os
import json
import cgitb
import cgi
import tempfile
import subprocess

cgitb.enable(display=0, logdir="/tmp/logdir")

form = cgi.FieldStorage()
seq = form.getvalue("userSeq")
db = form.getvalue("db")

# 需要改成你实际的blat路径
blat = "/home/xzg/bin/x86_64/blat"
# 需要改成你实际的参考位置
ref = "/home/xzg/genomes/twoBit/Athaliana/Athaliana.2bit"

fd1, fa_file = tempfile.mkstemp(suffix=".fa")
fd2, psl_file = tempfile.mkstemp(suffix=".psl")

with open(fa_file,"w") as f:
    f.write(f">query\n{seq}\n")

process = subprocess.Popen([blat, ref, fa_file, psl_file],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
stdout,stderr = process.communicate()

psl_ret = [line for line in open(psl_file, "r") ]
psl_rec = [line.strip().split('\t') for line in psl_ret[5:] ]

print("Context-type: application/json\n")

data =  {
        "track": "blat",
        "genome": "ath",
        "fields": ["matches", "misMatches", "repMatches", "nCount", "qNumInsert", "qBaseInsert", \
                "tNumInsert", "tBaseInsert", "strand", "qName", "qSize", "qStart", "qEnd", "tName", \
                "tSize", "tEnd", "blockCount", "blockSizes", "qStarts", "tStarts"],
        "blat" : psl_rec
}

print(json.dumps(data))

配置IGV

最后,我们回到IGV,选择View里的Preferences

偏好设置

然后选择Adanved, 修改其中的Blat url

http://127.0.0.1/cgi-bin/myBlat?userSeq=$SEQUENCE&type=DNA&db=$DB&output=json

需要注意的是 127.0.0.1 , 因为我用的是WSL,所以网页服务架设在localhost。如果使用的是虚拟机,或者用的是内网服务器,那么该地址,应该是虚拟机或者内网服务器的IP地址。

此外,我们可以注意到这里面有两个$开头的变量,SEQUENCE和DB,分别对应我们输入的序列,以及我们当前参考基因组的名字,Athaliana.fa.

BLAT运行后返回如下界面,点击对应的行,就可以跳转到对应联配中。

BLAT返回结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容