1 | function [BPMFamilyOutput, BPMDevOutput, DeltaSpos, PhaseAdvance] = quad2bpm(QUADFamily, QUADDev, LocationFlag) |
---|
2 | %QUAD2BPM - Returns the nearest BPM to the specified quadrupole |
---|
3 | % [BPMFamily, BPMDeviceList, DeltaSpos, PhaseAdvance] = quad2bpm(QUADFamily, QUADDev, LocationFlag) |
---|
4 | % |
---|
5 | % INPUTS |
---|
6 | % 1. QUADFamily - Quadrupole family (1 family only (row string)) |
---|
7 | % 2. QUADDeviceList - Quadrupole device list |
---|
8 | % 3. LocationFlag - Only search BPM positions that are 'UpStream' or 'DownStream' {Default for transport lines} |
---|
9 | % of the quadrupole. Else no location preference is used {Default for rings}. |
---|
10 | % |
---|
11 | % OUTPUTS |
---|
12 | % 1. BPMFamily |
---|
13 | % 2. BPMDeviceList |
---|
14 | % 3. DeltaSpos - Distance from the Quad to the BPM |
---|
15 | % 4. PhaseAdvance - Phase advance from the quadrupole to the BPM (using the model) [radians] |
---|
16 | |
---|
17 | % |
---|
18 | % Written by Gregory J. Portmann |
---|
19 | % Modified by Laurent S. Nadolski |
---|
20 | |
---|
21 | if nargin < 1 |
---|
22 | QUADFamily = ''; |
---|
23 | end |
---|
24 | if isempty(QUADFamily) |
---|
25 | QUADFamily = findmemberof('QUAD'); |
---|
26 | QUADFamily = QUADFamily{1}; |
---|
27 | end |
---|
28 | |
---|
29 | if nargin < 2 |
---|
30 | QUADDev = []; |
---|
31 | end |
---|
32 | if isempty(QUADDev) |
---|
33 | QUADDev = family2dev(QUADFamily); |
---|
34 | QUADDev = QUADDev(1,:); |
---|
35 | end |
---|
36 | |
---|
37 | if nargin < 3 |
---|
38 | LocationFlag = ''; |
---|
39 | end |
---|
40 | |
---|
41 | if isempty(LocationFlag) |
---|
42 | if any(strcmpi(getfamilydata('MachineType'), {'Transport','Transportline','Linac'})) |
---|
43 | LocationFlag = 'DownStream'; |
---|
44 | else |
---|
45 | LocationFlag = 'Any'; |
---|
46 | end |
---|
47 | end |
---|
48 | |
---|
49 | |
---|
50 | % Get all the BPM families |
---|
51 | BPMFamilyList = getfamilylist; |
---|
52 | [tmp, i] = ismemberof(BPMFamilyList, 'BPM'); |
---|
53 | if ~isempty(i) |
---|
54 | BPMFamilyList = BPMFamilyList(i,:); |
---|
55 | else |
---|
56 | BPMFamilyList = [gethbpmfamily,getvbpmfamily]; |
---|
57 | end |
---|
58 | |
---|
59 | |
---|
60 | % Find the BPM next to the Quad |
---|
61 | BPMFamilyOutput = []; |
---|
62 | for k = 1:size(QUADDev,1) |
---|
63 | QUADspos = getspos(QUADFamily, QUADDev(k,:)); |
---|
64 | |
---|
65 | if nargout >= 4 |
---|
66 | ATIndex = family2atindex(QUADFamily, QUADDev(k,:)); |
---|
67 | [PhiQx, PhiQy] = modeltwiss('Phase', 'All'); |
---|
68 | i = findrowindex(ATIndex, (1:length(PhiQx))'); |
---|
69 | PhiQx = (PhiQx(i) + PhiQx(i+1))/2; |
---|
70 | end |
---|
71 | |
---|
72 | |
---|
73 | Del = inf; |
---|
74 | for j = 1:size(BPMFamilyList,1) |
---|
75 | Family = deblank(BPMFamilyList(j,:)); |
---|
76 | BPMDevList = family2dev(Family); |
---|
77 | BPMspos = getspos(Family); |
---|
78 | |
---|
79 | if strcmpi(LocationFlag, 'DownStream') |
---|
80 | i = find(abs(BPMspos-QUADspos)==min(abs(BPMspos-QUADspos)) & BPMspos>QUADspos); |
---|
81 | elseif strcmpi(LocationFlag, 'UpStream') |
---|
82 | i = find(abs(BPMspos-QUADspos)==min(abs(BPMspos-QUADspos)) & BPMspos<QUADspos); |
---|
83 | else |
---|
84 | i = find(abs(BPMspos-QUADspos)==min(abs(BPMspos-QUADspos))); |
---|
85 | end |
---|
86 | |
---|
87 | BPMDev{j} = BPMDevList(i,:); |
---|
88 | |
---|
89 | if abs(BPMspos(i)-QUADspos) < Del |
---|
90 | BPMFamilyMin = Family; |
---|
91 | BPMDevMin = BPMDev{j}; |
---|
92 | Del = abs(BPMspos(i)-QUADspos); |
---|
93 | DelwithSign = BPMspos(i)-QUADspos; |
---|
94 | end |
---|
95 | end |
---|
96 | |
---|
97 | BPMFamilyOutput = strvcat(BPMFamilyOutput, BPMFamilyMin); |
---|
98 | BPMDevOutput(k,:) = BPMDevMin; |
---|
99 | DeltaSpos(k,1) = DelwithSign; |
---|
100 | |
---|
101 | |
---|
102 | % Get the phase advance between the BPM and Quad in the model |
---|
103 | if nargout >= 4 |
---|
104 | [PhiX, PhiY] = modeltwiss('Phase', BPMFamilyOutput, BPMDevOutput(k,:)); |
---|
105 | PhaseAdvance = PhiX - PhiQx; |
---|
106 | end |
---|
107 | end |
---|
108 | |
---|
109 | |
---|
110 | |
---|