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

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

Initial import--MML version from SOLEIL@2013

File size: 7.0 KB
Line 
1function OCS = setorbitH(varargin)
2%SETORBITH - Correct the horizontal orbit
3%
4%  INPUTS
5%  1. GoalOrbit - Goal orbit (vector or cell array (if BPM is a cell array))
6%                'Golden' for the golden orbit {Default}
7%                'Offset' for the offset orbit
8%  2. BPM - BPMDevList
9%  3. CM - CMDevList
10%  4. SVDIndex - vector, maximum number, 'All', or
11%                base on a threshold of min/max singular value {Default: 1e-3}
12%  5. NIter - Number of iterations  {Default: 1}
13%            (NIter can be 0, see note 1 below)
14%  6. BPMWeight - Weight applied to the BPMs (OCS.BPMWeight)
15%  7. FLAGS  - 'Abs' or 'Absolute' - GoalOrbit is an absolute orbit {Default}
16%              'Inc' or 'Incremental' - GoalOrbit is a incremental change
17%              'ModelResp' - calculate the model response matrix {Default: measured response matrix}
18%              'SetSP' - Make the setpoint change {Default}
19%              'NoSetSP' - Don't set the magnets, just return the OCS
20%              'Display' - plot orbit information before applying the correction
21%              'FitRF' - Fit and change the RF frequency (use rmdisp before
22%                        calling this function to remove the dispersion orbit)
23%              'MeasDisp' - measure the dispersion  {Default}
24%              'ModelDisp' - calculate the model dispersion
25%              'GoldenDisp' - use the golden dispersion
26%              'TypeFlag' - 'SOFB' {Default} or 'FOFB'
27%              And the usual Units and Mode flags
28%
29%  OUTPUTS
30%  1. OCS    - New orbit correction structure (OCS)
31%
32%  See Also setorbit, setorbitV
33
34%
35%% Written by Laurent S. Nadolski
36
37TypeFlag = 'SOFB';
38GoldenFlag = 0;
39% Default BPM Family
40BPMFamily = 'BPMx';
41BPMlist = [];
42
43% Default corrector
44CMlist = [];
45
46OCSFlags    = [];
47InputFlags  = [];
48
49% Defaults values
50OCS.NIter           = 1; % Number of iteration
51OCS.SVDIndex        = 57; % number of eigenvector for correction
52OCS.IncrementalFlag = 'No';
53OCS.FitRF       = 0; % take RF as a corrector
54
55% Input parsing
56for i = length(varargin):-1:1
57    if isstruct(varargin{i})
58        % Ignore structures
59    elseif iscell(varargin{i})
60        % Ignore cells
61    elseif strcmpi(varargin{i},'Golden')
62        % Use the golden orbit
63        GoldenFlag    = 1;
64        OCS.GoalOrbit = 'Golden';
65        OCSFlags      = [OCSFlags varargin(i)];
66        varargin(i)   = [];
67    elseif strcmpi(varargin{i},'Offset')
68        % Use the offset orbit
69        OCS.GoalOrbit = 'Offset';
70        OCSFlags      = [OCSFlags varargin(i)];
71        varargin(i)   = [];
72    elseif strcmpi(varargin{i},'Display')
73        OCSFlags    = [OCSFlags varargin(i)];
74        varargin(i) = [];
75    elseif strcmpi(varargin{i},'NoDisplay') || ...
76            strcmpi(varargin{i},'No Display')
77        InputFlags  = [InputFlags varargin(i)];
78        varargin(i) = [];
79    elseif strcmpi(varargin{i},'ModelResp')
80        OCSFlags      = [OCSFlags varargin(i)];
81        varargin(i)   = [];
82    elseif strcmpi(varargin{i},'FitRF')
83        OCSFlags    = [OCSFlags varargin(i)];
84        OCS.SVDIndex =  OCS.SVDIndex + 1;
85        varargin(i) = [];
86    elseif strcmpi(varargin{i},'ModelDisp')
87        OCSFlags    = [OCSFlags varargin(i)];
88        varargin(i) = [];
89    elseif strcmpi(varargin{i},'MeasDisp')
90        OCSFlags    = [OCSFlags varargin(i)];
91        varargin(i) = [];
92    elseif strcmpi(varargin{i},'GoldenDisp')
93        OCSFlags    = [OCSFlags varargin(i)];
94        varargin(i) = [];
95    elseif strcmpi(varargin{i},'Inc') || strcmpi(varargin{i},'Incremental')
96        OCSFlags        = [OCSFlags varargin(i)];
97        varargin(i)     = [];
98    elseif strcmpi(varargin{i},'Abs') || strcmpi(varargin{i},'Absolute')
99        OCSFlags        = [OCSFlags varargin(i)];
100    elseif strcmpi(varargin{i},'SetSP')
101        InputFlags  = [InputFlags varargin(i)];
102        varargin(i) = [];
103    elseif strcmpi(varargin{i},'NoSetSP')
104        InputFlags  = [InputFlags varargin{i}];
105        varargin(i) = [];
106    elseif strcmpi(varargin{i},'Simulator') || strcmpi(varargin{i},'Model')
107        OCSFlags    = [OCSFlags varargin(i)];
108        InputFlags  = [InputFlags varargin(i)];
109        varargin(i) = [];
110    elseif strcmpi(varargin{i},'Online')
111        OCSFlags    = [OCSFlags varargin(i)];
112        InputFlags  = [InputFlags varargin(i)];
113        varargin(i) = [];
114    elseif strcmpi(varargin{i},'Manual')
115        OCSFlags    = [OCSFlags varargin(i)];
116        InputFlags  = [InputFlags varargin(i)];
117        varargin(i) = [];
118    elseif strcmpi(varargin{i},'Physics')
119        OCSFlags    = [OCSFlags varargin(i)];
120        InputFlags  = [InputFlags varargin(i)];
121        varargin(i) = [];
122    elseif strcmpi(varargin{i},'Hardware')
123        OCSFlags    = [OCSFlags varargin(i)];
124        InputFlags  = [InputFlags varargin(i)];
125        varargin(i) = [];
126    elseif strcmpi(varargin{i},'Archive')
127        % Just remove
128        varargin(i) = [];
129    elseif strcmpi(varargin{i},'noarchive')
130        % Just remove
131        varargin(i) = [];
132    elseif strcmpi(varargin{i},'struct')
133        % Just remove
134        varargin(i) = [];
135    elseif strcmpi(varargin{i},'numeric')
136        % Just remove
137        varargin(i) = [];
138    elseif strcmpi(varargin{i},'FOFB')
139        TypeFlag = 'FOFB';
140        varargin(i) = [];
141    elseif strcmpi(varargin{i},'SOFB')
142        TypeFlag = 'SOFB';
143        varargin(i) = [];
144    end
145end
146
147% switchard for typical orbit correction at SOLEIL
148switch TypeFlag
149    case 'FOFB'
150        % number of eigenvector for correction
151        OCS.SVDIndex        = 40;
152        % Default corrector Family
153        CMFamily  = 'FHCOR';
154    case 'SOFB'
155        % number of eigenvector for correction
156        OCS.SVDIndex        = 57;
157        % Default corrector Family
158        CMFamily  = 'HCOR';
159    otherwise
160        error('TypeFlag invalid')
161end
162
163% Get Goal orbit
164if length(varargin) >= 1 && ~GoldenFlag
165    OCS.GoalOrbit = varargin{1};
166    varargin(1) = [];
167end
168
169% Get BPM knobs
170if length(varargin) >= 1
171    BPMlist = varargin{1};
172    varargin(1) = [];
173end
174
175% Get CM knobs
176if length(varargin) >= 1
177    CMlist = varargin{1};
178    varargin(1) = [];
179end
180
181% Get SVDIndex
182if length(varargin) >= 1
183    OCS.SVDIndex = varargin{1};
184    varargin(1) = [];
185end
186
187% Get NIter
188if length(varargin) >= 1
189    OCS.NIter = varargin{1};
190    varargin(1) = [];
191end
192
193% Get BPMWeight
194if length(varargin) >= 1
195    OCS.BPMWeight = varargin{1};
196    varargin(1) = [];
197end
198
199
200%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
201% Build up Orbit correction Structures   %
202%  for setorbit programme : OCSx and OCSy%
203%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
204%  ORBIT CORRECTION STRUCTURE (OCS)
205%    OCS.BPM (data structure)
206%    OCS.CM  (data structure)
207%    OCS.GoalOrbit
208%    OCS.NIter
209%    OCS.SVDIndex
210%    OCS.IncrementalFlag = 'Yes'/'No'
211%    OCS.BPMWeight
212%    OCS.Flags = { 'FitRF' , etc.  }
213
214% Horizontal plane
215OCS.BPM = getx(BPMlist, 'struct');
216
217if ~isfield(OCS, 'GoalOrbit')|| any(isnan(OCS.GoalOrbit))
218    Xgoal = getgolden(BPMFamily, BPMlist);
219    OCS.GoalOrbit = Xgoal;
220end
221
222OCS.CM = getsp(CMFamily, CMlist, 'struct');
223OCS.Flags = OCSFlags;
224
225if isempty(InputFlags)
226    OCS = setorbit(OCS);
227else
228    OCS = setorbit(OCS,InputFlags);
229end
Note: See TracBrowser for help on using the repository browser.