GC-MS QGD NIST 20 ライブラリ検索
GC-MSで測定した.qgdファイルを開くと、ブラウザだけでクロマトグラム(TIC)が表示されます。使い方は2通りあります。
NIST 20(有料ライブラリ)を使用するため研究室内限定。一般公開はしていません。

【手動ルート】気になるピークをドラッグまたはクリックで選ぶと、NIST 20と照合して候補化合物を一致度(MF/RMF)順に一覧表示します。候補をクリックするとスペクトルの重ね/ミラー比較と2D構造式が見られ、「このピークに採用」でピーク表に記録できます。
【自動ルート】「自動ピーク検出」でTIC上のピークをまとめて拾い、隣の「一括ライブラリ検索」で検出した全ピークを順に照合します。あとは採用ピーク表の行をクリックすると、そのピークのスペクトル比較と2D構造式がすぐ出るので、1件ずつ見て確かめられます。――重要: 一括検索の候補はすべて「保留」で登録されます。MF/RMFが高くても自動採用はせず、スペクトルと構造式を確認した人だけが「採用」へ変更します。同定を確定するのは常に人間です。――このほか、クロマト上をドラッグしてピーク面積(積分)を測る機能、特定のm/zの居場所を調べるEIC、ピークの高さを見比べるためのY軸固定を備えています。
使い方
-
まず使い方を選ぶ(手動ルート / 自動ルート)
このツールには2つの使い方があります。【手動ルート】気になるピークを1つずつ選んでライブラリ検索し、候補を確認して採用する(次の手順②〜⑩が実際の操作例)。【自動ルート】TICピークをまとめて自動検出し、一括ライブラリ検索で候補を「保留」として並べてから、1件ずつ確認して採用する(手順⑪〜⑬)。どちらの結果も同じ「採用ピーク表」に集まるので、混ぜて使えます。
-
配布ZIPを展開してbatを起動
配布ZIP(GCMS-NIST-App.zip)を展開したフォルダの中身。app・nist_lib・nist_work・pythonのフォルダと、_open_browser.bat(内部用の補助ファイル)に加えて「GCMS-NIST検索を起動.bat」がある。ダブルクリックするのは赤枠の「GCMS-NIST検索を起動.bat」で、_open_browser.batは自動で呼ばれる補助スクリプトなので直接実行しない。
-
.qgdを読み込む
26605_sugi_330-370_methanol.qgdを読み込んだ直後の画面。7,400スキャン・RT 5.000–41.995 minのTICクロマトグラムが表示され、検索結果はまだ空。既定モードは「表示/ホバー」で、クロマトをクリックするとそのスキャンのスペクトルを選べる。
-
範囲ドラッグでライブラリ検索
「範囲ドラッグ」モードでRT 24.690–29.820 min(1027スキャン)を選び「この範囲でライブラリ検索」を実行した結果。apex 28.315 min・baseMz 73・617ピークのクエリに対しNIST 20が10件をmatch factor降順で返し、1位は「3-Hydroxy-2-iodo-4-methoxybenzaldehyde, TMS derivative」(MF 848/RMF 852)。1位候補は自動選択され、右上に2D構造式のフローティングパネルが表示される。
-
候補をミラー比較
同じ候補を比較モード「ミラー(上下)」に切り替えた表示。実測(青・上向き)とライブラリ(赤・下向き)が上下に並び、m/zごとの強度差を視覚的に照合できる。既定の「重ね(同向き)」モードといつでも切り替え可能。
-
このピークに採用してピーク表に記録
候補1位で「このピークに採用」を押した結果。画面下に「ピーク表(採用した同定結果)」が現れ、RT 28.315 min・化合物名・式・CAS・NIST#・MF/RMF・状態(採用)・備考欄を持つ行が1件追加される。ピーク表CSVでの出力・全消去も可能。
-
単一スキャン検索(生スペクトル)
モードを「表示/ホバー」に戻し、RT 14.845 min(スキャン#1970)のピークをクリックした状態。スペクトルパネルのバッジが「生スペクトル(背景差し引きなし)」に変わり、「このスキャンで検索」ボタンが有効化される。範囲検索と異なりapex/背景の計算はせず、スキャンをそのままNISTへ送る。
-
積分(面積測定): 直線ベースライン
「積分(面積測定)」モードでRT 24.690–29.820 minをドラッグし、ベースライン「直線(始点–終点)」で面積を測定した結果。灰色の塗りつぶしと赤破線のベースラインがクロマト上に描かれ、積分ピーク表に面積3,048,788,432・高さ160,784,283・BL「直線」の行が追加される。ピーク表(採用同定結果)とは独立した表。
-
積分(面積測定): 水平ベースライン
続けてRT 14.845–19.565 minをベースライン「水平(低い端点+垂線)」で積分した結果。低い方の端点の高さで水平にベースラインが引かれ、差の分だけ垂線が立つ。積分ピーク表に2行目(面積175,073,089・高さ26,697,822・BL「水平」)が追加され、ピーク頂点付近に面積ラベルが表示される。Ctrl+Zで直前の積分操作を取り消せる。
-
使い方パネルで処理内容を確認
画面上部の「❓使い方・どんな処理をしているか」を開いた状態。単一スキャン検索と範囲検索の違い、apex幅k・背景幅Nの意味、MF/RMFの読み方などが常時参照できる形でまとめられている。
-
自動ピーク検出でピークをまとめて拾う
「自動ピーク検出(TIC)」を押した直後。平滑化したTICの立ち上がりの鋭さ(SLOPE感度%)と高さ(高さ%)でピークを拾い、左右の谷まで広げた区間が積分ピーク表に12件まとめて追加された。谷を共有する隣り合ったピークは谷で垂直分割されるため、面積が1つに合算されない。積分はBLの選択に関わらず常に水平ベースラインで計算される。Ctrl+Zで取り消せる。「検出パラメータ」を開くと高さ%・SLOPE感度%・最小幅・対象範囲(全体/表示範囲)を調整できる。
-
一括ライブラリ検索で候補を「保留」として並べる
「一括ライブラリ検索」を実行した後。積分ピーク表の全ピークが1件ずつ順にNIST 20へ照合され、各ピークの最上位候補が採用ピーク表へ13件追加された。状態欄はすべて「保留」で、備考には「一括検索 top1/3/2位: ...」のように順位と2位候補が自動で記録される(先頭行のみ、手動で採用済みの行)。MF/RMFが高くても自動採用はされない。
-
行をクリックして1件ずつ確認し「採用」に変える
採用ピーク表の行をクリックした状態。その行の検索時のクエリスペクトル(実測=青)とライブラリスペクトル(赤)の比較、MF/RMF、右上に2D構造式が表示される。クロマトの表示位置は動かないので、候補を次々クリックして見比べられる。内容に納得したら状態欄を「保留」から「採用」へ変更する(この画面の「このピークに採用」ボタンを押した場合も、新しい行は追加されず、その行の状態が「採用」に変わる)。
ダウンロード
-
GCMS-NIST-App(Windows・ZIP、NIST 20同梱・研究室内限定共有) ↓
【2026-07-23 更新】検出ピークの候補一覧プレビューと別候補での採用・↑↓キーでのピーク表移動・スペクトルのドラッグ拡大・積分ピーク表の並べ替え・RTマーカーのクリックまで永続表示を追加。 / 約650MB圧縮・展開後約1.9GB。展開後フォルダ内の「GCMS-NIST検索を起動.bat」をダブルクリックして起動(Python不要・NIST 20同梱)。Windows専用・NIST 20ライセンス必須・限定共有リンク
仕組みと使った技術
全体の流れ
- ブラウザがJavaScript(qgd-core.js / cfb.js)で.qgd(OLE2バイナリ)を直接デコードし、TICクロマトグラムと各スキャンのマススペクトルをこの端末内だけで復元する。公開版ビューア(GC-MS QGDビューア)と同じデコードコアを使う。
- クロマト上での操作で検索対象のスペクトルを決める。表示/ホバーモードでのクリックはそのスキャンの生スペクトルをそのまま使い、範囲ドラッグモードでのドラッグは範囲内でTICが最大のスキャン(apex)を検出する。
- 範囲検索では、apex前後±k本(既定k=1)の平均を信号、範囲両端それぞれN本(既定N=3)の平均を左右の背景アンカーとし、apexの保持時間の位置で両アンカーを線形補間した背景を信号から差し引く(負値は0にクリップ)。単一スキャン検索はこの差し引きを行わない。
- 差し引き後(または生の)スペクトルを公称質量(整数m/z)に集約したmz/intensity配列だけをPOST /searchでローカルのFlaskサーバ(localhost:8049)へ送る。.qgdファイル自体はサーバへ送られない。
- サーバは起動時に立ち上げた常駐ワーカープロセス(search_worker.py)にリクエストを中継する。ワーカーはNIST 20(nist_search経由のnistms DLL)のエンジンをプロセス生存中ずっと開いたまま保持し、リクエストごとの再初期化を避ける。
- ワーカーがmatch factor降順で返した候補一覧を表示し(1位を自動選択)、候補をクリックするとライブラリスペクトルをクエリと重ね/ミラーで比較し、NIST#をキーにSQLite構造式DBから2D構造式を取得してフローティングパネルに描画する。
- 「このピークに採用」でRT・化合物名・式・CAS・NIST#・MF・RMFをピーク表に記録できる(CSV出力可)。これとは別に、積分モードでのドラッグはTICピーク面積(台形則、直線/水平の2ベースライン)を測定する独立した機能で、Ctrl+Z/Ctrl+Shift+Zで取り消し・やり直しができる。
- 自動ピーク検出は島津Chromatopac方式に準じ、平滑化したTICの立ち上がりの鋭さ(SLOPE)と高さでピーク候補を拾い、左右の谷まで区間を広げる。谷を共有する隣接ピークは、両頂点の間でTICが最小になる点を境目にして2区間へ垂直分割し、面積が1つに合算されないようにする(谷が明確でない肩ピークは高い方へ統合)。検出ピークの面積は常に水平ベースラインで計算する。
- 一括ライブラリ検索は、積分ピーク表の全ピークを1件ずつ順番に検索して上位候補を採用ピーク表へ「保留」で登録する。NIST検索エンジンは1プロセスで動くため逐次実行で、通常の検索とは別のリクエスト経路を使い、画面上の検索結果や再検索の文脈を書き換えない。
- 採用ピーク表の各行は、登録時のクエリスペクトルと候補をメモリ上に保持している。行をクリックすると、その保存済みデータからスペクトル比較と2D構造式を再描画する(閲覧専用で、進行中の検索状態は変更しない)。
- EICは指定したm/z(公称質量±0.5)の強度だけを全スキャンから抽出してTICへ重ね描きする。Y軸を「固定」にすると、押した時点の表示範囲内最大をフルスケールとして保持し、横スクロールや拡大でも高さの基準が変わらないため、離れた位置にあるピーク同士の高さを比較できる(スケールを超えた波形は上端で切って明示する)。
使った技術
- JavaScript(qgd-core.js / cfb.js)
- .qgd(OLE2バイナリ)をブラウザ内で直接デコードし、TIC・各スキャンのマススペクトルを復元。範囲/単一スキャンのクエリ生成(背景差し引き)とTIC面積の直線ベースライン計算も担う。公開版GC-MS QGDビューアと同一コアを共有。
- Flask(Python 3.9)
- ローカルHTTPサーバ。/search・/structure等のAPIとindex.html等の静的ファイルを提供。pyms-nist-searchの制約からPython 3.9固定の起動guardあり。
- pyms-nist-search(nist_search)
- NIST 20(NISTMS)のネイティブDLLをラップするPythonバインディング。マススペクトル照合とMF/RMFの算出を行う。
- search_worker.py(常駐サブプロセス)
- NISTエンジンを開いたまま維持する永続ワーカー。標準入出力で行区切りJSONのリクエスト/応答をやり取りし、DLLのネイティブstdout出力とJSON応答を分離する。
- SQLite(nist20_structures.sqlite)
- NIST#をキーに2D構造式(molblock)を引く読み取り専用DB。存在しなくても検索機能自体は動作する。
- OpenChemLib.js
- molblockから2D構造式のSVGを描画するJavaScriptライブラリ。
実装の工夫
- 検索に使うのは背景差し引き後(または生)のmz/intensity配列のみで、.qgdファイルの中身自体はサーバへ送信しない。デコード・クエリ生成はすべてブラウザ内(qgd-core.js)で完結する。
- NISTエンジンはリクエストごとに初期化すると重いため、search_worker.pyを常駐プロセスとして起動時に1回だけopen_engine()し、以後のリクエストはstdin/stdoutの行区切りJSONで中継する。
- ワーカーがクラッシュ/タイムアウトした場合はサーバが検知して再起動するが、連続4回失敗するとクールダウン(15秒)に入り、無限respawnを防ぐ。
- TIC面積の「直線」ベースラインは公開版GC-MS QGDビューアと同じ数値コアQGDCore.calcPeakArea(bit-exact検証済み)に委譲して二重実装によるズレを防ぎ、対応していない「水平」ベースラインのみこのツール側で追加実装している。
- NIST関連のパス(nist_searchのビルド場所・構造式DB・ポート番号)は環境変数(GCMS_NIST_BUILD / GCMS_STRUCT_DB / GCMS_PORT)で上書きでき、配布先PCごとにインストール場所を変えられる。
- 一括検索は既存のdoSearch()を再利用せず自前のfetch経路で実装している。結果パネル・直前クエリ・検索通し番号といったUI文脈を汚さないためで、共通化より非干渉を優先した判断。
- 自動検出の高さ%・SLOPE感度%は信号最大値に対する相対閾値のため、「対象範囲=表示範囲」では表示範囲を切り出して検出関数へ渡すだけで基準が範囲内最大に切り替わる。
- ローカルサーバは常駐ワーカーとテキストパイプでJSONをやり取りするが、Windowsではパイプの文字コードが既定でcp932になるため、UTF-8を明示している。指定しないとβ-D-Xylopyranoseのようなギリシャ文字を含む化合物名が半角カナ列に化ける。
- 一括検索は個々の失敗を飛ばして継続するが、サーバから応答が得られない状態が2回続いた場合のみ全体を中断する(サーバ停止時に残り全件×タイムアウト時間を待ち続けないための保護)。
用語
- .qgd
- 島津GCMSsolutionのネイティブ保存形式(OLE2バイナリコンテナ)。TICクロマトグラムと各スキャンのマススペクトルを内包する。
- TIC(Total Ion Chromatogram)
- 全イオン電流のクロマトグラム。各スキャンの全m/z強度を足し合わせた値を保持時間ごとにプロットしたもの。
- NIST 20 / mainlib
- 質量分析用の市販MSライブラリ(有料ライセンス)。実測スペクトルデータベースmainlib等を含み、ネイティブDLL(nistms)経由で照合する。
- MF(Match Factor)/ RMF(Reverse Match Factor)
- NIST検索が返す一致度スコア。いずれも1000満点で、高いほどクエリとライブラリスペクトルが一致している。
- apex
- 範囲検索で、選択範囲内でTICが最大になるスキャン。このスキャンの保持時間を基準に信号・背景を組み立てる。
- apex幅 k / 背景幅 N
- 背景差し引きのパラメータ。kはapex前後±k本の平均を信号にする幅(既定1)、Nは範囲両端それぞれN本の平均を背景アンカーにする幅(既定3)。
- 生スペクトル / 背景差し引き後
- クエリパネルのバッジ。単一スキャン検索は常に「生スペクトル」(背景差し引きなし)、範囲検索は「背景差し引き後」(apex信号から両端の背景を線形補間して差し引いたもの)を表す。
- baseMz
- クエリスペクトル中で最も強度が高いm/z(公称質量)。範囲/スキャンのラベルに表示され、どのピークを基準にしたクエリかが分かる。
- 公称質量
- 実測のm/zを整数に丸め、同じ整数になったピークの強度を合算する処理。NISTへ送るスペクトルはこの形式にまとめられる。
- ベースライン(直線 / 水平)
- 積分(面積測定)でのベースラインの取り方。「直線」は区間の始点–終点を結ぶ直線、「水平」は低い方の端点の高さで水平に引き、高い方の端点との差を垂線で示す。ピークごとに作成時の選択を記憶する。
- molblock(構造式データ)
- 候補化合物の2D構造式を表す標準的なテキスト形式。NIST#をキーにSQLite構造式DBから取得し、OpenChemLib.jsでSVG描画する。
- EIC(Extracted Ion Chromatogram)
- 指定したm/zの強度だけを全スキャンから抜き出して並べたクロマトグラム。目的のフラグメントイオンがどの保持時間に出ているかを調べるのに使う。
- SLOPE感度
- 自動ピーク検出の閾値のひとつで、平滑化した波形の1点あたりの変化率(立ち上がりの鋭さ)に対する閾値。下げるほどなだらかな小ピークまで拾う。
- 垂直分割(谷での分割)
- 隣り合ったピークが谷を共有しているとき、谷の位置に垂線を下ろして左右2つのピークとして面積を分ける古典的な積分手法。
- 保留 / 採用(ピーク表のステータス)
- 同定結果の確からしさを人間が管理するための状態。一括ライブラリ検索で自動登録された行は必ず「保留」で入り、内容を確認した人が「採用」に変える。