Geant4 based
Full Simulator
Jupiter
2007/02/25
ILC物理、測定器シミューレション講習会
Hiroaki Ono
Niigata University
内容
Jupierとは?
Jupiterの使い方
‒ 入手方法とセットアップ
‒ Jupiterのみの使用
‒ JSFJ4としてJSFを通して使う場合
Jupiterへの検出器ジオメトリの実装
‒ 新しい検出器を作る場合
‒ ジオメトリ
‒ ヒットとSD (Sensitive Detector)
1. Jupiterとは?
Geant4をベースとしたILC実験用GLD検出器シミュレータ
(SimToolsのうちの一つ)
検出器パラメータ、ジオメトリの変更やインストール、アンイン
ストールが簡単に行えるように構築
現在IceCube実験に所属している保科琴代さんとKEKの藤井
恵介さんがコアデベロッパ
ソースはC++で記述
JUPITER
↓
JLC Unified Particle Interaction
and Tracking EmulatoR
GLD Simulation/Analysis Tools
JUPITER
JLC Unified Particle Interaction and Tracking EmulatoRIO
Input/Outputmodule set
URANUS
Monte-Calro Exact hits
To Intermediate Simulated output Unified Reconstruction and ANalysis Utility Set METIS
Satellites
Geant4 based
Simulator
JSF/ROOT based
Framework (JSFJ4)
MC truth generator Event Reconstruction
Tools for Full Simulation For real data
Full Geometry/MC generator
Clustering/smearing
Library Extension
for
Data Analysis
Jupiter Feature
Run mode:
– A standalone Geant4 application (Geant4.8.0.p01)
– JSF application to output a ROOT file (JSFJ4).
Input:
– StdHep (ASCII/Binary), HepEvt, CAIN, or generators
implemented in JSF
Output:
– Exact Hits of each detectors (Smearing in Satellites)
– Format: ROOT (standard), ASCII (debug), LCIO
Physics List
– LCPhysicsList, QGSP, LHEP, …
Geometry:
Jupiterのディレクトリ構造
Jupiter
bin
lib
macros
data
config
source
kern
main
lcexp
bd
cal
clx
it
vtx
mud
sol
tpc
fcal
bcal
cdc
•Base class
•G4継承 class
•PhysicsList
ct
ir
Sub Detector Geometry
exmaples
ParameterList Run macros
Current Jupiter Geometry
MUD
SOL
CLX
TPC
VTX&IT
FCAL
BCAL
VTX
IT
Detail of Detector Geometry
210
280
350
765
r-phi view
r-z view
ECAL
HCAL
TPC
VTX & IT
SOL
MUON
420
800
Unit : [cm]
40
Sub Detectors in Jupiter
3Tesla
Solenoid Magnet (SOL)
Fe(20mm)/Sci(5mm)/Readout(1mm) 5.7λ, 46 sampling layers HD Calorimeter (CAL/CLX) Rin = 2.1m W(3mm)/Sci(2mm)/Readout(1mm). 26X0, 33 sampling layers EM Calorimeter (CAL/CLX) Muon (MUD) R=40-205cm, L=230cm
Gas P10, 200 Radial sampling, Central Tracker (TPC)
Barrel: 4 layers, Si Cylinder, R=9-37cm Endcap: 7 layers, Si disk, Z=20-140cm Intermediate Tracker (IT)
6 layers, R=2-5cm, Si=50µm, |cosθ|<0.9 Cylindirical shape (not FPCCD for now) Vertex Detector (VTX)
Feb.25.2007 Jupiter Lecture 10
Calorimeter Geometry (CAL/CLX)
Full One Tower EM + HD 27 X0 6.1λ
Barrel block
Endcap block
EM
: W/Sci/Air=3/2/1mm 33 layer (r)
HD : Fe/Sci/Air=20/5/1mm 46 layer (z)
CAL (Tower Shape)
2. Jupiterの使い方
Jupiter 単独の場合
– Geant4 (jlclogin2:/proj/soft/ext/g4)
– CLHEP (jlclogin2:/proj/soft/ext/clhep)
– Jupiter (jlclogin2:/proj/sort/Release/1.XX/Jupiter)
JSFJ4 with JSF (ROOT output)
– JSF (jlclogin2:/proj/sort/Release/1.XX/jsf)
– Satellites (jlclogin2:/proj/sort/Release/1.XX/Satellites)
– Uranus (jlclogin2:/proj/sort/Release/1.XX/Uranus)
Jlclogin2上であればReleaseVersionを使うのが楽
– /proj/soft/Release/1.XXから setup.bash をコピー
もちろん自分でコンパイルしても使用可能
環境変数の設定
(setup.bash)
export LC_RELEASE=1.34 export LC_RELEASE_DIR=/proj/soft/Release/$LC_RELEASE export ROOTSYS=/proj/soft/ext/root/5.10.00 export G4INSTALL=/proj/soft/ext/g4/geant4.8.0.p01 export LCIO=/proj/soft/ext/lcio/v01-06 export JDK_HOME=$LC_RELEASE_DIR/JDK/j2sdk1.4.2_08 export CERN_ROOT=/proj/soft/ext/cernlib/2005 export CLHEP_BASE_DIR=/proj/soft/ext/clhep/1.9.2.2 export CLHEP_INCLUDE_DIR=$CLHEP_BASE_DIR/include export LCBASEDIR=$LC_RELEASE_DIR/lcbase export LEDAROOT=$LC_RELEASE_DIR/Leda export LCLIBROOT=$LC_RELEASE_DIR/lclib export JSFROOT=$LC_RELEASE_DIR/jsf export KFLIBROOT=$LC_RELEASE_DIR/physsim export JUPITERROOT=$LC_RELEASE_DIR/Jupiter export SATELLITESROOT=$LC_RELEASE_DIR/Satellites export URANUSROOT=$LC_RELEASE_DIR/Uranus setup.bash 4.8.0.p01以降の バージョンでは 結果がおかしい? (2007/02/25) SimToolsについては 全てCVSでソース管理 されているので、 自分でCVS版を持ってくる ことも可能。 SimToolsCVS版の取得方法
Jlclogin2上で使用する場合
% cvs -d :pserver:anonymous@jlccvs.kek.jp/home/cvs/soft login
password : <return>
% cvs -d :pserver:anonymous@jlccvs.kek.jp/home/cvs/soft co Jupiter
% export CVSROOT=/proj/soft/CVSMASTER
% cvs co Jupiter Satellites Uranus jsf
外部から使用する場合
‒
http://jlccvs.kek.jp/cgi-bin/cvsweb.cgi/
から取得可能
‒ブラウザを使わずに anonymous CVS で取得することも可能
CVS版ファイルの更新(commit)等もCVSを使って管理
Jupiter を単体で使う場合
Jupiterを単体で使用するの場面は少ない
‒ DAWNを使ってジオメトリの絵を表示させたい(後述)
‒ 新しくインストールしたモジュールのテスト
ジオメトリファイル(geomfile)、G4macroを読み込んで起動
% ./bin/Linux-g++/Jupiter [-f geomfile] [g4mac]
${JUPITERROOT}/macro以下に絵を描く macro が用意されている
% ./bin/Linux-g++/Jupiter
>/control/execute macros/visdawnf.g4mac
>/control/execute macros/view.g4mac
JupiterをJSFを介して動かす場合
JupiterはJSFJ4として使うのが一般的
Satellites/examples/SimTools/exam01,02 が例題
‒ exam01 : single particle event
‒ exam02 : e+e-->gamma/Z->qq event
‒ jsf.conf, rungun.mac で生成イベントを指定
Interactive mode (Use GUI event display)
% jsf gui.C
Batch mode
% jsf -b -q --maxevt=3 --g4macro=rungun.g4mac gui.C
% jsf -b -q --OutputFile=jsfj4.root -conf=jsf.conf gui.C
JSFJ4の設定ファイル
JSFGUI.SimulationType: 3
# Simulation type = 3 for JSFJ4 simulation
JSFGUI.RunMode:1
#!runmode
# = 1 Generate event. # = 2 Read root file.
JSFJ4.UseJupiterGenerator:Yes/No #!generator JSFGUI.Pythia.Decay.Z:-2 #!zdcay JSFGUI.Pythia.Process.gammaZ:1 #!gammaz
jsf.conf
Jupiterで実装された
Generator を使うか指定
/gun/number 1 /gun/particle mu-/gun/energy 5 GeV /gun/direction 1.0 0. 0. /gun/position 0. 0. 0. m /jupiter/generator ParticleGunrungun.mac
e+e-->gamma/Z->qq
$JSFROOT/macro/InitPythia.C
にJSFでのPythia Generatorの情報
JSFJ4の追加設定
JSFJ4.ParameterTable:gldaug06_2m.dat #geom JSFJ4.HasCAL:No #hascal JSFJ4.HasCLX:Yes #hasclxjsf.conf
Geometryパラメータファイルを
変更して読み込ませる場合
検出器モジュールを
使わなくすることも出来る
jsf.conf パラメータの詳細については以下を参照
$JSFROOT/macro/default.conf (default)
http://acfahep.kek.jp/subg/sim/simtools/jsfparam.html
3. Jupiterへの検出器実装方法(calを例に)
1.
Sub Detector BaseClass作成 (他検出器からコピー)
̶
J4V
CAL
DetectorComponet
̶
J4V
CAL
MaterialStore
2.
Component の実装 (J4
CAL
, J4
CAL
ParameterList)
‒
Assemble() : ParameterTableへの追加, Solidの選択、作成
‒
InstallIn(), Cabling() : Solidの配置
3.
Hit/SD(SensitiveDetector)の構築 (J4
CAL
Hit, J4
CAL
SD)
‒
Hit type (Track/CAL)、 残す情報の選択
‒
Pre/PostHitなどの付加的情報
4.
main関数への登録
5.
Satellites以下の実装 (
JSFJ4で動かすため)
‒
io/mctruth, metis/XXX/hitmaker
‒
io/jsfj4/JSFJupiter
Jupiter Base Class
J4VComponent
virtual InstallIn( mother, pRot, tlate, copyNo)=0 virtual Assemble()=0 virtual Cabling() OutPutAll() virtual OpenMaterialStore() J4VDetectorComponent J4VCALDetectorComponent J4VSD J4VSensitiveDetector MakeHitBuf() OutputAll() OutputAll() OpenMaterialStore() G4VSensitiveDetector J4VHit G4VHit J4CALMaterialStore Create(name) J4VMaterialStore Order(matelial) CAL Detector Base Class
J4CALSD
Sub Detector ディレクトリの中
J4VCALDetectorComponent.hh/cc
J4CALMaterialStore.hh/cc
J4CAL.hh/cc
J4CALParameterList.hh/cc
J4CALSD.hh/cc
J4CALHit.hh/cc
J4VDetectorComponetの継承クラス ユーザーが定義するマテリアル 検出器本体の実装(PV,LV,Solid) 各種パラメータ J4VSDの継承、SDの実装 J4VHitの継承、Hitの実装 これらのファイルは、他の検出器からコピーして 名前を付け替えて使うのが早道 J4CALLayer.hh/cc 娘ボリュームJupiter/source/cal/{src,include}
src : ソース include : ヘッダファイルSub Detector Base Class
J4VCALDetectorComponet (J4VCompoentを継承)
‒ Sub Detector Group名 ( CAL ) を設定
‒ OpenMaterialStore() の実装
J4CALMaterialStore (J4VMaterialStoreを継承)
‒ 基本的な物質はJ4MaterialCatalogで定義されている
(Sci,Pb,Si,Fe,Air
)
‒ OpenMaterialStore()->Order( Carbon )で呼び出して使う
‒ 混合ガス等定義されていないものを使う場合には
Create() 関数内で定義する
‒ Geant4で物質を作るのと同じ
Installation of Components
J4CAL の中身
J4CAL::J4CAL( J4VDetectorComponent* parent, G4int nclones, G4int nbrothers, G4int me,
G4int copyno ) : J4VCALDetectorComponent( fFirstName, parent,
nclones, nbrothers, me, copyno ) G4String J4CAL::fFirstName( CAL" );
virtual Assemble()
virtual Cabling()
virtual InstallIn()
名前の宣言Logica Volumeの生成、Solidの作成
Physical Volumeの生成 (配置)
SDの生成、登録
Pure virtual
なので必ず実装しなければならない
(1). Assemble() 関数
void J4CAL::Assemble() {
if ( !GetLV() ) {
J4FWParameterList *list = OpenParameterList(); G4double rmin = list->GetCALInnerR();
G4double rmax = list->GetCALOuterR(); G4double len = list->GetCALHalfZ(); G4double dphi = 360.*deg;
// MakeSolid ---//
OrderNewTubs( rmin, rmax, len, dphi ); // MakeLogicalVolume --// MakeLVWith(OpenMaterialStore()->Order(list->GetCALMaterial())); // SetVisAttribute ----// PaintLV(list->GetCALVisAtt(), list->GetCALColor());
単なるシリンダー
Solidを作る
物質名を渡して
LVを作成
rmax len rmin dphiSolidの作成、LogicalVolumeの作成
Solidの作り方 1 (基本図形)
G4Box (四角)
G4Sphere (曲面)
G4Trap (台形)
// MakeSolid ---//
G4Box* box = new G4Box( GetName(),halfX, halfY, halfZ ); Register( box );
SetSolid( box );
Assemble()関数内でG4VSolid継承クラスを使ってSolidを作る
̶CSG, specific, BREPS, Bolean, STEP
http://www-jlc.kek.jp/~hoshina/geant4/Geant4Lecture2003/2-2b.html
// MakeSolid ---//
G4Sphere* cone = new G4Sphere( GetName(), rmin, rmax, sphi, dphi, stheta, dtheta );
Register(cone);
SetSolid(cone);
自分でSolidを作成した場合には
Register(solid)
SetSolid(solid)
Solid の作り方 2 (便利な関数)
rmax
halfZ
rmin
totalphi
endcaprmin
OrderNewTubs(rmin, rmax, halfZ, totalphi, endcapHalfThick,
endcaprmin, sphi ))
Endcap付きシリンダーの作成(Endcap無しも可能)
Register()
SetSolid()
Solid の作り方 3 (その他)
基本図形に無い複雑な形状は
Boolean Solid
を用
いて Solid を付けたり切り抜いたりして作る
G4VSolid* solid1 = new G4Tubs( solid1 , rmin1, rmax1, halfL1, sphi, dphi ); G4VSolid* solid2 = new G4Tubs( solid2 , rmin2, rmax2, halfL2, sphi, dphi );
G4VSolid* solidUnion = new J4UnionSolid( Union , solid1, solid2, rotMat, transV ); Register( solidUnion );
SetSolid( solidUnion );
例) シリンダーにシリンダーがくっついたような形状を作る
シリンダーは G4Tubs で作ることが出来る。
Daughter Volumes
J4CAL の内部に layer 構造を作る場合
J4CALLayer を作成し、J4CAL の Assemble() 関数内でオブジェクトを生成
J4FW::Assemble() { // MakeSolid ---//
OrderNewTubs( rmin, rmax, len, dphi ); // MakeLogicalVolume --//
MakeLVWith(OpenMaterialStore()->Order(list->GetFWMaterial())); // SetVisAttribute ----//
PaintLV(list->GetFWVisAtt(), list->GetFWColor()); J4FWLayer* fLayers = Create( this, nLayers ); Register( fLayers );
fLayerss -> InstallIn( this );
SetDaughter( fLayers ); 娘ボリュームのInstallIn()関数
親のボリュームから はみ出してはいけない
(2). InstallIn() 関数
一つのオブジェクトを n分割して作成する。
void J4CAL::InstallIn( J4VComponent* /* mother */, G4RotationMatrix* /* prot */, const G4ThreeVector& /* tlate */) {
Assemble(); SetPVPlacement(); または
SetPVReplica();
// Cabling function for SD object... //Cabling(); } 1 2 n オブジェクトを 一つ一つ配置していく 1
InstallIn()関数は親のコンポーネントの中で
呼ばれることに注意
Assembleがここで呼ばれる 同じ形状をたくさん並べる場合 メモリーを1/nに節約 PVPlacement PVReplicaPVPlacement
J4CAL::Assemble( component, ) { for ( G4int i = 0; i < nLayers; i++ ) {
J4CALLayer* Layer = new J4CALLayer( this, 1, nLayers, i ); ....
Layer -> InstallIn( this ); } } PVPlacement
Placementで置く場合には
親のAssemble()関数の中で娘オブジェクトを作る際に
引数にnbrothers, copyNoを与える。nClonesは1になる。
J4CALLayer::InstallIn() {
SetPVPlacement( rotationMatrix, tlateVector );
(回転させながら置くことも可能)
}
2 n
PVReplica
Replicaで配置する場合は
親のAssemble()関数の中で娘オブジェクトを作る際に
引数に
nClones(分割数)
を与え、
SetPVReplica()関数には分割方向、分割ステップを与える
PVReplica 1J4CALLayer::InstallIn() {
Assemble();
SetPVReplica( 分割方向, 分割ステップ, offset );
}
J4CAL::Assemble() {
...
J4CALLayer* fLayers = new J4CALLayer( this, nphi ); fLayers->InstallIn(this);
...
(3). Cabling() 関数
Hit情報を残すためにSD登録を行なう
SD登録は Cabling() 関数を実装することで行なう
void J4CAL::Cabling() { if ( !GetSD() ) {J4CALSD* sd = new J4CAKSD( this ); Register( sd ); SetSD( sd ); } }
Hit情報を残すコンポーネントは全
てSDを作る必要がある。
LayerのHit情報が欲しければ、
J4CALLayerSD/J4CALLayerHit
を作成する。
J4CAL.cc/hh 内で実装するのは
最低限
1. Assemble()
2. InstallIn()
3. Cabling()
ParameterList
J4ParamterTable()::GetValue( J4CALXX ,value)*cm; を使っ
て、パラメータをファイルから読み込むことが可能
void J4CALParameterList::SetMaterial(){
fCALMaterial = J4ParameterTable::GetValue("J4CAL.Material", scintillator"); ... } void J4CALParameterList::SetParameters(){ fCALOuterR = J4ParameterTable::GetValue("J4CAL.OuterR",100.0)*cm; .... } J4CALParameterList::SetVisAttributes() { fCALVisAtt = J4ParameterTable::GetValue("J4CAL.VisAtt",false); .... } void J4CALParameterList::SetColors(){ std::vector<double> col; col=J4ParameterTable::GetDValue("J4CAL.Color","1.0 0.0 0.0 1.0",4); SetCALColor( G4Color( col[0], col[1], col[2], col[3] ) );
Components 例 (CLX)
(4). Hits/SD
J4CALHit (Hit implementation, J4VHitを継承)
J4CALSD (Sensitive Detector, J4VSDを継承)
J4CALSD.hh (ヘッダファイル)
class J4CALSD : public J4VSD<J4CALHit> { public:
J4CALSD( J4VDetectorComponent* detector ); ~J4CALSD();
virtual G4bool ProcessHits( G4Step* aStep, G4TouchableHistory* ROhist ); virtual void Initialize ( G4HCofThisEvent* HCTE );
virtual void EndOfEvent ( G4HCofThisEvent* HCTE );
virtual void OutputAll( HCTE ) { J4VSD<J4CALHit>::OutputAll( HCTE ) } };
Hits
J4VHitに渡すもの以外に保存するべきヒット情報等
をデータメンバとして持つ
J4CALHit::J4CALHit( J4VComponent* ptrDetector, // He is in "location" now G4int preHitID, // pre Hit ID
G4int cellID, // cell address id
G4bool isEM, // ( 0, 1 ) = ( HD, EM )
G4bool isBarrel, // ( 0, 1 ) = ( Endcap, barrel ) G4double edep, // Energy Deposit
G4double tof, // TOF
G4ParticleDefinition* particle, // Particle data
const G4ThreeVector& Xcm, // Edep*position vector const G4ThreeVector& Xcell ) // cell center position) : J4VHit( detector, trackID, mothertrackID, particle, tof, edep, totalE, momentum, pre, pos ),
SD
ProcessHits() の実装がメイン
G4bool J4CALSD::ProcessHits(G4Step *aStep, G4TouchableHistory *) {
//In order to use Get function, you must call SetNewStep() at first. SetNewStep(aStep)
J4VComponent* location = GetComponent(); G4int trackID = GetTrackID();
G4int mothertrackID = GetMotherTrackID(); G4ParticleDefinition *particle = GetParticle();
G4double tof = GetTof(); ....
J4CALHit* hit = new J4CALHit( location, trackID, mothertrackID, particle, tof, edep, etot, p, pre, pos);
((J4CALHitBuf*)GetHitBuf())->insert( hit ); return true;
SDの例 (CALSDs)
SubLayerSD Layer Active Abs PreHit PostHit CALSD Hit(5). main/Jupiter
ここに登録して実装終了
#define __INSTALLIR__
#define __INSTALLBD__
#define __INSTALLVTX__
#define __INSTALLIT__
#if 0
#define __INSTALLCDC__
#else
#define __INSTALLTPC__
#endif
#define __INSTALLCAL__
#define __INSTALLSOL__
#define __INSTALLMUD__
#ifdef __INSTALLFW_J4CAL *calptr = new J4CAL();
calptr->SetMother(dtcptr->GetEXPHall()); dtcptr->AddComponent(calptr);
#endif
Install したり
(6). Satellites for JSFJ4
JSFJ4を使ってJSF越しにJupiterを動かすためには
以下の実装が必要
‒ Satellites/io/mctruth/cal/
• S4CALExactHit, S4CALMCTruth, S4CALMCTruthBuf
‒ Satellites/io/jsfj4
• JSFJupiter
‒ Satellites/metis/cal/hitmaker
• hitmaker/, trackmaker/(for track), analysis/
Geometry viewer DAWN
このようなGUIが立ち上がるので、カメラの方向や位置、 モード(wireframe, surface 等)選ぶ ビューモード ズームアップ カメラで見る向き polar 90 なら横から% dawn XXX.prim
Geometry cut viewer ‘Dawncut’
dawncut で完成した prim file を x, y, z 平面でカット
% dawncut a b c d g4_00.prim input.prim cut.prim
( ax+by+cz+d = 0 平面でカット )
How to make 3D Cut View?
dawncut で作ったファイルをくっつければ良い
http://www.hep.sc.niigata-u.ac.jp/~ono/acfa-sim-j/Jupiter/mkcutview.sh
#!/bin/sh
dawncut 1 0 0 0 ${inFile} x-.prim dawncut -1 0 0 0 ${inFile} x+.prim dawncut 0 0 1 0 x+.prim x+z-.prim dawncut 0 1 0 0 x+.prim x+y-.prim dawncut 0 -1 0 0 x+.prim x+y+.prim dawncut 0 0 1 0 x-y+.prim x-y+z-.prim head -6 x-.prim > ${outHalfFile}
for prim in "x-.prim x+z-.prim"; do cat ${prim} | grep -v "!" | grep -v "/BoundingBox" >> ${outFile} done
tail -3 x-z-.prim >> ${outHalfFile}