Środowisko programistyczne GEANT4

Podobne dokumenty
Środowisko programistyczne GEANT4

Środowisko programistyczne GEANT4

Środowisko programistyczne GEANT4

GEANT4. Leszek Adamczyk. Interfejs użytkownika -2 Geometria -2

Środowisko programistyczne GEANT4

Środowisko programistyczne GEANT4

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie obiektowe

Programowanie obiektowe

Środowisko programistyczne GEANT4

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wstęp do Programowania 2

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Zaawansowane programowanie w C++ (PCP)

.NET Klasy, obiekty. ciąg dalszy

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Zaawansowane programowanie w C++ (PCP)

C++ Przeładowanie operatorów i wzorce w klasach

PHP 5 język obiektowy

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

TEMAT : KLASY DZIEDZICZENIE

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Algorytmy i Struktury Danych. Anna Paszyńska

Kurs WWW. Paweł Rajba.

Środowisko programistyczne GEANT4

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Zaawansowane programowanie w C++ (PCP)

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Wykład 4. Klasa List Kolejki Stosy Słowniki

Szablony funkcji i szablony klas

Szablony klas, zastosowanie szablonów w programach

> C++ dziedziczenie. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Programowanie 2. Język C++. Wykład 9.

Wykład 3 Składnia języka C# (cz. 2)

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Platformy Programistyczne Podstawy języka Java

UML a kod. C++, Java i C#

Dokumentacja do API Javy.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

GEANT4. Leszek Adamczyk. Geometria detektora

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Programowanie obiektowe Wykład 7. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/20

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie (C++) NI 5

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Środowisko programistyczne GEANT4

TEMAT : KLASY POLIMORFIZM

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Wstęp do programowania obiektowego. Wykład 2

11.6 Klasa do obsługi liczb wymiernych

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe w C++ Wykład 12

Materiały do zajęć VII

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

PARADYGMATY PROGRAMOWANIA Wykład 2

Programowanie w języku C++

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Metody Metody, parametry, zwracanie wartości

Programowanie obiektowe

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Język Java część 2 (przykładowa aplikacja)

Enkapsulacja, dziedziczenie, polimorfizm

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Programowanie obiektowe w VB cz 2

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Przeciążenie operatorów

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Identyfikacje typu na etapie. wykonania (RTTI)

dr inż. Jarosław Forenc

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Programowanie obiektowe

Klasy i obiekty cz II

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Język Java część 2 (przykładowa aplikacja)

Dziedziczenie & W slajdach są materiały zapożyczone z

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Transkrypt:

Środowisko programistyczne GEANT4 Leszek Adamczyk Wydział Fizyki i Informatyki Stosowanej Akademia Górniczo-Hutnicza Wykłady w semestrze zimowym 2015/2016

Wyniki symulacji Majac zdefiniowaną: geometrię; listę procesów fizycznych; kinematykę czastek pierwotnych GEANT wykonuje symulacje. Użytkownik musi napisać kawałek kodu aby uzyskać dostęp do informacji dla niego użytecznej. Można zrobić to na cztery sposoby: Korzystaj ac z klas G4UserTrackingAction, G4UserSteppingAction i G4UserStackingAction. Mamy dostęp do pełnej informacji ale sami musimy zadbać o jej przetwarzanie w trakcie procesowania przypadku.

Wyniki symulacji Implementujac klasę G4VSensitiveDetector. GEANT automatycznie przetwarza informację, zapisujac ja w postaci obiektów klasy G4VHit. Użytkownik ma dostęp do pełnego zbioru hitów (G4THitsCollection ) po zakończeniu procesowania przypadku korzystajac z klasy G4UserEventAction Korzystajac z gotowej implementacji klasy G4VSensitiveDetector tzw. G4MultiFunctionalDetector opartej o obiekty G4VPrimitiveScorer. Proste liczniki tworza mapy, G4THitsMap, dostępne dla użytkownika po zakończeniu procesowania przypadku. W GEANT mapa jest tablica indeksowaną liczba naturalna, będac a najczęściej numerem kopii obszaru logicznego. HitsMap najczęściej stosuje się w aplikacjach nie wymagajacych informacji dla każdego przypadku a jedynie wysumowanej po wszystkich przypadkach. Korzystanie z wbudowanych w UI prostych liczników tworzacych HitsMap na podstawie geometrii niezależnej (równoległej) do geometrii detektora.

