1 | function updateatindex |
---|
2 | %UPDATEATINDEX - Updates the AT indices in the MiddleLayer with the present AT lattice (THERING) |
---|
3 | |
---|
4 | % |
---|
5 | % Adapted by Laurent S. Nadolski |
---|
6 | |
---|
7 | global THERING |
---|
8 | |
---|
9 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
10 | % Append Accelerator Toolbox information % |
---|
11 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
12 | |
---|
13 | % Since changes in the AT model could change the AT indexes, etc, |
---|
14 | % It's best to regenerate all the model indices whenever a model is loaded |
---|
15 | |
---|
16 | % Sort by family first (findcells is linear and slow) |
---|
17 | Indices = atindex(THERING); |
---|
18 | |
---|
19 | AO = getao; |
---|
20 | |
---|
21 | % BPMS |
---|
22 | try |
---|
23 | ifam = 'BPMx'; |
---|
24 | AO.(ifam).AT.ATType = 'X'; |
---|
25 | AO.(ifam).AT.ATIndex = Indices.BPM(:); % findcells(THERING,'FamName','BPM')'; |
---|
26 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex)'; |
---|
27 | |
---|
28 | ifam = 'BPMz'; |
---|
29 | AO.(ifam).AT.ATType = 'Z'; |
---|
30 | AO.(ifam).AT.ATIndex = Indices.BPM(:); % findcells(THERING,'FamName','BPM')'; |
---|
31 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex)'; |
---|
32 | catch |
---|
33 | warning('BPM family not found in the model.'); |
---|
34 | end |
---|
35 | |
---|
36 | % CORRECTORS |
---|
37 | try |
---|
38 | %% HORIZONTAL CORRECTORS |
---|
39 | ifam = 'HCOR'; |
---|
40 | AO.(ifam).AT.ATType = ifam; |
---|
41 | AO.(ifam).AT.ATIndex = Indices.(ifam)(:); |
---|
42 | AO.(ifam).AT.ATIndex = AO.(ifam).AT.ATIndex(AO.(ifam).ElementList); %not all correctors used |
---|
43 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex(:,1))'; |
---|
44 | |
---|
45 | %% VERTICAL CORRECTORS |
---|
46 | ifam = 'VCOR'; |
---|
47 | AO.(ifam).AT.ATType = ifam; |
---|
48 | AO.(ifam).AT.ATIndex = Indices.(ifam)(:); |
---|
49 | AO.(ifam).AT.ATIndex = AO.(ifam).AT.ATIndex(AO.(ifam).ElementList); %not all correctors used |
---|
50 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex(:,1))'; |
---|
51 | catch |
---|
52 | warning('Corrector family not found in the model.'); |
---|
53 | end |
---|
54 | |
---|
55 | |
---|
56 | % QUADRUPOLES |
---|
57 | try |
---|
58 | ifam = 'QF'; |
---|
59 | AO.(ifam).AT.ATType = 'QUAD'; |
---|
60 | AO.(ifam).AT.ATIndex = Indices.QPF(:); |
---|
61 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex); |
---|
62 | AO.(ifam).AT.ATParameterGroup{1} = mkparamgroup(THERING,AO.(ifam).AT.ATIndex,'K'); |
---|
63 | |
---|
64 | ifam = 'QD'; |
---|
65 | AO.(ifam).AT.ATType = 'QUAD'; |
---|
66 | AO.(ifam).AT.ATIndex = Indices.QPD(:); |
---|
67 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex); |
---|
68 | AO.(ifam).AT.ATParameterGroup{1} = mkparamgroup(THERING,AO.(ifam).AT.ATIndex,'K'); |
---|
69 | catch |
---|
70 | warning('%s family not found in the model.',ifam); |
---|
71 | end |
---|
72 | |
---|
73 | % SEXTUPOLES |
---|
74 | try |
---|
75 | ifam = 'SF'; |
---|
76 | AO.(ifam).AT.ATType = 'SEXT'; |
---|
77 | AO.(ifam).AT.ATIndex = Indices.SXF(:); |
---|
78 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex); |
---|
79 | AO.(ifam).AT.ATParameterGroup{1} = mkparamgroup(THERING,AO.(ifam).AT.ATIndex,'K2'); |
---|
80 | |
---|
81 | ifam = 'SD'; |
---|
82 | AO.(ifam).AT.ATType = 'SEXT'; |
---|
83 | AO.(ifam).AT.ATIndex = Indices.SXD(:); |
---|
84 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex); |
---|
85 | AO.(ifam).AT.ATParameterGroup{1} = mkparamgroup(THERING,AO.(ifam).AT.ATIndex,'S'); |
---|
86 | catch |
---|
87 | warning('%s family not found in the model.', ifam); |
---|
88 | end |
---|
89 | |
---|
90 | |
---|
91 | % BEND |
---|
92 | |
---|
93 | try |
---|
94 | ifam = 'BEND'; |
---|
95 | AO.(ifam).AT.ATType = ifam; |
---|
96 | ATIndex = Indices.(ifam)(:); |
---|
97 | AO.(ifam).AT.ATIndex = buildatindex(AO.(ifam).FamilyName, sort(ATIndex)); |
---|
98 | AO.(ifam).Position = findspos(THERING, AO.(ifam).AT.ATIndex(:,1))'; |
---|
99 | catch |
---|
100 | warning('BEND family not found in the model.'); |
---|
101 | end |
---|
102 | |
---|
103 | % RF CAVITY |
---|
104 | try |
---|
105 | AO.RF.AT.ATType = 'RF Cavity'; |
---|
106 | AO.RF.AT.ATIndex = findcells(THERING,'Frequency')'; |
---|
107 | AO.RF.Position = findspos(THERING, AO.RF.AT.ATIndex(:,1))'; |
---|
108 | catch |
---|
109 | warning('RF cavity not found in the model.'); |
---|
110 | end |
---|
111 | |
---|
112 | setao(AO); |
---|
113 | |
---|
114 | % Set TwissData at the start of TL1 |
---|
115 | try |
---|
116 | %warning('to be completed by Alex'); |
---|
117 | % BTS twiss parameters at the input |
---|
118 | TwissData.alpha = [0 0]'; |
---|
119 | TwissData.beta = [13.8467 2.2582]'; |
---|
120 | TwissData.mu = [0 0]'; |
---|
121 | TwissData.ClosedOrbit = [0 0 0 0]'; |
---|
122 | TwissData.dP = 0; |
---|
123 | TwissData.dL = 0; |
---|
124 | TwissData.Dispersion = [.06 0 0 0]'; |
---|
125 | |
---|
126 | setpvmodel('TwissData', '', TwissData); % Same as, THERING{1}.TwissData = TwissData; |
---|
127 | |
---|
128 | catch |
---|
129 | warning('Setting the twiss data parameters in the MML failed.'); |
---|
130 | end |
---|