给生信新手的第一个建议-组织好生物信息学项目
一个简洁明了的文件目录组织方式可以使我们快速地了解一个项目,无论是自己的项目还是别人的项目。一个团队使用类似的文件组织方式可以方便大家进行合作沟通,互相学习。
本文主要讲述了如何组织一个生物信息学项目和如何使用 Markdown 来记录实验过程,只是整理了一个大体的实践框架,关于一些软件的使用我只是点到为止,大家有兴趣的可以自行了解学习(还可以关注咱们生信技能树和生信菜鸟团,将来我们会写一些教程)。
我觉得,要是在生信入门之时就养成良好的习惯,会对今后的学习工作大有裨益。当然,我还只是一个刚进实验室的小菜鸟,也有些想的不够周全之处,欢迎各位前辈留言,分享经验。
主要分为以下四点
如何组织文件
如何写 README 文件
实验记录本
如何使用 Git 进行版本控制以及互相合作
如何组织文件
管理文件的基本原则
要做到一个不了解你项目的人,可以轻松的通过你的文件夹的架构,了解你所做了什么,为什么要这样做。(通过你的命名,还有文件夹的结构,明白你的思路,找到对应的文件)
你现在做的每一个分析步骤,将来都有可以会重复再做一次。我们可以通过管理文件和记录达成这两条原则。
文件夹的管理结构
下面以"A Quick Guide to Organizing Computational Biology Projects" 这篇文章所提到的结构给大家做一个简单的事例:
首先,每个项目都应该有自己的根目录,接着我们可以将所需的文件分成五大块。第一数据(data),储存你所用的所有的 raw data 数据(测序数据)。第二结果(results),存储每一步你所做所做的分析得到的结果文件。第三编写的代码(src),存储你分析过程中用到的代码或者你所编写的代码。第四工具(tool),存储一些这个项目特定使用到的工具,一般是第三方已经编写好的,你下载下来的工具。我的习惯是,对于普遍使用到的工具,可以放在home/biosoft
的文件夹里,方便在不同project
中全局调用。第五,文件(doc),存放你发表 paper 所用到的所有图和表。
文献中作者,提议我们可以使用按时间顺序来命名下级文件夹来管理我们所生成的文件,比如你今天做的分析和昨天做的分析可以分为两个文件夹保存(除了更直观以外,这有助于使用 Git 版本控制,你可以很容易找到某一天你做了什么事)。此外,我觉得可以在此基础上再添加一些具体的分析信息,例如2009-01-23_Mapping
。这样一分类,整体的结构还有思路就很清晰了,极大的增加了该项目的"可读”性还有重复性。而且,在每一个目录下都应该有一个详细记录当前目录文件的README
文件(如何写 README 文件正是第二部分内容)。
以上就是一个项目开始的准备工作,可能看起来有些复杂,但其实只要在~/.bashrc
中插入以下function
,一个命令就可以生成:
function mkproject { mkdir -p "$1"/{data,src,results,tool}; touch "$1"/README;}
source ~/.bashrc
之后,只要在命令行输入mkproject your_project_name
就可以生成规范的目录结构。
如何写 README 文件
除了有一个良好的目录组织结构外,你的生物信息学研究过程也应该被好好地记录下来,因为一个生物信息学的研究过程包含着大量的复杂因素,比如:不同的工作流程,许许多多的文件,数不尽的程序参数还有不同的软件版本。所以避免这种混乱最好的方法就是尽可能详细地记录所有内容,而且这也方便回顾一个你已经完结的项目,重新做一些分析。对于每个目录下的 README 文件侧重点可能有所不同,但都应该包括的内容是当前目录的作用和日期,总体的原则就是尽可能详细,其他部分,暂时想到的如下(欢迎补充):
记录你的方法和 workflows;
数据:来源,下载方式,用的样本以及参考文件(基因组版本信息),做好预处理要留下关键信息,比如 readNumber;
软件:安装方法、参数、检验方法以及版本号;
所有这些信息最好存储在纯文本的 README 文件中。因为这样方便直接从命令行读取,检索索和编辑。同时它也适用于任何计算机系统(不用装任何软件就可以在任何操作系统,移动设备上查看),纯文本也缺少复杂的格式,这避免了有时候富文本复制粘贴时产生的问题。最重要的一点是,对于纯文本的文件我们可以使用 Git 进行版本控制!!
那么纯文本文件如何像 MS Word 一样,简单快速地产生丰富多样的样式呢?这需要下面提到的 Markdown 语法!除了快速产生美观的排版效果之外,Markdown还可以很容易转换成各种格式比如:PDF
,HTML
等等,极大地增强了其便携性。
使用 Markdown 语法写 README
Markdown 语法其实很简单,不要怕麻烦。刚接触 Markdown,最好的方法就是多用用,多写 README!
轻松上手 Markdown 语法
标题
# This is an <h1> tag
## This is an <h2> tag
###### This is an <h6> tag
注意:
#
之后需要至少一个空格;一个标题应该占一整行;
强调
*This text will be italic*
_This text will be italic_
**This text will be bold**
__This text will be bold__
This text will be italic
This text will be italic
This text will be bold
This text will be bold
列表
无序列表
* Item 1
只是一段在Item 1下面的文字。需要注意上面一行结尾有两个空格。
* Item 2
* Item 2a
* Item 2b
* Item 3
使用一个空行来来结束一个列表。
Item 1
只是一段在Item 1下面的文字。需要注意上面一行结尾有两个空格。Item 2
Item 2a
Item 2b
Item 3
有序列表
1. Item 1
1. Item 2
注意,列表前面的序号其实是无关紧要的,渲染时Markdown会自动修改该序号。
3. Item 3
1. Item 3a
2. Item 3b
4. Item 4
Item 1
Item 2
注意,列表前面的序号其实是无关紧要的,渲染时Markdown会自动修改该序号。Item 3
Item 3a
Item 3b
Item 4
引用
> knowledge is power!
knowledge is power!
图片和链接
![logwhen](https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1537256695&di=84844953e9b75fe84e4c864103fe974e&src=http://entpic.yue365.com/kimages/201703/16_1489629826124224.png)
代码块
\```python
print("hello world")
\```print("hello world")
实验记录本
学习了 Markdown 语法以后,就可以更进一步,使用更高级的编辑器来记录自己的实验过程,最好可以支持一边记录实验过程,一边运行代码。以我最常用的 Jupyter Notebook (Anaconda 中已包含,命令行中敲入jupyter notebook
即可在当前目录打开)为例,它支持使用 Markdown 语法来做笔记,同时,你也可以直接插入 Python 代码,并在服务器上运行,甚至还可以直接使用shell
命令,来处理数据,以实时的记录实验过程, Jupyter Notebook 生成的笔记以 .ipynb
为后缀,一样可以导出为.md
,PDF
,HTML
等等。
如何使用 Git 进行版本控制以及互相合作
Git 是什么
Git是目前世界上最先进的分布式版本控制系统(没有之一)。版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。在处理生物信息数据的过程中,随着内容的增多,我们面临着如何管理不同的文件版本的挑战,同时,我们也希望可以有一种更好的方式来团队协作。对于普通用户来说例如Dropbox,Google Drive或坚果云可能是个不错的选择,它可以备份数据并且允许我们恢复我们所需要的某一个版本的文件。然而,这种专门的文件版本管理系统并不能很好地适应复杂的生物信息学项目,将整个生物信息学项目放入共享目录也不太现实,因为它可能包含千兆或者更多的数据,这些数据太大也无法在整个网络中共享。
碰巧,软件工程师们在协作的过程中也遇到了相同的问题,Linus编写了Git来管理Linux,这是一个包含了数千个协作者同时更改和处理文件的大型代码库。Git非常适合用于项目版本控制和协作工作。诚然,Git刚开始学习起来可能非常棘手,但只要勤加练习,在苦苦挣扎之后,你会发现它会远远超出你的期望。
为什么Git对于管理生物信息数据是必不可少的
Git允许你创建项目的快照
使用版本控制系统,你可以在开发中的特定点处创建当前项目的快照(你对文件的每一次保存都可以保存为快照)。如果出现任何错误,你可以很轻易地回退到项目的过去时间点并恢复文件,所以在生物信息学的工作中,这样的安全措施非常有用。例如,假设你正在进行SNP数据的分析,你发现你的SNPs中有14%落在染色体的某一段编码区中,接着你也在你的论文中引用了这个百分比;两个月后,你早已忘记了关于这个分析的一些细节,但当你重新运行这些分析代码时,数据竟然变成了26%!如果你通过Git来跟踪项目的开发,那么当结果发生变化时,你可以很容易地查看项目的整个历史记录。Git 允许你轻松再现和回滚到过去的分析版本。查看每一次保存,甚至比较任何两次保存之间的差异。
这样,结合上面的文件组织目录,你可以很轻松地知道半年前的某一天你做了什么事!简单来说,Git 会保存你每一次对项目的修改并保存相应时间点,你可以在任意时间点之间进行跳转,除了时光回溯之外,Git还支持平行宇宙!你可以为一个项目创建很多条不同的时间线,随意在不同的时间线之间进行转换,要是你需要的话,还可以合并两条时间线!
Git帮助你跟踪代码的重要变化
随着新功能的添加或错误的修复,大多数脚本都会随着时间而变化。Git在帮助你跟踪代码的变化方面非常有帮助。假设一个生物信息学家,编写了一个脚本,用于从reads
中删去质量较差的区域。这位生物信息学家随后将其分发给他的所有实验室成员。一个月后,生物信息学家发现有一个bug会导致某些结果不正确。Git可以很容易地跟踪软件的更改并下载最新的版本。此外,比如GitHub和Bitbucket这类在Web上托管的Git仓库也使得代码得以实现共享和协作。
Git帮助人们保持软件的组织性和可用性
无序的代码会影响自己和其他实验室成员的不便,代码丢失更是会导致实验结果无法再现,并影响之后的实验。Git有助于保持工作的连续性和项目历史的完整记录。将整个项目集中到一个仓库中可以保持其组织性。Git存储了每一次提交的变更,因此即使主开发人员离开,项目的整个历史记录都依旧可用。由于Git能够回滚到过去的版本,因此修改项目的风险也更小,从而更容易构建现有的工作。
R 和 Git
有许多教程介绍了,在 Rstudio 中使用 Git 进行版本控制:
参考:http://r-pkgs.had.co.nz/git.html
还有视频教程:https://www.rstudio.com/resources/videos/happy-git-and-gihub-for-the-user-tutorial/
在本地服务器上安装使用 Gitlab
官网链接:https://about.gitlab.com/
对于一个比较大的实验室,可以在自己的服务器上搭建 Gitlab。 GitLab 是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
参考视频教程:https://www.bilibili.com/video/av28589390
参考资料:
生信菜鸟团 Bioinformatic Data Skills 学习专题:Intro&1
生信菜鸟团 生信小技巧:如何管理你的文件目录与记录分析流程