我的第一篇论文
准备开启一个《我的第X篇论文》系列,目的是自己写得开心,可能含有大量专业词汇。按照只看一作的评价标准,以及发文章的速度,不会频繁更新。
时至2018年3月,那时我刚刚结束了一个失败的课题,对molecular dynamics (MD)有了初步了解。大三下学期是一个“无课学期”,我的课表上只有4学分的课,有大量富余时间。开学后,导师告诉我暂缓force matching的project,先开始基于hidden Markov Model (HMM)分析MD轨迹的课题。这个project来自前一年申请的国自基金项目,然而当时我尚未入组,这个课题迟迟未能完成。
老师给了我Liping Wang的两篇文章用作参考,很快,我google到一个名叫hmmlearn的library。基于上一个课题的部分代码,很快,我便有了思路。解决了几个关键问题后,3月11日,第一版Python程序出炉,能够分析LAMMPS的bond文件,并生成每个原子的路径,计算出轨迹的所有反应,生成一个reaction matrix。
但是,由于这一版程序是串行的,分析10GB的MD轨迹文件有点力不从心。我尝试用multiprocessing实现并行,速度的确大大提升了,但是出现了超算上64GB内存全部用光,子进程全部挂掉的情况。无数次debug+Stackoverflow后,我终于确认原因:I/O比程序运行得慢,导致进程全堵塞在内存里。解决方法是用Semaphore。解决了这个问题后,我的程序终于可以正常分析轨迹了。测试了甲烷和RP-3的表现后,4月6日,我把程序传到了GitHub上。
程序仍有待进一步完善。一方面,reaction matrix仍然不够直观。关于这一点,我找到了networkx这个package,可以用力引导的方式生成reaction network的图像。另一方面,目前的程序不能识别同分异构体。我发现OpenBabel和RDKit可以生成SMILES,不过痛苦的是,他们的安装过程的极其繁琐。在尝试安装的过程中,我发现了Anaconda这个宝藏,可以跳过C++程序的编译过程。之后,我用RDKit实现了这一功能。到了4月底,这一课题算是基本成功了,我把主要精力转移到了深度学习的课题中。
剩下的精力用于画图,同时我对程序进行了各种优化。借助OpenBabel的力量,我实现了读取坐标,并转化为化学键的信息。此外,我也深入理解了HMM的原理。端午节回家的时候,我用这三天假期写出了文章,并把程序命名为ReacNetGenerator,同时创建了相应的setup.py。不过,因为种种原因,进一步修改文章的工作被搁置下来。
9月至11月的专业实习虽然极其可恶,但是我因此拥有了大量空闲时间,又对程序进行了完善:首先,实现了conda编译和安装,大大简化了安装步骤。其次,读取坐标时实现了周期性边界条件。虽然OpenBabel本身不支持周期性边界条件,但是可以用奇技淫巧实现。第三,实现了命令行和GUI运行程序。最后,利用我的一点前端的知识,以及OpenBabel生成的图像,将结果展示到了网页上。
12月,为了申请学校,初步修改后的论文被传到了preprint网站ChemRxiv上。这篇论文成为我申请时提供的论文之一。
到了2019年的寒假,除了修bug外,我又做了几个方面的优化。第一,大大增快了计算速度。我发现,计算时的主要瓶颈是中间缓存文件的I/O。于是,我先用lz4+base64压缩数据后,再存入临时文件。另一方面,我用Cython重写了部分函数。第二,了解了前端的最新动向后,我将前端用到的library全部调用nodejs和yarn安装,可以很方便地更新library。之后,我还用前端实现了绘制network的功能,以及筛选物种的功能。另外,我还做了一个可视化的进度条,并且完善了软件的官网。
7月底,那时已经毕业了,我借着这个软件获得了中国大学生计算机设计大赛一等奖。不过这篇文章因为种种原因仍然难产,直到9月中旬,来到Rutgers开始rotation后,这篇文章被投到PCCP。之后的事情平淡无奇:10月上旬审稿意见出来,大修,修回后,11月下旬被接受。
最后,我的第一篇文章终于在新年第二天见刊了。虽然档次不算高,花费的时间和精力也不是很多,但作为第一篇文章,具有很大的纪念意义,我也因此大大提升了技术,为之后的课题奠定了基础。
ReacNetGenerator: an automatic reaction network generator for reactive molecular dynamics simulations
Jinzhe Zeng, Liqun Cao, Chih-Hao Chin, Haisheng Ren, John Z. H. Zhang, Tong Zhu
Physical Chemistry Chemical Physics, 2020, 22 (2), 683–691.
DOI: 10.1039/C9CP05091D