GEANT4 Leszek Adamczyk Przykład budowy aplikacji Interfejs użytkownika Wizualizacje
Ćwiczenie 1 Proszę zalogować się na serwer fatcat ssh <user>@fatcat.ftj.agh.edu.pl Ustawić zmienne środowiskowe cd <g4work> ; source.g4work.env Skopiować zmodyfikowany przykład (N03) cp -r ~adamczyk/g4work/n03. Wyświetlić zawartość katalogu N03 cd N03; ls -R
.: GNUmakefile examplen03.cc include src./include: ExN03DetectorConstruction.hh ExN03EventAction.hh ExN03PhysicsList.hh ExN03PrimaryGeneratorMessenger.hh ExN03SteppingAction.hh Katalog deklaracji klas ExN03DetectorMessenger.hh ExN03EventActionMessenger.hh ExN03PrimaryGeneratorAction.hh ExN03RunAction.hh ExN03SteppingVerbose.hh./src: ExN03DetectorConstruction.cc ExN03EventAction.cc ExN03PhysicsList.cc ExN03PrimaryGeneratorMessenger.cc ExN03SteppingAction.cc Katalog definicji klas ExN03DetectorMessenger.cc ExN03EventActionMessenger.cc ExN03PrimaryGeneratorAction.cc ExN03RunAction.cc ExN03SteppingVerbose.cc Dobry zwyczaj: nazwy plików są jednocześnie nazwami klas które deklarują lub definiują a te zawierają nazwy klas bazowych poprzedzone wspólnym przedrostkiem charakterystycznym dla danego projektu.
GNUmakefile Plik reguł dla programu make, służącego do automatyzacji kompilacji programów name := examplen03 G4TARGET := $(name) G4EXLIB := true Nazwa pliku z programem głównym ifndef G4INSTALL G4INSTALL =../../.. endif.phony: all all: lib bin include $(G4INSTALL)/config/binmake.gmk visclean: rm -f g4*.prim g4*.eps g4*.wrl rm -f.dawn_* make visclean Usuwa pliki graficzne
examplen03.cc #include "G4RunManager.hh" #include "ExN03DetectorConstruction.hh" #include "ExN03PhysicsList.hh" #include "ExN03PrimaryGeneratorAction.hh" #include "ExN03RunAction.hh" #include "ExN03EventAction.hh" #include "ExN03SteppingAction.hh" int main() { // Construct the default run manager // G4RunManager * runmanager = new G4RunManager; Deklaracje klas używanych w programie głównym Utworzenie runmanagera wraz z wywołaniem jego konstruktora
// Set mandatory initialization classes // ExN03DetectorConstruction* detector = new ExN03DetectorConstruction; runmanager->setuserinitialization(detector); // G4VUserPhysicsList* physics = new ExN03PhysicsList; runmanager->setuserinitialization(physics); Utworzenie i zarejestrowanie do RunManagera klas użytkownika // Set user action classes // G4VUserPrimaryGeneratorAction* gen_action = new ExN03PrimaryGeneratorAction(detector); runmanager->setuseraction(gen_action); // ExN03RunAction* run_action = new ExN03RunAction; runmanager->setuseraction(run_action); // ExN03EventAction* event_action = new ExN03EventAction(run_action); runmanager->setuseraction(event_action); // G4UserSteppingAction* stepping_action = new ExN03SteppingAction(detector, event_action); runmanager->setuseraction(stepping_action);
// Initialize G4 kernel // runmanager->initialize(); Inicjalizacja jądra GEANT4 // Start a run G4int numberofevent=3; runmanager->beamon(numberofevent); Procesowanie 3 przypadków // Job termination // Free the store: user actions, physics_list and detector_description are // owned and deleted by the run manager, so they should not // be deleted in the main() program! delete runmanager; } return 0; Usunięcie runmanagera wraz z wywołaniem jego destruktora
Kompilacja i wykonanie programu Kompilacja make Wykonanie programu../bin/linux-g++/examplen03 Uwaga: Aby wykonać skompilowany program podczas następnej sesji należy ustawić zmienne środowiskowe w przeciwnym razie program może źle działać (source.g4work.env)
Interfejs użytkownika (UI) Jakakolwiek zmiana w poprzednim przykładzie wymaga ponownej kompilacji programu. Aby tego uniknąć sterowanie wykonaniem programu może być przekazane bezpośrednio użytkownikowi poprzez tzw. interfejs użytkownika Najprostszym interfejsem jest klasa G4UIterminal wyprowadzona z abstrakcyjnej klasy bazowej G4UIsession G4UIterminal zapewnia interakcyjny tekstowy sposób wydawania poleceń UI
Ćwiczenie 2 Proszę przekazać sterowanie programem z ćwiczenia 1 bezpośrednio do użytkownika W pliku examplen03.cc proszę dodać deklaracją klasy G4UIterminal (plik nagłówkowy) Zamiast polecenia runmanager->beamon() proszę przekazać sterowanie do UI G4UIsession * session = new G4UIterminal; session->sessionstart(); delete session; Następnie proszę skompilować i uruchomić program examplen03
Polecenia interfejsu użytkownika Polecenie składa się z: katologu polecenia /run/beamon 3 polecenia parametrów Parametr może być typu logicznego, liczbą całkowitą, rzeczywistą lub ''ciągiem znaków'' Parametry oddzielamy spacją Parametry można omijać (przyjmowana jest wtedy wartość domyślna) Używamy! gdy pierwszy parametr ma wartość domyślną a drugi zadaną np. /dir/command! 2
Katalogi poleceń Idle> ls Command directory path : / Sub-directories : /control/ UI control commands. /units/ Available units. /geometry/ Geometry control commands. /tracking/ TrackingManager and SteppingManager control commands. /event/ EventManager control commands. /cuts/ Commands for G4VUserPhysicsList. /run/ Run control commands. /random/ Random number status control commands. /particle/ Particle control commands. /process/ Process Table control commands. /N03/ UI commands of this example (można zdefiniować własne) /gun/ Particle Gun control commands. /material/ Commands for materials Commands : Idle>
Opis dostępnych poleceń Opis dostępnych poleceń można uzyskać: W formacie tekstowym (na standardowym wyjściu) /control/manual [directory] W formacie html (jeden plik na każdy podkatalog) /control/createhtml [directory] Lista w budowanych poleceń GEANT4 znajduje się w przewodniku dla twórców aplikacji (Rozdział 7.1)
Makra Makra są plikami tekstowymi zawierającymi polecenia interfejsu użytkownika Polecenia w makrze muszą posiadać pełną ścieżkę dostępu # oznacza komentarz Makra można wykonać na dwa sposoby z poziomu interfejsu użytkownika lub innego makra :Idle> /control/execute <nazwa_makra> z poziomu kodu c++ G4UImanager * UI = G4UImanager::GetUIpointer(); UI->ApplyCommand(''/control/execute <nazwa_makra>'');
Aby móc raz skompilowanym programem sterować interakcyjnie lub bez naszego udziału w zależności od aktualnej potrzeby można przekazać programowi głównemu parametr(y) np. nazwę makra do wykonania: int main(int argc, char** argv) {...... if(argc==1) { // tryb interakcyjny G4UIsession* session = new G4UIterminal; session->sessionstart(); delete session; } else { // tryb nieinterakcyjny G4UImanager* UI = G4UImanager::GetUIpointer(); G4String makro = argv[1]; G4String command= ''/control/execute '' + makro; UI->ApplyCommand(command); }
Ćwiczenie 3 Proszę wprowadzić modyfikacje z poprzedniej transparencji w programie głównym examplen03.cc Skompilować program Utworzyć makro np. run.mac zawierające polecenie /run/beamon 3 Proszę wykonać to makro z poziomu interfejsu użytkownika../bin/linux-g++/examplen03 Idle> /control/execute run.mac Idle> exit oraz w trybie nieinterakcyjnym../bin/linux-g++/examplen03 run.mac
Aliasy Aliasy definiujemy za pomocą polecenia /control/alias [nazwa] [wartość] np. Idle> /control/alias bo ''/run/beamon Wartość aliasu jest zawsze traktowana jak ciąg znaków Alias jest automatycznie definiowany podczas wywołania poleceń /control/loop i /control/foreach Alias może być używany jako składnik polecenia wywoływanego z poziomu interfejsu użytkownika lub wewnątrz makra. Do tego celu używamy nazwy aliasa w nawiasach pisanych np. Idle> {bo} 3
Pętle Polecenia /control/loop i /control/foreach wykonują makro więcej niż raz: /control/loop [makro] [alias] [pocz] [końc] [krok] [alias] alias którego wartość zmienia się przy każdym wywołaniu makra od [pocz] o [krok] Idle> /control/loop run.mac Ekin 2. 10. 2. /control/foreach [makro] [alias] [lista] [alias] alias do kolejnych wartości z [lista] [lista] musi być ograniczona ( ) Idle> /control/foreach run.mac Ekin 1. 7. 10. w makrze run.mac np.: /gun/energy {Ekin} GeV
Jeśli system operacyjny (Linux) zawiera C-shell lub TC-shell'a to można używać bardziej przyjaznego interfejsu użytkownika. G4UIsession*session=new G4UIterminal (new G4UItcsh); Kompilacją możemy sterować za pomocą zmiennych środowiskowych np. G4UI_USE_TCSH #include G4UIterminal.hh ; #if defined(g4ui_use_tcsh) #include G4UItcsh.hh ; #endif... #if defined(g4ui_use_tcsh) G4UIsession * session= new G4UIterminal(new G4UItcsh); #else G4UIsession * session= new G4UIterminal; #endif
Ćwiczenie 4 Proszę zmodyfikować program główny aby korzystał ze zmiennej środowiskowej G4UI_USE_TCSH w celu ewentualnego użycia terminala typu TC-shell oraz go skompilować Proszę zmodyfikować makro run.mac aby za pomocą polecenie Idle> /control/loop Ekin 2 10. 2. wykonać makro dla różnych energii cząstek pierwotnych np. w run.mac: /gen/energy {Ekin} GeV /run/beamon 3
G4UIterminal Tekstowy interfejs użytkownika posiada wbudowane polecenia charakterystyczne dla Unix'a: cd, pwd, ls history pokazuje poprzednio wykonane polecenia!historyid ponowne wykonanie polecenia Klawisze strzałek i backspace (tylko tcsh) help <polecenie> - opis i składnia polecenia exit zakończenie pracy Powyższe polecenia dostępne tylko interakcyjnie, nie mogą być wykonane z poziomu programu w c++ ani wewnątrz makra
Wizualizacje Wizualizacje umożliwiają: Produkowanie wysokiej jakości rysunków np. do publikacji Są narzędziem do wykrywania błędów w geometrii detektora (np. nakładanie się obszarów) Daje możliwość interaktywnego uzyskiwania informacji o wizualizowanych obiektach(pędy, depozyty) Daje możliwość uzyskiwania szybkich odpowiedzi podczas analizy: trajektorii, hitów, geometrii
Co można wizualizować? Dane symulacyjne: - części detektora - trajektorie cząstek - depozyty energii (hity) Inne obiekty zdefiniowane przez użytkownika: - linie proste/łamane np. osie współrzędnych - teksty (opisy/komentarze/nazwy...)
Programy do wizualizacji GEANT 4 posiada interfejsy obsługujące siedem zewnętrznych programów do wizualizacji: OpenGl OpenInventor HepRep DAWN VRML RayTracer ASCIITree Różne programy odpowiadają różnym potrzebom Lista poleceń wydawanych z poziomu GEANT4 jest taka sama dla wszystkich programów
Programy do wizualizacji Nie ma jednego programu spełniającego wszystkie nasze wymagania. Trzy będziemy używać podczas zajęć: OpenGl Daje możliwość uzyskiwania szybkich odpowiedzi podczas analizy: trajektorii, hitów, geometrii HepRep Jest narzędziem do wykrywania błędów w geometrii detektora (np. nakładanie się obszarów) Daje możliwość interaktywnego uzyskiwania informacji o wizualizowanych obiektach(pędy.,,,) DAWN Produkuje wysokiej jakości rysunki np. do publikacji
Programy do wizualizacji Pięć interfejsów niewymagających zewnętrznych bibliotek jest zawsze dostępnych w każdej instalacji GEANT'a HepRep Dawn VRML RayTracer ASCIITree Pozostałe wymagają instalacji bibliotek i ustawienia zmiennych środowiskowych podczas kompilacji jądra GEANT4
Sterowanie wizualizacją Niezależnie od interfejsu, kod źródłowy pozostaje w zasadzie taki sam Wizualizacje realizujemy albo za pomocą poleceń interfejsu użytkownika lub z poziomu kodu c++. Na zajęciach ograniczymy się do poleceń UI Niektóre interfejsy działają bezpośrednio w G4 OpenGL, OpenInventor, RayTracer i ASCIITree Przy pracy z innymi GEANT4 produkuje pliki umożliwiające wizualizacje za pomocą innych aplikacji : HepRep, DAWN, VRML Można korzystać z kilku interfejsów w tym samym czasie (np. OpenGL/DAWN)