Warsztaty GEANT4 oparte na materiałach treningowych (SLAC)

Warsztaty 5:  wyniki symulacji 1

    Proszę:


Ćwiczenie 1 



Aby zachować przejrzystość kodu implementacje licznika fotonów umieścimy w osobnej funkcji np.  MyDetectorConstruction::SetupScoring której parametrem będzie wskaźnik do obszaru logicznego do którego przypiszemy obiekt klasy G4MultiFunctionalDetector.  Niech to będzie na początek pusta funkcja nie zwracająca żadnej wartości. 


Wskazówki:
W deklaracji klasy MyDetectorConstruction  należy dodać w obszarze private:  pomocniczą metodę   SetupScoring(G4LogicalVolume*)
Należy zaimplementować pustą funkcje void MyDetectorConstruction::SetupScoring(G4LogicalVolume* scoringVolume) 
  Proszę skompilować program .


 Rozwiązanie

Ćwiczenie 2



Aby zliczać cząstki padające na wewnętrzną powierzchnię sfery należy:
1. Utworzyć obiekt klasy G4MultiFunctionalDetector
2. Uzyskać wskaźnik do SensitiveDetectorManagera
3. Zarejestrować MultiFunctionalDetector do SensitiveDetectorManager
4. Przypisać MultiFunctionalDetector do obszaru logicznego powielanej sfery scoringVolume
5. Utworzyć licznik fotonów klasy G4SPSphereSurfaceCurrent
6. Zarejestrować licznik do MultiFunctionalDetector
Wszystko w funkcji MydetectorConstruction::SetupScoring()

Wskazówki:
  1. Opis klasy G4MultiFunctionalDetector ;     należy zachować wskaźnik do tego obiektu
  2. Opis klasy G4SDManager ;    należy pobrać i zachować wskażnik do tego obiektu
  3. Metoda  G4SDManager::AddNewDetector() w opisie klasy G4SDManager służy do rejestracji detektora do menedżera
  4. Metoda  G4LogicalVolume::SetSensitiveDetector() w opisie klasy G4LogicalVolume     słuzy do przypisania detektora do obszaru logicznego
  5. Plik nagłówkowy klasy G4PSSphereSurfaceCurrent.hh  ( licznik zliczający cząstki)
  6. Metoda G4MultiFunctionalDetector::RegisterPrimitive()  służy do rejestracji licznika do detectora
Proszę nie zapomnieć o dodatkowych plikach nagłówkowych w pliku MyDetectorConstruction.cc
Proszę skompilować program.

 Rozwiązanie


Ćwiczenie 3


Aby licznik zaczął zliczać fotony pozostaje jedynie wywołać funkcję SetupScoring, skompilować i uruchomić program.

Wskazówki:-
Funkcję SetupScoring() możemy wywołać tuż po utworzeniu obszaru logicznego powielanej sfery "score"
Proszę skompilować program.

  Rozwiązanie

Po uruchomieniu programu licznik fotonów będzie rejestrował ilość fotonów padających na każdy z pierścieni. Licznik ten będzie jednak zerowany przed rozpoczęciem procesowania kolejnego przypadku. Aby wysumować liczby fotonów docierających do danego pierścienia po wszystkich przypadkach, zaimplementujemy własną klasę G4Run oraz G4UserRunAction tak jak to zostało naszkicowane na wykładzie.  Na początek napiszmy szkielety pustych deklaracji i implementacji klas MyRun oraz MyRunAction wyprowadzanych z klas G4Run i G4UserRunAction. Implementujemy jedynie puste konstruktory i destruktory,  reszta metod będzie dziedziczona z klas bazowych. Aby zmniejszyć ryzyko wycieków pamięci twórzmy TYLKO destruktory wirtualne. Takie szkielety można sobie skopiować z poniższych linków i umieścić w katalogach src i include.
MyRun.hh  MyRun.cc MyRunAction.hh MyRunAction.cc

Ćwiczenie 4


Proszę skierować na konsole informację o rozpoczęciu procesowania ranu  oraz informację  o zakończeniu procesowania ranu wraz z liczbą przeprocesowanych przypadków.

Wskazówki:
- Odpowiednie polecenia umieścimy w funkcjach BeginOfRunAction oraz EndOfRunAction klasy MyRunAction musimy zatem zamiast dziedziczyć te funkcje z klasy bazowej    G4UserRunAction  nadpisać je.  Typy parametrów i zwracanych wartości tych funkcji zawarte są w opisie klasy bazowej.
- Aby skierować strumień znaków na konsolę używajmy konstrukcji
G4cout << "MyLog:   asdfghjkl " << G4endl;
-Przedrostek np. MyLog ułatwi wyszukiwanie informacji wśród wszystkich pojawiających się na konsoli.
- Strumienie G4cout i G4endl zdefiniowane są w pliku "globals.hh"
- Liczba przypadków dostępna jest za pomocą funkcji GetNumberOfEvent() klasy G4Run
- Funkcje BeginOfRunAction oraz EndOfRunAction wywoływane są automatycznie przez menedżera ranu o ile obiekt klasy   MyRunAction zostanie zarejestrowany do  G4RunManager w main za pomocą funkcji SetUserAction.          
-Proszę skompilować i uruchomić program kierując strumień wyjściowy na wejście polecenia grep
bin/Linux-g++/My  run.mac | grep MyLog
Na konsoli pojawią się jedynie  linie zawierające  ciąg znaków MyLog


 Rozwiązanie

Kilka uwag dla początkujących w c++ na teamt włączania plików nagłówkowych:
1. W plikach .cc możemy zawsze bezpiecznie włączyć dowolny plik nagłówkowy.
    Zatem jeśli używamy metod, wskaźników lub składowych jakiejś klasy powinniśmy włączyć odpowiedni plik nagłówkowy.
2. W plikach .hh włączamy  pliki nagłówkowe tylko tych klas z których nasza nowa klasa dziedziczy bądź je zawiera. Jeśli w pliku .hh używamy  wskaźnika do innej klasy to jedynie umieszczamy deklaracje:  class klasa;   zamiast pliku nagłówkowego
    #include "klasa.hh" 

Ćwiczenie 5


Proszę nadpisać funcję GenerateRun() klasy bazowej  G4UserRunAction w implementacji klasy MyRunAction w celu instancji obiektu klasy MyRun

Wskazówki:
- funkcja GenerateRun() ma zwrócić wskaźnik do nowoutworzonego obiektu klasy MyRun.
- Proszę sprawdzić czy program się kompiluje i poprawnie wykonuje:


 Rozwiązanie