ソースコード/バイナリ/マニュアル/API、対応デバイス、実行環境、技術的特徴、参考文献
スクリーンショット(クリックで拡大)
(概要) 当研究室および、いくつかのNMR研究グループで使われています。C++でマルチスレッドな測定用プログラム。 特にODMR/NMR専用という訳ではなく汎用です。 対応している測定器の組み合わせならばプログラムの変更が必要ないようになっています。 測定をRubyスクリプトで自動化できるのが特徴。 マルチプラットフォーム(Mac OS X/(Linux)/Windows)。
Features
一般
マルチスレッド(同期にソフトウェアトランザクショナルメモリ使用)
OpenGLによる高速なグラフ描画
スカラ量(温度、電圧等)の組み合わせは任意にグラフ化可能
ほぼすべての設定等の保存/読み込みが可能
Rubyスクリプトによりほぼすべて制御可能
装置からの取得データを全記録/後日再解析可能
NMR部分
National Instruments社のDAQ デバイスをパルサー/オシロとすることができる
緩和曲線(T1, T2, Tst.e.)もリアルタイムフィット、Inverse Laplace Transformationも可能
フーリエステップサムによる磁場/周波数スイープスペクトル測定
緩和・スペクトル測定において測定後でも窓関数(畳み込み)選択可能
ソースコード/バイナリ/マニュアル/API
- ソースコード全体のダウンロードはこちら:kame-6.1.0.zip (1.7MB, 2024/10/6)。
- インストール法と使用法をマニュアル(ver 6.1用)(2024/11/16更新))に書きました。English版(途中)。
- ソースzip等はこちら。 GitレポジトリはこちらGitHub。
- Windows用の64bit版バイナリ:6.0.0。 実行するには先にQtの6.5以降(MinGW64付)をQt5 compatibility付きでインストールして下さい。その後kame.batから起動して下さい。 複数バージョンのQtがあって起動に失敗する場合は、qtdir.txtの中で6.5以上の行のみを残して削除するか、パスを変更して下さい。
Windows用の32bit版バイナリ:5.8.5, 5.5.2。 実行するには先にQtの5.11以降(MinGW32付)をインストールして下さい。 その後kame.batから起動して下さい。 複数バージョンのQtがあって起動に失敗する場合は、qtdir.txtの中で5.11の行のみを残して削除するか、パスを変更して下さい。
ライセンスはGPL(GNU public licence) 2 or laterです。
最近の変更点抜粋
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任意波形発生器 – 最近のMinGW32に対応
– 4端子測定のバグフィックス
– LibreVNAネットワークアナライザ
– AutoLCTuner: 機能追加
– 5.8.2でNI DAQパルサーに不具合が出たのを修正
Fri Dec 9 2022 (5.8.3)
– Signal Recovery 7260 lockin-in-amplifier
– 5.8.2でNI DAQパルサーに不具合が出たのを修正
Sun Nov 13 2022 (5.8.2)
– USB機器初期化の改善、ThamwayUSB機器のM1 macでの動作確認
– FlexARの停止に関するバグ修正
Mon Apr 18 2022 (5.5.2)
– Mingw32のコンパイルが通らなくなっていたのを修正
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 Apr 26 2020 (5.3.1)
– Pfeiffer TPG361/362ゲージ制御器に対応
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のメモリーリーク対策
Wed Jun 27 2018 (5.1.4)
– スクリプトでのファイル書き込み安定性の改善
– Thamway PROT3リアルタイム取り込みの改善
Wed Oct 16 2017 (5.1.3)
– PPMSのソフト磁場掃引の修正
Thu Jun 22 2017 (5.0)
– Rubyスクリプトの実行時に、スリープ時間の表示、ログファイルの作成を追加
– PPMSで遅い磁場掃引を追加
Sun Jan 22 2017 (4.2.8)
– Lakeshore 350に対応。
Fri Dec 9 2016 (4.2.7)
– Mac OS X版でAppNap等を停止。動作が概ね安定。
Thu Sep 1 2016 (4.2.2-1)
– Digilent Waveform Ainを使用したDSOドライバ
Wed Aug 27 2016 (4.2.0-1)
– 4.1.13-16でmingwのSSEバグでクラッシュする問題を修正
– とても長いT1に対応するため、NMR周波数掃引で”cyclic sweep mode”、緩和測定で”Tracks peak freq.”を追加
Thu Jun 23 2016 (4.1.13-1)
– Quantum Design PPMSの温度・磁場・ポジション制御ドライバ及びNMR磁場掃引での対応
– Modbus RTUのエラー率低減
Sun Feb 7 2016 (4.1.11-1)
– ウェーブ形式データの保存がタイミングによっては複数回掃き出されるバグの修正
– Modbus RTUのbaudrateを57600bpsに変更
– Quantum Design PPMSのモニターに対応
Mon May 18 2015 (4.1.0-1)
– NMR I=9/2緩和関数の間違いを修正
– SML SGの修正
– Cryogenic SMSのver7に対する対策
– Windows版でのシリアルポートの動作とDAQmxドライバ、Windowの振る舞いに対する修正
全ての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 355 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+/4000, USB4000 (USB)
デジタルカメラ
Generic IIDC Camera (IEEE1394)
(untested) Euresys Camera by eGrabber (coaxlink, grablink)
解析/制御ドライバ
ODMR measurement by camera
ODMR frequency-swept spectrum
Filter wheel driver
Image processor
電流反転抵抗測定
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 アプリケーションとしての他に以下の外部ライブラリが必要です。詳しくはマニュアルを参照。
- Ruby (スクリプト系のオブジェクト指向言語。測定の自動化と設定の保存/読み込みに使います。)
- GSL (GNU Scientific Library。非線形フィットと補完に使ってます。)
- FFTW (ver.3系列。FFTライブラリ。)
- ATLAS (LAPACK, BLAS) (線形代数ライブラリ。固有値問題に使っています。)
- Eigen (ver.3系列。線形代数ライブラリ。)
- linux-gpib (GPIBを使用する場合に必要。RPMはこちら、SRPMはこちら。)
もしくはNational Instruments NI-488.2ドライバ。 - National Instruments DAQmx (DAQデバイスを使用する場合のみ必要。)
- zlib (Rawデータの圧縮用)
Mac/Linux版のコンパイル時には上記に加え以下が必要です。
- libtool-ltdl (GNU libtool dynamic module loader。起動時にモジュールを読み込む為に必要。)
- libdc1394 (Macのみ。Firewireデジタルカメラ用)
上記のライブラリのほとんどはパッケージシステム(MacPortsなど)で取ってこれると思います。
技術的特徴
リアルタイム性を確保するため、ロックフリー(lock-free)アルゴリズムに凝った作りになっています。
- 測定装置のIO部分はSTMが使えないのでMutexによる排他制御を使っている。
- スレッド構成は測定スレッド+GUI(メイン)スレッド+Rubyスレッド+Rawデータ読み込みスレッド。 GUIスレッドには関数オブジェクトとスナップショットをイベントとして渡してプールした後に遅延実行している。
- ドライバは測定データを生成/保持する為のXPrimaryDriverを 継承するクラスと、解析専門のXSecondaryDriver 由来クラスの2種類。 測定データは一度保存に適した形(rawData) にした後で、analyzeRaw関数内で処理される。XSecondaryDriverが 複数のドライバからのデータを処理する場合には、rawDataに 付けられたタイムスタンプで時間依存関係をチェックする。
- グラフはOpen GLで描画。高速に半透明で描画できる。描画が追いつかない場合には古いイベントを捨てている。
- 内部のオブジェクトはツリー状に管理。 Rubyスクリプトからのアクセスや測定の設定の読み込み/保存は全てオブジェクトツリーに対して行う。
- オブジェクトベースのソフトウェアトランザクショナルメモリにより、オブジェクトツリーとデータをアクセスする。 ツリーへのオブジェクトの追加・削除はトランザクション中で行える。巡回参照でなければハードリンクも可能になっている。
//Example for reading.
{ Snapshot<Node> shot( *this); //A snapshot of a subtree.
printf("Node1 = %lf, Node2 = %lf\n",
shot[ *child_node1].m_x,
shot[ *child_node2].m_y); //looking up parts of the snapshot.
}
//Example for transactional writing.
this->iterate_commit([=](Transaction<Node> &tr) {
const Snapshot<Node> &shot(tr); //for read-only access.
tr[ *this].m_z = shot[ *child_node1].m_x + shot[ *child_node2].m_y;
tr[ *this].m_z = shot[ *this].m_z + 1;
});
//Example for linking.
this->iterate_commit_if([=](Transaction<Node> &tr) {
//adding a new link to child_node1.
if( !this->insert(tr, child_node1, true))
return false;
tr[ *child_node1].m_x = 1;
return true;
});
//Other examples: transaction_test.cpp,transaction_dynamic_node_test.cpp,transaction_negotiation_test.cpp
//Headers: transaction.h, transaction_impl.h , transaction_signal.h
その他
メッセージ(gettextの翻訳リソース)は関西弁やで。