通过snakemake向slurm提交任务

集群任务调度,最初读研究生的时候,接触的是实验室用的condor(https://research.cs.wisc.edu/htcondor/),目前还在维护。在脚本里面设定好请求的计算资源,交给master节点即可,调度系统会自动分配和管理任务。这也是我对集群管理中的任务调度的初始了解。后来不管是工作还是在实验室,遇到最多的是SGE(sun grid engine)。再后来SGE被Oracle抛弃,又接触了Slurm和Torque。不管何种系统,通过集群调度来实现分析的分布式计算,而不用关系具体的任务分配,极大的提高了集群的利用率和分析效率。

关于流程管理,如果只有一两个样本的情况下,我都是直接把pipeline放到sh脚本上直接跑,懒得用流程管理。但如果样本很多,成百上千个样本的时候,最好用流程管理,来追踪大规模任务的分析状态,是否报错,是否成功结束,以免手工check造成遗漏。我有时候会在命令之后加&& touch “Done"或者判断$0的状态,来确保程序正确执行,但这样做确实很繁琐。后来snakemake开始流行,又是和python结合,易读性很好,就尝试开始用snakemake。一个Snakefile文件,可以搞定N多样本,还能监控分析的进度。

正好最近需要在一个slurm调度管理的集群上进行分析,而流程本身就封装在Snakefile文件中,如果体验了snakemake和slurm合体,体验非常好,颠覆了我对向集群投递任务的繁琐印象。要是放在以前,我要分析1000个样本,我可能要生成1000个script,需要专门写一个生成job script的script,然后再投递。我也知道可以通过传参进行批量投递,但体验非常不好。所以还是感慨技术的进步,也推荐snakemake和slurm一起用。本文主要提一下如何微调下资源请求的命令。

假设我的Snakemake文件有1000个job,我需要向集群提交任务,如果和slurm或者SGE配合使用,需要用到–cluster和–jobs选项。

1
2
3
snakemake --cluster "sbatch -N 1 --ntasks=1  --cpus-per-task=10" --jobs 10
# --cluster 后面跟的是提交命令,如果是SGE的话,就是qsub
# --jobs是最大同时投递的任务数目

很多文档中提到要在Snakefile中的每个rule中设置resources,比如resources: mem_mb = 40000,但我发现这样提交的任务,是获取不了具体的请求资源。这个时候用scontrol show job jobid查看请求的资源,可以看到可以用10个cpu,但请求的内存依然是默认的。

查了很多教程,都是通过配置yaml或者json文件,我觉得这样很繁琐,而且每个rule的请求资源是不一样的,通过配置文件,相当于多了一个文件,多了很多工作。看到有人说–cluster中可以用wildcards,就打开了我的思路。比如在rule设置了相对应的内存和时间,可以通过wildcards来调用,不同的rule的任务,提交时就对应不同的资源请求。实现起来是这样的

1
snakemake --cluster "sbatch -N 1--mem={resources.mem_mb} --ntasks=1  --cpus-per-task=10 " --jobs 10

这个时候,可以进一步把snakefile里面的threads信息利用起来

1
snakemake --cluster "sbatch -N 1--mem={resources.mem_mb} --ntasks=1  --cpus-per-task={threads} " --jobs 10

这个时候scontrol show job jobid显示请求资源是我们想要的,但squeque的job名是snakemake.job,分不清现在正在运行的任务对应哪个rule,可以这么修改。

1
snakemake --cluster "sbatch -N 1--mem={resources.mem_mb} --ntasks=1  --cpus-per-task={threads} --job-name={rule}" --jobs 10

那么,进一步让输出日志和错误日志可读,可以这么修改

1
snakemake --cluster "sbatch -N 1--mem={resources.mem_mb} --ntasks=1  --cpus-per-task={threads} --job-name={rule} --output={rule}.%j.out --error={rule}.%j.err" --jobs 10

如果想进一步修改job名的可读性和日志文件的可读性,可以把rule里面的wildcards传进来。比如我的每个rule中都匹配了sample,那在传给 job-name和output, errror的时候,把{wildcards.sample}传过来就行。如果我不想把任务投递给一个node节点,可以通过exclude(比如–exclude=gpu1)来指定。

真空采血管的颜色分类

是的,没看错,我开始研究采血管的颜色了。

不同颜色的头盖和标签,表示不同的添加剂种类和试验用途。举个例子,提取血清和血浆,要分别用促凝管和抗凝管。又比如促凝管有两种,一个是橘色的,一种是含有分离胶的黄色管,抗凝管的成分有添加柠檬酸钠的浅蓝色管,也有EDTA紫色管。具体的添加剂和使用范围如下图。

删除tmp文件

服务器的tmp文件夹满了,导致不能正常登陆和运行软件,需要清理tmp文件夹下面的临时文件。Linux的机制是在重启的时候清理tmp文件夹,或者一段时间才删除(比如下面我们看到的服务器默认是10天),find命令和tmpwacth命令可以在不重启和不影响用户的情况下快速删除目标文件。

Find命令

1
2
# ctime即change time文件状态改变时间为超过一天的
find /tmp -ctime +1 exec rm -rf {} \;

tmpwatch

1
2
3
4
5
yum install tmpwatch -y
# 超过一天
tmpwatch 1d /tmp
# 超过32小时
tmpwatch -afv 32 /tmp/

定时清理

CentOS 6

看到说在CentOS下的/etc/cron.daily/tmpwatch可以设置自动清理时间,但我没找到,-_-||,例如下面设置的是/var/tmp下30d,也就是30天,/tmp下10天,但服务器/usr/sbin下面并没有tmpwatch,如果大家的服务器上有这个,可以通过这个设置定期清理一定时间的文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#! /bin/sh 
flags=-umc 
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \ 
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \ 
        -X ‘/tmp/hsperfdata_*’ 10d /tmp 
/usr/sbin/tmpwatch "$flags" 30d /var/tmp 
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do 
    if [ -d "$d" ]; then 
        /usr/sbin/tmpwatch "$flags" -f 30d "$d" 
    fi 
done

Linux命令把excel转换为tsv或者csv

论文附件给的格式一般是excel格式,用R读取特别慢,于是找有没有命令行下的工具,将excel转换成tsv格式,方便下一步处理。

找到了xlsx2csv这个工具,详见 https://github.com/dilshod/xlsx2csv

安装也非常简单,直接用pip安装就行

pip install xlsx2csv

一个命令即可完成转换工作

xlsx2csv -d tab ***.xlsx

如果不加-d tab则默认是csv格式。

还可以批量转,假设某个目录下有很多excel文件

xlsx2csv /path/to/input/dir /path/to/output/dir

还可以在python脚本里面import,挺好用的,安利。

免疫系统介绍(转载)

全文来自https://www.cellsignal.cn/science-resources/overview-of-immunology

免疫系统

免疫系统由主要功能为检测、应答和消除病原体及转化细胞的组织、细胞和分子组成。

天然与适应性免疫应答

免疫系统有两种主要组分:1) 天然免疫系统和 2) 适应性免疫系统。天然免疫系统是第一道防线,可通过生殖细胞系编码的模式识别受体来检测病原体,但不会有记忆,并且可迅速应答(几分钟到几小时内)。适应性免疫系统应答缓慢(几天以上),使用会在发育过程中经历多次基因重排的抗原特异性受体,并且会形成免疫记忆 — 从最初的损害中“吸取教训”,使身体准备好以防止在将来暴露在类似的有害物质下。胞外液中的大分子,或特异性免疫细胞的激活会诱发这两种免疫应答。这些应答分别称为体液免疫和细胞介导的免疫。

