当前位置: 首页 > news >正文

Day 02 geant4如何构建几何模型以及材料填充-------以B1为实例

Day 02 如何构建几何模型以及材料填充-------以B1为实例

一、构建几何模型-------B1DetectorConstruction.hh文件

继承G4VUserDetectorConstruction类;

B1DetectorConstruction中包含一个子函数B1DetectorConstruction::Construct()函数。是父类的虚函数,子类要重写这个函数;几何模型的构建就在这个方法里面;有返回值,返回值是G4VPhysicalVolume类型

G4VPhysicalVolume* B1DetectorConstruction::construct()
{G4NistManager* nist=G4NistManager::Instance();G4double env_sizeXY=20*cm,env_sizeZ=30*cm;......
}
1.构建几何模型步骤:

(1)确定几何模型的形状,根据形状确定尺寸。建立一个solid volume

​ 长方体:长、宽、高;圆柱体:半径、高;球:半径…

(2)材料填充,放置在什么位置,有无旋转----->参考系world中 。建一个 logical volume

(3)假设建立好几个物体,相对位置,旋转,平移 建立 physical volume

​ 建立模型是要从外往里建

2.B1的几何模型:

在右边scnen tree中有touchables下面有world

world:

​ Envelope长方体 外部的形状

​ shape1 内部的几何模型

​ shape2

