Skip to content
semderiv.m 1.51 KiB
Newer Older
Simone Liuzzo's avatar
Simone Liuzzo committed
function [resp,tunes]=semderiv(mach,dpp,fitlist,blist,hslist,vslist,dispfunc)
%SEMDERIV       Compute derivatives of response matrix
%
%[resp,tunes]=semderiv(mach,fitidx,bpmidx,hsteeridx,vsteeridx)
%
%MACH:      AT machine structure
%FITIDX:   Index of varying skew quadrupoles
%BPMIDX:    Index of BPMs
%HSTEERIDX: Index of horizontal steerers
%VSTEERIDX: Index of vertical steerers
%
%RESP: response matrix for skew quads: [nbpms*(nhsteer+nvsteer) length(fitidx)]
%TUNES: initial tunes

if nargin < 7, dispfunc=@(i,itot) 0; end
nq=length(fitlist);
nbpm=length(blist);
nhst=length(hslist);
nvst=length(vslist);
[v,j,kdx]=unique([fitlist blist hslist vslist]); %#ok<ASGLU>
qidx=kdx(1:nq);
bidx=kdx(nq+(1:nbpm));
hsidx=kdx(nq+nbpm+(1:nhst));
vsidx=kdx(nq+nbpm+nhst+(1:nvst));
alphal=findspos(mach,length(mach)+1)*mcf(mach);

[lindata,beta,mu,eta]=atavedata(mach,dpp,[v length(mach)+1]);
mutot=lindata(end).mu;
tunes=mutot/2/pi;
phase=mu./mutot(ones(length(lindata),1),:);

hkq=responsem([beta(qidx,1) phase(qidx,1) eta(qidx,1)],[beta(hsidx,1) phase(hsidx,1) eta(hsidx,1)],{tunes(1),alphal});
vqb=responsem([beta(bidx,2) phase(bidx,2)],[beta(qidx,2) phase(qidx,2)],tunes(2));

vkq=responsem([beta(qidx,2) phase(qidx,2)],[beta(vsidx,2) phase(vsidx,2)],tunes(2));
hqb=responsem([beta(bidx,1) phase(bidx,1) eta(bidx,1)],[beta(qidx,1) phase(qidx,1) eta(qidx,1)],{tunes(1),alphal});

resp=zeros(nbpm*(nhst+nvst),nq);
for ib=1:nq
    rv=vqb(:,ib)*hkq(ib,:);	% ATTENTION
    rh=hqb(:,ib)*vkq(ib,:);
    resp(:,ib)=[rv(:);rh(:)];
    dispfunc(ib,nq);
end