今天要讲的主要是DetectorConstructor的编写。
首先介绍下神马是DetectorConstructor。我们知道唱戏先得搭台子。创建编写DetectorConstructor类就是为模拟搭戏台舞台。比如你要模拟中子穿过晶体的过程。那么你首先得摆一块晶体。要摆一块晶体,除非你已经有一块形状尺寸材料都很理想的晶体了,然后你可以把它摆到某一个位置,放到位置后还可以再转一转方向什么的。否则,你就得自己去定义一块晶体出来,就像上边提到的,定义出晶体的材料、形状、尺寸。然后你就可以把这块晶体放到你想放置的位置了。
首先,定义材料。比如你想用的材料是纯CsI材料。你要先定义Cs原子和I原子。你可以像这样来定义:
G4Element* elementCs = new G4Element( "Cesium", "Cs", 55. , 132.90543*g/mole ); G4Element* elementI = new G4Element( "Iodine", "I", 53. , 126.90447*g/mole );
我们知道,上边的c++代码的语义是:第一行,创建一个指针elementCs,指向一个G4Element类的对象,并初始化该对象。构造函数中使用了四个参数,前两个字符串是该对象代表的原子的名称和简写。第三个参数是该原子的原子充数A,第四个是该原子的摩尔质量。这样,第一行就定义了Cs原子。同样的方法第二行代码定义了I原子。 之后,我们就可以用定义好的两种原子来定义纯CsI这种材料。代码:
G4Material* CsI = new G4Material("CsI",4.51*g/cm3, 2, kStateUndefined, 273.15*kelvin, 1.0*atmosphere); CsI->AddElement( elementI, 1 ); CsI->AddElement( elementCs, 1 );
第一行代码,创建一个指针CsI,指向一个G4Material类的对象,并用一些参数来初始化该对象。构造函数中使用了六个参数。分别是名称、密度、几种成份(在这里是表示有两种原子)、状态(气态、液态、未定义等)、温度、压强。其中状态定义为未定,则Geant4可自行通过密度压强以及温度等参数计算其状态。后两行代码则表示这种材料的两种成份是什么。这里说明是前边我们定义的elementI和elementCs,并且原子个数比例是1:1。
经过这两段代码我们就定义出来可以后边使用的取名为CsI的材料。我们后边可以使用CsI这个指针来调用这种材料。
然后,我们还要定义晶体的尺寸和形状。比如我们要定义成立方体。立方体的类是G4Box。我们先用下边一行代码定义一个边长2.5cm的立方体。
G4Box* solidCsI_log = new G4Box("solidCsI_log",1.25*cm, 1.25*cm, 1.25*cm );
上边代码的四个参数分别是名称和立方体的半长、半高、半宽(对应x、y、z三个坐标)。
之后,我们把材料和形状合在一起,合成一个包含材料和形状信息的CsI晶体实体,我们叫它几何体(或者LogicalVolume)。代码:
G4LogicalVolume * CsI_log = new G4LogicalVolume(solidCsI_log, //its shape CsI, //its materical "CsI_log" , //its name 0,0,0); //position in self coordinate system
这样,CsI_log就已经是我们定义好的一块完整的晶体了。我们现在用下边的代码把它摆放到世界中:
G4PhysicalVolume* CsI_phy = new G4PVPlacement(0, G4ThreeVector(0.0*cm,0.0*cm,0.0*cm), CsI_log, //its logical volume "CsI_phy", //its name World_log, //its mother volume false, //no boolean operation 0); //copy number
Comments !