Professional Documents
Culture Documents
W YDZIAŁ F IZYKI
Z AKŁAD F IZYKI J ADROWEJ
˛
P RACA IN ŻYNIERSKA
Oprogramowanie ćwiczenia
“Badanie efektu Comptona”
Software developement for “Compton
Effect” excercise
Jacek Bzdak
nr. albumu: 196909
WARSZAWA 2009
The first 90% of the code accounts for the first
90% of the development time. The remaining
10% of the code accounts for the other 90% of
the development time.
Tom Cargill
On two occasions I have been asked, ’Pray, Mr.
Babbage, if you put into the machine wrong
figures, will the right answers come out?’ I am
not able rightly to apprehend the kind of
confusion of ideas that could provoke such a
question.
Charles Babbage
Defensive programming? Never! Klingon
programs are always on the offense. Yes,
Offensive programming is what we do best
ii
Streszczenie
iii
Abstract
iv
Spis treści
Spis treści v
Wstep
˛ vii
1 Eksperyment Comptona 1
1.1 Fizyka doświadczenia . . . . . . . . . . . . . . . . . . . . . 1
1.2 Oryginalny układ pomiarowy . . . . . . . . . . . . . . . . . 3
1.3 Wyniki Comptona . . . . . . . . . . . . . . . . . . . . . . . 4
2 Tor spektrometryczny 8
2.1 Cześć
˛ mechaniczna . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Opis urzadze
˛ ń . . . . . . . . . . . . . . . . . . . . . . . . . 9
3 Opis programu 12
3.1 Architektura . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Moduły programu . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Opis systemu Maven . . . . . . . . . . . . . . . . . . . . . 13
3.4 Moduł dies-irae:dies-irae . . . . . . . . . . . . . . . . 15
3.5 Moduł dies-irae:dies-assembly . . . . . . . . . . . . . 18
3.6 Moduł dies-irae:dies-config . . . . . . . . . . . . . . 20
3.7 Moduł dies-irae:encore-silniki . . . . . . . . . . . . 21
3.8 Moduł genie-connector . . . . . . . . . . . . . . . . . . . 25
3.9 Moduł encore-symulacja . . . . . . . . . . . . . . . . . . 41
3.10 Moduł dies-gui . . . . . . . . . . . . . . . . . . . . . . . . 42
3.11 Moduł dies-peakfinder . . . . . . . . . . . . . . . . . . . 45
4 Dystrybucja programu 47
4.1 Struktura projektu . . . . . . . . . . . . . . . . . . . . . . . 47
4.2 Budowanie projektu . . . . . . . . . . . . . . . . . . . . . . 47
4.3 Struktura gotowego programu . . . . . . . . . . . . . . . . 48
4.4 Edycja projektu . . . . . . . . . . . . . . . . . . . . . . . . 48
4.5 Wymagania projektu . . . . . . . . . . . . . . . . . . . . . 50
5 Eksperyment 52
5.1 Cele ćwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.2 Przykładowe sprawozdanie . . . . . . . . . . . . . . . . . . 52
5.3 Peryspektywy rozwoju . . . . . . . . . . . . . . . . . . . . . 56
Bibliografia 65
v
Spis rysunków 67
Załaczniki
˛ 69
Słownik terminów programistycznych . . . . . . . . . . . . . . 69
Oznaczenia na diagramach UML . . . . . . . . . . . . . . . . . 69
vi
Wstep
˛
vii
Rozdział 1
Eksperyment Comptona
1
Zderzenie opisuja˛ nastepuj
˛ ace
˛ zasady zachowania pedu
˛ i energii:
pγ = pγ‘ + pβ 0 (1.1)
Eγ + Eβ = Eγ‘ + Eβ 0 (1.2)
gdzie 1.1 jest równaniem wektorowym, γ oznacza padajacy ˛ kwant
gamma, γ 0 oznacza rozproszony kwant gamma, β oznacza elektron,
na jakim rozpraszanie si˛e odbywa2 , natomiast β 0 to elektron rozpros-
zony.
Zależności energetyczne
Energie wyrażaja˛ sie˛ wzorami:
Eγ = hν
Eγ 0 = hν 0
Eβ = m0 c2 (1.3)
q
Eβ 0 = (pβ c)2 + (m0 c2 )2
Podstawiajac
˛ do równania 1.2 wzory na energi˛e (równanie 1.3) otrzy-
mujemy:
q
hf + m0 c2 = hf 0 + (pβ c)2 + (m0 c2 )2
pβ = pγ − pγ 0
p2β = pβ · pβ
= (pγ − pγ 0 ) · (pγ − pγ 0 )
= pγ2 + pγ20 − 2pγ pγ 0 cos θ.
Podstawiajac
˛ równanie 1.4 do 1.5 otrzymujemy:
2 2
(hν + m0 c2 − hν 0 )2 − m02 c4 = (hν) + (hν 0 ) − 2h2 νν 0 cos θ.
2hνme c2 − 2hν 0 me c2 = 2h2 νν 0 (1 − cos θ)
2
Po podzieleniu obu stron równania przez 2hf f 0 m:
c c h
0
− = (1 − cos θ) .
ν ν m0 c
Po zauważeniu że νλ = c, ostatecznie otrzymujemy:
h
λ0 − λ = (1 − cos θ). (1.6)
m0 c
Przekroje czynne
Z diagramów Feynmana w ramach elektrodynamiki kwantowej mo-
żna wyprowadzić wzory na przekrój czynny efektu w efekcie Comptona.
Wzory te po raz pierwszy wyprowadzili Klein i Nishina.
Wzór Kleina–Nishiny:
dσ 1
= α2 rc2 P (Eγ ,θ)2 (P (Eγ ,θ) + P (Eγ ,θ)−1 − 1 + cos2 (θ)) (1.7)
dΩ 2
Gdzie: α to stała struktury subtelnej3 , θ to kat
˛ rozproszenia kwantu
γ, natomiast P (Eγ ,θ) to iloczyn energii kwantu padajacego˛ i rozpros-
zonego4 .
Wzoru 1.7 nie b˛edziemy wyprowadzać. Pokażemy natomiast prze-
kroje czynne dla kwantów γ i elektronów otrzymane za pomoca˛ apletu
symulujacego
˛ efekt Comptona. Dla porównania na rys 1.5 zamieszczono
te same przekroje z opracowań.
Dla niskich energii (które badał Compton) wartość przekroju czyn-
nego na efekt Comptona dla 0◦ i 180◦ jest praktycznie taka sama, dla
wysokich energii natomiast szansa zajścia efektu jest istotnie wyższa
dla niskich katów.
˛
trzy sposoby:
e2 e2 cµ0 ke e2
α= = =
h̄c 4πε0 2h h̄c
jest jednak możliwy jej bezpośredni pomiar.
4 Wyraża sie
˛ on wzorem:
1
P (Eγ ,θ) = Eγ
1+ me c 2
(1 − cos θ)
3
(a) Zależność energii od kata
˛ (b) Zależność energii od kata
˛
rozproszenia dla rozproszonych rozproszenia dla rozproszonych
elektronów kwantów γ
4
(a) Zależność energii od kata
˛ (b) Zależność energii od kata
˛
rozproszenia dla rozproszonych rozproszenia dla rozproszonych
elektronów kwantów γ
5
(a) Zależność energii od kata
˛ (b) Zależność energii od kata
˛
rozproszenia dla rozproszonych rozproszenia dla rozproszonych
elektronów kwantów γ
6
Rysunek 1.6: Schemat oryginalnego układu pomiarowego Comptona
[2, rys 16]
(a) Wiazka
˛ nierozproszona (b) Wiazka
˛ rozproszona 45◦
(c) Wiazka
˛ rozproszona 90◦ (d) Wiazka
˛ rozproszona 135◦
7
Rozdział 2
Tor spektrometryczny
2.1 Cześć
˛ mechaniczna
Mechaniczna˛ cz˛eść ukadu zaprojektowano i wykonano w ramach
poprzedniej wersji ćwiczenia, w warsztacie Wydziału Fizyki Politechniki
Warszawskiej. Zdjecie
˛ układu na rys. 2.2.
8
Rysunek 2.2: Zdjecie
˛ mechanicznej cześci
˛ układu wraz z detektorami.
9
Rysunek 2.3: Schemat elektronicznej cz˛eści układu. Dla przejrzys-
tości narysowano tylko jeden tor spektrometryczny, w rzeczywistym
układzie elementy zaznaczone na różowo sa˛ podwojone. W nawiasach
przy nazwach wejść podano typ końcówki przewodu. Opracowanie
własne.
10
Silniki krokowe Silnikiem krokowym zarzadza
˛ sie˛ za pomoca˛ sprz˛e-
towego sterownika dostarczonego ze sprzetem
˛ (dokładny opis w para-
grafie 3.7).
11
Rozdział 3
Opis programu
3.1 Architektura
Program podzielono na moduły. Podział ten ma nastepuj
˛ ace
˛ cele:
dany moduł. Opis terminologii i działania systemu maven2 znajduje sie˛ w rozdziale 3.3.
12
dies-irae:encore-silniki Moduł odpowiedzialny za komunikacj˛e
po porcie szeregowym z silnikami krokowymi.
dies-irae:genie-connector Moduł odpowiedzialny za komunikacj˛e
z osprzetem
˛ Canberry (tory spektrometryczne).
dies-irae:encore-symulacja Moduł wyświetlajacy
˛ animowana˛ sy-
mulacje˛ eksperymentu.
dies-irae:dies-gui Moduł zawierajacy
˛ graficzny interfejs użytko-
wnika.
dies-irae:dies-peakfinder Moduł zawierajacy˛ klas˛e odpowiedzialna˛
za wyznaczanie pików w zebranych spektrach.
13
Dlaczego Maven
Zdecydowano sie˛ na używanie mavena w tym projekcie głównie ze
wzgl˛edu na jego możliwości zarzadzania
˛ zależnościami7 . Gdy w katalogu
lib znajduje sie˛ wiecej
˛ niż kilka plików (bieżaco
˛ projekt ten zależy od
26 bibliotek), zarzadzanie
˛ nimi staje si˛e trudne. Ponadto, gdy zależności
maja˛ własne zależności, cały proces re˛ cznego zarzadzania
˛ nimi staje
si˛e ucia˛żliwy. Maven rozwiazuje
˛ ten problem, gdyż jest w stanie na
bieżaco
˛ pobierać prawidłowe wersje zależności. Ponadto maven jest
używany w tym projekcie do tworzenia plików dystrybucji (czyli skom-
presowanego pliku zwierajacego ˛ wszystkie pliki niezbedne
˛ do działania
programu oraz skrypty startowe).
Wreszcie program ten jest tworzony w środowisku programisty-
cznym Intellij Idea 8 , które w czasie tworzenia projektu było płatne —
a uznano, że powinno si˛e dostarczyć łatwa˛ metod˛e na prac˛e z pro-
jektem w darmowych IDE9 (wszystkie główne IDE Javy sa˛ w stanie
pracować używajac ˛ informacji z plików pom.xml; o tym jak otwierać
projekt w różnych IDE dokładniej w rozdziale 4.4).
Słownik mavena
Artefakt (z ang. artifact) Jest to bardzo ogólne określenie na produkt
końcowy budowania programu. Może być to plik JAR10 zawier-
ajacy
˛ skompilowany kod źródłowy (i właśnie w tym sensie jest
on używany w tym programie), ale może to być plik zawierajacy˛
dokumentacje projektu czy jego kod źródłowy. W Mavenie każdy
artefakt ma tak zwane współrzedne,
˛ które jednoznacznie go iden-
tyfikuja.
˛
Współrzedne
˛ artefaktu (z. ang coordinates) Sa˛ to dane, które jed-
noznacznie identyfikuja˛ dany artefakt. Maven obsługuje nast˛epu-
˛ współrz˛edne: groupId, artifactId, version oraz kilka innych
jace
(których nie używam w tym projekcie — zainteresowanych odsy-
łam do [11]).
GroupId Ciag˛ znaków unikalny na poziomie organizacji, która dany
artefakt stworzyła. Jeśli dany artefakt ma być dostepny
˛ publicznie,
groupId powinna zaczynać si˛e od odwróconego adresu domeny,
która˛ dana organizacja posiada (tak jak przyjmuje si˛e przy tworze-
niu nazw pakietów Javy).
ArtifactId Ciag
˛ odróżniajacy
˛ jeden artefakt w grupie od drugiego.
Version Wersja. Pozwala odróżnić różne wersje tego samego artefaktu.
7 Dokładniej ten termin zostanie wyjaśniony później, ale na razie przez słowo: “za-
czne. Dokładnie o tym jakie kroki należy podjać˛ by uruchomić projekt w różnych IDE w
rozdziale 4.4.
10 Java Archive, plik zawierajacy ˛ skomplikowane klasy Javy, spakowany algorytmem
ZIP.
14
Id artefaktu Wszystkie współrz˛edne artefaktu można połaczyć
˛ w jeden
ciag
˛ znaków w nast˛epujacy
˛ sposób: groupId:artifactId:ver-
sion, np: dies-irae:dies-assembly:1.0.0.
Zależność (z ang. dependency) Artefakt, którego dany projekt wy-
maga do poprawnego działania.
Zasieg
˛ zależności (z ang. scope) Zależności moga˛ mieć różne zasi˛egi,
tj. być dost˛epne w różnych momentach budowy aplikacji. Domyśl-
nie zależności maja˛ zasieg
˛ compile, co znaczy, że dost˛epne sa˛
zawsze. Zależności o zasi˛egu test nie sa˛ widoczne w gotowym
programie, ale dostepne
˛ sa˛ w fazie testów.
Repozytorium Zbiór artefaktów udost˛epniony Mavenowi (na przykład
umieszczony jako strona internetowa albo dost˛epny na dysku).
Podczas budowy projektu maven pobiera wszystkie (nie pobrane
przy poprzednich budowach) zależności z repozytoriów zdefiniowa-
nych w pliku POM.
Plik POM11 Plik zawierajacy ˛ wszystkie dane o projekcie. Podstawowe
dane, jakie plik POM może zawierać to: współrz˛edne artefaktu
jaki ten plik opisuje, zależności projektu, repozytoria, jakie należy
sprawdzać, programiści i organizacja tworzaca ˛ dany projekt, li-
cencja projektu i tak dalej. Plik pom znajduje si˛e w głównym
katalogu projektu i ma nazwe˛ pom.xml12 .
Dziedziczenie Maven udost˛epnia mechanizm dziedziczenia plików
POM. Tj. jeśli moduł B zaznaczy, że jego rodzicem jest moduł
A, to wszystkie własności modułu A b˛eda˛ własnościami modułu
B.
15
14 <module>dies-config</module>
15 <module>web-backend</module>
16 <module>dies-gui-shared</module>
17 <module>dies-gui-onSite</module>
18 </modules>
19 <build>
20 <pluginManagement>
21 <plugins>
22 <plugin>
23 <groupId> org.apache.maven.plugins
</groupId>
24 <artifactId> maven-compiler-plugin
</artifactId>
25 <configuration>
26 <source>1.6</source>
27 <target>1.6</target>
28 <encoding>UTF-8</encoding>
29 </configuration>
30 </plugin>
31 </plugins>
32 </pluginManagement>
33 </build>
34 <repositories>
35 <repository>
36 <id>skimble-public</id>
37 <url> http://skimbleshanks.ath.cx/maven2/ </url>
38 <!-- Publiczne repozytorium autora -->
39 </repository>
40 </repositories>
41 <dependencies>
42 <dependency>
43 <groupId>junit</groupId>
44 <artifactId>junit</artifactId>
45 <version>4.5</version>
46 <scope>test</scope>
47 </dependency>
48 <dependency>
49 <groupId>org.slf4j</groupId>
50 <artifactId>slf4j-log4j12</artifactId>
51 <version>1.5.6</version>
52 <scope>test</scope>
53 </dependency>
54 </dependencies>
55 <dependencyManagement>
56 <dependencies>
57 <dependency>
58 <groupId>org.slf4j</groupId>
59 <artifactId>slf4j-api</artifactId>
60 <version>[1.0,)</version>
61 </dependency>
16
62 <dependency>
63 <groupId>junit</groupId>
64 <artifactId>junit</artifactId>
65 <version>4.5</version>
66 <scope>test</scope>
67 </dependency>
68 <dependency>
69 <groupId>edu.umd.cs.findbugs</groupId>
70 <artifactId>annotations</artifactId>
71 <version>1.3.9</version>
72 </dependency>
73 <dependency>
74 <groupId>commons-collections</groupId>
75 <artifactId>commons-collections</artifactId>
76 <version>3.2.1</version>
77 </dependency>
78 <dependency>
79 <groupId>net.java.dev.beansbinding</groupId>
80 <artifactId>beansbinding</artifactId>
81 <version>1.2.1</version>
82 </dependency>
83 <dependency>
84 <groupId>commons-math</groupId>
85 <artifactId>commons-math</artifactId>
86 <version>1.2</version>
87 </dependency>
88 <dependency>
89 <groupId>commons-primitives</groupId>
90 <artifactId>commons-primitives</artifactId>
91 <version>1.0</version>
92 </dependency>
93 <dependency>
94 <groupId>commons-lang</groupId>
95 <artifactId>commons-lang</artifactId>
96 <version>2.4</version>
97 </dependency>
98 <dependency>
99 <groupId>jfree</groupId>
100 <artifactId>jfreechart</artifactId>
101 <version>1.0.13</version>
102 </dependency>
103 <dependency>
104 <groupId>com.miglayout</groupId>
105 <artifactId>miglayout</artifactId>
106 <version>3.7</version>
107 </dependency>
108 </dependencies>
109 </dependencyManagement>
110 </project>
17
Poziom jezyka
˛ Java Fragment pliku zaczynajacy ˛ si˛e od linii 22 po-
woduje, że maven b˛edzie kompilował kod używajac ˛ rozszerzeń jezyka
˛
z wersji 1.6 Javy, oraz że maven bedzie
˛ zakładać, że kodowanie plików
to UTF-8.
Zarzadzanie
˛ zależnościami W linii 56 rozpoczyna si˛e zarzadzanie
˛
zależnościami; jest to funkcjonalność mavena upraszczajaca
˛ tworzenie
projektów składajacych˛ si˛e z wielu modułów. W zwykłym schemacie
uruchamiania programów w całym programie może być tylko jedna wer-
sja danej klasy, a co za tym idzie, jedna wersja danej biblioteki. Gdyby
definiować wersj˛e i zasi˛eg zależności w podmodułach głównego modułu
mogłoby si˛e okazać że jeden że poszczególne podmoduły wymagaja˛
różnych wersji danych bibliotek13 , zmiana wersji biblioteki dla całego
projektu byłaby też czasochłonna. Jeśli dana zależność jest umieszc-
zona w sekcji dependencyManagement
w projekcie rodzicu, to w projekcie dziecku starczy przy definiowaniu
owej zależności podać tylko artifactId i groupId, natomiast wersja
i zasieg
˛ zostana˛ odziedziczone od rodzica.
18
Plik pom
Plik pom tego modułu jest bardzo prosty - mówi, iż zależnoś-
cia˛ tego modułu jest moduł dies-gui-onSite zawierajacy ˛ interfejs
graficzny (wszystkie pozostałe moduły uwzgl˛edniane sa˛ gdyż sa,
˛ zależno-
ściami dies-gui-onSite) oraz, że plik zawierajacy
˛ opis dystrybucji to
assembly.xml.
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project>
3 <parent>
4 <artifactId>dies-irae</artifactId>
5 <groupId>dies-irae</groupId>
6 <version>1.0</version>
7 </parent>
8 <modelVersion>4.0.0</modelVersion>
9 <artifactId>dies-assembly</artifactId>
10 <build>
11 <plugins>
12 <plugin>
13 <artifactId> maven-assembly-plugin
</artifactId>
14 <configuration>
15 <descriptors>
16 <descriptor>
17 assembly.xml
18 </descriptor>
19 </descriptors>
20 </configuration>
21 </plugin>
22 </plugins>
23 </build>
24 <dependencies>
25 <dependency>
26 <groupId>dies-irae</groupId>
27 <artifactId>dies-gui-onSite</artifactId>
28 <version>1.0</version>
29 </dependency>
30 <dependency>
31 <groupId>org.slf4j</groupId>
32 <artifactId>slf4j-log4j12</artifactId>
33 <version>1.5.6</version>
34 </dependency>
35 </dependencies>
36 </project>
Plik assembly
Plik tworzy archiwa dystrybucyjne. Opis dystrybucji programu w
punkcie 4.
19
1 <assembly>
2 <id>dependencies</id>
3 <formats>
4 <format>zip</format>
5 </formats>
6 <includeBaseDirectory>false</includeBaseDirectory>
7 <fileSets>
8 <fileSet>
9 <directory>target</directory>
10 <includes><include>*.jar</include></includes>
11 <outputDirectory>/lib</outputDirectory>
12 </fileSet>
13 <fileSet>
14 <directory>native/</directory>
15 <outputDirectory>lib/native</outputDirectory>
16 <includes>
17 <include>**</include>
18 </includes>
19 </fileSet>
20 <fileSet>
21 <directory>bin</directory>
22 <outputDirectory>/</outputDirectory>
23 <includes>
24 <include>*.sh</include>
25 <include>*.bat</include>
26 <include>*.exe</include>
27 </includes>
28 <fileMode>0755</fileMode>
29 </fileSet>
30 </fileSets>
31 <dependencySets>
32 <dependencySet>
33 <outputDirectory>/lib</outputDirectory>
34 <unpack>false</unpack>
35 <scope>runtime</scope>
36 </dependencySet>
37 </dependencySets>
38 </assembly>
20
zawierajacego
˛ ten moduł i znajduja˛ si˛e w pliku o nazwie default.
properties, wartości dost˛epne dla użytkownika dla konfiguracji po-
szukiwane sa˛ w katalogu .config w katalogu głównym programu
i maja˛ nazwe˛ dies-irae.properties.
Przykładowy plik konfiguracyjny:
1 # Nazwy detektorow
2 gammaDetecorLocator = DET_2
3 electronDetectorLocator = DET_1
4 #Ilosci kanalow w analizatorze
5 electonChannelCount = 1024
6 gammaChannelCount = 1024
7 #Paramery domyslnej prostej kalibracji y[KeV]=a*numer
kanalu +
8 #Zbadane empirycznie, orientacyjne
9 defaultBetaCalibration.a = 1.5261
10 defaultBetaCalibration.b = -36.1333
11 defaultGammaCalibration.a = 1.4658
12 defaultGammaCalibration.b = -24.8306
13 #Czy uzywac domyslnej kaibracji detektorow
14 calibrated = false
15 #Port COMM pod ktorym jest silnik
16 driverPort = COM9
17 #Domyslna kalibracjia silnikow - zbadana empirycznie
18 defaulrDriverCalibration.a = -0.3307
19 defaulrDriverCalibration.b = 107
21
Sterownik udostepnia
˛ trzy polecenia o nastepuj
˛ acym
˛ formacie:
Założenia modułu
Moduł musi udostepniać
˛ nastepuj
˛ ace
˛ operacje:
22
Rysunek 3.1: Schemat UML klasy EngineDriver
Wymagania modułu
Moduł ten wymaga, by w katalogu Windows\\System3218 umieścić
natywne biblioteki RXTX19 . Z pobranych archiwów należy wyodre˛ bnić
plik rxtxSerial.dll i umieścić go w wzmiankowanym wyżej katalogu.
Schemat modułu
Moduł ten składa si˛e z trzech głównych klas, które posiadaja˛
nastepuj
˛ ace
˛ obszary odpowiedzialności:
23
Rysunek 3.2: Schemat UML klasy CommandDriver
Klasa CommandDriver
Klasa ta enkapsuluje podstawowa˛ komunikacj˛e z driverem silników.
Jej główna˛ odpowiedzialnościa˛ jest:
Klasa PositionDriver
Klasa ta pracuje na współrz˛ednych zwiazanych
˛ z pozycja,
˛ czyli liczba˛
zwracana˛ przez rozkaz ?. Pozwala wykonać nastepuj
˛ ace
˛ operacje:
24
kończy si˛e natychmiast po wydaniu silnikom rozkazu, opcjonalny
parametr DriverCallback pozwala na otrzymanie notyfikacji po
zakończeniu wykonywania rozkazu.
Algorytm działania tej metody jest nastepuj
˛ acy:
˛
• Wykonywany jest pomiar położenia.
• Wyznaczana jest różnica położeń, znajac˛ ja˛ oblicza si˛e pre˛ d-
kość obrotu silników oraz ilość kroków do wykonania w ten
sposób, by silniki kre˛ ciły si˛e do nast˛epnego sprawdzenia
położenia (ale nie wiele dłużej). W ten sposób silniki kre˛ ca˛
si˛e jednostajnie, a po zerwaniu kontaktu z komputerem
samoczynnie staja. ˛
• Przez 50 ms czekamy do nastepnego
˛ pomiaru położenia.
Obrót w określonym kierunku aż do otrzymania polecenia zatrzyma-
nia sie.
˛
Algorytm działania jest analogiczny jak w przypadku obrotu do
ustalonej pozycji, z tym że pre˛ dkość i ilość kroków ustalone sa˛ na
sztywno.
Zatrzymanie Zatrzymuje silniki
Oprogramowanie Canberry
Najpierw oddajmy głos producentowi.
25
Rysunek 3.3: Klasa PositionDriver
26
podzielenie aplikacji na dwa komponenty — klient i serwer,
które moga˛ zarówno być wykonywane na jednym komputerze,
jak i być rozproszonymi miedzy
˛ komputerami połaczonymi
˛
siecia.
˛ Podsystem IPC (InterProcess Communicaton — ko-
munikacja mi˛edzy procesami), dostarcza warstwe˛ łacz
˛ ac
˛ a˛ te
komponenty.
Komponent pełniacy ˛ role˛ serwera (zwany VDM — Virtual
Data Manager) udostepnia
˛ usługi spektroskopowe. Interfejs
tych usług, które zawieraja˛ miedzy
˛ innymi odczyt danych
zapisanych na dysku i dost˛ep do elektronicznych urzadze
˛ ń
pomiarowych jest z punktu widzenia aplikacji klienckich
spójnym generycznym API”[13, s. 23]22 .
Oprogramowanie Canberry udost˛epnia interfejs napisany w C z
którego zdecydowałem sie˛ skorzystać.
Parametry
Jedna˛ z zasadniczych funkcjonalności biblioteki Canberry jest umoż-
liwienie zapisu i odczytu parametrów. Do odczytu i zapisu parametrów
służa˛ odpowiednio funkcje SadGetParam i SadPutParam, funkcje te
maja˛ taka˛ sama˛ sygnature:
˛
SADENTRY SadGetParam(HMEM hDSC, ULONG ulParam,
USHORT usRecord, USHORT usEntry, void *
pvData, USHORT usExpect );
22 Tłumaczenie własne
27
Wyjaśnienie znaczenia parametrów:
hDSC DSC, z którego pobieramy parametr
ulParam Numer parametru
usRecord Numer rekordu w parametrze.
usEntry Numer entry w parametrze23 .
pvData Zaalokowany obszar, w którym znajduje si˛e wartość parametru
do zapisania (podczas zapisu) lub który bedzie
˛ zawierać wartość
zapisana˛ (podczas odczytu).
usExpect Długość pvData w bajtach.
Łaczenie
˛ Javy i C
Standardowo do komunikacji z kodem C korzysta si˛e z mechanizmu
JNI24 bed
˛ acego
˛ elementem standardowej dystrybucji Javy. Rozważmy
jednak najpierw, jak działa JNI. Przykładowo by stworzyć natywna˛
metode˛ o nastepuj
˛ acej
˛ sygnaturze:
package pkg;
class Cls {
native double f(int i, String s);
}
należy stworzyć nastepuj
˛ ˛ kod w C25 :
acy
1 jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (
2 JNIEnv *env, /* interface pointer */
3 jobject obj, /* "this" pointer */
4 jint i, /* argument #1 */
5 jstring s /* argument #2 */ ){
6 /* Obtain a C-copy of the Java string */
7 const char *str = ( *env)->GetStringUTFChars(env,
s, 0);
8 /* process the string */
9 ...
10 /* Now we are done with str */
11 ( *env)->ReleaseStringUTFChars(env, s, str);
12 return ...
13 }
Jak widzimy JNI jest mechanizmem skomplikowanym, zdecydowano
˛ na użycie biblioteki JNA (Java Native Access)26 . Oddajmy głos
si˛e wiec
autorom:
23 Dokumentacja biblioteki jest bardzo enigmatyczna jeśli chodzi o znaczenie
parametrów usEntry i usRecord. Patrz [13] strony: 41 — 43. Domyślnie jest to albo
0 albo 1. Dokumentacja wskazuje że powinno być to 1 ([13] str 42), poza tak zwanymi
Common parameters dla których jest to 0 ([13] str. 71)
24 Java Native Interface
25 Przykłady pochodza˛ z [14]
26 Główna strona projektu https://jna.dev.java.net/
28
“JNA udost˛epnia programom Javy łatwy dost˛ep do naty-
wnych współdzielonych bibliotek (dla Windows bibliotek
DLL27 ) piszac
˛ tylko kod Javy”[15].
JNA ma dwie zasadnicze wady:
Wymaga dostepu˛ do bibliotek DLL JNA wymaga, by kod, do którego
łaczy
˛ si˛e program, był dost˛epny jako biblioteka DLL28 . Canberra
nie dostarczyła biblioteki DLL, implementacja API Canberry jest
dost˛epna poprzez statyczna˛ bibliotek˛e. Autorowi nie udało si˛e
znaleźć bezpłatnych narz˛edzi konwertujacych
˛ biblioteki statyczne
na biblioteki DLL. Stworzono wiec ˛ program który wygenerował z
plików nagłówkowych nagłówek biblioteki DLL (patrz rozdział 5.3).
JNA jest powolna29 Celem projektowym JNA nie jest szybkość wyko-
nania kodu, lecz łatwość jego tworzenia. Jednak problem tego, że
JNA jest wolniejsze, nie jest istotny w tej aplikacji — kod natywny
jest wywoływany na tyle rzadko że wszelkie narzuty generowane
przez JNA sa˛ nieistotne.
Drugim rozwiazaniem
˛ problemu pre˛ dkości mogłoby być użycie tzw.
direct mapping. Jest to specjalna metoda mapowania korzystajaca ˛
z JNA, która jednak ma wydajność porównywalna˛ z JNI[15]. Byłby
on używany od poczatku,
˛ został dodany do JNA już gdy projekt
genieConnetcor był znacznie zaawansowany.
29
11 Native.setProtected(true);
12 GENIE_LIBRARY.vG2KEnv();
13 }
14
15 private static Map<String, Object>
createLibOptions() {
16 Map<String, Object> result = new HashMap<String,
Object>();
17 result.put( Library.OPTION_FUNCTION_MAPPER, new
GenieFunctionMapper());
18 return result;
19 }
20 }
W linii 10 otrzymujemy implementacj˛e interfejsu GenieLibrary,
parametry funkcji loadLibrary to: nazwa pliku dll30 , który ładu-
jemy, klasa, której implementacje˛ otrzymujemy oraz dodatkowe opcje
mapowania (o tym ostatnim później).
30
short SadControlDSC(unsigned short, unsigned
short);
należy stworzyć funkcje˛ o nastepuj
˛ acej
˛ sygnaturze:
public short SadControlDSC(short usDevice, short
usOpCode);
Odwzorowywanie wskaźników
Odwzorowywanie wskaźników jest skomplikowane, ponieważ praw-
idłowe ich odwzorowanie zależy od intencji autora biblioteki. Przykła-
dowo funkcja:
void doStuff(int* param);
może oczekiwać że param bedzie:
˛
• Zainicjowanym wskaźnikiem na int, tak by wynik jej działania
mógł być zwrócony przez ten wskaźnik. Wtedy poprawnym jej
odwzorowaniem jest:
void doStuff(IntByReference param);
31
public short SadGetParam(NativeLong ulParam,
byte[] result);
albo nastepuj
˛ aco:
˛
public short SadGetParam(NativeLong ulParam,
NativeLongByReference result);
W pierwszym przypadku bezpośrednio odwzorowujemy void* na
byte[]. Podejście to ma jedna˛ zasadnicza˛ wad˛e — należy potem re˛ cznie
przetworzyć byte[] na docelowy typ, co po pierwsze jest jednak kodem
który trzeba napisać (a należy unikać pisania zb˛ednego kodu), po drugie
cz˛esto jest nie trywialne (a pewno nieprzenośne)35 . W drugim wypadku
odwzorowujemy void* na typ NativeLongByReference, który jest
po prostu wskaźnikiem na NativeLong. W tym wypadku mapowania
pami˛eci do typu Javy long wykonuje JNA, które bierze poprawk˛e na
różne architektury.
Można umieścić te dwa mapowania w jednym interfejsie opisujacym ˛
biblioteke˛ (i tak zreszta˛ postapiono
˛ w bibliotece genie-connector).
Odwzorowanie DSC
Wreszcie, jeśli po stronie Javy nie zamierzamy operować na wska-
źniku, możemy go odwzorować jako typ com.sun.jna.Pointer. Taka
sytuacja zachodzi w module genie-connector. Wszystkie funkcje od-
czytujace
˛ lub zapisujace ˛ dane do źródła pobieraja˛ jako pierwszy argu-
ment wskaźnik do struktury (nazwanej DSC), b˛edacej ˛ źródłem danych.
Klient biblioteki Genie nie powinien na własna˛ re˛ k˛e nic z owa˛ struktura˛
robić.
Strukture˛ te˛ pozyskuje sie˛ wyołujac
˛ funkcje˛
int iUtlCreateFileDSC( void** phDSC, BOOL
fAdvise, HWND hAdvise );
która w kodzie javy jest odwzorowana jako:
public int iUtlCreateFileDSC(PointerByReference
hDSC, int zero, int zero2);36
pierwszy argument, po wywołaniu funkcji, b˛edzie zawierać zainicjo-
wana strukture˛ hDsc.
Wszystkie pozostałe funkcje jako pierwszy argument pobieraja˛ wska-
źnik do tej struktury.
By zachować po stronie Javy bezpieczeństwo typów, można tworzyć
własne typy wskaźnikowe. Nie maja˛ one żadnej dodatkowej funkcjonal-
ności, a tylko zapewniaja˛ ochron˛e przed bł˛edami programistycznymi.
Po stronie Javy wskaźnik na hDsc b˛edzie odwzorowywany poprzez typ:
1 package cx.jbzdak.diesIrae.genieConnector;
2
3 import com.sun.jna.Pointer;
32
4 import com.sun.jna.PointerType;
5
6 public class DscPointer extends PointerType{
7
8 public DscPointer() {
9 super();
10 }
11
12 public DscPointer(Pointer p) {
13 super(p);
14 }
15 }
Opis modułu
Założenia modułu
JNA dostarcza tylko mapowanie funkcji C, by natomiast otrzymać
kod w pełni zgodny z paradygmatami Javy, należało dodać dodatkowe
warstwy pośrednie mi˛edzy pozostałymi modułami projektu, a intefejsem
dostarczonym przez JNA. Pozostałe moduły programu powinny widzieć
interfejs posiadajacy
˛ nastepuj
˛ ace
˛ cechy:
• Używajacy
˛ mechanizmu wyjatków
˛ do obsługi błedów.
˛
• Używajacy
˛ typów enumeracyjnych zamiast flag
• Zgodny ze specyfikacja˛ Java Beans
• Obiektowo orientowany
33
• GenieConnector co jakiś czas (domyślnie 1 sekunda) pobiera
stan z DSC.
• SimpleConnector nie jest świadom zmian jakie zachodza˛ w DSC
(przykładem takiej zmiany jest zakończenie pomiaru), podczas gdy
GenieConnector sprawdza te dane i jeśli zajda˛ zmiany wywołuje
odpowiedni PropertyChangeEvent.
Pełne mapowania
Zawartość klasy GenieLibrary:
1 package cx.jbzdak.diesIrae.genieConnector;
2
3 import com.sun.jna.Library;
4 import com.sun.jna.NativeLong;
5 import com.sun.jna.Pointer;
6 import com.sun.jna.ptr.NativeLongByReference;
7 import com.sun.jna.ptr.PointerByReference;
8 import com.sun.jna.ptr.ShortByReference;
9 import
cx.jbzdak.diesIrae.genieConnector.structs.DSQuery;
10
11 interface GenieLibrary extends Library {
12
13 public void vG2KEnv();
14
15 public int iUtlCreateFileDSC(PointerByReference hDSC,
int zero, int zero2);
16
17 public int iUtlCreateFileDSC2(PointerByReference
hDSC, int zero, int zero2);
18
19 public short SadGetStatus(DscPointer dscPointer,
NativeLongByReference result, ShortByReference
dummy1, ShortByReference dummy2);
20
21 public short SadOpenDataSource(DscPointer dsc, String
sourceName, short type, short acces, short
verify, String shellId);
22
23 public short SadGetParam(DscPointer hDSC, NativeLong
ulParam, short usRecord, short usEntry, byte[]
result, short usExpect);
24
25 public short SadGetParam(DscPointer hDSC, NativeLong
ulParam, short usRecord, short usEntry,
NativeLongByReference result, short usExpect);
26
27 public short SadPutParam(DscPointer hDSC, NativeLong
ulParam, short usRecord, short usEntry, byte[]
34
result, short usExpect);
28
29 public short SadPutParam(DscPointer hDSC, NativeLong
ulParam, short usRecord, short usEntry,
NativeLongByReference result, short usExpect);
30
31 public short SadCloseDataSource(DscPointer dsc);
32
33 public short SadDeleteDSC(DscPointer dsc);
34
35 public short SadPutStruct(DscPointer sdc, short
structType, short record, short entry, Pointer
ptr, short structSize);
36
37 public short SadFlush(DscPointer dsc);
38
39 public short SadControlDSC(DscPointer dsc, short
usDevice, short usOpCode);
40
41 public short SadGetSpectrum(DscPointer dsc, short
start, short count, short useFloats, int[]
result);
42
43 public short SadPutSpectrum(DscPointer dsc, short
start, short count, int[] input);
44
45 public short SadQueryDataSource(DscPointer
dscPointer, short opCode, DSQuery result);
46 }
35
Rysunek 3.5: Schemat UML klasy SimpleConnector
36
Rysunek 3.7: Schemat stanów klas zawierajacych
˛ wyniki pomiarów
spektrometrycznych
Praca z parametrami
Biblioteka w pewnym stopniu ułatwia prac˛e z parametrami (co do
dalszych ułatwień patrz 3.8). W klasie SimpleConnector zdefiniowano
metody służace
˛ do pracy z parametrami:
public <T> T getParam(final Parameter<T> parameter,
final int record, final int entry)
37
Interfejs parameter jest typem sparametryzowanym, parametr T to
typ parametru po stronie Javy. Ma on nastepuj
˛ ac
˛ a˛ definicje:
˛
1 public interface Parameter<T> {
2 @NonNull ParameterType<T> getType();
3
4 long getParamId();
5
6 String getName();
7 }
dziedziczy interfejs Parameters. Parametrów jest na tyle dużo że przy próbach zdefin-
iowania ich w jednym interfejsie przekroczony zostaje maksymalny rozmiar bytecodu
klasy.
38
Rysunek 3.8: Schemat UML klasy ErrorDescription
Obsługa błedów
˛
Za obsług˛e bł˛edów odpowiadaja˛ klasy LibraryWrapper i Simple-
Connector. Wszystkie wywołania funkcji SAD (sa˛ one oznaczone na
diagramach UML) moga˛ wygenerować niesprawdzany wyjatek ˛ klasy
GenieException. Wyjatek˛ ten ma nastepuj
˛ ace
˛ własności:
39
1 private static final Map<Integer, String>
detailedMessages =
2 Collections.synchronizedMap(DefaultedMap.
decorate(new HashMap(), "Nie okreslono
wiadomosci szczegolowej"));
3
4 static {
5 detailedMessages.put(/** kolejne kody bledow */);
6 }
Klasa GenieConnector
Podstawowe różnice z GenieConnector to:
Inne funkcje wywołuja˛ biblioteki Genie funkcje getStatus i isAc-
quiring nie wywołuja˛ metod SAD, lecz tylko zwracaja˛ zapisany
stan.
Dostep
˛ do zapamietanych
˛ wyników pomiarowych Klasa ta udost˛e-
pnia własność lastResult, która zawiera ostatnio zapisane wy-
niki pomiarowe. Jest to własność zwiazana
˛ (patrz 5.3).
Automatyczne odpytywanie DSC Instancje tej klasy automatycznie
co zadany okres (domyślnie 1 sek) odświeżaja˛ parametry DSC —
dokładniej status oraz zebrane dane. Do odpytywania DSC służy
klasa ConnectorStateWatcher dziedziczaca ˛ po klasie java.-
util.Timer.
Wiecej
˛ własności zwiazanych
˛ status oraz acquiring to własności
zwiazane.
˛
Metody odświeżajace
˛ stan (a zatem wykonujace
˛ zapytania SAD) to:
updateStatus() Funkcja ta odświeża własności status i acquiring
updateLastResults() Funkcja ta odświeża własność lastResults
Diagram UML tej klasy jest na rysunku 3.9
Perspektywy rozwoju
W nast˛epnej kolejności można upraszczać używanie z bibliotek Can-
berry:
40
Rysunek 3.9: Schemat UML klasy GenieConnector
Wymagania modułu
Moduł wymaga zainstalowania pliku DLL zawierajacego
˛ wywołania
statycznych bibliotek Genie; domyślna nazwa pliku DLL to cxAth-
JbzdakGenieConnector. Plik trzeba zainstalować do katalogu Win-
dows/Sytem3241 .
41
Rysunek 3.10: Wyglad
˛ programu do symulacji
Aplet
Aplet można obejrzeć na stronie autora: http://skimbleshanks.
ath.cx/inz/encore-symulacja.
42
genieConnector oraz encore-silniki. Wszelkie dane pobierane z de-
tektorów i operacje wykonywane na silnikach sa˛ wykonywane za pośred-
nictwem instancji interfejsu DetectorsModel. Model ten reprezen-
tuje oba detektory spektrometryczne prowadzace ˛ pomiary dla konkret-
nego kata.
˛ Do modułu dołaczono
˛ bardzo prosty mechanizm dostar-
czania odpowiedniej implementacji tych interfejsów (w zależności od
środowiska uruchomienia). Mechanizm ten (wbudowany w statyczna˛
klas˛e DetectorModelFactory) polega na tworzeniu instancji klasy
o nazwie DetectorsModelImpl, która nie jest zdefiniowana w tym
module (ani nie jest w jego zależnościach!), a implemenentacje klasy
o tej nazwie dostarczane sa˛ moduł dies-gui-shared. Klasa Detector-
ModelFactory na żadanie
˛ tworzy (za pomoca˛ introspekcji42 ) instancje˛
klasy DetectorsModelImpl. Listing klasy DetectorModelFactory:
1 package cx.ath.jbzdak.diesIrae.gui.model;
2
3 import java.lang.reflect.Constructor;
4 import java.util.Collection;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 public class DetectorModelFactory {
9
10 static DetectorsModel currentModel;
11
12 static Map<Integer, DetectorsModel> models = new
HashMap<Integer, DetectorsModel>();
13
14 static private Constructor<DetectorsModel>
modelConstructor;
15
16 static {
17 try {
18 modelConstructor =
(Constructor<DetectorsModel>)
19 Class.forName(
20 "cx.ath.jbzdak.diesIrae.gui.model.
DetectorsModelImpl")
21 .getConstructor(Integer.class);
22 } catch (Exception e){
23 throw new RuntimeException(e);
24 }
25 }
26
27 private static DetectorsModel createModel(int i){
28 try {
29 return modelConstructor.newInstance(i);
30 } catch (Exception e){
42 Introspekcja to api pozwalajace
˛ na programowy dostep
˛ do załadowanych klas oraz
pozwalajace
˛ na wykonwanie na nich operacji
43
31 throw new RuntimeException(e);
32 }
33 }
34
35 public static Collection<DetectorsModel> getModels(){
36 return models.values();
37 }
38
39 public static DetectorsModel
getCurrentDetectorsStateModel(){
40 if(currentModel==null){
41 currentModel = createModel(-1);
42 }
43 return currentModel;
44 }
45
46 public static DetectorsModel getModelForAngle(int
angle){
47 if(!models.containsKey(angle)){
48 models.put(angle, createModel(angle));
49 }
50 return models.get(angle);
51 }
52 }
44
19 DetectorModel getBetaModel();
20
21 }
45
LMA Implementacja algorytmu Levenberga–Marquarda oparta na Nu-
merical Recipies43 . Dostepna
˛ do użytku niekomercyjnego.
Metoda dopasowania
Dopasowanie jest wykonywane metoda˛ Levenberga–Marquarda.
Dopasowujemy funkcje˛ o nastepuj
˛ acym
˛ wzorze:
(x−b)2
−
f (x) = a · e (2c)2 +d (3.1)
a Wysokość piku.
b Położenie piku
c Odchylenie standardowe.
d Poziom odniesienia piku. Parametr ten powinien niwelować obecność
tła pomiaru.
Poczatkowe
˛ wartości parametrów
Jakość poczatkowych
˛ wartości parametrów dopasowania jest ważna
dla prawdidłowego działania metody Lavenberga–Marquarda. Pocza- ˛
tkowe wartości parametrów zgadywane sa˛ za pomoca˛ nast˛epujacej˛
metody:
1992
46
Rozdział 4
Dystrybucja programu
47
do zmiennej path należy dodać katalog:
/home/jbzdak/.maven2/bin
Budowanie projektu
Projekt jest budowany za pomoca˛ mavena. By go zbudować, należy
wykonać nastepuj
˛ ac
˛ a˛ sekwencje˛ poleceń:
W kalatogu modułu głównego (dies-irae):
mvn clean install
W katalogu modułu dies-assembly (dies-irae/dies-assembly):
mvn assembly:assembly
Eclipse
Należy pobrać wtyczki obsługujace
˛ system Maven2 oraz system
wersjonowania kodu GIT.
48
Rysunek 4.1: Przykładowy zrzut ekranu podczas instalacji wtyczek
Netbeans
Należy zainstalować wtyczki maven oraz nbgit. By otworzyć projekt
należy wybrać “Open project”, a nast˛epnie wybrać katalog główny dies-
irae. Jeśli wtyczka mavena jest zainstalowana poprawnie, katalog
projektu powinien mieć odpowiednia˛ ikone˛ (jak na rys. 4.4).
Intelij idea
Należy zainstalować wtyczki Maven integration i Git integra-
tion.
Ponadto należy zainstalować oprogramowanie GIT na komputerze3 .
By zainstalować GITa w systemie linuksowym, powinno si˛e użyć mene-
dżera pakietów, na przykład dla Ubuntu należy wykonać polecenie:
3 Eclipse i Netbrans używaja˛ implementacji GITa w Javie, natomiast Intelij Idea
49
Rysunek 4.2: Przykładowy zrzut ekranu podczas importu projektu
Mavena w Eclipse
50
Rysunek 4.3: Przykładowy zrzut ekranu podczas importu projektu
Mavena w Eclipse
51
Rozdział 5
Eksperyment
E = a · kan + b (5.1)
52
(a) Widmo kalibracyjne dla detektora wykrywajacego
˛ promieniowanie β w efek-
cie komptona
53
a 0.85
b −11
σa 3 · 10−4
σb 116
a 0.86
b −14
σa 3 · 10−4
σb 105
54
kat
˛ Eγ σkanγ σEγ Eβ σkanγ σkanβ Ecalk σEcalk
[keV] [kan] [keV] [keV] [kan] [keV] [keV] [keV]
0 594 40 34 ?? ?? ?? ?? ??
30 460 30 25 182 21 18 643 43
60 403 131 111 226 81 70 630 181
90 299 49 41 341 52 45 641 86
120 230 25 21 415 31 27 646 48
140 203 21 17 440 23 20 644 38
Dyskusja wyników
Duże błedy
˛ widoczne dla niskich katów
˛ wynikaja˛ geometrii pomiaru
(patrz 5.3).
Dla zera stopni nie udało si˛e zlokalizować piku w detektorze β —
wynika to z faktu, że obcina sie˛ w detektorach najmniejsze kanały.
Zgodność z symulacjami
Wykresy 5.10 i 5.9 przedstawiaja˛ porównanie zmierzonej energii
piku z energia˛ wymodelowana˛ za pomoca˛ przekształconego wzoru 1.6:
E0
E0 = E0
(5.3)
1+ me c 2(1 − cosθ)
55
Dla detektora γ wyniki, poza katem
˛ 0◦ , wyniki zebrane zgadzaja˛ si˛e
z wymodelowanymi z granciach niepewności pomiarowych. Dla katów
powyżej 30◦ stopni zgadzaja˛ si˛e z nimi bardzo dobrze. Dla detektora
β natomiast widać lekka˛ tendencj˛e zaniżania wyników zmierzonych,
wzgl˛edem wymodelowanych. Wyniki obu detektorów sa˛ zgodne, w ra-
mach niepewności pomiarowych, z przewidwyaniami teoretycznymi.
Pomiary dwuparametryczne
Bierzace
˛ oprzyrzadowanie
˛ umożliwia zbieranie pojedyńczych widm,
tj. punkt danych zawiera zliczenie jednego detektora, podczas gdy
w urzadzeniach
˛ wielopparametrycznych punkt danych zwiera zliczenia
kilku detektorów. Po zastosowaniu urzadzenia˛ dwuparametrycznego
w eksperymencie, można wykreślić pomiary z jednego detektora w
funkcji pomiarów z drugiego. Eksperyment Comptona byłby w tym
wzgl˛edzie bardzo dydaktyczny, ponieważ jego dwuparametryczne widmo
jest dość proste i ma przejrzysta˛ interpretacj˛e; na widmie tym powin-
niśmy zobaczyć prosta. ˛
Pierwsze testy urzadzenia
˛ dwuparametrycznego zostały już wyko-
nane i dały zadowalajace ˛ wyniki. Przykładowe wyniki załaczone
˛ na
rysunkach: 5.11 i 5.12.
Do pełnego wdrożenia urzadzenia
˛ dwumarametrycznego należy
wykonać nastepuj
˛ ace
˛ prace:
Oprogramowanie urzadzenia
˛ w Javie W tej chwili urzadzenie
˛ jest
oprogramowane w VisualBasicu.
Opracowanie wizualizacji danych Załaczone
˛ obrazki powstały w Root’cie.
Wizualizacje˛ należałoby wykonać w Javie.
56
Właczenie
˛ comptona do internetowego laboratorium fizyki
Eksperyment Comptona zarazem jest eksperymentem bardzo dydak-
tycznym, jak i w pełni zautomatyzowanym — po dokonaniu kalibracji
nie wymagana jest fizyczna ingerencja w układ — wi˛ec naturalnym
krokiem zdaje si˛e właczenie
˛ go do Internetowego Laboratorium Fizyki.
57
(a) Detektor β, zaznaczony obszar patrz 5.2
(b) Detektor γ
˛ 0◦
Rysunek 5.3: Widma dla kata
58
(a) Detektor β
(c) Detektor γ
˛ 30◦
Rysunek 5.4: Widma dla kata
59
(a) Detektor β
(b) Detektor γ
˛ 60◦
Rysunek 5.5: Widma dla kata
60
(a) Detektor β
(b) Detektor γ
˛ 90◦
Rysunek 5.6: Widma dla kata
61
(a) Detektor β
(b) Detektor γ
˛ 120◦
Rysunek 5.7: Widma dla kata
62
(a) Detektor β
(b) Detektor γ
˛ 140◦
Rysunek 5.8: Widma dla kata
63
Rysunek 5.10: Porównanie wartości modelowych i otrzymanych dla
detektora β
64
Bibliografia
65
[13] Canberra Software; S560 Programming Library User’s Manual;
materiały dostarczone przez producenta; tłumaczenie własne.
[14] Sun Microsystems; Java Native Interface Specification;
http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/
design.html#wp715; dostep
˛ z dnia 21-09-2009r.
[15] Strona projektu JNA; https://jna.dev.java.net/; dostep
˛ z
dnia 21-09-2009r.
[16] A. H. Compton; Wykład wygłoszony podczas otrzymywa-
nia ngrody Nobla; Dost˛epne w internecie pod adresem:
http://nobelprize.org/nobel_prizes/physics/laureates/
1927/compton-lecture.pdf; dostep
˛ z dnia 17-10-2009r.
[17] David Resnick, Robert Halliday; “Fizyka 2”; Warszawa 2001 PWN;
ISBN 83-01-0924-2
[18] Strona domowa projektu Cygwin; http://www.cygwin.com/;
dostep
˛ z dnia 25-10-2009r.
[19] O projekcie git; http://git-scm.com/about; dost˛ep z dnia 25-
10-2009r.
[20] Wielu autorów; “Git community book”; http://book.git-scm.
com/; dostep
˛ z dnia 25-10-2009r.
66
Spis rysunków
67
5.4 Widma dla kata˛ 30◦ . . . . . . . . . . . . . . . . . . . . . . . . 59
5.5 Widma dla kata˛ 60◦ . . . . . . . . . . . . . . . . . . . . . . . . 60
5.6 Widma dla kata˛ 90◦ . . . . . . . . . . . . . . . . . . . . . . . . 61
5.7 Widma dla kata˛ 120◦ . . . . . . . . . . . . . . . . . . . . . . . . 62
5.8 Widma dla kata˛ 140◦ . . . . . . . . . . . . . . . . . . . . . . . . 63
5.9 Porównanie wartości modelowych i otrzymanych dla detek-
tora γ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.10 Porównanie wartości modelowych i otrzymanych dla detek-
tora β . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.11 Nieoczyszczone widmo dwuparametryczne w eksperymencie
Comptona. Wyrkes wykonany przez mgr inż. Pawła Hładkiego. 64
5.12 Oczyszczone widmow dwuparametryczne w eksperymencie
Comptona. Wyrkesy wykonane przez mgr inż. Pawła Hładkiego. 64
68
Załaczniki
˛
69
SADENTRY SadCreateDSC(void * pstCfg, HMEM *
phDSC, FLAG fAdv, HWND hWin );
należy stworzyć deklaracje˛ funkcji (w pliku .h:
SADENTRY DLL_WRAPPER_SadCreateDSC(void * pstCfg,
HMEM * phDSC, FLAG fAdv, HWND hWin);
oraz jej definicje˛ (w pliku: .cpp):
extern "C"{
__declspec(dllexport) short
DLL_WRAPPER_SadCreateDSC(void * pstCfg, HMEM *
phDSC, FLAG fAdv, HWND hWin){
return SadCreateDSC(pstCfg, phDSC, fAdv, hWin);
}
70