[转] 金鑫:我在BGI-Shenzhen的两年

凌晨3点的北山道终于渐渐安静下来,热带风暴带来的雨水淅淅沥沥下了一整天,此刻路灯映照下的地面已然不见水迹。不时仍然有马达轰鸣的声音传来,提醒着未眠的人们不远处就是南中国最大的集装箱码头。空调嗡嗡的运转了一整夜,和紧闭的房门一起把闷热和潮湿锁在门外。离天亮还有好几个小时,酷热中鸟儿们也不会那么早起,是个好时候安静的回忆。
两年前的这个时候,我在做什么呢?是结束一天的工作,晒着月亮走在回宿舍的路上,还是刚刚和伙伴们用麦记虾粥补充好了能量准备回办公室再战几个小时,或者干脆准备干到有早餐的时候,吃过再回去睡觉?琴姐姐他们肯定还在514纠结着Meta的不知第几个last week;曹爷抗不住了刚爬在桌上睡了会;Liyr同志应该在放着热血动漫的主题曲鼓舞士气;小强在后台远程指挥;小罗还是个“黑户”被学校折腾的够呛,在一边补实验报告一边折腾novel sequence;龙哥在不停的画图改图;广宇那边结果又更新了;陈老板又在怂恿他来把war3;hc在皱着眉头写程序,不时吐槽一下龙哥和曹爷;cyu拎着毛巾被刚从会议室补觉回来;柏闻又弄来了新鲜玩意;叶老冲进来咆哮问是谁又快把机器跑死了……
不经历过的人真的无法理解当时这群人有多么疯狂,即便是现在,我只要想一想都觉得热血沸腾。如今,小强单飞,广宇北上,小罗和柏闻即将去香港深造,麦记老板娘也感叹,“你们不来我们现在很早就打烊了”,不知她还记不记得当年那个爱捞牛肉的陈老板了。留下的同志们多少都有点郁闷,“胜景不复有,激情难再现”,此情此景恐怕只可追忆了。说什么好呢,说什么好呢,我是该不要再纠结,还是不要再纠结呢。。不过最近为了对付在欧洲肆虐的有毒大肠杆菌,在琴姐姐的带领下微生物的同志们三天三夜时间拿下了整个基因组,wx姐姐在围脖上转述他兴奋的话说“这让我觉得华大还是有希望的!”。规模大了,策略变了,或许是我们需要去适应和跟上新的脚步,可每个从那个时代过来的老华大心中燃烧着的火焰是永远不会熄灭的吧。
这两年来多来,我最先从打杂的干起,在yr、hc的指导下打下了搞基因组研究的基本功,之后慢慢有机会成为项目负责人,逐渐培养了全局观,自己开始带人之后一点点的学到了怎样组织和管理一个团队,在和其他部门及客户沟通的过程中开始理解了如何有效的更人交流,如何协调各方利益,如何做事,如何做人。现在我手头上的是疾病基因组最前沿的项目,有能力偶尔帮yr同志审一两篇2、3分的基因组学文章,自己有1篇一作、数篇署名文章,可以基本无障碍的和鬼佬交流相关的学术问题,一手带起来的团队有20多人,已经可以在没有我干预的情况下顺利运转。两年前的我一定想不到今天自己可以有这样的成长,可以说,是华大给了我机会、成就了今天的我,是华大前辈和伙伴们的信任与鼓励让我不断的超越自我。话又说回来,这样的人在华大一抓一大把,这点成绩实在拿不出手炫耀,我把它们写下来只是为了给自己一个路标,当多年后回首,能清晰的看到自己的成长和前进的步伐。
这一路走来,还必须感谢一个人,你让我的这2年与之前22年的生命完全不同。我曾经想象过理想女人的种种,但我从来没想到能遇到这么完美的你。美丽、善良、勤奋、上进,又知书达理、冰雪聪明,要不是怕你太骄傲,真是想把所有美好的词儿都用在你身上。你的优点我都喜欢,你的小缺点我都能接受,这就是真正的完美吧!记得每一次获得小小成就时的欢笑,记得失意时相拥而泣的场面,记得每一个拥抱的甜蜜,记得每一场促膝长谈后心中的温暖。你的理解令我坚强,你的泪水让我成熟,你的信任使我勇敢。感谢爱情,让我的生命变得如此精彩。My girl,每当看到你漾开的笑容,我都会充满奋斗的欲望和力量,放心吧,我一定会努力让你过上好日子的。
同时也感谢一直以来关心和支持我的朋友们,曾经无数个艰难的时刻,都是你们给了我希望和力量。你们好么,什么时候能再问上一声“好久不见”?
也许很快,我将迎来生命中的又一次转折,我不知道自己的选择是对是错,我只是想走得更远,看到更多风景。祝自己好运,祝大家好运!
天亮了,晚安。
 
