Hatena::ブログ(Diary)

にいくらの日記

2012-02-09

PAWのlocateのような事をROOTでやりたい

PAWを使っていた人なら、表題のようなことをやりたい人は結構いると思うんだけど、ROOTだとちょっと簡単には出来ない。単にカーソルの位置を知りたいだけならば、TCanvasのView->Event Statusbarで見れるが、クリック時のマウスカーソルの位置を標準出力に出力するためにはひと手間必要。

1次元のヒストグラムの場合は、$ROOTSYS/tutorials/hist/exec1.Cが使える。僕は2次元で使いたかったのでちょっと書き加えてみた。名前はlocate.Cとした。

// echo object at mouse position
void locate()
{
  // example of macro called when a pad is redrawn
  // one must create a TExec object in the following way
  //  TExec ex("ex",".x locate.C");
  //  ex.Draw();
  //  this macro prints the bin number and the (X,Y) value when one clicks
  // on the histogram contour of any histogram in a pad
  // Author: Rene Brun
  // Modified for 2D histogram: Megumi Niikura
   
  int event = gPad->GetEvent();
  if (event != 11) return;
  int px = gPad->GetEventX();
  int py = gPad->GetEventY();
  TObject *select = gPad->GetSelected();
  if (!select) return;
  if (select->InheritsFrom(TH1::Class())) {
    TH2 *h = (TH2*)select;
    Float_t xx = gPad->AbsPixeltoX(px);
    Float_t x  = gPad->PadtoX(xx);
    Float_t yy = gPad->AbsPixeltoY(py);
    Float_t y  = gPad->PadtoY(yy);
    Int_t binx = h->GetXaxis()->FindBin(x);
    Int_t biny = h->GetYaxis()->FindBin(y);
    cout << Form("event=%d, hist:%s, bin=(%d, %d), (X,Y)=(%f, %f)\n",
		 event,h->GetName(),binx,biny,x,y);
  }
}

たぶんlocate -iのような事も出来ると思うけど、それはTH1::Integral()あたりを使えばいいと思う。

2011-07-11

発生する粒子のエネルギーをマクロで与える

先日Co-60線源を作ったけど、今度は検出器全体の検出効率のエネルギー依存を調べてみようと思った。一番簡単な方法は、いろいろなエネルギーのガンマ線を等方的に発生させてピークの数を見ればよいはず。

この場合、いちいちソースに粒子のエネルギーを書いてエネルギー毎にコンパイルするのは面倒なので、マクロで粒子のエネルギーを決定する方が良い。例えばこんなマクロを書く。

/gun/energy 0.5 MeV
/run/beamOn 10000000
/gun/energy 1.0 MeV
/run/beamOn 10000000
/gun/energy 1.5 MeV
/run/beamOn 10000000
/gun/energy 2.0 MeV
/run/beamOn 10000000

/run/energyというコマンドが粒子のエネルギーの再設定コマンド。だがこれが動かない。どうも、マクロよりもvoid UserPrimaryGeneratorAction::GeneratePrimaries(G4event* anEvent) は後から呼ばれるので、ここで粒子のエネルギーを定義していると上書きされてしまうらしい。

というわけで、このGeneratePrimaries内のエネルギー設定の関する部分をコメントアウトすると、エネルギーを後からマクロで決める事が出来るようになる。この場合、逆にエネルギーを定義しないで粒子を発生させてもエネルギー0になるので注意。ちゃんとUserRunAction.ccあたりでrun毎に違うrootファイルに書き込むようにしておけば、エネルギー毎のrootファイルが出来るはず。

さすがにノートパソコンでgeantのシミュレーションをするのは無理があるかな。ファンが勢いよく回ってる。。

(追記)

example/extended/radioactivedecay/rdecay01/

に Co60.mac というのがあるのを発見。geant4には既にdecay schemeが入ってるのかな?あとで調べてみる。

(追記終わり)

2011-06-29

プロジェクトの名前変更

GEANT4で何か新たにシミュレーションをするときは、大抵誰かの書いたものやサンプルをベースにすると思う。僕も今やっているシミュレーションは、ベースの部分は他の人からもらった。

