0001 function external = setexternal(mode, preExternal, varargin)
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
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 external = [];
0043
0044
0045
0046
0047 if (mode ==3 | mode == 4 | mode ==6 | mode == -1 | mode == -2) ...
0048 & length(varargin)~=2
0049 varargin
0050 error(['makelist -> setexternal: length(varargin) must be 2 for ' ...
0051 'modes 3, 4, 6, -1 or -2'])
0052 end
0053
0054
0055 if length(varargin) == 2
0056 detId = varargin{2};
0057 if mode == 3 | mode == 4 | mode == 6 | mode == -1 | mode == -2
0058
0059 Cordnt = getifo(detId);
0060 end
0061 end
0062
0063
0064 if mode == 1 | mode == 2 | mode == 3 | mode == 4 | mode == -1
0065
0066
0067
0068
0069
0070
0071 [ext1, ext2, ext3] = deal(preExternal{1}, preExternal{2}, ...
0072 preExternal{3});
0073
0074
0075 for k=1:size(ext1, 1)
0076
0077 if strcmp(upper(ext1(k,:)), 'RANDOM') | ...
0078 strcmp(upper(ext1(k,:)), 'RANDOM ')
0079
0080 tempExt1(k,1) = randomangle(1, 'x');
0081 elseif (mode == 3 | mode == 4) & strcmp(upper(ext1(k,:)), 'OPTIMAL')
0082
0083 if ~isfield(Cordnt, 'CODEC')
0084 error('makelist -> setexternal: Cordnt.CODEC does not exist')
0085 end
0086 tempExt1(k,1) = Cordnt.CODEC;
0087 else
0088
0089 tempExt1(k,1) = str2double(ext1(k,:));
0090
0091 if isnan(tempExt1(k,1))
0092 if mode == 1 | mode == 2
0093 ext1 = ext1(k,:)
0094 error(['makelist -> setexternal: ext1 must be a ' ...
0095 'double or char ''RANDOM'''])
0096 elseif mode == 3 | mode == 4
0097 ext1 = ext1(k,:)
0098 error(['makelist -> setexternal: ext1 must be a ' ...
0099 'double or char ''RANDOM'' or ''OPTIMAL'''])
0100 end
0101 end
0102 end
0103
0104 if strcmp(upper(ext2(k,:)), 'RANDOM') | ...
0105 strcmp(upper(ext2(k,:)), 'RANDOM ')
0106
0107 tempExt2(k,1) = randomangle(1, 'phi');
0108 elseif (mode == 3 | mode == 4) & strcmp(upper(ext2(k,:)), 'OPTIMAL')
0109
0110 if ~isfield(Cordnt, 'LONG')
0111 error('makelist -> setexternal: Cordnt.LONG does not exist')
0112 end
0113 tempExt2(k,1) = Cordnt.LONG;
0114 else
0115
0116 tempExt2(k,1) = str2double(ext2(k,:));
0117
0118 if isnan(tempExt2(k,1))
0119 if mode == 1 | mode == 2
0120 ext2 = ext2(k,:)
0121 error(['makelist -> setexternal: ext2 must be a ' ...
0122 'double or char ''RANDOM'''])
0123 elseif mode == 3 | mode == 4
0124 ext2 = ext2(k,:)
0125 error(['makelist -> setexternal: ext2 must be a ' ...
0126 'double or char ''RANDOM'' or ''OPTIMAL'''])
0127 end
0128 end
0129 end
0130
0131 if strcmp(upper(ext3(k,:)), 'RANDOM') | ...
0132 strcmp(upper(ext3(k,:)), 'RANDOM ')
0133
0134 tempExt3(k,1) = randomangle(1, 'psi');
0135 elseif (mode == 3 | mode == 4) & strcmp(upper(ext3(k,:)), 'OPTIMAL')
0136
0137 tempExt3(k,1) = pi/8;
0138 else
0139
0140 tempExt3(k,1) = str2double(ext3(k,:));
0141
0142 if isnan(tempExt3(k,1))
0143 if mode == 1 | mode == 2
0144 ext3 = ext3(k,:)
0145 error(['makelist -> setexternal: ext3 must be a ' ...
0146 'double or char ''RANDOM'''])
0147 elseif mode == 3 | mode == 4
0148 ext3 = ext3(k,:)
0149 error(['makelist -> setexternal: ext3 must be a ' ...
0150 'double or char ''RANDOM'' or ''OPTIMAL'''])
0151 end
0152 end
0153 end
0154 end
0155
0156 external = [tempExt1, tempExt2, tempExt3];
0157
0158
0159 elseif mode == 5 | mode == 6 | mode == -2
0160
0161 if length(varargin) >= 1
0162 nSim = varargin{1};
0163 else
0164 error(['makelist -> setexternal: Need to know number if external '...
0165 'angles to generate (nSim)'])
0166 end
0167
0168 if strcmp(class(preExternal), 'char')
0169 if strcmp(upper(preExternal), 'RANDOM')
0170
0171
0172 external = [randomangle(nSim, 'x'), randomangle(nSim, 'phi'), ...
0173 randomangle(nSim, 'psi')];
0174
0175 elseif strcmp(upper(preExternal), 'OPTIMAL') & (mode == 6 | ...
0176 mode == -2)
0177
0178
0179 if ~isfield(Cordnt, 'CODEC') | ~isfield(Cordnt, 'LONG')
0180 error(['makelist -> setexternal: Cordnt.CODEC or ' ...
0181 'Cordnt.LONG does not exist'])
0182 end
0183 external = repmat([Cordnt.CODEC, Cordnt.LONG, pi/8], nSim, 1);
0184
0185 elseif mode == 5
0186 external = preExternal
0187 error(['makelist -> setexternal: external must be 1x3 vector,'...
0188 ' struct or string ''RANDOM'''])
0189 elseif mode == 6 | mode == -2
0190 external = preExternal
0191 error(['makelist -> setexternal: external must be 1x3 vector,'...
0192 ' struct or string ''RANDOM'' or ''OPTIMAL'''])
0193 end
0194 elseif strcmp(class(preExternal), 'double')
0195
0196 external = repmat(preExternal, nSim, 1);
0197
0198 elseif strcmp(class(preExternal), 'struct')
0199 if ~isfield(preExternal, 'x') | ~isfield(preExternal, 'phi') ...
0200 | ~isfield(preExternal, 'psi')
0201 external = preExternal
0202 error(['makelist -> setexternal: the external struct must '...
0203 'have fields x, phi and psi'])
0204 end
0205
0206 external = repmat([preExternal.x, preExternal.phi, ...
0207 preExternal.psi], nSim, 1);
0208
0209 else
0210 external = preExternal
0211 error(['makelist -> setexternal: Class type of external must be '...
0212 'double, struct or char'])
0213 end
0214
0215 end
0216
0217
0218 check = find(abs(external(:,1)) > 1);
0219 if ~isempty(check)
0220 ext1 = external(:,1)
0221 error(['makelist -> setexternal: The first external angle is out of '...
0222 'range: (-1 1)'])
0223 end
0224
0225 check = find(external(:,2) < -pi | external(:,2) > pi);
0226 if ~isempty(check)
0227 ext2 = external(:,2)
0228 error(['makelist -> setexternal: The second external angle is out of '...
0229 'range: (-pi pi)'])
0230 end
0231
0232 check = find(external(:,3) < 0 | external(:,3) > 2*pi);
0233 if ~isempty(check)
0234 ext3 = external(:,3)
0235 error(['makelist -> setexternal: The third external angle is out of ' ...
0236 'range: (0 pi)'])
0237 end
0238
0239 return