Skip to content

Commit 25802a3

Browse files
authored
atenergy computes the harmonic number from the RF frequency (#350)
* atenergy: compute harmonic number from RF frequency * Modified help * Modified help * Use atGetRingProperties * Use cavpts
1 parent db18253 commit 25802a3

File tree

3 files changed

+59
-87
lines changed

3 files changed

+59
-87
lines changed
Lines changed: 47 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,68 @@
11
function [energy,nbper,voltage,harmnumber,U0]=atenergy(ring)
22
%ATENERGY Gets the lattice energy
33
%
4-
% ENERGY=ATENERGY(RING) Gets the RING energy
5-
% ATENERGY looks for the machine energy in:
6-
% 1) the 1st 'RingParam' element
7-
% 2) the 1st 'RFCavity' element
8-
% 3) the field "E0" of the global variable "GLOBVAL"
9-
% 4) The field "Energy" in any element
10-
%
11-
% INPUTS
12-
% 1. ring Ring structure
4+
% ENERGY=ATENERGY(RING)
5+
% [ENERGY,PERIODS]=atenergy(RING)
6+
% [ENERGY,PERIODS,VOLTAGE,HARMNUMBER]=atenergy(RING)
7+
% [ENERGY,PERIODS,VOLTAGE,HARMNUMBER,U0]=atenergy(RING)
138
%
14-
% OUPUTS
15-
% 1. energy Ring energy in eV
16-
% 2. nbper Number of periods to make 2pi phase advance
17-
% 3. voltage Total RF voltage
18-
% 4. harmnumber Harmonic number
19-
% 5. U0 Energy loss per turn in eV
9+
% Warning: To get ENERGY, PERIODS and HARMNUMBER, use atGetRingProperties
10+
% To get U0, use atgetU0
2011
%
21-
% NOTES
22-
% 1. Check for 2 pi phase advance if more than 2 ouput arguments
12+
% RING Ring structure
2313
%
24-
% EXAMPLES
25-
% 1. [ENERGY,PERIODS]=atenergy(ring) also outputs the number of periods
26-
% 2. [ENERGY,PERIODS,VOLTAGE,HARMNUMBER]=atenergy(ring) also outputs the harmonic number
27-
% 3. [ENERGY,PERIODS,VOLTAGE,HARMNUMBER,U0]=atenergy(ring) also outputs total losses in eV
14+
% ENERGY Ring energy
15+
% ATENERGY looks for the machine energy in:
16+
% 1) the 1st 'RingParam' element
17+
% 2) the 'RFCavity' with the lowest frequency
18+
% 3) the field "E0" of the global variable "GLOBVAL"
19+
% 4) The field "Energy" in any element
20+
% PERIODS Number of periods
21+
% VOLTAGE Total RF voltage for the main cavities. The main cavities
22+
% are the ones with the lowest frequency
23+
% HARMNUMBER Harmonic number. Computed from the frequency of the main cavities
24+
% U0 Total energy loss per turn
2825
%
29-
% See also atgetU0 atsetcavity atenergy
26+
% See also atGetRingProperties atgetU0 atsetcavity
3027

