Ć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.
Ć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
Ć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
Ć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.
Ć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
Ć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