Wyniki symulacji Obiekty klasy G4VSensitiveDetector (G4MultiFunctionalDetector), przypisujemy obszarom logicznym. Tworzac geometrię detektora, czasami należy drobniej podzielić obszar detektora niż by to wynikało z jego budowy fizycznej. Np. aby uzyskać informacje z mniejszych obszarów. Powinniśmy korzystać z wielokrotnego umieszczania tego samego obszaru logicznego (Parameterised, Replica), wtedy używamy jednego obiektu klasy SensitiveDetector a jego HitsMap w naturalny sposób indeksowana jest numerem kopii tego obszaru.

MultiFunctionalDetector G4MultiFunctionalDetector jest implementacja klasy bazowej G4VSensitiveDetector. Zamiast samemu implementować SensitiveDetector budujemy go rejestrujac obiekty klasy PrimitiveScorer do MultiFuntionalDetector. G4VPrimitiveScorer jest klasa bazową z której wyprowadzamy konkretne klasy pochodne. Istnieje szereg gotowych klas np: G4PSEnergyDeposit lub G4PSTrackLength. Pełna lista w rozdziale 4.4.6 (Application Developers Guide)

MultiFunctionalDetector Aby korzystać z funkcjonalności MultiFunctionalDetector należy: Utworzyć obiekt klasy G4MultiFunctionalDetector; Zarejestrować go do SensitiveDetectorManager a (obiekt klasy G4SDManager); Przypisać MultiFunctionalDetector do jednego lub kilku obszarów logicznych; Utworzyć obiekt lub kilka obiektów klasy PrimitiveScorer; Zarejestrować PrimitiveScorer s do MultiFunctionalDetector

Aplikacja My

Aplikacja My // Create a new sensitive detector named "MyDetector" G4MultiFunctionalDetector* detector = new G4MultiFunctionalDetector("MyDetector"); // Get pointer to detector manager G4SDManager* manager = G4SDManager::GetSDMpointer(); // Register detector with manager manager->addnewdetector(detector); // Attach detector to scoring volume scorelogical->setsensitivedetector(detector); // Create a primitive Scorer named MyScorer G4PSSphereSurfaceCurrent* scorer = new G4PSSphereSurfaceCurrent("MyScorer", fcurrent_in); // Register scorer with detector detector->registerprimitive(scorer);

G4THitsMap Każdy G4VPrimitiveScorer generuje jedna mapę G4THitsMap<G4double> na przypadek. Mapa ta jest tablica o wartościach G4double indeksowaną numerem kopii obszaru logicznego do którego przypisany jest MultiFunctionalDetector. Mapa może być indeksowana numerem kopii matki (babci, itd). Trzeci parametr konstruktora obiektu PrimitiveScorer określa którego przodka numer kopii będzie indeksem mapy. G4PSSphereSurfaceCurrent(...,..., G4int depth=0); W bardziej skomplikowanych schematach indeksowania można zaimplementować własna metodę GetIndex()

G4VSDFilter Obiekt klasy SDFilter może być przypisany do PrimitiveScorer w celu określenia na jaki rodzaj czastek dany licznik jest czuły. Istnieja cztery gotowe implementacje klasy G4VSDFilter: G4SDChargedFilter G4SDNeutralFilter G4SDParticleFilter G4SDKineticEnergyFilter G4VSDFilter* gammafilter = new G4SDParticleFilter("gammaFilter"); gammafilter->add("gamma"); scorer->setfilter(gammafilter);

G4HCofThisEvent G4HCofThisEvent jest klasa która zawiera HitsCollection oraz HitsMap dla danego przypadku. HitsMap jest dostępna z HCofThisEvent poprzez unikalny numer identyfikacyjny danej HitsMap. Numer identyfikacyjny można uzyskać poprzez funkcję G4SDManager::GetCollectionID() G4SDManager* manager = G4SDManager::GetSDMpointer(); G4int mapid = manager-> GetCollectionID("MyDetector/MyScorer") // G4Event* evt G4HCofThisEvent* hce = evt->gethcofthisevent(); G4THitsMap<double>* eventgammascorer = (G4THitsMap<double>*) (hce->gethc(mapid));

