source: MML/trunk/applications/doc_html/applications/loco/locoresponsematrix_old.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: 36.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 locoresponsematrix_old</title>
6  <meta name="keywords" content="locoresponsematrix_old">
7  <meta name="description" content="LOCORESPONSEMATRIX - Calculate the BPM response matrix and dispersion function">
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="#">applications</a> &gt; <a href="index.html">loco</a> &gt; locoresponsematrix_old.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 applications/loco&nbsp;<img alt=">" border="0" src="../../right.png"></a></td></tr></table>-->
19
20<h1>locoresponsematrix_old
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>LOCORESPONSEMATRIX - Calculate the BPM response matrix and dispersion function</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 RM = locoresponsematrix(RINGData, BPMData, CMData, 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">LOCORESPONSEMATRIX - Calculate the BPM response matrix and dispersion function
31 M = LOCORESPONCEMATRIX(RINGData, BPMData, CMData)
32
33 Accelerator Toolbox implementation of generic LOCO function
34
35 RINGData - must have fields 'Lattice', 'CavityFrequency', 'CavityHarmNumber'
36            RINGData.Lattice - AT lattice cell arrary
37            RINGData.CavityFrequency  [Hz]
38            RINGData.CavityHarmNumber [Hz]
39 
40 CMData -   must have fields: 'HCMIndex', 'VCMIndex', 'HCMKicks', 'VCMKicks', 'HCMCoupling', 'VCMCoupling'
41            CMData.HCMIndex    - indexes in the AT lattice of elements used as horizontal correctors
42            CMData.VCMIndex    - indexes in the AT lattice of elements used as vertical correctors
43                                 Elements used as correctors in both planes should be included in both lists
44            CMData.HCMKicks    - kick  size [radians] of horizontal correctors in the horizontal plane
45            CMData.VCMKicks    - kick  size [radians] of vertical correctors in the vertical plane
46            CMData.HCMCoupling - corrector coupling coefficient into another plane:
47                                 0.01 coupling means that for 1e-3 kick in the horizontal direction there
48                                 is a 1e-5 rad kick in the vertical direction
49            CMData.VCMCoupling - corrector coupling coefficient into another plane:
50                                 0.01 coupling means that for 1e-3 kick in the vertical direction there
51                                 is a 1e-5 rad kick in the horizontal direction
52
53 BPMData -  must have field 'BPMIndex'
54            CMData.BPMIndex - indexes of all BPMs or observation points in the AT lattice
55                              All BPS and observation points (single plane too)
56                              are included in CMData.BPMIndex.
57
58 Return value: a matrix with number of rows equal to 2*length(CMData.BPMIndex) and the number of columns
59               equal length(CMData.HCMIndex)+length(CMData.VCMIndex)
60
61 Additional string flags (in any order)
62 
63 LOCORESPONSEMATRIX(...,ClosedOrbitType,...)
64       ClosedOrbitType is 'fixedmomentum',  'fixedpathlength' (default)
65 
66 LOCORESPONCEMATRIX(..., 'linear') calculates M using linear approximation  !!! including the dispersion terms
67
68 LOCORESPONCEMATRIX(..., 'RF', DeltaRF) - 'RF' switch must be followed by the value of DeltaRF [Hz]
69
70 LOCORESPONCEMATRIX(..., 'ResponseMatrixMeasurement', 'oneway') - 'oneway' switch is used
71                        when the response matrix was measured only kicking the i-th corrector
72                        to +KicksCoupled(i) one way, default: ResponseMatrixMeasurement = 'bidirectional'
73
74 LOCORESPONCEMATRIX(..., 'DispersionMeasurement', 'oneway') - 'oneway' switch is used
75                        when the dispersion was measured only by varying the 
76                        RF frequency in one direction, default: DispersionMeasurement = 'bidirectional'
77
78 Or a Flags structure can be an input argument:
79 LOCORESPONCEMATRIX(..., Flags)
80    Flags.ResponseMatrixMeasurement = 'oneway' or {'bi-directional'} 
81    Flags.DispersionMeasurement     = 'oneway' or {'bi-directional'} 
82    Flags.ResponseMatrixCalculator  = {'linear'} or 'full'
83    Flags.ClosedOrbitType           = 'fixedmomentum' or {'fixedpathlength'}
84
85 Note: flag names are not case sensitive</pre></div>
86
87<!-- crossreference -->
88<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../../up.png"></a></h2>
89This function calls:
90<ul style="list-style-image:url(../../matlabicon.gif)">
91</ul>
92This function is called by:
93<ul style="list-style-image:url(../../matlabicon.gif)">
94</ul>
95<!-- crossreference -->
96
97
98<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../../up.png"></a></h2>
99<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function RM = locoresponsematrix(RINGData, BPMData, CMData, varargin);</a>
1000002 <span class="comment">%LOCORESPONSEMATRIX - Calculate the BPM response matrix and dispersion function</span>
1010003 <span class="comment">% M = LOCORESPONCEMATRIX(RINGData, BPMData, CMData)</span>
1020004 <span class="comment">%</span>
1030005 <span class="comment">% Accelerator Toolbox implementation of generic LOCO function</span>
1040006 <span class="comment">%</span>
1050007 <span class="comment">% RINGData - must have fields 'Lattice', 'CavityFrequency', 'CavityHarmNumber'</span>
1060008 <span class="comment">%            RINGData.Lattice - AT lattice cell arrary</span>
1070009 <span class="comment">%            RINGData.CavityFrequency  [Hz]</span>
1080010 <span class="comment">%            RINGData.CavityHarmNumber [Hz]</span>
1090011 <span class="comment">%</span>
1100012 <span class="comment">% CMData -   must have fields: 'HCMIndex', 'VCMIndex', 'HCMKicks', 'VCMKicks', 'HCMCoupling', 'VCMCoupling'</span>
1110013 <span class="comment">%            CMData.HCMIndex    - indexes in the AT lattice of elements used as horizontal correctors</span>
1120014 <span class="comment">%            CMData.VCMIndex    - indexes in the AT lattice of elements used as vertical correctors</span>
1130015 <span class="comment">%                                 Elements used as correctors in both planes should be included in both lists</span>
1140016 <span class="comment">%            CMData.HCMKicks    - kick  size [radians] of horizontal correctors in the horizontal plane</span>
1150017 <span class="comment">%            CMData.VCMKicks    - kick  size [radians] of vertical correctors in the vertical plane</span>
1160018 <span class="comment">%            CMData.HCMCoupling - corrector coupling coefficient into another plane:</span>
1170019 <span class="comment">%                                 0.01 coupling means that for 1e-3 kick in the horizontal direction there</span>
1180020 <span class="comment">%                                 is a 1e-5 rad kick in the vertical direction</span>
1190021 <span class="comment">%            CMData.VCMCoupling - corrector coupling coefficient into another plane:</span>
1200022 <span class="comment">%                                 0.01 coupling means that for 1e-3 kick in the vertical direction there</span>
1210023 <span class="comment">%                                 is a 1e-5 rad kick in the horizontal direction</span>
1220024 <span class="comment">%</span>
1230025 <span class="comment">% BPMData -  must have field 'BPMIndex'</span>
1240026 <span class="comment">%            CMData.BPMIndex - indexes of all BPMs or observation points in the AT lattice</span>
1250027 <span class="comment">%                              All BPS and observation points (single plane too)</span>
1260028 <span class="comment">%                              are included in CMData.BPMIndex.</span>
1270029 <span class="comment">%</span>
1280030 <span class="comment">% Return value: a matrix with number of rows equal to 2*length(CMData.BPMIndex) and the number of columns</span>
1290031 <span class="comment">%               equal length(CMData.HCMIndex)+length(CMData.VCMIndex)</span>
1300032 <span class="comment">%</span>
1310033 <span class="comment">% Additional string flags (in any order)</span>
1320034 <span class="comment">%</span>
1330035 <span class="comment">% LOCORESPONSEMATRIX(...,ClosedOrbitType,...)</span>
1340036 <span class="comment">%       ClosedOrbitType is 'fixedmomentum',  'fixedpathlength' (default)</span>
1350037 <span class="comment">%</span>
1360038 <span class="comment">% LOCORESPONCEMATRIX(..., 'linear') calculates M using linear approximation  !!! including the dispersion terms</span>
1370039 <span class="comment">%</span>
1380040 <span class="comment">% LOCORESPONCEMATRIX(..., 'RF', DeltaRF) - 'RF' switch must be followed by the value of DeltaRF [Hz]</span>
1390041 <span class="comment">%</span>
1400042 <span class="comment">% LOCORESPONCEMATRIX(..., 'ResponseMatrixMeasurement', 'oneway') - 'oneway' switch is used</span>
1410043 <span class="comment">%                        when the response matrix was measured only kicking the i-th corrector</span>
1420044 <span class="comment">%                        to +KicksCoupled(i) one way, default: ResponseMatrixMeasurement = 'bidirectional'</span>
1430045 <span class="comment">%</span>
1440046 <span class="comment">% LOCORESPONCEMATRIX(..., 'DispersionMeasurement', 'oneway') - 'oneway' switch is used</span>
1450047 <span class="comment">%                        when the dispersion was measured only by varying the</span>
1460048 <span class="comment">%                        RF frequency in one direction, default: DispersionMeasurement = 'bidirectional'</span>
1470049 <span class="comment">%</span>
1480050 <span class="comment">% Or a Flags structure can be an input argument:</span>
1490051 <span class="comment">% LOCORESPONCEMATRIX(..., Flags)</span>
1500052 <span class="comment">%    Flags.ResponseMatrixMeasurement = 'oneway' or {'bi-directional'}</span>
1510053 <span class="comment">%    Flags.DispersionMeasurement     = 'oneway' or {'bi-directional'}</span>
1520054 <span class="comment">%    Flags.ResponseMatrixCalculator  = {'linear'} or 'full'</span>
1530055 <span class="comment">%    Flags.ClosedOrbitType           = 'fixedmomentum' or {'fixedpathlength'}</span>
1540056 <span class="comment">%</span>
1550057 <span class="comment">% Note: flag names are not case sensitive</span>
1560058
1570059 C = 2.99792458e8;
1580060
1590061 <span class="comment">% Defaults</span>
1600062 ResponseMatrixMeasurement = <span class="string">'bidirectional'</span>;
1610063 DispersionMeasurement     = <span class="string">'bidirectional'</span>;
1620064 ResponseMatrixCalculator  = <span class="string">'linear'</span>;
1630065 ClosedOrbitType           = <span class="string">'fixedpathlength'</span>;
1640066
1650067 RFFLAG = 0;
1660068 DeltaRF = [];
1670069
1680070 N = nargin-3;
1690071 i = 0;
1700072 <span class="keyword">while</span> i &lt; N
1710073     i = i + 1;
1720074     <span class="keyword">if</span> isstruct(varargin{i})
1730075         Flags = varargin{i};
1740076         <span class="keyword">if</span> isfield(Flags,<span class="string">'ResponseMatrixCalculator'</span>)
1750077             ResponseMatrixCalculator = Flags.ResponseMatrixCalculator;
1760078         <span class="keyword">end</span>
1770079         <span class="keyword">if</span> isfield(Flags,<span class="string">'ClosedOrbitType'</span>)
1780080             ClosedOrbitType = Flags.ClosedOrbitType;
1790081         <span class="keyword">end</span>
1800082         <span class="keyword">if</span> isfield(Flags,<span class="string">'ResponseMatrixMeasurement'</span>)
1810083             ResponseMatrixMeasurement = Flags.ResponseMatrixMeasurement;
1820084         <span class="keyword">end</span>
1830085         <span class="keyword">if</span> isfield(Flags,<span class="string">'DispersionMeasurement'</span>)
1840086             DispersionMeasurement = Flags.DispersionMeasurement;
1850087         <span class="keyword">end</span>
1860088     <span class="keyword">elseif</span> ischar(varargin{i})
1870089         <span class="keyword">switch</span> lower(varargin{i})
1880090             <span class="keyword">case</span> <span class="string">'linear'</span>
1890091                 ResponseMatrixCalculator = <span class="string">'linear'</span>;
1900092             <span class="keyword">case</span> <span class="string">'full'</span>
1910093                 ResponseMatrixCalculator = <span class="string">'full'</span>;
1920094             <span class="keyword">case</span> <span class="string">'fixedmomentum'</span>
1930095                 ClosedOrbitType = <span class="string">'fixedmomentum'</span>;
1940096             <span class="keyword">case</span> <span class="string">'fixedpathlength'</span>
1950097                 ClosedOrbitType = <span class="string">'fixedpathlength'</span>;
1960098             <span class="keyword">case</span> <span class="string">'rf'</span>
1970099                 <span class="keyword">if</span> (i+4&lt;=nargin) &amp; isnumeric(varargin{i+1})
1980100                     RFFLAG = 1;
1990101                     DeltaRF = varargin{i+1};
2000102                     i = i + 1;
2010103                 <span class="keyword">else</span>
2020104                     error(<span class="string">'''RF'' flag must be followed by a numeric value of delta RF [Hz]'</span>);
2030105                 <span class="keyword">end</span>
2040106             <span class="keyword">case</span> <span class="string">'dispersionmeasurement'</span>
2050107                 <span class="keyword">if</span> (i+4&lt;=nargin) &amp; isstr(varargin{i+1})
2060108                     DispersionMeasurement = varargin{i+1};
2070109                     i = i + 1;
2080110                 <span class="keyword">else</span>
2090111                     error(<span class="string">'''DispersionMeasurement'' flag must be followed by ''oneway'' or ''bidirectional'''</span>);
2100112                 <span class="keyword">end</span>
2110113             <span class="keyword">case</span> <span class="string">'responsematrixmeasurement'</span>
2120114                 <span class="keyword">if</span> (i+4&lt;=nargin) &amp; isstr(varargin{i+1})
2130115                     ResponseMatrixMeasurement = varargin{i+1};
2140116                     i = i + 1;
2150117                 <span class="keyword">else</span>
2160118                     error(<span class="string">'''ResponseMatrixMeasurement'' flag must be followed by ''oneway'' or ''bidirectional'''</span>);
2170119                 <span class="keyword">end</span>
2180120             <span class="keyword">otherwise</span>
2190121                 warning(<span class="string">'Unknown switch ignored.'</span>);           
2200122         <span class="keyword">end</span>
2210123     <span class="keyword">else</span>
2220124         warning(<span class="string">'Unknown switch ignored.'</span>);           
2230125     <span class="keyword">end</span>
2240126 <span class="keyword">end</span>
2250127
2260128
2270129 <span class="comment">% Input checks</span>
2280130 ResponseMatrixCalculator = lower(ResponseMatrixCalculator);
2290131 ClosedOrbitType = lower(ClosedOrbitType);
2300132 ResponseMatrixMeasurement = lower(ResponseMatrixMeasurement);
2310133 DispersionMeasurement = lower(DispersionMeasurement);
2320134
2330135 <span class="keyword">if</span> ~strcmp(ResponseMatrixMeasurement, <span class="string">'bidirectional'</span>) &amp; ~strcmp(ResponseMatrixMeasurement, <span class="string">'oneway'</span>)   
2340136     error(<span class="string">'Unknown ResponseMatrixMeasurement type'</span>);
2350137 <span class="keyword">end</span>
2360138 <span class="keyword">if</span> ~strcmp(DispersionMeasurement, <span class="string">'bidirectional'</span>) &amp; ~strcmp(DispersionMeasurement, <span class="string">'oneway'</span>)   
2370139     error(<span class="string">'Unknown DispersionMeasurement type'</span>);
2380140 <span class="keyword">end</span> 
2390141 <span class="keyword">if</span> ~strcmp(ResponseMatrixCalculator, <span class="string">'linear'</span>) &amp; ~strcmp(ResponseMatrixCalculator, <span class="string">'full'</span>)   
2400142     error(<span class="string">'Unknown ResponseMatrixCalculator method'</span>);
2410143 <span class="keyword">end</span>
2420144 <span class="keyword">if</span> ~strcmp(ClosedOrbitType, <span class="string">'fixedpathlength'</span>) &amp; ~strcmp(ClosedOrbitType, <span class="string">'fixedmomentum'</span>)   
2430145     error(<span class="string">'Unknown ClosedOrbitType method'</span>);
2440146 <span class="keyword">end</span>
2450147
2460148
2470149 <span class="comment">% Initialize</span>
2480150 ATRING = RINGData.Lattice;
2490151 NHC = length(CMData.HCMIndex);
2500152 NVC = length(CMData.VCMIndex);
2510153 NBPM = length(BPMData.BPMIndex);
2520154
2530155 <span class="keyword">if</span> RFFLAG
2540156     <span class="comment">% Add an extra column for the orbit responce to the RF frequency change</span>
2550157     RM = zeros(2*NBPM,NHC+NVC+1);
2560158 <span class="keyword">else</span>
2570159     RM = zeros(2*NBPM,NHC+NVC);
2580160 <span class="keyword">end</span>
2590161
2600162
2610163 NE = length(ATRING);
2620164 <span class="keyword">if</span> strcmp(lower(ResponseMatrixCalculator), <span class="string">'linear'</span>)
2630165     <span class="comment">% Calculate linear optics and chromatic finctions for the model</span>
2640166     [M44,T,ClosedOrbit] = findm44(ATRING,0,1:NE+1);
2650167     DP = 0.00001;
2660168     ClosedOrbitDP = findorbit4(ATRING,DP,1:NE+1);
2670169     Dispersion = (ClosedOrbitDP-ClosedOrbit)/DP;
2680170     L0 = findspos(ATRING,NE+1);
2690171     
2700172     <span class="comment">%%X1(6)/(DP*L0); % is not the same as mcf(ATRING)???  G. Portmann</span>
2710173     <span class="comment">%X1 = ringpass(ATRING,[ClosedOrbitDP(:,1);DP;0]);</span>
2720174     <span class="comment">%MCF = X1(6)/(DP*L0);</span>
2730175     MCF = mcf(ATRING);
2740176     
2750177     <span class="comment">% Transfer matrixes through individual correctors</span>
2760178     M44HCOR = cell(1,NHC);
2770179     M44VCOR = cell(1,NVC); 
2780180     <span class="keyword">for</span> i=1:NHC
2790181         M44HCOR{i}=findelemm44(ATRING{CMData.HCMIndex(i)},ATRING{CMData.HCMIndex(i)}.PassMethod,[ClosedOrbit(:,CMData.HCMIndex(i));0;0]);
2800182     <span class="keyword">end</span>
2810183     <span class="keyword">for</span> i=1:NVC
2820184         match = find(CMData.VCMIndex(i)==CMData.HCMIndex);
2830185         <span class="keyword">if</span> match
2840186             M44VCOR{i}=M44HCOR{match};
2850187         <span class="keyword">else</span>
2860188             M44VCOR{i}=findelemm44(ATRING{CMData.VCMIndex(i)},ATRING{CMData.VCMIndex(i)}.PassMethod,[ClosedOrbit(:,CMData.VCMIndex(i));0;0]);
2870189         <span class="keyword">end</span>
2880190     <span class="keyword">end</span>
2890191     
2900192     
2910193     <span class="comment">% Assemble arrays of corrector kicks including coupling</span>
2920194     HCORTheta = zeros(4,NHC);
2930195     VCORTheta = zeros(4,NVC);
2940196     
2950197     HCORTheta(2,:) = [CMData.HCMKicks(:)]';
2960198     HCORTheta(4,:) = [CMData.HCMCoupling(:)]'.*[CMData.HCMKicks(:)]';
2970199     VCORTheta(2,:) = [CMData.VCMCoupling(:)]'.*[CMData.VCMKicks(:)]';
2980200     VCORTheta(4,:) = [CMData.VCMKicks(:)]';
2990201
3000202
3010203     <span class="comment">% Calculate closed orbit at the exit of each corrector magnet WITH applied kick</span>
3020204     <span class="keyword">for</span> i=1:NHC
3030205         CI = CMData.HCMIndex(i);
3040206         InverseT = inv(T(:,:,CI));
3050207         OrbitEntrance = (inv(eye(4)-T(:,:,CI)*M44*InverseT)*<span class="keyword">...</span>
3060208             T(:,:,CI)*M44*InverseT*(eye(4)+inv(M44HCOR{i}))*HCORTheta(:,i)/2);
3070209         
3080210         OrbitExit = HCORTheta(:,i)/2+M44HCOR{i}*(OrbitEntrance+HCORTheta(:,i)/2);
3090211         
3100212         
3110213         R0 = inv(T(:,:,CI+1))*OrbitExit;
3120214         
3130215         <span class="keyword">for</span> j=1:NBPM
3140216             <span class="keyword">if</span> BPMData.BPMIndex(j)&gt;CMData.HCMIndex(i)
3150217                 RM([j, j+NBPM],i) = T([1, 3],:,BPMData.BPMIndex(j))*R0;
3160218                 
3170219             <span class="keyword">else</span>
3180220                 RM([j, j+NBPM],i) = T([1, 3],:,BPMData.BPMIndex(j))*M44*R0;
3190221             <span class="keyword">end</span>
3200222         <span class="keyword">end</span>
3210223         
3220224         <span class="keyword">if</span> strcmp(lower(ClosedOrbitType),<span class="string">'fixedpathlength'</span>)
3230225             <span class="comment">% Use the average value of the dispersion at entrance and exit</span>
3240226             D = HCORTheta(2,i) * <span class="keyword">...</span>
3250227                 (Dispersion(1,CMData.HCMIndex(i))+Dispersion(1,CMData.HCMIndex(i)+1)) * <span class="keyword">...</span>
3260228                  Dispersion([1 3],BPMData.BPMIndex) /L0/MCF/2;
3270229         
3280230             RM(1:NBPM,i) = RM(1:NBPM,i) - D(1,:)';
3290231             RM(NBPM+1:<span class="keyword">end</span>,i) = RM(NBPM+1:<span class="keyword">end</span>,i) - D(2,:)';
3300232         <span class="keyword">end</span>
3310233         
3320234     <span class="keyword">end</span>
3330235     
3340236     <span class="keyword">for</span> i=1:NVC
3350237         CI = CMData.VCMIndex(i);
3360238         
3370239         InverseT = inv(T(:,:,CI));
3380240         OrbitEntrance = (inv(eye(4)-T(:,:,CI)*M44*InverseT) * T(:,:,CI) * M44 * <span class="keyword">...</span><span class="comment"> </span>
3390241             InverseT * (eye(4)+inv(M44VCOR{i}))*VCORTheta(:,i)/2);
3400242         OrbitExit = VCORTheta(:,i)/2+M44VCOR{i}*(OrbitEntrance+VCORTheta(:,i)/2);
3410243         
3420244         R0 = inv(T(:,:,CI+1))*OrbitExit;
3430245         <span class="keyword">for</span> j=1:NBPM
3440246             <span class="keyword">if</span> BPMData.BPMIndex(j)&gt;CMData.VCMIndex(i)
3450247                 RM([j, j+NBPM],i+NHC) = T([1, 3],:,BPMData.BPMIndex(j))*R0;
3460248             <span class="keyword">else</span>
3470249                 RM([j, j+NBPM],i+NHC) = T([1, 3],:,BPMData.BPMIndex(j))*M44*R0;
3480250             <span class="keyword">end</span>
3490251         <span class="keyword">end</span>
3500252         
3510253         <span class="comment">% Vertical correctors with coupling to X and non-zero horizontal dispersion</span>
3520254         <span class="keyword">if</span> strcmp(lower(ClosedOrbitType),<span class="string">'fixedpathlength'</span>)
3530255             <span class="comment">% Use the average value of the dispersion at entrance and exit</span>
3540256             D = VCORTheta(2,i)*(Dispersion(1,CMData.VCMIndex(i))+Dispersion(1,CMData.VCMIndex(i)+1))*<span class="keyword">...</span>
3550257                                 Dispersion([1 3],BPMData.BPMIndex)/L0/MCF/2;
3560258             RM(1:NBPM,NHC+i) = RM(1:NBPM,NHC+i) - D(1,:)';
3570259             RM(NBPM+1:<span class="keyword">end</span>,NHC+i) = RM(NBPM+1:<span class="keyword">end</span>,NHC+i) - D(2,:)';
3580260         <span class="keyword">end</span>
3590261     <span class="keyword">end</span>
3600262     
3610263     <span class="keyword">if</span> RFFLAG
3620264         <span class="keyword">if</span> strcmp(lower(DispersionMeasurement), <span class="string">'bidirectional'</span>)       
3630265             ORBITPLUS = findsyncorbit(RINGData.Lattice, (-C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2)/2, 1:length(RINGData.Lattice)+1);
3640266             ORBIT0    = findsyncorbit(RINGData.Lattice, ( C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2)/2, 1:length(RINGData.Lattice)+1);
3650267         <span class="keyword">else</span>
3660268             ORBITPLUS = findsyncorbit(RINGData.Lattice, -C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2, 1:length(RINGData.Lattice)+1);
3670269             ORBIT0    = findsyncorbit(RINGData.Lattice, 0, 1:length(RINGData.Lattice)+1);
3680270         <span class="keyword">end</span>
3690271         D = ORBITPLUS([1 3],BPMData.BPMIndex) - ORBIT0([1 3],BPMData.BPMIndex);
3700272         RM(:,end) = [D(1,:)'; D(2,:)'];
3710273     <span class="keyword">end</span>
3720274     
3730275     
3740276 <span class="keyword">elseif</span> strcmp(lower(ClosedOrbitType),<span class="string">'fixedpathlength'</span>)
3750277     <span class="comment">% Exact calculation using FINDSYNCORBIT</span>
3760278     
3770279     <span class="keyword">for</span> i = 1:NHC
3780280         <span class="keyword">switch</span> ATRING{CMData.HCMIndex(i)}.PassMethod
3790281         <span class="keyword">case</span> <span class="string">'CorrectorPass'</span>
3800282         
3810283             KickAngle0 = ATRING{CMData.HCMIndex(i)}.KickAngle;
3820284             
3830285             <span class="keyword">if</span> strcmp(lower(ResponseMatrixMeasurement), <span class="string">'bidirectional'</span>)       
3840286                 ATRING{CMData.HCMIndex(i)}.KickAngle(1) = KickAngle0(1) + CMData.HCMKicks(i)/2;
3850287                 ATRING{CMData.HCMIndex(i)}.KickAngle(2) = KickAngle0(2) + CMData.HCMKicks(i)*CMData.HCMCoupling(i)/2;
3860288                 ORBITPLUS = findsyncorbit(ATRING,0,BPMData.BPMIndex);
3870289                 
3880290                 ATRING{CMData.HCMIndex(i)}.KickAngle(1) = KickAngle0(1) - CMData.HCMKicks(i)/2;
3890291                 ATRING{CMData.HCMIndex(i)}.KickAngle(2) = KickAngle0(2) - CMData.HCMKicks(i)*CMData.HCMCoupling(i)/2;
3900292                 ORBITMINUS = findsyncorbit(ATRING,0,BPMData.BPMIndex);
3910293             <span class="keyword">else</span>
3920294                 ATRING{CMData.HCMIndex(i)}.KickAngle(1) = KickAngle0(1) + CMData.HCMKicks(i);
3930295                 ATRING{CMData.HCMIndex(i)}.KickAngle(2) = KickAngle0(2) + CMData.HCMKicks(i)*CMData.HCMCoupling(i);
3940296                 ORBITPLUS = findsyncorbit(ATRING,0,BPMData.BPMIndex);
3950297                 
3960298                 ATRING{CMData.HCMIndex(i)}.KickAngle(1) = KickAngle0(1);
3970299                 ATRING{CMData.HCMIndex(i)}.KickAngle(2) = KickAngle0(2);
3980300                 ORBITMINUS = findsyncorbit(ATRING,0,BPMData.BPMIndex);
3990301             <span class="keyword">end</span>
4000302             
4010303             ATRING{CMData.HCMIndex(i)}.KickAngle = KickAngle0;
4020304             
4030305             RM(:,i) = [ORBITPLUS(1,:)-ORBITMINUS(1,:),ORBITPLUS(3,:)-ORBITMINUS(3,:)]';
4040306         
4050307         <span class="keyword">case</span> {<span class="string">'StrMPoleSymplectic4Pass'</span>,<span class="string">'BndMPoleSymplectic4Pass'</span>}
4060308             error(<span class="string">'Not implemented yet'</span>);
4070309         <span class="keyword">otherwise</span>
4080310             error(<span class="string">'Unknown pass method for corrector'</span>);
4090311         <span class="keyword">end</span>
4100312     <span class="keyword">end</span>
4110313
4120314     <span class="keyword">for</span> i = 1:NVC
4130315         <span class="keyword">switch</span> ATRING{CMData.VCMIndex(i)}.PassMethod
4140316             <span class="keyword">case</span> <span class="string">'CorrectorPass'</span>
4150317                 KickAngle0 = ATRING{CMData.VCMIndex(i)}.KickAngle;
4160318                 
4170319                 <span class="keyword">if</span> strcmp(lower(ResponseMatrixMeasurement), <span class="string">'bidirectional'</span>)       
4180320                     ATRING{CMData.VCMIndex(i)}.KickAngle(2) = KickAngle0(2) + CMData.VCMKicks(i)/2;
4190321                     ATRING{CMData.VCMIndex(i)}.KickAngle(1) = KickAngle0(1) + CMData.VCMKicks(i)*CMData.VCMCoupling(i)/2;
4200322                     ORBITPLUS = findsyncorbit(ATRING,0,BPMData.BPMIndex);
4210323                     
4220324                     ATRING{CMData.VCMIndex(i)}.KickAngle(2) = KickAngle0(2) - CMData.VCMKicks(i)/2;
4230325                     ATRING{CMData.VCMIndex(i)}.KickAngle(1) = KickAngle0(1) - CMData.VCMKicks(i)*CMData.VCMCoupling(i)/2;
4240326                     ORBITMINUS = findsyncorbit(ATRING,0,BPMData.BPMIndex);
4250327                 <span class="keyword">else</span>
4260328                     ATRING{CMData.VCMIndex(i)}.KickAngle(2) = KickAngle0(2) + CMData.VCMKicks(i);
4270329                     ATRING{CMData.VCMIndex(i)}.KickAngle(1) = KickAngle0(1) + CMData.VCMKicks(i)*CMData.VCMCoupling(i);
4280330                     ORBITPLUS = findsyncorbit(ATRING,0,BPMData.BPMIndex);
4290331                     
4300332                     ATRING{CMData.VCMIndex(i)}.KickAngle(2) = KickAngle0(2);
4310333                     ATRING{CMData.VCMIndex(i)}.KickAngle(1) = KickAngle0(1);
4320334                     ORBITMINUS = findsyncorbit(ATRING,0,BPMData.BPMIndex);
4330335                 <span class="keyword">end</span>
4340336                 
4350337                 ATRING{CMData.VCMIndex(i)}.KickAngle = KickAngle0;
4360338                 
4370339                 RM(:,NHC+i) = [ORBITPLUS(1,:)-ORBITMINUS(1,:),ORBITPLUS(3,:)-ORBITMINUS(3,:)]';
4380340                 
4390341             <span class="keyword">case</span> {<span class="string">'StrMPoleSymplectic4Pass'</span>,<span class="string">'BndMPoleSymplectic4Pass'</span>}
4400342             error(<span class="string">'Not implemented yet'</span>);
4410343         <span class="keyword">otherwise</span>
4420344             error(<span class="string">'Unknown pass method for corrector'</span>)
4430345         <span class="keyword">end</span>
4440346     <span class="keyword">end</span>
4450347     
4460348     <span class="keyword">if</span> RFFLAG
4470349         <span class="keyword">if</span> strcmp(lower(DispersionMeasurement), <span class="string">'bidirectional'</span>)       
4480350             ORBITPLUS = findsyncorbit(RINGData.Lattice, (-C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2)/2, 1:length(RINGData.Lattice)+1);
4490351             ORBIT0    = findsyncorbit(RINGData.Lattice, ( C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2)/2, 1:length(RINGData.Lattice)+1);
4500352         <span class="keyword">else</span>
4510353             ORBITPLUS = findsyncorbit(RINGData.Lattice, -C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2, 1:length(RINGData.Lattice)+1);
4520354             ORBIT0    = findsyncorbit(RINGData.Lattice, 0, 1:length(RINGData.Lattice)+1);
4530355         <span class="keyword">end</span>
4540356         
4550357         D = ORBITPLUS([1 3],BPMData.BPMIndex) - ORBIT0([1 3],BPMData.BPMIndex);
4560358         RM(:,end) = [D(1,:)';D(2,:)'];
4570359     <span class="keyword">end</span>
4580360     
4590361 <span class="keyword">elseif</span> strcmp(lower(ClosedOrbitType),<span class="string">'fixedmomentum'</span>)
4600362     <span class="comment">% ClosedOrbitType = 'fixedmomentum' - Exact calculation using FINDORBIT4</span>
4610363     <span class="keyword">for</span> i = 1:NHC
4620364         <span class="keyword">switch</span> ATRING{CMData.HCMIndex(i)}.PassMethod
4630365         <span class="keyword">case</span> <span class="string">'CorrectorPass'</span>
4640366             KickAngle0 = ATRING{CMData.HCMIndex(i)}.KickAngle;
4650367             
4660368             <span class="keyword">if</span> strcmp(lower(ResponseMatrixMeasurement), <span class="string">'bidirectional'</span>)       
4670369                 ATRING{CMData.HCMIndex(i)}.KickAngle(1) = KickAngle0(1) + CMData.HCMKicks(i)/2;
4680370                 ATRING{CMData.HCMIndex(i)}.KickAngle(2) = KickAngle0(2) + CMData.HCMKicks(i)*CMData.HCMCoupling(i)/2;
4690371                 ORBITPLUS = findorbit4(ATRING,0,BPMData.BPMIndex);
4700372                 
4710373                 ATRING{CMData.HCMIndex(i)}.KickAngle(1) = KickAngle0(1) - CMData.HCMKicks(i)/2;
4720374                 ATRING{CMData.HCMIndex(i)}.KickAngle(2) = KickAngle0(2) - CMData.HCMKicks(i)*CMData.HCMCoupling(i)/2;
4730375                 ORBITMINUS = findorbit4(ATRING,0,BPMData.BPMIndex);
4740376             <span class="keyword">else</span>
4750377                 ATRING{CMData.HCMIndex(i)}.KickAngle(1) = KickAngle0(1) + CMData.HCMKicks(i);
4760378                 ATRING{CMData.HCMIndex(i)}.KickAngle(2) = KickAngle0(2) + CMData.HCMKicks(i)*CMData.HCMCoupling(i);
4770379                 ORBITPLUS = findorbit4(ATRING,0,BPMData.BPMIndex);
4780380                 
4790381                 ATRING{CMData.HCMIndex(i)}.KickAngle(1) = KickAngle0(1);
4800382                 ATRING{CMData.HCMIndex(i)}.KickAngle(2) = KickAngle0(2);
4810383                 ORBITMINUS = findorbit4(ATRING,0,BPMData.BPMIndex);
4820384             <span class="keyword">end</span>
4830385             
4840386             ATRING{CMData.HCMIndex(i)}.KickAngle = KickAngle0;
4850387         
4860388             RM(:,i) = [ORBITPLUS(1,:)-ORBITMINUS(1,:),ORBITPLUS(3,:)-ORBITMINUS(3,:)]';
4870389         
4880390         <span class="keyword">case</span> {<span class="string">'StrMPoleSymplectic4Pass'</span>,<span class="string">'BndMPoleSymplectic4Pass'</span>}
4890391             error(<span class="string">'Not implemented yet'</span>);
4900392         <span class="keyword">otherwise</span>
4910393             error(<span class="string">'Unknown pass method for corrector'</span>);
4920394         <span class="keyword">end</span>
4930395     <span class="keyword">end</span>
4940396
4950397     <span class="keyword">for</span> i = 1:NVC
4960398         <span class="keyword">switch</span> ATRING{CMData.HCMIndex(i)}.PassMethod
4970399         <span class="keyword">case</span> <span class="string">'CorrectorPass'</span>
4980400             
4990401             KickAngle0 = ATRING{CMData.HCMIndex(i)}.KickAngle;
5000402             
5010403             <span class="keyword">if</span> strcmp(lower(ResponseMatrixMeasurement), <span class="string">'bidirectional'</span>)       
5020404                 ATRING{CMData.VCMIndex(i)}.KickAngle(2) = KickAngle0(2) + CMData.VCMKicks(i)/2;
5030405                 ATRING{CMData.VCMIndex(i)}.KickAngle(1) = KickAngle0(1) + CMData.VCMKicks(i)*CMData.VCMCoupling(i)/2;
5040406                 ORBITPLUS = findorbit4(ATRING,0,BPMData.BPMIndex);
5050407                 
5060408                 ATRING{CMData.VCMIndex(i)}.KickAngle(2) = KickAngle0(2) - CMData.VCMKicks(i)/2;
5070409                 ATRING{CMData.VCMIndex(i)}.KickAngle(1) = KickAngle0(1) - CMData.VCMKicks(i)*CMData.VCMCoupling(i)/2;
5080410                 ORBITMINUS = findorbit4(ATRING,0,BPMData.BPMIndex);
5090411             <span class="keyword">else</span>
5100412                 ATRING{CMData.VCMIndex(i)}.KickAngle(2) = KickAngle0(2) + CMData.VCMKicks(i);
5110413                 ATRING{CMData.VCMIndex(i)}.KickAngle(1) = KickAngle0(1) + CMData.VCMKicks(i)*CMData.VCMCoupling(i);
5120414                 ORBITPLUS = findorbit4(ATRING,0,BPMData.BPMIndex);
5130415                 
5140416                 ATRING{CMData.VCMIndex(i)}.KickAngle(2) = KickAngle0(2);
5150417                 ATRING{CMData.VCMIndex(i)}.KickAngle(1) = KickAngle0(1);
5160418                 ORBITMINUS = findorbit4(ATRING,0,BPMData.BPMIndex);
5170419             <span class="keyword">end</span>
5180420             
5190421             ATRING{CMData.VCMIndex(i)}.KickAngle = KickAngle0;
5200422             
5210423             RM(:,NHC+i) = [ORBITPLUS(1,:)-ORBITMINUS(1,:),ORBITPLUS(3,:)-ORBITMINUS(3,:)]';
5220424             
5230425         <span class="keyword">case</span> {<span class="string">'StrMPoleSymplectic4Pass'</span>,<span class="string">'BndMPoleSymplectic4Pass'</span>}
5240426             error(<span class="string">'Not implemented yet'</span>);
5250427         <span class="keyword">otherwise</span>
5260428             error(<span class="string">'Unknown pass method for corrector'</span>)
5270429         <span class="keyword">end</span>
5280430     <span class="keyword">end</span>
5290431     
5300432     <span class="keyword">if</span> RFFLAG
5310433         <span class="keyword">if</span> strcmp(lower(DispersionMeasurement), <span class="string">'bidirectional'</span>)       
5320434             ORBITPLUS = findsyncorbit(RINGData.Lattice, (-C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2)/2, 1:length(RINGData.Lattice)+1);
5330435             ORBIT0    = findsyncorbit(RINGData.Lattice, ( C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2)/2, 1:length(RINGData.Lattice)+1);
5340436         <span class="keyword">else</span>
5350437             ORBITPLUS = findsyncorbit(RINGData.Lattice, -C*DeltaRF*RINGData.CavityHarmNumber/RINGData.CavityFrequency^2, 1:length(RINGData.Lattice)+1);
5360438             ORBIT0    = findsyncorbit(RINGData.Lattice, 0, 1:length(RINGData.Lattice)+1);
5370439         <span class="keyword">end</span>
5380440         
5390441         D = ORBITPLUS([1 3],BPMData.BPMIndex) - ORBIT0([1 3],BPMData.BPMIndex);
5400442         RM(:,end) = [D(1,:)'; D(2,:)'];
5410443     <span class="keyword">end</span> 
5420444     
5430445 <span class="keyword">else</span>
5440446     error(<span class="string">'ClosedOrbitType method unknown'</span>);
5450447 <span class="keyword">end</span>
5460448</pre></div>
547<hr><address>Generated on Mon 21-May-2007 15:32:41 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address>
548</body>
549</html>
Note: See TracBrowser for help on using the repository browser.