批量预测蛋白质理化性质

原来用perl的LWP::UserAgent模块用在expasy批量做过一批蛋白理化性质预测,但不知为什么现在下载不了啦,决定改用python。一开始用的 urllib.request 模块,能做一部分,但总是会莫名奇妙的断掉,显示是“$HOME/anaconda3/lib/python3.6/http/client.py”文件中有问题,尝试了很多方法均没有解决,最后在网上看到这样一句话,如果 urllib.request 中的问题不能解决的话为什么要用它,而更高级一点的 requests是对urllib的进一步封装,因此在使用上显得更加的便捷,实际应用当中尽量使用requests 。更换成 requests 后显然解决了问题。

想到源代码的话给我留言。

线性回归:模型之母

线性回归模型看上去很简单,简单到让不少人觉得它并没有什么研究和使用的价值。其实并不是这样,线性回归可以说是最重要的数学模型之一,其他很多模型都建立在它的基础之上。为了更好地理解这一点,让我们先来看一个有关数学家的笑话。

一天,数学家觉得自己受够了数学,于是他跑到消防队去宣布他想当消防员。

消防队长说:“您看上去不错,可是我得先给您一个测试。”消防队长带数学家到消防队后院小巷,巷子里有一个货栈、一只消防栓和一卷软管。

消防队长问:“假设货栈起火,您怎么办?”

数学家回答:“我把消防栓接到软管上,打开水龙头,把火浇灭。”消防队长说:“完全正确!最后一个问题,假设您走进小巷,而货栈没有起火,您怎么办?”

数学家疑惑思索了半天,终于答道:“我就把货栈点着。”消防队长大叫起来:“什么?太可怕了!您为什么要把货栈点着?”

数学家回答:“这样我就把问题化简为一个我已经解决过的问题了。”

搭建模型的思路和笑话中数学家的思路一样。当遇到一个新问题时,总是考虑通过某种数学上的变换,将未知的问题转化为已知模型能解决的问题。所以任何一个复杂模型,一层层拨开来,里面可能藏着好多个线性回归模型。因此,线性回归模型很有研究的必要。深入了解它的模型细节能帮助我们理解其他模型,进而指引我们根据实际场景搭建有效的模型。

摘自:唐亘.精通数据科学:从线性回归到深度学习

Matplotlib的样式

今天粗略看了下scikit-learn文档,发现首先第一步需要弄清楚的是python的画图,也就是首先得面对matplot,打算先从matplot学起。在网上搜了下matplot画图的事例,发现比较散乱,不够系统,决定还是先跟着matplot的文档过一遍,然而,首先就面对了一个问题,因为原来用ggplot画图,对ggplot这个样式比较感兴趣,试了下ggplot样式,果然出现了想要的图形,但问题来了,当我测试文档中例子时,怎么都做不出文档中输出的图形,颜色不对,想改成默认的样式,但却不知道怎么改。搜索了很多之后,终于找到了解决的办法,用plt.rcdefaults()。

import matplotlib.pyplot as plt
plt.rcdefaults()

可以用下面符号改变图中标记的样式:

线的样式 描述
'-' 实线
'--' 杠线
'-.' 点杠线
':' 点线
颜色的样式 描述
'b' 蓝色
'g' 绿色
'r' 红色
'c' 青色
'm' 品红
'y' 黄色
'k' 黑色
'w' 白色
标记点的样式 描述
'.'
','
'o'
'v' 下三角
'^' 上三角
'<' 左三角
'>' 油三角
'1' 下三角
'2' 上三角
'3' 左三角
'4' 油三角
's' 方形
'p' 五边形
'*' 星形
'h' 六边形1
'H' 六边形2
'+' 加号
'x' 叉号
'D' 钻石
'd' 细钻石
'\|' 短竖线
'_' 短横线

matplotlib的颜色种类:

Bioperl的简单快速安装