在细胞介导的免疫应答的保护下,免疫细胞主要根据应答是天然的还是适应性的来进行分层。天然免疫系统主要包含吞噬细胞(例如嗜中性粒细胞、巨噬细胞)、自然杀伤细胞、嗜碱性粒细胞和其他靶向危险入侵微生物的细胞。适应性免疫系统的细胞为 T 细胞和 B 细胞。自然杀伤 (NK) T 细胞同时具有天然和适应性免疫细胞的特点。此外,对于大多数对免疫系统没有特异性的其他细胞类型,可能会以细胞浆受体和信号转导及效应分子(例如 RIG-I、STING 和 NLR 家族的成员)的形式带有固有的天然免疫功能。我们进一步回顾会发现,这两种系统的细胞来自于造血干细胞的不同髓样和淋巴样细胞系。

免疫系统组分

成熟免疫细胞从所谓的造血干细胞分化而来。这些是在骨髓、外周血和胎盘中发现的多能性未分化祖细胞。这些造血干细胞可分化成常见的髓样祖细胞或常见的淋巴样祖细胞。

淋巴样细胞

常见淋巴样祖细胞可分化成为四种可通过细胞表面受体表达来区分的主要淋巴细胞群:T 细胞、B 细胞、自然杀伤 (NK) 细胞及 NK-T 细胞。

T 细胞

T 细胞在细胞介导的免疫方面发挥关键作用。这些细胞可以根据 CD3 T 细胞信号转导链的表达来检测。

T 细胞来自于最初从骨髓中的造血干细胞发育而成的淋巴样祖细胞。一旦淋巴样祖细胞定向发育成为 T 细胞,就会从骨髓迁移到胸腺(因此称为 T 细胞)。胸腺提供合适的微环境,T 细胞在这里发育成为不同亚型,具体取决于在细胞表面上表达的特异性受体。早期成熟 T 细胞或胸腺细胞缺乏 CD4 和 CD8 受体,因此称为双阴性 (DN) 细胞。随后,DN 细胞经历会编码 α- 和 β- T 细胞受体 (TCR) 的基因重排和基因突变,这从细胞系定向通路开始,一直向下,最终产生对独特抗原有特异性亲和力的 T 细胞受体。