source: MML/trunk/at/atphysics/fittune2.m @ 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: 3.1 KB
Line 
1function varargout =  fittune2(newtunes, quadfam1, quadfam2, varargin);
2%FITTUNE2 fits linear tunes of THERING using 2 quadrupole families
3% FITTUNE2(NEWTUNES,QUADFAMILY1,QUADFAMILY2)
4%  INPUTS
5%  1. newtunes - 2D tune vector to fit to
6%  2. quadfam1 - Family name for the first quadrupole family
7%  3. quadfam1 - Family name for the second quadrupole family
8%  4. delta    - Kvariation for computing Jacobian matrix
9%  5. Display  - Displays fitting results {default}
10%     NoDisplay- Do not displays fitting results
11%
12%  EXAMPLES
13%  1. fittune2([0.2 0.3],'Q7','Q9')
14%
15%  See Also fitchrom2
16
17%
18%  Written by Andrei Terebilo
19%  Modified by Laurent S. Nadolski
20%  MARCH 25, 2005 - Take into account thin sextupoles
21%                 - Display Flag
22
23DisplayFlag = 1;
24
25%% Optional Input data parser
26for i = length(varargin):-1:1
27    if strcmpi(varargin{i},'Display')
28        DisplayFlag = 1;
29        varargin(i) = [];
30    elseif strcmpi(varargin{i},'NoDisplay')
31        DisplayFlag = 0;
32        varargin(i) = [];
33    end
34end
35
36% Must declare THERING as global in order for the function to modify quadrupole values
37global THERING
38if length(varargin) > 3 % use externally supplied step size for quadrupole K-values
39    delta = varargin{1}
40else
41    delta = 1e-6; % default step size for quadrupole K-values
42end
43% find indexes of the 2 quadrupole families use for fitting
44Q1I = findcells(THERING,'FamName',quadfam1);
45Q2I = findcells(THERING,'FamName',quadfam2);
46
47InitialK1 = getcellstruct(THERING,'K',Q1I);
48InitialK2 = getcellstruct(THERING,'K',Q2I);
49InitialPolB1 = getcellstruct(THERING,'PolynomB',Q1I,2);
50InitialPolB2 = getcellstruct(THERING,'PolynomB',Q2I,2);
51
52%% Compute initial tunes before fitting
53[ LD, InitialTunes] = linopt(THERING,0);
54
55TempTunes = InitialTunes;
56TempK1 = InitialK1;
57TempK2 = InitialK2;
58TempPolB1 = InitialPolB1;
59TempPolB2 = InitialPolB2;
60
61%% Take Derivative
62THERING = setcellstruct(THERING,'K',Q1I,TempK1+delta);
63THERING = setcellstruct(THERING,'PolynomB',Q1I,TempPolB1+delta,2);
64[LD , Tunes_dK1 ] = linopt(THERING,0);
65THERING = setcellstruct(THERING,'K',Q1I,TempK1);
66THERING = setcellstruct(THERING,'PolynomB',Q1I,TempPolB1,2);
67THERING = setcellstruct(THERING,'K',Q2I,TempK2+delta);
68THERING = setcellstruct(THERING,'PolynomB',Q2I,TempPolB2+delta,2);
69[LD , Tunes_dK2 ] = linopt(THERING,0);
70THERING = setcellstruct(THERING,'K',Q2I,TempK2);
71THERING = setcellstruct(THERING,'PolynomB',Q2I,TempPolB2,2);
72
73%% Construct the Jacobian
74J = ([Tunes_dK1(:) Tunes_dK2(:)] - [TempTunes(:) TempTunes(:)])/delta;
75Jinv = inv(J);
76
77dnu = (newtunes(:) - TempTunes(:));
78dK = Jinv*dnu;
79
80TempK1 = TempK1+dK(1);
81TempK2 = TempK2+dK(2);
82TempPolB1 = TempPolB1 + dK(1);
83TempPolB2 = TempPolB2 + dK(2);
84
85THERING = setcellstruct(THERING,'K',Q1I,TempK1);
86THERING = setcellstruct(THERING,'PolynomB',Q1I,TempPolB1,2);
87THERING = setcellstruct(THERING,'K',Q2I,TempK2);
88THERING = setcellstruct(THERING,'PolynomB',Q2I,TempPolB2,2);
89
90[LD,TempTunes] = linopt(THERING,0);
91
92%InitialK1 - TempK1;
93%InitialK2 - TempK2;
94%TempTunes
95
96%% Display how good is the fit
97if DisplayFlag
98    fprintf('Desired tunes nux=%f nuz=%f\n',newtunes);
99    [tune xi] = tunechrom(THERING,0,'chrom');
100    fprintf('Reached tunes nux=%f nuz=%f\n',TempTunes);
101end
Note: See TracBrowser for help on using the repository browser.