PUBLICATIONS
# Equal first-author
1. Li R, Li Y, Zheng H, Luo R, … , Jin X, … , et al. Building the sequence map of the human pan-genome. Nat Biotechnol (2009) vol. 28 (1) pp. 57-63
2. Yi X, Liang Y, Huerta-Sanchez E, #Jin X, … , et al. Sequencing of 50 Human Exomes Reveals Adaptation to High Altitude. Science (2010) vol. 329 (5987) pp. 75-78
3. Li Y, Vinckenbosch N, Tian G, Huerta-Sanchez E, Jiang T, … , Jin X, … , et al. Resequencing of 200 human exomes identifies an excess of low-frequency non-synonymous coding variants. Nature Genetics (2010) pp.
4. Li Y, Zhu J, Tian G, Li N, Li Q, … , Jin X, … , et al. (2010) The DNA Methylome of Human Peripheral Blood Mononuclear Cells. PLoS Biol 8(11): e1000533. doi:10.1371/ journal.pbio.1000533
5. Wang J, Yang X, Xia K, … , Jin X, … , et al. TGM6 identified as a novel causative gene of spinocerebellar ataxias using exome sequencing. Brain (2010) pp. 1-9
6. Shi Y, Li Y, … , Jin X, … , et al. (2011) Exome Sequencing Identifies ZNF644 Mutations in High Myopia. PLoS Genet 7(6): e1002084. doi:10.1371/ journal.pgen.1002084

Advertisements

SNP分析程序代码的优化。。

原:

#!/usr/bin/perl
use strict;
use warnings;

print "\n\n"."————————-START—————————-\n";

open LIKE ,"$ARGV[0]";                                            #open handle

                                                            #major circle
chomp(my $S = <LIKE>);
my @S = split /\s+/, $S;
while (<LIKE>) {
    my @J = split /\s+/, $_;
                                                        #minor circle
    push @S, (0, 0);
    my $count = -1;
    my @S_;
    while ($count < $#S) {
        $count += 1;
        $S_[$count] = &like($J[2], $J[1], $J[0], $S[$count-2], $S[$count-1], $S[$count], $count);
    }
                                                        #minor circle ends
    @S=@S_;   
}
                                                            #major circle ends

close LIKE;                                                        #close handle

printf "The items are: \n".("%g\n" x @S), @S;

                                                                #check
print "\n\n…..Checking the items…..\n";
my $check = &check(@S);
$check = sprintf "%.10f", $check;                                #report error
if ($check == 1) {
    print "!!!PASS!!!\n\n"."————————RESULT—————————-\n\n";
}else{
    die "\n\nERROR!!! Wrong data!! The sum of all the items are not 1!\n\n"."————————–END—————————–\n\n";
}

my @mixed_result = &max(@S);
my $maxinum = pop @mixed_result;
print "The maxinum likelihood value is: $maxinum\n\n";            #print the maxinum

my @genotype = &genotype(@mixed_result, scalar @S);

print "The corresponding genotype(s) is(are):\n"."-THESTAFF-".("1234567890" x (scalar @S /10 +1))."\n";
                                                                #staff of "1234567890"

my $count2 = 0;
foreach  (@mixed_result) {
    printf "%-10d%s\n", $_, $genotype[$count2];                    #output genotype(s) with the laargest likelihood value
}

print "\n"."————————–END—————————–\n\n";

#subroutine: check (the sum of all elements)

sub check {
    my $return;
    foreach  (@_) {
        $return += $_;
    }
    $return;
}

#subroutine: like
sub like {
    my ($j2, $j1, $j0, $a, $b, $c, $ck) = @_;
    if ($ck == 1) {
        $a = 0;
    }
    if ($ck == 0) {
        $a = 0;
        $b = 0;
    }
    $j2*$a+$j1*$b+$j0*$c;
}

#subroutine: max
sub max {
    my $max = shift @_;
    unshift @_, $max;
    foreach  (@_) {
        if ($_ > $max) {
            $max = $_;                                            #get maxinum
        }
    }
    my @numbers;
    my $count = 0;
    foreach  (@_) {
        if ($_ == $max) {
            push @numbers, $count;                                #get sequence number(s) of the maxinum
        }
        $count += 1;
    }
    push @numbers, $max;
    return @numbers;                                            #sequence number(s) and corresponding maxinum (at end of the array).
}

