1 | function [nux nuz Xcod Zcod] = fourturnalgorithm(varargin) |
---|
2 | %FOURTURNALGORITHM - Compute tunes and closed orbit knowing 4 subsequent turn by turn data |
---|
3 | % |
---|
4 | % INPUTS |
---|
5 | % Optional - 'Model', 'Online' |
---|
6 | % - 'Display', 'NoDisplay' |
---|
7 | % |
---|
8 | % OUTPUTS |
---|
9 | % 1. nux - horizontal tune |
---|
10 | % 2. nux - vertical tune |
---|
11 | % 3. Xcod - horizontal closed orbit |
---|
12 | % 4. Zcod - horizontal closed orbit |
---|
13 | |
---|
14 | % ALGORITHM |
---|
15 | % EPAC94, Koscielniak, pp 929-931 |
---|
16 | |
---|
17 | % |
---|
18 | % Written by Laurent S. Nadolski |
---|
19 | |
---|
20 | % Get turn by turn data |
---|
21 | |
---|
22 | OnlineFlag = 1; |
---|
23 | ArchiveFlag = 0; |
---|
24 | FileFlag = 0; |
---|
25 | DisplayFlag = 1; |
---|
26 | |
---|
27 | for i = length(varargin):-1:1 |
---|
28 | if strcmpi(varargin{i},'Display') |
---|
29 | DisplayFlag = 1; |
---|
30 | varargin2 = {varargin2{:} varargin{i}}; |
---|
31 | varargin(i) = []; |
---|
32 | elseif strcmpi(varargin{i},'NoDisplay') |
---|
33 | DisplayFlag = 0; |
---|
34 | varargin2 = {varargin2{:} varargin{i}}; |
---|
35 | varargin(i) = []; |
---|
36 | elseif strcmpi(varargin{i},'Model') |
---|
37 | OnlineFlag = 0; |
---|
38 | varargin(i) = []; |
---|
39 | elseif strcmpi(varargin{i},'Online') |
---|
40 | OnlineFlag = 1; |
---|
41 | varargin(i) = []; |
---|
42 | elseif strcmpi(varargin{i},'File') |
---|
43 | FileFlag = 1; |
---|
44 | varargin(i) = []; |
---|
45 | elseif strcmpi(varargin{i},'Archive') |
---|
46 | ArchiveFlag = 1; |
---|
47 | varargin2 = [varargin2 varargin{i}]; |
---|
48 | varargin(i) = []; |
---|
49 | elseif strcmpi(varargin{i},'NoArchive') |
---|
50 | ArchiveFlag = 0; |
---|
51 | varargin2 = [varargin2 varargin{i}]; |
---|
52 | varargin(i) = []; |
---|
53 | elseif strcmpi(varargin{i},'Struct') |
---|
54 | StructureFlag = 1; |
---|
55 | varargin2 = [varargin2 varargin{i}]; |
---|
56 | varargin(i) = []; |
---|
57 | end |
---|
58 | end |
---|
59 | |
---|
60 | BPMindex = family2atindex('BPMx'); |
---|
61 | spos = getspos('BPMx'); |
---|
62 | |
---|
63 | if ~OnlineFlag % Model |
---|
64 | global THERING |
---|
65 | |
---|
66 | X00 = [1e-3 0 1e-3 0 0 0]'; |
---|
67 | X01 = linepass(THERING, X00(:,end), 1:length(THERING)+1); |
---|
68 | X02 = linepass(THERING, X01(:,end), 1:length(THERING)+1); |
---|
69 | X03 = linepass(THERING, X02(:,end), 1:length(THERING)+1); |
---|
70 | X04 = linepass(THERING, X03(:,end), 1:length(THERING)+1); |
---|
71 | |
---|
72 | [X1 X2 X3 X4 ] = deal(X01(1,BPMindex)*1e3, X02(1,BPMindex)*1e3, X03(1,BPMindex)*1e3, X04(1,BPMindex)*1e3); |
---|
73 | [Z1 Z2 Z3 Z4 ] = deal(X01(3,BPMindex)*1e3, X02(3,BPMindex)*1e3, X03(3,BPMindex)*1e3, X04(3,BPMindex)*1e3); |
---|
74 | |
---|
75 | else % Online |
---|
76 | [X Z] = anabpmnfirstturns([],4,10,'NoDisplay','NoMaxSum'); |
---|
77 | [X1 X2 X3 X4] = deal(X(1,:),X(2,:),X(3,:),X(4,:)); |
---|
78 | [Z1 Z2 Z3 Z4] = deal(Z(1,:),Z(2,:),Z(3,:),Z(4,:)); |
---|
79 | end |
---|
80 | |
---|
81 | %% Algo 4 turns |
---|
82 | nux = acos((X2-X1+X4-X3)/2./(X3-X2))/2/pi; |
---|
83 | nuz = acos((Z2-Z1+Z4-Z3)/2./(Z3-Z2))/2/pi; |
---|
84 | |
---|
85 | Xcod = (X3.*(X1+X3)-X2.*(X2+X4))./((X1-X4) + 3*(X3-X2)); |
---|
86 | Zcod = (Z3.*(Z1+Z3)-Z2.*(Z2+Z4))./((Z1-Z4) + 3*(Z3-Z2)); |
---|
87 | |
---|
88 | % %% |
---|
89 | % figure(77) |
---|
90 | % plot(spos,X1,'.r'); hold on; |
---|
91 | % plot(spos,X2,'.b') |
---|
92 | % plot(spos,X3,'.g') |
---|
93 | % plot(spos,X4,'.k') |
---|
94 | % xlabel('s-position [m]'); |
---|
95 | % ylabel('4 turns'); |
---|
96 | % grid on |
---|
97 | % %% |
---|
98 | if DisplayFlag |
---|
99 | figure(78) |
---|
100 | plot(spos,Xcod,'b',spos,Zcod,'r'); |
---|
101 | xlabel('s-position [m]'); |
---|
102 | ylabel('Close orbit [mm]'); |
---|
103 | legend('Xcod','Zcod'); |
---|
104 | grid on |
---|
105 | |
---|
106 | figure(79) |
---|
107 | subplot(2,2,[1 2]) |
---|
108 | plot(spos,nux,'b.',spos,nuz,'r.') |
---|
109 | xlabel('s-position [m]') |
---|
110 | ylabel('tune fractionnal part') |
---|
111 | title('4-turn Algorithm') |
---|
112 | legend(sprintf('nux %f',mean(nux(~isnan(nux)))),sprintf('nuz %f',mean(nuz(~isnan(nuz))))); |
---|
113 | grid on |
---|
114 | yaxis([0 0.5]) |
---|
115 | |
---|
116 | subplot(2,2,3) |
---|
117 | hist(nux(~isnan(nux))) |
---|
118 | xlabel('Fractional tune nux') |
---|
119 | grid on |
---|
120 | |
---|
121 | subplot(2,2,4) |
---|
122 | hist(nuz(~isnan(nuz))) |
---|
123 | xlabel('Fractional tune nuz') |
---|
124 | grid on |
---|
125 | |
---|
126 | end |
---|