1 | %function outM = idCreateModelOrbDistMatr(x_or_z, ModelData, indUpstrBPM, sectLenBwBPMs, idCenPos, idLen, idKickOfst) |
---|
2 | function [outM, outR0] = idCreateModelOrbDistMatr(x_or_z, ModelData, GeomParUnd) |
---|
3 | |
---|
4 | % Creates orbit distortion matrix to simulate effect of an ID on e-beam |
---|
5 | % transverse positions along the ring |
---|
6 | |
---|
7 | %indDownstrBPM = GeomParUnd.indUpstrBPM + 1; % To precise this |
---|
8 | %if indDownstrBPM == 121 |
---|
9 | % indDownstrBPM = 1; |
---|
10 | %end |
---|
11 | |
---|
12 | ringCircum = ModelData.circ; %354; % [m] |
---|
13 | alpMomCompact = ModelData.alp1; %0.0004 @Soleil |
---|
14 | |
---|
15 | %numBPMsToSkip = length(arIndsBPMsToSkip); |
---|
16 | |
---|
17 | %[Btx, Btz] = modelbeta(strBPM); |
---|
18 | %[Alpx, Alpz] = modeltwiss('alpha', strBPM); |
---|
19 | %[Etax, Etaz] = modeldisp(strBPM); % Ask Laurent or Pascale |
---|
20 | %[Phx, Phz] = modelphase(strBPM); |
---|
21 | %Nuxz = modeltune; |
---|
22 | |
---|
23 | Bt = ModelData.Btx; Alp = ModelData.Alpx; Eta = ModelData.Etax; Ph = ModelData.Phx; Nu = ModelData.Nuxz(1); |
---|
24 | if strcmp(x_or_z, 'z') ~= 0 |
---|
25 | Bt = ModelData.Btz; Alp = ModelData.Alpz; Eta = ModelData.Etaz; Ph = ModelData.Phz; Nu = ModelData.Nuxz(2); |
---|
26 | end |
---|
27 | |
---|
28 | numBPMsAr = size(Bt); |
---|
29 | numBPMs = numBPMsAr(1); |
---|
30 | |
---|
31 | indDownstrBPM = GeomParUnd.indUpstrBPM + 1; % To precise this |
---|
32 | if indDownstrBPM > numBPMs |
---|
33 | indDownstrBPM = 1; |
---|
34 | end |
---|
35 | |
---|
36 | %distUpstrBPM_Kick1 = GeomParUnd.idCenPos - 0.5*GeomParUnd.sectLenBwBPMs - 0.5*GeomParUnd.idLen + GeomParUnd.idKickOfst; |
---|
37 | %distUpstrBPM_Kick2 = GeomParUnd.idCenPos - 0.5*GeomParUnd.sectLenBwBPMs + 0.5*GeomParUnd.idLen - GeomParUnd.idKickOfst; |
---|
38 | %distUpstrBPM_Kick0 = GeomParUnd.idCenPos; |
---|
39 | % modifié le 24/10/08 par Pascale et Fabrice avec accord Oleg |
---|
40 | distUpstrBPM_Kick1 = GeomParUnd.idCenPos + 0.5*GeomParUnd.sectLenBwBPMs - 0.5*GeomParUnd.idLen + GeomParUnd.idKickOfst; |
---|
41 | distUpstrBPM_Kick2 = GeomParUnd.idCenPos + 0.5*GeomParUnd.sectLenBwBPMs + 0.5*GeomParUnd.idLen - GeomParUnd.idKickOfst; |
---|
42 | distUpstrBPM_Kick0 = GeomParUnd.idCenPos + 0.5*GeomParUnd.sectLenBwBPMs; |
---|
43 | |
---|
44 | btUpstr = Bt(GeomParUnd.indUpstrBPM); |
---|
45 | alpUpstr = Alp(GeomParUnd.indUpstrBPM); |
---|
46 | etaUpstr = Eta(GeomParUnd.indUpstrBPM); |
---|
47 | etaDownstr = Eta(indDownstrBPM); |
---|
48 | phUpstr = Ph(GeomParUnd.indUpstrBPM); |
---|
49 | %phDownstr = Ph(indDownstrBPM); |
---|
50 | |
---|
51 | gamUpstr = (1 + alpUpstr*alpUpstr)/btUpstr; |
---|
52 | twoAlpUpstr = 2*alpUpstr; |
---|
53 | btKick1 = btUpstr - distUpstrBPM_Kick1*twoAlpUpstr + distUpstrBPM_Kick1*distUpstrBPM_Kick1*gamUpstr; |
---|
54 | btKick2 = btUpstr - distUpstrBPM_Kick2*twoAlpUpstr + distUpstrBPM_Kick2*distUpstrBPM_Kick2*gamUpstr; |
---|
55 | btKick0 = btUpstr - distUpstrBPM_Kick0*twoAlpUpstr + distUpstrBPM_Kick0*distUpstrBPM_Kick0*gamUpstr; |
---|
56 | |
---|
57 | etaDifBwBPMs = etaDownstr - etaUpstr; |
---|
58 | etaKick1 = etaUpstr + (distUpstrBPM_Kick1/GeomParUnd.sectLenBwBPMs)*etaDifBwBPMs; % Ask Laurent or Pascale |
---|
59 | etaKick2 = etaUpstr + (distUpstrBPM_Kick2/GeomParUnd.sectLenBwBPMs)*etaDifBwBPMs; |
---|
60 | etaKick0 = etaUpstr + (distUpstrBPM_Kick0/GeomParUnd.sectLenBwBPMs)*etaDifBwBPMs; |
---|
61 | |
---|
62 | %phDifBwBPMs = phDownstr - phUpstr; |
---|
63 | %phKick1 = phUpstr + (distUpstrBPM_Kick1/GeomParUnd.sectLenBwBPMs)*phDifBwBPMs; % Ask Laurent or Pascale |
---|
64 | %phKick2 = phUpstr + (distUpstrBPM_Kick2/GeomParUnd.sectLenBwBPMs)*phDifBwBPMs; |
---|
65 | atan_alpUpstr = atan(alpUpstr); |
---|
66 | phKick1 = phUpstr + atan_alpUpstr + atan(gamUpstr*distUpstrBPM_Kick1 - alpUpstr); |
---|
67 | phKick2 = phUpstr + atan_alpUpstr + atan(gamUpstr*distUpstrBPM_Kick2 - alpUpstr); |
---|
68 | phKick0 = phUpstr + atan_alpUpstr + atan(gamUpstr*distUpstrBPM_Kick0 - alpUpstr); |
---|
69 | |
---|
70 | invTwoSinPiNu = 1./(2.*sin(pi*Nu)); |
---|
71 | invAlpCircum = 1./(alpMomCompact*ringCircum); |
---|
72 | |
---|
73 | %numBPMsAr = size(Bt); |
---|
74 | %numBPMs = numBPMsAr(1); |
---|
75 | %outM = zeros(numBPMs - numBPMsToSkip, 2); |
---|
76 | |
---|
77 | outM = zeros(numBPMs, 2); %Main matrix for 2 virual kicks located (roughly) at undulator extremities and simulating 1st order effects |
---|
78 | outR0 = zeros(numBPMs, 1); %Vector for 1 virtual kick located in the middle of the undulator and simulating 2nd order effect |
---|
79 | |
---|
80 | %countBPM = 1; |
---|
81 | for i = 1:numBPMs |
---|
82 | %if(numBPMsToSkip > 0) |
---|
83 | % skipThisBPM = 0; |
---|
84 | % for j = 1:numBPMsToSkip |
---|
85 | % if(i == arIndsBPMsToSkip(j)) |
---|
86 | % skipThisBPM = 1; |
---|
87 | % break; |
---|
88 | % end |
---|
89 | % end |
---|
90 | % if(skipThisBPM ~= 0) |
---|
91 | % continue; |
---|
92 | % end |
---|
93 | %end |
---|
94 | %outM(countBPM, 1) = invTwoSinPiNu*sqrt(Bt(i)*btKick1)*cos(abs(Ph(i) - phKick1) - pi*Nu) + invAlpCircum*Eta(i)*etaKick1; |
---|
95 | %outM(countBPM, 2) = invTwoSinPiNu*sqrt(Bt(i)*btKick2)*cos(abs(Ph(i) - phKick2) - pi*Nu) + invAlpCircum*Eta(i)*etaKick2; |
---|
96 | %countBPM = countBPM + 1; |
---|
97 | |
---|
98 | outM(i, 1) = invTwoSinPiNu*sqrt(Bt(i)*btKick1)*cos(abs(Ph(i) - phKick1) - pi*Nu) + invAlpCircum*Eta(i)*etaKick1; |
---|
99 | outM(i, 2) = invTwoSinPiNu*sqrt(Bt(i)*btKick2)*cos(abs(Ph(i) - phKick2) - pi*Nu) + invAlpCircum*Eta(i)*etaKick2; |
---|
100 | outR0(i, 1) = invTwoSinPiNu*sqrt(Bt(i)*btKick0)*cos(abs(Ph(i) - phKick0) - pi*Nu) + invAlpCircum*Eta(i)*etaKick0; |
---|
101 | end |
---|