1 | function varargout = atsummary |
---|
2 | %ATSUMMARY - Prints out the paramters of the current AT lattice |
---|
3 | % The parameters that come after the Synchrotron Integrals are |
---|
4 | % parameters that depend on the Integrals themselves. The equations to |
---|
5 | % calculate them were taken from [1]. |
---|
6 | % |
---|
7 | % [1] Alexander Wu Chao and Maury Tigner, Handbook of Accelerator Physics |
---|
8 | % and Engineering (World Scientific, Singapore, 1998), pp. 183-187. (or |
---|
9 | % 187-190 in ed. 2) |
---|
10 | |
---|
11 | % |
---|
12 | % Written by Eugene Tan |
---|
13 | % Revised by Laurent S. Nadolski |
---|
14 | |
---|
15 | |
---|
16 | global THERING GLOBVAL |
---|
17 | |
---|
18 | % if exist('sum','var') |
---|
19 | % clear global sum; |
---|
20 | % global sum; |
---|
21 | % end |
---|
22 | |
---|
23 | % Structure to store info |
---|
24 | sum.e0 = GLOBVAL.E0*1e-9; |
---|
25 | sum.circumference = findspos(THERING, length(THERING)+1); |
---|
26 | sum.revTime = sum.circumference / 2.99792458e8; |
---|
27 | sum.revFreq = 2.99792458e8 / sum.circumference; |
---|
28 | sum.gamma = sum.e0 / 0.51099906e-3; |
---|
29 | sum.beta = sqrt(1 - 1/sum.gamma); |
---|
30 | [TD sum.tunes sum.chromaticity] = twissring(THERING, 0, 1:length(THERING)+1, 'chrom', 1e-8); |
---|
31 | sum.compactionFactor = mcf(THERING); |
---|
32 | |
---|
33 | % For calculating the synchrotron integrals |
---|
34 | temp = cat(2,TD.Dispersion); |
---|
35 | D_x = temp(1,:)'; |
---|
36 | D_x_ = temp(2,:)'; |
---|
37 | beta = cat(1, TD.beta); |
---|
38 | alpha = cat(1, TD.alpha); |
---|
39 | gamma = (1 + alpha.^2) ./ beta; |
---|
40 | circ = TD(length(THERING)+1).SPos; |
---|
41 | |
---|
42 | % Synchrotron integral calculation |
---|
43 | sum.integrals = [0.0 0.0 0.0 0.0 0.0 0.0]; |
---|
44 | |
---|
45 | for i = 1:length(THERING), |
---|
46 | if isfield(THERING{i}, 'BendingAngle') && isfield(THERING{i}, 'EntranceAngle') |
---|
47 | rho = THERING{i}.Length/THERING{i}.BendingAngle; |
---|
48 | dispersion = 0.5*(D_x(i)+D_x(i+1)); |
---|
49 | sum.integrals(1) = sum.integrals(1) + dispersion*THERING{i}.Length/rho; |
---|
50 | sum.integrals(2) = sum.integrals(2) + THERING{i}.Length/(rho^2); |
---|
51 | sum.integrals(3) = sum.integrals(3) + THERING{i}.Length/(rho^3); |
---|
52 | % For general wedge magnets |
---|
53 | sum.integrals(4) = sum.integrals(4) + ... |
---|
54 | D_x(i)*tan(THERING{i}.EntranceAngle)/rho^2 + ... |
---|
55 | (1 + 2*rho^2*THERING{i}.PolynomB(2))*(D_x(i)+D_x(i+1))*THERING{i}.Length/(2*rho^3) + ... |
---|
56 | D_x(i+1)*tan(THERING{i}.ExitAngle)/rho^2; |
---|
57 | % sum.integrals(4) = sum.integrals(4) + 2*0.5*(D_x(i)+D_x(i+1))*THERING{i}.Length/rho^3; |
---|
58 | H1 = beta(i,1)*D_x_(i)*D_x_(i)+2*alpha(i)*D_x(i)*D_x_(i)+gamma(i)*D_x(i)*D_x(i); |
---|
59 | H0 = beta(i+1,1)*D_x_(i+1)*D_x_(i+1)+2*alpha(i+1)*D_x(i+1)*D_x_(i+1)+gamma(i+1)*D_x(i+1)*D_x(i+1); |
---|
60 | sum.integrals(5) = sum.integrals(5) + THERING{i}.Length*(H1+H0)*0.5/(rho^3); |
---|
61 | % if H1+H0 < 0 |
---|
62 | % fprintf('%f %i %s\n', H1+H0, i, THERING{i}.FamName) |
---|
63 | % end |
---|
64 | sum.integrals(6) = sum.integrals(6) + ... |
---|
65 | THERING{i}.PolynomB(2)^2*dispersion^2*THERING{i}.Length; |
---|
66 | end |
---|
67 | end |
---|
68 | |
---|
69 | % Damping numbers |
---|
70 | % Use Robinson's Theorem |
---|
71 | sum.damping(1) = 1 - sum.integrals(4)/sum.integrals(2); |
---|
72 | sum.damping(2) = 1; |
---|
73 | sum.damping(3) = 2 + sum.integrals(4)/sum.integrals(2); |
---|
74 | |
---|
75 | sum.radiation = 8.846e-5*sum.e0.^4*sum.integrals(2)/(2*pi); |
---|
76 | sum.naturalEnergySpread = sqrt(3.8319e-13*sum.gamma.^2*sum.integrals(3)/(2*sum.integrals(2) + sum.integrals(4))); |
---|
77 | sum.naturalEmittance = 3.8319e-13*(sum.e0*1e3/0.510999).^2*sum.integrals(5)/(sum.damping(1)*sum.integrals(2)); |
---|
78 | |
---|
79 | % Damping times |
---|
80 | sum.radiationDamping(1) = 1/(2113.1*sum.e0.^3*sum.integrals(2)*sum.damping(1)/circ); |
---|
81 | sum.radiationDamping(2) = 1/(2113.1*sum.e0.^3*sum.integrals(2)*sum.damping(2)/circ); |
---|
82 | sum.radiationDamping(3) = 1/(2113.1*sum.e0.^3*sum.integrals(2)*sum.damping(3)/circ); |
---|
83 | |
---|
84 | % Slip factor |
---|
85 | sum.etac = sum.gamma^(-2) - sum.compactionFactor; |
---|
86 | |
---|
87 | cavind = findcells(THERING,'HarmNumber'); |
---|
88 | if ~isempty(cavind) |
---|
89 | freq = THERING{cavind(:,1)}.Frequency; |
---|
90 | v_cav = THERING{cavind(:,1)}.Voltage; |
---|
91 | else |
---|
92 | % Default |
---|
93 | freq = 352.202e6; |
---|
94 | v_cav = 3e6; |
---|
95 | end |
---|
96 | sum.harmon = sum.circumference/(2.99792458e8/freq); % Assuming 499.654MHz RF |
---|
97 | sum.overvoltage = v_cav/(sum.radiation*1e9); % Assuming 3e6 volt cavities. |
---|
98 | % Assuming the harmon and overvoltage above. |
---|
99 | % references: H. Winick, "Synchrotron Radiation Sources: A Primer", |
---|
100 | % World Scientific Publishing, Singapore, pp92-95. (1995) |
---|
101 | % Wiedemann, pp290,350. Chao, pp189. |
---|
102 | sum.syncphase = pi - asin(1/sum.overvoltage); |
---|
103 | sum.energyacceptance = sqrt(v_cav*sin(sum.syncphase)*2*(sqrt(sum.overvoltage^2-1) - acos(1/sum.overvoltage))/(pi*sum.harmon*abs(sum.etac)*sum.e0*1e9)); |
---|
104 | sum.synctune = sqrt((sum.etac*sum.harmon*v_cav*cos(sum.syncphase))/(2*pi*sum.e0*1e9)); |
---|
105 | sum.bunchlength = sum.beta*299792458*abs(sum.etac)*sum.naturalEnergySpread/(sum.synctune*sum.revFreq*2*pi); |
---|
106 | |
---|
107 | % optics |
---|
108 | [bx by] = modelbeta; |
---|
109 | [ax ay] = modelalpha; |
---|
110 | [etax etay] = modeleta; |
---|
111 | [etaprimex etaprimey] = modeletaprime; |
---|
112 | |
---|
113 | SeparatorString = ' ******************************************************************\n'; |
---|
114 | fprintf('\n'); |
---|
115 | fprintf(' ************* Summary for ''%s'' ************\n', GLOBVAL.LatticeFile); |
---|
116 | fprintf(' Energy: \t\t\t% 4.5f [GeV]\n', sum.e0); |
---|
117 | fprintf(' Gamma: \t\t\t% 4.5f \n', sum.gamma); |
---|
118 | fprintf(' Circumference: \t\t% 4.5f [m]\n', sum.circumference); |
---|
119 | fprintf(' Revolution time: \t\t% 4.5f [ns] (%4.5f [MHz]) \n', sum.revTime*1e9,sum.revFreq*1e-6); |
---|
120 | fprintf(' Betatron tune H: \t\t% 4.5f (%4.5f [kHz])\n', sum.tunes(1),sum.tunes(1)/sum.revTime*1e-3); |
---|
121 | fprintf(' V: \t\t% 4.5f (%4.5f [kHz])\n', sum.tunes(2),sum.tunes(2)/sum.revTime*1e-3); |
---|
122 | fprintf(' Momentum Compaction Factor: \t% 4.5e\n', sum.compactionFactor); |
---|
123 | fprintf(' Chromaticity H: \t\t%+4.5f\n', sum.chromaticity(1)); |
---|
124 | fprintf(' V: \t\t%+4.5f\n', sum.chromaticity(2)); |
---|
125 | fprintf(SeparatorString); |
---|
126 | fprintf(' Synchrotron Integral 1: \t% 4.5e [m]\n', sum.integrals(1)); |
---|
127 | fprintf(' 2: \t% 4.5e [m^-1]\n', sum.integrals(2)); |
---|
128 | fprintf(' 3: \t% 4.5e [m^-2]\n', sum.integrals(3)); |
---|
129 | fprintf(' 4: \t% 4.5e [m^-1]\n', sum.integrals(4)); |
---|
130 | fprintf(' 5: \t% 4.5e [m^-1]\n', sum.integrals(5)); |
---|
131 | fprintf(' 6: \t% 4.5e [m^-1]\n', sum.integrals(6)); |
---|
132 | fprintf(' Damping Partition H: \t% 4.5f\n', sum.damping(1)); |
---|
133 | fprintf(' V: \t% 4.5f\n', sum.damping(2)); |
---|
134 | fprintf(' E: \t% 4.5f\n', sum.damping(3)); |
---|
135 | fprintf(' Radiation Loss: \t\t% 4.5f [keV]\n', sum.radiation*1e6); |
---|
136 | fprintf(' Natural Energy Spread: \t% 4.5e\n', sum.naturalEnergySpread); |
---|
137 | fprintf(' Natural Emittance: \t\t% 4.5e [mrad]\n', sum.naturalEmittance); |
---|
138 | fprintf(' Radiation Damping H: \t% 4.5f [ms]\n', sum.radiationDamping(1)*1e3); |
---|
139 | fprintf(' V: \t% 4.5f [ms]\n', sum.radiationDamping(2)*1e3); |
---|
140 | fprintf(' E: \t% 4.5f [ms]\n', sum.radiationDamping(3)*1e3); |
---|
141 | fprintf(' Slip factor : \t\t%4.5e\n', sum.etac); |
---|
142 | fprintf(SeparatorString); |
---|
143 | fprintf(' Assuming cavities Voltage: \t% 4.5f [kV]\n', v_cav/1e3); |
---|
144 | fprintf(' Frequency: \t%4.5f [MHz]\n', freq/1e6); |
---|
145 | fprintf(' Harmonic Number: \t% 4.5f\n', sum.harmon); |
---|
146 | fprintf(' Overvoltage factor: \t\t% 4.5f\n', sum.overvoltage); |
---|
147 | fprintf(' Synchronous Phase: \t\t% 4.5f [rad] (%4.5f [deg])\n', sum.syncphase, sum.syncphase*180/pi); |
---|
148 | fprintf(' Linear Energy Acceptance: \t% 4.5f%%\n', sum.energyacceptance*100); |
---|
149 | fprintf(' Synchrotron Tune: \t\t% 4.5f (%4.5f kHz or %4.2f turns) \n', sum.synctune, sum.synctune/sum.revTime*1e-3, 1/sum.synctune); |
---|
150 | fprintf(' Bunch Length: \t\t% 4.5f [mm] (%4.5f ps)\n', sum.bunchlength*1e3, sum.bunchlength/3e8*1e12); |
---|
151 | fprintf(SeparatorString); |
---|
152 | fprintf(' Injection:\n H: beta=% 4.3f [m] alpha =% 4.1e eta =% 4.3f [m] eta'' =% 4.1e \n', bx(1), ax(1), etax(1), etaprimex(1)); |
---|
153 | fprintf(' V: beta=% 4.3f [m] alpha =% 4.1e eta =% 4.3f [m] eta'' =% 4.1e \n', by(1), ay(1), etay(1), etaprimey(1)); |
---|
154 | fprintf(' ********** End of Summary for ''%s'' **********\n', GLOBVAL.LatticeFile); |
---|
155 | fprintf('\n'); |
---|
156 | |
---|
157 | if nargout > 0 |
---|
158 | varargout{1} = sum; |
---|
159 | end |
---|