source: MML/trunk/machine/SOLEIL/StorageRing/loco/buildlocofitparameters.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: 13.9 KB
Line 
1function [LocoMeasData, BPMData, CMData, RINGData, FitParameters, LocoFlags] = buildlocofitparameters(FileName, THERING)
2%BUILDLOCOFITPARAMETERS - SOLEIL LOCO fit parameters
3%
4%  [LocoMeasData, BPMData, CMData, RINGData, FitParameters, LocoFlags] = buildlocoinput(FileName)
5%
6% See Also buildlocoinput
7
8%
9%% Written By Laurent S. Nadolski
10
11%%%%%%%%%%%%%%
12% Input file %
13%%%%%%%%%%%%%%
14if nargin == 0
15    [FileName, DirectoryName, FilterIndex] = uigetfile('*.mat','Select a LOCO input file');
16    if FilterIndex == 0
17        return;
18    end
19    FileName = [DirectoryName, FileName];
20end
21
22load(FileName);
23
24%%%%%%%%%%%%%%%%%%%%%%
25% Remove bad devices %
26%%%%%%%%%%%%%%%%%%%%%%
27RemoveHCMDeviceList = [];
28RemoveVCMDeviceList = [];
29
30RemoveHBPMDeviceList = [];
31RemoveVBPMDeviceList = [];
32
33%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34% This function only works on the first iteration %
35%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
36if exist('BPMData','var') && length(BPMData)>1
37    BPMData = BPMData(1);
38end
39if exist('CMData','var') && length(CMData)>1
40    CMData = CMData(1);
41end
42if exist('FitParameters','var') && length(FitParameters)>1
43    FitParameters = FitParameters(1);
44end
45if exist('LocoFlags','var') && length(LocoFlags)>1
46    LocoFlags = LocoFlags(1);
47end
48if exist('LocoModel','var') && length(LocoModel)>1
49    LocoModel = LocoModel(1);
50end
51
52%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53% Make sure the start point in loaded in the AT model %
54%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55if ~isempty(FitParameters)
56    for i = 1:length(FitParameters.Params)
57        RINGData = locosetlatticeparam(RINGData, FitParameters.Params{i}, FitParameters.Values(i));
58    end
59end
60
61
62%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
63% LocoFlags to change from the default %
64%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 LocoFlags.Threshold = 1e-6;
66% LocoFlags.OutlierFactor = 10;
67% LocoFlags.SVmethod = 1e-2;
68% LocoFlags.SVmethod = 1:895;
69% LocoFlags.HorizontalDispersionWeight = 12.5;
70% LocoFlags.VerticalDispersionWeight = 12.5;
71% LocoFlags.AutoCorrectDelta = 'Yes';
72% LocoFlags.Coupling = 'No';
73% LocoFlags.Dispersion = 'No';
74% LocoFlags.Normalize = 'Yes';
75% LocoFlags.ResponseMatrixCalculatorFlag1 = 'Linear';
76% LocoFlags.ResponseMatrixCalculatorFlag2 = 'FixedPathLength';
77% LocoFlags.CalculateSigma = 'No';
78% LocoFlags.SinglePrecision = 'Yes';
79LocoFlags.Method.Name = 'Scaled Levenberg-Marquardt'
80
81% CMData.FitKicks    = 'Yes';
82% CMData.FitCoupling = 'No';
83%
84% BPMData.FitGains    = 'Yes';
85% BPMData.FitCoupling = 'No';
86
87
88% Corrector magnets to disable
89j = findrowindex(RemoveHCMDeviceList, LocoMeasData.HCM.DeviceList);
90if ~isempty(j)
91    irm = findrowindex(j(:),CMData.HCMGoodDataIndex(:));
92    CMData.HCMGoodDataIndex(irm) = [];
93end
94
95j = findrowindex(RemoveVCMDeviceList, LocoMeasData.VCM.DeviceList);
96if ~isempty(j)
97    irm = findrowindex(j(:),CMData.VCMGoodDataIndex(:));
98    CMData.VCMGoodDataIndex(irm) = [];
99end
100
101
102% BPMs to disable
103j = findrowindex(RemoveHBPMDeviceList, LocoMeasData.HBPM.DeviceList);
104if ~isempty(j)
105    irm = findrowindex(j(:),BPMData.HBPMGoodDataIndex(:));
106    BPMData.HBPMGoodDataIndex(irm) = [];
107end
108
109j = findrowindex(RemoveVBPMDeviceList, LocoMeasData.VBPM.DeviceList);
110if ~isempty(j)
111    irm = findrowindex(j(:),BPMData.VBPMGoodDataIndex(:));
112    BPMData.VBPMGoodDataIndex(irm) = [];
113end
114
115%%%%%%%%%%%%%%%%%
116% FitParameters %
117%%%%%%%%%%%%%%%%%
118
119% Individual magnets
120% For each parameter which is fit in the model a numerical response matrix
121% gradient needs to be determined.  The FitParameters data structure determines what
122% parameter in the model get varied and how are they grouped.  For no parameter fits, set
123% FitParameters.Params to an empty vector.
124%     FitParameters.Params = parameter group definition (cell array for AT)
125%     FitParameters.Values = Starting value for the parameter fit
126%     FitParameters.Deltas = change in parameter value used to compute the gradient (NaN forces loco to choose, see auto-correct delta flag below)
127%     FitParameters.FitRFFrequency = ('Yes'/'No') Fit the RF frequency?
128%     FitParameters.DeltaRF = Change in RF frequency when measuring "dispersion".
129%                             If the RF frequency is being fit the output is stored here.
130%
131% The FitParameters structure also contains the standard deviations of the fits:
132%     LocoValuesSTD
133%     FitParameters.DeltaRFSTD
134%
135% Note: FitParameters.DeltaRF is used when including dispersion in the response matrix.
136%       LocoMeasData.DeltaRF is not used directly in loco.  Usually one would set
137%       FitParameters.DeltaRF = LocoMeasData.DeltaRF as a starting point for the RF frequency.
138
139
140ModeCell = {'Fit by family (10 families)', 'Fit magnets by power supply (160)', ...
141    'Fit selected quad', 'Fit magnets by power supply (163) Nanoscopium', ...
142    'Impedance QSD', '163 + Impedance QSD'};
143[ButtonName, OKFlag] = listdlg('Name','BUILDLOCOINPUT','PromptString', ...
144    {'Fit Parameter Selection:','(Not including skew quadrupoles)'}, ...
145    'SelectionMode','single', 'ListString', ModeCell, 'ListSize', [350 125], 'InitialValue', 4);
146if OKFlag ~= 1
147    ButtonName = 1;
148end
149drawnow;
150FitParameters = [];
151n = 0;
152
153switch ButtonName
154    case 1  % By family
155
156        n = 0;
157        FitParameters.Deltas = [];
158        FitParameters.Values = [];
159
160        for k=1:10,
161            % Q1 K-values
162            n = n+1;
163            QI = findcells(THERING,'FamName',['Q' num2str(k)]);
164            FitParameters.Params{n} = mkparamgroup(THERING, QI, 'K');
165            FitParameters.Values = [FitParameters.Values; getcellstruct(THERING, 'K', QI(1))];
166            FitParameters.Deltas = [FitParameters.Deltas; NaN];
167        end
168
169
170    case 2  % Fit by power supply
171
172        n = 0;
173        FitParameters.Deltas = [];
174        FitParameters.Values = [];
175
176        % K-values
177        for k=1:10,
178            QI = findcells(THERING,'FamName',['Q' num2str(k)]);
179            for loop=1:length(QI)
180                n = n + 1;
181                FitParameters.Params{n} = mkparamgroup(THERING, QI(loop), 'K');
182            end
183            FitParameters.Values = [FitParameters.Values; getcellstruct(THERING, 'K', QI)];
184            FitParameters.Deltas = [FitParameters.Deltas; NaN * ones(length(QI),1)];
185        end
186
187    case 3  % Fit by power supply less than 160
188
189        n = 0;
190        FitParameters.Deltas = [];
191        FitParameters.Values = [];
192
193        % K-values
194        for k= [1 2 4 7 9],
195            QI = findcells(THERING,'FamName',['Q' num2str(k)]);
196            for loop=1:length(QI)
197                n = n + 1;
198                FitParameters.Params{n} = mkparamgroup(THERING, QI(loop), 'K');
199            end
200            FitParameters.Values = [FitParameters.Values; getcellstruct(THERING, 'K', QI)];
201            FitParameters.Deltas = [FitParameters.Deltas; NaN * ones(length(QI),1)];
202        end
203
204    case 4  % Fit by power supply with Nanoscopium: 163 quads
205        n = 0;
206        FitParameters.Deltas = [];
207        FitParameters.Values = [];
208
209        % K-values
210        for k=1:12,
211            QI = findcells(THERING,'FamName',['Q' num2str(k)]);
212            for loop=1:length(QI)
213                n = n + 1;
214                FitParameters.Params{n} = mkparamgroup(THERING, QI(loop), 'K');
215            end
216            FitParameters.Values = [FitParameters.Values; getcellstruct(THERING, 'K', QI)];
217            FitParameters.Deltas = [FitParameters.Deltas; NaN * ones(length(QI),1)];
218        end
219       
220    case 5  % Fit by power supply in the middle of straight sections
221        n = 0;
222        FitParameters.Deltas = [];
223        FitParameters.Values = [];
224
225        % K-values
226        for k=1:1,
227            QI = findcells(THERING,'FamName','QSD');
228            for loop=1:length(QI)
229                n = n + 1;
230                FitParameters.Params{n} = mkparamgroup(THERING, QI(loop), 'K');
231            end
232            FitParameters.Values = [FitParameters.Values; getcellstruct(THERING, 'K', QI)];
233            FitParameters.Deltas = [FitParameters.Deltas; 1e2 * ones(length(QI),1)];
234        end
235    case 6  % Fit by power supply in the middle of straight sections
236        n = 0;
237        FitParameters.Deltas = [];
238        FitParameters.Values = [];
239
240        % K-values
241        for k=1:12,
242            QI = findcells(THERING,'FamName',['Q' num2str(k)]);
243            for loop=1:length(QI)
244                n = n + 1;
245                FitParameters.Params{n} = mkparamgroup(THERING, QI(loop), 'K');
246            end
247            FitParameters.Values = [FitParameters.Values; getcellstruct(THERING, 'K', QI)];
248            FitParameters.Deltas = [FitParameters.Deltas; NaN * ones(length(QI),1)];
249        end
250       
251        % K-values
252        for k=1:1,
253            QI = findcells(THERING,'FamName','QSD');
254            for loop=1:length(QI)
255                n = n + 1;
256                FitParameters.Params{n} = mkparamgroup(THERING, QI(loop), 'K');
257            end
258            FitParameters.Values = [FitParameters.Values; getcellstruct(THERING, 'K', QI)];
259            FitParameters.Deltas = [FitParameters.Deltas; 1e2 * ones(length(QI),1)];
260        end
261    otherwise
262end
263
264%%%%%%%%%%%%%%%%%%%%%%%
265% Skew quadrupole fits
266%%%%%%%%%%%%%%%%%%%%%%%
267
268ModeCell = {'Fit at Sextupoles', 'Fit By Power Supply', 'Do Not Fit Skew Quadrupoles'};
269[ButtonName, OKFlag] = listdlg('Name','BUILDLOCOINPUT','PromptString','Skew Quadrupole Fits?', 'SelectionMode','single', 'ListString', ModeCell, 'ListSize', [350 125], 'InitialValue', 2);
270if OKFlag ~= 1
271    ButtonName = length(ModeCell);  % Default
272end
273
274switch ButtonName
275    case 1
276        fprintf('   Skew fit at Sextupoles needs work.\n\n');
277        %     case 1
278        %         % Fit skew quadrupoles in the sextupoles
279        %         SFI = findcells(RINGData.Lattice,'FamName','SF');
280        %         SFn = size(family2dev('SF'),1);
281        %
282        %         for loop = 1:length(SFI)
283        %             if length(SFI) == SFn
284        %                 n = n + 1;
285        %                 FitParameters.Params{n} = mkparamgroup(RINGData.Lattice,SFI(loop),'s');
286        %             elseif length(SFI) == 2*SFn
287        %                 % Split sextupoles
288        %                 N1 = 2*loop-1;
289        %                 N2 = 2*loop;
290        %                 n = n + 1;
291        %                 FitParameters.Params{n} = mkparamgroup(RINGData.Lattice,SFI([N1 N2]),'s');
292        %             else
293        %                 error('   Error setting the SF parameter group.');
294        %             end
295        %         end
296        %
297        %         FitParameters.Values = [FitParameters.Values; zeros(SFn,1)];
298        %         FitParameters.Deltas = [FitParameters.Deltas; 0.5e-2 * ones(SFn,1)];  % automatic delta determination does not work if starting value is 0
299        %
300        %
301        %         % Fit skew quadrupoles in the sextupoles
302        %         SDI = findcells(RINGData.Lattice,'FamName','SD');
303        %         SDn = size(family2dev('SD'),1);
304        %
305        %         for loop = 1:length(SDI)
306        %             if length(SDI) == SDn
307        %                 n = n + 1;
308        %                 FitParameters.Params{n} = mkparamgroup(RINGData.Lattice,SDI(loop),'s');
309        %             elseif length(SDI) == 2*SDn
310        %                 % Split sextupoles
311        %                 N1 = 2*loop-1;
312        %                 N2 = 2*loop;
313        %                 n = n + 1;
314        %                 FitParameters.Params{n} = mkparamgroup(RINGData.Lattice,SDI([N1 N2]),'s');
315        %             else
316        %                 error('   Error setting the SD parameter group.');
317        %             end
318        %         end
319        %
320        %         FitParameters.Values = [FitParameters.Values; zeros(SDn,1)];
321        %         FitParameters.Deltas = [FitParameters.Deltas; 0.5e-2 * ones(SDn,1)];  % automatic delta determination does not work if starting value is 0
322        %
323    case 2 % 'Fit by Power Supply'
324        % skew quad
325        QTI = family2atindex('QT',family2dev('QT'));
326        for loop=1:length(QTI),
327            n = n + 1;
328            FitParameters.Params{n} = mkparamgroup(THERING, QTI(loop), 'KS1');
329        end
330        FitParameters.Values = [FitParameters.Values; zeros(length(QTI),1)];
331        FitParameters.Deltas = [FitParameters.Deltas; 1 * ones(length(QTI),1)];
332
333    case 3 %'Don't Fit'
334        fprintf('   Skew quadrupole not fit.\n\n');
335
336    otherwise
337        fprintf('   Skew quadrupole not fit.\n\n');
338end
339
340fprintf('\n');
341
342
343%
344% %%%%%%%%%%%%%%%%%%%%%
345% % Parameter Weights %
346% %%%%%%%%%%%%%%%%%%%%%
347%
348% % For each cell of FitParameters.Weight.Value, a rows is added to the A matrix
349% % Index of the row of A:  FitParameters.Weight.Index{i}
350% % Value of the weight:    FitParameters.Weight.Value{i} / mean(Mstd)
351%
352% ModeCell = {'No Parameter Weigths', 'Add Parameter Weights'};
353% [ButtonName, OKFlag] = listdlg('Name','BUILDLOCOINPUT','PromptString','Weights?', 'SelectionMode','single', 'ListString', ModeCell, 'ListSize', [200 75], 'InitialValue', 2);
354% if OKFlag ~= 1
355%     ButtonName = 1;  % Default
356% end
357%
358% switch ButtonName
359%     case 1
360%         % No Weights
361%         if isfield(FitParameters, 'Weight')
362%             FitParameters = rmfield(FitParameters, 'Weight');
363%         end
364%     case 2
365%         %for ii = 1:length(FitParameters.Values)
366%         for ii = 1:160, % specific weight for K-values
367%             FitParameters.Weight.Index{ii,1} = ii;
368%             %FitParameters.Weight.Value{ii,1} = 0.1; % for old BPM noise
369%             FitParameters.Weight.Value{ii,1} = 0.001; % for new BPM noise (sept 07)
370%         end
371% end
372
373
374
375% RF parameter fit setup (There is a flag to actually do the fit)
376if isempty(LocoMeasData.DeltaRF)
377    FitParameters.DeltaRF = 100;  % It's good to have something here so that LOCO will compute a model dispersion
378else
379    FitParameters.DeltaRF = LocoMeasData.DeltaRF;
380end
381
382
383% File check
384[BPMData, CMData, LocoMeasData, LocoModel, FitParameters, LocoFlags, RINGData] = locofilecheck({BPMData, CMData, LocoMeasData, LocoModel, FitParameters, LocoFlags, RINGData});
385
386
387% Save
388save(FileName, 'LocoModel', 'FitParameters', 'BPMData', 'CMData', 'RINGData', 'LocoMeasData', 'LocoFlags');
389
Note: See TracBrowser for help on using the repository browser.