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

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

Initial import--MML version from SOLEIL@2013

File size: 4.9 KB
Line 
1function [ChannelNames, FamilyName, Field, DeviceList, ErrorFlag] = common2channel(CommonNames, Field, Family);
2%COMMON2CHANNEL - Convert a common name to a channel name
3%  [ChannelNames, FamilyName, Field, DeviceList, ErrorFlag] = common2channel(CommonNames, Field, Family)
4%
5%  INPUTS
6%  1. CommonNames - List of common names (string, matrix, cell array)
7%  2. Field - Accelerator Object field name ('Monitor', 'Setpoint', etc) {'Monitor'}
8%  3. Family - Family Name
9%              Accelerator Object
10%              Cell Array of Accelerator Objects or Family Names
11%              [] search all families {Default}
12%
13%  OUTPUTS
14%  1. ChannelNames - Channel name corresponding to the common name
15%                  If the common name cannot be found a blank string is returned
16%  2. Family - Family Name
17%  3. Field - MML field name
18%  4. DeviceList - Device list
19%  5. ErrorFlag - Number of errors found
20%
21%  NOTES
22%  1. CommonNames can be a cell array even if Field and Family are not.
23%
24%  See also common2family, common2dev
25%
26%  Written by Greg Portmann
27
28
29ErrorFlag = 0;
30
31
32if nargin < 1
33    error('Must have at least 1 input (''CommonNames'')');
34end
35if nargin < 2
36    Field = '';
37end
38if isempty(Field)
39    Field = 'Monitor';
40end
41if nargin < 3
42    Family = '';
43end
44
45
46% Cell inputs
47if iscell(CommonNames)
48    if iscell(Family)
49        if length(Family) ~= length(CommonNames)
50            error('Family and CommonNames must be the same size cell arrays.');
51        end
52    end
53    if iscell(Field)
54        if length(Field) ~= length(CommonNames)
55            error('Field and CommonNames must be the same size cell arrays.');
56        end
57    end
58
59    for i = 1:length(CommonNames)
60        if iscell(Family)
61            if iscell(Field)
62                [ChannelNames{i}, FamilyName{i}, DeviceList{i}, ErrorTmp] = common2channel(CommonNames{i}, Field{i}, Family{i});
63            else
64                [ChannelNames{i}, FamilyName{i}, DeviceList{i}, ErrorTmp] = common2channel(CommonNames{i}, Field, Family{i});
65            end
66        else
67            if iscell(Field)
68                [ChannelNames{i}, FamilyName{i}, DeviceList{i}, ErrorTmp] = common2channel(CommonNames{i}, Field{i}, Family);
69            else
70                [ChannelNames{i}, FamilyName{i}, DeviceList{i}, ErrorTmp] = common2channel(CommonNames{i}, Field, Family);
71            end
72        end
73        ErrorFlag = ErrorFlag | ErrorTmp;
74    end
75    return
76end
77% End cell input
78
79
80
81%%%%%%%%%%%%%%%%
82% Main Program %
83%%%%%%%%%%%%%%%%
84
85% If Family=[], search all families
86if isempty(Family)
87    FamilyList = getfamilylist;
88else
89    FamilyList = {Family};
90end
91
92ChannelNames = [];
93FamilyName = '';
94DeviceList = [];
95
96AO = getao;
97
98for i = 1:size(CommonNames,1)
99    Name = deblank(CommonNames(i,:));
100    Found = 0;
101    for j = 1:size(FamilyList, 1)
102        Family = deblank(FamilyList(j,:));
103
104        % Get the common name list for this family
105        if isfield(AO.(Family), 'CommonNames')
106            CommonNamesTotal = AO.(Family).CommonNames;
107        else
108            CommonNamesTotal = '';
109        end
110
111        if ~isempty(CommonNamesTotal)
112            % Look for the common name in the list
113            [name,n,k] = intersect(Name, CommonNamesTotal, 'rows');
114
115
116%             % Add blank spaces for missing common names
117%             if isempty(name) & length(Name)~=size(CommonNamesTotal)
118%                 Name = [repmat(' ',size(Name,1),size(CommonNamesTotal,2)-size(Name,2)) Name];
119%                 [name,n,k] = intersect(Name, CommonNamesTotal, 'rows');
120%             end
121%
122%             if isempty(name)
123%                 if length(Name)~=size(CommonNamesTotal)
124%                     Name = [Name repmat(' ',size(Name,1),size(CommonNamesTotal,2)-size(Name,2))];
125%                     [name,n,k] = intersect(Name, CommonNamesTotal, 'rows');
126%                 end
127%             end
128
129
130            % Find the correstponding channel name
131            if ~isempty(k)
132                ChannelNamesTotal = AO.(Family).(Field).ChannelNames;
133
134                if isempty(ChannelNamesTotal)
135                    NewChannelName = ' ';
136                    ErrorFlag = ErrorFlag + 1;
137                else
138                    if size(ChannelNamesTotal,1) == 1
139                        NewChannelName = ChannelNamesTotal;
140                    else
141                        NewChannelName = ChannelNamesTotal(k,:);
142                    end
143                end
144         
145                ChannelNames = strvcat(ChannelNames, NewChannelName);
146                FamilyName = strvcat(FamilyName, Family);
147                DeviceList = [DeviceList; AO.(Family).DeviceList(k,:)];
148                Found = 1;
149                break
150            end
151        end
152    end
153    if ~Found
154        ChannelNames = strvcat(ChannelNames, ' ');
155        FamilyName = strvcat(FamilyName, ' ');
156        DeviceList = [DeviceList; [NaN NaN]];
157        ErrorFlag = ErrorFlag + 1;
158    end
159end
160
161ChannelNames = deblank(ChannelNames);
162FamilyName = deblank(FamilyName);
163
164if all(isnan(DeviceList))
165    DeviceList = [];
166end
Note: See TracBrowser for help on using the repository browser.