source: MML/trunk/mml/quaderrors.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: 6.3 KB
Line 
1function QMS = quaderrors(Input1, FigureHandle, MontiCarloFlag)
2%QUADERRORS - Computes the error bars for quadrupole center measurement
3%  QMS = quaderrors(FileName, FigureHandle, MontiCarloFlag)
4%
5% Written by Greg Portmann
6
7
8Buffer = .03;
9HeightBuffer = .08;
10
11   
12% Don't do the monticarlo plot if being called from quadplot
13MontiCarloFlag = 1;
14[ST,I] = dbstack;
15for i = 1:length(ST)
16    if strcmpi(ST(i).file,'quadplot.m')
17        MontiCarloFlag = 0;
18    end
19end
20
21
22% Inputs
23try
24    WarningString = [];
25    if nargin == 0
26        [FileName, PathName] = uigetfile('*.mat', 'Input Quadrupole Center file.');
27        if ~isstr(FileName)
28            return
29        else
30            eval(['load ',PathName,FileName]);
31        end
32    else
33        if isstr(Input1)
34            FileName = Input1;
35            eval(['load ', FileName]);
36        elseif isempty(Input1)
37            [FileName, PathName] = uigetfile('*.mat', 'Input Quadrupole Center file.');
38            if ~isstr(FileName)
39                return
40            else
41                eval(['load ',PathName,FileName]);
42            end
43        else
44            QMS = Input1;
45            FileName = [];
46        end
47    end
48catch
49    error('Problem getting input data');
50end
51
52%QMS = quadplot(QMS);
53
54if nargin < 2
55    FigureHandle = gcf;
56else
57    if all(FigureHandle ~= 0)
58        figure(FigureHandle);
59    end
60end
61
62if all(FigureHandle ~= 0)
63    clf reset
64    if MontiCarloFlag
65        AxesHandles(1) = subplot(3,1,1);
66        AxesHandles(2) = subplot(3,1,2);
67        AxesHandles(3) = subplot(3,1,3);
68    else
69        AxesHandles(1) = subplot(2,1,1);
70        AxesHandles(2) = subplot(2,1,2);
71    end
72
73    if QMS.QuadPlane ~= 1
74        set(FigureHandle,'units','normal','position',[Buffer .25+Buffer .5-Buffer-.003 .75-1.2*Buffer-HeightBuffer]);
75        %set(FigureHandle,'units','normal','position',[0+Buffer .09+Buffer .5-2*Buffer .9-2*Buffer-HeightBuffer]);
76    else
77        set(FigureHandle,'units','normal','position',[.5+.003 .25+Buffer .5-Buffer-.003 .75-1.2*Buffer-HeightBuffer]);
78        %set(FigureHandle,'units','normal','position',[.5+Buffer .09+Buffer .5-2*Buffer .9-2*Buffer-HeightBuffer]);
79    end
80
81    %subplot(3,2,1);
82    axes(AxesHandles(1));
83    errorbar(1:length(QMS.FitParameters(:,1)), QMS.FitParameters(:,1), QMS.FitParametersStd(:,1),'b');
84    hold on;
85    errorbar(1:length(QMS.FitParameters(:,1)), QMS.FitParameters(:,1), QMS.FitParametersStd(:,1),'.r');
86    errorbar(QMS.GoodIndex, QMS.FitParameters(QMS.GoodIndex,1), QMS.FitParametersStd(QMS.GoodIndex,1),'.b');
87    hold off
88    title('Linear Fit');
89    ylabel('Y-Intercept');
90    %xlabel('BPM Number');
91    grid
92    xaxis([0 length(QMS.FitParameters(:,1))+1]);
93
94
95    %subplot(3,1,2);
96    axes(AxesHandles(2));
97    errorbar(1:length(QMS.FitParameters(:,1)), QMS.FitParameters(:,2), QMS.FitParametersStd(:,2),'b');
98    hold on
99    errorbar(1:length(QMS.FitParameters(:,1)), QMS.FitParameters(:,2), QMS.FitParametersStd(:,2),'.r');
100    errorbar(QMS.GoodIndex, QMS.FitParameters(QMS.GoodIndex,2), QMS.FitParametersStd(QMS.GoodIndex,2),'.b');
101    hold off
102    xlabel('BPM Number');
103    ylabel('Slope');
104    %xlabel('BPM Number');
105    grid
106    xaxis([0 length(QMS.FitParameters(:,1))+1]);
107end
108
109
110if MontiCarloFlag
111    % Monte Carlo the mean and standard deviation of all the good offsets
112    N = 20000;
113    QMS.OffsetMean = NaN*ones(length(QMS.FitParameters(:,2)),1);
114    QMS.OffsetStd  = NaN*ones(length(QMS.FitParameters(:,2)),1);
115
116    OffsetMean1 = QMS.OffsetMean;
117    OffsetStd1  = QMS.OffsetStd;
118    NormalRV1 = randn(N,1);
119    NormalRV2 = randn(N,1);
120    if QMS.QuadraticFit == 1
121        NormalRV3 = randn(N,1);
122    end
123    for i = QMS.GoodIndex(:)'   % 1:length(QMS.Offset)
124        rvinter = QMS.FitParameters(i,1) + QMS.FitParametersStd(i,1)*NormalRV1;
125        rvslope = QMS.FitParameters(i,2) + QMS.FitParametersStd(i,2)*NormalRV2;
126        if QMS.QuadraticFit == 1
127            rvquadradic = QMS.FitParameters(i,3) + QMS.FitParametersStd(i,3)*NormalRV3;
128            x = (-rvslope + sqrt(rvslope.^2 - 4*rvquadradic.*rvinter)) ./ (2*rvquadradic);
129        else
130            x = -rvinter ./ rvslope;
131        end
132        OffsetMean1(i) = mean(x);
133        OffsetStd1(i)  = std(x);
134    end
135
136    OffsetMean2 = QMS.OffsetMean;
137    OffsetStd2  = QMS.OffsetStd;
138    NormalRV1 = randn(N,1);
139    NormalRV2 = randn(N,1);
140    if QMS.QuadraticFit == 1
141        NormalRV3 = randn(N,1);
142    end
143    for i = QMS.GoodIndex(:)'   % 1:length(QMS.Offset)
144        rvinter = QMS.FitParameters(i,1) + QMS.FitParametersStd(i,1)*NormalRV1;
145        rvslope = QMS.FitParameters(i,2) + QMS.FitParametersStd(i,2)*NormalRV2;
146        if QMS.QuadraticFit == 1
147            rvquadradic = QMS.FitParameters(i,3) + QMS.FitParametersStd(i,3)*NormalRV3;
148            x = (-rvslope + sqrt(rvslope.^2 - 4*rvquadradic.*rvinter)) ./ (2*rvquadradic);
149        else
150            x = -rvinter ./ rvslope;
151        end
152        OffsetMean2(i) = mean(x);
153        OffsetStd2(i)  = std(x);
154    end
155
156    QMS.OffsetMean(:,1) = [OffsetMean1 + OffsetMean2] / 2;
157    QMS.OffsetStd(:,1)  = [OffsetStd1  + OffsetStd2]  / 2;
158
159
160    if all(FigureHandle ~= 0)
161
162        % plot([OffsetStd1  OffsetStd2  OffsetStd3],'x')
163
164        %subplot(3,1,3);
165        axes(AxesHandles(3));
166        %errorbar(1:length(QMS.Offset), QMS.Offset, QMS.OffsetStd,'.r');
167        %hold on
168        errorbar(QMS.GoodIndex, QMS.Offset(QMS.GoodIndex), QMS.OffsetStd(QMS.GoodIndex),'.b');
169
170
171        % errorbar(1:length(QMS.Offset), QMS.Offset, QMS.OffsetStd,'.b');
172        % hold on
173        % errorbar(1:length(QMS.Offset), QMS.Offset, OffsetStd1,'.r');
174        % errorbar(1:length(QMS.Offset), QMS.Offset, OffsetStd2,'.g');
175        % errorbar(1:length(QMS.Offset), QMS.Offset, OffsetStd3,'.k');
176
177        % errorbar(QMS.GoodIndex, QMS.Offset(QMS.GoodIndex), QMS.OffsetStd(QMS.GoodIndex),'.b');
178        % hold on
179        % errorbar(QMS.GoodIndex, QMS.Offset(QMS.GoodIndex), OffsetStd1(QMS.GoodIndex),'.r');
180        % errorbar(QMS.GoodIndex, QMS.Offset(QMS.GoodIndex), OffsetStd2(QMS.GoodIndex),'.g');
181        % errorbar(QMS.GoodIndex, QMS.Offset(QMS.GoodIndex), OffsetStd3(QMS.GoodIndex),'.k');
182
183        hold off
184        ylabel('X-Intercept = - (Y-Intercept)/Slope');
185        ylabel('Monte Carlo');
186        xlabel('BPM Number');
187        grid
188        xaxis([0 length(QMS.Offset)+1]);
189        %yaxis([-.025 .025]+QMS.Center);
190    end
191
192    QMS.OffsetSTDMontiCarlo = sqrt((sum(QMS.OffsetStd(QMS.GoodIndex).^2))/length(QMS.GoodIndex));
193end
Note: See TracBrowser for help on using the repository browser.