Środowisko programistyczne GEANT4

Podobne dokumenty
Środowisko programistyczne GEANT4

Ś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

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

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

.NET Klasy, obiekty. ciąg dalszy

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

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

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

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

Aplikacje w środowisku Java

Zaawansowane programowanie w C++ (PCP)

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

Zaawansowane programowanie w C++ (PCP)

Dokumentacja do API Javy.

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

Wstęp do Programowania 2

Programowanie Obiektowe i C++

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

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

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

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

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

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

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

Materiały do zajęć VII

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

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

Wykład 8: klasy cz. 4

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

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

Kurs WWW. Paweł Rajba.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

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

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

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

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe. Dr hab. Inż. Marta Gładysiewicz-Kudrawiec Pokój 229 A1 Operatory new delete pliki-odczyt

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

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Środowisko programistyczne GEANT4

dr inż. Jarosław Forenc

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

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

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

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

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

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

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

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

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

PHP 5 język obiektowy

TEMAT : KLASY DZIEDZICZENIE

Programowanie Obiektowe i C++

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

Czym są właściwości. Poprawne projektowanie klas

Języki i techniki programowania Ćwiczenia 2

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Przeciążenie operatorów

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

10. Programowanie obiektowe w PHP5

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Interfejsy i klasy wewnętrzne

Algorytmy i Struktury Danych. Anna Paszyńska

Technologie obiektowe

Wprowadzenie do programowanie obiektowego w języku C++

Wstęp do programowania obiektowego. Wykład 2

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

Modelowanie diagramów klas w języku UML. Łukasz Gorzel @stud.umk.pl 7 marca 2014

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Definiowanie własnych klas

Systemy Rozproszone - Ćwiczenie 6

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

Dziedziczenie jednobazowe, poliformizm

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

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

Wzorce projektowe. dr inż. Marcin Pietroo

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Instrukcja laboratoryjna cz.3

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

Szablony funkcji i szablony klas

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

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

Diagramy klas. dr Jarosław Skaruz

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

Transkrypt:

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

Generacja czastek pierwotnych Użytkownik musi wyprowadzić własna klasę z klasy bazowej G4VUserPrimaryGeneratorAction implementujac wirtualna funkcję GeneratePrimaries(); Klasa ta sama nie generuje czastek pierwotnych steruje jedynie zewnętrznymi generatorami: Konstruktor powinien dokonać instancji generatora(ów) (własnego lub wbudowanego w GEANT4); Metoda GeneratePrimaries() - może randomizować niektóre wielkości używane przez generatory - musi wywołać funkcje GeneratePrimaryVertex() zaimplementowana w generatorze.

include/myprimarygeneratoraction.hh class G4ParticleGun; class G4Event; class MyPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { public: // Constructor MyPrimaryGeneratorAction(); // Destructor virtual ~MyPrimaryGeneratorAction(); // Method void GeneratePrimaries(G4Event*); private: }; // Data member G4ParticleGun* particlegun;

src/myprimarygeneratoraction.cc MyPrimaryGeneratorAction::MyPrimaryGeneratorAction() { particlegun = new G4ParticleGun(); // Inicjalizacja... } MyPrimaryGeneratorAction::~MyPrimaryGeneratorAction() { delete particlegun; } void MyPrimaryGeneratorAction::GeneratePrimaries(G4Event* anevent) { // Randomizacja... particlegun->generateprimaryvertex(anevent); }

G4VPrimaryGenerator Informacja o czastkach pierwotnych musi być przypisana do obiektu klasy G4Event przed jego procesowaniem. Implementujac własny generator musimy zaimplementować dwie klasy których instancje sa tworzone w funkcji GeneratePrimaryVertex G4PrimaryVertex - określa miejsce i czas pojawienia się czastki pierwotnej G4PrimaryParticle - określa rodzaj czastki, pęd poczatkowy, polaryzacje, ewentualnie kanały rozpadu,... Każdy generator reprezentowany jest przez klasę wyprowadzoną z klasy G4VPrimaryGenerator. GEANT4 zawiera kilka gotowych implementacji: prosty generator G4ParticleGun interfejsy do zewnętrznych generatorów HEP G4HEPEvtInterface, G4HEPMCInterface rozbudowany generator G4GeneralParticleSource

GeneralParticleSource Generator GeneralParticleSource: Losowy wybór miejsca generacji na powierzchni zadanej bryły; Losowy wybór energii z zadanego widma energetycznego. Użyteczny do generacji czastek ze źródeł radioaktywnych. Szczególnie użyteczny w zastosowaniach medycznych oraz środowiska kosmicznego Zaawansowane przykłady w dystrybucji GEANT 4: x-ray_telescope underground_physics Szczegółowy opis /http://reat.space.qinetiq.com.gps/

ParticleGun Generator ParticleGun: Generuje czastkę o zadanej energii i kierunku z zadanego miejsca w zadanym czasie; Welkości te określamy za pomoca szeregu metod: SetParticleDefinition() - rodzaj czastki SetParticleEnergy() - energia kinetyczna SetParticleMomentumDirection() - kierunkek SetParticlePosition() - miejsce... polaryzacje, czas, pęd Wywołujemy je w konstruktorze klasy PrimaryGeneratorAction() jeśli nie będa ulegać zmianie. lub w metodzie GeneratePrimaries jeśli wielkości te podlegaja zmienom z przypadku na przypadek;

ParticleGun: Przykład MyPrimaryGeneratorAction::MyPrimaryGeneratorAction() { G4int n_particle = 1; particlegun = new G4ParticleGun(n_particle); G4ParticleTable* particletable = G4ParticleTable::GetParticleTable(); G4ParticleDefinition* particle = particletable->findparticle("e-"); particlegun->setparticledefinition(particle); particlegun->setparticlemomentumdirection(g4threevector(0.,0.,1.)); particlegun->setparticleenergy(1.*gev); particlegun->setparticleposition(g4threevector(0.,0.,-10.*cm));

ParticleGun: Randomizacja W celu randomizacji generacji czastek pierwotnych korzystamy z: generatora liczb pseudolosowych G4UniformRand zdefiniowanego w Randomize.hh który generuje liczby losowe z przedziału [0,1] z rozkładu jednorodnego; klasy HEPRandom.hh umożliwiajacej generację liczb z szeregu rozkładów np.: eksponencjalnego, normalnego, Poissona, Breita-Wignera,...; wywołania odpowiedniej metody typu Set klasy G4ParticleGun w metodzie GeneratePrimaries

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