Warsztaty GEANT4 oparte na materiałach treningowych (SLAC)

Warsztaty 5:  geometria 2


    Proszę:


Chcielibyśmy określić jaki jest rozkład kątowy i energetyczny produkowanych fotonów promieniowania hamowania.

1. Utwórzmy odpowiednią ilość odpowiednio dobranych obszarów fizycznych.
2. Zliczając ilości fotonów do nich docierających  o określonej energii, określimy rozkład kątowy i energetyczny produkowanych fotonów.  
3. Do tego celu posłuży nam cieńka powłoka sferyczna wypełniona powietrzem, będziemy zliczać ilość fotonów przechodzących przez taką warstwę w kilku przedziałach kąta polarnego i energii fotonów. 

Schemat  układu pomiarowego:

<rysunek>

1. Środek sfery powinien znajdować się  w punkcie w którym oś wiązki przecina powierzchnię boczną tarczy (czyli w środku globalnego układu współrzędnych związanego z obszarem "world"). 
2. Sama sfera powinna być podzielona na  obszary odpowiadające  przedziałom kąta polarnego.  Do tego celu wykorzystamy powielanie pierścieniowych wycinków sfery korzystając z klasy G4PVParameterised.
3. Ponieważ  obszar logiczny "world" zawiera obszary  klasy G4Placement nie możemy umieścić w nim bezpośrednio obszarów typu G4Parameterised.
4. Najpierw utworzyć obszar "matkę" klasy  G4Placement który umieszczamy w obszarze "world"  a obszar "matkę" wypełnimy obszarami klasy G4Parameterised



Ćwiczenie 1



- Proszę zaimplementować geometrię obszaru "matki" z powyższego opisu.  Obszar "matka" niech będzie połową cieńkiej powłoki sferycznej o promieniu wewnętrznym innerRadius=40 cm i promieniu zewnętrznym outerRadius=40.01 cm wypełnioną powietrzem umieszczoną w środku obszaru logicznego "world".  Obszar ten nazwiemy np  "sphere" i  wizualizujemy go półprzeźroczystym kolorem białym ale domyślnie niech nie będzie widoczny.  


Wskazówki:
- Należy utworzyć (w funkcji MyDetectorConstruction::SetupGeometry)   :
  Bryłę klasy                   G4Sphere
  Obszar logiczny klasy  G4LogicalVolume
  Obszar fizyczny klasy  G4PVPlacement
  Atrybuty wizualizacji   G4VisAttributes
- Proszę sprawdzić czy program się kompiluje i czy podczas wizualizacji widać wszystkie obiekty jak na rysunku poniżej :


 Rozwiązanie

<rysunek>


Ćwiczenie 2


- Obszar "sphere" wypełnimy całkowicie nRings=15 pierścieniowymi wycinkami powłoki sferycznej.
- Każdy pierścień odpowiada przedziałowi kąta polarnego o szerokości 90.0*deg/nRings a jego środek oraz promienie są takie same jak obszaru "sphere". 
- Pierścienie rozmieszczamy  jako obiekty klasy  G4PVParameterised (nazwijmy je np. "score").
- Ten sposób powielania wymaga od użytkownika wyprowadzenia klasy  np. MyScoreParameterisation z klasy bazowej G4VPVParameterisation

Wskazówki:
- Pierwszym krokiem powinno być wyprowadzenie klasy MyScoreParameterisation z klasy G4VPVParameterisation
- Będziemy parametryzować numerem kopii jedynie rozmiary obszaru "score" zatem deklaracji i implementacji wymagają jedynie: konstruktor,  destruktor, wymagana czysto wirtualna funkcja ComputeTransformation oraz funkcja ComputeDimensions.
- Aby sparametryzować rozmiary kopii w funkcji ComputeDimensions musimy mieć dostępne wartości trzech zmiennych innerRadius, outerRadius oraz nRings.
- Ponieważ parametry funkcji ComputeDimensions są ustalone, zmienne innerRadius, outerRadius i nRings powinny być zadeklarowane jako prywatne zmienne składowe  klasy MyScoreParameterisation. 
- Proszę trzymać się umowy, że zmienne składowe klas tworzonych przez użytkownika były poprzedzone literą f (czyli finnerRadius, fouterRadius, fnRings).
- Wartości zmiennym finnerRadius, fouterRadius i fnRings nadajemy w konstruktorze klasy MyScoreParameterisation.
Podsumowując:  

  1) Należy  utworzyć plik MyScoreParameterisation.hh który ma zawierać: deklaracje klasy, deklaracje konstruktora (3 parametry), deklaracje destruktora, deklaracje funkcji ComputeTransformation(2 parametry wymienione w opisie klasy),  deklaracje funkcji ComputeDimensions(3 parametry wymienione w opisie klasy) oraz deklaracje trzech prywatnych zmiennych składowych: finnerRadius, fouterRadius, fnRings.
Proszę dopisać polecenie #include "MyScoreParameterisation.hh" w pliku MyDetectorConstruction.cc. Następnie proszę skompilować program
w celu sprawdzenia poprawności deklaracji  nowej klasy. Proszę poprawić wszystkie błędy  i nie przejmować się warningami.
 
Przykładowy plik MyScoreParameterisation.hh znajduje się tutaj  . W tym przykładzie  funkcję ComputeTransformation od razu się
implementuje ponieważ nie ma ani przesunięcia ani obrotu kolejnych kopii, zmianie ulega tylko rozmiar, można tam również dowiedzieć się jak pozbyć się uciążliwych warningów.


 2) Należy utworzyć plik MyScoreParameterisation.cc który ma zawierać implementacje konstruktora (nadanie wartości zmiennym finnerRadius, fouterRadius i fnRings), destruktora i funkcji ComputeDimensions (nadaje rozmiary obiektowi G4Sphere, adres tego obiektu jest parametrem funkcji, do modyfikacji rozmiarów istniejącego obiektu używamy funkcji składowych G4Sphere::Setxxxxxx.
 
- Proszę skopilować program w celu sprawdzenia formalnej poprawności implementacji klasy MyScoreParameterisation.
  Przykładowy plik MyScoreParameterisation.cc  znajduje się tutaj  .

3)  Proszę w funkcji MyDetectorConstruction::SetupGeometry utworzyć obiekt klasy MyScoreParameterisation np.  po utworzeniu opiektu sphere

G4int nRings = 15;
new MyScoreParameterisation(innerRadius,outerRadius,nRings);
 Proszę sprawdzić czy program się kompiluje i działa.

4)  Ostatnim krokiem jest utworzenie obiektu  "score".  Jest to bryła klasy G4Sphere,  wypełniona powietrzem (obszar logiczny).
     -Obszar logiczny umieszczamy nRings razy w obszarze logicznym "sphere" jako obiekty klasy  G4PVParameterised korzystając z parametryzacji MyScoreParameterisation.
    -Obiekty "score" powinny być wizualizowane jako  zielone z parametrem  przeźroczystości = 0.5.
    -Proszę sprawdzić czy program się kompiluje i czy podczas wizualizacji widać wszystkie obiekty jak na rysunku poniżej

 Rozwiązanie