31-
global GLOBVAL
32-
TWO_PI_ERROR = 1.e-4;
33-
34-
params = atgetcells(ring(:,1),'Class','RingParam');
35-
cavities = atgetcells(ring(:,1),'Frequency');
36-
37-
if any(params) % case RingParam is defined in the lattice
38-
parmelem=ring{find(params,1)};
39-
energy=parmelem.Energy;
40-
if nargout >= 2
41-
nbper=parmelem.Periodicity;
42-
end
43-
else % else look for energy in cavity or GLOBVAL
44-
E0s = atgetfieldvalues(ring,'Energy');
45-
E0s = E0s(isfinite(E0s)); % Discard undefined values
46-
if any(cavities) && isfield(ring{find(cavities,1)},'Energy')
47-
energy=ring{find(cavities,1)}.Energy;
48-
elseif isfield(GLOBVAL,'E0')
49-
energy=GLOBVAL.E0;
50-
elseif length(unique(E0s)) == 1
51-
energy = unique(E0s);
52-
elseif length(unique(E0s)) > 1
53-
error('AT:NoEnergy','Energy field not equal for all elements')
28+
s=warning; % Save the warning state
29+
warning('Off','AT:NoRingParam'); % Disable warning
30+
props = atGetRingProperties(ring); % Get ring propeties
31+
warning(s); % Restore the warning state
32+
energy = props.Energy;
33+
nbper = props.Periodicity;
34+
35+
if nargout >= 3
36+
if isfield(props, 'cavpts')
37+
maincavs = ring(props.cavpts);
5438
else
55-
error('AT:NoEnergy',...
56-
['Energy not defined (searched in '...
57-
'''RingParam'',''RFCavity'',GLOBVAL.E0,',...
58-
' field ''Energy'' of each element)']);
59-
end
60-
if nargout >= 2 % get number of periods
61-
dipoles = atgetcells(ring(:,1),'BendingAngle');
62-
theta = atgetfieldvalues(ring(dipoles),'BendingAngle');
63-
if size(ring,2) > 1
64-
nbper=size(ring,2);
65-
else % Guess number of periods based on the total bending angle
66-
nbp=2*pi/sum(theta);
67-
nbper=round(nbp);
68-
if ~isfinite(nbp)
69-
warning('AT:WrongNumberOfCells','No bending in the cell, ncells set to 1');
70-
nbper=1;
71-
elseif abs(nbp-nbper) > TWO_PI_ERROR
72-
warning('AT:WrongNumberOfCells','non integer number of cells: ncells = %g -> %g',nbp,nbper);
73-
end
74-
end
39+
maincavs = findmaincavs(ring);
7540
end
76-
end
77-
78-
% Get total cavity voltage and harmonic number
79-
if nargout >= 3
80-
if any(cavities) % sum over cavity number
81-
voltage=nbper*sum(atgetfieldvalues(ring(cavities),'Voltage'));
82-
harmnumber=nbper*atgetfieldvalues(ring(find(cavities,1)),'HarmNumber');
41+
if ~isempty(maincavs)
42+
voltage=nbper*sum(atgetfieldvalues(maincavs,'Voltage'));
8343
elseif nargout >= 5
8444
voltage=NaN;
85-
harmnumber=NaN;
8645
else
8746
error('AT:NoCavity','No cavity element in the ring');
8847
end
8948
end
90-
91-
% get energy loss per turn
49+
if nargout >= 4
50+
harmnumber = props.HarmNumber;
51+
end
9252
if nargout >= 5
9353
U0 = atgetU0(ring);
9454
end
9555

56+
function cavs=findmaincavs(ring)
57+
cavities = atgetcells(ring,'Frequency');
58+
if any(cavities)
59+
freqs = atgetfieldvalues(ring(cavities), 'Frequency');
60+
[~,~,ic]=unique(freqs);
61+
cavities(cavities) = (ic == 1);
62+
cavs = ring(cavities);
63+
else
64+
cavs={};
65+
end
66+
end
67+
9668
end

atmat/lattice/atfindparam.m

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,19 @@
4141
parmelem = strupdate(parmelem, newparms);
4242
new_nper = parmelem.Periodicity;
4343
if ~isfield(parmelem, 'Particle')
44-
parmelem.Particle = saveobj(atparticle('electron'));
44+
parmelem.Particle = saveobj(atparticle('relativistic'));
4545
end
4646
if isfield(newparms, 'HarmNumber')
4747
check_h(newparms.HarmNumber, parmelem.Periodicity);
4848
elseif ~isfield(parmelem, 'HarmNumber')
49-
maincav = findmaincav(ring(atgetcells(ring,'Frequency')));
50-
if ~isempty(maincav)
49+
if isfield(parmelem, 'cavpts')
50+
maincavs = ring(props.cavpts);
51+
else
52+
maincavs = findmaincav(ring(atgetcells(ring,'Frequency')));
53+
end
54+
if ~isempty(maincavs)
5155
gamma = parmelem.Energy / parmelem.Particle.rest_energy;
52-
h = parmelem.Periodicity * cellharmnumber(ring, maincav, gamma);
56+
h = parmelem.Periodicity * cellharmnumber(ring, maincavs(1), gamma);
5357
parmelem.HarmNumber = h;
5458
end
5559
elseif new_nper ~= old_nper
@@ -152,13 +156,9 @@
152156

153157
function cellh=cellharmnumber(ring, maincav, gamma)
154158
% Extract the harmonic number from the main cavity
155-
if isfield(maincav, 'HarmNumber')
156-
cellh = maincav.HarmNumber;
157-
else
158-
vel = sqrt(1-1/gamma/gamma)*PhysConstant.speed_of_light_in_vacuum.value;
159-
cellfrev = vel / findspos(ring, length(ring)+1);
160-
cellh = round(maincav.Frequency/cellfrev);
161-
end
159+
vel = sqrt(1-1/gamma/gamma)*PhysConstant.speed_of_light_in_vacuum.value;
160+
cellfrev = vel / findspos(ring, length(ring)+1);
161+
cellh = round(maincav.Frequency/cellfrev);
162162
end
163163

164164
function str = strupdate(str, str2)

atmat/lattice/atparticle.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
% REST_ENERGY Rest energy [eV]
4141
% CHARGE Charge [elementary charge]
4242

43-
if ~strcmp(name,'electron')
43+
if ~strcmp(name,'relativistic')
4444
warning('AT:particle','AT tracking still assumes beta==1. Make sure your particle is ultra-relativistic');
4545
end
4646
try

0 commit comments

Comments
 (0)