SPADI-A Wiki/SPADI-A DAQ マニュアル/ソフトウェア/DAQの設定/FEEスクリプトの編集


FEEスクリプトの編集

各種ソフトウェアのインストールが終わったら、各々の実験に合わせて、スクリプトを用意する。主に Front End Electronics (FEE) 用のスクリプトと NestDAQ 用のスクリプトを用意する必要がある。このページでは、 FEE用の設定スクリプトの準備方法について記述する。基本的には、これまでの実験で使われたスクリプトをまとめた GitHub の以下のリポジトリをベースにするのがよいであろう。

ここに、AMANEQ といった FEE 用のレジスタ設定スクリプトのサンプルや、NestDAQ の設定スクリプトのサンプルがある。

設定の手順について

まず、リポジトリを GitHub から clone する。

$ cd $HOME/
$ git clone https://github.com/spadi-alliance/exp-config

その後、exp-config 内に入り、自身のセットアップに近いディレクトリをコピーして、自身の実験用のディレクトリを作成する。

$ cd $HOME/exp-config
$ ls
README.md	jparc_e50_blm	jparc_t103	raris_bpm	rcnp_d202407a	rcnp_e585
$ cp -a rcnp_d202407a my_exp
$ cd my_exp
$ ls
fee_scripts run

fee_scripts ディレクトリの中に設定スクリプトが格納してある。実験ごとのセットアップ (FEE の台数や IPアドレスなど) に応じて、スクリプトの編集を行う。以下、それぞれのスクリプトの説明と編集方法を記述する。

fee_scirpts 内のスクリプトの編集

fee_scripts ディレクトリには、AMANEQ のレジスタ設定を行う以下のスクリプトが用意してある。

config_modules.sh
init_hrtdc.sh
reset_modules.sh
set_hbfstate_on.sh
set_hbfthrottling.sh
set_selfrecovery.sh
set_tdcmask.sh
set_totfilter.sh

この中で、実験時に実行するスクリプトは config_modules.sh である。config_module.sh の中身を確認すればわかるが、このスクリプトを実行することで、その他のスクリプトが順次実行される。特に問題がなければ、AMANEQ 電源投入時に config_modules.sh を実行すればよい。なんらかの問題が生じた場合 reset_modules.sh を実行して、モジュールのリセットを行う。これらのスクリプトはパスがベタ書きになっているので、それをすべて書き換えるか、うまく変数を使って書き直すのが良いであろう。さらに、その他のスクリプトの中身をセットアップに合わせてすべて書き換える。各スクリプトの意味と編集方法は、以下の通り。

config_modules.sh

実験時に実行するスクリプトは config_modules.sh である。このスクリプトの中身は以下のようになっており、

#!/bin/bash

$HOME/exp-config/rcnp_d202407a/fee_scripts/init_hrtdc.sh
$HOME/exp-config/rcnp_d202407a/fee_scripts/set_tdcmask.sh
$HOME/exp-config/rcnp_d202407a/fee_scripts/set_totfilter.sh
$HOME/exp-config/rcnp_d202407a/fee_scripts/set_selfrecovery.sh
$HOME/exp-config/rcnp_d202407a/fee_scripts/set_hbfthrottling.sh
$HOME/exp-config/rcnp_d202407a/fee_scripts/set_hbfstate_on.sh

これを実行することで、その他のスクリプトが順次実行される。特に問題がなければ、システム起動時に config_modules.sh を実行すればよい。現状のディレクトリ構造に合わせて、編集する。パスがベタ書きになっているので、それをすべて書き換えるか、うまく変数を使って書き直すのが良いであろう。

reset_modules.sh

データ収集を行なっている際になんらかの問題が生じた場合 reset_modules.sh を実行して、モジュールのリセットを行う。現状のディレクトリ構造に合わせて、編集する。パスがベタ書きになっているので、それをすべて書き換えるか、うまく変数を使って書き直すのが良いであろう。

