给生信新手的第一个建议-组织好生物信息学项目

一个简洁明了的文件目录组织方式可以使我们快速地了解一个项目,无论是自己的项目还是别人的项目。一个团队使用类似的文件组织方式可以方便大家进行合作沟通,互相学习。

本文主要讲述了如何组织一个生物信息学项目和如何使用 Markdown 来记录实验过程,只是整理了一个大体的实践框架,关于一些软件的使用我只是点到为止,大家有兴趣的可以自行了解学习(还可以关注咱们生信技能树和生信菜鸟团,将来我们会写一些教程)。

我觉得,要是在生信入门之时就养成良好的习惯,会对今后的学习工作大有裨益。当然,我还只是一个刚进实验室的小菜鸟,也有些想的不够周全之处,欢迎各位前辈留言,分享经验。

  • 主要分为以下四点

    • 如何组织文件

    • 如何写 README 文件

    • 实验记录本

    • 如何使用 Git 进行版本控制以及互相合作

如何组织文件

管理文件的基本原则

  1. 要做到一个不了解你项目的人,可以轻松的通过你的文件夹的架构,了解你所做了什么,为什么要这样做。(通过你的命名,还有文件夹的结构,明白你的思路,找到对应的文件)

  2. 你现在做的每一个分析步骤,将来都有可以会重复再做一次。我们可以通过管理文件和记录达成这两条原则。

文件夹的管理结构

下面以"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还可以很容易转换成各种格式比如:PDFHTML等等,极大地增强了其便携性。

使用 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

  1. Item 1

  2. Item 2 
    注意,列表前面的序号其实是无关紧要的,渲染时Markdown会自动修改该序号。

  3. Item 3

    1. Item 3a

    2. Item 3b

  4. 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)

logwhen
代码块

\```python
print("hello world")
\```
print("hello world")

实验记录本

学习了 Markdown 语法以后,就可以更进一步,使用更高级的编辑器来记录自己的实验过程,最好可以支持一边记录实验过程,一边运行代码。以我最常用的 Jupyter Notebook (Anaconda 中已包含,命令行中敲入jupyter notebook即可在当前目录打开)为例,它支持使用 Markdown 语法来做笔记,同时,你也可以直接插入 Python 代码,并在服务器上运行,甚至还可以直接使用shell命令,来处理数据,以实时的记录实验过程, Jupyter Notebook 生成的笔记以 .ipynb为后缀,一样可以导出为.mdPDFHTML等等。

Jupyter Notebook 界面

如何使用 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帮助你跟踪代码的重要变化

随着新功能的添加或错误的修复,大多数脚本都会随着时间而变化。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

    • 生信菜鸟团 生信小技巧:如何管理你的文件目录与记录分析流程

(0)

相关推荐

  • 太棒了!Jupyter与PyCharm完美融合,Jupytext来啦!

    项目作者:Marc Wouts 转自:机器之心 Jupyter Notebook 真的是让人又爱又失望,在有的场景下它极其便利,但是在很多大模型或复杂项目上,它又无能为力.在 Jupytext 这个项 ...

  • Git【入门】这一篇就够了

    Git 在生产工作中是使用频率很高的工具,但我发现很多文章只是对它做了简单的提交命令说明,真正遇到 版本冲突或文件丢失 等问题又定位不到原因,浪费大量时间.本篇文章较长,但都是在实际项目中用到的点. ...

  • 程序员必备技能

    文章首发:https://mp.weixin.qq.com/s/vfDTVn71LbrDNRvGjQPWGA Git Git介绍: Git是目前世界上最先进的分布式版本控制系统(没有之一),简单来说, ...

  • 人生第一篇生信SCI一作被导师抢了是一种什么样的体验?

    从0到第n篇SCI,这是无数研究生或者科研人需要经历的过程.很多人都是体验过人生第一篇SCI的喜悦,不过也有很多人的第一篇SCI可能是悲伤的.焦虑的.担心的,因为第一作者被导师或者领导抢去了,留给他们 ...

  • 你第一篇纯生信SCI投了几次稿才被接收呢?

    你第一篇纯生信SCI投了几次稿,还记得吗?有的人可能一次就中了:有的人可能第二次中了:有的人可能第三次中了:有的人可能投了n次都没有中...不同时间段.不同内容.不同写作水平.选择不同的期刊.遇到不同 ...

  • 我的第一R包- 生信配置文件大全

    大家好,我是李剑峰,生信技能树论坛的VIP小编,目前在上海交通大学医学院附属瑞金医院进行研究生阶段的学习,主要研究方向是生物信息学.医学信息学.大数据综合分析.临床诊断数据分析.DNA-seq, RN ...

  • 生信小技巧系列第一季完结版视频教程学习笔记分享

    专题历史目录: 3个学生的linux视频学习笔记 生信人应该这样学R语言系列视频学习心得笔记分享 一万人陪你学习GEO数据库挖掘知识(公益视频听课笔记分享) 公共数据库挖掘视频学习心得体会 接下来介绍 ...

  • 第一个生信技能树周边,生信 buff 加成神器来了

    生信技能树联盟成立至今,不仅为所有生信学习者带来了海量的学习资源,还陆续产生了很多象征着生信技能的标志.比如我们 logo 里生命力旺盛的那棵树,生信技能图谱,甚至还有一直陪在健明身边的那只羊. 我们 ...

  • 2021第一期生信入门微信群答疑精选200题

    做教学我们是认真的,如果你对我们的马拉松授课(直播一个月互动教学)有疑问,可以看完我们从2000多个提问交流里面精选的200个问答! 与十万人一起学生信,你值得拥有下面的学习班: 数据挖掘(GEO,T ...

  • 序列提取 - 《-零命令行-生信下游数据分析》- 第一弹

    写在前面 <-零命令行-生信下游数据分析>的第一帖主题,定为序列提取.因为序列提取,可以说是目前最常见的生信下游数据分析需求,其主要见于场景: 1.物种基因组已公布,但没有对应的数据库,而 ...

  • 生癌后的第一步,我建议你这么做!

    3个月前,50多岁的王先生被确诊为肺癌,从那时起,他便万念俱灰,一改往日的幽默.风趣,变得沉默寡言,满眼的无助和绝望.虽然化疗后被告知有好转迹象,但他紧锁的眉头仍不见舒展.常常看着医院走廊或光着头,或 ...

  • 使用R语言的20条建议-微生信生物博主五年经验总结

    写在前面 如果说有什么理念或者习惯支撑在这几年的R语言学习中的话,我认为是这几条,如果大家将这几条能够理解大半,相信最起码会节省时间,提高效率. 注:这些建议不一定都会很好用,大家挑选适合自己的融会贯 ...