もらった時点でのメインプログラムの名前は、GeBGO.cc。GermaniumとBGOの組み合わせなのだからこんな名前なんだけど、最終的な目的のガンマ線検出器アレイの名前はすでにあって、ORGAMという。The Orsay Gamma array projectの略らしい。

The Orsay Gamma array project (PDF)

GEANT4のファイル名を見ると、たとえばsrc/ディレクトリはこんな感じ。

$ ls src/
GeBGOAnalysis.cc
GeBGOCalorimeter.cc
GeBGOEventAction.cc
...

このGeBGOの部分をOrgamにしたい、と思いshell scriptを書いてみた。プログラム内の関数名などでもこの名前を使っているので、grepで探して変更するようにしてある。

#!/bin/bash 

before=GeBGO
after=Orgam

for i in `ls $before*`
do
    mv $i $(echo $i | sed -e "s/$before/$after/")
done

for file in `grep -l $before *.cc *.hh GNUmakefile`
do
    sed -i .org "s/$before/$after/g" $file
done

rm -f *.org

適当なプログラムで細かいエラー処理とかはしてないけど、とりあえずincludeとsrcディレクトリにコピーして動かしたらほぼ問題なくコンパイル出来た。

もうすこしエレガントな方法もある気がするが、動いたので良しとする。sedって名前は知ってたけど初めて使った。


GEANT4でCo-60線源を作る

最近GEANT4のシミュレーションを始めた。ガンマ線の応答を調べたいので、とりあえずCo-60標準線源を作ってみた。線源はUserPrimaryGeneratorAction.ccで定義する。

...
#include "G4RandomDirection.hh"
...

UserPrimaryGeneratorAction::UserPrimaryGeneratorAction(UserDetectorConstruction* myDC)
{
  G4int n_particle = 1;
  particleGun = new G4ParticleGun(n_particle);

  G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
  G4ParticleDefinition* particle = particleTable->FindParticle("gamma");
  
  particleGun->SetParticleDefinition(particle);
  particleGun->SetParticleMomentumDirection(G4ThreeVector(0.*cm,0.*cm,1.*cm));
  particleGun->SetParticleEnergy(1.0*MeV);
}

UserPrimaryGeneratorAction::~UserPrimaryGeneratorAction()
{
  delete particleGun;
}

void UserPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
{
  G4ThreeVector g1direction = G4RandomDirection();
  G4ThreeVector g2direction = G4RandomDirection();

  particleGun->SetParticleEnergy(1.33*MeV);
  particleGun->SetParticlePosition(G4ThreeVector(0.*cm,0.*cm,0.*cm));
  particleGun->SetParticleMomentumDirection(g1direction);
  particleGun->GeneratePrimaryVertex(anEvent);

  particleGun->SetParticleEnergy(1.17*MeV);
  particleGun->SetParticlePosition(G4ThreeVector(0.*cm,0.*cm,0.*cm));
  particleGun->SetParticleMomentumDirection(g2direction);
  particleGun->GeneratePrimaryVertex(anEvent);
}

ガンマ線はisotropicに原点 (0,0,0) から放出される。初めは等方ランダム放射を自分で定義していたけど、G4RandomDirection.hhというのを使うのが楽みたい。あと、コンストラクタで定義するn_particleは1のままにしておく。2本同時に出るんだからと2にしたら、全部でガンマ線が4本同時に放出されてしまった。

この方法で他の標準線源も作れるとおもうけど、branching ratioとかいれなきゃならないのでちょっと面倒。いろんな人がやってるはずなので誰かソース公開していないものかと探してみたけど見つからなかった。そのうち気が向いたら作って公開するかも。

2010-06-02

GEANT4 install log on ubuntu 10.04

GEANT4をインストールしました。基本的にはこちらのサイトの簡易日本語訳みたいなものです。

404 Not Found

CLHEPのインストール

まず、CLHEPというものをインストールする必要があります。以下から最新版のソースをダウンロードします。現時点での最新版は2.0.4.6でした。

http://proj-clhep.web.cern.ch/proj-clhep/DISTRIBUTION/clhep.html

素直にディレクトリ構造などは上記のサイトに従うことにします。まずはソースを展開。

