去年秋天,实验室新上了LIMS,领导让我牵头把几台液相色谱仪工作站的数据直接采进系统,不再让人工抄录。一开始我把这事想得挺简单:不就是解析个文件吗,工作站跑完序列总会生成报告,LIMS抓过来读取峰面积、保留时间这些字段,入库就行了。
真上手才发现,麻烦全是看不见的那种。
我们实验室那几台液相,品牌、年代差别极大——安捷伦的1260、沃特世的e2695、岛津的LC-20A,还有一台更老的。通讯方式首先就让人头大。网络版的工作站还好,可以直接通过数据库视图去取数;走串口的老家伙就得加一个串口转以太网的盒子,把数据流打成文本文件存放在共享目录里,让LIMS轮询抓取。那台只认软盘的,我直接建议报废了。光这一轮硬件摸底盘,就花了快两周。后来我养成一个习惯:动手前先拉一张仪器台账,把型号、工作站版本、通讯接口、数据输出格式列清楚,缺一项都不往下走。
接口打通后,数据格式的问题又冒出来。各家工作站导出来的东西差别太大了,有的是AIA格式,有的给CSV,有的只肯吐一份带格式的Excel,还有一家生成的是二进制日志文件。字段命名更是千奇百怪,像“峰面积”这个最基础的参数,有的叫“Area”,有的叫“Peak Area”,有的导出时带单位“mAU*s”,还有的峰面积和峰高共用一列,前面加个标记。有一次解析沃特世Empower自动导出的文本,数据里莫名其妙在天头位置多了一个空行,正则表达式抓取时直接错位,所有结果往后窜了一行,要不是核对原始图谱,差点把整批样品算错。
真正让我绷紧神经的,是数据完整性的要求。按照FDA 21 CFR Part 11的原则,原始数据、积分参数、元数据、审计追踪都得完整被抓过去,而且不能被篡改。有些工作站的审计追踪藏在另一个独立的数据库里,操作员几点几分改过积分、改之前面积多少、改之后多少,这些记录不全的话,接到LIMS里就是一颗雷。我们最后采取的办法是,在LIMS端做文件级哈希校验,任何外来的原始文件一归档就生成摘要值,后续每次调阅都对比一次。审计追踪的同步则全部通过日志视图对接,操作人、时间戳、变更前后的值一并写入LIMS的审计表,不允许以任何批处理形式直接插入。
还有一个很容易被忽略的地方——时间。仪器电脑的时间如果跟LIMS服务器不同步,会出现采样时间比进样时间还晚的乌龙,这对电子记录来说是很严重的事情。后来我们强制所有连仪器的工作站都通过NTP对时,对不上的自动锁死上传通道,操作员自然就会叫IT来修了。
网络断线重传的事也折腾过一阵。晚上自动跑序列,中间交换机闪断一下,文件传一半,LIMS一解析就报格式错误。操作员第二天一看报错,直接手动又拖了一次,完事数据库里两条记录。后来我在解析程序入口加了一道校验——凡是文件大小跟传输前不一致的,直接移到隔离目录,由LIMS自动通知管理员处理,算是堵上了这个漏洞。
现在回头想,这类对接最难的根本不是写两行解析代码,而是你要钻进每台仪器的“生活习惯”里去。哪台机器导出的文本编码是UTF-8带BOM,哪台工作站升级过小版本后字段顺序变了,这些琐碎事儿没人会写进招标参数里。真正难的,从来不是系统功能本身。
