東京工業大学大学院理工学研究科基礎物理学専攻中村研究室メンバーTakayuki Sako

ANAPAW 自作コマンド

自作したANAPAWのコマンド。
このページはusersrcやマクロではなくANAPAW本体に手を加えるものである。 ANAPAWにコマンドを自作して追加した時のメモ。

Command List

現在のヒストグラムIDを取得する
EVTLOOPの時のコマンドを簡略化。

現在のヒストグラムIDを取得する : CID

現在のヒストグラムIDを返すコマンドを作ってマクロ(.kumac)からその値を取得する。

ANAPAW本体のディレクトリ構造

手を加えるのは黄色の部分。
~/usr/local/anapaw$ tree
.
|-- Documents
|   |-- ChangeLog
|   |-- HOWTO
|   |-- INSTALL
|   `-- README
|-- Macros
|   |-- bandx.kumac
|   |-- bandy.kumac
|   (省略)
|   |-- xyblow.kumac
|   `-- yblow.kumac
|-- Setup
|   |-- analogon.kumac
|   |-- setana
|   |-- setana.bash
|   |-- setlocal
|   |-- setlocal.bash
|   |-- setup.exp
|   |-- setup.exp.bash
|   |-- setup.local
|   |-- setupanapaw
|   |-- setupanapaw-free
|   |-- setupanapaw.bash
|-- lib
|   |-- anapaw.o
|   `-- libanalib.a
`-- src
    |-- Makefile
    |-- ainit.f
    |-- ainit.o
    |-- anaact.f
    |-- anaact.o
    |-- anabatch.f
    |-- anabatch.o
    |-- anaeff.f
    |-- anaeff.o
    |-- anaevent.f -> anaevent_riken.f
    |-- anaevent.o
    |-- anaevent_nscl.f
    |-- anaevent_riken.f
    |-- anafill.f
    |-- anafill.o
    |-- anainit.f
    |-- anainit.o
    |-- anamnu.f
    |-- anamnu.o
    |-- anapaw.f
    |-- anaread.f
    |-- anaread.o
    |-- anasub.f
    |-- anasub.o
    |-- anasub2.f
    |-- anasub2.o
    |-- anasubc.c
    |-- anasubc.o
    |-- anasubplot.f
    |-- anasubplot.o
    |-- anasubutil.f
    |-- anasubutil.o
    |-- astart.f
    |-- astart.o
    |-- astop.f
    |-- astop.o
    |-- bbcpri.c
    |-- bbcpri.h
    |-- bbcpri.o
    |-- common.f
    |-- common.inc -> common_riken.inc
    |-- common_nscl.inc
    |-- common_riken.inc
    |-- dumpdata.c -> dumpdata_riken.c
    |-- dumpdata.o
    |-- dumpdata.txt
    |-- dumpdata_nscl.c
    |-- dumpdata_riken.c
    |-- getblock.c -> getblock_riken.c
    |-- getblock.o
    |-- getblock_nscl.c
    |-- getblock_riken.c
    |-- getevt.c -> getevt_riken.c
    |-- getevt.o
    |-- getevt_nscl.c
    |-- getevt_riken.c
    |-- ntuple_io.f
    |-- ntuple_io.o
    |-- setnscl
    |-- setriken
    `-- vana
        |-- Makefile
        |-- viewana
        `-- viewana.c
ちなみにUbuntuでコマンドラインからディレクトリのツリー表示をするには
sudo apt-get install tree

anamnu.f

