source: MML/trunk/mml/doc_html/mml/measbpmresp.html @ 4

Last change on this file since 4 was 4, checked in by zhangj, 10 years ago

Initial import--MML version from SOLEIL@2013

File size: 101.6 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2                "http://www.w3.org/TR/REC-html40/loose.dtd">
3<html>
4<head>
5  <title>Description of 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 &copy; 2003 Guillaume Flandin">
10  <meta name="robots" content="index, follow">
11  <link type="text/css" rel="stylesheet" href="../m2html.css">
12</head>
13<body>
14<a name="_top"></a>
15<div><a href="../index.html">Home</a> &gt;  <a href="index.html">mml</a> &gt; measbpmresp.m</div>
16
17<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td>
18<td align="right"><a href="index.html">Index for mml&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>-->
19
20<h1>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 \&lt;Directory.BPMResponse&gt;\&lt;BPMRespFile&gt;&lt;Date&gt;&lt;Time&gt;.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>
181This 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>
184This 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>
1920002 <span class="comment">%MEASBPMRESP - Measures the BPM response matrix in the horizontal and vertical planes</span>
1930003 <span class="comment">%</span>
1940004 <span class="comment">%  For family name, device list inputs:</span>
1950005 <span class="comment">%  [R, FileName] = measbpmresp(BPMxFamily, BPMxList, BPMyFamily, BPMyList, HCMFamily, HCMList, VCMFamily, VCMList, HCMKicks, VCMKicks, ModulationMethod, WaitFlag, FileName, DirectoryName, ExtraDelay)</span>
1960006 <span class="comment">%</span>
1970007 <span class="comment">%  For data structure inputs:</span>
1980008 <span class="comment">%  [R, FileName] = measbpmresp(BPMxStruct, BPMyStruct, HCMStruct, VCMStruct, HCMKicks, VCMKicks, ModulationMethod, WaitFlag, FileName, DirectoryName, ExtraDelay)</span>
1990009 <span class="comment">%</span>
2000010 <span class="comment">%  INPUTS</span>
2010011 <span class="comment">%  1. BPMxFamily       - BPMx family name {Default: gethbpmfamily}</span>
2020012 <span class="comment">%     BPMxDeviceList   - BPMx device list {Default: all devices with good status}</span>
2030013 <span class="comment">%     or</span>
2040014 <span class="comment">%     BPMxStruct can replace BPMxFamily and BPMxList</span>
2050015 <span class="comment">%</span>
2060016 <span class="comment">%  2. BPMyFamily       - BPMy family name {Default: getvbpmfamily}</span>
2070017 <span class="comment">%     BPMyDeviceList   - BPMy device list {Default: all devices with good status}</span>
2080018 <span class="comment">%     or</span>
2090019 <span class="comment">%     BPMyStruct can replace BPMyFamily and BPMyList</span>
2100020 <span class="comment">%</span>
2110021 <span class="comment">%  3. HCMFamily       - HCM family name {Default: gethcmfamily}</span>
2120022 <span class="comment">%     HCMDeviceList   - HCM device list {Default: all devices with good status}</span>
2130023 <span class="comment">%     or</span>
2140024 <span class="comment">%     HCMStruct can replace HCMFamily and HCMList</span>
2150025 <span class="comment">%</span>
2160026 <span class="comment">%  4. VCMFamily       - VCM family name {Default: getvcmfamily}</span>
2170027 <span class="comment">%     VCMDeviceList   - VCM device list {Default: all devices with good status}</span>
2180028 <span class="comment">%     or</span>
2190029 <span class="comment">%     VCMStruct can replace VCMFamily and VCMList</span>
2200030 <span class="comment">%</span>
2210031 <span class="comment">%  5. HCMKicks - Change in HCM correctors {Default: getfamilydata(HCMFamily,'Setpoint','DeltaRespMat',HCMDeviceList), then .05 mrad}</span>
2220032 <span class="comment">%  6. VCMKicks - Change in VCM correctors {Default: getfamilydata(VCMFamily,'Setpoint','DeltaRespMat',VCMDeviceList), then .05 mrad}</span>
2230033 <span class="comment">%</span>
2240034 <span class="comment">%  7. ModulationMethod - Method for changing the ActuatorFamily</span>
2250035 <span class="comment">%                       'bipolar' changes the ActuatorFamily by +/- ActuatorDelta/2 on each step {Default}</span>
2260036 <span class="comment">%                       'unipolar' changes the ActuatorFamily from 0 to ActuatorDelta on each step</span>
2270037 <span class="comment">%</span>
2280038 <span class="comment">%  8. WaitFlag - (see setpv for WaitFlag definitions) {Default: []}</span>
2290039 <span class="comment">%                WaitFlag = -5 will override gets to manual mode</span>
2300040 <span class="comment">%</span>
2310041 <span class="comment">%  9. Optional input to change the default filename and directory</span>
2320042 <span class="comment">%     FileName - Filename for the response matrix data</span>
2330043 <span class="comment">%                (Empty prompts for a filename)</span>
2340044 <span class="comment">%     DirectoryName - Directory name to store the response matrix data file</span>
2350045 <span class="comment">%     Note: a. FileName can include the path if DirectoryName is not used</span>
2360046 <span class="comment">%           b. For model response matrices, FileName must exist for a file save</span>
2370047 <span class="comment">%           c. The 'Achive' flag is another way to input the filename</span>
2380048 <span class="comment">%</span>
2390049 <span class="comment">%  10. ExtraDelay - extra time delay [seconds] after a setpoint change</span>
2400050 <span class="comment">%</span>
2410051 <span class="comment">%  11. 'Struct'  - Output will be a response matrix structure {Default for     data structure inputs}</span>
2420052 <span class="comment">%      'Numeric' - Output will be a numeric matrix            {Default for non-data structure inputs}</span>
2430053 <span class="comment">%</span>
2440054 <span class="comment">%  12. Optional override of the units:</span>
2450055 <span class="comment">%      'Physics'  - Use physics  units</span>
2460056 <span class="comment">%      'Hardware' - Use hardware units</span>
2470057 <span class="comment">%</span>
2480058 <span class="comment">%  13. Optional override of the mode:</span>
2490059 <span class="comment">%      'Online'    - Set/Get data online</span>
2500060 <span class="comment">%      'Model'     - Set/Get data directly from AT (uses locoresponsematrix)</span>
2510061 <span class="comment">%      'Simulator' - Set/Get data on the simulated accelerator using AT (ie, same commands as 'Online')</span>
2520062 <span class="comment">%      'Manual'    - Set/Get data manually</span>
2530063 <span class="comment">%</span>
2540064 <span class="comment">%  14. 'Display'   - Prints status information to the command window {Default}</span>
2550065 <span class="comment">%      'NoDisplay' - Nothing is printed to the command window</span>
2560066 <span class="comment">%</span>
2570067 <span class="comment">%  15. 'NoArchive' - No file archive</span>
2580068 <span class="comment">%      'Archive'   - Save the response matrix data to \&lt;Directory.BPMResponse&gt;\&lt;BPMRespFile&gt;&lt;Date&gt;&lt;Time&gt;.mat</span>
2590069 <span class="comment">%                    To change the filename, included the filename after the 'Archive', '' to browse</span>
2600070 <span class="comment">%</span>
2610071 <span class="comment">%  16. 'MinimumBeamCurrent' - Minimum beam current before prompting for a refill</span>
2620072 <span class="comment">%                             The current (as returned by getdcct) must follow the flag.</span>
2630073 <span class="comment">%                             measbpmresp('MinimumBeamCurrent', 32.1)</span>
2640074 <span class="comment">%                             will pause at a beam current of 32.1 and prompt for a refill.</span>
2650075 <span class="comment">%</span>
2660076 <span class="comment">%  17. Optional inputs when computing model response matrices:</span>
2670077 <span class="comment">%      'FixedPathLength' or 'FixedMomentum' - hold the path length or momentum fixed  {Default: 'FixedPathLength'}</span>
2680078 <span class="comment">%      'Full' or 'Linear' - use full nonlinear model or linear approximation (faster) {Default: 'Linear'}</span>
2690079 <span class="comment">%      Note: The ModulationMethod input (7) is also used for the model calculation.</span>
2700080 <span class="comment">%</span>
2710081 <span class="comment">%  OUTPUTS</span>
2720082 <span class="comment">%  1. R = Orbit response matrix (delta(orbit)/delta(Kick))</span>
2730083 <span class="comment">%</span>
2740084 <span class="comment">%     Numeric Output:</span>
2750085 <span class="comment">%       R = [xx xy</span>
2760086 <span class="comment">%            yx yy]</span>
2770087 <span class="comment">%</span>
2780088 <span class="comment">%     Stucture Output:</span>
2790089 <span class="comment">%     R(BPM Plane, Corrector Plane) - 2x2 struct array</span>
2800090 <span class="comment">%     R(1,1).Data=xx;  % Kick x, look x</span>
2810091 <span class="comment">%     R(2,1).Data=yx;  % Kick x, look y</span>
2820092 <span class="comment">%     R(1,2).Data=xy;  % Kick y, look x</span>
2830093 <span class="comment">%     R(2,2).Data=yy;  % Kick y, look y</span>
2840094 <span class="comment">%</span>
2850095 <span class="comment">%     R(Monitor, Actuator).Data - Response matrix</span>
2860096 <span class="comment">%                         .Monitor  - BPM data structure (starting orbit)</span>
2870097 <span class="comment">%                         .Monitor1 - BPM matrix (first  data point)</span>
2880098 <span class="comment">%                         .Monitor2 - BPM matrix (second data point)</span>
2890099 <span class="comment">%                         .Actuator - Corrector data structure</span>
2900100 <span class="comment">%                         .ActuatorDelta - Corrector kick vector</span>
2910101 <span class="comment">%                         .GeV - Electron beam energy</span>
2920102 <span class="comment">%                         .ModulationMethod - 'unipolar' or 'bipolar'</span>
2930103 <span class="comment">%                         .WaitFlag - Wait flag used when acquiring data</span>
2940104 <span class="comment">%                         .ExtraDelay - Extra time delay</span>
2950105 <span class="comment">%                         .TimeStamp</span>
2960106 <span class="comment">%                         .CreatedBy</span>
2970107 <span class="comment">%                         .DCCT</span>
2980108 <span class="comment">%</span>
2990109 <span class="comment">%  2. FileName = File name (including directory) where the data was saved (if applicable)</span>
3000110 <span class="comment">%                (a machine configuration structure is saved in the data file as well)</span>
3010111 <span class="comment">%</span>
3020112 <span class="comment">%  NOTES</span>
3030113 <span class="comment">%  1. [] can be used on any input to obtain the default setting.</span>
3040114 <span class="comment">%     However, most inputs can be left out altogether to get the default.</span>
3050115 <span class="comment">%  2. For Mode = 'Model':</span>
3060116 <span class="comment">%     a. AT family names (or 'All') can be used and DeviceList is ignored</span>
3070117 <span class="comment">%     b. There is a lot of flexibility for getting response matrices, for instance,</span>
3080118 <span class="comment">%        R = measbpmresp('QF', 'QD', 'HCM', 'VCM', 'Model', 'Physics');</span>
3090119 <span class="comment">%        is the response matrix from the correctors to orbit at the sextupoles.</span>
3100120 <span class="comment">%        The units when using nonstandard families for BPMs is always 'physics', meter/radian.</span>
3110121 <span class="comment">%  3. Cell inputs are not allowed.</span>
3120122 <span class="comment">%  4. BPM roll and crunch and corrector magnet roll errors are included only if they are</span>
3130123 <span class="comment">%     in the AT model (field .GCR for BPMs and .Roll for correctors).</span>
3140124 <span class="comment">%     BPM and corrector magnet gains are included in hardware units (not physics units).</span>
3150125 <span class="comment">%  5. This function measures response matrices from 2 BPM families to 2 corrector families.</span>
3160126 <span class="comment">%     If only one family is needed then use measrespmat.</span>
3170127 <span class="comment">%</span>
3180128 <span class="comment">%  EXAMPLES</span>
3190129 <span class="comment">%  1. Default:</span>
3200130 <span class="comment">%       R = measbpmresp;</span>
3210131 <span class="comment">%       is the same as,</span>
3220132 <span class="comment">%       R = measbpmresp('BPMx', 'BPMy', 'HCM', 'VCM', 'Online', 'Bipolar', 'Numeric', 'Archive');</span>
3230133 <span class="comment">%</span>
3240134 <span class="comment">%  2. Default using the model:</span>
3250135 <span class="comment">%       R = measbpmresp('Model');</span>
3260136 <span class="comment">%       is the same as,</span>
3270137 <span class="comment">%       R = measbpmresp('BPMx', 'BPMy', 'HCM', 'VCM', 'Model', 'Bipolar', 'Numeric', 'NoArchive', 'FixedPathLength', 'Linear');</span>
3280138 <span class="comment">%</span>
3290139 <span class="comment">%  3. Compare measured (or Default) and model BPM response</span>
3300140 <span class="comment">%     Rmeas  = getbpmresp;</span>
3310141 <span class="comment">%     Rmodel = measbpmresp('Model');</span>
3320142 <span class="comment">%     subplot(2,1,1);</span>
3330143 <span class="comment">%     surf(Rmeas);  title('Default BPM Response'); xlabel('BPM #'); ylabel('CM #'); zlabel('[mm/amp]');</span>
3340144 <span class="comment">%     subplot(2,1,2);</span>
3350145 <span class="comment">%     surf(Rmeas-Rmodel);  title('Default - Model BPM Response'); xlabel('BPM #'); ylabel('CM #'); zlabel('[mm/amp]');</span>
3360146 <span class="comment">%</span>
3370147 <span class="comment">%  See also getbpmresp, measrespmat, meastuneresp, measchroresp</span>
3380148 <span class="comment">%</span>
3390149 <span class="comment">%  Written by Greg Portmann</span>
3400150
3410151
3420152 <span class="comment">% Initialize defaults</span>
3430153 BPMxFamily = <a href="gethbpmfamily.html" class="code" title="function Family = gethbpmfamily">gethbpmfamily</a>;
3440154 <span class="keyword">if</span> isempty(BPMxFamily)
3450155     error(<span class="string">'&quot;BPMx&quot; needs to be a MemberOf some family.'</span>);
3460156 <span class="keyword">end</span>
3470157 BPMxList = [];
3480158
3490159 BPMyFamily = <a href="getvbpmfamily.html" class="code" title="function Family = getvbpmfamily">getvbpmfamily</a>;
3500160 <span class="keyword">if</span> isempty(BPMyFamily)
3510161     error(<span class="string">'&quot;BPMy&quot; needs to be a MemberOf some family.'</span>);
3520162 <span class="keyword">end</span>
3530163 BPMyList = [];
3540164
3550165 HCMFamily = <a href="gethcmfamily.html" class="code" title="function Family = gethcmfamily">gethcmfamily</a>;
3560166 <span class="keyword">if</span> isempty(HCMFamily)
3570167     error(<span class="string">'&quot;HCM&quot; needs to be a MemberOf some family.'</span>);
3580168 <span class="keyword">end</span>
3590169 HCMList = [];
3600170 HCMKicks = [];
3610171 Default2HCMKick = .05e-3;  <span class="comment">% Radians, if getfamilydata(HCMFamily,'Setpoint','DeltaRespMat') is empty</span>
3620172
3630173 VCMFamily = <a href="getvcmfamily.html" class="code" title="function Family = getvcmfamily">getvcmfamily</a>;
3640174 <span class="keyword">if</span> isempty(VCMFamily)
3650175     error(<span class="string">'&quot;VCM&quot; needs to be a MemberOf some family.'</span>);
3660176 <span class="keyword">end</span>
3670177 VCMList = [];
3680178 VCMKicks = [];
3690179 Default2VCMKick = .05e-3;  <span class="comment">% Radians, if getfamilydata(VCMFamily,'Setpoint','DeltaRespMat') is empty</span>
3700180 ModulationMethod = <span class="string">'bipolar'</span>;
3710181
3720182 <span class="comment">% Map MML to LOCO naming</span>
3730183 <span class="keyword">if</span> strcmpi(ModulationMethod, <span class="string">'bipolar'</span>)
3740184     LOCORespFlags.ResponseMatrixMeasurement = <span class="string">'Bidirectional'</span>;   <span class="comment">% 'oneway'' or ''bidirectional'</span>
3750185 <span class="keyword">else</span>
3760186     LOCORespFlags.DispersionMeasurement     = <span class="string">'Bidirectional'</span>;
3770187 <span class="keyword">end</span>
3780188 <span class="keyword">if</span> <a href="isstoragering.html" class="code" title="function Test = isstoragering">isstoragering</a>
3790189     LOCORespFlags.ResponseMatrixCalculator  = <span class="string">'Linear'</span>;
3800190     LOCORespFlags.ClosedOrbitType           = <span class="string">'fixedpathlength'</span>;
3810191     LOCORespFlags.MachineType               = <span class="string">'StorageRing'</span>;
3820192 <span class="keyword">else</span>
3830193     <span class="comment">% Full is usually as fast as Linear for transport lines</span>
3840194     LOCORespFlags.ResponseMatrixCalculator  = <span class="string">'full'</span>;
3850195     LOCORespFlags.ClosedOrbitType           = <span class="string">'fixedmomentum'</span>;
3860196     LOCORespFlags.MachineType               = <span class="string">'Transport'</span>;
3870197 <span class="keyword">end</span>
3880198
3890199 WaitFlag = -2;
3900200 ExtraDelay = 0;
3910201 StructOutputFlag = 0;
3920202 NumericOutputFlag = 0;
3930203 DisplayFlag = -1;
3940204 ArchiveFlag = -1;
3950205 FileName = -1;
3960206 DirectoryName = <span class="string">''</span>;
3970207 ModeFlag = <span class="string">''</span><span class="comment">% model, online, manual, or '' for default mode</span>
3980208 UnitsFlag = <span class="string">''</span>; <span class="comment">% hardware, physics, or '' for default units</span>
3990209
4000210 InputFlags = {};
4010211 DCCTFlag = {};
4020212 <span class="keyword">for</span> i = length(varargin):-1:1
4030213     <span class="keyword">if</span> isstruct(varargin{i})
4040214         <span class="comment">% Ignore structures</span>
4050215     <span class="keyword">elseif</span> iscell(varargin{i})
4060216         <span class="comment">% Ignore cells</span>
4070217     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Struct'</span>)
4080218         StructOutputFlag = 1;
4090219         varargin(i) = [];
4100220     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Numeric'</span>)
4110221         StructOutputFlag = 0;
4120222         NumericOutputFlag = 1;
4130223         varargin(i) = [];
4140224     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Model'</span>)
4150225         ModeFlag = varargin{i};
4160226         InputFlags = [InputFlags varargin(i)];
4170227         varargin(i) = [];
4180228     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Simulator'</span>)
4190229         ModeFlag = varargin{i};
4200230         InputFlags = [InputFlags varargin(i)];
4210231         varargin(i) = [];
4220232     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Online'</span>)
4230233         ModeFlag = varargin{i};
4240234         InputFlags = [InputFlags varargin(i)];
4250235         varargin(i) = [];
4260236     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Manual'</span>)
4270237         ModeFlag = varargin{i};
4280238         InputFlags = [InputFlags varargin(i)];
4290239         varargin(i) = [];
4300240     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Physics'</span>)
4310241         UnitsFlag = varargin{i};
4320242         InputFlags = [InputFlags varargin(i)];
4330243         varargin(i) = [];
4340244     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Hardware'</span>)
4350245         UnitsFlag = varargin{i};
4360246         InputFlags = [InputFlags varargin(i)];
4370247         varargin(i) = [];
4380248     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Archive'</span>)
4390249         ArchiveFlag = 1;
4400250         <span class="keyword">if</span> length(varargin) &gt; i
4410251             <span class="comment">% Look for a filename as the next input</span>
4420252             <span class="keyword">if</span> ischar(varargin{i+1})
4430253                 FileName = varargin{i+1};
4440254                 varargin(i+1) = [];
4450255             <span class="keyword">end</span>
4460256         <span class="keyword">end</span>
4470257         varargin(i) = [];
4480258     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'NoArchive'</span>)
4490259         ArchiveFlag = 0;
4500260         varargin(i) = [];
4510261     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'NoDisplay'</span>)
4520262         DisplayFlag = 0;
4530263         InputFlags = [InputFlags varargin(i)];
4540264         varargin(i) = [];
4550265     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Display'</span>)
4560266         DisplayFlag = 1;
4570267         InputFlags = [InputFlags varargin(i)];
4580268         varargin(i) = [];
4590269
4600270     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'unipolar'</span>) || strcmpi(varargin{i},<span class="string">'oneway'</span>)
4610271         ModulationMethod = <span class="string">'unipolar'</span>;
4620272         LOCORespFlags.ResponseMatrixMeasurement = <span class="string">'oneway'</span>;
4630273         varargin(i) = [];
4640274     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'bipolar'</span>) || strcmpi(varargin{i},<span class="string">'bidirectional'</span>)
4650275         ModulationMethod = <span class="string">'bipolar'</span>;
4660276         LOCORespFlags.ResponseMatrixMeasurement = <span class="string">'bidirectional'</span>;
4670277         varargin(i) = [];
4680278
4690279     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'FixedPathLength'</span>)
4700280         LOCORespFlags.ClosedOrbitType = <span class="string">'FixedPathLength'</span>;
4710281         varargin(i) = [];
4720282     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'FixedMomentum'</span>)
4730283         LOCORespFlags.ClosedOrbitType = <span class="string">'FixedMomentum'</span>;
4740284         varargin(i) = [];
4750285     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Linear'</span>)
4760286         LOCORespFlags.ResponseMatrixCalculator = <span class="string">'Linear'</span>;
4770287         varargin(i) = [];
4780288     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'Full'</span>)
4790289         LOCORespFlags.ResponseMatrixCalculator = <span class="string">'Full'</span>;
4800290         varargin(i) = [];
4810291
4820292     <span class="keyword">elseif</span> strcmpi(varargin{i},<span class="string">'MinimumBeamCurrent'</span>)
4830293         DCCTFlag = [varargin(i) varargin(i+1)];
4840294         varargin(i+1) = [];
4850295         varargin(i)   = [];
4860296     <span class="keyword">end</span>
4870297 <span class="keyword">end</span>
4880298
4890299 <span class="comment">%%%%%%%%%%%%%%%%</span>
4900300 <span class="comment">% Parse Inputs %</span>
4910301 <span class="comment">%%%%%%%%%%%%%%%%</span>
4920302
4930303 <span class="comment">% Look for BPMx family info</span>
4940304 <span class="keyword">if</span> length(varargin) &gt;= 1
4950305     <span class="keyword">if</span> isstruct(varargin{1})
4960306         BPMxFamily = varargin{1}.FamilyName;
4970307         BPMxList = varargin{1}.DeviceList;
4980308
4990309         <span class="comment">% For structure inputs, units are determined by the first input</span>
5000310         <span class="keyword">if</span> isempty(UnitsFlag)
5010311             UnitsFlag = varargin{1}.Units;
5020312         <span class="keyword">end</span>
5030313
5040314         varargin(1) = [];
5050315         
5060316         <span class="comment">% Only change StructOutputFlag if 'Numeric' is not on the input line</span>
5070317         <span class="keyword">if</span> ~NumericOutputFlag
5080318             StructOutputFlag = 1;
5090319         <span class="keyword">end</span>
5100320     <span class="keyword">elseif</span> ischar(varargin{1})
5110321         BPMxFamily = varargin{1};
5120322         varargin(1) = [];
5130323         <span class="keyword">if</span> length(varargin) &gt;= 1
5140324             <span class="keyword">if</span> isnumeric(varargin{1})
5150325                 BPMxList = varargin{1};
5160326                 varargin(1) = [];
5170327             <span class="keyword">end</span>
5180328         <span class="keyword">end</span>
5190329     <span class="keyword">elseif</span> isnumeric(varargin{1})
5200330         BPMxList = varargin{1};
5210331         varargin(1) = [];
5220332     <span class="keyword">end</span>
5230333 <span class="keyword">end</span>
5240334 <span class="keyword">if</span> isempty(BPMxList)
5250335     BPMxList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(BPMxFamily, 1);
5260336 <span class="keyword">end</span>
5270337
5280338 <span class="comment">% Look for BPMy family info</span>
5290339 <span class="keyword">if</span> length(varargin) &gt;= 1
5300340     <span class="keyword">if</span> isstruct(varargin{1})
5310341         BPMyFamily = varargin{1}.FamilyName;
5320342         BPMyList = varargin{1}.DeviceList;
5330343         varargin(1) = [];
5340344         <span class="keyword">if</span> ~NumericOutputFlag
5350345             StructOutputFlag = 1; <span class="comment">% Only change StructOutputFlag if 'Numeric' is not on the input line</span>
5360346         <span class="keyword">end</span>
5370347     <span class="keyword">elseif</span> ischar(varargin{1})
5380348         BPMyFamily = varargin{1};
5390349         varargin(1) = [];
5400350         <span class="keyword">if</span> length(varargin) &gt;= 1
5410351             <span class="keyword">if</span> isnumeric(varargin{1})
5420352                 BPMyList = varargin{1};
5430353                 varargin(1) = [];
5440354             <span class="keyword">end</span>
5450355         <span class="keyword">end</span>
5460356     <span class="keyword">elseif</span> isnumeric(varargin{1})
5470357         BPMyList = varargin{1};
5480358         varargin(1) = [];
5490359     <span class="keyword">end</span>
5500360 <span class="keyword">end</span>
5510361 <span class="keyword">if</span> isempty(BPMyList)
5520362     BPMyList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(BPMyFamily, 1);
5530363 <span class="keyword">end</span>
5540364
5550365 <span class="comment">% Look for HCM family info</span>
5560366 <span class="keyword">if</span> length(varargin) &gt;= 1
5570367     <span class="keyword">if</span> isstruct(varargin{1})
5580368         HCMFamily = varargin{1}.FamilyName;
5590369         HCMList = varargin{1}.DeviceList;
5600370         varargin(1) = [];
5610371         <span class="keyword">if</span> ~NumericOutputFlag
5620372             StructOutputFlag = 1; <span class="comment">% Only change StructOutputFlag if 'Numeric' is not on the input line</span>
5630373         <span class="keyword">end</span>
5640374     <span class="keyword">elseif</span> ischar(varargin{1})
5650375         HCMFamily = varargin{1};
5660376         varargin(1) = [];
5670377         <span class="keyword">if</span> length(varargin) &gt;= 1
5680378             <span class="keyword">if</span> isnumeric(varargin{1})
5690379                 HCMList = varargin{1};
5700380                 varargin(1) = [];
5710381             <span class="keyword">end</span>
5720382         <span class="keyword">end</span>
5730383     <span class="keyword">elseif</span> isnumeric(varargin{1})
5740384         HCMList = varargin{1};
5750385         varargin(1) = [];
5760386     <span class="keyword">end</span>
5770387 <span class="keyword">end</span>
5780388 <span class="keyword">if</span> isempty(HCMList)
5790389     HCMList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(HCMFamily, 1);
5800390 <span class="keyword">end</span>
5810391
5820392 <span class="comment">% Look for VCM family info</span>
5830393 <span class="keyword">if</span> length(varargin) &gt;= 1
5840394     <span class="keyword">if</span> isstruct(varargin{1})
5850395         VCMFamily = varargin{1}.FamilyName;
5860396         VCMList = varargin{1}.DeviceList;
5870397         varargin(1) = [];
5880398         <span class="keyword">if</span> ~NumericOutputFlag
5890399             StructOutputFlag = 1; <span class="comment">% Only change StructOutputFlag if 'Numeric' is not on the input line</span>
5900400         <span class="keyword">end</span>
5910401     <span class="keyword">elseif</span> ischar(varargin{1})
5920402         VCMFamily = varargin{1};
5930403         varargin(1) = [];
5940404         <span class="keyword">if</span> length(varargin) &gt;= 1
5950405             <span class="keyword">if</span> isnumeric(varargin{1})
5960406                 VCMList = varargin{1};
5970407                 varargin(1) = [];
5980408             <span class="keyword">end</span>
5990409         <span class="keyword">end</span>
6000410     <span class="keyword">elseif</span> isnumeric(varargin{1})
6010411         VCMList = varargin{1};
6020412         varargin(1) = [];
6030413     <span class="keyword">end</span>
6040414 <span class="keyword">end</span>
6050415 <span class="keyword">if</span> isempty(VCMList)
6060416     VCMList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(VCMFamily, 1);
6070417 <span class="keyword">end</span>
6080418
6090419 <span class="comment">% Look for HCMKicks</span>
6100420 <span class="keyword">if</span> length(varargin) &gt;= 1
6110421     <span class="keyword">if</span> isempty(varargin{1})
6120422         <span class="comment">% Use default</span>
6130423         varargin(1) = [];
6140424     <span class="keyword">elseif</span> isnumeric(varargin{1})
6150425         HCMKicks = varargin{1};
6160426         varargin(1) = [];
6170427     <span class="keyword">end</span>
6180428 <span class="keyword">end</span>
6190429
6200430 <span class="comment">% Look for VCMKicks</span>
6210431 <span class="keyword">if</span> length(varargin) &gt;= 1
6220432     <span class="keyword">if</span> isempty(varargin{1})
6230433         <span class="comment">% Use default</span>
6240434         varargin(1) = [];
6250435     <span class="keyword">elseif</span> isnumeric(varargin{1})
6260436         VCMKicks = varargin{1};
6270437         varargin(1) = [];
6280438     <span class="keyword">end</span>
6290439 <span class="keyword">end</span>
6300440
6310441 <span class="comment">% ModulationMethod has already been searched for</span>
6320442 <span class="comment">% % Look for ModulationMethod</span>
6330443 <span class="comment">% if length(varargin) &gt;= 1</span>
6340444 <span class="comment">%     if isempty(varargin{1})</span>
6350445 <span class="comment">%         % Use default</span>
6360446 <span class="comment">%         varargin(1) = [];</span>
6370447 <span class="comment">%     end</span>
6380448 <span class="comment">%     if ischar(varargin{1})</span>
6390449 <span class="comment">%         ModulationMethod = varargin{1};</span>
6400450 <span class="comment">%         varargin(1) = [];</span>
6410451 <span class="comment">%     end</span>
6420452 <span class="comment">% end</span>
6430453 <span class="keyword">if</span> ~strcmpi(ModulationMethod, <span class="string">'unipolar'</span>) &amp;&amp; ~strcmpi(ModulationMethod, <span class="string">'bipolar'</span>)
6440454     error(<span class="string">'ModulationMethod must be ''unipolar'' or ''bipolar'''</span>);
6450455 <span class="keyword">end</span>
6460456
6470457
6480458 <span class="comment">% Look for WaitFlag</span>
6490459 <span class="keyword">if</span> length(varargin) &gt;= 1
6500460     <span class="keyword">if</span> isempty(varargin{1})
6510461         <span class="comment">% Use default</span>
6520462         varargin(1) = [];
6530463     <span class="keyword">end</span>
6540464     <span class="keyword">if</span> isnumeric(varargin{1})
6550465         WaitFlag = varargin{1};
6560466         varargin(1) = [];
6570467     <span class="keyword">end</span>
6580468 <span class="keyword">end</span>
6590469
6600470 <span class="comment">% FileName and DirectoryName</span>
6610471 <span class="keyword">if</span> length(varargin) &gt;= 1
6620472     <span class="keyword">if</span> isempty(varargin{1})
6630473         <span class="comment">% Use default</span>
6640474         FileName = <span class="string">''</span>;
6650475         varargin(1) = [];
6660476     <span class="keyword">end</span>
6670477     <span class="keyword">if</span> ischar(varargin{1})
6680478         FileName = varargin{1};
6690479         varargin(1) = [];
6700480     <span class="keyword">end</span>
6710481 <span class="keyword">end</span>
6720482 <span class="keyword">if</span> length(varargin) &gt;= 1
6730483     <span class="keyword">if</span> isempty(varargin{1})
6740484         <span class="comment">% Use default</span>
6750485         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>);
6760486         FileName = [DirectoryName, FileName];
6770487         varargin(1) = [];
6780488     <span class="keyword">elseif</span> ischar(varargin{1})
6790489         DirectoryName = varargin{1};
6800490         <span class="keyword">if</span> strcmp(DirectoryName, filesep)
6810491             FileName = [DirectoryName, FileName];
6820492         <span class="keyword">else</span>
6830493             FileName = [DirectoryName, filesep, FileName];
6840494         <span class="keyword">end</span>
6850495         varargin(1) = [];
6860496     <span class="keyword">end</span>
6870497 <span class="keyword">end</span>
6880498
6890499 <span class="comment">% Look for ExtraDelay</span>
6900500 <span class="keyword">if</span> length(varargin) &gt;= 1
6910501     <span class="keyword">if</span> isempty(varargin{1})
6920502         <span class="comment">% Use default</span>
6930503         varargin(1) = [];
6940504     <span class="keyword">end</span>
6950505     <span class="keyword">if</span> isnumeric(varargin{1})
6960506         ExtraDelay = varargin{1};
6970507         varargin(1) = [];
6980508     <span class="keyword">end</span>
6990509 <span class="keyword">end</span>
7000510
7010511 <span class="comment">% Check units</span>
7020512 <span class="keyword">if</span> isempty(UnitsFlag)
7030513     <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>))
7040514         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>);
7050515     <span class="keyword">else</span>
7060516         error(<span class="string">'Mixed Units for orbits'</span>);
7070517     <span class="keyword">end</span>
7080518 <span class="keyword">end</span>
7090519 <span class="keyword">if</span> isempty(UnitsFlag)
7100520     error(<span class="string">'Unknown Units'</span>);
7110521 <span class="keyword">end</span>
7120522
7130523 <span class="comment">% Check mode</span>
7140524 <span class="keyword">if</span> isempty(ModeFlag)
7150525     <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>))
7160526         <span class="comment">%ModeFlag = getfamilydata(BPMxFamily,'Monitor','Mode');</span>
7170527     <span class="keyword">else</span>
7180528         error(<span class="string">'Mixed Mode for orbits'</span>);
7190529     <span class="keyword">end</span>
7200530     <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>))
7210531         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>);
7220532     <span class="keyword">else</span>
7230533         error(<span class="string">'Mixed Mode for correctors'</span>);
7240534     <span class="keyword">end</span>
7250535 <span class="keyword">end</span>
7260536 <span class="keyword">if</span> isempty(ModeFlag)
7270537     error(<span class="string">'Unknown Mode'</span>);
7280538 <span class="keyword">end</span>
7290539 <span class="comment">% Input parsing complete</span>
7300540
7310541
7320542 <span class="comment">% Starting time</span>
7330543 TimeStart = gettime;
7340544
7350545
7360546 <span class="comment">% Change defaults for the model (note: simulator mode mimics online)</span>
7370547 <span class="keyword">if</span> strcmpi(ModeFlag,<span class="string">'Model'</span>)
7380548     <span class="comment">% Only archive data if ArchiveFlag==1 or FileName~=[]</span>
7390549     <span class="keyword">if</span> ischar(FileName) || ArchiveFlag == 1
7400550         ArchiveFlag = 1;   
7410551     <span class="keyword">else</span>
7420552         ArchiveFlag = 0;           
7430553     <span class="keyword">end</span>
7440554     
7450555     <span class="comment">% Only display is it was turned on at the command line</span>
7460556     <span class="keyword">if</span> DisplayFlag == 1
7470557         <span class="comment">% Keep DisplayFlag = 1</span>
7480558     <span class="keyword">else</span>
7490559         DisplayFlag = 0;
7500560     <span class="keyword">end</span>
7510561 <span class="keyword">else</span>
7520562     <span class="comment">% Online or Simulator: Archive unless ArchiveFlag was forced to zero</span>
7530563     <span class="keyword">if</span> ArchiveFlag ~= 0
7540564         ArchiveFlag = 1;
7550565         <span class="keyword">if</span> FileName == -1
7560566             FileName = <span class="string">''</span>;
7570567         <span class="keyword">end</span>
7580568     <span class="keyword">end</span>   
7590569 <span class="keyword">end</span>
7600570
7610571 <span class="comment">% % Print setup information</span>
7620572 <span class="comment">% if DisplayFlag</span>
7630573 <span class="comment">%     if ~strcmpi(ModeFlag,'Model')</span>
7640574 <span class="comment">%         fprintf('\n');</span>
7650575 <span class="comment">%         fprintf('   MEASBPMRESP measures the BPM response matrix for both HCM &amp; VCM corrector families.\n');</span>
7660576 <span class="comment">%         fprintf('   The storage ring lattice and hardware should be setup for accurate orbit measurements.\n');</span>
7670577 <span class="comment">%         fprintf('   Make sure the following information is correct:\n');</span>
7680578 <span class="comment">%         fprintf('   1.  Proper magnet lattice\n');</span>
7690579 <span class="comment">%         fprintf('   2.  Proper electron beam energy\n');</span>
7700580 <span class="comment">%         fprintf('   3.  Proper electron bunch pattern\n');</span>
7710581 <span class="comment">%         fprintf('   4.  BPMs are functioning properly (calibrated, sample rate, etc.)\n');</span>
7720582 <span class="comment">%         fprintf('   5.  Corrector magnets are working\n');</span>
7730583 <span class="comment">%         fprintf('   6.  The injection bump magnets off\n');</span>
7740584 <span class="comment">%         fprintf('   7.  Corrector Settle Time WaitFlag=%f, Extra BPM Delay=%f\n', WaitFlag, ExtraDelay);</span>
7750585 <span class="comment">%         fprintf('   9.  Modulation Method: %s\n', ModulationMethod);</span>
7760586 <span class="comment">%     end</span>
7770587 <span class="comment">% end</span>
7780588
7790589
7800590 <span class="keyword">if</span> ArchiveFlag
7810591     <span class="keyword">if</span> isempty(FileName)
7820592         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>));
7830593         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>);
7840594         <span class="keyword">if</span> isempty(DirectoryName)
7850595             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];
7860596         <span class="keyword">else</span>
7870597             <span class="comment">% Make sure default directory exists</span>
7880598             DirStart = pwd;
7890599             [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName);
7900600             cd(DirStart);
7910601         <span class="keyword">end</span>
7920602         [FileName, DirectoryName] = uiputfile(<span class="string">'*.mat'</span>, <span class="string">'Select a BPM Response File (&quot;Save&quot; starts measurement)'</span>, [DirectoryName FileName]);
7930603         drawnow;
7940604         <span class="keyword">if</span> FileName == 0
7950605             ArchiveFlag = 0;
7960606             disp(<span class="string">'   BPM response measurement canceled.'</span>);
7970607             Rmat = []; OutputFileName=<span class="string">''</span>;
7980608             <span class="keyword">return</span>
7990609         <span class="keyword">end</span>
8000610         FileName = [DirectoryName, FileName];
8010611     <span class="keyword">elseif</span> FileName == -1
8020612         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>));
8030613         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>);
8040614         <span class="keyword">if</span> isempty(DirectoryName)
8050615             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];
8060616         <span class="keyword">end</span>
8070617         FileName = [DirectoryName, FileName];
8080618     <span class="keyword">end</span>
8090619     
8100620     <span class="comment">% Acquire initial data</span>
8110621     MachineConfig = <a href="getmachineconfig.html" class="code" title="function [ConfigSetpoint, ConfigMonitor, FileName] = getmachineconfig(varargin)">getmachineconfig</a>(InputFlags{:});
8120622 <span class="keyword">end</span>
8130623
8140624
8150625 <span class="comment">% Get the response matrices</span>
8160626 <span class="keyword">if</span> strcmpi(ModeFlag,<span class="string">'Model'</span>)
8170627     <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
8180628     <span class="comment">% Model Response Matrix - Use LOCO Method %</span>
8190629     <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
8200630
8210631     <span class="comment">% Just to make sure the proper AT model is the currrent model, do a get on one of the correctors</span>
8220632     <span class="comment">% (This is needed because locoresponsematrix does not check the .AT.ATModel field)</span>
8230633     <span class="keyword">if</span> <a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(HCMFamily)
8240634         tmp = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(HCMFamily, HCMList);
8250635     <span class="keyword">end</span>
8260636
8270637
8280638     <span class="comment">% % Mask bpms and correctors for status</span>
8290639     <span class="comment">% BPMxStatus = getfamilydata(BPMxFamily,'Status', BPMxList);</span>
8300640     <span class="comment">% BPMxGoodIndex = find(BPMxStatus);</span>
8310641     <span class="comment">% BPMxList = BPMxList(BPMxGoodIndex,:);</span>
8320642     <span class="comment">%</span>
8330643     <span class="comment">% BPMyStatus = getfamilydata(BPMyFamily,'Status', BPMyList);</span>
8340644     <span class="comment">% BPMyGoodIndex = find(BPMyStatus);</span>
8350645     <span class="comment">% BPMyList = BPMyList(BPMyGoodIndex,:);</span>
8360646     <span class="comment">%</span>
8370647     <span class="comment">% HCMStatus = getfamilydata(HCMFamily,'Status', HCMList);</span>
8380648     <span class="comment">% HCMGoodIndex = find(HCMStatus);</span>
8390649     <span class="comment">% HCMList = HCMList(HCMGoodIndex,:);</span>
8400650     <span class="comment">% HCMKicks = HCMKicks(HCMGoodIndex);</span>
8410651     <span class="comment">%</span>
8420652     <span class="comment">% VCMStatus = getfamilydata(VCMFamily,'Status', VCMList);</span>
8430653     <span class="comment">% VCMGoodIndex = find(VCMStatus);</span>
8440654     <span class="comment">% VCMList = VCMList(VCMGoodIndex,:);</span>
8450655     <span class="comment">% VCMKicks = VCMKicks(VCMGoodIndex);</span>
8460656     
8470657     <span class="comment">% Use AT (LOCO method)</span>
8480658     
8490659     <span class="comment">% 1. AT MODEL</span>
8500660     <span class="keyword">global</span> THERING
8510661     <span class="comment">%setcavity off;</span>
8520662     RINGData.Lattice = THERING;
8530663     iCavity = findcells(THERING, <span class="string">'Frequency'</span>);
8540664     <span class="keyword">if</span> isempty(iCavity)
8550665         <span class="keyword">if</span> <a href="isstoragering.html" class="code" title="function Test = isstoragering">isstoragering</a>
8560666             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>);
8570667             RINGData.CavityHarmNumber = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'HarmonicNumber'</span>);
8580668         <span class="keyword">else</span>
8590669             RINGData.CavityFrequency  = [];
8600670             RINGData.CavityHarmNumber = [];
8610671         <span class="keyword">end</span>
8620672     <span class="keyword">else</span>
8630673         RINGData.CavityFrequency  = THERING{iCavity(1)}.Frequency;
8640674         RINGData.CavityHarmNumber = THERING{iCavity(1)}.HarmNumber;
8650675     <span class="keyword">end</span>
8660676     
8670677     
8680678     <span class="comment">% 2. BPM STRUCTURE</span>
8690679     <span class="comment">% FamName and BPMIndex tells the findorbitrespm function which BPMs are needed in the response matrix</span>
8700680     <span class="comment">% HBPMIndex/VBPMIndex is the sub-index of BPMIndex which correspond to the measured response matrix</span>
8710681     <span class="keyword">if</span> strcmpi(BPMxFamily,<span class="string">'All'</span>)
8720682         BPMxATIndex = 1:length(THERING);
8730683     <span class="keyword">elseif</span> <a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(BPMxFamily)
8740684         BPMxATIndex = family2atindex(BPMxFamily, BPMxList);
8750685     <span class="keyword">else</span>
8760686         BPMxATIndex = findcells(THERING, <span class="string">'FamName'</span>, BPMxFamily);
8770687     <span class="keyword">end</span>
8780688     <span class="keyword">if</span> isempty(BPMxATIndex)
8790689         error(sprintf(<span class="string">'BPMxFamily=%s could not be found in the AO or AT deck'</span>, BPMxFamily));
8800690     <span class="keyword">else</span>
8810691         BPMxATIndex = BPMxATIndex(:)';    <span class="comment">% Row vector</span>
8820692     <span class="keyword">end</span>
8830693     
8840694     <span class="keyword">if</span> strcmpi(BPMyFamily,<span class="string">'All'</span>)
8850695         BPMyATIndex = 1:length(THERING);
8860696     <span class="keyword">elseif</span> <a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(BPMyFamily)
8870697         BPMyATIndex = family2atindex(BPMyFamily, BPMyList);
8880698     <span class="keyword">else</span>
8890699         BPMyATIndex = findcells(THERING, <span class="string">'FamName'</span>, BPMyFamily);
8900700     <span class="keyword">end</span>
8910701     <span class="keyword">if</span> isempty(BPMyATIndex)
8920702         error(sprintf(<span class="string">'BPMyFamily=%s could not be found in the AO or AT deck'</span>, BPMyFamily));
8930703     <span class="keyword">else</span>
8940704         BPMyATIndex = BPMyATIndex(:)';    <span class="comment">% Row vector</span>
8950705     <span class="keyword">end</span>
8960706     
8970707     BPMData.BPMIndex = unique([BPMxATIndex BPMyATIndex]);
8980708     BPMData.HBPMIndex = findrowindex(BPMxATIndex', BPMData.BPMIndex');  <span class="comment">% Only used after locoresponsematrix is called</span>
8990709     BPMData.VBPMIndex = findrowindex(BPMyATIndex', BPMData.BPMIndex');  <span class="comment">% Only used after locoresponsematrix is called</span>
9000710         
9010711     
9020712     <span class="comment">% 3. CORRECTOR MAGNET STRUCTURE</span>
9030713     <span class="comment">% FamName and HCMIndex/VCMIndex tells the findorbitrespm function which corrector magnets are in the response matrix</span>
9040714     <span class="comment">% CMData.HCMKicks = starting value for the horizontal kicks in milliradian</span>
9050715     <span class="comment">% CMData.VCMKicks = starting value for the vertical   kicks in milliradian</span>
9060716     <span class="comment">% CMData.HCMCoupling = starting value for the horizontal coupling (default: zeros)</span>
9070717     <span class="comment">% CMData.VCMCoupling = starting value for the vertical   coupling (default: zeros)</span>
9080718     <span class="comment">% Note:  The kick strength should match the measured response matrix as best as possible</span>
9090719     <span class="comment">% Note:  The kicks and Coupling are used all the time (fit or not!)</span>
9100720     
9110721     <span class="comment">% Note the different units between AT and LOCO</span>
9120722     <span class="keyword">if</span> strcmpi(HCMFamily,<span class="string">'All'</span>)
9130723         ATIndex = 1:length(THERING);
9140724     <span class="keyword">elseif</span> <a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(HCMFamily)
9150725         ATIndex = family2atindex(HCMFamily, HCMList);
9160726     <span class="keyword">else</span>
9170727         ATIndex = findcells(THERING, <span class="string">'FamName'</span>, HCMFamily);
9180728     <span class="keyword">end</span>
9190729     <span class="keyword">if</span> isempty(ATIndex)
9200730         error(sprintf(<span class="string">'HCMFamily=%s could not be found in the middle layer or AT model'</span>, HCMFamily));
9210731     <span class="keyword">else</span>
9220732         ATIndex = ATIndex(:)';    <span class="comment">% Row vector</span>
9230733     <span class="keyword">end</span>
9240734     CMData.HCMIndex = ATIndex;
9250735     
9260736     <span class="keyword">if</span> strcmpi(VCMFamily,<span class="string">'All'</span>)
9270737         ATIndex = 1:length(THERING);
9280738     <span class="keyword">elseif</span> <a href="isfamily.html" class="code" title="function  [FamilyFlag, AO] = isfamily(Family, Field)">isfamily</a>(VCMFamily)
9290739         ATIndex = family2atindex(VCMFamily, VCMList);
9300740     <span class="keyword">else</span>
9310741         ATIndex = findcells(THERING, <span class="string">'FamName'</span>, VCMFamily);
9320742     <span class="keyword">end</span>
9330743     <span class="keyword">if</span> isempty(ATIndex)
9340744         error(sprintf(<span class="string">'VCMFamily=%s could not be found in the middle layer or AT model'</span>, VCMFamily));
9350745     <span class="keyword">else</span>
9360746         ATIndex = ATIndex(:)';    <span class="comment">% Row vector</span>
9370747     <span class="keyword">end</span>
9380748     CMData.VCMIndex = ATIndex;
9390749     
9400750     <span class="comment">% Kicks must be in Physics units</span>
9410751     
9420752     <span class="comment">% Default kicks</span>
9430753     <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>)
9440754         <span class="keyword">if</span> isempty(HCMKicks)
9450755             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);
9460756             <span class="keyword">if</span> isempty(HCMKicks)
9470757                 CMData.HCMKicks = Default2HCMKick;
9480758             <span class="keyword">else</span>
9490759                 <span class="comment">%if strcmpi(getfamilydata(HCMFamily, 'Setpoint', 'Units'), 'Hardware')</span>
9500760                     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>);
9510761                     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);
9520762                 <span class="comment">%else</span>
9530763                 <span class="comment">%    CMData.HCMKicks = HCMKicks;</span>
9540764                 <span class="comment">%end</span>
9550765             <span class="keyword">end</span>
9560766         <span class="keyword">else</span>
9570767             <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>)
9580768                 <span class="comment">% Change to AT units [radian]</span>
9590769                 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>);
9600770                 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);
9610771             <span class="keyword">else</span>
9620772                 CMData.HCMKicks = HCMKicks;
9630773             <span class="keyword">end</span>
9640774         <span class="keyword">end</span>
9650775     <span class="keyword">else</span>
9660776         <span class="comment">% Not a corrector magnet location</span>
9670777         <span class="keyword">if</span> isempty(HCMKicks)
9680778             CMData.HCMKicks = Default2HCMKick;
9690779         <span class="keyword">else</span>
9700780             <span class="comment">% The kick must be in physics units</span>
9710781             <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>)
9720782                 fprintf(<span class="string">'\n   You are using a non-corrector magnet actuator type and using hardware units.\n'</span>);
9730783                 fprintf(<span class="string">'   Unknown conversion method from hardware to physics.\n\n'</span>);
9740784                 fprintf(<span class="string">'   Change to a physics units input scheme.\n'</span>);
9750785                 error(<span class="string">'Hardware to physics conversion error'</span>);
9760786             <span class="keyword">else</span>
9770787                 CMData.HCMKicks = HCMKicks;   
9780788             <span class="keyword">end</span>
9790789         <span class="keyword">end</span>
9800790     <span class="keyword">end</span>
9810791     
9820792     <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>)
9830793         <span class="keyword">if</span> isempty(VCMKicks)
9840794             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);
9850795             <span class="keyword">if</span> isempty(VCMKicks)
9860796                 CMData.VCMKicks = Default2VCMKick;
9870797             <span class="keyword">else</span>
9880798                 <span class="comment">%if strcmpi(getfamilydata(VCMFamily, 'Setpoint', 'Units'), 'Hardware')</span>
9890799                     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>);
9900800                     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);
9910801                 <span class="comment">%else</span>
9920802                 <span class="comment">%    CMData.VCMKicks = VCMKicks;</span>
9930803                 <span class="comment">%end</span>
9940804             <span class="keyword">end</span>
9950805         <span class="keyword">else</span>
9960806             <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>)
9970807                 <span class="comment">% Change to AT units [radian]</span>
9980808                 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>);
9990809                 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);
10000810             <span class="keyword">else</span>
10010811                 CMData.VCMKicks = VCMKicks;
10020812             <span class="keyword">end</span>
10030813         <span class="keyword">end</span>
10040814     <span class="keyword">else</span>
10050815         <span class="comment">% Not a corrector magnet location</span>
10060816         <span class="keyword">if</span> isempty(VCMKicks)
10070817             CMData.VCMKicks = Default2VCMKick;
10080818         <span class="keyword">else</span>
10090819             <span class="comment">% The kick must be in physics units</span>
10100820             <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>)
10110821                 fprintf(<span class="string">'\n   You are using a non-corrector magnet actuator type and using hardware units.\n'</span>);
10120822                 fprintf(<span class="string">'   Unknown conversion method from hardware to physics!\n\n'</span>);
10130823                 fprintf(<span class="string">'   Change to a physics units input scheme.\n'</span>);
10140824                 error(<span class="string">'Hardware to physics conversion error'</span>);
10150825             <span class="keyword">else</span>
10160826                 CMData.VCMKicks = VCMKicks;   
10170827             <span class="keyword">end</span>
10180828         <span class="keyword">end</span>
10190829     <span class="keyword">end</span>
10200830     
10210831     CMData.HCMKicks = CMData.HCMKicks(:);
10220832     <span class="keyword">if</span> length(CMData.HCMKicks) == 1
10230833         CMData.HCMKicks = CMData.HCMKicks * ones(length(CMData.HCMIndex),1);
10240834     <span class="keyword">end</span>
10250835     CMData.VCMKicks = CMData.VCMKicks(:);
10260836     <span class="keyword">if</span> length(CMData.VCMKicks) == 1
10270837         CMData.VCMKicks = CMData.VCMKicks * ones(length(CMData.VCMIndex),1);
10280838     <span class="keyword">end</span>
10290839     
10300840     <span class="comment">% Corrector gain error have been taken into account by hw2physics</span>
10310841     <span class="comment">% If the model has corrector rolls, adjust the kicks now.</span>
10320842     
10330843     <span class="keyword">for</span> i = 1:length(CMData.HCMIndex)
10340844         <span class="keyword">if</span> isfield(THERING{CMData.HCMIndex(i)}, <span class="string">'Roll'</span>)           
10350845             Roll = THERING{CMData.HCMIndex(i)}.Roll;
10360846         <span class="keyword">else</span>
10370847             Roll = [0 0];  <span class="comment">% [Rollx Rolly]</span>
10380848         <span class="keyword">end</span>
10390849         HCMRoll(i,1) = Roll(1);
10400850     <span class="keyword">end</span>
10410851     <span class="comment">%HCMRoll = getroll(HCMFamily, HCMList);</span>
10420852     
10430853     <span class="keyword">for</span> i = 1:length(CMData.VCMIndex)
10440854         <span class="keyword">if</span> isfield(THERING{CMData.VCMIndex(i)}, <span class="string">'Roll'</span>)           
10450855             Roll = THERING{CMData.VCMIndex(i)}.Roll;
10460856         <span class="keyword">else</span>
10470857             Roll = [0 0];  <span class="comment">% [Rollx Rolly]</span>
10480858         <span class="keyword">end</span>
10490859         VCMRoll(i,1) = Roll(2);
10500860     <span class="keyword">end</span>
10510861     <span class="comment">%VCMRoll = getroll(VCMFamily, VCMList);</span>
10520862
10530863     <span class="comment">% The kicks need to be adjusted for roll (model coordinates)</span>
10540864     HCMKicks = CMData.HCMKicks;
10550865     VCMKicks = CMData.VCMKicks;
10560866     CMData.HCMKicks = CMData.HCMKicks .* cos(HCMRoll);
10570867     CMData.VCMKicks = CMData.VCMKicks .* cos(VCMRoll);
10580868     
10590869     
10600870     <span class="comment">% Coupling term (convert from ML to LOCO coordinates)</span>
10610871     <span class="comment">% The ./cos term is needed because LOCO coupling is scaling the unrolled kick</span>
10620872     CMData.HCMCoupling =  sin(HCMRoll) ./ cos(HCMRoll);
10630873     CMData.VCMCoupling = -sin(VCMRoll) ./ cos(VCMRoll);
10640874     
10650875
10660876     <span class="comment">% Generate a response matrix ('FixedPathLength' or 'FixedMomentum', 'Linear' or 'Full')</span>
10670877     <span class="comment">% Flags is empty then the locoresponsematrix defaults are used (which was fix path length, linear the last time I checked)</span>
10680878     R0 = locoresponsematrix(RINGData, BPMData, CMData, LOCORespFlags);
10690879
10700880     
10710881     <span class="comment">% Coupling correction</span>
10720882     <span class="comment">% Convert the ML gain/rolls to LOCO gain/coupling</span>
10730883     <span class="comment">% for i = 1:length(BPMData.BPMIndex)</span>
10740884     <span class="comment">%     if isfield(THERING{BPMData.BPMIndex(i)}, 'GCR')</span>
10750885     <span class="comment">%         GCR = THERING{BPMData.BPMIndex(i)}.GCR;</span>
10760886     <span class="comment">%     else</span>
10770887     <span class="comment">%         GCR = [1 1 0 0];  % [Gx Gy Crunch Roll]</span>
10780888     <span class="comment">%     end</span>
10790889     <span class="comment">%</span>
10800890     <span class="comment">%     M = gcr2loco(GCR(1), GCR(2), GCR(3), GCR(4));</span>
10810891     <span class="comment">%     BPMxGainLOCO(i,1)     = M(1,1);</span>
10820892     <span class="comment">%     BPMxCouplingLOCO(i,1) = M(1,2);</span>
10830893     <span class="comment">%     BPMyGainLOCO(i,1)     = M(2,2);</span>
10840894     <span class="comment">%     BPMyCouplingLOCO(i,1) = M(2,1);</span>
10850895     <span class="comment">% end</span>
10860896     <span class="comment">%</span>
10870897     <span class="comment">%</span>
10880898     <span class="comment">% % Build a rotation matrix</span>
10890899     <span class="comment">% C = [diag(BPMxGainLOCO)      diag(BPMxCouplingLOCO)</span>
10900900     <span class="comment">%      diag(BPMyCouplingLOCO)  diag(BPMyGainLOCO)];</span>
10910901
10920902     
10930903     <span class="comment">% BPM coupling correction (only roll, crunch correction, gain is done in physics2hw (via real2raw))</span>
10940904     <span class="comment">% Still in physics units, just rotate and crunch.</span>
10950905     NBPM = length(BPMData.BPMIndex);
10960906     <span class="keyword">for</span> i = 1:NBPM
10970907         <span class="keyword">if</span> isfield(THERING{BPMData.BPMIndex(i)}, <span class="string">'GCR'</span>)           
10980908             GCR = THERING{BPMData.BPMIndex(i)}.GCR;
10990909         <span class="keyword">else</span>
11000910             GCR = [1 1 0 0];  <span class="comment">% [Gx Gy Crunch Roll]</span>
11010911         <span class="keyword">end</span>
11020912         <span class="comment">%Gx = GCR(1);  % Not used</span>
11030913         <span class="comment">%Gy = GCR(2);  % Not used</span>
11040914         Crunch = GCR(3);
11050915         Roll = GCR(4);
11060916         
11070917         a(i,1) = ( Crunch * sin(Roll) + cos(Roll)) / sqrt(1 - Crunch^2);
11080918         b(i,1) = (-Crunch * cos(Roll) + sin(Roll)) / sqrt(1 - Crunch^2);
11090919         c(i,1) = (-Crunch * cos(Roll) - sin(Roll)) / sqrt(1 - Crunch^2);
11100920         d(i,1) = (-Crunch * sin(Roll) + cos(Roll)) / sqrt(1 - Crunch^2);
11110921
11120922         <span class="comment">% Same as:</span>
11130923         <span class="comment">%%m = gcr2loco(GCR(1), GCR(2), GCR(3), GCR(4));</span>
11140924         <span class="comment">%m = gcr2loco(1, 1, GCR(3), GCR(4));</span>
11150925         <span class="comment">%a(i,1)= m(1,1);</span>
11160926         <span class="comment">%b(i,1)= m(1,2);</span>
11170927         <span class="comment">%c(i,1)= m(2,1);</span>
11180928         <span class="comment">%d(i,1)= m(2,2);</span>
11190929     <span class="keyword">end</span>
11200930   
11210931     <span class="comment">% Build a rotation matrix</span>
11220932     C = [diag(a)  diag(b)
11230933          diag(c)  diag(d)];
11240934
11250935     <span class="comment">% Rotate &amp; crunch the AT model response matrix</span>
11260936     R0 = C * R0;
11270937     
11280938
11290939     <span class="comment">% Split up R0 into an array</span>
11300940     Rmat(1,1).Data = R0(                         BPMData.HBPMIndex , 1:length(CMData.HCMIndex));
11310941     Rmat(2,1).Data = R0(length(BPMData.BPMIndex)+BPMData.VBPMIndex , 1:length(CMData.HCMIndex));
11320942     Rmat(1,2).Data = R0(                         BPMData.HBPMIndex , length(CMData.HCMIndex)+(1:length(CMData.VCMIndex)));
11330943     Rmat(2,2).Data = R0(length(BPMData.BPMIndex)+BPMData.VBPMIndex , length(CMData.HCMIndex)+(1:length(CMData.VCMIndex)));
11340944     
11350945     
11360946     <span class="comment">% Convert to meters/radian (don't use the rolled kick strength)</span>
11370947     <span class="keyword">for</span> i = 1:length(CMData.HCMKicks)
11380948         Rmat(1,1).Data(:,i) = Rmat(1,1).Data(:,i) / HCMKicks(i);
11390949         Rmat(2,1).Data(:,i) = Rmat(2,1).Data(:,i) / HCMKicks(i);
11400950     <span class="keyword">end</span>
11410951     
11420952     <span class="keyword">for</span> i = 1:length(CMData.VCMKicks)
11430953         Rmat(1,2).Data(:,i) = Rmat(1,2).Data(:,i) / VCMKicks(i);
11440954         Rmat(2,2).Data(:,i) = Rmat(2,2).Data(:,i) / VCMKicks(i);
11450955     <span class="keyword">end</span>
11460956     
11470957     
11480958     <span class="comment">% Build the rest of the response matrix structure in 'Physics' units</span>
11490959     
11500960     <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>) &amp;&amp; <a href="ismemberof.html" class="code" title="function  [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(BPMyFamily,<span class="string">'BPM'</span>)
11510961         <span class="comment">% getpvmodel is better because crunch and roll are included</span>
11520962         Xat = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(BPMxFamily, BPMxList, <span class="string">'Physics'</span>);
11530963         Yat = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(BPMyFamily, BPMyList, <span class="string">'Physics'</span>);
11540964     <span class="keyword">else</span>
11550965         <span class="comment">% The orbit does not have to be at the BPMs so use modeltwiss</span>
11560966         [Xat, Yat, Sx, Sy] = modeltwiss(<span class="string">'ClosedOrbit'</span>, BPMxFamily, BPMxList, BPMyFamily, BPMyList);
11570967     <span class="keyword">end</span>
11580968     X.Data = Xat(:);
11590969     Y.Data = Yat(:);
11600970     X.FamilyName = BPMxFamily;
11610971     Y.FamilyName = BPMyFamily;
11620972     X.Field = <span class="string">'Monitor'</span>;
11630973     Y.Field = <span class="string">'Monitor'</span>;
11640974     X.DeviceList = BPMxList;
11650975     Y.DeviceList = BPMyList;
11660976     X.Status = ones(length(Xat),1);
11670977     Y.Status = ones(length(Yat),1);
11680978     X.Mode = <span class="string">'Model'</span>;
11690979     Y.Mode = <span class="string">'Model'</span>;
11700980     X.t = 0;
11710981     Y.t = 0;
11720982     X.tout = 0;
11730983     Y.tout = 0;
11740984     X.TimeStamp = clock;
11750985     Y.TimeStamp = X.TimeStamp;
11760986     X.Units = <span class="string">'Physics'</span>;
11770987     Y.Units = <span class="string">'Physics'</span>;
11780988     X.UnitsString = <span class="string">'m'</span>;
11790989     Y.UnitsString = <span class="string">'m'</span>;
11800990     X.DataDescriptor = <span class="string">'Horizontal Orbit'</span>;
11810991     Y.DataDescriptor = <span class="string">'Vertical Orbit'</span>;
11820992     X.CreatedBy = <span class="string">'getpv'</span>;
11830993     Y.CreatedBy = <span class="string">'getpv'</span>;
11840994     
11850995     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>);
11860996     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>);
11870997     Rmat(1,1).Monitor = X;
11880998     Rmat(1,1).Actuator = HCMsp;
11890999     Rmat(1,2).Monitor = X;
11901000     Rmat(1,2).Actuator = VCMsp;
11911001     Rmat(2,1).Monitor = Y;
11921002     Rmat(2,1).Actuator = HCMsp;
11931003     Rmat(2,2).Monitor = Y;
11941004     Rmat(2,2).Actuator = VCMsp;
11951005     
11961006     Rmat(1,1).ActuatorDelta = HCMKicks;  <span class="comment">%CMData.HCMKicks;</span>
11971007     Rmat(2,1).ActuatorDelta = HCMKicks;  <span class="comment">%CMData.HCMKicks;</span>
11981008     Rmat(1,2).ActuatorDelta = VCMKicks;  <span class="comment">%CMData.VCMKicks;</span>
11991009     Rmat(2,2).ActuatorDelta = VCMKicks;  <span class="comment">%CMData.VCMKicks;</span>
12001010     
12011011     <span class="keyword">for</span> i = 1:2
12021012         <span class="keyword">for</span> j = 1:2
12031013             Rmat(i,j).GeV = getenergymodel;
12041014             Rmat(i,j).TimeStamp = X.TimeStamp;
12051015             Rmat(i,j).DCCT = [];
12061016             Rmat(i,j).ModulationMethod = ModulationMethod;
12071017             Rmat(i,j).WaitFlag = WaitFlag;
12081018             Rmat(i,j).ExtraDelay = ExtraDelay;
12091019             Rmat(i,j).Units = <span class="string">'Physics'</span>;
12101020             Rmat(i,j).UnitsString = [Rmat(1,1).Monitor.UnitsString, <span class="string">'/'</span>, Rmat(1,1).Actuator.UnitsString];
12111021             Rmat(i,j).DataDescriptor = <span class="string">'Response Matrix'</span>;
12121022             Rmat(i,j).CreatedBy = <span class="string">'measbpmresp'</span>;
12131023             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>);
12141024         <span class="keyword">end</span>
12151025     <span class="keyword">end</span>
12161026             
12171027     <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>)
12181028         <span class="comment">% Change to hardware units [mm/amp]</span>
12191029         <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>) &amp;&amp; <a href="ismemberof.html" class="code" title="function  [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(BPMyFamily,<span class="string">'BPM'</span>) &amp;&amp; <a href="ismemberof.html" class="code" title="function  [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(HCMFamily,<span class="string">'COR'</span>) &amp;&amp; <a href="ismemberof.html" class="code" title="function  [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(VCMFamily,<span class="string">'COR'</span>)
12201030             Rmat = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(Rmat, getenergymodel);
12211031         <span class="keyword">else</span>
12221032             fprintf(<span class="string">'\n   You are asking for hardware units, but a nonstandard monitor and/or\n'</span>);
12231033             fprintf(<span class="string">'   actuator was used.  The response matrix will stay in physics units!\n\n'</span>);
12241034         <span class="keyword">end</span>
12251035     <span class="keyword">end</span>
12261036
12271037 <span class="keyword">else</span>
12281038     
12291039     <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
12301040     <span class="comment">% Online or Simulated Response Matrix %</span>
12311041     <span class="comment">%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</span>
12321042     
12331043     <span class="comment">% Default kicks</span>
12341044     <span class="keyword">if</span> isempty(HCMKicks)
12351045         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);
12361046         KickUnits = <span class="string">'Hardware'</span>; <span class="comment">%getfamilydata(HCMFamily, 'Setpoint', 'Units');</span>
12371047         <span class="keyword">if</span> isempty(HCMKicks)
12381048             HCMKicks = Default2HCMKick;
12391049             KickUnits = <span class="string">'Physics'</span>;
12401050         <span class="keyword">end</span>
12411051         <span class="keyword">if</span> isempty(KickUnits)
12421052             error(<span class="string">'Units for the kick strength are unknown.  Try inputing units directly.'</span>);
12431053         <span class="keyword">end</span>
12441054         <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Physics'</span>) &amp;&amp; strcmpi(KickUnits, <span class="string">'Hardware'</span>)
12451055             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>);
12461056             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);
12471057         <span class="keyword">elseif</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) &amp;&amp; strcmpi(KickUnits, <span class="string">'Physics'</span>)
12481058             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>);
12491059             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);
12501060         <span class="keyword">end</span>
12511061     <span class="keyword">end</span>
12521062     <span class="keyword">if</span> isempty(VCMKicks)
12531063         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);
12541064         KickUnits = <span class="string">'Hardware'</span>; <span class="comment">%getfamilydata(VCMFamily, 'Setpoint', 'Units');</span>
12551065         <span class="keyword">if</span> isempty(VCMKicks)
12561066             VCMKicks = Default2VCMKick;
12571067             KickUnits = <span class="string">'Physics'</span>;
12581068         <span class="keyword">end</span>
12591069         <span class="keyword">if</span> isempty(KickUnits)
12601070             error(<span class="string">'Units for the kick strength are unknown.  Try inputing units directly.'</span>);
12611071         <span class="keyword">end</span>
12621072         <span class="keyword">if</span> strcmpi(UnitsFlag, <span class="string">'Physics'</span>) &amp;&amp; strcmpi(KickUnits, <span class="string">'Hardware'</span>)
12631073             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>);
12641074             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);
12651075         <span class="keyword">elseif</span> strcmpi(UnitsFlag, <span class="string">'Hardware'</span>) &amp;&amp; strcmpi(KickUnits, <span class="string">'Physics'</span>)
12661076             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>);
12671077             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);
12681078         <span class="keyword">end</span>
12691079     <span class="keyword">end</span>
12701080     
12711081     <span class="comment">%% Query to begin measurement</span>
12721082     <span class="comment">%if DisplayFlag</span>
12731083     <span class="comment">%    tmp = questdlg('Begin response matrix measurement?','Response Matrix Measurement','Yes','No','No');</span>
12741084     <span class="comment">%    if strcmpi(tmp,'No')</span>
12751085     <span class="comment">%        fprintf('   Response matrix measurement aborted\n');</span>
12761086     <span class="comment">%        Rmat = [];</span>
12771087     <span class="comment">%        return</span>
12781088     <span class="comment">%    end</span>
12791089     <span class="comment">%end</span>
12801090     
12811091     <span class="comment">% Mask bpms and correctors for status</span>
12821092     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);
12831093     BPMxGoodIndex = find(BPMxStatus);
12841094     BPMxList = BPMxList(BPMxGoodIndex,:);
12851095     
12861096     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);
12871097     BPMyGoodIndex = find(BPMyStatus);
12881098     BPMyList = BPMyList(BPMyGoodIndex,:);
12891099     
12901100     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);
12911101     HCMGoodIndex = find(HCMStatus);
12921102     HCMList = HCMList(HCMGoodIndex,:);
12931103     <span class="keyword">if</span> length(HCMKicks) == 1
12941104         HCMKicks = HCMKicks * ones(length(HCMGoodIndex),1);
12951105     <span class="keyword">else</span>
12961106         HCMKicks = HCMKicks(HCMGoodIndex);
12971107     <span class="keyword">end</span>
12981108
12991109     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);
13001110     VCMGoodIndex = find(VCMStatus);
13011111     VCMList = VCMList(VCMGoodIndex,:);
13021112     <span class="keyword">if</span> length(VCMKicks) == 1
13031113         VCMKicks = VCMKicks * ones(length(VCMGoodIndex),1);
13041114     <span class="keyword">else</span>
13051115         VCMKicks = VCMKicks(VCMGoodIndex);
13061116     <span class="keyword">end</span>
13071117     
13081118     <span class="comment">% Measure response matrix of all planes at once</span>
13091119     <span class="comment">% (One advantage of this is the limits of all planes get checked before the measurement starts)</span>
13101120     <span class="keyword">if</span> DisplayFlag
13111121         fprintf(<span class="string">'   Begin BPM response matrix measurement\n'</span>);
13121122     <span class="keyword">end</span>
13131123     
13141124     <span class="comment">%if strcmpi(getfamilydata('Machine'), 'ALS')</span>
13151125     <span class="comment">%    fprintf('   Using measrespmat_als (with orbit correction)\n');</span>
13161126     <span class="comment">%    Rcell = measrespmat_als({BPMxFamily,BPMyFamily}, {BPMxList,BPMyList}, {HCMFamily,VCMFamily}, {HCMList,VCMList}, {HCMKicks,VCMKicks}, 'Struct', ModulationMethod, WaitFlag, ExtraDelay, InputFlags{:}, DCCTFlag{:});</span>
13171127     <span class="comment">%else</span>
13181128         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{:});
13191129     <span class="comment">%end</span>
13201130     <span class="keyword">if</span> DisplayFlag
13211131         fprintf(<span class="string">'   Measurement complete.\n\n'</span>);
13221132     <span class="keyword">end</span>
13231133
13241134     <span class="comment">% Convert cell array to a struct array</span>
13251135     <span class="comment">% (We only did this because struct arrays were more familiar to people)</span>
13261136     <span class="comment">% Rmat(1,1) = Rcell{1,1};  % Kick x, look x</span>
13271137     <span class="comment">% Rmat(2,1) = Rcell{2,1};  % Kick x, look y</span>
13281138     <span class="comment">% Rmat(2,2) = Rcell{2,2};  % Kick y, look y</span>
13291139     <span class="comment">% Rmat(1,2) = Rcell{1,2};  % Kick y, look x</span>
13301140     <span class="keyword">for</span> i = 1:size(Rcell,1)
13311141         <span class="keyword">for</span> j = 1:size(Rcell,2)
13321142             <span class="keyword">if</span> <a href="istransport.html" class="code" title="function Test = istransport">istransport</a>
13331143                 <span class="comment">% For transport line zero the BPM noise for upstream BPMs</span>
13341144                 <span class="keyword">for</span> k = 1:size(Rcell{i,j}.Data,2)
13351145                     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,:));
13361146                     BPMpos = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(Rcell{i,j}.Monitor);
13371147                     iUpStream = find(BPMpos &lt; CMpos);
13381148                     <span class="keyword">if</span> ~isempty(iUpStream)
13391149                         Rcell{i,j}.Data(iUpStream,k) = 0;
13401150                     <span class="keyword">end</span>
13411151                 <span class="keyword">end</span>
13421152             <span class="keyword">end</span>
13431153             Rmat(i,j) = Rcell{i,j};
13441154         <span class="keyword">end</span>
13451155     <span class="keyword">end</span>
13461156     
13471157     
13481158     <span class="comment">% % Horizontal corrector plane</span>
13491159     <span class="comment">% if DisplayFlag</span>
13501160     <span class="comment">%     fprintf('   Begin Horizontal plane measurement ...\n');</span>
13511161     <span class="comment">% end</span>
13521162     <span class="comment">% mat = measrespmat('Struct', {BPMxFamily, BPMyFamily}, {BPMxList, BPMyList}, HCMFamily, HCMList, HCMKicks, ModulationMethod, WaitFlag, ExtraDelay, InputFlags{:});</span>
13531163     <span class="comment">% if DisplayFlag</span>
13541164     <span class="comment">%     fprintf('   Horizontal plane complete.\n\n');</span>
13551165     <span class="comment">% end</span>
13561166     <span class="comment">%</span>
13571167     <span class="comment">% % Make a response matrix array</span>
13581168     <span class="comment">% Rmat(1,1) = mat{1};  % Kick x, look x</span>
13591169     <span class="comment">% Rmat(2,1) = mat{2};  % Kick x, look y</span>
13601170     <span class="comment">%</span>
13611171     <span class="comment">%</span>
13621172     <span class="comment">% % Vertical corrector plane</span>
13631173     <span class="comment">% if DisplayFlag</span>
13641174     <span class="comment">%     fprintf('   Begin Vertical plane measurement...\n');</span>
13651175     <span class="comment">% end</span>
13661176     <span class="comment">% mat = measrespmat('Struct', {BPMxFamily, BPMyFamily}, {BPMxList, BPMyList}, VCMFamily, VCMList, VCMKicks, ModulationMethod, WaitFlag, ExtraDelay, InputFlags{:});</span>
13671177     <span class="comment">% if DisplayFlag</span>
13681178     <span class="comment">%     fprintf('   Vertical plane complete.\n\n');</span>
13691179     <span class="comment">% end</span>
13701180     <span class="comment">%</span>
13711181     <span class="comment">% Rmat(2,2) = mat{2};  % Kick y, look y</span>
13721182     <span class="comment">% Rmat(1,2) = mat{1};  % Kick y, look x</span>
13731183 <span class="keyword">end</span>
13741184
13751185 <span class="comment">% Save data in the proper directory</span>
13761186 <span class="keyword">if</span> ArchiveFlag || ischar(FileName)
13771187     [DirectoryName, FileName, Ext] = fileparts(FileName);
13781188     DirStart = pwd;
13791189     [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName);
13801190     <span class="keyword">if</span> ErrorFlag
13811191         fprintf(<span class="string">'\n   There was a problem getting to the proper directory!\n\n'</span>);
13821192     <span class="keyword">end</span>
13831193     save(FileName, <span class="string">'Rmat'</span>,<span class="string">'MachineConfig'</span>);
13841194     cd(DirStart);
13851195     OutputFileName = [DirectoryName, FileName, <span class="string">'.mat'</span>];
13861196     
13871197     <span class="keyword">if</span> DisplayFlag
13881198         fprintf(<span class="string">'   BPM response matrix data structure ''Rmat'' saved to disk\n'</span>);
13891199         fprintf(<span class="string">'   Filename: %s\n'</span>, OutputFileName);
13901200         fprintf(<span class="string">'   The total response matrix measurement time was %.2f minutes.\n'</span>, (gettime-TimeStart)/60);
13911201     <span class="keyword">end</span>
13921202 <span class="keyword">else</span>
13931203     OutputFileName = <span class="string">''</span>;
13941204 <span class="keyword">end</span>
13951205
13961206
13971207 <span class="keyword">if</span> ~StructOutputFlag
13981208     <span class="comment">% Return a matrix</span>
13991209     <span class="comment">% Rmat = [Rmat(1,1).Data Rmat(1,2).Data;</span>
14001210     <span class="comment">%         Rmat(2,1).Data Rmat(2,2).Data];</span>
14011211     RmatData = [];
14021212     <span class="keyword">for</span> i = 1:size(Rmat,1)
14031213         Rrow = [];
14041214         <span class="keyword">for</span> j = 1:size(Rmat,2)
14051215             Rrow = [Rrow Rmat(i,j).Data];
14061216         <span class="keyword">end</span>
14071217         RmatData = [RmatData; Rrow];
14081218     <span class="keyword">end</span>
14091219     
14101220     Rmat = RmatData;
14111221 <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> &copy; 2003</address>
1413</body>
1414</html>
Note: See TracBrowser for help on using the repository browser.