source: MML/trunk/mml/doc_html/mml/measidfftable.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: 39.8 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 measidfftable</title>
6  <meta name="keywords" content="measidfftable">
7  <meta name="description" content="FFGETTBL - Measures an insertion device feed forward table for the vertical gap">
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; measidfftable.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>measidfftable
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>FFGETTBL - Measures an insertion device feed forward table for the vertical gap</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 ffgettbl(Sector, BPMFlag) </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">FFGETTBL - Measures an insertion device feed forward table for the vertical gap
31  ffgettbl(Sector, BPMFlag (0=Bergoz BPMs, else=All BPMs))
32
33  This function generates the feed forward tables necessary for insertion device compensation.
34
35  This function is under development</pre></div>
36
37<!-- crossreference -->
38<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
39This function calls:
40<ul style="list-style-image:url(../matlabicon.gif)">
41<li><a href="dev2elem.html" class="code" title="function Output = dev2elem(Family, DevList)">dev2elem</a>       DEV2ELEM - Converts an element list to a device list</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="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>    GETENERGY - Returns the beam energy base on the bend magnet</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="getproductionlattice.html" class="code" title="function [ConfigSetpoint, ConfigMonitor, FileName] = getproductionlattice(varargin)">getproductionlattice</a> GETPRODUCTIONLATTICE - Read the Golden lattice from file GoldenLattice</li><li><a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>   GETPV - Returns a variable from the online system or the model</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="gettuneresp.html" class="code" title="function [TuneMatrix, FileName] = gettuneresp(varargin)">gettuneresp</a>   GETTUNERESP - Loads the tune response vector (or matrix) for multiple quadrupole families</li><li><a href="measidfftable.html" class="code" title="function ffgettbl(Sector, BPMFlag)">measidfftable</a>        FFGETTBL - Measures an insertion device feed forward table for the vertical gap</li><li><a href="plotidfftable.html" class="code" title="function FigureHandles = plotidfftable(Sector, GeV)">plotidfftable</a> PLOTIDFFTABLE - Plots various information about the feed forward tables</li><li><a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>        SETPV - Setpoint change of the online system or model</li><li><a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>  SETSP - Makes an absolute setpoint change to the 'Setpoint' field</li></ul>
42This function is called by:
43<ul style="list-style-image:url(../matlabicon.gif)">
44<li><a href="measidfftable.html" class="code" title="function ffgettbl(Sector, BPMFlag)">measidfftable</a>      FFGETTBL - Measures an insertion device feed forward table for the vertical gap</li></ul>
45<!-- crossreference -->
46
47
48<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
49<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function ffgettbl(Sector, BPMFlag)</a>
500002 <span class="comment">%FFGETTBL - Measures an insertion device feed forward table for the vertical gap</span>
510003 <span class="comment">%  ffgettbl(Sector, BPMFlag (0=Bergoz BPMs, else=All BPMs))</span>
520004 <span class="comment">%</span>
530005 <span class="comment">%  This function generates the feed forward tables necessary for insertion device compensation.</span>
540006 <span class="comment">%</span>
550007 <span class="comment">%  This function is under development</span>
560008
570009
580010 <span class="comment">% 2002-04-05    T.Scarvie</span>
590011 <span class="comment">%         modified to perform a tune FF correction after each move and prior to each orbit correction</span>
600012 <span class="comment">%               to produce FF tables that are more accurate while running orbit FB</span>
610013 <span class="comment">%</span>
620014 <span class="comment">% 2003-04-25   C. Steier</span>
630015 <span class="comment">%        IDBPMs in sectors 1 and 3 are not used anymore since they are noisy at low beam current</span>
640016 <span class="comment">%        and therefore compromise the FF tables.</span>
650017 <span class="comment">%</span>
660018 <span class="comment">% 2004-07-06    T.Scarvie</span>
670019 <span class="comment">%         made tune FF correction active for 5W as well as other gaps because 5W FF table no longer</span>
680020 <span class="comment">%        includes quadrupoles - all tune FF is handled by orbit feedback</span>
690021 <span class="comment">%</span>
700022 <span class="comment">% 2004-10-18 T. Scarvie</span>
710023 <span class="comment">%      removed quad generation option from routine - tune compensation is handled by orbit feedback algorithm now</span>
720024 <span class="comment">%</span>
730025 <span class="comment">% 2005-02-06 G. Portmann</span>
740026 <span class="comment">%            Upgrate to new middlelayer format</span>
750027 <span class="comment">%     To do: 1. Slow/fast correctors?</span>
760028 <span class="comment">%            2. Use FF channels?</span>
770029 <span class="comment">%            3. Use center chicane BPMs and correctors?</span>
780030
790031
800032 <span class="comment">% Initialization</span>
810033
820034 <span class="comment">% Need to change this to a question dialog to allow for local tune compensation; hard-coded for now - 2004-07-06, T.Scarvie</span>
830035 FFTypeFlag = <span class="string">'Global'</span>;
840036
850037 <span class="keyword">if</span> nargin &lt; 2
860038    BPMFlag = [];
870039 <span class="keyword">end</span>
880040 <span class="keyword">if</span> isempty(BPMFlag)
890041    BPMFlag = 0;  <span class="comment">% menu1('Which BPM family to use for table generation?','96 arc sector BPMs only.','Straight section IDBPMs only.','Exit program.');</span>
900042 <span class="keyword">end</span>
910043
920044
930045
940046 IDFF.GapVelocity = 3.33;
950047 IDFF.GeV = <a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>;
960048
970049
980050 disp([<span class="string">' '</span>]); disp(<span class="string">' '</span>);
990051 disp([<span class="string">'        INSERTION DEVICE FEED FORWARD TABLE GENERATION APPLICATION'</span>]);
1000052 disp([<span class="string">' '</span>]);
1010053 disp([<span class="string">'   This program will generate a feed forward table at '</span>,num2str(IDFF.GeV), <span class="string">' GeV.'</span>]);
1020054 disp(<span class="string">'   Before continuing, make sure the following conditions are true.  '</span>);
1030055 disp(<span class="string">'                     1.  Multi-bunch mode.'</span>);
1040056 disp(<span class="string">'                     2.  FF disabled.'</span>);
1050057 disp(<span class="string">'                     3.  Gap Control disabled.'</span>);
1060058 disp(<span class="string">'                     4.  Current range: typically 35-45 mAmps, but any current should be OK.'</span>);
1070059 disp(<span class="string">'                     5.  Production corrector magnet set.'</span>);
1080060 disp(<span class="string">'                     6.  Bumps off and BTS 3 and 4 set to zero current.'</span>);
1090061 disp(<span class="string">'                     7.  Set the insertion device Velocity Profiling off (0) (just for speed).'</span>);
1100062 disp(<span class="string">'                     8.  Slow orbit feedback off.'</span>);
1110063 <span class="keyword">if</span> BPMFlag
1120064 disp(<span class="string">'                     9.  BPMs calibrated.'</span>);
1130065 <span class="keyword">end</span>
1140066
1150067
1160068 <span class="keyword">if</span> nargin &lt; 1
1170069    SectorIn = menu(str2mat(sprintf(<span class="string">'%.1f GeV Feed Forward Generation'</span>,IDFF.GeV),<span class="string">'Feed forward must be off!'</span>,<span class="string">' '</span>,<span class="string">'Which insertion device?'</span>),<span class="string">'4-vertical'</span>,<span class="string">'4-longitudinal'</span>,<span class="string">'5'</span>,<span class="string">'7'</span>,<span class="string">'8'</span>,<span class="string">'9'</span>,<span class="string">'10'</span>,<span class="string">'11-vertical'</span>,<span class="string">'11-longitudinal'</span>,<span class="string">'12'</span>,<span class="string">'Cancel'</span>);   
1180070    <span class="keyword">if</span> SectorIn == 1
1190071       <span class="comment">% Sector 4 vertical using new feedforward method</span>
1200072       Sector = 4;
1210073       ffgettblepugap(Sector);
1220074       <span class="keyword">return</span>
1230075    <span class="keyword">elseif</span> SectorIn == 2
1240076       <span class="comment">% Sector 4 longitudinal using new feedforward method</span>
1250077       Sector = 4;
1260078       ffgettblepushift(Sector);
1270079       <span class="comment">%ffgettblepu;  % old method</span>
1280080       <span class="keyword">return</span>
1290081    <span class="keyword">elseif</span> SectorIn == 3
1300082       Sector = 5;
1310083    <span class="keyword">elseif</span> SectorIn == 4
1320084       Sector = 7;
1330085    <span class="keyword">elseif</span> SectorIn == 5
1340086       Sector = 8;
1350087    <span class="keyword">elseif</span> SectorIn == 6
1360088       Sector = 9;
1370089    <span class="keyword">elseif</span> SectorIn == 7
1380090       Sector = 10;
1390091    <span class="keyword">elseif</span> SectorIn == 8
1400092       <span class="comment">% Sector 11 vertical using new feedforward method</span>
1410093       Sector = 11;
1420094       ffgettblepugap(Sector);
1430095       <span class="keyword">return</span>
1440096    <span class="keyword">elseif</span> SectorIn == 9
1450097       <span class="comment">% Sector 11 longitudinal using new feedforward method</span>
1460098       Sector = 11;
1470099       ffgettblepushift(Sector);
1480100       <span class="keyword">return</span>
1490101    <span class="keyword">elseif</span> SectorIn == 10
1500102       Sector = 12;
1510103    <span class="keyword">elseif</span> SectorIn == 11
1520104       disp(<span class="string">'   ffgettbl aborted.  No changes to correctors or insertion device.'</span>);
1530105          <span class="keyword">return</span>
1540106     <span class="keyword">end</span>
1550107 <span class="keyword">end</span>
1560108 disp(<span class="string">' '</span>);
1570109 <span class="keyword">if</span> Sector == 0
1580110    disp(<span class="string">'   ffgettbl aborted.  No changes to correctors or insertion device.'</span>);
1590111    <span class="keyword">return</span>;
1600112 <span class="keyword">end</span>
1610113
1620114
1630115
1640116 <span class="comment">%%%%%%%%%%%%%</span>
1650117 <span class="comment">% BPM Setup %</span>
1660118 <span class="comment">%%%%%%%%%%%%%</span>
1670119 IDFF.BPMxFamily = <span class="string">'BPMx'</span>;
1680120 IDFF.BPMyFamily = <span class="string">'BPMy'</span>;
1690121
1700122 <span class="keyword">if</span> BPMFlag
1710123     <span class="comment">% Use all BPMs</span>
1720124     BPMTol = .005;
1730125     BPMIter = 5;
1740126     IDFF.BPMxList = getbpmlist(<span class="string">'x'</span>);
1750127     IDFF.BPMyList = getbpmlist(<span class="string">'y'</span>);
1760128 <span class="keyword">else</span>
1770129     <span class="comment">% Only use Bergoz BPMs</span>
1780130     BPMTol = .0003;
1790131     BPMIter = 5;
1800132     IDFF.BPMxList = getbpmlist(<span class="string">'x'</span>, <span class="string">'Bergoz'</span>, <span class="string">'1 2 3 4 5 6 7 8 9 10'</span>);  <span class="comment">% 11 12 ???</span>
1810133     IDFF.BPMyList = getbpmlist(<span class="string">'y'</span>, <span class="string">'Bergoz'</span>, <span class="string">'1 2 3 4 5 6 7 8 9 10'</span>);
1820134 <span class="keyword">end</span>
1830135
1840136 <span class="comment">% Remove the BPMs in the sector where the ID is located</span>
1850137 iRemove = findrowindex([Sector-1 10; Sector-1 11; Sector-1 12; Sector 1], IDFF.BPMxList);
1860138 IDFF.BPMxList(iRemove,:) = [];
1870139
1880140 iRemove = findrowindex([Sector-1 10; Sector-1 11; Sector-1 12; Sector 1], IDFF.BPMyList);
1890141 IDFF.BPMyList(iRemove,:) = [];
1900142
1910143 <span class="comment">% % Remove the BPMs in sectors 1 and 3 which are noisy at low current).</span>
1920144 <span class="comment">% iRemove = findrowindex([12 9; 1 2], BPMlist);</span>
1930145 <span class="comment">% BPMlist(iRemove,:) = [];</span>
1940146
1950147
1960148 <span class="comment">%%%%%%%%%%%%%%%%%%%</span>
1970149 <span class="comment">% Corrector Setup %</span>
1980150 <span class="comment">%%%%%%%%%%%%%%%%%%%</span>
1990151 IDFF.HCMFamily = <span class="string">'HCM'</span>;
2000152 IDFF.VCMFamily = <span class="string">'VCM'</span>;
2010153
2020154
2030155 <span class="comment">% Corrector magnet and BPM lists</span>
2040156 <span class="keyword">if</span> Sector == 6 &amp; IDDeviceList(1,2) == 1  <span class="comment">% ???</span>
2050157     IDFF.HCMList = [Sector-1  8;
2060158                     Sector-1 10];
2070159     IDFF.VCMList = [Sector-1  8;
2080160                     Sector-1 10];
2090161 <span class="keyword">else</span>
2100162     IDFF.HCMList = [Sector-1 8;
2110163                     Sector   1];
2120164     IDFF.VCMList = [Sector-1 8;
2130165                     Sector   1];
2140166 <span class="keyword">end</span>
2150167
2160168
2170169 <span class="comment">% Fast setpoints</span>
2180170 HCMRampRate0 = <a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>(IDFF.HCMFamily, <span class="string">'RampRate'</span>, IDFF.HCMList);
2190171 VCMRampRate0 = <a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>(IDFF.VCMFamily, <span class="string">'RampRate'</span>, IDFF.VCMList);
2200172 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(IDFF.HCMFamily, <span class="string">'RampRate'</span>, 1000, IDFF.HCMList, 0);
2210173 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(IDFF.VCMFamily, <span class="string">'RampRate'</span>, 1000, IDFF.VCMList, 0);
2220174
2230175
2240176 <span class="comment">%%%%%%%%%%%%%%%%%</span>
2250177 <span class="comment">% End ALS Setup %</span>
2260178 <span class="comment">%%%%%%%%%%%%%%%%%</span>
2270179
2280180
2290181
2300182 <span class="comment">% Multiple FF-tables</span>
2310183 <span class="keyword">if</span> size(Sector,1) ~= 1
2320184     <span class="keyword">for</span> iSector = 1:size(Sector,1)
2330185         <a href="measidfftable.html" class="code" title="function ffgettbl(Sector, BPMFlag)">measidfftable</a>(Sector(iSector,:), BPMFlag);
2340186     <span class="keyword">end</span>
2350187     <span class="keyword">return</span>;
2360188 <span class="keyword">end</span>
2370189
2380190
2390191 <span class="comment">% Minimum and maximum gap</span>
2400192 [IDFF.GAPmin, IDFF.GAPmax] = gaplimit(Sector);
2410193
2420194
2430195 disp([<span class="string">'   The insertion device for sector '</span>,num2str(Sector),<span class="string">' has been selected.'</span>]);
2440196 disp([<span class="string">'                     Maximum Gap = '</span>,num2str(IDFF.GAPmax),<span class="string">' mm'</span>]);
2450197 disp([<span class="string">'                     Mimimum Gap = '</span>,num2str(IDFF.GAPmin),<span class="string">' mm'</span>]);
2460198
2470199
2480200 disp([<span class="string">'   Data collection started.  Figures 1 and 2 show the difference orbits between the maximum'</span>]);
2490201 disp([<span class="string">'   gap and the current gap position after the feed forward correction has been applied.'</span>]);
2500202 disp([<span class="string">'   Ideally, these plots should be a straight line thru zero, however, due to orbit drift, BPM'</span>]);
2510203 disp([<span class="string">'   noise, and feed forward imperfections one can expect 10 or 20 microns of combined errors'</span>]);
2520204 disp([<span class="string">'   to accumulate before minimum gap is reached (hopefully not any more than that).'</span>]);
2530205 disp([<span class="string">'  '</span>]);
2540206
2550207
2560208 <span class="comment">% Setup figures</span>
2570209 Buffer = .01;
2580210 HeightBuffer = .05;
2590211
2600212 h1 = gcf;
2610213 set(h1,<span class="string">'units'</span>,<span class="string">'normal'</span>,<span class="string">'position'</span>,[.0+Buffer .5+Buffer .5-2*Buffer .5-2*Buffer-HeightBuffer]);
2620214
2630215
2640216 <span class="comment">% Set gap to maximum, set velocity to maximum, velocity profile off, FF off,</span>
2650217 setff([], 0, 0);
2660218 setid(Sector, IDFF.GAPmax, IDFF.GapVelocity, 1, 0);
2670219
2680220
2690221 <span class="comment">% Load and set QF and QD setpoints from the golden lattice</span>
2700222 ConfigSetpoint = <a href="getproductionlattice.html" class="code" title="function [ConfigSetpoint, ConfigMonitor, FileName] = getproductionlattice(varargin)">getproductionlattice</a>;
2710223 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(ConfigSetpoint.QF.Setpoint);
2720224 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(ConfigSetpoint.QD.Setpoint); 
2730225 QFsp = ConfigSetpoint.QF.Setpoint.Data;
2740226 QDsp = ConfigSetpoint.QD.Setpoint.Data;
2750227
2760228
2770229 <span class="comment">% Setbumps w/o sextupole correctors</span>
2780230 setbumps(Sector, 1);
2790231
2800232
2810233 <span class="comment">% Starting orbit and corrector magnet</span>
2820234 IDFF.Xmax = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(IDFF.BPMxFamily, IDFF.BPMxList, <span class="string">'Struct'</span>);
2830235 IDFF.Ymax = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(IDFF.BPMyFamily, IDFF.BPMyList, <span class="string">'Struct'</span>);
2840236 BPMxs = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(IDFF.Xmax);
2850237 BPMys = <a href="getspos.html" class="code" title="function S = getspos(Family, DeviceList)">getspos</a>(IDFF.Ymax);
2860238
2870239 IDFF.HCM = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(IDFF.HCMFamily, IDFF.HCMList, <span class="string">'Struct'</span>);
2880240 IDFF.VCM = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(IDFF.VCMFamily, IDFF.VCMList, <span class="string">'Struct'</span>);
2890241 HCM0 = IDFF.HCM.Data;
2900242 VCM0 = IDFF.VCM.Data;
2910243 QF0 = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(<span class="string">'QF'</span>);
2920244 QD0 = <a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(<span class="string">'QD'</span>);
2930245
2940246
2950247 <span class="comment">% Main loop</span>
2960248 i=1;
2970249 IDFF.GapMonitor(i,1) = getid(Sector);
2980250 hcm(i,:) = (<a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(IDFF.HCMFamily, IDFF.HCMList)-HCM0)'; <span class="comment">% First entry is zero</span>
2990251 vcm(i,:) = (<a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(IDFF.VCMFamily, IDFF.VCMList)-VCM0)';
3000252
3010253 X(:,i) = IDFF.Xmax.Data;
3020254 Y(:,i) = IDFF.Ymax.Data;
3030255 Xrms(i) = std(IDFF.Xmax.Data - X(:,i));
3040256 Yrms(i) = std(IDFF.Ymax.Data - Y(:,i));
3050257 IterOut(i) = 1;
3060258
3070259
3080260 <span class="keyword">if</span> IDFF.GAPmin &lt; 14
3090261    Gaps = [(IDFF.GAPmax-10):-10:60 56:-4:36 34.5:-1.5:19.5 19:-.5:15 14.75:-.25:IDFF.GAPmin];
3100262 <span class="keyword">elseif</span> IDFF.GAPmin &lt; 17
3110263    Gaps = [(IDFF.GAPmax-10):-10:60 56:-4:36 34.5:-1.5:19.5 19:-.5:IDFF.GAPmin];
3120264 <span class="keyword">elseif</span> IDFF.GAPmin &lt; 34
3130265    Gaps = [(IDFF.GAPmax-10):-10:60 56:-4:36 34.5:-1.5:IDFF.GAPmin];
3140266 <span class="keyword">elseif</span> IDFF.GAPmin &lt; 55
3150267    Gaps = [(IDFF.GAPmax-10):-10:60 56:-4:IDFF.GAPmin];   
3160268 <span class="keyword">else</span>
3170269    Gaps = [(IDFF.GAPmax-10):-10:IDFF.GAPmin];   
3180270 <span class="keyword">end</span>
3190271
3200272 <span class="keyword">if</span> Gaps(length(Gaps)) &gt; IDFF.GAPmin
3210273     Gaps = [Gaps IDFF.GAPmin];
3220274 <span class="keyword">end</span>
3230275
3240276 TUNEresp = <a href="gettuneresp.html" class="code" title="function [TuneMatrix, FileName] = gettuneresp(varargin)">gettuneresp</a>;
3250277
3260278 <span class="keyword">for</span> i = 2:length(Gaps)+1
3270279    g = Gaps(i-1);
3280280   
3290281    <span class="comment">% Set gap</span>
3300282    setid(Sector, g, IDFF.GapVelocity);
3310283   
3320284    <span class="comment">% Set to old table first</span>
3330285    <span class="comment">%setsp(IDFF.HCMFamily, HCM0+Xtableold(i,2:3)', IDFF.HCMList);  % this does not seem to be a good idea</span>
3340286    <span class="comment">%setsp(IDFF.VCMFamily, VCM0+Ytableold(i,2:3)', IDFF.VCMList);  % need to linear fit the data if you do use this???</span>
3350287
3360288    <span class="comment">% Change Quads via Tune FF to simulate conditions during production</span>
3370289    <span class="comment">% using tune feed forward code from orbit feedback</span>
3380290   
3390291    <span class="comment">% Change in tune and [QF;QD] from maximum gap</span>
3400292    <span class="keyword">if</span> strcmpi(<a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'OperationalMode'</span>), <span class="string">'1.9 GeV, High Tune'</span>)
3410293       <span class="keyword">if</span> i==2
3420294          fprintf(<span class="string">'   Generating feedforward table for %s mode\n'</span>, <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(<span class="string">'OperationalMode'</span>));
3430295       <span class="keyword">end</span>
3440296       
3450297       
3460298       <span class="keyword">if</span> strcmp(FFTypeFlag,<span class="string">'Local'</span>)
3470299          disp(<span class="string">'   Using local tune compensation.'</span>);
3480300         
3490301          addQFsp = zeros(24,1);
3500302          addQDsp = zeros(24,1);
3510303         
3520304          <span class="comment">% Change in tune and [QF;QD] from maximum gap</span>
3530305          actualgap = getid(Sector);
3540306          <span class="keyword">if</span> actualgap &lt; (IDFF.GAPmin-1)
3550307             actualgap = IDFF.GAPmax;
3560308          <span class="keyword">end</span> 
3570309          DeltaNuY = gap2tune(Sector, actualgap);
3580310          fraccorr = 1.15*DeltaNuY./gap2tune(5,13.23,1.9);               
3590311         
3600312          <span class="comment">% Find which quads to change</span>
3610313          QuadList = [Sector-1 1;Sector-1 2;Sector 1;Sector 2];
3620314          QuadElem = <a href="dev2elem.html" class="code" title="function Output = dev2elem(Family, DevList)">dev2elem</a>(<span class="string">'QF'</span>,QuadList);
3630315         
3640316          <span class="keyword">if</span> (Sector==7) | (Sector==10) | (Sector==11)
3650317             QFfac=(fraccorr.*([2.227520/2.237111;2.239570/2.237111;2.239570/2.237111;2.227520/2.237111]-1));               
3660318             QDfac=(fraccorr.*([2.432264/2.511045;2.543089/2.511045;2.54308/2.511045;2.432264/2.511045]-1));
3670319          <span class="keyword">elseif</span> (Sector==5) | (Sector==9)
3680320             QFfac=(fraccorr.*([2.208418/2.219784;2.225926/2.219784;2.231777/2.237111;2.233775/2.237111]-1));               
3690321             QDfac=(fraccorr.*([2.386512/2.483259;2.545907/2.483259;2.474571/2.511045;2.491079/2.511045]-1));
3700322          <span class="keyword">elseif</span> (Sector==4) | (Sector==8) | (Sector==12)
3710323             QFfac=(fraccorr.*([2.233775/2.237111;2.231777/2.237111;2.225926/2.219784;2.208418/2.219784]-1));               
3720324             QDfac=(fraccorr.*([2.491079/2.511045;2.474571/2.511045;2.545907/2.483259;2.386512/2.483259]-1));
3730325          <span class="keyword">else</span>
3740326             QFfac=zeros(4,1);               
3750327             QDfac=zeros(4,1);
3760328          <span class="keyword">end</span>
3770329         
3780330          addQFsp(QuadElem) = addQFsp(QuadElem)+QFfac.*QFsp(QuadElem);
3790331          addQDsp(QuadElem) = addQDsp(QuadElem)+QDfac.*QDsp(QuadElem);                             
3800332         
3810333       <span class="keyword">elseif</span> strcmp(FFTypeFlag,<span class="string">'Global'</span>)
3820334         
3830335          addQFsp = zeros(24,1);
3840336          addQDsp = zeros(24,1);
3850337         
3860338          <span class="comment">% Change in tune and [QF;QD] from maximum gap</span>
3870339          actualgap = getid(Sector);
3880340          <span class="keyword">if</span> actualgap &lt; (IDFF.GAPmin-1)
3890341             actualgap = IDFF.GAPmax;
3900342          <span class="keyword">end</span>
3910343          DeltaNuY = gap2tune(Sector, actualgap);
3920344          DeltaNuX = 0;
3930345          fraccorr = DeltaNuY./gap2tune(5,13.23,1.9);               
3940346         
3950347          <span class="comment">% Find which quads to change</span>
3960348          QuadList = [Sector-1 2;Sector 1];
3970349          QuadElem = <a href="dev2elem.html" class="code" title="function Output = dev2elem(Family, DevList)">dev2elem</a>(<span class="string">'QF'</span>,QuadList);
3980350         
3990351          DeltaAmps = inv(TUNEresp) * [(fraccorr*6.23e-4)-DeltaNuX;fraccorr*(-0.05301)];    <span class="comment">%  DelAmps =  [QF; QD];</span>
4000352          addQFsp = addQFsp+DeltaAmps(1,1);
4010353          addQDsp = addQDsp+DeltaAmps(2,1);
4020354         
4030355          <span class="keyword">if</span> (Sector==7) | (Sector==10) | (Sector==11)
4040356             QFfac=(fraccorr.*([2.243127/2.237111;2.243127/2.237111]-1));               
4050357             QDfac=(fraccorr.*([2.556392/2.511045;2.556392/2.511045]-1));
4060358          <span class="keyword">elseif</span> (Sector==5) | (Sector==9)
4070359             QFfac=(fraccorr.*([2.225965/2.219784;2.243096/2.237111]-1));               
4080360             QDfac=(fraccorr.*([2.528950/2.483259;2.556345/2.511045]-1));
4090361          <span class="keyword">elseif</span> (Sector==4) | (Sector==8) | (Sector==12)
4100362             QFfac=(fraccorr.*([2.243096/2.237111;2.225965/2.219784]-1));               
4110363             QDfac=(fraccorr.*([2.556345/2.511045;2.528950/2.483259]-1));
4120364          <span class="keyword">else</span>
4130365             QFfac=zeros(4,1);               
4140366             QDfac=zeros(4,1);
4150367          <span class="keyword">end</span>
4160368         
4170369          addQFsp(QuadElem) = addQFsp(QuadElem)+QFfac.*QFsp(QuadElem);
4180370          addQDsp(QuadElem) = addQDsp(QuadElem)+QDfac.*QDsp(QuadElem);                             
4190371         
4200372       <span class="keyword">else</span>
4210373          error(<span class="string">'Unknown type selected for tune FF'</span>);
4220374       <span class="keyword">end</span>
4230375       
4240376       AmpsQF = QFsp+addQFsp;
4250377       AmpsQD = QDsp+addQDsp;
4260378       
4270379       <span class="comment">% Set quadrupoles</span>
4280380       <a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>(<span class="string">'QF'</span>, AmpsQF,[], 0);
4290381       <a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>(<span class="string">'QD'</span>, AmpsQD,[], 0);
4300382       
4310383       
4320384    <span class="keyword">else</span>
4330385       
4340386       <span class="comment">% Change in tune and [QF;QD] from maximum gap</span>
4350387       actualgap = getid(Sector);
4360388       <span class="keyword">if</span> actualgap &lt; (IDFF.GAPmin-1)
4370389          actualgap = IDFF.GAPmax;
4380390       <span class="keyword">end</span> 
4390391       DeltaNuY = gap2tune(Sector, actualgap);
4400392       
4410393       <span class="keyword">if</span> (Sector==7) | (Sector==10) | (Sector==11)
4420394          DeltaAmps = inv(TUNEresp/12) * [0; -DeltaNuY];    <span class="comment">%  DelAmps =  [QF; QD];</span>
4430395          DeltaAmpsQF=[DeltaAmps(1,1);DeltaAmps(1,1)];
4440396          DeltaAmpsQD=[DeltaAmps(2,1);DeltaAmps(2,1)];
4450397       <span class="keyword">elseif</span> (Sector==5) | (Sector==9)
4460398          DeltaAmpsQF=DeltaNuY/0.0181*0.37*[-1.0637;-0.5132];
4470399          DeltaAmpsQD=DeltaNuY/0.0181*0.37*[-6.6328;-3.3434];
4480400       <span class="keyword">elseif</span> (Sector==4) | (Sector==8) | (Sector==12)
4490401          DeltaAmpsQF=DeltaNuY/0.0181*0.37*[-0.5132;-1.0637];
4500402          DeltaAmpsQD=DeltaNuY/0.0181*0.37*[-3.3434;-6.6328];
4510403       <span class="keyword">else</span>
4520404          DeltaAmpsQF=[0;0];
4530405          DeltaAmpsQD=[0;0];
4540406       <span class="keyword">end</span>
4550407       
4560408       <span class="comment">% Find which quads to change</span>
4570409       QuadList = [Sector-1 1;Sector 2];
4580410       QuadElem = <a href="dev2elem.html" class="code" title="function Output = dev2elem(Family, DevList)">dev2elem</a>(<span class="string">'QF'</span>,QuadList);
4590411       AmpsQF = QFsp(QuadElem) + DeltaAmpsQF;
4600412       AmpsQD = QDsp(QuadElem) + DeltaAmpsQD;
4610413       
4620414       <span class="comment">% Set quadrupoles</span>
4630415       <a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>(<span class="string">'QF'</span>, AmpsQF, QuadList, 0);
4640416       <a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>(<span class="string">'QD'</span>, AmpsQD, QuadList, 0);
4650417       
4660418    <span class="keyword">end</span>
4670419   
4680420   
4690421    pause(1);
4700422
4710423
4720424    <span class="comment">% Correct orbit</span>
4730425    [STDfinal, IterOut(i,1)] = setbpm(IDFF.HCMFamily, IDFF.Xmax.Data, IDFF.HCMList, IDFF.BPMxList, <span class="keyword">...</span>
4740426                                      IDFF.VCMFamily, IDFF.Ymax.Data, IDFF.VCMList, IDFF.BPMyList, BPMIter, BPMTol);
4750427
4760428    <span class="comment">% Record the gap AM</span>
4770429    IDFF.GapMonitor(i,1) = getid(Sector);
4780430   
4790431
4800432    <span class="comment">% Record data</span>
4810433    hcm(i,:) = (<a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(IDFF.HCMFamily, IDFF.HCMList)-HCM0)';
4820434    vcm(i,:) = (<a href="getsp.html" class="code" title="function [SP, tout, DataTime, ErrorFlag] = getsp(Family, varargin)">getsp</a>(IDFF.VCMFamily, IDFF.VCMList)-VCM0)';
4830435    X(:,i) = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(IDFF.BPMxFamily, IDFF.BPMxList);
4840436    Y(:,i) = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(IDFF.BPMyFamily, IDFF.BPMyList);
4850437
4860438
4870439    <span class="comment">% Statistics</span>
4880440    Xrms(i) = std(IDFF.Xmax.Data - X(:,i));
4890441    Yrms(i) = std(IDFF.Ymax.Data - Y(:,i));
4900442
4910443   
4920444    <span class="comment">% plot results</span>
4930445    figure(h1);
4940446    plot(BPMxs,(X(:,i)-IDFF.Xmax.Data)*1000,<span class="string">'r'</span>, BPMys,(Y(:,i)-IDFF.Ymax.Data)*1000,<span class="string">'g'</span>);
4950447    title([<span class="string">'BPM Orbit Error at a '</span>, num2str(IDFF.GapMonitor(i,1)),<span class="string">' mm Gap'</span>]);
4960448    ylabel(<span class="string">'X (red), Y (grn) Error [microns]'</span>); 
4970449    xlabel(<span class="string">'BPM Position [meters]'</span>);
4980450    pause(0);
4990451 <span class="keyword">end</span>
5000452
5010453
5020454 <span class="comment">% Minimum gap orbits</span>
5030455 IDFF.Xmin = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(IDFF.BPMxFamily, IDFF.BPMxList, <span class="string">'Struct'</span>);
5040456 IDFF.Ymin = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(IDFF.BPMyFamily, IDFF.BPMyList, <span class="string">'Struct'</span>);
5050457
5060458
5070459 <span class="comment">% Make the FF-tables</span>
5080460 Xtable = [IDFF.GapMonitor hcm(:,1)-hcm(1,1) hcm(:,2)-hcm(1,2)];
5090461 Ytable = [IDFF.GapMonitor vcm(:,1)-vcm(1,1) vcm(:,2)-vcm(1,2)];
5100462 tableQ = [];
5110463
5120464
5130465 <span class="comment">% Go to max gap</span>
5140466 disp(<span class="string">'   The insertion device gap, quads, and correctors are being reset.'</span>);
5150467 setid(Sector, IDFF.GAPmax, IDFF.GapVelocity);
5160468
5170469 <span class="comment">% Reset to maximum gap values</span>
5180470 <a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>(IDFF.HCMFamily, HCM0, IDFF.HCMList, 0);
5190471 <a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>(IDFF.VCMFamily, VCM0, IDFF.VCMList, 0);
5200472 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(ConfigSetpoint.QF.Setpoint, 0);
5210473 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(ConfigSetpoint.QD.Setpoint, 0); 
5220474
5230475 <span class="comment">% Then wait on setpoints</span>
5240476 <a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>(IDFF.HCMFamily, HCM0, IDFF.HCMList, -1);
5250477 <a href="setsp.html" class="code" title="function ErrorFlag = setsp(Family, varargin)">setsp</a>(IDFF.VCMFamily, VCM0, IDFF.VCMList, -1);
5260478 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(ConfigSetpoint.QF.Setpoint, -1);
5270479 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(ConfigSetpoint.QD.Setpoint, -1); 
5280480
5290481
5300482 <span class="comment">% Ending orbits</span>
5310483 IDFF.XmaxEnd = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(IDFF.BPMxFamily, IDFF.BPMxList, <span class="string">'Struct'</span>);
5320484 IDFF.YmaxEnd = <a href="getam.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getam(varargin)">getam</a>(IDFF.BPMyFamily, IDFF.BPMyList, <span class="string">'Struct'</span>);
5330485
5340486
5350487 <span class="comment">% Structure output</span>
5360488 IDFF.Sector = Sector;
5370489 IDFF.Gaps = Gaps;
5380490 IDFF.Xtable = Xtable;
5390491 IDFF.Ytable = Ytable;
5400492 IDFF.tableQ = tableQ;
5410493 IDFF.BPMFlag = BPMFlag;
5420494 IDFF.Xrms = Xrms;
5430495 IDFF.Yrms = Yrms;
5440496 IDFF.IterOut = IterOut;
5450497 IDFF.TimeStamp = clock;
5460498 IDFF.GeV = <a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>;
5470499 IDFF.DataDescriptor = <span class="string">'ID Feed Forward Table'</span>;
5480500 IDFF.CreatedBy = <span class="string">'measidfftable'</span>;
5490501
5500502
5510503         
5520504 <span class="comment">% Change to DataRoot/ID/FeedForward directory</span>
5530505 DirStart = pwd;
5540506 DataRoot = <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>);
5550507 DirectoryName = [DataRoot, <span class="string">'ID'</span>, filesep, <span class="string">'FeedForward'</span>, filesep];
5560508 [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName);
5570509 FileName = sprintf(<span class="string">'id%02de%2.0f'</span>, Sector, 10*<a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>);
5580510 FileName = appendtimestamp(FileName);
5590511 save(FileName, <span class="string">'IDFF'</span>);
5600512 fprintf(<span class="string">'   Insertion device feed forward table saved to %s.mat\n'</span>, [DirectoryName FileName]);
5610513 <span class="keyword">if</span> ErrorFlag
5620514     fprintf(<span class="string">'   Warning: %s was not the desired directory\n'</span>, DirectoryName);
5630515 <span class="keyword">end</span>
5640516 FileName = [DirectoryName FileName];
5650517 cd(DirStart);
5660518
5670519
5680520 <span class="comment">% Close figures</span>
5690521 close(h1);
5700522 FigureHandles = <a href="plotidfftable.html" class="code" title="function FigureHandles = plotidfftable(Sector, GeV)">plotidfftable</a>(FileName);
5710523
5720524 fprintf(<span class="string">'   Measurement complete.  The gap position and correctors have been set back to their original setpoints.'</span>);
5730525 fprintf(<span class="string">'   A new table has been generated and saved to directory %s\n'</span>, FileName);
5740526 fprintf(<span class="string">'            Figure '</span>, num2str(FigureHandles(1)),<span class="string">'  -&gt;  Corrector strength verses gap position.'</span>);
5750527 fprintf(<span class="string">'            Figure '</span>, num2str(FigureHandles(2)),<span class="string">'  -&gt;  RMS orbit distortion verses gap position.'</span>);
5760528 fprintf(<span class="string">'                                                   -&gt;  Orbit drift during table generation verses BPM position.'</span>);
5770529 fprintf(<span class="string">'            Figure '</span>, num2str(FigureHandles(3)),<span class="string">'  -&gt;  Rate of Change of the Corrector Magnets.'</span>);
5780530 fprintf(<span class="string">'   Insertion device feedforward table generation complete.\n'</span>);
5790531
5800532
5810533 <span class="comment">% ALS resets</span>
5820534
5830535 CPTableFlag = questdlg(sprintf(<span class="string">'Copy %.1f GeV Table to the IOC?'</span>,IDFF.GeV),<span class="string">'Feed Forward Table Complete'</span>,<span class="string">'Yes'</span>,<span class="string">'No'</span>,<span class="string">'No'</span>);
5840536 <span class="keyword">if</span> strcmp(CPTableFlag,<span class="string">'No'</span>)
5850537    fprintf(<span class="string">'  Use ffcopy(%d,%.1f) to copy the table over to the feed forward program.\n'</span>, Sector, IDFF.GeV);
5860538    fprintf(<span class="string">'  Use ffread(%d) (or the &quot;Undulator Server&quot; application) to force the IOC to read the new table.\n'</span>, Sector);
5870539 <span class="keyword">else</span>
5880540    ffcopy(textfn1);
5890541    fprintf(<span class="string">'  For the IOC to read the new table use the &quot;Undulator Server&quot;\n'</span>);
5900542    fprintf(<span class="string">'  application or run ffread(%d) from Matlab.\n'</span>, Sector);
5910543 <span class="keyword">end</span>
5920544
5930545 <span class="comment">% Switch correctors to slow mode</span>
5940546 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(IDFF.HCMFamily, <span class="string">'RampRate'</span>, HCMRampRate0, IDFF.HCMList, 0);
5950547 <a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>(IDFF.VCMFamily, <span class="string">'RampRate'</span>, VCMRampRate0, IDFF.VCMList, 0);</pre></div>
596<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>
597</body>
598</html>
Note: See TracBrowser for help on using the repository browser.