anamnu.fのGPROの項の直後、KUCMD('..',' ','SW')の前に新たなコマンドCIDについての記述を加える。
ちなみにここでの記述がhelpで参照するときの文章になる。
変更前
C /ANALYS/HISTOGRAM/GPRO - COMMAND -
      
      CALL KUCMD(' ','GPRO','C')
      CALL KUPAR('GPRO','CUTID','CUT ID  ','IO','S')
      CALL KUPVAL('GPRO','CUTID',0,0.,' ','D')
      CALL KUPAR('GPRO','CUTNAME','Cut File name','CO','S')
      CALL KUPVAL('GPRO','CUTNAME',0,0.,' ','D')
      CALL KUPAR('GPRO','COPT','Window Option','CO','S')
      CALL KUPVAL('GPRO','COPT',0,0.,'M','D')
      CALL KUPVAL('GPRO','COPT',0,0.,'M,S,OPT','V')
      CALL KUPVAL('GPRO','COPT',0,0.,'   Main Window','-M')
      CALL KUPVAL('GPRO','COPT',0,0.,'   Scatter Window','-S')
      CALL KUPVAL('GPRO','COPT',0,0.,'   HPLOT Option','-OPT')
      GuID(1)='  Project Contents to 2D-Hist gated with cut.'
      GuID(2)='  '
      CALL KUGuID('GPRO',GuID,2,'S')
      CALL KUACT('GPRO',ANAACT)

      CALL KUCMD('..',' ','SW')
変更後
C /ANALYS/HISTOGRAM/GPRO - COMMAND -
      
      CALL KUCMD(' ','GPRO','C')
      CALL KUPAR('GPRO','CUTID','CUT ID  ','IO','S')
      CALL KUPVAL('GPRO','CUTID',0,0.,' ','D')
      CALL KUPAR('GPRO','CUTNAME','Cut File name','CO','S')
      CALL KUPVAL('GPRO','CUTNAME',0,0.,' ','D')
      CALL KUPAR('GPRO','COPT','Window Option','CO','S')
      CALL KUPVAL('GPRO','COPT',0,0.,'M','D')
      CALL KUPVAL('GPRO','COPT',0,0.,'M,S,OPT','V')
      CALL KUPVAL('GPRO','COPT',0,0.,'   Main Window','-M')
      CALL KUPVAL('GPRO','COPT',0,0.,'   Scatter Window','-S')
      CALL KUPVAL('GPRO','COPT',0,0.,'   HPLOT Option','-OPT')
      GuID(1)='  Project Contents to 2D-Hist gated with cut.'
      GuID(2)='  '
      CALL KUGuID('GPRO',GuID,2,'S')
      CALL KUACT('GPRO',ANAACT)


C /ANALYS/HISTOGRAM/CID - COMMAND -
      
      CALL KUCMD(' ','CID','C')
      GuID(1)='  Print Current HID'
      GuID(2)='  '
      CALL KUGuID('CID',GuID,2,'S')
      CALL KUACT('CID',ANAACT)


      CALL KUCMD('..',' ','SW')

anaact.f

CHBINに関する記述とSTATUSの間にCIDとコマンドを打ったときにサブルーチンDISPLAYCIDを呼び出すように設定する。
変更前
         ElseIf (CMD(3) .EQ. 'CHBIN') Then
            Call KUGETI(BF)
c            write(*,*)'bf ',bf
            If(BF.LT.1)BF=1
            HID = DispID(DseqID)
            Call HGIVE(HID,temptitle,
     &                         TMPNX,TMPRXMI,TMPRXMA,
     &                         TMPNY,TMPRYMI,TMPRYMA,
     &                         TMPNWT,TMPLOC)
c            write(*,*)hid,tmpnx,tmprxmi,tmprxma,
c     &                tmpny,tmprymi,tmpryma,tmpnwt,tmploc
            Call HXI(HID,TMPRXMI,TMPXMI)
c            write(*,*)'1 ',hid,tmprxmi,tmpxmi
            Call HXI(HID,TMPRXMA,TMPXMA)
c            write(*,*)'2 ',hid,tmprxma,tmpxma
            NBINS = int((TMPXMA-TMPXMI)/BF)
c            write(*,*)'nbins ',nbins
            Call CHBIN(BF,NBINS)
         EndIf
      ElseIf (CMD(2) .EQ. 'STATUS') Then
         Write(*,*)' '
