Geant4 가이드

Detector Construction

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() 함수 안에서 물질을 정의 한다.

위 설명과 다음 참고 자료를 보면서 자신만의 물질을 만들어 보자.

참고

댓글

댓글 본문
  1. 찰스
    안녕하세요 덕분에 Geant4와 ROOT 잘 따라하고 있는 기계과 대학생입니다.
    현재 동일하게 662keV 에너지의 감마선을 조사해서 다양한 검출기 재료의 에너지분해능과 포토피크효율을 구하고 있는데요 (https://github.com......ial)

    1. ROOT로 감마선 스펙트럼을 불렀을때 각각의 재료가 다름에도 에너지분해능의 차이가 없습니다. 메인피크 카운트수가 다른걸로 포토피크효율이 다르다는건 확인할 수 있는데 에너지분해능의 차이가 없는건 왜일까요? 혹시 PrimaryGeneratorAction에서 감마선 방출재료를 설정하는게 도움이 될까요?

    2. 같은 문제입니다만 ROOT로 확인했을 때 감마선 스펙트럼 메인피크가 1바만 존재하는데 이걸 broad하게 그려내고 싶습니다. TBrowaser 내에서 bins나 범위 설정이 문제가 아니라 데이터 자체의 카운트 수가 문제인 것 같은데요 교수님은 도플러확장효과를 적용시키면 broad하게 그려낼 수 있을꺼 같다고 하시는데 방법을 모르겠습니다.

    감사합니다!
  2. ejungwoo
    1. 위 에서 G4Material 을 정의하는 방법을 그대로 사용하면 됩니다.

    G4Material *material = new G4Material("material", 밀도 2, kStateSolid, labTemp);
    detector_mat -> AddElement(element_silicon, ratio_silicon);
    detector_mat -> AddElement(element_boron, ratio_boron);

    boron 과 Si 의 비유을 원하시는대로 조정하면 됩니다.

    2. 제가 TCAD를 사용하지 않아 시도해 본적이 없지만 제 지인의 말로는 TCAD 에서 바로 STL 로 저장을 할 수 있다고 하네요.
    대화보기
    • potang
      안녕하세요
      구조 형성에서도 질문이 있어서 다시 댓글을 올리게 되었습니다. 진행하는데 하나하나 어려움이 많아서 최대한 제 손으로 해결하려고 인터넷을 찾아보고 있는데 쉽지 않아서 이렇게 다시 질문을 올리게 되었습니다..ㅠ
      2가지 질문이 있습니다..

      1. Silicon wafer에 boron doping한 것과 같이 Si 내부에 듬성듬성 boron을 삽입하여 neutron을 통과시키면서 neutron이 Si과도 충돌하면서 동시에 boron과도 반응을 일으키게 하고 싶습니다. 가능한 방법이 있을까요?

      2. TCAD 구조파일을 geant4 input으로 가져오는 방안에 대한 질문/답변글을 잘 읽어보았습니다. 저는 TCAD파일 (ACIS 포맷)을 geant4에 이동시키고 싶은데요. 가능한 방안으로 ACIS -> STL -> GDML 인거 같은데 ACIS -> STL은 commercial tool 밖에 없는것 같습니다. 혹시 가능한 다른 방안이 있을까요? 주제가 다소 벗어난것 같지만 경험이 많으실꺼 같아서 혹시 comment 있으시면 부탁드리겠습니다.

      매번 감사드립니다!!
    • 초보시물레이션
      안녕하세요. 저는 GEANT4 초보입니다. 덕분에 하나 하나 알아가고 있는 중입니다. 저의 디텍터는 가스 부분, 전기장부분, ASIC으로 되어 있습니다. 부분 전기장을 어떻게 넣어 줄 수 있을까요?? 조언 부탁드립니다.
    버전 관리
    ejungwoo
    현재 버전
    선택 버전
    graphittie 자세히 보기