MDの計算結果を解析できるPythonライブラリ：MDAnalysisのQuick Start Quideを日本語化する

:::note
[原著](https://userguide.mdanalysis.org/stable/examples/quickstart.html)の翻訳です
:::

# クイックスタートガイド

MDAnalysis バージョン: ≥ 0.18.0

このガイドは、MDAnalysisを使用してデータを読み込み、分析を行うための基本的な紹介を目的としています。
より複雑なタスクについては、[ノート](https://userguide.mdanalysis.org/stable/examples/README.html)を参照してください。
このページでは、以下のことを説明します：

- 分子動力学の構造または軌道を読み込む
- MDAnalysisの中心データ構造であるAtomGroupsを操作する
- 軌道を操作する
- 座標を出力する
- MDAnalysisの分析アルゴリズムを使用する
- MDAnalysisおよびアルゴリズムの正確で自動的な引用

```python
import MDAnalysis as mda
from MDAnalysis.tests.datafiles import PSF, DCD, GRO, XTC

import warnings
# PSFファイルに関するMDAnalysisの警告を抑制
warnings.filterwarnings('ignore')

from matplotlib import pyplot as plt

print(mda.Universe(PSF, DCD))
print("Using MDAnalysis version", mda.__version__)

%matplotlib inline
```

<Universe with 3341 atoms>  
Using MDAnalysis version 2.6.0-dev0

このチュートリアルでは、すでにMDAnalysisがインストールされていることを前提としています。
上記のセルを実行すると、次のような出力が得られるはずです：

```shell:output
<Universe with 3341 atoms>  
2.6.0
```

エラーメッセージが表示された場合、もしくはバージョンが`0.18.0`未満の場合は、MDAnalysisをアップグレードする必要があります。
手順については、[こちら](https://userguide.mdanalysis.org/stable/installation.html)にを参照してください。

## 概要

MDAnalysisは、分子動力学の軌道データにアクセスし、分析するためのツールを提供するPythonパッケージです。
MDAnalysisの基盤となるいくつかの重要なデータ構造があります。

- 分子系は粒子で構成されています。粒子は`Atom`オブジェクトとして表されます（粗粒化ビーズであっても）。
- `Atom`はAtomGroupsにグループ化されます。`AtomGroup`はMDAnalysisで最も重要なクラスであり、ほとんどすべての操作はこれを通じて行われます。
- `Universe`は、分子系内のすべての粒子を`AtomGroup`として保持し、`.trajectory`で軌道と組み合わせます。

MDAnalysisの基本的な概念は、常に1つの時間フレームの軌道のみがアクセスされることです。
`Universe`の`trajectory`属性は通常、ファイルリーダーです。
軌道は、フレームインデックス`t`の関数\\(X(t)\\)として考えることができ、
この特定のフレームのデータのみが利用可能です。
この構造は、MDAnalysisがコンピュータのメモリに収まらないほど大きな軌道ファイルで作業できるようにするために重要です。

MDAnalysisは、内部単位を使用して軌道を保存します：
**長さ**は**Å**（オングストローム）
**時間**は**ps**（ピコ秒）
(元のMDデータ形式に関係なく)

## 構造または軌道の読み込み

MDAnalysisを使用する際は、通常、データを`Universe`に読み込むことから始まります。

`Universe`を作成するための最初の引数は、トポロジーおよび軌道ファイルです。

- **トポロジーファイル**は、データをUniverseに読み込むために常に必要です。
トポロジーファイルは、原子、残基、およびそれらの接続をリストします。MDAnalysisはPSF、PDB、CRD、GRO形式を受け入れます。
- トポロジーファイルの後に**任意の数の軌道ファイル**を続けることができます。
軌道ファイルは、トポロジーで定義された順序で座標のリストを含みます。
軌道ファイルが指定されていない場合、構造のみが読み込まれます。
複数の軌道ファイルが指定されている場合、軌道は指定された順序で連結されます。
MDAnalysisは、単一フレーム（例：PDB、CRD、GRO）および時系列データ（例：DCD、XTC、TRR、XYZ）も受け入れます。

```python
psf = mda.Universe(PSF)
print(psf)
print(hasattr(psf, 'trajectory'))
```

```shell:output
<Universe with 3341 atoms>  
False
```

PSFファイルには座標情報が含まれておらず、軌道ファイルが読み込まれていないため、`psf`ユニバースには軌道が含まれていません。
トポロジーファイルに座標情報が含まれている場合、1フレームの軌道が作成されます。

```python
gro = mda.Universe(GRO)
print(gro)
print(len(gro.trajectory))
```

```shell:output
<Universe with 47681 atoms>  
1
```

このガイドの残りの部分では、以下で作成されたユニバース`u`を使用します。
これは、酵素アデニル酸キナーゼが閉じた構造から開いた構造への遷移をサンプリングするシミュレーションです
`（Beckstein et al., 2009）`

```python
u = mda.Universe(PSF, DCD)
print(u)
print(len(u.trajectory))
```

```shell:output
<Universe with 3341 atoms>  
98
```

**注意**

MDAnalysisのテストスイートには、ファイル形式にちなんで名付けられた多数のテストファイルと軌道がパッケージされています。
このガイドでは、便宜上これらのファイルを使用しています。
独自のファイルを分析するには、上記の`PSF`および`DCD`を自分のファイルへのパスに置き換えるだけです。
例えば：

```python
structure_only = mda.Universe("my_pdb_file.pdb")
```

## 原子のグループでの作業

ほとんどの分析には、`AtomGroup`を作成し操作することが必要です。
便利なことに、`Atoms`の化学的に意味のあるグループ（例えば、`Residue`や`Segment`）で作業することもできます。
これらは`AtomGroup`に類似したコンテナを持ちます：`ResidueGroup`および`SegmentGroup`。
例えば、`Universe`の`.residues`属性は`ResidueGroup`を返します。

```python
print(u.residues)
```

```shell:output
<ResidueGroup [<Residue MET, 1>, <Residue ARG, 2>, <Residue ILE, 3>, ..., <Residue ILE, 212>, <Residue LEU, 213>, <Residue GLY, 214>]>
```

### 原子の選択

`Universe`の粒子にアクセスする最も簡単な方法は、`atoms`属性を使用することです：

```python
u.atoms
```

```shell:output
<AtomGroup with 3341 atoms>
```

これにより、`Atom`オブジェクトのリストとして考えられる`AtomGroup`が返されます。
ほとんどの分析は、`AtomGroup`内の原子のグループで作業します。
`AtomGroup`は、別の`AtomGroup`をスライスすることで簡単に作成できます。
例えば、以下のスライスは最後の5つの原子を返します。

```python
last_five = u.atoms[-5:]
print(last_five)
```

```shell:output
<AtomGroup [<Atom 3337: HA1 of type 6 of resname GLY, resid 214 and segid 4AKE>, <Atom 3338: HA2 of type 6 of resname GLY, resid 214 and segid 4AKE>, <Atom 3339: C of type 32 of resname GLY, resid 214 and segid 4AKE>, <Atom 3340: OT1 of type 72 of resname GLY, resid 214 and segid 4AKE>, <Atom 3341: OT2 of type 72 of resname GLY, resid 214 and segid 4AKE>]>
```

MDAnalysisはファンシーインデクシングをサポートしており、インデックスの配列またはリストを渡すことで、
古い`AtomGroup`内のそのインデックスにある原子を持つ新しい`AtomGroup`を取得できます。

```python
print(last_five[[0, 3, -1, 1, 3, 0]])
```

```shell:output
<AtomGroup [<Atom 3337: HA1 of type 6 of resname GLY, resid 214 and segid 4AKE>, <Atom 3340: OT1 of type 72 of resname GLY, resid 214 and segid 4AKE>, <Atom 3341: OT2 of type 72 of resname GLY, resid 214 and segid 4AKE>, <Atom 3338: HA2 of type 6 of resname GLY, resid 214 and segid 4AKE>, <Atom 3340: OT1 of type 72 of resname GLY, resid 214 and segid 4AKE>, <Atom 3337: HA1 of type 6 of resname GLY, resid 214 and segid 4AKE>]>
```

MDAnalysisは、VMD、PyMol、その他のパッケージで使用される既存の言語に似た強力な原子選択言語も実装しています。
これは、`AtomGroup`または`Universe`インスタンスの`.select_atoms()`関数で利用できます：

```python
print(u.select_atoms('resname ASP or resname GLU'))
```

```shell:output
<AtomGroup [<Atom 318: N of type 54 of resname GLU, resid 22 and segid 4AKE>, <Atom 319: HN of type 1 of resname GLU, resid 22 and segid 4AKE>, <Atom 320: CA of type 22 of resname GLU, resid 22 and segid 4AKE>, ..., <Atom 3271: OE2 of type 72 of resname GLU, resid 210 and segid 4AKE>, <Atom 3272: C of type 20 of resname GLU, resid 210 and segid 4AKE>, <Atom 3273: O of type 70 of resname GLU, resid 210 and segid 4AKE>]>
```

数値範囲は`first-last`または`first:last`として書くことができ、極値は**含まれます**。
スライスでは、`last`インデックスは含まれません。

```python
print(u.select_atoms('resid 50-100').n_residues)
print(u.residues[50:100].n_residues)
```

```shell:output
51  
50
```

選択はブール演算子で組み合わせることができ、ワイルドカードも使用できます。

例えば、以下のコマンドは、タンパク質の最初の100残基内のグルタミン酸とヒスチジンの\\(C_{\alpha}\\)原子を選択します。
グルタミン酸は通常「GLU」と名付けられますが、ヒスチジンはそのプロトン化状態や使用される力場に応じて
「HIS」、「HSD」、または「HSE」と名付けられることがあります。

```python
u.select_atoms("(resname GLU or resname HS*) and name CA and (resid 1:100)")
```

```shell:output
<AtomGroup with 6 atoms>
```

**注意**

選択から作成された`AtomGroup`はソートされ、重複要素は削除されます。
これはスライスによって生成された`AtomGroup`には当てはまりません。
したがって、原子の順序が重要な場合はスライスを使用できます。

ユーザーガイドには、インデクシング、選択言語、およびセットメソッドを通じて`AtomGroup`を作成する方法が完全に説明されています。

### AtomGroupsからの原子情報の取得

`AtomGroup`は、その内部の原子に関する情報を便利な属性で提供します。

```python
print(u.atoms[:20].names)
```

```shell:output
['N' 'HT1' 'HT2' 'HT3' 'CA' 'HA' 'CB' 'HB1' 'HB2' 'CG' 'HG1' 'HG2' 'SD' 'CE' 'HE1' 'HE2' 'HE3' 'C' 'O' 'N']
```

```python
print(u.atoms[50:70].masses)
```

```shell:output
[ 1.008  1.008  1.008 12.011  1.008  1.008 12.011  1.008  1.008  1.008 12.011 15.999 14.007  1.008 12.011  1.008 12.011  1.008 12.011  1.008]
```

また、原子が属する残基やセグメントも知っています。`.residues`および`.segments`はそれぞれ`ResidueGroup`および`SegmentGroup`を返します。

```python
print(u.atoms[:20].residues)
print(u.atoms[-20:].segments)
```

```shell:output
<ResidueGroup [<Residue MET, 1>, <Residue ARG, 2>]>
<SegmentGroup [<Segment 4AKE>]>
```

上記の`ResidueGroup`および`SegmentGroup`には重複はありません。
原子ごとの残基属性を取得するには、`AtomGroup`を介して直接アクセスできます。

```python
print(u.atoms[:20].resnames)
```

```shell:output
['MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'MET' 'ARG']
```

トポロジー属性によって原子をグループ化することができます。

例えば、同じ残基名と原子名を持つ原子をグループ化するには：

```python
near_met = u.select_atoms('not resname MET and (around 2 resname MET)')
sorted(near_met.groupby(['resnames', 'names']))
```

```shell:output
[('ALA', 'C'), ('ALA', 'HN'), ('ARG', 'N'), ('ASN', 'O'), ('ASP', 'C'), ('ASP', 'N'), ('GLN', 'C'), ('GLU', 'N'), ('ILE', 'C'), ('LEU', 'N'), ('LYS', 'N'), ('THR', 'N')]
```

トポロジー属性の完全なリストはユーザーガイドにあります。

### AtomGroupの位置とメソッド

`.positions`属性は、`AtomGroup`から取得できる最も重要な情報です：座標の`numpy.ndarray`で、形状は`(n_atoms, 3)`です。

```python
ca = u.select_atoms('resid 1-5 and name CA')
print(ca.positions)
print(ca.positions.shape)
```

```shell:output
[[11.664622    8.393473   -8.983231  ]  
 [11.414839    5.4344215  -6.5134845 ]  
 [ 8.959755    5.612923   -3.6132305 ]  
 [ 8.290068    3.075991   -0.79665166]  
 [ 5.011126    3.7638984   1.130355  ]]  
(5, 3)
```

`AtomGroup`には、以下のような他の量も定義されています：

- `.center_of_mass()`
- `.center_of_geometry()`
- `.total_mass()`
- `.total_charge()`
- `.radius_of_gyration()`
- `.bsphere()`（選択の境界球）

`AtomGroup`メソッドの完全なリストと説明については、ユーザーガイドを参照してください。

```python
print(ca.center_of_mass())
```

```shell:output
[ 9.06808195  5.25614133 -3.75524844]
```

**注意**

`.center_of_mass()`関数は、MDAnalysisの多くの分析モジュールと同様に、正確な質量特性が利用可能であることに依存しています。
粒子の質量は常に利用可能または正確であるとは限りません！

現在、MDAnalysisは、粒子名から推測される元素または「原子タイプ」に基づいて粒子に質量を割り当てます。
MDAnalysisが誤って推測した場合（例えば、CAと呼ばれるカルシウム原子が\\(C_{\alpha}\\)として扱われる場合）、その原子の質量は不正確になります。
MDAnalysisが粒子が何であるか全く分からない場合（例えば、粗粒化ビーズ）、警告を発し、その粒子に質量0を割り当てます。

MDAnalysisが正しい質量を使用していることを確認するには、手動で設定できます。

MDAnalysisは、`AtomGroup`から結合、角度、二面角、不適切な角度などのトポロジー幾何学を作成することもできます。
この`AtomGroup`には特別な要件があります：幾何学に関与する原子のみがグループに含まれている必要があります。
例えば、結合を作成するために使用される`AtomGroup`には2つの原子のみが含まれる必要があります。
二面角や不適切な角度を作成するために使用される`AtomGroup`には4つの原子が必要です。

```python
nhh = u.atoms[:3]
print(nhh.names)
```

```shell:output
['N' 'HT1' 'HT2']
```

トポロジーオブジェクト（例えば、角度）が作成されると、原子の位置に基づいて角度の値（度単位）を計算できます。

```python
angle_nhh = nhh.angle
print(f"N-H-H angle: {angle_nhh.value():.2f}")
```

```shell:output
N-H-H angle: 37.99
```

原子、二面角、不適切な角度の順序は重要です。角度の値は、最初と3番目の原子の間の角度であり、頂点は2番目の原子にあります。ファンシーインデクシングは、順序付きの`AtomGroup`を取得する方法の1つです。

```
   3
  /
 /
2------1
```

```python
hnh = u.atoms[[1, 0, 2]]
print(hnh.names)
```

```shell:output
['HT1' 'N' 'HT2']
```

```python
angle_hnh = hnh.angle
print(f"N-H-H angle: {angle_hnh.value():.2f}")
```

```shell:output
N-H-H angle: 106.20
```

## 軌道での作業

Universeの軌道には、変化する座標情報が含まれています。軌道のフレーム数はその長さです：

```python
print(len(u.trajectory))
```

```shell:output
98
```

軌道内の各フレームの情報を評価する標準的な方法は、それを反復処理することです。
タイムステップが変わると、ユニバースにはそのタイムステップに関連する情報のみが含まれます。

```python
for ts in u.trajectory[:20]:
    time = u.trajectory.time
    rgyr = u.atoms.radius_of_gyration()
    print(f"Frame: {ts.frame:3d}, Time: {time:4.0f} ps, Rgyr: {rgyr:.4f} A")
```

```shell:output
Frame:   0, Time:    1 ps, Rgyr: 16.6690 A  
Frame:   1, Time:    2 ps, Rgyr: 16.6732 A  
Frame:   2, Time:    3 ps, Rgyr: 16.7315 A  
Frame:   3, Time:    4 ps, Rgyr: 16.7223 A  
Frame:   4, Time:    5 ps, Rgyr: 16.7440 A  
Frame:   5, Time:    6 ps, Rgyr: 16.7185 A  
Frame:   6, Time:    7 ps, Rgyr: 16.7741 A  
Frame:   7, Time:    8 ps, Rgyr: 16.7764 A  
Frame:   8, Time:    9 ps, Rgyr: 16.7894 A  
Frame:   9, Time:   10 ps, Rgyr: 16.8289 A  
Frame:  10, Time:   11 ps, Rgyr: 16.8521 A  
Frame:  11, Time:   12 ps, Rgyr: 16.8549 A  
Frame:  12, Time:   13 ps, Rgyr: 16.8723 A  
Frame:  13, Time:   14 ps, Rgyr: 16.9108 A  
Frame:  14, Time:   15 ps, Rgyr: 16.9494 A  
Frame:  15, Time:   16 ps, Rgyr: 16.9810 A  
Frame:  16, Time:   17 ps, Rgyr: 17.0033 A  
Frame:  17, Time:   18 ps, Rgyr: 17.0196 A  
Frame:  18, Time:   19 ps, Rgyr: 17.0784 A  
Frame:  19, Time:   20 ps, Rgyr: 17.1265 A  
```

反復処理の後、軌道は最初のフレームに「リセット」されます。詳細についてはユーザーガイドを参照してください。

```python
print(u.trajectory.frame)
```

```shell:output
0
```

フレームインデックスを使用して軌道のタイムステップを設定できます：

```python
print(u.trajectory[10].frame)
```

```shell:output
10
```

これは次のタイムステップが変更されるまで持続します。

```python
frame = u.trajectory.frame
time = u.trajectory.time
rgyr = u.atoms.radius_of_gyration()
print("Frame: {:3d}, Time: {:4.0f} ps, Rgyr: {:.4f} A".format(frame, time, rgyr))
```

```shell:output
Frame:  10, Time:   11 ps, Rgyr: 16.8521 A
```

一般的に、軌道分析はフレームごとのデータをリストに収集します。

```python
rgyr = []
time = []
protein = u.select_atoms("protein")
for ts in u.trajectory:
    time.append(u.trajectory.time)
    rgyr.append(protein.radius_of_gyration())
```

これをnumpy配列やpandas DataFrameなどの他のデータ構造に変換できます。
以下のようにプロットしたり、さらなる分析に使用したりできます。

次のセクションでは、pandasパッケージ（インストール：`conda install pandas`または`pip install pandas`）とmatplotlib（インストール：`conda install matplotlib`または`pip install matplotlib`）が必要です。

```python
import pandas as pd
rgyr_df = pd.DataFrame(rgyr, columns=['Radius of gyration (A)'], index=time)
rgyr_df.index.name = 'Time (ps)'

rgyr_df.head()
```

```shell:output
| Radius of gyration (A) |           |
| ---------------------- | --------- |
| Time (ps)              |           |
| 1.0                    | 16.669018 |
| 2.0                    | 16.673217 |
| 3.0                    | 16.731454 |
| 4.0                    | 16.722283 |
| 5.0                    | 16.743961 |
```

```python
rgyr_df.plot(title='Radius of gyration')
plt.show()
```
![image](https://userguide.mdanalysis.org/stable/_images/examples_quickstart_70_0.png)

### 動的選択

上記のように、軌道を反復処理する際に座標が変化します。
したがって、座標から計算されたプロパティ（例えば、半径の回転）も変化します。

選択は、軌道を移動する際に変化しない静的プロパティに基づいて定義されることが多いです。
上記では、静的選択はタンパク質内のすべての原子です。
選択を一度定義し、軌道の各フレームに対して関心のあるプロパティを再計算できます。

ただし、一部の選択には距離依存のクエリ（`around`や`point`など）が含まれます。
この場合、キーワード`updating=True`を設定して、各タイムステップごとに選択を更新する必要があります。
このコマンドは、静的`AtomGroup`ではなく`UpdatingAtomGroup`を提供します。

```python
dynamic = u.select_atoms('around 2 resname ALA', updating=True)
print(type(dynamic))
dynamic
```

```shell:output
<class 'MDAnalysis.core.groups.UpdatingAtomGroup'>

<AtomGroup with 54 atoms, with selection 'around 2 resname ALA' on the entire Universe.>
```

```python
static = u.select_atoms('around 2 resname ALA')
print(type(static))
static
```

```shell:output
<class 'MDAnalysis.core.groups.AtomGroup'>

<AtomGroup with 54 atoms>
```

ユニバースの次のフレームを呼び出すと、動的選択の原子が更新されますが、静的選択の原子はそのままです。

```python
u.trajectory.next()
dynamic
```

```shell:output
<AtomGroup with 56 atoms, with selection 'around 2 resname ALA' on the entire Universe.>
```

```python
static
```

```shell:output
<AtomGroup with 54 atoms>
```

## 座標の出力

MDAnalysisは、単一フレーム形式（例：PDB、GRO）や軌道ライター（例：XTC、DCD、マルチフレームPDBファイル）を含むさまざまなファイル形式へのデータの書き出しをサポートしています。
（選択を他のプログラムに書き出すこともできます。例えば、VMDマクロなど。）
ユーザーガイドには、各形式の完全なリストがあり、それぞれのリファレンスページがあります。

### 単一フレーム

単一フレームしか保持できないファイルに書き込む最も簡単な方法は、任意の`AtomGroup`の`write()`メソッドを使用することです。
MDAnalysisはファイル拡張子を使用して出力ファイル形式を決定します。例えば、\\(C_{\alpha}\\)原子をGRO形式のファイルに書き出すには：

```python
ca = u.select_atoms('name CA')
ca.write('calphas.gro')
```

### 軌道

軌道を書き出す標準的な方法は次のとおりです：

1. 軌道`Writer`を開き、フレームに含まれる原子の数を指定します。
2. 軌道を反復処理し、`Writer.write()`で座標をフレームごとに書き出します。
3. 以下のコンテキストマネージャと`with`ステートメントを使用しない場合は、`.close()`で軌道を閉じる必要があります。

例えば、\\(C_{\alpha}\\)原子をXTC形式の軌道に書き出すには：

```python
ca = u.select_atoms('name CA')
with mda.Writer('calphas.xtc', ca.n_atoms) as w:
    for ts in u.trajectory:
        w.write(ca)
```
![image](https://userguide.mdanalysis.org/stable/_images/examples_quickstart_97_1.png)

## 分析

MDAnalysisには、多様な分析モジュールと独自の実装のためのビルディングブロックが含まれています。
（ユーザーガイドには分析チュートリアルのリストがあります。）

これらの大部分は共通のインターフェースに従います：

1. `Universe`および他の必要なパラメータで分析を初期化します。
2. `.run()`で分析を実行します。オプションの引数には、`start`フレームインデックス、`stop`フレームインデックス、`step`サイズ、`verbose`の切り替えがあります。デフォルトは、全軌道に対して分析を実行することです。
3. 結果はクラス内に保存されます。
4. 多くの場合、単一フレームに対して操作するための関数が利用可能です。

**ただし、すべての分析がこのモデルを使用するわけではありません。各分析のドキュメントを確認することが重要です。** 例は、例ギャラリーで見ることができます。

以下に、単純なRMSD分析を示します。`rms`モジュールは上記のインターフェースに従います。

### RMSD

MDAnalysisのすべてのサブモジュールが`import MDAnalysis`でインポートされるわけではありません。
ほとんどの分析モジュールは明示的にインポートする必要があります。

```python
from MDAnalysis.analysis import rms
```

MDAnalysisは、2つの座標のnumpy配列間のRMSDを計算するための`rmsd()`関数を提供します。

```python
bb = u.select_atoms('backbone')

u.trajectory[0] # 最初のフレーム
first = bb.positions

u.trajectory[-1] # 最後のフレーム
last = bb.positions

rms.rmsd(first, last)
```

```shell:output
6.852774844656239
```

`RMSD`クラスも、軌道に対して操作するために提供されています。

以下に、`RMSD`クラスを作成します。

- 最初の引数は、RMSDを計算するための`AtomGroup`または`Universe`です。
- 参照`AtomGroup`または`Universe`が第2引数として与えられない場合、デフォルトは最初の引数の最初のフレームに整列します。ここでは最初のフレームに設定されています。
- 軌道を背骨原子に対して整列させ、その後、RMSDを背骨原子（`select`）およびすべてのタンパク質原子（`protein`）に対して計算します。

RMSDは`.run()`を呼び出すと計算されます。

```python
u.trajectory[0] # 最初のフレームに設定
rmsd_analysis = rms.RMSD(u, select='backbone', groupselections=['name CA', 'protein'])
rmsd_analysis.run()
```

```shell:output
<MDAnalysis.analysis.rms.RMSD at 0x140451fd0>
```

結果は`results.rmsd`属性に保存されます。これは、形状が`(n_frames, 2 + n_selections)`の配列です。

```python
print(rmsd_analysis.results.rmsd.shape)
```

```shell:output
(98, 5)
```

これは、98行と5列の配列として解釈できます。各行は、軌道内のフレームに関連するRMSDです。列は次のとおりです：

1. フレーム番号
2. 時間（ps）
3. RMSD（背骨）
4. RMSD（C-α）
5. RMSD（タンパク質）

これを`pandas`のDataFrameに変換し、結果をプロットできます。

```python
import pandas as pd

rmsd_df = pd.DataFrame(rmsd_analysis.results.rmsd[:, 2:],
                       columns=['Backbone', 'C-alphas', 'Protein'],
                       index=rmsd_analysis.results.rmsd[:, 1])
rmsd_df.index.name = 'Time (ps)'
rmsd_df.head()
```

```shell:output
| Backbone  | C-alphas     | Protein      |              |
| --------- | ------------ | ------------ | ------------ |
| Time (ps) |              |              |              |
| 1.0       | 5.834344e-07 | 4.263638e-08 | 5.443850e-08 |
| 2.0       | 4.636592e-01 | 4.235205e-01 | 6.934167e-01 |
| 3.0       | 6.419340e-01 | 5.939111e-01 | 8.748416e-01 |
| 4.0       | 7.743983e-01 | 7.371346e-01 | 1.052780e+00 |
| 5.0       | 8.588600e-01 | 8.279498e-01 | 1.154986e+00 |
```

```python
rmsd_df.plot(title='RMSD')
```

### 参考文献

MDAnalysisを使用して出版された作品では、以下の論文を引用してください：

1. Michaud-Agrawal, E. J. Denning, T. B. Woolf, and O. Beckstein. MDAnalysis: A Toolkit for the Analysis of Molecular Dynamics Simulations. _J. Comput. Chem._ **32** (2011), 2319–2327\. doi:10.1002/jcc.21787
2. R. J. Gowers, M. Linke, J. Barnoud, T. J. E. Reddy, M. N. Melo, S. L. Seyler, D. L. Dotson, J. Domanski, S. Buchoux, I. M. Kenney, and O. Beckstein. MDAnalysis: A Python package for the rapid analysis of molecular dynamics simulations. In S. Benthall and S. Rostrup, editors, _Proceedings of the 15th Python in Science Conference_, pages 98-105, Austin, TX, 2016\. SciPy. doi:10.25080/Majora-629e541a-00e

MDAnalysisには、多くのアルゴリズムやモジュールが含まれており、それぞれも個別に引用する必要があります。例えば、`MDAnalysis.analysis.rms`や`MDAnalysis.analysis.align`モジュールを使用する場合は、以下を引用してください：

- Douglas L. Theobald. Rapid calculation of RMSD using a quaternion-based characteristic polynomial. _Acta Crystallographica A_ **61** (2005), 478-480.
- Pu Liu, Dmitris K. Agrafiotis, and Douglas L. Theobald. Fast determination of the optimal rotational matrix for macromolecular superpositions. _J. Comput. Chem._ **31** (2010), 1561–1563.

各モジュールの主要な情報源は、そのドキュメントに記載されています。

### 自動引用によるduecredit

MDAnalysisを使用する際の引用を自動的に生成することもできます。
完全なインストールおよび使用手順はユーザーガイドに記載されていますが、Pythonスクリプト`my_script.py`の引用リストを生成するのは簡単です。

```bash
$ python -m duecredit my_script.py
```

これにより、隠しファイルに引用が抽出され、さまざまな形式にエクスポートできます。例えば、BibTeX形式で表示するには、次のコマンドを使用します。

```bash
$ duecredit summary --format=bibtex
```