#subroutine: genotype
sub genotype {
    my $all = pop @_;
    foreach  (@_) {
        push @genotype, ("0" x ($all – 1 – $_)).("1" x $_);        #return genotype(s)
    }
    return @genotype;
}

优化后:

#!/usr/bin/perl
use strict;
use warnings;
#by zhaobw
print "\n\n————————-START—————————-\n";

open LIKE ,"$ARGV[0]";                                #open handle
chomp(my $S = <LIKE>);
@_ = split /\s+/, $S;
my @S = ($_[0], $_[1], $_[2]);                        #abort annotations
while (<LIKE>) {                                    #major circle
    my @J = split /\s+/, $_;
    push @S, (0, 0);
    my $count = -1;
    my @S_;
    while ($count < $#S) {                            #minor circle
        $count += 1;
        my $a = $S[$count-2];
        my $b = $S[$count-1];
        if ($count == 1){                            #standarize $a
            $a = 0;
        }
        if ($count == 0){                            #standarize $a and $b
            $a = 0;
            $b = 0;
        }
        $S_[$count] = ($J[2]*$a + $J[1]*$b + $J[0]*$S[$count]);    #don’t need "SUBROUTINE LIKE" anymore..
    }                                                #minor circle ends
    @S=@S_;   
}                                                    #major circle ends

close LIKE;                                            #close handle

printf "The items are: \n".("%g\n" x @S), @S;

print "\n\n…..Checking the items…..\n";            #check (!!should be optional)
my $check;                                            #don’t need "SUBROUTINE CHECK" anymore..
foreach (@S){
    $check += $_;
}

$check = sprintf "%.10f", $check;                    #format $check to .10 float
print "The sum is: ",$check,"\n";
if ($check == 1) {                                    #pass report
    print "!!!PASS!!!\n\n————————RESULT—————————-\n\n";
}else{                                                #error report
    die "\n\nERROR!!! Wrong data!! The sum of all the items is not 1!\n\n————————–END—————————–\n\n";
}

my $maxinum = shift @S;                                #don’t need "SUBROUTINE MAX" anymore..
unshift @S, $maxinum;                                #get a likelihood value
foreach  (@S) {
    if ($maxinum < $_) {
        $maxinum = $_;                                #get the largest likelihood value
    }
}

print "The maxinum likelihood value is: $maxinum\n\n";            #print the largest likelihood value

my @numbers;
my $count1 = 0;
foreach  (@S) {
    if ($_ == $maxinum) {
        push @numbers, $count1;                        #get squence number(s) of the maxinum(s)
    }
    $count1 += 1;
}

