1 | function k = amp2k(Family, Field, Amps, DeviceList, Energy, C, K2AmpScaleFactor) |
---|
2 | %AMP2K - Converts amperes to simulator values |
---|
3 | % |
---|
4 | % Customized for ThomX by Jianfeng Zhang @ LAL, 21/06/2013 |
---|
5 | % |
---|
6 | % |
---|
7 | % k = amp2k(Family, Field, Amps, DeviceList, Energy, Coefficients, K2AmpScaleFactor) |
---|
8 | % or |
---|
9 | % k = amp2k(Family, Field, Amps, DeviceList, Energy, MagnetCoreType, K2AmpScaleFactor) |
---|
10 | % |
---|
11 | % Calculates the "K-value" from the coefficients (or MagnetCoreType), current [amps], energy, and linear scale factor |
---|
12 | % |
---|
13 | % A Coefficients vector or a MagnetCoreType string (coefficient found from magnetcoefficents.m) can be used |
---|
14 | % Amps and Coefficients must have equal number of rows or one must only have one row |
---|
15 | % INPUTS |
---|
16 | % 1. Family - Family Name |
---|
17 | % 2. Field - Family Field (like 'Setpoint') |
---|
18 | % 3. Amps - Ampere vector to convert |
---|
19 | % 4. DeviceList - Device list (Amps and DeviceList must have the same |
---|
20 | % number of rows) |
---|
21 | % 5. Energy - Energy in GeV {Default: getenergy} |
---|
22 | % If Energy is a vector, each output column will correspond to that energy. |
---|
23 | % Energy can be anything getenergy accepts, like 'Model' or 'Online'. |
---|
24 | % (Note: If Energy is a vector, then Amps can only have 1 |
---|
25 | % column)Family, Field, value(:,i), DeviceList, Energy, ParamsList{:} |
---|
26 | % 6. C - % A Coefficients vector or a MagnetCoreType string (coefficient found from magnetcoefficents.m) can be used |
---|
27 | % Amps and Coefficients must have equal number of rows or one must only |
---|
28 | % have one row |
---|
29 | % 7. K2AmpScaleFactor - linearly scales the input current: Amps = Amps ./ K2AmpScaleFactor |
---|
30 | % This can be used to account for linear calibration errors of the power supply and magnet |
---|
31 | % |
---|
32 | % OUTPUT |
---|
33 | % 1. K and B - K-value and field in AT convention |
---|
34 | % For dipole: k = B / Brho |
---|
35 | % For quadrupole: k = B'/ Brho |
---|
36 | % For sextupole: k = B"/ Brho / 2 (to be compatible with AT) |
---|
37 | % |
---|
38 | % NOTES |
---|
39 | % 1. If energy is not an input or empty, then the energy is obtained from getenergy. |
---|
40 | % 2. Family and Field inputs are not used but there automatically part of the hw2physics call. |
---|
41 | % |
---|
42 | % See Also k2amp, magnetcoefficients |
---|
43 | |
---|
44 | % ALGORITHM |
---|
45 | % |
---|
46 | % k = (c0 + c1*I + ... + cn*I^n)/Brho |
---|
47 | |
---|
48 | % |
---|
49 | % Written by M. Yoon 4/8/03 |
---|
50 | % Adapted by Laurent S. Nadolski |
---|
51 | |
---|
52 | if nargin < 4 |
---|
53 | error('At least 4 inputs required'); |
---|
54 | end |
---|
55 | |
---|
56 | if nargin < 6 |
---|
57 | C = []; |
---|
58 | end |
---|
59 | if isempty(C) |
---|
60 | %[C, Leff, MagnetName] = magnetcoefficients(Family); |
---|
61 | C = getfamilydata(Family, Field, 'HW2PhysicsParams', DeviceList); |
---|
62 | C = C{1}; |
---|
63 | %Leff = getleff(Family, DeviceList(ii,:)); |
---|
64 | end |
---|
65 | |
---|
66 | if nargin < 5 |
---|
67 | Energy = []; |
---|
68 | end |
---|
69 | if isempty(Energy) |
---|
70 | Energy = getenergy; % like getenergy('Production') |
---|
71 | elseif ischar(Energy) |
---|
72 | Energy = getenergy(Energy); |
---|
73 | end |
---|
74 | |
---|
75 | |
---|
76 | % If Amps is a row vector make it a column vector |
---|
77 | Amps = Amps(:); |
---|
78 | |
---|
79 | % Scale solution if required |
---|
80 | if nargin >= 7 |
---|
81 | Amps = Amps ./ K2AmpScaleFactor; |
---|
82 | end |
---|
83 | |
---|
84 | brho = getbrho(Energy); |
---|
85 | |
---|
86 | % Compute polynomial expansion: polynom = c0 + c1*I ... |
---|
87 | % For dipole: polynom = B * Leff / I |
---|
88 | % For quadrupole: polynom = B' * Leff / I |
---|
89 | % For sextupole: polynom = B" * Leff / I (use AT unit /2 from MAD units) |
---|
90 | |
---|
91 | % polynom = (C(8)+C(7)*Amps+C(6)*Amps^2+C(5)*Amps^3+C(4)*Amps^4+C(3)*Amps^5+C(2)*Amps^6+C(1)*Amps^7) |
---|
92 | % polynom = (c0+c1*Amps+c2*Amps^2+c3*Amps^3+c4*Amps^4+c5*Amps^5+c6*Amps^6+c7*Amps^7) |
---|
93 | |
---|
94 | if isstr(C) |
---|
95 | TableLookUpFlag = 1; |
---|
96 | MagnetCoreType = C; |
---|
97 | [C, Leff, MagnetName] = magnetcoefficients(MagnetCoreType, Amps(1)); |
---|
98 | Amps0 = Amps(1); |
---|
99 | else |
---|
100 | TableLookUpFlag = 0; |
---|
101 | end |
---|
102 | |
---|
103 | if any(size(C,1) ~= length(Amps)) |
---|
104 | if length(Amps) == 1 |
---|
105 | Amps = ones(size(C,1),1) * Amps; |
---|
106 | elseif size(C,1) == 1 |
---|
107 | %C = ones(size(Amps,1),1) * C; |
---|
108 | else |
---|
109 | error('Amps and Coefficients must have equal number of rows or one must only have one row'); |
---|
110 | end |
---|
111 | end |
---|
112 | |
---|
113 | % B, B', or B" scaled by energy |
---|
114 | for i = 1:length(Amps) |
---|
115 | % For piecewise tables, get a new polynomial |
---|
116 | if TableLookUpFlag |
---|
117 | if Amps(i) ~= Amps0; |
---|
118 | [C, Leff, MagnetName] = magnetcoefficients(MagnetCoreType, Amps(i)); |
---|
119 | Amps0 = Amps(i); |
---|
120 | end |
---|
121 | end |
---|
122 | |
---|
123 | if size(C,1) == 1 |
---|
124 | k(i,1) = polyval(C, Amps(i)) / brho; |
---|
125 | else |
---|
126 | k(i,1) = polyval(C(i,:), Amps(i)) / brho; |
---|
127 | end |
---|
128 | end |
---|
129 | |
---|
130 | |
---|
131 | % switch upper(deblank(MagnetName)) |
---|
132 | % case 'BEND' |
---|
133 | % k = (Amps/brho)*polynom/Leff; % B scaled by energy |
---|
134 | % %BLeff = Amps*polynom; |
---|
135 | % %B = BLeff/Leff; |
---|
136 | % |
---|
137 | % case 'QUAD' |
---|
138 | % k = (Amps/brho)*polynom/Leff; % B' scaled by energy |
---|
139 | % %BPrimeLeff = Amps*polynom; |
---|
140 | % %Bprime = BPrimeLeff/Leff; |
---|
141 | % |
---|
142 | % case 'SEXT' |
---|
143 | % k = (Amps/brho)*polynom/Leff; % B" scaled by energy |
---|
144 | % %BPrimePrimeLeff = Amps*polynom; |
---|
145 | % %BPrimePrime = BPrimePrimeLeff/Leff; |
---|
146 | % end |
---|