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 | % See Also quadcenter |
---|
28 | |
---|
29 | % |
---|
30 | % This file is machine specific |
---|
31 | % Written by Laurent S. Nadolski (adapted from ALS) |
---|
32 | |
---|
33 | |
---|
34 | if nargin < 1 |
---|
35 | FamilyList = getfamilylist; |
---|
36 | [tmp,i] = ismemberof(FamilyList,'QUAD'); |
---|
37 | if ~isempty(i) |
---|
38 | FamilyList = FamilyList(i,:); |
---|
39 | end |
---|
40 | [i,ok] = listdlg('PromptString', 'Select a quadrupole family:', ... |
---|
41 | 'SelectionMode', 'single', ... |
---|
42 | 'ListString', FamilyList); |
---|
43 | drawnow; |
---|
44 | if ok == 0 |
---|
45 | return |
---|
46 | else |
---|
47 | QuadFamily = deblank(FamilyList(i,:)); |
---|
48 | end |
---|
49 | end |
---|
50 | if ~isfamily(QuadFamily) |
---|
51 | error(sprintf('Quadrupole family %s does not exist. Make sure the middle layer had been initialized properly.', ... |
---|
52 | QuadFamily)); |
---|
53 | end |
---|
54 | if nargin < 2 |
---|
55 | QuadDev = editlist(family2dev(QuadFamily),QuadFamily,zeros(length(family2dev(QuadFamily)),1)); |
---|
56 | end |
---|
57 | if nargin < 3 |
---|
58 | %QuadPlane = 1; % Horizontal default |
---|
59 | ButtonNumber = menu('Which Plane?', 'Horizontal','Vertical','Cancel'); |
---|
60 | drawnow; |
---|
61 | switch ButtonNumber |
---|
62 | case 1 |
---|
63 | QuadPlane = 1; |
---|
64 | case 2 |
---|
65 | QuadPlane = 2; |
---|
66 | otherwise |
---|
67 | fprintf(' quadcenterinit cancelled'); |
---|
68 | return |
---|
69 | end |
---|
70 | end |
---|
71 | |
---|
72 | % Initialize the QMS structure |
---|
73 | QMS.QuadPlane = QuadPlane; |
---|
74 | QMS.QuadFamily = QuadFamily; |
---|
75 | QMS.QuadDev = QuadDev; |
---|
76 | QMS.OutlierFactor = 6; % BPM Outlier: abs(fit - measured data) > OutlierFactor * std(BPM) |
---|
77 | QMS.CorrectOrbit = 'Yes'; % 'yes' or 'no'; % Only do it if the orbit is reasonably close to the offset orbit |
---|
78 | |
---|
79 | |
---|
80 | % Note: DataDirectory must start with the root of the tree and end with filesep or be '.' |
---|
81 | QMSDirectory = getfamilydata('Directory','BBA'); |
---|
82 | if isempty(QMSDirectory) |
---|
83 | QMS.DataDirectory = '.'; |
---|
84 | else |
---|
85 | QMS.DataDirectory = QMSDirectory; |
---|
86 | end |
---|
87 | |
---|
88 | if QMS.QuadPlane==1 |
---|
89 | % Horizontal |
---|
90 | |
---|
91 | CorrMethod = 'MEC'; |
---|
92 | %CorrMethod = 'LocalBump'; |
---|
93 | %CorrMethod = 'Fixed'; |
---|
94 | |
---|
95 | QMS.BPMFamily = 'BPMx'; |
---|
96 | QMS.CorrFamily = 'HCOR'; |
---|
97 | QMS.NumberOfPoints = 7; |
---|
98 | QMS.QuadraticFit = 0; % 0 = linear fit, else quadratic fit |
---|
99 | |
---|
100 | % Use all BPMs in the minimization |
---|
101 | QMS.BPMDevList = family2dev(QMS.BPMFamily); |
---|
102 | |
---|
103 | % Find the BPM closest to the quadrupole |
---|
104 | [TmpFamily, QMS.BPMDev] = quad2bpm(QMS.QuadFamily, QMS.QuadDev); |
---|
105 | |
---|
106 | % Pick the quadrupole and corrector delta |
---|
107 | QMS.ModulationMethod = 'bipolar'; |
---|
108 | QMS.QuadDelta = 1.0; |
---|
109 | QMS.CorrDelta = 1.5; |
---|
110 | |
---|
111 | % Find corrector the bump the beam in the quadrupole |
---|
112 | switch CorrMethod |
---|
113 | case 'Fixed' % Fixed choice |
---|
114 | % Old QMS method |
---|
115 | if strcmp(QMS.QuadFamily,'QF') ==1 || strcmp(QMS.QuadFamily,'QD') ==1 |
---|
116 | if QMS.QuadDev(1,2) == 1, |
---|
117 | QMS.CorrDevList = [QMS.QuadDev(1) 1]; |
---|
118 | else |
---|
119 | QMS.CorrDevList = [QMS.QuadDev(1) 8]; |
---|
120 | end |
---|
121 | if (QMS.QuadDev(1,1)==1 & QMS.CorrDevList(1,2)==1) % for sector1, use HCM8 was HCM1 |
---|
122 | QMS.CorrDevList = [QMS.QuadDev(1) 8]; |
---|
123 | elseif (QMS.QuadDev(1,1)==12 & QMS.CorrDevList(1,2)==8) % for sector12, use HCM1 was HCM8 |
---|
124 | QMS.CorrDevList = [QMS.QuadDev(1) 1]; |
---|
125 | end |
---|
126 | elseif strcmp(QMS.QuadFamily,'Q1')==1 |
---|
127 | if QMS.QuadDev(1,2) == 1 |
---|
128 | QMS.CorrDevList = [QMS.QuadDev(1) 4]; |
---|
129 | else |
---|
130 | QMS.CorrDevList = [QMS.QuadDev(1) 5]; |
---|
131 | end |
---|
132 | elseif strcmp(QMS.QuadFamily,'Q2')==1 |
---|
133 | if QMS.QuadDev(1,2) == 1 |
---|
134 | QMS.CorrDevList = [QMS.QuadDev(1) 8]; |
---|
135 | else |
---|
136 | QMS.CorrDevList = [QMS.QuadDev(1) 1]; |
---|
137 | end |
---|
138 | if (QMS.QuadDev(1,1)==1 & QMS.CorrDevList(1,2)==1) |
---|
139 | QMS.CorrDevList = [QMS.QuadDev(1) 2]; |
---|
140 | elseif (QMS.QuadDev(1,1)==12 & QMS.CorrDevList(1,2)==8) |
---|
141 | QMS.CorrDevList = [QMS.QuadDev(1) 7]; |
---|
142 | end |
---|
143 | end |
---|
144 | case 'MEC' % Most effective corrector |
---|
145 | % Pick the corrector based on the most effective corrector in the response matrix |
---|
146 | R = getbpmresp('Struct'); |
---|
147 | [i, iNotFound] = findrowindex(QMS.BPMDev, R(1,1).Monitor.DeviceList); |
---|
148 | m = R(1,1).Data(i,:); |
---|
149 | [MaxValue, j] = max(abs(m)); |
---|
150 | QMS.CorrDevList = R(1,1).Actuator.DeviceList(j,:); |
---|
151 | case 'LocalBump' |
---|
152 | % Local bump corrector method |
---|
153 | [OCS, RF, OCS0] = setorbitbump('BPMx',QMS.BPMDev,[.1],'HCOR',[-2 -1 1 2], 'NoSetSP'); |
---|
154 | QMS.CorrDelta = OCS.CM.Data - OCS0.CM.Data; |
---|
155 | QMS.CorrDevList = OCS.CM.DeviceList; |
---|
156 | otherwise |
---|
157 | error('Corrector method unknown.'); |
---|
158 | end |
---|
159 | |
---|
160 | elseif QMS.QuadPlane==2 |
---|
161 | % Vertical |
---|
162 | |
---|
163 | CorrMethod = 'MEC'; |
---|
164 | %CorrMethod = 'LocalBump'; |
---|
165 | %CorrMethod = 'Fixed'; |
---|
166 | |
---|
167 | QMS.BPMFamily = 'BPMz'; |
---|
168 | QMS.CorrFamily = 'VCOR'; |
---|
169 | QMS.NumberOfPoints = 5; |
---|
170 | QMS.QuadraticFit = 0; % 0 = linear fit, else quadratic fit |
---|
171 | |
---|
172 | % Use all BPMs in the minimization |
---|
173 | QMS.BPMDevList = family2dev(QMS.BPMFamily); |
---|
174 | |
---|
175 | % Find the BPM closest to the quadrupole |
---|
176 | [TmpFamily, QMS.BPMDev] = quad2bpm(QMS.QuadFamily, QMS.QuadDev); |
---|
177 | |
---|
178 | % Pick the quadrupole and corrector delta |
---|
179 | QMS.ModulationMethod = 'bipolar'; |
---|
180 | QMS.QuadDelta = 1.0; |
---|
181 | QMS.CorrDelta = 1.5; |
---|
182 | |
---|
183 | % Find corrector the bump the beam in the quadrupole |
---|
184 | switch CorrMethod |
---|
185 | case 'Fixed' |
---|
186 | % Old QMS method |
---|
187 | if strcmp(QMS.QuadFamily,'QF')==1 | strcmp(QMS.QuadFamily,'QD')==1 |
---|
188 | if QMS.QuadDev(1,2) == 1 |
---|
189 | QMS.CorrDevList = [QMS.QuadDev(1) 2]; |
---|
190 | else |
---|
191 | QMS.CorrDevList = [QMS.QuadDev(1) 7]; |
---|
192 | end |
---|
193 | elseif strcmp(QMS.QuadFamily,'QDA')==1 |
---|
194 | if QMS.QuadDev(1,2) == 1 |
---|
195 | QMS.CorrDevList = [QMS.QuadDev(1) 4]; |
---|
196 | else |
---|
197 | QMS.CorrDevList = [QMS.QuadDev(1) 5]; |
---|
198 | end |
---|
199 | elseif strcmp(QMS.QuadFamily,'QFA')==1 |
---|
200 | if QMS.QuadDev(1,2) == 1 |
---|
201 | QMS.CorrDevList = [QMS.QuadDev(1) 2]; |
---|
202 | else |
---|
203 | QMS.CorrDevList = [QMS.QuadDev(1) 7]; |
---|
204 | end |
---|
205 | end |
---|
206 | case 'MEC' |
---|
207 | % Pick the corrector based on the most effective corrector in the response matrix |
---|
208 | R = getbpmresp('Struct','Physics'); |
---|
209 | [i, iNotFound] = findrowindex(QMS.BPMDev, R(2,2).Monitor.DeviceList); |
---|
210 | m = R(2,2).Data(i,:); |
---|
211 | [MaxValue, j] = max(abs(m)); |
---|
212 | QMS.CorrDevList = R(2,2).Actuator.DeviceList(j,:); |
---|
213 | case 'LocalBump' |
---|
214 | % Local bump corrector method |
---|
215 | [OCS, RF, OCS0] = setorbitbump('BPMz',QMS.BPMDev,[1/4],'VCM',[-2 -1 1 2], 'NoSetSP'); |
---|
216 | QMS.CorrDelta = OCS.CM.Data - OCS0.CM.Data; |
---|
217 | %[OCS, RF, OCS0] = setorbitbump('BPMz',QMS.BPMDev,[1/4],'VCM',[-2 -1 1 2], 'Display'); |
---|
218 | %setsp(OCS0.CM); |
---|
219 | %QMS.CorrDelta = OCS.CM.Data - OCS0.CM.Data; |
---|
220 | QMS.CorrDevList = OCS.CM.DeviceList; |
---|
221 | otherwise |
---|
222 | error('Corrector method unknown.'); |
---|
223 | end |
---|
224 | |
---|
225 | else |
---|
226 | error('QMS.QuadPlane must be 1 or 2'); |
---|
227 | end |
---|
228 | |
---|
229 | |
---|
230 | QMS.CreatedBy = 'quadcenterinit'; |
---|
231 | QMS = orderfields(QMS); |
---|