第1章 异常结构

实验室的空调已经停了。

陈启没注意到。他盯着左屏的比对结果,右手食指无意识地敲击桌面——每分钟大约六十次,和心率同步。这是他的习惯,从读博时就有的毛病:当大脑在处理某些超出预期的数据时,身体会自动切换到某种低功耗模式,把注意力资源全部让给视觉皮层。

左屏显示的是47号样本的基因折叠图谱。正常情况下,这个图谱应该像一团精心缠绕的毛线——乱,但有规律。每个区域都有对应的编码标签,荧光蓝标注已知功能区,灰色标注沉默区,偶尔几个橙色标记表示”待确认”。研究所的分析软件运行了十几年,迭代到第七版,数据库里收录了超过三百万条基因结构的参考模型。任何一个正常样本放进去,软件都能在三秒内给出匹配结果。

但47号样本第17号染色体的短臂上,有一段区域是纯黑的。

不是灰色——灰色意味着”沉默但已标记”。纯黑意味着系统不认识它。

陈启以为是染色失败。他从冷冻柜里取出47号样本的备份管,管壁上凝结着一层白霜。他把冻干的样本在室温下解冻了十五分钟,然后重新走了一遍提取、扩增、测序的完整流程。四小时后,结果出来了:同一位置,同样的纯黑。

他换了一台测序仪。那台机器是去年才采购的,精度比原来的高一个数量级,但使用频率不高——只有在原始数据出现可疑信号时才会启用。陈启花了半小时校准参数,然后把样本送了进去。

又等了三小时。

纯黑。

陈启摘下眼镜放在桌上,揉了揉鼻梁。眼镜框在鼻翼两侧压出了两道红痕,他平时不戴眼镜,只有在实验室里看基因图谱时才需要——度数不高,一百七十五度的散光,但他发现精确读取荧光标记时,裸眼会把光点的边缘模糊掉。这种模糊在日常生活中感知不到,但在基因分析的精度尺度上,差一个像素就意味着差几十个碱基。

右屏开着数据库检索窗口。他已经把那段未知结构的碱基序列输入了三次,每次系统返回的结果都是同一行字:

结构未匹配。建议重新取样。

陈启没有重新取样。他把三次检索的原始数据导出来,逐行比对。

这是一个很笨的办法。数据库匹配算法比人眼快几百万倍,他没有理由手动比对。但陈启做事有一种固执的习惯:当自动化工具给出的答案不合理时,他会退回到最基础的操作。不是因为他不信任技术,是因为他不信任”不合理”。这个习惯让他在读博期间多花了一年毕业,但也让他发现了导师论文里的一个计算错误——那个错误后来被纠正了,论文发了勘误,导师从此对他另眼相看。

手动比对进行到第十七分钟时,他发现了问题。

三次检索的原始数据不完全一致。

差异很小——小到系统没有标出任何异常。三个样本在同一个位点上的读数分别是:87.43、87.41、87.44。看起来像是正常的仪器波动。但陈启盯着这三个数字看了很久。

误差太整齐了。

真正的仪器误差应该是随机的——有时偏高,有时偏低,幅度不一,分布呈正态。但这三个数字围绕同一个中心值均匀波动,像是被校准过的钟摆在同一个幅度内摆动。标准差只有0.015,对于这种型号的测序仪来说,正常的标准差应该在0.08到0.12之间。

太精确了。精确到不像是误差,更像是一种伪装。

他打开了系统日志。

日志记录了每一次数据传输的路径和时间戳,精确到毫秒。他顺着47号样本的记录往上追溯,逐层检查数据从测序仪到实验室服务器的每一个路由节点。到第三层的时候,他找到了测序仪的输出端口日志。原始数据从测序仪传到实验室服务器的路径上,经过了一个他没见过的中间节点。

节点编号是一串十六位字符,没有注释,没有归属信息,没有物理位置标注。

陈启盯着那个编号,后颈微微发凉。

