source: MML/trunk/mml/doc_html/mml/rmdisp.html @ 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: 31.6 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2                "http://www.w3.org/TR/REC-html40/loose.dtd">
3<html>
4<head>
5  <title>Description of rmdisp</title>
6  <meta name="keywords" content="rmdisp">
7  <meta name="description" content="RMDISP - Removes the portion of the orbit that correlates with the dispersion">
8  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
9  <meta name="generator" content="m2html &copy; 2003 Guillaume Flandin">
10  <meta name="robots" content="index, follow">
11  <link type="text/css" rel="stylesheet" href="../m2html.css">
12</head>
13<body>
14<a name="_top"></a>
15<div><a href="../index.html">Home</a> &gt;  <a href="index.html">mml</a> &gt; rmdisp.m</div>
16
17<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td>
18<td align="right"><a href="index.html">Index for mml&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>-->
19
20<h1>rmdisp
21</h1>
22
23<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
24<div class="box"><strong>RMDISP - Removes the portion of the orbit that correlates with the dispersion</strong></div>
25
26<h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
27<div class="box"><strong>function [DeltaRF, BPM, c, DispOrbit] = rmdisp(varargin) </strong></div>
28
29<h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
30<div class="fragment"><pre class="comment">RMDISP - Removes the portion of the orbit that correlates with the dispersion
31  [DeltaRF, OrbitRM, c, DispOrbit] = rmdisp(BPMFamily, Orbit, BPMList, Dispersion)
32  [DeltaRF, OrbitRM, c, DispOrbit] = rmdisp(BPMStruct, Dispersion)
33
34  INPUTS
35  1. BPMFamily - Family name {Default: 'BPMx'}
36     BPMStruct - BPM data structure.  When using data structures, the orbit and
37                 BPMList are in the .Data and .DeviceList fields, respectively.
38  2. Orbit - Input orbit  {Default or empty: get the present orbit}
39  3. BPMList - Device or element list of BPMs  {Default or empty: all}
40  4  FLAGS - 'FitMean' or 'FitDispersionOnly' {Default} - Include or don't include the mean in the fit
41             'MeasDisp' - Measure the dispersion
42             'ModelDisp' - Calculate the model dispersion
43             'GoldenDisp' - Use the golden dispersion  {Default}
44             'Display' - Plot orbit information {Default: no display unless there are no outputs}
45             'NoDisplay' - No plot
46             'SetRF' - Sets the RF frequency to the new value (prompts to check the value if 'Display' is on)
47             'NoSetRF' - Don't set the RF frequency
48             (the usual Units and Mode flags: 'Online', 'Model', 'Manual', 'Hardware', 'Physics', etc.)
49  5. Dispersion - Optional input to specify the dispersion
50
51  OUTPUTS
52  1. DeltaRF - Change in RF frequency required to remove the dispersion component of
53               the orbit.  The units are the in RF frequency units used by getrf/setrf.
54               If DeltaRF = [], the units of dispersion or RF frequency were not unknown.  In
55               which case use c, output 3, to get the change in RF frequency.
56  2. OrbitRM - Estimated orbit with the dispersion orbit removed
57  3. c - fit coefficient,  OrbitRM = Orbit - c * Dispersion
58         c converts to RF frequency change but it depends on the units for the
59         orbit and dispersion.  For instance, if Orbit is in [mm] and Dispersion is
60         in [mm/MHz], then c is in MHz.  If Orbit is in [m] and Dispersion is in
61         [meter/(dp/p)], then c is energy shift (DeltaRF = -c*mcf*RF [Hz]). 
62         To correct the orbit, change the RF frequency by negative of the frequency
63         change determined by the c coefficient.
64  3. DispOrbit - Dispersion orbit used in the calculation
65
66  NOTES
67  1. It is unclear to the author if it is better to fit the mean or not.  If the
68     BPM offsets are not known very well then fitting the mean may be better.  That way
69     the dispersion is not used as a way to change the orbit mean (beyond
70     the mean change due to the shape and sampling of the dispersion function).
71  2. When fitting the mean the RF frequency change is only based only the dispersion
72     fit coefficient.
73  3. It is best to use structure inputs, since the units are in the structure.  Hence,
74     the DeltaRF can be determined.
75
76  See also <a href="setorbit.html" class="code" title="function [OCS, OCS0, V, S, ErrorFlag] = setorbit(varargin)">setorbit</a> <a href="findrf.html" class="code" title="function [DeltaRF, HCMEnergyChangeTotal, DeltaL] = findrf(varargin)">findrf</a> <a href="plotcm.html" class="code" title="function [DeltaRF, HCMEnergyChangeTotal, DeltaL] = plotcm(varargin)">plotcm</a>
77
78  Written by Greg Portmann</pre></div>
79
80<!-- crossreference -->
81<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
82This function calls:
83<ul style="list-style-image:url(../matlabicon.gif)">
84<li><a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>      GETAM - Gets monitor channels</li><li><a href="getdisp.html" class="code" title="function [Data, FileName] = getdisp(varargin)">getdisp</a>     GETDISP - Returns the dispersion for a family (from file)</li><li><a href="getlist.html" class="code" title="function DeviceList = getlist(varargin)">getlist</a>       GETLIST - Returns Device List for a Family</li><li><a href="getmcf.html" class="code" title="function Alpha = getmcf(ModelString)">getmcf</a>   GETMCF - Returns the momentum compaction factor (MCF) stored in the AD or the model</li><li><a href="getrf.html" class="code" title="function [RFsp, RFam, DataTime, ErrorFlag] = getrf(varargin)">getrf</a>    GETRF - Gets the RF frequency</li><li><a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>  GETSPOS - Returns the longitudinal position in meters</li><li><a href="getunits.html" class="code" title="function [Units, UnitsString] = getunits(Family, Field)">getunits</a> GETUNITS - Return the present family units and units string</li><li><a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>      ISFAMILY - True for family names</li><li><a href="measdisp.html" class="code" title="function [Dx, Dy, FileName] = measdisp(varargin);">measdisp</a>    MEASDISP - Measures the dispersion function</li><li><a href="steprf.html" class="code" title="function steprf(varargin)">steprf</a>     STEPRF - Increment change in the RF frequency</li></ul>
85This function is called by:
86<ul style="list-style-image:url(../matlabicon.gif)">
87</ul>
88<!-- crossreference -->
89
90
91<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
92<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function [DeltaRF, BPM, c, DispOrbit] = rmdisp(varargin)</a>
930002 <span class="comment">%RMDISP - Removes the portion of the orbit that correlates with the dispersion</span>
940003 <span class="comment">%  [DeltaRF, OrbitRM, c, DispOrbit] = rmdisp(BPMFamily, Orbit, BPMList, Dispersion)</span>
950004 <span class="comment">%  [DeltaRF, OrbitRM, c, DispOrbit] = rmdisp(BPMStruct, Dispersion)</span>
960005 <span class="comment">%</span>
970006 <span class="comment">%  INPUTS</span>
980007 <span class="comment">%  1. BPMFamily - Family name {Default: 'BPMx'}</span>
990008 <span class="comment">%     BPMStruct - BPM data structure.  When using data structures, the orbit and</span>
1000009 <span class="comment">%                 BPMList are in the .Data and .DeviceList fields, respectively.</span>
1010010 <span class="comment">%  2. Orbit - Input orbit  {Default or empty: get the present orbit}</span>
1020011 <span class="comment">%  3. BPMList - Device or element list of BPMs  {Default or empty: all}</span>
1030012 <span class="comment">%  4  FLAGS - 'FitMean' or 'FitDispersionOnly' {Default} - Include or don't include the mean in the fit</span>
1040013 <span class="comment">%             'MeasDisp' - Measure the dispersion</span>
1050014 <span class="comment">%             'ModelDisp' - Calculate the model dispersion</span>
1060015 <span class="comment">%             'GoldenDisp' - Use the golden dispersion  {Default}</span>
1070016 <span class="comment">%             'Display' - Plot orbit information {Default: no display unless there are no outputs}</span>
1080017 <span class="comment">%             'NoDisplay' - No plot</span>
1090018 <span class="comment">%             'SetRF' - Sets the RF frequency to the new value (prompts to check the value if 'Display' is on)</span>
1100019 <span class="comment">%             'NoSetRF' - Don't set the RF frequency</span>
1110020 <span class="comment">%             (the usual Units and Mode flags: 'Online', 'Model', 'Manual', 'Hardware', 'Physics', etc.)</span>
1120021 <span class="comment">%  5. Dispersion - Optional input to specify the dispersion</span>
1130022 <span class="comment">%</span>
1140023 <span class="comment">%  OUTPUTS</span>
1150024 <span class="comment">%  1. DeltaRF - Change in RF frequency required to remove the dispersion component of</span>
1160025 <span class="comment">%               the orbit.  The units are the in RF frequency units used by getrf/setrf.</span>
1170026 <span class="comment">%               If DeltaRF = [], the units of dispersion or RF frequency were not unknown.  In</span>
1180027 <span class="comment">%               which case use c, output 3, to get the change in RF frequency.</span>
1190028 <span class="comment">%  2. OrbitRM - Estimated orbit with the dispersion orbit removed</span>
1200029 <span class="comment">%  3. c - fit coefficient,  OrbitRM = Orbit - c * Dispersion</span>
1210030 <span class="comment">%         c converts to RF frequency change but it depends on the units for the</span>
1220031 <span class="comment">%         orbit and dispersion.  For instance, if Orbit is in [mm] and Dispersion is</span>
1230032 <span class="comment">%         in [mm/MHz], then c is in MHz.  If Orbit is in [m] and Dispersion is in</span>
1240033 <span class="comment">%         [meter/(dp/p)], then c is energy shift (DeltaRF = -c*mcf*RF [Hz]).</span>
1250034 <span class="comment">%         To correct the orbit, change the RF frequency by negative of the frequency</span>
1260035 <span class="comment">%         change determined by the c coefficient.</span>
1270036 <span class="comment">%  3. DispOrbit - Dispersion orbit used in the calculation</span>
1280037 <span class="comment">%</span>
1290038 <span class="comment">%  NOTES</span>
1300039 <span class="comment">%  1. It is unclear to the author if it is better to fit the mean or not.  If the</span>
1310040 <span class="comment">%     BPM offsets are not known very well then fitting the mean may be better.  That way</span>
1320041 <span class="comment">%     the dispersion is not used as a way to change the orbit mean (beyond</span>
1330042 <span class="comment">%     the mean change due to the shape and sampling of the dispersion function).</span>
1340043 <span class="comment">%  2. When fitting the mean the RF frequency change is only based only the dispersion</span>
1350044 <span class="comment">%     fit coefficient.</span>
1360045 <span class="comment">%  3. It is best to use structure inputs, since the units are in the structure.  Hence,</span>
1370046 <span class="comment">%     the DeltaRF can be determined.</span>
1380047 <span class="comment">%</span>
1390048 <span class="comment">%  See also setorbit findrf plotcm</span>
1400049 <span class="comment">%</span>
1410050 <span class="comment">%  Written by Greg Portmann</span>
1420051
1430052
1440053 <span class="comment">% Option to fit the mean as well as the dispersion</span>
1450054 <span class="comment">% FitMeanFlag = 0 -&gt; only fit the dispersion</span>
1460055 <span class="comment">% FitMeanFlag = 1 -&gt; fit both the mean and dispersion but only remove the</span>
1470056 <span class="comment">%                    dispersion coefficient from the orbit</span>
1480057 <span class="comment">% It can be good fit the mean (at least if BPM offsets are not known),</span>
1490058 <span class="comment">% so that the dispersion is not used as a way to change the orbit mean (beyond</span>
1500059 <span class="comment">% the mean change due to the shape and sampling of the dispersion function).</span>
1510060 <span class="comment">% When using difference orbits, I wouldn't fit the mean.</span>
1520061 <span class="comment">% Note: fitting the mean and dispersion together is different from removing</span>
1530062 <span class="comment">% the mean then fitting the dispersion.</span>
1540063 FitMeanFlag = 0;
1550064
1560065
1570066 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
1580067 <span class="comment">% Input parsing and checking %</span>
1590068 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
1600069
1610070 <span class="keyword">if</span> nargout == 0
1620071     DisplayFlag = 1;
1630072 <span class="keyword">else</span>
1640073     DisplayFlag = 0;
1650074 <span class="keyword">end</span>
1660075 ChangeRFFlag = 0;
1670076 DispFlag = <span class="string">'GoldenDisp'</span>;
1680077 StructOutputFlag = 0;
1690078 NumericOutputFlag = 0;
1700079 DispOrbitStruct = [];
1710080 InputFlags = {};
1720081 <span class="keyword">for</span> i = length(varargin):-1:1
1730082     <span class="keyword">if</span> isstruct(varargin{i})
1740083         <span class="comment">% Ignor structures</span>
1750084     <span class="keyword">elseif</span> iscell(varargin{i})
1760085         <span class="comment">% Ignor cells</span>
1770086     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'SetRF'</span>)
1780087         ChangeRFFlag = 1;
1790088         varargin(i) = [];
1800089     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'NoSetRF'</span>)
1810090         ChangeRFFlag = 0;
1820091         varargin(i) = [];
1830092     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Display'</span>)
1840093         DisplayFlag = 1;
1850094         varargin(i) = [];
1860095     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'NoDisplay'</span>)
1870096         DisplayFlag = 0;
1880097         varargin(i) = [];
1890098     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'ModelDisp'</span>)
1900099         DispFlag = varargin{i};
1910100         varargin(i) = [];
1920101     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'MeasDisp'</span>)
1930102         DispFlag = varargin{i};
1940103         varargin(i) = [];
1950104     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'FitMean'</span>)
1960105         FitMeanFlag = 1;
1970106         varargin(i) = [];
1980107     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'FitDispersionOnly'</span>)
1990108         FitMeanFlag = 0;
2000109         varargin(i) = [];
2010110     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'GoldenDisp'</span>)
2020111         DispFlag = varargin{i};
2030112         varargin(i) = [];
2040113     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'simulator'</span>) | strcmpi(varargin{i},<span class="string">'model'</span>)
2050114         ModeFlag = <span class="string">'SIMULATOR'</span>;
2060115         InputFlags = [InputFlags varargin(i)];
2070116         varargin(i) = [];
2080117     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Online'</span>)
2090118         ModeFlag = <span class="string">'Online'</span>;
2100119         InputFlags = [InputFlags varargin(i)];
2110120         varargin(i) = [];
2120121     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Manual'</span>)
2130122         ModeFlag = <span class="string">'Manual'</span>;
2140123         InputFlags = [InputFlags varargin(i)];
2150124         varargin(i) = [];
2160125     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'physics'</span>)
2170126         UnitsFlag = <span class="string">'Physics'</span>;
2180127         InputFlags = [InputFlags varargin(i)];
2190128         varargin(i) = [];
2200129     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'hardware'</span>)
2210130         UnitsFlag = <span class="string">'Hardware'</span>;
2220131         InputFlags = [InputFlags varargin(i)];
2230132         varargin(i) = [];
2240133     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'struct'</span>)
2250134         StructOutputFlag = 1;
2260135         varargin(i) = [];
2270136     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'numeric'</span>)
2280137         NumericOutputFlag = 1;
2290138         StructOutputFlag = 0;
2300139         varargin(i) = [];
2310140     <span class="keyword">end</span>
2320141 <span class="keyword">end</span>
2330142
2340143 <span class="keyword">if</span> length(varargin) &lt; 1
2350144     varargin = {<span class="string">'BPMx'</span>};
2360145 <span class="keyword">end</span>
2370146
2380147 <span class="keyword">if</span> isstruct(varargin{1})
2390148     BPM = varargin{1};
2400149     <span class="keyword">if</span> ~<a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(BPM)
2410150         error(sprintf(<span class="string">'%s is not a family'</span>), BPM.FamilyName);
2420151     <span class="keyword">end</span>
2430152     <span class="keyword">if</span> length(varargin) &gt;= 2
2440153         <span class="comment">% Use dispersion for the input line</span>
2450154         DispOrbitStruct = varargin{2};
2460155     <span class="keyword">end</span>
2470156
2480157     <span class="comment">% Only change StructOutputFlag if 'numeric' is not on the input line</span>
2490158     <span class="keyword">if</span> ~NumericOutputFlag
2500159         StructOutputFlag = 1;
2510160     <span class="keyword">end</span>
2520161 <span class="keyword">else</span>
2530162     <span class="keyword">if</span> ischar(varargin{1})
2540163         BPM.FamilyName = varargin{1};
2550164     <span class="keyword">else</span>
2560165         error(<span class="string">'First input must be a structure or FamilyName'</span>);
2570166     <span class="keyword">end</span>
2580167     <span class="keyword">if</span> ~<a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(BPM.FamilyName)
2590168         error(sprintf(<span class="string">'%s is not a BPM family'</span>, BPM.FamilyName));
2600169     <span class="keyword">end</span>
2610170     <span class="keyword">if</span> length(varargin) &gt;= 2
2620171         BPM.Data = varargin{2};
2630172     <span class="keyword">else</span>
2640173         BPM = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(BPM.FamilyName, <span class="string">'Struct'</span>, InputFlags{:});
2650174     <span class="keyword">end</span>
2660175     <span class="keyword">if</span> length(varargin) &gt;= 3
2670176         BPM.DeviceList = varargin{3};
2680177     <span class="keyword">elseif</span> ~isfield(BPM, <span class="string">'DeviceList'</span>)
2690178         BPM.DeviceList = <a href="getlist.html" class="code" title="function DeviceList = getlist(varargin)">getlist</a>(BPM.FamilyName);
2700179     <span class="keyword">end</span>
2710180     <span class="keyword">if</span> length(varargin) &gt;= 4
2720181         <span class="comment">% Use dispersion for the input line</span>
2730182         DispOrbitStruct = varargin{4};
2740183     <span class="keyword">end</span>
2750184 <span class="keyword">end</span>
2760185
2770186
2780187 <span class="comment">%%%%%%%%%%%%%%%%%%</span>
2790188 <span class="comment">% Get Dispersion %</span>
2800189 <span class="comment">%%%%%%%%%%%%%%%%%%</span>
2810190 DispUnitsString = <span class="string">''</span>;
2820191 <span class="keyword">if</span> isempty(DispOrbitStruct)
2830192     <span class="keyword">if</span> strcmpi(DispFlag,<span class="string">'ModelDisp'</span>)
2840193         DispOrbitStruct = <a href="measdisp.html" class="code" title="function [Dx, Dy, FileName] = measdisp(varargin);">measdisp</a>(BPM, <span class="string">'Struct'</span>, <span class="string">'Model'</span>, InputFlags{:});
2850194         DispUnitsString = DispOrbitStruct.UnitsString;
2860195     <span class="keyword">elseif</span> strcmpi(DispFlag,<span class="string">'MeasDisp'</span>)
2870196         DispOrbitStruct = <a href="measdisp.html" class="code" title="function [Dx, Dy, FileName] = measdisp(varargin);">measdisp</a>(BPM, <span class="string">'Struct'</span>, InputFlags{:});
2880197         DispUnitsString = DispOrbitStruct.UnitsString;
2890198     <span class="keyword">elseif</span> strcmpi(DispFlag,<span class="string">'GoldenDisp'</span>)
2900199         DispOrbitStruct = <a href="getdisp.html" class="code" title="function [Data, FileName] = getdisp(varargin)">getdisp</a>(BPM.FamilyName, BPM.DeviceList, <span class="string">'Struct'</span>);
2910200         DispUnitsString = DispOrbitStruct.UnitsString;
2920201     <span class="keyword">end</span>
2930202 <span class="keyword">end</span>
2940203 <span class="keyword">if</span> isempty(DispOrbitStruct)
2950204     error(<span class="string">'Did not find or generate a proper dispersion function'</span>);
2960205 <span class="keyword">end</span>
2970206
2980207 <span class="comment">% If dispersion is a structure, just use the .Data field</span>
2990208 <span class="keyword">if</span> isstruct(DispOrbitStruct)
3000209     DispOrbit = DispOrbitStruct.Data;
3010210 <span class="keyword">else</span>
3020211     DispOrbit = DispOrbitStruct;   
3030212 <span class="keyword">end</span>
3040213
3050214
3060215 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
3070216 <span class="comment">% Fit the orbit into the dispersion function %</span>
3080217 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
3090218
3100219 <span class="comment">% Dot product of dispersion and the orbit can be used</span>
3110220 <span class="comment">% to find the RF frequency but to find the orbit which best</span>
3120221 <span class="comment">% correlates to the dispersion use a least squares fit</span>
3130222 <span class="comment">% c = BPM.Data' * DispOrbit;</span>
3140223
3150224 BPMDataOld = BPM.Data;
3160225 <span class="keyword">if</span> FitMeanFlag
3170226     <span class="comment">% Fit the mean and the dispersion orbit</span>
3180227     X = [ones(size(DispOrbit)) DispOrbit];
3190228     cfit = X \ BPM.Data;
3200229     c = cfit(2);
3210230     <span class="comment">%BPM.Data = BPM.Data - X * c;</span>
3220231 <span class="keyword">else</span>
3230232     <span class="comment">% Fit the dispersion orbit</span>
3240233     cfit = DispOrbit \ BPM.Data;
3250234     c = cfit;
3260235 <span class="keyword">end</span>
3270236
3280237 <span class="comment">%BPM.Data = BPM.Data - X * c;</span>
3290238 BPM.Data = BPM.Data - DispOrbit * c;
3300239
3310240
3320241 <span class="comment">% Comput the change in RF frequency</span>
3330242 <span class="comment">% Units are a big pain the neck when it comes to determining the actual RF change</span>
3340243 <span class="comment">% Note: this section will depend a little on how the UnitsString is setup</span>
3350244 <span class="comment">% c units = BPM units / Dispersion units</span>
3360245 RF0 = <a href="getrf.html" class="code" title="function [RFsp, RFam, DataTime, ErrorFlag] = getrf(varargin)">getrf</a>(<span class="string">'Struct'</span>, InputFlags{:});
3370246 DeltaRF = [];           
3380247 <span class="keyword">if</span> ~isfield(BPM,<span class="string">'UnitsString'</span>)
3390248     [units, unitsstring] = <a href="getunits.html" class="code" title="function [Units, UnitsString] = getunits(Family, Field)">getunits</a>(BPM, <span class="string">'Monitor'</span>);
3400249     BPM.UnitsString = unitsstring;  <span class="comment">% Hopefully this is true</span>
3410250     <span class="comment">%if DisplayFlag</span>
3420251     <span class="comment">%    fprintf('   BPM units are defined.  Assuming units are %s.\n', unitsstring);</span>
3430252     <span class="comment">%end</span>
3440253 <span class="keyword">end</span>
3450254 <span class="keyword">if</span> ~isempty(BPM.UnitsString) &amp; ~isempty(DispUnitsString)
3460255     <span class="comment">% May need to scale by the orbit units</span>
3470256     <span class="keyword">if</span> strfind(lower(BPM.UnitsString), <span class="string">'mm'</span>) | strfind(lower(BPM.UnitsString), <span class="string">'millimeter'</span>) | strfind(lower(BPM.UnitsString), <span class="string">'millimeters'</span>)
3480257         <span class="comment">% BPM is in mm</span>
3490258         <span class="keyword">if</span> strfind(DispUnitsString, <span class="string">'mm'</span>) | strfind(DispUnitsString, <span class="string">'millimeter'</span>) | strfind(DispUnitsString, <span class="string">'millimeters'</span>)
3500259             <span class="comment">% Dispersion is in mm, hence the units are ok</span>
3510260         <span class="keyword">elseif</span> strfind(DispUnitsString, <span class="string">'m'</span>) | strfind(DispUnitsString, <span class="string">'meter'</span>) | strfind(DispUnitsString, <span class="string">'meters'</span>
3520261             <span class="comment">% Dispersion is in meters</span>
3530262             c = c / 1000;
3540263         <span class="keyword">else</span>
3550264             DeltaRF = [];           
3560265         <span class="keyword">end</span>
3570266     <span class="keyword">elseif</span> strfind(lower(BPM.UnitsString), <span class="string">'m'</span>) | strfind(lower(BPM.UnitsString), <span class="string">'meter'</span>) | strfind(lower(BPM.UnitsString), <span class="string">'meter'</span>)
3580267         <span class="comment">% BPM is in meters</span>
3590268         <span class="keyword">if</span> strfind(lower(DispUnitsString), <span class="string">'mm'</span>) | strfind(lower(DispUnitsString), <span class="string">'millimeter'</span>) | strfind(lower(DispUnitsString), <span class="string">'millimeters'</span>)
3600269             <span class="comment">% Dispersion is in mm, hence the units are ok</span>
3610270             c = c * 1000;
3620271         <span class="keyword">elseif</span> strfind(lower(DispUnitsString), <span class="string">'m'</span>) | strfind(lower(DispUnitsString), <span class="string">'meter'</span>) | strfind(lower(DispUnitsString), <span class="string">'meters'</span>)
3630272             <span class="comment">% Dispersion is in meters, hence the units are ok</span>
3640273         <span class="keyword">else</span>
3650274             DeltaRF = [];           
3660275         <span class="keyword">end</span>
3670276     <span class="keyword">end</span>
3680277     
3690278     <span class="comment">% Change units to the same as getrf</span>
3700279     <span class="keyword">if</span> strfind(lower(DispUnitsString), <span class="string">'mhz'</span>)
3710280         <span class="keyword">if</span> strcmpi(RF0.UnitsString, <span class="string">'MHz'</span>)
3720281             DeltaRF = c;        <span class="comment">% c is MHz, DeltaRF is MHz</span>
3730282         <span class="keyword">elseif</span> strcmpi(RF0.UnitsString, <span class="string">'Hz'</span>)
3740283             DeltaRF = c * 1e6;  <span class="comment">% c is MHz, DeltaRF is Hz</span>
3750284         <span class="keyword">else</span>
3760285             DeltaRF = [];           
3770286         <span class="keyword">end</span>
3780287     <span class="keyword">elseif</span> strfind(lower(DispUnitsString), <span class="string">'hz'</span>)
3790288         <span class="keyword">if</span> strcmpi(RF0.UnitsString, <span class="string">'MHz'</span>)
3800289             DeltaRF = c / 1e6;  <span class="comment">% c is Hz, DeltaRF is MHz</span>
3810290         <span class="keyword">elseif</span> strcmpi(RF0.UnitsString, <span class="string">'Hz'</span>)
3820291             DeltaRF = c;        <span class="comment">% c is Hz, DeltaRF is Hz</span>
3830292         <span class="keyword">else</span>
3840293             DeltaRF = [];           
3850294         <span class="keyword">end</span>
3860295     <span class="keyword">elseif</span> strfind(lower(DispUnitsString), <span class="string">'dp/p'</span>)
3870296         DeltaRF = c * <a href="getmcf.html" class="code" title="function Alpha = getmcf(ModelString)">getmcf</a> * RF0.Data;  <span class="comment">% Units same as RF0</span>
3880297     <span class="keyword">else</span>
3890298         DeltaRF = [];
3900299     <span class="keyword">end</span>
3910300
3920301     <span class="comment">% Return the change in RF required to remove the orbit error</span>
3930302     DeltaRF = -DeltaRF;
3940303 <span class="keyword">else</span>
3950304     DeltaRF = -c;   
3960305 <span class="keyword">end</span>
3970306
3980307
3990308 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%</span>
4000309 <span class="comment">% Output and display %</span>
4010310 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%</span>
4020311 <span class="keyword">if</span> DisplayFlag
4030312     spos = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(BPM);
4040313     clf reset
4050314     subplot(2,1,1);
4060315     plot(spos, BPMDataOld, <span class="string">'r'</span>, spos, BPM.Data, <span class="string">'b'</span>);
4070316     grid on
4080317     xlabel(<span class="string">'Position [Meters]'</span>);
4090318     <span class="keyword">if</span> isfield(BPM,<span class="string">'UnitsString'</span>)
4100319         ylabel(sprintf(<span class="string">'%s [%s]'</span>, BPM.FamilyName, BPM.UnitsString));
4110320     <span class="keyword">else</span>
4120321         ylabel(sprintf(<span class="string">'%s'</span>, BPM.FamilyName));
4130322     <span class="keyword">end</span>
4140323     legend(<span class="string">'Starting Orbit'</span>,<span class="string">'Dispersion Removed'</span>)
4150324     <span class="keyword">if</span> length(cfit) == 2
4160325         title(sprintf(<span class="string">'%g + %g * Dispersion'</span>,cfit(1), cfit(2)));
4170326     <span class="keyword">else</span>
4180327         title(sprintf(<span class="string">'%g * Dispersion'</span>,cfit(1)));
4190328     <span class="keyword">end</span>
4200329     
4210330     subplot(2,1,2);
4220331     <span class="comment">%plot(spos, X * c, 'b');</span>
4230332     plot(spos, DispOrbit * c, <span class="string">'b'</span>);
4240333     grid on
4250334     xlabel(<span class="string">'Position [Meters]'</span>);
4260335     <span class="keyword">if</span> isfield(BPM,<span class="string">'UnitsString'</span>)
4270336         ylabel(sprintf(<span class="string">'Orbit Removed [%s]'</span>,BPM.UnitsString));
4280337     <span class="keyword">else</span>
4290338         ylabel(sprintf(<span class="string">'Orbit Removed'</span>));
4300339     <span class="keyword">end</span>
4310340 <span class="keyword">end</span>
4320341
4330342
4340343 <span class="keyword">if</span> ~StructOutputFlag
4350344     BPM = BPM.Data;
4360345 <span class="keyword">end</span>
4370346
4380347
4390348 <span class="comment">% Set the RF frequency</span>
4400349 <span class="keyword">if</span> ChangeRFFlag
4410350     <span class="keyword">if</span> ~isempty(DeltaRF)
4420351         <span class="keyword">if</span> DisplayFlag
4430352             answer = inputdlg({strvcat(strvcat(sprintf(<span class="string">'Recommend change in RF is %g %s'</span>, DeltaRF, RF0.UnitsString), <span class="string">'  '</span>), <span class="string">'Change the RF frequency?'</span>)},<span class="string">'RMDISP'</span>,1,{sprintf(<span class="string">'%g'</span>,DeltaRF)});
4440353             <span class="keyword">if</span> isempty(answer)
4450354                 fprintf(<span class="string">'   No change was made to the RF frequency\n'</span>);
4460355                 <span class="keyword">return</span>
4470356             <span class="keyword">end</span>
4480357             DeltaRF = str2num(answer{1});
4490358         <span class="keyword">end</span>
4500359         <a href="steprf.html" class="code" title="function steprf(varargin)">steprf</a>(DeltaRF, InputFlags{:});
4510360     <span class="keyword">else</span>
4520361         error(<span class="string">'RF frequency not changed because of a problem converting the units for dispersion and orbit to RF frequency'</span>);
4530362     <span class="keyword">end</span>
4540363 <span class="keyword">end</span>
4550364</pre></div>
456<hr><address>Generated on Mon 21-May-2007 15:29:18 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address>
457</body>
458</html>
Note: See TracBrowser for help on using the repository browser.