source: MML/trunk/mml/family2datastruct.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: 4.8 KB
Line 
1function [DataStruct, ErrorFlag] = family2datastruct(varargin)
2%FAMILY2DATASTRUCTURE - Returns a datastructure corresponding to a Family
3%  [DataStruct, ErrorFlag] = family2datastruct(Family, Field, DeviceList)
4%  [DataStruct, ErrorFlag] = family2datastruct(Family, DeviceList)      (Field will default to 'Monitor')
5%
6%  INPUTS
7%  1. Family - Family Name
8%              Data Structure
9%              Accelerator Object
10%  2. Field - Accelerator Object field name ('Monitor', 'Setpoint', etc) {'Monitor'}
11%  3. DeviceList ([Sector Device #] or [element #]) {Default: whole family}
12%  4. 'Physics'  - Use physics  units (optional override of units)
13%     'Hardware' - Use hardware units (optional override of units)
14%
15%  OUTPUTS
16%  1. DataStruct = Date structure corresponding to the Family, Field, and DeviceList
17%
18%  NOTES
19%  1. If Family is a cell array, then DeviceList and Field can also be a cell arrays
20%
21% See Also builddatastruct
22
23%  Written by Gregory J. Portmann
24
25
26%%%%%%%%%%%%%%%%%
27% Input Parsing %
28%%%%%%%%%%%%%%%%%
29UnitsFlagCell = {};
30for i = length(varargin):-1:1
31    if isstruct(varargin{i})
32        % ignore structures
33    elseif iscell(varargin{i})
34        % ignore cells
35    elseif strcmpi(varargin{i},'struct')
36        % Remove and ignore
37        varargin(i) = [];
38    elseif strcmpi(varargin{i},'numeric')
39        % Remove and ignore
40        varargin(i) = [];
41    elseif strcmpi(varargin{i},'simulator') || strcmpi(varargin{i},'model') || strcmpi(varargin{i},'Online') || strcmpi(varargin{i},'Manual')
42        % Remove and ignore
43        varargin(i) = [];
44    elseif strcmpi(varargin{i},'physics')
45        UnitsFlagCell = {'Physics'};
46        varargin(i) = [];
47    elseif strcmpi(varargin{i},'hardware')
48        UnitsFlagCell = {'Hardware'};
49        varargin(i) = [];
50    end
51end
52
53if isempty(varargin)
54    error('Must have at least a family name input');
55end
56
57
58%%%%%%%%%%%%%%%%%%%%%
59% Cell Array Inputs %
60%%%%%%%%%%%%%%%%%%%%%
61if iscell(varargin{1})
62    for i = 1:length(varargin{1})
63        if length(varargin) < 2
64            [DataStruct{i}, ErrorFlag{i}]  = family2datastruct(varargin{1}{i}, UnitsFlagCell{:});
65        elseif length(varargin) < 3
66            if iscell(varargin{2})
67                [DataStruct{i}, ErrorFlag{i}]  = family2datastruct(varargin{1}{i}, varargin{2}{i}, UnitsFlagCell{:});
68            else
69                [DataStruct{i}, ErrorFlag{i}]  = family2datastruct(varargin{1}{i}, varargin{2}, UnitsFlagCell{:});
70            end
71        else
72            if iscell(varargin{2})
73                if iscell(varargin{3})
74                    [DataStruct{i}, ErrorFlag{i}]  = family2datastruct(varargin{1}{i}, varargin{2}{i}, varargin{3}{i}, UnitsFlagCell{:});
75                else
76                    [DataStruct{i}, ErrorFlag{i}]  = family2datastruct(varargin{1}{i}, varargin{2}{i}, varargin{3}, UnitsFlagCell{:});
77                end
78            else
79                if iscell(varargin{3})
80                    [DataStruct{i}, ErrorFlag{i}]  = family2datastruct(varargin{1}{i}, varargin{2}, varargin{3}{i}, UnitsFlagCell{:});
81                else
82                    [DataStruct{i}, ErrorFlag{i}]  = family2datastruct(varargin{1}{i}, varargin{2}, varargin{3}, UnitsFlagCell{:});
83                end
84            end
85        end
86    end
87    return
88end
89
90
91%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92% Parse Family, Field, DeviceList %
93%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94[Family, Field, DeviceList, UnitsFlag] = inputparsingffd(varargin{:});
95
96% Units flag
97if isempty(UnitsFlagCell)
98    % For structure inputs, use the units in the structure (from inputparsingffd)
99    % Else, get the default family value
100    if isempty(UnitsFlag)
101        UnitsFlag = getunits(Family);
102    end
103else
104    % Input override has priority
105    UnitsFlag = UnitsFlagCell{1};
106end
107
108
109% Default field is Setpoint
110if isempty(Field)
111    Field = 'Monitor';
112end
113
114
115
116if isempty(UnitsFlag)
117    UnitsFlag = getfamilydata(Family, Field, 'Units');
118end
119if isempty(UnitsFlag)
120    error('Cannot find the units type');
121end
122
123
124
125%%%%%%%%%%%%
126% Get data %
127%%%%%%%%%%%%
128ErrorFlag = 0;
129DataStruct.Data = [];  % Gets filed with NaN later
130DataStruct.FamilyName = Family;
131DataStruct.Field = Field;
132if isempty(DeviceList)
133    DataStruct.DeviceList = family2dev(Family);
134else
135    DataStruct.DeviceList = DeviceList;
136end
137DataStruct.Data = ones(size( DataStruct.DeviceList,1),1) * NaN;
138DataStruct.Status = family2status(Family, DataStruct.DeviceList);
139DataStruct.Mode = getmode(Family, Field);
140DataStruct.t = [];
141DataStruct.tout = [];
142DataStruct.DataTime = [];
143DataStruct.TimeStamp = [];
144
145DataStruct.Units = UnitsFlag;
146if strcmpi(UnitsFlag,'Hardware')
147    DataStruct.UnitsString = getfamilydata(Family, Field, 'HWUnits');   
148elseif strcmpi(UnitsFlag,'Physics')
149    DataStruct.UnitsString = getfamilydata(Family, Field, 'PhysicsUnits');   
150else
151    error('Units unknown');
152end
153DataStruct.DataDescriptor = '';
154DataStruct.CreatedBy = 'family2datastruct';
155
Note: See TracBrowser for help on using the repository browser.