这种感觉他认识。不是恐惧——是一种更接近于”确认”的东西。他之前怀疑过数据被干预,但一直找不到证据。他甚至在上个月写了一份内部报告,建议信息安全部门审查数据链路,报告递上去之后石沉大海。他追过两次,第一次行政助理说”在走流程”,第二次连行政助理都没找到。现在证据就在屏幕上:有一台不知道是谁控制的设备,接入了实验室的数据传输链路,对47号样本的分析结果做了实时修正。

修正的方式很聪明。不是删除数据,不是覆盖数据——而是在原始数据上叠加一个微小的偏移,让异常值看起来像正常波动。这种手法在信号处理领域叫”掩蔽”——在目标信号上叠加一层噪声,让它淹没在背景里。

太聪明了。

陈启关掉日志窗口,重新打开基因分析软件。他没有接入实验室服务器,而是把数据拷贝到本地硬盘,断网运行。他在操作的时候注意到自己的呼吸变得浅而快——这是身体在告诉他有什么重要的事情正在发生。

等待软件加载的时间,他摘下眼镜,揉了揉眼睛。指尖按在眼皮上的时候,他看到了一片模糊的橙色光斑——那是窗外城市灯光在视网膜上的残影。

窗外的天空已经从深蓝变成了纯黑。他不记得自己是什么时候拉上窗帘的——不,他没拉窗帘,是天自己黑的。远处城市灯光的微弱反射在玻璃上形成了一层橙色的薄膜,让实验室看起来像是沉在一个发光的水底。

桌角放着一个纸杯,杯壁上印着研究所的logo——一只抽象的鹰,线条简洁得像电路图。杯子里的咖啡早就凉了,液面上浮着一层薄薄的油脂,油脂在灯光下呈现出彩虹般的干涉色。

那是杰森上周留在他桌上的。

杰森是基因工程部的副所长,比陈启大十二岁,平时话不多,但偶尔会在深夜路过实验室时带两杯咖啡。他从不敲门——陈启怀疑他有所有实验室的门禁权限。上周那次,杰森把咖啡放在桌角,看了一眼陈启的屏幕,什么也没说就走了。陈启喊了他一声”杰森”,他回头点了一下,然后消失在走廊尽头。

陈启当时没在意。现在回想起来,杰森看的那块屏幕——好像正好显示的是47号样本的初步分析结果。当时那个结果还是标准的灰色沉默区标记,没有什么异常。但杰森看的那一眼,停顿的时间比正常的”随便瞥一眼”要长。

他把这个念头暂时搁置了。不是因为它不重要,是因为他手上有更紧急的事。

本地软件加载完成。陈启把47号样本的原始数据导入,开始手动调整分析参数。

标准算法对未知结构的处理方式是”忽略并标注”——把识别不了的区域标记为灰色,然后跳过。这是为了保证分析效率:基因组太大了,如果每个未知区域都停下来仔细研究,一个样本的分析周期会从三小时变成三天。但陈启想看清楚这段结构到底长什么样。他逐步降低了过滤阈值,每降一档就停几秒,观察屏幕上图谱的变化。

灰色的沉默区边缘出现了微弱的蓝色荧光——那是系统之前判定为噪声的信号。陈启继续降低阈值。蓝色荧光逐渐连接成线,线汇聚成面,面折叠成一个三维结构。他用鼠标旋转那个三维模型,从不同角度审视它。

那个结构的形态让陈启停下了手上的动作。

它不像任何已知的基因折叠模式。

已知的基因结构要么是规则的螺旋——DNA双链的标志性形态——要么是自由卷曲的无序团块,要么是蛋白质折叠形成的特定三维拓扑。但47号样本的这段结构呈现出一种高度对称的几何形态——层层嵌套的环形,每一层都精确地套在上一层外面,层与层之间的间距完全相同,像是某种被设计出来的图纸。

陈启的第一反应不是”这是什么”,而是”这个数据可靠吗”。