#!/bin/bash
#low resolution
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/gen_user_reset 192.168.2.160
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/gen_user_reset 192.168.2.161 
...
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/gen_user_reset 192.168.2.169

#high resolution
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/gen_mzn_userreset 192.168.2.169 both

init_hrtdc.sh

HR-TDC FPGAファームウェアのリセットと、HR-TDC メザニンのリセットを行う。HR-TDC を利用する場合、AMANEQの電源を投入後、一度だけこのスクリプトを実行する必要がある。そうしないと AMANEQ はデータを出力しない。一度実行した後はもう実行する必要はないが、何度実行しても問題はない模様。中身は以下のようになっている。

#!/bin/bash

$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/write_mzn_register 192.168.2.169 both 0x2010 0x0 1
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/initialize 192.168.2.169 both 
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/write_mzn_register 192.168.2.169 both 0x2010 0x2 1

バイナリのパスと 192.168.2.169という部分を自身の環境に合わせて編集する。ここで、 192.168.2.169 は HR-TDC の IP アドレスである。HR-TDCが2台以上ある場合は、上記の 3 行をモジュールの台数に合わせて増やせば良い。

set_tdcmask.sh

TDC の特定の入力チャンネルをマスクするためのスクリプト。ここでいうマスクとは、入力チャンネルを覆い隠すためのものであり、マスクしたチャンネルは入力を受け付けなくなり、そのチャンネルのTDC hit データは出力されなくなる。設定方法は、マスクしたいチャンネルに bit の 1 (true) を立て、マスクしないチャンネルは 0 (false) を立てる。(別の言い方をすると、入力のチャンネルを enable するには 0, disable するには 1 を指定することになる。)AMANEQの全チャンネルを読みたい場合はすべてのチャンネルに対して 0 を指定すればよい。具体的なスクリプトの中身は以下の通り。

#low resolution
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrLRTDC/bin/set_tdcmask 192.168.2.160      0x00000000 0x00000000 0x00000000 0x000000000 0x0
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrLRTDC/bin/set_tdcmask 192.168.2.161      0x00000000 0x00000000 0x00000000 0x000000000 0x0
...
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrLRTDC/bin/set_tdcmask 192.168.2.168      0x00000000 0x00000000 0x00000000 0x000000000 0x0

$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/set_tdcmask 192.168.2.169 both  0xffff0000 0xffff0000

ここで、bit の立て方などは一部のスクリプトのコメントに書いてある。以下抜粋。

