Zapisz jako PDF

Transkrypt

Zapisz jako PDF
Warsztaty z Metod Terapeutycznych Rok akademicki 2016/17
Spis treści
1 Instalowanie i uruchamianie vGate 7.2
2 Zadanie 1
3 Zadanie 2
4 Zadanie 3
5 Zadanie 4
Instalowanie i uruchamianie vGate 7.2
1. Wejdź do katalogu "Warsztaty z metod terapeutycznych" na pulpicie. Rozpakuj plik
"vGATE72.vdi.7z" (jeśli nie jest już rozpakowany).
2. Uruchom "Oracle VM VirualBox".
Dodaj nową wirtualną maszynę (przycisk "Nowa"). Nadaj jej nazwę vgate7. Wybierz typ
systemu operacyjnego Linux, wersja Ubuntu (32-bit).
W kolejnym oknie wybierz rozmiar pamięci przydzielonej dla wirtualnej maszyny 1024
MB.
W kolejnym oknie wybierz "Użyj istniejącego pliku dysku twardego" i wskaż ścieżkę do
rozpakowanego pliku "vGATE72.vdi".
3. Uruchamianie wirtualnej maszyny
Wybierz dodaną ostatnio maszynę (jeśli jest więcej niż jedna) i naciśnij "Uruchom"
Gdy uruchomi się linux, należy wpisać hasło "virtual"
4. Uruchamianie programu "Gate"
Uruchom terminal.
Za pomocą komend "cd nazwa_katalogu" wejdź do katalogu, w którym znajdują się Twoje
skrypty. Jeśli takiego nie masz, to stwórz go w katalogu ~/Progs/Gate/gate_v7.2/
5. Przydatne linki
Strona Virtual Gate [1]
Wiki na temat vgate 7.2 [2]
Fizyka w vgate 7.2 [3]
Zadanie 1
Zdefiniuj geometrię kolimatora: płaskiego pudła ołowianego, w którym zostało wywiercone
25 okrągłych otworów z powietrza w geometrii sześciokątnej. (za 2 punkty)
Skrypty wywołuje się komendą
/control/execute nazwa_skryptu.mac
Poniżej skrypt, który definiuje właściwości świata i umieszcza w nim kostkę Rubika (3x3 pudełka
utworzone z powietrza). (Na stronie [4] można znaleźć przykłady i więcej opisów jak budować
geometrię)
# na początku trzeba wczytać bazę danych dostępnych materiałów
/gate/geometry/setMaterialDatabase ../GateMaterials.db
# Aby oglądać tworzoną geometrię na etapie jej definiowania;
# podczas dłuższych obliczeń należałoby z tego zrezygnować.
/vis/enable
/control/execute vis.mac
# wymiary świata
/gate/world/geometry/setXLength 100. cm
/gate/world/geometry/setYLength 100. cm
/gate/world/geometry/setZLength 50. cm
# definicja wymiarów, położenia, materiałów z których wykonano pudło
/gate/world/daughters/name pudlo
/gate/world/daughters/insert box
/gate/pudlo/geometry/setXLength 1. cm
/gate/pudlo/geometry/setYLength 1. cm
/gate/pudlo/geometry/setZLength 1. cm
/gate/pudlo/placement/setTranslation 20. . . cm
/gate/pudlo/setMaterial Air
/gate/pudlo/vis/forceWireframe
# powtórzenie pudła po 3 razy w każdą stronę poprzez dodanie do niego
powtarzacza cubicArray
/gate/pudlo/repeaters/insert cubicArray
/gate/pudlo/cubicArray/setRepeatNumberX 3
/gate/pudlo/cubicArray/setRepeatNumberY 3
/gate/pudlo/cubicArray/setRepeatNumberZ 3
/gate/pudlo/cubicArray/setRepeatVector 1.1 1.1 1.1 cm
# przydatne często, gdy wprowadziło się nowe definicje geometrii, które nie
zostały jeszcze zwizualizowane
/gate/geometry/rebuild
Odwołuje się przy tym do skryptu vis.mac
#
V I S U A L I S A T I O N
/vis/open OGLSX
# biblioteka graficzna
/vis/viewer/set/viewpointThetaPhi 60 60
/vis/viewer/zoom 1.5
# powiększenie
# punkt obserwacji
/vis/drawVolume
/vis/viewer/flush
/tracking/verbose
# poziom gadatliwości, czyli ile informacji wyświetlać w
terminalu podczas obliczeń
/tracking/storeTrajectory 1
# ile trajektorii zapamiętywać
/vis/scene/add/trajectories
/vis/scene/endOfEventAction accumulate
Aby włożyć do pudła cylindryczny otwór
/gate/pudlo/daughters/name dziura
# utworzenie otworu
/gate/pudlo/daughters/insert cylinder
/gate/dziura/geometry/setHeight 1. cm
/gate/dziura/geometry/setRmax .15 cm
/gate/dziura/geometry/setRmin . cm
/gate/dziura/placement/setRotationAxis 1
# cylinder można obrócić
/gate/dziura/placement/setRotationAngle 90 deg
/gate/dziura/setMaterial Air
Oczywiście w kolimatorze to nie pudło, a otwór powinien zostac odpowiednią ilość razy powtórzony.
Zadanie 2
Napromieniuj dwoma punktowymi źródełkami Technetu 99 fantom wodny poprzez
kolimator i bez kolimatora. Odczytaj wyniki używając programu ImageJ. (za 2 punkty)
Ustawienie symulowanych zjawisk fizycznych może być dokonane w osobnym pliku (np. fizyka.mac)
Propozycję jego zawartości można znaleźć na stronie [5] Na tej samej stronie widnieje propozycja
ustawienia odcięć w ciele pacjenta ("cuts", czyli zasięg cząstek poniżej którego przestajemy śledzić
cząstkę, bo ma zbyt małą energię, by była dla nas interesująca).
Do zdefiniowanego wcześniej fantomu można dołączyć "aktora", czyli zdolność interakcji z symulacją
- w tym wypadku zapisania do pliku mapy rozkładu zdeponowanej energii w fantomie. Fantom
możemy pociąć na mniejsze elementy (woksele), traktując go jako macierz (np. 100x100 elementów).
#=====================================================
# MATRIX FOR DOSE MAP OUTPUT
#=====================================================
/gate/actor/addActor
doseDistribution
/gate/actor/doseDistribution/save
nazwa_katalogu/plik_wynikowy.hdr
/gate/actor/doseDistribution/attachTo
/gate/actor/doseDistribution/stepHitType
DoseActor
moj_fantom
random
/gate/actor/doseDistribution/setPosition
cm
# fantom podzielony na macierz, nie interesuje nas pomiar wgłąb (gdyby
interesował, należałoby podać też trzecią rozdzielczość)
/gate/actor/doseDistribution/setResolution
100 100 1
/gate/actor/doseDistribution/saveEveryNSeconds
60
/gate/actor/doseDistribution/enableEdep
true
# będziemy mierzyć
zdeponowaną energię
/gate/actor/doseDistribution/enableUncertaintyEdep false # innych możliwych
wielkości (niepewności, dawki, ilości zliczeń) na razie nie będziemy mierzyć
/gate/actor/doseDistribution/enableDose
false
/gate/actor/doseDistribution/enableUncertaintyDose false
/gate/actor/doseDistribution/enableNumberOfHits
false
/gate/actor/addActor
SimulationStatisticActor stat
/gate/actor/stat/save
output/stat-wynik.txt
/gate/actor/stat/saveEveryNSeconds 60
Po zdefiniowaniu geometrii, zjawisk fizycznych oraz aktora, a przed zdefiniowaniem źródeł i
uruchomieniem symulacji należy dokonać inicjalizacji
#=====================================================
# INITIALISATION
#=====================================================
/gate/run/initialize
Teraz zdefiniujemy pojedyncze źródełko.
# D E F I N E T H E S O U R C E
#####
/gate/source/addSource zrodlo
/gate/source/zrodlo/gps/type Volume
/gate/source/zrodlo/gps/shape Cylinder
/gate/source/zrodlo/gps/radius 2. cm
/gate/source/zrodlo/gps/halfz 14.5 cm
/gate/source/zrodlo/gps/centre . . 30. cm
/gate/source/zrodlo/gps/particle gamma
/gate/source/zrodlo/gps/energy 140. keV
# taka jest energia promieniowania
Tc 99
/gate/source/zrodlo/setActivity 30000. Bq
/gate/source/zrodlo/gps/angtype iso
W niektórych wypadkach może być wygodnie podłączyć do zdefiniowanego wcześniej obiektu, na
przykład tak (jeśli wcześniej zdefiniowaliśmy obiekt kolorowa_pastylka):
/gate/source/zrodlo/attachTo kolorowa_pastylka
Jeśli źródełka nie dołączyliśmy do żadnego zewnętrznego obiektu, i tak można je pokazać:
/gate/source/zrodlo/visualize
Zanim uruchomimy symulację, powinniśmy zdefiniować generator liczb pseudolosowych oraz
warunek, po którym zakończy się symulacja.
#
R A N D O M
# Definiujemy rodzaj generatora liczb pseudolosowych i ziarno początkowe dla
jego algorytmu
# Do wyboru: JamesRandom, Ranlux64 lub MersenneTwister
/gate/random/setEngineName Ranlux64
/gate/random/setEngineSeed auto
# E X P E R I M E N T
# Definiujemy czas trwania eksperymentu
/gate/application/setTimeSlice
60. s
/gate/application/setTimeStart
.
s
/gate/application/setTimeStop
60. s
# Choć można też zamiast liczyć czasu, liczyć wyprodukowane cząstki:
# /gate/application/setTotalNumberOfPrimaries 350000
Jeśli chcemy ograniczyć ilość informacji wyrzucanych na terminal, możemy zmniejszyć do zera
gadatliwość programu:
# V E R B O S I T Y czyli gadatliwość
/control/verbose
/run/verbose
/event/verbose
/tracking/verbose
/gate/random/verbose
/gate/application/noGlobalOutput
Dopiero w tym momencie możemy rozpocząć obliczenia:
# L E T' S
R U N
T H E
/gate/application/startDAQ
S I M U L A T I O N
!
Wynikiem symulacji będzie plik_wynikowy.img oraz plik_wynikowy.hdr. Pliki te znajdują się w
jednym katalogu, pierwszy zawiera dane, drugi zawiera nagłówek, czyli opis, jak te dane powinny
być interpretowane. Możemy wczytać je, obejrzeć i analizować za pomocą programu ImageJ.
Zadanie 3
Powtórzyć eksperyment Podgorsak et al, Design of X-ray targets for high energy linear accelerators
in radiotherapy. Przyda się jeszcze parę praktycznych uwag:
# Filtr, czyli stożek = cone
/gate/world/daughters/name filtr
/gate/world/daughters/insert cone
/gate/filtr/geometry/setRmax1 12. cm
#/gate/filtr/geometry/setRmin1 0. cm
#/gate/filtr/geometry/setRmax2 0. cm
#/gate/filtr/geometry/setRmin2 0. cm
/gate/filtr/geometry/setHeight 3.4 cm #25.0 cm
/gate/filtr/placement/setTranslation . . 40. cm
/gate/filtr/placement/setRotationAxis 1
/gate/filtr/placement/setRotationAngle 180 deg
/gate/filtr/setMaterial Aluminium
/gate/filtr/vis/setColor yellow
#/gate/linac/vis/forceWireframe #forceSolid
#UWAGA! dodać do skryptu po inicjalizacji
#=====================================================
# ELECTRON BEAM
#=====================================================
/gate/source/addSource mybeam gps #general particle source
/gate/source/mybeam/gps/particle e/gate/source/mybeam/gps/pos/type Beam
/gate/source/mybeam/gps/pos/rot1 1 #wektory wyznaczające płaszczyznę
przekroju wiązki
/gate/source/mybeam/gps/pos/rot2 1
/gate/source/mybeam/gps/pos/shape Circle
/gate/source/mybeam/gps/pos/centre
-3 cm #położenie
/gate/source/mybeam/gps/pos/sigma_x 1 mm
/gate/source/mybeam/gps/pos/sigma_y 1 mm
/gate/source/mybeam/gps/ene/mono 25 MeV
/gate/source/mybeam/gps/ene/type Gauss #typ rozmycia w funkcji energii
/gate/source/mybeam/gps/ene/sigma 0.5 MeV
/gate/source/mybeam/gps/direction
1
Pod adresem [6] można znaleźć różne inne typy actora, np. Energy spectrum. Daje on możliwość
zapisania widma energii w formacie .root. Aby je obejrzeć należy w terminalu otworzyć program o
nazwie root i napisać magiczną komendę TBrowser t (która nie jest tak bardzo magiczna, tworzy po
prostu nowy obiekt o nazwie t typu TBrowser; ale roota nie będziemy się szczegółowo uczyć; aby go
opuścić trzeba napisać .quit) i otworzyć plik, który nas interesuje.
Zadanie 4
Poniższy skrypt w programie root powinien narysować histogram pozycji z singli, których pozycja z
była dodatnia. Analogicznie można by narysować histogram energii singli, których pozycja z była
dodatnia. Itd. Można to podejście zastosować do policzenia ilości singli (lub hitów) spełniających
jakiś warunek.
{
TFile *f =
if (!f) {
(TFile*)gROOT->GetListOfFiles()->FindObject("kalibracja2.root");
f = new TFile("kalibracja2.root");
}
//TFile *f = TFile::Open("benchSPECT.root");
TTree *Singles = (TTree*)gDirectory->Get("Singles");
//Float_t
energy;
Float_t gPZ, sPZ;
//Singles->SetBranchAddress("energy",&energy);
Singles->SetBranchAddress("globalPosZ",&gPZ);
Singles->SetBranchAddress("sourcePosZ",&sPZ);
//TH1F *ener = new TH1F("ener","energia",100,0,0.2);
TH1F *posZ = new TH1F("pozycjaZ", "pozycja Z", 100,,150);
Int_t nentries = Singles->GetEntries();
Int_t nbytes = ;
for (Int_t i=; i<nentries;i++) {
nbytes += Singles->GetEntry(i);
if (sPZ>)
posZ.Fill(gPZ);
//
ener.Fill(energy);
}
// **************************************** Plots
**********************************************
TCanvas cont("contours","kontury",100,100,800,600);
cont.SetFillColor();
posZ->SetFillColor(2);
posZ->SetFillStyle(3023);
//posZ->GetXaxis()->SetTitle("");
posZ.Draw();
}

Podobne dokumenty