使用 Python 模擬生物分子
背景
分子建模工具包 (MMTK) 是一個開源的 Python 庫,用於分子建模和模擬,專注於生物分子系統,用 Python 和 C 的混合編寫。它提供了諸如分子動力學或簡正模式計算等現成的標準技術,但也提供了底層操作的基礎,在此基礎上可以輕鬆實現新技術。
我於 1996 年開始開發 MMTK。我有一些使用 Fortran 編寫的生物分子主流模擬軟體包的經驗,這些軟體包起源於 20 世紀 70 年代。這些軟體包使用起來過於繁瑣,特別是難以修改和擴充套件。由於我的研究工作側重於新模擬技術的發展,可修改性是一個特別重要的標準。

伴侶蛋白 GroEL 的動態變形,使用基於 MMTK 的互動式 DomainFinder 獲得 (放大)
必須考慮到的生物分子模擬的特徵是某些模擬技術的執行時間很長(幾周並不罕見)以及描述生物分子的資料結構的複雜性。
語言的選擇
在評估了各種語言後,選擇了 Python 加 C 的組合。我很快就確信,只有高階解釋語言和 CPU 高效編譯語言的混合才能滿足我對快速開發和高效執行看似矛盾的要求。
對於高階部分,Tcl 被排除在外,因為它無法處理專案所需的複雜資料結構。Perl 因其令人不快的語法(這當然是一個主觀選擇),以及其糟糕的 OO 機制而被排除在外。Python 在可讀性、OO 支援、庫支援以及與編譯語言的整合方面得分很高。此外,Numerical Python 剛剛釋出,這是我開發工作的重要組成部分。
對於低階部分,Fortran 77 因其過時的特性、缺乏記憶體管理以及 C-Fortran 介面中的可移植性問題而被排除在外。C++ 是一個候選者,但最終沒有選擇,因為在 1996 年,編譯器之間的可移植性仍然是一個問題,而且我認為 C++ 對於專案中少量編譯程式碼的好處不足以彌補該語言的複雜性。
庫架構
MMTK 的架構顯然是 Python 驅動的。對於使用者而言,它以純 Python 庫的形式呈現。MMTK 中的 C 程式碼是從頭開始編寫的,以 Python 擴充套件模組的形式,這些模組僅處理少數時間關鍵方面:互動能量的評估,以及長時間執行的迭代演算法,如能量最小化和分子動力學,它們在沒有 Python 相關開銷的情況下執行。廣泛使用了 Numerical Python、LAPACK 和 netCDF 庫。MMTK 為共享記憶體並行機器提供多執行緒支援,併為分散式記憶體機器提供基於 MPI 的並行化。
MMTK 的最大部分是一組描述原子和分子並管理分子和片段資料庫的類。生物分子(蛋白質、DNA 和 RNA)由通用 Molecule 類的子類處理。MMTK 的另一個重要子集實現了計算互動能量的模式(在模擬社群中被錯誤地稱為“力場”)。I/O 相關程式碼是 MMTK 的第三個支柱。它讀取和寫入一些流行的檔案格式,以及它自己的基於 netCDF 格式的軌跡格式。與其他軌跡檔案格式相反,MMTK 的 netCDF 檔案既是二進位制檔案(因此緊湊),又可以在平臺之間移植,並且允許高效訪問幾乎任意的子集。

使用 MMTK 執行的溶菌酶在水中的分子動力學模擬的快照。 放大
模組化和可擴充套件性是重要的設計標準。可以在不修改 MMTK 程式碼的情況下新增演算法、能量項和資料型別的專門化。MMTK 作為庫而不是封閉程式的設計對於許多應用至關重要。
生物分子模擬的一個重要方面是視覺化。MMTK 將此任務委託給外部工具。兩個視覺化程式 VMD 和 PyMOL 特別整合良好。
大多數 MMTK 使用者從簡單的 Python 指令碼訪問該庫,但 MMTK 也已被用作帶有圖形使用者介面的終端使用者程式的基礎,例如 nMOLDYN 和 DomainFinder。
MMTK 目前由約 18,000 行 Python 程式碼、12,000 行手寫的 C 程式碼和一些機器生成的 C 程式碼組成。大部分程式碼由一個人在八年內作為研究活動的一部分開發。兩個模組、一些函式和許多想法是由使用者社群貢獻的。
實踐經驗
MMTK 和其他 Python 庫已成為我十年所有研究專案的基礎。如果沒有 Python 的快速原型製作特性,其中許多專案是不可能實現的。在方法論工作中,開發和測試時間至關重要:一個下午可以嘗試的想法會被嘗試,而需要一週時間進行評估的想法通常會被擱置。
與所有開源專案一樣,MMTK 使用者社群的規模只能間接估計。MMTK 使用者郵件列表目前有 175 名成員,而描述 MMTK 給計算化學家的科學出版物已被引用 30 次。
關於作者
Konrad Hinsen 是法國國家科學研究中心 (CNRS) 從事理論物理研究的研究員。他參與了 Numerical Python 專案,並且是 ScientificPython 的作者,ScientificPython 是一個通用的科學 Python 程式碼庫。