Elementy optyki jonowej

Metoda macierzowa w optyce geometrycznej i prosty model separatora fragmentów

Optyka jonowa

Optyka jonowa obejmuje całość zagadnień związanych z przesyłaniem cząstek z miejsca wytworzenia do miejsca ich wykorzystania. Elementy optyczne występują w każdym laboratorium, gdzie wykorzystuje się wiązki jonów i gdzie trzeba je transportować, ogniskować, separować, itp.

Do opisu biegu jonów w dowolnym układzie jonowo-optycznym powszechnie stosuje się formalizm macierzowy. Metoda ta jest analogiczna do opisu promieni świetlnych w zwyklych układach optycznych, w których można zastosować klasyczną optykę geometryczną.

Dokładniejsze omówienie tego tematu można znaleźć w cyklu wykładów pt. “Fragmentacja pocisków...”, który prowadziłem w 2004. Optyce jonowej poświęcony jest rozdział R4. Tutaj powtarzam fragmenty tego wykładu i dodaję kilka interaktywnych ilustracji rozważanych problemów.

Metoda macierzowa

Główne założenia formalizmu macierzowego :

W każdym punkcie układu stan cząstki (promienia) opisuje wektor (tablica 1-wym.) jego parametrów zawierający wszystkie istotne zmienne, jak położenie (x,y), nachylenie toru (x’, y’), pęd, itp.

Każdy element układu optycznego reprezentowany jest przez macierz (tablica 2-wym.), która opisuje wpływ tego elementu na stan cząstki.

Macierz układu złożonego z wielu elementów jest iloczynem macierzy odpowiadających tym elementom.

Stan cząstki po przejściu przez układ dany jest jako wynik mnożenia wektora opisującego stan początkowy czastki przez macierz tego układu.

Przykłady z optyki geometrycznej

Cienka soczewka

Można łatwo sprawdzić, że macierz dla soczewki rozpraszającej ma taką samą postać, tylko wartość ogniskowej  f  trzeba wziąć ujemną.

Tworzenie obrazu przez cienką soczewkę możemy zbadać rozważając następujący układ:

Widzimy, że znając macierz układu możemy łatwo badać jego własności analitycznie. Mathematica pozwala przedstawić to graficznie, bardziej intuicyjnie.

Manipulacja 1: obrazowanie z jedną soczewką

Ustalamy, że długość ogniskowa soczewki wynosi 1 (naturalna jednostka długości wzdłuż osi optycznej). Przedmiot o wysokości 1 umieszczamy w (zmiennej) odległości X od soczewki i śledzimy tory trzech promieni rozchodzących się z wierzchołka przedmiotu. Nie wiemy z góry gdzie powstanie obraz (nie znamy ostatniej macierzy układu), ale możemy wyznaczyć jego położenie graficznie, jako miejsce gdzie przecinają się dwa promienie. Wtedy wyznaczamy powiększenie, czyli stosunek długości obrazu do przedmiotu.

