Geant4 가이드

스텝, 트랙 컷

특정 볼륨에 컷을 줄때 G4UserLimits 클래스를 사용한다.

G4UserLimits(G4double uStepMax, G4double uTrackMax, G4double uTimeMax, G4double uEkinMin, G4double uRangeMin)
변수 설명 기본값
uStepMax 스텝의 최대 길이 DBL_MAX
uTrackMax 트랙의 최대 길이 DBL_MAX
uTimeMax 트랙의 최대 유지 시간 DBL_MAX
uEkinMin 트랙이 유지되는 최소 에너지 0.
uRangeMin 트랙이 유지되는 최소 범위 0.

(DBL_MAX는 double 타입의 최대값을 의미한다.)

적용은 Logical Volume에 하며 Geant4에서 제공하는 PhysicsList를 사용할 경우(아닌 겨우는 생략) 메인 프로그램에서 PhysicsList에 G4StepLimiterPhysics(스텝 컷)와 SpecialCutsBuilder(트랙 컷)를 등록 해야 한다.

DetectorConstruction:

G4LogicalVolume *logicalVolume = new ...
logicalVolume -> SetUserLimits(new G4UserLimits(1*mm, 10*m));

main:

G4VModularPhysicsList* physicsList = new FTFP_BERT; // ex) FTFP_BERT
physicsList -> RegisterPhysics(new G4StepLimiterPhysics()); // 스텝 컷
physicsList -> RegisterPhysics(new SpecialCutsBuilder()); // 트랙 컷
runManager -> SetUserInitialization(physicsList);

참고자료

댓글

댓글 본문
  1. potang
    연휴라 확인이 늦었습니다ㅠ
    Detector 탭에서의 질문(doped boron 설정, 구조변환)과 더불어 답변 진심으로 감사드립니다.
    comment 해주신 내용 바탕으로 진행해보겠습니다!
  2. ejungwoo
    이건 단순히 출력되는 메시지의 precision 문제입니다. 이를 확실하게 확인 하고 싶다면 second program branch로 옮긴 후 OTSteppingActio::UserSteppingAction() 함수에서 아래와 같이 줄을 추가해서 직접 확인해 볼 수 있습니다.

    auto pos1 = step -> GetPreStepPoint() -> GetPosition();
    auto pos2 = step -> GetPostStepPoint() -> GetPosition();
    std::cout.precision(12);
    std::cout << step -> GetTrack() -> GetParticleDefinition() -> GetParticleName() << " (" << pos1.x() << ", " << pos1.y() << ", " << pos1.z() << ") -> (" << pos2.x() << ", " << pos2.y() << ", " << pos2.z() << ")" << std::endl;

    결과는 아래와 같습니다.

    neutron (0, 0, 0) -> (0, 0, 20)
    neutron (0, 0, 20) -> (0, 0, 35.96043177)
    neutron (0, 0, 35.96043177) -> (-0.621069906411, 0.716202615975, 40)
    neutron (-0.621069906411, 0.716202615975, 40) -> (-2.15853596973, 2.48917085216, 50)
    O16 (0, 0, 35.96043177) -> (0.00048602214752, -0.000560468845588, 35.9605233029)

    dE 가 0 인 것은 에너지를 남긴 것이 아니라 Si28(위의 경우 O16) 가 생성되면서 에너지가 옮겨진 것이라 그렇습니다.
    https://opentutorials.org......655 에 잃어버린 에너지와 입자 생성에 대한 이야기가 간략하게 쓰여 있으니 읽어보면 좋을것 같습니다.
    대화보기
    • potang
      ************************************************************************
      * G4Track Information: particle = neutron, Track ID =1, Parent ID =0
      ************************************************************************
      Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName
      1 0 0 20 2.1e-05 0 20 20 Detector Transportati
      2 0 0 21.5 1.91e-05 0 1.52 21.5 Detector hadElastic

      ************************************************************************
      * G4Track Information: particle = Si28, Track ID =2, Parent ID =1
      ************************************************************************
      Step# X(mm) Y(mm) Z(mm) KinE(MeV) dE(MeV) StepLeng TrackLeng NextVolume ProcName
      0 0 0 21.5 1.99e-06 0 0 0 Detector initStep
      1 1.13e-06 -3.41e-07 21.5 0 1.99e-06 1.94e-06 1.94e-06 Detector ionIoni

      /run/beamOn xx 입력하였을때 나오는 output 창입니다. 이것을 csv 저장하면 위에 보이는대로 저장되어 나옵니다. Si28에서 충돌후 z변화가 없는 것으로 보이고, 위에 neutron에서도 충돌 후 kinE차이가 있는데 dE가 0으로 나옵니다.
      알려주신 예제 코드에서 크게 벗어나게 수정한 것은 없는것 같습니다. 데이터를 가져오는 코드라 함은 어떤 코드파일을 말씀하시는 건지 알려주시면 댓글에 적어놓겠습니다.

      감사합니다!
    • ejungwoo
      z 방향의 변화가 없는 것은 말이 안되는 것 같습니다. 여러 이벤트를 통틀어서 그 이벤트만 그런 것인가요 아니면 모든 이벤트에서 나타나는 현상인가요? 전자라면 데이터를 받아오는 방법이 잘못되었을 가능성이 가장 큽니다. 또 질문자님이 값을 2E-2 mm 로 쓰셨는데 E-2보다 더 정밀한 값으로 써도 같은 값인건가요? 조금의 상황 설명과 데이터를 가져오는 코드를 보여주시면 답변을 드리는데 도움이 될 것 같습니다.
      대화보기
      • potang
        안녕하세요 지난번 Ntuple 질문을 통해 문제를 잘 해결하였습니다. 진심으로 감사드립니다.
        이번에는 스텝?과 관련 있을 것으로 보여서 <스텝, 트랙 컷> 탭에 질문을 올리게 되었습니다.
        올려주신 예제를 베이스로 하여 Si 물질의 직육면체(두께 수백um) Detector를 만들었습니다.
        여기에 중성자를 Z방향으로 조사하면, 적은 확률로 Si이 중성자와 충돌 반응이 일어납니다.
        문제는 충돌 후 Si의 변위인데요. 충돌 후 Si의 X, Y의 경우 수 nm 수준으로 변화를 감지하는데 반해
        Z방향의 변위는 차이가 없는 것으로 표시됩니다.
        ex) 충돌 지점 Si 위치 (0, 0 2E-2) --> 충돌 후 Si 위치 (-2.5E-6, 3.5E-6, 2E-2) 단위는 mm
        어떻게 하면 Z 변위 차이도 같이 표시할 수 있을까요?
      버전 관리
      ejungwoo
      현재 버전
      선택 버전
      graphittie 자세히 보기