$ mkdir ~/CLHEP
$ tar zxvf clhep-2.0.4.6.tgz -C ~/CLHEP
$ cd ~/CLHEP/2.0.4.6.CLHEP/

ソースをコンパイルしてインストール。

$ ./configure --prefix ~/CLHEP
$ make -j2
$ make install

configureで指定したディレクトリに以下のファイルがあることを確認します。

  • ~/CLHEP/bin
  • ~/CLHEP/include
  • ~/CLHEP/lib

これでCLHEPのインストールは終了です。CLHEPにあるドキュメントにはmake checkをしろとあるらしいのですが、わからないなならやらなくてよい、とのこと。余計なことはしない。

GEANT4の入手

以下からGEANT4の最新版を手に入れます。現時点での最新版は4.9.3p01でした。

http://geant4.web.cern.ch/geant4/support/download.shtml

同様にディレクトリを作ってソースを展開。

$ mkdir ~/geant4
$ tar zxvf geant4.9.3.p01.tar.gz -C ~/geant4
$ cd geant4/geant4.9.4.p01/

必要に応じて追加のデータファイルをインストールします。とは言っても、どれが必要かよくわかってないので全部入れることにします。

  • G4ABLA.3.0.tar.gz
  • G4EMLOW.6.9.tar.gz
  • G4NDL.3.13.tar.gz
  • G4RadioactiveDecaly.3.2.tar.gz
  • PhotonEvaporation.2.0.tar.gz
  • RealSurface.1.0.tar.gz

それぞれをdataというディレクトリを作ってそのなかに展開します。

$ mkdir data
$ tar zxvf xxx.tar.gz -C ~/geant4/geant4.9.3.p01/data

イニシャルビルド

これからのミスは非常に面倒なことになる可能性があるので、落ち着いてコーヒーでも飲みながら(もしくはワインでも飲みながら)確実にやりましょう、とのことです。

まず、これまでにGEANT4などをインストールしてある人は環境変数を全部削除しておきましょう。僕の場合さっきUbuntuをクリーンインストールしたばかりなので空っぽなはず。一応確認。

printenv | grep G4

なんか出て来たら環境変数を決めてる場所を削除してgeant関係のなにかがないことを確認してから作業をはじめます。僕も昔インストールしたときの.bashrcの設定が残ってたので削除した。

で、Configure。

$ cd ~/geant4/gean4.9.3.p01/
$ ./Configure -build

基本的にはいはい、とEnterを押していれば良いみたいなのですが、以下の部分だけはちゃんとオプションを指定する必要があるそうです。

Could not find CLHEP installed on this system!
Please, specify where CLHEP is installed: ~/CLHEP

Enable building of the X11 OpenGL visualization driver? [n] y [ENTER]

Enable building of the X11 RayTracer visualization driver? [n] y [ENTER]

で最後にこんなメッセージが出て来たら、ENTERを押してコンパイルを開始します。

Press [ENTER] to start installation of use a shell escape to edit config.sh: [ENTER]

これでコンパイルが始まります。結構時間かかるので放置してたらエラーで停止してました。こんなエラーメッセージが出てました。

############################################################
# It looks like you had errors during Geant4 installation   
# (or interrupted installation)!				  
# Please check log file:				      	  
# /home/megumi/geant4/geant4.9.3.p01/.config/bin/Linux-g++/g4make.log					  
############################################################

ログを見るとエラーでライブラリが足りないと書いてあります。たとえばこんな感じ。

/usr/bin/ld: cannot find -lXi
collect2: ld returned 1 exit status
make[2]: *** [/home/megumi/geant4/geant4.9.3.p01/lib/Linux-g++/libG4OpenGL.so] Error 1

ライブラリが足りないみたいです。対処法は必要なパッケージをapt-getなどでインストールします。僕の環境で必要だったのは以下の二つ。

$ sudo apt-get install libxmu-dev libxi-dev

余談ですが、必要なライブラリを探すのはapt-fileというのが便利みたいです。

libxmu...の パッケージが入っているか確認する。

こんな時、apt-file をインストールしておくと便利かもしれない。