他回到测序仪的原始输出,逐个碱基验证。每一个信号峰都在,没有截断,没有拼接痕迹,峰高和峰宽的比值在正常范围内。他又跑了一次质量控制,Q值全部在30以上——这意味着每千个碱基中出错的概率不到一个。对这个精度水平的测序仪来说,Q30是出厂标准,不是实验极限。

数据是可靠的。

他又检查了一遍本地软件的分析逻辑。他把源代码中处理三维折叠的算法模块调出来,逐行读了两遍。没有bug,没有参数漂移,输出和输入的数学关系干净得像教科书例题。他甚至手动推导了一遍核心公式,验证软件输出的坐标值和他纸笔计算的结果一致。

逻辑是可靠的。

那眼前这个东西就是真实的。

陈启靠在椅背上,盯着屏幕看了很久。他注意到自己的呼吸变得很浅——不是紧张,是专注。当他的大脑在处理某些需要大量工作记忆的任务时,呼吸会自动变浅,这是他在研究生期间就注意到的现象。有一次他在计算一个复杂的遗传连锁分析时,室友以为他晕过去了,拍了他一下,他吓了一跳,差点把笔记本电脑掀翻。

一个不应该存在的基因结构。

一个被人刻意掩盖的基因结构。

一个在被掩盖之后仍然存在的基因结构。

这三句话在他脑子里转了好几圈。第一句是事实。第二句是推论——基于数据链路上的中间节点和被修正的误差。第三句是问题——如果有人花了这么大力气掩盖它,为什么它还在?

他打开了实验记录本,翻到今天的日期。犹豫了几秒,他没有在本子上写任何东西——他不确定实验记录本是否也在被监控的范围内。如果那个中间节点能实时修正测序数据,那它也有能力读取实验室的任何数字设备。

他从抽屉里拿出一支铅笔和一张A4纸,开始手写。

写了三行之后他停下来。

他应该写什么?“发现了未知基因结构,疑似人为设计”?这句话如果被别人看到,他会先被送去检查视力,然后被送去检查精神状态。在他十二年的学术生涯中,他见过不少同事因为”大胆假设”被边缘化——有一个植物基因组学的博士后声称在水稻基因里发现了”人工编辑的痕迹”,结果被调去了档案室整理标本。

他重新开始写,换了一种方式:

“47号样本,17号短臂异常区域,三台仪器独立验证,结果一致。区域形态呈嵌套环形,无已知匹配。数据完整性已确认。待进一步分析。”

客观,简洁,不带任何推测。

这才是他能提交的东西。

但他不打算提交。

陈启把A4纸折了两折,塞进外套内侧口袋。然后他重新面向屏幕,打开了一个新的分析窗口。

他要做的事情在技术上没有难度——只需要把分析阈值再降一级,让被判定为”纯噪声”的信号也显示出来。理论上,那些信号确实是噪声,因为它们的强度低于信噪比的最低标准。任何一本统计学教材都会告诉你,低于信噪比阈值的信号没有分析价值。

但陈启想看。

他把鼠标移到阈值滑块上,往左拖了一格。

屏幕闪了一下。

图谱的边缘出现了新的信号——不是蓝色的已知结构,也不是橙色的待确认区域。那些信号是琥珀色的。

他从来没见过琥珀色标记。分析软件的色板是固定的:蓝色代表已知结构,灰色代表沉默区,橙色代表待确认,红色代表异常。琥珀色不在色板上。

系统弹出了一个对话框,灰底红字:

警告:当前操作将绕过标准过滤协议。分析结果可能包含不可靠数据。

是否继续?

陈启点了一下”继续”。

琥珀色的信号开始扩展。它们沿着那个嵌套环形结构的边缘蔓延,像是一层新的外膜正在被揭开。陈启注意到这些信号的强度并不低——它们只是频率异常,所以被系统判定为噪声。这就像用收音机搜索频道时,如果信号不在任何已知的频段内,收音机会把它当作静电噪声过滤掉——即使那个信号本身非常清晰。

