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等