将台式机上的NDNSIM1.0(包含实验脚本和转发策略代码)移植到Mac上的问题
Overviewg++编译选项-Werror的问题自己编写的模块编译问题 Overview 这篇文章是我很久之前移植NDNSIM1.0时的笔记，最早想从台式机的Ubuntu 12.04上移植到别的机器的Ubuntu上，都会出现各种编译问题，一直没能成功，之后想在Mac上做实验，所以下决心把台式机中的NDNSIM 1.0的源代码移植到Mac上，主要遇到了以下问题，做了一下记录，以备以后查看。这个移植应该不只是移植到Mac上的方法，而是适用所有Ubuntu系统的。 g++编译选项-Werror的问题 将源代码编译之后，运行./waf报以下错： ../src/ndnSIM/model/wire/ccnb/ccnb-parser/syntax-tree/block.cc:43:15: error: unused variable 'CCN_MAX_TINY' [-Werror,-Wunused-const-variable] 如下图： 这个问题经常出现在NDNSIM移植的过程中。主要是由于NS3中编译时，自动加了-Werror选项，该选项会把编译中遇到的警告全部当错误处理，因此会报错。 解决方法: 使用以下编译命令: CXXFLAGS="-O0 -g" ./waf configure --with-python=/opt/local/bin/python2.7 --enable-examples 代替原来的： ./waf configure --with-python=/opt/local/bin/python2.7 --enable-examples 显式去除-Werror选项即可。 自己编写的模块编译问题 由于我在NS3中，添加了一个叫做ndnPlaneFow的模块，用于做实验，发现编译之后，使用./waf运行，会报以下错误： ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 详细错误如下图： 可见，ndnPlaneFow模块里的源文件在链接上找不到ndnSIM模块的依赖文件。 解决方案： 在ndnPlaneFow模块的wscript文件的编译依赖中，添加ndnSIM： module = bld.create_ns3_module('ndnPlaneFow', ['internet', 'propagation', 'antenna', 'applications','ndnSIM']) 现在就可以在Mac成功编译和运行了NDNSIM了。
Typecho文章评论时评论者头像引发的性能问题
Overview评论者头像提供服务怎么找到Common.php小结 Overview 最近在阅读博客中的文章时发现一个奇怪的现象，就是有评论的文章加载速度特别慢，代码块的颜色渲染也要等很久才能显示出来。这让我很困惑，因为我将代码块高亮渲染的代码也放在了本地。最初我以为是代码块中的代码太多，导致渲染时间久。后来发现只有有评论的文章才会出现这种情况，使用了Chrome发现，有评论的页面会出现http://www.gravatar.com/avatar/#####链接请求失败。#####是我省略的一串不可读字符串，后面会说这些字符串是什么。 因为http://www.gravatar.com/avatar这个服务不可用，所以导致页面一直在等待这个网址的回复，直到超出响应时间，才会运行接下来的动作，比如渲染代码块高亮颜色。 评论者头像提供服务 其实blog在显示评论者图片时，并不是显示本地的图片或者评论者自己设定的图像，而是用用头像提供网站服务给评论者一个特定的头像，想知道具体细节，就需要查看下面的文件。 打开blog/var/Typecho/文件夹中的Common.php文件，找到下面的代码： $url = $isSecure ? 'https://secure.gravatar.com' : 'http://www.gravatar.com'; $url .= '/avatar/'; 这里定义了取头像的地址，即https://secure.gravatar.com/avatar或者https://gravatar.com/avatar。 总不能所有的评论者都用一样的图片吧，继续查看紧接着下面的代码： if (!empty($mail)) { $url .= md5(strtolower(trim($mail))); } 原来Typecho根据评论者提供的邮箱，进行md5转化，形成一串字符串，就可以形成一个新的请求链接：http://www.gravatar.com/avatar/#####，这里的#####就是这个md5编码之后的字符串。但是这个请求不只有邮箱md5之后这一个字符串，还有下面几个参数： $url .= '?s=' . $size; $url .= '&r=' . $rating; $url .= '&d=' . $default; 这三个参数从在后台的设置->评论中的选项中读取数据，比如$rating取的数据就是 启用Gravatar头像服务, 最高显示评级为## 的头像，这里的##有一下选项： G - 普通 PG - 十三岁以上 R - 十七岁以上成人 X - 限制级 知道了这些以后，我们要做的就很简单了，只需要修改头像服务提供站点就可以了。将Common.php中的 $url = $isSecure ? 'https://secure.gravatar.com' : 'http://www.gravatar.com'; $url .= '/avatar/'; 替换为 $url = 'http://cdn.v2ex.com/gravatar/'; 我们这里使用的是国内很好的一个程序员社区V2EX提供的CDN服务，速度很快。 如果你想在评论时显示一个自定义头像，去 www.gravatar.com 注册一个账号，并上传一张自己喜欢的头像，就可以了。如果你没设置过，这个网站也会给你返回一个默认头像。 现在评论之后，就可以出现评论者的头像了，而且速度非常快。 怎么找到Common.php 可能有人会好奇，我怎么恰好知道在Common.php里面修改呢。这其实是个通用的方法： 在我用Chrome查看完页面之后，就知道http://www.gravatar.com的网站服务提供方出现了问题，既然后台没办法设置这个，那一定是在代码中哪个地方设置的。 在blog的根目录，使用下面的linux命令查找所有包含gravatar.com的文件： grep -nr gravatar.com . 输出下面的结果： ./admin/profile.php:14: <a href="http://gravatar.com/emails/" title="<?php _e('在 Gravatar 上修改头像'); ?>"><?php echo ' mail, 220, 'X', 'mm', $request->isSecure()) . '" alt="' . $user->screenName . '" />'; ?> ./var/Typecho/Common.php:939: $url = $isSecure ? 'https://secure.gravatar.com' : 'http://www.gravatar.com'; ./var/Widget/Options/Discussion.php:54: 'commentsAvatar' => _t('启用 Gravatar 头像服务, 最高显示评级为 %s 的头像' 可以看到，有三个文件包含了gravatar.com，分别是./admin/profile.php的第14行，./var/Typecho/Common.php的第939行，./var/Widget/Options/Discussion.php的第54行，./表示当前搜索的位置。 查看这三个文件，会发现profile.php和Discussion.php对应后台管理界面的两个页面，Common.php就是定义头像服务网址的地方。 小结 这个问题本身非常小，但是给网站本身带来的性能影响是非常大的，而且当管理员登陆后台，进入管理菜单下的评论页面时，居然会直接导致站点宕机，需要重启Apache服务器才可以。因此小的细节对整体的影响还是很大的，自己写代码的时候也要多多注意。
OverviewMathJax公式插件下载MathJax开源库上传到服务器修改代码font-awesome下载font-awesome.min.css上传到服务器修改代码下载font-awesome资源文件 Overview 由于在写笔记的时候会用到公式，因此使用了一个插件MathJax，可以很漂亮显示公式，但是发现用了这个插件之后，有公式显示的页面加载特别慢，使用Chrome查看了链接请求，发现了问题所在：这个插件会请求 cdn.mathjax.com 上的js代码，而 cdn.mathjax.com 的服务器非常不稳定，因此经常需要等待很久，网页才能正常显示。 好在因为Chrome会缓存js，css，图片等信息，因此通常这种情况会发生在用户第一次访问或者定期清理了缓存之后。 为了有更好的用户体验和加载速度，我把插件MathJax插件用到的库放到了我们自己的服务器上。 修改之后，发现还有外链，干脆直接一起给放到服务器上了。 MathJax公式插件 下载MathJax开源库 这里的MathJax库是指插件用到的开源库，可以在github上下载到：https://github.com/mathjax/MathJax attention here 2024年12月10号更新 最新版本的MathJax已经改变了目录结构，根目录中已经不再有我们下面会用到的MathJax.js文件了，所以这里提供一个以前的历史版本下载：https://github.com/mathjax/MathJax/releases/tag/2.6.0。从这个页面的末尾点击Source code链接下载。 上传到服务器 下载之后解压缩，重命名为MathJax，我放在了blog的一个目录下：blog/usr/uploads/js。 修改代码 在blog/usr/plugins中找到MathJax.php，MathJax.php就是插件MathJax的所有文件，编辑MathJax.php，找到下面这行代码： echo ' '; 可以看到src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"，修改为src="http://####/blog/usr/uploads/js/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"就可以了。 这里的http://####/blog就是我们博客的地址，可以看得出来，我们修改插件，让他指向了放在服务器上的MathJax库。attention here 2024年12月10号更新 如果下载的是最新版本的，会发现目录更改了，已经没有MathJax.js了，需要引用新的文件MathJax/es5/tex-mml-chtml.js，可以相应地修改为src="http://####/blog/usr/uploads/js/MathJax/es5/tex-mml-chtml.js?config=TeX-AMS-MML_HTMLorMML"就可以了（欢迎反馈）。 现在重新打开网站涉及公式的文章，瞬间响应。 font-awesome 修改了MathJax插件之后，发现还是有外链存在，借助Chrome看了下博客的外链请求，发现下面的外链指向：http://apps.bdimg.com/libs/fontawesome/4.2.0/css/font-awesome.min.css，想了下还是放在自己的服务器上吧，一来是可以加速访问，二来可以防止哪天别人不提供服务了，我们就没办法加载这个css文件了。 下载font-awesome.min.css 直接从http://apps.bdimg.com/libs/fontawesome/4.2.0/css/font-awesome.min.css就可以打开这个css，右键另存就可以了。 上传到服务器 我们把自己保存的font-awesome.min.css上传到blog所在的文件夹下blog/usr/themes/jianshu/css，因为我们使用了jianshu主题，为了方便，我直接放在了jianshu的css文件夹中。 修改代码 找到 ，将下面这句代码： 修改为 <link rel="stylesheet" href="<?php $this->options->themeUrl('css/font-awesome.min.css'); ?>"> 就可以访问到我们服务器上的font-awesome.min.css了。 下载font-awesome资源文件 重新加载网页，发现网站上的小图标都没了！我开始去了解下font-awesome是什么，找到下面的解释： Font Awesome 是为 Twitter Bootstrap 设计的图标字体。通过Web Font的方式来显示一些图标，好处是图标可以被任意缩放、改变颜色，你需要做的只是像修改文字样式那样修改图标样式。 清楚它的作用之后，再仔细查看font-awesome.min.css文件，发现里面有几处代码，举一例说明： src:url('../fonts/fontawesome-webfont.eot?v=4.2.0'); src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') 原来font-awesome.min.css定义的样式中用到的素材库我们没有放在服务器上。 从github上下载下来完整的font-awesome库：https://github.com/FortAwesome/Font-Awesome。下载之后解压缩，把其中的font文件夹上传到blog/usr/themes/jianshu文件夹中，跟这个文件夹中的css文件夹一个层级。 现在访问，就可以正常使用我们的网站了。
Overview1.DISOPRED的下载2.DISOPRED的安装2.1 常规的安装步骤2.2 MAC下的不兼容3.DISOPRED的配置4.DISOPRED的使用 Overview DISOPRED是一个蛋白质内部非结构区域的预测软件，使用DISOPRED，我们可以很方便地得到一个蛋白质序列的非结构区域信息，能够为蛋白质特征分析提供更多的信息。 1.DISOPRED的下载 去http://bioinfadmin.cs.ucl.ac.uk/downloads/DISOPRED/这里就可以下载各个版本的DISOPRED，这里我们下载最新版本的DISOPRED3.16.tar.gz。 2.DISOPRED的安装 因为DISOPRED也是以源码包的形式提供下载，因此也需要下载之后自己编译。先将下载好的 解压解压之后的文件夹为DISOPRED，进入DISOPRED目录，按照README文件的步骤安装。 2.1 常规的安装步骤 进入DISOPRED目录，使用下面的三行命令安装： make clean make make install 如果是linux的话通常就可以正常使用了。 2.2 MAC下的不兼容 如果是MAC系统，会有两个地方需要修改。 在执行make这一步的时候会报以下错误： disord_pred.c:246:43: error: use of undeclared identifier 'CLKRATE' runtime += (double) abs(temp - last_t) / CLKRATE; ^ disord_pred.c:248:59: error: use of undeclared identifier 'CLKRATE' runtime += (double) (0x7fffffff - last_t + (temp + 1)) / CLKRATE; 查看disord_pred.c，我们发现下面的几行代码： #ifdef unix #define CLKRATE 1000000 #endif 这个宏在unix系统下才定义了CLKRATE变量，因此在MAC下编译时就会报CLKRATE未声明的错误，我们在disord_pred.c中上面这几句代码后面添加如下代码： #ifdef __MACH__ #define CLKRATE 1000000 #endif 这样在MAC系统下一样会执行#define语句，重新执行make命令，这次就可以顺利通过了。 在执行make install的时候会报以下错误： mv -t ../bin disopred2 diso_neu_net diso_neighb combine svm-predict mv: illegal option -- t usage: mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory make: *** [install] Error 64 查看Makefile文件，发现下面的代码： install: mkdir ../bin/ mv -t ../bin disopred2 diso_neu_net diso_neighb combine svm-predict 可以看出来，make install步骤就是在DISOPRED目录下建立一个bin文件夹，并将make步骤中生成的可执行程序都复制到bin文件夹下，只是在使用mv命令时用了-t参数，MAC下不支持这个参数，所以我们用下面的mv命令替换上面的mv -t命令，修改后如下： install: mkdir ../bin/ mv disopred2 diso_neu_net diso_neighb combine svm-predict ../bin/ 注意，修改完之后，需要重新执行make clean和make步骤，再执行make install就可以了。 3.DISOPRED的配置 安装成功之后，我们就可以通过DISOPRED目录下的run_disopred.pl脚本使用DISOPRED程序了。 但在使用之前，我们还需要配置一下run_disopred.pl脚本，打开这个脚本，找到下面的代码： ## IMPORTANT: Set the paths to folder with the NCBI executables and to the ## sequence database my $NCBI_DIR = "/home/bin/blast-2.2.26/bin/"; my $SEQ_DB = "/home/uniref/uniref90"; 在有了SCRATCH和PSIPRED的使用经验之后，我们很容易就知道这两行代码的意思，那就是设置DISOPRED调用BLAST程序的路径以及配置BLAST程序所要用到的数据库。 因为我们已经将BLAST程序加入了$PATH路径，所以在使用时我们不再需要指定绝对路径，因此我们通过下面的代码修改这两个变量，如下所示： ## IMPORTANT: Set the paths to folder with the NCBI executables and to the ## sequence database my $NCBI_DIR = ""; my $SEQ_DB = "/Users/wangjiawei/Bioinformatics/Data/blast/uniref50"; 其中/Users/wangjiawei/Bioinformatics/Data/blast/uniref50为我们为BLAST配置的数据库的地址。 4.DISOPRED的使用 现在我们就可以通过run_disopred.pl脚本使用DISOPRED程序了。在examples文件夹中，也提供了example.fasta和small_example.fasta供测试使用。使用下面的命令运行DISOPRED程序： ./run_disopred.pl examples/example.fasta 产生如下输出结果： Running PSI-BLAST search ... Generating PSSM ... Predicting disorder with DISOPRED2 ... Running neural network classifier ... Running nearest neighbour classifier ... Combining disordered residue predictions ... Predicting protein binding residues within disordered regions ... Cleaning up ... Finished Disordered residue predictions in /Users/wangjiawei/Bioinformatics/Softwares/DISOPRED/examples/example.diso Protein binding disordered residue predictions in /Users/wangjiawei/Bioinformatics/Softwares/DISOPRED/examples/example.pbdat 多数时间还是花在Running PSI-BLAST search ...这一步，以及Running nearest neighbour classifier ...
Overview1.BLAST的下载和安装2.关于BLAST可执行程序的配置2.1 PSIPRED中对BLAST程序的调用2.2 SCRATCH中对BLAST程序的调用3.关于BLAST本地数据库的配置3.1 SCRATCH中对BLAST数据库的使用方式最容易出错的就是-d数据库路径的指定。3.2 PSIPRED中对BLAST数据库的使用方式 Overview 因为在使用PSIPRED和SCRATCH都使用到了BLAST，安装和使用的过程中遇到了一些问题，这里主要记录下BLAST安装和使用过程中遇到的一些问题，并没有详细记录完整的BLAST安装和使用说明，毕竟还没有直接使用BLAST，等用到的时候再详细记录。 BLAST，全称Basic Local Alignment Search Tool，即“基于局部比对算法的搜索工具”，能够实现比较两段核酸或者蛋白质序列之间的同源性的功能，具有较快的比对速度和较高的比对精度，适用于多种序列比对的情况，在常规双序列比对分析中应用最广泛。 1.BLAST的下载和安装 其实在PSIPRED的安装和使用中，我们已经详细介绍了BLAST的安装过程，可以先看看这篇文章了解完整的安装过程，这里更多的是剖析PSIPRED和SCRATCH对BLAST的使用。 我们依然假定从ftp://ftp.ncbi.nih.gov/blast/executables/release/2.2.26/下载了2.2.26版本的BLAST，因为BLAST提供下载的不是源码包，而是编译之后的可执行程序，因此是平台相关的，要注意选择与你当前系统匹配的版本（操作系统类型&操作系统位数）。 2.关于BLAST可执行程序的配置 因为下载的BLAST已经是可执行程序，因此不需要编译，可以直接运行，将下载下来的程序解压之后就会得到blast-2.2.26文件夹，打开blast-2.2.26/bin文件夹，就会看到BLAST所有的可执行程序： bl2seq blastclust copymat formatdb impala megablast seedtop blastall blastpgp fastacmd formatrpsdb makemat rpsblast 其中blastpgp就是最常被其他软件使用的BLAST程序。 将BLAST完整的程序执行路径添加到$PATH路径之后，在任何地方都可以直接使用程序名运行程序，而不必使用完整的路径名，以blastpgp为例，可以直接只用blastpgp + 参数而不是使用完整路径/blastpgp + 参数来运行blastpgp。 2.1 PSIPRED中对BLAST程序的调用 事实上，上面虽然配置好了BLAST可执行程序路径，使得我们可以在任何地方方便地运行程序，但是当我们使用runpsipred脚本运行PSIPRED时依然会报blastpgp not found的错误，查看runpsipred脚本，发现以下代码： # Where the NCBI programs have been installed set ncbidir = /usr/local/bin ... $ncbidir/blastpgp -b 0 -j 3 -h 0.001 -d $dbname -i $tmproot.fasta -C $tmproot.chk >& $tmproot.blast ... $ncbidir/makemat -P $tmproot runpsipred脚本使用的/usr/local/bin/blastpgp访问blastpgp，因此找不到blastpgp，改为下面的代码，直接调用blastpgp和makemat。 # Where the NCBI programs have been installed set ncbidir = /usr/local/bin ... # modified blastpgp -b 0 -j 3 -h 0.001 -d $dbname -i $tmproot.fasta -C $tmproot.chk >& $tmproot.blast ... # modified makemat -P $tmproot 2.2 SCRATCH中对BLAST程序的调用 如果不是在执行SCRATCH程序时报了blastpgp的错误，你很难感觉到SCRATCH中BLAST的存在，因为SCRATCH的README中没要求你安装和配置BLAST. 这是因为SCRATCH自带了一个32位的linux安装包，不能在Mac或者64位的linux系统上执行。 按照 SCRATCH的安装和使用 中的方法下一个正确的版本解压之后覆盖原来cd Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg中的blast-2.2.26文件夹就行了。 如果你下的版本不是blast-2.2.26或者替换之后文件夹不叫blast-2.2.26，比如你的文件夹叫blast,你需要修改SCRATCH-1D_1.1/pkg/PROFILpro_1.1/env文件夹中的PROFILpro.sh文件，将下面这一行： export PROFILpro_BLAST_INSTALL_DIR="/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/blast-2.2.26" 改为 export PROFILpro_BLAST_INSTALL_DIR="/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/blast 为什么是在这里修改，原因是PROFILpro_1.1程序负责调用与BLAST有关的程序，生成供后面程序使用的中间文件。因此与BLAST有关的环境变量都存放在了SCRATCH-1D_1.1/pkg/PROFILpro_1.1/env文件夹中的PROFILpro.sh文件中。后面的我们要说的BLAST的数据库配置，也是需要从这里入手才能清楚整个流程。 3.关于BLAST本地数据库的配置 BLAST作为一个基于局部比对算法的搜索工具，核心功能自然是从数据库中搜索蛋白或者核苷酸序列。因此BLAST需要正确配置数据库，这样BLAST程序才可以正确访问到数据库。 仍然以BLAST中的blastpgp为例，下面这句： blastpgp -i example.fasta -d uniref90filt 运行了blastpgp。其中-i 指定了程序的输入文件；-d指定了程序要查询的数据库，如果没有配置数据库，这里-d需要指定数据库存放的绝对路径，很不方便。 3.1 SCRATCH中对BLAST数据库的使用方式 尽管运行程序时用-d指定数据库的完整路径不是很方便，但是SCRATCH中在使用BLAST时就是采用这种方式，因为SCRATCH在SCRATCH-1D_1.1/pkg/PROFILpro_1.1/data/uniref50下，存放了完整的uniref50数据库，直接使用绝对路径指向数据库，也就减少了用户自己配置的复杂性，这也是为什么SCRATCH程序解压之后有6G+的原因。 PROFILpro_1.1程序使用SCRATCH-1D_1.1/pkg/PROFILpro_1.1/bin/generate_profiles.sh脚本作为程序开始的入口，我们看下这个脚本的部分内容： ... # Project installation folder install_dir="/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/PROFILpro_1.1" ... # Checking project profile profile="${install_dir}/env/PROFILpro.sh"; if [ ! -f "$profile" ]; then echo "$m project profile ($profile) not found"; exit 1; fi # Checking PROFILpro root script profilpro="${install_dir}/lib/generate_profiles.sh"; if [ ! -f "$profilpro" ]; then echo "$m cannot find PROFILpro root script ($profilpro)"; exit 1; fi ... # Running PROFILpro with database UNIREF50 database="UNIREF50"; $profilpro $profile $database $rounds $fasta $output $threads 这里重点看最后一句代码，$profilpro $profile $database $rounds $fasta $output $threads，实际上是调用了SCRATCH-1D_1.1/pkg/PROFILpro_1.1/lib/generate_profiles.sh脚本，并传入环境变量文件SCRATCH-1D_1.1/pkg/PROFILpro_1.1/env/PROFILpro.sh等参数。 继续查看*SCRATCH-1D_1.1/pkg/PROFILpro_1.1/lib/generate_profiles.sh脚本： ... # Checking PROFILpro scripts check_profile="${PROFILpro_LIB_DIR}/check_project_profile.pl" profilpro="${PROFILpro_LIB_DIR}/generate_profiles.pl" ... # Checking requested database db_flag=0; db_dir=""; blastdb=""; if [ "$database" == "UNIREF50" ]; then db_dir="$PROFILpro_UNIREF50_DIR"; blastdb="$PROFILpro_UNIREF50_BLASTDB"; db_flag=1; fi if [ $db_flag -ne 1 ]; then echo "$m unknown database : $database"; exit 1; fi # Running PROFILpro with requested database $profilpro $db_dir $blastdb $rounds $fasta $output $threads 其中的${PROFILpro_LIB_DIR}，$PROFILpro_UNIREF50_DIR，$PROFILpro_UNIREF50_BLASTDB在SCRATCH-1D_1.1/pkg/PROFILpro_1.1/env/PROFILpro.sh中定义： ... # Project Installation Folder export PROFILpro_ROOT_DIR="/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/PROFILpro_1.1" # Project Static Folders export PROFILpro_DATA_DIR="${PROFILpro_ROOT_DIR}/data" export PROFILpro_LIB_DIR="${PROFILpro_ROOT_DIR}/lib" ... # Project Data Folder export PROFILpro_UNIREF50="uniref50" export PROFILpro_UNIREF50_DIR="${PROFILpro_DATA_DIR}/$PROFILpro_UNIREF50" export PROFILpro_UNIREF50_BLASTDB="$PROFILpro_UNIREF50" 因此，SCRATCH-1D_1.1/pkg/PROFILpro_1.1/lib/generate_profiles.sh脚本中最后的$profilpro $db_dir $blastdb $rounds $fasta $output $threads语句，是调用了SCRATCH-1D_1.1/pkg/PROFILpro_1.1/lib/generate_profiles.pl*脚本，并将/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/PROFILpro_1.1/data/uniref50，uniref50等信息作为参数传进去。 继续查看SCRATCH-1D_1.1/pkg/PROFILpro_1.1/lib/generate_profiles.pl脚本: ... # Script Inputs my $usage="database_dir blastdb rounds input_fasta output_file threads"; if($#ARGV!=5){ print "Usage : ./$script_name $usage\n"; exit 1; } my $db_dir=$ARGV[0]; my $blastdb=$ARGV[1]; my $rounds=$ARGV[2]; my $fasta=$ARGV[3]; my $output=$ARGV[4]; my $threads=$ARGV[5]; ... # Preparing Temporary Workspace my $lib_dir=$ENV{"PROFILpro_LIB_DIR"}; my $tmp_dir=$ENV{"PROFILpro_TMP_DIR"}; ... # Starting Jobs In Background my $process_batch="$lib_dir/process_full_batch.pl"; if(! -f "$process_batch"){ print "$m cannot find PROFILpro lib scripts.\n"; exit 1; } for(my $i=0;$i<$num_batchs;$i++){ my $cmd="$process_batch $db_dir $blastdb $rounds $work_dir $batchs_input[$i] "; 我们发现实际上调用了/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/PROFILpro_1.1/lib/process_full_batch.pl，并继续将/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/PROFILpro_1.1/data/uniref50，uniref50等信息作为参数传进去。 查看/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/PROFILpro_1.1/lib/process_full_batch.pl： ... # Script Inputs my $usage="database_dir blastdb rounds work_dir fasta output flag prefix"; if($#ARGV!=7){ print "Usage : ./$script_name $usage\n"; exit 1; } my $db_dir=$ARGV[0]; my $blastdb=$ARGV[1]; my $rounds=$ARGV[2]; my $work_dir=$ARGV[3]; my $fasta=$ARGV[4]; my $output=$ARGV[5]; my $flag=$ARGV[6]; my $prefix=$ARGV[7]; my $m="[$prefix]"; my $f="$work_dir/$flag"; # Third-Party Software my $blastpgp_exe=$ENV{"PROFILpro_BLAST_BLASTPGP_EXE"}; my $blastpgp_opt=$ENV{"PROFILpro_BLAST_BLASTPGP_OPT"}; ... # Processing Protein Sequences open(PROFIL,">$work_dir/$output"); my $next_display=5; for(my $p=0;$p<$num_entries;$p++){ my $id=$entries[$p]; my $prov=$provided{"$id"}; my $seq=$sequence{"$id"}; my $len=$seqlen{"$id"}; my $f_in="$prefix.$id.fa"; my $f_aln="$prefix.$id.aln"; my $f_chk="$prefix.$id.chk"; my $f_mat="$prefix.$id.mat"; open(OUT,">$work_dir/$f_in"); print OUT ">$id\n$seq\n"; close(OUT); my $cmd="$blastpgp_exe -d $db_dir/$blastdb -i $f_in -o $f_aln -C $f_chk -Q $f_mat"; 注意最后一句代码，$ENV{"PROFILpro_BLAST_BLASTPGP_EXE"}和$ENV{"PROFILpro_BLAST_BLASTPGP_OPT"}都从SCRATCH-1D_1.1/pkg/PROFILpro_1.1/env/PROFILpro.sh中得到，进行一下变量替换就会发现实际上调用了/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/blast-2.2.26/bin/blastpgp*程序，其中的-d指定了数据库的绝对路径$db_dir/$blastdb，即/Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/pkg/PROFILpro_1.1/data/uniref50/uniref50。 最容易出错的就是-d数据库路径的指定。 注意这里数据库指定的路径和实际上数据库文件的存放的关系，SCRATCH-1D_1.1/pkg/PROFILpro_1.1/data/文件夹下有一个uniref50文件夹，而这个SCRATCH-1D_1.1/pkg/PROFILpro_1.1/data/uniref50文件夹下，存放的才是BLAST可以访问的数据库文件。查看一下SCRATCH-1D_1.1/pkg/PROFILpro_1.1/data/uniref50目录下的内容： uniref50.00.phr uniref50.00.psq uniref50.01.pin uniref50.02.phr uniref50.02.psq uniref50.03.pin uniref50.04.phr uniref50.04.psq uniref50.00.pin uniref50.01.phr uniref50.01.psq uniref50.02.pin uniref50.03.phr uniref50.03.psq uniref50.04.pin uniref50.pal 共有5G+，因此是分了4段存储的，在-d中只需要指定数据库的名字即可，不需要指定分段信息，BLAST程序会自动查找这个数据库下所有的分段。 值得注意的是，数据库的每一段都有.phr，.psq和.pin三个文件，这三个文件是下载的标准数据库经过BLAST格式化之后的文件，也就是BLAST`可以访问的数据库格式。 3.2 PSIPRED中对BLAST数据库的使用方式 PSIPRED因为没有没有自带数据库，所以需要自己配置数据库。 由于数据库太大了，正好SCRATCH中带了uniref50数据库，就可以直接使用这个数据库，为了通用，我们另起一个专门的地方放置这个数据库，详细的步骤参见PSIPRED的安装和使用。
Overview1.下载SCRATCH-1D2.安装SCRATCH-1D3.验证SCRATCH-1D4.使用SCRATCH-1D Overview 在对氨基酸序列进行机器学习建模时，需要对氨基酸序列做特征提取，越丰富的特征通常可以带来越精准的预测结果，因此可以由原始的氨基酸序列预测出蛋白质的2级结构，水溶性等，丰富特征提取时的特征。 SCRATCH作为UCI开发的一个套件包，提供了多种不同的蛋白质预测功能，这些预测器被打包成一个集成的套件安装包SCRATCH-1D (SCRATCH Suite of One-Dimensional Predictors)。 SSpro Release 5.2 Protein secondary structure prediction (3-class) SSpro8 Release 5.2 Protein secondary structure prediction (8-class) ACCpro Release 5.2 Protein relative solvent accessibility prediction (at the 25% threshold) ACCpro20 Release 5.2 Protein relative solvent accessibility prediction (thresholds 0% to 95%) PROFILpro Release 1.1 Protein evolutionary information / sequence profiles for 1D predictors HOMOLpro Release 1.1 Homology-based secondary structure & solvent accessibility prediction 1D-BRNN Release 3.3 One-dimensional bidirectional recurrent neural networks 上面文档对于这些软件的说明非常清晰明了，这里就不再一一解释。 实际上，SCRATCH-1D还包含了一个BLAST包(BLAST也是PSIPRED运行所需要的安装包，同样由UCI开发)，版本号为blast-2.2.26，32位。官方的文档中也对这个包进行了说明： The linux 32 bit version of blast is delivered by default in the 'pkg' sub-folder of the package for a better compatibility with most operating systems. If this version of blast is not compatible with your operating system or for improved performances on 64 bit systems, please download the blast version matching your operating system at: ftp://ftp.ncbi.nlm.nih.gov/blast/executables/release/LATEST/ and replace the version provided in the package by the downloaded one without changing the installation folder name (even the release number). 如果自带的这个BLAST包不兼容或者需要64位的版本，可以自行去上面的网站上下载。 1.下载SCRATCH-1D 可以通过访问UCI的官方下载页面 http://download.igb.uci.edu/，找到 SCRATCH-1D release 1.1(linux version, 2.7 GB)去下载，后面的 installation instructions和 documentation就是本文参考的官方说明和安装文档。 2.安装SCRATCH-1D 参照installation instructions上面的步骤，可以很容易地安装。 将下载的SCRATCH-1D_1.1.tar.gz压缩包解压，解压后文件夹为SCRATCH-1D_1.1。 tar -xvzf SCRATCH-1D_1.1.tar.gz 进入SCRATCH-1D_1.1。 cd SCRATCH-1D_1.1 运行SCRATCH-1D_1.1目录下的安装脚本install.pl。 perl install.pl 这时命令行输出会提示安装成功，并给出如何验证以及运行SCRATCH-1D。 3.验证SCRATCH-1D 在SCRATCH-1D_1.1中有一个doc文件夹，里面提供了一个测试输入文件test.fasta，以及正确运行程序后应该有的四个输出文件test.hom.ss， test.hom.ss8，test.hom.acc，test.hom.acc20。 假设现在位于SCRATCH-1D文件夹下，首先进入doc文件夹。 cd doc 在这里运行SCRATCH-1D: ../bin/run_SCRATCH-1D_predictors.sh test.fasta test.out 1 这里调用的是SCRATCH-1D/bin目录下的run_SCRATCH-1D_predictors.sh运行脚本，输入文件为test.fasta，输出文件为test.out.*的文件，最后的参数1是程序运行的线程数，如果你的电脑不少于4核，这个数字可以改为4。 到这里为止，本来是应该验证成功，结束。但是如果你的计算机是64位，无论是64位的mac，还是64位的linux，都会在运行SCRATCH-1D时报以下错误： [SCRATCH-1D_predictions.pl] generating sequence profiles... chmod: /Users/wangjiawei/Bioinformatics/Softwares/SCRATCH-1D_1.1/tmp/20150917-214412-150982209579/dataset.pro: No such file or directory [SCRATCH-1D_predictions.pl] failed generating sequence profiles... 原因在于SCRATCH-1D的运行需要调用BLAST，上面已经提到过，SCRATCH-1D已经自带了一个32位版本的blast-2.2.26，位于文件夹SCRATCH-1D_1.1/pkg/中。 在SCRATCH-1D的运行中，需要调用SCRATCH-1D_1.1/pkg/bin/中的可执行程序blastpgp（关于blastpgp程序的详细信息请查看这里），这个32位的程序在64位系统中不兼容，所以需要手动下载一个正确的BLAST版本来替换SCRATCH-1D_1.1/pkg/中的blast-2.2.26。 下面我们依然选择下载一个2.2.26版本的BLAST，对于mac和64位的linux，有两个不同的版本下载，点击网址ftp://ftp.ncbi.nih.gov/blast/executables/release/2.2.26/ 对于Mac用户： 下载 blast-2.2.26-universal-macosx.tar.gz 对于64位Linux用户： 下载 blast-2.2.26-x64-linux.tar.gz 下载完之后解压缩，就会得到一个blast-2.2.26文件夹，用这个文件夹替换SCRATCH-1D_1.1/pkg/中的blast-2.2.26文件夹就可以了。 到这里就真的可以正常使用了，进入SCRATCH-1D_1.1/doc/，运行SCRATCH-1D去分析doc中的test.fasta文件 ../bin/run_SCRATCH-1D_predictors.sh test.fasta test.out 命令行输出以下信息： [SCRATCH-1D_predictions.pl] 4 protein sequence(s) found [SCRATCH-1D_predictions.pl] generating sequence profiles... [SCRATCH-1D_predictions.pl] running SCRATCH-1D predictors... [SCRATCH-1D_predictions.pl] running homology analysis... [SCRATCH-1D_predictions.pl] writing SSpro predictions... [SCRATCH-1D_predictions.pl] writing SSpro8 predictions... [SCRATCH-1D_predictions.pl] writing ACCpro predictions... [SCRATCH-1D_predictions.pl] writing ACCpro20 predictions... [SCRATCH-1D_predictions.pl] job successfully completed! run_SCRATCH-1D_predictors.sh的第一个参数是要输入的fasta序列文件，test.out是输出结果的前缀，../bin/run_SCRATCH-1D_predictors.sh test.fasta test.out共产生四个结果文件，分别是test.out.ss， test.out.ss8，test.out.acc，test.out.acc20。 SCRATCH-1D同样在doc文件夹中提供了test.fasta分析结果的标准结果，可以用来检查我们自己刚才的结果是否正确，与上面四个一一对应的是test.hom.ss， test.hom.ss8，test.hom.acc，test.hom.acc20。 这里我们检查下生成的四个结果是否与系统提供的标准结果一致，以test.out.ss为例，我们可以手动检查test.out.ss与test.hom.ss是不是一样，也可以通过diff命令查看，diff命令会将两个文件逐行比较，并列出内容不同的行。 diff test.hom.acc test.out.acc 结果输出为空，说明两者完全一致。 到这里，SCRATCH-1D的安装就结束了。 4.使用SCRATCH-1D 其实从上面的文字已经可以看出来，SCRATCH-1D是通过SCRATCH-1D_1.1/bin/中的run_SCRATCH-1D_predictors.sh脚本运行的。 任何时候，查看脚本的--help选项总是好的，进入*SCRATCH-1D_1.1/bin/，运行下列命令： ./run_SCRATCH-1D_predictors.sh --help 系统就会列出该脚本的使用方式： Usage : ./run_SCRATCH-1D_predictors.sh input_fasta out_prefix [num_threads] 非常的简单易用，只需要指定输入的fasta文件，输出文件前缀，以及一个可选的线程数，num_threads依据你电脑的实际CPU内核数指定即可。 程序的整体运行还是比较耗时的，以下面的配置为例： 处理器 2.8 GHz Intel Core i5 内存 8 GB 1600 MHz DDR3 运行系统的示例文件（包含4条序列），大约花了10分钟。
Overview1.下载PSIPRED2.安装PSIPRED3.安装BLAST3.1 下载BLAST3.2 安装BLAST3.3 配置BLAST可执行程序当我们运行blastpgp + 参数时，系统在哪里查找blastpgp程序呢3.4 配置BLAST本地数据库注意：blast文件夹中就是uniref50.**等数据库文件了，而不是文件夹uniref50!!注意：官方的说明文档是将下列内容写入.ncbirc，结果BLAST的程序找不到指定位置的数据库。3.5 测试BLAST程序如果数据库没正确配置，程序没能找到数据库的话，上面的命令会没有任何输出，也不会提供错误或者警告信息，非常坑。4.使用PSIPRED4.1 psipred目录说明4.1 运行runpsipred_single4.2 运行runpsipred通常情况下来说，这里会报错。 Overview 在对氨基酸序列进行机器学习建模时，需要对氨基酸序列做特征提取，越丰富的特征通常可以带来越精准的预测结果，因此可以由原始的氨基酸序列预测出蛋白质的2级结构，水溶性等，丰富特征提取时的特征。 PSIPRED作为一个常用的蛋白质二级结构预测工具，常见于各种蛋白质序列的预测论文中，这里主要记录一下PSIPRED的安装和使用。 其实PSIPRED官方的README文档已经很清楚了，按步骤可以很顺利的安装，只是因为PSIPRED本身运行需要一些额外的软件安装，因此在这里一并记录下来。 1.下载PSIPRED 通过http://bioinfadmin.cs.ucl.ac.uk/downloads/psipred/，可以找到PSIPRED的下载页面，最新的版本为3.5，下载psipred3.5.tar.gz即可。如果有特别的需要，可以去old文件夹里下载对应的版本。 2.安装PSIPRED 下载的psipred3.5.tar.gz是一个源代码包，因此需要自己编译安装一下，步骤如下： 解压压缩文件，得到psipred文件夹。 tar -xvzf psipred3.5.tar.gz 进入psipred文件夹，代码和编译代码的脚本在其中的src文件夹中，继续进入src文件夹 cd psipred cd src 使用make命令编译源代码 make make install 编译通过之后，会生成该软件的可执行程序，在psipred/bin中，查看这个文件夹，就会发现其中的可执行文件psipred。同时，在psipred目录下，还得到了一个运行psipred的脚本文件runpsipred，这个脚本文件设置了运行psipred的一些默认参数，使用runpsipred可以很方便地运行psipred，命令如下： ./runpsipred example.fasta 这里的example.fasta就是需要预测的蛋白质序列文件，确保你的电脑安装了tcsh解释器，因为runpsipred是一个tcsh脚本，mac下已经默认安装，ubuntu下使用： sudo apt-get install tcsh 就可以安装tcsh解释器。 如果你想先测试下psipred，可以使用psipred/example文件夹中的测试文件，这个文件夹下共有三个文件：example.fasta，example.horiz，example.ss和example.ss2。其中example.fasta为输入示例文件，example.horiz，example.ss和example.ss2为输出结果。 有了运行脚本和示例输入，看起来可以试一下了，运行一下命令 ./runpsipred example/example.fasta 发现报了以下错误： /usr/local/bin/blastpgp: Command not found. FATAL: Error whilst running blastpgp - script terminated! 错误提示找不到blastpgp，因此我们需要先安装这个程序。 3.安装BLAST 我们先看一下README中的说明： You must also install the PSI-BLAST and Impala software from the NCBI toolkit, and also install appropriate sequence data banks. The NCBI toolkit can be obtained from URL ftp://ftp.ncbi.nih.gov PSI-BLAST executables can be obtained from ftp://ftp.ncbi.nih.gov/blast 尽管在运行./runpsipred example/example.fasta时，报的错误是找不到blastpgp，但是查看runpsipred文件会发现这个脚本中调用了BLAST中的blastpgp和makemat程序，因此我们需要安装BLAST软件。 其实在另一篇文章SCRATCH的安装和使用中，已经提到了怎样下载BLAST，但是我们也只是下载之后解压缩，替换了SCRATCH-1D_1.1套件中原有的blast-2.2.26文件夹而已，BLAST的安装由SCRATCH-1D_1.1套件统一安装。而PSIPRED本身并未配置和安装BLAST，因此我们需要先自己下载和安装BLAST。 3.1 下载BLAST BLAST原本的实现是C语言实现，官方已经使用了C++重新实现了新的版本BLAST+，并强烈推荐用户使用心的BLAST+，而非原来的BLAST。 但是，PSIPRED官方却强烈推荐用户继续使用BLAST，看看下面的文档： NCBI are now trying to move users to the new BLAST+ package. Please see the README file in the BLAST+ subdirectory for more information on PSIPRED's support for BLAST+. For now the preferred option is to stick with the classic BLAST package as the default. If the tar or rpm file you are downloading from NCBI has "+" in the filename, then you are downloading BLAST+ rather than BLAST. 究其原因，主要是BLAST+在处理蛋白质序列的打分矩阵时做了精度上的降低，因此我们也还是选择一个BLAST版本。 下面我们依然选择下载一个2.2.26版本的BLAST，对于mac和64位的linux，有两个不同的版本下载，点击网址ftp://ftp.ncbi.nih.gov/blast/executables/release/2.2.26/ 对于Mac用户： 下载 blast-2.2.26-universal-macosx.tar.gz 对于64位Linux用户： 下载 blast-2.2.26-x64-linux.tar.gz 下载完之后解压缩，就会得到一个blast-2.2.26文件夹，把这个文件夹放在一个你习惯上放置软件的地方，比如我的，放在了/Users/wangjiawei/Bioinformatics/Softwares中。 3.2 安装BLAST 尽管这节的标题叫做安装BLAST，但其实BLAST不用安装，进入blast-2.2.26文件夹，会发现里面有以下文件： VERSION #文本文件，里面是当前BLAST的版本说明信息 bin #文件夹，编译好的可执行文件，直接可运行，所以不同的操作系统必须下载匹配的BLAST版本 data #文件夹，暂时不知道是干嘛的，不过不影响理解和使用BLAST doc #文件夹，html格式的说明文档，有你所有想了解的BLAST资料。 3.3 配置BLAST可执行程序 我们已经知道了bin中所有的程序都是可执行程序，共有 bl2seq blastclust copymat formatdb impala megablast seedtop blastall blastpgp fastacmd formatrpsdb makemat rpsblast 13种程序，其中的blastpgp和makeat就是PSIPRED软件需要调用的程序。 以blastpgp为例，我们在运行时，可以每次来到当前的bin文件夹内运行./blastpgp + 参数，也可以在任何地方运行/Users/wangjiawei/Bioinformatics/Softwares/blast-2.2.26/bin/blastpgp + 参数。都不是很方便，我们想在任何地方都可以很简洁地运行程序，而不是带一大长串前缀。 有两种方法，可以实现（先说方法，后面再解释为什么）： 为bin文件夹中所有的可执行程序在/usr/local/bin下建立一个软链接。但是不推荐，最重要的原因在于通过这种方式在运行runpsipred时会奇怪的错误。 在根目录下编辑shell的配置文件： 在我的电脑上根目录是/Users/wangjiawei ，在任何位置，输入命令cd，就可以跳转到根目录。 在根目录下使用 ls -la，就发现有一个文件叫.zshrc,这个是zshell的配置文件，如果你使用的是系统默认的bshell，也会发现与bsh相对应的配置文件。 用vim或者别的软件编辑.zshrc: vim .zshrc 添加下面这一行语句，将可执行文件的完整路径添加到PATH变量中。 export PATH=/Users/wangjiawei/Bioinformatics/Softwares/blast-2.2.26/bin:$PATH 重启命令行窗口，或者使用命令source .zshrc使配置生效。 现在我们可以使用blastpgp + 参数直接运行可执行程序。 那么疑问也就来了... 当我们运行blastpgp + 参数时，系统在哪里查找blastpgp程序呢 实际上，当我们直接运行blastpgp时，系统会在/usr/bin，/usr/local/bin，PATH变量包含的路径中查找blastpgp。 上面第一种方式通过添加一个软连接，/usr/local/bin/blastpgp指向/Users/wangjiawei/Bioinformatics/Softwares/blast-2.2.26/bin/blastpgp，因此如果使用第一种方式，系统实际上是通过/usr/local/bin/blastpgp访问了/Users/wangjiawei/Bioinformatics/Softwares/blast-2.2.26/bin/blastpgp。 上面第二种方式下，系统能够在PATH中找到/Users/wangjiawei/Bioinformatics/Softwares/blast-2.2.26/bin/，并在这个目录下查找到blastpgp，因此一样会访问/Users/wangjiawei/Bioinformatics/Softwares/blast-2.2.26/bin/blastpgp。 3.4 配置BLAST本地数据库 我们知道，BLAST作为一种基于局部比对算法的搜索工具，最大的作用就是从数据库中搜索匹配输入的蛋白质或者核苷酸序列。而我们之所以用本地版的BLAST,很大程度上是因为可以把数据库下载到本地，这样我们可以使用本地数据库来搜索匹配蛋白质序列。 在这里就不再介绍如何下载需要的数据库，格式化数据库等信息，因为在我们下载的SCRATCH-1D套件中正好包含了一个格式化了之后的数据库SCRATCH-1D_1.1/pkg/PROFILpro_1.1/data/uniref50，因为我们经常要使用到数据库，因此推荐把这个数据库放在一个单独的位置，比如我的放在了/Users/wangjiawei/Bioinformatics/Data/blast。 注意：blast文件夹中就是uniref50.**等数据库文件了，而不是文件夹uniref50!! 在根目录下建立一个新的文件，名字为.ncbirc cd vim .ncbirc 并将下列内容保存进这个文件: ; Start the section for BLAST configuration [BLAST] ; Specifies the path where BLAST databases are installed BLASTDB=/Users/wangjiawei/Bioinformatics/Data/blast ; Specifies the data sources to use for automatic resolution ; for sequence identifiers DATA_LOADERS=blastdb 注意：官方的说明文档是将下列内容写入.ncbirc，结果BLAST的程序找不到指定位置的数据库。 [NCBI] Data=/Users/wangjiawei/Bioinformatics/Data/blast 3.5 测试BLAST程序 到了这一步，我们总算设置好了BLAST的可执行程序的数据库，现在我们测试下BLAST是否正常运行。 建立一个名字叫example.fasta的文件，可以在任何目录下，将下面的测试序列内容保存到example.fasta中： > 26SPS9_Hs IHAAEEKDWKTAYSYFYEAFEGYDSIDSPKAITSLKYMLLCKIMLNTPEDVQALVSGKLALRYAGRQTEALKCVAQASKNRSLADFEKALTDYRAELRDDPIISTHLAKLYDNLLEQNLIRVIEPFSRVQIEHISSLIKLSKADVERKLSQMILDKKFHGILDQGEGVLIIFDEPP 在example.fasta所在的文件夹下，执行命令： blastpgp -i example.fasta -d uniref50 -i：选项是指定输入文件，如果fasta文件不在当前的目录下，可以用绝对路径指定。 -d：指定输入的序列所要查找对比的数据库，同样可以用绝对路径，指定一个数据库，也可以像上面一样只写uniref50，因为我们已经配置了.ncbirc，因此程序会找到/Users/wangjiawei/Bioinformatics/Data/blast/文件夹中的uniref50数据库。 如果一切顺利，上面的命令会产生匹配结果序列。 如果数据库没正确配置，程序没能找到数据库的话，上面的命令会没有任何输出，也不会提供错误或者警告信息，非常坑。 到此为止，我们搞定了BLAST的安装和配置，并测试了BLAST可以正常使用，现在继续回到PSIPRED上。 4.使用PSIPRED 首先，进入文件夹psipred，在使用之前，我们先来了解下psipred的目录结构 4.1 psipred目录说明 这里并不列出psipred目录下的每一个文件，而是这其中的主要文件： BLAST+ 文件夹，尽管PSIPRED官方强烈用户使用BLAST而非BLAST+，但还是为想使用的BLAST+的用户提供了方法，BLAST+文件夹中的runpsipredplus脚本就是为这一目的而存在的。 bin 文件夹，里面包含了编译之后可直接运行的psipred程序，但通常我们并不需要访问这个文件夹，因为官方提供了方便好用的runpsipred和runpsipred_single脚本，简化了参数，由它们调用bin中的程序。 data 文件夹，抱歉我也暂时不知道里面的内容是干嘛的。 example 文件夹，里面提供了示例输入，以及示例输出，方便用户检测程序可以正确执行。 src 文件夹，里面包含了psipred程序的源代码，只有在第一次编译时women需要进去一次。 runpsipred tcsh脚本，我们使用psipred程序，当我们使用这个脚本时，这个脚本会先调用BLAST中的blastpgp和makemat，在数据库中查找相似的序列，然后才进行蛋白质的二级结构预测。 runpsipred_single tcsh脚本，如果你已经知道你的输入序列是一个孤儿，那么使用这个脚本，它不要查找数据库，而是直接进行蛋白质的二级结构预测，因此速度非常快，但是准确度也可能不如runpsipred。 4.1 运行runpsipred_single 我们开始尝试运行runpsipred和runpsipred_single，上面已经提到，如果我们已经知道输入序列在数据库中没有匹配的数据，那么使用runpsipred_single会极大地提高运行效率，因为runpsipred_single不需要去数据库中先去迭代查找匹配序列，而是直接预测。 在psipred目录下，为了方便，将example/example.fasta文件复制到当前文件夹 cp example/example.fasta . 用下列命令运行runpsipred_single ./runpsipred_single example.fasta 就会在当前目录下得到example.horiz，example.ss，example.ss2三个目录，与example文件夹中的这三个文件内容一样。 4.2 运行runpsipred 相比于runpsipred_single，runpsipred因为要先去调用BLAST迭代查找指定数据库，然后再预测，因此速度慢了很多，主要时间都花在了迭代查找数据库上，但是精度也会提升很多。 如果你的蛋白质与现有数据库中的记录有足够的同源性，就可以认为其二级结构的预测有近80%的准确性。 使用下面的命令运行runpsipred ./runpsipred example.fasta 通常情况下来说，这里会报错。 查看错误信息，会发现是跟blastpgp相关的错误。打开runpsipred文件，会发现runpsipred脚本在两个地方调用了BLAST中的程序： # Where the NCBI programs have been installed set ncbidir = /usr/local/bin ... $ncbidir/blastpgp -b 0 -j 3 -h 0.001 -d $dbname -i $tmproot.fasta -C $tmproot.chk >& $tmproot.blast ... $ncbidir/makemat -P $tmproot 上面的脚本设置了变量$ncbidir=/usr/local/bin，所以，runpsipred是通过/usr/local/bin/blastpgp和/usr/local/bin/makemat命令调用blastpgp和makemat。但是系统不能在/usr/local/bin目录下找到这两个可执行程序，因为我们并未将BLAST的可执行程序安装到/usr/local/bin目录下，也没有在/usr/local/bin下为BLAST的可执行程序建立软链接。 事实上，我尝试在/usr/local/bin下为BLAST的可执行程序建立软链接，结果runpsipred会报一个很奇怪的bus error错误，所以，我们通过下面这种方式解决这个问题。 上面已经提到，我们将BLAST的可执行程序路径添加到了PATH全局变量中，所以我们是可以在任何地方直接访问blastpgp,makemat等的，当然也就可以在脚本中这样访问，所以我们修改runpsipred脚本调用blastpgp和makemat的地方。 # Where the NCBI programs have been installed set ncbidir = /usr/local/bin ... # modified blastpgp -b 0 -j 3 -h 0.001 -d $dbname -i $tmproot.fasta -C $tmproot.chk >& $tmproot.blast ... # modified makemat -P $tmproot 请注意比较下修改后的脚本与修改前的脚本，很容易发现，就是在调用blastpgp和makemat的时候从原来的/usr/local/bin/blastpgp和/usr/local/bin/makemat改为了blastpgp和makemat。 现在，重新运行./runpsipred example.fasta，就会开始一个漫长的运行过程，正确运行屏幕会输出以下信息： hostid: Command not found. Running PSI-BLAST with sequence example.fasta ... Predicting secondary structure... Pass1 ... Pass2 ... Cleaning up ... Final output files: example.ss2 example.horiz Finished. 一条测试序列数据，花费五分钟左右，多数时间花在Running PSI-BLAST with sequence example.fasta ...这一步。