変更後
         ElseIf (CMD(3) .EQ. 'CHBIN') Then
            Call KUGETI(BF)
c            write(*,*)'bf ',bf
            If(BF.LT.1)BF=1
            HID = DispID(DseqID)
            Call HGIVE(HID,temptitle,
     &                         TMPNX,TMPRXMI,TMPRXMA,
     &                         TMPNY,TMPRYMI,TMPRYMA,
     &                         TMPNWT,TMPLOC)
c            write(*,*)hid,tmpnx,tmprxmi,tmprxma,
c     &                tmpny,tmprymi,tmpryma,tmpnwt,tmploc
            Call HXI(HID,TMPRXMI,TMPXMI)
c            write(*,*)'1 ',hid,tmprxmi,tmpxmi
            Call HXI(HID,TMPRXMA,TMPXMA)
c            write(*,*)'2 ',hid,tmprxma,tmpxma
            NBINS = int((TMPXMA-TMPXMI)/BF)
c            write(*,*)'nbins ',nbins
            Call CHBIN(BF,NBINS)

         ElseIF (CMD(3) .EQ. 'CID') Then
            Call DISPLAYCID()

         EndIf
      ElseIf (CMD(2) .EQ. 'STATUS') Then
         Write(*,*)' '

anasubplot.f

anasubplot.fの一番最後にDISPLAYCIDの本体を記述する。
c =================================================================

      Subroutine DISPLAYCID()

      Include 'common.f'

      HID = DispID(DSeqID)

      open(98, file='./CurrentHID.txt', status='replace')
      write(98,*) HID
      close(98)
      
      write(*,*) 'Current HID :' , HID
      return
      end

c =================================================================
ANAPAWで現在表示しているヒスグラムを取得するのは本質的には
HID = DispID(DSeqID)
の一行である。これを./CurrentHID.txtに書き込むようにしている。

新たなコマンドCID

後はmakeすれば
makelib
makeana
新たなコマンドCIDが使えるようになる。
ANAPAW> cid
  > cid
 Current HID : 101
ANAPAW> i
  > i
  
 ===> Histogram List 
  
              #    HID  Kind       Title
  
       ->     1    101   (2)     NEBULA 
 
ANAPAW> sh less CurrentHID.txt
  > sh less CurrentHID.txt
 101

現在のヒストグラムIDを返すマクロ read_cid

ANAPAWのワーキングディレクトリ配下のkumac/に以下のread_cid.kumacを作る。
read_cid.kumac
 macro read_cid
	 cid
	 v/del Current_HID
	 v/cre Current_HID(1) 'I'
	 v/read Current_HID(1) ./CurrentHID.txt
 return  Current_HID(1)
これはcidを呼んで現在のヒストグラムを返す。

read_cidを使って現在のヒストグラムIDを取得

HID = $exec(kumac/read_cid)
とするとHIDに現在のヒストグラムIDが格納される。

応用

ここまでの下準備によりマクロを作った際に現在のヒストグラムIDを簡単に取得できるようになったので色々遊べる。 マクロについてはマクロのページに。

EVTLOOPの時のコマンドを簡略化 : s

通常は
ANAPAW> a/l

  ANAPAW-M : All definitions were cleared.


rdf/0117.rdf  Size :  61.2 MB   Block : 3919
ANAPAW/EVTLOOP> start
のようにstartと打つがこれが面倒臭い。 kumacでエイリアスを張ってもうまく行かなかったので仕方なくソースをいじることにした。

anasub.f

ディレクトリ構造src配下のanasub.fを以下のように書き換える。
変更前
1053            ElseIf (CKEY .eq. 'START' .OR. CKEY .EQ. 'start' )Then
変更後
1053            ElseIf (CKEY .eq. 'START' .OR. CKEY .EQ. 'start'
1054     &              .OR. CKEY .eq. 's' .OR. CKEY .eq. 'S')Then

以上のように変更すればa/lでループを回す際に「s」と打つだけで実行できるようになる。

ファイル