程序中最重要的函数是cal_order_frame,这个函数有两个输入waters和water_buffer。两个都是MDAnalysis的atomgroup对象。其中waters就是所有你需要计算序参数的水分子的氧原子,在这里就
是name OW and around 5 (resid 15), 也就是GLN16(因为蛋白从GLY2开始,所以GLN16的resid是15)周围5A所有名字叫做OW的原子。而water_buffer这里则定义为'name OW and around 8.5 (resid 15)',这是因为离waters里面一个water最近的四个water,不一定都在waters里面。所以设置了3.5A的缓冲区域,对于每一个waters中的water,我们将会在water_buffer里面寻找离他最近的氧原子。实际上是为了计算效率的一种考虑(不用遍历所有的水)。这里3.5A是一个比较安全比较大的值,理论上可以设计的更小,但我因为不是研究水的,在这里为了正确性,取了一个比较保守的值。
有了这两个atomgroups之后,cal_order_frame就会遍历waters中的每一个water,并在water_buffer中寻找离它最近的四个氧原子。之后会将这个氧和离它最近的四个氧传入函数cal_order计算该水分子的OTO,最后我们会将每一个水的序参数存在一个list里面并返回。那么我们只需要遍历轨迹,每一帧调用cal_order_frame,并把每一帧返回的list加起来,就可以得到所有蛋白质残基GLN16附近5A以内的水分子的序参数的值,然后就可以根据此画出序参数的分布图。需要注意的是在这个过程中选择的atomgroup要使用动态选取,即updating=True,来保证每一帧选的都是GLN16附近的水。