Warsztaty z Metod Terapeutycznych: Różnice pomiędzy wersjami

Z Brain-wiki
Linia 155: Linia 155:
 
/gate/source/zrodlo/gps/radius 2. cm
 
/gate/source/zrodlo/gps/radius 2. cm
 
/gate/source/zrodlo/gps/halfz 14.5 cm
 
/gate/source/zrodlo/gps/halfz 14.5 cm
/gate/source/zrodlo/gps/centre 0. 0. 0. cm
+
/gate/source/zrodlo/gps/centre 0. 0. 30. cm
 
/gate/source/zrodlo/gps/particle gamma
 
/gate/source/zrodlo/gps/particle gamma
/gate/source/zrodlo/gps/energy 140. keV
+
/gate/source/zrodlo/gps/energy 140. keV   # taka jest energia promieniowania Tc 99
 
/gate/source/zrodlo/setActivity 30000. Bq
 
/gate/source/zrodlo/setActivity 30000. Bq
 
/gate/source/zrodlo/gps/angtype iso
 
/gate/source/zrodlo/gps/angtype iso
 +
</source>
  
# W niektórych wypadkach może być wygodnie podłączyć do zdefiniowanego wcześniej obiektu, np.
+
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):
 +
<source lang='c'>
 
/gate/source/zrodlo/attachTo kolorowa_pastylka
 
/gate/source/zrodlo/attachTo kolorowa_pastylka
 +
</source>
 +
 +
Jeśli źródełka nie dołączyliśmy do żadnego zewnętrznego obiektu, i tak można je pokazać:
 +
<source lang='c'>
 +
/gate/source/zrodlo/visualize
 +
</source>
 +
 +
Zanim uruchomimy symulację, powinniśmy zdefiniować generator liczb pseudolosowych oraz warunek, po którym zakończy się symulacja.
 +
 +
<source lang='c'>
 +
#  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      0.    s
 +
/gate/application/setTimeStop      60.  s
 +
# Choć można też zamiast liczyć czasu, liczyć wyprodukowane cząstki:
 +
# /gate/application/setTotalNumberOfPrimaries 350000
 +
</source>
 +
 +
Jeśli chcemy ograniczyć ilość informacji wyrzucanych na terminal, możemy zmniejszyć do zera gadatliwość programu:
 +
<source lang='c'>
 +
# V E R B O S I T Y czyli gadatliwość
 +
/control/verbose 0
 +
/run/verbose 0
 +
/event/verbose 0
 +
/tracking/verbose 0
 +
/gate/random/verbose 0
 +
/gate/application/noGlobalOutput
 +
</source>
 +
 +
Dopiero w tym momencie możemy rozpocząć obliczenia:
 +
<source lang='c'>
 +
# L E T' S  R U N  T H E  S I M U L A T I O N  !
 +
/gate/application/startDAQ
 
</source>
 
</source>

Wersja z 13:40, 12 paź 2016

Warsztaty z Metod Terapeutycznych Rok akademicki 2016/17

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. 0. 0. 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   # punkt obserwacji
/vis/viewer/zoom 1.5   # powiększenie
/vis/drawVolume
/vis/viewer/flush
/tracking/verbose 0   # 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 0. cm
/gate/dziura/placement/setRotationAxis 0 1 0 	# 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 cząstek o jakim średnim zasięgu już nie śledzimy).

Do zdefiniowanego wcześniej fantomu można dołączyć "aktora", czyli zdolność interakcji z symulacją - w tym wypadku zapisania zdeponowanej energii w fantomie. Fantom możemy potraktować jako macierz 100x100 elementów.

#=====================================================
# MATRIX FOR DOSE MAP OUTPUT
#=====================================================

/gate/actor/addActor                               DoseActor  doseDistribution
/gate/actor/doseDistribution/save                  output/plik_wynikowy.hdr
/gate/actor/doseDistribution/attachTo    	   moj_fantom
/gate/actor/doseDistribution/stepHitType           random
/gate/actor/doseDistribution/setPosition           0 0 0 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 0. 0. 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      0.    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 0
/run/verbose 0
/event/verbose 0
/tracking/verbose 0
/gate/random/verbose 0
/gate/application/noGlobalOutput

Dopiero w tym momencie możemy rozpocząć obliczenia:

# L E T' S   R U N   T H E   S I M U L A T I O N  !
/gate/application/startDAQ