source: MML/trunk/at/lattice/mkparamgroup.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: 5.9 KB
Line 
1function P = mkparamgroup(LATTICE,varargin)
2%MKPARAMGROUP simplifies creation of AT parameter groups
3% It group one or more elements in the
4% same family and simultaneously vary
5%
6% MKPARAMGROUP(LATTICE,ELEMINDEX,PARAMSTR)
7% MKPARAMGROUP(LATTICE,FAMNAMESTR,PARAMSTR)
8% MKPARAMGROUP(LATTICE,FAMNAMESTR,KIDNUM,PARAMSTR)
9%
10% EXAMPLES
11%1. mkparamgroup(THERING,ATINDEX.QPF,'K');
12%
13% PARAMSTR: 'K','K1', 'K2', 'KS1','PB1'
14%
15% See also  atparamgroup restoreparamgroup saveparamgroup
16
17% Revision History:
18%   2002-06-26 Christoph Steier
19%       Added skew quadrupole gradient (KS1) as one possible parameter
20%
21%   2004-02-09 WJC
22%       'TILT','K1','K2','K3' changed index 'i' to 'k'
23%
24%   2005-01-23 Laurent S. Nadolski
25%       correction error function misused
26
27
28if isnumeric(varargin{1})
29    if ~((nargin==3) && ischar(varargin{2}))
30        error('The third argument must be a string')
31    else
32        INDEX    = varargin{1};
33        KIDNUM   = 1:length(INDEX);
34        PARAMSTR = varargin{2};
35    end
36else
37    FAMNAMESTR = varargin{1};
38    INDEX      = findcells(LATTICE,'FamName',FAMNAMESTR);
39    if(isempty(INDEX))
40        error(['No elements that belong to the family ''',FAMNAMESTR,...
41            ''' found in the lattice ',inputname(1)]);
42    end
43    if isnumeric(varargin{2})
44        KIDNUM   = varargin{2};
45        PARAMSTR = varargin{3};
46    else
47        KIDNUM   = 1:length(INDEX);
48        PARAMSTR = varargin{2};
49    end
50end
51
52switch lower(PARAMSTR)
53    case {'k1','k'} % Quadrupole
54        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'K')
55            error(['Element ',int2str(KIDNUM(1)),' does not have field ''K''']);
56        end
57        P1 = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','K','Function',inline('x'));
58        [P1.FieldIndex] = deal({1,1});
59        [P1.Args]       = deal({});
60
61        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'PolynomB')
62            error(['Element ',int2str(KIDNUM(1)),' does not have field ''PolynomB''']);
63        end
64        P2 = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','PolynomB','Function',inline('x'));
65        [P2.FieldIndex] = deal({1,2});
66        [P2.Args]       = deal({});
67
68        for k = 1:length(KIDNUM)
69            P1(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.K;
70            P2(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.PolynomB(2);
71        end
72        P = reshape([P1;P2],1,2*length(P1));
73
74    case 'k2' % sextupoles
75
76        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'PolynomB')
77            error('Element ',int2str(KIDNUM(1)),' does not have field ''PolynomB''');
78        end
79        P = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','PolynomB','Function',inline('x'));
80        [P.FieldIndex] = deal({1,3});
81        [P.Args]       = deal({});
82        for k = 1:length(KIDNUM)
83            P(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.PolynomB(3);
84        end
85
86    case 'k3' % Octupoles
87        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'PolynomB')
88            error(['Element ',int2str(KIDNUM(1)),' does not have field ''PolynomB''']);
89        end
90        P = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','PolynomB','Function',inline('x'));
91        [P.FieldIndex]=deal({1,4});
92        [P.Args]=deal({});
93        for k = 1:length(KIDNUM)
94            P(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.PolynomB(4);
95        end
96
97    case 'tilt'
98        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'R1')
99            error(['Element ',int2str(KIDNUM(1)),' does not have field ''R1''']);
100        end
101        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'R2')
102            error(['Element ',int2str(KIDNUM(1)),' does not have field ''R2''']);
103        end
104
105        P1 = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','R1','Function',inline('mksrollmat(x)'));
106        [P1.FieldIndex]=deal({1:6,1:6});
107        [P1.Args]=deal({});
108
109        P2 = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','R2','Function',inline('mksrollmat(-x)'));
110        [P2.FieldIndex]=deal({1:6,1:6});
111        [P2.Args]=deal({});
112
113        for k = 1:length(KIDNUM)
114            P1(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.R1;
115            P2(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.R2;
116        end
117        P = reshape([P1;P2],1,2*length(P1));
118
119    case {'k1','k'}
120        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'K')
121            error('Element ',int2str(KIDNUM(k)),' does not have field ''K''');
122        end
123
124        P1 = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','K','Function',inline('x'));
125        [P1.FieldIndex]=deal({1,1});
126        [P1.Args]=deal({});
127
128        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'PolynomB')
129            error('Element ',int2str(KIDNUM(1)),' does not have field ''PolynomB''');
130        end
131        P2 = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','PolynomB','Function',inline('x'));
132        [P2.FieldIndex]=deal({1,2});
133        [P2.Args]=deal({});
134
135        for k = 1:length(KIDNUM)
136            P1(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.K;
137            P2(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.PolynomB(2);
138        end
139        P = reshape([P1;P2],1,2*length(P1));
140
141    case {'s','s1', 'ks1'}
142        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'PolynomA')
143            error(['Element ',int2str(KIDNUM(1)),' does not have field ''PolynomA''']);
144        end
145        P = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','PolynomA','Function',inline('x'));
146        [P.FieldIndex] = deal({1,2});
147        [P.Args]       = deal({});
148        for k = 1:length(KIDNUM)
149            P(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.PolynomA(2);
150        end
151
152    case 'pb1'
153        if ~isfield(LATTICE{INDEX(KIDNUM(1))},'PolynomB')
154            error(['Element ',int2str(KIDNUM(1)),' does not have field ''PolynomB''']);
155        end
156        P = struct('ElemIndex',num2cell(INDEX(KIDNUM)),'FieldName','PolynomB','Function',inline('x'));
157        [P.FieldIndex] = deal({1,2});
158        [P.Args]       = deal({});
159        for k = 1:length(KIDNUM)
160            P(k).SavedValue = LATTICE{INDEX(KIDNUM(k))}.PolynomB(2);
161        end
162end
Note: See TracBrowser for help on using the repository browser.