source: MML/trunk/mml/doc_html/mml/at/setlocodata.html @ 4

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

Initial import--MML version from SOLEIL@2013

File size: 31.2 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 setlocodata</title>
6  <meta name="keywords" content="setlocodata">
7  <meta name="description" content="SETLOCODATA - Applies the LOCO calibration data to both the middle layer & the accelerator">
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; <a href="index.html">at</a> &gt; setlocodata.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/at&nbsp;<img alt=">" border="0" src="../../right.png"></a></td></tr></table>-->
19
20<h1>setlocodata
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>SETLOCODATA - Applies the LOCO calibration data to both the middle layer & the accelerator</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 setlocodata(CommandInput, FileName) </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">SETLOCODATA - Applies the LOCO calibration data to both the middle layer &amp; the accelerator
31  setlocodata(CommandInput, FileName)
32
33  INPUTS
34  1. CommandInput
35     'Nominal'    - Sets nominal gains (1) / rolls (0) to the model.
36     'SetGains'   - Set gains/coupling from a LOCO file.
37     'Symmetrize' - Symmetry correction of the lattice based on a LOCO file.
38     'CorrectCoupling' - Coupling correction of the lattice based on a LOCO file.
39     'SetModel'   - Set the model from a LOCO file.  But it only changes
40                    the part of the model that does not get corrected
41                    in 'Symmetrize' (also does a SetGains).
42     'LOCO2Model' - Set the model from a LOCO file (also does a 'SetGains').
43                    This sets all lattice machines fit in the LOCO run to the model.
44     'EtaWave'    - Set a dispersion wave.
45  2. FileName - LOCO file name {Default: getfamilydata('OpsData', 'LOCOFile')}
46                '' to browse for a file
47
48  NOTES
49  How one uses this function depends on how LOCO was setup.
50  1. Use setlocodata('Nominal') if no model calibration information is known.
51  2. The most typical situation is to apply:
52         setlocodata('Symmetrize') to the accelerator
53         setlocodata('SetModel')   to the middle layer (usually done in setoperationalmode)
54  3. If a LOCO run was done on the present lattice with no changes made to lattice
55     after LOCO run, then setting all the LOCO fits to the model makes sense.
56         setlocodata('LOCO2Model')
57  4. This function obviously has machine dependent parts.
58
59  Written by Greg Portmann</pre></div>
60
61<!-- crossreference -->
62<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../../up.png"></a></h2>
63This function calls:
64<ul style="list-style-image:url(../../matlabicon.gif)">
65<li><a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a> SETATFIELD - Returns the contents of an AT model field</li><li><a href="setlocodata.html" class="code" title="function setlocodata(CommandInput, FileName)">setlocodata</a>     SETLOCODATA - Applies the LOCO calibration data to both the middle layer & the accelerator</li></ul>
66This function is called by:
67<ul style="list-style-image:url(../../matlabicon.gif)">
68<li><a href="setlocodata.html" class="code" title="function setlocodata(CommandInput, FileName)">setlocodata</a>        SETLOCODATA - Applies the LOCO calibration data to both the middle layer & the accelerator</li></ul>
69<!-- crossreference -->
70
71
72<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../../up.png"></a></h2>
73<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function setlocodata(CommandInput, FileName)</a>
740002 <span class="comment">%SETLOCODATA - Applies the LOCO calibration data to both the middle layer &amp; the accelerator</span>
750003 <span class="comment">%  setlocodata(CommandInput, FileName)</span>
760004 <span class="comment">%</span>
770005 <span class="comment">%  INPUTS</span>
780006 <span class="comment">%  1. CommandInput</span>
790007 <span class="comment">%     'Nominal'    - Sets nominal gains (1) / rolls (0) to the model.</span>
800008 <span class="comment">%     'SetGains'   - Set gains/coupling from a LOCO file.</span>
810009 <span class="comment">%     'Symmetrize' - Symmetry correction of the lattice based on a LOCO file.</span>
820010 <span class="comment">%     'CorrectCoupling' - Coupling correction of the lattice based on a LOCO file.</span>
830011 <span class="comment">%     'SetModel'   - Set the model from a LOCO file.  But it only changes</span>
840012 <span class="comment">%                    the part of the model that does not get corrected</span>
850013 <span class="comment">%                    in 'Symmetrize' (also does a SetGains).</span>
860014 <span class="comment">%     'LOCO2Model' - Set the model from a LOCO file (also does a 'SetGains').</span>
870015 <span class="comment">%                    This sets all lattice machines fit in the LOCO run to the model.</span>
880016 <span class="comment">%     'EtaWave'    - Set a dispersion wave.</span>
890017 <span class="comment">%  2. FileName - LOCO file name {Default: getfamilydata('OpsData', 'LOCOFile')}</span>
900018 <span class="comment">%                '' to browse for a file</span>
910019 <span class="comment">%</span>
920020 <span class="comment">%  NOTES</span>
930021 <span class="comment">%  How one uses this function depends on how LOCO was setup.</span>
940022 <span class="comment">%  1. Use setlocodata('Nominal') if no model calibration information is known.</span>
950023 <span class="comment">%  2. The most typical situation is to apply:</span>
960024 <span class="comment">%         setlocodata('Symmetrize') to the accelerator</span>
970025 <span class="comment">%         setlocodata('SetModel')   to the middle layer (usually done in setoperationalmode)</span>
980026 <span class="comment">%  3. If a LOCO run was done on the present lattice with no changes made to lattice</span>
990027 <span class="comment">%     after LOCO run, then setting all the LOCO fits to the model makes sense.</span>
1000028 <span class="comment">%         setlocodata('LOCO2Model')</span>
1010029 <span class="comment">%  4. This function obviously has machine dependent parts.</span>
1020030 <span class="comment">%</span>
1030031 <span class="comment">%  Written by Greg Portmann</span>
1040032
1050033
1060034 <span class="keyword">global</span> THERING
1070035
1080036 <span class="keyword">if</span> nargin &lt; 1
1090037     <span class="comment">%CommandInput = 'Default';</span>
1100038     ModeCell = {<span class="string">'Nominal - Set Gain=1 &amp; Rolls=0 in the model'</span>, <span class="string">'SetGains - Set gains/rolls from a LOCO file'</span>,<span class="string">'Symmetrize - Symmetry correction of the lattice'</span>, <span class="string">'CorrectCoupling - Coupling correction of the lattice'</span>, <span class="string">'SetModel - Set the model from a LOCO file'</span>,<span class="string">'LOCO2Model - Set the model from a LOCO file (also does a SetGains)'</span>, <span class="string">'see &quot;help setlocodata&quot; for more details'</span>};
1110039     [ModeNumber, OKFlag] = listdlg(<span class="string">'Name'</span>,<span class="string">'Soleil'</span>,<span class="string">'PromptString'</span>, <span class="keyword">...</span>
1120040         <span class="string">'Select the proper set LOCO data command:'</span>, <span class="keyword">...</span>
1130041         <span class="string">'SelectionMode'</span>,<span class="string">'single'</span>, <span class="string">'ListString'</span>, ModeCell, <span class="string">'ListSize'</span>, [500 200]);
1140042     <span class="keyword">if</span> OKFlag ~= 1
1150043         fprintf(<span class="string">'   setlocodata cancelled\n'</span>);
1160044         <span class="keyword">return</span>
1170045     <span class="keyword">end</span>
1180046     <span class="keyword">if</span> ModeNumber == 1
1190047         CommandInput = <span class="string">'Nominal'</span>;
1200048     <span class="keyword">elseif</span> ModeNumber == 2
1210049         CommandInput = <span class="string">'SetGains'</span>;
1220050     <span class="keyword">elseif</span> ModeNumber == 3
1230051         CommandInput = <span class="string">'Symmetrize'</span>;
1240052     <span class="keyword">elseif</span> ModeNumber == 4
1250053         CommandInput = <span class="string">'CorrectCoupling'</span>;
1260054     <span class="keyword">elseif</span> ModeNumber == 5
1270055         CommandInput = <span class="string">'SetModel'</span>;
1280056     <span class="keyword">elseif</span> ModeNumber == 6
1290057         CommandInput = <span class="string">'LOCO2Model'</span>;
1300058     <span class="keyword">elseif</span> ModeNumber == 7
1310059         help <a href="setlocodata.html" class="code" title="function setlocodata(CommandInput, FileName)">setlocodata</a>;
1320060         <span class="keyword">return</span>
1330061     <span class="keyword">end</span>
1340062 <span class="keyword">end</span>
1350063
1360064
1370065 <span class="keyword">if</span> nargin &lt; 2
1380066     <span class="comment">% Default (Golden) LOCO file</span>
1390067     <span class="comment">% If empty, the user will be prompted if needed.</span>
1400068     FileName = getfamilydata(<span class="string">'OpsData'</span>,<span class="string">'LOCOFile'</span>);
1410069 <span class="keyword">end</span>
1420070
1430071
1440072 <span class="comment">% Device list</span>
1450073 BPMxDeviceList = family2dev(<span class="string">'BPMx'</span>);
1460074 BPMxDeviceListTotal = family2dev(<span class="string">'BPMx'</span>,0);
1470075
1480076 BPMzDeviceList = family2dev(<span class="string">'BPMz'</span>);
1490077 BPMzDeviceListTotal = family2dev(<span class="string">'BPMz'</span>,0);
1500078
1510079 HCORDeviceList = family2dev(<span class="string">'HCOR'</span>);
1520080 HCORDeviceListTotal = family2dev(<span class="string">'HCOR'</span>,0);
1530081 VCORDeviceList = family2dev(<span class="string">'VCOR'</span>);
1540082 VCORDeviceListTotal = family2dev(<span class="string">'VCOR'</span>,0);
1550083
1560084
1570085 <span class="keyword">if</span> any(strcmpi(CommandInput, <span class="string">'Nominal'</span>))
1580086     fprintf(<span class="string">'   Using nominal BPM and corrector Gain=1 and Roll=0\n'</span>);
1590087
1600088     <span class="comment">% To speed things up, put Gains/Rolls/etc in the AO</span>
1610089     AO = getao;
1620090
1630091     <span class="comment">% Zero or one the gains and rolls</span>
1640092     AO.BPMx.Gain = ones(size(BPMxDeviceListTotal,1),1);
1650093     AO.BPMz.Gain = ones(size(BPMzDeviceListTotal,1),1);
1660094     AO.BPMx.Roll = zeros(size(BPMxDeviceListTotal,1),1);
1670095     AO.BPMz.Roll = zeros(size(BPMzDeviceListTotal,1),1);
1680096     AO.BPMx.Crunch = zeros(size(BPMxDeviceListTotal,1),1);
1690097     AO.BPMz.Crunch = zeros(size(BPMzDeviceListTotal,1),1);
1700098
1710099     AO.HCOR.Gain = ones(size(HCORDeviceListTotal,1),1);
1720100     AO.VCOR.Gain = ones(size(VCORDeviceListTotal,1),1);
1730101     AO.HCOR.Roll = zeros(size(HCORDeviceListTotal,1),1);
1740102     AO.VCOR.Roll = zeros(size(VCORDeviceListTotal,1),1);
1750103
1760104
1770105     <span class="comment">% Set the roll, crunch to the AT model to be used by getpvmodel, setpvmodel, etc</span>
1780106     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(<span class="string">'BPMx'</span>, <span class="string">'GCR'</span>, [AO.BPMx.Gain AO.BPMz.Gain AO.BPMx.Crunch AO.BPMx.Roll], BPMxDeviceListTotal);
1790107
1800108     <span class="comment">% Set the gains to the AT model to be used by getpvmodel, setpvmodel, etc</span>
1810109     <span class="comment">% Make sure the Roll field is 1x2 even for single plane correctors</span>
1820110
1830111     <span class="comment">% First set the cross planes to zero</span>
1840112     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(<span class="string">'HCOR'</span>, <span class="string">'Roll'</span>, 0*AO.HCOR.Roll, HCORDeviceListTotal, 1, 2);
1850113     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(<span class="string">'VCOR'</span>, <span class="string">'Roll'</span>, 0*AO.VCOR.Roll, VCORDeviceListTotal, 1, 1);
1860114
1870115     <span class="comment">% Then set the roll field</span>
1880116     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(<span class="string">'HCOR'</span>, <span class="string">'Roll'</span>, AO.HCOR.Roll, HCORDeviceListTotal, 1, 1);
1890117     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(<span class="string">'VCOR'</span>, <span class="string">'Roll'</span>, AO.VCOR.Roll, VCORDeviceListTotal, 1, 2);
1900118
1910119     setao(AO);
1920120
1930121
1940122 <span class="keyword">elseif</span> any(strcmpi(CommandInput, <span class="string">'SetGains'</span>))
1950123
1960124     <span class="keyword">if</span> isempty(FileName) || strcmp(FileName, <span class="string">'.'</span>)
1970125         <span class="keyword">if</span> isempty(FileName)
1980126             [FileName, DirectoryName] = uigetfile(<span class="string">'*.mat'</span>, <span class="string">'LOCO Output File Name?'</span>, [getfamilydata(<span class="string">'Directory'</span>,<span class="string">'DataRoot'</span>), <span class="string">'LOCO'</span>, filesep]);
1990127         <span class="keyword">else</span>
2000128             [FileName, DirectoryName] = uigetfile(<span class="string">'*.mat'</span>, <span class="string">'LOCO Output File Name?'</span>);
2010129         <span class="keyword">end</span>
2020130         drawnow;
2030131         <span class="keyword">if</span> isequal(FileName,0) || isequal(DirectoryName,0)
2040132             fprintf(<span class="string">'   setlocodata canceled\n'</span>);
2050133             <span class="keyword">return</span>
2060134         <span class="keyword">end</span>
2070135         FileName = [DirectoryName FileName];
2080136     <span class="keyword">end</span>
2090137
2100138     <span class="comment">% Set the model gains</span>
2110139     <a href="setlocodata.html" class="code" title="function setlocodata(CommandInput, FileName)">setlocodata</a>(<span class="string">'Nominal'</span>);
2120140
2130141     AO = getao;
2140142
2150143     <span class="comment">% Load the LOCO data</span>
2160144     fprintf(<span class="string">'   Setting BPM and corrector gains and rolls based on %s.\n'</span>, FileName);
2170145     load(FileName);
2180146
2190147
2200148     <span class="comment">% Get the device list from the LOCO file</span>
2210149     <span class="keyword">try</span>
2220150         BPMxDeviceList = LocoMeasData.HBPM.DeviceList;
2230151         BPMzDeviceList = LocoMeasData.VBPM.DeviceList;
2240152         HCORDeviceList  = LocoMeasData.HCOR.DeviceList;
2250153         VCORDeviceList  = LocoMeasData.VCOR.DeviceList;
2260154     <span class="keyword">catch</span>
2270155         <span class="comment">% Legacy</span>
2280156         BPMxDeviceList = LocoMeasData.(BPMxFamily).DeviceList;
2290157         BPMzDeviceList = LocoMeasData.(BPMzFamily).DeviceList;
2300158         HCORDeviceList  = LocoMeasData.(HCORFamily).DeviceList;
2310159         VCORDeviceList  = LocoMeasData.(VCORFamily).DeviceList;
2320160     <span class="keyword">end</span>
2330161
2340162
2350163     <span class="comment">% Change to Gain, Roll, Crunch system (Need to add a logic for single view BPMs???)</span>
2360164     i = findrowindex(BPMxDeviceList, BPMxDeviceListTotal);
2370165     <span class="keyword">for</span> j = 1:length(BPMData(end).HBPMGain)
2380166         MLOCO = [BPMData(end).HBPMGain(j)     BPMData(end).HBPMCoupling(j)
2390167             BPMData(end).VBPMCoupling(j) BPMData(end).VBPMGain(j) ];
2400168
2410169         [AO.(BPMxFamily).Gain(i(j),:), AO.(BPMzFamily).Gain(i(j),:), AO.(BPMxFamily).Crunch(i(j),:), AO.(BPMxFamily).Roll(i(j),:)] = loco2gcr(MLOCO);
2420170     <span class="keyword">end</span>
2430171     AO.(BPMzFamily).Roll   = AO.(BPMxFamily).Roll;
2440172     AO.(BPMzFamily).Crunch = AO.(BPMxFamily).Crunch;
2450173
2460174     <span class="keyword">if</span> ~isreal(AO.(BPMxFamily).Gain)
2470175         error(<span class="string">'Horizontal BPM gain is complex.'</span>);
2480176     <span class="keyword">end</span>
2490177     <span class="keyword">if</span> ~isreal(AO.(BPMzFamily).Gain)
2500178         error(<span class="string">'Vertical BPM gain is complex.'</span>);
2510179     <span class="keyword">end</span>
2520180     <span class="keyword">if</span> ~isreal(AO.(BPMxFamily).Crunch)
2530181         error(<span class="string">'BPM Crunch is complex.'</span>);
2540182     <span class="keyword">end</span>
2550183     <span class="keyword">if</span> ~isreal(AO.(BPMxFamily).Roll)
2560184         error(<span class="string">'BPM roll is complex.'</span>);
2570185     <span class="keyword">end</span>
2580186
2590187
2600188
2610189     <span class="comment">%%%%%%%%%%%%%%</span>
2620190     <span class="comment">% Correctors %</span>
2630191     <span class="comment">%%%%%%%%%%%%%%</span>
2640192
2650193     <span class="comment">% Kick strength (LOCO is in milliradian)</span>
2660194     <span class="comment">% LOCO is run with the original gain in hw2physics (stored in LocoMeasData.VCORGain/LocoMeasData.HCORGain).</span>
2670195     <span class="comment">% The new gain must combine the new CM gain and the one used in buildlocoinput.</span>
2680196     <span class="comment">% hw2physics:  Rad = G * amps   (original)</span>
2690197     <span class="comment">% LOCO gain:   Gloco = KickNew/KickStart</span>
2700198     <span class="comment">% New hw2physics gain: Gloco * G</span>
2710199
2720200     <span class="comment">% HCOR</span>
2730201     i = findrowindex(HCORDeviceList, HCORDeviceListTotal);
2740202
2750203     HCORGainOldLOCO  = LocoMeasData.HCORGain .* cos(LocoMeasData.HCORRoll);
2760204     HCORGainLOCO     = HCORGainOldLOCO .* CMData(end).HCORKicks ./ CMData(1).HCORKicks;
2770205     HCORCouplingLOCO = HCORGainLOCO .* CMData(end).HCORCoupling;
2780206
2790207     <span class="comment">%AO.(HCORFamily).Roll(i) = atan2(-HCORCouplingLOCO, HCORGainLOCO);</span>
2800208     AO.(HCORFamily).Roll(i) = atan(HCORCouplingLOCO ./ abs(HCORGainLOCO));
2810209     AO.(HCORFamily).Gain(i) = sign(HCORGainLOCO) .* sqrt(HCORCouplingLOCO.^2 + HCORGainLOCO.^2);
2820210
2830211
2840212     <span class="comment">% VCOR</span>
2850213     i = findrowindex(VCORDeviceList, VCORDeviceListTotal);
2860214
2870215     VCORGainOldLOCO  = LocoMeasData.VCORGain .* cos(LocoMeasData.VCORRoll);
2880216     VCORGainLOCO     = VCORGainOldLOCO .* CMData(end).VCORKicks ./ CMData(1).VCORKicks;
2890217     VCORCouplingLOCO = VCORGainLOCO .* CMData(end).VCORCoupling;
2900218
2910219     <span class="comment">%AO.(VCORFamily).Roll(i) = atan2(-VCORCouplingLOCO, VCORGainLOCO);</span>
2920220     AO.(VCORFamily).Roll(i) = atan(-VCORCouplingLOCO ./ abs(VCORGainLOCO));
2930221     AO.(VCORFamily).Gain(i) = sign(VCORGainLOCO) .* sqrt(VCORCouplingLOCO.^2 + VCORGainLOCO.^2);
2940222
2950223
2960224     <span class="comment">% Set the roll, crunch to the AT model to be used by getpvmodel, setpvmodel, etc</span>
2970225     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(BPMxFamily, <span class="string">'GCR'</span>, [AO.(BPMxFamily).Gain AO.(BPMzFamily).Gain AO.(BPMxFamily).Crunch AO.(BPMxFamily).Roll], BPMxDeviceListTotal);
2980226
2990227     <span class="comment">% Set the gains to the AT model to be used by getpvmodel, setpvmodel, etc</span>
3000228     <span class="comment">% Make sure the Roll field is 1x2 even for single plane correctors</span>
3010229
3020230     <span class="comment">% First set the cross planes to zero</span>
3030231     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(HCORFamily, <span class="string">'Roll'</span>, 0*AO.(HCORFamily).Roll, HCORDeviceListTotal, 1, 2);
3040232     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(VCORFamily, <span class="string">'Roll'</span>, 0*AO.(VCORFamily).Roll, VCORDeviceListTotal, 1, 1);
3050233
3060234     <span class="comment">% Then set the roll field</span>
3070235     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(HCORFamily, <span class="string">'Roll'</span>, AO.(HCORFamily).Roll, HCORDeviceListTotal, 1, 1);
3080236     <a href="setatfield.html" class="code" title="function ATIndexList = family2atfield(Family, Field, Value, varargin)">setatfield</a>(VCORFamily, <span class="string">'Roll'</span>, AO.(VCORFamily).Roll, VCORDeviceListTotal, 1, 2);
3090237
3100238
3110239     <span class="comment">% If other magnet fits were done (like roll), it should be add to the AT model as well</span>
3120240
3130241     setao(AO);
3140242
3150243
3160244 <span class="keyword">elseif</span> any(strcmpi(CommandInput, <span class="string">'SetModel'</span>))
3170245
3180246     error(<span class="string">'   Function not complete.  Look at the ALS setlocodata for an example.'</span>);
3190247
3200248 <span class="keyword">elseif</span> any(strcmpi(CommandInput, <span class="string">'SetMachine'</span>))
3210249
3220250     <span class="keyword">if</span> isempty(FileName) || strcmp(FileName, <span class="string">'.'</span>)
3230251         <span class="keyword">if</span> isempty(FileName)
3240252             [FileName, DirectoryName] = uigetfile(<span class="string">'*.mat'</span>, <span class="string">'LOCO Output File Name?'</span>, [getfamilydata(<span class="string">'Directory'</span>,<span class="string">'DataRoot'</span>), <span class="string">'LOCO'</span>, filesep]);
3250253         <span class="keyword">else</span>
3260254             [FileName, DirectoryName] = uigetfile(<span class="string">'*.mat'</span>, <span class="string">'LOCO Output File Name?'</span>);
3270255         <span class="keyword">end</span>
3280256         drawnow;
3290257         <span class="keyword">if</span> isequal(FileName,0) || isequal(DirectoryName,0)
3300258             fprintf(<span class="string">'   setlocodata canceled\n'</span>);
3310259             <span class="keyword">return</span>
3320260         <span class="keyword">end</span>
3330261         FileName = [DirectoryName FileName];
3340262     <span class="keyword">end</span>
3350263
3360264     <span class="comment">% Load the LOCO data</span>
3370265     load(FileName);
3380266
3390267
3400268     
3410269     error(<span class="string">'You need to edit here with your parameter setting program!'</span>)
3420270     
3430271     le = length(FitParameters);
3440272     
3450273     QFscale(1:6) = FitParameters(1).Values(1)/FitParameters(le).Values(1);
3460274     QFscale(7:28) = FitParameters(1).Values(2:23)./FitParameters(le).Values(2:23);
3470275     QDscale(1:6) = FitParameters(1).Values(24)/FitParameters(le).Values(24);
3480276     QDscale(7:28) = FitParameters(1).Values(25:46)./FitParameters(le).Values(25:46);
3490277     QFCscale = FitParameters(1).Values(47)/FitParameters(le).Values(47);
3500278     QDXscale = FitParameters(1).Values(48)/FitParameters(le).Values(48);
3510279     QFXscale = FitParameters(1).Values(49)/FitParameters(le).Values(49);
3520280     QDYscale = FitParameters(1).Values(50)/FitParameters(le).Values(50);
3530281     QFYscale = FitParameters(1).Values(51)/FitParameters(le).Values(51);
3540282     QDZscale = FitParameters(1).Values(52)/FitParameters(le).Values(52);
3550283     QFZscale = FitParameters(1).Values(53)/FitParameters(le).Values(53);
3560284
3570285     QFnew  = QFscale'.*getsp(<span class="string">'QF'</span>);  <span class="comment">% I would base it on the LOCO data setpoint!!!</span>
3580286     QDnew  = QDscale'.*getsp(<span class="string">'QD'</span>);
3590287     QFCnew = QFCscale*getsp(<span class="string">'QFC'</span>);
3600288     QDXnew = QDXscale*getsp(<span class="string">'QDX'</span>);
3610289     QFXnew = QFXscale*getsp(<span class="string">'QFX'</span>);
3620290     QDYnew = QDYscale*getsp(<span class="string">'QDY'</span>);
3630291     QFYnew = QFYscale*getsp(<span class="string">'QFY'</span>);
3640292     QDZnew = QDZscale*getsp(<span class="string">'QDZ'</span>);
3650293     QFZnew = QFZscale*getsp(<span class="string">'QFZ'</span>);
3660294
3670295
3680296     setsp(<span class="string">'QF'</span>, QFnew);
3690297     setsp(<span class="string">'QD'</span>, QDnew);
3700298     setsp(<span class="string">'QFC'</span>, QFCnew);
3710299
3720300     setsp(<span class="string">'QFX'</span>, QFXnew);
3730301     setsp(<span class="string">'QFY'</span>, QFYnew);
3740302     setsp(<span class="string">'QFZ'</span>, QFZnew);
3750303
3760304     setsp(<span class="string">'QDX'</span>, QDXnew);
3770305     setsp(<span class="string">'QDY'</span>, QDYnew);
3780306     setsp(<span class="string">'QDZ'</span>, QDZnew);
3790307
3800308
3810309 <span class="keyword">elseif</span> any(strcmpi(CommandInput, <span class="string">'CorrectCoupling'</span>))
3820310
3830311     <span class="keyword">if</span> isempty(FileName) || strcmp(FileName, <span class="string">'.'</span>)
3840312         <span class="keyword">if</span> isempty(FileName)
3850313             [FileName, DirectoryName] = uigetfile(<span class="string">'*.mat'</span>, <span class="string">'LOCO Output File Name?'</span>, [getfamilydata(<span class="string">'Directory'</span>,<span class="string">'DataRoot'</span>), <span class="string">'LOCO'</span>, filesep]);
3860314         <span class="keyword">else</span>
3870315             [FileName, DirectoryName] = uigetfile(<span class="string">'*.mat'</span>, <span class="string">'LOCO Output File Name?'</span>);
3880316         <span class="keyword">end</span>
3890317         drawnow;
3900318         <span class="keyword">if</span> isequal(FileName,0) || isequal(DirectoryName,0)
3910319             fprintf(<span class="string">'   setlocodata canceled\n'</span>);
3920320             <span class="keyword">return</span>
3930321         <span class="keyword">end</span>
3940322         FileName = [DirectoryName FileName];
3950323     <span class="keyword">end</span>
3960324
3970325     
3980326     <span class="comment">% Load the LOCO data</span>
3990327     load(FileName);
4000328
4010329     NQT = size(family2dev(<span class="string">'QT'</span>),1);
4020330     fprintf(<span class="string">'   Correcting the coupling based on LOCO file %s.\n'</span>, FileName);
4030331     fprintf(<span class="string">'   It is assumed that the QT are in FitParameters.Values(end-%d:end)\n'</span>, NQT-1);
4040332
4050333     QT = FitParameters(end).Values(end-(NQT-1):end);
4060334
4070335     <span class="comment">% Starting point for the skew quadrupoles when LOCO data was measured</span>
4080336     MachineConfig = LocoMeasData.MachineConfig;
4090337     setpv(MachineConfig.QT.Setpoint);
4100338
4110339     QThw = physics2hw(<span class="string">'QT'</span>, <span class="string">'Setpoint'</span>, -QT);
4120340
4130341     <span class="comment">% Maximum setpoint check</span>
4140342     <span class="keyword">if</span> any(abs(MachineConfig.QT.Setpoint.Data+QThw)&gt;maxsp(<span class="string">'QT'</span>))
4150343         error(<span class="string">'At least one of the QT would go beyond it''s limit ... aborting coupling correction'</span>);
4160344     <span class="keyword">end</span>
4170345
4180346     <span class="comment">% Make the setpoint change</span>
4190347     stepsp(<span class="string">'QT'</span>, QThw);
4200348
4210349     <span class="comment">% Keep the change?</span>
4220350     CorrectFlag = questdlg(<span class="string">'Keep the new skew quadrupole setpoints or return to the old values?'</span>,<span class="string">'SETLOCOGAINS(''CorrectCoupling'')'</span>,<span class="string">'Keep this lattice'</span>,<span class="string">'Restore Old Lattice'</span>,<span class="string">'Keep this lattice'</span>);
4230351     <span class="keyword">if</span> strcmpi(CorrectFlag, <span class="string">'Restore Old Lattice'</span>) || isempty(CorrectFlag)
4240352         fprintf(<span class="string">'   Changing the skew quadrupole magnets back to the original setpoints.\n'</span>);
4250353         stepsp(<span class="string">'QT'</span>, QThw);
4260354     <span class="keyword">end</span>
4270355
4280356
4290357 <span class="keyword">elseif</span> any(strcmpi(CommandInput, <span class="string">'LOCO2Model'</span>))
4300358
4310359     <span class="comment">% LOCO is usually used to correct the model.  If the LOCO fit parameters are</span>
4320360     <span class="comment">% not applied to the accelerator, then the entire model needs to be updated.</span>
4330361     <span class="comment">% Ie, the machine lattice file is the same as it was when the LOCO data was</span>
4340362     <span class="comment">% taken, then put the LOCO output settings in the model.</span>
4350363
4360364     <span class="keyword">if</span> isempty(FileName) || strcmp(FileName, <span class="string">'.'</span>)
4370365         <span class="keyword">if</span> isempty(FileName)
4380366             [FileName, DirectoryName] = uigetfile(<span class="string">'*.mat'</span>, <span class="string">'LOCO Output File Name?'</span>, [getfamilydata(<span class="string">'Directory'</span>,<span class="string">'DataRoot'</span>), <span class="string">'LOCO'</span>, filesep]);
4390367         <span class="keyword">else</span>
4400368             [FileName, DirectoryName] = uigetfile(<span class="string">'*.mat'</span>, <span class="string">'LOCO Output File Name?'</span>);
4410369         <span class="keyword">end</span>
4420370         drawnow;
4430371         <span class="keyword">if</span> isequal(FileName,0) || isequal(DirectoryName,0)
4440372             fprintf(<span class="string">'   setlocodata canceled\n'</span>);
4450373             <span class="keyword">return</span>
4460374         <span class="keyword">end</span>
4470375         FileName = [DirectoryName FileName];
4480376     <span class="keyword">end</span>
4490377
4500378
4510379     <span class="comment">% Load the LOCO data</span>
4520380     load(FileName);
4530381
4540382
4550383     <span class="comment">% Use loco file for the lattice and the fit parameter</span>
4560384     <span class="comment">% Using everything in the loco lattice may not be what you want!</span>
4570385     <span class="keyword">global</span> THERING
4580386     <span class="comment">%RINGData.Lattice = THERING;</span>
4590387     <span class="keyword">for</span> i = 1:length(FitParameters(end).Params)
4600388         RINGData = locosetlatticeparam(RINGData, FitParameters(end).Params{i}, FitParameters(end).Values(i));
4610389     <span class="keyword">end</span>
4620390     THERING = RINGData.Lattice;
4630391
4640392
4650393     <span class="comment">% Since the lattice may have changed</span>
4660394     <span class="comment">%updateatindex;</span>
4670395
4680396
4690397     <span class="comment">% Set the model gains (this added GCR field to lattice)</span>
4700398     <a href="setlocodata.html" class="code" title="function setlocodata(CommandInput, FileName)">setlocodata</a>(<span class="string">'SetGains'</span>, FileName);
4710399
4720400 <span class="keyword">else</span>
4730401
4740402     error(<span class="string">'   '</span>);
4750403
4760404 <span class="keyword">end</span></pre></div>
477<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>
478</body>
479</html>
Note: See TracBrowser for help on using the repository browser.