my @genotypes;
foreach  (@numbers) {                                #don’t need "SUBROUTINE GENOTYPE" any more..
    push @genotypes, ("0" x ($#S – $_)).("1" x $_);    #get corresponding genotype(s)
}

print "The corresponding genotype(s) is(are):\n"."-THESTAFF-".("1234567890" x (scalar @S /10 +1))."\n";
                                                    #staff in "1234567890"

my $count2 = 0;
foreach  (@numbers) {
    printf "%-10d%s\n", $_, $genotypes[$count2];    #output genotype(s) with the largest likelihood value
    $count2 += 1;
}

print "\n————————–END—————————–\n\n";
#no subroutines

测试输入:test.txt

0.900001 0.049998 0.050001 you can just type anything here…
0.1 0.05 0.85
0.5 0.45 0.05 用空格或任意\s所表示内容隔开即可添加注释,处理过程中会自动丢弃。
0.3000000000000002 0.3000000000000002 0.3999999999999997 #此行有错(位于小数点后最后一位,但会被忽略)
0.45 0.45 0.1 #测试注释
0.9 0.05 0.05
0.9 0.05 0.05
0.1 0.05 0.85
0.9 0.05 0.05
0.1 0.05 0.85 you can type anything…
0.3 0.3 0.4
0.1 0.05 0.85
0.3 0.3 0.4
0.9 0.05 0.05
0.23 0.23 0.54
0.32 0.32 0.36

输出结果:

[zhaobaiwen@compute-0-34 bin]$ perl 090731_likelihood2.pl ../data/test

————————-START—————————-
The items are:
2.6402e-08
2.42312e-07
2.11945e-06
1.20572e-05
6.04428e-05
0.000243997
0.00086303
0.00261194
0.00694306
0.016098
0.0327922
0.0584573
0.0912346
0.124213
0.147172
0.151142
0.133989
0.102087
0.0665583
0.0370609
0.0176322
0.00721272
0.00255662
0.000786022
0.000210827
4.92039e-05
9.94697e-06
1.73887e-06
2.55849e-07
3.17319e-08
3.072e-09
2.26301e-10
1.0148e-11

…..Checking the items…..
The sum is: 1.0000000000
!!!PASS!!!

————————RESULT—————————-

The maxinum likelihood value is: 0.151141956467596

The corresponding genotype(s) is(are):
-THESTAFF-1234567890123456789012345678901234567890
15        00000000000000000111111111111111

————————–END—————————–

分析:

通过优化的算法使得运算次数从与输入量成指数关系到线性关系使得程序变得操作可能。
通过减少子例程的调用大大缩短了程序运行的无用时间,将perl的劣势最小化,实现了高效运行。
尽量减少了变量。
新建了句柄LIKE替代默认的STDIN句柄,调用ARGV[0],限制了一次进行一个SNP位点的分析。
注释中加入了作者署名,有利于知识产权保护。

下一步优化方向:

适应大量数据运算,可将交互式界面删去,进一步优化代码。
输出到文件,只需再新建一个句柄即可。
使用参数进行控制,CHECK部分应为可选。
为了减少无用的资源占用,可以移植到C++。

注1:为了实现最佳的阅读体验,请使用等宽字体阅读此篇文章。

注2:这是一篇很冷的文章。。


其实就是。。。我想说。。我很忙。。。

突然发现最近一直没有写space,而且不仅是没时间写,而且是没时间想起还有要写space这件事…感触倒是不少,确切说是非常多,但是宁可写一个长长的评论也懒得自己写一篇日志。总之很忙就是了。。

实验室那里发生了巨郁闷的事。具体来说就是,黄瓜的m基因和G34C突变都找到了,成果基本就出来了。法国一破实验室就在最新的science上面发了一篇A Conserved Mutation in an Ethylene Biosynthesis Enzyme Leads to Andromonoecy in Melons总之就是和我们这边的基本一样,换成了甜瓜罢了。。400多个bp就几个不一样,明显是同源的。Science啊!!!这直接结果就是我们这边的结果基本作废,估计只能发在什么《园艺画报》上了。。。靠之,中国队给我加把劲儿把法国队灭了!!!

当然痛定思痛居然也找到宝了嘿嘿现在应该就要有一个重大突破了,赶紧干的话下一期发在科学上基本上能接着法国佬的文章继续弄一个封面文章而且意义之深远绝对令他们相形见拙亲手将其灭掉哈哈哈哈!!!

实验用的泥土配方简直跟伪科学似的。。什么蛭石草炭有机肥。。。算了。。

科协的项目是小卫星,和泡泡一起做。上学期就定了,直至一个星期前还杳无音讯。我就打电话到竺豪贞那里催,竺豪贞就把我踢皮球踢到李作霖那里;李作霖说奥运没联系就让我自己联系把我踢给小卫星负责郭雷;郭雷说没听说有人大附中的学生要来让我联系学校老师;我就又联系李作霖,李作霖说他会联系,又说刘刚联系过了让我联系他;打到刘刚那里他超级不耐烦说明天你下午到北航来找我们谈就成了……靠×2……

丘成桐数学奖的事。就是要弄一个量纲归一(大致上是这样的,“量纲归一”这个名字是我弄出来后攒的……)。要求一大堆,范围有限统一,要保证对称性,比如指标是标准指标的二倍时的值一定和指标是标准指标的二分之一时的值距中间值1的距离相等。。又要符合边际递减,就是说水资源是平均值的5倍和50倍没什么差别……反正是超复杂就是了。。也是,非要把居民文盲率和地区写字楼数量以及年光照强度一起比较,这么做能比出来已经是幸运了。。。

鉴于此我决定贴一下刚刚写的“量纲归一法”,否则我感觉费这么大劲就为了给两个人看太对不起我用两个小时画图画出来的函数图了……

对于此方法刚刚许一先同志以其敏锐的洞察力发现了许多漏洞,不过基本上不影响其完整性。其中最大的一个问题是有少量指标不是单调的,比如海拔0米绝对不成;100米肯定没问题;6000米又会死人。。。我想了想这个可以通过引入正向偏离和负向偏离来解决(顺便一口气又攒了两个概念……)。

唉不管了不管了先睡觉再说。。。