source: MML/trunk/mml/quad2bpm.m @ 4

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

Initial import--MML version from SOLEIL@2013

File size: 3.1 KB
Line 
1function [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
21if nargin < 1
22    QUADFamily = '';
23end
24if isempty(QUADFamily)
25    QUADFamily = findmemberof('QUAD');
26    QUADFamily = QUADFamily{1};
27end
28
29if nargin < 2
30    QUADDev = [];
31end
32if isempty(QUADDev)
33    QUADDev = family2dev(QUADFamily);
34    QUADDev = QUADDev(1,:);
35end
36
37if nargin < 3
38    LocationFlag = '';
39end
40
41if isempty(LocationFlag)
42    if any(strcmpi(getfamilydata('MachineType'), {'Transport','Transportline','Linac'}))
43        LocationFlag = 'DownStream';
44    else
45        LocationFlag = 'Any';
46    end
47end
48
49
50% Get all the BPM families
51BPMFamilyList = getfamilylist;
52[tmp, i] = ismemberof(BPMFamilyList, 'BPM');
53if ~isempty(i)
54    BPMFamilyList = BPMFamilyList(i,:);
55else
56    BPMFamilyList = [gethbpmfamily,getvbpmfamily];
57end
58
59
60% Find the BPM next to the Quad
61BPMFamilyOutput = [];
62for 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
107end
108
109
110
Note: See TracBrowser for help on using the repository browser.