source: MML/trunk/applications/loco/plotlocochi2.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.8 KB
Line 
1function [dchi2quad, chi2_par, chi2_bpm, chi2_cm, chi2_min, chi2_0] = plotlocochi2(varargin)
2%PLOTLOCOCHI2 - Calculate the contribution to chi2 of each fit parameter in LOCO
3%
4%  [dchi2quad, chi2_par, chi2_bpm, chi2_cm, chi2_min, chi2_0] = plotlocochi2(LOCOFileName, Niter, ParameterCombination)
5%  [dchi2quad, chi2_par, chi2_bpm, chi2_cm, chi2_min, chi2_0] = plotlocochi2(BPMData, CMData, LocoMeasData, LocoModel, FitParameters, LocoFlags, RINGData, Niter, ParameterCombination)
6%
7%   INPUTS
8%   1. LOCOFileName - LOCO file name
9%   2. Niter - LOCO iteration number (0,1, ...) {Default: last iteration}
10%   Optional Inputs
11%   3. ParameterCombination - Index of a particular combination of parameters to analyze
12%                             Only a scale output will be given when using this input.
13%                             {Default: Don't use this input.  Analyze all parameters individually.}
14%   4. DisplayFlag - 'Display' or 'Plot'     - Plot the data {Default if no outputs exist}
15%                    'NoDisplay' or 'NoPlot' - Output only   {Default if outputs exist}
16%
17%   OUTPUTS
18%   1. dchi2quad - change of chi^2 if each quadrupole is set to initial value
19%   2. chi2_par  - chi^2 of the last  iteration with the fit parameters set to the first iteration
20%   3. chi2_bpm  - chi^2 of the last  iteration with the BPMs fits set to the first iteration
21%   4. chi2_cm   - chi^2 of the last  iteration with the CMs  fits set to the first iteration
22%   5. chi2_min  - chi^2 of the last  iteration
23%   6. chi2_0    - chi^2 of the first iteration
24%
25%   Note: "fit parameters" refer to just what is in the FitParameter structure
26%   
27%   dChi^2 for all Fit Parameters  = chi2_par - chi2_min  (not including BPMs or corrector magnets)
28%   dChi^2 for all BPMs            = chi2_bpm - chi2_min
29%   dChi^2 for all CMs             = chi2_cm  - chi2_min
30
31
32% Start from itereration
33i0 = 1;
34
35
36% Parse input
37LOCOFileName = '';
38Niter = [];
39DisplayFlag = '';
40
41% First strip out the strings
42for i = length(varargin):-1:1
43    if ischar(varargin{i})
44        if any(strcmpi(varargin{i},{'NoDisplay','NoPlot'}))
45            DisplayFlag = 'NoDisplay';
46            varargin(i) = [];
47        elseif any(strcmpi(varargin{i},{'Display','Plot'}))
48            DisplayFlag = 'Display';
49            varargin(i) = [];
50        else
51            LOCOFileName = varargin{i};
52            varargin(i) = [];
53        end
54    end
55end
56
57if length(varargin) == 7 || length(varargin) == 8
58    BPMData       = varargin{1};
59    CMData        = varargin{2};
60    LocoMeasData  = varargin{3};
61    LocoModel     = varargin{4};
62    FitParameters = varargin{5};
63    LocoFlags     = varargin{6};
64    RINGData      = varargin{7};
65    varargin(1:7) = [];
66else
67    % LOCO file
68    if isempty(LOCOFileName)
69        [FileName, PathName] = uigetfile('*.mat', 'Select A LOCO File', [getfamilydata('Directory','DataRoot'), 'LOCO', filesep]);
70
71        if isequal(FileName,0) || isequal(PathName,0)
72            return
73        end
74        LOCOFileName= [PathName, FileName];
75    end
76
77    load(LOCOFileName);
78end
79
80if ~isempty(varargin)
81    Niter = varargin{1};
82    varargin(1) = [];
83end
84if ~isempty(varargin)
85    ParameterCombination = varargin{1};
86    varargin(1) = [];
87else
88    ParameterCombination = [];
89end
90
91
92% Display flag
93if isempty(DisplayFlag)
94    if nargout == 0
95        DisplayFlag = 'Display';
96    else
97        DisplayFlag = 'NoDisplay';
98    end
99end
100
101
102if strcmpi(DisplayFlag, 'Display') && isempty(ParameterCombination)
103    d = .08;
104    %h_fig = gcf;
105    h_axes = gca;
106    %clf reset;
107    plot([0 1],[0 1],'w');
108    set(gca,'XTick',[]);
109    set(gca,'YTick',[]);
110    cla;
111    title(' '); xlabel(' '); ylabel(' ');
112    set(gca,'box','on');
113    text(.03,.6-0*d, sprintf('   Please wait ...'), 'FontSize', 12, 'Units','Normalized');
114    text(.03,.6-1*d, sprintf('   Computing \\Delta \\chi^2 verses fit parameter'), 'FontSize', 12, 'Units','Normalized');
115    drawnow;
116
117    hbar = waitbar(0, sprintf('Computing \\Delta \\chi^2.  Close waitbar to stop calculation.'));
118end
119
120
121% Iterations
122if isempty(Niter)
123    Niter = length(FitParameters)-1;
124end
125if Niter<0 || Niter>(length(FitParameters)-1)
126    error('Iteration number must be between 0 and %d', length(FitParameters)-1);
127end
128
129i1 = Niter + 1;
130
131
132if nargout >= 6
133chi2_0   = calclocochi2(LocoModel(i0), LocoMeasData, BPMData(i0), CMData(i0), FitParameters(i0), LocoFlags(i0), RINGData);
134end
135chi2_bpm = calclocochi2(LocoModel(i1), LocoMeasData, BPMData(i0), CMData(i1), FitParameters(i1), LocoFlags(i1), RINGData);
136chi2_cm  = calclocochi2(LocoModel(i1), LocoMeasData, BPMData(i1), CMData(i0), FitParameters(i1), LocoFlags(i1), RINGData);
137chi2_par = calclocochi2(LocoModel(i1), LocoMeasData, BPMData(i1), CMData(i1), FitParameters(i0), LocoFlags(i1), RINGData);
138chi2_min = calclocochi2(LocoModel(i1), LocoMeasData, BPMData(i1), CMData(i1), FitParameters(i1), LocoFlags(i1), RINGData);
139
140
141if isempty(ParameterCombination)
142   
143    % Compute all fit parameters
144    for ii = 1:length(FitParameters(i1).Values)
145        FitParameters_m = FitParameters(i1);
146        FitParameters_m.Values(ii) = FitParameters(i0).Values(ii);
147        chi2_qii = calclocochi2(LocoModel(i1),LocoMeasData, BPMData(i1), CMData(i1), FitParameters_m, LocoFlags(i1), RINGData);
148        dchi2quad(ii,1) = chi2_qii - chi2_min;
149
150        if strcmpi(DisplayFlag, 'Display')
151            drawnow;
152            try
153                waitbar(ii/length(FitParameters(i1).Values), hbar);
154            catch
155                axes(h_axes);
156                plot([0 1],[0 1],'w');
157                set(gca,'XTick',[]);
158                set(gca,'YTick',[]);
159                text(.1,.6-1*d, sprintf('   \\Delta \\chi^2 computation stopped!'), 'FontSize', 12, 'Units','Normalized');
160                %fprintf('   calclocochi2 stopped\n');
161                return;
162            end
163        end
164    end
165   
166else
167   
168    % Compute 1 delta chi^2 for a particular combination of fit parameters
169    FitParameters_m = FitParameters(i1);
170
171    for jj=1:length(ParameterCombination)
172        ii = ParameterCombination(jj);
173        if ii>0 && ii<=length(FitParameters(i0).Values)
174            FitParameters_m.Values(ii) = FitParameters(i0).Values(ii);
175        end
176    end
177    chi2_qii = calclocochi2(LocoModel(i1),LocoMeasData, BPMData(i1), CMData(i1), FitParameters_m, LocoFlags(i1), RINGData);
178    dchi2quad = chi2_qii - chi2_min;
179
180    if strcmpi(DisplayFlag, 'Display')
181        fprintf('   Chi^2 at iteration %d = %f\n', Niter, chi2_min);
182        fprintf('   Delta Chi^2 = %f\n', dchi2quad);
183    end
184end
185
186
187if strcmpi(DisplayFlag, 'Display') && isempty(ParameterCombination)
188    %disp(chi2_0)
189    %disp(['   final chi2 ' num2str(chi2_min)])
190    %disp(['   contribution (all quads) ' num2str(chi2_par - chi2_min)])
191    %disp(['   contribution (all bpms) ' num2str(chi2_bpm - chi2_min)])
192
193    try
194        close(hbar);
195    catch
196    end
197
198    axes(h_axes);
199    plot(1:length(dchi2quad), dchi2quad,'.-');
200    %set(h_fig, 'linewidth',1)
201    title('');
202    xlabel('Fit Parameter Index', 'FontSize', 10);
203    ylabel('\Delta \chi^2', 'FontSize', 14);
204    title('\Delta \chi^2 vs Fit Parameter', 'FontSize', 10);
205    %grid  on;   
206    axis tight;
207     
208    %text(.03,.9-0*d, sprintf('   \\chi^2 for iteration %d = %.1f', Niter, chi2_min),            'FontSize', 10, 'Units','Normalized');
209    text(.03,.9-0*d, sprintf('\\Delta \\chi^2(All BPMs) = %.1f',          chi2_bpm - chi2_min), 'FontSize', 10, 'Units','Normalized');
210    text(.03,.9-1*d, sprintf('\\Delta \\chi^2(All CMs)  = %.1f',          chi2_cm  - chi2_min), 'FontSize', 10, 'Units','Normalized');
211    text(.03,.9-2*d, sprintf('\\Delta \\chi^2(All FitParameters) = %.1f', chi2_par - chi2_min), 'FontSize', 10, 'Units','Normalized');
212       
213    %addlabel(0, 0, sprintf('\\chi^2(0) = %.1f   \\chi^2(%d) = %.1f', chi2_0, i1, chi2_min), 10);
214    %addlabel(1, 0, sprintf('\\Delta \\chi^2(BPM) = %.1f   \\Delta \\chi^2(FitParameters) = %.1f', chi2_bpm - chi2_min, chi2_par - chi2_min), 10);   
215end
216
217
Note: See TracBrowser for help on using the repository browser.