Paleodictyon - 古网
我本来是不想回复B站网友的,但是既然网友问了……我的团队之前开发了用于分析体细胞突变(somatic mutation)的通用工具,可以对其他研究机构用户在线提交的分析请求进行处理。用户通过信息队列SQS提供一个JSON格式的事件(event)来触发分析流水线(pipeline),event中需要包含用户信息和样品基本信息,特别是样品的DNA测序结果BCL文件数据源与参考基因组版本。这套系统最初只是用来分析人类数据促进癌症研究的,但是后来为了方便比较不同物种间的体细胞突变频率差异而被拓展到支持跨物种分析。用户只需要在event中指定物种的种属名,系统就会自动寻找适配的参考基因组。如果用户的event是无效的,系统会通过简单通知服务SNS向开发维护团队发出一个包含错误信息与Log文件的提示,方便进行故障排查。
我在一个清晨例行查看邮箱时发现了数封提示邮件,错误类型都是“无效的种属名”。我一开始没当回事,这种低级错误用户一般会自行处理。但是接下来同样的错误信息被发来了几十次。我无奈地开始详细阅读Log, 发现用户是一个来自古生物所的账号,这让我很惊讶。因为古生物所很少有测序分析的需求,毕竟化石提取DNA可能性太飘渺。我一边发出邮件询问他们是否需要协助一边将Log拉到种属名进行检查。用户没有按照双名法输入,属名空着,而种名写着“Paleodictyon”。我有限的拉丁文词汇积累瞬间被击穿,我不得不求助于谷歌。谷歌很爽快的回答了两个字“古网”。
古网是什么鬼?还未等我在维基百科中搜寻答案,古生物所的回件已经不期而至。对方是一位副研究员,他告知我账号的使用记录显示是他的一位博士生A君提交了若干次分析请求,但是这些请求并未告知所里。他向我表达歉意并说之后不会再发来新的分析请求。虽然一头雾水,我也还就将此揭过,权当是意外触发。但是没过两天我的维护邮箱再一次被错误提示塞满,又是古生物所的账号,又是那么什么古网!
这下我坐不住了,立马找出上次邮件中的电话号码给副研究员打了过去。在简短寒暄后我直接开门见山抱怨起又接到了一大堆古网的分析请求。副研究员表现出震惊,发出不可置信的“啊??”在磨磨唧唧了半天并且要求我对谈话内容保密之后副研究员才说“这是不可能的!”。原因很简单,只有博士生A有这个账号权限他也确实在做一种被称为古网的海洋化石研究,但是他已经失踪半个月了!使用账号需要所里的VPN,他不在所里根本提交不了请求。而且副研究员还说:“古网是印痕化石,哪来的DNA可分析?”这下轮到我震惊了,因为收到的请求明明白白提供了待分析BCL文件的路径。带着满肚子疑惑,我决定先冻结这个账号,然后把BCL文件转为FASTQ文件看看都是什么玩意,是不是随便拿了个其他物种的数据来搞恶作剧。
我带着玩玩的心态抽取了一部分FASTQ文件中的碱基序列片段做了BLAST比对,结果令人惊讶,居然没能和任何哺乳动物的基因组序列匹配上,反倒和头足类能部分匹配,可惜得分也不是很高没有决定性。我在吃午餐时用手机播放了一个副研究员推荐的视频,是一个B站的up主,叫芳斯塔芙什么的。他的视频介绍了古网这种令人迷惑的六边形网格状印痕化石。其处于深海之中,虽然大概率此物种没有灭绝但是只见印痕不见生物真身。这个视频激发了我的好奇心。我快速开发了一个简短的pipeline对收到的所有标注为古网的测序文件进行了一些定性分析。结果令人惊讶,所有序列都表现出极高的GC值,高到了离谱。一般来说鸟嘌呤与胞嘧啶(G/C)总比例都在序列的35%~65%之间,偶尔有高者如放线菌Streptomyces rubrolavendulae的GC含量高达74.8%,但是这批所谓的“古网”序列居然都是85%以上,有些片段干脆就是一大堆GC在不断排列组合如果小卫星序列一般。中学生都知道GC之间有三个氢键,相较于AT间的两个氢键更加稳定。GC含量越高,序列稳定性一般越高,但是高过80%之后连复制都会变得困难。这还是DNA,要是RNA天知道这段序列会被内部的氢键匹配扭曲成什么模样。模样?我突然灵光一闪,冥冥之中感觉到了什么,立马将DNA序列转为RNA,粘贴到了RNA二级结构预测软件里。简短的运算之后一张图片输出出来:好似一团乱麻,但是慢慢缩小图片之后一串歪歪扭扭的数字出现在屏幕上,全是1和0。
“二进制!!”我脑中如同响起惊雷,我当即决定把所有的序列转成图片。人工判读是不现实的,量太大。我找了个开源的手写数字识别AI来帮我干这个活。我估计了一下运行大概要大半天的时间,就把二级结构预测程序与AI串联起来,启动为批处理任务(batch job)放在云上跑着。
闲着也是闲着,我又联系了一个和做地质学的朋友,他和古生物所关系紧密。我侧敲旁击打听博士生A君的事。地质老哥和矿石一样实诚,一股脑地把知道的都告诉我了。他居然认识A君,而且知道A君是在和海洋所合作研究在南太平洋某处新发现的古网。A君提过从海底沉积物厚度看是非常新鲜的古网,可能是1年内新出现的。A君当时非常兴奋,眉飞色舞的说什么重大发现,精致的就如海底的城市,非常吸引人云云。但是没多久A君就不对劲了,每天疑神疑鬼还自言自语,站在研究室的水槽边盯着水槽的排水口喃喃低语,说什么“又在叫我”。大家刚开始都只当他发期刊压力太大了,但是没多久海洋所的电话就砸过来了:说A君想要偷偷溜上将要出航的科考船被抓住了。古生物所的领导一个头两个大,硬着头皮去领人,结果到了就被告知A君不见了,而且他被抓的时候如同疯魔般高喊:别拦着,他要我过去!
这个莫名其妙的故事搞得我心神不宁,因为我这下确定第二批古网的分析请求是在A君失踪后发过来的,到底是谁在搞怪?
当夜深人静,系统提示我运行结束。我试着解析这些获得的二进制编码。这有点运气成分,因为可能的编码方式有很多。我索性先试了试最简单的转为十进制再用ASCII代码转换为文本,结果出了一大堆无法解读的混乱字母,让人一看就头晕。我又尝试了UTF8编码,结果还是一样,毫无意义的乱序字母让人头晕眼花,多看几眼感觉视野都出现了扭曲。难道是A君的母语?抱着赌一把的念头,我把编码改为了GB2312。之前的失败让我有点拘谨,没有做批量转换,而只取了序列头部的一小段进行解码。
“来来来。”
哟吼,有点意思,终于有段能读懂的人话了。
受到鼓励之后我立刻进行了批量转化,然后用一个for loop将结果逐行输出,标点符号默认为句号。
“来来来。”
“来来来。”
“来来来。”
“来来来。”
……
“来来来。”
“来来来。”
“来来来。”
怎么全是这句话?出BUG呢?我刚起心动念,一行全新的输出就跳了出来:
“A到这里来。”
A君的大名赫然在列!有门!程序应该没错!
还没来的急高兴,输出的字符又变成了单调重复的“来来来。”
跟着读了几句之后,感觉这三个字就如同在脑海中旋转,挥之不去。我只能用力摇头然后起身望向窗外试图放松一下。可惜天公不作美,明明刚才还是明月高挂,现在却突然间大雾弥漫。雾气之中,柳树影影绰绰,枝条摇摆好似蠕动。我们干实验室(dry lab)外面什么时候种的柳树?没注意过啊。伸了个懒腰,我坐回电脑前又盯了了几分钟。可能是用眼过度,我感觉超宽屏幕都开始肿胀了起来。还好功夫不负有心人,终于又跳出了一行不同的输出:
“古网”。
这下我万分确定这些所谓的测序数据是人为编写的了,费这么大心思就为了搞恶作剧?不太可能。我推测这些字符中搞不好包含着A君失踪的秘密。定了定神,我继续往下看。
“古网”。
“古网”。
“古网”。
又是不断重复。
“古网”。
“旧日的”。
“旧日的”。
“旧日的”。
古不就是旧吗?难道是想做什么解释?还没吐槽,一行与众不同的长文本被输出出来:
“来来来。A到这里来。旧日锟斤拷(乱码)在呼唤。来来来。星星位置对。来来来。来拉嬩簲(乱码?)。来叚莱鑰(乱码?什么意思啊?)。来潕鍥(又乱码?)耶耶耶耶耶耶耶。”
我还没能多想,隔壁茶水间砰的一声巨响,然后就是哗啦啦的水声,还传来一股水腥味。妈呀,不会是爆管了吧?!这个点可没人维修!我无它法,只能先将目前的分析记录发在芳斯塔芙的视频下面回复B站网友,然后就去去查看茶水间。不过水声真好大,听着和瀑布一般,哦不,更像海浪,不乐观啊。欸呦喂,感觉头好晕,头晕目眩的,等拧上阀门就回去休息吧,怎么感觉走路都走不稳了……