[4] | 1 | function 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 | |
---|
| 28 | if 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 |
---|
| 36 | else |
---|
| 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 |
---|
| 50 | end |
---|
| 51 | |
---|
| 52 | switch 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 |
---|
| 162 | end |
---|