Geant4에서 물질이란
Geant4에서는 물질을 3가지, Solid Volume, Logical Volume 그리고 Physical Volume 으로 나누어 정의한다.
1. Solid Volume
Solid Volume은 물질의 모양과 크기를 결정한다. 추상 클래스는 G4VSolid 이며 여기서 파생된 클래스로 부터 여러가지 모양을 만들 수 있다. 다음 링크를 따라가면 어떤 모양을 만들 수 있는지 자세하게 나와있다.
박스 모양의 물질을 만들어 보자.
G4Box *solidDetector = new G4Box("Detector", 5, 5, 10);
위 코드는 중심이 (0, 0, 0) 에 있고 변의 길이가 x축으로 10 cm, y축으로 10 cm, z축으로 20 cm 인 박스를 만든다.
이름의 경우, 다른 Solid Volume과 구분되도록 지어주자.
2. Logical Volume 과 Material
Logical Volume은 물질의 특성을 결정한다. 물질의 특성이라 하면 가장 중요한 물질을 이룰 재료가 있다.
물질의 재료는 G4Material 클래스를 생성하여 만든다. 다행히 Geant4에는 Nist라는 데이터베이스에 기본 재료의 정보들이 저장되어 있다. 가장 기본이 되는 공기의 경우 Nist 데이터베이스에서 "G4_AIR"라는 이름으로 찾을 수 있다.
G4NistManager* nist = G4NistManager::Instance(); G4Material* air = nist -> FindOrBuildMaterial("G4_AIR");
각 재료에 대응 하는 이름은 Geant4 설명서의 Material Database 항목에서 찾을 수 있다.
하지만 Nist 데이터베이스에 모든 물질이 정의되어 있는것은 아니다. 예를 들어서 이후에 사용할 검출기의 재료인 C10H11은 Nist 데이터 베이스에 존재하지 않는다. 이런 경우에는 일일이 재료를 정의해야 한다.
먼저 탄소와 수소 원소를 G4Element로 정의 한다. 각 변수는 이름, 기호, Z-number, molecular mass다.
G4Element* elementC = nist -> FindOrBuildElement("C", false); G4Element* elementH = nist -> FindOrBuildElement("H" , false);
그 다음은 재료, G4Material을 정의 한다. 각 변수는 이름, 단위부피당 질량, 원소의 개수, 상태, 온도다. 그리고 위에서 정의한 원소들을 AddElement로 추가한다. 옆에 들어가는 숫자는 원소의 개수다.
G4Material *detector_mat = new G4Material("Scintillator", 1.05*g/cm3, 2, kStateSolid, labTemp); detector_mat -> AddElement(elementC, 10); detector_mat -> AddElement(elementH, 11);
재료가 준비되었으니 Logical Volume을 만들어보자. Logical Volume은 G4LogicalVolume 이라는 클래스로 생성한다.
G4LogicalVolume* logicDetector = new G4LogicalVolume(solidDetector, detector_mat, "Detector");
첫번째 인자와 두번째 인자는 위에서 만들어둔 Solid Volume와 재료, 세번째 인자는 이름이다.
3. Physical Volume
마지막 단계인 Physical Volume은 Logical Volume을 이용해서 시뮬레이션 상에 만드는 일을 한다. 가장 기본적인 생성자는 다음과 같다.
new G4PVPlacement(0, G4ThreeVector(0,0,10), logicDetector, "Detector", logicWorld, false, 0, true);
위 예제의 정확한 생성자의 정의는 다음과 같다.
G4PVPlacement( G4RotationMatrix* pRot, const G4ThreeVector& tlate, G4LogicalVolume* pCurrentLogical, const G4String& pName, G4LogicalVolume* pMotherLogical, G4bool pMany, G4int pCopyNo, G4bool pSurfChk=false )
- pRot: 상위 물질에 대한 회전행렬. 회전행렬은 복사되지 않으므로 나중에 행렬을 변경하지 않도록 하자.
- tlate: 상위 물질에 대한 위치 벡터
- pCurrentLogical: 이 Physical Volume을 만드는데 사용할 Logical Volume
- pName: 이름
- pMotherLogical: 상위 물질의 Logical Volume.
- pMany: 지금 Geant4 버전에서는 무조건 false로 둔다.
- pCopyNo: 카피 번호. 서로 다른 Physical Volume을 구분할 때 사용하며 시뮬레이션에는 영향을 주지 않는다. 나중에 데이터를 꺼내올 때 사용하므로 중요하다.
- pSurfChk: true로 두면 물질을 생성할때 다른 물질들과 겹치지 않는지 확인한다.
가장 상위 물질인 세계의 경우 상위 물질이 없으므로 0으로 두면 되지만, 그 이외의 물질의 경우 상위 물질을 알려주어야 한다. 예를 들어서 Detector의 상위물질은 World가 된다.
Detector Construction
물질을 시뮬레이션 상에서 만들기 위해서는 G4UserDetectorConstruction의 Construct() 함수에서 최상위 물질의 Physical Volume을 리턴해야 한다. 그런 이유로 보통 Construct() 함수 안에서 물질을 정의 한다.
위 설명과 다음 참고 자료를 보면서 자신만의 물질을 만들어 보자.