LCツール講習会 Jupiter part 2005/06/06 LC tools lecture @kek Hiroaki Ono Niigata University [email protected] 2005/06/06 LC tools lecture, Jupiter part 1 Contents 1. Jupiterの全般について 1. Jupiterとは 2. ドキュメントなど 3. セットアップ、CVSなど 2. Jupiterで新しい検出器を作る 1. 2. 3. 4. 2005/06/06 Forward CAL(fw)を例えば作るとしたら J4FW部分の実装方法 CALのジオメトリを例として SD登録とHit(軽く) LC tools lecture, Jupiter part 2 Jupiterとは? JUPITERとは JLC Unified Particle Interaction and Tracking EmulatoR の略で Geant4をベースとしたLC実験用シミュレータです。 LC実験の検出器パラメータ、ジオメトリの変更、 インストールを簡単に行えるように構築されています (現千葉大学の保科琴代さんが作成) 2005/06/06 LC tools lecture, Jupiter part 3 シミュレーションツール群 For real data Tools for simulation Tools JUPITER JLC Unified Particle Interaction and Tracking EmulatoR Full geometry/mc generator Geant4 based Simulator MC truth generator 2005/06/06 Satellites IO LEDA Input/Output module set Library Extention for METIS Data Analysis URANUS Unified Reconstruction and ANalysis Utility Set Monte-Calro Exact hits To Intermediate Simulated output Clustering/smearingJSF/ROOT based Framework Event Reconstruction LC tools lecture, Jupiter part 4 Jupiterに関するドキュメント • Jupiterのマニュアルについて(Japanese) 保科さんが書いたマニュアルを以下に置きました。 http://www.hep.sc.niigata-u.ac.jp/~ono/acfa-sim-j/Jupiter_manual.pdf 保科さんの昔のホームページにもいくつかドキュメントが残って います。 http://wwwjlc.kek.jp/~hoshina/cdc/geant4/diary/diary.htm • Geant4のジオメトリ、ヒットの実装について Geant4 lecture 2003のページが役に立ちます。 http://geant4.kek.jp/g4users/tutorial03/ 私の説明で足りない部分はこれらを参考にしてみてください。 2005/06/06 LC tools lecture, Jupiter part 5 JupiterのSetup • Jupiterでは以下のツールが必要です。 – Geant4 (G4INSTALLなどいろいろ) – CLHEP (CLHEP_BASE_DIR) • 環境変数としてJUPITERROOTを設定する必 要があります。 % export JUPITERROOT=${HOME}/Jupiter(bash) % setenv JUPITERROOT ${HOME}/Jupiter(csh) 等とします。 2005/06/06 LC tools lecture, Jupiter part 6 CVSによるファイルの管理 CVSでファイルを入手できます。 jlclogin上で持ってくるには % cvs co Jupiter 外部から持ってくるには % cvs -d :pserver:[email protected]/home/cvs/soft login password : <return> % cvs -d :pserver:[email protected]/home/cvs/soft co Jupiter ファイルのアップデートは % cvs update ファイルのコミットは % cvs commit filename 2005/06/06 CVSでファイルは管理されており 最新のファイルを入手できます LC tools lecture, Jupiter part 7 Jupiterのディレクトリ構造 CVSでファイルは管理されており 最新のファイルを入手できます PhysicsListやG4の継承クラス 2005/06/06 ユーザーが変更する部分 LC tools lecture, Jupiter part 8 新しい検出器の作成 たとえば forward cal(fw) を作るとしたら? 1. source ディレクトリの中に新しく fw を作成。 2. source/Makefile に fw を追加。 3. source/ 以下に fw/src、fw/include を作る。 4. Detector componet, Solidを実装。(Geometry) 5. SD (Sensitive Detector)とHit を実装。 6. source/main/Jupiter.cc の中に fw を追加。 7. テストランとジオメトリのチェック。 2005/06/06 LC tools lecture, Jupiter part 9 Jupiter ベースクラス G4VSensitiveDetector J4VComponent virtual InstallIn( mother, pRot, tlate, copyNo=0 )=0 virtual Assemble()=0 Virtual Cabling() Virtual OpenMaterialStore() OutPutAll() static GetDCPtrByName(detectorname) J4VDetectorComponent J4VSensitiveDetector OutputAll() J4VSD J4VHit MakeHitBuf() OutputAll() G4VHit J4VFWDetectorComponent J4VFWMaterialStore J4VMaterialStore OpenMaterialStore() Create(name) Order(matelial) virtual Create(name) 2005/06/06 LC tools lecture, Jupiter part 10 FW検出器の実装 source/fw ディレクトリ以下に最低限必要なファイル J4VFWDetectorComponent.hh/cc J4FWMaterialStore.hh/cc J4FW.hh/cc J4FWParameterList.hh/cc J4VDetectorComponetの継承クラス ユーザーが定義するマテリアル 検出器本体の実装(PV,LV,Solid) 各種パラメータ J4FWLayer.hh/cc 娘ボリューム Hit情報を残すのであれば J4FWSD.hh/cc J4FWHit.hh/cc J4VSDの継承、SDの実装 J4VHitの継承、Hitの実装 これらのファイルは、他の検出器からコピーして 名前を付け替えて使うのが早道です。 2005/06/06 LC tools lecture, Jupiter part 11 1. 検出器 base class の実装 検出器の base class を作成する際にはJ4VComponentを継承して作ります J4VComponent fDaughters (娘Components) fMother (親Component) fSD (Sensitive Detectorへのポインタ) fNbrothers (同じクラスから作られたオブジェクトの数) fNclones (Copy, Replicaで作られたオブジェクトの数) fMyID (fNbrothersの何番目か) fCopyNo (コピーされた場合のコピーナンバー) 新しく検出器 base class を作成する際には、 これらの引数をJ4VComponentに渡してやる必要があります。 実際には他の検出器のものをコピーして名前を変えただけで動くと思います。 J4VCALDetectorComponet -> J4VFWDetectorComponent 2005/06/06 LC tools lecture, Jupiter part 12 2. J4VFWDetectorComponentの実装 J4VFWDetectorComponet.cc の中身 #include “J4VFWDetectorComponent.hh” J4FWMaterialStore* J4VFWDetectorComponet;;fgMatrialStore=0; G4String J4VFSDetectorComponent::fgSubGroup(“FW”) J4VFWDetectorComponent( const G4String &name, J4VDetectorComponent *parent, G4int nclones, G4int nbrothers, G4int me, G4int copyno ) : J4VDetectorComponent( fgSubGroup, name, parent, nclones, nbrothers, me, copyno) J4VMaterialStore* J4VFWDetectorComponet::OpenMaterialStore() { fMaterialStore = new J4FWMaterialStore(); } 2005/06/06 LC tools lecture, Jupiter part staticで名前の宣言 先程のbase class J4VDetectorComponet に渡す。 MaterialStoreをnew 13 3. J4MaterialStoreの実装 J4FWMaterialStore.cc の中身 #include "J4FWMaterialStore.hh" #include "G4Element.hh" #include "G4Material.hh" G4Material* J4FWMaterialStore::Create( const G4String& /*name*/, G4MaterialPropertiesTable * /* mtable */ ) { G4Material* material = 0; J4MaterialCatalogにないものは return material; 自分でここで作成しておく } 基本的な物質はJ4MaterialCatalogに入っているので (scintillator, Pb, Fe, Si...)componetを作る際には OpenMaterialStore()->Order(“scintillator”)とするだけで良い。 混合ガスなど定義されていないものを使うときははここで定義しておく。 G4でMaterialを作るときと同じ要領。 2005/06/06 LC tools lecture, Jupiter part 14 4. Componentの実装 ついに検出器コンポーネントの実装です。J4FW.cc の中身です。 G4String J4MUD::fFirstName( “FW" ); staticで名前の宣言 J4FW::J4FW( J4VDetectorComponent* parent, コンストラクタの引数 G4int nclones, G4int nbrothers, 先程のベースクラス G4int me, J4VFWDetectorComponet G4int copyno ) に引数を渡す。 : J4VFWDetectorComponent( fFirstName, parent, nclones, nbrothers, me, copyno ) Assemble() Logica Volumeの生成、Solidを作成する Cabling() SDの生成、登録 Physical Volumeの生成 これらの関数の実装で Componetの作成、SD登録を行います。 LC tools lecture, Jupiter part 15 必ず実装する必要があります。 InstallIn() 2005/06/06 5. Assemble()関数の実装 void J4FW::Assemble(){ 2重に作るのを防ぎます。 if ( !GetLV() ) { J4FWParameterList *list = OpenParameterList(); len G4double rmin = list->GetFWInnerR(); parameters G4double rmax = list->GetFWOuterR(); G4double len = list->GetSOLHalfZ(); dphi G4double dphi = 360.*deg; // MakeSolid ----------// OrderNewTubs( rmin, rmax, len, dphi ); rmax rmin Solidを作ります。 単なるシリンダーを 簡単に作成できます。 // MakeLogicalVolume --// MakeLVWith(OpenMaterialStore()->Order(list->GetFWMaterial())); // SetVisAttribute ----// PaintLV(list->GetFWVisAtt(), list->GetFWColor()); } } 2005/06/06 表示の設定です。 LC tools lecture, Jupiter part 物質名を渡して LVを作ります。 16 6. Solidの作り方 (OrderNewTubs()) 便利な関数の使い方 OrderNewTubs( rmin, rmax, halflenZ, totalPhi, endcapHalfThick, endcaprmin, sphi ) halflenZ エンドキャップつきの シリンダーを作成できます。 totalPhi rmax rmin endcaprmin エンドキャップ無しの シリンダーも作成可能です。 endcaHalfThick 2005/06/06 LC tools lecture, Jupiter part 17 Solidの作り方 (一般) Assemble()関数内でG4VSolid継承クラス (CSG,specific,BREPS,Bolean,STEP)から適切なものを選んで作る http://www-jlc.kek.jp/~hoshina/geant4/Geant4Lecture2003/2-2b.html が参考になります。 // MakeSolid ----------// G4Box* box = new G4Box( GetName(),halfX, halfY, halfZ ); Register( box ); SetSolid( box ); G4Box (四角) G4Sphere (曲面) G4Trap (台形) // MakeSolid ----------// G4Sphere* cone = new G4Sphere( GetName(), rmin, rmax, sphi, dphi, stheta, dtheta ); Register(cone); 自分でSolidを作成した場合には SetSolid(cone); Register(solid) SetSolid(solid) 関数を呼んで登録する 2005/06/06 LC tools lecture, Jupiter part 18 Solidの作り方 (その他) 基本図形にない複雑な形状は Boolean Solid を用いて Solidをくっつけたり切り抜いたりして作る 例) シリンダーにシリンダーがくっついたような形状を作る シリンダーは G4Tubs で作ることが出来る。 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 ); 2005/06/06 LC tools lecture, Jupiter part 19 7. 娘Solidの作り方 J4FW の内部に layer 構造を作る場合 J4FWLayer を作成し、J4FW の 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 ); 娘ボリュームのInstallIn()関数 SetDaughter( fLayers ); 娘登録 2005/06/06 LC tools lecture, Jupiter part 20 8. InstallIn()関数の実装 InstallIn()関数は親のコンポーネントの中で 呼ばれることに注意 同じ形状のlayer をおく場合でも。。。 void J4FW::InstallIn( J4VComponent* /* mother */, G4RotationMatrix* /* prot */, const G4ThreeVector& /* tlate */) { Assemble(); n SetPVPlacement(); または SetPVReplica(); PVPlacement PVReplica 1 2 // Cabling function for SD object... //Cabling(); } 1 オブジェクトを 一つ一つ配置していく 2005/06/06 LC tools lecture, Jupiter part 同じ形状のオブジェクトを 一つのオブジェクトを n分割して作成する。 メモリーの節約になる。 21 PVPlacementで置く場合 Placementで置く場合には 親のAssemble()関数の中で娘オブジェクトを作る際に 引数にnbrothers, copyNoを与える。nClonesは1になる。 J4FW::Assemble( component, ) { for ( G4int i = 0; i < nLayers; i++ ) { J4FWLayer* Layer = Create( this, 1, nLayers, i ); .... Layer -> InstallIn( this ); } } J4FWLayer::InstallIn(){ SetPVPlacement( rotationMatrix, tlateVector ); (回転させながら置くことも可能) } 2005/06/06 LC tools lecture, Jupiter part PVPlacement n 2 1 22 Replicaを使う場合 Replicaする際には 親のAssemble()関数の中で娘オブジェクトを作る際に 引数にnClones(Replicaする数)を与える J4FW::Assemble() { ...... PVReplica J4FWLayer* fLayers = Create( this, nphi ); fLayers->InstallIn(this); ....... } J4FWLayer::InstallIn() { Assemble(); SetPVReplica( 分割方向, 分割ステップ, offset ); } 2005/06/06 LC tools lecture, Jupiter part 1 23 (例)CALのジオメトリについて CALは以下のような構造になっています。 J4CAL OrderNewTubs() J4CALCone J4CALTower 2005/06/06 J4CAL以外はG4Sphere()で作成 J4VCALBlock EM/HD J4VCALMiniCone EM/HD J4VCALMiniTower EM/HD J4VCALLayer EM/HD J4VCALSubLayer EM/HD Abs/Active LC tools lecture, Jupiter part 24 (例)CALのジオメトリについて Cone Tower MiniTower Block Layer HD Replica Replica Abs EM MiniCone EM, HDで異なる分割にできる。 セルサイズを分割量で変更 2005/06/06 LC tools lecture, Jupiter part Active SubLayer 25 9. Cabling()関数の実装 Hit情報を出すにはSD登録する必要があります。 SD登録を行うのはCabling()関数です。 J4FW内でCabling()関数をとりあえず実装します。 その後J4FWHit/J4FWSD の実装を行います。 void J4FW::Cabling() { if ( !GetSD() ) { J4FWSD* sd = new J4FWSD( this ); Register( sd ); Solid同様に SetSD( sd ); Register(sd) } SetSolid(sd) } 関数を呼んで登録します 2005/06/06 Hit情報を残すコンポーネントは全 てSDを作る必要があります。 LayerのHit情報が欲しければ、 J4FWLayerSD/J4FWLayerHit を作成するということです。 LC tools lecture, Jupiter part ここまでで、 J4FW の実装は終わりです。 26 ParameterListの作成 J4FWと同時進行で作成するものとして、 J4FWParameterListの作成があります。各種パラメータをまとめます。 void J4FWParameterList::SetMaterial(){ fFWMaterial = J4ParameterTable::GetValue("J4FW.Material",“scintillator"); ... } void J4FWParameterList::SetParameters(){ fFWOuterR = J4ParameterTable::GetValue("J4FW.OuterR",100.0)*cm; .... } J4FWParameterList::SetVisAttributes() { fFWVisAtt = J4ParameterTable::GetValue("J4FW.VisAtt",false); .... } void J4FWParameterList::SetColors(){ std::vector<double> col; col=J4ParameterTable::GetDValue("J4MUD.Color","1.0 0.0 0.0 1.0",4); SetMUDColor( G4Color( col[0], col[1], col[2], col[3] ) ); .... } 2005/06/06 LC tools lecture, Jupiter part 27 10. HitとSD実装 Hit情報を出すにはSDを作成する必要があります。 J4VSDを継承してJ4FWSDを作成します。 先にJ4VHitを継承してJ4FWHitを作る必要があります。 J4FWSD.hh (ヘッダファイル) class J4FWSD : public J4VSD<J4FWHit> { public: コピーして名前を付け替える だけでいいとおもいます。 J4CALSD( J4VDetectorComponent* detector ); ~J4CALSD(); virtual virtual virtual virtual G4bool ProcessHits( G4Step* aStep, G4TouchableHistory* ROhist ); void Initialize ( G4HCofThisEvent* HCTE ); void EndOfEvent ( G4HCofThisEvent* HCTE ); void OutputAll( HCTE ) { J4VSD<J4FWHit>::OutputAll( HCTE ) } }; 2005/06/06 LC tools lecture, Jupiter part 28 Hitの実装 J4FWHit.hh (ヘッダファイル) 基本的な部分はコピーして名前を付け替えるだけでOKです。 各検出器ごとに何のデータを残すかでこの部分が違います。 J4FWHit::J4FWHit( 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 ) 2005/06/06 LC tools lecture, Jupiter part 29 Hit、Output()関数の実装 Output()関数を実装し何のデータをhit.datに残すか決めます。 void J4FWHit::Output( G4HCofThisEvent* /* HCTE */ ) { if ( fgOutput ) fgOutput -> Output( this ); // output hitdata to output file .... if ( !ofs.good() ) { const G4String& errorMessage = "J4FWHit::Output(): write error."; G4cerr << errorMessage << G4endl; } else { std::ofstream& ofs = GetOutputFileStream(); ofs << “fwhit " << std::setw(3) << fPreHitID << " " << std::setw(5) << GetPDGEncoding() << " " ........ << std::endl; } } 2005/06/06 LC tools lecture, Jupiter part 30 11. SDの実装 J4FWSD では ProcessHits() 部分の実装がメインです。 下記の場合にはSD登録した部分に粒子が入射されると全てのhit情報を残します。 G4bool J4FWSD::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(); .... J4FWHit* hit = new J4FWHit( location, trackID, mothertrackID, particle, tof, edep, etot, p, pre, pos); ((J4FWHitBuf*)GetHitBuf())->insert( hit ); return true; } 2005/06/06 LC tools lecture, Jupiter part 31 (例)CALのHit/SDについて Layer CALSD Abs Active Hit SubLayerSD PreHit PostHit 2005/06/06 LC tools lecture, Jupiter part 32 Source/main/Jupiter.ccの実装 #define __INSTALLIR__ #define __INSTALLBD__ #define __INSTALLVTX__ #define __INSTALLIT__ #if 0 #define __INSTALLCDC__ #else #define __INSTALLTPC__ #endif #define __INSTALLCAL__ #define __INSTALLSOL__ #define __INSTALLMUD__ #define __INSTALLFW__ 2005/06/06 #ifdef __INSTALLFW_ J4FW *fwptr = new J4FW(); fwptr->SetMother(dtcptr->GetEXPHall()); dtcptr->AddComponent(fwptr); #endif LC tools lecture, Jupiter part 33 検出器実装の完了 以上で最低限の検出器実装が終了しました。 他に残っているのは PostHit、PreHit など 検出器の入り口、出口での情報を残すようにするか? などの検討が必要です。これはSD、Hitを新しく書く必要 があります。 実装がすんだら実際に検出器の絵を描いたり geometry test、正しいhit情報が出ているか などもチェックします。 2005/06/06 LC tools lecture, Jupiter part 34 dawnを用いたジオメトリの描画 • Jupiterのジオメトリを作った後に確認する手段とし てdawnがあります。 • Jupiter/macros 以下にdawnで絵を描くためのマク ロがあります。 % ./bin/Linux-g++/Jupiter >/control/execute macros/visdawnf.g4mac >/control/execute macros/view.g4mac Jupiter/images/dawn/g4_00.prim といった primファイル、epsファイルが作成されます。 2005/06/06 LC tools lecture, Jupiter part 35 dawnを用いたジオメトリの描画 カメラで見る向き polar 90 なら横から ズームアップ ビューモード このようなGUIが立ち上がるので、カメラの方向や位置、 モード(wireframe, surface 等)選んでください。 2005/06/06 LC tools lecture, Jupiter part 36 dawnを用いたジオメトリの描画 % dawn xxx.prim で出来たprimファイルを表示 surfaceだと断面が見えない。 wireframe 2005/06/06 surface LC tools lecture, Jupiter part 37 dawncutを用いた描画 dawncut で完成した prim file を x, y, z 平面でカットします % dawncut a b c d g4_00.prim input.prim cut.prim ( ax+by+cz+d = 0 平面でカット ) z=0 2005/06/06 x=0 LC tools lecture, Jupiter part 38 3次元立体図で切り取られた絵を描くには? まず、下記のシェルスクリプトを用いてprimファイルを合わせる #!/bin/sh dawncut 0.0 -1.0 0.0 0.0 gr.prim gr-ycut.prim dawncut 0.0 1.0 0.0 0.0 gr.prim gr+ycut.prim dawncut -1.0 0.0 0.0 0.0 gr-ycut.prim gr-xcut.prim dawncut 1.0 0.0 0.0 0.0 gr-ycut.prim gr+xcut.prim dawncut 0.0 0.0 1.0 0.0 gr-xcut.prim gr+zcut.prim cat gr+ycut.prim gr+xcut.prim gr+zcut.prim > sum.prim その後sum.primの最初と最後以外の以下の項目を消す。 /BoundingBox ****** ******* !SetCamera !OpenDevice !BeginModeling 2005/06/06 !EndModeling !DrawAll !CloseDevice LC tools lecture, Jupiter part 39 まとめ Jupiterのジオメトリのインストールについて述べました。 基本的には変更したりする必要はないかもしれませんが、 SDやHitなどは変更する必要がある場合があるかもしれません。 2005/06/06 LC tools lecture, Jupiter part 40 CALのジオメトリについて Cone Tower MiniTower Block Layer HD Abs EM MiniCone EM, HDで異なる分割にできる。 セルサイズを分割量で変更 2005/06/06 LC tools lecture, Jupiter part Active SubLayer 41
© Copyright 2024 ExpyDoc