G4THitsMap G4THitsMap<G4double> ma wbudowane operatory: operator indeksowania map[index] zwraca wskaźnik do elementu mapy o indeksie index Wskaźnik o wartości zero oznacza że nie istnieje element mapy o indeksie index map1 + = map2 Dodaje wartości mapy map2 do odpowiednich wartości mapy map1. Usprawnia akumulacje danych po wszystkich przypadkach.

Przykład G4SDManager* manager = G4SDManager::GetSDMpointer(); G4int mapid = manager-> GetCollectionID("MyDetector/MyScorer") // G4Event* evt G4HCofThisEvent* hce = evt->gethcofthisevent(); G4THitsMap<double>* eventgammascorer = (G4THitsMap<double>*) (hce->gethc(mapid)); // G4THitsMap<G4double> rungammascorer rungammascorer += *eventgammascorer; for (G4int i=0; i<rungammascorer.getsize(); i++) { G4cout<< rungammascorer[i] << G4endl; }

G4UserRunAction Po zakończeniu procesowania przypadku obiekt klasy G4Event posiada informację o HitsMap i HitsCollection dla danego przypadku. Użytkownik musi napisać kawałek kodu aby np. sumować wartości HitsMap lub zapisywać je do dalszej analizy. Można to zrobić na wiele sposobów; Na warsztatach zaimplementujemy własne klasy G4UserRunAction oraz G4Run. Klasa G4UserRunAction ma następujace motody wirtualne: BeginOfRunAction() EndOfRunAction() GenerateRun() - służy do utworzenia obiektu samodzielnie zaimplementowanej klasy G4Run

G4Run Klasa reprezentuj aca zbiór przypadków. Obiekt tej klasy jest tworzony i niszczony przez RunManagera (bezpośrednio lub za pośrednictwem funkcji GenerateRun() klasy G4UserRunAction). Funkcja składowa G4Run::RecordEvent jest automatycznie wywoływana przez RunManagera po zakończeniu procesowania każdego przypadku. W tej funkcji mamy dostęp do HitsMap i HitsCollection po każdym przypadku.

G4VHitsCollection Klasa G4VHitsCollection jest klasa bazową z której wyprowadzono klasy szablonowe G4THitsCollection oraz G4THitsMap G4THitsCollection jest szablonowa klasa pojemnikową typu vector służac a do przechowywania wskaźników do obiektów jednej konkretnej klasy wyprowadzonej z klasy G4VHit (hitów) G4THitsMap jest szablonowa klasa pojemnikową typu map służac a do przechowywania wskaźników do obiektów jednej konkretnej (ale dowolnej) klasy indeksowanej dowolna wartościa. Moga to być hity ale nie musza np. PrimitiveScorer używaja G4THitsMap które zawieraja wskaźniki do wartości G4double indeksowane liczba naturalna.

G4VHit Klasa bazowa G4VHit służy do wyprowadzania własnych klas hitów zawierajacych potrzebna nam informację np.: pozycje i czas kroku (G4Step) pęd i energie czastek (G4Track) depozyty energii podczas kroku (G4Step) informacje geometryczne Hit przechowywany jest w dedykowanej kolekcji która jest instancja klasy szablonowej G4THitsCollection HitsCollection dostępna jest z obiektu klasy G4Event poprzez obiekt klasy G4HCOfThisEvent

Diagram klas

Diagram klas

Diagram klas

G4VHit - przykład Przykład z warsztatów implementacji klasy wyprowadzonej z klasy G4VHit Wyprowadzimy klasę np. MyPhotonHit zawierajac a informację o energii i pozycji każdego fotonu docierajacego do sfery otaczajacej tarczę berylowa. Klasa G4VHit zawiera dwie czysto wirtualne metody Draw oraz Print które można zaimplementować jeśli chce się np. wizualizować hity

