source: MML/trunk/machine/SOLEIL/StorageRing/bpm/fourturnalgorithm.m @ 4

Last change on this file since 4 was 4, checked in by zhangj, 11 years ago

Initial import--MML version from SOLEIL@2013

File size: 3.3 KB
Line 
1function [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
22OnlineFlag  = 1;
23ArchiveFlag = 0;
24FileFlag    = 0;
25DisplayFlag = 1;
26
27for 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
58end
59
60BPMindex = family2atindex('BPMx');
61spos = getspos('BPMx');
62
63if ~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
75else % 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,:));
79end
80
81%% Algo 4 turns
82nux = acos((X2-X1+X4-X3)/2./(X3-X2))/2/pi;
83nuz = acos((Z2-Z1+Z4-Z3)/2./(Z3-Z2))/2/pi;
84
85Xcod = (X3.*(X1+X3)-X2.*(X2+X4))./((X1-X4) + 3*(X3-X2));
86Zcod = (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% %%
98if 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
126end
Note: See TracBrowser for help on using the repository browser.