$ sudo apt-get install apt-file
$ sudo apt-file update

libXmuを探す。

si@ubuntu:~$ sudo apt-file search libXmu
[sudo] password for si: 
ia32-libs: /usr/lib32/libXmu.so.6
ia32-libs: /usr/lib32/libXmu.so.6.2.0
ia32-libs: /usr/lib32/libXmuu.so.1
ia32-libs: /usr/lib32/libXmuu.so.1.0.0
libxmu-dev: /usr/lib/libXmu.a
libxmu-dev: /usr/lib/libXmu.so
libxmu6: /usr/lib/libXmu.so.6
libxmu6: /usr/lib/libXmu.so.6.2.0
libxmu6-dbg: /usr/lib/debug/usr/lib/libXmu.so.6.2.0
libxmuu-dev: /usr/lib/libXmuu.a
libxmuu-dev: /usr/lib/libXmuu.so
libxmuu1: /usr/lib/libXmuu.so.1
libxmuu1: /usr/lib/libXmuu.so.1.0.0
libxmuu1-dbg: /usr/lib/debug/usr/lib/libXmuu.so.1.0.0
Ubuntu日本語フォーラム / コンパイル時の/usr/bin/ld: cannot find -lXmuについて

これでもう一回./Configure -buildをします。

$ ./Configure -build

今度はひたすら[Enter]を押しつづければよいです。正しくインストールできれば、以下のようなメッセージが最後に表示されるはずです。

####################################################
# Your Geant4 installation seems to be successful!  
# To be sure please have a look into the log file:  
# /home/megumi/geant4/geant4.9.3.p01/.config/bin/Linux-g++/g4make.log				  
####################################################

これでインストール終了。使い方とかはまたそのうち気が向いたから書きます。

2010-06-01

Ubuntu 10.04 LTSクリーンインストール

研究室のデスクトップパソコンはUbuntuを使っているのですが、最近10.04が出たのでクリーンインストールしました。本当はアップグレードで済ませたかったのですが、現在バージョン9.04で9.10にアップグレードした時点でいろいろと不具合が出たので、結局始めから入れ直すことにしました。こんなことなら始めから全部入れ直しておけばよかった。以下インストールログ。

インストール

入れたのはUbuntu 10.04 LTS desktop edition 64-bit。そろそろ64bitも実用出来るんじゃないかなという期待と、やっぱりせっかくあるメモリを全部使いたいという貧乏根性から。そんなにメモリを大量に使うようなことはないですが、たまにROOTで巨大なヒストグラムを大量に作ると思いのほかメモリを食ってることがあるんですよね。

インストールはEnglish環境で行いました。そもそも日本語REMIXバージョンは32bitしかありませんし、英語で使わないとうまく動いてくれないソフトがあるのです。

The leading operating system for PCs, IoT devices, servers and the cloud | Ubuntu

Homepage | Ubuntu Japanese Team

インストール自体はあっさり終了。Linuxのインストールももう10回じゃ済まないくらいやってるので、特につまずくところもなしです。ただ、ちゃんと/homeを別パーティションに切っておかなかったのは失敗だった。今回はちゃんと/と/homeを別パーティションにしておきました。/が50GB、/homeが残りというパーティション設定。この割合が適当なのかは未だによくわかりません。

インストール後再起動するとなぜかディスクチェックが始まりました。よくわからないのでそのまま放置。しばらくするとログイン画面が開いたので、とりあえずアップデートをします。今日の時点でアップデートの数は以下の通り。

3 new packages will be installed

112 packages will be upgraded

ソフトのインストール (apt-get)

さて、必要なソフトのダウンロードとインストール。まずはapt-getで入れられるもの。パッケージ名を載せておく。

emacs emacs-goodies-el elscreen

基本。とりあえずこれがないと仕事できない。

gnuplot gnuplot-mode

簡単な図を書くときは結局シンプルなソフトが一番。確かにROOTは何でも出来るけど、とにかくすぐに絵を作るときはgnuplotの方が便利だったりする。

tgif inkscape

tgifは簡単な回路図とかを書くのに使ってる。inkscapeはもう少しいろんなことが出来るけどあまりつかってないな。PDFに文字を書き込むのとかに使ってる。

