1 | function QMS = quadcenterinit(QuadFamily, QuadDev, QuadPlane) |
---|
2 | % QMS = quadcenterinit(Family, Device, QuadPlane) |
---|
3 | % |
---|
4 | % QuadFamily = Quadrupole family |
---|
5 | % QuadDev = Quadrupole device |
---|
6 | % QuadPlane = Plane (1=horizontal {default}, 2=vertical) |
---|
7 | % |
---|
8 | % QMS structure contains fields: |
---|
9 | % QMS.QuadFamily |
---|
10 | % QMS.QuadDev |
---|
11 | % QMS.QuadDelta |
---|
12 | % QMS.QuadPlane |
---|
13 | % QMS.BPMFamily |
---|
14 | % QMS.BPMDev |
---|
15 | % QMS.BPMDevList |
---|
16 | % QMS.CorrFamily |
---|
17 | % QMS.CorrDevList % Often one magnet but bumps or anything else is fine |
---|
18 | % QMS.CorrDelta % Scale factor for each magnet in CorrDevList |
---|
19 | % QMS.DataDirectory % From AD or '.' |
---|
20 | % QMS.QuadraticFit = 1; % 1=quadratic fit, else linear fit |
---|
21 | % QMS.OutlierFactor = 1; % if abs(data - fit) > OutlierFactor * BPMstd, then remove that BPM [mm] |
---|
22 | % QMS.NumberOfPoints = 3; |
---|
23 | % QMS.ModulationMethod = 'bipolar' |
---|
24 | % QMS.CorrectOrbit 'yes' or 'no' |
---|
25 | % QMS.CreatedBy |
---|
26 | % |
---|
27 | % NOTES |
---|
28 | % 1. Quad variations are directly put in this file (not lattice |
---|
29 | % independant) |
---|
30 | % 2. Added Flags for nanoscopium |
---|
31 | % Step 1 Center of quadrupole upstream of BPM.8 and downstream of BPM.9 |
---|
32 | % Step 2 Center of quadrupole of the triplets. Strategy to be discussed |
---|
33 | % |
---|
34 | % See Also quadcenter, quad2bpm |
---|
35 | |
---|
36 | % |
---|
37 | % This file is machine specific |
---|
38 | % Written by Laurent S. Nadolski (adapted from ALS) |
---|
39 | % July 2011, add nanoscopium Q11 and Q12 families |
---|
40 | |
---|
41 | if nargin < 1 |
---|
42 | FamilyList = getfamilylist; |
---|
43 | [tmp,i] = ismemberof(FamilyList,'QUAD'); |
---|
44 | if ~isempty(i) |
---|
45 | FamilyList = FamilyList(i,:); |
---|
46 | end |
---|
47 | [i,ok] = listdlg('PromptString', 'Select a quadrupole family:', ... |
---|
48 | 'SelectionMode', 'single', ... |
---|
49 | 'ListString', FamilyList); |
---|
50 | drawnow; |
---|
51 | if ok == 0 |
---|
52 | return |
---|
53 | else |
---|
54 | QuadFamily = deblank(FamilyList(i,:)); |
---|
55 | end |
---|
56 | end |
---|
57 | if ~isfamily(QuadFamily) |
---|
58 | error(sprintf('Quadrupole family %s does not exist. Make sure the middle layer had been initialized properly.', ... |
---|
59 | QuadFamily)); |
---|
60 | end |
---|
61 | if nargin < 2 |
---|
62 | QuadDev = editlist(family2dev(QuadFamily),QuadFamily,zeros(length(family2dev(QuadFamily)),1)); |
---|
63 | end |
---|
64 | if nargin < 3 |
---|
65 | %QuadPlane = 1; % Horizontal default |
---|
66 | ButtonNumber = menu('Which Plane?', 'Horizontal','Vertical','Cancel'); |
---|
67 | drawnow; |
---|
68 | switch ButtonNumber |
---|
69 | case 1 |
---|
70 | QuadPlane = 1; |
---|
71 | case 2 |
---|
72 | QuadPlane = 2; |
---|
73 | otherwise |
---|
74 | fprintf(' quadcenterinit cancelled'); |
---|
75 | return |
---|
76 | end |
---|
77 | end |
---|
78 | |
---|
79 | % Initialize the QMS structure |
---|
80 | QMS.QuadPlane = QuadPlane; |
---|
81 | QMS.QuadFamily = QuadFamily; |
---|
82 | QMS.QuadDev = QuadDev; |
---|
83 | QMS.OutlierFactor = 8; % BPM Outlier: abs(fit - measured data) > OutlierFactor * std(BPM) |
---|
84 | QMS.CorrectOrbit = 'no'; % 'yes' or 'no'; % Only do it if the orbit is reasonably close to the offset orbit |
---|
85 | if strcmpi(family2mode('BPMx'), 'Online') |
---|
86 | QMS.ExtraDelay = 1.5; %s |
---|
87 | else |
---|
88 | QMS.ExtraDelay = 0; %s |
---|
89 | end |
---|
90 | %QMS.CorrectOrbit = 'Yes'; % 'yes' or 'no'; % Only do it if the orbit is reasonably close to the offset orbit |
---|
91 | |
---|
92 | |
---|
93 | % Note: DataDirectory must start with the root of the tree and end with filesep or be '.' |
---|
94 | QMSDirectory = getfamilydata('Directory','BBAcurrent'); |
---|
95 | if isempty(QMSDirectory) |
---|
96 | QMS.DataDirectory = '.'; |
---|
97 | else |
---|
98 | QMS.DataDirectory = QMSDirectory; |
---|
99 | end |
---|
100 | |
---|
101 | if QMS.QuadPlane==1 |
---|
102 | % Horizontal |
---|
103 | |
---|
104 | CorrMethod = 'MEC'; |
---|
105 | %CorrMethod = 'LocalBump'; |
---|
106 | %CorrMethod = 'Fixed'; |
---|
107 | |
---|
108 | QMS.BPMFamily = 'BPMx'; |
---|
109 | QMS.CorrFamily = 'HCOR'; |
---|
110 | QMS.NumberOfPoints = 5; |
---|
111 | QMS.QuadraticFit = 0; % 0 = linear fit, else quadratic fit |
---|
112 | |
---|
113 | % Use all BPMs in the minimization |
---|
114 | QMS.BPMDevList = family2dev(QMS.BPMFamily); |
---|
115 | |
---|
116 | % Find the BPM closest to the quadrupole |
---|
117 | [TmpFamily, QMS.BPMDev] = quad2bpm(QMS.QuadFamily, QMS.QuadDev); |
---|
118 | |
---|
119 | % Pick the quadrupole and corrector delta |
---|
120 | QMS.ModulationMethod = 'bipolar'; |
---|
121 | |
---|
122 | switch QMS.QuadFamily |
---|
123 | case 'Q1' |
---|
124 | QMS.QuadDelta = 2.0; |
---|
125 | QMS.CorrDelta = 0.1; |
---|
126 | case 'Q2' |
---|
127 | QMS.QuadDelta = 1.0; |
---|
128 | QMS.CorrDelta = 0.1; |
---|
129 | case 'Q3' |
---|
130 | QMS.QuadDelta = 2.0; |
---|
131 | QMS.CorrDelta = 0.1; |
---|
132 | case 'Q4' |
---|
133 | QMS.QuadDelta = 4.0/2; |
---|
134 | QMS.CorrDelta = 0.1; |
---|
135 | case 'Q5' |
---|
136 | QMS.QuadDelta = 2.0; |
---|
137 | QMS.CorrDelta = 0.1; |
---|
138 | case 'Q6' |
---|
139 | QMS.QuadDelta = 2.0; |
---|
140 | QMS.CorrDelta = 0.2; |
---|
141 | case 'Q7' |
---|
142 | QMS.QuadDelta = 3.0/2/2; |
---|
143 | QMS.CorrDelta = 0.1; |
---|
144 | case 'Q8' |
---|
145 | QMS.QuadDelta = 4.0/2; |
---|
146 | QMS.CorrDelta = 0.1; |
---|
147 | case 'Q9' |
---|
148 | QMS.QuadDelta = 4.0/2; |
---|
149 | QMS.CorrDelta = 0.1; |
---|
150 | case 'Q10' |
---|
151 | QMS.QuadDelta = 2.0; |
---|
152 | QMS.CorrDelta = 0.1; |
---|
153 | case 'Q11' % to be tested |
---|
154 | QMS.QuadDelta = 2.0; |
---|
155 | QMS.CorrDelta = 0.1; |
---|
156 | case 'Q12' % to be tested |
---|
157 | QMS.QuadDelta = 2.0; |
---|
158 | QMS.CorrDelta = 0.1; |
---|
159 | otherwise |
---|
160 | error('Unknown quad'); |
---|
161 | end |
---|
162 | |
---|
163 | % Find corrector the bump the beam in the quadrupole |
---|
164 | switch CorrMethod |
---|
165 | case 'MEC' % Most effective corrector |
---|
166 | % Pick the corrector based on the most effective corrector in the response matrix |
---|
167 | R = getbpmresp('Struct'); |
---|
168 | [i, iNotFound] = findrowindex(QMS.BPMDev, R(1,1).Monitor.DeviceList); |
---|
169 | m = R(1,1).Data(i,:); |
---|
170 | [MaxValue, j] = max(abs(m)); |
---|
171 | QMS.CorrDevList = R(1,1).Actuator.DeviceList(j,:); |
---|
172 | case 'LocalBump' |
---|
173 | % Local bump corrector method |
---|
174 | [OCS, RF, OCS0] = setorbitbump('BPMx',QMS.BPMDev,[.1],'HCOR',[-2 -1 1 2], 'NoSetSP'); |
---|
175 | QMS.CorrDelta = OCS.CM.Data - OCS0.CM.Data; |
---|
176 | QMS.CorrDevList = OCS.CM.DeviceList; |
---|
177 | otherwise |
---|
178 | error('Corrector method unknown.'); |
---|
179 | end |
---|
180 | |
---|
181 | elseif QMS.QuadPlane==2 |
---|
182 | % Vertical |
---|
183 | |
---|
184 | CorrMethod = 'MEC'; |
---|
185 | %CorrMethod = 'LocalBump'; |
---|
186 | %CorrMethod = 'Fixed'; |
---|
187 | |
---|
188 | QMS.BPMFamily = 'BPMz'; |
---|
189 | QMS.CorrFamily = 'VCOR'; |
---|
190 | QMS.NumberOfPoints = 5; |
---|
191 | QMS.QuadraticFit = 0; % 0 = linear fit, else quadratic fit |
---|
192 | QMS.ExtraDelay = 2; |
---|
193 | |
---|
194 | % Use all BPMs in the minimization |
---|
195 | QMS.BPMDevList = family2dev(QMS.BPMFamily); |
---|
196 | |
---|
197 | % Find the BPM closest to the quadrupole |
---|
198 | [TmpFamily, QMS.BPMDev] = quad2bpm(QMS.QuadFamily, QMS.QuadDev); |
---|
199 | |
---|
200 | % Pick the quadrupole and corrector delta |
---|
201 | QMS.ModulationMethod = 'bipolar'; |
---|
202 | switch QMS.QuadFamily |
---|
203 | case 'Q1' |
---|
204 | QMS.QuadDelta = 2.0; |
---|
205 | QMS.CorrDelta = 0.3; |
---|
206 | case 'Q2' |
---|
207 | QMS.QuadDelta = 4.0/4; |
---|
208 | QMS.CorrDelta = 0.2*2; |
---|
209 | case 'Q3' |
---|
210 | QMS.QuadDelta = 3.0; |
---|
211 | QMS.CorrDelta = 0.3; |
---|
212 | case 'Q4' |
---|
213 | QMS.QuadDelta = 2.0; |
---|
214 | QMS.CorrDelta = 0.3; |
---|
215 | case 'Q5' |
---|
216 | QMS.QuadDelta = 5.0/2; |
---|
217 | QMS.CorrDelta = 0.3; |
---|
218 | case 'Q6' |
---|
219 | QMS.QuadDelta = 3.0; |
---|
220 | QMS.CorrDelta = 0.3; |
---|
221 | case 'Q7' |
---|
222 | QMS.QuadDelta = 4.0/2; |
---|
223 | QMS.CorrDelta = 0.3*2; |
---|
224 | case 'Q8' |
---|
225 | QMS.QuadDelta = 4.0; |
---|
226 | QMS.CorrDelta = 0.3; |
---|
227 | case 'Q9' |
---|
228 | QMS.QuadDelta = 3.0*0+2.0; |
---|
229 | QMS.CorrDelta = 0.3; |
---|
230 | case 'Q10' |
---|
231 | QMS.QuadDelta = 1.5; |
---|
232 | QMS.CorrDelta = 0.5*2; |
---|
233 | case 'Q11' % to be tested |
---|
234 | QMS.QuadDelta = 1.5; |
---|
235 | QMS.CorrDelta = 0.5*2; |
---|
236 | case 'Q12' % to be tested |
---|
237 | QMS.QuadDelta = 1.5; |
---|
238 | QMS.CorrDelta = 0.5*2; |
---|
239 | otherwise |
---|
240 | error('Unknown quad'); |
---|
241 | end |
---|
242 | |
---|
243 | % Find corrector the bump the beam in the quadrupole |
---|
244 | switch CorrMethod |
---|
245 | case 'MEC' |
---|
246 | % Pick the corrector based on the most effective corrector in the response matrix |
---|
247 | R = getbpmresp('Struct','Physics'); |
---|
248 | [i, iNotFound] = findrowindex(QMS.BPMDev, R(2,2).Monitor.DeviceList); |
---|
249 | m = R(2,2).Data(i,:); |
---|
250 | [MaxValue, j] = max(abs(m)); |
---|
251 | QMS.CorrDevList = R(2,2).Actuator.DeviceList(j,:); |
---|
252 | case 'LocalBump' |
---|
253 | % Local bump corrector method |
---|
254 | %[OCS, RF, OCS0] = setorbitbump('BPMz',QMS.BPMDev,[1/4],'HCOR',[-2 -1 1 2], 'NoSetSP'); |
---|
255 | %QMS.CorrDelta = OCS.CM.Data - OCS0.CM.Data; |
---|
256 | [OCS, RF, OCS0] = setorbitbump('BPMz',QMS.BPMDev,[1/4],'VCOR',[-2 -1 1 2], 'Display'); |
---|
257 | setsp(OCS0.CM); |
---|
258 | QMS.CorrDelta = OCS.CM.Data - OCS0.CM.Data; |
---|
259 | QMS.CorrDevList = OCS.CM.DeviceList; |
---|
260 | otherwise |
---|
261 | error('Corrector method unknown.'); |
---|
262 | end |
---|
263 | |
---|
264 | else |
---|
265 | error('QMS.QuadPlane must be 1 or 2'); |
---|
266 | end |
---|
267 | |
---|
268 | |
---|
269 | QMS.CreatedBy = 'quadcenterinit'; |
---|
270 | QMS = orderfields(QMS); |
---|