0001 function [rcor,inCOD,qs]=atQuadRDTdispersioncorrection(...
0002 rerr,...
0003 r0,...
0004 indBPM,...
0005 indQCor,...
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 indQCor=finc(atgetcells(rerr,'Class','Quadrupole'));
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(indQCor) /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(' --- wdisph=0.7 wtune=0.1'); end;
0097 wdisp=[.7 .1];
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 [],...
0126 indQCor,...
0127 [],...
0128 inCOD,...
0129 [10 12]...
0130 );
0131
0132
0133 end
0134
0135
0136
0137 drmQ=ModelRM.DispQCor;
0138
0139 tuneQ=[ModelRM.TuneQCor{1};ModelRM.TuneQCor{2}];
0140
0141
0142 [~,~,ind]=EquivalentGradientsFromAlignments6D(rerr,inCOD);
0143 indAllQuad=ind;
0144
0145 [respqx,respqz]=qemrdtresp_mod(rerr,indBPM,indAllQuad);
0146 QL=atgetfieldvalues(rerr,indAllQuad,'Length');
0147 QL(QL==0)=1;
0148
0149
0150
0151
0152 lengthsmat=repmat(QL',length(indBPM),1);
0153 respqx=respqx.*lengthsmat;
0154 respqz=respqz.*lengthsmat;
0155
0156 [~,qkcor]=ismember(indQCor,indAllQuad);
0157 rdtQ=[...
0158 real(respqx(:,qkcor));...
0159 imag(respqx(:,qkcor));...
0160 real(respqz(:,qkcor));...
0161 imag(respqz(:,qkcor))];
0162
0163
0164 inCOD=[0 0 0 0 0 0]';
0165 [l,t,~]=atlinopt(r0,0,indBPM);
0166 refdispersion(1,:)=arrayfun(@(a)a.Dispersion(1),l);
0167 reftune=t;
0168
0169 [KQnoer,~,~]=EquivalentGradientsFromAlignments6D(r0,inCOD);
0170
0171
0172
0173 fx=respqx*KQnoer;
0174 fz=respqz*KQnoer;
0175 rdtvecq=[...
0176 real(fx);...
0177 imag(fx);...
0178 real(fz);...
0179 imag(fz)]';
0180
0181 refrdt(1,:)=rdtvecq;
0182
0183
0184
0185 [KQi,~,~]=EquivalentGradientsFromAlignments6D(rerr,inCOD);
0186
0187
0188
0189 fx=respqx*KQi;
0190 fz=respqz*KQi;
0191 rq0=[...
0192 real(fx);...
0193 imag(fx);...
0194 real(fz);...
0195 imag(fz)]';
0196
0197
0198
0199 alpha=mcf(rerr);
0200 indrfc=find(atgetcells(rerr,'Frequency'));
0201
0202
0203
0204 d=finddispersion6Err(rerr,indBPM,indrfc,alpha,delta,inCOD);
0205 dx0=d(1,:);
0206
0207 [~,t0,~]=atlinopt(rerr,0,1);
0208
0209
0210 qs0=atgetfieldvalues(rerr,indQCor,'PolynomB',{1,2});
0211
0212
0213 Niter=size(neigSteerer,1);
0214 for iter=1:Niter
0215
0216 if printouttext
0217 disp(['RDT Disp. Tune Steering iter ' num2str(iter,'%d, ') ...
0218 ' n-eig: ' num2str(neigSteerer(iter,:),'%d, ') ...
0219 ' alpha: ' num2str(wdisp,'%2.2f ')]);
0220 end
0221
0222
0223 corq0=atgetfieldvalues(rerr,indQCor,'PolynomB',{1,2});
0224
0225
0226
0227 [KQe,~,~]=EquivalentGradientsFromAlignments6D(rerr,inCOD);
0228
0229
0230
0231 fx=respqx*KQe;
0232 fz=respqz*KQe;
0233 rq=[...
0234 real(fx);...
0235 imag(fx);...
0236 real(fz);...
0237 imag(fz)]';
0238
0239
0240
0241 d=finddispersion6Err(rerr,indBPM,indrfc,alpha,delta,inCOD);
0242 dx=d(1,:);
0243
0244 [~,t,~]=atlinopt(rerr,0,1);
0245
0246
0247
0248 rq=rq-refrdt(1,:);
0249
0250 dx=dx-refdispersion(1,:);
0251
0252 t=t-reftune;
0253
0254
0255 rq=rq*(1-wdisp(1)-wdisp(2));
0256 dx=dx*(wdisp(1));
0257 t=t*(wdisp(2));
0258
0259
0260 if correctflags(1)
0261 RMQ=[rdtQ*(1-wdisp(1)-wdisp(2));drmQ{1}*(wdisp(1));tuneQ*(wdisp(2));ones(size(indQCor))];
0262
0263 elseif ~correctflags(1)
0264 RMQ=[rdtQ*(1-wdisp(1)-wdisp(2));drmQ{1}*(wdisp(1));tuneQ*(wdisp(2))];
0265
0266 end
0267
0268
0269 if correctflags(1)
0270 vecq=[rq dx t 0]';
0271
0272 else
0273 vecq=[rq dx t]';
0274
0275 end
0276
0277 dcq=qemsvd_mod(RMQ,vecq,neigSteerer(iter,1));
0278
0279
0280
0281 qs=corq0-dcq*scalefactor;
0282
0283
0284 if ~isempty(steererlimit)
0285 qs(abs(qs)>steererlimit(1))=steererlimit(1);
0286 end
0287
0288
0289 rcor=rerr;
0290 rcor=atsetfieldvalues(rcor,indQCor,'PolynomB',{1,2},qs);
0291
0292
0293 rerr=rcor;
0294 end
0295
0296
0297
0298 [KQ,~,~]=EquivalentGradientsFromAlignments6D(rcor,inCOD);
0299
0300
0301
0302 fx=respqx*KQ;
0303 fz=respqz*KQ;
0304 rqc=[...
0305 real(fx);...
0306 imag(fx);...
0307 real(fz);...
0308 imag(fz)]';
0309
0310
0311
0312 d=finddispersion6Err(rcor,indBPM,indrfc,alpha,delta,inCOD);
0313 dxc=d(1,:);
0314
0315 [~,tc,~]=atlinopt(rcor,0,1);
0316
0317
0318 if printouttext
0319
0320 disp([' before' ' ' '-->' ' ' 'after'])
0321 disp(['rq: ' num2str(std(rq0-refrdt(1,:))*1e3,'%3.3f') ' -> ' num2str(std(rqc-refrdt(1,:))*1e3,'%3.3f') '']);
0322 disp(['dX: ' num2str(std(dx0-refdispersion(1,:))*1e3,'%3.3f') ' -> ' num2str(std(dxc-refdispersion(1,:))*1e3,'%3.3f') 'mm'])
0323 disp(['tX: ' num2str((t0(1)-reftune(1)),'%3.3f') ' -> ' num2str((tc(1)-reftune(1)),'%3.3f') ''])
0324 disp(['tY: ' num2str((t0(2)-reftune(2)),'%3.3f') ' -> ' num2str((tc(2)-reftune(2)),'%3.3f') ''])
0325 disp([' ' 'min' ' ' 'mean' ' ' 'max'])
0326 disp(['qs:' num2str([min(qs-qs0) mean(qs-qs0) max(qs-qs0)]*1e0,' %2.2f ') ' 1/m2'])
0327 disp(['dpp: ' num2str(inCOD(5))])
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339 end
0340
0341
0342 end