Manipulate[
Module[{
mlens={{1,0},{-sign,1}},(* soczewka o ogniskowej 1 *)
rays={{1,0},{1,0.15},{1,-0.15}},
lens,object,image,ll,lines,mx,my,yi=5,r1,r2,hi,im,opis,
raytrack,findImage
},
mx={{1,xo},{0,1}};
my={{1,yi},{0,1}};
raytrack[r0_]:=Module[{},
r1=mx.r0;
r2=my.mlens.r1;
{{-xo,r0[[1]]},{0,r1[[1]]},{yi,r2[[1]]}}
];
findImage[rays_]:=Module[{ra,rb,sol,x},
ra=rays[[2]];
ra=mlens.mx.ra;
rb=rays[[3]];
rb=mlens.mx.rb;
sol=NSolve[ra[[1]]+ra[[2]]*x==rb[[1]]+rb[[2]]*x,x];
hi=Infinity;
If[Length[sol]>0,
im={{x,0},{x,ra[[1]]+ra[[2]]*x}}/.sol;
hi=NumberForm[Flatten[im][[4]],3];
image=Graphics[{icolor,Thickness[0.004],{Arrowheads[0.02],Arrow[im]}}],
Graphics[Point[{0,0}]]
]];
lens=Graphics[{Blue,Thickness[0.004],{Arrowheads[{-sign*0.03,sign*0.03}],Arrow[{{0,-2},{0,2}}]}}];
object=Graphics[{ocolor,Thickness[0.004],{Arrowheads[0.02],Arrow[{{-xo,0},{-xo,1}}]}}];
ll=raytrack/@rays;
lines=Graphics[{Red,Thickness[0.002],Line[ll]}];
image=findImage[rays];
opis=Graphics[Text[Style[StringForm["H/h = `1`",hi],icolor,Bold,26],{3,2}]];
Show[axis,foci,lens,object,lines,image,opis,
PlotRange->{{-5,5},{-2.5,2.5}},
AspectRatio->0.4,
ImageSize->800]],
(* Kontrolki *)
Panel[
Row[{
Control[{{xo,2,Style["X",ocolor,24]},0,5,Appearance->"Labeled",LabelStyle->Directive[ocolor,24]}],
Spacer[20],
Control[{{sign,1,Style[" ",10]},{1->Style[" f > 0  ",lcolor,24],-1->Style[" f < 0  ",lcolor,24]}}]
}],
ImageMargins->{{130,0},{0,20}}
],
TrackedSymbols:>{xo,sign},
FrameLabel->{None, None,Style["Cienka soczewka", Blue,28], None},
Initialization:>{
axis=Graphics[{Black, Thickness[0.002],Line[{{-5,0},{5,0}}]}],
lcolor=Blue,
ocolor=Hue[0.324,1,0.356],
icolor=Darker[Green],
rcolor=Red,
foci=Graphics[{Brown,{Disk[{-1,0},ImageScaled[{0.004,0.01}]],Disk[{1,0},ImageScaled[{0.004,0.01}]]}
}]
}
]

Manipulacja 2: układ dwóch cienkich soczewek

Ciekawszy jest układ dwóch cienkich soczewek. Rozważamy przypadek soczewek o tej samej wartości ogniskowej (równej 1), ale niekoniecznie o tym samym znaku. Oprócz znaku ogniskowej każdej soczewki możemy zmieniać odległość przedmiotu od pierwszej soczewki, X, oraz odległość między soczewkami, d.

Manipulate[
Module[{
rays={{1,0},{1,0.15},{1,-0.15}},
lens1,foci1,lens2,foci2,
ml1,ml2,mx,my,md,
object,image,ll,lines,yi=8.,hi,im,opis,
raytrack,findImage
},
ml1={{1,0},{-sign1,1}};
ml2={{1,0},{-sign2,1}};
mx={{1,xo},{0,1}};
md={{1,d},{0,1}};
my={{1,yi-d},{0,1}};
raytrack[r0_]:=Module[{r1,r2,r3},
r1=mx.r0;
r2=md.ml1.r1;
r3=my.ml2.r2;
{{-xo,r0[[1]]},{0,r1[[1]]},{d,r2[[1]]},{yi,r3[[1]]}}
];
findImage[rays_]:=Module[{ra,rb,sol,m,x},
m=ml2.md.ml1.mx;
ra=rays[[3]];
ra=m.ra;
rb=rays[[2]];
rb=m.rb;
sol=NSolve[ra[[1]]+ra[[2]]*x==rb[[1]]+rb[[2]]*x,x];
hi=Infinity;
If[Length[sol]>0,
im={{x+d,0},{x+d,rb[[1]]+rb[[2]]*x}}/.sol;
hi=NumberForm[Flatten[im][[4]],3];
image=Graphics[{icolor,Thickness[0.004],{Arrowheads[0.02],Arrow[im]}}],
Graphics[Point[{0,0}]]
]];
lens1=Graphics[{l1color,Thickness[0.004],{Arrowheads[{-sign1*0.03,sign1*0.03}],Arrow[{{0,-2},{0,2}}]}}];
foci1=Graphics[{l1color,{Disk[{-1,0},ImageScaled[{0.004,0.01}]],Disk[{1,0},ImageScaled[{0.004,0.01}]]}
}];
lens2=Graphics[{l2color,Thickness[0.004],{Arrowheads[{-sign2*0.03,sign2*0.03}],Arrow[{{d,-2},{d,2}}]}}];
foci2=Graphics[{l2color,{Disk[{-1+d,0},ImageScaled[{0.004,0.01}]],Disk[{1+d,0},ImageScaled[{0.004,0.01}]]}
}];
object=Graphics[{ocolor,Thickness[0.004],{Arrowheads[0.02],Arrow[{{-xo,0},{-xo,1}}]}}];
ll=raytrack/@rays;
lines=Graphics[{rcolor,Thickness[0.002],Line[ll]}];
image=findImage[rays];
opis=Graphics[Text[Style[StringForm["H = `1`",hi],icolor,Bold,26],{6,2}]];
Show[axis,lens1,foci1,lens2,foci2,object,lines,image,opis,
PlotRange->{{-5,8},{-2.5,2.5}},
AspectRatio->0.4,
ImageSize->800]],
(* Kontrolki *)
Panel[
Row[{
Column[{
Control[{{xo,2,Style["X",ocolor,24]},0,5,Appearance->"Labeled",LabelStyle->Directive[ocolor,24]}],
Control[{{d,2,Style["d",l2color,24]},0,4,Appearance->"Labeled",LabelStyle->Directive[l2color,24]}]
}],
Column[{
Control[{{sign1,1,Style[" ",10]},{1->Style[" f1 > 0  ",l1color,22],-1->Style[" f1 < 0  ",l1color,22]}}],
Control[{{sign2,1,Style[" ",10]},{1->Style[" f2 > 0  ",l2color,22],-1->Style[" f2 < 0  ",l2color,22]}}]
}]
}],
ImageMargins->{{130,0},{0,20}}
],
TrackedSymbols:>{xo,d,sign1,sign2},
FrameLabel->{None, None,Style["Układ dwóch cienkich soczewek", Blue,28], None},
Initialization:>{
axis=Graphics[{Black, Thickness[0.002],Line[{{-5,0},{8,0}}]}],
l1color=Blue,
l2color=Hue[0.766,1,0.8],
ocolor=Hue[0.324,1,0.356],
icolor=Darker[Green],
rcolor=Red
}
]

