source: MML/trunk/mml/doc_html/mml/setorbitbump.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: 42.5 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 setorbitbump</title>
6  <meta name="keywords" content="setorbitbump">
7  <meta name="description" content="SETORBITBUMP - Local bump program (uses setorbit)">
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; setorbitbump.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>setorbitbump
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>SETORBITBUMP - Local bump program (uses setorbit)</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 [OCS, OCS0, V, S, ErrorFlag] = setorbitbump(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">SETORBITBUMP - Local bump program (uses setorbit)
31  [OCS, OCS0, V, S] = setorbitbump(BPMFamily, BPMDeviceList, GoalOrbit, CMFamily, CMIncrementList, NIter, SVDIndex, BPMWeight)
32  [OCS, OCS0, V, S] = setorbitbump(OCS, GoalOrbit, CMIncrementList, NIter, SVDIndex, BPMWeight)
33
34  INPUTS
35  1. BPMFamily - BPM family
36  2. BPMDeviceList - BPM device list
37  3. GoalOrbit - Goal orbit position (Referenced to an absolute or incremental orbit
38                                      depending on 'Incremental' or 'Absolute' flag)
39  4. CMFamily - Corrector magnet family
40  5. CMIncrementList - Magnet list upstream and downstream of the BPMs
41                       For instance, [-2 1 3] uses the 2nd correctors upstream and
42                       1st and 3rd corrector downstream from the BPMs in the bump.
43          or
44     CMIncrementList can be an ordinary device list used for specifying correctors.
45  6. NIter - Number of iterations  {Default: 3}
46            (set NIter to 0 if no BPMs are functioning, see setorbit)
47  7. SVDIndex - vector, maximum number, 'All', or
48                base on a threshold of min/max singular value {Default: see setorbit}
49  8. BPMWeight - Weight applied to the BPMs inside the bump (GoalOrbit).  BPM weighting
50                 should only be required when the corrector are in a region of dispersion
51                 and the RF frequency is not used in the orbit correction.
52                {Default BPMWeight is to weight the leakage twice as much as the GoalOrbit}
53  9. Optional flags (any flags used in setorbit can also be used here)
54     'Incremental' {Default} or 'Absolute' - Type of orbit change
55     'Display' - Display bump characteristics  (no display is the default)
56     'SetPV'   or 'SetSP'   - Make the setpoint change {Default}
57     'NoSetPV' or 'NoSetSP' - Don't set the magnets, just return the OCS
58     'FitRF' or 'SetRF' - Flag to include the RF frequency as part of orbit correction.
59     'LeakageCorrection' - Option to try to clean up the leakage after the bump is applied.
60                           Note: 1. NIter for leakage correction is the same for the bump
61                                 2. It's just like setting the weight to zero for a second set of iterations.
62                                 3. For the horizontal plane, usually one should include the RF frequency
63                                    along with leakage correction.  Otherwise, the goal orbit may not be attained.
64     'Tolerance', Tol - Quit correction if the std(error) &lt; Tol {Tol: 0}
65     'RampSteps', NSteps - Number of steps to ramp in the correction {NSteps: 1}
66                                    This is used to avoid a large transient between setpoint changes.
67
68  OUTPUTS (same as setorbit)
69  1. OCS    - Orbit correction structure (OCS) usable by setorbit
70  2. OCS0   - Starting OCS
71  3. V      - Corrector magnet singular vectors
72  4. Svalue - Singular values (vector)
73
74  NOTES
75  1. setorbitbump creates an OCS structure and uses setorbit to actually change the orbit.
76
77  EXAMPLES
78  1. 4 magnet horizontal incremental bump at BPM(6,6) and BPM(7,1) including the RF frequency
79     OCS = setorbitbump('BPMx',[6 6;7 1],[1;-1],'HCM',[-2 -1 1 2],'FitRF', 'Display');
80     On 12-16-2003, [-2 -1 1 2] corresponded to HCM(6,3), HCM(6,4), HCM(7,1), HCM(7,3)
81     Display plots information before applying the bump.
82
83  2. If the response matrix is not perfect, a clean (minimal rms orbit error) bump can be created
84     by increasing the iteration (note: in regions of dispersion, all bumps will have leakage unless
85     the RF frequency is included). 
86     [OCS, OCS0] = setorbitbump('BPMx',[6 6;7 1],[1;-1],'HCM',[-2 -1 1 2], 4, 'Display');
87     DeltaHCM = OCS.CM.Data - OCS0.CM.Data;
88     BPMxDeviceList = OCS.BPM.DeviceList;
89     HCMDeviceList  = OCS.CM.DeviceList;
90
91
92  See also <a href="setorbit.html" class="code" title="function [OCS, OCS0, V, S, ErrorFlag] = setorbit(varargin)">setorbit</a>, <a href="orbitcorrectionmethods.html" class="code" title="function [OCS, SmatNoWeights, S, U, V] = orbitcorrectionmethods(OCS, Smat, S, U, V)">orbitcorrectionmethods</a>, setorbitgui, <a href="rmdisp.html" class="code" title="function [DeltaRF, BPM, c, DispOrbit] = rmdisp(varargin)">rmdisp</a>, <a href="plotcm.html" class="code" title="function [DeltaRF, HCMEnergyChangeTotal, DeltaL] = plotcm(varargin)">plotcm</a>, setorbitbumpgui
93
94  Written by Greg Portmann</pre></div>
95
96<!-- crossreference -->
97<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
98This function calls:
99<ul style="list-style-image:url(../matlabicon.gif)">
100<li><a href="family2datastruct.html" class="code" title="function [DataStruct, ErrorFlag] = family2datastruct(varargin)">family2datastruct</a>  FAMILY2DATASTRUCTURE - Returns a datastructure corresponding to a Family</li><li><a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>      FAMILY2DEV - Return the device list for a family</li><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="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>        GETFAMILYDATA - Gets data associated with the accelerator control</li><li><a href="getgolden.html" class="code" title="function Data = getgolden(varargin)">getgolden</a>       GETGOLDEN - Returns the golden values for a family</li><li><a href="gethbpmfamily.html" class="code" title="function Family = gethbpmfamily">gethbpmfamily</a>  GETHBPMFAMILY - Return the default horizontal BPM family</li><li><a href="gethcmfamily.html" class="code" title="function Family = gethcmfamily">gethcmfamily</a>       GETHCMFAMILY - Returns the default horizontal corrector family</li><li><a href="getmode.html" class="code" title="function Mode = getmode(Family, Field)">getmode</a>   GETMODE - Returns the present family mode ('Online', 'Simulator', 'Manual', 'Special', etc)</li><li><a href="getoffset.html" class="code" title="function Data = getoffset(varargin)">getoffset</a>     GETOFFSET - Returns the offset values for a family</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="getvbpmfamily.html" class="code" title="function Family = getvbpmfamily">getvbpmfamily</a> GETVBPMFAMILY - Return the default vertical BPM family</li><li><a href="getvcmfamily.html" class="code" title="function Family = getvcmfamily">getvcmfamily</a> GETVCMFAMILY - Returns the default vertical corrector family</li><li><a href="setorbit.html" class="code" title="function [OCS, OCS0, V, S, ErrorFlag] = setorbit(varargin)">setorbit</a>       SETORBIT - Orbit correction function</li></ul>
101This function is called by:
102<ul style="list-style-image:url(../matlabicon.gif)">
103<li><a href="meascmhysteresis.html" class="code" title="function meascmhysteresis(BPMList, CMFamily, CMList, MaxChange, NSteps)">meascmhysteresis</a>   MEASCMHYSTERESIS - Measure corrector magnet hysteresis</li><li><a href="quadcenterfit.html" class="code" title="function [XOffset, YOffset] = quadcenterfit(varargin)">quadcenterfit</a>        BBASEARCH - Model search method to find a quarupole center</li><li><a href="quadcenterinit.html" class="code" title="function QMS = quadcenterinit(QuadFamily, QuadDev, QuadPlane)">quadcenterinit</a>  QMS = quadcenterinit(Family, Device, QuadPlane)</li></ul>
104<!-- crossreference -->
105
106
107<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
108<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function [OCS, OCS0, V, S, ErrorFlag] = setorbitbump(varargin)</a>
1090002 <span class="comment">%SETORBITBUMP - Local bump program (uses setorbit)</span>
1100003 <span class="comment">%  [OCS, OCS0, V, S] = setorbitbump(BPMFamily, BPMDeviceList, GoalOrbit, CMFamily, CMIncrementList, NIter, SVDIndex, BPMWeight)</span>
1110004 <span class="comment">%  [OCS, OCS0, V, S] = setorbitbump(OCS, GoalOrbit, CMIncrementList, NIter, SVDIndex, BPMWeight)</span>
1120005 <span class="comment">%</span>
1130006 <span class="comment">%  INPUTS</span>
1140007 <span class="comment">%  1. BPMFamily - BPM family</span>
1150008 <span class="comment">%  2. BPMDeviceList - BPM device list</span>
1160009 <span class="comment">%  3. GoalOrbit - Goal orbit position (Referenced to an absolute or incremental orbit</span>
1170010 <span class="comment">%                                      depending on 'Incremental' or 'Absolute' flag)</span>
1180011 <span class="comment">%  4. CMFamily - Corrector magnet family</span>
1190012 <span class="comment">%  5. CMIncrementList - Magnet list upstream and downstream of the BPMs</span>
1200013 <span class="comment">%                       For instance, [-2 1 3] uses the 2nd correctors upstream and</span>
1210014 <span class="comment">%                       1st and 3rd corrector downstream from the BPMs in the bump.</span>
1220015 <span class="comment">%          or</span>
1230016 <span class="comment">%     CMIncrementList can be an ordinary device list used for specifying correctors.</span>
1240017 <span class="comment">%  6. NIter - Number of iterations  {Default: 3}</span>
1250018 <span class="comment">%            (set NIter to 0 if no BPMs are functioning, see setorbit)</span>
1260019 <span class="comment">%  7. SVDIndex - vector, maximum number, 'All', or</span>
1270020 <span class="comment">%                base on a threshold of min/max singular value {Default: see setorbit}</span>
1280021 <span class="comment">%  8. BPMWeight - Weight applied to the BPMs inside the bump (GoalOrbit).  BPM weighting</span>
1290022 <span class="comment">%                 should only be required when the corrector are in a region of dispersion</span>
1300023 <span class="comment">%                 and the RF frequency is not used in the orbit correction.</span>
1310024 <span class="comment">%                {Default BPMWeight is to weight the leakage twice as much as the GoalOrbit}</span>
1320025 <span class="comment">%  9. Optional flags (any flags used in setorbit can also be used here)</span>
1330026 <span class="comment">%     'Incremental' {Default} or 'Absolute' - Type of orbit change</span>
1340027 <span class="comment">%     'Display' - Display bump characteristics  (no display is the default)</span>
1350028 <span class="comment">%     'SetPV'   or 'SetSP'   - Make the setpoint change {Default}</span>
1360029 <span class="comment">%     'NoSetPV' or 'NoSetSP' - Don't set the magnets, just return the OCS</span>
1370030 <span class="comment">%     'FitRF' or 'SetRF' - Flag to include the RF frequency as part of orbit correction.</span>
1380031 <span class="comment">%     'LeakageCorrection' - Option to try to clean up the leakage after the bump is applied.</span>
1390032 <span class="comment">%                           Note: 1. NIter for leakage correction is the same for the bump</span>
1400033 <span class="comment">%                                 2. It's just like setting the weight to zero for a second set of iterations.</span>
1410034 <span class="comment">%                                 3. For the horizontal plane, usually one should include the RF frequency</span>
1420035 <span class="comment">%                                    along with leakage correction.  Otherwise, the goal orbit may not be attained.</span>
1430036 <span class="comment">%     'Tolerance', Tol - Quit correction if the std(error) &lt; Tol {Tol: 0}</span>
1440037 <span class="comment">%     'RampSteps', NSteps - Number of steps to ramp in the correction {NSteps: 1}</span>
1450038 <span class="comment">%                                    This is used to avoid a large transient between setpoint changes.</span>
1460039 <span class="comment">%</span>
1470040 <span class="comment">%  OUTPUTS (same as setorbit)</span>
1480041 <span class="comment">%  1. OCS    - Orbit correction structure (OCS) usable by setorbit</span>
1490042 <span class="comment">%  2. OCS0   - Starting OCS</span>
1500043 <span class="comment">%  3. V      - Corrector magnet singular vectors</span>
1510044 <span class="comment">%  4. Svalue - Singular values (vector)</span>
1520045 <span class="comment">%</span>
1530046 <span class="comment">%  NOTES</span>
1540047 <span class="comment">%  1. setorbitbump creates an OCS structure and uses setorbit to actually change the orbit.</span>
1550048 <span class="comment">%</span>
1560049 <span class="comment">%  EXAMPLES</span>
1570050 <span class="comment">%  1. 4 magnet horizontal incremental bump at BPM(6,6) and BPM(7,1) including the RF frequency</span>
1580051 <span class="comment">%     OCS = setorbitbump('BPMx',[6 6;7 1],[1;-1],'HCM',[-2 -1 1 2],'FitRF', 'Display');</span>
1590052 <span class="comment">%     On 12-16-2003, [-2 -1 1 2] corresponded to HCM(6,3), HCM(6,4), HCM(7,1), HCM(7,3)</span>
1600053 <span class="comment">%     Display plots information before applying the bump.</span>
1610054 <span class="comment">%</span>
1620055 <span class="comment">%  2. If the response matrix is not perfect, a clean (minimal rms orbit error) bump can be created</span>
1630056 <span class="comment">%     by increasing the iteration (note: in regions of dispersion, all bumps will have leakage unless</span>
1640057 <span class="comment">%     the RF frequency is included).</span>
1650058 <span class="comment">%     [OCS, OCS0] = setorbitbump('BPMx',[6 6;7 1],[1;-1],'HCM',[-2 -1 1 2], 4, 'Display');</span>
1660059 <span class="comment">%     DeltaHCM = OCS.CM.Data - OCS0.CM.Data;</span>
1670060 <span class="comment">%     BPMxDeviceList = OCS.BPM.DeviceList;</span>
1680061 <span class="comment">%     HCMDeviceList  = OCS.CM.DeviceList;</span>
1690062 <span class="comment">%</span>
1700063 <span class="comment">%</span>
1710064 <span class="comment">%  See also setorbit, orbitcorrectionmethods, setorbitgui, rmdisp, plotcm, setorbitbumpgui</span>
1720065 <span class="comment">%</span>
1730066 <span class="comment">%  Written by Greg Portmann</span>
1740067
1750068
1760069 <span class="comment">%%%%%%%%%%%%</span>
1770070 <span class="comment">% Defaults %</span>
1780071 <span class="comment">%%%%%%%%%%%%</span>
1790072 OCS.BPM.FamilyName = [];
1800073 OCS.BPM.DeviceList = [];
1810074 GoalOrbit = [];
1820075 OCS.CM.FamilyName = [];
1830076 OCS.CM.DeviceList = [];
1840077 CMIncrementList = [];
1850078 OCS.NIter = 1;
1860079 BPMWeight = [];
1870080 OCS.Incremental = 1;
1880081 DisplayFlag = 0;
1890082 SetSPFlag = 1;
1900083 NoLeakageFlag = 0;
1910084 UnitsFlag = <span class="string">''</span>;
1920085 ModeFlag = <span class="string">''</span>;
1930086
1940087 L = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Circumference'</span>);
1950088
1960089
1970090 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
1980091 <span class="comment">% Input parsing and checking %</span>
1990092 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
2000093 Flags = {};
2010094 <span class="keyword">for</span> i = length(varargin):-1:1
2020095     <span class="keyword">if</span> isstruct(varargin{i})
2030096         <span class="comment">% Ignor structures</span>
2040097     <span class="keyword">elseif</span> iscell(varargin{i})
2050098         <span class="comment">% Ignor cells</span>
2060099     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Golden'</span>)
2070100         <span class="comment">% Use the golden orbit</span>
2080101         <span class="comment">%GoalOrbit = 'Golden';</span>
2090102         <span class="comment">%varargin(i) = [];</span>
2100103     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Offset'</span>)
2110104         <span class="comment">% Use the offset orbit</span>
2120105         <span class="comment">%GoalOrbit = 'Offset';</span>
2130106         <span class="comment">%varargin(i) = [];</span>
2140107     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Display'</span>)
2150108         Flags = [Flags varargin(i)];
2160109         DisplayFlag = 1;
2170110         varargin(i) = [];
2180111     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'NoDisplay'</span>)
2190112         Flags = [Flags varargin(i)];
2200113         DisplayFlag = 0;
2210114         varargin(i) = [];
2220115     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Inc'</span>) || strcmpi(varargin{i},<span class="string">'Incremental'</span>)
2230116         OCS.Incremental = 1;
2240117         varargin(i) = [];
2250118     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Abs'</span>) || strcmpi(varargin{i},<span class="string">'Absolute'</span>)
2260119         OCS.Incremental = 0;
2270120         varargin(i) = [];
2280121     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'simulator'</span>) || strcmpi(varargin{i},<span class="string">'model'</span>)
2290122         ModeFlag = <span class="string">'SIMULATOR'</span>;
2300123         varargin(i) = [];
2310124     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Online'</span>)
2320125         ModeFlag = <span class="string">'Online'</span>;
2330126         varargin(i) = [];
2340127     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Manual'</span>)
2350128         ModeFlag = <span class="string">'Manual'</span>;
2360129         varargin(i) = [];
2370130     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'physics'</span>)
2380131         UnitsFlag = <span class="string">'Physics'</span>;
2390132         varargin(i) = [];
2400133     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'hardware'</span>)
2410134         UnitsFlag = <span class="string">'Hardware'</span>;
2420135         varargin(i) = [];
2430136     <span class="keyword">elseif</span> any(strcmpi(varargin{i},{<span class="string">'SetPV'</span>,<span class="string">'SetSP'</span>}))
2440137         SetSPFlag = 1;
2450138         varargin(i) = [];
2460139     <span class="keyword">elseif</span> any(strcmpi(varargin{i},{<span class="string">'NoSetPV'</span>,<span class="string">'NoSetSP'</span>}))
2470140         SetSPFlag = 0;
2480141         Flags = [Flags varargin(i)];
2490142         varargin(i) = [];
2500143     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'LeakageCorrection'</span>)       
2510144         NoLeakageFlag = 1;
2520145         varargin(i) = [];
2530146         
2540147     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'archive'</span>) || strcmpi(varargin{i},<span class="string">'noarchive'</span>)
2550148         <span class="comment">% Just remove</span>
2560149         varargin(i) = [];
2570150     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'struct'</span>) || strcmpi(varargin{i},<span class="string">'numeric'</span>)
2580151         <span class="comment">% Just remove</span>
2590152         varargin(i) = [];
2600153
2610154     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'CorrectorGain'</span>)
2620155         Flags = [Flags varargin(i) varargin(i+1)];
2630156         varargin(i+1) = [];
2640157         varargin(i)   = [];
2650158
2660159     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Tolerance'</span>)
2670160         Flags = [Flags varargin(i) varargin(i+1)];
2680161         varargin(i+1) = [];
2690162         varargin(i)   = [];
2700163
2710164     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'RampSteps'</span>)
2720165         Flags = [Flags varargin(i) varargin(i+1)];
2730166         varargin(i+1) = [];
2740167         varargin(i)   = [];
2750168
2760169     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'ModelResp'</span>)
2770170         Flags = [Flags varargin(i)];
2780171         varargin(i) = [];
2790172     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'ModelDisp'</span>)
2800173         Flags = [Flags varargin(i)];
2810174         varargin(i) = [];
2820175     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'MeasDisp'</span>)
2830176         Flags = [Flags varargin(i)];
2840177         varargin(i) = [];
2850178     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'GoldenDisp'</span>)
2860179         Flags = [Flags varargin(i)];
2870180         varargin(i) = [];
2880181         
2890182     <span class="keyword">elseif</span> any(strcmpi(varargin{i},{<span class="string">'FitRF'</span>,<span class="string">'SetRF'</span>,<span class="string">'RFCorrector'</span>}))
2900183         Flags = [Flags varargin(i)];
2910184         varargin(i) = [];
2920185     <span class="keyword">elseif</span> any(strcmpi(varargin{i},{<span class="string">'FitRFHCM0'</span>,<span class="string">'FitRFEnergy'</span>,<span class="string">'SetRFHCM0'</span>,<span class="string">'SetRFEnergy'</span>}))
2930186         Flags = [Flags varargin(i)];
2940187         varargin(i) = [];
2950188     <span class="keyword">elseif</span> any(strcmpi(varargin{i},{<span class="string">'FitRFDeltaHCM0'</span>,<span class="string">'SetRFDeltaHCM0'</span>}))
2960189         Flags = [Flags varargin(i)];
2970190         varargin(i) = [];
2980191     <span class="keyword">elseif</span> any(strcmpi(varargin{i},{<span class="string">'FitRFDispersionOrbit'</span>,<span class="string">'SetRFDispersionOrbit'</span>}))
2990192         Flags = [Flags varargin(i)];
3000193         varargin(i) = [];
3010194     <span class="keyword">elseif</span> any(strcmpi(varargin{i},{<span class="string">'FitRFDispersionHCM'</span>,<span class="string">'SetRFDispersionHCM'</span>}))
3020195         Flags = [Flags varargin(i)];
3030196         varargin(i) = [];
3040197
3050198     <span class="keyword">end</span>
3060199 <span class="keyword">end</span>
3070200
3080201
3090202 <span class="keyword">if</span> length(varargin) &gt;= 1
3100203     <span class="keyword">if</span> isstruct(varargin{1})
3110204         OCS = varargin{1};
3120205         varargin(1) = [];
3130206         <span class="keyword">if</span> length(varargin) &lt; 2
3140207             error(<span class="string">'An OCS plus at least 2 inputs are required'</span>);
3150208         <span class="keyword">end</span>
3160209         <span class="keyword">if</span> length(varargin) &gt;= 1
3170210             GoalOrbit = varargin{1};
3180211             varargin(1) = [];
3190212         <span class="keyword">end</span>
3200213         <span class="keyword">if</span> length(varargin) &gt;= 1
3210214             CMIncrementList = varargin{1};
3220215             varargin(1) = [];
3230216         <span class="keyword">end</span>
3240217     <span class="keyword">else</span>
3250218         OCS.BPM.FamilyName = varargin{1};
3260219         varargin(1) = [];
3270220         <span class="keyword">if</span> length(varargin) &gt;= 1
3280221             OCS.BPM.DeviceList = varargin{1};
3290222             varargin(1) = [];
3300223         <span class="keyword">end</span>
3310224         <span class="keyword">if</span> length(varargin) &gt;= 1
3320225             GoalOrbit = varargin{1};
3330226             varargin(1) = [];
3340227         <span class="keyword">end</span>
3350228         <span class="keyword">if</span> length(varargin) &gt;= 1
3360229             OCS.CM.FamilyName = varargin{1};
3370230             varargin(1) = [];
3380231         <span class="keyword">end</span>
3390232         <span class="keyword">if</span> length(varargin) &gt;= 1
3400233             CMIncrementList = varargin{1};
3410234             varargin(1) = [];
3420235         <span class="keyword">end</span>
3430236     <span class="keyword">end</span>
3440237     
3450238     <span class="comment">% Get NIter</span>
3460239     <span class="keyword">if</span> length(varargin) &gt;= 1
3470240         <span class="keyword">if</span> isnumeric(varargin{1})
3480241             OCS.NIter = varargin{1};
3490242             varargin(1) = [];
3500243         <span class="keyword">end</span>
3510244     <span class="keyword">end</span>
3520245     
3530246     <span class="comment">% Get SVDIndex (can be a fractional number, vector, or 'All')</span>
3540247     <span class="keyword">if</span> length(varargin) &gt;= 1
3550248         <span class="comment">%if isnumeric(varargin{1})</span>
3560249             OCS.SVDIndex = varargin{1};
3570250             varargin(1) = [];
3580251         <span class="comment">%end</span>
3590252     <span class="keyword">end</span>
3600253
3610254     <span class="comment">% Get BPMWeight</span>
3620255     <span class="keyword">if</span> length(varargin) &gt;= 1
3630256         <span class="keyword">if</span> isnumeric(varargin{1})
3640257             BPMWeight = varargin{1};
3650258             varargin(1) = [];
3660259         <span class="keyword">end</span>
3670260     <span class="keyword">end</span>
3680261 <span class="keyword">end</span>
3690262
3700263
3710264 <span class="comment">% Pass the extra inputs on</span>
3720265 <span class="keyword">if</span> length(varargin) &gt;= 1
3730266     Flags = [Flags varargin];
3740267 <span class="keyword">end</span>
3750268
3760269
3770270 <span class="comment">% Fill the empty fields</span>
3780271 <span class="keyword">if</span> isempty(OCS.BPM.FamilyName)
3790272     i = menu(<span class="string">'Select a plane'</span>,<span class="string">'Horizontal'</span>,<span class="string">'Vertical'</span>);
3800273     <span class="keyword">if</span> i == 1
3810274         OCS.BPM.FamilyName = <a href="gethbpmfamily.html" class="code" title="function Family = gethbpmfamily">gethbpmfamily</a>;
3820275         OCS.CM.FamilyName  = <a href="gethcmfamily.html" class="code" title="function Family = gethcmfamily">gethcmfamily</a>;
3830276     <span class="keyword">elseif</span> i == 2
3840277         OCS.BPM.FamilyName = <a href="getvbpmfamily.html" class="code" title="function Family = getvbpmfamily">getvbpmfamily</a>;
3850278         OCS.CM.FamilyName  = <a href="getvcmfamily.html" class="code" title="function Family = getvcmfamily">getvcmfamily</a>;
3860279     <span class="keyword">end</span>
3870280 <span class="keyword">end</span>
3880281 <span class="keyword">if</span> isempty(OCS.BPM.DeviceList)
3890282     OCS.BPM.DeviceList = editlist(<a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(OCS.BPM.FamilyName), OCS.BPM.FamilyName, 0);
3900283     <span class="comment">% Getting a list can messes up the order for bumps going from the last sector to the first</span>
3910284     <span class="keyword">for</span> i = 2:length(OCS.BPM.DeviceList)
3920285         <span class="keyword">if</span> <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(OCS.BPM.FamilyName,OCS.BPM.DeviceList(i,:))-<a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(OCS.BPM.FamilyName,OCS.BPM.DeviceList(i-1,:)) &gt; L/2
3930286             <span class="keyword">break</span>;
3940287         <span class="keyword">end</span>
3950288     <span class="keyword">end</span>
3960289     <span class="keyword">if</span> i &lt; length(OCS.BPM.DeviceList)
3970290         OCS.BPM.DeviceList = [OCS.BPM.DeviceList(i:<span class="keyword">end</span>,:); OCS.BPM.DeviceList(1:i-1,:)];
3980291     <span class="keyword">end</span>
3990292 <span class="keyword">end</span>
4000293 <span class="keyword">if</span> isempty(OCS.CM.FamilyName)
4010294     <span class="keyword">if</span> strcmpi(OCS.BPM.FamilyName, <a href="gethbpmfamily.html" class="code" title="function Family = gethbpmfamily">gethbpmfamily</a>)
4020295         OCS.CM.FamilyName = <a href="gethcmfamily.html" class="code" title="function Family = gethcmfamily">gethcmfamily</a>;
4030296     <span class="keyword">else</span>
4040297         OCS.CM.FamilyName = <a href="getvcmfamily.html" class="code" title="function Family = getvcmfamily">getvcmfamily</a>;
4050298     <span class="keyword">end</span>
4060299 <span class="keyword">end</span>
4070300
4080301 <span class="keyword">if</span> isempty(UnitsFlag)
4090302     UnitsFlag = <a href="getunits.html" class="code" title="function [Units, UnitsString] = getunits(Family, Field)">getunits</a>(OCS.BPM.FamilyName);
4100303 <span class="keyword">end</span>
4110304
4120305 <span class="keyword">if</span> isempty(ModeFlag)
4130306     ModeFlag = <a href="getmode.html" class="code" title="function Mode = getmode(Family, Field)">getmode</a>(OCS.BPM.FamilyName);
4140307 <span class="keyword">end</span>
4150308
4160309 <span class="keyword">if</span> NoLeakageFlag &amp;&amp; OCS.NIter==0
4170310     error(<span class="string">'Leakage cleanup flag cannot be used with zero iterations.'</span>);
4180311 <span class="keyword">end</span>
4190312 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%</span>
4200313 <span class="comment">% End of input parsing %</span>
4210314 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%</span>
4220315
4230316
4240317 <span class="comment">% Possibly convert the GoalOrbit</span>
4250318 <span class="keyword">if</span> any(isnan(GoalOrbit))
4260319     error(<span class="string">'Goal orbit has a NaN'</span>);
4270320 <span class="keyword">end</span>
4280321 <span class="keyword">if</span> isempty(GoalOrbit)
4290322     <span class="comment">% Input the goal orbit</span>
4300323     <span class="keyword">for</span> i = 1:size(OCS.BPM.DeviceList,1)
4310324         labels{i} = sprintf(<span class="string">'Input the goal orbit at %s(%d,%d)'</span>,OCS.BPM.FamilyName, OCS.BPM.DeviceList(i,1), OCS.BPM.DeviceList(i,2));
4320325         StartingPoint{i} = <span class="string">'0'</span>;
4330326     <span class="keyword">end</span>
4340327     answer = inputdlg(labels,<span class="string">'Local Bump'</span>,1,StartingPoint);
4350328     <span class="keyword">if</span> isempty(answer)
4360329         fprintf(<span class="string">'   Local bump cancelled'</span>);
4370330         <span class="keyword">return</span>
4380331     <span class="keyword">end</span>
4390332     <span class="keyword">for</span> i = 1:size(OCS.BPM.DeviceList,1)
4400333         GoalOrbit(i,1) = str2num(answer{i});
4410334     <span class="keyword">end</span>
4420335 <span class="keyword">end</span>
4430336 <span class="keyword">if</span> ischar(GoalOrbit)
4440337     <span class="keyword">if</span> strcmpi(GoalOrbit, <span class="string">'Golden'</span>)
4450338         GoalOrbit = <a href="getgolden.html" class="code" title="function Data = getgolden(varargin)">getgolden</a>(OCS.BPM.FamilyName, OCS.BPM.DeviceList);
4460339     <span class="keyword">elseif</span> strcmpi(GoalOrbit, <span class="string">'Offset'</span>)
4470340         GoalOrbit = <a href="getoffset.html" class="code" title="function Data = getoffset(varargin)">getoffset</a>(OCS.BPM.FamilyName, OCS.BPM.DeviceList);
4480341     <span class="keyword">else</span>
4490342         error(<span class="string">'Goal unknown'</span>);
4500343     <span class="keyword">end</span>
4510344 <span class="keyword">end</span>
4520345 GoalOrbit = GoalOrbit(:);
4530346
4540347 <span class="comment">% Check the length</span>
4550348 <span class="keyword">if</span> length(GoalOrbit) ~= size(OCS.BPM.DeviceList,1)
4560349     error(<span class="string">'Length of the GoalOrbit must equal the number of devices in BPMList'</span>);
4570350 <span class="keyword">end</span>
4580351
4590352
4600353 <span class="comment">% CMIncrementList must be a vector, no zeros, no repeats</span>
4610354 CheckCM = 0;
4620355 <span class="keyword">if</span> isempty(CMIncrementList)
4630356     CheckCM = 1;
4640357     Ncm = size(OCS.BPM.DeviceList,1)+2;
4650358     <span class="keyword">if</span> rem(Ncm,2) == 0
4660359         NcmDiv2 = Ncm / 2;
4670360         CMIncrementList = [-(Ncm/2):-1 1:(Ncm/2)];
4680361     <span class="keyword">else</span>
4690362         NcmDiv2 = Ncm / 2;
4700363         CMIncrementList = [-floor(Ncm/2):-1 1:(floor(Ncm/2)+1)];
4710364     <span class="keyword">end</span>
4720365 <span class="keyword">end</span>
4730366
4740367 <span class="comment">% Check for a device list input</span>
4750368 <span class="keyword">if</span> ~(size(CMIncrementList,2) == 2 &amp;&amp; size(CMIncrementList,1) &gt; 1)
4760369     CMIncrementList = CMIncrementList(:);
4770370     CMIncrementList = sort(CMIncrementList);
4780371     CMIncrementList(find(CMIncrementList==0)) = [];
4790372     CMIncrementList(find(diff(CMIncrementList)==0)) = [];
4800373 <span class="keyword">end</span>
4810374
4820375 <span class="comment">% Get BPM positions</span>
4830376 BPMListTotal = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(OCS.BPM.FamilyName, 1);
4840377 BPMsposTotal = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(OCS.BPM.FamilyName, BPMListTotal);
4850378 BPMspos      = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(OCS.BPM.FamilyName, OCS.BPM.DeviceList);
4860379
4870380
4880381 <span class="comment">% Stack 3 rings so you you don't have to worry about the L to 0 transition</span>
4890382 CMListTotal = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(OCS.CM.FamilyName, 1);
4900383 CMsposTotal = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(OCS.CM.FamilyName, CMListTotal);
4910384 CMListTotal = [CMListTotal; CMListTotal; CMListTotal];
4920385 CMsposTotal = [CMsposTotal-L; CMsposTotal; CMsposTotal+L];
4930386
4940387
4950388 <span class="comment">% Find the correctors</span>
4960389 <span class="comment">% Check for a device list input</span>
4970390 <span class="keyword">if</span> size(CMIncrementList,2) == 2 &amp;&amp; size(CMIncrementList,1) &gt; 1
4980391     <span class="comment">% DeviceList</span>
4990392     OCS.CM.DeviceList = CMIncrementList;
5000393 <span class="keyword">else</span>
5010394     <span class="keyword">for</span> i = 1:length(CMIncrementList)
5020395         <span class="keyword">if</span> CMIncrementList(i) &lt;= 0
5030396             j = find(CMsposTotal &lt;= BPMspos(1));
5040397             OCS.CM.DeviceList(i,:) = CMListTotal(j(end)+CMIncrementList(i)+1,:);
5050398         <span class="keyword">else</span>
5060399             j = find(CMsposTotal &gt;= BPMspos(end));
5070400             OCS.CM.DeviceList(i,:) = CMListTotal(j(1)+CMIncrementList(i)-1,:);
5080401         <span class="keyword">end</span>
5090402     <span class="keyword">end</span>
5100403 <span class="keyword">end</span>
5110404
5120405 <span class="keyword">if</span> CheckCM
5130406     DevTotal = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(OCS.CM.FamilyName);
5140407     checkvec = zeros(size(DevTotal,1),1);
5150408     checkvec(findrowindex(OCS.CM.DeviceList, DevTotal)) = 1;
5160409     OCS.CM.DeviceList = editlist(DevTotal, OCS.CM.FamilyName, checkvec);
5170410
5180411     <span class="comment">% Getting a list can messes up the order for bumps going from the last sector to the first</span>
5190412     <span class="keyword">for</span> i = 2:length(OCS.CM.DeviceList)
5200413         <span class="keyword">if</span> <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(OCS.CM.FamilyName,OCS.CM.DeviceList(i,:)) - <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(OCS.CM.FamilyName,OCS.CM.DeviceList(i-1,:)) &gt; L/2
5210414             <span class="keyword">break</span>;
5220415         <span class="keyword">end</span>
5230416     <span class="keyword">end</span>
5240417     <span class="keyword">if</span> i &lt; length(OCS.CM.DeviceList)
5250418         OCS.CM.DeviceList = [OCS.CM.DeviceList(i:<span class="keyword">end</span>,:); OCS.CM.DeviceList(1:i-1,:)];
5260419     <span class="keyword">end</span>
5270420 <span class="keyword">end</span>
5280421
5290422
5300423 <span class="comment">% Find all BPMs outside the bump (leakage control BPMs)</span>
5310424 CMspos = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(OCS.CM.FamilyName, OCS.CM.DeviceList);
5320425 <span class="keyword">if</span> CMspos(1) &gt; CMspos(end)
5330426     j1 = intersect(find(BPMsposTotal &lt; CMspos(1)), find(BPMsposTotal &gt; CMspos(end)));
5340427     j2 = [];
5350428 <span class="keyword">else</span>
5360429     j1 = find(BPMsposTotal &lt; CMspos(1));
5370430     j2 = find(BPMsposTotal &gt; CMspos(end));
5380431 <span class="keyword">end</span>
5390432 <span class="keyword">if</span> isempty(j1) &amp;&amp; isempty(j2)
5400433     error(<span class="string">'Cound not find any leakage control BPMs'</span>);
5410434 <span class="keyword">end</span>
5420435 OCS.BPM.DeviceList   = [BPMListTotal(j1,:); OCS.BPM.DeviceList; BPMListTotal(j2,:);];
5430436 BPMDeviceListLeakage = [BPMListTotal(j1,:);                     BPMListTotal(j2,:);];
5440437
5450438
5460439 <span class="keyword">if</span> OCS.Incremental
5470440     <span class="comment">% Incremental</span>
5480441     OCS.GoalOrbit = [zeros(length(j1),1); GoalOrbit; zeros(length(j2),1)];
5490442
5500443     <span class="keyword">if</span> OCS.NIter == 0
5510444         LeakageGoalOrbit = zeros(size(BPMDeviceListLeakage,1),1);
5520445     <span class="keyword">else</span>
5530446         <span class="keyword">if</span> isempty(j1)
5540447             LeakageOrbit1 = [];
5550448         <span class="keyword">else</span>
5560449             LeakageOrbit1 = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(OCS.BPM.FamilyName,BPMListTotal(j1,:), UnitsFlag, ModeFlag);
5570450         <span class="keyword">end</span>
5580451         <span class="keyword">if</span> isempty(j2)
5590452             LeakageOrbit2 = [];
5600453         <span class="keyword">else</span>
5610454             LeakageOrbit2 = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(OCS.BPM.FamilyName,BPMListTotal(j2,:), UnitsFlag, ModeFlag);
5620455         <span class="keyword">end</span>
5630456         LeakageGoalOrbit = [LeakageOrbit1; LeakageOrbit2];
5640457     <span class="keyword">end</span>
5650458 <span class="keyword">elseif</span> ~OCS.Incremental
5660459     <span class="comment">% Absolute</span>
5670460     <span class="keyword">if</span> isempty(j1)
5680461         LeakageOrbit1 = [];
5690462     <span class="keyword">else</span>
5700463         LeakageOrbit1 = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(OCS.BPM.FamilyName,BPMListTotal(j1,:), UnitsFlag, ModeFlag);
5710464     <span class="keyword">end</span>
5720465     <span class="keyword">if</span> isempty(j2)
5730466         LeakageOrbit2 = [];
5740467     <span class="keyword">else</span>
5750468         LeakageOrbit2 = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(OCS.BPM.FamilyName,BPMListTotal(j2,:), UnitsFlag, ModeFlag);
5760469     <span class="keyword">end</span>
5770470     OCS.GoalOrbit    = [LeakageOrbit1; GoalOrbit; LeakageOrbit2];
5780471     LeakageGoalOrbit = [LeakageOrbit1; LeakageOrbit2];
5790472 <span class="keyword">else</span>
5800473     error(<span class="string">'Absolute or incremental input unknown.'</span>);
5810474 <span class="keyword">end</span>
5820475
5830476
5840477 <span class="comment">% Add a weight</span>
5850478 <span class="keyword">if</span> isempty(BPMWeight)
5860479     <span class="comment">% Default BPMWeight is to weight the leakage twice as much as the bump goal</span>
5870480     BPMWeight = .5 * (length(j1) + length(j2)) / length(GoalOrbit);
5880481     OCS.BPMWeight = [ones(length(j1),1); BPMWeight .* ones(length(GoalOrbit),1); ones(length(j2),1)];
5890482 <span class="keyword">else</span>
5900483     OCS.BPMWeight = [ones(length(j1),1); BPMWeight .* ones(length(GoalOrbit),1); ones(length(j2),1)];
5910484 <span class="keyword">end</span>
5920485
5930486
5940487 <span class="comment">% Just to fill the data structure fields</span>
5950488 OCS.BPM = <a href="family2datastruct.html" class="code" title="function [DataStruct, ErrorFlag] = family2datastruct(varargin)">family2datastruct</a>(OCS.BPM.FamilyName, <span class="string">'Monitor'</span>,  OCS.BPM.DeviceList, UnitsFlag, ModeFlag);
5960489 OCS.CM  = <a href="family2datastruct.html" class="code" title="function [DataStruct, ErrorFlag] = family2datastruct(varargin)">family2datastruct</a>(OCS.CM.FamilyName,  <span class="string">'Setpoint'</span>, OCS.CM.DeviceList,  UnitsFlag, ModeFlag);
5970490
5980491
5990492 <span class="comment">% Bumps stats</span>
6000493 <span class="keyword">if</span> DisplayFlag
6010494     <span class="comment">% Corrector strength (meters/radian) and (mm/amp)</span>
6020495     <span class="comment">% Warn on when to add RF frequency (generated dispersion is greater</span>
6030496     <span class="comment">% than mm per amp or % of mm/amp bump)</span>
6040497 <span class="keyword">end</span>
6050498
6060499
6070500 <span class="comment">% Set the bump</span>
6080501 [OCS, OCS0, V, S, ErrorFlag] = <a href="setorbit.html" class="code" title="function [OCS, OCS0, V, S, ErrorFlag] = setorbit(varargin)">setorbit</a>(OCS, UnitsFlag, ModeFlag, Flags{:});
6090502
6100503
6110504 <span class="comment">% Clean up the leakage</span>
6120505 <span class="keyword">if</span> NoLeakageFlag
6130506     <span class="keyword">if</span> DisplayFlag
6140507         fprintf(<span class="string">'   Correcting the leakage\n'</span>);
6150508     <span class="keyword">end</span>
6160509     OCS1 = OCS;
6170510     OCS1.GoalOrbit = LeakageGoalOrbit;
6180511     OCS1.BPM = <a href="family2datastruct.html" class="code" title="function [DataStruct, ErrorFlag] = family2datastruct(varargin)">family2datastruct</a>(OCS.BPM.FamilyName, <span class="string">'Monitor'</span>, BPMDeviceListLeakage);
6190512     OCS1.BPMWeight = [];
6200513     OCS1.Incremental = 0;
6210514     OCS1 = <a href="setorbit.html" class="code" title="function [OCS, OCS0, V, S, ErrorFlag] = setorbit(varargin)">setorbit</a>(OCS1, UnitsFlag, ModeFlag);
6220515 <span class="keyword">end</span>
6230516</pre></div>
624<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>
625</body>
626</html>
Note: See TracBrowser for help on using the repository browser.