# B1DetectorConstruction文件中
#建造参考系,分别为:solid  volume、logical  volume、physical   volume
# world
G4Box* solidWorld=new G4Box("World",0.5*world_sizexy,0.5*world_sizeXY,0.5*world_sizeZ);
G4LogicalVolume* logicalWorld=new G4LogicalVolume(solidWorld,       # 指针world_mat,         # 材料"World");     # 名字---是哪个层次里面的logicalvolume
G4VPhysicalVolume* physWorld=new G4PVPlacement(0,G4ThreeVector(),"World",0,       # 没有上者,写为0false,0,checkOverlaps);......#  Envelope
#solid  volume
G4Box* solidEnv=new G4Box("Envelope",0.5*env_sizexy,0.5*env_sizeXY,0.5*env_sizeZ);  #尺寸信息
#logical  volume,负责材料填充
G4LogicalVolume* logicEnv=new G4LogicalVolume(solidEnv,       # 指针env_mat,         # 材料"Envelope");     # 名字
#physical   volume
G4VPhysicalVolume* physEnv=new G4PVPlacement(0,                # 有无旋转G4ThreeVector(),   # envelope的中心坐标位置在上者world中的哪里,现在为(0,0,0)logicEnv,          # 指针"Envelope",        # 名字logicWorld,        # 该模块的上者,被放在世界world里面false,             # 其他操作0,checkOverlaps);
#shape1
G4Material* shape1_mat=nist->FindOrBuildMaterial("G4_A-150_TISSUE");
G4ThreeVector pos1=G4ThreeVector(0,2*cm,-7*cm);
# 底部内径rmina,内圆的半径;底部外径rmaxa,外圆的半径
G4double shape1_rmina=0.*cm,shape1_rmaxa=2.*cm;  
# 顶部内径rminb,顶部外径rmaxb
G4double shape1_rminb=0.*cm,shape1_rmaxb=4.*cm;
#半高hz
G4double shape1_hz=3.*cm;
# 角度ph,最小角度0,最大角度360,说明没有被切,是一个完整的圆台
G4double shape1_phimin=0.*deg,shape1_phimin=360.*deg;
G4Cons* solidShape1=new G4Cons("Shape1",shape1_rmina,shape1_rmaxa,shape1_rminb,shape1_rmaxb,shape1_hz,shape1_phimin,shape1_phimax);
G4LogicalVolume* logicaShape1=new G4LogicalVolume(solidShape1,shape1_mat,"shape1");
new G4PVPlacement(0,            #有无旋转,现在没有pos1,logicShape1,"shape1",logicEnv,false,0,checkOverlaps);
# shape2
......
#旋转的对象举例
G4RotationMatrix* rm=new G4RotationMatrix();
G4double angle=90*deg;  # 旋转90度
rm->rotateY(angle);    # 绕y轴旋转
# 之后将physicalvolume里面有无旋转的指标变为我们新建的rm
new G4PVPlacement(rm,            #有无旋转,现在为rmpos1,logicShape1,"shape1",logicEnv,false,0,checkOverlaps);

注:cm、deg…是单位,已经规定了,用星号*连接起来,有相关文件可以进行查询

为什么有world?

粒子反应有很多变化,设定当粒子进入世界后就表示结束,好统计(假设),保证粒子源整体在world中

​ 在这里可以对建立的模型进行修改颜色、透明度等,双击前面的小方格即可;world里面默认不可见,可以在图形界面初始化vis.mac文件中进行修改(修改这个文件后就要重新进行make执行)。图形界面更改的颜色是一次性的,若要永久更改还是在初始化文件中进行修改

二、设置材料 以B1为例

G4Material:在这个类中定义材料,有两种方法

1. 使用geant4中内置的Material Database(调用):
G4NistManager* nist = G4NistManager::Instance();   #必须调用这个nist
G4double env_sizeXY=20*cm,env_sizeZ=30*cm;
# 其中env_mat为指针,届时可以填写在建立的模型中对应的位置,env表示写在envelope中logicalvolume的材料
G4Material* env_mat = nist->FindOrBuildMaterial("G4_WATER")  # 在引号中写入需要的材料的名字,这里是水
# world_mat为指针,world表示世界的,写在world中logicalvolume的材料
G4Material* world_mat = nist->FindOrBuildMaterial("G4_AIR")  # 这里材料是空气
G4bool checkOverlaps = true;

G4内置的材料在G4的教材中也可以查询到对应的材料名称,写在引号中即可

2. 根据需求自己定义

G4Isotope

G4Element

​ **有两种方法:**1.把定义好的材料直接放在Construct()方法里面;(每次都自定义新的指针,在材料处写指针名字,每次都得修改,都要重新编译)

2.自己写一个DefineMaterial()方法,然后把所有可能用到的材料都定义在这个方法里面,可以参考TestEm0--------Geant4官方教程文档(官网可以直接下载)

自定义:先知道密度并给出;再给出相对分子质量给出,再进行定义:

原子:

a=density=类型  指针名字  =   new  G4Material(“名字”,简称符号=“符号名字”,原子序数z,相对分子质量a,密度density)

分子(化合物):

先分别建立需要的各种元素

类型  指针名字  =   new  G4Material(“名字”,symbol=“设定符号”,序数,相对原子质量)
......混合物密度density=类型  指针名字(化合物) = new  G4Material(“名字”,密度,natoms=组成元素个数)G4int natoms;化合物指针名字 ->AddElement(元素一指针名字,natoms=要几个)化合物指针名字->AddElement(元素二指针名字,natoms=要几个)......

混合物:

​ 与混合物差不多,但是化合物是指材料组成元素的比例,所以在定义化合物指针时的natoms要变成ncomponents,另外组合时的natoms要变成fracMass=比例*percent(这里的比例是写的100中的数,percent可加可不加,可以直接写小数)

​ 自己写define方法时,可写在DetectorConstruction同级文件夹中,然后将define文件写在文件B1DetactorConstruction.cc中(开局调用即可),这样在使用时,就不用再单独定义新的指针了,直接在需要填写材料的地方填写我们定义的材料的名字即可,

当我们使用new G4Material进行自定义材料时,一旦编译,这个材料就会被写入G4的材料表中,后续可以直接凭借名字使用

在.mac文件中可以修改我们的材料,在/testem/det/setMat 材料名,只要实现这个功能,材料就可以使用G4内置的材料名字

这样自定义时,每次修改只需要修改.mac文件即可,原代码不需要进行大改变。

可执行文件:.mac、.in等


文章转载自:

http://870lkVyn.rmxwm.cn
http://PUR9Si8n.rmxwm.cn
http://eWQ47Gia.rmxwm.cn
http://RAnOWrUZ.rmxwm.cn
http://Y7qTuAkJ.rmxwm.cn
http://6cje9w8w.rmxwm.cn
http://InAA6QNQ.rmxwm.cn
http://gpHdYnYm.rmxwm.cn
http://Wc33jpMq.rmxwm.cn
http://7fPmWB2e.rmxwm.cn
http://nLIfZ901.rmxwm.cn
http://Fg6jjO4V.rmxwm.cn
http://Hd1HVTU8.rmxwm.cn
http://Eg7dWmAY.rmxwm.cn
http://vS8GCMKv.rmxwm.cn
http://dSGHLNje.rmxwm.cn
http://KzKfxyS2.rmxwm.cn
http://PHhCiGIh.rmxwm.cn
http://T2APyCAo.rmxwm.cn
http://IiSQvlcE.rmxwm.cn
http://xZF0yEdM.rmxwm.cn
http://r9ayUHGs.rmxwm.cn
http://rCMgF5zE.rmxwm.cn
http://AOlMRsZq.rmxwm.cn
http://bunR6Gcw.rmxwm.cn
http://L7MBGP98.rmxwm.cn
http://Iubzecn4.rmxwm.cn
http://OIrjE5SL.rmxwm.cn
http://z5FMwTxs.rmxwm.cn
http://wHeXP7sN.rmxwm.cn
http://www.dtcms.com/a/382316.html

相关文章:

  • C# LINQ 的发展故事:从 “碎片化查询” 到 “语言级统一”
  • 电涌保护器:为现代生活筑起一道隐形防雷网
  • STM32项目分享:基于物联网的灭火器智能监测系统
  • 嵌入式 Linux 启动机制全解析:从 Boot 到 Rootfs
  • 图神经网络分享系列-SDNE(Structural Deep Network Embedding) (三)
  • DDIM和DDPM之 间的区别与联系
  • dumpsys power 简介
  • NO.10:氖:霓虹灯
  • TA-VLA——将关节力矩感知融入VLA中:无需外部力传感器,即可完成汽车充电器插入
  • Ubuntu 系统中 Miniconda 虚拟环境(以 SGlang 为例)的备份与还原详细总结
  • Q2(门式)起重机司机实操考点有哪些?
  • leetcode58:最后一个单词的长度(尾指针逆向扫描,结合151反转字符串对比)
  • 链表运用到响应式中
  • 自动驾驶中的传感器技术46——Radar(7)
  • Windows_MediaFeaturePack_x64_1903_V1.msu
  • Class56 束搜索
  • 【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES
  • Java面试问题记录(三)
  • 在Excel和WPS表格中批量删除数据区域的批注
  • 商品库存扣减方案
  • smartctl Current_Pending_Sector 硬盘待处理扇区
  • 并发和高并发
  • 科技信息差(9.13)
  • 文档长期不更新导致知识过时如何解决
  • Python学习-day9 字典Dictionary
  • Ubuntu22.04更换阿里镜像源,ubuntu更换源
  • 仓颉编程语言青少年基础教程:Struct(结构)类型
  • C语言数据结构实战:从零构建一个高性能的顺序栈
  • 数据链路层总结
  • Linux线程:基于环形队列的生产消费模型