Separator magnetyczny

Separatory cząstek są układami jonowo-optycznymi składającymi się z szeregu magnesów dipolowych (zaginanie torów, separacja A/q), kwadrupolowych (ogniskowanie), sekstupolowych i wyższych rzędów (poprawki), a także innych elementów, takich jak sekcje dryfu (rura próżniowa), kolimatory, itp. Każdy z tych elementów może być opisany macierzą optyczną, a złożenie tych macierzy pozwala badać zachowanie całego układu. Na metodzie tej opiera się np. program LISE++.

W przypadku jonów, wektor zmiennych zawiera zwykle przynajmniej 5 wielkości: 
x - położenie (odległość od osi optycznej) w płaszczyźnie dyspersyjnej, zazwyczaj horyzontalnej,
(Subscript[α, x]) - kąt jaki tworzy z osią x-owa składowa pędu cząstki,
y - położenie w kierunku prostopadłym do x, zazwyczaj wertykalne,
(Subscript[α, y]) - kąt jaki tworzy z osią składowa y-owa pędu,
δ =(Bρ - (Subscript[Bρ, 0])) /(Subscript[Bρ, 0]) - odchylenie sztywności magnetycznej (pędu) cząstki od wartości na osi optycznej. Sztywność magnetyczna to: Bρ = p/q.

Czasem dodaje się jeszcze dalsze zmienne, które opisują poprawki wyższego rzędu (nieliniowe).

Pełny układ separatora zazwyczaj składa się z jednej lub więcej sekcji dipolowych, które ustawione są tak, że cząstki o określonej wartości Bρ przechodzą wzdłuż osi optycznej. Sekcja taka składa się z magnesu dipolowego, po obu stronach którego znajdują się układy soczewek kwadrupolowych i korekcyjnych. Sekcja taka ma zazwyczaj własność obrazowania, tzn. tworzy w ognisku końcowym obraz przedmiotu umieszczonego w ognisku początkowym.

Aby zrozumieć działanie i własności sekcji dipolowej, wystarczy rozważyć jej macierz wypadkową, która reprezentuje wszystkie elementy od ogniska początkowego do końcowego.

Model uproszczony, sekcja dipolowa Bρ

Analizujemy uproszczony model sekcji dipolowej.

Manipulacja 3: sekcja Bρ

W płaszczyźnie ogniska początkowego umieszczamy przedmiot, czyli źródło cząstek. Cząstki wybiegają pod trzema różnymi kątami i z trzema różnymi pędami. Wartość pędu oznaczamy kolorem linii: czerwony - najmniejsza,  niebieski- największa (analogia do fotonów). W manipulacji możemy zmieniać położenie źródła względem osi, a także wszystkie elementy macierzy i obserwować gdzie dolatują cząstki w płaszczyźnie ogniska końcowego.