Bioperl 由于涉及到的包太多,需要超过12000的单独的检测,安装起来比较麻烦,而且很多检测都通不过,对于新手过于繁杂,现在bioperl官网介绍了一种简单快速安装的方法————用第三方工具进行安装,经亲自测试,效果非常好,现简要介绍而下。
1 安装perlbrew(https://perlbrew.pl/)
在终端输入

curl -L https://install.perlbrew.pl | bash

如果系统没有curl命令
对于linux系统

wget -O - https://install.perlbrew.pl | bash

FreeBSD系统

fetch -o- https://install.perlbrew.pl | sh

也可以用cpan安装,在终端输入(注意不需要先打开cpan)

sudo cpan App::perlbrew
perlbrew init

如果是用cpan安装,perlbrew程序安装在/usr/bin/perlbrew 或者 /usr/local/bin/perlbrew,默认的perlbrew的根目录是~/perl5/perlbrew 。

2 安装cpanm

perlbrew install-cpanm

3 安装Bio::perl

cpanm Bio::Perl

如果找不到cpanm,就输入cpanm的绝对路径

/root/perl5/perlbrew/bin/cpanm Bio::Perl

如果其中报错缺少哪个模块或者哪个模块版本太老,就先安装报错的模块,我的显示是 Test::More 模块版本太老,我就用cpan “install Test::More”就好了。如果正确安装会显示

–> Working on Bio::Perl
Fetching http://www.cpan.org/authors/id/C/CJ/CJFIELDS/BioPerl-1.007001.tar.gz … OK
Configuring BioPerl-1.007001 … OK
Building and testing BioPerl-1.007001 … OK
Successfully installed BioPerl-1.007001
1 distribution installed

一般在第一步“Working on Bio::Perl”会等一段时间,因为是要下载安装包,只要没有报错,等着就可以了。

Xming + PuTTY 在Windows终端运行图形界面的程序

有些程序需要运行图形界面,特别是用java写的程序,例如R,试着用Xming + PuTTY可以实现。
1、下载xming
这个百度一下吧,我忘了在哪里下了,好像网上介绍的网址有些不对,多试一下就可以。
2、登录xming
第一次登录用XLaunch,一路默认就可以,再点xming运行xming服务。
3、修改putty
Connection\SSH\X11:Enable X11 Forwarding前加对勾,X display Location设为127.0.0.1:0,这里的 0 就是配置 Xming X server 时指定的 Display Number,127.0.0.1是localhost地址,最好写这个IP地址,而不是像网上介绍的写“localhost”。
4、修改SSH配置文件
切换到根用户,vim /etc/ssh/sshd_config
AllowTcpForwarding yes
X11Forwarding yes
如果有“X11Forwarding no”就把它注释掉。
5、安装x11
yum -y install xorg-x11-xauth
6、重启服务器,登录putty后,在终端运行”xterm”就可以了。

TGICL安装和使用

TGI Clustering tools(简称TGICL),是对大量EST或者转录本数据进行快速聚类的软件,也就是将序列进行组装拼接。原理是先用NCBI的megablast先粗略进行聚类,然后用CAP3进行组装。
1、下载
TGICL在sourceforge网站可以下载到(TGICL-2.1.tar.gz),我这里是下载的是最新的2.1版。
2、安装
$tar zxvf TGICL-2.1.tar.gz
$cd TGICL-2.1

$perl Makefile.PL
$make
$make test
$make install
完成

或者
perl Build.PL
./Build
./Build test
./Build install

tgicl就安在用户目录上了,可将刚安装好的perl包和程序分别拷贝到/usr/local/lib64/perl5/ 和/usr/local/bin/perl5/中。
用的时候调用此程序就可以了,如
/usr/local/bin/perl5/tgicl -F /home/用户/all.contigs.fasta

3、安装存在的问题及解决方法
(1)Can’t locate TGI/Mailer.pm in @INC (@INC contains:
那是找不到Mailer.pm,将TGICL-2.1/lib里的文件拷贝到/usr/local/lib64/perl5/中去就可以了。
(2)Can’t locate File/HomeDir.pm in @INC (@INC contains:
那是缺少perl的File/HomeDir.pm包,进入cpan,install File::HomeDir.pm
(3)Package main, File ./tgicl, Line 27 == Failed to find tgicl.cfg config file in
那是因为tgicl.cfg配置文件没有找到,将TGICL-2.1/conf/tgicl.cfg拷贝到tgicl所在的目录,如/usr/local/bin/perl5/。
(4)Use of :locked is deprecated at ……/TGI/DBDrv.pm line 36.
打开此文件,在our $VERSION = ‘0.01’;这句的下面加上一行,
no warnings ‘deprecated’;
###直接忽略掉deprecated警告
(5)运行时产生错误err_tgicl_all_contigs.fa.log文件显示不能运行formatdb程序,因为tgicl是32 bit系统的程序,在64位系统不能运行,要安装32位运行库glibc.i686和libstdc++.i686。直接yum install glibc.i686和yum install libstdc++.i686
(6)error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
安装zlib.i686
sudo yum install zlib.i686

CentOS7 安装php5.6+nginx1.7.5

由于版本的变化最新的php和nginx安装与配置和前面版本的有稍许差异,首先卸载旧版本,下载最新的软件的软体安装包,安装方法可以参照centos 7 min 编译安装php5.6+nginx1.7.5 笔记这里主要补充一点,就是怎样在nginx中运行php的问题。如果是想单独建一个www的用户的话,上面的安装的基础上需要做如下修改。
1、创建www用户
groupadd www
useradd -g www www -s /bin/false
2、修改nginx.conf配置文件
vi /usr/local/nginx/conf/nginx.conf
user www www; #首行user去掉注释,修改Nginx运行组为www www;必须与/usr/local/php/etc/php-fpm.conf中的user,group配置相同,否则php运行出错,具体方法是打开php-fpm.conf文件,如果在上面路径中找不到这个文件,就在安装包里面找到复制到这里,找到有user和group的行,去掉前面的;号,将nobody改为www。
3、重启nginx和php-fpm
nginx -s reload
/usr/local/php/sbin/php-fpm
4、测试
在www用户目录下创建test.php文件,输入;在浏览器中找开就可以看到PHP配置情况。

centOS7 安装mysql5.6

因为mysql被Oracle收购后会逐渐走向收费,为避免以后的版权纠纷,centos7已经不支持mysql,而是内部集成mariadb代替,而安装mysql的话会和mariadb产生文件冲突,所以安装mysql前要先卸载mariadb。
1、卸载mariadb
rpm -e mariadb-libs-5.5.37-1.el7_0.x86_64
###会提示错误:依赖检测失败
###加上–nodeps参数强制卸载
rpm -e –nodeps mariadb-libs-5.5.37-1.el7_0.x86_64
如果找不到就用yum -y remove mariadb-libs.x86_64
2、下载mysql5.6
centos7等同与Red Hat7,下载此版本下的MySQL-client-5.6.21-1.el7.x86_64 .rpm MySQL-server-5.6.21-1.el7.x86_64.rpm就可以了,如果点击Download会提示你要先登录Oracle帐户,如果没有帐户或者不想登录,在其它地方下载相同的包也可以,如果不想在其它地方找又没有Oracle帐户,顺便注册一个就可以了。
如果嫌麻烦,也可一个FTP站点下载,里面包含了几乎所有的mysql版本。
3、安装mysql
进入到安装包所在目录
rpm -ivh MySQL-client-5.6.21-1.el7.x86_64.rpm
rpm -ivh MySQL-server-5.6.21-1.el7.x86_64.rpm
也可从源代码安装,不过先得安装cmake,软件包为mysql-5.6.24.tar.gz
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc
make
make install
4、生成mysql系统数据库
如果你马上登录mysql会提示找不到/var/lib/mysql/下的sock文件,因为还没有生成系统数据库。
mysql_install_db –user=mysql –basedir=/usr/share/mysql
###生成mysql系统数据库
5、登录mysql
mysql_install_db –random-passwords
###生成随机密码
随机密码保存在$HOME/.mysql_secret文件中,打开这个文件,找到密码。
mysql -u=root -p
###登录mysql,输入随机密码
6、修改root密码
mysql> SET PASSWORD FOR root@localhost=PASSWORD(‘yourpassword’);
###这时不要想着运行其它语句,初次登录时只能改密码
退出mysql
7、添加用户和数据库
用新密码重新登录数据库,创建用户和数据库

基因注释

很多人觉得基因注释很高深,特别对于那些不太懂编程的来说,感到无从下手,去年我也折腾了差不多半年,最后发现也就那么回事。一开始我是找各种基因注释的工具,例如研究geneontology自带的perl程序,里面涉及了众多模板,而且是模块里面又有模块,运行时不是少了这个模块就是那个模块有问题,最后折腾了两三个月也没有得到理想结果。后来用了blast2go这个程序用起来是没有问题,可实在是太慢,几个小时下去,泡都不冒一个。最后默默在躺在床上反思,我的目的是什么,注释的原理是什么。按照这个思路,慢慢的去找这些问题的答案,最后终于开窍了,想明白了真的好简单,现将思路简单归纳如下:
1、基因注释方法
1)根据已注释的信息,利用序列相似性原则,去注释未知序列。
2)查找文献资料注释基因功能。
基因批量注释的话都是采用第一种。
2、所需资料
1)将需要注释的序列翻译成氨基酸序列;
2)下载现有的已注释的蛋白序列(uniprot_sprot.fasta.gz,文件大小为78MB);
3)下载联系蛋白序号和注释号(GO的accession)的文件(idmapping.td.gz,文件大小为2.17G);
4)下载最新的GO数据库文件assocdb-data.gz
3、注释方法
1)利用formatdb格式化已注释的蛋白序列为blast库;
2)将需要注释的序列与blast库做blast;
3)找到与需注释序列相似度高的蛋白序列号;
4)找到这些蛋白序列号对应的注释号(GO号);
5)用GO号在GO数据库文件中的term表中找到注释信息或者在geneontology官网用GO号就可以查到详细的注释信息;

