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 measbpmresp</title> |
---|
6 | <meta name="keywords" content="measbpmresp"> |
---|
7 | <meta name="description" content="MEASBPMRESP - Measures the BPM response matrix in the horizontal and vertical planes"> |
---|
8 | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> |
---|
9 | <meta name="generator" content="m2html © 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> > <a href="index.html">mml</a> > measbpmresp.m</div> |
---|
16 | |
---|
17 | <!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png"> Master index</a></td> |
---|
18 | <td align="right"><a href="index.html">Index for mml <img alt=">" border="0" src="../right.png"></a></td></tr></table>--> |
---|
19 | |
---|
20 | <h1>measbpmresp |
---|
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>MEASBPMRESP - Measures the BPM response matrix in the horizontal and vertical planes</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 [Rmat, OutputFileName] = measbpmresp(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">MEASBPMRESP - Measures the BPM response matrix in the horizontal and vertical planes |
---|
31 | |
---|
32 | For family name, device list inputs: |
---|
33 | [R, FileName] = measbpmresp(BPMxFamily, BPMxList, BPMyFamily, BPMyList, HCMFamily, HCMList, VCMFamily, VCMList, HCMKicks, VCMKicks, ModulationMethod, WaitFlag, FileName, DirectoryName, ExtraDelay) |
---|
34 | |
---|
35 | For data structure inputs: |
---|
36 | [R, FileName] = measbpmresp(BPMxStruct, BPMyStruct, HCMStruct, VCMStruct, HCMKicks, VCMKicks, ModulationMethod, WaitFlag, FileName, DirectoryName, ExtraDelay) |
---|
37 | |
---|
38 | INPUTS |
---|
39 | 1. BPMxFamily - BPMx family name {Default: gethbpmfamily} |
---|
40 | BPMxDeviceList - BPMx device list {Default: all devices with good status} |
---|
41 | or |
---|
42 | BPMxStruct can replace BPMxFamily and BPMxList |
---|
43 | |
---|
44 | 2. BPMyFamily - BPMy family name {Default: getvbpmfamily} |
---|
45 | BPMyDeviceList - BPMy device list {Default: all devices with good status} |
---|
46 | or |
---|
47 | BPMyStruct can replace BPMyFamily and BPMyList |
---|
48 | |
---|
49 | 3. HCMFamily - HCM family name {Default: gethcmfamily} |
---|
50 | HCMDeviceList - HCM device list {Default: all devices with good status} |
---|
51 | or |
---|
52 | HCMStruct can replace HCMFamily and HCMList |
---|
53 | |
---|
54 | 4. VCMFamily - VCM family name {Default: getvcmfamily} |
---|
55 | VCMDeviceList - VCM device list {Default: all devices with good status} |
---|
56 | or |
---|
57 | VCMStruct can replace VCMFamily and VCMList |
---|
58 | |
---|
59 | 5. HCMKicks - Change in HCM correctors {Default: getfamilydata(HCMFamily,'Setpoint','DeltaRespMat',HCMDeviceList), then .05 mrad} |
---|
60 | 6. VCMKicks - Change in VCM correctors {Default: getfamilydata(VCMFamily,'Setpoint','DeltaRespMat',VCMDeviceList), then .05 mrad} |
---|
61 | |
---|
62 | 7. ModulationMethod - Method for changing the ActuatorFamily |
---|
63 | 'bipolar' changes the ActuatorFamily by +/- ActuatorDelta/2 on each step {Default} |
---|
64 | 'unipolar' changes the ActuatorFamily from 0 to ActuatorDelta on each step |
---|
65 | |
---|
66 | 8. WaitFlag - (see setpv for WaitFlag definitions) {Default: []} |
---|
67 | WaitFlag = -5 will override gets to manual mode |
---|
68 | |
---|
69 | 9. Optional input to change the default filename and directory |
---|
70 | FileName - Filename for the response matrix data |
---|
71 | (Empty prompts for a filename) |
---|
72 | DirectoryName - Directory name to store the response matrix data file |
---|
73 | Note: a. FileName can include the path if DirectoryName is not used |
---|
74 | b. For model response matrices, FileName must exist for a file save |
---|
75 | c. The 'Achive' flag is another way to input the filename |
---|
76 | |
---|
77 | 10. ExtraDelay - extra time delay [seconds] after a setpoint change |
---|
78 | |
---|
79 | 11. 'Struct' - Output will be a response matrix structure {Default for data structure inputs} |
---|
80 | 'Numeric' - Output will be a numeric matrix {Default for non-data structure inputs} |
---|
81 | |
---|
82 | 12. Optional override of the units: |
---|
83 | 'Physics' - Use physics units |
---|
84 | 'Hardware' - Use hardware units |
---|
85 | |
---|
86 | 13. Optional override of the mode: |
---|
87 | 'Online' - Set/Get data online |
---|
88 | 'Model' - Set/Get data directly from AT (uses locoresponsematrix) |
---|
89 | 'Simulator' - Set/Get data on the simulated accelerator using AT (ie, same commands as 'Online') |
---|
90 | 'Manual' - Set/Get data manually |
---|
91 | |
---|
92 | 14. 'Display' - Prints status information to the command window {Default} |
---|
93 | 'NoDisplay' - Nothing is printed to the command window |
---|
94 | |
---|
95 | 15. 'NoArchive' - No file archive |
---|
96 | 'Archive' - Save the response matrix data to \<Directory.BPMResponse>\<BPMRespFile><Date><Time>.mat |
---|
97 | To change the filename, included the filename after the 'Archive', '' to browse |
---|
98 | |
---|
99 | 16. 'MinimumBeamCurrent' - Minimum beam current before prompting for a refill |
---|
100 | The current (as returned by getdcct) must follow the flag. |
---|
101 | measbpmresp('MinimumBeamCurrent', 32.1) |
---|
102 | will pause at a beam current of 32.1 and prompt for a refill. |
---|
103 | |
---|
104 | 17. Optional inputs when computing model response matrices: |
---|
105 | 'FixedPathLength' or 'FixedMomentum' - hold the path length or momentum fixed {Default: 'FixedPathLength'} |
---|
106 | 'Full' or 'Linear' - use full nonlinear model or linear approximation (faster) {Default: 'Linear'} |
---|
107 | Note: The ModulationMethod input (7) is also used for the model calculation. |
---|
108 | |
---|
109 | OUTPUTS |
---|
110 | 1. R = Orbit response matrix (delta(orbit)/delta(Kick)) |
---|
111 | |
---|
112 | Numeric Output: |
---|
113 | R = [xx xy |
---|
114 | yx yy] |
---|
115 | |
---|
116 | Stucture Output: |
---|
117 | R(BPM Plane, Corrector Plane) - 2x2 struct array |
---|
118 | R(1,1).Data=xx; % Kick x, look x |
---|
119 | R(2,1).Data=yx; % Kick x, look y |
---|
120 | R(1,2).Data=xy; % Kick y, look x |
---|
121 | R(2,2).Data=yy; % Kick y, look y |
---|
122 | |
---|
123 | R(Monitor, Actuator).Data - Response matrix |
---|
124 | .Monitor - BPM data structure (starting orbit) |
---|
125 | .Monitor1 - BPM matrix (first data point) |
---|
126 | .Monitor2 - BPM matrix (second data point) |
---|
127 | .Actuator - Corrector data structure |
---|
128 | .ActuatorDelta - Corrector kick vector |
---|
129 | .GeV - Electron beam energy |
---|
130 | .ModulationMethod - 'unipolar' or 'bipolar' |
---|
131 | .WaitFlag - Wait flag used when acquiring data |
---|
132 | .ExtraDelay - Extra time delay |
---|
133 | .TimeStamp |
---|
134 | .CreatedBy |
---|
135 | .DCCT |
---|
136 | |
---|
137 | 2. FileName = File name (including directory) where the data was saved (if applicable) |
---|
138 | (a machine configuration structure is saved in the data file as well) |
---|
139 | |
---|
140 | NOTES |
---|
141 | 1. [] can be used on any input to obtain the default setting. |
---|
142 | However, most inputs can be left out altogether to get the default. |
---|
143 | 2. For Mode = 'Model': |
---|
144 | a. AT family names (or 'All') can be used and DeviceList is ignored |
---|
145 | b. There is a lot of flexibility for getting response matrices, for instance, |
---|
146 | R = measbpmresp('QF', 'QD', 'HCM', 'VCM', 'Model', 'Physics'); |
---|
147 | is the response matrix from the correctors to orbit at the sextupoles. |
---|
148 | The units when using nonstandard families for BPMs is always 'physics', meter/radian. |
---|
149 | 3. Cell inputs are not allowed. |
---|
150 | 4. BPM roll and crunch and corrector magnet roll errors are included only if they are |
---|
151 | in the AT model (field .GCR for BPMs and .Roll for correctors). |
---|
152 | BPM and corrector magnet gains are included in hardware units (not physics units). |
---|
153 | 5. This function measures response matrices from 2 BPM families to 2 corrector families. |
---|
154 | If only one family is needed then use measrespmat. |
---|
155 | |
---|
156 | EXAMPLES |
---|
157 | 1. Default: |
---|
158 | R = measbpmresp; |
---|
159 | is the same as, |
---|
160 | R = measbpmresp('BPMx', 'BPMy', 'HCM', 'VCM', 'Online', 'Bipolar', 'Numeric', 'Archive'); |
---|
161 | |
---|
162 | 2. Default using the model: |
---|
163 | R = measbpmresp('Model'); |
---|
164 | is the same as, |
---|
165 | R = measbpmresp('BPMx', 'BPMy', 'HCM', 'VCM', 'Model', 'Bipolar', 'Numeric', 'NoArchive', 'FixedPathLength', 'Linear'); |
---|
166 | |
---|
167 | 3. Compare measured (or Default) and model BPM response |
---|
168 | Rmeas = getbpmresp; |
---|
169 | Rmodel = measbpmresp('Model'); |
---|
170 | subplot(2,1,1); |
---|
171 | surf(Rmeas); title('Default BPM Response'); xlabel('BPM #'); ylabel('CM #'); zlabel('[mm/amp]'); |
---|
172 | subplot(2,1,2); |
---|
173 | surf(Rmeas-Rmodel); title('Default - Model BPM Response'); xlabel('BPM #'); ylabel('CM #'); zlabel('[mm/amp]'); |
---|
174 | |
---|
175 | See also <a href="getbpmresp.html" class="code" title="function [S, FileName] = getbpmresp(varargin)">getbpmresp</a>, <a href="measrespmat.html" class="code" title="function S = measrespmat(varargin)">measrespmat</a>, <a href="meastuneresp.html" class="code" title="function [Rmat, OutputFileName] = meastuneresp(varargin)">meastuneresp</a>, <a href="measchroresp.html" class="code" title="function [Rmat, OutputFileName] = measchroresp(varargin)">measchroresp</a> |
---|
176 | |
---|
177 | Written by Greg Portmann</pre></div> |
---|
178 | |
---|
179 | <!-- crossreference --> |
---|
180 | <h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2> |
---|
181 | This function calls: |
---|
182 | <ul style="list-style-image:url(../matlabicon.gif)"> |
---|
183 | <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="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="getmachineconfig.html" class="code" title="function [ConfigSetpoint, ConfigMonitor, FileName] = getmachineconfig(varargin)">getmachineconfig</a> GETMACHINECONFIG - Returns or saves to file the present storage ring setpoints and monitors</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="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a> GETSP - Gets setpoint channels</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="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="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a> HW2PHYSICS - Converts from 'Hardware' units to 'Physics' units</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="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a> ISMEMBEROF - Returns turn if the membership information of a family (cell of strings)</li><li><a href="isstoragering.html" class="code" title="function Test = isstoragering">isstoragering</a> ISSTORAGERING - Is this a storage ring?</li><li><a href="istransport.html" class="code" title="function Test = istransport">istransport</a> ISTRANSPORT - Is this a transport line?</li><li><a href="measrespmat.html" class="code" title="function S = measrespmat(varargin)">measrespmat</a> MEASRESPMAT - Measure a response matrix</li><li><a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a> PHYSICS2HW - Converts from 'Physics' units to 'Hardware' units</li></ul> |
---|
184 | This function is called by: |
---|
185 | <ul style="list-style-image:url(../matlabicon.gif)"> |
---|
186 | <li><a href="bpmresp2loco.html" class="code" title="function [R, Data, DataMM] = bpmresp2loco(R)">bpmresp2loco</a> BPMRESP2LOCO - Convert a MML response matrix to LOCO units</li><li><a href="buildopsdatafiles.html" class="code" title="function buildopsdatafiles">buildopsdatafiles</a> BUILDOPSDATAFILES - Builds the files for the OpsData directory from the model</li><li><a href="getbpmresp.html" class="code" title="function [S, FileName] = getbpmresp(varargin)">getbpmresp</a> GETBPMRESP - Returns the BPM response matrix in the horizontal and vertical planes</li><li><a href="measlocodata.html" class="code" title="function measlocodata(varargin)">measlocodata</a> MEASLOCODATA - Measures a set of LOCO data</li><li><a href="orbitcorrectionmethods.html" class="code" title="function [OCS, SmatNoWeights, S, U, V] = orbitcorrectionmethods(OCS, Smat, S, U, V)">orbitcorrectionmethods</a> ORBITCORRECTIONMETHODS - Some the orbit correction methods used on light sources</li><li><a href="plotbpmresp.html" class="code" title="function plotbpmresp(varargin)">plotbpmresp</a> PLOTBPMRESP - Plots the orbit response matrix in various ways</li></ul> |
---|
187 | <!-- crossreference --> |
---|
188 | |
---|
189 | |
---|
190 | <h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2> |
---|
191 | <div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function [Rmat, OutputFileName] = measbpmresp(varargin)</a> |
---|
192 | 0002 <span class="comment">%MEASBPMRESP - Measures the BPM response matrix in the horizontal and vertical planes</span> |
---|
193 | 0003 <span class="comment">%</span> |
---|
194 | 0004 <span class="comment">% For family name, device list inputs:</span> |
---|
195 | 0005 <span class="comment">% [R, FileName] = measbpmresp(BPMxFamily, BPMxList, BPMyFamily, BPMyList, HCMFamily, HCMList, VCMFamily, VCMList, HCMKicks, VCMKicks, ModulationMethod, WaitFlag, FileName, DirectoryName, ExtraDelay)</span> |
---|
196 | 0006 <span class="comment">%</span> |
---|
197 | 0007 <span class="comment">% For data structure inputs:</span> |
---|
198 | 0008 <span class="comment">% [R, FileName] = measbpmresp(BPMxStruct, BPMyStruct, HCMStruct, VCMStruct, HCMKicks, VCMKicks, ModulationMethod, WaitFlag, FileName, DirectoryName, ExtraDelay)</span> |
---|
199 | 0009 <span class="comment">%</span> |
---|
200 | 0010 <span class="comment">% INPUTS</span> |
---|
201 | 0011 <span class="comment">% 1. BPMxFamily - BPMx family name {Default: gethbpmfamily}</span> |
---|
202 | 0012 <span class="comment">% BPMxDeviceList - BPMx device list {Default: all devices with good status}</span> |
---|
203 | 0013 <span class="comment">% or</span> |
---|
204 | 0014 <span class="comment">% BPMxStruct can replace BPMxFamily and BPMxList</span> |
---|
205 | 0015 <span class="comment">%</span> |
---|
206 | 0016 <span class="comment">% 2. BPMyFamily - BPMy family name {Default: getvbpmfamily}</span> |
---|
207 | 0017 <span class="comment">% BPMyDeviceList - BPMy device list {Default: all devices with good status}</span> |
---|
208 | 0018 <span class="comment">% or</span> |
---|
209 | 0019 <span class="comment">% BPMyStruct can replace BPMyFamily and BPMyList</span> |
---|
210 | 0020 <span class="comment">%</span> |
---|
211 | 0021 <span class="comment">% 3. HCMFamily - HCM family name {Default: gethcmfamily}</span> |
---|
212 | 0022 <span class="comment">% HCMDeviceList - HCM device list {Default: all devices with good status}</span> |
---|
213 | 0023 <span class="comment">% or</span> |
---|
214 | 0024 <span class="comment">% HCMStruct can replace HCMFamily and HCMList</span> |
---|
215 | 0025 <span class="comment">%</span> |
---|
216 | 0026 <span class="comment">% 4. VCMFamily - VCM family name {Default: getvcmfamily}</span> |
---|
217 | 0027 <span class="comment">% VCMDeviceList - VCM device list {Default: all devices with good status}</span> |
---|
218 | 0028 <span class="comment">% or</span> |
---|
219 | 0029 <span class="comment">% VCMStruct can replace VCMFamily and VCMList</span> |
---|
220 | 0030 <span class="comment">%</span> |
---|
221 | 0031 <span class="comment">% 5. HCMKicks - Change in HCM correctors {Default: getfamilydata(HCMFamily,'Setpoint','DeltaRespMat',HCMDeviceList), then .05 mrad}</span> |
---|
222 | 0032 <span class="comment">% 6. VCMKicks - Change in VCM correctors {Default: getfamilydata(VCMFamily,'Setpoint','DeltaRespMat',VCMDeviceList), then .05 mrad}</span> |
---|
223 | 0033 <span class="comment">%</span> |
---|
224 | 0034 <span class="comment">% 7. ModulationMethod - Method for changing the ActuatorFamily</span> |
---|
225 | 0035 <span class="comment">% 'bipolar' changes the ActuatorFamily by +/- ActuatorDelta/2 on each step {Default}</span> |
---|
226 | 0036 <span class="comment">% 'unipolar' changes the ActuatorFamily from 0 to ActuatorDelta on each step</span> |
---|
227 | 0037 <span class="comment">%</span> |
---|
228 | 0038 <span class="comment">% 8. WaitFlag - (see setpv for WaitFlag definitions) {Default: []}</span> |
---|
229 | 0039 <span class="comment">% WaitFlag = -5 will override gets to manual mode</span> |
---|
230 | 0040 <span class="comment">%</span> |
---|
231 | 0041 <span class="comment">% 9. Optional input to change the default filename and directory</span> |
---|
232 | 0042 <span class="comment">% FileName - Filename for the response matrix data</span> |
---|
233 | 0043 <span class="comment">% (Empty prompts for a filename)</span> |
---|
234 | 0044 <span class="comment">% DirectoryName - Directory name to store the response matrix data file</span> |
---|
235 | 0045 <span class="comment">% Note: a. FileName can include the path if DirectoryName is not used</span> |
---|
236 | 0046 <span class="comment">% b. For model response matrices, FileName must exist for a file save</span> |
---|
237 | 0047 <span class="comment">% c. The 'Achive' flag is another way to input the filename</span> |
---|
238 | 0048 <span class="comment">%</span> |
---|
239 | 0049 <span class="comment">% 10. ExtraDelay - extra time delay [seconds] after a setpoint change</span> |
---|
240 | 0050 <span class="comment">%</span> |
---|
241 | 0051 <span class="comment">% 11. 'Struct' - Output will be a response matrix structure {Default for data structure inputs}</span> |
---|
242 | 0052 <span class="comment">% 'Numeric' - Output will be a numeric matrix {Default for non-data structure inputs}</span> |
---|
243 | 0053 <span class="comment">%</span> |
---|
244 | 0054 <span class="comment">% 12. Optional override of the units:</span> |
---|
245 | 0055 <span class="comment">% 'Physics' - Use physics units</span> |
---|
246 | 0056 <span class="comment">% 'Hardware' - Use hardware units</span> |
---|
247 | 0057 <span class="comment">%</span> |
---|
248 | 0058 <span class="comment">% 13. Optional override of the mode:</span> |
---|
249 | 0059 <span class="comment">% 'Online' - Set/Get data online</span> |
---|
250 | 0060 <span class="comment">% 'Model' - Set/Get data directly from AT (uses locoresponsematrix)</span> |
---|
251 | 0061 <span class="comment">% 'Simulator' - Set/Get data on the simulated accelerator using AT (ie, same commands as 'Online')</span> |
---|
252 | 0062 <span class="comment">% 'Manual' - Set/Get data manually</span> |
---|
253 | 0063 <span class="comment">%</span> |
---|
254 | 0064 <span class="comment">% 14. 'Display' - Prints status information to the command window {Default}</span> |
---|
255 | 0065 <span class="comment">% 'NoDisplay' - Nothing is printed to the command window</span> |
---|
256 | 0066 <span class="comment">%</span> |
---|
257 | 0067 <span class="comment">% 15. 'NoArchive' - No file archive</span> |
---|
258 | 0068 <span class="comment">% 'Archive' - Save the response matrix data to \<Directory.BPMResponse>\<BPMRespFile><Date><Time>.mat</span> |
---|
259 | 0069 <span class="comment">% To change the filename, included the filename after the 'Archive', '' to browse</span> |
---|
260 | 0070 <span class="comment">%</span> |
---|
261 | 0071 <span class="comment">% 16. 'MinimumBeamCurrent' - Minimum beam current before prompting for a refill</span> |
---|
262 | 0072 <span class="comment">% The current (as returned by getdcct) must follow the flag.</span> |
---|
263 | 0073 <span class="comment">% measbpmresp('MinimumBeamCurrent', 32.1)</span> |
---|
264 | 0074 <span class="comment">% will pause at a beam current of 32.1 and prompt for a refill.</span> |
---|
265 | 0075 <span class="comment">%</span> |
---|
266 | 0076 <span class="comment">% 17. Optional inputs when computing model response matrices:</span> |
---|
267 | 0077 <span class="comment">% 'FixedPathLength' or 'FixedMomentum' - hold the path length or momentum fixed {Default: 'FixedPathLength'}</span> |
---|
268 | 0078 <span class="comment">% 'Full' or 'Linear' - use full nonlinear model or linear approximation (faster) {Default: 'Linear'}</span> |
---|
269 | 0079 <span class="comment">% Note: The ModulationMethod input (7) is also used for the model calculation.</span> |
---|
270 | 0080 <span class="comment">%</span> |
---|
271 | 0081 <span class="comment">% OUTPUTS</span> |
---|
272 | 0082 <span class="comment">% 1. R = Orbit response matrix (delta(orbit)/delta(Kick))</span> |
---|
273 | 0083 <span class="comment">%</span> |
---|
274 | 0084 <span class="comment">% Numeric Output:</span> |
---|
275 | 0085 <span class="comment">% R = [xx xy</span> |
---|
276 | 0086 <span class="comment">% yx yy]</span> |
---|
277 | 0087 <span class="comment">%</span> |
---|
278 | 0088 <span class="comment">% Stucture Output:</span> |
---|
279 | 0089 <span class="comment">% R(BPM Plane, Corrector Plane) - 2x2 struct array</span> |
---|
280 | 0090 <span class="comment">% R(1,1).Data=xx; % Kick x, look x</span> |
---|
281 | 0091 <span class="comment">% R(2,1).Data=yx; % Kick x, look y</span> |
---|
282 | 0092 <span class="comment">% R(1,2).Data=xy; % Kick y, look x</span> |
---|
283 | 0093 <span class="comment">% R(2,2).Data=yy; % Kick y, look y</span> |
---|
284 | 0094 <span class="comment">%</span> |
---|
285 | 0095 <span class="comment">% R(Monitor, Actuator).Data - Response matrix</span> |
---|
286 | 0096 <span class="comment">% .Monitor - BPM data structure (starting orbit)</span> |
---|
287 | 0097 <span class="comment">% .Monitor1 - BPM matrix (first data point)</span> |
---|
288 | 0098 <span class="comment">% .Monitor2 - BPM matrix (second data point)</span> |
---|
289 | 0099 <span class="comment">% .Actuator - Corrector data structure</span> |
---|
290 | 0100 <span class="comment">% .ActuatorDelta - Corrector kick vector</span> |
---|
291 | 0101 <span class="comment">% .GeV - Electron beam energy</span> |
---|
292 | 0102 <span class="comment">% .ModulationMethod - 'unipolar' or 'bipolar'</span> |
---|
293 | 0103 <span class="comment">% .WaitFlag - Wait flag used when acquiring data</span> |
---|
294 | 0104 <span class="comment">% .ExtraDelay - Extra time delay</span> |
---|
295 | 0105 <span class="comment">% .TimeStamp</span> |
---|
296 | 0106 <span class="comment">% .CreatedBy</span> |
---|
297 | 0107 <span class="comment">% .DCCT</span> |
---|
298 | 0108 <span class="comment">%</span> |
---|
299 | 0109 <span class="comment">% 2. FileName = File name (including directory) where the data was saved (if applicable)</span> |
---|
300 | 0110 <span class="comment">% (a machine configuration structure is saved in the data file as well)</span> |
---|
301 | 0111 <span class="comment">%</span> |
---|
302 | 0112 <span class="comment">% NOTES</span> |
---|
303 | 0113 <span class="comment">% 1. [] can be used on any input to obtain the default setting.</span> |
---|
304 | 0114 <span class="comment">% However, most inputs can be left out altogether to get the default.</span> |
---|
305 | 0115 <span class="comment">% 2. For Mode = 'Model':</span> |
---|
306 | 0116 <span class="comment">% a. AT family names (or 'All') can be used and DeviceList is ignored</span> |
---|
307 | 0117 <span class="comment">% b. There is a lot of flexibility for getting response matrices, for instance,</span> |
---|
308 | 0118 <span class="comment">% R = measbpmresp('QF', 'QD', 'HCM', 'VCM', 'Model', 'Physics');</span> |
---|
309 | 0119 <span class="comment">% is the response matrix from the correctors to orbit at the sextupoles.</span> |
---|
310 | 0120 <span class="comment">% The units when using nonstandard families for BPMs is always 'physics', meter/radian.</span> |
---|
311 | 0121 <span class="comment">% 3. Cell inputs are not allowed.</span> |
---|
312 | 0122 <span class="comment">% 4. BPM roll and crunch and corrector magnet roll errors are included only if they are</span> |
---|
313 | 0123 <span class="comment">% in the AT model (field .GCR for BPMs and .Roll for correctors).</span> |
---|
314 | 0124 <span class="comment">% BPM and corrector magnet gains are included in hardware units (not physics units).</span> |
---|
315 | 0125 <span class="comment">% 5. This function measures response matrices from 2 BPM families to 2 corrector families.</span> |
---|
316 | 0126 <span class="comment">% If only one family is needed then use measrespmat.</span> |
---|
317 | 0127 <span class="comment">%</span> |
---|
318 | 0128 <span class="comment">% EXAMPLES</span> |
---|
319 | 0129 <span class="comment">% 1. Default:</span> |
---|
320 | 0130 <span class="comment">% R = measbpmresp;</span> |
---|
321 | 0131 <span class="comment">% is the same as,</span> |
---|
322 | 0132 <span class="comment">% R = measbpmresp('BPMx', 'BPMy', 'HCM', 'VCM', 'Online', 'Bipolar', 'Numeric', 'Archive');</span> |
---|
323 | 0133 <span class="comment">%</span> |
---|
324 | 0134 <span class="comment">% 2. Default using the model:</span> |
---|
325 | 0135 <span class="comment">% R = measbpmresp('Model');</span> |
---|
326 | 0136 <span class="comment">% is the same as,</span> |
---|
327 | 0137 <span class="comment">% R = measbpmresp('BPMx', 'BPMy', 'HCM', 'VCM', 'Model', 'Bipolar', 'Numeric', 'NoArchive', 'FixedPathLength', 'Linear');</span> |
---|
328 | 0138 <span class="comment">%</span> |
---|
329 | 0139 <span class="comment">% 3. Compare measured (or Default) and model BPM response</span> |
---|
330 | 0140 <span class="comment">% Rmeas = getbpmresp;</span> |
---|
331 | 0141 <span class="comment">% Rmodel = measbpmresp('Model');</span> |
---|
332 | 0142 <span class="comment">% subplot(2,1,1);</span> |
---|
333 | 0143 <span class="comment">% surf(Rmeas); title('Default BPM Response'); xlabel('BPM #'); ylabel('CM #'); zlabel('[mm/amp]');</span> |
---|
334 | 0144 <span class="comment">% subplot(2,1,2);</span> |
---|
335 | 0145 <span class="comment">% surf(Rmeas-Rmodel); title('Default - Model BPM Response'); xlabel('BPM #'); ylabel('CM #'); zlabel('[mm/amp]');</span> |
---|
336 | 0146 <span class="comment">%</span> |
---|
337 | 0147 <span class="comment">% See also getbpmresp, measrespmat, meastuneresp, measchroresp</span> |
---|
338 | 0148 <span class="comment">%</span> |
---|
339 | 0149 <span class="comment">% Written by Greg Portmann</span> |
---|
340 | 0150 |
---|
341 | 0151 |
---|
342 | 0152 <span class="comment">% Initialize defaults</span> |
---|
343 | 0153 BPMxFamily = <a href="gethbpmfamily.html" class="code" title="function Family = gethbpmfamily">gethbpmfamily</a>; |
---|
344 | 0154 <span class="keyword">if</span> isempty(BPMxFamily) |
---|
345 | 0155 error(<span class="string">'"BPMx" needs to be a MemberOf some family.'</span>); |
---|
346 | 0156 <span class="keyword">end</span> |
---|
347 | 0157 BPMxList = []; |
---|
348 | 0158 |
---|
349 | 0159 BPMyFamily = <a href="getvbpmfamily.html" class="code" title="function Family = getvbpmfamily">getvbpmfamily</a>; |
---|
350 | 0160 <span class="keyword">if</span> isempty(BPMyFamily) |
---|
351 | 0161 error(<span class="string">'"BPMy" needs to be a MemberOf some family.'</span>); |
---|
352 | 0162 <span class="keyword">end</span> |
---|
353 | 0163 BPMyList = []; |
---|
354 | 0164 |
---|
355 | 0165 HCMFamily = <a href="gethcmfamily.html" class="code" title="function Family = gethcmfamily">gethcmfamily</a>; |
---|
356 | 0166 <span class="keyword">if</span> isempty(HCMFamily) |
---|
357 | 0167 error(<span class="string">'"HCM" needs to be a MemberOf some family.'</span>); |
---|
358 | 0168 <span class="keyword">end</span> |
---|
359 | 0169 HCMList = []; |
---|
360 | 0170 HCMKicks = []; |
---|
361 | 0171 Default2HCMKick = .05e-3; <span class="comment">% Radians, if getfamilydata(HCMFamily,'Setpoint','DeltaRespMat') is empty</span> |
---|
362 | 0172 |
---|
363 | 0173 VCMFamily = <a href="getvcmfamily.html" class="code" title="function Family = getvcmfamily">getvcmfamily</a>; |
---|
364 | 0174 <span class="keyword">if</span> isempty(VCMFamily) |
---|
365 | 0175 error(<span class="string">'"VCM" needs to be a MemberOf some family.'</span>); |
---|
366 | 0176 <span class="keyword">end</span> |
---|
367 | 0177 VCMList = []; |
---|
368 | 0178 VCMKicks = []; |
---|
369 | 0179 Default2VCMKick = .05e-3; <span class="comment">% Radians, if getfamilydata(VCMFamily,'Setpoint','DeltaRespMat') is empty</span> |
---|
370 | 0180 ModulationMethod = <span class="string">'bipolar'</span>; |
---|
371 | 0181 |
---|
372 | 0182 <span class="comment">% Map MML to LOCO naming</span> |
---|
373 | 0183 <span class="keyword">if</span> strcmpi(ModulationMethod, <span class="string">'bipolar'</span>) |
---|
374 | 0184 LOCORespFlags.ResponseMatrixMeasurement = <span class="string">'Bidirectional'</span>; <span class="comment">% 'oneway'' or ''bidirectional'</span> |
---|
375 | 0185 <span class="keyword">else</span> |
---|
376 | 0186 LOCORespFlags.DispersionMeasurement = <span class="string">'Bidirectional'</span>; |
---|
377 | 0187 <span class="keyword">end</span> |
---|
378 | 0188 <span class="keyword">if</span> <a href="isstoragering.html" class="code" title="function Test = isstoragering">isstoragering</a> |
---|
379 | 0189 LOCORespFlags.ResponseMatrixCalculator = <span class="string">'Linear'</span>; |
---|
380 | 0190 LOCORespFlags.ClosedOrbitType = <span class="string">'fixedpathlength'</span>; |
---|
381 | 0191 LOCORespFlags.MachineType = <span class="string">'StorageRing'</span>; |
---|
382 | 0192 <span class="keyword">else</span> |
---|
383 | 0193 <span class="comment">% Full is usually as fast as Linear for transport lines</span> |
---|
384 | 0194 LOCORespFlags.ResponseMatrixCalculator = <span class="string">'full'</span>; |
---|
385 | 0195 LOCORespFlags.ClosedOrbitType = <span class="string">'fixedmomentum'</span>; |
---|
386 | 0196 LOCORespFlags.MachineType = <span class="string">'Transport'</span>; |
---|
387 | 0197 <span class="keyword">end</span> |
---|
388 | 0198 |
---|
389 | 0199 WaitFlag = -2; |
---|
390 | 0200 ExtraDelay = 0; |
---|
391 | 0201 StructOutputFlag = 0; |
---|
392 | 0202 NumericOutputFlag = 0; |
---|
393 | 0203 DisplayFlag = -1; |
---|
394 | 0204 ArchiveFlag = -1; |
---|
395 | 0205 FileName = -1; |
---|
396 | 0206 DirectoryName = <span class="string">''</span>; |
---|
397 | 0207 ModeFlag = <span class="string">''</span>; <span class="comment">% model, online, manual, or '' for default mode</span> |
---|
398 | 0208 UnitsFlag = <span class="string">''</span>; <span class="comment">% hardware, physics, or '' for default units</span> |
---|
399 | 0209 |
---|
400 | 0210 InputFlags = {}; |
---|
401 | 0211 DCCTFlag = {}; |
---|
402 | 0212 <span class="keyword">for</span> i = length(varargin):-1:1 |
---|
403 | 0213 <span class="keyword">if</span> isstruct(varargin{i}) |
---|
404 | 0214 <span class="comment">% Ignore structures</span> |
---|
405 | 0215 <span class="keyword">elseif</span> iscell(varargin{i}) |
---|
406 | 0216 <span class="comment">% Ignore cells</span> |
---|
407 | 0217 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Struct'</span>) |
---|
408 | 0218 StructOutputFlag = 1; |
---|
409 | 0219 varargin(i) = []; |
---|
410 | 0220 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Numeric'</span>) |
---|
411 | 0221 StructOutputFlag = 0; |
---|
412 | 0222 NumericOutputFlag = 1; |
---|
413 | 0223 varargin(i) = []; |
---|
414 | 0224 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Model'</span>) |
---|
415 | 0225 ModeFlag = varargin{i}; |
---|
416 | 0226 InputFlags = [InputFlags varargin(i)]; |
---|
417 | 0227 varargin(i) = []; |
---|
418 | 0228 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Simulator'</span>) |
---|
419 | 0229 ModeFlag = varargin{i}; |
---|
420 | 0230 InputFlags = [InputFlags varargin(i)]; |
---|
421 | 0231 varargin(i) = []; |
---|
422 | 0232 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Online'</span>) |
---|
423 | 0233 ModeFlag = varargin{i}; |
---|
424 | 0234 InputFlags = [InputFlags varargin(i)]; |
---|
425 | 0235 varargin(i) = []; |
---|
426 | 0236 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Manual'</span>) |
---|
427 | 0237 ModeFlag = varargin{i}; |
---|
428 | 0238 InputFlags = [InputFlags varargin(i)]; |
---|
429 | 0239 varargin(i) = []; |
---|
430 | 0240 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Physics'</span>) |
---|
431 | 0241 UnitsFlag = varargin{i}; |
---|
432 | 0242 InputFlags = [InputFlags varargin(i)]; |
---|
433 | 0243 varargin(i) = []; |
---|
434 | 0244 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Hardware'</span>) |
---|
435 | 0245 UnitsFlag = varargin{i}; |
---|
436 | 0246 InputFlags = [InputFlags varargin(i)]; |
---|
437 | 0247 varargin(i) = []; |
---|
438 | 0248 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Archive'</span>) |
---|
439 | 0249 ArchiveFlag = 1; |
---|
440 | 0250 <span class="keyword">if</span> length(varargin) > i |
---|
441 | 0251 <span class="comment">% Look for a filename as the next input</span> |
---|
442 | 0252 <span class="keyword">if</span> ischar(varargin{i+1}) |
---|
443 | 0253 FileName = varargin{i+1}; |
---|
444 | 0254 varargin(i+1) = []; |
---|
445 | 0255 <span class="keyword">end</span> |
---|
446 | 0256 <span class="keyword">end</span> |
---|
447 | 0257 varargin(i) = []; |
---|
448 | 0258 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'NoArchive'</span>) |
---|
449 | 0259 ArchiveFlag = 0; |
---|
450 | 0260 varargin(i) = []; |
---|
451 | 0261 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'NoDisplay'</span>) |
---|
452 | 0262 DisplayFlag = 0; |
---|
453 | 0263 InputFlags = [InputFlags varargin(i)]; |
---|
454 | 0264 varargin(i) = []; |
---|
455 | 0265 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Display'</span>) |
---|
456 | 0266 DisplayFlag = 1; |
---|
457 | 0267 InputFlags = [InputFlags varargin(i)]; |
---|
458 | 0268 varargin(i) = []; |
---|
459 | 0269 |
---|
460 | 0270 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'unipolar'</span>) || strcmpi(varargin{i},<span class="string">'oneway'</span>) |
---|
461 | 0271 ModulationMethod = <span class="string">'unipolar'</span>; |
---|
462 | 0272 LOCORespFlags.ResponseMatrixMeasurement = <span class="string">'oneway'</span>; |
---|
463 | 0273 varargin(i) = []; |
---|
464 | 0274 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'bipolar'</span>) || strcmpi(varargin{i},<span class="string">'bidirectional'</span>) |
---|
465 | 0275 ModulationMethod = <span class="string">'bipolar'</span>; |
---|
466 | 0276 LOCORespFlags.ResponseMatrixMeasurement = <span class="string">'bidirectional'</span>; |
---|
467 | 0277 varargin(i) = []; |
---|
468 | 0278 |
---|
469 | 0279 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'FixedPathLength'</span>) |
---|
470 | 0280 LOCORespFlags.ClosedOrbitType = <span class="string">'FixedPathLength'</span>; |
---|
471 | 0281 varargin(i) = []; |
---|
472 | 0282 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'FixedMomentum'</span>) |
---|
473 | 0283 LOCORespFlags.ClosedOrbitType = <span class="string">'FixedMomentum'</span>; |
---|
474 | 0284 varargin(i) = []; |
---|
475 | 0285 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Linear'</span>) |
---|
476 | 0286 LOCORespFlags.ResponseMatrixCalculator = <span class="string">'Linear'</span>; |
---|
477 | 0287 varargin(i) = []; |
---|
478 | 0288 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Full'</span>) |
---|
479 | 0289 LOCORespFlags.ResponseMatrixCalculator = <span class="string">'Full'</span>; |
---|
480 | 0290 varargin(i) = []; |
---|
481 | 0291 |
---|
482 | 0292 <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'MinimumBeamCurrent'</span>) |
---|
483 | 0293 DCCTFlag = [varargin(i) varargin(i+1)]; |
---|
484 | 0294 varargin(i+1) = []; |
---|
485 | 0295 varargin(i) = []; |
---|
486 | 0296 <span class="keyword">end</span> |
---|
487 | 0297 <span class="keyword">end</span> |
---|
488 | 0298 |
---|
489 | 0299 <span class="comment">%%%%%%%%%%%%%%%%</span> |
---|
490 | 0300 <span class="comment">% Parse Inputs %</span> |
---|
491 | 0301 <span class="comment">%%%%%%%%%%%%%%%%</span> |
---|
492 | 0302 |
---|
493 | 0303 <span class="comment">% Look for BPMx family info</span> |
---|
494 | 0304 <span class="keyword">if</span> length(varargin) >= 1 |
---|
495 | 0305 <span class="keyword">if</span> isstruct(varargin{1}) |
---|
496 | 0306 BPMxFamily = varargin{1}.FamilyName; |
---|
497 | 0307 BPMxList = varargin{1}.DeviceList; |
---|
498 | 0308 |
---|
499 | 0309 <span class="comment">% For structure inputs, units are determined by the first input</span> |
---|
500 | 0310 <span class="keyword">if</span> isempty(UnitsFlag) |
---|
501 | 0311 UnitsFlag = varargin{1}.Units; |
---|
502 | 0312 <span class="keyword">end</span> |
---|
503 | 0313 |
---|
504 | 0314 varargin(1) = []; |
---|
505 | 0315 |
---|
506 | 0316 <span class="comment">% Only change StructOutputFlag if 'Numeric' is not on the input line</span> |
---|
507 | 0317 <span class="keyword">if</span> ~NumericOutputFlag |
---|
508 | 0318 StructOutputFlag = 1; |
---|
509 | 0319 <span class="keyword">end</span> |
---|
510 | 0320 <span class="keyword">elseif</span> ischar(varargin{1}) |
---|
511 | 0321 BPMxFamily = varargin{1}; |
---|
512 | 0322 varargin(1) = []; |
---|
513 | 0323 <span class="keyword">if</span> length(varargin) >= 1 |
---|
514 | 0324 <span class="keyword">if</span> isnumeric(varargin{1}) |
---|
515 | 0325 BPMxList = varargin{1}; |
---|
516 | 0326 varargin(1) = []; |
---|
517 | 0327 <span class="keyword">end</span> |
---|
518 | 0328 <span class="keyword">end</span> |
---|
519 | 0329 <span class="keyword">elseif</span> isnumeric(varargin{1}) |
---|
520 | 0330 BPMxList = varargin{1}; |
---|
521 | 0331 varargin(1) = []; |
---|
522 | 0332 <span class="keyword">end</span> |
---|
523 | 0333 <span class="keyword">end</span> |
---|
524 | 0334 <span class="keyword">if</span> isempty(BPMxList) |
---|
525 | 0335 BPMxList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(BPMxFamily, 1); |
---|
526 | 0336 <span class="keyword">end</span> |
---|
527 | 0337 |
---|
528 | 0338 <span class="comment">% Look for BPMy family info</span> |
---|
529 | 0339 <span class="keyword">if</span> length(varargin) >= 1 |
---|
530 | 0340 <span class="keyword">if</span> isstruct(varargin{1}) |
---|
531 | 0341 BPMyFamily = varargin{1}.FamilyName; |
---|
532 | 0342 BPMyList = varargin{1}.DeviceList; |
---|
533 | 0343 varargin(1) = []; |
---|
534 | 0344 <span class="keyword">if</span> ~NumericOutputFlag |
---|
535 | 0345 StructOutputFlag = 1; <span class="comment">% Only change StructOutputFlag if 'Numeric' is not on the input line</span> |
---|
536 | 0346 <span class="keyword">end</span> |
---|
537 | 0347 <span class="keyword">elseif</span> ischar(varargin{1}) |
---|
538 | 0348 BPMyFamily = varargin{1}; |
---|
539 | 0349 varargin(1) = []; |
---|
540 | 0350 <span class="keyword">if</span> length(varargin) >= 1 |
---|
541 | 0351 <span class="keyword">if</span> isnumeric(varargin{1}) |
---|
542 | 0352 BPMyList = varargin{1}; |
---|
543 | 0353 varargin(1) = []; |
---|
544 | 0354 <span class="keyword">end</span> |
---|
545 | 0355 <span class="keyword">end</span> |
---|
546 | 0356 <span class="keyword">elseif</span> isnumeric(varargin{1}) |
---|
547 | 0357 BPMyList = varargin{1}; |
---|
548 | 0358 varargin(1) = []; |
---|
549 | 0359 <span class="keyword">end</span> |
---|
550 | 0360 <span class="keyword">end</span> |
---|
551 | 0361 <span class="keyword">if</span> isempty(BPMyList) |
---|
552 | 0362 BPMyList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(BPMyFamily, 1); |
---|
553 | 0363 <span class="keyword">end</span> |
---|
554 | 0364 |
---|
555 | 0365 <span class="comment">% Look for HCM family info</span> |
---|
556 | 0366 <span class="keyword">if</span> length(varargin) >= 1 |
---|
557 | 0367 <span class="keyword">if</span> isstruct(varargin{1}) |
---|
558 | 0368 HCMFamily = varargin{1}.FamilyName; |
---|
559 | 0369 HCMList = varargin{1}.DeviceList; |
---|
560 | 0370 varargin(1) = []; |
---|
561 | 0371 <span class="keyword">if</span> ~NumericOutputFlag |
---|
562 | 0372 StructOutputFlag = 1; <span class="comment">% Only change StructOutputFlag if 'Numeric' is not on the input line</span> |
---|
563 | 0373 <span class="keyword">end</span> |
---|
564 | 0374 <span class="keyword">elseif</span> ischar(varargin{1}) |
---|
565 | 0375 HCMFamily = varargin{1}; |
---|
566 | 0376 varargin(1) = []; |
---|
567 | 0377 <span class="keyword">if</span> length(varargin) >= 1 |
---|
568 | 0378 <span class="keyword">if</span> isnumeric(varargin{1}) |
---|
569 | 0379 HCMList = varargin{1}; |
---|
570 | 0380 varargin(1) = []; |
---|
571 | 0381 <span class="keyword">end</span> |
---|
572 | 0382 <span class="keyword">end</span> |
---|
573 | 0383 <span class="keyword">elseif</span> isnumeric(varargin{1}) |
---|
574 | 0384 HCMList = varargin{1}; |
---|
575 | 0385 varargin(1) = []; |
---|
576 | 0386 <span class="keyword">end</span> |
---|
577 | 0387 <span class="keyword">end</span> |
---|
578 | 0388 <span class="keyword">if</span> isempty(HCMList) |
---|
579 | 0389 HCMList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(HCMFamily, 1); |
---|
580 | 0390 <span class="keyword">end</span> |
---|
581 | 0391 |
---|
582 | 0392 <span class="comment">% Look for VCM family info</span> |
---|
583 | 0393 <span class="keyword">if</span> length(varargin) >= 1 |
---|
584 | 0394 <span class="keyword">if</span> isstruct(varargin{1}) |
---|
585 | 0395 VCMFamily = varargin{1}.FamilyName; |
---|
586 | 0396 VCMList = varargin{1}.DeviceList; |
---|
587 | 0397 varargin(1) = []; |
---|
588 | 0398 <span class="keyword">if</span> ~NumericOutputFlag |
---|
589 | 0399 StructOutputFlag = 1; <span class="comment">% Only change StructOutputFlag if 'Numeric' is not on the input line</span> |
---|
590 | 0400 <span class="keyword">end</span> |
---|
591 | 0401 <span class="keyword">elseif</span> ischar(varargin{1}) |
---|
592 | 0402 VCMFamily = varargin{1}; |
---|
593 | 0403 varargin(1) = []; |
---|
594 | 0404 <span class="keyword">if</span> length(varargin) >= 1 |
---|
595 | 0405 <span class="keyword">if</span> isnumeric(varargin{1}) |
---|
596 | 0406 VCMList = varargin{1}; |
---|
597 | 0407 varargin(1) = []; |
---|
598 | 0408 <span class="keyword">end</span> |
---|
599 | 0409 <span class="keyword">end</span> |
---|
600 | 0410 <span class="keyword">elseif</span> isnumeric(varargin{1}) |
---|
601 | 0411 VCMList = varargin{1}; |
---|
602 | 0412 varargin(1) = []; |
---|
603 | 0413 <span class="keyword">end</span> |
---|
604 | 0414 <span class="keyword">end</span> |
---|
605 | 0415 <span class="keyword">if</span> isempty(VCMList) |
---|
606 | 0416 VCMList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(VCMFamily, 1); |
---|
607 | 0417 <span class="keyword">end</span> |
---|
608 | 0418 |
---|
609 | 0419 <span class="comment">% Look for HCMKicks</span> |
---|
610 | 0420 <span class="keyword">if</span> length(varargin) >= 1 |
---|
611 | 0421 <span class="keyword">if</span> isempty(varargin{1}) |
---|
612 | 0422 <span class="comment">% Use default</span> |
---|
613 | 0423 varargin(1) = []; |
---|
614 | 0424 <span class="keyword">elseif</span> isnumeric(varargin{1}) |
---|
615 | 0425 HCMKicks = varargin{1}; |
---|
616 | 0426 varargin(1) = []; |
---|
617 | 0427 <span class="keyword">end</span> |
---|
618 | 0428 <span class="keyword">end</span> |
---|
619 | 0429 |
---|
620 | 0430 <span class="comment">% Look for VCMKicks</span> |
---|
621 | 0431 <span class="keyword">if</span> length(varargin) >= 1 |
---|
622 | 0432 <span class="keyword">if</span> isempty(varargin{1}) |
---|
623 | 0433 <span class="comment">% Use default</span> |
---|
624 | 0434 varargin(1) = []; |
---|
625 | 0435 <span class="keyword">elseif</span> isnumeric(varargin{1}) |
---|
626 | 0436 VCMKicks = varargin{1}; |
---|
627 | 0437 varargin(1) = []; |
---|
628 | 0438 <span class="keyword">end</span> |
---|
629 | 0439 <span class="keyword">end</span> |
---|
630 | 0440 |
---|
631 | 0441 <span class="comment">% ModulationMethod has already been searched for</span> |
---|
632 | 0442 <span class="comment">% % Look for ModulationMethod</span> |
---|
633 | 0443 <span class="comment">% if length(varargin) >= 1</span> |
---|
634 | 0444 <span class="comment">% if isempty(varargin{1})</span> |
---|
635 | 0445 <span class="comment">% % Use default</span> |
---|
636 | 0446 <span class="comment">% varargin(1) = [];</span> |
---|
637 | 0447 <span class="comment">% end</span> |
---|
638 | 0448 <span class="comment">% if ischar(varargin{1})</span> |
---|
639 | 0449 <span class="comment">% ModulationMethod = varargin{1};</span> |
---|
640 | 0450 <span class="comment">% varargin(1) = [];</span> |
---|
641 | 0451 <span class="comment">% end</span> |
---|
642 | 0452 <span class="comment">% end</span> |
---|
643 | 0453 <span class="keyword">if</span> ~strcmpi(ModulationMethod, <span class="string">'unipolar'</span>) && ~strcmpi(ModulationMethod, <span class="string">'bipolar'</span>) |
---|
644 | 0454 error(<span class="string">'ModulationMethod must be ''unipolar'' or ''bipolar'''</span>); |
---|
645 | 0455 <span class="keyword">end</span> |
---|
646 | 0456 |
---|
647 | 0457 |
---|
648 | 0458 <span class="comment">% Look for WaitFlag</span> |
---|
649 | 0459 <span class="keyword">if</span> length(varargin) >= 1 |
---|
650 | 0460 <span class="keyword">if</span> isempty(varargin{1}) |
---|
651 | 0461 <span class="comment">% Use default</span> |
---|
652 | 0462 varargin(1) = []; |
---|
653 | 0463 <span class="keyword">end</span> |
---|
654 | 0464 <span class="keyword">if</span> isnumeric(varargin{1}) |
---|
655 | 0465 WaitFlag = varargin{1}; |
---|
656 | 0466 varargin(1) = []; |
---|
657 | 0467 <span class="keyword">end</span> |
---|
658 | 0468 <span class="keyword">end</span> |
---|
659 | 0469 |
---|
660 | 0470 <span class="comment">% FileName and DirectoryName</span> |
---|
661 | 0471 <span class="keyword">if</span> length(varargin) >= 1 |
---|
662 | 0472 <span class="keyword">if</span> isempty(varargin{1}) |
---|
663 | 0473 <span class="comment">% Use default</span> |
---|
664 | 0474 FileName = <span class="string">''</span>; |
---|
665 | 0475 varargin(1) = []; |
---|
666 | 0476 <span class="keyword">end</span> |
---|
667 | 0477 <span class="keyword">if</span> ischar(varargin{1}) |
---|
668 | 0478 FileName = varargin{1}; |
---|
669 | 0479 varargin(1) = []; |
---|
670 | 0480 <span class="keyword">end</span> |
---|
671 | 0481 <span class="keyword">end</span> |
---|
672 | 0482 <span class="keyword">if</span> length(varargin) >= 1 |
---|
673 | 0483 <span class="keyword">if</span> isempty(varargin{1}) |
---|
674 | 0484 <span class="comment">% Use default</span> |
---|
675 | 0485 DirectoryName = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Directory'</span>, <span class="string">'BPMResponse'</span>); |
---|
676 | 0486 FileName = [DirectoryName, FileName]; |
---|
677 | 0487 varargin(1) = []; |
---|
678 | 0488 <span class="keyword">elseif</span> ischar(varargin{1}) |
---|
679 | 0489 DirectoryName = varargin{1}; |
---|
680 | 0490 <span class="keyword">if</span> strcmp(DirectoryName, filesep) |
---|
681 | 0491 FileName = [DirectoryName, FileName]; |
---|
682 | 0492 <span class="keyword">else</span> |
---|
683 | 0493 FileName = [DirectoryName, filesep, FileName]; |
---|
684 | 0494 <span class="keyword">end</span> |
---|
685 | 0495 varargin(1) = []; |
---|
686 | 0496 <span class="keyword">end</span> |
---|
687 | 0497 <span class="keyword">end</span> |
---|
688 | 0498 |
---|
689 | 0499 <span class="comment">% Look for ExtraDelay</span> |
---|
690 | 0500 <span class="keyword">if</span> length(varargin) >= 1 |
---|
691 | 0501 <span class="keyword">if</span> isempty(varargin{1}) |
---|
692 | 0502 <span class="comment">% Use default</span> |
---|
693 | 0503 varargin(1) = []; |
---|
694 | 0504 <span class="keyword">end</span> |
---|
695 | 0505 <span class="keyword">if</span> isnumeric(varargin{1}) |
---|
696 | 0506 ExtraDelay = varargin{1}; |
---|
697 | 0507 varargin(1) = []; |
---|
698 | 0508 <span class="keyword">end</span> |
---|
699 | 0509 <span class="keyword">end</span> |
---|
700 | 0510 |
---|
701 | 0511 <span class="comment">% Check units</span> |
---|
702 | 0512 <span class="keyword">if</span> isempty(UnitsFlag) |
---|
703 | 0513 <span class="keyword">if</span> strcmpi(<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(BPMxFamily,<span class="string">'Monitor'</span>,<span class="string">'Units'</span>), <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(BPMyFamily,<span class="string">'Monitor'</span>,<span class="string">'Units'</span>)) |
---|
704 | 0514 UnitsFlag = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(BPMxFamily,<span class="string">'Monitor'</span>,<span class="string">'Units'</span>); |
---|
705 | 0515 <span class="keyword">else</span> |
---|
706 | 0516 error(<span class="string">'Mixed Units for orbits'</span>); |
---|
707 | 0517 <span class="keyword">end</span> |
---|
708 | 0518 <span class="keyword">end</span> |
---|
709 | 0519 <span class="keyword">if</span> isempty(UnitsFlag) |
---|
710 | 0520 error(<span class="string">'Unknown Units'</span>); |
---|
711 | 0521 <span class="keyword">end</span> |
---|
712 | 0522 |
---|
713 | 0523 <span class="comment">% Check mode</span> |
---|
714 | 0524 <span class="keyword">if</span> isempty(ModeFlag) |
---|
715 | 0525 <span class="keyword">if</span> strcmpi(<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(BPMxFamily,<span class="string">'Monitor'</span>,<span class="string">'Mode'</span>), <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(BPMyFamily,<span class="string">'Monitor'</span>,<span class="string">'Mode'</span>)) |
---|
716 | 0526 <span class="comment">%ModeFlag = getfamilydata(BPMxFamily,'Monitor','Mode');</span> |
---|
717 | 0527 <span class="keyword">else</span> |
---|
718 | 0528 error(<span class="string">'Mixed Mode for orbits'</span>); |
---|
719 | 0529 <span class="keyword">end</span> |
---|
720 | 0530 <span class="keyword">if</span> strcmpi(<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(HCMFamily,<span class="string">'Monitor'</span>,<span class="string">'Mode'</span>), <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(VCMFamily,<span class="string">'Monitor'</span>,<span class="string">'Mode'</span>)) |
---|
721 | 0531 ModeFlag = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(HCMFamily,<span class="string">'Monitor'</span>,<span class="string">'Mode'</span>); |
---|
722 | 0532 <span class="keyword">else</span> |
---|
723 | 0533 error(<span class="string">'Mixed Mode for correctors'</span>); |
---|
724 | 0534 <span class="keyword">end</span> |
---|
725 | 0535 <span class="keyword">end</span> |
---|
726 | 0536 <span class="keyword">if</span> isempty(ModeFlag) |
---|
727 | 0537 error(<span class="string">'Unknown Mode'</span>); |
---|
728 | 0538 <span class="keyword">end</span> |
---|
729 | 0539 <span class="comment">% Input parsing complete</span> |
---|
730 | 0540 |
---|
731 | 0541 |
---|
732 | 0542 <span class="comment">% Starting time</span> |
---|
733 | 0543 TimeStart = gettime; |
---|
734 | 0544 |
---|
735 | 0545 |
---|
736 | 0546 <span class="comment">% Change defaults for the model (note: simulator mode mimics online)</span> |
---|
737 | 0547 <span class="keyword">if</span> strcmpi(ModeFlag,<span class="string">'Model'</span>) |
---|
738 | 0548 <span class="comment">% Only archive data if ArchiveFlag==1 or FileName~=[]</span> |
---|
739 | 0549 <span class="keyword">if</span> ischar(FileName) || ArchiveFlag == 1 |
---|
740 | 0550 ArchiveFlag = 1; |
---|
741 | 0551 <span class="keyword">else</span> |
---|
742 | 0552 ArchiveFlag = 0; |
---|
743 | 0553 <span class="keyword">end</span> |
---|
744 | 0554 |
---|
745 | 0555 <span class="comment">% Only display is it was turned on at the command line</span> |
---|
746 | 0556 <span class="keyword">if</span> DisplayFlag == 1 |
---|
747 | 0557 <span class="comment">% Keep DisplayFlag = 1</span> |
---|
748 | 0558 <span class="keyword">else</span> |
---|
749 | 0559 DisplayFlag = 0; |
---|
750 | 0560 <span class="keyword">end</span> |
---|
751 | 0561 <span class="keyword">else</span> |
---|
752 | 0562 <span class="comment">% Online or Simulator: Archive unless ArchiveFlag was forced to zero</span> |
---|
753 | 0563 <span class="keyword">if</span> ArchiveFlag ~= 0 |
---|
754 | 0564 ArchiveFlag = 1; |
---|
755 | 0565 <span class="keyword">if</span> FileName == -1 |
---|
756 | 0566 FileName = <span class="string">''</span>; |
---|
757 | 0567 <span class="keyword">end</span> |
---|
758 | 0568 <span class="keyword">end</span> |
---|
759 | 0569 <span class="keyword">end</span> |
---|
760 | 0570 |
---|
761 | 0571 <span class="comment">% % Print setup information</span> |
---|
762 | 0572 <span class="comment">% if DisplayFlag</span> |
---|
763 | 0573 <span class="comment">% if ~strcmpi(ModeFlag,'Model')</span> |
---|
764 | 0574 <span class="comment">% fprintf('\n');</span> |
---|
765 | 0575 <span class="comment">% fprintf(' MEASBPMRESP measures the BPM response matrix for both HCM & VCM corrector families.\n');</span> |
---|
766 | 0576 <span class="comment">% fprintf(' The storage ring lattice and hardware should be setup for accurate orbit measurements.\n');</span> |
---|
767 | 0577 <span class="comment">% fprintf(' Make sure the following information is correct:\n');</span> |
---|
768 | 0578 <span class="comment">% fprintf(' 1. Proper magnet lattice\n');</span> |
---|
769 | 0579 <span class="comment">% fprintf(' 2. Proper electron beam energy\n');</span> |
---|
770 | 0580 <span class="comment">% fprintf(' 3. Proper electron bunch pattern\n');</span> |
---|
771 | 0581 <span class="comment">% fprintf(' 4. BPMs are functioning properly (calibrated, sample rate, etc.)\n');</span> |
---|
772 | 0582 <span class="comment">% fprintf(' 5. Corrector magnets are working\n');</span> |
---|
773 | 0583 <span class="comment">% fprintf(' 6. The injection bump magnets off\n');</span> |
---|
774 | 0584 <span class="comment">% fprintf(' 7. Corrector Settle Time WaitFlag=%f, Extra BPM Delay=%f\n', WaitFlag, ExtraDelay);</span> |
---|
775 | 0585 <span class="comment">% fprintf(' 9. Modulation Method: %s\n', ModulationMethod);</span> |
---|
776 | 0586 <span class="comment">% end</span> |
---|
777 | 0587 <span class="comment">% end</span> |
---|
778 | 0588 |
---|
779 | 0589 |
---|
780 | 0590 <span class="keyword">if</span> ArchiveFlag |
---|
781 | 0591 <span class="keyword">if</span> isempty(FileName) |
---|
782 | 0592 FileName = appendtimestamp(<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Default'</span>, <span class="string">'BPMRespFile'</span>)); |
---|
783 | 0593 DirectoryName = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Directory'</span>, <span class="string">'BPMResponse'</span>); |
---|
784 | 0594 <span class="keyword">if</span> isempty(DirectoryName) |
---|
785 | 0595 DirectoryName = [<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Directory'</span>,<span class="string">'DataRoot'</span>), <span class="string">'Response'</span>, filesep, <span class="string">'BPM'</span>, filesep]; |
---|
786 | 0596 <span class="keyword">else</span> |
---|
787 | 0597 <span class="comment">% Make sure default directory exists</span> |
---|
788 | 0598 DirStart = pwd; |
---|
789 | 0599 [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName); |
---|
790 | 0600 cd(DirStart); |
---|
791 | 0601 <span class="keyword">end</span> |
---|
792 | 0602 [FileName, DirectoryName] = uiputfile(<span class="string">'*.mat'</span>, <span class="string">'Select a BPM Response File ("Save" starts measurement)'</span>, [DirectoryName FileName]); |
---|
793 | 0603 drawnow; |
---|
794 | 0604 <span class="keyword">if</span> FileName == 0 |
---|
795 | 0605 ArchiveFlag = 0; |
---|
796 | 0606 disp(<span class="string">' BPM response measurement canceled.'</span>); |
---|
797 | 0607 Rmat = []; OutputFileName=<span class="string">''</span>; |
---|
798 | 0608 <span class="keyword">return</span> |
---|
799 | 0609 <span class="keyword">end</span> |
---|
800 | 0610 FileName = [DirectoryName, FileName]; |
---|
801 | 0611 <span class="keyword">elseif</span> FileName == -1 |
---|
802 | 0612 FileName = appendtimestamp(<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Default'</span>, <span class="string">'BPMRespFile'</span>)); |
---|
803 | 0613 DirectoryName = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Directory'</span>, <span class="string">'BPMResponse'</span>); |
---|
804 | 0614 <span class="keyword">if</span> isempty(DirectoryName) |
---|
805 | 0615 DirectoryName = [<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'Directory'</span>,<span class="string">'DataRoot'</span>), <span class="string">'Response'</span>, filesep, <span class="string">'BPM'</span>, filesep]; |
---|
806 | 0616 <span class="keyword">end</span> |
---|
807 | 0617 FileName = [DirectoryName, FileName]; |
---|
808 | 0618 <span class="keyword">end</span> |
---|
809 | 0619 |
---|
810 | 0620 <span class="comment">% Acquire initial data</span> |
---|
811 | 0621 MachineConfig = <a href="getmachineconfig.html" class="code" title="function [ConfigSetpoint, ConfigMonitor, FileName] = getmachineconfig(varargin)">getmachineconfig</a>(InputFlags{:}); |
---|
812 | 0622 <span class="keyword">end</span> |
---|
813 | 0623 |
---|
814 | 0624 |
---|
815 | 0625 <span class="comment">% Get the response matrices</span> |
---|
816 | 0626 <span class="keyword">if</span> strcmpi(ModeFlag,<span class="string">'Model'</span>) |
---|
817 | 0627 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span> |
---|
818 | 0628 <span class="comment">% Model Response Matrix - Use LOCO Method %</span> |
---|
819 | 0629 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span> |
---|
820 | 0630 |
---|
821 | 0631 <span class="comment">% Just to make sure the proper AT model is the currrent model, do a get on one of the correctors</span> |
---|
822 | 0632 <span class="comment">% (This is needed because locoresponsematrix does not check the .AT.ATModel field)</span> |
---|
823 | 0633 <span class="keyword">if</span> <a href="isfamily.html" class="code" title="function [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(HCMFamily) |
---|
824 | 0634 tmp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(HCMFamily, HCMList); |
---|
825 | 0635 <span class="keyword">end</span> |
---|
826 | 0636 |
---|
827 | 0637 |
---|
828 | 0638 <span class="comment">% % Mask bpms and correctors for status</span> |
---|
829 | 0639 <span class="comment">% BPMxStatus = getfamilydata(BPMxFamily,'Status', BPMxList);</span> |
---|
830 | 0640 <span class="comment">% BPMxGoodIndex = find(BPMxStatus);</span> |
---|
831 | 0641 <span class="comment">% BPMxList = BPMxList(BPMxGoodIndex,:);</span> |
---|
832 | 0642 <span class="comment">%</span> |
---|
833 | 0643 <span class="comment">% BPMyStatus = getfamilydata(BPMyFamily,'Status', BPMyList);</span> |
---|
834 | 0644 <span class="comment">% BPMyGoodIndex = find(BPMyStatus);</span> |
---|
835 | 0645 <span class="comment">% BPMyList = BPMyList(BPMyGoodIndex,:);</span> |
---|
836 | 0646 <span class="comment">%</span> |
---|
837 | 0647 <span class="comment">% HCMStatus = getfamilydata(HCMFamily,'Status', HCMList);</span> |
---|
838 | 0648 <span class="comment">% HCMGoodIndex = find(HCMStatus);</span> |
---|
839 | 0649 <span class="comment">% HCMList = HCMList(HCMGoodIndex,:);</span> |
---|
840 | 0650 <span class="comment">% HCMKicks = HCMKicks(HCMGoodIndex);</span> |
---|
841 | 0651 <span class="comment">%</span> |
---|
842 | 0652 <span class="comment">% VCMStatus = getfamilydata(VCMFamily,'Status', VCMList);</span> |
---|
843 | 0653 <span class="comment">% VCMGoodIndex = find(VCMStatus);</span> |
---|
844 | 0654 <span class="comment">% VCMList = VCMList(VCMGoodIndex,:);</span> |
---|
845 | 0655 <span class="comment">% VCMKicks = VCMKicks(VCMGoodIndex);</span> |
---|
846 | 0656 |
---|
847 | 0657 <span class="comment">% Use AT (LOCO method)</span> |
---|
848 | 0658 |
---|
849 | 0659 <span class="comment">% 1. AT MODEL</span> |
---|
850 | 0660 <span class="keyword">global</span> THERING |
---|
851 | 0661 <span class="comment">%setcavity off;</span> |
---|
852 | 0662 RINGData.Lattice = THERING; |
---|
853 | 0663 iCavity = findcells(THERING, <span class="string">'Frequency'</span>); |
---|
854 | 0664 <span class="keyword">if</span> isempty(iCavity) |
---|
855 | 0665 <span class="keyword">if</span> <a href="isstoragering.html" class="code" title="function Test = isstoragering">isstoragering</a> |
---|
856 | 0666 RINGData.CavityFrequency = <a href="getrf.html" class="code" title="function [RFsp, RFam, DataTime, ErrorFlag] = getrf(varargin)">getrf</a>(<span class="string">'Model'</span>, <span class="string">'Physics'</span>); |
---|
857 | 0667 RINGData.CavityHarmNumber = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'HarmonicNumber'</span>); |
---|
858 | 0668 <span class="keyword">else</span> |
---|
859 | 0669 RINGData.CavityFrequency = []; |
---|
860 | 0670 RINGData.CavityHarmNumber = []; |
---|
861 | 0671 <span class="keyword">end</span> |
---|
862 | 0672 <span class="keyword">else</span> |
---|
863 | 0673 RINGData.CavityFrequency = THERING{iCavity(1)}.Frequency; |
---|
864 | 0674 RINGData.CavityHarmNumber = THERING{iCavity(1)}.HarmNumber; |
---|
865 | 0675 <span class="keyword">end</span> |
---|
866 | 0676 |
---|
867 | 0677 |
---|
868 | 0678 <span class="comment">% 2. BPM STRUCTURE</span> |
---|
869 | 0679 <span class="comment">% FamName and BPMIndex tells the findorbitrespm function which BPMs are needed in the response matrix</span> |
---|
870 | 0680 <span class="comment">% HBPMIndex/VBPMIndex is the sub-index of BPMIndex which correspond to the measured response matrix</span> |
---|
871 | 0681 <span class="keyword">if</span> strcmpi(BPMxFamily,<span class="string">'All'</span>) |
---|
872 | 0682 BPMxATIndex = 1:length(THERING); |
---|
873 | 0683 <span class="keyword">elseif</span> <a href="isfamily.html" class="code" title="function [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(BPMxFamily) |
---|
874 | 0684 BPMxATIndex = family2atindex(BPMxFamily, BPMxList); |
---|
875 | 0685 <span class="keyword">else</span> |
---|
876 | 0686 BPMxATIndex = findcells(THERING, <span class="string">'FamName'</span>, BPMxFamily); |
---|
877 | 0687 <span class="keyword">end</span> |
---|
878 | 0688 <span class="keyword">if</span> isempty(BPMxATIndex) |
---|
879 | 0689 error(sprintf(<span class="string">'BPMxFamily=%s could not be found in the AO or AT deck'</span>, BPMxFamily)); |
---|
880 | 0690 <span class="keyword">else</span> |
---|
881 | 0691 BPMxATIndex = BPMxATIndex(:)'; <span class="comment">% Row vector</span> |
---|
882 | 0692 <span class="keyword">end</span> |
---|
883 | 0693 |
---|
884 | 0694 <span class="keyword">if</span> strcmpi(BPMyFamily,<span class="string">'All'</span>) |
---|
885 | 0695 BPMyATIndex = 1:length(THERING); |
---|
886 | 0696 <span class="keyword">elseif</span> <a href="isfamily.html" class="code" title="function [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(BPMyFamily) |
---|
887 | 0697 BPMyATIndex = family2atindex(BPMyFamily, BPMyList); |
---|
888 | 0698 <span class="keyword">else</span> |
---|
889 | 0699 BPMyATIndex = findcells(THERING, <span class="string">'FamName'</span>, BPMyFamily); |
---|
890 | 0700 <span class="keyword">end</span> |
---|
891 | 0701 <span class="keyword">if</span> isempty(BPMyATIndex) |
---|
892 | 0702 error(sprintf(<span class="string">'BPMyFamily=%s could not be found in the AO or AT deck'</span>, BPMyFamily)); |
---|
893 | 0703 <span class="keyword">else</span> |
---|
894 | 0704 BPMyATIndex = BPMyATIndex(:)'; <span class="comment">% Row vector</span> |
---|
895 | 0705 <span class="keyword">end</span> |
---|
896 | 0706 |
---|
897 | 0707 BPMData.BPMIndex = unique([BPMxATIndex BPMyATIndex]); |
---|
898 | 0708 BPMData.HBPMIndex = findrowindex(BPMxATIndex', BPMData.BPMIndex'); <span class="comment">% Only used after locoresponsematrix is called</span> |
---|
899 | 0709 BPMData.VBPMIndex = findrowindex(BPMyATIndex', BPMData.BPMIndex'); <span class="comment">% Only used after locoresponsematrix is called</span> |
---|
900 | 0710 |
---|
901 | 0711 |
---|
902 | 0712 <span class="comment">% 3. CORRECTOR MAGNET STRUCTURE</span> |
---|
903 | 0713 <span class="comment">% FamName and HCMIndex/VCMIndex tells the findorbitrespm function which corrector magnets are in the response matrix</span> |
---|
904 | 0714 <span class="comment">% CMData.HCMKicks = starting value for the horizontal kicks in milliradian</span> |
---|
905 | 0715 <span class="comment">% CMData.VCMKicks = starting value for the vertical kicks in milliradian</span> |
---|
906 | 0716 <span class="comment">% CMData.HCMCoupling = starting value for the horizontal coupling (default: zeros)</span> |
---|
907 | 0717 <span class="comment">% CMData.VCMCoupling = starting value for the vertical coupling (default: zeros)</span> |
---|
908 | 0718 <span class="comment">% Note: The kick strength should match the measured response matrix as best as possible</span> |
---|
909 | 0719 <span class="comment">% Note: The kicks and Coupling are used all the time (fit or not!)</span> |
---|
910 | 0720 |
---|
911 | 0721 <span class="comment">% Note the different units between AT and LOCO</span> |
---|
912 | 0722 <span class="keyword">if</span> strcmpi(HCMFamily,<span class="string">'All'</span>) |
---|
913 | 0723 ATIndex = 1:length(THERING); |
---|
914 | 0724 <span class="keyword">elseif</span> <a href="isfamily.html" class="code" title="function [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(HCMFamily) |
---|
915 | 0725 ATIndex = family2atindex(HCMFamily, HCMList); |
---|
916 | 0726 <span class="keyword">else</span> |
---|
917 | 0727 ATIndex = findcells(THERING, <span class="string">'FamName'</span>, HCMFamily); |
---|
918 | 0728 <span class="keyword">end</span> |
---|
919 | 0729 <span class="keyword">if</span> isempty(ATIndex) |
---|
920 | 0730 error(sprintf(<span class="string">'HCMFamily=%s could not be found in the middle layer or AT model'</span>, HCMFamily)); |
---|
921 | 0731 <span class="keyword">else</span> |
---|
922 | 0732 ATIndex = ATIndex(:)'; <span class="comment">% Row vector</span> |
---|
923 | 0733 <span class="keyword">end</span> |
---|
924 | 0734 CMData.HCMIndex = ATIndex; |
---|
925 | 0735 |
---|
926 | 0736 <span class="keyword">if</span> strcmpi(VCMFamily,<span class="string">'All'</span>) |
---|
927 | 0737 ATIndex = 1:length(THERING); |
---|
928 | 0738 <span class="keyword">elseif</span> <a href="isfamily.html" class="code" title="function [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(VCMFamily) |
---|
929 | 0739 ATIndex = family2atindex(VCMFamily, VCMList); |
---|
930 | 0740 <span class="keyword">else</span> |
---|
931 | 0741 ATIndex = findcells(THERING, <span class="string">'FamName'</span>, VCMFamily); |
---|
932 | 0742 <span class="keyword">end</span> |
---|
933 | 0743 <span class="keyword">if</span> isempty(ATIndex) |
---|
934 | 0744 error(sprintf(<span class="string">'VCMFamily=%s could not be found in the middle layer or AT model'</span>, VCMFamily)); |
---|
935 | 0745 <span class="keyword">else</span> |
---|
936 | 0746 ATIndex = ATIndex(:)'; <span class="comment">% Row vector</span> |
---|
937 | 0747 <span class="keyword">end</span> |
---|
938 | 0748 CMData.VCMIndex = ATIndex; |
---|
939 | 0749 |
---|
940 | 0750 <span class="comment">% Kicks must be in Physics units</span> |
---|
941 | 0751 |
---|
942 | 0752 <span class="comment">% Default kicks</span> |
---|
943 | 0753 <span class="keyword">if</span> <a href="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(HCMFamily,<span class="string">'COR'</span>) |
---|
944 | 0754 <span class="keyword">if</span> isempty(HCMKicks) |
---|
945 | 0755 HCMKicks = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(HCMFamily, <span class="string">'Setpoint'</span>, <span class="string">'DeltaRespMat'</span>, HCMList); |
---|
946 | 0756 <span class="keyword">if</span> isempty(HCMKicks) |
---|
947 | 0757 CMData.HCMKicks = Default2HCMKick; |
---|
948 | 0758 <span class="keyword">else</span> |
---|
949 | 0759 <span class="comment">%if strcmpi(getfamilydata(HCMFamily, 'Setpoint', 'Units'), 'Hardware')</span> |
---|
950 | 0760 HCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(HCMFamily, HCMList, <span class="string">'Numeric'</span>, ModeFlag, <span class="string">'Hardware'</span>); |
---|
951 | 0761 CMData.HCMKicks = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(HCMFamily, <span class="string">'Setpoint'</span>, HCMsp+HCMKicks, HCMList) - <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(HCMFamily, <span class="string">'Setpoint'</span>, HCMsp, HCMList); |
---|
952 | 0762 <span class="comment">%else</span> |
---|
953 | 0763 <span class="comment">% CMData.HCMKicks = HCMKicks;</span> |
---|
954 | 0764 <span class="comment">%end</span> |
---|
955 | 0765 <span class="keyword">end</span> |
---|
956 | 0766 <span class="keyword">else</span> |
---|
957 | 0767 <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) |
---|
958 | 0768 <span class="comment">% Change to AT units [radian]</span> |
---|
959 | 0769 HCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(HCMFamily, HCMList, <span class="string">'Numeric'</span>, ModeFlag, <span class="string">'Hardware'</span>); |
---|
960 | 0770 CMData.HCMKicks = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(HCMFamily, <span class="string">'Setpoint'</span>, HCMsp+HCMKicks, HCMList) - <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(HCMFamily, <span class="string">'Setpoint'</span>, HCMsp, HCMList); |
---|
961 | 0771 <span class="keyword">else</span> |
---|
962 | 0772 CMData.HCMKicks = HCMKicks; |
---|
963 | 0773 <span class="keyword">end</span> |
---|
964 | 0774 <span class="keyword">end</span> |
---|
965 | 0775 <span class="keyword">else</span> |
---|
966 | 0776 <span class="comment">% Not a corrector magnet location</span> |
---|
967 | 0777 <span class="keyword">if</span> isempty(HCMKicks) |
---|
968 | 0778 CMData.HCMKicks = Default2HCMKick; |
---|
969 | 0779 <span class="keyword">else</span> |
---|
970 | 0780 <span class="comment">% The kick must be in physics units</span> |
---|
971 | 0781 <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) |
---|
972 | 0782 fprintf(<span class="string">'\n You are using a non-corrector magnet actuator type and using hardware units.\n'</span>); |
---|
973 | 0783 fprintf(<span class="string">' Unknown conversion method from hardware to physics.\n\n'</span>); |
---|
974 | 0784 fprintf(<span class="string">' Change to a physics units input scheme.\n'</span>); |
---|
975 | 0785 error(<span class="string">'Hardware to physics conversion error'</span>); |
---|
976 | 0786 <span class="keyword">else</span> |
---|
977 | 0787 CMData.HCMKicks = HCMKicks; |
---|
978 | 0788 <span class="keyword">end</span> |
---|
979 | 0789 <span class="keyword">end</span> |
---|
980 | 0790 <span class="keyword">end</span> |
---|
981 | 0791 |
---|
982 | 0792 <span class="keyword">if</span> <a href="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(VCMFamily,<span class="string">'COR'</span>) |
---|
983 | 0793 <span class="keyword">if</span> isempty(VCMKicks) |
---|
984 | 0794 VCMKicks = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(VCMFamily, <span class="string">'Setpoint'</span>, <span class="string">'DeltaRespMat'</span>, VCMList); |
---|
985 | 0795 <span class="keyword">if</span> isempty(VCMKicks) |
---|
986 | 0796 CMData.VCMKicks = Default2VCMKick; |
---|
987 | 0797 <span class="keyword">else</span> |
---|
988 | 0798 <span class="comment">%if strcmpi(getfamilydata(VCMFamily, 'Setpoint', 'Units'), 'Hardware')</span> |
---|
989 | 0799 VCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(VCMFamily, VCMList, <span class="string">'Numeric'</span>, ModeFlag, <span class="string">'Hardware'</span>); |
---|
990 | 0800 CMData.VCMKicks = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(VCMFamily, <span class="string">'Setpoint'</span>, VCMsp+VCMKicks, VCMList) - <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(VCMFamily, <span class="string">'Setpoint'</span>, VCMsp, VCMList); |
---|
991 | 0801 <span class="comment">%else</span> |
---|
992 | 0802 <span class="comment">% CMData.VCMKicks = VCMKicks;</span> |
---|
993 | 0803 <span class="comment">%end</span> |
---|
994 | 0804 <span class="keyword">end</span> |
---|
995 | 0805 <span class="keyword">else</span> |
---|
996 | 0806 <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) |
---|
997 | 0807 <span class="comment">% Change to AT units [radian]</span> |
---|
998 | 0808 VCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(VCMFamily, VCMList, <span class="string">'Numeric'</span>, ModeFlag, <span class="string">'Hardware'</span>); |
---|
999 | 0809 CMData.VCMKicks = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(VCMFamily, <span class="string">'Setpoint'</span>, VCMsp+VCMKicks, VCMList) - <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(VCMFamily, <span class="string">'Setpoint'</span>, VCMsp, VCMList); |
---|
1000 | 0810 <span class="keyword">else</span> |
---|
1001 | 0811 CMData.VCMKicks = VCMKicks; |
---|
1002 | 0812 <span class="keyword">end</span> |
---|
1003 | 0813 <span class="keyword">end</span> |
---|
1004 | 0814 <span class="keyword">else</span> |
---|
1005 | 0815 <span class="comment">% Not a corrector magnet location</span> |
---|
1006 | 0816 <span class="keyword">if</span> isempty(VCMKicks) |
---|
1007 | 0817 CMData.VCMKicks = Default2VCMKick; |
---|
1008 | 0818 <span class="keyword">else</span> |
---|
1009 | 0819 <span class="comment">% The kick must be in physics units</span> |
---|
1010 | 0820 <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) |
---|
1011 | 0821 fprintf(<span class="string">'\n You are using a non-corrector magnet actuator type and using hardware units.\n'</span>); |
---|
1012 | 0822 fprintf(<span class="string">' Unknown conversion method from hardware to physics!\n\n'</span>); |
---|
1013 | 0823 fprintf(<span class="string">' Change to a physics units input scheme.\n'</span>); |
---|
1014 | 0824 error(<span class="string">'Hardware to physics conversion error'</span>); |
---|
1015 | 0825 <span class="keyword">else</span> |
---|
1016 | 0826 CMData.VCMKicks = VCMKicks; |
---|
1017 | 0827 <span class="keyword">end</span> |
---|
1018 | 0828 <span class="keyword">end</span> |
---|
1019 | 0829 <span class="keyword">end</span> |
---|
1020 | 0830 |
---|
1021 | 0831 CMData.HCMKicks = CMData.HCMKicks(:); |
---|
1022 | 0832 <span class="keyword">if</span> length(CMData.HCMKicks) == 1 |
---|
1023 | 0833 CMData.HCMKicks = CMData.HCMKicks * ones(length(CMData.HCMIndex),1); |
---|
1024 | 0834 <span class="keyword">end</span> |
---|
1025 | 0835 CMData.VCMKicks = CMData.VCMKicks(:); |
---|
1026 | 0836 <span class="keyword">if</span> length(CMData.VCMKicks) == 1 |
---|
1027 | 0837 CMData.VCMKicks = CMData.VCMKicks * ones(length(CMData.VCMIndex),1); |
---|
1028 | 0838 <span class="keyword">end</span> |
---|
1029 | 0839 |
---|
1030 | 0840 <span class="comment">% Corrector gain error have been taken into account by hw2physics</span> |
---|
1031 | 0841 <span class="comment">% If the model has corrector rolls, adjust the kicks now.</span> |
---|
1032 | 0842 |
---|
1033 | 0843 <span class="keyword">for</span> i = 1:length(CMData.HCMIndex) |
---|
1034 | 0844 <span class="keyword">if</span> isfield(THERING{CMData.HCMIndex(i)}, <span class="string">'Roll'</span>) |
---|
1035 | 0845 Roll = THERING{CMData.HCMIndex(i)}.Roll; |
---|
1036 | 0846 <span class="keyword">else</span> |
---|
1037 | 0847 Roll = [0 0]; <span class="comment">% [Rollx Rolly]</span> |
---|
1038 | 0848 <span class="keyword">end</span> |
---|
1039 | 0849 HCMRoll(i,1) = Roll(1); |
---|
1040 | 0850 <span class="keyword">end</span> |
---|
1041 | 0851 <span class="comment">%HCMRoll = getroll(HCMFamily, HCMList);</span> |
---|
1042 | 0852 |
---|
1043 | 0853 <span class="keyword">for</span> i = 1:length(CMData.VCMIndex) |
---|
1044 | 0854 <span class="keyword">if</span> isfield(THERING{CMData.VCMIndex(i)}, <span class="string">'Roll'</span>) |
---|
1045 | 0855 Roll = THERING{CMData.VCMIndex(i)}.Roll; |
---|
1046 | 0856 <span class="keyword">else</span> |
---|
1047 | 0857 Roll = [0 0]; <span class="comment">% [Rollx Rolly]</span> |
---|
1048 | 0858 <span class="keyword">end</span> |
---|
1049 | 0859 VCMRoll(i,1) = Roll(2); |
---|
1050 | 0860 <span class="keyword">end</span> |
---|
1051 | 0861 <span class="comment">%VCMRoll = getroll(VCMFamily, VCMList);</span> |
---|
1052 | 0862 |
---|
1053 | 0863 <span class="comment">% The kicks need to be adjusted for roll (model coordinates)</span> |
---|
1054 | 0864 HCMKicks = CMData.HCMKicks; |
---|
1055 | 0865 VCMKicks = CMData.VCMKicks; |
---|
1056 | 0866 CMData.HCMKicks = CMData.HCMKicks .* cos(HCMRoll); |
---|
1057 | 0867 CMData.VCMKicks = CMData.VCMKicks .* cos(VCMRoll); |
---|
1058 | 0868 |
---|
1059 | 0869 |
---|
1060 | 0870 <span class="comment">% Coupling term (convert from ML to LOCO coordinates)</span> |
---|
1061 | 0871 <span class="comment">% The ./cos term is needed because LOCO coupling is scaling the unrolled kick</span> |
---|
1062 | 0872 CMData.HCMCoupling = sin(HCMRoll) ./ cos(HCMRoll); |
---|
1063 | 0873 CMData.VCMCoupling = -sin(VCMRoll) ./ cos(VCMRoll); |
---|
1064 | 0874 |
---|
1065 | 0875 |
---|
1066 | 0876 <span class="comment">% Generate a response matrix ('FixedPathLength' or 'FixedMomentum', 'Linear' or 'Full')</span> |
---|
1067 | 0877 <span class="comment">% Flags is empty then the locoresponsematrix defaults are used (which was fix path length, linear the last time I checked)</span> |
---|
1068 | 0878 R0 = locoresponsematrix(RINGData, BPMData, CMData, LOCORespFlags); |
---|
1069 | 0879 |
---|
1070 | 0880 |
---|
1071 | 0881 <span class="comment">% Coupling correction</span> |
---|
1072 | 0882 <span class="comment">% Convert the ML gain/rolls to LOCO gain/coupling</span> |
---|
1073 | 0883 <span class="comment">% for i = 1:length(BPMData.BPMIndex)</span> |
---|
1074 | 0884 <span class="comment">% if isfield(THERING{BPMData.BPMIndex(i)}, 'GCR')</span> |
---|
1075 | 0885 <span class="comment">% GCR = THERING{BPMData.BPMIndex(i)}.GCR;</span> |
---|
1076 | 0886 <span class="comment">% else</span> |
---|
1077 | 0887 <span class="comment">% GCR = [1 1 0 0]; % [Gx Gy Crunch Roll]</span> |
---|
1078 | 0888 <span class="comment">% end</span> |
---|
1079 | 0889 <span class="comment">%</span> |
---|
1080 | 0890 <span class="comment">% M = gcr2loco(GCR(1), GCR(2), GCR(3), GCR(4));</span> |
---|
1081 | 0891 <span class="comment">% BPMxGainLOCO(i,1) = M(1,1);</span> |
---|
1082 | 0892 <span class="comment">% BPMxCouplingLOCO(i,1) = M(1,2);</span> |
---|
1083 | 0893 <span class="comment">% BPMyGainLOCO(i,1) = M(2,2);</span> |
---|
1084 | 0894 <span class="comment">% BPMyCouplingLOCO(i,1) = M(2,1);</span> |
---|
1085 | 0895 <span class="comment">% end</span> |
---|
1086 | 0896 <span class="comment">%</span> |
---|
1087 | 0897 <span class="comment">%</span> |
---|
1088 | 0898 <span class="comment">% % Build a rotation matrix</span> |
---|
1089 | 0899 <span class="comment">% C = [diag(BPMxGainLOCO) diag(BPMxCouplingLOCO)</span> |
---|
1090 | 0900 <span class="comment">% diag(BPMyCouplingLOCO) diag(BPMyGainLOCO)];</span> |
---|
1091 | 0901 |
---|
1092 | 0902 |
---|
1093 | 0903 <span class="comment">% BPM coupling correction (only roll, crunch correction, gain is done in physics2hw (via real2raw))</span> |
---|
1094 | 0904 <span class="comment">% Still in physics units, just rotate and crunch.</span> |
---|
1095 | 0905 NBPM = length(BPMData.BPMIndex); |
---|
1096 | 0906 <span class="keyword">for</span> i = 1:NBPM |
---|
1097 | 0907 <span class="keyword">if</span> isfield(THERING{BPMData.BPMIndex(i)}, <span class="string">'GCR'</span>) |
---|
1098 | 0908 GCR = THERING{BPMData.BPMIndex(i)}.GCR; |
---|
1099 | 0909 <span class="keyword">else</span> |
---|
1100 | 0910 GCR = [1 1 0 0]; <span class="comment">% [Gx Gy Crunch Roll]</span> |
---|
1101 | 0911 <span class="keyword">end</span> |
---|
1102 | 0912 <span class="comment">%Gx = GCR(1); % Not used</span> |
---|
1103 | 0913 <span class="comment">%Gy = GCR(2); % Not used</span> |
---|
1104 | 0914 Crunch = GCR(3); |
---|
1105 | 0915 Roll = GCR(4); |
---|
1106 | 0916 |
---|
1107 | 0917 a(i,1) = ( Crunch * sin(Roll) + cos(Roll)) / sqrt(1 - Crunch^2); |
---|
1108 | 0918 b(i,1) = (-Crunch * cos(Roll) + sin(Roll)) / sqrt(1 - Crunch^2); |
---|
1109 | 0919 c(i,1) = (-Crunch * cos(Roll) - sin(Roll)) / sqrt(1 - Crunch^2); |
---|
1110 | 0920 d(i,1) = (-Crunch * sin(Roll) + cos(Roll)) / sqrt(1 - Crunch^2); |
---|
1111 | 0921 |
---|
1112 | 0922 <span class="comment">% Same as:</span> |
---|
1113 | 0923 <span class="comment">%%m = gcr2loco(GCR(1), GCR(2), GCR(3), GCR(4));</span> |
---|
1114 | 0924 <span class="comment">%m = gcr2loco(1, 1, GCR(3), GCR(4));</span> |
---|
1115 | 0925 <span class="comment">%a(i,1)= m(1,1);</span> |
---|
1116 | 0926 <span class="comment">%b(i,1)= m(1,2);</span> |
---|
1117 | 0927 <span class="comment">%c(i,1)= m(2,1);</span> |
---|
1118 | 0928 <span class="comment">%d(i,1)= m(2,2);</span> |
---|
1119 | 0929 <span class="keyword">end</span> |
---|
1120 | 0930 |
---|
1121 | 0931 <span class="comment">% Build a rotation matrix</span> |
---|
1122 | 0932 C = [diag(a) diag(b) |
---|
1123 | 0933 diag(c) diag(d)]; |
---|
1124 | 0934 |
---|
1125 | 0935 <span class="comment">% Rotate & crunch the AT model response matrix</span> |
---|
1126 | 0936 R0 = C * R0; |
---|
1127 | 0937 |
---|
1128 | 0938 |
---|
1129 | 0939 <span class="comment">% Split up R0 into an array</span> |
---|
1130 | 0940 Rmat(1,1).Data = R0( BPMData.HBPMIndex , 1:length(CMData.HCMIndex)); |
---|
1131 | 0941 Rmat(2,1).Data = R0(length(BPMData.BPMIndex)+BPMData.VBPMIndex , 1:length(CMData.HCMIndex)); |
---|
1132 | 0942 Rmat(1,2).Data = R0( BPMData.HBPMIndex , length(CMData.HCMIndex)+(1:length(CMData.VCMIndex))); |
---|
1133 | 0943 Rmat(2,2).Data = R0(length(BPMData.BPMIndex)+BPMData.VBPMIndex , length(CMData.HCMIndex)+(1:length(CMData.VCMIndex))); |
---|
1134 | 0944 |
---|
1135 | 0945 |
---|
1136 | 0946 <span class="comment">% Convert to meters/radian (don't use the rolled kick strength)</span> |
---|
1137 | 0947 <span class="keyword">for</span> i = 1:length(CMData.HCMKicks) |
---|
1138 | 0948 Rmat(1,1).Data(:,i) = Rmat(1,1).Data(:,i) / HCMKicks(i); |
---|
1139 | 0949 Rmat(2,1).Data(:,i) = Rmat(2,1).Data(:,i) / HCMKicks(i); |
---|
1140 | 0950 <span class="keyword">end</span> |
---|
1141 | 0951 |
---|
1142 | 0952 <span class="keyword">for</span> i = 1:length(CMData.VCMKicks) |
---|
1143 | 0953 Rmat(1,2).Data(:,i) = Rmat(1,2).Data(:,i) / VCMKicks(i); |
---|
1144 | 0954 Rmat(2,2).Data(:,i) = Rmat(2,2).Data(:,i) / VCMKicks(i); |
---|
1145 | 0955 <span class="keyword">end</span> |
---|
1146 | 0956 |
---|
1147 | 0957 |
---|
1148 | 0958 <span class="comment">% Build the rest of the response matrix structure in 'Physics' units</span> |
---|
1149 | 0959 |
---|
1150 | 0960 <span class="keyword">if</span> <a href="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(BPMxFamily,<span class="string">'BPM'</span>) && <a href="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(BPMyFamily,<span class="string">'BPM'</span>) |
---|
1151 | 0961 <span class="comment">% getpvmodel is better because crunch and roll are included</span> |
---|
1152 | 0962 Xat = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(BPMxFamily, BPMxList, <span class="string">'Physics'</span>); |
---|
1153 | 0963 Yat = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(BPMyFamily, BPMyList, <span class="string">'Physics'</span>); |
---|
1154 | 0964 <span class="keyword">else</span> |
---|
1155 | 0965 <span class="comment">% The orbit does not have to be at the BPMs so use modeltwiss</span> |
---|
1156 | 0966 [Xat, Yat, Sx, Sy] = modeltwiss(<span class="string">'ClosedOrbit'</span>, BPMxFamily, BPMxList, BPMyFamily, BPMyList); |
---|
1157 | 0967 <span class="keyword">end</span> |
---|
1158 | 0968 X.Data = Xat(:); |
---|
1159 | 0969 Y.Data = Yat(:); |
---|
1160 | 0970 X.FamilyName = BPMxFamily; |
---|
1161 | 0971 Y.FamilyName = BPMyFamily; |
---|
1162 | 0972 X.Field = <span class="string">'Monitor'</span>; |
---|
1163 | 0973 Y.Field = <span class="string">'Monitor'</span>; |
---|
1164 | 0974 X.DeviceList = BPMxList; |
---|
1165 | 0975 Y.DeviceList = BPMyList; |
---|
1166 | 0976 X.Status = ones(length(Xat),1); |
---|
1167 | 0977 Y.Status = ones(length(Yat),1); |
---|
1168 | 0978 X.Mode = <span class="string">'Model'</span>; |
---|
1169 | 0979 Y.Mode = <span class="string">'Model'</span>; |
---|
1170 | 0980 X.t = 0; |
---|
1171 | 0981 Y.t = 0; |
---|
1172 | 0982 X.tout = 0; |
---|
1173 | 0983 Y.tout = 0; |
---|
1174 | 0984 X.TimeStamp = clock; |
---|
1175 | 0985 Y.TimeStamp = X.TimeStamp; |
---|
1176 | 0986 X.Units = <span class="string">'Physics'</span>; |
---|
1177 | 0987 Y.Units = <span class="string">'Physics'</span>; |
---|
1178 | 0988 X.UnitsString = <span class="string">'m'</span>; |
---|
1179 | 0989 Y.UnitsString = <span class="string">'m'</span>; |
---|
1180 | 0990 X.DataDescriptor = <span class="string">'Horizontal Orbit'</span>; |
---|
1181 | 0991 Y.DataDescriptor = <span class="string">'Vertical Orbit'</span>; |
---|
1182 | 0992 X.CreatedBy = <span class="string">'getpv'</span>; |
---|
1183 | 0993 Y.CreatedBy = <span class="string">'getpv'</span>; |
---|
1184 | 0994 |
---|
1185 | 0995 HCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(HCMFamily, HCMList, <span class="string">'Struct'</span>, ModeFlag, <span class="string">'Physics'</span>); |
---|
1186 | 0996 VCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(VCMFamily, VCMList, <span class="string">'Struct'</span>, ModeFlag, <span class="string">'Physics'</span>); |
---|
1187 | 0997 Rmat(1,1).Monitor = X; |
---|
1188 | 0998 Rmat(1,1).Actuator = HCMsp; |
---|
1189 | 0999 Rmat(1,2).Monitor = X; |
---|
1190 | 1000 Rmat(1,2).Actuator = VCMsp; |
---|
1191 | 1001 Rmat(2,1).Monitor = Y; |
---|
1192 | 1002 Rmat(2,1).Actuator = HCMsp; |
---|
1193 | 1003 Rmat(2,2).Monitor = Y; |
---|
1194 | 1004 Rmat(2,2).Actuator = VCMsp; |
---|
1195 | 1005 |
---|
1196 | 1006 Rmat(1,1).ActuatorDelta = HCMKicks; <span class="comment">%CMData.HCMKicks;</span> |
---|
1197 | 1007 Rmat(2,1).ActuatorDelta = HCMKicks; <span class="comment">%CMData.HCMKicks;</span> |
---|
1198 | 1008 Rmat(1,2).ActuatorDelta = VCMKicks; <span class="comment">%CMData.VCMKicks;</span> |
---|
1199 | 1009 Rmat(2,2).ActuatorDelta = VCMKicks; <span class="comment">%CMData.VCMKicks;</span> |
---|
1200 | 1010 |
---|
1201 | 1011 <span class="keyword">for</span> i = 1:2 |
---|
1202 | 1012 <span class="keyword">for</span> j = 1:2 |
---|
1203 | 1013 Rmat(i,j).GeV = getenergymodel; |
---|
1204 | 1014 Rmat(i,j).TimeStamp = X.TimeStamp; |
---|
1205 | 1015 Rmat(i,j).DCCT = []; |
---|
1206 | 1016 Rmat(i,j).ModulationMethod = ModulationMethod; |
---|
1207 | 1017 Rmat(i,j).WaitFlag = WaitFlag; |
---|
1208 | 1018 Rmat(i,j).ExtraDelay = ExtraDelay; |
---|
1209 | 1019 Rmat(i,j).Units = <span class="string">'Physics'</span>; |
---|
1210 | 1020 Rmat(i,j).UnitsString = [Rmat(1,1).Monitor.UnitsString, <span class="string">'/'</span>, Rmat(1,1).Actuator.UnitsString]; |
---|
1211 | 1021 Rmat(i,j).DataDescriptor = <span class="string">'Response Matrix'</span>; |
---|
1212 | 1022 Rmat(i,j).CreatedBy = <span class="string">'measbpmresp'</span>; |
---|
1213 | 1023 Rmat(i,j).OperationalMode = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'OperationalMode'</span>); |
---|
1214 | 1024 <span class="keyword">end</span> |
---|
1215 | 1025 <span class="keyword">end</span> |
---|
1216 | 1026 |
---|
1217 | 1027 <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) |
---|
1218 | 1028 <span class="comment">% Change to hardware units [mm/amp]</span> |
---|
1219 | 1029 <span class="keyword">if</span> <a href="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(BPMxFamily,<span class="string">'BPM'</span>) && <a href="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(BPMyFamily,<span class="string">'BPM'</span>) && <a href="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(HCMFamily,<span class="string">'COR'</span>) && <a href="ismemberof.html" class="code" title="function [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(VCMFamily,<span class="string">'COR'</span>) |
---|
1220 | 1030 Rmat = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(Rmat, getenergymodel); |
---|
1221 | 1031 <span class="keyword">else</span> |
---|
1222 | 1032 fprintf(<span class="string">'\n You are asking for hardware units, but a nonstandard monitor and/or\n'</span>); |
---|
1223 | 1033 fprintf(<span class="string">' actuator was used. The response matrix will stay in physics units!\n\n'</span>); |
---|
1224 | 1034 <span class="keyword">end</span> |
---|
1225 | 1035 <span class="keyword">end</span> |
---|
1226 | 1036 |
---|
1227 | 1037 <span class="keyword">else</span> |
---|
1228 | 1038 |
---|
1229 | 1039 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span> |
---|
1230 | 1040 <span class="comment">% Online or Simulated Response Matrix %</span> |
---|
1231 | 1041 <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span> |
---|
1232 | 1042 |
---|
1233 | 1043 <span class="comment">% Default kicks</span> |
---|
1234 | 1044 <span class="keyword">if</span> isempty(HCMKicks) |
---|
1235 | 1045 HCMKicks = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(HCMFamily, <span class="string">'Setpoint'</span>, <span class="string">'DeltaRespMat'</span>, HCMList); |
---|
1236 | 1046 KickUnits = <span class="string">'Hardware'</span>; <span class="comment">%getfamilydata(HCMFamily, 'Setpoint', 'Units');</span> |
---|
1237 | 1047 <span class="keyword">if</span> isempty(HCMKicks) |
---|
1238 | 1048 HCMKicks = Default2HCMKick; |
---|
1239 | 1049 KickUnits = <span class="string">'Physics'</span>; |
---|
1240 | 1050 <span class="keyword">end</span> |
---|
1241 | 1051 <span class="keyword">if</span> isempty(KickUnits) |
---|
1242 | 1052 error(<span class="string">'Units for the kick strength are unknown. Try inputing units directly.'</span>); |
---|
1243 | 1053 <span class="keyword">end</span> |
---|
1244 | 1054 <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Physics'</span>) && strcmpi(KickUnits, <span class="string">'Hardware'</span>) |
---|
1245 | 1055 HCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(HCMFamily, HCMList, <span class="string">'Numeric'</span>, ModeFlag, <span class="string">'Hardware'</span>); |
---|
1246 | 1056 HCMKicks = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(HCMFamily, <span class="string">'Setpoint'</span>, HCMsp+HCMKicks, HCMList) - <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(HCMFamily, <span class="string">'Setpoint'</span>, HCMsp, HCMList); |
---|
1247 | 1057 <span class="keyword">elseif</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) && strcmpi(KickUnits, <span class="string">'Physics'</span>) |
---|
1248 | 1058 HCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(HCMFamily, HCMList, <span class="string">'Numeric'</span>, ModeFlag, <span class="string">'Physics'</span>); |
---|
1249 | 1059 HCMKicks = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(HCMFamily, <span class="string">'Setpoint'</span>, HCMsp+HCMKicks, HCMList) - <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(HCMFamily, <span class="string">'Setpoint'</span>, HCMsp, HCMList); |
---|
1250 | 1060 <span class="keyword">end</span> |
---|
1251 | 1061 <span class="keyword">end</span> |
---|
1252 | 1062 <span class="keyword">if</span> isempty(VCMKicks) |
---|
1253 | 1063 VCMKicks = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(VCMFamily, <span class="string">'Setpoint'</span>, <span class="string">'DeltaRespMat'</span>, VCMList); |
---|
1254 | 1064 KickUnits = <span class="string">'Hardware'</span>; <span class="comment">%getfamilydata(VCMFamily, 'Setpoint', 'Units');</span> |
---|
1255 | 1065 <span class="keyword">if</span> isempty(VCMKicks) |
---|
1256 | 1066 VCMKicks = Default2VCMKick; |
---|
1257 | 1067 KickUnits = <span class="string">'Physics'</span>; |
---|
1258 | 1068 <span class="keyword">end</span> |
---|
1259 | 1069 <span class="keyword">if</span> isempty(KickUnits) |
---|
1260 | 1070 error(<span class="string">'Units for the kick strength are unknown. Try inputing units directly.'</span>); |
---|
1261 | 1071 <span class="keyword">end</span> |
---|
1262 | 1072 <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Physics'</span>) && strcmpi(KickUnits, <span class="string">'Hardware'</span>) |
---|
1263 | 1073 VCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(VCMFamily, VCMList, <span class="string">'Numeric'</span>, ModeFlag, <span class="string">'Hardware'</span>); |
---|
1264 | 1074 VCMKicks = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(VCMFamily, <span class="string">'Setpoint'</span>, VCMsp+VCMKicks, VCMList) - <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(VCMFamily, <span class="string">'Setpoint'</span>, VCMsp, VCMList); |
---|
1265 | 1075 <span class="keyword">elseif</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) && strcmpi(KickUnits, <span class="string">'Physics'</span>) |
---|
1266 | 1076 VCMsp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(VCMFamily, VCMList, <span class="string">'Numeric'</span>, ModeFlag, <span class="string">'Physics'</span>); |
---|
1267 | 1077 VCMKicks = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(VCMFamily, <span class="string">'Setpoint'</span>, VCMsp+VCMKicks, VCMList) - <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(VCMFamily, <span class="string">'Setpoint'</span>, VCMsp, VCMList); |
---|
1268 | 1078 <span class="keyword">end</span> |
---|
1269 | 1079 <span class="keyword">end</span> |
---|
1270 | 1080 |
---|
1271 | 1081 <span class="comment">%% Query to begin measurement</span> |
---|
1272 | 1082 <span class="comment">%if DisplayFlag</span> |
---|
1273 | 1083 <span class="comment">% tmp = questdlg('Begin response matrix measurement?','Response Matrix Measurement','Yes','No','No');</span> |
---|
1274 | 1084 <span class="comment">% if strcmpi(tmp,'No')</span> |
---|
1275 | 1085 <span class="comment">% fprintf(' Response matrix measurement aborted\n');</span> |
---|
1276 | 1086 <span class="comment">% Rmat = [];</span> |
---|
1277 | 1087 <span class="comment">% return</span> |
---|
1278 | 1088 <span class="comment">% end</span> |
---|
1279 | 1089 <span class="comment">%end</span> |
---|
1280 | 1090 |
---|
1281 | 1091 <span class="comment">% Mask bpms and correctors for status</span> |
---|
1282 | 1092 BPMxStatus = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(BPMxFamily,<span class="string">'Status'</span>, BPMxList); |
---|
1283 | 1093 BPMxGoodIndex = find(BPMxStatus); |
---|
1284 | 1094 BPMxList = BPMxList(BPMxGoodIndex,:); |
---|
1285 | 1095 |
---|
1286 | 1096 BPMyStatus = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(BPMyFamily,<span class="string">'Status'</span>, BPMyList); |
---|
1287 | 1097 BPMyGoodIndex = find(BPMyStatus); |
---|
1288 | 1098 BPMyList = BPMyList(BPMyGoodIndex,:); |
---|
1289 | 1099 |
---|
1290 | 1100 HCMStatus = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(HCMFamily,<span class="string">'Status'</span>, HCMList); |
---|
1291 | 1101 HCMGoodIndex = find(HCMStatus); |
---|
1292 | 1102 HCMList = HCMList(HCMGoodIndex,:); |
---|
1293 | 1103 <span class="keyword">if</span> length(HCMKicks) == 1 |
---|
1294 | 1104 HCMKicks = HCMKicks * ones(length(HCMGoodIndex),1); |
---|
1295 | 1105 <span class="keyword">else</span> |
---|
1296 | 1106 HCMKicks = HCMKicks(HCMGoodIndex); |
---|
1297 | 1107 <span class="keyword">end</span> |
---|
1298 | 1108 |
---|
1299 | 1109 VCMStatus = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(VCMFamily,<span class="string">'Status'</span>, VCMList); |
---|
1300 | 1110 VCMGoodIndex = find(VCMStatus); |
---|
1301 | 1111 VCMList = VCMList(VCMGoodIndex,:); |
---|
1302 | 1112 <span class="keyword">if</span> length(VCMKicks) == 1 |
---|
1303 | 1113 VCMKicks = VCMKicks * ones(length(VCMGoodIndex),1); |
---|
1304 | 1114 <span class="keyword">else</span> |
---|
1305 | 1115 VCMKicks = VCMKicks(VCMGoodIndex); |
---|
1306 | 1116 <span class="keyword">end</span> |
---|
1307 | 1117 |
---|
1308 | 1118 <span class="comment">% Measure response matrix of all planes at once</span> |
---|
1309 | 1119 <span class="comment">% (One advantage of this is the limits of all planes get checked before the measurement starts)</span> |
---|
1310 | 1120 <span class="keyword">if</span> DisplayFlag |
---|
1311 | 1121 fprintf(<span class="string">' Begin BPM response matrix measurement\n'</span>); |
---|
1312 | 1122 <span class="keyword">end</span> |
---|
1313 | 1123 |
---|
1314 | 1124 <span class="comment">%if strcmpi(getfamilydata('Machine'), 'ALS')</span> |
---|
1315 | 1125 <span class="comment">% fprintf(' Using measrespmat_als (with orbit correction)\n');</span> |
---|
1316 | 1126 <span class="comment">% Rcell = measrespmat_als({BPMxFamily,BPMyFamily}, {BPMxList,BPMyList}, {HCMFamily,VCMFamily}, {HCMList,VCMList}, {HCMKicks,VCMKicks}, 'Struct', ModulationMethod, WaitFlag, ExtraDelay, InputFlags{:}, DCCTFlag{:});</span> |
---|
1317 | 1127 <span class="comment">%else</span> |
---|
1318 | 1128 Rcell = <a href="measrespmat.html" class="code" title="function S = measrespmat(varargin)">measrespmat</a>({BPMxFamily,BPMyFamily}, {BPMxList,BPMyList}, {HCMFamily,VCMFamily}, {HCMList,VCMList}, {HCMKicks,VCMKicks}, <span class="string">'Struct'</span>, ModulationMethod, WaitFlag, ExtraDelay, InputFlags{:}, DCCTFlag{:}); |
---|
1319 | 1129 <span class="comment">%end</span> |
---|
1320 | 1130 <span class="keyword">if</span> DisplayFlag |
---|
1321 | 1131 fprintf(<span class="string">' Measurement complete.\n\n'</span>); |
---|
1322 | 1132 <span class="keyword">end</span> |
---|
1323 | 1133 |
---|
1324 | 1134 <span class="comment">% Convert cell array to a struct array</span> |
---|
1325 | 1135 <span class="comment">% (We only did this because struct arrays were more familiar to people)</span> |
---|
1326 | 1136 <span class="comment">% Rmat(1,1) = Rcell{1,1}; % Kick x, look x</span> |
---|
1327 | 1137 <span class="comment">% Rmat(2,1) = Rcell{2,1}; % Kick x, look y</span> |
---|
1328 | 1138 <span class="comment">% Rmat(2,2) = Rcell{2,2}; % Kick y, look y</span> |
---|
1329 | 1139 <span class="comment">% Rmat(1,2) = Rcell{1,2}; % Kick y, look x</span> |
---|
1330 | 1140 <span class="keyword">for</span> i = 1:size(Rcell,1) |
---|
1331 | 1141 <span class="keyword">for</span> j = 1:size(Rcell,2) |
---|
1332 | 1142 <span class="keyword">if</span> <a href="istransport.html" class="code" title="function Test = istransport">istransport</a> |
---|
1333 | 1143 <span class="comment">% For transport line zero the BPM noise for upstream BPMs</span> |
---|
1334 | 1144 <span class="keyword">for</span> k = 1:size(Rcell{i,j}.Data,2) |
---|
1335 | 1145 CMpos = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(Rcell{i,j}.Actuator.FamilyName, Rcell{i,j}.Actuator.DeviceList(k,:)); |
---|
1336 | 1146 BPMpos = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(Rcell{i,j}.Monitor); |
---|
1337 | 1147 iUpStream = find(BPMpos < CMpos); |
---|
1338 | 1148 <span class="keyword">if</span> ~isempty(iUpStream) |
---|
1339 | 1149 Rcell{i,j}.Data(iUpStream,k) = 0; |
---|
1340 | 1150 <span class="keyword">end</span> |
---|
1341 | 1151 <span class="keyword">end</span> |
---|
1342 | 1152 <span class="keyword">end</span> |
---|
1343 | 1153 Rmat(i,j) = Rcell{i,j}; |
---|
1344 | 1154 <span class="keyword">end</span> |
---|
1345 | 1155 <span class="keyword">end</span> |
---|
1346 | 1156 |
---|
1347 | 1157 |
---|
1348 | 1158 <span class="comment">% % Horizontal corrector plane</span> |
---|
1349 | 1159 <span class="comment">% if DisplayFlag</span> |
---|
1350 | 1160 <span class="comment">% fprintf(' Begin Horizontal plane measurement ...\n');</span> |
---|
1351 | 1161 <span class="comment">% end</span> |
---|
1352 | 1162 <span class="comment">% mat = measrespmat('Struct', {BPMxFamily, BPMyFamily}, {BPMxList, BPMyList}, HCMFamily, HCMList, HCMKicks, ModulationMethod, WaitFlag, ExtraDelay, InputFlags{:});</span> |
---|
1353 | 1163 <span class="comment">% if DisplayFlag</span> |
---|
1354 | 1164 <span class="comment">% fprintf(' Horizontal plane complete.\n\n');</span> |
---|
1355 | 1165 <span class="comment">% end</span> |
---|
1356 | 1166 <span class="comment">%</span> |
---|
1357 | 1167 <span class="comment">% % Make a response matrix array</span> |
---|
1358 | 1168 <span class="comment">% Rmat(1,1) = mat{1}; % Kick x, look x</span> |
---|
1359 | 1169 <span class="comment">% Rmat(2,1) = mat{2}; % Kick x, look y</span> |
---|
1360 | 1170 <span class="comment">%</span> |
---|
1361 | 1171 <span class="comment">%</span> |
---|
1362 | 1172 <span class="comment">% % Vertical corrector plane</span> |
---|
1363 | 1173 <span class="comment">% if DisplayFlag</span> |
---|
1364 | 1174 <span class="comment">% fprintf(' Begin Vertical plane measurement...\n');</span> |
---|
1365 | 1175 <span class="comment">% end</span> |
---|
1366 | 1176 <span class="comment">% mat = measrespmat('Struct', {BPMxFamily, BPMyFamily}, {BPMxList, BPMyList}, VCMFamily, VCMList, VCMKicks, ModulationMethod, WaitFlag, ExtraDelay, InputFlags{:});</span> |
---|
1367 | 1177 <span class="comment">% if DisplayFlag</span> |
---|
1368 | 1178 <span class="comment">% fprintf(' Vertical plane complete.\n\n');</span> |
---|
1369 | 1179 <span class="comment">% end</span> |
---|
1370 | 1180 <span class="comment">%</span> |
---|
1371 | 1181 <span class="comment">% Rmat(2,2) = mat{2}; % Kick y, look y</span> |
---|
1372 | 1182 <span class="comment">% Rmat(1,2) = mat{1}; % Kick y, look x</span> |
---|
1373 | 1183 <span class="keyword">end</span> |
---|
1374 | 1184 |
---|
1375 | 1185 <span class="comment">% Save data in the proper directory</span> |
---|
1376 | 1186 <span class="keyword">if</span> ArchiveFlag || ischar(FileName) |
---|
1377 | 1187 [DirectoryName, FileName, Ext] = fileparts(FileName); |
---|
1378 | 1188 DirStart = pwd; |
---|
1379 | 1189 [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName); |
---|
1380 | 1190 <span class="keyword">if</span> ErrorFlag |
---|
1381 | 1191 fprintf(<span class="string">'\n There was a problem getting to the proper directory!\n\n'</span>); |
---|
1382 | 1192 <span class="keyword">end</span> |
---|
1383 | 1193 save(FileName, <span class="string">'Rmat'</span>,<span class="string">'MachineConfig'</span>); |
---|
1384 | 1194 cd(DirStart); |
---|
1385 | 1195 OutputFileName = [DirectoryName, FileName, <span class="string">'.mat'</span>]; |
---|
1386 | 1196 |
---|
1387 | 1197 <span class="keyword">if</span> DisplayFlag |
---|
1388 | 1198 fprintf(<span class="string">' BPM response matrix data structure ''Rmat'' saved to disk\n'</span>); |
---|
1389 | 1199 fprintf(<span class="string">' Filename: %s\n'</span>, OutputFileName); |
---|
1390 | 1200 fprintf(<span class="string">' The total response matrix measurement time was %.2f minutes.\n'</span>, (gettime-TimeStart)/60); |
---|
1391 | 1201 <span class="keyword">end</span> |
---|
1392 | 1202 <span class="keyword">else</span> |
---|
1393 | 1203 OutputFileName = <span class="string">''</span>; |
---|
1394 | 1204 <span class="keyword">end</span> |
---|
1395 | 1205 |
---|
1396 | 1206 |
---|
1397 | 1207 <span class="keyword">if</span> ~StructOutputFlag |
---|
1398 | 1208 <span class="comment">% Return a matrix</span> |
---|
1399 | 1209 <span class="comment">% Rmat = [Rmat(1,1).Data Rmat(1,2).Data;</span> |
---|
1400 | 1210 <span class="comment">% Rmat(2,1).Data Rmat(2,2).Data];</span> |
---|
1401 | 1211 RmatData = []; |
---|
1402 | 1212 <span class="keyword">for</span> i = 1:size(Rmat,1) |
---|
1403 | 1213 Rrow = []; |
---|
1404 | 1214 <span class="keyword">for</span> j = 1:size(Rmat,2) |
---|
1405 | 1215 Rrow = [Rrow Rmat(i,j).Data]; |
---|
1406 | 1216 <span class="keyword">end</span> |
---|
1407 | 1217 RmatData = [RmatData; Rrow]; |
---|
1408 | 1218 <span class="keyword">end</span> |
---|
1409 | 1219 |
---|
1410 | 1220 Rmat = RmatData; |
---|
1411 | 1221 <span class="keyword">end</span></pre></div> |
---|
1412 | <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> © 2003</address> |
---|
1413 | </body> |
---|
1414 | </html> |
---|