Geant4 가이드

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

Field

Geant4에서 제공하는 Field 클래스는 G4Field에서 파생된 전기장 G4ElectricField, 자기장 G4MagneticField 이 있고 또 여기서 다시 파생된 여러가지 모양의 Field 볼 수 있다. 중력장에 해당하는 클래스도 있으니 혹시나 필요하게 되면 참고하자. 그리고 더 현실적인 전자기장을 만들고 싶다면 G4ElectroMagneticField 클래스를 상속하여 새로운 클래스를 만들 수 있다.

이 토픽에서는 이를 OTField 클래스로 만들어 보았다. 만드는 방법은 G4ElectroMagneticField 클래스를 상속하고 두 함수 DoesFieldChangeEnergy()GetFieldValue(...) 함수를 정의하면 된다. 첫번째 함수인 DoesFieldChangeEnergy() 함수는 에너지가 Field 에 의해서 변하는 것이 가능한지 정의하는 함수이다. 자기장만을 생성하는 Field의 경우 에너지가 변하지 않으므로 false 를 출력하도록 하고 전기장도 포함하는 경우 true 를 출력하도록 하면 된다. 우리의 예제에서는 자기장만을 염두해 두었으므로 false 를 출력한다.

virtual G4bool DoesFieldChangeEnergy() const { return false; }

다음 GetFieldValue(...) 함수에서는 주어진 위치와 시간에 대해서 Field의 값을 받아가게 되어있다. 기본적인 함수 뼈대는 다음과 같다.

void OTField::GetFieldValue(const G4double point[4], G4double *field) const
{
  // input
  G4double x = point[0]; // x-axis position
  G4double y = point[1]; // y-axis position
  G4double z = point[2]; // z-axis position
  G4double t = point[3]; // time

  //
  G4double bx = 0.;
  G4double by = 0.;
  G4double bz = .5*tesla;

  G4double ex = 0.;
  G4double ey = 0.;
  G4double ez = 0.;

  // set output
  field[0] = bx; // b-field x-component
  field[1] = by; // b-field y-component
  field[2] = bz; // b-field z-component

  field[3] = ex; // e-field x-component
  field[4] = ey; // e-field y-component
  field[5] = ez; // e-field z-component
}

첫번째 인자인 Point 는 배열 순서대로 받아오는  x, y, z, 시간을 의미한다.
두번째 인자인 field 는 순서대로 받아가는 자기장의 x, y, z 값, 그리고 자기장의 x, y, z 값을 의미한다.

위 코드에서는 받아오는 변수와 상관없이 자기장의 z 값이 0.5 tesla 인 함수가 된다. 이 경우는 매우 이상적이므로 간단하게 G4UniformMagField 를 이용할 수 있다. 하지만 예를 들어 자석으로 부터 생성되는 자기장의 값을 파일로 가지고 있을 때 이를 불러와서 사용하려면 이와 같이 따로 클래스를 만들어서 사용해야 한다.

 

 

Field를 적용하는 방법은 모든 볼륨에 적용하는 방법(global)과 특정 볼륨에 적용하는 방법(local)이 있다. 두가지 방법 모두 OTDetectorConstruction(소스, 헤더) 클래스의 SetGlobalField() 함수와 SetLocalField() 함수로 구현해 두었다. 나중에 필드를 생성하는 경우를 위하여 OTField 포인터를 를 OTDetectorConstruction 생성자에서 만들고 local field를 위해서 detector의 logical volume 포인터를 맴버함수로 정의한다. 이후 아래와 같이 함수를 정의 할 수 있다.

void OTDetectorConstruction::SetGlobalField()
{
  auto fieldManager = G4TransportationManager::GetTransportationManager() -> GetFieldManager();
  fieldManager -> SetDetectorField(fField);
  fieldManager -> CreateChordFinder((G4MagneticField *) fField);
}
void OTDetectorConstruction::SetLocalField()
{
  auto fieldManager = new G4FieldManager();
  fieldManager -> SetDetectorField(fField);
  fieldManager -> CreateChordFinder((G4MagneticField *) fField);
  logic_detector -> SetFieldManager(fieldManager, true);
}

Field 를 적용할 때는 field managerSetDetectorField() 함수를 이용한다. 또 자기장을 적용할 경우 chord finder 즉, 트랙의 근사 경로인 원의 현(chord) 을 찾기위한 method를 지정해야 한다. 자세한 내용은 Geant4 Electromagnetic Field doc 을 참고하자. 시뮬레이션이 간단하고 자기장의 영향이 미치는 검출기가 하나밖에 없을 경우 위와 같이 CreateChordFinder() 함수를 이용하여 간단한 chord finder 를 만들 수 있다.

 위의 두 함수는 비슷 하지만 SetGlobalField() 함수의 경우 global 한 field manager 를 불러오기위한 방법이 다르고 SetLocalField() 함수의 경우 logical volume 에 직접 field manager 를 지정해 준다는 점이 다르다. 그 부분만 주의한다면 쉽게 Field를 만들 수 있다. 아래는 global field와 local field를 적용한 이벤트의 모습이다.

 

global
global field

 

local field

 

Local field 의 경우 detector 의 안쪽에만 필드의 영향이 미치는 것을 볼 수 있다.

댓글

댓글 본문
버전 관리
ejungwoo
현재 버전
선택 버전
graphittie 자세히 보기