如果用NCBI数据库,方法也差不多,先下载已注释的蛋白序列,格式化数据成blast库,将需注释的序列与这个blast库比对,找到相似度高的已注释的蛋白序列号,用此序列号用NCBI中gene_info.gz和gene2access找到蛋白序列的gene号,然后将此号用gene2go数据找到go号,最后用go号找到其注释信息就行了。

如果按照以上方法操作的话,其实基因注释非常简单,几乎只要做个blast,然后将信息对应过来就可以了,远没有那么复杂。

Perl输出函数传递的二维数组

最近用DBI模块写个了mysql接入函数,但得到的return一直不能输出结果,后来经过思考,原来是二维数组传递的问题,终于解决了,特此为记。

下面这个是mysql接入函数:

sub mysql_connect(){
        use DBI;
	my ($sql,$db)=@_;
	my $usr="selectonly";
	my $passwd="yuyin_110";
	my $dbh=DBI->connect("DBI:mysql:$db",$usr,$passwd);

	if(!$dbh){
		print "connect lost\n";
	}else{
		my $sth=$dbh->prepare($sql)or die "Can’t prepare $sql: $dbh->errstr\n";
		$sth->execute()or die "Can’t execute the query: $sth->errstr";
		my $data=$sth->fetchall_arrayref();
		$sth->finish;
		return $data;
	}
}

现在的问题是输出$data的内容,而$data返回的是一个二维数组的引用地址,可以用以下方法分层输出这个数组:

	my $sql="select * from test limit 1000";
	my $b=mysql_connect($sql,"test");
	my @r=@$b;    #####因为$b获得的只是一个引用地址,可以用@变成数组,这个数组这储存了一系列一维数组地址
	foreach(@r){
		my @each=@$_;            ######道理与获得二维地址一样
		foreach(@each){
			print  $_."\t";
		}
		print  "\n";

	}