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

发布于:2025-09-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

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,       # 没有上者,写为0
                    false,
                    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,            #有无旋转,现在为rm
                    pos1,
                    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等