0001 function [x, ATindex, LostBeam] = linepass1turn(x0, Family0, DeviceList0, Family, DeviceList)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 global THERING
0033 if isempty(THERING)
0034 error('THERING is not defined.');
0035 end
0036
0037
0038
0039 if nargin < 1
0040 x0 = [];
0041 end
0042 if isempty(x0)
0043
0044 x0 = [.001 0, 0.001, 0, 0, 0]';
0045 end
0046
0047 x0 = x0(:);
0048 if size(x0,1) == 4
0049 x0 = [x0; 0; 0];
0050 elseif size(x0,1) ~= 6
0051 error('x0 must be a 4x1 or 6x1 vector.');
0052 end
0053
0054 if nargin < 2
0055 Family0 = [];
0056 end
0057 if isempty(Family0)
0058 Family0 = 'BPMx';
0059 end
0060 if nargin < 3
0061 DeviceList0 = [];
0062 end
0063
0064 if nargin < 4
0065 Family = [];
0066 end
0067 if isempty(Family)
0068 Family = 'BPMx';
0069 end
0070 if nargin < 5
0071 DeviceList = [];
0072 end
0073
0074
0075
0076 if ischar(Family0)
0077 ATindex0 = family2atindex(Family0, DeviceList0);
0078
0079 if size(ATindex0,2) > 1
0080 ATindex0 = ATindex0(:,1);
0081 end
0082 if ischar(Family)
0083 ATindex = family2atindex(Family, DeviceList);
0084
0085 if size(ATindex,2) > 1
0086 ATindex = ATindex(:,1);
0087 end
0088 else
0089
0090 ATindex = Family;
0091 end
0092 else
0093
0094 ATindex0 = Family0;
0095 ATindex = DeviceList0;
0096 end
0097
0098 if any(size(ATindex0) ~= [1 1])
0099 error('DeviceList0 must be one location.');
0100 end
0101
0102
0103 ATindex = ATindex(:)';
0104 if isempty(ATindex)
0105 error('AT index empty.');
0106 end
0107
0108
0109
0110
0111
0112
0113 iForward = find(ATindex >= ATindex0);
0114 iBackward = find(ATindex < ATindex0);
0115
0116 x = [];
0117 if ~isempty(iForward)
0118 Index = ATindex(iForward) - ATindex0 + 1;
0119 x = linepass(THERING([ATindex0:ATindex(iForward(end))]), x0, Index);
0120 end
0121
0122 if ~isempty(iBackward)
0123 if x0(5)~=0 | x0(6)~=0
0124 fprintf(' WARNING: x0(5) & x0(6) must be zero for propagating backwards in the ring to work correctly.\n');
0125 end
0126
0127 x0neg = x0;
0128 x0neg([2 4]) = -x0neg([2 4]);
0129
0130 IndexBack = [ATindex(iBackward):ATindex0]-1;
0131 IndexBack(1) = [];
0132
0133
0134 ATIndexBack = ATindex(iBackward);
0135 Index = ATindex0 - ATIndexBack + 1;
0136 Index = Index(end:-1:1);
0137
0138 xb = linepass(THERING(IndexBack(end:-1:1)), x0neg, Index);
0139 xb([2 4],:) = -xb([2 4],:);
0140
0141
0142 x = [xb(:,end:-1:1) x];
0143 end
0144