# Usage:
#   LRTDC: set_tdcmask [IP address] [Mask value Main-U (Hex)] [Mask value Main-D (Hex)] [Mask value MZN-U (Hex)] [Mask value MZN-D (Hex)] [kMaskEx]
#   HRTDC: set_tdcmask [IP address] [Mezzanine existence] [Mask value uppper mezzanine (Hex)] [Mask value lower mezzanine (Hex)]
#     Description of mezzanine existence
#     - up   (mezzanine is attached on upper slot)
#     - low  (mezzanine is attached on lower slot)
#     - both (mezzanine is attached on both slot2)
#
# Bit:
#   Bit 1: masked (channel disabled), Bit 0: unmasked (channel enabled)
#
# Example:
#   Taking all channels (No mask)
#     LRTDC: set_tdcmask xx.xx.xx.xx      0x00000000 0x00000000 0x00000000 0x000000000 0x0
#     HRTDC: set_tdcmask xx.xx.xx.xx both 0x00000000 0x00000000
#   All channels are masked (No TDC data taken)
#     LRTDC: set_tdcmask xx.xx.xx.xx      0xffffffff 0xffffffff 0xffffffff 0xfffffffff 0xffffffff (Is this correct?)
#     HRTDC: set_tdcmask xx.xx.xx.xx both 0xffffffff 0xffffffff
#   Only first channel (ch0) is masked
#     LRTDC: set_tdcmask xx.xx.xx.xx      0x00000001 0x00000000 0x00000000 0x000000000 0x0
#     HRTDC: set_tdcmask xx.xx.xx.xx both 0x00000001 0x00000000
#   ch0 - ch3 are masked
#     LRTDC: set_tdcmask xx.xx.xx.xx      0x0000000f 0x00000000 0x00000000 0x000000000 0x0
#     HRTDC: set_tdcmask xx.xx.xx.xx both 0x0000000f 0x00000000
#   Only ch0 - ch3 are taken
#     LRTDC: set_tdcmask xx.xx.xx.xx      0xfffffff0 0xffffffff 0xffffffff 0xfffffffff 0xffffffff (Is this correct?)
#     HRTDC: set_tdcmask xx.xx.xx.xx both 0xfffffff0 0xffffffff
#   Only ch31 is masked
#     LRTDC: set_tdcmask xx.xx.xx.xx      0x80000000 0x00000000 0x00000000 0x000000000 0x0
#     HRTDC: set_tdcmask xx.xx.xx.xx both 0x80000000 0x00000000
#   Only ch32 is masked
#     LRTDC: set_tdcmask xx.xx.xx.xx      0x00000000 0x00000001 0x00000000 0x000000000 0x0
#     HRTDC: set_tdcmask xx.xx.xx.xx both 0x00000000 0x00000001
#   Only ch63 is masked
#     LRTDC: set_tdcmask xx.xx.xx.xx      0x00000000 0x80000000 0x00000000 0x000000000 0x0
#     HRTDC: set_tdcmask xx.xx.xx.xx both 0x00000000 0x80000000

ちなみに、AMANEQ の信号入力部分は差動信号を受け付けるが、ケーブルをつなげないと発振する場合がある。そのため、ケーブルを指していないチャンネルは基本的にマスクする。ちなみに、RBCP のスケーラはこのマスクの設定にかかわらずカウントを行う。

set_totfilter.sh

AMANEQ が出力する TDC TOT (time over threshold) データにおいて、設定した時間以上 (と以下) の TOT を持つもののみを出力したい場合、この TOT filter を設定する。設定で与える時間の単位は TOT の LSB (Least significant bit, 最小の時間単位) である。そのため、例えば LR-TDC の場合、LSB はおおよそ 1 ns であるため、例えば 0xff (=255) と設定すると、TOT がおおよそ 255 ns 以上の TDC データのみ出力され、255 ns 未満の TDC データは破棄される。HR-TDC の場合、LSB はおおよそ 1 ps であるため、例えば 0x200 (= 512) と設定すると、TOT がおおよそ 512 ps 以上のTDCデータのみ出力され、512 ps 未満の TDC データは破棄される。具体的なスクリプトは以下のようなもの。ここで、MIN_TH と MAX_TH で最小 TOT と最大 TOT を設定する。CTRL は何を設定しているかAMANEQ Users Guide 参照。

#!/bin/bash

CTRL=0
MIN_TH=0
MAX_TH=0xffff

#LR*9
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.160 0x10500000 ${CTRL} 1
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.160 0x10600000 ${MIN_TH} 2
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.160 0x10700000 ${MAX_TH} 2
...
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.168 0x10500000 ${CTRL} 1
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.168 0x10600000 ${MIN_TH} 2
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.168 0x10700000 ${MAX_TH} 2

#HR
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/write_mzn_register 192.168.2.169 up 0x2060 ${CTRL} 1
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/write_mzn_register 192.168.2.169 up 0x2070 ${MIN_TH} 2
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/write_mzn_register 192.168.2.169 up 0x2080 ${MAX_TH} 2

set_selfrecovery.sh

AMANEQ に対してバックプレッシャーがかかり、Heart Beat Frame Number Mismatch が生じた場合でも、self recovery が効くように設定する。ちなみに self recovery が効くタイミングは TCP 接続が切れたタイミングである。スクリプトの中身は以下のようなもの。LR-TDC と HR-TDC 用に分けて IP アドレスとレジスタの値を設定する。