MyPhotonHit.hh class MyPhotonHit : public G4VHit { public: // Constructor MyPhotonHit(); // Destructor virtual ~MyPhotonHit(); // Methods // void Draw() // void Print() // Photon energy inline void SetEnergy(G4double energy) {fenergy = energy;} inline G4double GetEnergy() const {return fenergy;} // Photon position inline void SetPosition(G4ThreeVector position) {fposition = position;} inline G4ThreeVector GetPosition() const {return fposition;} private: //Data Members G4double fenergy; G4ThreeVector fposition; };

MyPhotonHit.cc #include "MyPhotonHit.hh" MyPhotonHit::MyPhotonHit() :fenergy(0),fposition() {} MyPhotonHit::~MyPhotonHit() {}

G4VSensitiveDetector Aby zaimplementować własna klasę SensitiveDetector użytkownik musi: w konstruktorze dodać nazwy HitCollection s do wektora collectionname oraz dokonać instancji klasy G4VSensitiveDetector utworzyć i dopisać HitCollection do obiektu G4HCOfThisEvent w jednej z dwóch metod Initialize() lub EndOfEvent() zaimplementować metodę ProcessHits(). W niej tworzymy hity oraz dodajemy je do HitCollection

MyPhotonSD.hh class MyPhotonSD : public G4VSensitiveDetector { public: // Constructor MyPhotonSD(const G4String& name); // Destructor virtual ~MyPhotonSD(); // Methods void Initialize(G4HCofThisEvent* hitscollectionofthisevent); G4bool ProcessHits(G4Step* astep,g4touchablehistory* history); void EndOfEvent(G4HCofThisEvent* hitscollectionofthisevent); private: }; // Data members G4THitsCollection<MyPhotonHit>* fphotoncollection; G4int fphotoncollectionid;

MyPhotonSD.cc MyPhotonSD::MyPhotonSD(const G4String& name) :G4VSensitiveDetector(name) { collectionname.insert("photoncollection"); fphotoncollectionid = -1; } MyPhotonSD::~MyPhotonSD() {} void MyPhotonSD::Initialize(G4HCofThisEvent* hitscollectionofthisevent) { // Create a new collection fphotoncollection = new G4THitsCollection<MyPhotonHit> (SensitiveDetectorName, collectionname[0]); if( fphotoncollectionid < 0) fphotoncollectionid = G4SDManager::GetSDMpointer() ->GetCollectionID(fPhotonCollection); // Add collection to the events hitscollectionofthisevent->addhitscollection (fphotoncollectionid,fphotoncollection); }

MyPhotonSD.cc G4bool MyPhotonSD::ProcessHits(G4Step* astep, G4TouchableHistory*) { // Create a new hit MyPhotonHit* ahit = new MyPhotonHit(); // Get energy and position G4double energy = astep->gettrack()->gettotalenergy(); G4ThreeVector position = astep->gettrack()->getposition(); // Set energy and position ahit->setenergy(energy); ahit->setposition(position); // Insert hit into the collection fphotoncollection->insert(ahit); }

G4Step Niektóre metody klasy G4Step umożliwiajace dostęp do informacji o symulacji: GetTrack() - dostęp do informacji o czastce która generuje krok; GetPre(Post)StepPoint() - dostęp do informacji geometrycznych o poczatku i końcu kroku (pozycja, czas, materiał,...) GetStepLength() - długość kroku; GetTotalEnergyDeposit() - całkowity depozyt energii w materiale podczas wykonywania kroku; GetDeltaXXXXX() - informacja o zmianie pędu, energii, pozycji,... czastki generujacej krok IsFirst(Last)StepInVolume() - wskazuje czy aktualny krok jest pierwszym(ostatnim) w danym obszarze detektora.

G4HCOfThisEvent Obiekt klasy G4HCOfThisEvent zawiera wszystkie kolekcje hitów dla danego przypadku. Wskaźnik do danej kolekcji może mieć wartość NULL jeśli dana kolekcja nie została utworzona. Kolekcje hitów sa dostępne za pomoca wskaźników do klasy bazowej G4VHitsCollection, zatem musza być rzutowane na konkretny typ danej kolekcji. Numer identyfikacyjny danej kolekcji jest unikalny i taki sam dla każdego przypadku. Można go uzyskać za pomoca funkcji: SDManager::GetCollectionID(nazwaSD/nazwaKolekcji) SDManager::GetCollectionID(G4VHitsCollection*)