* DAQ(Ge用)のメモ [#u597e711] #contents **linuxのインストール [#d79687f3] Scientific linux をネットワークインストール。 Desktopを選択。 再起動ごDHCPがうまく動かなかったが、/etc/sysconfig/network-scripts/ifcfg-eth0で NM_CONTROLLED="no" GATEWAY=xxx.xxx.xxx.xxx NETMASK=xxx.xxx.xxx.xxx でつながった。 yumのリポジトリを編集。http://d.hatena.ne.jp/leetmikeal/20130409/1365477385を参考にした。 とりあえずemacsをインストール yum install emacs あとupdate yum update その後 -screen -gcc -gcc-c++ -bison -expat-devel -libicu-devel -automake -a2ps をインストール。 ROOTのために以下もインストール -libX11-devel -libXpm-devel -libXft-devel -libXext-devel ROOTを/usr/local/src/root/root_v5.34.36にインストール ./configure --prefix=/usr/local/src/root/root_v5.34.36 とした。 rootを立ち上げるとiostreamがないとか言われたりする。どうもprefixの場所はtarを展開したところではいけないという記事を見つけたので、prefix=/usr/local/lib/root_v5.34.36/として再コンパイル。~/.bashrcは結局以下のようにした。 #ROOT source /usr/local/lib/root_v5.34.36/bin/thisroot.sh alias root="root -l" ** babirlのインストール [#f71806f6] https://ribf.riken.jp/RIBFDAQ/index.php?DAQ%2FManual%2FInstallation#r75f84d8にしたがって行う。 system-config-firewall-tui で有効のチェックを外す。 /etc/sysconfig/selinuxで #SELINUX=enforcing SELINUX=disabled とする。 yumで以下をインストール - zlib-devel (入っていた。) - ncurses-devel - readline-devel - expat-devel (入っていた) - php-xml(web utilityのための他のものは入っていた) - postgresql - postgresql-devel su cd /usr tar zxvf babirl160802.tar.gz ln -s babirl160802 babirl cd babirl make webutilも一応やっておく。 Install of Web Utilitiesをそのままやった。 /home/daq/public_htmlにwebutilをおいた。ブラウザで開くとForbiddenと言われるので、chmod 755 $HOMEとした。 あとはドライバかな?https://ribf.riken.jp/RIBFDAQ/index.php?DAQ%2FDownload#w25313faをみると、 -do not use NBBQ -install CAEN's official driver とあるので、CAENのドライバを入れないといけない。 ドライバのダウンロードのためには登録、ログインが必要。登録してあったアカウントでログイン。A2818Drv-1.20-build20161118.tgzを展開。Readme.txtをみると対応するMakefile.x.xをコピーしてmakeしろとあるのでやってみると、 [daq@daq01 A2818Drv-1.20]$ make make -C /lib/modules/2.6.32-642.el6.i686/build M=/home/daq/daq_drivers/aliap_ge/A2818Drv-1.20 LDDINCDIR=/home/daq/daq_drivers/aliap_ge/A2818Drv-1.20/../include modules make: *** /lib/modules/2.6.32-642.el6.i686/build: そのようなファイルやディレクトリはありません. 中止. make: *** [default] エラー 2 と言われるググるとkernel-develを入れればよいみたい。いれる。 yum install kernel-devel 再びA2818Drv-1.20でmake。でも同じ。どうも -/lib/modules/2.6.32-642.11.1.el6.i686 -/lib/modules/2.6.32-642.el6.i686 の2つがあり、前者はbuildのシンボリックリンクが生きている。Makefileの一部を変更する。 #KERNELDIR ?= /lib/modules/$(shell uname -r)/build KERNELDIR ?= /lib/modules/2.6.32-642.11.1.el6.i686/build これでトライ。makeできた。あとはa2818_loadというスクリプトを走らせればドライバがロードされるみたい。rootアカウントでスクリプト走らせると、 [root@daq01 A2818Drv-1.20]# ./a2818_load insmod: error inserting 'a2818.ko': -1 No such device となってしまう。PCIカードささないとダメですかね?とりあえず今日はここまで。 A2818を取り付ける。ジャンパーはPCIが5Vのようなので3.3Vになっていたのを5Vにする。 2つあるPCIのうち、上側につけると上と同じメッセージ。。。下側のPCIスロットにつけるとerrorがなくなった!どういうこと?とりあえず下側のスロットに挿して使うことにする。a2818_loadのスクリプトはDAQを動かすときに自動的にやりたいが。。。後で考える。 babirlにはoriginal driver + librariesとある。libraryはCAENVMELibか?とりあえずこれをダウンロードして展開。とりあえず/home/daq/daq_drivers/ailap_ge/CAENVMELib-2.50にある。Readmeにしたがって、lib/installを実行する。 次にV2718のドライバを https://ribf.riken.jp/RIBFDAQ/index.php?plugin=attach&refer=DAQ%2FDownload&openfile=bbcaenvme150709.tar.gzからダウンロード。コピーして、/home/daq/daq_drivers/ailap_ge/bbcaenvmeにおく。これを改造してDAQドライバを作ることにする。とりあえずcmdvmeをコンパイルして、 [daq@daq01 cmdvme]$ ./cmdvme -wr -bd V2718 ffff / 65535 とすると、モジュールのLEDが光る!アクセスできているみたい。とりあえず今日はここまでとする。 DAQのPCを実験室のローカルネットワークにおく。ルーターにLANケーブルを挿す。/etc/sysconfig/network-scripts/ifcfg-eth0を編集して/etc/init.d/network restartした。詳細はlogbookで。 webutilがうまくいかないので、とりあえず以下のようなスクリプトを用意した。 #!/bin/sh if [ ! -e /dev/a2818_0 ];then echo /home/daq/daq_drivers/ailap_ge/A2818Drv-1.20/a2818_load source /home/daq/daq_drivers/ailap_ge/A2818Drv-1.20/a2818_load fi if [ -e /var/run/babinfo ]; then kill `cat /var/run/babinfo` rm -f /var/run/babinfo fi if [ -e /var/run/babild ]; then kill `cat /var/run/babild` rm -f /var/run/babild fi if [ -e /var/run/babies ]; then kill `cat /var/run/babies` rm -f /var/run/babies fi /usr/babirl/bin/babinfo sleep 1 /usr/babirl/bin/babild -l 1 /usr/babirl/bin/babies -l 21 sleepを入れないとbabiconが立ち上がらない。 **A3400の設定 [#zf390efc] アドレスを設定するスイッチSW1-3はそれぞれ1,2,3にした。 ロジック信号の論理レベル設定J1は開放でNIM。 これでMIR(Module Identification Register)を読んでみる。 [daq@daq01 cmdvme]$ ./cmdvme -lr 0x123ffff4 00003400 / 13312 読めた!0x123がアドレスに対応している。ちなみにFPGAやCPUのversionを読むと、 [daq@daq01 cmdvme]$ ./cmdvme -lr 0x123fffec 00000100 / 256 [daq@daq01 cmdvme]$ ./cmdvme -lr 0x123ffff0 00000100 / 256 両方とも0x0100を返すが、これはver1.00に対応しているらしい。初めは正しく読めてるかどうかよくわからなかった。。。 **A3400のドライバ [#dd2266bb] 同も16ビットしか使っていないからといって、vwrite16を使うと正しく書き込みできないみたい。全部vwrite32で統一すれば良さそう。 1/13。馬場さんからA3400のドライバをもらった。/home/daq/daq_drivers/ailap_ge/testdrv_A3400においてある。これを少し改造する。libbabies.c仕様にするために、A3400_segdata_libbabiesを作り、 // vread32(maddr+A3400_LISTBUFF+dataaddr, (int *)(data+mp)); vread32(maddr+A3400_LISTBUFF+dataaddr, (int *)(babies_segpt32())); // mp += 2; // segmentsize += 2; とした。またもらったドライバはインタラプトをLUPOで書けていたので、これをA3400でかけるようにした。とりあえず1イベントでインタラプトをかけることにした。(Geだけなら、ある程度イベントたまったらでもいいけれど。。。) **caenvmebabies [#y4121da0] babies/babiesのリンク先はcaenvmebabiesになっている。これの中身を見ると、startup,evt,stop,clearなどが含まれている。A3400ように改造して走らせる。これが走っている状態でbabiconでnsstaすると何か動いているっぽい!RawDataMonitorでも一応何か見える。次はデータ解析コードですかね。 **ANAROOT [#p5c0397e] v4.5.31をインストール。autogen.sh --prefix=$PWDをやると、 libtoolize: コマンドが見つかりません とか言われて途中で止まるので、libtoolをyumでインストール。 autogenを通るけど、今度はxmlでmakeが以下のメッセージで止まる。 include/TArtBigRIPSParameters.hh:10: error: forward declaration of ‘struct TXMLNode’ src/TArtBigRIPSParameters.cc:886: error: invalid use of incomplete type ‘struct TXMLNode’ yumでlibxml2-develをインストール。でもダメ。ANAROOT Wikiでこんなのがあったのを思い出す。https://root.cern.ch/build-prerequisitesに必要なものが一覧になっている。とりあえず入っていなかった以下のものをyumで入れる。 - git - cmake - gcc-gfortran - openssl-devel - pcre-devel - mesa-libGL-devel - mesa-libGLU-devel - glew-devel (利用できませんだった) - ftgl-devel (利用できませんだった) - mysql-devel - fftw-devel - cfitsio-devel (利用できませんだった) - graphviz-devel - avahi-compat-libdns_sd-devel - libldap-dev (利用できませんだった) - python-devel - python-numpy-devel (利用できませんだった) - gsl-static - r-base (利用できませんだった) これらを何も考えずに入れた後、ROOTをmake clean後configure, makeとした。 これでanarootもmakeできました。 RIBF2DataId.Cでデータを確認するとそれっぽい!とりあえず動くものはできたと思う。 **2017/1/13時点でのやることリスト [#f75f42fe] - デコーダー。時間の情報とかもあるが、それはどういうことになっている? -> 作った - A3400でBusyとかも管理している事になっている。これはどうするか?->BUSYはGGで管理するようにした - 他の人が使いやすくするために、 -- フォルダの整理 -- どう使わせるか? - 時間情報(TimeStamp)はどうするか?->データには書かれているが、解析でskip - webutilの整備。DNSがいる?もしくはIP直打ちで出きるように改造?->skip - thresholdの設定をchごとに。これはコンパイルしなくても言いようにcmdvmeでやるか?->つくった - gate幅の設定も同様。->~/daq_driver/ailap_ge/a3400_thre.shでやる。 - 今clearしてないように見えるが、よいのか? - V2718のOutputのカスタマイズ?---スケーラーとかに使いたくなる。->Output registerはできた。あとはVisual scaler用にClock generatorを作るか? - gate幅の設定も同様。->~/daq_driver/ailap_ge/a3400_thre.shでやる - 今clearしてないように見えるが、よいのか?->リングバッファなので多分しなくてよい - V2718のOutputのカスタマイズ?---スケーラーとかに使いたくなる。->Output registerはできた。あとはVisual scaler用にClock generatorを作るか?->作った - 1イベントでインタラプトかけているが、これで良い?->まあいいでしょう ***データについて [#pa9e42b9] RawDataモニターで見ると以下のようになっている。 Segment ly=2 cid=4 size=14 21 0x 2100000e 00000015 0000001f 05c9 4084 0000 d088 bb81 f79a d8a4 60d7 SegmentID=0x0000001f BIGRIPS (Dev=0) FP0 (FP=0) PPACQ (Det=0) A3100 (Mod=31) 05c9からがデータ。これは多分 +0x408405c9 +0xd0880000 +0xf79abb81 +0x60d7d8a4 と読むのだと思う。Gated ListモードだとADC1、ADC2、…、TS_HI、TS_LO、ECという順番になっているらしい。(1)、(2)、(3)、(4)の上位ビット3つは010、110、111、011なので、ADC、TS_HI、TS_LO、ECとなっている。これはマニュアルのデータ構造と同じ。ADCだけ読むなら上位3ビットが010で見つければよい。ANAROOTのTArtDecorderA3100::Decodeでは igeo = 0; for (i=0; i<evtsize; i++) { //TArtCore::Info("TArtDecoderA3100","decode %x",evtdata[i]); //if(kHeaderMask == evtdata[i]&kHeaderMask){ if((evtdata[i]&kHeaderMask) == kHeaderMask){ igeo ++; continue; } else{ ich = (evtdata[i]&0x0003c000) >> 14; TArtRawDataObject *rdata = new TArtRawDataObject(igeo,ich,evtdata[i]&0x1fff); rawseg->PutData(rdata); } } となっている。kHeaderMaskは0x60000000なので、上位3ビットが011。これはEventCountを示している。(A3200のマニュアルでも同様。A3100は見つけられず。)これ以外に対して、0-12ビット(0x1fff)を取り出してrdataを作っている。ただしTSのデータをはじいているわけではないので、そのまま使ってはいけないみたい。 TArtDecorderA3400を作らないといけない。TArtDecorderFactoryでRegister(TArtDecoderA3100::Instance());としているので、ANAROOT本体をいじらないといけない。これは来週かな? ** V2718のClock generator [#y5a6ee4f] V2718はClock generatorとしても使用できる。以下のような関数をlibbbcaenvme.cに作った。 void vme_setoutput_v2718(){ unsigned short val; unsigned int width; unsigned int period; // assignment // ch0: BUSY CLR // ch1: START // ch2: STOP // ch3: Clock (Pulser B) // ch4: SCL CLR CAENVME_SetOutputConf(BHandle,cvOutput0,cvDirect,cvActiveHigh,cvManualSW); CAENVME_SetOutputConf(BHandle,cvOutput1,cvDirect,cvActiveHigh,cvManualSW); CAENVME_SetOutputConf(BHandle,cvOutput2,cvDirect,cvActiveHigh,cvManualSW); CAENVME_SetOutputConf(BHandle,cvOutput3,cvDirect,cvActiveHigh,cvMiscSignals); CAENVME_SetOutputConf(BHandle,cvOutput4,cvDirect,cvActiveHigh,cvManualSW); // set ch3 for clock generator width=4;// 100ns width period=40;// 0.1us period -> 10MHz CAENVME_SetPulserConf(BHandle,cvPulserB,period,width,cvUnit25ns, 0,cvManualSW,cvManualSW); val = 0x0004; CAENVME_WriteRegister(BHandle,cvOutRegSet,val);// PulserB start } SetPulserConfの0はずっと出しつづけるinfinite。これをstart()の中で呼び出すと、Clock generatorとして動かすことができる。今は10MHzという使いづらい周波数になっているがどうにもできない。。。用意されている単位が25ns, 1.6us, 410us, 104msの4通り。この単位で8bit=0-255で指定するので、1kHzとかは作れない。。。とりあえず10Mhzとし、Visual scalerのCarry outを別のchに入れることによって時間測定をすることにする。(もったいないけど) これがどこまで正確なのかはよくわからないが、まあとりあえずよいことにする。