Warsztaty GEANT4 oparte na materiałach treningowych (SLAC)

Warsztaty 9:  wyniki symulacji 2



    Proszę:



Ćwiczenie 1


Proszę nadpisać funkcje RecordEvent klasy bazowej G4Run w implementacji klasy MyRun w celu dostępu do wyników symulacji dla każdego procesowanego przypadku. 
W funkcji RecordEvent mamy dostęp do wskaźnika obiektu  klasy  G4Event .
Obiekt ten posiada wskaźniki do HitsCollection (jeśli wyprowadzono klasę pochodną z klasy G4VHits) oraz HitsMap (jeśli zarejestrowano jakiś PrimitiveScorer) oraz do wszystkich śladów cząstek (obiekty klasy G4Trajectory).
Wskaźniki do obiektów G4Trajectory przechowywane są w kontenerze którego wskaźnik można uzyskać za pomocą metody GetTrajectoryContainer() klasy G4Event jest to wskaźnik do obiektu klasy G4TrajectoryContainer.
Proszę wypisać na konsoli dla każdego przypadku ilość procesowanych cząstek (rozmiar kontenera cząstek) 


Wskazówki:
- TrajectoryContainer ma jak każdy kontener w c++ zdefiniowaną metodę  size() zwracającą rozmiar kontenera.
- Proszę nie zapomnieć o inkrementacji zmiennej numberOfEvent w metodzie RecordEvent.
- Proszę sprawdzić czy program się kompiluje i poprawnie wykonuje.


 Rozwiązanie

Ćwiczenie 2


TrajectoryContainer zawiera wskaźniki do obiektów klasy G4Trajectory klasa ta zawiera informacje: o rodzaju cząstki, jej początkowym pędzie oraz istotnych punktach jej trajektorii.
Proszę dla każdej cząstki wypisać na konsole jej nazwę oraz pęd z jakim została wyprodukowana.

Wskazówki:
- Należy wykonać pętle po zawartości kontenera
- uzyskać wskaźnik do obiektów klasy G4Trajectory za pomocą operatora indeksowania []
- metody  GetParticleName() oraz GetInitialMomentum() zwracają potrzebne informacje
- Do formatowania strumienia wyjściowego można użyć standardowych manipulatorów np. setw, setprecision .... zdefiniowanych za pomocą polecenia      #include <iomanip>
   Same nazwy tych funkcji musimy poprzedzić nazwą std i operatorem :: aby poinstruować kompilator że są to funkcje z przestrzeni nazw std
- G4cout "wie" jak wyświetlać na konsoli obiekty klasy G4ThreeVector
- Proszę sprawdzić czy program się kompiluje i poprawnie wykonuje

 Rozwiązanie

Uwaga dla początkujących w c++:
Kontener TrajectoryContainer zawiera wskaźniki do obiektów klasy bazowej G4VTrajectory (choć same obiekty są klasy pochodnej G4Trajectory) przyjęto takie rozwiązanie aby jeden kontener przechowywał wskaźniki do obiektów każdej klasy wyprowadzonej z klasy G4VTrajectory np. MyTrajectory (gdybyśmy chcieli taką klasę samodzielnie wyprowadzić).  
  Można stanąć przed dylematem czy w funkcji RecordEvent wskaźnik traj ma być zadeklarowany jako wskaźnik do klasy G4VTrajectory czy też do klasy G4Trajectory oraz który plik nagłówkowy powinien być włączony? 
  Oczywiście można zastosować oba rozwiązania, przy czym jeśli chcemy aby wskaźnik traj był wskaźnikiem do klasy pochodnej to musimy dokonać jawnego rzutowania  wskaźnika klasy bazowej  (przechowywanego w kontenerze) na wskaźnik klasy pochodnej.
Drugie rozwiązanie powinniśmy stosować wtedy gdy chcemy skorzystać ze składowych klasy pochodnej nieistniejących w klasie bazowej a takowych w klasie G4Trajectory nie ma.
Ogólna zasadą w GEANT4 jest że klasa pochodna G4Klasa jedynie nadpisuje wirtualne funkcje klasy bazowej G4VKlasa.




Ćwiczenie 3



Oprócz informacji o śladach cząstek obiekt klasy G4Event może zawierać informacje o HitsCollection oraz o HitsMap. Wskaźniki do tych obiektów przechowywane są w obiekcie klasy G4HCofThisEvent.
W aplikacji My spodziewamy się istnienia jednej HitsMap związej z licznikiem fotonów. 
Proszę uzyskąć unikalny numer identyfikacyjny mapy HitsMap stowarzyszonej z licznikiem fotonów.

Wskazówki:
- Unikalny numerem identyfikacyjny danej kolekcji lub mapy przydzielany jest przez managera  G4SDManager można go uzyskać za pomocą funkcji GetCollectionID("nazwaMFD/nazwaPS"), gdzie nazwaMFD to nazwa MultiFunctionalDetctora a nazwaPS to nazwa PrimitiveScorer.
- Numer identyfikacyjny potrzebny będzie w metodzie RecordEvent ale nie warto go uzyskiwać dla każdego przypadku wewnątrz tej metody. Proszę uzyskać ten numer w konstruktorze klasy MyRun i uczynić go składnikiem klasy tak aby był dostępny dla wszystkich metod składowych klasy MyRun.
-Proszę zakomentować wysyłanie na konsole informacji o śladach a skierować na nią uzyskany numer identyfikacyjny HitsMap stowarzyszonej z licznikiem fotonów.
 Ponieważ innych HitsMap i HitsCollection nie ma  numer ten powinien wynosić 0.