texlive texlife-bibtex-extra texlive-fonts-extra texlive-formats-extra texlive-latex-extra texlive-publishers texlive-science

適当に必要そうなパッケージを入れる。

jabref

論文の管理にはこれが便利。

wine

後述のLISE++とSRIMをインストールするのに使う

ソフトのインストール (その他)

次にダウンロードしてインストールするもの

Google Chrome

パソコン版 Chrome

最近はブラウザはfirefoxじゃなくてchromeを使ってる。たぶんfirefoxよりは速い。googleのページからdebファイルを拾ってきてダブルクリックすれば勝手にインストールしてくれる。

Dropbox

Dropbox Business

最近は必要なファイルは全部これに入れているので、面倒なバックアップを考えなくて済んでる。.bashrcや.emacsといった初期設定ファイルもこれに入れることで、どのパソコンでもだいたい同じような環境で仕事出来るようにしている。もっともmacとlinuxでは完全に同じことは出来ないんだけど。

インストールはubuntu x86_64版のdebファイルをダウンロードして来て実行するだけ。昔は自分でリポジトリの設定をする必要があった気がするけど、最近はdebファイルを実行するだけで自動的にリポジトリを登録してくれるみたいです。上のgoogle chromeも同様。

ROOT

ROOT a Data analysis Framework | ROOT a Data analysis Framework

インストール方法は昔書いた。

ROOTのインストール - にいくらの日記

Ubuntuにインストールする場合に、追加でインストールしておく必要があるパッケージが書いてあるページを見つけた。

Build Prerequisites | ROOT a Data analysis Framework

optionalを含めて全部インストールしておいた。たぶん全部は必要ないけど、あとになって何が足りないとか思うくらいならディスクスペースは余裕ある筈なので全部入れてしまった方が楽だと思ってる。

一応コマンドだけ書いておく。

$ tar zxvf root_v5.27.02.source.tar.gz
$ cd root
$ ./configure --prefix
$ make -j2
$ sudo make install

前回書いたときは./configureでlinuxと入れたが、今回は64bitなのでlinuxx8664gccとなる。入れなくても勝手に推測してくれた。あとはmakeに-j2といれるとCPUを2つ使ってくれるのでちょっと得した気分になれる。

LISE++

no title

もはや原子核実験屋さんの必須ツールとなってる。いろいろ出来る。

wine経由で入れる。が、なんか10.04になってポリシーが変わったみたいで単純にexeファイルは実行出来なくなっている。

Security/ExecutableBit - Ubuntu Wiki

ファイルのパーミッションをchmodとかで実行可能(+x)にすれば、wineがインストールされている状態ならファイルマネージャでダブルクリックで自動的にwineが起動してインストール出来るようになる。

SRIM & TRIM

James Ziegler - SRIM & TRIM

これが英語版を使っている原因。TRIMは日本語版では動かない。windowsでは回避方法があるのをどこかで見たことがあるが、linuxでwine経由で使っている場合おそらく解決策は英語バージョンで使うことが一番手っ取り早い。

GEANT4

Geant4: A toolkit for the simulation of the passage of particles through matter

これが一番の難関。後で別エントリにして書くかも。

日本語環境の整備

最近はLinuxでも日本語環境を整備するのはそんなに大変ではなくなっている気がします。とはいえ、やっぱりemacsやlatexで日本語環境を作ろうとするとたまにはまることがあります。基本的に僕の今の状況ではプログラムと論文は日本語環境が必要になることはないので、ウェブやメールを使うときにとりあえず日本語が使えればよいというレベルで日本語環境を整えることにします。

Ubuntuの日本チームのページに方法が書いてあるので、この通りにします。

Ubuntuの日本語環境 | Ubuntu Japanese Team

何が必要かなど考えるのが面倒だったので、素直にubuntu-desktop-jpを入れるだけにしました。たぶんこれで大抵のことは困らないはずです。と思ったら、システムフォントがおかしいままだった。以下のサイトを参考に設定をすることで解決。

ページが見つかりません - エキサイト

その他

あとはオンデマンドで対応。