=========================== T0インデックスについて =========================== :Status: 作成中 概要 ==== T0インデックスとは、空蟬のヒストグラム化においてイベントデータファイルを高速に読み込み、また高速に時間でのスライスを実現するために使用されている仕組みである。 MLFの中性子データ収集システムにおいて発生するイベントには大まかに2種類ある。 1. いつ中性子が線源で発生したか(T0イベント、Instrument Clockイベント) 2. 中性子がいつ(発生してからの時間)、どこで検知されたか(中性子イベント) 上記の2種類のイベントは、DAQミドルウェアによって収集されファイルに時系列で書き込まれる(下の図を参照)。MLFはパルス型中性子源であるので、通常、中性子発生時刻から次の発生時刻までを1つのまとまり(フレーム)として扱われる。 見方を変えると、各種イベントデータはファイル内に一列に並んでいるがに、フレームを区別する栞としてT0イベントが差し込まれていると考えてよい。そこで、この栞の場所を(本の目次のように)インデックス化してあらかじめ押さえておけば、高速にデータファイル内のあるデータにアクセスすることが可能になる。 この栞の目次をT0インデックスと呼ぶ。具体的には、フレームの先頭であるT0イベントのファイル内での場所をファイル先頭からのイベントの数で表し、同時に時刻情報も付加したものである。 |image0| T0インデックスの応用 ========================= 空蟬では、データリダクションとして行うヒストグラム化をより高速に、効率的に実行するためにT0インデックスを利用している。 用途としては - イベントデータの時系列解析 - ヒストグラム化処理の高速化 - ダブルフレームのTOFの測定 - 準オンライン解析 などである。 **イベントデータの時系列解析** T0インデックス情報を読み込んで、パルスIDもしくは時刻情報を利用することで、目的のフレームにあるイベントデータへのアクセスを高速化できる。 **ヒストグラム化処理の高速化** ヒストグラム化処理の高速化は、処理をマルチスレッド化し、現在広がりつつあるマルチコアCPUのリソースを簡単かつ有効利用する手法が鈴木次郎氏により実装されている。これは長大なイベントデータをプログラム内部で分散処理(コア)の数に分割しそれぞれ別スレッドで処理させるという方法であり、この「イベントデータの分割」にはフレーム単位で解析するのがもっとも理解しやすく、処理も容易となる。その切り分けに、このインデックスが利用できる。 **ダブルフレームのTOFの測定** ダブルフレーム(二つのフレームにまたがる中性子散乱)のTOFを正確に知るためには、あるフレームに存在するTOFに対し、そのフレーム以前のT0イベント発生時刻からの差分が必要である。この算出はイベントデータファイルを読み込みながら作業を行うことも可能であるが処理に時間がかかるため、インデックス化するときに時刻の差分情報も同時に収めることで、高速化をはかる。 **準オンライン解析** これまで測定中のデータに対する解析を行う場合、DAQによりハードディスクに保存されたデータファイルをコピー、もしくは直接読み込むことで行っていた。いわゆるオンライン解析ではなく、ファイルに対する解析なので準オンラインであるが、どちらも、DAQにより書き込みの続くハードディスクへのアクセスが必要であり、この読み込みを最小限にする必要がある。もしT0インデックスを活用できれば、これまでに読み込んだデータはそのままで、新たに追加されたデータ(差分)のみ読み込むということが可能となる。 T0インデックスの作成と利用方針 =============================== 前項で述べたようなT0インデックスを利用した解析を行うためには、イベントデータファイル内のT0イベント+Instrument Clockイベントを走査し、必要なT0インデックスや時刻情報の差分をとる必要がある。これらの情報は1モジュールのイベントデータファイルに対し一つ必要であるが、イベントデータファイルに変更・追加がなければ、再利用が可能な(固定の)情報である。よって一度作成したT0インデックス情報は、バイナリファイル化してT0インデックスイベントファイルとして別に保存することにする。このファイルはイベントデータファイルそのものよりサイズが小さいので、対象のイベントデータファイルを読み込む前にこのファイルを読み込んでも大きなコスト増にはならず、逆にそれによってデータへのアクセスを容易かつ高速に行えるので、トータルとして十分な高効率化を達成できる。 ------------------------------------- 各種データリダクションに必要な情報 ------------------------------------- T0インデックスとして解析に利用する情報は以下のようなものである。 +----------------+--------------------------+------------------------------------------------+ | 情報 | 意味 | 補足説明 | +================+==========================+================================================+ | T0インデックス | T0イベントの位置のリスト | ファイルの先頭から各T0イベントまでのイベント数 | +----------------+--------------------------+------------------------------------------------+ | Pulse Id | T0イベントのID | 中性子発生のT0のIDであり、 | | | | 異なるイベントデータでの同期に使用。 | +----------------+--------------------------+------------------------------------------------+ | Clock | Instrument Clock | | | | (装置時刻情報)のリスト | T0イベントと並んで書き込まれる装置時刻情報 | +----------------+--------------------------+------------------------------------------------+ | Clock差分 | Clockの差分 | 装置時刻の差分(フレーム間の時刻差分) | +----------------+--------------------------+------------------------------------------------+ T0インデックスのバイナリデータ =========================================== T0インデックス情報をバイナリデータとしてファイルに収める場合、これもイベントデータと同じようなフォーマットで保存する。これはT0インデックスのデータとDAQミドルウェアとの相性がよくなることを意味し、後で述べるDAQミドルウェアのコンポーネント化に対応できる。 ------------------------------- フォーマット ------------------------------- 以下にT0インデックスのバイナリデータのフォーマットを示す。 |T0IndexEventDataFormatImg| **イベントの種類** +---------------------+-----------+--------------------------------------------------------------------+ |イベント名 |ヘッダ |情報 | +=====================+===========+====================================================================+ |First Pulse ID |0x4b |PulseIdを収める。中性子イベントデータのT0イベント(ヘッダ0x5b)と | | | |ヘッダが異なるだけでほぼ同じ形である。 | +---------------------+-----------+--------------------------------------------------------------------+ |Instrument Clock data|0x4c |装置時刻情報を収める。装置時刻情報(Clockイベント:ヘッダ0x5c)と | | | |ヘッダが異なるだけでほぼ同じ形である。 | +---------------------+-----------+--------------------------------------------------------------------+ |T0 Info |0x4f(,0x4a)|T0イベントの場所をイベントファイルの先頭からのイベント数で表現する。| +---------------------+-----------+--------------------------------------------------------------------+ |Clock Increment Info |0x4e(,0x4d)|前のT0 Infoイベントからの時間(差分時刻情報)を収める。 | +---------------------+-----------+--------------------------------------------------------------------+ **イベント挿入のルール** - First Pulse Id(0x4b)とInstrument Clock data(0x4c)は必ずペアで挿入される。 - T0 Info(0x4f)とClock IncrementInfo(0x4e)は必ずペアで挿入される。 - First Pulse IdとInstrument Clock dataは、以下のタイミングで挿入される。 1. T0インデックスファイルの先頭 2. PulseIdが不連続な場合 3. Clock Increment Infoが収められない時間(72時間)が経過した時 **かつて使用されていていたイベント** 以前はT0 Infoとしてヘッダ0x4aのイベントと、Clockとしてヘッダ0x4dのイベントが使用されていた。これらは新しい空蟬でも利用できる。 |T0IndexEventDataFormatObsoImg| Manyoライブラリの関数 ====================== T0インデックスを扱うためのコード(関数)がManyoライブラリに実装されている。 DAQミドルウェアのコンポーネント化 ==================================== T0インデックス情報はイベントデータがあれば作成できる。しかも一度作成すれば再利用が可能である。しかし解析の前に必ずT0インデックスを作成したり、バイナリデータを書き出したりするのは、若干のコストがかかる。また準オンライン解析のように、逐次解析を行う場合、T0インデックスが順次イベントデータと同時に作成されてゆくのが望ましい。 そこでイベントデータからT0インデックスを作成するコードをDAQミドルウェアのコンポーネントとして実装することで、イベントデータの蓄積に応じてT0インデックスバイナリファイルも追記されてゆくようなシステムが構築できる。 このコンポーネントはすでに実用化されて、DAQミドルウェアのMLF用コンポーネントに同梱されている。 .. |image0| image:: media/T0Index_About.png :scale: 30 % :alt: figure of T0Index .. |T0IndexEventDataFormatImg| image:: media/T0IndexEventDataFormat.png :width: 600px .. |T0IndexEventDataFormatObsoImg| image:: media/T0IndexEventDataFormatObs.png :width: 600px