|
1 | 1 | function [energy,nbper,voltage,harmnumber,U0]=atenergy(ring) |
2 | 2 | %ATENERGY Gets the lattice energy |
3 | 3 | % |
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) |
13 | 8 | % |
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 |
20 | 11 | % |
21 | | -% NOTES |
22 | | -% 1. Check for 2 pi phase advance if more than 2 ouput arguments |
| 12 | +% RING Ring structure |
23 | 13 | % |
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 |
28 | 25 | % |
29 | | -% See also atgetU0 atsetcavity atenergy |
| 26 | +% See also atGetRingProperties atgetU0 atsetcavity |
30 | 27 |
|
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); |
54 | 38 | 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); |
75 | 40 | 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')); |
83 | 43 | elseif nargout >= 5 |
84 | 44 | voltage=NaN; |
85 | | - harmnumber=NaN; |
86 | 45 | else |
87 | 46 | error('AT:NoCavity','No cavity element in the ring'); |
88 | 47 | end |
89 | 48 | end |
90 | | - |
91 | | -% get energy loss per turn |
| 49 | +if nargout >= 4 |
| 50 | + harmnumber = props.HarmNumber; |
| 51 | +end |
92 | 52 | if nargout >= 5 |
93 | 53 | U0 = atgetU0(ring); |
94 | 54 | end |
95 | 55 |
|
| 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 | + |
96 | 68 | end |
0 commit comments