source: MML/trunk/machine/SOLEIL/StorageRing/bba_mml/quadcenterinit.m @ 17

Last change on this file since 17 was 17, checked in by zhangj, 10 years ago

To have a stable version on the server.

  • Property svn:executable set to *
File size: 8.4 KB
Line 
1function 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
41if 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
56end
57if ~isfamily(QuadFamily)
58    error(sprintf('Quadrupole family %s does not exist.  Make sure the middle layer had been initialized properly.', ...
59        QuadFamily));
60end
61if nargin < 2
62    QuadDev = editlist(family2dev(QuadFamily),QuadFamily,zeros(length(family2dev(QuadFamily)),1));
63end
64if 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
77end
78
79% Initialize the QMS structure
80QMS.QuadPlane  = QuadPlane;
81QMS.QuadFamily = QuadFamily;
82QMS.QuadDev    = QuadDev;
83QMS.OutlierFactor = 8;       % BPM Outlier: abs(fit - measured data) > OutlierFactor * std(BPM)
84QMS.CorrectOrbit  = 'no';    % 'yes' or 'no';  % Only do it if the orbit is reasonably close to the offset orbit
85if strcmpi(family2mode('BPMx'), 'Online')
86    QMS.ExtraDelay    =  1.5; %s
87else
88    QMS.ExtraDelay    =  0; %s
89end
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 '.'
94QMSDirectory = getfamilydata('Directory','BBAcurrent');
95if isempty(QMSDirectory)
96    QMS.DataDirectory = '.';
97else
98    QMS.DataDirectory = QMSDirectory;
99end
100
101if 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
181elseif 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
264else
265    error('QMS.QuadPlane must be 1 or 2');
266end
267
268
269QMS.CreatedBy = 'quadcenterinit';
270QMS = orderfields(QMS);
Note: See TracBrowser for help on using the repository browser.