他切换到频谱分析模式。

琥珀色信号的频率集中在47.3赫兹附近。非常集中——带宽只有不到0.5赫兹,这意味着这个信号的纯度极高,不像是自然产生的随机噪声。

陈启不知道这个数字意味着什么。但他记住了。

系统又弹出了一个对话框:

警告:此操作未经授权。

[忽略] [取消]

陈启的手指悬在鼠标上方。他看了一眼屏幕右下角的时间——凌晨两点四十七分。实验室的空调不知道什么时候重新启动了,冷风从头顶的出风口吹下来,让他后颈的汗毛竖了起来。

他点了一下”忽略”。

对话框消失的时候,他觉得自己可能做了某种不可撤回的事情。但这个念头只持续了半秒——他的注意力已经被屏幕上的变化完全吸引了。

琥珀色的信号彻底展开。

完整的结构呈现在屏幕上。它比他之前看到的嵌套环形更加复杂——环形的中心不是空的,有一团密集的信号簇,像是某种被折叠压缩的信息包。信号簇的密度远超周围的区域,颜色深得几乎发黑,但在琥珀色光流的映照下呈现出一种半透明的质感。整个结构看起来不像基因,更像是——

陈启想了很久,找到了一个不太恰当但最接近的比喻。

像一张建筑图纸。

不是普通的建筑——是那种精密的、有层次的、由无数相互嵌套的子系统组成的复杂结构。每一个环形层都像是一个独立的功能模块,模块之间有清晰的接口和通道。而中心的信号簇就像是整张图纸的核心——所有的层都围绕它展开,所有的通道都指向它。

被故意编码进人类基因里的设计图。

他盯着屏幕,心跳在加速。不是恐惧——是那种当你在实验数据中看到某种不该存在的秩序时,整个身体都会产生的共振。他的手指不自觉地攥紧了铅笔,指节发白。

屏幕角落闪了一下。

陈启眨了一下眼睛。

刚才在图谱的边缘——他不确定——好像有什么东西在琥珀色信号的流动中顿了一下,像是数据流里有一个瞬间的回波。只持续了不到一帧的时间,快到他无法确认是否真的发生过。

他重新播放了那一帧数据。

什么都没有。波形平滑,频谱干净,没有任何异常跳变。

也许是他盯屏幕太久,视网膜上的残影。他已经连续看了将近八个小时的基因图谱,视觉系统产生错觉是完全正常的。

也许不是。

陈启把铅笔放下,翻开了新的一页A4纸。这一次他没有犹豫。他开始写实验方案——不是数据分析方案,是激活方案。

他要试着把那段结构”打开”。

看看里面到底有什么。

他在方案的第一行写下:

“目标:在受控条件下激活47号样本中的未知结构,观察其响应模式。”

写完之后他停了一下。窗外的城市灯光在天花板上投下了一片模糊的橙色光影,像是某种不请自来的信号。他突然想起杰森上周看的那一眼——那个比正常”随便瞥一眼”更长的停顿。

如果杰森知道这段结构的存在——他为什么不报告?

如果杰森不知道——数据修正又是谁在做?

如果数据修正不是人做的——那是什么在做?

陈启把实验方案折好,和之前的笔记放在一起,塞进外套口袋。他关掉三块屏幕,实验室陷入黑暗。只有空调出风口的微弱气流声在空气中回荡,像是某种无意识的呼吸。

他站起来时膝盖咔嗒响了一声。坐了太久了。脖子也僵了,转头的时候能听到颈椎发出细碎的咔嗒声。

走出实验室之前,他回头看了一眼黑暗中的三块屏幕。它们像三面黑色的镜子,映出了他的轮廓——一个三十二岁的基因工程研究员,穿着皱巴巴的白大褂,眼眶下面有明显的青黑色,头发因为长时间没洗而微微翘起。

他在等什么呢?

他不知道。但他知道明天他会回来。