0001 function [rcor,inCOD,ss]=atSkewRDTdispersioncorrection(...
0002 rerr,...
0003 r0,...
0004 indBPM,...
0005 indSCor,...
0006 inCOD,...
0007 neigSteerer,...
0008 correctflags,...
0009 scalefactor,...
0010 wdisp,...
0011 ModelRM,...
0012 steererlimit,...
0013 printouttext)
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
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 delta=1e-3;
0061
0062
0063 if nargin<12
0064 printouttext=true;
0065 end
0066 if nargin<11
0067 steererlimit=[];
0068 end
0069
0070 if nargin<4
0071 if printouttext
0072 disp('get BPM and Correctors indexes'); end;
0073 indBPM=finc(atgetcells(rerr,'Class','Monitor'));
0074 indSCor=finc(atgetcells(rerr,'Class','Sextupole'));
0075 end
0076
0077 if nargin<5
0078 inCOD=[0 0 0 0 0 0]';
0079 end
0080
0081 if nargin<6
0082 neigSteerer=length(indSCor)/2;
0083 end
0084
0085 if nargin<7
0086 correctflags=true;
0087 end
0088
0089 if nargin<8
0090 if printouttext
0091 disp(' --- scale set to 1.0'); end;
0092 scalefactor=1.0;
0093 end
0094
0095 if nargin<9
0096 if printouttext, disp(' ---wdispv=0.7'); end;
0097 wdisp=.7;
0098 end
0099
0100 if nargin<10
0101 if printouttext, disp(' --- computing orbit Response matrix'); end;
0102 ModelRM=[];
0103 end
0104
0105
0106 if scalefactor<0 || scalefactor>1
0107 if printouttext
0108 disp(' --- scale factor out of range. Set to 1.0'); end;
0109 scalefactor=1.0;
0110 end
0111
0112
0113
0114 if isempty(ModelRM)
0115
0116 if printouttext
0117 disp('get RM'); end;
0118
0119
0120 ModelRM=getresponsematrices(...
0121 rerr,...
0122 indBPM,...
0123 [],...
0124 [],...
0125 indSCor,...
0126 [],...
0127 [],...
0128 inCOD,...
0129 11 );
0130
0131
0132
0133 end
0134
0135
0136
0137 drmS=ModelRM.DispSCor;
0138
0139
0140 [~,~,ind]=EquivalentGradientsFromAlignments6D(rerr,inCOD);
0141 indAllSkew=ind;
0142
0143
0144
0145 [respsx,respsz]=semrdtresp_mod(rerr,indBPM,indAllSkew);
0146 SL=atgetfieldvalues(rerr,indAllSkew,'Length');
0147 SL(SL==0)=1;
0148 lengthsmat=repmat(SL',length(indBPM),1);
0149 respsx=respsx.*lengthsmat;
0150 respsz=respsz.*lengthsmat;
0151
0152 [~,skcor]=ismember(indSCor,indAllSkew);
0153 rdtS=[...
0154 real(respsx(:,skcor));...
0155 imag(respsx(:,skcor));...
0156 real(respsz(:,skcor));...
0157 imag(respsz(:,skcor))];
0158
0159
0160 inCOD=[0 0 0 0 0 0]';
0161 [l,~,~]=atlinopt(r0,0,indBPM);
0162 refdispersion=arrayfun(@(a)a.Dispersion(3),l);
0163
0164
0165 [~,KSnoer,~]=EquivalentGradientsFromAlignments6D(r0,inCOD);
0166
0167 fx=respsx*KSnoer;
0168 fz=respsz*KSnoer;
0169 rdtvecs=[...
0170 real(fx);...
0171 imag(fx);...
0172 real(fz);...
0173 imag(fz)]';
0174
0175 refrdt(1,:)=rdtvecs;
0176
0177
0178
0179
0180 [~,KSi,~]=EquivalentGradientsFromAlignments6D(rerr,inCOD);
0181
0182 fx=respsx*KSi;
0183 fz=respsz*KSi;
0184 rs0=[...
0185 real(fx);...
0186 imag(fx);...
0187 real(fz);...
0188 imag(fz)]';
0189
0190
0191 alpha=mcf(rerr);
0192 indrfc=find(atgetcells(rerr,'Frequency'));
0193
0194
0195
0196 d=finddispersion6Err(rerr,indBPM,indrfc,alpha,delta,inCOD);
0197 dy0=d(3,:);
0198
0199
0200 ss0=atgetfieldvalues(rerr,indSCor,'PolynomA',{1,2});
0201
0202
0203 Niter=size(neigSteerer,1);
0204 for iter=1:Niter
0205
0206 if printouttext
0207 disp(['RDT Disp. Tune Steering iter ' num2str(iter,'%d, ') ...
0208 ' n-eig: ' num2str(neigSteerer(iter,:),'%d, ') ...
0209 ' alpha: ' num2str(wdisp,'%2.2f ')]);
0210 end
0211
0212
0213 cors0=atgetfieldvalues(rerr,indSCor,'PolynomA',{1,2});
0214
0215
0216
0217 [~,KSe,~]=EquivalentGradientsFromAlignments6D(rerr,inCOD);
0218
0219
0220
0221 fx=respsx*KSe;
0222 fz=respsz*KSe;
0223 rs=[...
0224 real(fx);...
0225 imag(fx);...
0226 real(fz);...
0227 imag(fz)]';
0228
0229
0230 d=finddispersion6Err(rerr,indBPM,indrfc,alpha,delta,inCOD);
0231 dy=d(3,:);
0232
0233
0234 rs=rs-refrdt(1,:);
0235
0236 dy=dy-refdispersion(1,:);
0237
0238
0239
0240 rs=rs*(1-wdisp(1));
0241 dy=dy*(wdisp(1));
0242
0243
0244 if correctflags(1)
0245 RMS=[rdtS*(1-wdisp(1));drmS{3}*(wdisp(1));ones(size(indSCor))];
0246 elseif ~correctflags(1)
0247 RMS=[rdtS*(1-wdisp(1));drmS{3}*(wdisp(1))];
0248 end
0249
0250
0251 if correctflags(1)
0252 vecs=[rs dy 0]';
0253 else
0254 vecs=[rs dy]';
0255 end
0256
0257 dcs=qemsvd_mod(RMS,vecs,neigSteerer(iter,1));
0258
0259
0260
0261 ss=cors0-dcs*scalefactor;
0262
0263
0264 if ~isempty(steererlimit)
0265 ss(abs(ss)>steererlimit(1))=steererlimit(2);
0266 end
0267
0268
0269 rcor=rerr;
0270 rcor=atsetfieldvalues(rcor,indSCor,'PolynomA',{1,2},ss);
0271
0272
0273 rerr=rcor;
0274 end
0275
0276
0277
0278 [~,KS,~]=EquivalentGradientsFromAlignments6D(rcor,inCOD);
0279
0280 fx=respsx*KS;
0281 fz=respsz*KS;
0282 rsc=[...
0283 real(fx);...
0284 imag(fx);...
0285 real(fz);...
0286 imag(fz)]';
0287
0288
0289 d=finddispersion6Err(rcor,indBPM,indrfc,alpha,delta,inCOD);
0290 dyc=d(3,:);
0291
0292
0293 if printouttext
0294
0295 disp([' before' ' ' '-->' ' ' 'after'])
0296 disp(['rs: ' num2str(std(rs0-refrdt(1,:))*1e3,'%3.3f') ' -> ' num2str(std(rsc-refrdt(1,:))*1e3,'%3.3f') '']);
0297 disp(['dY: ' num2str(std(dy0-refdispersion(1,:))*1e3,'%3.3f') ' -> ' num2str(std(dyc-refdispersion(1,:))*1e3,'%3.3f') 'mm'])
0298 disp([' ' 'min' ' ' 'mean' ' ' 'max'])
0299 disp(['ss:' num2str([min(ss-ss0) mean(ss-ss0) max(ss-ss0)]*1e0,' %2.2f ') ' 1/m2'])
0300 disp(['dpp: ' num2str(inCOD(5))])
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311 end
0312
0313
0314 end