source: MML/trunk/machine/SOLEIL/StorageRing/bpm/measbpmphaseadvance.m @ 17

Last change on this file since 17 was 17, checked in by zhangj, 10 years ago

To have a stable version on the server.

  • Property svn:executable set to *
File size: 6.6 KB
Line 
1function measbpmphaseadvance(varargin)
2% BPMPHASEADVANCE - Measure bpmphase advance either from model or from data
3%
4%
5%  EXAMPLES
6%  1. measbpmphaseadvance('file', 'BPMTurnByTurn_2009-03-16_reboot_2kV_4kV.mat')
7%
8%
9%  See Also
10%  anabetaturnbyturn, getbpmrawdata
11
12
13
14%
15%% Written by Laurent S. Nadolski
16
17ModelFlag = 0;
18DisplayFlag = 1;
19FileFlag = 0;
20RadianFlag = 0; % 1 - for angle in radians 0 - for angle in degrees
21
22for i = length(varargin):-1:1
23    if strcmpi(varargin{i},'struct')
24        StructOutputFlag = 1;
25        varargin(i) = [];
26    elseif strcmpi(varargin{i},'numeric')
27        NumericOutputFlag = 1;
28        StructOutputFlag = 0;
29        varargin(i) = [];
30    elseif strcmpi(varargin{i},'archive')
31        ArchiveFlag = 1;
32        varargin(i) = [];
33    elseif strcmpi(varargin{i},'noarchive')
34        ArchiveFlag = 0;
35        varargin(i) = [];
36    elseif strcmpi(varargin{i},'Display')
37        DisplayFlag = 1;
38        varargin(i) = [];
39    elseif strcmpi(varargin{i},'NoDisplay')
40        DisplayFlag = 0;
41        varargin(i) = [];
42    elseif strcmpi(varargin{i},'Simulator') | strcmpi(varargin{i},'Model')
43        ModelFlag = 1;
44        varargin(i) = [];
45    elseif strcmpi(varargin{i},'Online')
46        ModelFlag = 0;
47        varargin(i) = [];
48    elseif strcmpi(varargin{i},'manual')
49        ModeFlag = varargin(i);
50        varargin(i) = [];
51    elseif strcmpi(varargin{i},'Degree')
52        RadianFlag = 0;
53        varargin(i) = [];
54    elseif strcmpi(varargin{i},'Radian')
55        RadianFlag = 1;
56        varargin(i) = [];
57    elseif strcmpi(varargin{i},'File')
58        FileFlag = 1;
59        ModelFlag = 0;
60        if length(varargin) > i
61            % Look for a filename as the next input
62            if ischar(varargin{i+1})
63                FileName = varargin{i+1};
64                [a a ext] = fileparts(FileName);
65                if isempty(ext)
66                    FileName = [FileName, '.mat'];
67                end
68                varargin(i+1) = [];
69            end
70        end
71        varargin(i) = [];
72    end
73end
74
75if ModelFlag
76    global THERING
77    %%
78    BPMindex = family2atindex('BPMx');
79    spos = getspos('BPMx');
80
81    %%
82    clear X01;
83    X0 = [1e-3 0 0*1e-3 0 0 0]';
84
85    nb = 1000; % turn number for tracking
86    X01 = zeros(nb, 6, length(THERING)+1);
87
88    for k=1:nb,
89        X01(k,:,:) = linepass(THERING, X0, 1:length(THERING)+1);
90        X0 = X01(k,:,end)';
91    end
92
93    % get positions
94    X = squeeze(X01(:,1,BPMindex))';
95    Z = squeeze(X01(:,3,BPMindex))';
96
97    % get tunes
98    nu = modeltune;
99
100    cosmmux = ones(length(BPMindex),1)*cos((1:nb)*2*pi*nu(1));
101    sinmmux = ones(length(BPMindex),1)*sin((1:nb)*2*pi*nu(1));
102    cosmmuz = ones(length(BPMindex),1)*cos((1:nb)*2*pi*nu(2));
103    sinmmuz = ones(length(BPMindex),1)*sin((1:nb)*2*pi*nu(2));
104
105    Ckx = sum(X.*cosmmux,2);
106    Skx = sum(X.*sinmmux,2);
107    Ckz = sum(Z.*cosmmuz,2);
108    Skz = sum(Z.*sinmmuz,2);
109
110else %Online
111    if FileFlag
112        if ~isempty(FileName) && exist(FileName, 'file')
113            a = load(FileName);
114            AM = getfield(a, 'AM');
115            bpmdevlist = dev2elem('BPMx',AM.DeviceList);
116        else
117            DirectoryName = getfamilydata('Directory','BPMData');
118            DirStart = pwd;
119            cd(DirectoryName);
120            FileName     = uigetfile('BPMTurnByTurn*.mat',DirectoryName);
121            cd(DirStart);
122            if  isequal(FileName,0)
123                disp('User pressed cancel')
124                return;
125            else
126                a = load(fullfile(DirectoryName, FileName));
127                AM = getfield(a, 'AM');
128                bpmdevlist = dev2elem('BPMx',AM.DeviceList);
129            end
130        end
131    else
132        AM = getbpmrawdata([],'Struct');
133    end
134    i1 = 50; i2 = 1000;
135    X = AM.Data.X(:,i1:i2);
136    Z = AM.Data.Z(:,i1:i2);
137
138    %nux = (calcnaff(X(1,:),X(1,:)*0,1,4))/2/pi
139    %nuz = (calcnaff(Z(1,:),Z(1,:)*0,1,4))/2/pi
140    [nux,nuz,ampx,ampz] = findfreq(X(1,:)',Z(1,:)')
141   
142    nu = [nux; nuz];
143    nu = [0.2018; 0.3167];
144    fprintf('Warning tunes used nux=%5.4f nuz=%5.4f\n', nu);
145   
146    nb = i2-i1+1;
147    len = size(X,1);
148    cosmmux = ones(len,1)*cos((1:nb)*2*pi*nu(1));
149    sinmmux = ones(len,1)*sin((1:nb)*2*pi*nu(1));
150    cosmmuz = ones(len,1)*cos((1:nb)*2*pi*nu(2));
151    sinmmuz = ones(len,1)*sin((1:nb)*2*pi*nu(2));
152
153    Ckx = sum(X.*cosmmux,2);
154    Skx = sum(X.*sinmmux,2);
155    Ckz = sum(Z.*cosmmuz,2);
156    Skz = sum(Z.*sinmmuz,2);
157
158end
159
160nb = length(Skx);
161
162% computes phases
163phikxfull = atan2(Skx,Ckx);
164phikzfull = atan2(Skz,Ckz);
165
166% Compute betatron amplitude
167Akx = 2*hypot(Ckx,Skx)/nb;
168Akz = 2*hypot(Ckz,Skz)/nb;
169
170fprintf('Horizontal betatron amplitude estimation Ak= %f mm +/- %f mm\n', ...
171    mean(Akx)*1e3, std(Akx)*1e3);
172
173fprintf('Vertical betatron amplitude estimation Ak= %f mm +/- %f mm\n', ...
174    mean(Akz)*1e3, std(Akz)*1e3);
175
176%% Display part
177if DisplayFlag
178   
179    if ~RadianFlag
180        rad2degree = 180/pi;
181        str1 = 'BPM phase advance [degree]';
182        str2 = 'BPM phase Error [degree]';
183    else
184        str1 = 'BPM phase advance [rad]';
185        str2 = 'BPM phase Error [rad]';
186    end
187
188    if ModelFlag
189        datestring = [datestr(clock,0) '(Model)'];
190    else
191        datestring = datestr(AM.TimeStamp,0);
192    end
193
194    posvect = getspos('BPMx');
195    posvect = posvect(2:end);
196   
197    figure
198    h1 = subplot(7,1,[1 3]);
199    [phiT dphikx] = phi_local(phikxfull);
200
201    plot(posvect, dphikx*rad2degree, 'r.-');hold on
202    [phix phiz] = modelphase('BPMx');
203
204   
205    dphix = diff(phix);
206    plot(posvect, dphix*rad2degree,'b.-')
207    legend('Measure','Theory')
208    ylabel(str1)
209
210    h2 = subplot(7,1,4);
211    drawlattice;
212
213    h3 = subplot(7,1,[5 7]);
214    plot(posvect, (dphikx-dphix)*rad2degree,'r.-')
215    ylabel(str2)
216    xlabel('BPM number')
217    %yaxis([20 40])
218    suptitle('Horizontal plane')
219
220    linkaxes([h1,h2,h3],'x');
221
222    addlabel(1,0,sprintf('%s', datestring));
223
224    figure
225    h1 = subplot(7,1,[1 3]);
226    [phiT dphikz] = phi_local(phikzfull);
227
228    plot(posvect, dphikz*rad2degree, 'r.-');hold on
229
230    dphiz = diff(phiz);
231    plot(posvect, dphiz*rad2degree,'b.-')
232    legend('Measure','Theory')
233    ylabel(str1)
234
235    h2 = subplot(7,1,4);
236    drawlattice;
237
238    h3 = subplot(7,1,[5 7]);
239    plot(posvect, (dphikz-dphiz)*rad2degree,'r.-')
240    ylabel(str2)
241    xlabel('BPM number')
242    suptitle('Vertical plane')
243    linkaxes([h1,h2,h3],'x');
244
245    addlabel(1,0,sprintf('%s', datestring));
246end
247
248
249%%subfunction
250function [phiT dphiT] = phi_local(phikxfull)
251
252phiT = 0;
253dphiT = [];
254for k = 2:length(phikxfull)
255    if phikxfull(k)*phikxfull(k-1) > 0
256        dphi = abs(phikxfull(k)-phikxfull(k-1));
257    else
258        dphi = abs(mod(phikxfull(k-1)-phikxfull(k),2*pi));
259    end
260    phiT = phiT + dphi;
261    dphiT(k-1) = dphi;
262end
263
264dphiT = dphiT(:);
265phiT  = phiT(:);
Note: See TracBrowser for help on using the repository browser.