diff --git a/2DMOT Simulation Code/+Helper/ImageSelection.class b/2DMOT Simulation Code/+Helper/ImageSelection.class deleted file mode 100644 index cfac41d..0000000 Binary files a/2DMOT Simulation Code/+Helper/ImageSelection.class and /dev/null differ diff --git a/2DMOT Simulation Code/+Helper/ImageSelection.java b/2DMOT Simulation Code/+Helper/ImageSelection.java deleted file mode 100644 index 5be8fbb..0000000 --- a/2DMOT Simulation Code/+Helper/ImageSelection.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Based on code snippet from - * http://java.sun.com/developer/technicalArticles/releases/data/ - * - * Copyright © 2008, 2010 Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. - */ - -import java.awt.image.BufferedImage; -import java.awt.datatransfer.*; - -public class ImageSelection implements Transferable { - - private static final DataFlavor flavors[] = - {DataFlavor.imageFlavor}; - - private BufferedImage image; - - public ImageSelection(BufferedImage image) { - this.image = image; - } - - // Transferable - public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { - if (flavor.equals(flavors[0]) == false) { - throw new UnsupportedFlavorException(flavor); - } - return image; - } - - public DataFlavor[] getTransferDataFlavors() { - return flavors; - } - - public boolean isDataFlavorSupported(DataFlavor - flavor) { - return flavor.equals(flavors[0]); - } -} \ No newline at end of file diff --git a/2DMOT Simulation Code/+Helper/PhysicsConstants.m b/2DMOT Simulation Code/+Helper/PhysicsConstants.m deleted file mode 100644 index f62dd0a..0000000 --- a/2DMOT Simulation Code/+Helper/PhysicsConstants.m +++ /dev/null @@ -1,46 +0,0 @@ -classdef PhysicsConstants < handle - properties (Constant) - % CODATA - PlanckConstant=6.62607015E-34; - PlanckConstantReduced=6.62607015E-34/(2*pi); - FineStructureConstant=7.2973525698E-3; - ElectronMass=9.10938291E-31; - GravitationalConstant=6.67384E-11; - ProtonMass=1.672621777E-27; - AtomicMassUnit=1.66053878283E-27; - BohrRadius=0.52917721092E-10; - BohrMagneton=927.400968E-26; - BoltzmannConstant=1.380649E-23; - StandardGravityAcceleration=9.80665; - SpeedOfLight=299792458; - StefanBoltzmannConstant=5.670373E-8; - ElectronCharge=1.602176634E-19; - VacuumPermeability=1.25663706212E-6; - DielectricConstant=8.8541878128E-12; - ElectronGyromagneticFactor=-2.00231930436153; - AvogadroConstant=6.02214076E23; - ZeroKelvin = 273.15; - GravitationalAcceleration = 9.80553; - - % Dy specific constants - Dy164Mass = 163.929174751*1.66053878283E-27; - Dy164IsotopicAbundance = 0.2826; - BlueWavelength = 421.291e-9; - BlueLandegFactor = 1.22; - BlueLifetime = 4.94e-9; - BlueLinewidth = 1/4.94e-9; - RedWavelength = 626.086e-9; - RedLandegFactor = 1.29; - RedLifetime = 1.2e-6; - RedLinewidth = 1/1.2e-6; - PushBeamWaveLength = 626.086e-9; - PushBeamLifetime = 1.2e-6; - PushBeamLinewidth = 1/1.2e-6; - end - - methods - function pc = PhysicsConstants() - end - end - -end diff --git a/2DMOT Simulation Code/+Helper/bringFiguresWithTagInForeground.m b/2DMOT Simulation Code/+Helper/bringFiguresWithTagInForeground.m deleted file mode 100644 index c58a117..0000000 --- a/2DMOT Simulation Code/+Helper/bringFiguresWithTagInForeground.m +++ /dev/null @@ -1,15 +0,0 @@ -function output = bringFiguresWithTagInForeground() - -figure_handles = findobj('type','figure'); - -for idx = 1:length(figure_handles) - if ~isempty(figure_handles(idx).Tag) - figure(figure_handles(idx)); - end -end - -if nargout > 0 - output = figure_handles; -end - -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Helper/calculateDistanceFromPointToLine.m b/2DMOT Simulation Code/+Helper/calculateDistanceFromPointToLine.m deleted file mode 100644 index df5c8c6..0000000 --- a/2DMOT Simulation Code/+Helper/calculateDistanceFromPointToLine.m +++ /dev/null @@ -1,10 +0,0 @@ -function ret = calculateDistanceFromPointToLine(p0 , p1, p2) - p01 = p0 - p1; - p12 = p2 - p1; - CrossProduct = [p01(2)*p12(3) - p01(3)*p12(2), p01(3)*p12(1) - p01(1)*p12(3), p01(1)*p12(2) - p01(2)*p12(1)]; - ret = norm(CrossProduct) / norm(p12); - - %Height of parallelogram (Distance between point and line) = Area of parallelogram / Base - %Area = One side of parallelogram X Base - %ret = norm(cross(one side, base))./ norm(base); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Helper/convertstruct2cell.m b/2DMOT Simulation Code/+Helper/convertstruct2cell.m deleted file mode 100644 index 90fdf2c..0000000 --- a/2DMOT Simulation Code/+Helper/convertstruct2cell.m +++ /dev/null @@ -1,6 +0,0 @@ -function CellOut = convertstruct2cell(StructIn) - % CellOut = Convertstruct2cell(StructIn) - % converts a struct into a cell-matrix where the first column contains - % the fieldnames and the second the contents - CellOut = [fieldnames(StructIn) struct2cell(StructIn)]'; -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Helper/findAllZeroCrossings.m b/2DMOT Simulation Code/+Helper/findAllZeroCrossings.m deleted file mode 100644 index 4b8d9db..0000000 --- a/2DMOT Simulation Code/+Helper/findAllZeroCrossings.m +++ /dev/null @@ -1,18 +0,0 @@ -function ret = findAllZeroCrossings(x,y) -% Finds all Zero-crossing of the function y = f(x) - zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Approximate Zero-Crossing Indices Of Argument Vector - zxidx = zci(y); - if ~isempty(zxidx) - for k1 = 1:numel(zxidx) - idxrng = max([1 zxidx(k1)-1]):min([zxidx(k1)+1 numel(y)]); - xrng = x(idxrng); - yrng = y(idxrng); - [yrng2, ~, jyrng] = unique(yrng); %yrng is a new array containing the unique values of yrng. jyrng contains the indices in yrng that correspond to the original vector. yrng = yrng2(jyrng) - xrng2 = accumarray(jyrng, xrng, [], @mean); %This function creates a new array "xrng2" by applying the function "@mean" to all elements in "xrng" that have identical indices in "jyrng". Any elements with identical X values will have identical indices in jyrng. Thus, this function creates a new array by averaging values with identical X values in the original array. - ret(k1) = interp1( yrng2(:), xrng2(:), 0, 'linear', 'extrap' ); - end - else - warning('No zero crossings found!') - ret = nan; - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Helper/getFigureByTag.m b/2DMOT Simulation Code/+Helper/getFigureByTag.m deleted file mode 100644 index 8fc6bf9..0000000 --- a/2DMOT Simulation Code/+Helper/getFigureByTag.m +++ /dev/null @@ -1,191 +0,0 @@ -function figure_handle = getFigureByTag(tag_name, varargin) - % figure_handle = getFigureByTag(tag_name, varargin) - % - % Example code: - % f_h = getFigureByTag('survivalMeasurement','Name','Survival') - % - % clf(f_h); - % a_h = gca(f_h); - % xlim(a_h,[10,100]); - % % custom position - % f_h.Position = [4052.3 719.67 560 420]; - - assert(nargin>=1 && ischar(tag_name),'You must specify ``tag_name'' as a string.'); - - f_h = findobj('type','figure','tag',tag_name); - - if isempty(f_h) - f_h = figure('Tag',tag_name,varargin{:}); - - defaultNewFigProperties = {'Color','w','NumberTitle','off','Name',sprintf('Fig. %d',f_h.Number)}; - - varargin = [defaultNewFigProperties,varargin]; - else - f_h = f_h(1); - end - - if ~isempty(varargin) - set(f_h,varargin{:}); - end - - addCopyButton(f_h); - - if nargout > 0 - figure_handle = f_h; - else - set(groot,'CurrentFigure',f_h); - end - -end - -function addCopyButton(f_h) - - if(strcmp(f_h.ToolBar,'none')) - return - end - - tb = findall(f_h,'Type','uitoolbar'); - - pt = findall(tb, 'tag', 'Custom.CopyPlot' ); - if isempty(pt) - pt = uipushtool(tb); - else - pt = pt(1); - end - - cdata = zeros(16,16,3); - - % Evernote Logo -% cdata(:,:,1) =[255 NaN NaN NaN NaN 99 11 27 175 NaN NaN NaN NaN NaN NaN 255 -% NaN NaN NaN 251 93 14 0 0 0 66 70 106 210 NaN NaN NaN -% NaN NaN NaN 42 0 43 0 0 0 0 0 0 20 185 NaN NaN -% NaN 243 56 0 42 82 0 0 0 0 0 0 0 45 NaN NaN -% NaN 156 44 64 113 65 0 0 0 0 0 0 0 32 NaN NaN -% 136 9 26 28 11 0 0 0 0 0 0 0 0 10 188 NaN -% 132 0 0 0 0 0 0 0 0 0 136 175 16 0 133 NaN -% NaN 28 0 0 0 0 0 0 0 0 152 238 50 0 124 NaN -% NaN 58 0 0 0 0 0 0 0 0 0 9 0 0 71 NaN -% NaN 175 0 0 0 0 0 61 15 0 0 0 0 0 100 NaN -% NaN NaN 143 12 0 0 0 210 195 87 17 0 0 0 126 NaN -% NaN NaN NaN 183 118 50 150 NaN NaN 110 219 78 0 0 160 NaN -% NaN NaN NaN NaN NaN NaN NaN 191 0 35 NaN 150 0 23 NaN NaN -% NaN NaN NaN NaN NaN NaN NaN 124 0 172 NaN 81 0 93 NaN NaN -% 255 NaN NaN NaN NaN NaN NaN 183 0 0 0 0 51 228 NaN 245 -% 253 254 NaN NaN NaN NaN NaN NaN 156 63 45 100 NaN NaN 255 255]/255.; -% -% -% cdata(:,:,2) = [255 255 255 255 255 216 166 171 225 229 218 229 247 255 255 255 -% 255 255 255 255 201 166 159 157 167 188 189 200 243 255 255 255 -% 237 238 255 181 159 183 164 170 163 158 160 157 169 233 248 250 -% 224 235 188 140 182 195 161 168 168 168 168 169 147 186 244 240 -% 255 226 175 185 207 189 161 168 168 168 168 168 159 179 249 249 -% 227 172 172 179 172 163 169 168 168 170 163 155 160 173 231 237 -% 215 161 163 165 166 168 168 168 168 162 215 228 172 163 209 219 -% 248 178 159 168 168 168 168 168 168 159 220 249 185 158 208 222 -% 249 192 151 169 168 168 169 160 163 172 163 159 166 167 194 204 -% 246 229 155 157 168 169 159 188 174 154 162 167 166 166 202 214 -% 212 231 218 168 157 153 165 255 242 190 171 159 167 166 207 220 -% 218 203 251 243 206 181 230 210 208 207 242 196 154 168 223 232 -% 255 224 232 250 237 214 244 194 152 178 255 223 145 175 250 252 -% 255 255 244 239 222 213 240 214 149 228 254 199 136 203 244 232 -% 255 255 255 246 231 246 246 232 165 159 167 147 184 253 254 242 -% 253 254 255 255 254 255 255 255 231 183 178 199 249 255 255 255]/255.; -% -% -% cdata(:,:,3) = [255 255 255 255 255 117 38 50 187 211 170 190 234 255 255 255 -% 255 254 255 255 120 51 27 20 39 97 98 122 220 255 255 255 -% 238 252 246 73 22 71 37 49 35 20 24 18 49 196 231 231 -% 232 242 86 0 78 108 29 45 45 45 45 46 0 82 214 201 -% 255 175 63 85 139 98 27 45 45 45 45 45 23 72 233 231 -% 167 51 57 72 55 32 47 45 45 50 34 14 27 57 201 218 -% 154 30 33 38 39 45 45 45 45 31 157 188 53 34 153 180 -% 234 67 24 45 45 45 45 44 45 24 169 241 83 20 146 182 -% 241 99 4 48 45 45 47 28 35 53 32 26 39 44 104 127 -% 238 192 14 20 45 47 27 97 56 10 29 44 41 40 127 158 -% 214 253 169 37 20 16 34 218 207 105 55 23 42 40 147 182 -% 218 214 241 201 138 71 177 225 181 130 224 107 12 45 175 197 -% 255 233 202 218 212 132 230 196 27 61 255 172 0 64 240 242 -% 255 255 219 197 176 160 237 143 0 195 245 110 0 123 230 230 -% 255 255 255 227 197 241 244 202 36 24 39 0 81 228 242 245 -% 253 254 255 255 254 255 255 255 191 78 71 121 221 255 255 255]/255.; - - %OneNote logo - - cdata(:,:,1) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 245 213 213 213 213 213 213 213 184 184 215 255 - 255 255 255 255 241 213 213 213 213 213 213 213 184 184 208 255 - 255 233 204 204 194 176 176 185 213 213 213 213 184 184 208 255 - 255 154 101 101 101 101 101 103 213 213 213 206 162 162 193 255 - 255 152 101 183 116 152 115 101 213 213 213 206 162 162 193 255 - 255 152 101 207 189 178 122 101 213 213 213 206 162 162 193 255 - 255 152 101 199 152 224 122 101 213 213 213 195 128 128 170 255 - 255 152 101 166 101 183 115 101 213 213 213 195 128 128 170 255 - 255 154 101 101 101 101 101 103 213 213 213 195 128 128 170 255 - 255 233 204 204 194 176 176 185 213 213 213 183 95 95 148 255 - 255 255 255 255 241 213 213 213 213 213 213 183 94 94 148 255 - 255 255 255 255 245 213 213 213 213 213 213 183 94 94 163 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.; - - - cdata(:,:,2) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 219 112 110 110 110 110 110 134 84 84 158 255 - 255 255 255 255 207 110 110 110 110 110 110 134 84 84 141 255 - 255 222 178 178 146 81 81 88 110 110 110 134 84 84 141 255 - 255 102 23 23 23 23 23 24 110 110 110 125 58 58 123 255 - 255 100 23 147 46 100 44 23 110 110 110 125 58 58 123 255 - 255 100 23 183 156 139 55 23 110 110 110 125 58 58 123 255 - 255 100 23 170 99 208 55 23 110 110 110 119 38 38 109 255 - 255 100 23 121 23 146 44 23 110 110 110 119 38 38 109 255 - 255 102 23 23 23 23 23 24 110 110 110 119 38 38 109 255 - 255 222 178 178 146 81 81 88 110 110 110 118 37 37 109 255 - 255 255 255 255 207 110 110 110 110 110 110 118 37 37 110 255 - 255 255 255 255 219 112 110 110 110 110 110 118 37 37 131 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.; - - - cdata(:,:,3) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 246 229 229 240 255 - 255 255 255 255 255 255 255 255 255 255 255 246 229 229 238 255 - 255 242 224 224 224 224 224 232 255 255 255 246 229 229 238 255 - 255 194 163 163 163 163 163 164 255 255 255 244 223 223 234 255 - 255 194 163 212 172 194 171 163 255 255 255 244 223 223 234 255 - 255 194 163 226 216 209 176 163 255 255 255 244 223 223 234 255 - 255 194 163 221 193 236 176 163 255 255 255 240 209 209 224 255 - 255 194 163 202 163 212 171 163 255 255 255 240 209 209 224 255 - 255 194 163 163 163 163 163 164 255 255 255 240 209 209 224 255 - 255 242 224 224 224 224 224 232 255 255 255 223 161 161 192 255 - 255 255 255 255 255 255 255 255 255 255 255 223 160 160 192 255 - 255 255 255 255 255 255 255 255 255 255 255 223 160 160 201 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.; - - - pt.Tag = 'Custom.CopyPlot'; - pt.CData = cdata; - pt.Separator = true; - pt.ClickedCallback = @copyToClipboard; - -end - -function copyToClipboard(~,~) - fig_h = get(get(gcbo,'Parent'),'Parent'); - if strcmp(fig_h.WindowStyle,'docked') - if ismac || ispc - matlab.graphics.internal.copyFigureHelper(fig_h); - else - %warning('Copy function to the clipboard only works if the figure is undocked.'); - Helper.screencapture(fig_h,[],'clipboard'); - end - else - pos = fig_h.Position; - Helper.screencapture(fig_h,[],'clipboard','position',[7,7,pos(3)-2,pos(4)]); - end -end - - - diff --git a/2DMOT Simulation Code/+Helper/ode5.m b/2DMOT Simulation Code/+Helper/ode5.m deleted file mode 100644 index 3eb003f..0000000 --- a/2DMOT Simulation Code/+Helper/ode5.m +++ /dev/null @@ -1,92 +0,0 @@ -function Y = ode5(odefun,tspan,y0,varargin) -%ODE5 Solve differential equations with a non-adaptive method of order 5. -% Y = ODE5(ODEFUN,TSPAN,Y0) with TSPAN = [T1, T2, T3, ... TN] integrates -% the system of differential equations y' = f(t,y) by stepping from T0 to -% T1 to TN. Function ODEFUN(T,Y) must return f(t,y) in a column vector. -% The vector Y0 is the initial conditions at T0. Each row in the solution -% array Y corresponds to a time specified in TSPAN. -% -% Y = ODE5(ODEFUN,TSPAN,Y0,P1,P2...) passes the additional parameters -% P1,P2... to the derivative function as ODEFUN(T,Y,P1,P2...). -% -% This is a non-adaptive solver. The step sequence is determined by TSPAN -% but the derivative function ODEFUN is evaluated multiple times per step. -% The solver implements the Dormand-Prince method of order 5 in a general -% framework of explicit Runge-Kutta methods. -% -% Example -% tspan = 0:0.1:20; -% y = ode5(@vdp1,tspan,[2 0]); -% plot(tspan,y(:,1)); -% solves the system y' = vdp1(t,y) with a constant step size of 0.1, -% and plots the first component of the solution. - -if ~isnumeric(tspan) - error('TSPAN should be a vector of integration steps.'); -end - -if ~isnumeric(y0) - error('Y0 should be a vector of initial conditions.'); -end - -h = diff(tspan); -if any(sign(h(1))*h <= 0) - error('Entries of TSPAN are not in order.') -end - -try - f0 = feval(odefun,tspan(1),y0,varargin{:}); -catch - msg = ['Unable to evaluate the ODEFUN at t0,y0. ',lasterr]; - error(msg); -end - -y0 = y0(:); % Make a column vector. -if ~isequal(size(y0),size(f0)) - error('Inconsistent sizes of Y0 and f(t0,y0).'); -end - -neq = length(y0); -N = length(tspan); -Y = zeros(neq,N); - -% Method coefficients -- Butcher's tableau -% -% C | A -% --+--- -% | B - -C = [1/5; 3/10; 4/5; 8/9; 1]; - -A = [ 1/5, 0, 0, 0, 0 - 3/40, 9/40, 0, 0, 0 - 44/45 -56/15, 32/9, 0, 0 - 19372/6561, -25360/2187, 64448/6561, -212/729, 0 - 9017/3168, -355/33, 46732/5247, 49/176, -5103/18656]; - -B = [35/384, 0, 500/1113, 125/192, -2187/6784, 11/84]; - -% More convenient storage -A = A.'; -B = B(:); - -nstages = length(B); -F = zeros(neq,nstages); - -Y(:,1) = y0; -for i = 2:N - ti = tspan(i-1); - hi = h(i-1); - yi = Y(:,i-1); - - % General explicit Runge-Kutta framework - F(:,1) = feval(odefun,ti,yi,varargin{:}); - for stage = 2:nstages - tstage = ti + C(stage-1)*hi; - ystage = yi + F(:,1:stage-1)*(hi*A(1:stage-1,stage-1)); - F(:,stage) = feval(odefun,tstage,ystage,varargin{:}); - end - Y(:,i) = yi + F*(hi*B); - -end -Y = Y.'; diff --git a/2DMOT Simulation Code/+Helper/onenoteccdata.m b/2DMOT Simulation Code/+Helper/onenoteccdata.m deleted file mode 100644 index 5f3c177..0000000 --- a/2DMOT Simulation Code/+Helper/onenoteccdata.m +++ /dev/null @@ -1,55 +0,0 @@ -cmap = zeros(16,16,3); - -cmap(:,:,1) = [0.0000 0.0118 0.4510 0.0039 0.2078 0.1569 0.4078 0.4431 0.4510 0.1922 0.4235 0.4196 0.2235 0.4235 0.4039 0.4392 - 0.4471 0.1647 0.4157 0.0000 0.0235 0.4353 0.0314 0.4314 0.0196 0.2392 0.0667 0.0392 0.4431 0.3804 0.2941 0.4275 - 0.3686 0.3608 0.2000 0.2824 0.3059 0.0549 0.1804 0.1882 0.4392 0.4314 0.3255 0.0078 0.0902 0.1961 0.4353 0.1412 - 0.2314 0.3647 0.0353 0.3804 0.1647 0.2431 0.1686 0.2745 0.2980 0.4235 0.3922 0.4157 0.2784 0.3333 0.2510 0.0588 - 0.1020 0.0745 0.2549 0.0471 0.1216 0.4000 0.3961 0.2627 0.1098 0.1725 0.3098 0.4314 0.3529 0.3412 0.0784 0.0824 - 0.4471 0.1490 0.1804 0.3529 0.2196 0.3137 0.3255 0.0941 0.0078 0.3294 0.3765 0.2706 0.0510 0.0157 0.4275 0.1176 - 0.1294 0.1333 0.1725 0.3451 0.2118 0.3843 0.1255 0.1569 0.2118 0.1608 0.0353 0.2039 0.1608 0.4510 1.0000 0.8000 - 0.9882 0.6510 0.9961 0.4549 0.4549 0.6824 0.7882 0.5686 0.5373 0.5490 0.7765 0.7137 0.8510 0.7176 0.5020 0.4902 - 0.8941 0.9020 0.4745 0.8980 0.9098 0.4824 0.6471 0.6353 0.9922 0.9647 0.6353 0.4588 0.9647 0.9020 0.4980 0.8118 - 0.5059 0.4941 0.9686 0.4863 0.5451 0.9725 0.8980 0.5451 0.5333 0.6824 0.4588 0.8196 0.8314 0.8980 0.8941 0.9961 - 0.5255 0.8392 0.9804 0.5216 0.8588 0.8078 0.5176 0.7647 0.5608 0.9725 0.9059 0.4627 0.9882 0.8275 0.7725 0.8745 - 0.8235 0.8431 0.7373 1.0000 0.5137 0.4706 0.4784 0.7412 0.8863 0.9373 0.5529 0.5804 0.4510 0.9255 0.8235 0.8667 - 0.7569 0.8824 0.5294 0.5176 0.5373 0.9569 0.5294 0.4824 0.5098 0.5137 0.5569 0.8471 0.5098 0.9490 0.8706 0.9412 - 0.4902 0.6000 0.6980 0.7882 0.5490 0.7216 0.6431 0.4824 0.5569 0.4667 0.6627 0.9922 0.7804 0.8039 0.6275 0.7333 - 0.5725 0.5647 0.8549 0.7529 0.6235 0.8784 0.5922 0.7294 0.6118 0.7922 0.7843 0.6667 0.9294 0.6902 0.6784 0.9176 - 0.6706 0.7490 0.7961 0.5882 0.8627 0.4627 0.6196 0.7059 0.6078 0.9765 0.6549 0.6863 0.5373 0.7098 0.7176 0.7765]; - -cmap(:,:,2) = [0.0000 0.0078 0.2157 0.0000 0.0980 0.0745 0.1922 0.2157 0.2157 0.0902 0.2000 0.1961 0.1059 0.2039 0.1882 0.2078 - 0.2078 0.0784 0.2000 0.0000 0.0118 0.2118 0.0157 0.2039 0.0078 0.1137 0.0314 0.0196 0.2118 0.1804 0.1373 0.2078 - 0.1765 0.1725 0.0941 0.1333 0.1451 0.0275 0.0863 0.0902 0.2078 0.2078 0.1529 0.0039 0.0431 0.0941 0.2039 0.0667 - 0.1098 0.1725 0.0157 0.1804 0.0784 0.1137 0.0824 0.1333 0.1412 0.2000 0.1882 0.2000 0.1333 0.1569 0.1176 0.0275 - 0.0471 0.0353 0.1216 0.0196 0.0588 0.1922 0.1882 0.1255 0.0510 0.0824 0.1451 0.2039 0.1686 0.1647 0.0392 0.0392 - 0.2157 0.0706 0.0863 0.1686 0.1020 0.1490 0.1529 0.0431 0.0039 0.1569 0.1804 0.1255 0.0235 0.0078 0.2000 0.0549 - 0.0627 0.0627 0.0824 0.1647 0.1020 0.1843 0.0588 0.0745 0.1020 0.0784 0.0157 0.0980 0.0784 0.2157 1.0000 0.7137 - 0.9843 0.4980 0.9961 0.2235 0.2196 0.5412 0.6980 0.3843 0.3373 0.3569 0.6824 0.5922 0.7843 0.6000 0.2902 0.2706 - 0.8510 0.8588 0.2471 0.8549 0.8667 0.2627 0.4980 0.4784 0.9843 0.9490 0.4745 0.2235 0.9451 0.8627 0.2824 0.7333 - 0.2941 0.2784 0.9529 0.2667 0.3490 0.9569 0.8510 0.3490 0.3333 0.5451 0.2275 0.7412 0.7608 0.8549 0.8471 0.9922 - 0.3255 0.7686 0.9725 0.3176 0.8000 0.7255 0.3098 0.6627 0.3725 0.9647 0.8627 0.2314 0.9804 0.7529 0.6745 0.8235 - 0.7451 0.7765 0.6235 0.9961 0.3020 0.2431 0.2510 0.6314 0.8392 0.9098 0.3608 0.4000 0.2196 0.8902 0.7490 0.8078 - 0.6549 0.8353 0.3294 0.3137 0.3412 0.9373 0.3255 0.2588 0.2980 0.3059 0.3686 0.7843 0.3020 0.9255 0.8157 0.9176 - 0.2745 0.4275 0.5686 0.6980 0.3569 0.6039 0.4863 0.2627 0.3647 0.2392 0.5137 0.9922 0.6863 0.7216 0.4706 0.6196 - 0.3882 0.3765 0.7882 0.6471 0.4588 0.8275 0.4157 0.6118 0.4431 0.7059 0.6902 0.5255 0.8980 0.5569 0.5412 0.8824 - 0.5333 0.6392 0.7098 0.4078 0.8039 0.2314 0.4549 0.5804 0.4392 0.9647 0.5059 0.5529 0.3373 0.5882 0.5961 0.6784]; - -cmap(:,:,3) = [0.0000 0.0157 0.4980 0.0039 0.2314 0.1725 0.4627 0.5020 0.5020 0.2196 0.4745 0.4706 0.2510 0.4784 0.4510 0.4980 - 0.4941 0.1882 0.4667 0.0000 0.0275 0.4941 0.0353 0.4902 0.0196 0.2667 0.0745 0.0471 0.4902 0.4314 0.3294 0.4784 - 0.4196 0.4000 0.2235 0.3216 0.3412 0.0627 0.2039 0.2118 0.4863 0.4863 0.3608 0.0078 0.1020 0.2196 0.4824 0.1569 - 0.2588 0.4118 0.0392 0.4235 0.1843 0.2745 0.1882 0.3059 0.3373 0.4784 0.4392 0.4627 0.3137 0.3765 0.2824 0.0667 - 0.1137 0.0824 0.2863 0.0510 0.1373 0.4510 0.4471 0.2941 0.1216 0.1961 0.3490 0.4824 0.3961 0.3804 0.0902 0.0941 - 0.4980 0.1647 0.2000 0.4000 0.2431 0.3529 0.3647 0.1059 0.0118 0.3686 0.4196 0.3020 0.0549 0.0196 0.4824 0.1294 - 0.1451 0.1529 0.1922 0.3882 0.2392 0.4353 0.1412 0.1765 0.2353 0.1804 0.0353 0.2275 0.1843 0.5059 1.0000 0.8196 - 0.9882 0.6863 0.9961 0.5098 0.5098 0.7137 0.8118 0.6118 0.5843 0.5922 0.8000 0.7412 0.8627 0.7451 0.5529 0.5412 - 0.9059 0.9137 0.5255 0.9098 0.9176 0.5333 0.6824 0.6706 0.9922 0.9686 0.6706 0.5098 0.9647 0.9137 0.5490 0.8314 - 0.5569 0.5451 0.9725 0.5373 0.5922 0.9725 0.9059 0.5882 0.5804 0.7137 0.5137 0.8353 0.8510 0.9059 0.9020 0.9961 - 0.5725 0.8549 0.9843 0.5725 0.8745 0.8275 0.5647 0.7882 0.6039 0.9765 0.9137 0.5176 0.9882 0.8431 0.7961 0.8863 - 0.8392 0.8588 0.7647 1.0000 0.5608 0.5216 0.5294 0.7686 0.8980 0.9412 0.6000 0.6235 0.5059 0.9333 0.8431 0.8784 - 0.7804 0.8941 0.5765 0.5686 0.5843 0.9608 0.5765 0.5333 0.5569 0.5647 0.6039 0.8627 0.5608 0.9569 0.8863 0.9490 - 0.5412 0.6392 0.7294 0.8078 0.5961 0.7490 0.6784 0.5373 0.6000 0.5216 0.6941 0.9922 0.8039 0.8235 0.6667 0.7608 - 0.6157 0.6078 0.8667 0.7765 0.6588 0.8902 0.6314 0.7569 0.6510 0.8157 0.8039 0.7020 0.9373 0.7216 0.7098 0.9255 - 0.7059 0.7725 0.8196 0.6314 0.8784 0.5137 0.6549 0.7373 0.6471 0.9804 0.6902 0.7176 0.5804 0.7412 0.7451 0.8000]; - -%% -[cdata, cmap] = imread('onenote.png'); \ No newline at end of file diff --git a/2DMOT Simulation Code/+Helper/parforNotifications.m b/2DMOT Simulation Code/+Helper/parforNotifications.m deleted file mode 100644 index 4ad3af4..0000000 --- a/2DMOT Simulation Code/+Helper/parforNotifications.m +++ /dev/null @@ -1,148 +0,0 @@ -% Copyright (c) 2019 Andrea Alberti -% -% All rights reserved. -classdef parforNotifications < handle - properties - N; % number of iterations - text = 'Please wait ...'; % text to show - width = 50; - showWarning = true; - end - properties (GetAccess = public, SetAccess = private) - n; - end - properties (Access = private) - inProgress = false; - percent; - DataQueue; - usePercent; - Nstr; - NstrL; - lastComment; - end - methods - function this = parforNotifications() - this.DataQueue = parallel.pool.DataQueue; - afterEach(this.DataQueue, @this.updateStatus); - end - % Start progress bar - function PB_start(this,N,varargin) - assert(isscalar(N) && isnumeric(N) && N == floor(N) && N>0, 'Error: ''N'' must be a scalar positive integer.'); - - this.N = N; - - p = inputParser; - addParameter(p,'message','Please wait: '); - addParameter(p,'usePercentage',true); - - parse(p,varargin{:}); - - this.text = p.Results.message; - assert(ischar(this.text), 'Error: ''Message'' must be a string.'); - - this.usePercent = p.Results.usePercentage; - assert(isscalar(this.usePercent) && islogical(this.usePercent), 'Error: ''usePercentage'' must be a logical scalar.'); - - this.percent = 0; - this.n = 0; - this.lastComment = ''; - if this.usePercent - fprintf('%s [%s]: %3d%%\n',this.text, char(32*ones(1,this.width)),0); - else - this.Nstr = sprintf('%d',this.N); - this.NstrL = numel(this.Nstr); - fprintf('%s [%s]: %s/%s\n',this.text, char(32*ones(1,this.width)),[char(32*ones(1,this.NstrL-1)),'0'],this.Nstr); - end - - this.inProgress = true; - end - % Iterate progress bar - function PB_iterate(this,str) - if nargin == 1 - send(this.DataQueue,''); - else - send(this.DataQueue,str); - end - end - function warning(this,warn_id,msg) - if this.showWarning - msg = struct('Action','Warning','Id',warn_id,'Message',msg); - send(this.DataQueue,msg); - end - end - function PB_reprint(this) - p = round(100*this.n/this.N); - - this.percent = p; - - cursor_pos=1+round((this.width-1)*p/100); - - if p < 100 - sep_char = '|'; - else - sep_char = '.'; - end - - if this.usePercent - fprintf('%s [%s%s%s]: %3d%%\n', this.text, char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),p); - else - nstr=sprintf('%d',this.n); - fprintf('%s [%s%s%s]: %s/%s\n', this.text, char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),[char(32*ones(1,this.NstrL-numel(nstr))),nstr],this.Nstr); - end - end - function updateStatus(this,data) - - if ischar(data) - - this.n = this.n + 1; - - p = round(100*this.n/this.N); - - if p >= this.percent+1 || this.n == this.N - this.percent = p; - - cursor_pos=1+round((this.width-1)*p/100); - - if p < 100 - sep_char = '|'; - else - sep_char = '.'; - end - - if ~isempty(data) - comment = [' (',data,')']; - else - comment = ''; - end - - if this.usePercent - fprintf('%s%s%s%s]: %3d%%%s\n',char(8*ones(1,58+numel(this.lastComment))), char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),p,comment); - else - nstr=sprintf('%d',this.n); - fprintf('%s%s%s%s]: %s/%s%s\n',char(8*ones(1,55+2*numel(this.Nstr)+numel(this.lastComment))), char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),[char(32*ones(1,this.NstrL-numel(nstr))),nstr],this.Nstr,comment) - end - - this.lastComment = comment; - - - if p == 100 - this.inProgress = false; - end - end - - else - switch data.Action - case 'Warning' - warning(data.Id,[data.Message,newline]); - if this.inProgress - this.PB_reprint(); - end - end - - end - - end - end -end - - diff --git a/2DMOT Simulation Code/+Helper/screencapture.m b/2DMOT Simulation Code/+Helper/screencapture.m deleted file mode 100644 index 206312e..0000000 --- a/2DMOT Simulation Code/+Helper/screencapture.m +++ /dev/null @@ -1,820 +0,0 @@ -function imageData = screencapture(varargin) -% screencapture - get a screen-capture of a figure frame, component handle, or screen area rectangle -% -% ScreenCapture gets a screen-capture of any Matlab GUI handle (including desktop, -% figure, axes, image or uicontrol), or a specified area rectangle located relative to -% the specified handle. Screen area capture is possible by specifying the root (desktop) -% handle (=0). The output can be either to an image file or to a Matlab matrix (useful -% for displaying via imshow() or for further processing) or to the system clipboard. -% This utility also enables adding a toolbar button for easy interactive screen-capture. -% -% Syntax: -% imageData = screencapture(handle, position, target, 'PropName',PropValue, ...) -% -% Input Parameters: -% handle - optional handle to be used for screen-capture origin. -% If empty/unsupplied then current figure (gcf) will be used. -% position - optional position array in pixels: [x,y,width,height]. -% If empty/unsupplied then the handle's position vector will be used. -% If both handle and position are empty/unsupplied then the position -% will be retrieved via interactive mouse-selection. -% If handle is an image, then position is in data (not pixel) units, so the -% captured region remains the same after figure/axes resize (like imcrop) -% target - optional filename for storing the screen-capture, or the -% 'clipboard'/'printer' strings. -% If empty/unsupplied then no output to file will be done. -% The file format will be determined from the extension (JPG/PNG/...). -% Supported formats are those supported by the imwrite function. -% 'PropName',PropValue - -% optional list of property pairs (e.g., 'target','myImage.png','pos',[10,20,30,40],'handle',gca) -% PropNames may be abbreviated and are case-insensitive. -% PropNames may also be given in whichever order. -% Supported PropNames are: -% - 'handle' (default: gcf handle) -% - 'position' (default: gcf position array) -% - 'target' (default: '') -% - 'toolbar' (figure handle; default: gcf) -% this adds a screen-capture button to the figure's toolbar -% If this parameter is specified, then no screen-capture -% will take place and the returned imageData will be []. -% -% Output parameters: -% imageData - image data in a format acceptable by the imshow function -% If neither target nor imageData were specified, the user will be -% asked to interactively specify the output file. -% -% Examples: -% imageData = screencapture; % interactively select screen-capture rectangle -% imageData = screencapture(hListbox); % capture image of a uicontrol -% imageData = screencapture(0, [20,30,40,50]); % capture a small desktop region -% imageData = screencapture(gcf,[20,30,40,50]); % capture a small figure region -% imageData = screencapture(gca,[10,20,30,40]); % capture a small axes region -% imshow(imageData); % display the captured image in a matlab figure -% imwrite(imageData,'myImage.png'); % save the captured image to file -% img = imread('cameraman.tif'); -% hImg = imshow(img); -% screencapture(hImg,[60,35,140,80]); % capture a region of an image -% screencapture(gcf,[],'myFigure.jpg'); % capture the entire figure into file -% screencapture(gcf,[],'clipboard'); % capture the entire figure into clipboard -% screencapture(gcf,[],'printer'); % print the entire figure -% screencapture('handle',gcf,'target','myFigure.jpg'); % same as previous, save to file -% screencapture('handle',gcf,'target','clipboard'); % same as previous, copy to clipboard -% screencapture('handle',gcf,'target','printer'); % same as previous, send to printer -% screencapture('toolbar',gcf); % adds a screen-capture button to gcf's toolbar -% screencapture('toolbar',[],'target','sc.bmp'); % same with default output filename -% -% Technical description: -% http://UndocumentedMatlab.com/blog/screencapture-utility/ -% -% Bugs and suggestions: -% Please send to Yair Altman (altmany at gmail dot com) -% -% See also: -% imshow, imwrite, print -% -% Release history: -% 1.17 2016-05-16: Fix annoying warning about JavaFrame property becoming obsolete someday (yes, we know...) -% 1.16 2016-04-19: Fix for deployed application suggested by Dwight Bartholomew -% 1.10 2014-11-25: Added the 'print' target -% 1.9 2014-11-25: Fix for saving GIF files -% 1.8 2014-11-16: Fixes for R2014b -% 1.7 2014-04-28: Fixed bug when capturing interactive selection -% 1.6 2014-04-22: Only enable image formats when saving to an unspecified file via uiputfile -% 1.5 2013-04-18: Fixed bug in capture of non-square image; fixes for Win64 -% 1.4 2013-01-27: Fixed capture of Desktop (root); enabled rbbox anywhere on desktop (not necesarily in a Matlab figure); enabled output to clipboard (based on Jiro Doke's imclipboard utility); edge-case fixes; added Java compatibility check -% 1.3 2012-07-23: Capture current object (uicontrol/axes/figure) if w=h=0 (e.g., by clicking a single point); extra input args sanity checks; fix for docked windows and image axes; include axes labels & ticks by default when capturing axes; use data-units position vector when capturing images; many edge-case fixes -% 1.2 2011-01-16: another performance boost (thanks to Jan Simon); some compatibility fixes for Matlab 6.5 (untested) -% 1.1 2009-06-03: Handle missing output format; performance boost (thanks to Urs); fix minor root-handle bug; added toolbar button option -% 1.0 2009-06-02: First version posted on MathWorks File Exchange - -% License to use and modify this code is granted freely to all interested, as long as the original author is -% referenced and attributed as such. The original author maintains the right to be solely associated with this work. - -% Programmed and Copyright by Yair M. Altman: altmany(at)gmail.com -% $Revision: 1.17 $ $Date: 2016/05/16 17:59:36 $ - - % Ensure that java awt is enabled... - if ~usejava('awt') - error('YMA:screencapture:NeedAwt','ScreenCapture requires Java to run.'); - end - - % Ensure that our Java version supports the Robot class (requires JVM 1.3+) - try - robot = java.awt.Robot; %#ok - catch - uiwait(msgbox({['Your Matlab installation is so old that its Java engine (' version('-java') ... - ') does not have a java.awt.Robot class. '], ' ', ... - 'Without this class, taking a screen-capture is impossible.', ' ', ... - 'So, either install JVM 1.3 or higher, or use a newer Matlab release.'}, ... - 'ScreenCapture', 'warn')); - if nargout, imageData = []; end - return; - end - - % Process optional arguments - paramsStruct = processArgs(varargin{:}); - - % If toolbar button requested, add it and exit - if ~isempty(paramsStruct.toolbar) - - % Add the toolbar button - addToolbarButton(paramsStruct); - - % Return the figure to its pre-undocked state (when relevant) - redockFigureIfRelevant(paramsStruct); - - % Exit immediately (do NOT take a screen-capture) - if nargout, imageData = []; end - return; - end - - % Convert position from handle-relative to desktop Java-based pixels - [paramsStruct, msgStr] = convertPos(paramsStruct); - - % Capture the requested screen rectangle using java.awt.Robot - imgData = getScreenCaptureImageData(paramsStruct.position); - - % Return the figure to its pre-undocked state (when relevant) - redockFigureIfRelevant(paramsStruct); - - % Save image data in file or clipboard, if specified - if ~isempty(paramsStruct.target) - if strcmpi(paramsStruct.target,'clipboard') - if ~isempty(imgData) - imclipboard(imgData); - else - msgbox('No image area selected - not copying image to clipboard','ScreenCapture','warn'); - end - elseif strncmpi(paramsStruct.target,'print',5) % 'print' or 'printer' - if ~isempty(imgData) - hNewFig = figure('visible','off'); - imshow(imgData); - print(hNewFig); - delete(hNewFig); - else - msgbox('No image area selected - not printing screenshot','ScreenCapture','warn'); - end - else % real filename - if ~isempty(imgData) - imwrite(imgData,paramsStruct.target); - else - msgbox(['No image area selected - not saving image file ' paramsStruct.target],'ScreenCapture','warn'); - end - end - end - - % Return image raster data to user, if requested - if nargout - imageData = imgData; - - % If neither output formats was specified (neither target nor output data) - elseif isempty(paramsStruct.target) & ~isempty(imgData) %#ok ML6 - % Ask the user to specify a file - %error('YMA:screencapture:noOutput','No output specified for ScreenCapture: specify the output filename and/or output data'); - %format = '*.*'; - formats = imformats; - for idx = 1 : numel(formats) - ext = sprintf('*.%s;',formats(idx).ext{:}); - format(idx,1:2) = {ext(1:end-1), formats(idx).description}; %#ok - end - [filename,pathname] = uiputfile(format,'Save screen capture as'); - if ~isequal(filename,0) & ~isequal(pathname,0) %#ok Matlab6 compatibility - try - filename = fullfile(pathname,filename); - imwrite(imgData,filename); - catch % possibly a GIF file that requires indexed colors - [imgData,map] = rgb2ind(imgData,256); - imwrite(imgData,map,filename); - end - else - % TODO - copy to clipboard - end - end - - % Display msgStr, if relevant - if ~isempty(msgStr) - uiwait(msgbox(msgStr,'ScreenCapture')); - drawnow; pause(0.05); % time for the msgbox to disappear - end - - return; % debug breakpoint - -%% Process optional arguments -function paramsStruct = processArgs(varargin) - - % Get the properties in either direct or P-V format - [regParams, pvPairs] = parseparams(varargin); - - % Now process the optional P-V params - try - % Initialize - paramName = []; - paramsStruct = []; - paramsStruct.handle = []; - paramsStruct.position = []; - paramsStruct.target = ''; - paramsStruct.toolbar = []; - paramsStruct.wasDocked = 0; % no false available in ML6 - paramsStruct.wasInteractive = 0; % no false available in ML6 - - % Parse the regular (non-named) params in recption order - if ~isempty(regParams) & (isempty(regParams{1}) | ishandle(regParams{1}(1))) %#ok ML6 - paramsStruct.handle = regParams{1}; - regParams(1) = []; - end - if ~isempty(regParams) & isnumeric(regParams{1}) & (length(regParams{1}) == 4) %#ok ML6 - paramsStruct.position = regParams{1}; - regParams(1) = []; - end - if ~isempty(regParams) & ischar(regParams{1}) %#ok ML6 - paramsStruct.target = regParams{1}; - end - - % Parse the optional param PV pairs - supportedArgs = {'handle','position','target','toolbar'}; - while ~isempty(pvPairs) - - % Disregard empty propNames (may be due to users mis-interpretting the syntax help) - while ~isempty(pvPairs) & isempty(pvPairs{1}) %#ok ML6 - pvPairs(1) = []; - end - if isempty(pvPairs) - break; - end - - % Ensure basic format is valid - paramName = ''; - if ~ischar(pvPairs{1}) - error('YMA:screencapture:invalidProperty','Invalid property passed to ScreenCapture'); - elseif length(pvPairs) == 1 - if isempty(paramsStruct.target) - paramsStruct.target = pvPairs{1}; - break; - else - error('YMA:screencapture:noPropertyValue',['No value specified for property ''' pvPairs{1} '''']); - end - end - - % Process parameter values - paramName = pvPairs{1}; - if strcmpi(paramName,'filename') % backward compatibility - paramName = 'target'; - end - paramValue = pvPairs{2}; - pvPairs(1:2) = []; - idx = find(strncmpi(paramName,supportedArgs,length(paramName))); - if ~isempty(idx) - %paramsStruct.(lower(supportedArgs{idx(1)})) = paramValue; % incompatible with ML6 - paramsStruct = setfield(paramsStruct, lower(supportedArgs{idx(1)}), paramValue); %#ok ML6 - - % If 'toolbar' param specified, then it cannot be left empty - use gcf - if strncmpi(paramName,'toolbar',length(paramName)) & isempty(paramsStruct.toolbar) %#ok ML6 - paramsStruct.toolbar = getCurrentFig; - end - - elseif isempty(paramsStruct.target) - paramsStruct.target = paramName; - pvPairs = {paramValue, pvPairs{:}}; %#ok (more readable this way, although a bit less efficient...) - - else - supportedArgsStr = sprintf('''%s'',',supportedArgs{:}); - error('YMA:screencapture:invalidProperty','%s \n%s', ... - 'Invalid property passed to ScreenCapture', ... - ['Supported property names are: ' supportedArgsStr(1:end-1)]); - end - end % loop pvPairs - - catch - if ~isempty(paramName), paramName = [' ''' paramName '''']; end - error('YMA:screencapture:invalidProperty','Error setting ScreenCapture property %s:\n%s',paramName,lasterr); %#ok - end -%end % processArgs - -%% Convert position from handle-relative to desktop Java-based pixels -function [paramsStruct, msgStr] = convertPos(paramsStruct) - msgStr = ''; - try - % Get the screen-size for later use - screenSize = get(0,'ScreenSize'); - - % Get the containing figure's handle - hParent = paramsStruct.handle; - if isempty(paramsStruct.handle) - paramsStruct.hFigure = getCurrentFig; - hParent = paramsStruct.hFigure; - else - paramsStruct.hFigure = ancestor(paramsStruct.handle,'figure'); - end - - % To get the acurate pixel position, the figure window must be undocked - try - if strcmpi(get(paramsStruct.hFigure,'WindowStyle'),'docked') - set(paramsStruct.hFigure,'WindowStyle','normal'); - drawnow; pause(0.25); - paramsStruct.wasDocked = 1; % no true available in ML6 - end - catch - % never mind - ignore... - end - - % The figure (if specified) must be in focus - if ~isempty(paramsStruct.hFigure) & ishandle(paramsStruct.hFigure) %#ok ML6 - isFigureValid = 1; % no true available in ML6 - figure(paramsStruct.hFigure); - else - isFigureValid = 0; % no false available in ML6 - end - - % Flush all graphic events to ensure correct rendering - drawnow; pause(0.01); - - % No handle specified - wasPositionGiven = 1; % no true available in ML6 - if isempty(paramsStruct.handle) - - % Set default handle, if not supplied - paramsStruct.handle = paramsStruct.hFigure; - - % If position was not specified, get it interactively using RBBOX - if isempty(paramsStruct.position) - [paramsStruct.position, jFrameUsed, msgStr] = getInteractivePosition(paramsStruct.hFigure); %#ok jFrameUsed is unused - paramsStruct.wasInteractive = 1; % no true available in ML6 - wasPositionGiven = 0; % no false available in ML6 - end - - elseif ~ishandle(paramsStruct.handle) - % Handle was supplied - ensure it is a valid handle - error('YMA:screencapture:invalidHandle','Invalid handle passed to ScreenCapture'); - - elseif isempty(paramsStruct.position) - % Handle was supplied but position was not, so use the handle's position - paramsStruct.position = getPixelPos(paramsStruct.handle); - paramsStruct.position(1:2) = 0; - wasPositionGiven = 0; % no false available in ML6 - - elseif ~isnumeric(paramsStruct.position) | (length(paramsStruct.position) ~= 4) %#ok ML6 - % Both handle & position were supplied - ensure a valid pixel position vector - error('YMA:screencapture:invalidPosition','Invalid position vector passed to ScreenCapture: \nMust be a [x,y,w,h] numeric pixel array'); - end - - % Capture current object (uicontrol/axes/figure) if w=h=0 (single-click in interactive mode) - if paramsStruct.position(3)<=0 | paramsStruct.position(4)<=0 %#ok ML6 - %TODO - find a way to single-click another Matlab figure (the following does not work) - %paramsStruct.position = getPixelPos(ancestor(hittest,'figure')); - paramsStruct.position = getPixelPos(paramsStruct.handle); - paramsStruct.position(1:2) = 0; - paramsStruct.wasInteractive = 0; % no false available in ML6 - wasPositionGiven = 0; % no false available in ML6 - end - - % First get the parent handle's desktop-based Matlab pixel position - parentPos = [0,0,0,0]; - dX = 0; - dY = 0; - dW = 0; - dH = 0; - if ~isFigure(hParent) - % Get the reguested component's pixel position - parentPos = getPixelPos(hParent, 1); % no true available in ML6 - - % Axes position inaccuracy estimation - deltaX = 3; - deltaY = -1; - - % Fix for images - if isImage(hParent) % | (isAxes(hParent) & strcmpi(get(hParent,'YDir'),'reverse')) %#ok ML6 - - % Compensate for resized image axes - hAxes = get(hParent,'Parent'); - if all(get(hAxes,'DataAspectRatio')==1) % sanity check: this is the normal behavior - % Note 18/4/2013: the following fails for non-square images - %actualImgSize = min(parentPos(3:4)); - %dX = (parentPos(3) - actualImgSize) / 2; - %dY = (parentPos(4) - actualImgSize) / 2; - %parentPos(3:4) = actualImgSize; - - % The following should work for all types of images - actualImgSize = size(get(hParent,'CData')); - dX = (parentPos(3) - min(parentPos(3),actualImgSize(2))) / 2; - dY = (parentPos(4) - min(parentPos(4),actualImgSize(1))) / 2; - parentPos(3:4) = actualImgSize([2,1]); - %parentPos(3) = max(parentPos(3),actualImgSize(2)); - %parentPos(4) = max(parentPos(4),actualImgSize(1)); - end - - % Fix user-specified img positions (but not auto-inferred ones) - if wasPositionGiven - - % In images, use data units rather than pixel units - % Reverse the YDir - ymax = max(get(hParent,'YData')); - paramsStruct.position(2) = ymax - paramsStruct.position(2) - paramsStruct.position(4); - - % Note: it would be best to use hgconvertunits, but: - % ^^^^ (1) it fails on Matlab 6, and (2) it doesn't accept Data units - %paramsStruct.position = hgconvertunits(hFig, paramsStruct.position, 'Data', 'pixel', hParent); % fails! - xLims = get(hParent,'XData'); - yLims = get(hParent,'YData'); - xPixelsPerData = parentPos(3) / (diff(xLims) + 1); - yPixelsPerData = parentPos(4) / (diff(yLims) + 1); - paramsStruct.position(1) = round((paramsStruct.position(1)-xLims(1)) * xPixelsPerData); - paramsStruct.position(2) = round((paramsStruct.position(2)-yLims(1)) * yPixelsPerData + 2*dY); - paramsStruct.position(3) = round( paramsStruct.position(3) * xPixelsPerData); - paramsStruct.position(4) = round( paramsStruct.position(4) * yPixelsPerData); - - % Axes position inaccuracy estimation - if strcmpi(computer('arch'),'win64') - deltaX = 7; - deltaY = -7; - else - deltaX = 3; - deltaY = -3; - end - - else % axes/image position was auto-infered (entire image) - % Axes position inaccuracy estimation - if strcmpi(computer('arch'),'win64') - deltaX = 6; - deltaY = -6; - else - deltaX = 2; - deltaY = -2; - end - dW = -2*dX; - dH = -2*dY; - end - end - - %hFig = ancestor(hParent,'figure'); - hParent = paramsStruct.hFigure; - - elseif paramsStruct.wasInteractive % interactive figure rectangle - - % Compensate for 1px rbbox inaccuracies - deltaX = 2; - deltaY = -2; - - else % non-interactive figure - - % Compensate 4px figure boundaries = difference betweeen OuterPosition and Position - deltaX = -1; - deltaY = 1; - end - %disp(paramsStruct.position) % for debugging - - % Now get the pixel position relative to the monitor - figurePos = getPixelPos(hParent); - desktopPos = figurePos + parentPos; - - % Now convert to Java-based pixels based on screen size - % Note: multiple monitors are automatically handled correctly, since all - % ^^^^ Java positions are relative to the main monitor's top-left corner - javaX = desktopPos(1) + paramsStruct.position(1) + deltaX + dX; - javaY = screenSize(4) - desktopPos(2) - paramsStruct.position(2) - paramsStruct.position(4) + deltaY + dY; - width = paramsStruct.position(3) + dW; - height = paramsStruct.position(4) + dH; - paramsStruct.position = round([javaX, javaY, width, height]); - %paramsStruct.position - - % Ensure the figure is at the front so it can be screen-captured - if isFigureValid - figure(hParent); - drawnow; - pause(0.02); - end - catch - % Maybe root/desktop handle (root does not have a 'Position' prop so getPixelPos croaks - if isequal(double(hParent),0) % =root/desktop handle; handles case of hParent=[] - javaX = paramsStruct.position(1) - 1; - javaY = screenSize(4) - paramsStruct.position(2) - paramsStruct.position(4) - 1; - paramsStruct.position = [javaX, javaY, paramsStruct.position(3:4)]; - end - end -%end % convertPos - -%% Interactively get the requested capture rectangle -function [positionRect, jFrameUsed, msgStr] = getInteractivePosition(hFig) - msgStr = ''; - try - % First try the invisible-figure approach, in order to - % enable rbbox outside any existing figure boundaries - f = figure('units','pixel','pos',[-100,-100,10,10],'HitTest','off'); - drawnow; pause(0.01); - oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); - jf = get(handle(f),'JavaFrame'); - warning(oldWarn); - try - jWindow = jf.fFigureClient.getWindow; - catch - try - jWindow = jf.fHG1Client.getWindow; - catch - jWindow = jf.getFigurePanelContainer.getParent.getTopLevelAncestor; - end - end - com.sun.awt.AWTUtilities.setWindowOpacity(jWindow,0.05); %=nearly transparent (not fully so that mouse clicks are captured) - jWindow.setMaximized(1); % no true available in ML6 - jFrameUsed = 1; % no true available in ML6 - msg = {'Mouse-click and drag a bounding rectangle for screen-capture ' ... - ... %'or single-click any Matlab figure to capture the entire figure.' ... - }; - catch - % Something failed, so revert to a simple rbbox on a visible figure - try delete(f); drawnow; catch, end %Cleanup... - jFrameUsed = 0; % no false available in ML6 - msg = {'Mouse-click within any Matlab figure and then', ... - 'drag a bounding rectangle for screen-capture,', ... - 'or single-click to capture the entire figure'}; - end - uiwait(msgbox(msg,'ScreenCapture')); - - k = waitforbuttonpress; %#ok k is unused - %hFig = getCurrentFig; - %p1 = get(hFig,'CurrentPoint'); - positionRect = rbbox; - %p2 = get(hFig,'CurrentPoint'); - - if jFrameUsed - jFrameOrigin = getPixelPos(f); - delete(f); drawnow; - try - figOrigin = getPixelPos(hFig); - catch % empty/invalid hFig handle - figOrigin = [0,0,0,0]; - end - else - if isempty(hFig) - jFrameOrigin = getPixelPos(gcf); - else - jFrameOrigin = [0,0,0,0]; - end - figOrigin = [0,0,0,0]; - end - positionRect(1:2) = positionRect(1:2) + jFrameOrigin(1:2) - figOrigin(1:2); - - if prod(positionRect(3:4)) > 0 - msgStr = sprintf('%dx%d area captured',positionRect(3),positionRect(4)); - end -%end % getInteractivePosition - -%% Get current figure (even if its handle is hidden) -function hFig = getCurrentFig - oldState = get(0,'showHiddenHandles'); - set(0,'showHiddenHandles','on'); - hFig = get(0,'CurrentFigure'); - set(0,'showHiddenHandles',oldState); -%end % getCurrentFig - -%% Get ancestor figure - used for old Matlab versions that don't have a built-in ancestor() -function hObj = ancestor(hObj,type) - if ~isempty(hObj) & ishandle(hObj) %#ok for Matlab 6 compatibility - try - hObj = get(hObj,'Ancestor'); - catch - % never mind... - end - try - %if ~isa(handle(hObj),type) % this is best but always returns 0 in Matlab 6! - %if ~isprop(hObj,'type') | ~strcmpi(get(hObj,'type'),type) % no isprop() in ML6! - try - objType = get(hObj,'type'); - catch - objType = ''; - end - if ~strcmpi(objType,type) - try - parent = get(handle(hObj),'parent'); - catch - parent = hObj.getParent; % some objs have no 'Parent' prop, just this method... - end - if ~isempty(parent) % empty parent means root ancestor, so exit - hObj = ancestor(parent,type); - end - end - catch - % never mind... - end - end -%end % ancestor - -%% Get position of an HG object in specified units -function pos = getPos(hObj,field,units) - % Matlab 6 did not have hgconvertunits so use the old way... - oldUnits = get(hObj,'units'); - if strcmpi(oldUnits,units) % don't modify units unless we must! - pos = get(hObj,field); - else - set(hObj,'units',units); - pos = get(hObj,field); - set(hObj,'units',oldUnits); - end -%end % getPos - -%% Get pixel position of an HG object - for Matlab 6 compatibility -function pos = getPixelPos(hObj,varargin) - persistent originalObj - try - stk = dbstack; - if ~strcmp(stk(2).name,'getPixelPos') - originalObj = hObj; - end - - if isFigure(hObj) %| isAxes(hObj) - %try - pos = getPos(hObj,'OuterPosition','pixels'); - else %catch - % getpixelposition is unvectorized unfortunately! - pos = getpixelposition(hObj,varargin{:}); - - % add the axes labels/ticks if relevant (plus a tiny margin to fix 2px label/title inconsistencies) - if isAxes(hObj) & ~isImage(originalObj) %#ok ML6 - tightInsets = getPos(hObj,'TightInset','pixel'); - pos = pos + tightInsets.*[-1,-1,1,1] + [-1,1,1+tightInsets(1:2)]; - end - end - catch - try - % Matlab 6 did not have getpixelposition nor hgconvertunits so use the old way... - pos = getPos(hObj,'Position','pixels'); - catch - % Maybe the handle does not have a 'Position' prop (e.g., text/line/plot) - use its parent - pos = getPixelPos(get(hObj,'parent'),varargin{:}); - end - end - - % Handle the case of missing/invalid/empty HG handle - if isempty(pos) - pos = [0,0,0,0]; - end -%end % getPixelPos - -%% Adds a ScreenCapture toolbar button -function addToolbarButton(paramsStruct) - % Ensure we have a valid toolbar handle - hFig = ancestor(paramsStruct.toolbar,'figure'); - if isempty(hFig) - error('YMA:screencapture:badToolbar','the ''Toolbar'' parameter must contain a valid GUI handle'); - end - set(hFig,'ToolBar','figure'); - hToolbar = findall(hFig,'type','uitoolbar'); - if isempty(hToolbar) - error('YMA:screencapture:noToolbar','the ''Toolbar'' parameter must contain a figure handle possessing a valid toolbar'); - end - hToolbar = hToolbar(1); % just in case there are several toolbars... - use only the first - - % Prepare the camera icon - icon = ['3333333333333333'; ... - '3333333333333333'; ... - '3333300000333333'; ... - '3333065556033333'; ... - '3000000000000033'; ... - '3022222222222033'; ... - '3022220002222033'; ... - '3022203110222033'; ... - '3022201110222033'; ... - '3022204440222033'; ... - '3022220002222033'; ... - '3022222222222033'; ... - '3000000000000033'; ... - '3333333333333333'; ... - '3333333333333333'; ... - '3333333333333333']; - cm = [ 0 0 0; ... % black - 0 0.60 1; ... % light blue - 0.53 0.53 0.53; ... % light gray - NaN NaN NaN; ... % transparent - 0 0.73 0; ... % light green - 0.27 0.27 0.27; ... % gray - 0.13 0.13 0.13]; % dark gray - cdata = ind2rgb(uint8(icon-'0'),cm); - - % If the button does not already exit - hButton = findall(hToolbar,'Tag','ScreenCaptureButton'); - tooltip = 'Screen capture'; - if ~isempty(paramsStruct.target) - tooltip = [tooltip ' to ' paramsStruct.target]; - end - if isempty(hButton) - % Add the button with the icon to the figure's toolbar - hButton = uipushtool(hToolbar, 'CData',cdata, 'Tag','ScreenCaptureButton', 'TooltipString',tooltip, 'ClickedCallback',['screencapture(''' paramsStruct.target ''')']); %#ok unused - else - % Otherwise, simply update the existing button - set(hButton, 'CData',cdata, 'Tag','ScreenCaptureButton', 'TooltipString',tooltip, 'ClickedCallback',['screencapture(''' paramsStruct.target ''')']); - end -%end % addToolbarButton - -%% Java-get the actual screen-capture image data -function imgData = getScreenCaptureImageData(positionRect) - if isempty(positionRect) | all(positionRect==0) | positionRect(3)<=0 | positionRect(4)<=0 %#ok ML6 - imgData = []; - else - % Use java.awt.Robot to take a screen-capture of the specified screen area - rect = java.awt.Rectangle(positionRect(1), positionRect(2), positionRect(3), positionRect(4)); - robot = java.awt.Robot; - jImage = robot.createScreenCapture(rect); - - % Convert the resulting Java image to a Matlab image - % Adapted for a much-improved performance from: - % http://www.mathworks.com/support/solutions/data/1-2WPAYR.html - h = jImage.getHeight; - w = jImage.getWidth; - %imgData = zeros([h,w,3],'uint8'); - %pixelsData = uint8(jImage.getData.getPixels(0,0,w,h,[])); - %for i = 1 : h - % base = (i-1)*w*3+1; - % imgData(i,1:w,:) = deal(reshape(pixelsData(base:(base+3*w-1)),3,w)'); - %end - - % Performance further improved based on feedback from Urs Schwartz: - %pixelsData = reshape(typecast(jImage.getData.getDataStorage,'uint32'),w,h).'; - %imgData(:,:,3) = bitshift(bitand(pixelsData,256^1-1),-8*0); - %imgData(:,:,2) = bitshift(bitand(pixelsData,256^2-1),-8*1); - %imgData(:,:,1) = bitshift(bitand(pixelsData,256^3-1),-8*2); - - % Performance even further improved based on feedback from Jan Simon: - pixelsData = reshape(typecast(jImage.getData.getDataStorage, 'uint8'), 4, w, h); - imgData = cat(3, ... - transpose(reshape(pixelsData(3, :, :), w, h)), ... - transpose(reshape(pixelsData(2, :, :), w, h)), ... - transpose(reshape(pixelsData(1, :, :), w, h))); - end -%end % getInteractivePosition - -%% Return the figure to its pre-undocked state (when relevant) -function redockFigureIfRelevant(paramsStruct) - if paramsStruct.wasDocked - try - set(paramsStruct.hFigure,'WindowStyle','docked'); - %drawnow; - catch - % never mind - ignore... - end - end -%end % redockFigureIfRelevant - -%% Copy screen-capture to the system clipboard -% Adapted from http://www.mathworks.com/matlabcentral/fileexchange/28708-imclipboard/content/imclipboard.m -function imclipboard(imgData) - % Import necessary Java classes - import java.awt.Toolkit.* - import java.awt.image.BufferedImage - import java.awt.datatransfer.DataFlavor - - % Add the necessary Java class (ImageSelection) to the Java classpath - if ~exist('ImageSelection', 'class') - % Obtain the directory of the executable (or of the M-file if not deployed) - %javaaddpath(fileparts(which(mfilename)), '-end'); - if isdeployed % Stand-alone mode. - [status, result] = system('path'); %#ok - MatLabFilePath = char(regexpi(result, 'Path=(.*?);', 'tokens', 'once')); - else % MATLAB mode. - MatLabFilePath = fileparts(mfilename('fullpath')); - end - javaaddpath(MatLabFilePath, '-end'); - end - - % Get System Clipboard object (java.awt.Toolkit) - cb = getDefaultToolkit.getSystemClipboard; % can't use () in ML6! - - % Get image size - ht = size(imgData, 1); - wd = size(imgData, 2); - - % Convert to Blue-Green-Red format - imgData = imgData(:, :, [3 2 1]); - - % Convert to 3xWxH format - imgData = permute(imgData, [3, 2, 1]); - - % Append Alpha data (not used) - imgData = cat(1, imgData, 255*ones(1, wd, ht, 'uint8')); - - % Create image buffer - imBuffer = BufferedImage(wd, ht, BufferedImage.TYPE_INT_RGB); - imBuffer.setRGB(0, 0, wd, ht, typecast(imgData(:), 'int32'), 0, wd); - - % Create ImageSelection object - % % custom java class - imSelection = ImageSelection(imBuffer); - - % Set clipboard content to the image - cb.setContents(imSelection, []); -%end %imclipboard - -%% Is the provided handle a figure? -function flag = isFigure(hObj) - flag = isa(handle(hObj),'figure') | isa(hObj,'matlab.ui.Figure'); -%end %isFigure - -%% Is the provided handle an axes? -function flag = isAxes(hObj) - flag = isa(handle(hObj),'axes') | isa(hObj,'matlab.graphics.axis.Axes'); -%end %isFigure - -%% Is the provided handle an image? -function flag = isImage(hObj) - flag = isa(handle(hObj),'image') | isa(hObj,'matlab.graphics.primitive.Image'); -%end %isFigure - -%%%%%%%%%%%%%%%%%%%%%%%%%% TODO %%%%%%%%%%%%%%%%%%%%%%%%% -% find a way in interactive-mode to single-click another Matlab figure for screen-capture \ No newline at end of file diff --git a/2DMOT Simulation Code/+Plotter/plotAngularDistributionForDifferentBeta.m b/2DMOT Simulation Code/+Plotter/plotAngularDistributionForDifferentBeta.m deleted file mode 100644 index 3812724..0000000 --- a/2DMOT Simulation Code/+Plotter/plotAngularDistributionForDifferentBeta.m +++ /dev/null @@ -1,73 +0,0 @@ -function plotAngularDistributionForDifferentBeta(obj, Beta) - - f_h = Helper.getFigureByTag('AngDistForBeta'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Beta dependence'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 750 600]; - - hold on - - SimulationBeta = obj.Beta; - - if ~ismember(SimulationBeta, Beta) - theta = linspace(0.0001,pi/2,1000); - J = zeros(1,length(theta)); - for j=1:length(theta) - J(j) = obj.angularDistributionFunction(theta(j)); - end - Norm = 0; - for j=1:length(J) - Norm = Norm+J(j)*sin(theta(j))*(theta(2)-theta(1)); - end - J = J ./Norm*2; - J = J ./max(J); - plot([-flip(theta),theta], [flip(J),J],'DisplayName', ['\beta = ',num2str(SimulationBeta, '%.3f')], 'Linewidth',1.5) - end - - for i=1:length(Beta) - - theta = linspace(0.0001,pi/2,1000); - J = zeros(1,length(theta)); - obj.NozzleLength = (2 * obj.NozzleRadius) / Beta(i); - - for j=1:length(theta) - J(j) = obj.angularDistributionFunction(theta(j)); - end - - Norm = 0; - for j=1:length(J) - Norm = Norm+J(j)*sin(theta(j))*(theta(2)-theta(1)); - end - J = J ./Norm*2; - J = J ./max(J); - - if Beta(i) ~= SimulationBeta - plot([-flip(theta),theta], [flip(J),J],'DisplayName',['\beta = ',num2str(Beta(i))], 'LineStyle', '--', 'Linewidth',1.5) - else - plot([-flip(theta),theta], [flip(J),J],'DisplayName',['\beta = ',num2str(Beta(i))], 'Linewidth',1.5) - end - end - - hold off - - leg = legend; - hXLabel = xlabel('\theta (rad)'); - hYLabel = ylabel('J(\theta)'); - hTitle = sgtitle('Angular Distribution (Transition Flow)'); - - set([hXLabel, hYLabel, leg] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 18 ); - - grid on - Helper.bringFiguresWithTagInForeground(); -end diff --git a/2DMOT Simulation Code/+Plotter/plotCaptureVelocityVsAngle.m b/2DMOT Simulation Code/+Plotter/plotCaptureVelocityVsAngle.m deleted file mode 100644 index 92c9306..0000000 --- a/2DMOT Simulation Code/+Plotter/plotCaptureVelocityVsAngle.m +++ /dev/null @@ -1,37 +0,0 @@ -function plotCaptureVelocityVsAngle(OvenObj, MOTObj) - - theta = linspace(0, OvenObj.ExitDivergence, 1000); - CaptureVelocity = zeros(length(theta),3); - - for i=1:length(theta) - CaptureVelocity(i,:) = MOTObj.calculateCaptureVelocity(OvenObj, [-OvenObj.OvenDistance,0,0], [cos(theta(i)),0,sin(theta(i))]); - end - - f_h = Helper.getFigureByTag('Capture Velocity'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Capture Velocity'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 750 600]; - - plot(theta .* 1e+03, sqrt(CaptureVelocity(:,1).^2+CaptureVelocity(:,2).^2+CaptureVelocity(:,3).^2), 'Linewidth', 1.5) - - hXLabel = xlabel('\theta (mrad)'); - hYLabel = ylabel('Velocity (m/s)'); - hTitle = sgtitle('Capture velocity for different angles of divergence'); - - set([hXLabel, hYLabel] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 14 ); - - grid on - Helper.bringFiguresWithTagInForeground(); - -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Plotter/plotConfidenceIntervalRegion.m b/2DMOT Simulation Code/+Plotter/plotConfidenceIntervalRegion.m deleted file mode 100644 index 2769798..0000000 --- a/2DMOT Simulation Code/+Plotter/plotConfidenceIntervalRegion.m +++ /dev/null @@ -1,18 +0,0 @@ -function plotConfidenceIntervalRegion(x, y1, y2) - % draws two lines on a plot and shades the area between those - % lines to indicate confidence interval. - hold on - - X_interpolated = linspace(min(x), max(x), 100); - Y1_interpolated = interp1(x,y1,X_interpolated); - Y2_interpolated = interp1(x,y2,X_interpolated); - - %Plot the line edges - %plot(X_interpolated, Y1_interpolated, 'LineWidth', 0.5, 'LineStyle', '--', 'Color', '#FE1A1A'); - %plot(X_interpolated, Y2_interpolated, 'LineWidth', 0.5, 'LineStyle', '--', 'Color', '#FE1A1A'); - - fill([X_interpolated fliplr(X_interpolated)], [Y1_interpolated fliplr(Y2_interpolated)], [0 71 138] ./ 255, 'EdgeColor', 'none', 'FaceAlpha', 0.2); - - hold off -end - \ No newline at end of file diff --git a/2DMOT Simulation Code/+Plotter/plotDynamicalQuantities.m b/2DMOT Simulation Code/+Plotter/plotDynamicalQuantities.m deleted file mode 100644 index dad74a4..0000000 --- a/2DMOT Simulation Code/+Plotter/plotDynamicalQuantities.m +++ /dev/null @@ -1,85 +0,0 @@ -function plotDynamicalQuantities(OvenObj, MOTObj, MaximumVelocity, IncidentAtomDirection, IncidentAtomPosition, varargin) - - p = inputParser; - p.KeepUnmatched = true; - - addRequired(p, 'OvenObject' , @isobject); - addRequired(p, 'MOTObject' , @isobject); - addRequired(p, 'MaximumVelocity' , @(x) assert(isnumeric(x) && isscalar(x))); - addRequired(p, 'IncidentAtomDirection' , @(x) assert(isnumeric(x) && isscalar(x))); - addRequired(p, 'IncidentAtomPosition' , @(x) assert(isnumeric(x) && isscalar(x))); - addParameter(p, 'PlotPositions' , false, @islogical); - addParameter(p, 'PlotVelocities' , false, @islogical); - - p.parse(OvenObj, MOTObj, MaximumVelocity, IncidentAtomDirection, IncidentAtomPosition, varargin{:}) - - MaximumVelocity = p.Results.MaximumVelocity; - IncidentAtomDirection = p.Results.IncidentAtomDirection; - IncidentAtomPosition = p.Results.IncidentAtomDirection; - PlotPositions = p.Results.PlotPositions; - PlotVelocities = p.Results.PlotVelocities; - - f_h = Helper.getFigureByTag('Trajectories Plot'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Trajectories Plot'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/50 screensize(4)/3.5] 1870 600]; - - N = MOTObj.NumberOfAtoms; - Theta = IncidentAtomDirection; - z = IncidentAtomPosition; - - L = OvenObj.OvenDistance * 2; - T = MOTObj.SimulationTime; - tau = MOTObj.TimeStep; - - Y = linspace(0,MaximumVelocity,N); - DynamicalQuantities = zeros(length(Y),int64(T/tau),6); - for i=1:length(Y) - x =-L/2; - vx = Y(i)*cos(Theta); - vz = Y(i)*sin(Theta); - r = [x,0,z]; - v = [vx,0,vz]; - DynamicalQuantities(i,:,:) = MOTObj.solver(r, v); - end - - LabelStringArrayForPositions = {'x (mm)', 'y (mm)', 'z (mm)'}; - LabelStringArrayForVelocities = {'v_x (m/s)', 'v_y (m/s)', 'v_z (m/s)'}; - colors = { [0, 0.4470, 0.7410], [0.8500, 0.3250, 0.0980], [0.4940, 0.1840, 0.5560]}; - t = linspace(0, T, T/tau) * 1e+3; - for i=1:length(Y) - for j = 1:3 - if PlotPositions - subplot(1, 3, j) - hold on - plot(t, DynamicalQuantities(i,:,j) * 1e+3,'Color', colors{j},'linewidth',1.3) - hXLabel = xlabel('Time (ms)'); - hYLabel = ylabel(LabelStringArrayForPositions{j}); - hold off - set([hXLabel, hYLabel], 'FontSize', 14); - elseif PlotVelocities - subplot(1, 3, j) - hold on - plot(t, DynamicalQuantities(i,:,j+3),'Color', colors{j},'linewidth',1.3) - hXLabel = xlabel('Time (ms)'); - hYLabel = ylabel(LabelStringArrayForVelocities{j}); - hold off - set([hXLabel, hYLabel], 'FontSize', 14); - end - end - end - - hold off - hTitle = sgtitle(sprintf("Magnetic gradient = %.2f T/m", MOTObj.MagneticGradient)); - set(hTitle, 'FontSize', 18); - Helper.bringFiguresWithTagInForeground(); -end - diff --git a/2DMOT Simulation Code/+Plotter/plotFreeMolecularFluxVsTemp.m b/2DMOT Simulation Code/+Plotter/plotFreeMolecularFluxVsTemp.m deleted file mode 100644 index 46e5734..0000000 --- a/2DMOT Simulation Code/+Plotter/plotFreeMolecularFluxVsTemp.m +++ /dev/null @@ -1,54 +0,0 @@ -function plotFreeMolecularFluxVsTemp(obj, Temperature) - - f_h = Helper.getFigureByTag('Tube Flux'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Tube Flux'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/4.5 screensize(4)/4.5] 920 750]; - - hold on - - for i=1:length(Temperature) - beta = linspace(0.01,0.5,200); - obj.OvenTemperature = Temperature(i); - flux = zeros(1,length(beta)); - for j=1:length(beta) - obj.NozzleLength = (2 * obj.NozzleRadius) / beta(j); - [ReducedClausingFactor, ~] = obj.calculateReducedClausingFactor(); - flux(j) = ReducedClausingFactor * obj.calculateFreeMolecularRegimeFlux(); - end - plot(beta, flux, 'DisplayName', sprintf('T = %.1f ℃', Temperature(i)), 'Linewidth', 1.5) - end - set(gca,'yscale','log') - - obj.restoreDefaults(); - - xline(obj.Beta, 'k--','Linewidth', 0.5); - fmf = obj.ReducedClausingFactor * obj.calculateFreeMolecularRegimeFlux(); - yline(fmf, 'k--', 'Linewidth', 1.5); - textstring = [sprintf('%1.e',fmf) ' atoms/s for ' '$$ \beta $$ = ' num2str(obj.Beta, '%.2f') sprintf(' @ %.2f K', obj.OvenTemperatureinKelvin)]; - txt = text((obj.Beta + 0.05*obj.Beta), (max(fmf) + 0.2*fmf), textstring, 'Interpreter','latex'); - - hold off - - leg = legend('Location', 'southeast'); - leg.String = leg.String(1:end-2); % Remove xline and yline legend entries - hXLabel = xlabel('\beta'); - hYLabel = ylabel('Flux (atoms/s)'); - hTitle = sgtitle('Total Flux from a Tube (Free Molecular Flow)'); - - set([hXLabel, hYLabel, txt, leg] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 18 ); - - grid on - Helper.bringFiguresWithTagInForeground(); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Plotter/plotInitialVeloctiySamplingVsAngle.m b/2DMOT Simulation Code/+Plotter/plotInitialVeloctiySamplingVsAngle.m deleted file mode 100644 index 47b9479..0000000 --- a/2DMOT Simulation Code/+Plotter/plotInitialVeloctiySamplingVsAngle.m +++ /dev/null @@ -1,72 +0,0 @@ -function plotInitialVeloctiySamplingVsAngle(obj, MOTObj, NumberOfBins) - n = obj.NumberOfAtoms; - VelocitySamples = obj.initialVelocitySampling(MOTObj); - - Speeds = zeros(length(VelocitySamples),1); - Angles = zeros(length(VelocitySamples),1); - - for i=1:length(VelocitySamples) - Speeds(i) = sqrt(VelocitySamples(i,1)^2+VelocitySamples(i,2)^2+VelocitySamples(i,3)^2); - Angles(i) = acos(VelocitySamples(i,1)/Speeds(i)); - end - - SpeedsArray = linspace(0,obj.VelocityCutoff,5000); - SpeedBinSize = obj.VelocityCutoff / NumberOfBins; - VelocityDistribution = @(velocity) sqrt(2 / pi) * sqrt(Helper.PhysicsConstants.Dy164Mass/(Helper.PhysicsConstants.BoltzmannConstant * obj.OvenTemperatureinKelvin))^3 ... - * velocity.^3 .* exp(-velocity.^2 .* (Helper.PhysicsConstants.Dy164Mass / (2 * Helper.PhysicsConstants.BoltzmannConstant ... - * obj.OvenTemperatureinKelvin))); - c = integral(VelocityDistribution, 0, obj.VelocityCutoff); - - AnglesArray = linspace(0, obj.ExitDivergence,1000); - AngleBinSize = obj.ExitDivergence / NumberOfBins; - dtheta = AnglesArray(2)-AnglesArray(1); - AngularDistribution = zeros(1,length(AnglesArray)); - d = 0; - for i = 1:length(AnglesArray) - AngularDistribution(i) = obj.angularDistributionFunction(AnglesArray(i)); - d = d + (2 * pi * AngularDistribution(i) * sin(AnglesArray(i)) * dtheta); - end - AngularDistribution = AngularDistribution .* (2 * pi .* sin(AnglesArray)); - - f_h = Helper.getFigureByTag('Velocity Sampling'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Velocity Sampling'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/10 screensize(4)/4] 1570,600]; - - subplot(1,2,1) - h_1 = histogram(Speeds, NumberOfBins,'FaceAlpha',0.4, 'EdgeAlpha',0.4); - hold on - plot(SpeedsArray, n/c * SpeedBinSize .* VelocityDistribution(SpeedsArray),'--', 'Linewidth',1.5) - xline(obj.VelocityCutoff, 'k--', 'Linewidth', 1.5); - text((obj.VelocityCutoff - 0.2 * obj.VelocityCutoff), max(h_1.Values) + 0.01 * max(h_1.Values), 'Cut-Off ---------->'); - hXLabel_1 = xlabel('|v| (m/s)'); - hYLabel_1 = ylabel('Counts'); - hold off - - subplot(1,2,2) - histogram(Angles .* 1e+03, NumberOfBins,'FaceAlpha',0.4, 'EdgeAlpha',0.4) - hold on - plot(AnglesArray .* 1e+03, (n/d * AngleBinSize .* AngularDistribution),'--', 'Linewidth',1.5) - xline(obj.ExitDivergence.* 1e+03, 'k--', 'Linewidth', 1.5); - text((obj.ExitDivergence - 0.5 * obj.ExitDivergence).* 1e+03, max(h_1.Values) - 0.45 * max(h_1.Values), 'Maximum Allowed Divergence ----------->'); - hXLabel_2 = xlabel('\theta (mrad)'); - hYLabel_2 = ylabel('Counts'); - hold off - - hTitle = sgtitle('Sampled Velocities'); - - set([hXLabel_1, hXLabel_2, hYLabel_1, hYLabel_2] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 18 ); - - Helper.bringFiguresWithTagInForeground(); -end diff --git a/2DMOT Simulation Code/+Plotter/plotMeanFreePathAndVapourPressureVsTemp.m b/2DMOT Simulation Code/+Plotter/plotMeanFreePathAndVapourPressureVsTemp.m deleted file mode 100644 index e7b9551..0000000 --- a/2DMOT Simulation Code/+Plotter/plotMeanFreePathAndVapourPressureVsTemp.m +++ /dev/null @@ -1,43 +0,0 @@ -function plotMeanFreePathAndVapourPressureVsTemp(TemperatureinCelsius) - - TemperatureinKelvin = TemperatureinCelsius + 273.15; - - Dy164VapourPressure = 133.322*exp(11.4103-2.3785e+04./(-219.4821+TemperatureinKelvin)); % Vapor Pressure Dysprosium for the given oven temperature - MeanFreepath = (Helper.PhysicsConstants.BoltzmannConstant*TemperatureinKelvin)./(sqrt(2) * ( pi * (2*281e-12)^2) * Dy164VapourPressure); %free path at above tempeture - - f_h = Helper.getFigureByTag('Dysprosium Gas Properties'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Dysprosium Gas Properties'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 750 600]; - - yyaxis left - semilogy(TemperatureinCelsius, Dy164VapourPressure, 'Color', '#0071BB', 'Linewidth',1.5); - hYLabel_1 = ylabel('Vapor Pressure (mbar)'); - yyaxis right - semilogy(TemperatureinCelsius, MeanFreepath.*1000, 'Color', '#36B449', 'Linewidth',1.5) - hYLabel_2 = ylabel('Mean Free Path (mm)'); - - hXLabel = xlabel('Temperature (℃)'); - - ax = gca; - ax.YAxis(1).Color = '#0071BB'; - ax.YAxis(2).Color = '#36B449'; - - hTitle = sgtitle('^{164}Dy Gas'); - - set([hXLabel, hYLabel_1, hYLabel_2] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 18 ); - - grid on - Helper.bringFiguresWithTagInForeground(); -end diff --git a/2DMOT Simulation Code/+Plotter/plotPhaseSpaceWithAccelerationField.m b/2DMOT Simulation Code/+Plotter/plotPhaseSpaceWithAccelerationField.m deleted file mode 100644 index f198b01..0000000 --- a/2DMOT Simulation Code/+Plotter/plotPhaseSpaceWithAccelerationField.m +++ /dev/null @@ -1,84 +0,0 @@ -function plotPhaseSpaceWithAccelerationField(OvenObj, MOTObj, MinimumVelocity, MaximumVelocity, NumberOfBins, IncidentAtomDirection, IncidentAtomPosition) - f_h = Helper.getFigureByTag('Phase Space Plot'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Phase Space Plot'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 750 600]; - - N = MOTObj.NumberOfAtoms; - L = OvenObj.OvenDistance * 2; - Theta = IncidentAtomDirection; - z = IncidentAtomPosition; - T = MOTObj.SimulationTime; - tau = MOTObj.TimeStep; - - [X,Y] = meshgrid(-L/2:L/NumberOfBins:L/2,-MaximumVelocity:2*MaximumVelocity/NumberOfBins:MaximumVelocity); - - a=zeros(NumberOfBins+1,NumberOfBins+1,3); - -% MOTObj.restoreDefaults(); - - for i=1:length(X) - for j=1:length(Y) - a(i,j,:) = MOTObj.calculateTotalAcceleration([X(1,i), 0, z], [Y(j,1)*cos(Theta),0,Y(j,1)*sin(Theta)]); - end - end - for i=1:length(X) - for j=1:length(Y) - if isnan(a(i,j,1)) || isnan(a(i,j,2)) || isnan(a(i,j,3)) - a(i,j,1)=0; - a(i,j,2)=0; - a(i,j,3)=0; - end - end - end - - pcolor(X',Y',a(:,:,1)) - hold on - col=colorbar; - col.Label.String='Aceleration (m/s^2)'; - shading flat - - %------------------------------------------------------------------------- - - Y = linspace(MinimumVelocity, MaximumVelocity,N); - DynamicalQuantities = zeros(length(Y),int64(T/tau),6); - for i=1:length(Y) - x =-L/2; - vx = Y(i)*cos(Theta); - vz = Y(i)*sin(Theta); - r = [x,0,z]; - v = [vx,0,vz]; - DynamicalQuantities(i,:,:) = MOTObj.solver(r, v); - end - - hold on - - count = 0; - for i=1:length(Y) - if DynamicalQuantities(i,end,2) > 0 - plot(DynamicalQuantities(i,:,1),DynamicalQuantities(i,:,4),'w','linewidth',1.3) - count = count + 1; - end - end - - hold off - - hXLabel = xlabel('Position: Along the x-axis (m)'); - hYLabel = ylabel('Velocity (m/s)'); - hTitle = sgtitle(sprintf("Magnetic gradient = %.3f T/m", MOTObj.MagneticGradient)); - set([hXLabel, hYLabel] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 18 ); - - Helper.bringFiguresWithTagInForeground(); -end - diff --git a/2DMOT Simulation Code/+Plotter/plotPositionAndVelocitySampling.m b/2DMOT Simulation Code/+Plotter/plotPositionAndVelocitySampling.m deleted file mode 100644 index ad87281..0000000 --- a/2DMOT Simulation Code/+Plotter/plotPositionAndVelocitySampling.m +++ /dev/null @@ -1,55 +0,0 @@ -function plotPositionAndVelocitySampling(NumberOfBins, initialPositions, initialVelocities) - - f_h = Helper.getFigureByTag('RejectionSampling'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Sampling'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/7 screensize(4)/7] 1.357e+03 770]; - - subplot(3,2,1) - histogram(initialPositions(:, 1)*1e3,NumberOfBins, 'LineStyle', 'none', 'DisplayName','x-Component') - xlabel('Positions (mm)','FontSize', 14) - ylabel('Counts','FontSize', 14) - legend('FontSize', 14) - - subplot(3,2,3) - histogram(initialPositions(:, 2)*1e3,NumberOfBins, 'LineStyle', 'none', 'DisplayName','y-Component') - xlabel('Positions (mm)','FontSize', 14) - ylabel('Counts','FontSize', 14) - legend('FontSize', 14) - - subplot(3,2,5) - histogram(initialPositions(:, 3)*1e3,NumberOfBins, 'LineStyle', 'none', 'DisplayName','z-Component') - xlabel('Positions (mm)','FontSize', 14) - ylabel('Counts','FontSize', 14) - legend('FontSize', 14) - - subplot(3,2,2) - histogram(initialVelocities(:, 1),NumberOfBins, 'LineStyle', 'none', 'DisplayName','x-Component') - xlabel('Velocities (m/s)','FontSize', 14) - ylabel('Counts','FontSize', 14) - legend('FontSize', 14) - - subplot(3,2,4) - histogram(initialVelocities(:, 2),NumberOfBins, 'LineStyle', 'none', 'DisplayName','y-Component') - xlabel('Velocities (m/s)','FontSize', 14) - ylabel('Counts','FontSize', 14) - legend('FontSize', 14) - - subplot(3,2,6) - histogram(initialVelocities(:, 3),NumberOfBins, 'LineStyle', 'none', 'DisplayName','z-Component') - xlabel('Velocities (m/s)','FontSize', 14) - ylabel('Counts','FontSize', 14) - legend('FontSize', 14) - - sgtitle('Rejection sampling for initial distributions','FontSize', 18) - - Helper.bringFiguresWithTagInForeground(); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Plotter/plotResultForOneParameterScan.m b/2DMOT Simulation Code/+Plotter/plotResultForOneParameterScan.m deleted file mode 100644 index 6ff5dcd..0000000 --- a/2DMOT Simulation Code/+Plotter/plotResultForOneParameterScan.m +++ /dev/null @@ -1,90 +0,0 @@ -function plotResultForOneParameterScan(XParameter, YQuantity, varargin) - - p = inputParser; - p.KeepUnmatched = true; - - addRequired(p, 'ParameterArray', @isvector) - addRequired(p, 'QuantityOfInterestArray', @ismatrix) - - addParameter(p, 'RescalingFactorForParameter', 1, @isscalar) - addParameter(p, 'XLabelString', 'X parameter', @ischar) - addParameter(p, 'ErrorsForYQuantity', false, @islogical) - addParameter(p, 'ErrorsArray', [], @isvector) - addParameter(p, 'CIForYQuantity', false, @islogical) - addParameter(p, 'CIArray', [], @ismatrix) - addParameter(p, 'RescalingFactorForYQuantity', 1, @isscalar) - addParameter(p, 'RemoveOutliers', false, @islogical) - addParameter(p, 'YLabelString', 'Y parameter', @ischar) - addParameter(p, 'TitleString', 'One-Parameter Scan', @ischar) - - p.parse(XParameter, YQuantity, varargin{:}) - - XParameter = p.Results.ParameterArray; - RescalingFactorForXParameter = p.Results.RescalingFactorForParameter; - XLabelString = p.Results.XLabelString; - YQuantity = p.Results.QuantityOfInterestArray; - ErrorsForYQuantity = p.Results.ErrorsForYQuantity; - ErrorsArray = p.Results.ErrorsArray; - CIForYQuantity = p.Results.CIForYQuantity; - CIArray = p.Results.CIArray; - RescalingFactorForYQuantity = p.Results.RescalingFactorForYQuantity; - RemoveOutliers = p.Results.RemoveOutliers; - YLabelString = p.Results.YLabelString; - TitleString = p.Results.TitleString; - - f_h = Helper.getFigureByTag('One-Parameter Scan'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'One-Parameter Scan'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 750 600]; - - if RemoveOutliers - [YQuantity,TF] = rmoutliers(YQuantity); - XParameter = XParameter(~TF); - ErrorsArray = ErrorsArray(~TF); - ClippedCIArray(:,1) = CIArray(~TF,1); - ClippedCIArray(:,2) = CIArray(~TF,2); - CIArray = ClippedCIArray; - end - - RescaledXParameter = XParameter .* RescalingFactorForXParameter; - RescaledYQuantity = YQuantity .* RescalingFactorForYQuantity; - - hold on - - if ErrorsForYQuantity - RescaledErrorsArray = ErrorsArray .* RescalingFactorForYQuantity; - errorbar(RescaledXParameter, RescaledYQuantity, RescaledErrorsArray, 'o', 'Linewidth', 1.5, 'MarkerFaceColor', '#0071BB') - else - plot(RescaledXParameter, RescaledYQuantity, '--o', 'Linewidth', 1.5); - end - - if CIForYQuantity - RescaledCIArray = CIArray .* RescalingFactorForYQuantity; - Plotter.plotConfidenceIntervalRegion(RescaledXParameter, RescaledCIArray(:,1), RescaledCIArray(:,2)); - end - - hold off - - xlim([0 inf]) - ylim([0 inf]) - - hXLabel = xlabel(XLabelString); - hYLabel = ylabel(YLabelString); - hTitle = sgtitle(TitleString); - - set([hXLabel, hYLabel] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 18 ); - - grid on - Helper.bringFiguresWithTagInForeground(); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Plotter/plotResultForThreeParameterScan.m b/2DMOT Simulation Code/+Plotter/plotResultForThreeParameterScan.m deleted file mode 100644 index 6867c48..0000000 --- a/2DMOT Simulation Code/+Plotter/plotResultForThreeParameterScan.m +++ /dev/null @@ -1,82 +0,0 @@ -function plotResultForThreeParameterScan(XParameter, YParameter, DeltaParameter, ZQuantity, varargin) - - p = inputParser; - p.KeepUnmatched = true; - - addRequired(p, 'FirstParameterArray', @isvector) - addRequired(p, 'SecondParameterArray', @isvector) - addRequired(p, 'ThirdParameterArray', @isvector) - addRequired(p, 'QuantityOfInterestArray', @ismatrix) - - addParameter(p, 'RescalingFactorForFirstParameter', 1, @isscalar) - addParameter(p, 'XLabelString', 'X parameter', @ischar) - addParameter(p, 'RescalingFactorForSecondParameter', 1, @isscalar) - addParameter(p, 'YLabelString', 'Y parameter', @ischar) - addParameter(p, 'RescalingFactorForThirdParameter', 1, @isscalar) - addParameter(p, 'RescalingFactorForQuantityOfInterest', 1, @isscalar) - addParameter(p, 'ZLabelString', 'Z parameter', @ischar) - addParameter(p, 'PlotTitleString', '', @ischar) - addParameter(p, 'FigureTitleString', 'Third-Parameter Scan', @ischar) - - p.parse(XParameter, YParameter, DeltaParameter, ZQuantity, varargin{:}) - - XParameter = p.Results.FirstParameterArray; - RescalingFactorForXParameter = p.Results.RescalingFactorForFirstParameter; - XLabelString = p.Results.XLabelString; - YParameter = p.Results.SecondParameterArray; - RescalingFactorForYParameter = p.Results.RescalingFactorForSecondParameter; - YLabelString = p.Results.YLabelString; - DeltaParameter = p.Results.ThirdParameterArray; - RescalingFactorForDeltaParameter = p.Results.RescalingFactorForThirdParameter; - ZQuantity = p.Results.QuantityOfInterestArray; - RescalingFactorForZQuantity = p.Results.RescalingFactorForQuantityOfInterest; - ZLabelString = p.Results.ZLabelString; - PlotTitleString = p.Results.PlotTitleString; - FigureTitleString = p.Results.FigureTitleString; - - f_h = Helper.getFigureByTag('Three-Parameter Scan'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Three-Parameter Scan'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/60 screensize(4)/10] 1530 870]; - - RescaledXParameter = XParameter .* RescalingFactorForXParameter; - RescaledYParameter = YParameter .* RescalingFactorForYParameter; - RescaledDeltaParameter = DeltaParameter .* RescalingFactorForDeltaParameter; - - tiledlayout(ceil(length(DeltaParameter)/3), 3) - - for i = 1:length(DeltaParameter) - nexttile - RescaledZQuantity = ZQuantity{i} .* RescalingFactorForZQuantity; - imagesc(RescaledXParameter, RescaledYParameter, RescaledZQuantity(:,:)'); - set(gca,'YDir','normal'); - hXLabel = xlabel(XLabelString); - hYLabel = ylabel(YLabelString); - hPlotLabel = title(sprintf(PlotTitleString, RescaledDeltaParameter(i))); - set([hXLabel, hYLabel, hPlotLabel] , ... - 'FontSize' , 14); - end - - caxis([min(min(min(RescaledZQuantity))) max(max(max(RescaledZQuantity)))]); - - shading flat; - c = colorbar; - c.Label.String= ZLabelString; - c.Label.FontSize = 14; - c.Layout.Tile = 'east'; - - hTitle = sgtitle(FigureTitleString); - - set( hTitle , ... - 'FontSize' , 18 ); - - Helper.bringFiguresWithTagInForeground(); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Plotter/plotResultForTwoParameterScan.m b/2DMOT Simulation Code/+Plotter/plotResultForTwoParameterScan.m deleted file mode 100644 index 36141c0..0000000 --- a/2DMOT Simulation Code/+Plotter/plotResultForTwoParameterScan.m +++ /dev/null @@ -1,74 +0,0 @@ -function plotResultForTwoParameterScan(XParameter, YParameter, ZQuantity, varargin) - - p = inputParser; - p.KeepUnmatched = true; - - addRequired(p, 'FirstParameterArray', @isvector) - addRequired(p, 'SecondParameterArray', @isvector) - addRequired(p, 'QuantityOfInterestArray', @ismatrix) - - addParameter(p, 'RescalingFactorForFirstParameter', 1, @isscalar) - addParameter(p, 'XLabelString', 'X parameter', @ischar) - addParameter(p, 'RescalingFactorForSecondParameter', 1, @isscalar) - addParameter(p, 'YLabelString', 'Y parameter', @ischar) - addParameter(p, 'RescalingFactorForQuantityOfInterest', 1, @isscalar) - addParameter(p, 'ZLabelString', 'Z parameter', @ischar) - addParameter(p, 'TitleString', 'Two-Parameter Scan', @ischar) - - p.parse(XParameter, YParameter, ZQuantity, varargin{:}) - - XParameter = p.Results.FirstParameterArray; - RescalingFactorForXParameter = p.Results.RescalingFactorForFirstParameter; - XLabelString = p.Results.XLabelString; - YParameter = p.Results.SecondParameterArray; - RescalingFactorForYParameter = p.Results.RescalingFactorForSecondParameter; - YLabelString = p.Results.YLabelString; - ZQuantity = p.Results.QuantityOfInterestArray; - RescalingFactorForZQuantity = p.Results.RescalingFactorForQuantityOfInterest; - ZLabelString = p.Results.ZLabelString; - TitleString = p.Results.TitleString; - - f_h = Helper.getFigureByTag('Two-Parameter Scan'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Two-Parameter Scan'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 750 600]; - - RescaledXParameter = XParameter .* RescalingFactorForXParameter; - RescaledYParameter = YParameter .* RescalingFactorForYParameter; - RescaledZQuantity = ZQuantity .* RescalingFactorForZQuantity; - - imagesc(RescaledXParameter, RescaledYParameter, RescaledZQuantity(:,:)'); - -% hold on -% -% contour(RescaledXParameter, RescaledYParameter, RescaledZQuantity(:,:)', 'Color', 'r', 'Linewidth', 4, 'ShowText','on') - - set(gca,'YDir','normal'); - - caxis([min(min(min(RescaledZQuantity))) max(max(max(RescaledZQuantity)))]); - - hXLabel = xlabel(XLabelString); - hYLabel = ylabel(YLabelString); - - shading flat; - c = colorbar; - c.Label.String= ZLabelString; - c.Label.FontSize = 14; - - hTitle = sgtitle(TitleString); - - set([hXLabel, hYLabel] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 18 ); - - Helper.bringFiguresWithTagInForeground(); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Plotter/visualizeMagneticField.m b/2DMOT Simulation Code/+Plotter/visualizeMagneticField.m deleted file mode 100644 index 2af9d23..0000000 --- a/2DMOT Simulation Code/+Plotter/visualizeMagneticField.m +++ /dev/null @@ -1,72 +0,0 @@ -function visualizeMagneticField(obj, x_range, y_range, z_range) - - f_h = Helper.getFigureByTag('VisualizeMagneticFieldFor2DMOT'); - set(groot,'CurrentFigure',f_h); - a_h = get(f_h, 'CurrentAxes'); - if ~isempty(get(a_h, 'Children')) - clf(f_h); - end - f_h.Name = 'Visualization'; - f_h.Units = 'pixels'; - - set(0,'units','pixels'); - screensize = get(0,'ScreenSize'); - f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 820 645]; - - xmin = x_range(1); - xmax = x_range(2); - ymin = y_range(1); - ymax = y_range(2); - zmin = z_range(1); - zmax = z_range(2); - dx = (xmax-xmin)/8; - dy = (ymax-ymin)/8; - dz = (zmax-zmin)/8; - if dx ~= 0 - xm = xmin:dx:xmax; - else - xm = zeros(1,5); - end - - if dy ~= 0 - ym = ymin:dy:ymax; - else - ym = zeros(1,5); - end - - if dz ~= 0 - zm = zmin:dz:zmax; - else - zm = zeros(1,5); - end - [meshx,meshy,meshz] = meshgrid(xm,ym,zm); % construct data points - - switch obj.SimulationMode - case '2D' - alpha = obj.MagneticGradient; - Bx = @(x,y,z) alpha .* z; - By = @(x,y,z) 0 .* y; - Bz = @(x,y,z) alpha .* x; - Bx_val = Bx(meshx, meshy, meshz); - By_val = By(meshx, meshy, meshz); - Bz_val = Bz(meshx, meshy, meshz); - case '3D' - % Development in progress - end - - quiver3(meshx, meshy, meshz, Bx_val, By_val, Bz_val, 'Color', ' #6600ff'); - axis equal - - hXLabel = xlabel('x'); - hYLabel = ylabel('y'); - hZLabel = zlabel('z'); - - hTitle = sgtitle('Magnetic Field for 2-D MOT'); - - set([hXLabel, hYLabel, hZLabel] , ... - 'FontSize' , 14 ); - set( hTitle , ... - 'FontSize' , 18 ); - - Helper.bringFiguresWithTagInForeground(); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Scripts/optimizingForSidebandEnhancement.m b/2DMOT Simulation Code/+Scripts/optimizingForSidebandEnhancement.m deleted file mode 100644 index 4af4332..0000000 --- a/2DMOT Simulation Code/+Scripts/optimizingForSidebandEnhancement.m +++ /dev/null @@ -1,236 +0,0 @@ -OptionsStruct = struct; -OptionsStruct.ErrorEstimationMethod = 'bootstrap'; % 'jackknife' | 'bootstrap' -OptionsStruct.NumberOfAtoms = 5000; -OptionsStruct.TimeStep = 50e-06; % in s -OptionsStruct.SimulationTime = 5e-03; % in s -OptionsStruct.SpontaneousEmission = true; -OptionsStruct.SidebandBeam = true; -OptionsStruct.PushBeam = true; -OptionsStruct.Gravity = true; -OptionsStruct.BackgroundCollision = true; -OptionsStruct.SaveData = true; -% OptionsStruct.SaveDirectory = ''; -options = Helper.convertstruct2cell(OptionsStruct); -clear OptionsStruct - -Oven = Simulator.Oven(options{:}); -MOT2D = Simulator.TwoDimensionalMOT(options{:}); -Beams = MOT2D.Beams; - -%% -MOT2D.NumberOfAtoms = 10000; -MOT2D.TotalPower = 0.8; -MOT2D.MagneticGradient = 0.4; 0; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -CoolingBeam.Waist = 15e-03; -CoolingBeam.Detuning = -1.67*Helper.PhysicsConstants.BlueLinewidth; -SidebandBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'BlueSideband'), Beams)}; -SidebandBeam.Waist = 15e-03; - -NumberOfPointsForFirstParam = 20; %iterations of the simulation -NumberOfPointsForSecondParam = 20; -DetuningArray = linspace(-1.0, -6.0, NumberOfPointsForFirstParam) * Helper.PhysicsConstants.BlueLinewidth; -PowerArray = linspace(0, 0.8, NumberOfPointsForSecondParam) * MOT2D.TotalPower; - -tStart = tic; -[LoadingRateArray, ~, ~] = Scripts.scanForSidebandEnhancement(Oven, MOT2D, 'Blue', 'BlueSideband', DetuningArray, PowerArray); -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - -if MOT2D.DoSave - LoadingRate = struct; - LoadingRate.Values = LoadingRateArray; - MOT2D.Results = LoadingRate; - SaveFolder = [MOT2D.SaveDirectory filesep 'Results']; - Filename = ['TwoParameterScan_' datestr(now,'yyyymmdd_HHMM')]; - eval([sprintf('%s_Object', Filename) ' = MOT2D;']); - mkdir(SaveFolder); - save([SaveFolder filesep Filename], sprintf('%s_Object', Filename)); -end - -MOT2D.SidebandBeam = false; -MOT2D.PushBeam = false; -CoolingBeam.Power = MOT2D.TotalPower; -[LoadingRate, ~] = MOT2D.runSimulation(Oven); - -EnhancementFactorArray = LoadingRateArray ./ LoadingRate; - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForFirstParameter = (Helper.PhysicsConstants.BlueLinewidth)^-1; -OptionsStruct.XLabelString = 'Sideband Beam Detuning (\Delta/\Gamma)'; -OptionsStruct.RescalingFactorForSecondParameter = 1000; -OptionsStruct.YLabelString = 'Sideband Beam Power (mW)'; -OptionsStruct.RescalingFactorForQuantityOfInterest = 1; -OptionsStruct.ZLabelString = 'Enhancement Factor (\eta)'; -% OptionsStruct.ZLabelString = 'Loading rate (x 10^{9} atoms/s)'; -OptionsStruct.TitleString = sprintf('Magnetic Gradient = %.0f (G/cm)', MOT2D.MagneticGradient * 100); - -options = Helper.convertstruct2cell(OptionsStruct); -Plotter.plotResultForTwoParameterScan(DetuningArray, PowerArray, EnhancementFactorArray, options{:}) - -%% Magnetic gradient scan - -MOT2D.NumberOfAtoms = 10000; -MOT2D.TotalPower = 0.4; -MOT2D.SidebandBeam = true; -NumberOfPointsForFirstParam = 10; %iterations of the simulation -NumberOfPointsForSecondParam = 10; -NumberOfPointsForThirdParam = 6; -DetuningArray = linspace(-0.5, -5.0, NumberOfPointsForFirstParam) * Helper.PhysicsConstants.BlueLinewidth; -PowerArray = linspace(0.1, 1.0, NumberOfPointsForSecondParam) * MOT2D.TotalPower; -MagneticGradientArray = linspace(30, 50, NumberOfPointsForThirdParam) * 1e-02; -Beams = MOT2D.Beams; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -SidebandBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'BlueSideband'), Beams)}; -LoadingRateArray = {}; - -tStart = tic; -for k=1:NumberOfPointsForThirdParam - eval(sprintf('MOT2D.%s = %d;', 'MagneticGradient', MagneticGradientArray(k))); - lrmatrix = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); - for i=1:NumberOfPointsForFirstParam - eval(sprintf('SidebandBeam.%s = %d;', 'Detuning', DetuningArray(i))); - for j=1:NumberOfPointsForSecondParam - eval(sprintf('SidebandBeam.%s = %d;', 'Power', PowerArray(j))); - eval(sprintf('CoolingBeam.%s = %d;', 'Power', MOT2D.TotalPower - PowerArray(j))); - [lrmatrix(i,j), ~, ~] = MOT2D.runSimulation(Oven); - end - end - LoadingRateArray{end+1} = lrmatrix; -end - -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForFirstParameter = (Helper.PhysicsConstants.BlueLinewidth)^-1; -OptionsStruct.XLabelString = 'Sideband Beam Detuning (\Delta/\Gamma)'; -OptionsStruct.RescalingFactorForSecondParameter = 1000; -OptionsStruct.YLabelString = 'Sideband Beam Waist (mm)'; -OptionsStruct.RescalingFactorForThirdParameter = 100; -OptionsStruct.RescalingFactorForQuantityOfInterest = 1e-9; -OptionsStruct.ZLabelString = 'Loading rate (x 10^{9} atoms/s)'; -OptionsStruct.PlotTitleString = 'Magnetic Gradient = %.0f (G/cm)'; -OptionsStruct.FigureTitleString = sprintf('Oven-2DMOT Distance = %.1f (mm); Total Beam Power = %d (mW)', Oven.OvenDistance * 1000, MOT2D.TotalPower*1000); - -options = Helper.convertstruct2cell(OptionsStruct); - -Plotter.plotResultForThreeParameterScan(DetuningArray, PowerArray, MagneticGradientArray, LoadingRateArray, options{:}) - -clear OptionsStruct - -%% -MOT2D.NumberOfAtoms = 10000; -MOT2D.TotalPower = 0.4; -MOT2D.MagneticGradient = 0.4; 0; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -CoolingBeam.Power = 0.2; -CoolingBeam.Detuning = -1.3*Helper.PhysicsConstants.BlueLinewidth; -SidebandBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'BlueSideband'), Beams)}; -SidebandBeam.Power = 0.2; -NumberOfPointsForFirstParam = 20; %iterations of the simulation -NumberOfPointsForSecondParam = 20; -DetuningArray = linspace(-1.0, -6.0, NumberOfPointsForFirstParam) * Helper.PhysicsConstants.BlueLinewidth; -BeamWaistArray = linspace(10, 25, NumberOfPointsForSecondParam) * 1e-03; - -tStart = tic; -LoadingRateArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); -StandardErrorArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); -ConfidenceIntervalArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam, 2); - -for i=1:NumberOfPointsForFirstParam - eval(sprintf('SidebandBeam.Detuning = %d;', DetuningArray(i))); - for j=1:NumberOfPointsForSecondParam - eval(sprintf('CoolingBeam.Waist = %d;', BeamWaistArray(j))); - eval(sprintf('SidebandBeam.Waist = %d;', BeamWaistArray(j))); - [LoadingRateArray(i,j), StandardErrorArray(i,j), ConfidenceIntervalArray(i,j,:)] = MOT2D.runSimulation(Oven); - end -end -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - -if MOT2D.DoSave - LoadingRate = struct; - LoadingRate.Values = LoadingRateArray; - MOT2D.Results = LoadingRate; - SaveFolder = [MOT2D.SaveDirectory filesep 'Results']; - Filename = ['TwoParameterScan_' datestr(now,'yyyymmdd_HHMM')]; - eval([sprintf('%s_Object', Filename) ' = MOT2D;']); - mkdir(SaveFolder); - save([SaveFolder filesep Filename], sprintf('%s_Object', Filename)); -end - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForFirstParameter = (Helper.PhysicsConstants.BlueLinewidth)^-1; -OptionsStruct.XLabelString = 'Sideband Beam Detuning (\Delta/\Gamma)'; -OptionsStruct.RescalingFactorForSecondParameter = 1000; -OptionsStruct.YLabelString = 'Beam Waist (mW)'; -OptionsStruct.RescalingFactorForQuantityOfInterest = 1e-10; -% OptionsStruct.ZLabelString = 'Enhancement Factor (\eta)'; -OptionsStruct.ZLabelString = 'Loading rate (x 10^{10} atoms/s)'; -OptionsStruct.TitleString = sprintf('Magnetic Gradient = %.0f (G/cm)', MOT2D.MagneticGradient * 100); - -options = Helper.convertstruct2cell(OptionsStruct); -Plotter.plotResultForTwoParameterScan(DetuningArray, BeamWaistArray, LoadingRateArray, options{:}) - -%% -MOT2D.NumberOfAtoms = 10000; -MOT2D.TotalPower = 0.4; -MOT2D.MagneticGradient = 0.4; 0; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -CoolingBeam.Power = 0.2; -SidebandBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'BlueSideband'), Beams)}; -SidebandBeam.Power = 0.2; -NumberOfPointsForFirstParam = 20; %iterations of the simulation -NumberOfPointsForSecondParam = 20; -DetuningArray = linspace(-0.5, -2.5, NumberOfPointsForFirstParam) * Helper.PhysicsConstants.BlueLinewidth; -BeamWaistArray = linspace(10, 25, NumberOfPointsForSecondParam) * 1e-03; - -tStart = tic; -LoadingRateArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); -StandardErrorArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); -ConfidenceIntervalArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam, 2); - -for i=1:NumberOfPointsForFirstParam - eval(sprintf('CoolingBeam.Detuning = %d;', DetuningArray(i))); - eval(sprintf('SidebandBeam.Detuning = %d;', DetuningArray(i) - (1.0 * Helper.PhysicsConstants.BlueLinewidth))); - for j=1:NumberOfPointsForSecondParam - eval(sprintf('CoolingBeam.Waist = %d;', BeamWaistArray(j))); - eval(sprintf('SidebandBeam.Waist = %d;', BeamWaistArray(j))); - [LoadingRateArray(i,j), StandardErrorArray(i,j), ConfidenceIntervalArray(i,j,:)] = MOT2D.runSimulation(Oven); - end -end -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - -if MOT2D.DoSave - LoadingRate = struct; - LoadingRate.Values = LoadingRateArray; - MOT2D.Results = LoadingRate; - SaveFolder = [MOT2D.SaveDirectory filesep 'Results']; - Filename = ['TwoParameterScan_' datestr(now,'yyyymmdd_HHMM')]; - eval([sprintf('%s_Object', Filename) ' = MOT2D;']); - mkdir(SaveFolder); - save([SaveFolder filesep Filename], sprintf('%s_Object', Filename)); -end - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForFirstParameter = (Helper.PhysicsConstants.BlueLinewidth)^-1; -OptionsStruct.XLabelString = 'Beam Detuning (\Delta/\Gamma)'; -OptionsStruct.RescalingFactorForSecondParameter = 1000; -OptionsStruct.YLabelString = 'Beam Waist (mW)'; -OptionsStruct.RescalingFactorForQuantityOfInterest = 1e-10; -% OptionsStruct.ZLabelString = 'Enhancement Factor (\eta)'; -OptionsStruct.ZLabelString = 'Loading rate (x 10^{10} atoms/s)'; -OptionsStruct.TitleString = sprintf('Magnetic Gradient = %.0f (G/cm)', MOT2D.MagneticGradient * 100); - -options = Helper.convertstruct2cell(OptionsStruct); -Plotter.plotResultForTwoParameterScan(DetuningArray, BeamWaistArray, LoadingRateArray, options{:}) \ No newline at end of file diff --git a/2DMOT Simulation Code/+Scripts/scanForSidebandEnhancement.m b/2DMOT Simulation Code/+Scripts/scanForSidebandEnhancement.m deleted file mode 100644 index 2b13fb7..0000000 --- a/2DMOT Simulation Code/+Scripts/scanForSidebandEnhancement.m +++ /dev/null @@ -1,33 +0,0 @@ -function [LoadingRateArray, StandardErrorArray, ConfidenceIntervalArray] = scanForSidebandEnhancement(ovenObj, MOTobj, CBBeamName, SBBeamName, SBDetuningArray, SBPowerArray) - - Beams = MOTobj.Beams; - CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, CBBeamName), Beams)}; - SidebandBeam = Beams{cellfun(@(x) strcmpi(x.Alias, SBBeamName), Beams)}; - NumberOfPointsForFirstParam = length(SBDetuningArray); - NumberOfPointsForSecondParam = length(SBPowerArray); - LoadingRateArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); - StandardErrorArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); - ConfidenceIntervalArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam, 2); - - for i=1:NumberOfPointsForFirstParam - eval(sprintf('SidebandBeam.%s = %d;', 'Detuning', SBDetuningArray(i))); - for j=1:NumberOfPointsForSecondParam - eval(sprintf('SidebandBeam.%s = %d;', 'Power', SBPowerArray(j))); - eval(sprintf('CoolingBeam.%s = %d;', 'Power', MOTobj.TotalPower - SBPowerArray(j))); - [LoadingRateArray(i,j), StandardErrorArray(i,j), ConfidenceIntervalArray(i,j,:)] = MOTobj.runSimulation(ovenObj); - end - end - - if MOTobj.DoSave - LoadingRate = struct; - LoadingRate.Values = LoadingRateArray; - LoadingRate.Errors = StandardErrorArray; - LoadingRate.CI = ConfidenceIntervalArray; - MOTobj.Results = LoadingRate; - SaveFolder = [MOTobj.SaveDirectory filesep 'Results']; - Filename = ['TwoParameterScan_' datestr(now,'yyyymmdd_HHMM')]; - eval([sprintf('%s_Object', Filename) ' = MOTobj;']); - mkdir(SaveFolder); - save([SaveFolder filesep Filename], sprintf('%s_Object', Filename)); - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/+Scan/doOneParameter.m b/2DMOT Simulation Code/+Simulator/+Scan/doOneParameter.m deleted file mode 100644 index 5ac8b56..0000000 --- a/2DMOT Simulation Code/+Simulator/+Scan/doOneParameter.m +++ /dev/null @@ -1,27 +0,0 @@ -function [LoadingRateArray, StandardErrorArray, ConfidenceIntervalArray] = doOneParameter(ovenObj, MOTobj, BeamName, BeamParameter, ParameterArray) - - Beams = MOTobj.Beams; - Beam = Beams{cellfun(@(x) strcmpi(x.Alias, BeamName), Beams)}; - NumberOfPointsForParam = length(ParameterArray); - LoadingRateArray = zeros(1,NumberOfPointsForParam); - StandardErrorArray = zeros(1,NumberOfPointsForParam); - ConfidenceIntervalArray = zeros(NumberOfPointsForParam, 2); - - for i=1:NumberOfPointsForParam - eval(sprintf('Beam.%s = %d;', BeamParameter, ParameterArray(i))); - [LoadingRateArray(i), StandardErrorArray(i), ConfidenceIntervalArray(i,:)] = MOTobj.runSimulation(ovenObj); - end - - if MOTobj.DoSave - LoadingRate = struct; - LoadingRate.Values = LoadingRateArray; - LoadingRate.Errors = StandardErrorArray; - LoadingRate.CI = ConfidenceIntervalArray; - MOTobj.Results = LoadingRate; - SaveFolder = [MOTobj.SaveDirectory filesep 'Results']; - Filename = ['OneParameterScan_' datestr(now,'yyyymmdd_HHMM')]; - eval([sprintf('%s_Object', Filename) ' = MOTobj;']); - mkdir(SaveFolder); - save([SaveFolder filesep Filename], sprintf('%s_Object', Filename)); - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/+Scan/doThreeParameters.m b/2DMOT Simulation Code/+Simulator/+Scan/doThreeParameters.m deleted file mode 100644 index 4afdcf3..0000000 --- a/2DMOT Simulation Code/+Simulator/+Scan/doThreeParameters.m +++ /dev/null @@ -1,22 +0,0 @@ -function LoadingRateArray = doThreeParameters(ovenObj, MOTobj, BeamName, FirstBeamParameter, FirstParameterArray, ... - SecondBeamParameter, SecondParameterArray, ThirdBeamParameter, ThirdParameterArray) - - NumberOfPointsForThirdParam = length(ThirdParameterArray); - LoadingRateArray = {}; - - for i=1:NumberOfPointsForThirdParam - eval(sprintf('MOTobj.%s = %d;', ThirdBeamParameter, ThirdParameterArray(i))); - LoadingRateArray{end+1} = Simulator.Scan.doTwoParameters(ovenObj, MOTobj, BeamName, FirstBeamParameter, FirstParameterArray, SecondBeamParameter, SecondParameterArray); - end - - if MOTobj.DoSave - LoadingRate = struct; - LoadingRate.Values = LoadingRateArray; - MOTobj.Results = LoadingRate; - SaveFolder = [MOTobj.SaveDirectory filesep 'Results']; - Filename = ['ThreeParameterScan_' datestr(now,'yyyymmdd_HHMM')]; - eval([sprintf('%s_Object', Filename) ' = MOTobj;']); - mkdir(SaveFolder); - save([SaveFolder filesep Filename], sprintf('%s_Object', Filename)); - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/+Scan/doTwoParameters.m b/2DMOT Simulation Code/+Simulator/+Scan/doTwoParameters.m deleted file mode 100644 index 092ca13..0000000 --- a/2DMOT Simulation Code/+Simulator/+Scan/doTwoParameters.m +++ /dev/null @@ -1,31 +0,0 @@ -function [LoadingRateArray, StandardErrorArray, ConfidenceIntervalArray] = doTwoParameters(ovenObj, MOTobj, BeamName, FirstBeamParameter, ... - FirstParameterArray, SecondBeamParameter, SecondParameterArray) - Beams = MOTobj.Beams; - Beam = Beams{cellfun(@(x) strcmpi(x.Alias, BeamName), Beams)}; - NumberOfPointsForFirstParam = length(FirstParameterArray); - NumberOfPointsForSecondParam = length(SecondParameterArray); - LoadingRateArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); - StandardErrorArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam); - ConfidenceIntervalArray = zeros(NumberOfPointsForFirstParam, NumberOfPointsForSecondParam, 2); - - for i=1:NumberOfPointsForFirstParam - eval(sprintf('Beam.%s = %d;', FirstBeamParameter, FirstParameterArray(i))); - for j=1:NumberOfPointsForSecondParam - eval(sprintf('Beam.%s = %d;', SecondBeamParameter, SecondParameterArray(j))); - [LoadingRateArray(i,j), StandardErrorArray(i,j), ConfidenceIntervalArray(i,j,:)] = MOTobj.runSimulation(ovenObj); - end - end - - if MOTobj.DoSave - LoadingRate = struct; - LoadingRate.Values = LoadingRateArray; - LoadingRate.Errors = StandardErrorArray; - LoadingRate.CI = ConfidenceIntervalArray; - MOTobj.Results = LoadingRate; - SaveFolder = [MOTobj.SaveDirectory filesep 'Results']; - Filename = ['TwoParameterScan_' datestr(now,'yyyymmdd_HHMM')]; - eval([sprintf('%s_Object', Filename) ' = MOTobj;']); - mkdir(SaveFolder); - save([SaveFolder filesep Filename], sprintf('%s_Object', Filename)); - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@Beams/Beams.m b/2DMOT Simulation Code/+Simulator/@Beams/Beams.m deleted file mode 100644 index 7889f1d..0000000 --- a/2DMOT Simulation Code/+Simulator/@Beams/Beams.m +++ /dev/null @@ -1,203 +0,0 @@ -classdef Beams < handle & matlab.mixin.Copyable - - properties (Access = private) - - BlueBeamDefault = struct('Alias', 'Blue', ... - 'Power', 400e-3, ... - 'Detuning', -1.64*Helper.PhysicsConstants.BlueLinewidth, ... - 'Radius', 17.5e-3, ... - 'Waist', 15e-3, ... - 'WaveNumber',2*pi/Helper.PhysicsConstants.BlueWavelength, ... - 'Linewidth', Helper.PhysicsConstants.BlueLinewidth, ... - 'SaturationIntensity', 0.1 * (2 * pi^2 / 3) * ... - ((Helper.PhysicsConstants.PlanckConstantReduced * ... - Helper.PhysicsConstants.SpeedOfLight * ... - Helper.PhysicsConstants.BlueLinewidth) / (Helper.PhysicsConstants.BlueWavelength)^3)); - - BlueSidebandBeamDefault = struct('Alias', 'BlueSideband', ... - 'Power', 400e-3, ... - 'Detuning', -3*Helper.PhysicsConstants.BlueLinewidth, ... - 'Radius', 17.5e-3, ... - 'Waist', 15e-3, ... - 'WaveNumber',2*pi/Helper.PhysicsConstants.BlueWavelength, ... - 'Linewidth', Helper.PhysicsConstants.BlueLinewidth, ... - 'SaturationIntensity', 0.1 * (2 * pi^2 / 3) * ... - ((Helper.PhysicsConstants.PlanckConstantReduced * ... - Helper.PhysicsConstants.SpeedOfLight * ... - Helper.PhysicsConstants.BlueLinewidth) / (Helper.PhysicsConstants.BlueWavelength)^3)); - - PushBeamDefault = struct('Alias', 'Push', ... - 'Power', 25e-3 , ... - 'Detuning', 104.2*Helper.PhysicsConstants.RedLinewidth, ... - 'Radius', 1.2e-03, ... - 'Waist', 1.0e-03, ... - 'WaveNumber',2*pi/Helper.PhysicsConstants.RedWavelength, ... - 'Linewidth', Helper.PhysicsConstants.RedLinewidth, ... - 'SaturationIntensity', 0.1 * (2 * pi^2 / 3) * ... - ((Helper.PhysicsConstants.PlanckConstantReduced * ... - Helper.PhysicsConstants.SpeedOfLight * ... - Helper.PhysicsConstants.RedLinewidth) / (Helper.PhysicsConstants.RedWavelength)^3)); - - RedBeamDefault = struct('Alias', 'Red', ... - 'Power', 100e-3 , ... - 'Detuning', -1*Helper.PhysicsConstants.RedLinewidth, ... - 'Radius', 1.2e-3, ... - 'Waist', 12e-3 , ... - 'WaveNumber',2*pi/Helper.PhysicsConstants.RedWavelength, ... - 'Linewidth', Helper.PhysicsConstants.RedLinewidth, ... - 'SaturationIntensity', 0.1 * (2 * pi^2 / 3) * ... - ((Helper.PhysicsConstants.PlanckConstantReduced * ... - Helper.PhysicsConstants.SpeedOfLight * ... - Helper.PhysicsConstants.RedLinewidth) / (Helper.PhysicsConstants.RedWavelength)^3)); - end - - properties - Alias - Power; - Detuning; - Radius; - Waist; - WaveNumber; - SaturationIntensity; - Linewidth; - end - - properties (Dependent) - SaturationParameter; - end - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %- Methods - - methods - %% Class Constructor - function this = Beams(BeamName) - input = inputParser; - addRequired(input,'BeamName', @ischar); - parse(input, BeamName); - this.Alias = input.Results.BeamName; - - switch this.Alias - case this.BlueBeamDefault.Alias - this.Power = this.BlueBeamDefault.Power; - this.Detuning = this.BlueBeamDefault.Detuning; - this.Radius = this.BlueBeamDefault.Radius; - this.Waist = this.BlueBeamDefault.Waist; - this.WaveNumber = this.BlueBeamDefault.WaveNumber; - this.Linewidth = this.BlueBeamDefault.Linewidth; - this.SaturationIntensity = this.BlueBeamDefault.SaturationIntensity; - case this.BlueSidebandBeamDefault.Alias - this.Power = this.BlueSidebandBeamDefault.Power; - this.Detuning = this.BlueSidebandBeamDefault.Detuning; - this.Radius = this.BlueSidebandBeamDefault.Radius; - this.Waist = this.BlueSidebandBeamDefault.Waist; - this.WaveNumber = this.BlueSidebandBeamDefault.WaveNumber; - this.Linewidth = this.BlueSidebandBeamDefault.Linewidth; - this.SaturationIntensity = this.BlueSidebandBeamDefault.SaturationIntensity; - case this.PushBeamDefault.Alias - this.Power = this.PushBeamDefault.Power; - this.Detuning = this.PushBeamDefault.Detuning; - this.Radius = this.PushBeamDefault.Radius; - this.Waist = this.PushBeamDefault.Waist; - this.WaveNumber = this.PushBeamDefault.WaveNumber; - this.Linewidth = this.PushBeamDefault.Linewidth; - this.SaturationIntensity = this.PushBeamDefault.SaturationIntensity; - case this.RedBeamDefault.Alias - this.Power = this.RedBeamDefault.Power; - this.Detuning = this.RedBeamDefault.Detuning; - this.Radius = this.RedBeamDefault.Radius; - this.Waist = this.RedBeamDefault.Waist; - this.WaveNumber = this.RedBeamDefault.WaveNumber; - this.Linewidth = this.RedBeamDefault.Linewidth; - this.SaturationIntensity = this.RedBeamDefault.SaturationIntensity; - otherwise - error('No such beam!') - end - end - end % - lifecycle - - methods - function set.Power(this,val) - this.Power = val; - end - function ret = get.Power(this) - ret = this.Power; - end - function set.Detuning(this, val) - this.Detuning = val; - end - function ret = get.Detuning(this) - ret = this.Detuning; - end - function set.Radius(this, val) - this.Radius = val; - end - function ret = get.Radius(this) - ret = this.Radius; - end - function set.Waist(this, val) - this.Waist = val; - end - function ret = get.Waist(this) - ret = this.Waist; - end - function set.WaveNumber(this, val) - this.WaveNumber = val; - end - function ret = get.WaveNumber(this) - ret = this.WaveNumber; - end - function set.SaturationIntensity(this, val) - this.SaturationIntensity = val; - end - function ret = get.SaturationIntensity(this) - ret = this.SaturationIntensity; - end - function set.Linewidth(this, val) - this.Linewidth = val; - end - function ret = get.Linewidth(this) - ret = this.Linewidth; - end - end % - setters and getters - - methods - function ret = get.SaturationParameter(this) - ret = 0.1 * (8 * this.Power) / (pi*this.Waist^2 * this.SaturationIntensity); % two beams are reflected - end - end % - getters for dependent properties - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %- Methods - - methods(Access = protected) - function cp = copyElement(this) - % Shallow copy object - cp = copyElement@matlab.mixin.Copyable(this); - - % Forces the setter to redefine the function handles to the new copied object - - pl = properties(this); - for k = 1:length(pl) - sc = superclasses(this.(pl{k})); - if any(contains(sc,{'matlab.mixin.Copyable'})) - cp.(pl{k}) = this.(pl{k}).copy(); - end - end - end - end - - methods (Static) - - % Creates an Instance of Class, ensures singleton behaviour (that there - % can only be one Instance of this class - function singleObj = getInstance(BeamName) - % Creates an Instance of Class, ensures singleton behaviour - persistent localObj; - if isempty(localObj) || ~isvalid(localObj) - localObj = Simulator.Beams(BeamName); - end - singleObj = localObj; - end - end -end diff --git a/2DMOT Simulation Code/+Simulator/@MOTCaptureProcess/MOTCaptureProcess.m b/2DMOT Simulation Code/+Simulator/@MOTCaptureProcess/MOTCaptureProcess.m deleted file mode 100644 index 911d39b..0000000 --- a/2DMOT Simulation Code/+Simulator/@MOTCaptureProcess/MOTCaptureProcess.m +++ /dev/null @@ -1,173 +0,0 @@ -classdef MOTCaptureProcess < handle & matlab.mixin.Copyable - - properties (Access = public) - SimulationMode; % MOT type - TimeStep; - SimulationTime; - NumberOfAtoms; - ErrorEstimationMethod; - - %Flags - SpontaneousEmission; - SidebandBeam; - PushBeam; - Gravity; - BackgroundCollision; - - DebugMode; - DoSave; - SaveDirectory; - end - - properties - Beams = {}; %Contains beam objects - end % - public - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %- Methods - - methods - %% Class Destructor (Clears object) - function this = MOTCaptureProcess(varargin) - - p = inputParser; - p.KeepUnmatched = true; - addParameter(p, 'SimulationMode', '2D',... - @(x) any(strcmpi(x,{'2D','3D', 'Full'}))); - addParameter(p, 'ErrorEstimationMethod', 'jackknife',... - @(x) any(strcmpi(x,{'jackknife','bootstrap'}))); - addParameter(p, 'NumberOfAtoms', 5000,... - @(x) assert(isnumeric(x) && isscalar(x) && (x > 0))); - addParameter(p, 'TimeStep', 10e-06,... - @(x) assert(isnumeric(x) && isscalar(x) && (x > 0))); - addParameter(p, 'SimulationTime', 3e-03,... - @(x) assert(isnumeric(x) && isscalar(x) && (x > 0))); - addParameter(p, 'SpontaneousEmission', false,... - @islogical); - addParameter(p, 'SidebandBeam', false,... - @islogical); - addParameter(p, 'PushBeam', false,... - @islogical); - addParameter(p, 'Gravity', false,... - @islogical); - addParameter(p, 'BackgroundCollision', false,... - @islogical); - addParameter(p, 'DebugMode', false,... - @islogical); - addParameter(p, 'SaveData', false,... - @islogical); - addParameter(p, 'SaveDirectory', pwd,... - @ischar); - - p.parse(varargin{:}); - - this.SimulationMode = p.Results.SimulationMode; - this.ErrorEstimationMethod= p.Results.ErrorEstimationMethod; - - this.NumberOfAtoms = p.Results.NumberOfAtoms; - this.TimeStep = p.Results.TimeStep; - this.SimulationTime = p.Results.SimulationTime; - - this.SpontaneousEmission = p.Results.SpontaneousEmission; - this.SidebandBeam = p.Results.SidebandBeam; - this.PushBeam = p.Results.PushBeam; - this.Gravity = p.Results.Gravity; - this.BackgroundCollision = p.Results.BackgroundCollision; - - this.DebugMode = p.Results.DebugMode; - this.DoSave = p.Results.SaveData; - this.SaveDirectory = p.Results.SaveDirectory; - - switch this.SimulationMode - case "2D" - this.Beams{1} = Simulator.Beams('Blue'); - this.Beams{2} = Simulator.Beams('BlueSideband'); - this.Beams{3} = Simulator.Beams('Push'); - case "3D" - this.Beams{1} = Simulator.Beams('Red'); - % Development In progress - case "Full" - % Development In progress - end - end - end % - lifecycle - - methods - function set.TimeStep(this, val) - assert(val > 1e-06, 'Not time efficient to compute for time steps smaller than 1 microsecond!'); - this.TimeStep = val; - end - function ret = get.TimeStep(this) - ret = this.TimeStep; - end - function set.SimulationTime(this, val) -% assert(val <= 5e-03, 'Not time efficient to compute for time spans longer than 5 milliseconds!'); - this.SimulationTime = val; - end - function ret = get.SimulationTime(this) - ret = this.SimulationTime; - end - function set.NumberOfAtoms(this, val) - assert(val <= 50000, '!!Not time efficient to compute for atom numbers larger than 50,000!!'); - this.NumberOfAtoms = val; - end - function ret = get.NumberOfAtoms(this) - ret = this.NumberOfAtoms; - end - - function set.DebugMode(this, val) - this.DebugMode = val; - end - function ret = get.DebugMode(this) - ret = this.DebugMode; - end - function set.DoSave(this, val) - this.DoSave = val; - end - function ret = get.DoSave(this) - ret = this.DoSave; - end - function set.SaveDirectory(this, val) - this.SaveDirectory = val; - end - function ret = get.SaveDirectory(this) - ret = this.SaveDirectory; - end - - end % - setters and getters - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %- Methods - - methods(Access = protected) - function cp = copyElement(this) - % Shallow copy object - cp = copyElement@matlab.mixin.Copyable(this); - - % Forces the setter to redefine the function handles to the new copied object - - pl = properties(this); - for k = 1:length(pl) - sc = superclasses(this.(pl{k})); - if any(contains(sc,{'matlab.mixin.Copyable'})) - cp.(pl{k}) = this.(pl{k}).copy(); - end - end - end - end - - methods (Static) - - % Creates an Instance of Class, ensures singleton behaviour (that there - % can only be one Instance of this class - function singleObj = getInstance(varargin) - % Creates an Instance of Class, ensures singleton behaviour - persistent localObj; - if isempty(localObj) || ~isvalid(localObj) - localObj = Simulator.MOTCaptureProcess(varargin{:}); - end - singleObj = localObj; - end - end - -end diff --git a/2DMOT Simulation Code/+Simulator/@Oven/Oven.m b/2DMOT Simulation Code/+Simulator/@Oven/Oven.m deleted file mode 100644 index 2fa54b2..0000000 --- a/2DMOT Simulation Code/+Simulator/@Oven/Oven.m +++ /dev/null @@ -1,177 +0,0 @@ -classdef Oven < Simulator.MOTCaptureProcess & matlab.mixin.Copyable - - properties (Access = private) - - OvenDefaults = struct('NozzleLength', 60e-3, ... - 'NozzleRadius', 2.60e-3, ... - 'OvenTemperature', 1000); - end - - properties (Access = public) - NozzleLength; - NozzleRadius; - OvenTemperature; - - VelocityCutoff; - ClausingFactor; - ReducedClausingFactor; - ReducedFlux; - end - - properties (Dependent) - ExitDivergence; - Beta; - OvenDistance; - OvenTemperatureinKelvin; - AverageVelocity; - AtomicBeamDensity; - MeanFreePath; - CollisionTime; - end - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %- Methods - - methods - function this = Oven(varargin) - this@Simulator.MOTCaptureProcess('SimulationMode', '2D', varargin{:}); - this.NozzleLength = this.OvenDefaults.NozzleLength; - this.NozzleRadius = this.OvenDefaults.NozzleRadius; - this.OvenTemperature = this.OvenDefaults.OvenTemperature; - this.ClausingFactor = this.calculateClausingFactor(); - [this.ReducedClausingFactor, ~] = this.calculateReducedClausingFactor(); - end - - function restoreDefaults(this) - this.NozzleLength = this.OvenDefaults.NozzleLength; - this.NozzleRadius = this.OvenDefaults.NozzleRadius; - this.OvenTemperature = this.OvenDefaults.OvenTemperature; - this.ClausingFactor = this.calculateClausingFactor(); - [this.ReducedClausingFactor, ~] = this.calculateReducedClausingFactor(); - end - - end % - lifecycle - - methods - function set.NozzleLength(this,val) - this.NozzleLength = val; - end - function ret = get.NozzleLength(this) - ret = this.NozzleLength; - end - function set.NozzleRadius(this,val) - this.NozzleRadius = val; - end - function ret = get.NozzleRadius(this) - ret = this.NozzleRadius; - end - function set.OvenTemperature(this,val) - this.OvenTemperature = val; - end - function ret = get.OvenTemperature(this) - ret = this.OvenTemperature; - end - function set.VelocityCutoff(this,val) - this.VelocityCutoff = val; - end - function ret = get.VelocityCutoff(this) - ret = this.VelocityCutoff; - end - function set.ClausingFactor(this,val) - this.ClausingFactor = val; - end - function ret = get.ClausingFactor(this) - ret = this.ClausingFactor; - end - function set.ReducedClausingFactor(this,val) - this.ReducedClausingFactor = val; - end - function ret = get.ReducedClausingFactor(this) - ret = this.ReducedClausingFactor; - end - function set.ReducedFlux(this,val) - this.ReducedFlux = val; - end - function ret = get.ReducedFlux(this) - ret = this.ReducedFlux; - end - end % - setters and getters - - methods - function ret = get.Beta(this) - ret = 2 * (this.NozzleRadius/this.NozzleLength); - end - - function ret = get.OvenDistance(this) - ApertureCut = max(2.5e-3,this.NozzleRadius); - ret = (25+12.5)*1e-3 + (this.NozzleRadius + ApertureCut) / tan(15/360 * 2 * pi); - end - - function ret = get.ExitDivergence(this) - Theta_Nozzle = atan((this.NozzleRadius + 0.035/sqrt(2))/this.OvenDistance); % The angle of capture region towards the oven nozzle - Theta_Aperture = 15/360*2*pi; % The limitation angle of the second aperture in the oven - ret = min(Theta_Nozzle,Theta_Aperture); - end - - function ret = get.OvenTemperatureinKelvin(this) - ret = this.OvenTemperature + Helper.PhysicsConstants.ZeroKelvin; - end - - function ret = get.AverageVelocity(this) - %See Background collision probability section in Barbiero - ret = sqrt((8 * pi * Helper.PhysicsConstants.BoltzmannConstant*this.OvenTemperatureinKelvin)/ (9 * Helper.PhysicsConstants.Dy164Mass)); - end - - function ret = get.AtomicBeamDensity(this) - %See Background collision probability section in Barbiero - ret = this.calculateFreeMolecularRegimeFlux / (this.AverageVelocity * pi * (this.NozzleRadius)^2); - end - - function ret = get.MeanFreePath(this) - % Cross section = pi ( 2 * Van-der-waals radius of Dy)^2; - % Van-der-waals radius of Dy = 281e-12 - %See Expected atomic flux section and Background collision probability section in Barbiero - ret = 1/(sqrt(2) * (pi * (2*281e-12)^2) * this.AtomicBeamDensity); - end - - function ret = get.CollisionTime(this) - ret = 3 * this.MeanFreePath/this.AverageVelocity; %See Background collision probability section in Barbiero - end - - end % - getters for dependent properties - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %- Methods - - methods(Access = protected) - function cp = copyElement(this) - % Shallow copy object - cp = copyElement@matlab.mixin.Copyable(this); - - % Forces the setter to redefine the function handles to the new copied object - - pl = properties(this); - for k = 1:length(pl) - sc = superclasses(this.(pl{k})); - if any(contains(sc,{'matlab.mixin.Copyable'})) - cp.(pl{k}) = this.(pl{k}).copy(); - end - end - end - end - - methods (Static) - - % Creates an Instance of Class, ensures singleton behaviour (that there - % can only be one Instance of this class - function singleObj = getInstance(varargin) - % Creates an Instance of Class, ensures singleton behaviour - persistent localObj; - if isempty(localObj) || ~isvalid(localObj) - localObj = Simulator.Oven(); - end - singleObj = localObj; - end - end - -end diff --git a/2DMOT Simulation Code/+Simulator/@Oven/angularDistributionFunction.m b/2DMOT Simulation Code/+Simulator/@Oven/angularDistributionFunction.m deleted file mode 100644 index acd3eab..0000000 --- a/2DMOT Simulation Code/+Simulator/@Oven/angularDistributionFunction.m +++ /dev/null @@ -1,37 +0,0 @@ -function ret = angularDistributionFunction(this, theta) - %This function calculate the angle distribution of atoms coming out - %from a single channel. - - KnudsenNumber = this.MeanFreePath/this.NozzleLength; - - alpha = 0.5 - (3*this.Beta^2)^-1 * ... - ((1 - (2*this.Beta^3) + ((2*this.Beta^2) - 1) * sqrt(1+this.Beta^2)) / ... - (sqrt(1+this.Beta^2) - (this.Beta^2 * asinh((this.Beta^2)^-1)))); - - eta0 = alpha; - eta1 = 1 - alpha; - - delta = (eta0./sqrt(2*KnudsenNumber*(eta1-eta0)))./sqrt(cos(theta)); - - F = 2/sqrt(pi)* (1-eta1)/eta0 * delta.* exp( -(delta*eta1/eta0).^2 ); - q = this.Beta^-1 * tan(theta); - R = acos(q) - (q .* sqrt(1-q.^2)); - - if abs(q) >= 1 - t = linspace(0,1,10000); - S = sum(sqrt(1-t.^2).* ( erf(delta.*(1 + (t.*(eta1-eta0)./(q.*eta0)) ))-erf(delta)))*(t(2)-t(1)); - if S == 0 || isnan(S) - ret = eta0*cos(theta); - else - ret = eta0*cos(theta)+ 2/sqrt(pi)*eta0*cos(theta) * (exp(delta.^2)/delta) * S; - end - else - t = linspace(0,q,10000); - S = sum(sqrt(1-t.^2).* ( erf(delta.*(1 + (t.*(eta1-eta0)./(q.*eta0)) ))-erf(delta)))*(t(2)-t(1)); - if isnan(S) - S=0; - end - ret = 2/sqrt(pi)*eta0*cos(theta)*(exp(delta.^2)/delta) * (R./2*(erf(delta*eta1/eta0)-erf(delta)+F)+S)+eta0*cos(theta); - end -end - diff --git a/2DMOT Simulation Code/+Simulator/@Oven/calculateClausingFactor.m b/2DMOT Simulation Code/+Simulator/@Oven/calculateClausingFactor.m deleted file mode 100644 index 84c7ebc..0000000 --- a/2DMOT Simulation Code/+Simulator/@Oven/calculateClausingFactor.m +++ /dev/null @@ -1,9 +0,0 @@ -function ret = calculateClausingFactor(this) - - ClausingFactorApproximation = (8 * this.NozzleRadius) / (3 * this.NozzleLength); - - alpha = 0.5 - (3*this.Beta^2)^-1 * ((1 - (2*this.Beta^3) + ((2*this.Beta^2) - 1) * sqrt(1+this.Beta^2)) / (sqrt(1+this.Beta^2) - (this.Beta^2 * asinh((this.Beta^2)^-1)))); - ClausingFactorAnalytic = 1 + (2/3) * (1 - (2 * alpha)) * (this.Beta - sqrt(1 - this.Beta^2)) + (2/3) * (1 + alpha) * this.Beta^(-2) * (1 - sqrt(1 + this.Beta^2)); - - ret = ClausingFactorApproximation; -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@Oven/calculateFreeMolecularRegimeFlux.m b/2DMOT Simulation Code/+Simulator/@Oven/calculateFreeMolecularRegimeFlux.m deleted file mode 100644 index 92b09dd..0000000 --- a/2DMOT Simulation Code/+Simulator/@Oven/calculateFreeMolecularRegimeFlux.m +++ /dev/null @@ -1,11 +0,0 @@ -function ret = calculateFreeMolecularRegimeFlux(this) - %This function calculate the total flux of atoms coming out from a tube - %See Expected atomic flux section in Barbiero - Dy164VapourPressure = 133.322*exp(11.4103-2.3785e+04./(-219.4821+this.OvenTemperatureinKelvin)).*100; % Vapor Pressure Dysprosium for the given oven temperature - Dy164DensityinOven = Dy164VapourPressure/(Helper.PhysicsConstants.BoltzmannConstant*this.OvenTemperatureinKelvin); - ret = 1/4 * Dy164DensityinOven * this.AverageVelocity * pi * this.NozzleRadius.^2; - % Removed the Helper.PhysicsConstants.Dy164IsotopicAbundance multiplication - % Needs to be multiplied with the "Clausing Factor" which here would be - % the probability not for the full solid angle but the angle subtended - % by the aperture of the oven at its mouth. -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@Oven/calculateReducedClausingFactor.m b/2DMOT Simulation Code/+Simulator/@Oven/calculateReducedClausingFactor.m deleted file mode 100644 index 919dc91..0000000 --- a/2DMOT Simulation Code/+Simulator/@Oven/calculateReducedClausingFactor.m +++ /dev/null @@ -1,17 +0,0 @@ -function [ReducedClausingFactor, NormalizationConstantForAngularDistribution] = calculateReducedClausingFactor(this) - ThetaArray = linspace(0.0001, pi/2, 1000); - AngularDistribution = zeros(1,length(ThetaArray)); - parfor k = 1:length(ThetaArray) - AngularDistribution(k) = this.angularDistributionFunction(ThetaArray(k)); - end - - NormalizationConstantForAngularDistribution = max(2 * pi .* sin(ThetaArray) .* AngularDistribution); - - ReducedClausingFactor = 0; % We have to calculate the probability of an atom coming out of the oven subject to the physical constraint - parfor p = 1:length(ThetaArray) % that the angle of divergence is not more than the angle subtended at the mouth of the nozzle - if ThetaArray(p) <= this.ExitDivergence - ReducedClausingFactor = ReducedClausingFactor + (2 * pi * sin(ThetaArray(p)) * AngularDistribution(p) * (ThetaArray(2)-ThetaArray(1))); - end - end - ReducedClausingFactor = ReducedClausingFactor / pi; -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@Oven/initialPositionSampling.m b/2DMOT Simulation Code/+Simulator/@Oven/initialPositionSampling.m deleted file mode 100644 index 85af394..0000000 --- a/2DMOT Simulation Code/+Simulator/@Oven/initialPositionSampling.m +++ /dev/null @@ -1,7 +0,0 @@ -function ret = initialPositionSampling(this) - n = this.NumberOfAtoms; - phi = 2 * pi * rand(n,1); - rho = this.Beta * 0.5 * this.NozzleLength * sqrt(rand(n,1)); - ret = [-this.OvenDistance * ones(n,1), rho.*cos(phi), rho.*sin(phi)]; -end - diff --git a/2DMOT Simulation Code/+Simulator/@Oven/initialVelocitySampling.m b/2DMOT Simulation Code/+Simulator/@Oven/initialVelocitySampling.m deleted file mode 100644 index b82775a..0000000 --- a/2DMOT Simulation Code/+Simulator/@Oven/initialVelocitySampling.m +++ /dev/null @@ -1,60 +0,0 @@ -function ret = initialVelocitySampling(this, MOTObj) - n = this.NumberOfAtoms; - % Calculate Calculate Capture velocity --> Introduce velocity cutoff - MOTObj.CaptureVelocity = MOTObj.calculateCaptureVelocity(this, [-this.OvenDistance,0,0], [1,0,0]); - this.VelocityCutoff = 1.05 * MOTObj.CaptureVelocity(1); % Should be the magnitude of the 3-D velocity vector but since here the obtained capture - % velocity is only along the x-axis, we take the first term which is the x-component of the velocity. - - [ReducedClausingFactor, NormalizationConstantForAngularDistribution] = this.calculateReducedClausingFactor(); - this.ReducedClausingFactor = ReducedClausingFactor; - - VelocityDistribution = @(velocity) sqrt(2 / pi) * sqrt(Helper.PhysicsConstants.Dy164Mass/(Helper.PhysicsConstants.BoltzmannConstant * this.OvenTemperatureinKelvin))^3 ... - * velocity.^3 .* exp(-velocity.^2 .* (Helper.PhysicsConstants.Dy164Mass / (2 * Helper.PhysicsConstants.BoltzmannConstant ... - * this.OvenTemperatureinKelvin))); - - c = integral(VelocityDistribution, 0, this.VelocityCutoff) / integral(VelocityDistribution, 0, inf); - - this.ReducedFlux = c * this.ReducedClausingFactor * this.calculateFreeMolecularRegimeFlux(); - - ret = zeros(n,3); - SampledVelocityMagnitude = zeros(n,1); - SampledPolarAngle = zeros(n,1); - SampledAzimuthalAngle = zeros(n,1); - - MostProbableVelocity = sqrt((3 * Helper.PhysicsConstants.BoltzmannConstant * this.OvenTemperature) / Helper.PhysicsConstants.Dy164Mass); % For v * f(v) distribution - - if MostProbableVelocity > this.VelocityCutoff - MaximumVelocityAllowed = this.VelocityCutoff; - else - MaximumVelocityAllowed = MostProbableVelocity; - end - NormalizationConstantForVelocityDistribution = this.velocityDistributionFunction(MaximumVelocityAllowed); - - parfor i = 1:n - % Rejection Sampling of speed - y = rand(1); - x = this.VelocityCutoff * rand(1); - while y > ((NormalizationConstantForVelocityDistribution)^-1 * this.velocityDistributionFunction(x)) %As long as this loop condition is satisfied, reject the corresponding x value - y = rand(1); - x = this.VelocityCutoff * rand(1); - end - SampledVelocityMagnitude(i) = x; % When loop condition is not satisfied, accept x value and store as sample - - % Rejection Sampling of polar angle - w = rand(1); - z = this.ExitDivergence * rand(1); - - while w > ((NormalizationConstantForAngularDistribution)^-1 * 2 * pi * this.angularDistributionFunction(z) * sin(z)) %As long as this loop condition is satisfied, reject the corresponding x value - w = rand(1); - z = this.ExitDivergence * rand(1); - end - SampledPolarAngle(i) = z; %When loop condition is not satisfied, accept x value and store as sample - - % Sampling of azimuthal angle - SampledAzimuthalAngle(i)= 2 * pi * rand(1); - - ret(i,:)=[SampledVelocityMagnitude(i)*cos(SampledPolarAngle(i)), SampledVelocityMagnitude(i)*sin(SampledPolarAngle(i))*cos(SampledAzimuthalAngle(i)), ... - SampledVelocityMagnitude(i)*sin(SampledPolarAngle(i))*sin(SampledAzimuthalAngle(i))]; - end -end - diff --git a/2DMOT Simulation Code/+Simulator/@Oven/velocityDistributionFunction.m b/2DMOT Simulation Code/+Simulator/@Oven/velocityDistributionFunction.m deleted file mode 100644 index 2f5dc98..0000000 --- a/2DMOT Simulation Code/+Simulator/@Oven/velocityDistributionFunction.m +++ /dev/null @@ -1,5 +0,0 @@ -function ret = velocityDistributionFunction(this, velocity) - ret = sqrt(2 / pi) * sqrt(Helper.PhysicsConstants.Dy164Mass/(Helper.PhysicsConstants.BoltzmannConstant * this.OvenTemperatureinKelvin))^3 ... - * velocity^3 * exp(-velocity^2.*(Helper.PhysicsConstants.Dy164Mass / (2 * Helper.PhysicsConstants.BoltzmannConstant ... - * this.OvenTemperatureinKelvin))); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/TwoDimensionalMOT.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/TwoDimensionalMOT.m deleted file mode 100644 index bfdf096..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/TwoDimensionalMOT.m +++ /dev/null @@ -1,191 +0,0 @@ -classdef TwoDimensionalMOT < Simulator.MOTCaptureProcess & matlab.mixin.Copyable - - properties (Access = private) - MagneticGradienDefault = 0.40; % T/m - ExitDivergenceDefault = 15e-3; - DistanceBetweenPushBeamAnd3DMOTCenterDefault = 0; - PushBeamDistanceDefault = 0.32; - end - - properties (Access = public) - TotalPower; - LandegFactor; - MagneticSubLevel; - MagneticGradient; - CaptureVelocity; - ExitDivergence; - DistanceBetweenPushBeamAnd3DMOTCenter; - PushBeamDistance; - TimeSpentInInteractionRegion; - ParticleDynamicalQuantities; - InitialParameters; - BootstrapSampleLength; - BootstrapSampleNumber; - Results; - end - - methods - function this = TwoDimensionalMOT(varargin) - this@Simulator.MOTCaptureProcess('SimulationMode', '2D', varargin{:}); - p = inputParser; - p.KeepUnmatched = true; - addParameter(p, 'TotalPower', 0.8,... - @(x) assert(isnumeric(x) && isscalar(x) && (x > 0))); - addParameter(p, 'LandegFactor', 1,... - @(x) assert(isnumeric(x) && isscalar(x) && (x > 0))); - addParameter(p, 'MagneticSubLevel', 1,... - @(x) assert(isnumeric(x) && isscalar(x))); - addParameter(p, 'MagneticGradient', 0.38,... - @(x) assert(isnumeric(x) && isscalar(x))); - - p.parse(varargin{:}); - - this.TotalPower = p.Results.TotalPower; - this.LandegFactor = p.Results.LandegFactor; - this.MagneticSubLevel = p.Results.MagneticSubLevel; - this.MagneticGradient = p.Results.MagneticGradient; - this.ExitDivergence = this.ExitDivergenceDefault; - this.DistanceBetweenPushBeamAnd3DMOTCenter = this.DistanceBetweenPushBeamAnd3DMOTCenterDefault; - this.PushBeamDistance = this.PushBeamDistanceDefault; - this.InitialParameters = struct; - this.InitialParameters.TotalPower = this.TotalPower; - this.InitialParameters.LandegFactor = this.LandegFactor; - this.InitialParameters.MagneticSubLevel= this.MagneticSubLevel; - this.InitialParameters.MagneticGradient= this.MagneticGradient; - this.BootstrapSampleLength = 0.5 * this.NumberOfAtoms; - this.BootstrapSampleNumber = 1000; - end - - function restoreDefaults(this) - this.TotalPower = this.InitialParameters.TotalPower; - this.LandegFactor = this.InitialParameters.LandegFactor; - this.MagneticSubLevel = this.InitialParameters.MagneticSubLevel; - this.MagneticGradient = this.InitialParameters.MagneticGradient; - this.ExitDivergence = this.ExitDivergenceDefault; - this.DistanceBetweenPushBeamAnd3DMOTCenter = this.DistanceBetweenPushBeamAnd3DMOTCenterDefault; - this.PushBeamDistance = this.PushBeamDistanceDefault; - end - end % - lifecycle - - methods - function set.TotalPower(this,val) - this.TotalPower = val; - end - function ret = get.TotalPower(this) - ret = this.TotalPower; - end - function set.LandegFactor(this,val) - this.LandegFactor = val; - end - function ret = get.LandegFactor(this) - ret = this.LandegFactor; - end - function set.MagneticSubLevel(this,val) - this.MagneticSubLevel = val; - end - function ret = get.MagneticSubLevel(this) - ret = this.MagneticSubLevel; - end - function set.MagneticGradient(this,val) - this.MagneticGradient = val; - end - function ret = get.MagneticGradient(this) - ret = this.MagneticGradient; - end - function set.CaptureVelocity(this,val) - this.CaptureVelocity = val; - end - function ret = get.CaptureVelocity(this) - ret = this.CaptureVelocity; - end - function set.ExitDivergence(this,val) - this.ExitDivergence = val; - end - function ret = get.ExitDivergence(this) - ret = this.ExitDivergence; - end - function set.DistanceBetweenPushBeamAnd3DMOTCenter(this,val) - this.DistanceBetweenPushBeamAnd3DMOTCenter = val; - end - function ret = get.DistanceBetweenPushBeamAnd3DMOTCenter(this) - ret = this.DistanceBetweenPushBeamAnd3DMOTCenter; - end - function set.PushBeamDistance(this,val) - this.PushBeamDistance = val; - end - function ret = get.PushBeamDistance(this) - ret = this.PushBeamDistance; - end - function set.TimeSpentInInteractionRegion(this,val) - this.TimeSpentInInteractionRegion = val; - end - function ret = get.TimeSpentInInteractionRegion(this) - ret = this.TimeSpentInInteractionRegion; - end - function set.ParticleDynamicalQuantities(this,val) - this.ParticleDynamicalQuantities = val; - end - function ret = get.ParticleDynamicalQuantities(this) - ret = this.ParticleDynamicalQuantities; - end - function set.InitialParameters(this,val) - this.InitialParameters = val; - end - function ret = get.InitialParameters(this) - ret = this.InitialParameters; - end - function set.BootstrapSampleLength(this,val) - this.BootstrapSampleLength = val; - end - function ret = get.BootstrapSampleLength(this) - ret = this.BootstrapSampleLength; - end - function set.BootstrapSampleNumber(this,val) - this.BootstrapSampleNumber = val; - end - function ret = get.BootstrapSampleNumber(this) - ret = this.BootstrapSampleNumber; - end - function set.Results(this, val) - this.Results = val; - end - function ret = get.Results(this) - ret = this.Results; - end - end % - setters and getters - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %- Methods - - methods(Access = protected) - function cp = copyElement(this) - % Shallow copy object - cp = copyElement@matlab.mixin.Copyable(this); - - % Forces the setter to redefine the function handles to the new copied object - - pl = properties(this); - for k = 1:length(pl) - sc = superclasses(this.(pl{k})); - if any(contains(sc,{'matlab.mixin.Copyable'})) - cp.(pl{k}) = this.(pl{k}).copy(); - end - end - end - end - - methods (Static) - - % Creates an Instance of Class, ensures singleton behaviour (that there - % can only be one Instance of this class - function singleObj = getInstance(varargin) - % Creates an Instance of Class, ensures singleton behaviour - persistent localObj; - if isempty(localObj) || ~isvalid(localObj) - localObj = Simulator.TwoDimensionalMOT(varargin{:}); - end - singleObj = localObj; - end - end - -end diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/accelerationDueToPushBeam.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/accelerationDueToPushBeam.m deleted file mode 100644 index 44d6485..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/accelerationDueToPushBeam.m +++ /dev/null @@ -1,35 +0,0 @@ -function ret = accelerationDueToPushBeam(this, PositionVector, VelocityVector) - % is the distance between the chamber center and the cross point of push beam and z-axis (along the gravity) - WaveVectorEndPoint = [0, 1, this.DistanceBetweenPushBeamAnd3DMOTCenter/this.PushBeamDistance]; - WaveVectorEndPoint = WaveVectorEndPoint./norm(WaveVectorEndPoint); - Origin=[0,0,0]; - - PushBeamObj = this.Beams{cellfun(@(x) strcmpi(x.Alias, 'Push'), this.Beams)}; - PushBeamDetuning = PushBeamObj.Detuning; - PushBeamRadius = PushBeamObj.Radius; - PushBeamWaist = PushBeamObj.Waist; - PushBeamWaveNumber = PushBeamObj.WaveNumber; - PushBeamLinewidth = PushBeamObj.Linewidth; - PushBeamSaturationParameter = 0.25 * PushBeamObj.SaturationParameter; - - SaturationIntensity = this.calculateLocalSaturationIntensity(PushBeamSaturationParameter, PositionVector, Origin, WaveVectorEndPoint, PushBeamRadius, PushBeamWaist); - - DopplerShift = dot(WaveVectorEndPoint(:), VelocityVector) * PushBeamWaveNumber; - - Detuning = PushBeamDetuning - DopplerShift; - - s_push = SaturationIntensity/(1 + SaturationIntensity + (4 * (Detuning./PushBeamLinewidth).^2)); - a_sat = (Helper.PhysicsConstants.PlanckConstantReduced * PushBeamWaveNumber * WaveVectorEndPoint(:)/Helper.PhysicsConstants.Dy164Mass).*(PushBeamLinewidth * 0.5); - a_push = a_sat .* (s_push/(1+s_push)); - - if this.SpontaneousEmission - a_scatter = this.accelerationDueToSpontaneousEmissionProcess(s_push, s_push, PushBeamLinewidth, PushBeamWaveNumber); - else - a_scatter = [0,0,0]; - end - - a_total = a_push + a_scatter; - - ret = a_total(1:3); -end - diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/accelerationDueToSpontaneousEmissionProcess.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/accelerationDueToSpontaneousEmissionProcess.m deleted file mode 100644 index 9cf4a31..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/accelerationDueToSpontaneousEmissionProcess.m +++ /dev/null @@ -1,15 +0,0 @@ -function ret = accelerationDueToSpontaneousEmissionProcess(this, SaturationParameter, TotalSaturationParameter, Linewidth, WaveNumber) - Vector = [2*rand(1)-1,2*rand(1)-1,2*rand(1)-1]; - Vector = Vector./norm(Vector); - - ScatteringRate = (0.5 * Linewidth) * (SaturationParameter / (1 + TotalSaturationParameter)); - NumberOfScatteringEvents = floor(ScatteringRate * this.TimeStep); - - if NumberOfScatteringEvents > 0 - ret = Vector.*((Helper.PhysicsConstants.PlanckConstantReduced * WaveNumber) / ... - (Helper.PhysicsConstants.Dy164Mass * this.TimeStep)).* sqrt(NumberOfScatteringEvents); - else - ret = zeros(1,3); - end -end - diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/bootstrapErrorEstimation.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/bootstrapErrorEstimation.m deleted file mode 100644 index a06802a..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/bootstrapErrorEstimation.m +++ /dev/null @@ -1,22 +0,0 @@ -function [LoadingRate, StandardError, ConfidenceInterval] = bootstrapErrorEstimation(this, ovenObj, NumberOfLoadedAtoms) - n = this.NumberOfAtoms; - SampleLength = this.BootstrapSampleLength; - NumberOfBootsrapSamples = this.BootstrapSampleNumber; - MeanCaptureRatioInEachSample = zeros(1,NumberOfBootsrapSamples); - for SampleNumber = 1:NumberOfBootsrapSamples - BoostrapSample = datasample(NumberOfLoadedAtoms, SampleLength); % Sample with replacement - MeanCaptureRatioInEachSample(SampleNumber) = mean(BoostrapSample) / n; % Empirical bootstrap distribution of sample means - end - - LoadingRate = mean(MeanCaptureRatioInEachSample) * ovenObj.ReducedFlux; - - Variance = 0; % Bootstrap Estimate of Variance - for SampleNumber = 1:NumberOfBootsrapSamples - Variance = Variance + (MeanCaptureRatioInEachSample(SampleNumber) - mean(MeanCaptureRatioInEachSample))^2; - end - - StandardError = sqrt((1 / (NumberOfBootsrapSamples-1)) * Variance) * ovenObj.ReducedFlux; - - ts = tinv([0.025 0.975],NumberOfBootsrapSamples-1); % T-Score - ConfidenceInterval = LoadingRate + ts*StandardError; % 95% Confidence Intervals -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateCaptureVelocity.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateCaptureVelocity.m deleted file mode 100644 index 074fad7..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateCaptureVelocity.m +++ /dev/null @@ -1,22 +0,0 @@ -function ret = calculateCaptureVelocity(this, ovenObj, PositionVector, VelocityVector) - VelocityUnitVector = VelocityVector./norm(VelocityVector); - UpperLimit = 500; - LowerLimit = 0; - - for Index = 1:500 - InitialVelocity = (0.5 * (UpperLimit + LowerLimit)) * VelocityUnitVector; - ParticleDynamicalQuantities = this.solver(PositionVector, InitialVelocity); - FinalPositionVector = ParticleDynamicalQuantities(end, 1:3); - if rssq(FinalPositionVector) <= ovenObj.OvenDistance - LowerLimit = 0.5 * (UpperLimit + LowerLimit); - else - UpperLimit = 0.5 * (UpperLimit + LowerLimit); - end - - if UpperLimit - LowerLimit < 1 - ret = (0.5 * (UpperLimit + LowerLimit)) * VelocityUnitVector; - break; - end - end -end - diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateLoadingRate.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateLoadingRate.m deleted file mode 100644 index eada4cb..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateLoadingRate.m +++ /dev/null @@ -1,53 +0,0 @@ -function [LoadingRate, StandardError, ConfidenceInterval] = calculateLoadingRate(this, ovenObj) - n = this.NumberOfAtoms; - DynamicalQuantities = this.ParticleDynamicalQuantities; - CollisionEvents = zeros(1, n); - NumberOfLoadedAtoms = zeros(1, n); - - - % Include the stochastic process of background collisions - for AtomIndex = 1:n - this.TimeSpentInInteractionRegion(AtomIndex) = this.computeTimeSpentInInteractionRegion(squeeze(DynamicalQuantities(AtomIndex,:,1:3))); - CollisionEvents(AtomIndex) = this.computeCollisionProbability(ovenObj, this.TimeSpentInInteractionRegion(AtomIndex)); - end - - % Count the number of loaded atoms subject to conditions - - switch this.ErrorEstimationMethod - case 'bootstrap' - NumberOfTimeSteps = int64(this.SimulationTime/this.TimeStep); - NumberOfLoadedAtoms = zeros(1, NumberOfTimeSteps); - LoadedAtomIndices = []; - for TimeIndex = 1:NumberOfTimeSteps - if TimeIndex ~= 1 - NumberOfLoadedAtoms(TimeIndex) = NumberOfLoadedAtoms(TimeIndex-1); - end - for AtomIndex = 1:n - Position = squeeze(DynamicalQuantities(AtomIndex, TimeIndex, 1:3))'; - if this.exitCondition(Position, CollisionEvents(AtomIndex)) - if ~ismember(AtomIndex, LoadedAtomIndices) - NumberOfLoadedAtoms(TimeIndex) = NumberOfLoadedAtoms(TimeIndex) + 1; - LoadedAtomIndices(end+1) = AtomIndex; - end - else - if ismember(AtomIndex, LoadedAtomIndices) - NumberOfLoadedAtoms(TimeIndex) = NumberOfLoadedAtoms(TimeIndex) - 1; - LoadedAtomIndices(LoadedAtomIndices==AtomIndex) = []; - end - end - end - end - [LoadingRate, StandardError, ConfidenceInterval] = this.bootstrapErrorEstimation(ovenObj, NumberOfLoadedAtoms); - case 'jackknife' - for AtomIndex = 1:n - if AtomIndex ~= 1 - NumberOfLoadedAtoms(AtomIndex) = NumberOfLoadedAtoms(AtomIndex-1); - end - Position = squeeze(DynamicalQuantities(AtomIndex, end, 1:3))'; - if this.exitCondition(Position, CollisionEvents(AtomIndex)) - NumberOfLoadedAtoms(AtomIndex) = NumberOfLoadedAtoms(AtomIndex) + 1; - end - end - [LoadingRate, StandardError, ConfidenceInterval] = jackknifeErrorEstimation(this, ovenObj, NumberOfLoadedAtoms); - end -end diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateLocalSaturationIntensity.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateLocalSaturationIntensity.m deleted file mode 100644 index 5bc099a..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateLocalSaturationIntensity.m +++ /dev/null @@ -1,10 +0,0 @@ -function ret = calculateLocalSaturationIntensity(~, PeakIntensity, PositionVector, WaveVectorOrigin, WaveVectorEndPoint, BeamRadius, BeamWaist) - - DistanceBetweenAtomAndLaserBeamAxis = Helper.calculateDistanceFromPointToLine(PositionVector, WaveVectorOrigin, WaveVectorEndPoint); - - if DistanceBetweenAtomAndLaserBeamAxis <= BeamRadius - ret = PeakIntensity * exp(-2*DistanceBetweenAtomAndLaserBeamAxis^2 / BeamWaist^2); - else - ret = 0; - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateTotalAcceleration.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateTotalAcceleration.m deleted file mode 100644 index 68513eb..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/calculateTotalAcceleration.m +++ /dev/null @@ -1,104 +0,0 @@ -function ret = calculateTotalAcceleration(this, PositionVector, VelocityVector) - CoolingBeamObj = this.Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), this.Beams)}; - CoolingBeamDetuning = CoolingBeamObj.Detuning; - CoolingBeamRadius = CoolingBeamObj.Radius; - CoolingBeamWaist = CoolingBeamObj.Waist; - CoolingBeamWaveNumber = CoolingBeamObj.WaveNumber; - CoolingBeamLinewidth = CoolingBeamObj.Linewidth; - CoolingBeamSaturationParameter = CoolingBeamObj.SaturationParameter; - - SidebandBeamObj = this.Beams{cellfun(@(x) strcmpi(x.Alias, 'BlueSideband'), this.Beams)}; - SidebandDetuning = SidebandBeamObj.Detuning; - SidebandBeamRadius = SidebandBeamObj.Radius; - SidebandBeamWaist = SidebandBeamObj.Waist; - SidebandSaturationParameter = SidebandBeamObj.SaturationParameter; - - WaveVectorEndPoint = zeros(2,3); - WaveVectorEndPoint(1,:) = [1,0,1]; - WaveVectorEndPoint(1,:) = WaveVectorEndPoint(1,1:3)/norm(WaveVectorEndPoint(1,:)); - WaveVectorEndPoint(2,:) = [-1,0,1]; - WaveVectorEndPoint(2,:) = WaveVectorEndPoint(2,1:3)/norm(WaveVectorEndPoint(2,:)); - - Sigma = [1,-1]; - Origin = [0,0,0]; - - % Calculate the Saturation Intensity at the specified point along its Gaussian Profile - CoolingBeamLocalSaturationIntensity = [this.calculateLocalSaturationIntensity(0.25 * CoolingBeamSaturationParameter, PositionVector, Origin, WaveVectorEndPoint(1,:), CoolingBeamRadius, CoolingBeamWaist), ... - this.calculateLocalSaturationIntensity(0.25 * CoolingBeamSaturationParameter, PositionVector, Origin, WaveVectorEndPoint(2,:), CoolingBeamRadius, CoolingBeamWaist)]; - - SidebandLocalSaturationIntensity = [this.calculateLocalSaturationIntensity(0.25 * SidebandSaturationParameter, PositionVector, Origin, WaveVectorEndPoint(1,:), SidebandBeamRadius, SidebandBeamWaist), ... - this.calculateLocalSaturationIntensity(0.25 * SidebandSaturationParameter, PositionVector, Origin, WaveVectorEndPoint(2,:), SidebandBeamRadius, SidebandBeamWaist)]; - - TotalAcceleration = zeros(1,3); - - Delta_Cooling = [0,0,0,0]; - Delta_Sideband = [0,0,0,0]; - - for i = 1:2 - - LocalMagneticField = this.magneticFieldForMOT(PositionVector); - - B = sign(dot(LocalMagneticField(1:3), WaveVectorEndPoint(i,:))) * LocalMagneticField(4); - - ZeemanShift = this.LandegFactor * this.MagneticSubLevel * (Helper.PhysicsConstants.BohrMagneton / Helper.PhysicsConstants.PlanckConstantReduced) * B; - - DopplerShift = dot(WaveVectorEndPoint(i,:), VelocityVector) * CoolingBeamWaveNumber; - - Delta_Cooling(i*2-1) = CoolingBeamDetuning + DopplerShift + (ZeemanShift * Sigma(i)); - Delta_Cooling(i*2) = CoolingBeamDetuning - DopplerShift - (ZeemanShift * Sigma(i)); - - if this.SidebandBeam - Delta_Sideband(i*2-1) = SidebandDetuning + DopplerShift + (ZeemanShift * Sigma(i)); - Delta_Sideband(i*2) = SidebandDetuning - DopplerShift - (ZeemanShift * Sigma(i)); - end - end - - SaturationParameter = [0,0,0,0,0,0,0,0]; - - for i = 1:2 - SaturationParameter(2*i-1) = CoolingBeamLocalSaturationIntensity(i) /(1 + 4 * (Delta_Cooling(2*i-1)/CoolingBeamLinewidth)^2); - SaturationParameter(2*i) = CoolingBeamLocalSaturationIntensity(i) /(1 + 4 * (Delta_Cooling(2*i) /CoolingBeamLinewidth)^2); - if this.SidebandBeam - SaturationParameter(2*i-1+4) = SidebandLocalSaturationIntensity(i) /(1 + 4 * (Delta_Sideband(2*i-1)/CoolingBeamLinewidth)^2); - SaturationParameter(2*i+4) = SidebandLocalSaturationIntensity(i) /(1 + 4 * (Delta_Sideband(2*i)/CoolingBeamLinewidth)^2); - end - end - - TotalSaturationParameter = sum(SaturationParameter); - - for i = 1:2 - - a_sat = (Helper.PhysicsConstants.PlanckConstantReduced * CoolingBeamWaveNumber * WaveVectorEndPoint(i,1:3)/Helper.PhysicsConstants.Dy164Mass).*(CoolingBeamLinewidth * 0.5); - a_1 = a_sat .* (SaturationParameter(2*i-1)/(1 + TotalSaturationParameter)); - a_2 = a_sat .* (SaturationParameter(2*i) /(1 + TotalSaturationParameter)); - - if this.SpontaneousEmission - a_scattering = this.accelerationDueToSpontaneousEmissionProcess(SaturationParameter(2*i-1), TotalSaturationParameter, CoolingBeamLinewidth, CoolingBeamWaveNumber) + ... - this.accelerationDueToSpontaneousEmissionProcess(SaturationParameter(2*i), TotalSaturationParameter, CoolingBeamLinewidth, CoolingBeamWaveNumber); - else - a_scattering = [0,0,0]; - end - - if this.SidebandBeam - a_1 = a_1 + a_sat .* (SaturationParameter(2*i-1+4)/(1 + TotalSaturationParameter)); - a_2 = a_2 + a_sat .* (SaturationParameter(2*i+4) /(1 + TotalSaturationParameter)); - - if this.SpontaneousEmission - a_scattering = a_scattering + ... - this.accelerationDueToSpontaneousEmissionProcess(SaturationParameter(2*i-1+4), TotalSaturationParameter, CoolingBeamLinewidth, CoolingBeamWaveNumber) + ... - this.accelerationDueToSpontaneousEmissionProcess(SaturationParameter(2*i+4), TotalSaturationParameter, CoolingBeamLinewidth, CoolingBeamWaveNumber); - else - a_scattering = [0,0,0]; - end - end - - TotalAcceleration = TotalAcceleration + (a_2 - a_1) + a_scattering; - end - - if this.PushBeam - TotalAcceleration = TotalAcceleration + this.accelerationDueToPushBeam(PositionVector, VelocityVector); - end - - ret = TotalAcceleration(1:3); - -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/computeCollisionProbability.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/computeCollisionProbability.m deleted file mode 100644 index 39b0014..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/computeCollisionProbability.m +++ /dev/null @@ -1,9 +0,0 @@ -function ret = computeCollisionProbability(this, ovenObj, tau_2D) - collision = rand(1); - CollisionProbability = 1 - exp(-tau_2D/ovenObj.CollisionTime); - if this.BackgroundCollision && collision <= CollisionProbability - ret = true; - else - ret = false; - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/computeTimeSpentInInteractionRegion.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/computeTimeSpentInInteractionRegion.m deleted file mode 100644 index 6e1aef0..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/computeTimeSpentInInteractionRegion.m +++ /dev/null @@ -1,20 +0,0 @@ -function T = computeTimeSpentInInteractionRegion(this, r) -% INPUT: -% r : N x 3 array. N is the number of time steps -% OUTPUT -% T : gives the distribution of time spent in the interaction region -% USAGE: -% T = this.computeTimeSpentInInteractionRegion(r) - T = 0; - CoolingBeamObj = this.Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), this.Beams)}; - NumberOfTimeSteps = int64(this.SimulationTime/this.TimeStep); - for n = 1:(NumberOfTimeSteps - 1) - dr = Helper.calculateDistanceFromPointToLine(r(n+1, :), [0 0 0], [0 0 1]); - if dr < CoolingBeamObj.Radius - A = 1; - else - A = 0; - end - T = T + A * this.TimeStep; - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/exitCondition.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/exitCondition.m deleted file mode 100644 index 33c1406..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/exitCondition.m +++ /dev/null @@ -1,10 +0,0 @@ -function ret = exitCondition(this, PositionVector, CollisionEvent) - d = Helper.calculateDistanceFromPointToLine(PositionVector, [0 0 0], [0 1 0]); - y = PositionVector(2); - DivergenceAngle = atan(d/abs(y)); - if (y >= 0) && (DivergenceAngle <= this.ExitDivergence) && ~CollisionEvent - ret = true; - else - ret = false; - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/jackknifeErrorEstimation.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/jackknifeErrorEstimation.m deleted file mode 100644 index abca489..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/jackknifeErrorEstimation.m +++ /dev/null @@ -1,50 +0,0 @@ -function [LoadingRate, StandardError, ConfidenceInterval] = jackknifeErrorEstimation(this, ovenObj, NumberOfLoadedAtoms) - n = this.NumberOfAtoms; - Autocorrelation = zeros(1, n); - - for i = 1:n-1 - FirstTerm = 0; - SecondTerm = 0; - for j = 1:n-i - FirstTerm = FirstTerm + NumberOfLoadedAtoms(j) / j; - SecondTerm = SecondTerm + (NumberOfLoadedAtoms(i+j)) / (i+j); - Autocorrelation(i) = Autocorrelation(i) + ((NumberOfLoadedAtoms(j) / j) .*(NumberOfLoadedAtoms(i+j) / (i+j))); - end - Autocorrelation(i) = (1/(n-i)) * (Autocorrelation(i) - ((1/(n-i)) * FirstTerm * SecondTerm)); - end - - if Autocorrelation(1)~=0 - - Autocorrelation = Autocorrelation./Autocorrelation(1); - - x = linspace(1,n,n); - - [FitParams,~] = fit(x',Autocorrelation',"exp(-x/tau)", 'Startpoint', 100); - CorrelationFactor = FitParams.tau; - - SampleLength = 2*CorrelationFactor+1; - NumberOfJackknifeSamples = floor(n/SampleLength); - CaptureRatioInEachSample = zeros(1,NumberOfJackknifeSamples); - SampleNumberLimit = min(NumberOfJackknifeSamples-1,5); - for i=1:NumberOfJackknifeSamples-SampleNumberLimit - CaptureRatioInEachSample(i) = NumberOfLoadedAtoms(n-ceil((i-1)*SampleLength))/(n-ceil((i-1)*SampleLength)); - end - - MeanCaptureRatio = sum(CaptureRatioInEachSample) / (NumberOfJackknifeSamples-SampleNumberLimit); - - LoadingRate = MeanCaptureRatio * ovenObj.ReducedFlux; - - Variance=0; - for i=1:NumberOfJackknifeSamples-SampleNumberLimit - Variance=Variance+(CaptureRatioInEachSample(i) - MeanCaptureRatio)^2; - end - StandardError = sqrt(Variance/(NumberOfJackknifeSamples-SampleNumberLimit)); - - ConfidenceInterval = LoadingRate + 1.96*StandardError; % 95% Confidence Intervals - - else - LoadingRate = nan; - StandardError = nan; - ConfidenceInterval = [nan nan]; - end -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/magneticFieldForMOT.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/magneticFieldForMOT.m deleted file mode 100644 index 4fc4e1c..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/magneticFieldForMOT.m +++ /dev/null @@ -1,8 +0,0 @@ -function ret = magneticFieldForMOT(this, r) - ret = zeros(1,4); - alpha = this.MagneticGradient; - ret(1) = r(3)*alpha; - ret(2) = 0; - ret(3) = r(1)*alpha; - ret(4) = sqrt(ret(1)^2+ret(2)^2+ret(3)^2); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/runSimulation.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/runSimulation.m deleted file mode 100644 index f26b3b1..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/runSimulation.m +++ /dev/null @@ -1,25 +0,0 @@ -function [LoadingRate, StandardError, ConfidenceInterval] = runSimulation(this, ovenObj) - if this.NumberOfAtoms ~= ovenObj.NumberOfAtoms - ovenObj.NumberOfAtoms = this.NumberOfAtoms; - end - %% - Sampling for initial positions and velocities - % - sampling the position distribution - Positions = ovenObj.initialPositionSampling(); - % - sampling the velocity distribution - Velocities = ovenObj.initialVelocitySampling(this); - %% Solve ODE - progressbar = Helper.parforNotifications(); - progressbar.PB_start(this.NumberOfAtoms,'Message',['Simulating 2-D MOT capture process for ' num2str(this.NumberOfAtoms,'%.0f') ' atoms:']); - - % calculate the final position of the atoms - DynamicalQuantities = zeros(this.NumberOfAtoms,int64(this.SimulationTime/this.TimeStep),6); - parfor Index = 1:this.NumberOfAtoms - DynamicalQuantities(Index,:, :) = this.solver(Positions(Index,:), Velocities(Index,:)); - progressbar.PB_iterate(); - end - clear Index - this.ParticleDynamicalQuantities = DynamicalQuantities; - - %% Calculate the Loading Rate - [LoadingRate, StandardError, ConfidenceInterval] = this.calculateLoadingRate(ovenObj); -end \ No newline at end of file diff --git a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/solver.m b/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/solver.m deleted file mode 100644 index a2c3cf1..0000000 --- a/2DMOT Simulation Code/+Simulator/@TwoDimensionalMOT/solver.m +++ /dev/null @@ -1,39 +0,0 @@ -function ParticleDynamicalQuantities = solver(this, InitialPosition, InitialVelocity) - if this.Gravity - g = [0,0,-Helper.PhysicsConstants.GravitationalAcceleration]; - else - g = 0; - end - - ParticleDynamicalQuantities = zeros(int64(this.SimulationTime/this.TimeStep),6); - for i=1:int64(this.SimulationTime/this.TimeStep) - - ParticleDynamicalQuantities(i,1:3) = InitialPosition; - ParticleDynamicalQuantities(i,4:6) = InitialVelocity; - - rt = InitialPosition; - vt = InitialVelocity; - - ga1 = this.calculateTotalAcceleration(rt,vt) + g; - gv1 = vt .* this.TimeStep; - rt = rt + 0.5 * gv1; - vt = vt + 0.5 * ga1 .* this.TimeStep; - - ga2 = this.calculateTotalAcceleration(rt,vt) + g; - gv2 = vt .* this.TimeStep; - rt = rt + 0.5 * gv2; - vt = vt + 0.5 * ga2 .* this.TimeStep; - - ga3 = this.calculateTotalAcceleration(rt,vt) + g; - gv3 = vt .* this.TimeStep; - rt = rt + 0.5 * gv3; - vt = vt + ga3 .* this.TimeStep; - - ga4 = this.calculateTotalAcceleration(rt,vt) + g; - gv4 = vt .* this.TimeStep; - - InitialPosition = InitialPosition + (gv1+2*(gv2+gv3)+gv4)./6; - InitialVelocity = InitialVelocity + this.TimeStep*(ga1+2*(ga2+ga3)+ga4)./6; - end -end - diff --git a/2DMOT Simulation Code/test_MOTCaptureProcessSimulation.m b/2DMOT Simulation Code/test_MOTCaptureProcessSimulation.m deleted file mode 100644 index 2c027ad..0000000 --- a/2DMOT Simulation Code/test_MOTCaptureProcessSimulation.m +++ /dev/null @@ -1,427 +0,0 @@ -%% This script is testing the functionalities of the MOT Capture Process Simulation Classes -% -% Important: Run only sectionwise!! - -%% - Testing the MOTCaptureProcess-Class -% - Create MOTCaptureProcess object with specified options -% - Automatically creates Beams objects -OptionsStruct = struct; -OptionsStruct.ErrorEstimationMethod = 'bootstrap'; % 'jackknife' | 'bootstrap' -OptionsStruct.NumberOfAtoms = 5000; -OptionsStruct.TimeStep = 50e-06; % in s -OptionsStruct.SimulationTime = 4e-03; % in s -OptionsStruct.SpontaneousEmission = true; -OptionsStruct.SidebandBeam = true; -OptionsStruct.PushBeam = true; -OptionsStruct.Gravity = true; -OptionsStruct.BackgroundCollision = true; -OptionsStruct.SaveData = true; -% OptionsStruct.SaveDirectory = ''; -options = Helper.convertstruct2cell(OptionsStruct); -clear OptionsStruct - -Oven = Simulator.Oven(options{:}); -MOT2D = Simulator.TwoDimensionalMOT(options{:}); -Beams = MOT2D.Beams; - -%% - Run Simulation -MOT2D.NumberOfAtoms = 10000; -MOT2D.SidebandBeam = true; -MOT2D.PushBeam = false; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -CoolingBeam.Power = 0.2; -CoolingBeam.Waist = 20e-03; -CoolingBeam.Detuning = -1.33*Helper.PhysicsConstants.BlueLinewidth; -SidebandBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'BlueSideband'), Beams)}; -SidebandBeam.Power = 0.2; -SidebandBeam.Waist = 20e-03; -SidebandBeam.Detuning = -2.66*Helper.PhysicsConstants.BlueLinewidth; -PushBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Push'), Beams)}; -PushBeam.Power = 0.025; -PushBeam.Waist = 0.81e-03; -PushBeam.Detuning = 0; -[LoadingRate, ~] = MOT2D.runSimulation(Oven); -%% - Plot initial distribution -% - sampling the position distribution -InitialPositions = Oven.initialPositionSampling(); -% - sampling the velocity distribution -InitialVelocities = Oven.initialVelocitySampling(MOT2D); -NumberOfBins = 100; -Plotter.plotPositionAndVelocitySampling(NumberOfBins, InitialPositions, InitialVelocities); - -%% - Plot distributions of magnitude and direction of initial velocities -NumberOfBins = 50; -Plotter.plotInitialVeloctiySamplingVsAngle(Oven, MOT2D, NumberOfBins) - -%% - Plot Magnetic Field -XAxisRange = [-5 5]; -YAxisRange = [-5 5]; -ZAxisRange = [-5 5]; -Plotter.visualizeMagneticField(MOT2D, XAxisRange, YAxisRange, ZAxisRange) - -%% - Plot MFP & VP for different temperatures -TemperatureinCelsius = linspace(750,1100,2000); % Temperature in Celsius -Plotter.plotMeanFreePathAndVapourPressureVsTemp(TemperatureinCelsius) - -%% - Plot the Free Molecular Flux for different temperatures -Temperature = [950, 1000, 1050]; % Temperature -Plotter.plotFreeMolecularFluxVsTemp(Oven,Temperature) - -%% - Plot Angular Distribution for different Beta -Beta = [0.5, 0.1 , 0.05, 0.02, 0.01]; %Beta = 2 * radius / length of the tube -Plotter.plotAngularDistributionForDifferentBeta(Oven, Beta) - -%% - Plot Capture Velocity -Plotter.plotCaptureVelocityVsAngle(Oven, MOT2D); % Takes a long time to plot! - -%% - Plot Phase Space with Acceleration Field -MOT2D.SidebandBeam = false; -MOT2D.MagneticGradient = 0.4; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -CoolingBeam.Power = 0.3; -CoolingBeam.Detuning = -1.64*Helper.PhysicsConstants.BlueLinewidth; -CoolingBeam.Waist = 15e-03; -SidebandBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'BlueSideband'), Beams)}; -SidebandBeam.Power = 0.5; -SidebandBeam.Detuning = -4*Helper.PhysicsConstants.BlueLinewidth; -SidebandBeam.Waist = 15e-03; -MOT2D.NumberOfAtoms = 50; -MinimumVelocity = 0; -MaximumVelocity = 150; -NumberOfBins = 200; %Along each axis -IncidentAtomDirection = 0*2*pi/360; -IncidentAtomPosition = 0; -Plotter.plotPhaseSpaceWithAccelerationField(Oven, MOT2D, MinimumVelocity, MaximumVelocity, NumberOfBins, IncidentAtomDirection, IncidentAtomPosition) - -%% - Plot Trajectories along the 3 directions -MOT2D.NumberOfAtoms = 100; -MOT2D.MagneticGradient = 0.42; -MaximumVelocity = 150; -IncidentAtomDirection = 0*2*pi/360; -IncidentAtomPosition = 0; - -%% - Positions -Plotter.plotDynamicalQuantities(Oven, MOT2D, MaximumVelocity, IncidentAtomDirection, IncidentAtomPosition, 'PlotPositions', true); - -%% - Velocities -Plotter.plotDynamicalQuantities(Oven, MOT2D, MaximumVelocity, IncidentAtomDirection, IncidentAtomPosition, 'PlotVelocities', true); - -%% - Scan parameters: One-Parameter Scan - -MOT2D.NumberOfAtoms = 5000; -MOT2D.TotalPower = 0.4; -MOT2D.SidebandBeam = false; -MOT2D.PushBeam = false; -NumberOfPointsForFirstParam = 5; %iterations of the simulation -ParameterArray = linspace(0.1, 1.0, NumberOfPointsForFirstParam) * MOT2D.TotalPower; - -tStart = tic; -[LoadingRateArray, StandardErrorArray, ConfidenceIntervalArray] = Simulator.Scan.doOneParameter(Oven, MOT2D, 'Blue', 'Power', ParameterArray); -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForParameter = 1000; -OptionsStruct.XLabelString = 'Cooling Beam Power (mW)'; -OptionsStruct.RescalingFactorForYQuantity = 1e-10; -OptionsStruct.ErrorsForYQuantity = true; -OptionsStruct.ErrorsArray = StandardErrorArray; -OptionsStruct.CIForYQuantity = true; -OptionsStruct.CIArray = ConfidenceIntervalArray; -OptionsStruct.RemoveOutliers = true; -OptionsStruct.YLabelString = 'Loading rate (x 10^{10} atoms/s)'; -OptionsStruct.TitleString = sprintf('Magnetic Gradient = %.0f (G/cm)', MOT2D.MagneticGradient * 100); - -options = Helper.convertstruct2cell(OptionsStruct); - -Plotter.plotResultForOneParameterScan(ParameterArray, LoadingRateArray, options{:}) - -clear OptionsStruct - -%% - Scan parameters: One-Parameter Scan -MOT2D.NumberOfAtoms = 10000; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -CoolingBeam.Power = 0.4; -MOT2D.SidebandBeam = false; -MOT2D.PushBeam = false; -% ParameterArray = [10 20 30 40 50 60 70 80 90 100]; -ParameterArray = [500 1000 1500 2000 2500 3000 3500 4000 4500 5000 5500 6000 6500 7000 7500 8000 8500 9000 9500]; -NumberOfPointsForParam = length(ParameterArray); %iterations of the simulation - -LoadingRateArray = zeros(1,NumberOfPointsForParam); -StandardErrorArray = zeros(1,NumberOfPointsForParam); -ConfidenceIntervalArray = zeros(NumberOfPointsForParam, 2); -tStart = tic; -for i=1:NumberOfPointsForParam - MOT2D.BootstrapSampleLength = ParameterArray(i); - [LoadingRateArray(i), StandardErrorArray(i), ConfidenceIntervalArray(i,:)] = MOT2D.runSimulation(Oven); -end -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForParameter = 1; -OptionsStruct.XLabelString = 'Bootstrap Sample Length'; -OptionsStruct.RescalingFactorForYQuantity = 1e-10; -OptionsStruct.ErrorsForYQuantity = true; -OptionsStruct.ErrorsArray = StandardErrorArray; -OptionsStruct.CIForYQuantity = true; -OptionsStruct.CIArray = ConfidenceIntervalArray; -OptionsStruct.RemoveOutliers = false; -OptionsStruct.YLabelString = 'Loading rate (x 10^{10} atoms/s)'; -OptionsStruct.TitleString = sprintf('Cooling Beam Power = %d (mW); Magnetic Gradient = %.0f (G/cm)', CoolingBeam.Power*1000, MOT2D.MagneticGradient * 100); - -options = Helper.convertstruct2cell(OptionsStruct); - -Plotter.plotResultForOneParameterScan(ParameterArray, LoadingRateArray, options{:}) - -MeanLR = mean(LoadingRateArray(:)) * 1e-10; - -yline(MeanLR, 'LineStyle', '--', 'Linewidth', 2.5) -textstring = [sprintf('%1.2e', MeanLR * 1e+10) ' atoms']; -% txt = text((ParameterArray(2) + 0.05*ParameterArray(2)), (max(MeanLR) + 0.05*MeanLR), textstring, 'Interpreter','latex', 'FontSize', 14); - -% xlim([0 100]) -ylim([0 3.5]) - -clear OptionsStruct -%% - Scan parameters: Two-Parameter Scan - -% COOLING BEAM POWER VS DETUNING - -MOT2D.NumberOfAtoms = 5000; -MOT2D.TotalPower = 0.6; -NumberOfPointsForFirstParam = 10; %iterations of the simulation -NumberOfPointsForSecondParam = 10; -FirstParameterArray = linspace(-0.5, -2.5, NumberOfPointsForFirstParam) * Helper.PhysicsConstants.BlueLinewidth; -SecondParameterArray = linspace(0.3, 1.0, NumberOfPointsForSecondParam) * MOT2D.TotalPower; - -tStart = tic; -[LoadingRateArray, ~, ~] = Simulator.Scan.doTwoParameters(Oven, MOT2D, 'Blue', 'Detuning', FirstParameterArray, 'Power', SecondParameterArray); -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForFirstParameter = (Helper.PhysicsConstants.BlueLinewidth)^-1; -OptionsStruct.XLabelString = 'Cooling Beam Detuning (\Delta/\Gamma)'; -OptionsStruct.RescalingFactorForSecondParameter = 1000; -OptionsStruct.YLabelString = 'Cooling Beam Power (mW)'; -OptionsStruct.RescalingFactorForQuantityOfInterest = 1e-9; -OptionsStruct.ZLabelString = 'Loading rate (x 10^{9} atoms/s)'; -OptionsStruct.TitleString = sprintf('Magnetic Gradient = %.0f (G/cm)', MOT2D.MagneticGradient * 100); - -options = Helper.convertstruct2cell(OptionsStruct); - -Plotter.plotResultForTwoParameterScan(FirstParameterArray, SecondParameterArray, LoadingRateArray, options{:}) - -clear OptionsStruct - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% COOLING BEAM WAIST VS DETUNING - -MOT2D.NumberOfAtoms = 20000; -MOT2D.MagneticGradient = 0.40; -MOT2D.SidebandBeam = false; -MOT2D.PushBeam = false; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -CoolingBeam.Power = 0.4; -NumberOfPointsForFirstParam = 10; %iterations of the simulation -NumberOfPointsForSecondParam = 10; -FirstParameterArray = linspace(-0.5, -2.0, NumberOfPointsForFirstParam) * Helper.PhysicsConstants.BlueLinewidth; -SecondParameterArray = linspace(10, 25, NumberOfPointsForSecondParam) * 1e-03; - -tStart = tic; -[LoadingRateArray, ~, ~] = Simulator.Scan.doTwoParameters(Oven, MOT2D, 'Blue', 'Detuning', FirstParameterArray, 'Waist', SecondParameterArray); -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForFirstParameter = (Helper.PhysicsConstants.BlueLinewidth)^-1; -OptionsStruct.XLabelString = 'Cooling Beam Detuning (\Delta/\Gamma)'; -OptionsStruct.RescalingFactorForSecondParameter = 1000; -OptionsStruct.YLabelString = 'Cooling Beam Waist (mm)'; -OptionsStruct.RescalingFactorForQuantityOfInterest = 1e-9; -OptionsStruct.ZLabelString = 'Loading rate (x 10^{9} atoms/s)'; -OptionsStruct.TitleString = sprintf('Cooling Beam Power = %d (mW); Magnetic Gradient = %.0f (G/cm)', CoolingBeam.Power*1000, MOT2D.MagneticGradient * 100); - -options = Helper.convertstruct2cell(OptionsStruct); - -Plotter.plotResultForTwoParameterScan(FirstParameterArray, SecondParameterArray, LoadingRateArray, options{:}) - -clear OptionsStruct - -%% - Scan parameters: Three-Parameter Scan - -% COOLING BEAM WAIST VS DETUNING FOR DIFFERENT MAGNETIC FIELD GRADIENTS - -MOT2D.NumberOfAtoms = 10000; -MOT2D.SidebandBeam = false; -MOT2D.PushBeam = false; -MOT2D.BackgroundCollision = false; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -CoolingBeam.Power = 0.4; -NumberOfPointsForFirstParam = 10; %iterations of the simulation -NumberOfPointsForSecondParam = 10; -NumberOfPointsForThirdParam = 6; -FirstParameterArray = linspace(-0.5, -2.0, NumberOfPointsForFirstParam) * Helper.PhysicsConstants.BlueLinewidth; -SecondParameterArray = linspace(10, 25, NumberOfPointsForSecondParam) * 1e-03; -ThirdParameterArray = linspace(30, 50, NumberOfPointsForThirdParam) * 1e-02; -MOT2D.BootstrapSampleLength = 500; - -tStart = tic; -LoadingRateArray = Simulator.Scan.doThreeParameters(Oven, MOT2D, 'Blue', 'Detuning', FirstParameterArray, ... - 'Waist', SecondParameterArray, ... - 'MagneticGradient', ThirdParameterArray); -tEnd = toc(tStart); -fprintf('Total Computational Time: %0.1f seconds. \n', tEnd); - -% - Plot results - -OptionsStruct = struct; -OptionsStruct.RescalingFactorForFirstParameter = (Helper.PhysicsConstants.BlueLinewidth)^-1; -OptionsStruct.XLabelString = 'Cooling Beam Detuning (\Delta/\Gamma)'; -OptionsStruct.RescalingFactorForSecondParameter = 1000; -OptionsStruct.YLabelString = 'Cooling Beam Waist (mm)'; -OptionsStruct.RescalingFactorForThirdParameter = 100; -OptionsStruct.RescalingFactorForQuantityOfInterest = 1e-9; -OptionsStruct.ZLabelString = 'Loading rate (x 10^{9} atoms/s)'; -OptionsStruct.PlotTitleString = 'Magnetic Gradient = %.0f (G/cm)'; -OptionsStruct.FigureTitleString = sprintf('Oven-2DMOT Distance = %.1f (mm); Cooling Beam Power = %d (mW)', Oven.OvenDistance * 1000, CoolingBeam.Power*1000); - -options = Helper.convertstruct2cell(OptionsStruct); - -Plotter.plotResultForThreeParameterScan(FirstParameterArray, SecondParameterArray, ThirdParameterArray, LoadingRateArray, options{:}) - -clear OptionsStruct - -%% Local Saturation Intensity distribution - -WaveVectorEndPoint = zeros(2,3); -WaveVectorEndPoint(1,:) = [1,0,1]; -WaveVectorEndPoint(1,:) = WaveVectorEndPoint(1,1:3)/norm(WaveVectorEndPoint(1,:)); -WaveVectorEndPoint(2,:) = [-1,0,1]; -WaveVectorEndPoint(2,:) = WaveVectorEndPoint(2,1:3)/norm(WaveVectorEndPoint(2,:)); -Origin = [0,0,0]; - -BeamNumber = 2; %Selects one of the two wave vectors defined above -BeamRadius = 17.5e-03; -BeamWaist = 15e-03; -Power = 0.4; -CoolingBeam = Beams{cellfun(@(x) strcmpi(x.Alias, 'Blue'), Beams)}; -SaturationIntensity = CoolingBeam.SaturationIntensity; -SaturationParameter = 0.1 * (8 * Power) / (pi*BeamWaist^2 * SaturationIntensity); % two beams are reflected - -n = 10000; -xmin = -BeamRadius; -xmax = BeamRadius; -x = xmin+rand(n,1)*(xmax-xmin); - -y = ones(n,1) * 0; - -zmin = -BeamRadius; -zmax = BeamRadius; -z = zmin+rand(n,1)*(zmax-zmin); - - -% t = 2*pi*rand(n,1); -% r = BeamRadius*sqrt(rand(n,1)); -% x = r.*cos(t); -% y = ones(n,1) * 0; -% z = r.*sin(t); - -PositionVector = horzcat(x, y, z); %scatter3(zeros(n,1), y, z) -CoolingBeamLocalSaturationIntensity = @(x) MOT2D.calculateLocalSaturationIntensity(0.25 * SaturationParameter, x, Origin, WaveVectorEndPoint(BeamNumber,:), BeamRadius, BeamWaist); -IntensityProfile = zeros(n,1); -for i=1:n - IntensityProfile(i) = CoolingBeamLocalSaturationIntensity(PositionVector(i, :)); -end - -v = IntensityProfile; % Extract intensity value -rows = 35; -columns = 35; -Image = zeros(rows, columns); -for k = 1 : length(x) - row = ceil((x(k) - min(x)) * columns / (max(x) - min(x))); - column = ceil((z(k) - min(z)) * rows / (max(z) - min(z))); - if (row == 0) - row = 1; - end - if (column == 0) - column = 1; - end - Image(row, column) = v(k); -end - -f_h = Helper.getFigureByTag('Intensity Profile'); -set(groot,'CurrentFigure',f_h); -a_h = get(f_h, 'CurrentAxes'); -if ~isempty(get(a_h, 'Children')) - clf(f_h); -end -f_h.Name = 'Intensity Profile'; -f_h.Units = 'pixels'; -set(0,'units','pixels'); -screensize = get(0,'ScreenSize'); -f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 750 600]; -imagesc(linspace(min(x),max(x),row) * 1e+03, linspace(min(z),max(z),column) * 1e+03, Image); -set(gca,'YDir','normal'); -hXLabel = xlabel('x-direction (distance in mm)'); -hYLabel = ylabel('z-direction (distance in mm)'); - -shading flat; -c = colorbar; -c.Label.String= 'Local Saturation Intensity'; -c.Label.FontSize = 14; - -hTitle = sgtitle('Intensity Distribution'); - -set([hXLabel, hYLabel] , ... - 'FontSize' , 14 ); -set( hTitle , ... - 'FontSize' , 18 ); - -Helper.bringFiguresWithTagInForeground(); - -%% Beam Shape in Three dimensions - -f_h = Helper.getFigureByTag('Intensity Profile'); -set(groot,'CurrentFigure',f_h); -a_h = get(f_h, 'CurrentAxes'); -if ~isempty(get(a_h, 'Children')) - clf(f_h); -end -f_h.Name = 'Intensity Profile'; -f_h.Units = 'pixels'; -set(0,'units','pixels'); -screensize = get(0,'ScreenSize'); -f_h.Position = [[screensize(3)/3.5 screensize(4)/3.5] 750 600]; -[xq,zq] = meshgrid(linspace(-BeamRadius, BeamRadius, n), linspace(-BeamRadius, BeamRadius, n)); -vq = griddata(x,z,v,xq,zq); -mesh(xq,zq,vq) -hold on -plot3(x,z,v,'o', 'MarkerSize', 1.5) -hXLabel = xlabel('x-direction (distance in mm)'); -hYLabel = ylabel('z-direction (distance in mm)'); -shading flat; -c = colorbar; -c.Label.String= 'Local Saturation Intensity'; -c.Label.FontSize = 14; - -hTitle = sgtitle('Intensity Distribution'); - -set([hXLabel, hYLabel] , ... - 'FontSize' , 14 ); -set( hTitle , ... - 'FontSize' , 18 ); - -Helper.bringFiguresWithTagInForeground(); - diff --git a/DipolarGasSimulator/+Helper/ImageSelection.class b/DipolarGasSimulator/+Helper/ImageSelection.class deleted file mode 100644 index cfac41d..0000000 Binary files a/DipolarGasSimulator/+Helper/ImageSelection.class and /dev/null differ diff --git a/DipolarGasSimulator/+Helper/ImageSelection.java b/DipolarGasSimulator/+Helper/ImageSelection.java deleted file mode 100644 index 5be8fbb..0000000 --- a/DipolarGasSimulator/+Helper/ImageSelection.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Based on code snippet from - * http://java.sun.com/developer/technicalArticles/releases/data/ - * - * Copyright © 2008, 2010 Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. - */ - -import java.awt.image.BufferedImage; -import java.awt.datatransfer.*; - -public class ImageSelection implements Transferable { - - private static final DataFlavor flavors[] = - {DataFlavor.imageFlavor}; - - private BufferedImage image; - - public ImageSelection(BufferedImage image) { - this.image = image; - } - - // Transferable - public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { - if (flavor.equals(flavors[0]) == false) { - throw new UnsupportedFlavorException(flavor); - } - return image; - } - - public DataFlavor[] getTransferDataFlavors() { - return flavors; - } - - public boolean isDataFlavorSupported(DataFlavor - flavor) { - return flavor.equals(flavors[0]); - } -} \ No newline at end of file diff --git a/DipolarGasSimulator/+Helper/PhysicsConstants.m b/DipolarGasSimulator/+Helper/PhysicsConstants.m deleted file mode 100644 index f62dd0a..0000000 --- a/DipolarGasSimulator/+Helper/PhysicsConstants.m +++ /dev/null @@ -1,46 +0,0 @@ -classdef PhysicsConstants < handle - properties (Constant) - % CODATA - PlanckConstant=6.62607015E-34; - PlanckConstantReduced=6.62607015E-34/(2*pi); - FineStructureConstant=7.2973525698E-3; - ElectronMass=9.10938291E-31; - GravitationalConstant=6.67384E-11; - ProtonMass=1.672621777E-27; - AtomicMassUnit=1.66053878283E-27; - BohrRadius=0.52917721092E-10; - BohrMagneton=927.400968E-26; - BoltzmannConstant=1.380649E-23; - StandardGravityAcceleration=9.80665; - SpeedOfLight=299792458; - StefanBoltzmannConstant=5.670373E-8; - ElectronCharge=1.602176634E-19; - VacuumPermeability=1.25663706212E-6; - DielectricConstant=8.8541878128E-12; - ElectronGyromagneticFactor=-2.00231930436153; - AvogadroConstant=6.02214076E23; - ZeroKelvin = 273.15; - GravitationalAcceleration = 9.80553; - - % Dy specific constants - Dy164Mass = 163.929174751*1.66053878283E-27; - Dy164IsotopicAbundance = 0.2826; - BlueWavelength = 421.291e-9; - BlueLandegFactor = 1.22; - BlueLifetime = 4.94e-9; - BlueLinewidth = 1/4.94e-9; - RedWavelength = 626.086e-9; - RedLandegFactor = 1.29; - RedLifetime = 1.2e-6; - RedLinewidth = 1/1.2e-6; - PushBeamWaveLength = 626.086e-9; - PushBeamLifetime = 1.2e-6; - PushBeamLinewidth = 1/1.2e-6; - end - - methods - function pc = PhysicsConstants() - end - end - -end diff --git a/DipolarGasSimulator/+Helper/bringFiguresWithTagInForeground.m b/DipolarGasSimulator/+Helper/bringFiguresWithTagInForeground.m deleted file mode 100644 index c58a117..0000000 --- a/DipolarGasSimulator/+Helper/bringFiguresWithTagInForeground.m +++ /dev/null @@ -1,15 +0,0 @@ -function output = bringFiguresWithTagInForeground() - -figure_handles = findobj('type','figure'); - -for idx = 1:length(figure_handles) - if ~isempty(figure_handles(idx).Tag) - figure(figure_handles(idx)); - end -end - -if nargout > 0 - output = figure_handles; -end - -end \ No newline at end of file diff --git a/DipolarGasSimulator/+Helper/calculateDistanceFromPointToLine.m b/DipolarGasSimulator/+Helper/calculateDistanceFromPointToLine.m deleted file mode 100644 index df5c8c6..0000000 --- a/DipolarGasSimulator/+Helper/calculateDistanceFromPointToLine.m +++ /dev/null @@ -1,10 +0,0 @@ -function ret = calculateDistanceFromPointToLine(p0 , p1, p2) - p01 = p0 - p1; - p12 = p2 - p1; - CrossProduct = [p01(2)*p12(3) - p01(3)*p12(2), p01(3)*p12(1) - p01(1)*p12(3), p01(1)*p12(2) - p01(2)*p12(1)]; - ret = norm(CrossProduct) / norm(p12); - - %Height of parallelogram (Distance between point and line) = Area of parallelogram / Base - %Area = One side of parallelogram X Base - %ret = norm(cross(one side, base))./ norm(base); -end \ No newline at end of file diff --git a/DipolarGasSimulator/+Helper/convertstruct2cell.m b/DipolarGasSimulator/+Helper/convertstruct2cell.m deleted file mode 100644 index 90fdf2c..0000000 --- a/DipolarGasSimulator/+Helper/convertstruct2cell.m +++ /dev/null @@ -1,6 +0,0 @@ -function CellOut = convertstruct2cell(StructIn) - % CellOut = Convertstruct2cell(StructIn) - % converts a struct into a cell-matrix where the first column contains - % the fieldnames and the second the contents - CellOut = [fieldnames(StructIn) struct2cell(StructIn)]'; -end \ No newline at end of file diff --git a/DipolarGasSimulator/+Helper/findAllZeroCrossings.m b/DipolarGasSimulator/+Helper/findAllZeroCrossings.m deleted file mode 100644 index 4b8d9db..0000000 --- a/DipolarGasSimulator/+Helper/findAllZeroCrossings.m +++ /dev/null @@ -1,18 +0,0 @@ -function ret = findAllZeroCrossings(x,y) -% Finds all Zero-crossing of the function y = f(x) - zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Approximate Zero-Crossing Indices Of Argument Vector - zxidx = zci(y); - if ~isempty(zxidx) - for k1 = 1:numel(zxidx) - idxrng = max([1 zxidx(k1)-1]):min([zxidx(k1)+1 numel(y)]); - xrng = x(idxrng); - yrng = y(idxrng); - [yrng2, ~, jyrng] = unique(yrng); %yrng is a new array containing the unique values of yrng. jyrng contains the indices in yrng that correspond to the original vector. yrng = yrng2(jyrng) - xrng2 = accumarray(jyrng, xrng, [], @mean); %This function creates a new array "xrng2" by applying the function "@mean" to all elements in "xrng" that have identical indices in "jyrng". Any elements with identical X values will have identical indices in jyrng. Thus, this function creates a new array by averaging values with identical X values in the original array. - ret(k1) = interp1( yrng2(:), xrng2(:), 0, 'linear', 'extrap' ); - end - else - warning('No zero crossings found!') - ret = nan; - end -end \ No newline at end of file diff --git a/DipolarGasSimulator/+Helper/getFigureByTag.m b/DipolarGasSimulator/+Helper/getFigureByTag.m deleted file mode 100644 index 8fc6bf9..0000000 --- a/DipolarGasSimulator/+Helper/getFigureByTag.m +++ /dev/null @@ -1,191 +0,0 @@ -function figure_handle = getFigureByTag(tag_name, varargin) - % figure_handle = getFigureByTag(tag_name, varargin) - % - % Example code: - % f_h = getFigureByTag('survivalMeasurement','Name','Survival') - % - % clf(f_h); - % a_h = gca(f_h); - % xlim(a_h,[10,100]); - % % custom position - % f_h.Position = [4052.3 719.67 560 420]; - - assert(nargin>=1 && ischar(tag_name),'You must specify ``tag_name'' as a string.'); - - f_h = findobj('type','figure','tag',tag_name); - - if isempty(f_h) - f_h = figure('Tag',tag_name,varargin{:}); - - defaultNewFigProperties = {'Color','w','NumberTitle','off','Name',sprintf('Fig. %d',f_h.Number)}; - - varargin = [defaultNewFigProperties,varargin]; - else - f_h = f_h(1); - end - - if ~isempty(varargin) - set(f_h,varargin{:}); - end - - addCopyButton(f_h); - - if nargout > 0 - figure_handle = f_h; - else - set(groot,'CurrentFigure',f_h); - end - -end - -function addCopyButton(f_h) - - if(strcmp(f_h.ToolBar,'none')) - return - end - - tb = findall(f_h,'Type','uitoolbar'); - - pt = findall(tb, 'tag', 'Custom.CopyPlot' ); - if isempty(pt) - pt = uipushtool(tb); - else - pt = pt(1); - end - - cdata = zeros(16,16,3); - - % Evernote Logo -% cdata(:,:,1) =[255 NaN NaN NaN NaN 99 11 27 175 NaN NaN NaN NaN NaN NaN 255 -% NaN NaN NaN 251 93 14 0 0 0 66 70 106 210 NaN NaN NaN -% NaN NaN NaN 42 0 43 0 0 0 0 0 0 20 185 NaN NaN -% NaN 243 56 0 42 82 0 0 0 0 0 0 0 45 NaN NaN -% NaN 156 44 64 113 65 0 0 0 0 0 0 0 32 NaN NaN -% 136 9 26 28 11 0 0 0 0 0 0 0 0 10 188 NaN -% 132 0 0 0 0 0 0 0 0 0 136 175 16 0 133 NaN -% NaN 28 0 0 0 0 0 0 0 0 152 238 50 0 124 NaN -% NaN 58 0 0 0 0 0 0 0 0 0 9 0 0 71 NaN -% NaN 175 0 0 0 0 0 61 15 0 0 0 0 0 100 NaN -% NaN NaN 143 12 0 0 0 210 195 87 17 0 0 0 126 NaN -% NaN NaN NaN 183 118 50 150 NaN NaN 110 219 78 0 0 160 NaN -% NaN NaN NaN NaN NaN NaN NaN 191 0 35 NaN 150 0 23 NaN NaN -% NaN NaN NaN NaN NaN NaN NaN 124 0 172 NaN 81 0 93 NaN NaN -% 255 NaN NaN NaN NaN NaN NaN 183 0 0 0 0 51 228 NaN 245 -% 253 254 NaN NaN NaN NaN NaN NaN 156 63 45 100 NaN NaN 255 255]/255.; -% -% -% cdata(:,:,2) = [255 255 255 255 255 216 166 171 225 229 218 229 247 255 255 255 -% 255 255 255 255 201 166 159 157 167 188 189 200 243 255 255 255 -% 237 238 255 181 159 183 164 170 163 158 160 157 169 233 248 250 -% 224 235 188 140 182 195 161 168 168 168 168 169 147 186 244 240 -% 255 226 175 185 207 189 161 168 168 168 168 168 159 179 249 249 -% 227 172 172 179 172 163 169 168 168 170 163 155 160 173 231 237 -% 215 161 163 165 166 168 168 168 168 162 215 228 172 163 209 219 -% 248 178 159 168 168 168 168 168 168 159 220 249 185 158 208 222 -% 249 192 151 169 168 168 169 160 163 172 163 159 166 167 194 204 -% 246 229 155 157 168 169 159 188 174 154 162 167 166 166 202 214 -% 212 231 218 168 157 153 165 255 242 190 171 159 167 166 207 220 -% 218 203 251 243 206 181 230 210 208 207 242 196 154 168 223 232 -% 255 224 232 250 237 214 244 194 152 178 255 223 145 175 250 252 -% 255 255 244 239 222 213 240 214 149 228 254 199 136 203 244 232 -% 255 255 255 246 231 246 246 232 165 159 167 147 184 253 254 242 -% 253 254 255 255 254 255 255 255 231 183 178 199 249 255 255 255]/255.; -% -% -% cdata(:,:,3) = [255 255 255 255 255 117 38 50 187 211 170 190 234 255 255 255 -% 255 254 255 255 120 51 27 20 39 97 98 122 220 255 255 255 -% 238 252 246 73 22 71 37 49 35 20 24 18 49 196 231 231 -% 232 242 86 0 78 108 29 45 45 45 45 46 0 82 214 201 -% 255 175 63 85 139 98 27 45 45 45 45 45 23 72 233 231 -% 167 51 57 72 55 32 47 45 45 50 34 14 27 57 201 218 -% 154 30 33 38 39 45 45 45 45 31 157 188 53 34 153 180 -% 234 67 24 45 45 45 45 44 45 24 169 241 83 20 146 182 -% 241 99 4 48 45 45 47 28 35 53 32 26 39 44 104 127 -% 238 192 14 20 45 47 27 97 56 10 29 44 41 40 127 158 -% 214 253 169 37 20 16 34 218 207 105 55 23 42 40 147 182 -% 218 214 241 201 138 71 177 225 181 130 224 107 12 45 175 197 -% 255 233 202 218 212 132 230 196 27 61 255 172 0 64 240 242 -% 255 255 219 197 176 160 237 143 0 195 245 110 0 123 230 230 -% 255 255 255 227 197 241 244 202 36 24 39 0 81 228 242 245 -% 253 254 255 255 254 255 255 255 191 78 71 121 221 255 255 255]/255.; - - %OneNote logo - - cdata(:,:,1) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 245 213 213 213 213 213 213 213 184 184 215 255 - 255 255 255 255 241 213 213 213 213 213 213 213 184 184 208 255 - 255 233 204 204 194 176 176 185 213 213 213 213 184 184 208 255 - 255 154 101 101 101 101 101 103 213 213 213 206 162 162 193 255 - 255 152 101 183 116 152 115 101 213 213 213 206 162 162 193 255 - 255 152 101 207 189 178 122 101 213 213 213 206 162 162 193 255 - 255 152 101 199 152 224 122 101 213 213 213 195 128 128 170 255 - 255 152 101 166 101 183 115 101 213 213 213 195 128 128 170 255 - 255 154 101 101 101 101 101 103 213 213 213 195 128 128 170 255 - 255 233 204 204 194 176 176 185 213 213 213 183 95 95 148 255 - 255 255 255 255 241 213 213 213 213 213 213 183 94 94 148 255 - 255 255 255 255 245 213 213 213 213 213 213 183 94 94 163 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.; - - - cdata(:,:,2) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 219 112 110 110 110 110 110 134 84 84 158 255 - 255 255 255 255 207 110 110 110 110 110 110 134 84 84 141 255 - 255 222 178 178 146 81 81 88 110 110 110 134 84 84 141 255 - 255 102 23 23 23 23 23 24 110 110 110 125 58 58 123 255 - 255 100 23 147 46 100 44 23 110 110 110 125 58 58 123 255 - 255 100 23 183 156 139 55 23 110 110 110 125 58 58 123 255 - 255 100 23 170 99 208 55 23 110 110 110 119 38 38 109 255 - 255 100 23 121 23 146 44 23 110 110 110 119 38 38 109 255 - 255 102 23 23 23 23 23 24 110 110 110 119 38 38 109 255 - 255 222 178 178 146 81 81 88 110 110 110 118 37 37 109 255 - 255 255 255 255 207 110 110 110 110 110 110 118 37 37 110 255 - 255 255 255 255 219 112 110 110 110 110 110 118 37 37 131 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.; - - - cdata(:,:,3) =[255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 246 229 229 240 255 - 255 255 255 255 255 255 255 255 255 255 255 246 229 229 238 255 - 255 242 224 224 224 224 224 232 255 255 255 246 229 229 238 255 - 255 194 163 163 163 163 163 164 255 255 255 244 223 223 234 255 - 255 194 163 212 172 194 171 163 255 255 255 244 223 223 234 255 - 255 194 163 226 216 209 176 163 255 255 255 244 223 223 234 255 - 255 194 163 221 193 236 176 163 255 255 255 240 209 209 224 255 - 255 194 163 202 163 212 171 163 255 255 255 240 209 209 224 255 - 255 194 163 163 163 163 163 164 255 255 255 240 209 209 224 255 - 255 242 224 224 224 224 224 232 255 255 255 223 161 161 192 255 - 255 255 255 255 255 255 255 255 255 255 255 223 160 160 192 255 - 255 255 255 255 255 255 255 255 255 255 255 223 160 160 201 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]/255.; - - - pt.Tag = 'Custom.CopyPlot'; - pt.CData = cdata; - pt.Separator = true; - pt.ClickedCallback = @copyToClipboard; - -end - -function copyToClipboard(~,~) - fig_h = get(get(gcbo,'Parent'),'Parent'); - if strcmp(fig_h.WindowStyle,'docked') - if ismac || ispc - matlab.graphics.internal.copyFigureHelper(fig_h); - else - %warning('Copy function to the clipboard only works if the figure is undocked.'); - Helper.screencapture(fig_h,[],'clipboard'); - end - else - pos = fig_h.Position; - Helper.screencapture(fig_h,[],'clipboard','position',[7,7,pos(3)-2,pos(4)]); - end -end - - - diff --git a/DipolarGasSimulator/+Helper/ode5.m b/DipolarGasSimulator/+Helper/ode5.m deleted file mode 100644 index 3eb003f..0000000 --- a/DipolarGasSimulator/+Helper/ode5.m +++ /dev/null @@ -1,92 +0,0 @@ -function Y = ode5(odefun,tspan,y0,varargin) -%ODE5 Solve differential equations with a non-adaptive method of order 5. -% Y = ODE5(ODEFUN,TSPAN,Y0) with TSPAN = [T1, T2, T3, ... TN] integrates -% the system of differential equations y' = f(t,y) by stepping from T0 to -% T1 to TN. Function ODEFUN(T,Y) must return f(t,y) in a column vector. -% The vector Y0 is the initial conditions at T0. Each row in the solution -% array Y corresponds to a time specified in TSPAN. -% -% Y = ODE5(ODEFUN,TSPAN,Y0,P1,P2...) passes the additional parameters -% P1,P2... to the derivative function as ODEFUN(T,Y,P1,P2...). -% -% This is a non-adaptive solver. The step sequence is determined by TSPAN -% but the derivative function ODEFUN is evaluated multiple times per step. -% The solver implements the Dormand-Prince method of order 5 in a general -% framework of explicit Runge-Kutta methods. -% -% Example -% tspan = 0:0.1:20; -% y = ode5(@vdp1,tspan,[2 0]); -% plot(tspan,y(:,1)); -% solves the system y' = vdp1(t,y) with a constant step size of 0.1, -% and plots the first component of the solution. - -if ~isnumeric(tspan) - error('TSPAN should be a vector of integration steps.'); -end - -if ~isnumeric(y0) - error('Y0 should be a vector of initial conditions.'); -end - -h = diff(tspan); -if any(sign(h(1))*h <= 0) - error('Entries of TSPAN are not in order.') -end - -try - f0 = feval(odefun,tspan(1),y0,varargin{:}); -catch - msg = ['Unable to evaluate the ODEFUN at t0,y0. ',lasterr]; - error(msg); -end - -y0 = y0(:); % Make a column vector. -if ~isequal(size(y0),size(f0)) - error('Inconsistent sizes of Y0 and f(t0,y0).'); -end - -neq = length(y0); -N = length(tspan); -Y = zeros(neq,N); - -% Method coefficients -- Butcher's tableau -% -% C | A -% --+--- -% | B - -C = [1/5; 3/10; 4/5; 8/9; 1]; - -A = [ 1/5, 0, 0, 0, 0 - 3/40, 9/40, 0, 0, 0 - 44/45 -56/15, 32/9, 0, 0 - 19372/6561, -25360/2187, 64448/6561, -212/729, 0 - 9017/3168, -355/33, 46732/5247, 49/176, -5103/18656]; - -B = [35/384, 0, 500/1113, 125/192, -2187/6784, 11/84]; - -% More convenient storage -A = A.'; -B = B(:); - -nstages = length(B); -F = zeros(neq,nstages); - -Y(:,1) = y0; -for i = 2:N - ti = tspan(i-1); - hi = h(i-1); - yi = Y(:,i-1); - - % General explicit Runge-Kutta framework - F(:,1) = feval(odefun,ti,yi,varargin{:}); - for stage = 2:nstages - tstage = ti + C(stage-1)*hi; - ystage = yi + F(:,1:stage-1)*(hi*A(1:stage-1,stage-1)); - F(:,stage) = feval(odefun,tstage,ystage,varargin{:}); - end - Y(:,i) = yi + F*(hi*B); - -end -Y = Y.'; diff --git a/DipolarGasSimulator/+Helper/onenoteccdata.m b/DipolarGasSimulator/+Helper/onenoteccdata.m deleted file mode 100644 index 5f3c177..0000000 --- a/DipolarGasSimulator/+Helper/onenoteccdata.m +++ /dev/null @@ -1,55 +0,0 @@ -cmap = zeros(16,16,3); - -cmap(:,:,1) = [0.0000 0.0118 0.4510 0.0039 0.2078 0.1569 0.4078 0.4431 0.4510 0.1922 0.4235 0.4196 0.2235 0.4235 0.4039 0.4392 - 0.4471 0.1647 0.4157 0.0000 0.0235 0.4353 0.0314 0.4314 0.0196 0.2392 0.0667 0.0392 0.4431 0.3804 0.2941 0.4275 - 0.3686 0.3608 0.2000 0.2824 0.3059 0.0549 0.1804 0.1882 0.4392 0.4314 0.3255 0.0078 0.0902 0.1961 0.4353 0.1412 - 0.2314 0.3647 0.0353 0.3804 0.1647 0.2431 0.1686 0.2745 0.2980 0.4235 0.3922 0.4157 0.2784 0.3333 0.2510 0.0588 - 0.1020 0.0745 0.2549 0.0471 0.1216 0.4000 0.3961 0.2627 0.1098 0.1725 0.3098 0.4314 0.3529 0.3412 0.0784 0.0824 - 0.4471 0.1490 0.1804 0.3529 0.2196 0.3137 0.3255 0.0941 0.0078 0.3294 0.3765 0.2706 0.0510 0.0157 0.4275 0.1176 - 0.1294 0.1333 0.1725 0.3451 0.2118 0.3843 0.1255 0.1569 0.2118 0.1608 0.0353 0.2039 0.1608 0.4510 1.0000 0.8000 - 0.9882 0.6510 0.9961 0.4549 0.4549 0.6824 0.7882 0.5686 0.5373 0.5490 0.7765 0.7137 0.8510 0.7176 0.5020 0.4902 - 0.8941 0.9020 0.4745 0.8980 0.9098 0.4824 0.6471 0.6353 0.9922 0.9647 0.6353 0.4588 0.9647 0.9020 0.4980 0.8118 - 0.5059 0.4941 0.9686 0.4863 0.5451 0.9725 0.8980 0.5451 0.5333 0.6824 0.4588 0.8196 0.8314 0.8980 0.8941 0.9961 - 0.5255 0.8392 0.9804 0.5216 0.8588 0.8078 0.5176 0.7647 0.5608 0.9725 0.9059 0.4627 0.9882 0.8275 0.7725 0.8745 - 0.8235 0.8431 0.7373 1.0000 0.5137 0.4706 0.4784 0.7412 0.8863 0.9373 0.5529 0.5804 0.4510 0.9255 0.8235 0.8667 - 0.7569 0.8824 0.5294 0.5176 0.5373 0.9569 0.5294 0.4824 0.5098 0.5137 0.5569 0.8471 0.5098 0.9490 0.8706 0.9412 - 0.4902 0.6000 0.6980 0.7882 0.5490 0.7216 0.6431 0.4824 0.5569 0.4667 0.6627 0.9922 0.7804 0.8039 0.6275 0.7333 - 0.5725 0.5647 0.8549 0.7529 0.6235 0.8784 0.5922 0.7294 0.6118 0.7922 0.7843 0.6667 0.9294 0.6902 0.6784 0.9176 - 0.6706 0.7490 0.7961 0.5882 0.8627 0.4627 0.6196 0.7059 0.6078 0.9765 0.6549 0.6863 0.5373 0.7098 0.7176 0.7765]; - -cmap(:,:,2) = [0.0000 0.0078 0.2157 0.0000 0.0980 0.0745 0.1922 0.2157 0.2157 0.0902 0.2000 0.1961 0.1059 0.2039 0.1882 0.2078 - 0.2078 0.0784 0.2000 0.0000 0.0118 0.2118 0.0157 0.2039 0.0078 0.1137 0.0314 0.0196 0.2118 0.1804 0.1373 0.2078 - 0.1765 0.1725 0.0941 0.1333 0.1451 0.0275 0.0863 0.0902 0.2078 0.2078 0.1529 0.0039 0.0431 0.0941 0.2039 0.0667 - 0.1098 0.1725 0.0157 0.1804 0.0784 0.1137 0.0824 0.1333 0.1412 0.2000 0.1882 0.2000 0.1333 0.1569 0.1176 0.0275 - 0.0471 0.0353 0.1216 0.0196 0.0588 0.1922 0.1882 0.1255 0.0510 0.0824 0.1451 0.2039 0.1686 0.1647 0.0392 0.0392 - 0.2157 0.0706 0.0863 0.1686 0.1020 0.1490 0.1529 0.0431 0.0039 0.1569 0.1804 0.1255 0.0235 0.0078 0.2000 0.0549 - 0.0627 0.0627 0.0824 0.1647 0.1020 0.1843 0.0588 0.0745 0.1020 0.0784 0.0157 0.0980 0.0784 0.2157 1.0000 0.7137 - 0.9843 0.4980 0.9961 0.2235 0.2196 0.5412 0.6980 0.3843 0.3373 0.3569 0.6824 0.5922 0.7843 0.6000 0.2902 0.2706 - 0.8510 0.8588 0.2471 0.8549 0.8667 0.2627 0.4980 0.4784 0.9843 0.9490 0.4745 0.2235 0.9451 0.8627 0.2824 0.7333 - 0.2941 0.2784 0.9529 0.2667 0.3490 0.9569 0.8510 0.3490 0.3333 0.5451 0.2275 0.7412 0.7608 0.8549 0.8471 0.9922 - 0.3255 0.7686 0.9725 0.3176 0.8000 0.7255 0.3098 0.6627 0.3725 0.9647 0.8627 0.2314 0.9804 0.7529 0.6745 0.8235 - 0.7451 0.7765 0.6235 0.9961 0.3020 0.2431 0.2510 0.6314 0.8392 0.9098 0.3608 0.4000 0.2196 0.8902 0.7490 0.8078 - 0.6549 0.8353 0.3294 0.3137 0.3412 0.9373 0.3255 0.2588 0.2980 0.3059 0.3686 0.7843 0.3020 0.9255 0.8157 0.9176 - 0.2745 0.4275 0.5686 0.6980 0.3569 0.6039 0.4863 0.2627 0.3647 0.2392 0.5137 0.9922 0.6863 0.7216 0.4706 0.6196 - 0.3882 0.3765 0.7882 0.6471 0.4588 0.8275 0.4157 0.6118 0.4431 0.7059 0.6902 0.5255 0.8980 0.5569 0.5412 0.8824 - 0.5333 0.6392 0.7098 0.4078 0.8039 0.2314 0.4549 0.5804 0.4392 0.9647 0.5059 0.5529 0.3373 0.5882 0.5961 0.6784]; - -cmap(:,:,3) = [0.0000 0.0157 0.4980 0.0039 0.2314 0.1725 0.4627 0.5020 0.5020 0.2196 0.4745 0.4706 0.2510 0.4784 0.4510 0.4980 - 0.4941 0.1882 0.4667 0.0000 0.0275 0.4941 0.0353 0.4902 0.0196 0.2667 0.0745 0.0471 0.4902 0.4314 0.3294 0.4784 - 0.4196 0.4000 0.2235 0.3216 0.3412 0.0627 0.2039 0.2118 0.4863 0.4863 0.3608 0.0078 0.1020 0.2196 0.4824 0.1569 - 0.2588 0.4118 0.0392 0.4235 0.1843 0.2745 0.1882 0.3059 0.3373 0.4784 0.4392 0.4627 0.3137 0.3765 0.2824 0.0667 - 0.1137 0.0824 0.2863 0.0510 0.1373 0.4510 0.4471 0.2941 0.1216 0.1961 0.3490 0.4824 0.3961 0.3804 0.0902 0.0941 - 0.4980 0.1647 0.2000 0.4000 0.2431 0.3529 0.3647 0.1059 0.0118 0.3686 0.4196 0.3020 0.0549 0.0196 0.4824 0.1294 - 0.1451 0.1529 0.1922 0.3882 0.2392 0.4353 0.1412 0.1765 0.2353 0.1804 0.0353 0.2275 0.1843 0.5059 1.0000 0.8196 - 0.9882 0.6863 0.9961 0.5098 0.5098 0.7137 0.8118 0.6118 0.5843 0.5922 0.8000 0.7412 0.8627 0.7451 0.5529 0.5412 - 0.9059 0.9137 0.5255 0.9098 0.9176 0.5333 0.6824 0.6706 0.9922 0.9686 0.6706 0.5098 0.9647 0.9137 0.5490 0.8314 - 0.5569 0.5451 0.9725 0.5373 0.5922 0.9725 0.9059 0.5882 0.5804 0.7137 0.5137 0.8353 0.8510 0.9059 0.9020 0.9961 - 0.5725 0.8549 0.9843 0.5725 0.8745 0.8275 0.5647 0.7882 0.6039 0.9765 0.9137 0.5176 0.9882 0.8431 0.7961 0.8863 - 0.8392 0.8588 0.7647 1.0000 0.5608 0.5216 0.5294 0.7686 0.8980 0.9412 0.6000 0.6235 0.5059 0.9333 0.8431 0.8784 - 0.7804 0.8941 0.5765 0.5686 0.5843 0.9608 0.5765 0.5333 0.5569 0.5647 0.6039 0.8627 0.5608 0.9569 0.8863 0.9490 - 0.5412 0.6392 0.7294 0.8078 0.5961 0.7490 0.6784 0.5373 0.6000 0.5216 0.6941 0.9922 0.8039 0.8235 0.6667 0.7608 - 0.6157 0.6078 0.8667 0.7765 0.6588 0.8902 0.6314 0.7569 0.6510 0.8157 0.8039 0.7020 0.9373 0.7216 0.7098 0.9255 - 0.7059 0.7725 0.8196 0.6314 0.8784 0.5137 0.6549 0.7373 0.6471 0.9804 0.6902 0.7176 0.5804 0.7412 0.7451 0.8000]; - -%% -[cdata, cmap] = imread('onenote.png'); \ No newline at end of file diff --git a/DipolarGasSimulator/+Helper/parforNotifications.m b/DipolarGasSimulator/+Helper/parforNotifications.m deleted file mode 100644 index 4ad3af4..0000000 --- a/DipolarGasSimulator/+Helper/parforNotifications.m +++ /dev/null @@ -1,148 +0,0 @@ -% Copyright (c) 2019 Andrea Alberti -% -% All rights reserved. -classdef parforNotifications < handle - properties - N; % number of iterations - text = 'Please wait ...'; % text to show - width = 50; - showWarning = true; - end - properties (GetAccess = public, SetAccess = private) - n; - end - properties (Access = private) - inProgress = false; - percent; - DataQueue; - usePercent; - Nstr; - NstrL; - lastComment; - end - methods - function this = parforNotifications() - this.DataQueue = parallel.pool.DataQueue; - afterEach(this.DataQueue, @this.updateStatus); - end - % Start progress bar - function PB_start(this,N,varargin) - assert(isscalar(N) && isnumeric(N) && N == floor(N) && N>0, 'Error: ''N'' must be a scalar positive integer.'); - - this.N = N; - - p = inputParser; - addParameter(p,'message','Please wait: '); - addParameter(p,'usePercentage',true); - - parse(p,varargin{:}); - - this.text = p.Results.message; - assert(ischar(this.text), 'Error: ''Message'' must be a string.'); - - this.usePercent = p.Results.usePercentage; - assert(isscalar(this.usePercent) && islogical(this.usePercent), 'Error: ''usePercentage'' must be a logical scalar.'); - - this.percent = 0; - this.n = 0; - this.lastComment = ''; - if this.usePercent - fprintf('%s [%s]: %3d%%\n',this.text, char(32*ones(1,this.width)),0); - else - this.Nstr = sprintf('%d',this.N); - this.NstrL = numel(this.Nstr); - fprintf('%s [%s]: %s/%s\n',this.text, char(32*ones(1,this.width)),[char(32*ones(1,this.NstrL-1)),'0'],this.Nstr); - end - - this.inProgress = true; - end - % Iterate progress bar - function PB_iterate(this,str) - if nargin == 1 - send(this.DataQueue,''); - else - send(this.DataQueue,str); - end - end - function warning(this,warn_id,msg) - if this.showWarning - msg = struct('Action','Warning','Id',warn_id,'Message',msg); - send(this.DataQueue,msg); - end - end - function PB_reprint(this) - p = round(100*this.n/this.N); - - this.percent = p; - - cursor_pos=1+round((this.width-1)*p/100); - - if p < 100 - sep_char = '|'; - else - sep_char = '.'; - end - - if this.usePercent - fprintf('%s [%s%s%s]: %3d%%\n', this.text, char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),p); - else - nstr=sprintf('%d',this.n); - fprintf('%s [%s%s%s]: %s/%s\n', this.text, char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),[char(32*ones(1,this.NstrL-numel(nstr))),nstr],this.Nstr); - end - end - function updateStatus(this,data) - - if ischar(data) - - this.n = this.n + 1; - - p = round(100*this.n/this.N); - - if p >= this.percent+1 || this.n == this.N - this.percent = p; - - cursor_pos=1+round((this.width-1)*p/100); - - if p < 100 - sep_char = '|'; - else - sep_char = '.'; - end - - if ~isempty(data) - comment = [' (',data,')']; - else - comment = ''; - end - - if this.usePercent - fprintf('%s%s%s%s]: %3d%%%s\n',char(8*ones(1,58+numel(this.lastComment))), char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),p,comment); - else - nstr=sprintf('%d',this.n); - fprintf('%s%s%s%s]: %s/%s%s\n',char(8*ones(1,55+2*numel(this.Nstr)+numel(this.lastComment))), char(46*ones(1,cursor_pos-1)), sep_char, char(32*ones(1,this.width-cursor_pos)),[char(32*ones(1,this.NstrL-numel(nstr))),nstr],this.Nstr,comment) - end - - this.lastComment = comment; - - - if p == 100 - this.inProgress = false; - end - end - - else - switch data.Action - case 'Warning' - warning(data.Id,[data.Message,newline]); - if this.inProgress - this.PB_reprint(); - end - end - - end - - end - end -end - - diff --git a/DipolarGasSimulator/+Helper/screencapture.m b/DipolarGasSimulator/+Helper/screencapture.m deleted file mode 100644 index 206312e..0000000 --- a/DipolarGasSimulator/+Helper/screencapture.m +++ /dev/null @@ -1,820 +0,0 @@ -function imageData = screencapture(varargin) -% screencapture - get a screen-capture of a figure frame, component handle, or screen area rectangle -% -% ScreenCapture gets a screen-capture of any Matlab GUI handle (including desktop, -% figure, axes, image or uicontrol), or a specified area rectangle located relative to -% the specified handle. Screen area capture is possible by specifying the root (desktop) -% handle (=0). The output can be either to an image file or to a Matlab matrix (useful -% for displaying via imshow() or for further processing) or to the system clipboard. -% This utility also enables adding a toolbar button for easy interactive screen-capture. -% -% Syntax: -% imageData = screencapture(handle, position, target, 'PropName',PropValue, ...) -% -% Input Parameters: -% handle - optional handle to be used for screen-capture origin. -% If empty/unsupplied then current figure (gcf) will be used. -% position - optional position array in pixels: [x,y,width,height]. -% If empty/unsupplied then the handle's position vector will be used. -% If both handle and position are empty/unsupplied then the position -% will be retrieved via interactive mouse-selection. -% If handle is an image, then position is in data (not pixel) units, so the -% captured region remains the same after figure/axes resize (like imcrop) -% target - optional filename for storing the screen-capture, or the -% 'clipboard'/'printer' strings. -% If empty/unsupplied then no output to file will be done. -% The file format will be determined from the extension (JPG/PNG/...). -% Supported formats are those supported by the imwrite function. -% 'PropName',PropValue - -% optional list of property pairs (e.g., 'target','myImage.png','pos',[10,20,30,40],'handle',gca) -% PropNames may be abbreviated and are case-insensitive. -% PropNames may also be given in whichever order. -% Supported PropNames are: -% - 'handle' (default: gcf handle) -% - 'position' (default: gcf position array) -% - 'target' (default: '') -% - 'toolbar' (figure handle; default: gcf) -% this adds a screen-capture button to the figure's toolbar -% If this parameter is specified, then no screen-capture -% will take place and the returned imageData will be []. -% -% Output parameters: -% imageData - image data in a format acceptable by the imshow function -% If neither target nor imageData were specified, the user will be -% asked to interactively specify the output file. -% -% Examples: -% imageData = screencapture; % interactively select screen-capture rectangle -% imageData = screencapture(hListbox); % capture image of a uicontrol -% imageData = screencapture(0, [20,30,40,50]); % capture a small desktop region -% imageData = screencapture(gcf,[20,30,40,50]); % capture a small figure region -% imageData = screencapture(gca,[10,20,30,40]); % capture a small axes region -% imshow(imageData); % display the captured image in a matlab figure -% imwrite(imageData,'myImage.png'); % save the captured image to file -% img = imread('cameraman.tif'); -% hImg = imshow(img); -% screencapture(hImg,[60,35,140,80]); % capture a region of an image -% screencapture(gcf,[],'myFigure.jpg'); % capture the entire figure into file -% screencapture(gcf,[],'clipboard'); % capture the entire figure into clipboard -% screencapture(gcf,[],'printer'); % print the entire figure -% screencapture('handle',gcf,'target','myFigure.jpg'); % same as previous, save to file -% screencapture('handle',gcf,'target','clipboard'); % same as previous, copy to clipboard -% screencapture('handle',gcf,'target','printer'); % same as previous, send to printer -% screencapture('toolbar',gcf); % adds a screen-capture button to gcf's toolbar -% screencapture('toolbar',[],'target','sc.bmp'); % same with default output filename -% -% Technical description: -% http://UndocumentedMatlab.com/blog/screencapture-utility/ -% -% Bugs and suggestions: -% Please send to Yair Altman (altmany at gmail dot com) -% -% See also: -% imshow, imwrite, print -% -% Release history: -% 1.17 2016-05-16: Fix annoying warning about JavaFrame property becoming obsolete someday (yes, we know...) -% 1.16 2016-04-19: Fix for deployed application suggested by Dwight Bartholomew -% 1.10 2014-11-25: Added the 'print' target -% 1.9 2014-11-25: Fix for saving GIF files -% 1.8 2014-11-16: Fixes for R2014b -% 1.7 2014-04-28: Fixed bug when capturing interactive selection -% 1.6 2014-04-22: Only enable image formats when saving to an unspecified file via uiputfile -% 1.5 2013-04-18: Fixed bug in capture of non-square image; fixes for Win64 -% 1.4 2013-01-27: Fixed capture of Desktop (root); enabled rbbox anywhere on desktop (not necesarily in a Matlab figure); enabled output to clipboard (based on Jiro Doke's imclipboard utility); edge-case fixes; added Java compatibility check -% 1.3 2012-07-23: Capture current object (uicontrol/axes/figure) if w=h=0 (e.g., by clicking a single point); extra input args sanity checks; fix for docked windows and image axes; include axes labels & ticks by default when capturing axes; use data-units position vector when capturing images; many edge-case fixes -% 1.2 2011-01-16: another performance boost (thanks to Jan Simon); some compatibility fixes for Matlab 6.5 (untested) -% 1.1 2009-06-03: Handle missing output format; performance boost (thanks to Urs); fix minor root-handle bug; added toolbar button option -% 1.0 2009-06-02: First version posted on MathWorks File Exchange - -% License to use and modify this code is granted freely to all interested, as long as the original author is -% referenced and attributed as such. The original author maintains the right to be solely associated with this work. - -% Programmed and Copyright by Yair M. Altman: altmany(at)gmail.com -% $Revision: 1.17 $ $Date: 2016/05/16 17:59:36 $ - - % Ensure that java awt is enabled... - if ~usejava('awt') - error('YMA:screencapture:NeedAwt','ScreenCapture requires Java to run.'); - end - - % Ensure that our Java version supports the Robot class (requires JVM 1.3+) - try - robot = java.awt.Robot; %#ok - catch - uiwait(msgbox({['Your Matlab installation is so old that its Java engine (' version('-java') ... - ') does not have a java.awt.Robot class. '], ' ', ... - 'Without this class, taking a screen-capture is impossible.', ' ', ... - 'So, either install JVM 1.3 or higher, or use a newer Matlab release.'}, ... - 'ScreenCapture', 'warn')); - if nargout, imageData = []; end - return; - end - - % Process optional arguments - paramsStruct = processArgs(varargin{:}); - - % If toolbar button requested, add it and exit - if ~isempty(paramsStruct.toolbar) - - % Add the toolbar button - addToolbarButton(paramsStruct); - - % Return the figure to its pre-undocked state (when relevant) - redockFigureIfRelevant(paramsStruct); - - % Exit immediately (do NOT take a screen-capture) - if nargout, imageData = []; end - return; - end - - % Convert position from handle-relative to desktop Java-based pixels - [paramsStruct, msgStr] = convertPos(paramsStruct); - - % Capture the requested screen rectangle using java.awt.Robot - imgData = getScreenCaptureImageData(paramsStruct.position); - - % Return the figure to its pre-undocked state (when relevant) - redockFigureIfRelevant(paramsStruct); - - % Save image data in file or clipboard, if specified - if ~isempty(paramsStruct.target) - if strcmpi(paramsStruct.target,'clipboard') - if ~isempty(imgData) - imclipboard(imgData); - else - msgbox('No image area selected - not copying image to clipboard','ScreenCapture','warn'); - end - elseif strncmpi(paramsStruct.target,'print',5) % 'print' or 'printer' - if ~isempty(imgData) - hNewFig = figure('visible','off'); - imshow(imgData); - print(hNewFig); - delete(hNewFig); - else - msgbox('No image area selected - not printing screenshot','ScreenCapture','warn'); - end - else % real filename - if ~isempty(imgData) - imwrite(imgData,paramsStruct.target); - else - msgbox(['No image area selected - not saving image file ' paramsStruct.target],'ScreenCapture','warn'); - end - end - end - - % Return image raster data to user, if requested - if nargout - imageData = imgData; - - % If neither output formats was specified (neither target nor output data) - elseif isempty(paramsStruct.target) & ~isempty(imgData) %#ok ML6 - % Ask the user to specify a file - %error('YMA:screencapture:noOutput','No output specified for ScreenCapture: specify the output filename and/or output data'); - %format = '*.*'; - formats = imformats; - for idx = 1 : numel(formats) - ext = sprintf('*.%s;',formats(idx).ext{:}); - format(idx,1:2) = {ext(1:end-1), formats(idx).description}; %#ok - end - [filename,pathname] = uiputfile(format,'Save screen capture as'); - if ~isequal(filename,0) & ~isequal(pathname,0) %#ok Matlab6 compatibility - try - filename = fullfile(pathname,filename); - imwrite(imgData,filename); - catch % possibly a GIF file that requires indexed colors - [imgData,map] = rgb2ind(imgData,256); - imwrite(imgData,map,filename); - end - else - % TODO - copy to clipboard - end - end - - % Display msgStr, if relevant - if ~isempty(msgStr) - uiwait(msgbox(msgStr,'ScreenCapture')); - drawnow; pause(0.05); % time for the msgbox to disappear - end - - return; % debug breakpoint - -%% Process optional arguments -function paramsStruct = processArgs(varargin) - - % Get the properties in either direct or P-V format - [regParams, pvPairs] = parseparams(varargin); - - % Now process the optional P-V params - try - % Initialize - paramName = []; - paramsStruct = []; - paramsStruct.handle = []; - paramsStruct.position = []; - paramsStruct.target = ''; - paramsStruct.toolbar = []; - paramsStruct.wasDocked = 0; % no false available in ML6 - paramsStruct.wasInteractive = 0; % no false available in ML6 - - % Parse the regular (non-named) params in recption order - if ~isempty(regParams) & (isempty(regParams{1}) | ishandle(regParams{1}(1))) %#ok ML6 - paramsStruct.handle = regParams{1}; - regParams(1) = []; - end - if ~isempty(regParams) & isnumeric(regParams{1}) & (length(regParams{1}) == 4) %#ok ML6 - paramsStruct.position = regParams{1}; - regParams(1) = []; - end - if ~isempty(regParams) & ischar(regParams{1}) %#ok ML6 - paramsStruct.target = regParams{1}; - end - - % Parse the optional param PV pairs - supportedArgs = {'handle','position','target','toolbar'}; - while ~isempty(pvPairs) - - % Disregard empty propNames (may be due to users mis-interpretting the syntax help) - while ~isempty(pvPairs) & isempty(pvPairs{1}) %#ok ML6 - pvPairs(1) = []; - end - if isempty(pvPairs) - break; - end - - % Ensure basic format is valid - paramName = ''; - if ~ischar(pvPairs{1}) - error('YMA:screencapture:invalidProperty','Invalid property passed to ScreenCapture'); - elseif length(pvPairs) == 1 - if isempty(paramsStruct.target) - paramsStruct.target = pvPairs{1}; - break; - else - error('YMA:screencapture:noPropertyValue',['No value specified for property ''' pvPairs{1} '''']); - end - end - - % Process parameter values - paramName = pvPairs{1}; - if strcmpi(paramName,'filename') % backward compatibility - paramName = 'target'; - end - paramValue = pvPairs{2}; - pvPairs(1:2) = []; - idx = find(strncmpi(paramName,supportedArgs,length(paramName))); - if ~isempty(idx) - %paramsStruct.(lower(supportedArgs{idx(1)})) = paramValue; % incompatible with ML6 - paramsStruct = setfield(paramsStruct, lower(supportedArgs{idx(1)}), paramValue); %#ok ML6 - - % If 'toolbar' param specified, then it cannot be left empty - use gcf - if strncmpi(paramName,'toolbar',length(paramName)) & isempty(paramsStruct.toolbar) %#ok ML6 - paramsStruct.toolbar = getCurrentFig; - end - - elseif isempty(paramsStruct.target) - paramsStruct.target = paramName; - pvPairs = {paramValue, pvPairs{:}}; %#ok (more readable this way, although a bit less efficient...) - - else - supportedArgsStr = sprintf('''%s'',',supportedArgs{:}); - error('YMA:screencapture:invalidProperty','%s \n%s', ... - 'Invalid property passed to ScreenCapture', ... - ['Supported property names are: ' supportedArgsStr(1:end-1)]); - end - end % loop pvPairs - - catch - if ~isempty(paramName), paramName = [' ''' paramName '''']; end - error('YMA:screencapture:invalidProperty','Error setting ScreenCapture property %s:\n%s',paramName,lasterr); %#ok - end -%end % processArgs - -%% Convert position from handle-relative to desktop Java-based pixels -function [paramsStruct, msgStr] = convertPos(paramsStruct) - msgStr = ''; - try - % Get the screen-size for later use - screenSize = get(0,'ScreenSize'); - - % Get the containing figure's handle - hParent = paramsStruct.handle; - if isempty(paramsStruct.handle) - paramsStruct.hFigure = getCurrentFig; - hParent = paramsStruct.hFigure; - else - paramsStruct.hFigure = ancestor(paramsStruct.handle,'figure'); - end - - % To get the acurate pixel position, the figure window must be undocked - try - if strcmpi(get(paramsStruct.hFigure,'WindowStyle'),'docked') - set(paramsStruct.hFigure,'WindowStyle','normal'); - drawnow; pause(0.25); - paramsStruct.wasDocked = 1; % no true available in ML6 - end - catch - % never mind - ignore... - end - - % The figure (if specified) must be in focus - if ~isempty(paramsStruct.hFigure) & ishandle(paramsStruct.hFigure) %#ok ML6 - isFigureValid = 1; % no true available in ML6 - figure(paramsStruct.hFigure); - else - isFigureValid = 0; % no false available in ML6 - end - - % Flush all graphic events to ensure correct rendering - drawnow; pause(0.01); - - % No handle specified - wasPositionGiven = 1; % no true available in ML6 - if isempty(paramsStruct.handle) - - % Set default handle, if not supplied - paramsStruct.handle = paramsStruct.hFigure; - - % If position was not specified, get it interactively using RBBOX - if isempty(paramsStruct.position) - [paramsStruct.position, jFrameUsed, msgStr] = getInteractivePosition(paramsStruct.hFigure); %#ok jFrameUsed is unused - paramsStruct.wasInteractive = 1; % no true available in ML6 - wasPositionGiven = 0; % no false available in ML6 - end - - elseif ~ishandle(paramsStruct.handle) - % Handle was supplied - ensure it is a valid handle - error('YMA:screencapture:invalidHandle','Invalid handle passed to ScreenCapture'); - - elseif isempty(paramsStruct.position) - % Handle was supplied but position was not, so use the handle's position - paramsStruct.position = getPixelPos(paramsStruct.handle); - paramsStruct.position(1:2) = 0; - wasPositionGiven = 0; % no false available in ML6 - - elseif ~isnumeric(paramsStruct.position) | (length(paramsStruct.position) ~= 4) %#ok ML6 - % Both handle & position were supplied - ensure a valid pixel position vector - error('YMA:screencapture:invalidPosition','Invalid position vector passed to ScreenCapture: \nMust be a [x,y,w,h] numeric pixel array'); - end - - % Capture current object (uicontrol/axes/figure) if w=h=0 (single-click in interactive mode) - if paramsStruct.position(3)<=0 | paramsStruct.position(4)<=0 %#ok ML6 - %TODO - find a way to single-click another Matlab figure (the following does not work) - %paramsStruct.position = getPixelPos(ancestor(hittest,'figure')); - paramsStruct.position = getPixelPos(paramsStruct.handle); - paramsStruct.position(1:2) = 0; - paramsStruct.wasInteractive = 0; % no false available in ML6 - wasPositionGiven = 0; % no false available in ML6 - end - - % First get the parent handle's desktop-based Matlab pixel position - parentPos = [0,0,0,0]; - dX = 0; - dY = 0; - dW = 0; - dH = 0; - if ~isFigure(hParent) - % Get the reguested component's pixel position - parentPos = getPixelPos(hParent, 1); % no true available in ML6 - - % Axes position inaccuracy estimation - deltaX = 3; - deltaY = -1; - - % Fix for images - if isImage(hParent) % | (isAxes(hParent) & strcmpi(get(hParent,'YDir'),'reverse')) %#ok ML6 - - % Compensate for resized image axes - hAxes = get(hParent,'Parent'); - if all(get(hAxes,'DataAspectRatio')==1) % sanity check: this is the normal behavior - % Note 18/4/2013: the following fails for non-square images - %actualImgSize = min(parentPos(3:4)); - %dX = (parentPos(3) - actualImgSize) / 2; - %dY = (parentPos(4) - actualImgSize) / 2; - %parentPos(3:4) = actualImgSize; - - % The following should work for all types of images - actualImgSize = size(get(hParent,'CData')); - dX = (parentPos(3) - min(parentPos(3),actualImgSize(2))) / 2; - dY = (parentPos(4) - min(parentPos(4),actualImgSize(1))) / 2; - parentPos(3:4) = actualImgSize([2,1]); - %parentPos(3) = max(parentPos(3),actualImgSize(2)); - %parentPos(4) = max(parentPos(4),actualImgSize(1)); - end - - % Fix user-specified img positions (but not auto-inferred ones) - if wasPositionGiven - - % In images, use data units rather than pixel units - % Reverse the YDir - ymax = max(get(hParent,'YData')); - paramsStruct.position(2) = ymax - paramsStruct.position(2) - paramsStruct.position(4); - - % Note: it would be best to use hgconvertunits, but: - % ^^^^ (1) it fails on Matlab 6, and (2) it doesn't accept Data units - %paramsStruct.position = hgconvertunits(hFig, paramsStruct.position, 'Data', 'pixel', hParent); % fails! - xLims = get(hParent,'XData'); - yLims = get(hParent,'YData'); - xPixelsPerData = parentPos(3) / (diff(xLims) + 1); - yPixelsPerData = parentPos(4) / (diff(yLims) + 1); - paramsStruct.position(1) = round((paramsStruct.position(1)-xLims(1)) * xPixelsPerData); - paramsStruct.position(2) = round((paramsStruct.position(2)-yLims(1)) * yPixelsPerData + 2*dY); - paramsStruct.position(3) = round( paramsStruct.position(3) * xPixelsPerData); - paramsStruct.position(4) = round( paramsStruct.position(4) * yPixelsPerData); - - % Axes position inaccuracy estimation - if strcmpi(computer('arch'),'win64') - deltaX = 7; - deltaY = -7; - else - deltaX = 3; - deltaY = -3; - end - - else % axes/image position was auto-infered (entire image) - % Axes position inaccuracy estimation - if strcmpi(computer('arch'),'win64') - deltaX = 6; - deltaY = -6; - else - deltaX = 2; - deltaY = -2; - end - dW = -2*dX; - dH = -2*dY; - end - end - - %hFig = ancestor(hParent,'figure'); - hParent = paramsStruct.hFigure; - - elseif paramsStruct.wasInteractive % interactive figure rectangle - - % Compensate for 1px rbbox inaccuracies - deltaX = 2; - deltaY = -2; - - else % non-interactive figure - - % Compensate 4px figure boundaries = difference betweeen OuterPosition and Position - deltaX = -1; - deltaY = 1; - end - %disp(paramsStruct.position) % for debugging - - % Now get the pixel position relative to the monitor - figurePos = getPixelPos(hParent); - desktopPos = figurePos + parentPos; - - % Now convert to Java-based pixels based on screen size - % Note: multiple monitors are automatically handled correctly, since all - % ^^^^ Java positions are relative to the main monitor's top-left corner - javaX = desktopPos(1) + paramsStruct.position(1) + deltaX + dX; - javaY = screenSize(4) - desktopPos(2) - paramsStruct.position(2) - paramsStruct.position(4) + deltaY + dY; - width = paramsStruct.position(3) + dW; - height = paramsStruct.position(4) + dH; - paramsStruct.position = round([javaX, javaY, width, height]); - %paramsStruct.position - - % Ensure the figure is at the front so it can be screen-captured - if isFigureValid - figure(hParent); - drawnow; - pause(0.02); - end - catch - % Maybe root/desktop handle (root does not have a 'Position' prop so getPixelPos croaks - if isequal(double(hParent),0) % =root/desktop handle; handles case of hParent=[] - javaX = paramsStruct.position(1) - 1; - javaY = screenSize(4) - paramsStruct.position(2) - paramsStruct.position(4) - 1; - paramsStruct.position = [javaX, javaY, paramsStruct.position(3:4)]; - end - end -%end % convertPos - -%% Interactively get the requested capture rectangle -function [positionRect, jFrameUsed, msgStr] = getInteractivePosition(hFig) - msgStr = ''; - try - % First try the invisible-figure approach, in order to - % enable rbbox outside any existing figure boundaries - f = figure('units','pixel','pos',[-100,-100,10,10],'HitTest','off'); - drawnow; pause(0.01); - oldWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); - jf = get(handle(f),'JavaFrame'); - warning(oldWarn); - try - jWindow = jf.fFigureClient.getWindow; - catch - try - jWindow = jf.fHG1Client.getWindow; - catch - jWindow = jf.getFigurePanelContainer.getParent.getTopLevelAncestor; - end - end - com.sun.awt.AWTUtilities.setWindowOpacity(jWindow,0.05); %=nearly transparent (not fully so that mouse clicks are captured) - jWindow.setMaximized(1); % no true available in ML6 - jFrameUsed = 1; % no true available in ML6 - msg = {'Mouse-click and drag a bounding rectangle for screen-capture ' ... - ... %'or single-click any Matlab figure to capture the entire figure.' ... - }; - catch - % Something failed, so revert to a simple rbbox on a visible figure - try delete(f); drawnow; catch, end %Cleanup... - jFrameUsed = 0; % no false available in ML6 - msg = {'Mouse-click within any Matlab figure and then', ... - 'drag a bounding rectangle for screen-capture,', ... - 'or single-click to capture the entire figure'}; - end - uiwait(msgbox(msg,'ScreenCapture')); - - k = waitforbuttonpress; %#ok k is unused - %hFig = getCurrentFig; - %p1 = get(hFig,'CurrentPoint'); - positionRect = rbbox; - %p2 = get(hFig,'CurrentPoint'); - - if jFrameUsed - jFrameOrigin = getPixelPos(f); - delete(f); drawnow; - try - figOrigin = getPixelPos(hFig); - catch % empty/invalid hFig handle - figOrigin = [0,0,0,0]; - end - else - if isempty(hFig) - jFrameOrigin = getPixelPos(gcf); - else - jFrameOrigin = [0,0,0,0]; - end - figOrigin = [0,0,0,0]; - end - positionRect(1:2) = positionRect(1:2) + jFrameOrigin(1:2) - figOrigin(1:2); - - if prod(positionRect(3:4)) > 0 - msgStr = sprintf('%dx%d area captured',positionRect(3),positionRect(4)); - end -%end % getInteractivePosition - -%% Get current figure (even if its handle is hidden) -function hFig = getCurrentFig - oldState = get(0,'showHiddenHandles'); - set(0,'showHiddenHandles','on'); - hFig = get(0,'CurrentFigure'); - set(0,'showHiddenHandles',oldState); -%end % getCurrentFig - -%% Get ancestor figure - used for old Matlab versions that don't have a built-in ancestor() -function hObj = ancestor(hObj,type) - if ~isempty(hObj) & ishandle(hObj) %#ok for Matlab 6 compatibility - try - hObj = get(hObj,'Ancestor'); - catch - % never mind... - end - try - %if ~isa(handle(hObj),type) % this is best but always returns 0 in Matlab 6! - %if ~isprop(hObj,'type') | ~strcmpi(get(hObj,'type'),type) % no isprop() in ML6! - try - objType = get(hObj,'type'); - catch - objType = ''; - end - if ~strcmpi(objType,type) - try - parent = get(handle(hObj),'parent'); - catch - parent = hObj.getParent; % some objs have no 'Parent' prop, just this method... - end - if ~isempty(parent) % empty parent means root ancestor, so exit - hObj = ancestor(parent,type); - end - end - catch - % never mind... - end - end -%end % ancestor - -%% Get position of an HG object in specified units -function pos = getPos(hObj,field,units) - % Matlab 6 did not have hgconvertunits so use the old way... - oldUnits = get(hObj,'units'); - if strcmpi(oldUnits,units) % don't modify units unless we must! - pos = get(hObj,field); - else - set(hObj,'units',units); - pos = get(hObj,field); - set(hObj,'units',oldUnits); - end -%end % getPos - -%% Get pixel position of an HG object - for Matlab 6 compatibility -function pos = getPixelPos(hObj,varargin) - persistent originalObj - try - stk = dbstack; - if ~strcmp(stk(2).name,'getPixelPos') - originalObj = hObj; - end - - if isFigure(hObj) %| isAxes(hObj) - %try - pos = getPos(hObj,'OuterPosition','pixels'); - else %catch - % getpixelposition is unvectorized unfortunately! - pos = getpixelposition(hObj,varargin{:}); - - % add the axes labels/ticks if relevant (plus a tiny margin to fix 2px label/title inconsistencies) - if isAxes(hObj) & ~isImage(originalObj) %#ok ML6 - tightInsets = getPos(hObj,'TightInset','pixel'); - pos = pos + tightInsets.*[-1,-1,1,1] + [-1,1,1+tightInsets(1:2)]; - end - end - catch - try - % Matlab 6 did not have getpixelposition nor hgconvertunits so use the old way... - pos = getPos(hObj,'Position','pixels'); - catch - % Maybe the handle does not have a 'Position' prop (e.g., text/line/plot) - use its parent - pos = getPixelPos(get(hObj,'parent'),varargin{:}); - end - end - - % Handle the case of missing/invalid/empty HG handle - if isempty(pos) - pos = [0,0,0,0]; - end -%end % getPixelPos - -%% Adds a ScreenCapture toolbar button -function addToolbarButton(paramsStruct) - % Ensure we have a valid toolbar handle - hFig = ancestor(paramsStruct.toolbar,'figure'); - if isempty(hFig) - error('YMA:screencapture:badToolbar','the ''Toolbar'' parameter must contain a valid GUI handle'); - end - set(hFig,'ToolBar','figure'); - hToolbar = findall(hFig,'type','uitoolbar'); - if isempty(hToolbar) - error('YMA:screencapture:noToolbar','the ''Toolbar'' parameter must contain a figure handle possessing a valid toolbar'); - end - hToolbar = hToolbar(1); % just in case there are several toolbars... - use only the first - - % Prepare the camera icon - icon = ['3333333333333333'; ... - '3333333333333333'; ... - '3333300000333333'; ... - '3333065556033333'; ... - '3000000000000033'; ... - '3022222222222033'; ... - '3022220002222033'; ... - '3022203110222033'; ... - '3022201110222033'; ... - '3022204440222033'; ... - '3022220002222033'; ... - '3022222222222033'; ... - '3000000000000033'; ... - '3333333333333333'; ... - '3333333333333333'; ... - '3333333333333333']; - cm = [ 0 0 0; ... % black - 0 0.60 1; ... % light blue - 0.53 0.53 0.53; ... % light gray - NaN NaN NaN; ... % transparent - 0 0.73 0; ... % light green - 0.27 0.27 0.27; ... % gray - 0.13 0.13 0.13]; % dark gray - cdata = ind2rgb(uint8(icon-'0'),cm); - - % If the button does not already exit - hButton = findall(hToolbar,'Tag','ScreenCaptureButton'); - tooltip = 'Screen capture'; - if ~isempty(paramsStruct.target) - tooltip = [tooltip ' to ' paramsStruct.target]; - end - if isempty(hButton) - % Add the button with the icon to the figure's toolbar - hButton = uipushtool(hToolbar, 'CData',cdata, 'Tag','ScreenCaptureButton', 'TooltipString',tooltip, 'ClickedCallback',['screencapture(''' paramsStruct.target ''')']); %#ok unused - else - % Otherwise, simply update the existing button - set(hButton, 'CData',cdata, 'Tag','ScreenCaptureButton', 'TooltipString',tooltip, 'ClickedCallback',['screencapture(''' paramsStruct.target ''')']); - end -%end % addToolbarButton - -%% Java-get the actual screen-capture image data -function imgData = getScreenCaptureImageData(positionRect) - if isempty(positionRect) | all(positionRect==0) | positionRect(3)<=0 | positionRect(4)<=0 %#ok ML6 - imgData = []; - else - % Use java.awt.Robot to take a screen-capture of the specified screen area - rect = java.awt.Rectangle(positionRect(1), positionRect(2), positionRect(3), positionRect(4)); - robot = java.awt.Robot; - jImage = robot.createScreenCapture(rect); - - % Convert the resulting Java image to a Matlab image - % Adapted for a much-improved performance from: - % http://www.mathworks.com/support/solutions/data/1-2WPAYR.html - h = jImage.getHeight; - w = jImage.getWidth; - %imgData = zeros([h,w,3],'uint8'); - %pixelsData = uint8(jImage.getData.getPixels(0,0,w,h,[])); - %for i = 1 : h - % base = (i-1)*w*3+1; - % imgData(i,1:w,:) = deal(reshape(pixelsData(base:(base+3*w-1)),3,w)'); - %end - - % Performance further improved based on feedback from Urs Schwartz: - %pixelsData = reshape(typecast(jImage.getData.getDataStorage,'uint32'),w,h).'; - %imgData(:,:,3) = bitshift(bitand(pixelsData,256^1-1),-8*0); - %imgData(:,:,2) = bitshift(bitand(pixelsData,256^2-1),-8*1); - %imgData(:,:,1) = bitshift(bitand(pixelsData,256^3-1),-8*2); - - % Performance even further improved based on feedback from Jan Simon: - pixelsData = reshape(typecast(jImage.getData.getDataStorage, 'uint8'), 4, w, h); - imgData = cat(3, ... - transpose(reshape(pixelsData(3, :, :), w, h)), ... - transpose(reshape(pixelsData(2, :, :), w, h)), ... - transpose(reshape(pixelsData(1, :, :), w, h))); - end -%end % getInteractivePosition - -%% Return the figure to its pre-undocked state (when relevant) -function redockFigureIfRelevant(paramsStruct) - if paramsStruct.wasDocked - try - set(paramsStruct.hFigure,'WindowStyle','docked'); - %drawnow; - catch - % never mind - ignore... - end - end -%end % redockFigureIfRelevant - -%% Copy screen-capture to the system clipboard -% Adapted from http://www.mathworks.com/matlabcentral/fileexchange/28708-imclipboard/content/imclipboard.m -function imclipboard(imgData) - % Import necessary Java classes - import java.awt.Toolkit.* - import java.awt.image.BufferedImage - import java.awt.datatransfer.DataFlavor - - % Add the necessary Java class (ImageSelection) to the Java classpath - if ~exist('ImageSelection', 'class') - % Obtain the directory of the executable (or of the M-file if not deployed) - %javaaddpath(fileparts(which(mfilename)), '-end'); - if isdeployed % Stand-alone mode. - [status, result] = system('path'); %#ok - MatLabFilePath = char(regexpi(result, 'Path=(.*?);', 'tokens', 'once')); - else % MATLAB mode. - MatLabFilePath = fileparts(mfilename('fullpath')); - end - javaaddpath(MatLabFilePath, '-end'); - end - - % Get System Clipboard object (java.awt.Toolkit) - cb = getDefaultToolkit.getSystemClipboard; % can't use () in ML6! - - % Get image size - ht = size(imgData, 1); - wd = size(imgData, 2); - - % Convert to Blue-Green-Red format - imgData = imgData(:, :, [3 2 1]); - - % Convert to 3xWxH format - imgData = permute(imgData, [3, 2, 1]); - - % Append Alpha data (not used) - imgData = cat(1, imgData, 255*ones(1, wd, ht, 'uint8')); - - % Create image buffer - imBuffer = BufferedImage(wd, ht, BufferedImage.TYPE_INT_RGB); - imBuffer.setRGB(0, 0, wd, ht, typecast(imgData(:), 'int32'), 0, wd); - - % Create ImageSelection object - % % custom java class - imSelection = ImageSelection(imBuffer); - - % Set clipboard content to the image - cb.setContents(imSelection, []); -%end %imclipboard - -%% Is the provided handle a figure? -function flag = isFigure(hObj) - flag = isa(handle(hObj),'figure') | isa(hObj,'matlab.ui.Figure'); -%end %isFigure - -%% Is the provided handle an axes? -function flag = isAxes(hObj) - flag = isa(handle(hObj),'axes') | isa(hObj,'matlab.graphics.axis.Axes'); -%end %isFigure - -%% Is the provided handle an image? -function flag = isImage(hObj) - flag = isa(handle(hObj),'image') | isa(hObj,'matlab.graphics.primitive.Image'); -%end %isFigure - -%%%%%%%%%%%%%%%%%%%%%%%%%% TODO %%%%%%%%%%%%%%%%%%%%%%%%% -% find a way in interactive-mode to single-click another Matlab figure for screen-capture \ No newline at end of file diff --git a/DipolarGasSimulator/+Plotter/LivePlot.m b/DipolarGasSimulator/+Plotter/LivePlot.m deleted file mode 100644 index 1e3abb3..0000000 --- a/DipolarGasSimulator/+Plotter/LivePlot.m +++ /dev/null @@ -1,47 +0,0 @@ -function LPlot = LivePlot(psi,Params,Transf,Observ) - set(0,'defaulttextInterpreter','latex') - set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex'); - - format long - x = Transf.x*Params.l0*1e6; - y = Transf.y*Params.l0*1e6; - z = Transf.z*Params.l0*1e6; - %percentcomplete = linspace(0,1,Params.cut_off/200); - - dx = x(2)-x(1); dy = y(2)-y(1); dz = z(2)-z(1); - - %Plotting - - subplot(2,3,1) - n = abs(psi).^2; - nxz = squeeze(trapz(n*dy,2)); - nyz = squeeze(trapz(n*dx,1)); - nxy = squeeze(trapz(n*dz,3)); - - plotxz = pcolor(x,z,nxz'); - set(plotxz, 'EdgeColor', 'none'); - xlabel('$x$ [$\mu$m]'); ylabel('$z$ [$\mu$m]'); - - subplot(2,3,2) - plotyz = pcolor(y,z,nyz'); - set(plotyz, 'EdgeColor', 'none'); - xlabel('$y$ [$\mu$m]'); ylabel('$z$ [$\mu$m]'); - - subplot(2,3,3) - plotxy = pcolor(x,y,nxy'); - set(plotxy, 'EdgeColor', 'none'); - xlabel('$x$ [$\mu$m]'); ylabel('$y$ [$\mu$m]'); - - subplot(2,3,4) - plot(-log10(Observ.residual),'-b') - ylabel('$-\mathrm{log}_{10}(r)$'); xlabel('steps'); - - subplot(2,3,5) - plot(Observ.EVec,'-b') - ylabel('$E$'); xlabel('steps'); - - subplot(2,3,6) - plot(Observ.mucVec,'-b') - ylabel('$\mu$'); xlabel('steps'); -% xlim([0,1]); ylim([0,8]); -% xlim([0,1]); ylim([0,8]); diff --git a/DipolarGasSimulator/+Plotter/MakeMovie.m b/DipolarGasSimulator/+Plotter/MakeMovie.m deleted file mode 100644 index 8842cbd..0000000 --- a/DipolarGasSimulator/+Plotter/MakeMovie.m +++ /dev/null @@ -1,77 +0,0 @@ -set(0,'defaulttextInterpreter','latex') -set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex'); - -RunIdx = 1; - -FileDir = dir(sprintf('./Data/Run_%03i/TimeEvolution/*.mat',RunIdx)); -NumFiles = numel(FileDir); -QuenchSettings = load(sprintf('./Data/Run_%03i/QuenchSettings',RunIdx),'Quench','Params','Transf','VDk','V'); -Transf = QuenchSettings.Transf; Params = QuenchSettings.Params; -x = Transf.x; y = Transf.y; z = Transf.z; -dx = x(2)-x(1); dy = y(2)-y(1); dz = z(2)-z(1); - -mkdir(sprintf('./Data/Run_%03i/Figures',RunIdx)) -outputVideo = VideoWriter(fullfile('./Data/Movie.avi')); -outputVideo.FrameRate = 10; -open(outputVideo) - -figure(1); -x0 = 800; -y0 = 200; -width = 800; -height = 600; -set(gcf,'position',[x0,y0,width,height]) - -EVecTemp = []; - -for ii = 2:(NumFiles-1) - load(sprintf('./Data/Run_%03i/TimeEvolution/psi_%i.mat',RunIdx,ii),'psi','muchem','T','Observ','t_idx'); - - %Plotting - subplot(2,3,1) - n = abs(psi).^2; - nxz = squeeze(trapz(n*dy,2)); - nyz = squeeze(trapz(n*dx,1)); - nxy = squeeze(trapz(n*dz,3)); - - plotxz = pcolor(x,z,nxz'); shading interp - set(plotxz, 'EdgeColor', 'none'); - xlabel('$x$ [$\mu$m]'); ylabel('$z$ [$\mu$m]'); - - subplot(2,3,2) - plotyz = pcolor(y,z,nyz'); shading interp - set(plotyz, 'EdgeColor', 'none'); - xlabel('$y$ [$\mu$m]'); ylabel('$z$ [$\mu$m]'); - - subplot(2,3,3) - plotxy = pcolor(x,y,nxy'); shading interp - set(plotxy, 'EdgeColor', 'none'); - xlabel('$x$ [$\mu$m]'); ylabel('$y$ [$\mu$m]'); - - subplot(2,3,4) - plot(Observ.tVecPlot*1000/Params.w0,Observ.NormVec,'-b') - ylabel('Normalization'); xlabel('$t$ [$m$s]'); - - subplot(2,3,5) - plot(Observ.tVecPlot*1000/Params.w0,1-2*Observ.PCVec/pi,'-b') - ylabel('Coherence'); xlabel('$t$ [$m$s]'); - ylim([0,1]) - - subplot(2,3,6) - plot(Observ.tVecPlot*1000/Params.w0,Observ.EVec,'-b') - ylabel('E'); xlabel('$t$ [$m$s]'); - - tVal = Observ.tVecPlot(end)*1000/Params.w0; - sgtitle(sprintf('$\\mu =%.3f \\hbar\\omega_0$, $T=%.1f$nK, $t=%.1f$ms',muchem,T,tVal)) - - drawnow - saveas(gcf,sprintf('./Data/Run_%03i/Figures/Image_%i.jpg',RunIdx,ii)) - img = imread(sprintf('./Data/Run_%03i/Figures/Image_%i.jpg',RunIdx,ii)); - writeVideo(outputVideo,img) -% hold off; - clf -end - -close(outputVideo) -close(figure(1)) -delete(sprintf('./Data/Run_%03i/Figures/*.jpg',RunIdx)) % deleting images after movie is made \ No newline at end of file diff --git a/DipolarGasSimulator/+Scripts/Analyze.m b/DipolarGasSimulator/+Scripts/Analyze.m deleted file mode 100644 index df85ab4..0000000 --- a/DipolarGasSimulator/+Scripts/Analyze.m +++ /dev/null @@ -1,50 +0,0 @@ - set(0,'defaulttextInterpreter','latex') - set(groot, 'defaultAxesTickLabelInterpreter','latex'); set(groot, 'defaultLegendInterpreter','latex'); - format long - - runIdx = 6; - - load(sprintf('./Data/Run_%03i/psi_gs.mat',runIdx),'psi','muchem','Observ','t_idx','Transf','Params','VDk','V'); - - x = Transf.x*Params.l0*1e6; - y = Transf.y*Params.l0*1e6; - z = Transf.z*Params.l0*1e6; - %percentcomplete = linspace(0,1,Params.cut_off/200); - - dx = x(2)-x(1); dy = y(2)-y(1); dz = z(2)-z(1); - %Plotting - subplot(2,3,1) - n = abs(psi).^2; - nxz = squeeze(trapz(n*dy,2)); - nyz = squeeze(trapz(n*dx,1)); - nxy = squeeze(trapz(n*dz,3)); - - plotxz = pcolor(x,z,nxz'); - set(plotxz, 'EdgeColor', 'none'); - xlabel('$x$ [$\mu$m]'); ylabel('$z$ [$\mu$m]'); - - subplot(2,3,2) - plotyz = pcolor(y,z,nyz'); - set(plotyz, 'EdgeColor', 'none'); - xlabel('$y$ [$\mu$m]'); ylabel('$z$ [$\mu$m]'); - - subplot(2,3,3) - plotxy = pcolor(x,y,nxy'); - set(plotxy, 'EdgeColor', 'none'); - xlabel('$x$ [$\mu$m]'); ylabel('$y$ [$\mu$m]'); - - subplot(2,3,4) - plot(-log10(Observ.residual),'-b') - ylabel('$-\mathrm{log}_{10}(r)$'); xlabel('steps'); - - subplot(2,3,5) - plot(Observ.EVec,'-b') - ylabel('$E$'); xlabel('steps'); - - subplot(2,3,6) - plot(Observ.mucVec,'-b') - ylabel('$\mu$'); xlabel('steps'); -% xlim([0,1]); ylim([0,8]); -% xlim([0,1]); ylim([0,8]); - - Ecomp = energy_components(psi,Params,Transf,VDk,V); diff --git a/DipolarGasSimulator/+Simulator/@Calculator/ChemicalPotential.m b/DipolarGasSimulator/+Simulator/@Calculator/ChemicalPotential.m deleted file mode 100644 index 697ab38..0000000 --- a/DipolarGasSimulator/+Simulator/@Calculator/ChemicalPotential.m +++ /dev/null @@ -1,28 +0,0 @@ -function muchem = ChemicalPotential(psi,Params,Transf,VDk,V) - -%Parameters -normfac = Params.Lx*Params.Ly*Params.Lz/numel(psi); -KEop= 0.5*(Transf.KX.^2+Transf.KY.^2+Transf.KZ.^2); - -% DDIs -frho=fftn(abs(psi).^2); -Phi=real(ifftn(frho.*VDk)); - -Eddi = (Params.gdd*Phi.*abs(psi).^2); - -%Kinetic energy -Ekin = KEop.*abs(fftn(psi)*normfac).^2; -Ekin = trapz(Ekin(:))*Transf.dkx*Transf.dky*Transf.dkz/(2*pi)^3; - -%Potential energy -Epot = V.*abs(psi).^2; - -%Contact interactions -Eint = Params.gs*abs(psi).^4; - -%Quantum fluctuations -Eqf = Params.gammaQF*abs(psi).^5; - -%Total energy -muchem = Ekin + trapz(Epot(:) + Eint(:) + Eddi(:) + Eqf(:))*Transf.dx*Transf.dy*Transf.dz; % -muchem = muchem / Params.N; \ No newline at end of file diff --git a/DipolarGasSimulator/+Simulator/@Calculator/EnergyComponents.m b/DipolarGasSimulator/+Simulator/@Calculator/EnergyComponents.m deleted file mode 100644 index 49159ed..0000000 --- a/DipolarGasSimulator/+Simulator/@Calculator/EnergyComponents.m +++ /dev/null @@ -1,35 +0,0 @@ -function E = EnergyComponents(psi,Params,Transf,VDk,V) - -%Parameters - -KEop= 0.5*(Transf.KX.^2+Transf.KY.^2+Transf.KZ.^2); -normfac = Params.Lx*Params.Ly*Params.Lz/numel(psi); - -% DDIs -frho = fftn(abs(psi).^2); -Phi = real(ifftn(frho.*VDk)); - -Eddi = 0.5*Params.gdd*Phi.*abs(psi).^2; -E.Eddi = trapz(Eddi(:))*Transf.dx*Transf.dy*Transf.dz; - -% EddiTot = trapz(Eddi(:))*Transf.dx*Transf.dy*Transf.dz; - -%Kinetic energy -% psik = ifftshift(fftn(fftshift(psi)))*normfac; - -Ekin = KEop.*abs(fftn(psi)*normfac).^2; -E.Ekin = trapz(Ekin(:))*Transf.dkx*Transf.dky*Transf.dkz/(2*pi)^3; - -% Potential energy -Epot = V.*abs(psi).^2; -E.Epot = trapz(Epot(:))*Transf.dx*Transf.dy*Transf.dz; - -%Contact interactions -Eint = 0.5*Params.gs*abs(psi).^4; -E.Eint = trapz(Eint(:))*Transf.dx*Transf.dy*Transf.dz; - -%Quantum fluctuations -Eqf = 0.4*Params.gammaQF*abs(psi).^5; -E.Eqf = trapz(Eqf(:))*Transf.dx*Transf.dy*Transf.dz; - -% plot(Transf.x,abs(psi(:,end/2,end/2+1)).^2) \ No newline at end of file diff --git a/DipolarGasSimulator/+Simulator/@Calculator/NormalizedResiduals.m b/DipolarGasSimulator/+Simulator/@Calculator/NormalizedResiduals.m deleted file mode 100644 index 66e5316..0000000 --- a/DipolarGasSimulator/+Simulator/@Calculator/NormalizedResiduals.m +++ /dev/null @@ -1,24 +0,0 @@ -function res = NormalizedResiduals(psi,Params,Transf,VDk,V,muchem) - -KEop= 0.5*(Transf.KX.^2+Transf.KY.^2+Transf.KZ.^2); - -% DDIs -frho=fftn(abs(psi).^2); -Phi=real(ifftn(frho.*VDk)); - -Eddi = Params.gdd*Phi.*psi; - -%Kinetic energy -Ekin = ifftn(KEop.*fftn(psi)); - -%Potential energy -Epot = V.*psi; - -%Contact interactions -Eint = Params.gs*abs(psi).^2.*psi; - -%Quantum fluctuations -Eqf = Params.gammaQF*abs(psi).^3.*psi; - -%Total energy -res = trapz(abs(Ekin(:) + Epot(:) + Eint(:) + Eddi(:) + Eqf(:) - muchem*psi(:))*Transf.dx*Transf.dy*Transf.dz)/trapz(abs(muchem*psi(:))*Transf.dx*Transf.dy*Transf.dz); \ No newline at end of file diff --git a/DipolarGasSimulator/+Simulator/@Calculator/OrderParameter.m b/DipolarGasSimulator/+Simulator/@Calculator/OrderParameter.m deleted file mode 100644 index 08b0fa4..0000000 --- a/DipolarGasSimulator/+Simulator/@Calculator/OrderParameter.m +++ /dev/null @@ -1,58 +0,0 @@ -function [m_Order] = OrderParameter(psi,Transf,Params,VDk,V,T,muchem) - - NumRealiz = 100; - - Mx = numel(Transf.x); - My = numel(Transf.y); - Mz = numel(Transf.z); - - r = normrnd(0,1,size(psi)); - theta = rand(size(psi)); - noise = r.*exp(2*pi*1i*theta); - - KEop= 0.5*(Transf.KX.^2+Transf.KY.^2+Transf.KZ.^2); - Gamma = 1-1i*Params.gamma_S; - dt = Params.dt; - - avgpsi = 0; - avgpsi2 = 0; - - for jj = 1:NumRealiz - %generate initial state - xi = sqrt(2*Params.gamma_S*Params.kbol*T*10^(-9)*dt/(Params.hbar*Params.w0*Transf.dx*Transf.dy*Transf.dz)); - swapx = randi(length(Transf.x),1,length(Transf.x)); - swapy = randi(length(Transf.y),1,length(Transf.y)); - swapz = randi(length(Transf.z),1,length(Transf.z)); - psi_j = psi + xi * noise(swapx,swapy,swapz); - - % --- % propagate forward in time 1 time step: - %kin - psi_j = fftn(psi_j); - psi_j = psi_j.*exp(-0.5*1i*Gamma*dt*KEop); - psi_j = ifftn(psi_j); - - %DDI - frho = fftn(abs(psi_j).^2); - Phi = real(ifftn(frho.*VDk)); - - %Real-space - psi_j = psi_j.*exp(-1i*Gamma*dt*(V + Params.gs*abs(psi_j).^2 + Params.gammaQF*abs(psi_j).^3 + Params.gdd*Phi - muchem)); - - %kin - psi_j = fftn(psi_j); - psi_j = psi_j.*exp(-0.5*1i*Gamma*dt*KEop); - psi_j = ifftn(psi_j); - - %Projection - kcut = sqrt(2*Params.e_cut); - K = (Transf.KX.^2+Transf.KY.^2+Transf.KZ.^2) 4 && abs(dt) > Params.mindt - dt = dt / 2; - fprintf('Time step changed to '); disp(dt); - AdaptIdx = 0; - elseif AdaptIdx > 4 && abs(dt) < Params.mindt - break - else - AdaptIdx = AdaptIdx + 1; - end - else - AdaptIdx = 0; - end - end - if any(isnan(psi(:))) - disp('NaNs encountered!') - break - end - t_idx=t_idx+1; -end - -%Change in Energy -E = Simulator.TotalEnergy(psi,Params,Transf,VDk,V); -E = E/Norm; -Observ.EVec = [Observ.EVec E]; - -% Phase coherence -[PhaseC] = Simulator.PhaseCoherence(psi,Transf,Params); -Observ.PCVec = [Observ.PCVec PhaseC]; - -Observ.res_idx = Observ.res_idx + 1; -save(sprintf('./Data/Run_%03i/psi_gs.mat',njob),'psi','muchem','Observ','t_idx','Transf','Params','VDk','V'); -end \ No newline at end of file diff --git a/DipolarGasSimulator/+Simulator/@Solver/Initialize.m b/DipolarGasSimulator/+Simulator/@Solver/Initialize.m deleted file mode 100644 index 6d425e7..0000000 --- a/DipolarGasSimulator/+Simulator/@Solver/Initialize.m +++ /dev/null @@ -1,64 +0,0 @@ -function [psi,V,VDk] = Initialize(Params,Transf) - -format long -X = Transf.X; Y = Transf.Y; Z = Transf.Z; -Zcutoff = Params.Lz/2; - -% == Potential == % -V = 0.5*(Params.gx.*X.^2+Params.gy.*Y.^2+Params.gz*Z.^2); - -% == Calculating the DDIs == % -% For a cylindrical cutoff, we first construct a kr grid based on the 3D parameters using Bessel quadrature -loadDDI = 1; - -if loadDDI == 1 - VDk = load(sprintf('./Data/VDk_M.mat')); - VDk = VDk.VDk; -else - Params.Lr = 0.5*min(Params.Lx,Params.Ly); - Params.Nr = max(Params.Nx,Params.Ny); - [TransfRad] = Simulator.SetupSpaceRadial(Params); %morder really doesn't matter - VDk = Simulator.VDcutoff(TransfRad.kr,TransfRad.kz,TransfRad.Rmax,Zcutoff); - - disp('Calculated radial grid and cutoff') - - % VDk = interp2(DDI.kz,DDI.kr,DDI.VDk,Transf.kz,Transf.kr,'spline'); - fullkr = [-flip(TransfRad.kr)',TransfRad.kr']; - [KR,KZ] = ndgrid(fullkr,TransfRad.kz); - - [KX3D,KY3D,KZ3D] = ndgrid(ifftshift(Transf.kx),ifftshift(Transf.ky),ifftshift(Transf.kz)); - KR3D = sqrt(KX3D.^2 + KY3D.^2); - fullVDK = [flip(VDk',2),VDk']'; - VDk = interpn(KR,KZ,fullVDK,KR3D,KZ3D,'spline',-1/3); %Interpolating the radial VDk onto a new grid - VDk = fftshift(VDk); - save(sprintf('./Data/VDk_M.mat'),'VDk'); -end -disp('Finished DDI') - -% == Setting up the initial wavefunction == % - -ellx = sqrt(Params.hbar/(Params.m*Params.wx))/Params.l0; -elly = sqrt(Params.hbar/(Params.m*Params.wy))/Params.l0; -ellz = sqrt(Params.hbar/(Params.m*Params.wz))/Params.l0; - -Rx = 4*sqrt(2)*ellx; -Ry = 4*sqrt(2)*elly; -Rz = sqrt(2)*ellz; -X0 = 0.0*Transf.Xmax; -Y0 = 0.0*Transf.Ymax; -Z0 = 0*Transf.Zmax; - -psiz = exp(-(Z-Z0).^2/Rz^2)/sqrt(ellz*sqrt(pi)); -psi2d = load(sprintf('./Data/Seed/psi_2d_SS.mat'),'psiseed_2d'); psi2d = psi2d.psiseed_2d; -psi = psiz.*repmat(psi2d,[1 1 length(Transf.z)]); - -% Add some noise -r = normrnd(0,1,size(X)); -theta = rand(size(X)); -noise = r.*exp(2*pi*1i*theta); -psi = psi + 0.00*noise; - -Norm = trapz(abs(psi(:)).^2)*Transf.dx*Transf.dy*Transf.dz; -psi = sqrt(Params.N)*psi/sqrt(Norm); - -end \ No newline at end of file diff --git a/DipolarGasSimulator/+Simulator/@Solver/Run.m b/DipolarGasSimulator/+Simulator/@Solver/Run.m deleted file mode 100644 index 65308c1..0000000 --- a/DipolarGasSimulator/+Simulator/@Solver/Run.m +++ /dev/null @@ -1,28 +0,0 @@ -%-% Run Simulation %-% -clearvars - -% --- Obtain simulation parameters --- -[Params] = SetupParameters(); - -% --- Set up spatial grids and transforms --- -[Transf] = SetupSpace(Params); - -% --- Initialize --- - -[psi,V,VDk] = Initialize(Params,Transf); - -Observ.EVec = []; Observ.NormVec = []; Observ.PCVec = []; Observ.tVecPlot = []; Observ.mucVec = []; -t_idx = 1; %Start at t = 0; -Observ.res_idx = 1; - -% --- Job Settings --- - -njob = 6; - -mkdir(sprintf('./Data')) -mkdir(sprintf('./Data/Run_%03i',njob)) - -% --- Run Simulation --- - -% Imaginary Time Evolution -[psi] = SplitStepFourierImaginaryTime(psi,Params,Transf,VDk,V,njob,t_idx,Observ); \ No newline at end of file diff --git a/DipolarGasSimulator/+Simulator/@Solver/SetupParameters.m b/DipolarGasSimulator/+Simulator/@Solver/SetupParameters.m deleted file mode 100644 index 4b40c4d..0000000 --- a/DipolarGasSimulator/+Simulator/@Solver/SetupParameters.m +++ /dev/null @@ -1,101 +0,0 @@ -function [Params] = SetupParameters() - -%%--%% Parameters %%--%% - -%========= Simulation =========% -pert = 0; % 0 = no perturbation during real-time, 1=perturbation -%method=1; % 0 = normal dipolar potential, 1=spherical cut-off, 2=cylindrical cut-off - -% Tolerances -Params.Etol = 5e-10; -Params.rtol = 1e-5; -Params.cut_off = 2e6; % sometimes the imaginary time gets a little stuck - % even though the solution is good, this just stops it going on forever - -%========= Constants =========% -hbar = 1.0545718e-34; % Planck constant [J.s] -kbol = 1.38064852e-23; % Boltzmann Constant [J/K] -mu0 = 1.25663706212e-6; % Vacuum Permeability [N/A^2] -- -muB = 9.274009994e-24; % Bohr Magneton [J/T] -a0 = 5.2917721067e-11; % Bohr radius [m] -m0 = 1.660539066e-27; % Atomic mass [kg] -w0 = 2*pi*100; % Angular frequency unit [s^-1] -mu0factor = 0.3049584233607396; % =(m0/me)*pi*alpha^2 -- me=mass of electron, alpha=fine struct. const. - % mu0=mu0factor *hbar^2*a0/(m0*muB^2) -%=============================% - -% Number of points in each direction -Params.Nx = 128; -Params.Ny = 128; -Params.Nz = 96; - -% Dimensions (in units of l0) -Params.Lx = 40; -Params.Ly = 40; -Params.Lz = 20; - -% Masses -Params.m = 162*m0; -l0 = sqrt(hbar/(Params.m*w0)); % Defining a harmonic oscillator length - -% Atom numbers -% Params.ppum = 2500; % particles per micron -% Params.N = Params.Lz*Params.ppum*l0*1e6; -Params.N = 10^6; - -% Dipole angle -Params.theta = pi/2; % pi/2 dipoles along x, theta=0 dipoles along z - -% Dipole lengths (units of muB) -Params.mu = 9.93*muB; - -% Scattering lengths -Params.as = 86*a0; - -% Trapping frequencies -Params.wx = 2*pi*125; -Params.wy = 2*pi*125; -Params.wz = 2*pi*250; - -% Time step -Params.dt = 0.0005; -Params.mindt = 1e-6; %Minimum size for a time step using adaptive dt - -% Stochastic GPE -Params.gamma_S = 7.5*10^(-3); % gamma for the stochastic GPE -Params.muchem = 12.64*Params.wz/w0; % fixing the chemical potential for the stochastic GPE - -% ================ Parameters defined by those above ================ % - -% == Calculating quantum fluctuations == % -eps_dd = Params.add/Params.as; -if eps_dd == 0 - Q5 = 1; -elseif eps_dd == 1 - Q5 = 3*sqrt(3)/2; -else - yeps = (1-eps_dd)/(3*eps_dd); - Q5 = (3*eps_dd)^(5/2)*( (8+26*yeps+33*yeps^2)*sqrt(1+yeps) + 15*yeps^3*log((1+sqrt(1+yeps))/sqrt(yeps)) )/48; - Q5 = real(Q5); -end - -Params.gammaQF = 128/3*sqrt(pi*(Params.as/l0)^5)*Q5; - -% Contact interaction strength (units of l0/m) -Params.gs = 4*pi*Params.as/l0; - -% Dipole lengths -Params.add = mu0*Params.mu^2*Params.m/(12*pi*hbar^2); - -% DDI strength -Params.gdd = 12*pi*Params.add/l0; %sometimes the 12 is a 4? --> depends on how Vdk (DDI) is defined - -% Trap gamma -Params.gx=(Params.wx/w0)^2; -Params.gy=(Params.wy/w0)^2; -Params.gz=(Params.wz/w0)^2; - -% Loading the rest into Params -Params.hbar = hbar; Params.kbol = kbol; Params.mu0 = mu0; Params.muB = muB; Params.a0 = a0; -Params.w0 = w0; Params.l0 = l0; -end \ No newline at end of file diff --git a/DipolarGasSimulator/+Simulator/@Solver/SetupSpace.m b/DipolarGasSimulator/+Simulator/@Solver/SetupSpace.m deleted file mode 100644 index d970966..0000000 --- a/DipolarGasSimulator/+Simulator/@Solver/SetupSpace.m +++ /dev/null @@ -1,33 +0,0 @@ -function [Transf] = SetupSpace(Params) -Transf.Xmax = 0.5*Params.Lx; -Transf.Ymax = 0.5*Params.Ly; -Transf.Zmax = 0.5*Params.Lz; - -Nz = Params.Nz; Nx = Params.Nx; Ny = Params.Ny; - -% Fourier grids -x = linspace(-0.5*Params.Lx,0.5*Params.Lx-Params.Lx/Params.Nx,Params.Nx); -Kmax = pi*Params.Nx/Params.Lx; -kx = linspace(-Kmax,Kmax,Nx+1); -kx = kx(1:end-1); dkx = kx(2)-kx(1); -kx = fftshift(kx); - -y = linspace(-0.5*Params.Ly,0.5*Params.Ly-Params.Ly/Params.Ny,Params.Ny); -Kmax = pi*Params.Ny/Params.Ly; -ky = linspace(-Kmax,Kmax,Ny+1); -ky = ky(1:end-1); dky = ky(2)-ky(1); -ky = fftshift(ky); - -z = linspace(-0.5*Params.Lz,0.5*Params.Lz-Params.Lz/Params.Nz,Params.Nz); -Kmax = pi*Params.Nz/Params.Lz; -kz = linspace(-Kmax,Kmax,Nz+1); -kz = kz(1:end-1); dkz = kz(2)-kz(1); -kz = fftshift(kz); - -[Transf.X,Transf.Y,Transf.Z]=ndgrid(x,y,z); -[Transf.KX,Transf.KY,Transf.KZ]=ndgrid(kx,ky,kz); -Transf.x = x; Transf.y = y; Transf.z = z; -Transf.kx = kx; Transf.ky = ky; Transf.kz = kz; -Transf.dx = x(2)-x(1); Transf.dy = y(2)-y(1); Transf.dz = z(2)-z(1); -Transf.dkx = dkx; Transf.dky = dky; Transf.dkz = dkz; -end \ No newline at end of file diff --git a/DipolarGasSimulator/+Simulator/@Solver/SetupSpaceRadial.m b/DipolarGasSimulator/+Simulator/@Solver/SetupSpaceRadial.m deleted file mode 100644 index 1f8d74f..0000000 --- a/DipolarGasSimulator/+Simulator/@Solver/SetupSpaceRadial.m +++ /dev/null @@ -1,311 +0,0 @@ -function [Transf] = SetupSpaceRadial(Params,morder) -Zmax = 0.5*Params.Lz; -Rmax = Params.Lr; -Nz = Params.Nz; -Nr = Params.Nr; - -if(nargin==1) - morder=0; %only do Bessel J0 -end - -% Fourier grids -z=linspace(-Zmax,Zmax,Nz+1); -z=z(1:end-1); -dz=z(2)-z(1); -Kmax=Nz*2*pi/(4*Zmax); -kz=linspace(-Kmax,Kmax,Nz+1); -kz=kz(1:end-1); - -% Hankel grids and transform -H = hankelmatrix(morder,Rmax,Nr); -r=H.r(:); -kr=H.kr(:); -T = diag(H.J/H.kmax)*H.T*diag(Rmax./H.J)*dz*(2*pi); -Tinv = diag(H.J./Rmax)*H.T'*diag(H.kmax./H.J)/dz/(2*pi); -wr=H.wr; -wk=H.wk; -% H.T'*diag(H.J/H.vmax)*H.T*diag(Rmax./H.J) - -[Transf.R,Transf.Z]=ndgrid(r,z); -[Transf.KR,Transf.KZ]=ndgrid(kr,kz); -Transf.T=T; -Transf.Tinv=Tinv; -Transf.r=r; -Transf.kr=kr; -Transf.z=z; -Transf.kz=kz; -Transf.wr=wr; -Transf.wk=wk; -Transf.Rmax=Rmax; -Transf.Zmax=Zmax; -Transf.dz=z(2)-z(1); -Transf.dkz=kz(2)-kz(1); -%b1=Transf; - -function s_HT = hankelmatrix(order, rmax, Nr, eps_roots) -%HANKEL_MATRIX: Generates data to use for Hankel Transforms -% -% s_HT = hankel_matrix(order, rmax, Nr, eps_roots) -% -% s_HT = Structure containing data to use for the pQDHT -% order = Transform order -% rmax = Radial extent of transform -% Nr = Number of sample points -% eps_roots = Error in estimation of roots of Bessel function (optional) -% -% s_HT: -% order, rmax, Nr = As above -% J_roots = Roots of the pth order Bessel fn. -% J_roots_N1 = (N+1)th root -% r = Radial co-ordinate vector -% v = frequency co-ordinate vector -% kr = Radial wave number co-ordinate vector -% vmax = Limiting frequency -% = roots_N1 / (2*pi*rmax) -% S = rmax * 2*pi*vmax (S product) -% T = Transform matrix -% J = Scaling vector -% = J_(order+1){roots} -% -% The algorithm used is that from: -% "Computation of quasi-discrete Hankel transforms of the integer -% order for propagating optical wave fields" -% Manuel Guizar-Sicairos and Julio C. Guitierrez-Vega -% J. Opt. Soc. Am. A 21(1) 53-58 (2004) -% -% The algorithm also calls the function: -% zn = bessel_zeros(1, p, Nr+1, 1e-6), -% where p and N are defined above, to calculate the roots of the bessel -% function. This algorithm is taken from: -% "An Algorithm with ALGOL 60 Program for the Computation of the -% zeros of the Ordinary Bessel Functions and those of their -% Derivatives". -% N. M. Temme -% Journal of Computational Physics, 32, 270-279 (1979) -% -% Example: Propagation of radial field -% -% % Note the use of matrix and element products / divisions -% H = hankel_matrix(0, 1e-3, 512); -% DR0 = 50e-6; -% Ur0 = exp(-(H.r/DR0).^2); -% Ukr0 = H.T * (Ur0./H.J); -% k0 = 2*pi/800e-9; -% kz = realsqrt((k0^2 - H.kr.^2).*(k0>H.kr)); -% z = (-5e-3:1e-5:5e-3); -% Ukrz = (Ukr0*ones(1,length(z))).*exp(i*kz*z); -% Urz = (H.T * Ukrz) .* (H.J * ones(1,length(z))); -% -% See also bessel_zeros, besselj - -if (~exist('eps_roots', 'var')||isemtpy(eps_roots)) - s_HT.eps_roots = 1e-6; -else - s_HT.eps_roots = eps_roots; -end - -s_HT.order = order; -s_HT.rmax = rmax; -s_HT.Nr = Nr; - -% Calculate N+1 roots: -J_roots = bessel_zeros(1, s_HT.order, s_HT.Nr+1, s_HT.eps_roots); -s_HT.J_roots = J_roots(1:end-1); -s_HT.J_roots_N1 = J_roots(end); - -% Calculate co-ordinate vectors -s_HT.r = s_HT.J_roots * s_HT.rmax / s_HT.J_roots_N1; -s_HT.v = s_HT.J_roots / (2*pi * s_HT.rmax); -s_HT.kr = 2*pi * s_HT.v; -s_HT.kmax = s_HT.J_roots_N1 / (s_HT.rmax); -s_HT.vmax = s_HT.J_roots_N1 / (2*pi * s_HT.rmax); -s_HT.S = s_HT.J_roots_N1; - -% Calculate hankel matrix and vectors -% I use (p=order) and (p1=order+1) -Jp = besselj(s_HT.order, (s_HT.J_roots) * (s_HT.J_roots.') / s_HT.S); -Jp1 = abs(besselj(s_HT.order+1, s_HT.J_roots)); -s_HT.T = 2*Jp./(Jp1 * (Jp1.') * s_HT.S); -s_HT.J = Jp1; -s_HT.wr=2./((s_HT.kmax)^2*abs(Jp1).^2); -s_HT.wk=2./((s_HT.rmax)^2*abs(Jp1).^2); - -return - - - - -function z = bessel_zeros(d, a, n, e) -%BESSEL_ZEROS: Finds the first n zeros of a bessel function -% -% z = bessel_zeros(d, a, n, e) -% -% z = zeros of the bessel function -% d = Bessel function type: -% 1: Ja -% 2: Ya -% 3: Ja' -% 4: Ya' -% a = Bessel order (a>=0) -% n = Number of zeros to find -% e = Relative error in root -% -% This function uses the routine described in: -% "An Algorithm with ALGOL 60 Program for the Computation of the -% zeros of the Ordinary Bessel Functions and those of their -% Derivatives". -% N. M. Temme -% Journal of Computational Physics, 32, 270-279 (1979) - -z = zeros(n, 1); -aa = a^2; -mu = 4*aa; -mu2 = mu^2; -mu3 = mu^3; -mu4 = mu^4; - -if (d<3) - p = 7*mu - 31; - p0 = mu - 1; - if ((1+p)==p) - p1 = 0; - q1 = 0; - else - p1 = 4*(253*mu2 - 3722*mu+17869)*p0/(15*p); - q1 = 1.6*(83*mu2 - 982*mu + 3779)/p; - end -else - p = 7*mu2 + 82*mu - 9; - p0 = mu + 3; - if ((p+1)==1) - p1 = 0; - q1 = 0; - else - p1 = (4048*mu4 + 131264*mu3 - 221984*mu2 - 417600*mu + 1012176)/(60*p); - q1 = 1.6*(83*mu3 + 2075*mu2 - 3039*mu + 3537)/p; - end -end - -if (d==1)|(d==4) - t = .25; -else - t = .75; -end -tt = 4*t; - -if (d<3) - pp1 = 5/48; - qq1 = -5/36; -else - pp1 = -7/48; - qq1 = 35/288; -end - -y = .375*pi; -if (a>=3) - bb = a^(-2/3); -else - bb = 1; -end -a1 = 3*a - 8; -% psi = (.5*a + .25)*pi; - -for s=1:n - if ((a==0)&(s==1)&(d==3)) - x = 0; - j = 0; - else - if (s>=a1) - b = (s + .5*a - t)*pi; - c = .015625/(b^2); - x = b - .125*(p0 - p1*c)/(b*(1 - q1*c)); - else - if (s==1) - switch (d) - case (1) - x = -2.33811; - case (2) - x = -1.17371; - case (3) - x = -1.01879; - otherwise - x = -2.29444; - end - else - x = y*(4*s - tt); - v = x^(-2); - x = -x^(2/3) * (1 + v*(pp1 + qq1*v)); - end - u = x*bb; - v = fi(2/3 * (-u)^1.5); - w = 1/cos(v); - xx = 1 - w^2; - c = sqrt(u/xx); - if (d<3) - x = w*(a + c*(-5/u - c*(6 - 10/xx))/(48*a*u)); - else - x = w*(a + c*(7/u + c*(18 - 14/xx))/(48*a*u)); - end - end - j = 0; - -while ((j==0)|((j<5)&(abs(w/x)>e))) - xx = x^2; - x4 = x^4; - a2 = aa - xx; - r0 = bessr(d, a, x); - j = j+1; - if (d<3) - u = r0; - w = 6*x*(2*a + 1); - p = (1 - 4*a2)/w; - q = (4*(xx-mu) - 2 - 12*a)/w; - else - u = -xx*r0/a2; - v = 2*x*a2/(3*(aa+xx)); - w = 64*a2^3; - q = 2*v*(1 + mu2 + 32*mu*xx + 48*x4)/w; - p = v*(1 + (40*mu*xx + 48*x4 - mu2)/w); - end - w = u*(1 + p*r0)/(1 + q*r0); - x = x+w; - end - z(s) = x; - end -end - - -function FI = fi(y) - c1 = 1.570796; - if (~y) - FI = 0; - elseif (y>1e5) - FI = c1; - else - if (y<1) - p = (3*y)^(1/3); - pp = p^2; - p = p*(1 + pp*(pp*(27 - 2*pp) - 210)/1575); - else - p = 1/(y + c1); - pp = p^2; - p = c1 - p*(1 + pp*(2310 + pp*(3003 + pp*(4818 + pp*(8591 + pp*16328))))/3465); - end - pp = (y+p)^2; - r = (p - atan(p+y))/pp; - FI = p - (1+pp)*r*(1 + r/(p+y)); - end -return - -function Jr = bessr(d, a, x) - switch (d) - case (1) - Jr = besselj(a, x)./besselj(a+1, x); - case (2) - Jr = bessely(a, x)./bessely(a+1, x); - case (3) - Jr = a./x - besselj(a+1, x)./besselj(a, x); - otherwise - Jr = a./x - bessely(a+1, x)./bessely(a, x); - end -return \ No newline at end of file