#!/bin/bash
#low resolution
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.160 0x10D00000 0x1 1
...
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.168 0x10D00000 0x1 1

#high resolution
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/write_mzn_register 192.168.2.169 both 0x20E0 0x1 1

set_hbfthrottling.sh

Heart Beat Frame throttling を設定する。ここで、Heart Beat Frame throttling とは、Heart Beat Frame の間引きを行うことであり、AMANEQ が出力するデータ量を減らしたいときに用いる。2 の累乗 (2, 4, 8, 16) の単位で Heart Beat Frame を間引くことができる。連続読み出しDAQ において、通常は FEE の段階でデータを破棄することはしないので、throttling は有効にしない。ただ、ビーム強度が強いが下げられない、もしくは校正用ランなどにおいて、検出器のカウントレートが高く、データがとり切れない場合などにこの throttling を有効にする。例えば 4 に設定すると、4 つの Heart Beat Frame のうち 1 つの Heart Beat Frame を出力し、3 つの Heart Beat Frame を破棄する。この場合 AMANEQ が出力するデータ量は (Heart Beat Frame Delimiter のデータ量の寄与を無視すれば) ほぼ4分の1になる。実際のスクリプトは以下のようになる。コメントの部分にあるように、CTRL は 0, 1, 2, 4, 8 を指定し、それぞれ throttling なし、1/2, 1/4, 1/8, 1/16 間引きに対応する。ここで、設定する値は MIKUMARI Link で接続しているボードですべて同じにする。異なる値にした場合、正常に動作しない(はず)。

#!/bin/bash

CTRL=0
# 0: no throttling
# 1: 1/2
# 2: 1/4
# 4: 1/8
# 8: 1/16

#low resolution
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.160 0x10B00000 ${CTRL} 1
...
$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/write_register 192.168.2.168 0x10B00000 ${CTRL} 1

#high resolution
$HOME/exp-config/rcnp_d202407a/amaneq-soft/install/StrHRTDC/bin/write_mzn_register 192.168.2.169 both 0x20C0 ${CTRL} 1

set_hbfstate_on.sh

Heart Beat State を ON にするスクリプト。このスクリプトを実行することで AMANEQ は Ready の状態になり TCP で接続すると、データを返すようになる。スクリプトの中身は以下のようなもの。AMANEQ MIKUMARI Primary の FPGA firmware が載ったボードに対して設定を行う。以下のスクリプトでは MIKUMARI Primary の IP アドレスが 192.168.2.160 の場合の記述になっている。

#!/bin/bash

$HOME/exp-config/rcnp_d202407a/hul-common-lib/install/bin/set_hbfstate 192.168.2.160 on

編集が終わったら...

FEE スクリプトの編集が終わったら、次は NestDAQ 用のスクリプトの編集を行う。編集方法は次のページ参照のこと。

付録: AMANEQ のリセットについて

ここで、reset_modules.sh の利用機会について言及しておく。AMANEQから読み出したデータに問題があるといった場合、reset_modules.sh スクリプトを実行し、AMANEQ のソフトウェアリセットを行う。ただ、最新のファームウェアの動作はかなり安定しつつあり、リセットが必要な機会は減ってきている。( 前のHR-TDC のファームウェアバージョンでは、データの読み出しで負荷がかかった場合、Local Heart Beat Frame Mismatch が起きて、リセットが必要になる時があった。)何らかの理由でソフトウェアのリセット効かない場合は、AMANEQのハードウェアリセットスイッチを押す。ちなみに、本多氏曰く、AMANEQ のパワーサイクル (電源 OFF/ON) が有効な場合はあまり考えられず、問題を悪化させるだけであろうとのこと。

本稿執筆者

2024/10/18 小林 信之 (大阪大学RCNP)