v1190aのoutputフォーマットを読み解く。
0000000 0001 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 5552 2d4e 3030 3333 2020 5453
0000040 5241 2054 3e3d 3220 3a33 3735 353a 2037
0000060 5320 4f54 2050 3e3d 5820 3a58 5858 583a
0000100 2058 2020 7250 6e69 2074 3e2d 5820 3a58
0000120 5858 583a 2058 3020 2d36 7041 2d72 3031
0000140 0000 0000 7274 6769 6567 2072 6564 616c
0000160 2079 7531 2073 2020 2020 2020 2020 2020
0000200 2020 2020 2020 2020 2020 2020 2020 2020
*
0000400 2020 2020 0000 0000 0000 0000 0000 0000
0000420 0000 0000 0000 0000 0000 0000 0000 0000
*
0410000 0000 0000 0000 0000 8805 0001 0001 0802
0410020 0001 000a 4000 0319 0800 0002 1800 0319
0410040 0900 0002 1900 0319 0a00 0002 1a00 0319
0410060 0b00 0002 1b00 014a 8400 002a 4000 1d9b
0410100 0800 1002 1800 1d9b 0900 1002 1900 1d9b
0410120 0a00 1002 1a00 1d9b 0b00 1002 1b00 014a
0410140 8400 004a 4000 281d 0800 2002 1800 281d
0410160 0900 2002 1900 281d 0a00 2002 1a00 281d
0410200 0b00 2002 1b00 014a 8400 006a 4000 329f
0410220 0800 3002 1800 329f 0900 3002 1900 329f
一行目から
*まではコメント文
0001で始まるのがヘッダー。
2020の連続はよくわかんね。
とりあえず、二個目のアスタリスク以降がデータ。
五個目、8805からデータが始まる。
8805は、DMAのサイズを表している。
でも一番上位のbitは1になるようになっているため、本当のsizeは
0805になる。
そのあとの0001,0001は順番?だと思う。
次、0802はセグメント(bbはそう呼ぶ)のサイズ。
後ろの0001は順番。
いよいよ。000a 4000からデータスタート。
それでもまずは、TDCのヘッダーが入る。
000aと4000。
ちなみにこれらは、後ろが上位ビットになっている。
つまり
0x4000000aが正解。
さて、
こいつら見にくくね?
ってことで、
0x4000000a これがグローバルヘッダー
0x0800008b これはTDC Header
0x18000002 TDC Trailer
0x0900008b TDC Header:上との違いは、TDCチップの番号。全4つ。
0x19000002 一個上のHeaderのTrailer
0x0a00008b
0x1a000002
0x0b00008b
0x030032ca ここがデータ。Headerの後ろにTrailerが来ていない。
0x031032ad
0x0700333c
0x071036ea
0x03003373
0x070033c6
0x03003815
0x03003aa3
0x1b00000a ここにTrailerがあるので、ここまでだとわかる。
0x8400024a これがGlobal Headerに対する、Trailer。ここまで。
0x4000002a 次のデータ。
0x08001b0d
0x18001002
0x09001b0d
0x19001002
0x0a001b0d
0x1a001002
0x0b001b0d
0x030032c2
0x031032a3
0x07003333
0x071036e0
0x03003368
0x070033bc
0x030037f6
0x03003a9a
0x1b00100a
0x8400024a
そこで疑問。
最初のHeader(TDCのデータより上にあるやつ。8505とか)は、
DMAのたびに入る模様。
なので、これをscanすることで、DMA一回分のデータ量が分かったりする。
じゃぁglobal headerはなんなんだ?
これがevent数という解釈なのか?
なぞ。
もうひとつ。
現在は、clockをtriggerに入れて、同じ信号をNIM ECLで分けてからTDCにinputしている。
一つデータを取っている間は、
次のTRIGGERが来てもデータを取らないようになっているのか。
また同じchに一つのtime window内に信号が複数来た場合はどうなるのか、後ろは見ないのか。
たぶん、上の話は、4000がtriggerの区切りになっている気がする。
下の話は、v1190.shをみて判断するべきかと。
今日のところはこんなところで。
あと、bb scriptを書いとく。
生データから、上の0xffffffffとかを表示するスクリプト。
////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define BLKSIZE 0x21000
unsigned short buff[BLKSIZE/2];
unsigned int data[BLKSIZE/4];
// int 4byte
// short 2byte
// char 1byte
int main(int argc, char *argv[]){
FILE *fd;
int mp, sz, datasz, i;
if((fd = fopen(argv[1], "r")) == NULL){
printf("Can't open %s\n", argv[1]);
exit(1);
}
while(!feof(fd)){
fread(buff, 2, BLKSIZE/2, fd);
if(buff[0] != 0) continue; // skip to next block
mp = 4;
while(buff[mp] != 0xffff){
sz = buff[mp] & 0x7fff;
printf("evtsize = %d\n", sz);
memcpy((char *)data, (char *)(buff+mp+5), (sz-5)*2);
//buff[mp+3]--buff[mp+sz-1]
datasz = (sz-5)/2; // in integer unit
for(i=0;i printf("0x%08x\n", data[i]);
}
mp += sz;
}
}
fclose(fd);
return 0;
}
/*
8 8 0 5
1000 1000 0000 0101
7 f f f
0111 1111 1111 1111
0000 1000 0000 0101
1111 1111 1111 1111
*/
///////////////////////////////////////////////////////////
0000000 0001 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 5552 2d4e 3030 3333 2020 5453
0000040 5241 2054 3e3d 3220 3a33 3735 353a 2037
0000060 5320 4f54 2050 3e3d 5820 3a58 5858 583a
0000100 2058 2020 7250 6e69 2074 3e2d 5820 3a58
0000120 5858 583a 2058 3020 2d36 7041 2d72 3031
0000140 0000 0000 7274 6769 6567 2072 6564 616c
0000160 2079 7531 2073 2020 2020 2020 2020 2020
0000200 2020 2020 2020 2020 2020 2020 2020 2020
*
0000400 2020 2020 0000 0000 0000 0000 0000 0000
0000420 0000 0000 0000 0000 0000 0000 0000 0000
*
0410000 0000 0000 0000 0000 8805 0001 0001 0802
0410020 0001 000a 4000 0319 0800 0002 1800 0319
0410040 0900 0002 1900 0319 0a00 0002 1a00 0319
0410060 0b00 0002 1b00 014a 8400 002a 4000 1d9b
0410100 0800 1002 1800 1d9b 0900 1002 1900 1d9b
0410120 0a00 1002 1a00 1d9b 0b00 1002 1b00 014a
0410140 8400 004a 4000 281d 0800 2002 1800 281d
0410160 0900 2002 1900 281d 0a00 2002 1a00 281d
0410200 0b00 2002 1b00 014a 8400 006a 4000 329f
0410220 0800 3002 1800 329f 0900 3002 1900 329f
一行目から
*まではコメント文
0001で始まるのがヘッダー。
2020の連続はよくわかんね。
とりあえず、二個目のアスタリスク以降がデータ。
五個目、8805からデータが始まる。
8805は、DMAのサイズを表している。
でも一番上位のbitは1になるようになっているため、本当のsizeは
0805になる。
そのあとの0001,0001は順番?だと思う。
次、0802はセグメント(bbはそう呼ぶ)のサイズ。
後ろの0001は順番。
いよいよ。000a 4000からデータスタート。
それでもまずは、TDCのヘッダーが入る。
000aと4000。
ちなみにこれらは、後ろが上位ビットになっている。
つまり
0x4000000aが正解。
さて、
こいつら見にくくね?
ってことで、
0x4000000a これがグローバルヘッダー
0x0800008b これはTDC Header
0x18000002 TDC Trailer
0x0900008b TDC Header:上との違いは、TDCチップの番号。全4つ。
0x19000002 一個上のHeaderのTrailer
0x0a00008b
0x1a000002
0x0b00008b
0x030032ca ここがデータ。Headerの後ろにTrailerが来ていない。
0x031032ad
0x0700333c
0x071036ea
0x03003373
0x070033c6
0x03003815
0x03003aa3
0x1b00000a ここにTrailerがあるので、ここまでだとわかる。
0x8400024a これがGlobal Headerに対する、Trailer。ここまで。
0x4000002a 次のデータ。
0x08001b0d
0x18001002
0x09001b0d
0x19001002
0x0a001b0d
0x1a001002
0x0b001b0d
0x030032c2
0x031032a3
0x07003333
0x071036e0
0x03003368
0x070033bc
0x030037f6
0x03003a9a
0x1b00100a
0x8400024a
そこで疑問。
最初のHeader(TDCのデータより上にあるやつ。8505とか)は、
DMAのたびに入る模様。
なので、これをscanすることで、DMA一回分のデータ量が分かったりする。
じゃぁglobal headerはなんなんだ?
これがevent数という解釈なのか?
なぞ。
もうひとつ。
現在は、clockをtriggerに入れて、同じ信号をNIM ECLで分けてからTDCにinputしている。
一つデータを取っている間は、
次のTRIGGERが来てもデータを取らないようになっているのか。
また同じchに一つのtime window内に信号が複数来た場合はどうなるのか、後ろは見ないのか。
たぶん、上の話は、4000がtriggerの区切りになっている気がする。
下の話は、v1190.shをみて判断するべきかと。
今日のところはこんなところで。
あと、bb scriptを書いとく。
生データから、上の0xffffffffとかを表示するスクリプト。
////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define BLKSIZE 0x21000
unsigned short buff[BLKSIZE/2];
unsigned int data[BLKSIZE/4];
// int 4byte
// short 2byte
// char 1byte
int main(int argc, char *argv[]){
FILE *fd;
int mp, sz, datasz, i;
if((fd = fopen(argv[1], "r")) == NULL){
printf("Can't open %s\n", argv[1]);
exit(1);
}
while(!feof(fd)){
fread(buff, 2, BLKSIZE/2, fd);
if(buff[0] != 0) continue; // skip to next block
mp = 4;
while(buff[mp] != 0xffff){
sz = buff[mp] & 0x7fff;
printf("evtsize = %d\n", sz);
memcpy((char *)data, (char *)(buff+mp+5), (sz-5)*2);
//buff[mp+3]--buff[mp+sz-1]
datasz = (sz-5)/2; // in integer unit
for(i=0;i
}
mp += sz;
}
}
fclose(fd);
return 0;
}
/*
8 8 0 5
1000 1000 0000 0101
7 f f f
0111 1111 1111 1111
0000 1000 0000 0101
1111 1111 1111 1111
*/
///////////////////////////////////////////////////////////