- Proszę sprawdzić czy program się kompiluje i poprawnie wykonuje

  Rozwiązanie


Ćwiczenie 4


Znając numer identyfikacyjny mapy stowarzyszonej z licznikiem fotonów proszę dla każdego przypadku wysłać na konsolę informacje o zawartości tej mapy (zmiany w funkcji  RecordEvent).

Wskazówki:
- Wskaźnik do obiektu klasy G4HCofThisEvent można uzyskać za pomocą metody GetHCofThisEvent() klasy  G4Event .
- Obiekt klasy G4HCofThisEvent zawiera wskaźniki do wszystkich HitsCollection oraz HitsMap
- Konkretny wskaźnik  można uzyskać za pomocą metody GetHC(id) , gdzie id jest unikalnym numerem identyfikacyjnym danej kolekcji lub mapy. 
- Funkcja GetHC zwraca wskaźnik do klasy bazowej G4VHitsCollection natomiast same mapy są obiektami klasy pochodnej (szablonowej)G4THitsMap dlatego należy dokonać jawnego rzutowania wskaźnika klasy bazowej na wskaźnik G4THitsMap<G4double>. Dla wszystkich  HitsMap's typ parametru klasy szablonowej to G4double.
- Metoda  entries() zwraca ilość składowych mapy  w których zarejestrowano jakiś foton.
- Metoda  GetMap() zwraca wskaźnik to standardowej w c++ mapy.  Mapy stowarzyszone z HitsMap  zawierają wartości double* indeksowane int.
- Primitive Scorer
G4PSSphereSurfaceCurrent zlicza nie samą ilość fotonów ale ich strumień czyli liczbę przypadającą na jednostkę powierzchni (mm^2) sfery.
- Proszę sprawdzić czy program się kompiluje i poprawnie wykonuje.


 Rozwiązanie

Ćwiczenie 5


Zamiast wypisywać na konsole wartości HitsMap dla każdego przypadku, proszę zsumować zawartości HitsMap dla wszystkich przypadków i wyświetlić na konsoli wynikową zawartość mapy na koniec ranu np. w funkcji EndOfRunAction().

Wskazówki:
- Obiektem w którym będziemy przechowywać aktualną zawartość sumarycznej HitsMap będzie obiekt klasy G4THitsMap
- Niech to będzie zmienna składowa klasy MyRun  (np. frunHitsMap)
- Operator += umożliwia sprawne dodawanie elementów mapy.
- Proszę zwiększyć ilość generowanych przypadków do 1000
- Proszę sprawdzić czy program się kompiluje i poprawnie wykonuje


 Rozwiązanie

Wyniki symulacji można zapisać do dalszej analizy/prezentacji za pomocą interfejsu AIDA  w jednym z dostępnych formatów obsługiwanych przez zewnętrzne narzędzia do analizy danych. 
Na warsztatach nie będziemy korzystać z interfejsu AIDA.
Wyniki symulacji można zapisywać do pliku tekstowego a następnie konwertować do formatu ulubionego narzędzia do prezentacji danych.

Na warsztatach będziemy bezpośrednio zapisywać wyniki symulacji w formacie środowiska do analizy danych ROOT.
ROOT jest dostępny w CVMFS.
Można go sobie również ściągnąc z tej strony.

Ćwiczenie 6


Oprócz wysyłania wyników na konsole proszę zapisać je w postaci histogramu do pliku w formacie ROOT'a.

Wskazówki:
- Aby korzystać z klas ROOT'a wewnątrz GEANT'a  należy:
  1. Ustawić zmienne środowiskowe wymagane przez ROOT'a :
      - należy na początku sesji wykonać plik thisroot.sh obecny w każdej dystrybucji ROOT'a
             w CVMFS polecenie  

             source /cvmfs/sft.cern.ch/lcg/app/releases/ROOT/5.34.05/x86_64-slc6-gcc46-opt/root/bin/thisroot.sh
W razie problemów z bibliotekami należy stworzyć odpowiednie dowiązania symboliczne, np: sudo ln -s /usr/lib64/libssl.so /usr/lib64/libssl.so.10

 
2.  Dodać do GNUmakefile biblioteki ROOT'a
 
        CPPFLAGS += -I$(ROOTSYS)/include
       EXTRALIBS = $(shell root-config --glibs)
 
        przed              include $(G4INSTALL)/config/binmake.gmk
 
3.  Aby otworzyć plik do zapisu, utworzyć histogram, wypełnić histogram, zapisać histogram do pliku i zamknąć plik będziemy korzystać z dwóch klas ROOT'a
      TH1   -  klasa histogramów ( oraz klase z niej wyprowadzoną TH1D do zapisu zmiennych typu double)
      TFile  -  klasa plików w formacie ROOT'a
     


 Rozwiązanie


Po skompilowaniu i uruchomieniu programu, powinien pojawić sie plik  hist.root
Histogram w nim zapisany można obejrzeć  i/lub zapisać w formacie graficznym np. pdf za pomocą :

1. Graficznego interfejsu użytkownika
      Uruchamiamy program ROOT

root
root [0]  TBrowser t;                   // otwiera przeglądarkę
     w przeglądarce   "klikamy"  na plik hist.root
                                  a  następnie "klikamy" na histogram PhotonFlux

2.  Makra poleceń root'a
           Przykładowe makro

     uruchomienie:
     root rysuj.C

produkuje następujący obrazek:
dd