
(概要) 当研究室および、いくつかのNMR研究グループで使われています。マルチスレッドな物性測定用オープンソースプログラム。 特にODMR/NMR専用という訳ではなく汎用です。 対応している測定器の組み合わせならばプログラム/スクリプトを書く必要がありません。本体はC++ですが、測定をPython/Rubyスクリプトで自動化できるのが特徴。マルチプラットフォーム(Mac OS X/Windows)。(Linux版は現在メンテしていません。)
Features
一般
Python(+Jupyter notebook)/Rubyスクリプトによりほぼすべて制御可能
MCPによりLLM AI制御可能
Pythonでもドライバ作製可能
装置からの取得データを全記録/後日再解析可能
マルチスレッド(同期にソフトウェアトランザクショナルメモリ使用)
スカラ量(温度、電圧等)の組み合わせは任意にグラフ化可能
ある程度の設定は全保存/読み込みが可能
NMR部分
緩和曲線(T1, T2, Tst.e.)リアルタイムフィット、Inverse Laplace Transformation可能
フーリエステップサムによる磁場/周波数スイープスペクトル測定
緩和・スペクトル測定において測定後でも窓関数(畳み込み)選択可能
ソースコード/バイナリ/マニュアル
- ソースコード全体のダウンロードはこちら:kame-8.1.zip (2.2MB, 2026/4/14)。
- インストール法と使用法をマニュアル(ver 8用)(2026/4/6更新))に書きました。English版。技術解説含む概要はこちら。
- ソースzip等はこちら。 GitレポジトリはこちらGitHub。
- Windows用の64bit版バイナリ(パーミッション間違いで4/7までダウンロード出来ませんでした):8.1, 7.8。 実行するには先にQtの6.10以降(LLVM-MinGW64構成)をQt5 compatibility付きでインストールして下さい。その後kame.bat(この場合はMinGW64構成も必要)またはkame-msyspython.batから起動して下さい。 複数バージョンのQtがあって起動に失敗する場合は、qtdir.txtの中で6.10以上の行のみを残して削除するか、パスを変更して下さい。
Windows用の32bit版バイナリ:5.8.4, 5.5.2。 実行するには先にQtの5.11以降(MinGW32付)をインストールして下さい。 その後kame.batから起動して下さい。 複数バージョンのQtがあって起動に失敗する場合は、qtdir.txtの中で5.11の行のみを残して削除するか、パスを変更して下さい。
ライセンスはGPL(GNU public license) 2 or laterです。
最近の変更点抜粋
Tue Apr 14 2026 (8.1)
– 2D MathToolで楕円や任意図形マスク
– MCPによる制御の高速化
– Win版のGPIBのデフォルトをNIに戻した
Mon Apr 6 2026 (8.0)
– MCPによるLLM AI制御に対応。claude codeであればmatplotlibによるグラフ表示も
– ウィンドウの初期位置の改善
Tue Mar 31 2026 (7.9.1)
– 8.0-beta2。
– Mac版でのリンクエラーを修正。
– 起動及び.kam読み込みの高速化。
– CalibratedEntry: 線形近似・キュービックスプライン(温度計用含む)の編集画面とスカラエントリの数値変換
– graphの改善。.kamへの保存
Thu Mar 26 2026 (7.8.1)
– Mac版ではドライバなしでNI USB-GPIB-HS(+)が動かせるようになった。Apple siliconでも動く。
Wed Mar 25 2026 (7.8)
– Prologix USB-GPIBも多数バグ修正
– MathToolの.kamへのセーブ・ロードの対応
Thu Mar 19 2026 (7.7.2)
– pythonバインディングのTransaction内local()のバグ修正。py4resが概ね安定。
– Lakeshore340のパワーレンジバグ修正
Fri Mar 13 2026 (7.7.1)
– pythonバインディングのfloat(XDoubleNode), bool(XBoolNode)変換のバグ修正
– MathToolのタイムスタンプがドライバのものから遅れないように修正
Fri Jan 30 2026 (7.7.0)
– TCP/IPとUSBの安定性を向上
– シリアルポートのポート欄で右クリックにより候補を表示
– USBのホットプラグに部分的に対応
Sat Dec 27 2025 (7.5.0-2)
– バイナリ版でNI DAQmxドライバが機能していなかったのを修正。ドライバありで再ビルド。
Mon Dec 22 2025 (7.5.0)
– Windows+intel内蔵グラフィックスの場合にグラフのマウス選択が機能していなかったのを修正
Sun Dec 14 2025 (7.4.0)
– Win32でのデフォルトコンパイラをclang++, Qtをllvm-mingw64構成に変更。Winでも再びデバッグが可能に。
-Fujikin MFCとPrologix USB-GPIBの安定性改善
-パルサーONOFF時のフリーズ現象の修正
Wed Jan 2 2025 (7.1.3)
– PythonによるドライバとMath Tool作製にテスト対応
– Ruby 3.3までに対応。
– Win版のビルドの際に外部ライブラリのコンパイルが不要になった(msys2のものでOK)
Sat Nov 23 2024 (7.0.2)
– Pythonスクリプト制御に対応
– 7.0.0, 7.0.1は不良
Sun Oct 6 2024 (6.1.0)
– CopperMountainの通信エラー修正
– 計算ツールの実用性アップ
– CVD2B/5B
Tue Dec 19 2023 (6.0.0)
– Windows 64bit版のコンパイルに対応
– Windows版でメッセージウィンドウが表示されないバグの修正
– グラフでいくつかの計算ツールを使えるようにした
– Firewireデジタルカメラ(OSX)
Sun Jun 25 2023 (5.8.5)
– LXI 3390任意波形発生器
– LibreVNAネットワークアナライザ
– AutoLCTuner: 機能追加
Fri Dec 9 2022 (5.8.3)
– 5.8.2でNI DAQパルサーに不具合が出たのを修正
Sun Nov 13 2022 (5.8.2)
– USB機器初期化の改善、ThamwayUSB機器のM1 macでの動作確認
– FlexARの停止に関するバグ修正
Sun Feb 13 2022 (5.5.1)
– Mac apple siliconでのarm64/Universal Binaryビルドに対応。
– グラフ:右ボタンのクリックで3D視点をリセットできるようにした。
– Thamway: libusbの初期化のバグ修正
Sun Dec 19 2020 (5.3.2)
– NMRT1のFlatten GeneratorがP1Maxに達しないのを修正
Sun Dec 1 2019 (5.3)
– NMRT1: Tikhonov正則化による密度マッピング
Fri Sep 6 2019 (5.2.2)
– NMRT1: CPMGでのT2測定
– NMREcho: 電圧リミットの警告、バックグラウンド警告のバグ訂正
– Thamway PROTで機器側のステータスをリアルタイムに反映
– Thamway DSO(USB3)のトリガ位置ずれ対策
– Mac版Qt OpenGLのメモリーリーク対策
全てのChangeLog
対応デバイス
()内は対応している通信手段。”(GPIB)”の場合は測定器のシリアルポートは未テスト・未調整。
DCソース
YOKOGAWA 7651 DC source (GPIB)
ADVANTEST TR6144/R6142/R6144 DC source (GPIB)
(untested) Optotune ICC4C2000 Current Source (Serialport)
MICROTASK/Leiden Triple Current Source (GPIB)
デジタルマルチメータ(DMM)
Keithley 2000/2001 DMM (GPIB)
HP/Agilent 34420A nanovolt meter (GPIB)
HP/Agilent 3458A/3478A DMM (GPIB)
Keithley 6482 picoammeter (GPIB)
SANWA PC500/510/520M/PC5000 DMM (IR SerialPort)
ファンクションジェネレータ
NF WAVE-FACTORY (GPIB)
液面計
Oxford ILM Helium levelmeter (GPIB, SerialPort)
Cryomagnetics LM-500 levelmeter (GPIB)
ロックインアンプ等
Stanford Resrearch SR830 lock-in amplifier (GPIB)
NF LI5640 lock-in amplifier (GPIB)
Andeen-Hagerling 2500A capacitance bridge (GPIB)
Signal Recovery lock-in amplifier 7265 (GPIB)
超伝導磁石用電源
Oxford PS/IPS-120 magnet power supply (GPIB, SerialPort)
Cryogenic SMS magnet power supply (USB serial port)
ネットワークアナライザ
HP/Agilent 8711/8712/8713/8714 network analyzer (GPIB)
Agilent E5061/E5062 network analyzer (GPIB)
Copper Mountain TR1300/1,5048,4530 Network Analyzer (TCP/IP)
DG8SAQ VNWA3E network analyzer (TCP/IP)
LibreVNA network analyzer (TCP/IP)
Thamway T300-1049A Impedance Analyzer (SerialPort)
標準信号発生器
KENWOOD SG7130/SG7200 signal generator (GPIB)
HP/Agilent 8643/8644/8648/8664/8665 signal generator (GPIB)
HP/Agilent E44*B signal generator (GPIB)
DSTech. DPL-3.2XGF (SerialPort)
Rhode-Schwartz SML-01/02/03/SMV-03 signal generator (GPIB, SerialPort)
Thamway NMR PROT built-in signal generator (USB,TCP/IP)
任意波形発生器
LXI 3390 (GPIB)
温度コントローラ
Cryocon M32/M62 temperature controller (GPIB)
LakeShore 340 temperature controller (GPIB)
LakeShore 350 temperature controller (GPIB)
LakeShore 370 temperature controller (GPIB)
Picowatt AVS-47 bridge (GPIB)
Oxford ITC-503 temperature controller (GPIB, SerialPort)
Neocera LTC-21 temperature controller (GPIB)
Keithley 2700 DMM w/ 7700 scanner as temperature controller (GPIB)
OMRON E5*C controller via modbus (SerialPort)
カウンター
Mutoh NPS counter (SerialPort)
流量制御弁
Fujikin FCST1000 Series Mass Flow Controllers (Serial Port 38400bps)
モーター制御
Sigma optics PAMC104 piezo motor driver (Serial Port)
OrientalMotor CVD2B/5B motor controller (Serial Port Modbus RTU 115200bps)
OrientalMotor FLEX CRK motor controller (Serial Port Modbus RTU 115200bps)
OrientalMotor FLEX AR/DG2 motor controller (Serial Port Modbus RTU 115200bps)
ターボ分子ポンプ制御
Pfeiffer Turbo molecular pump controller TC110 (Serial Port)
圧力ゲージ
Pfeiffer TPG361/362 Gauge Controller (Serial Port)
デジタルストレージオシロスコープ(DSO)
Tektronix DSO (GPIB)
Lecroy/Iwatsu DSO (GPIB)
DSO on NI-DAQ M,S series (NI-DAQmx)
Thamway A/D conversion DV14U25 (USB)
Digilent WaveForms AIN DSO (USB)
PPMS
Quantum Design PPMS low-level interface (GPIB, Serial Port 9600bps)
NMR用パルサー
NMR pulser on NI-DAQ M series (NI-DAQmx)
NMR handmade pulser on H8 (SerialPort)
NMR handmade pulser on SH2(SerialPort)
NMR pulser Thamway N210-1026 PG (USB,GPIB,TCP/IP)
光スペクトロメータ
OceanOptics/Seabreeze HR2000/USB2000, HR2000+/4000, USB4000 (USB)
デジタルカメラ
Generic IIDC Camera (IEEE1394)
Euresys Camera by eGrabber (coaxlink, grablink)
解析/制御ドライバ
電流反転抵抗測定(要python)
2軸回転制御
Gコード3軸制御
NMR FID/echo analyzer
NMR field-swept spectrum measurement
NMR frequency-swept spectrum measurement
NMR relaxation(T1/T2/Tst.e.) measurement
NMR LC circuit autotuner
実行環境
プログラムの実行には一般的なQt アプリケーションとしての他に以下の外部ライブラリが必要です。詳しくはマニュアルを参照。
- Python, numpy, pybind11 (測定の自動化等に使います。)
- IPython, Jupyter-notebook/qtconsole (オプション)
- Ruby (測定の自動化と設定の保存/読み込みに使います。)
- Eigen (ver.3系列。線形代数ライブラリ。)
- GSL (GNU Scientific Library。非線形フィットと補完。ただし、free-threading pythonが一般化したときにscipyに置き換え予定)
- FFTW (ver.3系列。FFTライブラリ。いずれ…同様。)
- libusb
- linux-gpib (Linuxの最新カーネル以外でGPIBを使用する場合に必要。MacではKAMEユーザースペース組み込み)
National Instruments NI-488.2ドライバ。 (WindowsでGPIBを使用する場合に必要。Macではドライバ不要) - zlib (Rawデータの圧縮用)
Mac版のコンパイル時には上記に加え以下が必要です。
- libtool-ltdl (GNU libtool dynamic module loader。起動時にモジュールを読み込む為に必要。)
- libdc1394 (Macのみ。Firewireデジタルカメラ接続カメラを使用する場合。)
- Euresys egrabber (Macのみ。grablink/coaxlink接続カメラを使用する場合。)
技術的特徴
リアルタイム性を確保するため、ロックフリー(lock-free)アルゴリズムに凝った作りになっています。
- スレッド構成は測定スレッド+GUI(メイン)スレッド+Pythonスレッド+Rubyスレッド+Rawデータ読み込みスレッド。 GUIスレッドには関数オブジェクトとスナップショットをイベントとして渡してプールした後に遅延実行している。IPythonはembed_kernelによる埋め込みカーネルで、Jupyter notebook等のクライアントは別プロセス。
- グラフはOpen GLで描画。高速に半透明で描画できる。描画が追いつかない場合には古いイベントを捨てている。
- ドライバは測定データを生成/保持する為のXPrimaryDriverを 継承するクラスと、解析専門のXSecondaryDriver 由来クラスの2種類。 測定データは一度保存に適した形(rawData) にした後で、analyzeRaw関数内のトランザクションで処理される。XSecondaryDriverが 複数のドライバからのデータを処理する場合には、rawDataに 付けられたタイムスタンプをもとにcheckDependency関数で時間依存関係をチェックする。pybind11によるPythonバインディングでは、動的なドライバの再定義も可能。
- 内部のオブジェクトはツリー状に管理。Rubyスクリプトからのアクセスや測定の設定の読み込み/保存は全てオブジェクトツリーに対して行う。 Pythonバインディングでは、オブジェクトツリーへのアクセスの他、STMと大部分のpublic関数が利用できる。
- オブジェクトベースのソフトウェアトランザクショナルメモリ(STM)により、オブジェクトツリーとデータをアクセスする。 ツリーへのオブジェクトの追加・削除はトランザクション中で行える。巡回参照でなければハードリンクも可能になっている。測定装置との通信ではSTMが使えないのでMutexによる排他制御を使っている。親ノードを含まないトランザクション中で親ノードを含むスナップショット操作を行うとコミットが失敗するので禁忌。
技術解説(AI生成)
多数の計測機器を10 ms程度の周期で非同期に制御し、一部にリアルタイムAD/DAを含むスレッドが動作する計測ソフトウェアのために設計されたロックフリーSTM。Python (pybind11)バインディング、MCP (Model Context Protocol)によるAI連携にも対応。ソースコード: github.com/northriv/KAME
atomic_shared_ptr — Tagged Pointerによるロックフリー共有ポインタ
ビットレイアウト
アロケータが8バイトアラインメントを保証するため、ポインタの下位3ビットは常にゼロ。ここにローカル参照カウンタを埋め込む:
| Ref* ポインタ(上位61ビット) | LRC |
| 制御ブロックまたはオブジェクト自身を指す | 下位3bit (0〜7) |
| Ref構造体 |
| global_rc (atomic) — グローバル参照カウンタ |
| T* object — 管理対象オブジェクト |
Intrusive counting: Payload等のatomic_countable継承型では、global_rcをオブジェクト自身に埋め込む。制御ブロックのヒープ割り当てが不要になり、キャッシュ局所性が向上する。
load_shared_ の3ステップ
CASでローカルカウンタを+1。ポインタを「ピン留め」— 他スレッドが入れ替えても、オブジェクトは解放されない。
CAS(m_ref, old, old+1)memory_order_acq_rel長期保持用のグローバル参照を獲得。
fetch_add(1, relaxed)relaxedで安全: Step 1の
acq_rel CASが同期を保証
CASでローカルカウンタを-1。
→ フォールバック: global_rc–
(入れ替えスレッドがLRC分を
global_rcに転送済み)
std::atomic<shared_ptr> 実装比較
優先度逆転の危険
+ WaitOnAddress
Split reference counting
STM — 木構造トランザクショナルメモリ
基本操作
Snapshot<NodeA> shot(node); // atomic load 1回、ロックなし
double x = shot[node].m_x; // イミュータブル
読み取りログ不要。TinySTM/NOrecは全読み取りをログするが、KAMEはポインタ1つ取るだけ。
node.iterate_commit([](Transaction<NodeA> &tr) {
tr[node].m_x += 1; // Copy-on-Write
}); // CAS失敗 → 自動リトライ
コミットはLinkage上のCAS 1回。m_oldpacket ≠ 現パケット → 競合 → リトライ。
iterate_commit の使い分け
| API | いつ使うか | 例 |
|---|---|---|
iterate_commit(λ) |
必ず成功させたい書き込み | パラメータ更新 |
iterate_commit_if(λ) |
条件付き(λがfalse → スキップ&リトライ) | insert成功時のみコミット |
iterate_commit_while(λ) |
あきらめ可能(λがfalse → 中断) | タイムアウト付き操作 |
Online Insertion — トランザクション内で即座にアクセス可能
parent.iterate_commit_if([&](Transaction<NodeA> &tr) -> bool {
if(!parent.insert(tr, child, true)) return false; // online insertion
tr[*child].m_x = 42; // 即座にアクセス可能!
return true;
});
子はコミット後に可視化。同一トランザクション内ではアクセス不可。
子は即座にライブツリーに反映。tr[*child]で読み書き可能。
ハードリンクの注意点
1つの子ノードが複数の親を持つ場合(ハードリンク)、トランザクション内でのSnapshotに注意:
iterate_commit([](Transaction<NodeA> &tr) {
Snapshot<ParentA> shot(parentA);
// ↑ bundleが子を吸収
// → parentBの整合性崩壊
});
iterate_commit([](Transaction<NodeA> &tr) {
auto &payload = tr[*childNode];
// ↑ 常に安全
// 未コミット書き込みも見える
});
Bundle/Unbundle — サブツリーの整合的スナップショット
なぜ必要か
UIが温度と磁場を同時表示する場合、両方が同じ瞬間の値でなければならない。単一ノードのSnapshotはO(1)だが、複数の子ノードを整合的に読むにはbundleプロトコルが必要。
4フェーズ CAS プロトコル
Unbundle(コミット時)
bundleされた子にコミットするには、まずunbundleが必要:
- CAS親: 該当子スロットをNull化、missing=TRUE
- CAS子: BundledRefWrapperからPacketWrapperに復元(hasPriority=true)
→ 子が独立に戻り、通常のCASコミットが可能になる。3レベル木(Grand→Parent→Child)では2段階unbundleが必要。
形式検証 — 2層検証 + 3段階モデル忠実度
2層検証アーキテクチャ
単一ツールでは不十分: TLA+は逐次一貫性を仮定(メモリモデル非考慮)、GenMCはプロトコル論理の網羅性に限界。2つを組み合わせて相補的に検証する。
TLA+ — サブツリーのアトミックスナップショット + 楽観的コミット
TLA+ + GenMC(RC11) — 参照カウント + メモリモデル
検証結果一覧
| 層 | ツール | 構成 | 状態数 | 結果 |
|---|---|---|---|---|
| Layer 1 | TLA+ (TLC) | CAS+recycle 2thr | 8,719,367 | ✅ |
| Layer 1 | GenMC v0.16.1 | RC11 4テスト | 470K完了 + 717K枝刈り | ✅ |
| Layer 2 (2段) | TLA+ (TLC) | coarse 2thr | 906K | ✅ |
| Layer 2 (2段) | TLA+ (TLC) | coarse MaxCommits=5 | ~3.2M | ✅ |
| Layer 2 (3段) | TLA+ (TLC) | coarse MaxCommits=5 | ~8.5M | ✅ |
| Layer 2 (3段) | TLA+ (TLC) | all-fine 2thr | 1.2M | ✅ |
| Layer 2 | TLA+ (TLC) | fine/superfine deep | ohtaka進行中 | ⏳ |
| 完了済み合計 | ~23M+ | ✅ All Pass | ||
3段階モデル忠実度(coarse / fine / superfine)
C++ transaction_impl.hとの体系的比較で9箇所の差異を特定。3段階のアトミック粒度でモデル化:
C++ストレステスト(実バイナリで補完)
形式検証は抽象モデル上。コンパイラ最適化やHW固有の動作に起因するバグは実バイナリのテストで検出する:
| テスト | スレッド | 反復 | 何を検証 |
|---|---|---|---|
atomic_shared_ptr_test |
4 | 40万/t | scan/CAS/swap ライフサイクル balance |
transaction_test |
4 | 2,500/t | gn2 ≤ gn3 スナップショット整合性 |
transaction_negotiation_test |
6 (2遅+4速) | 500万(速) | 非対称競合の公平性(飢餓なし) |
transaction_dynamic_node_test |
4 | 2,500/t | 動的insert/release 並行整合性 |
歴史
東北大学金研強磁場センター、京都大学石田研、ODMR実験で利用
他のSTM実装との比較
KAMEの特徴はbundleプロトコルでサブツリー全体の整合性を自動保証すること。フラットSTMではプログラマが整合性に必要な変数を明示的にトランザクション内で読む必要がある。KAMEでは親のSnapshotを取るだけで子を含む整合ビューが得られる。トレードオフとして、競合粒度がサブツリー単位になるため、多数の独立変数への並行書き込みにはフラットSTMが有利。
COW B-tree / MVCCデータベースとの比較
KAMEのSTMは、データベース分野のCOW B-treeやMVCCと設計思想を共有する。いずれも「読み手が書き手をブロックしない」ことを目指すが、write/readのコストバランスが異なる。
| 方式 | 単一ノード書き込み | 整合的サブツリー読み取り | Lock-free? | 整合性の保証 |
|---|---|---|---|---|
| COW B-tree (LMDB) | O(log N) path copy | O(1) root取得 | 読み手のみ | 構造的(path copy) |
| Bw-tree | O(1) delta追加† | O(k) delta chain走査 | Yes | デルタ + CAS |
| KAME STM | O(1) CAS | O(1)†† / O(S)††† | Yes | bundle/unbundle |
N=格納ノード数、S=サブツリーノード数、k=delta chain長。
†consolidation時はO(k)。 ††bundle済みの場合。 †††変更後の初回読み取りでbundle発生。
書き込みのたびにリーフからルートまでパスコピー → O(log N)。常に整合的だが、単一ノード更新でも全パスをコピーするため書き込み増幅が大きい。
デルタレコードをCASで追加 → 書き込みO(1)。ただし読み取り時にデルタチェーンを走査。読み取りコストが蓄積する。
書き込みO(1)(単一CAS)、読み取りO(1)(bundle済み時)。変更後の初回読み取りでbundle O(S)が発生するが、読み取り頻度が高い計測用途では償却O(1)。
KAMEのbundleプロトコルは、必要なときにのみオンデマンドで整合性を確保する方式であり、我々の調査範囲では既存の文献に報告されていない。
KAME — github.com/northriv/KAME
この文書はKAMEのSTMの技術概要です。詳細は論文草稿 (paper_draft_ja.md) を参照してください。