Manipulate[
Module[{
mBr,ll,lines,tracks
},
particles=Flatten[Table[{ys,alpha,delta},{alpha,{-0.3,0,0.3}},{delta,{-0.5,0.5,0}}],1];
mBr={{v,0,d},{w,1/v,dprim},{0,0,1}};
source=Graphics[{EdgeForm[Directive[Thick,Red]],Yellow,Disk[{-4,ys},ImageScaled[{0.013,0.035}]]}];
raytrack[r0_]:=Module[{rf,shift},
rf=mBr.r0;
shift=rf[[3]]/20.;
AppendTo[lines,{Blend[{Red,Blue},rf[[3]]+0.5],Thickness[0.002],Line[{{-4,ys+shift},{-2.7,ys+shift+r0[[2]]*1.3}}]}];
AppendTo[lines,{Blend[{Red,Blue},rf[[3]]+0.5],Thickness[0.0025],Line[{{-1.3,rf[[1]]-rf[[2]]*1.3},{0,rf[[1]]}}]}]
];
lines={};
raytrack/@particles;
tracks=Graphics[lines];
Show[axis,focus,tracks,source,brho,
PlotRange->{{-4.5,0.5},{-2,2}},
AspectRatio->0.4,
ImageSize->800]
],
(* Kontrolki *)
Panel[
Column[{
Row[{
Control[{{v,1,Style["Powiększenie x, V ",Black,20]},-1.5,1.5,Appearance->"Labeled",LabelStyle->Directive[Black,22],Exclusions->{0}}],
Control[{{d,0,Style["Dyspersja x, D ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
}],
Row[{
Control[{{w,1,Style["Powiększenie α, W",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}],
Control[{{dprim,0,Style["Dyspersja α, D'" ,Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
}],
Control[{{ys,0,Style["Położenie źródła, x " ,Black,20]},-0.5,0.5,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
},Alignment->Center]
],
(* *)
TrackedSymbols:>{v,w,d,dprim,ys},
FrameLabel->{None, None,Style["Sekcja Bρ", Blue,28], None},
Initialization:>{
axis=Graphics[{Black, Thickness[0.002],Line[{{-5,0},{5,0}}]}],
focus=Graphics[{Darker[Green], Thickness[0.004],Line[{{0,-2},{0,2}}]}],
brho=Graphics[{EdgeForm[Directive[Thick,Black]],LightGray,Rectangle[{-2.7,-1.5},{-1.3,1.5}],
Text[Style[" Bρ ",Blue,26],{-2,0.8}],
Text[Style[MatrixForm[{{"V","0","D"},{"W","1/V","D'"},{"0","0","1"}}],Black,24],{-2.15,-0.3}],
Text[Style[MatrixForm[{"x","α","δ"}],Black,24],{-1.55,-0.3}]
}]
}
]

Dwie sekcje Bρ

Modelem najprostszego separatora fragmentów są dwie sekcje dipolowe. Separator taki służy do selekcji produktów reakcji fragmentacji i jest wykorzystywany do wytwarzania najbardziej egzotycznych nuklidów w laboratoriach takich jak Dubna (Acculinna), GANIL (LISE), GSI Darmstadt (FRS), NSCL/MSU (A1900), czy RIKEN (BigRIPS). Typowo, separator fragmentów jest układem podwójnie achromatycznym, tzn. ogniskuje w jednym punkcie cząstki wybiegające ze źródła z różnymi kątami i różnymi pędami, ale są możliwe inne tryby optyczne.

Zapis macierzowy pozwala badać analitycznie różne warianty optyczne. Trudno jednak w tym zapisie “zobaczyć” co się dzieje z torami cząstek. Następna manipulacja pomaga uzyskać taki “wgląd”.

Manipulacja 4: dwie sekcje Bρ

W  manipulacji możemy zmieniać położenie źródła, jak poprzednio, i wszystkie elementy macierzowe obydwu sekcji.

Manipulate[
Module[{
mBr1,mBr2,ll,lines,tracks
},
particles=Flatten[Table[{ys,alpha,delta},{alpha,{-0.3,0,0.3}},{delta,{-0.5,0.5,0}}],1];
mBr1={{v1,0,d1},{w1,1/v1,dprim1},{0,0,1}};
mBr2={{v2,0,d2},{w2,1/v2,dprim2},{0,0,1}};
source=Graphics[{EdgeForm[Directive[Thick,Red]],Yellow,Disk[{-4,ys},ImageScaled[{0.013,0.035}]]}];
raytrack[r0_]:=Module[{rf1,rf2,shift},
rf1=mBr1.r0;
rf2=mBr2.rf1;
shift=r0[[3]]/20.;
AppendTo[lines,{Blend[{Red,Blue},r0[[3]]+0.5],Thickness[0.002],Line[{{-4,ys+shift},{-2.7,ys+shift+r0[[2]]*1.3}}]}];
AppendTo[lines,{Blend[{Red,Blue},rf1[[3]]+0.5],Thickness[0.0025],Line[{{-1.3,rf1[[1]]-rf1[[2]]*1.3},{1.3,rf1[[1]]+rf1[[2]]*1.3}}]}];
AppendTo[lines,{Blend[{Red,Blue},rf1[[3]]+0.5],Thickness[0.0025],Line[{{2.7,rf2[[1]]-rf2[[2]]*1.3},{4,rf2[[1]]}}]}]
];
lines={};
raytrack/@particles;
tracks=Graphics[lines];
Show[axis,focus1,focus2,tracks,source,brho1,brho2,
PlotRange->{{-4.5,4.5},{-2,2}},
AspectRatio->0.4,
ImageSize->800]
],
(* Kontrolki *)
Panel[
Column[{
Row[{
Control[{{v1,1,Style["  (Subscript[V, 1]) ",Black,20]},-1.5,1.5,Appearance->"Labeled",LabelStyle->Directive[Black,22],Exclusions->{0}}],
Control[{{v2,1,Style[" (Subscript[V, 2]) ",Black,20]},-1.5,1.5,Appearance->"Labeled",LabelStyle->Directive[Black,22],Exclusions->{0}}]
}],
Row[{
Control[{{w1,1,Style[" (Subscript[W, 1]) ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}],
Control[{{w2,1,Style[" (Subscript[W, 2]) ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
}],
Row[{
Control[{{d1,0,Style[" (Subscript[D, 1]) ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}],
Control[{{d2,0,Style[" (Subscript[D, 2]) ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
}],
Row[{
Control[{{dprim1,0,Style[" (Subscript[D, 1])'" ,Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}],
Control[{{dprim2,0,Style[" (Subscript[D, 2])'" ,Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
}],
Control[{{ys,0,Style["Położenie źródła, x " ,Black,20]},-0.5,0.5,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
},Alignment->Center],
ImageMargins->{{50,0},{0,10}}
],
(* *)
TrackedSymbols:>{v1,w1,d1,dprim1,v2,w2,d2,dprim2,ys},
FrameLabel->{None, None,Style["Dwie sekcje Bρ", Blue,28], None},
Initialization:>{
axis=Graphics[{Black, Thickness[0.002],Line[{{-5,0},{5,0}}]}],
focus1=Graphics[{Darker[Green], Thickness[0.004],Line[{{0,-2},{0,2}}]}],
focus2=Graphics[{Darker[Green], Thickness[0.004],Line[{{4,-2},{4,2}}]}],
brho1=Graphics[{EdgeForm[Directive[Thick,Black]],LightGray,Rectangle[{-2.7,-1.5},{-1.3,1.5}],
Text[Style[" (Subscript[Bρ, 1]) ",Blue,26],{-2,0}]
}],
brho2=Graphics[{EdgeForm[Directive[Thick,Black]],LightGray,Rectangle[{1.3,1.5},{2.7,-1.5}],
Text[Style[" (Subscript[Bρ, 2]) ",Blue,26],{2,0}]
}]
}
]

Separator fragmentów z degraderem

Sekcje dipolowe dokonują tylko selekcji jonów względem Bρ, a to często nie jest wystarczające. Separator złożony z dwóch sekcji dipolowych pozwala zastosować pewien trick. Pierwsza sekcja rozdziela cząstki o różnych pędach (dyspersja). W ognisku środkowym umieszczamy specjalnie wyprofilowany degrader, w którym cząstki o różnych pędach, które wskutek dyspersji maja rożne położenia, mogą różnie zmieniać swój pęd. Następnie druga sekcja zbiera cząstki, które przeszły przez degrader i ogniskuje je w ognisku końcowym.

Do układu dodajemy nowy element optyczny: warstwę materiału (degrader).

Wstawiamy degrader pomiędzy dwie sekcje dipolowe i uzyskujemy pełny układ separatora fragmentów:

Cztery najważniejsze ustawienia

Wyróżnia się 4 główne tryby optyczne:

Tryb monoenergetyczny

Wszystkie jony w ognisku końcowym mają tę samą energię, co oznacza, że (Subscript[m, 33])=0.

Jednak cały układ jest wtedy dyspersyjny, (Subscript[m, 13])=(Subscript[D, 1])(Subscript[V, 2]).

Tryb dopasowanego degradera

Układ bardzo podobny do tego bez degradera. W szczególności, jeśli układ bez degradera był achromatyczny, to taki pozostaje.

Tryb achromatyczny

Separator staje się achromatyczny nawet jeśli przed włożeniem degradera nie był. Ten tryb jest najczęściej używany w praktyce.

Degrader jednorodny

Uklad taki bywa nazywany spektrometrem strat energii. Może być achromatyczny, jeśli wybierzemy (Subscript[D, 2])=-(Subscript[D, 1]) (Subscript[V, 2]) /(Subscript[V, K]).

Manipulacja 5: pełny separator - dwie sekcje Bρ z degraderem

Dla uproszczenia i większej przejrzystości rezygnujemy z manipulowania wszystkimi parametrami i kładziemy:
                    (Subscript[V, 1])=1,  (Subscript[W, 1])=1,  (Subscript[D, 1]^('))=0,  (Subscript[W, 2])=1,  (Subscript[D, 2]^('))=0.
Dodajemy cztery przyciski, które pozwalają wybrać parametry odpowiadające czterem głównym trybom optycznym.

Manipulate[
Module[{
mBr1,mBr2,mK,ll,lines,tracks,
v1=1,w1=1,w2=1,dprim1=0,dprim2=0
},
particles=Flatten[Table[{ys,alpha,delta},{alpha,{-0.3,0,0.3}},{delta,{-0.5,0.5,0}}],1];
mBr1={{v1,0,d1},{w1,1/v1,dprim1},{0,0,1}};
mK={{1,0,0},{0,1,0},{dK,0,vK}};
mBr2={{v2,0,d2},{w2,1/v2,dprim2},{0,0,1}};
source=Graphics[{EdgeForm[Directive[Thick,Red]],Yellow,Disk[{-4,ys},ImageScaled[{0.013,0.035}]]}];
wedge=Graphics[{Opacity[0.5],EdgeForm[Directive[Thick,Black]],LightGray,Polygon[{{0,-1.5},{0,1.5},{0.1*(vK-1)*(1-0.5*dK),1.5},{0.1*(vK-1)*(1+0.5*dK),-1.5}}]}];
raytrack[r0_]:=Module[{rf1,rf2,rfK,shift},
rf1=mBr1.r0;
rfK=mK.rf1;
rf2=mBr2.rfK;
shift=r0[[3]]/20.;
AppendTo[lines,{Blend[{Red,Blue},r0[[3]]+0.5],Thickness[0.002],Line[{{-4,ys+shift},{-2.7,ys+shift+r0[[2]]*1.3}}]}];
AppendTo[lines,{Blend[{Red,Blue},rf1[[3]]+0.5],Thickness[0.0025],Line[{{-1.3,rf1[[1]]-rf1[[2]]*1.3},{0,rf1[[1]]}}]}];
AppendTo[lines,{Blend[{Red,Blue},rfK[[3]]+0.5],Thickness[0.0025],Line[{{0,rfK[[1]]},{1.3,rfK[[1]]+rfK[[2]]*1.3}}]}];
AppendTo[lines,{Blend[{Red,Blue},rf2[[3]]+0.5],Thickness[0.0025],Line[{{2.7,rf2[[1]]-rf2[[2]]*1.3},{4,rf2[[1]]}}]}]
];
lines={};
raytrack/@particles;
tracks=Graphics[lines];
Show[axis,focus1,focus2,tracks,source,brho1,brho2,wedge,
PlotRange->{{-4.5,4.5},{-2,2}},
AspectRatio->0.4,
ImageSize->800]
],
(* Kontrolki *)
Panel[
Column[{
Row[{
Control[{{d1,0,Style["(Subscript[D, 1]) ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}],
Control[{{ys,0,Style[" x " ,Black,20]},-0.5,0.5,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]}],
Row[{
Control[{{dK,0,Style[" (Subscript[D, K]) ",Black,20]},-2,2,Appearance->"Labeled",LabelStyle->Directive[Black,22],Enabled->(vK>1)}],
Control[{{vK,1,Style[" (Subscript[V, K]) ",Black,20]},1,2,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
}],
Row[{
Control[{{d2,0,Style[" (Subscript[D, 2]) ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}],
Control[{{v2,1,Style[" (Subscript[V, 2]) ",Black,20]},-1.5,1.5,Appearance->"Labeled",LabelStyle->Directive[Black,22],Exclusions->{0}}]
}],
Spacer[10],
Row[{
Button["Monoenergetyczny",
vK=1.5;d1=1;dK=-1.5,
BaseStyle->16,ImageMargins->5,ImageSize->All],
Button["Dopasowany",
vK=1.5;d1=0.5;dK=-1,
BaseStyle->16,ImageMargins->5,ImageSize->All],
Button["Achromatyczny",
vK=1.5;d1=1;v2=0.5;d2=1;dK=-2,
BaseStyle->16,ImageMargins->5,ImageSize->All],
Button["Homogeniczny",
dK=0;d1=1;v2=0.5;vK=1.5;d2=-0.3,
BaseStyle->16,ImageMargins->5,ImageSize->All]
}]
},Alignment->Center],
ImageMargins->{{60,0},{0,10}}
],
(* *)
TrackedSymbols:>{d1,dK,d2,ys,vK,v2},
FrameLabel->{None, None,Style["Separator fragmentów: dwie sekcje Bρ z degraderem", Blue,28], None},
Initialization:>{
axis=Graphics[{Black, Thickness[0.002],Line[{{-5,0},{5,0}}]}],
focus1=Graphics[{Darker[Green], Thickness[0.004],Line[{{0,-2},{0,2}}]}],
focus2=Graphics[{Darker[Green], Thickness[0.004],Line[{{4,-2},{4,2}}]}],
brho1=Graphics[{EdgeForm[Directive[Thick,Black]],LightGray,Rectangle[{-2.7,-1.5},{-1.3,1.5}],
Text[Style[" (Subscript[Bρ, 1]) ",Blue,26],{-2,0}]
}],
brho2=Graphics[{EdgeForm[Directive[Thick,Black]],LightGray,Rectangle[{1.3,1.5},{2.7,-1.5}],
Text[Style[" (Subscript[Bρ, 2]) ",Blue,26],{2,0}]
}]
}
]

Manipulacja 6: separator z degraderem, wersja rozbudowana

Do poprzedniej wersji dodajemy jeszcze wykres przestrzeni fazowej w ognisku końcowym, czyli zależność Bρ od położenia.

Manipulate[
Module[{
mBr1,mBr2,mK,ll,lines,tracks,phasespace,phaseplot,
v1=1,w1=1,w2=1,dprim1=0,dprim2=0
},
particles=Flatten[Table[{ys,alpha,delta},{alpha,{-0.3,0,0.3}},{delta,{-0.5,0.5,0}}],1];
mBr1={{v1,0,d1},{w1,1/v1,dprim1},{0,0,1}};
mK={{1,0,0},{0,1,0},{dK,0,vK}};
mBr2={{v2,0,d2},{w2,1/v2,dprim2},{0,0,1}};
source=Graphics[{EdgeForm[Directive[Thick,Red]],Yellow,Disk[{-4,ys},ImageScaled[{0.013,0.035}]]}];
wedge=Graphics[{Opacity[0.5],EdgeForm[Directive[Thick,Black]],LightGray,Polygon[{{0,-1.5},{0,1.5},{0.1*(vK-1)*(1-0.5*dK),1.5},{0.1*(vK-1)*(1+0.5*dK),-1.5}}]}];
raytrack[r0_]:=Module[{rf1,rf2,rfK,shift},
rf1=mBr1.r0;
rfK=mK.rf1;
rf2=mBr2.rfK;
shift=r0[[3]]/20.;
AppendTo[lines,{Blend[{Red,Blue},r0[[3]]+0.5],Thickness[0.002],Line[{{-4,ys+shift},{-2.7,ys+shift+r0[[2]]*1.3}}]}];
AppendTo[lines,{Blend[{Red,Blue},rf1[[3]]+0.5],Thickness[0.0025],Line[{{-1.3,rf1[[1]]-rf1[[2]]*1.3},{0,rf1[[1]]}}]}];
AppendTo[lines,{Blend[{Red,Blue},rfK[[3]]+0.5],Thickness[0.0025],Line[{{0,rfK[[1]]},{1.3,rfK[[1]]+rfK[[2]]*1.3}}]}];
AppendTo[lines,{Blend[{Red,Blue},rf2[[3]]+0.5],Thickness[0.0025],Line[{{2.7,rf2[[1]]-rf2[[2]]*1.3},{4,rf2[[1]]}}]}];
AppendTo[phasespace,{rf2[[1]],rf2[[3]]}]
];
lines={};
phasespace={};
raytrack/@particles;
tracks=Graphics[lines];
phaseplot=ListPlot[phasespace,
Frame->True,
PlotRange->{{-1,1},{-2,2}},
BaseStyle->{Black,FontFamily->"Verdana",FontSize->22},
PlotStyle->{Red,PointSize[0.05]},
GridLines->Automatic,
FrameLabel->{"x-ognisko końcowe","δ=ΔBρ/(Subscript[Bδ, 0])"},
ImageSize->500
];
TabView[{
{1,Style["Separator",Darker[Blue],20]->
Show[axis,focus1,focus2,tracks,source,brho1,brho2,wedge,
PlotRange->{{-4.5,4.5},{-2,2}},
AspectRatio->0.4,
ImageSize->800]},
{2,Style["Przestrzeń fazowa",Darker[Red],20]->Show[phaseplot]}
},Dynamic[tab],Alignment->Center]
],
(* Kontrolki *)
Panel[
Column[{
Row[{
Control[{{d1,0,Style["(Subscript[D, 1]) ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}],
Control[{{ys,0,Style[" (Subscript[x, 0]) " ,Black,20]},-0.5,0.5,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]}],
Row[{
Control[{{dK,0,Style[" (Subscript[D, K]) ",Black,20]},-2,2,Appearance->"Labeled",LabelStyle->Directive[Black,22],Enabled->(vK>1)}],
Control[{{vK,1,Style[" (Subscript[V, K]) ",Black,20]},1,2,Appearance->"Labeled",LabelStyle->Directive[Black,22]}]
}],
Row[{
Control[{{d2,0,Style[" (Subscript[D, 2]) ",Black,20]},-1,1,Appearance->"Labeled",LabelStyle->Directive[Black,22]}],
Control[{{v2,1,Style[" (Subscript[V, 2]) ",Black,20]},-1.5,1.5,Appearance->"Labeled",LabelStyle->Directive[Black,22],Exclusions->{0}}]
}],
Spacer[10],
Row[{
Button["Monoenergetyczny",
vK=1.5;d1=1;dK=-1.5,
BaseStyle->16,ImageMargins->5,ImageSize->All],
Button["Dopasowany",
vK=1.5;d1=0.5;dK=-1,
BaseStyle->16,ImageMargins->5,ImageSize->All],
Button["Achromatyczny",
vK=1.5;d1=1;v2=0.5;d2=1;dK=-2,
BaseStyle->16,ImageMargins->5,ImageSize->All],
Button["Homogeniczny",
dK=0;d1=1;v2=0.5;vK=1.5;d2=-0.3,
BaseStyle->16,ImageMargins->5,ImageSize->All]
}]
},Alignment->Center],
ImageMargins->{{60,0},{0,10}}
],
{{tab,1},None},
(* *)
TrackedSymbols:>{d1,dK,d2,ys,vK,v2},
FrameLabel->{None, None,Style["Separator fragmentów: dwie sekcje Bρ z degraderem", Blue,28], None},
Initialization:>{
axis=Graphics[{Black, Thickness[0.002],Line[{{-5,0},{5,0}}]}],
focus1=Graphics[{Darker[Green], Thickness[0.004],Line[{{0,-2},{0,2}}]}],
focus2=Graphics[{Darker[Green], Thickness[0.004],Line[{{4,-2},{4,2}}]}],
brho1=Graphics[{EdgeForm[Directive[Thick,Black]],LightGray,Rectangle[{-2.7,-1.5},{-1.3,1.5}],
Text[Style[" (Subscript[Bρ, 1]) ",Blue,26],{-2,0}]
}],
brho2=Graphics[{EdgeForm[Directive[Thick,Black]],LightGray,Rectangle[{1.3,1.5},{2.7,-1.5}],
Text[Style[" (Subscript[Bρ, 2]) ",Blue,26],{2,0}]
}]
}
]