Something went wrong on our end
-
Cristian Galperti authoredCristian Galperti authored
SCDclass_mdswgsigarray1.m 8.48 KiB
classdef SCDclass_mdswgsigarray1 < SCDclass_mdswg
% This class loads an array of signals from MDS+, linearly indicized
% linear signal rempping between source and destination can be
% specified as a optional parameter, if not present no remapping
% takes place
properties
srcinterval
dstinterval
srcstartidx
srcstopidx
deststartidx
deststopidx
end
methods
%function obj=SCDclass_mdswgsigarray1(srcsrv, srctree, srctdi, modelname, destwavegen, tbstart, tbdt, tbstop, srcstartidx, srcstopidx, deststartidx, deststopidx)
function obj=SCDclass_mdswgsigarray1(srctdi, destwavegen, srcinterval, varargin)
obj@SCDclass_mdswg();
intervalchecker=@(x) isnumeric(x) && min(diff(x))==1 && max(diff(x))==1;
assert(intervalchecker(srcinterval));
obj.cparser.addParameter('destinterval',srcinterval,intervalchecker);
%p=inputParser;
%p.addParameter('destinterval',srcinterval,intervalchecker);
%parse(p,varargin{:});
obj=obj.parseconstructorcommon(srctdi, destwavegen, varargin);
dstinterval=obj.cparser.Results.destinterval;
obj.srcstartidx=srcinterval(1);
obj.srcstopidx=srcinterval(end);
obj.deststartidx=dstinterval(1);
obj.deststopidx=dstinterval(end);
obj.classname=mfilename;
obj.marteclassname='MDSWgSigArray1';
end
end
methods
function actualizedata(obj, shot)
try
mdsconnect(obj.mdsserver);
mdsopen(obj.mdstree, shot);
targetfullexpansion=[obj.wavegenbasestruct,'.',obj.wavegentarget];
if obj.verbose==1
fprintf('Actualizing wavegen: ''%s'' [%d,%d] <- ''%s'' [%d,%d] (%s, shot %d)\n', ...
targetfullexpansion, obj.deststartidx, obj.deststopidx, ...
obj.tdiexpr, obj.srcstartidx, obj.srcstopidx, ...
obj.classname, shot);
end
sourceidxs=obj.srcstartidx:obj.srcstopidx;
destidxs=obj.deststartidx:obj.deststopidx;
assert(numel(sourceidxs)==numel(destidxs), 'SCDclass_mdswgsigarray1: destination channel count is different w.r.t. source');
value=obj.getdata();
baseparam=obj.wavegenbasestruct;
structparam=obj.wavegentarget;
wgentryval=evalin('base',baseparam);
getcurrenttssize =sprintf('ddtssamples=numel(wgentryval.%s.Time);',structparam);
eval(getcurrenttssize);
if(ddtssamples~=numel(value.Time))
% the dd timeseries has different dims w.r.t. the signals
% to be loaded, we have to load the timeseries as it is
assigncmd =sprintf('wgentryval.%s=value;',structparam);
eval(assigncmd);
else
% the dd timeseries has the same size than the signals
% to be loaded, we can do a partial loading
assigncmdtime =sprintf('wgentryval.%s.Time=value.Time;',structparam);
assigncmddata =sprintf('wgentryval.%s.Data(:,%d:%d)=value.Data;',structparam,obj.deststartidx,obj.deststopidx);
eval(assigncmdtime);
eval(assigncmddata);
end
assignin('base','temp',wgentryval);
assigncmd=sprintf('%s=temp;',baseparam);
evalin('base',assigncmd);
evalin('base','clear temp');
catch ME
warning('SCDclass_mdswgsigsingle:actualizationerror','Actualization error for wavegen %s. Actualization skipped. Error is:\n%s',obj.wavegentarget,getReport(ME));
end
end
function value=getdata(obj)
value=timeseries;
% Getting the timebase of the model
tstart=obj.timebasestart;
dt=obj.timebasedt;
tstop=obj.timebasestop;
timebase=tstart:dt:tstop;
sourceidxs=obj.srcstartidx:obj.srcstopidx;
value.Time = timebase;
value.Data = single(zeros(numel(timebase), numel(sourceidxs)));
for ii=1:numel(sourceidxs)
mdschannel=sprintf(obj.tdiexpr, sourceidxs(ii));
%data=tdi(mdschannel);
%value.Data(:,ii)= single(interp1(data.dim{1},data.data,timebase,'linear',0));
dbdata=mdsvalue(mdschannel);
dbtime=mdsvalue(['dim_of(' mdschannel ')']);
value.Data(:,ii) = single(interp1(dbtime,dbdata,timebase,'linear',0))';
firstindexes=find(timebase<dbtime(1));
lastindexes=find(timebase>dbtime(end));
value.Data(firstindexes,ii)=single(dbdata(1));
value.Data(lastindexes,ii)=single(dbdata(end));
end
end
function out=gettargetwavegen(obj)
if(isempty(obj.wavegenbasestruct))
out=sprintf('%s[%d,%d]',obj.wavegentarget, obj.deststartidx, obj.deststopidx);
else
out=sprintf('%s.%s[%d,%d]',obj.wavegenbasestruct,obj.wavegentarget, obj.deststartidx, obj.deststopidx);
end
end
function printinfo(obj)
obj.printinfocommon;
if(obj.srcstartidx~=obj.deststartidx || obj.srcstopidx~=obj.deststopidx)
fprintf(' Remapping: source interval [%d,%d] remapped into dest. interval [%d,%d]\n', obj.srcstartidx, obj.srcstopidx, obj.deststartidx, obj.deststopidx);
end
end
function entrystring = genMARTe2entry(obj, shot)
if(obj.srcstartidx~=obj.deststartidx || obj.srcstopidx~=obj.deststopidx)
error('SCDclass_mdswgsigarray1:genMARTe2entry','Signal position remapping not yet implemented in the MARTe version of this class');
end
entrystring=obj.genMARTe2entrycommon(shot);
entrystring=[entrystring ' StartIdx=' num2str(obj.srcstartidx) ' StopIdx=' num2str(obj.srcstopidx) ' }'];
end
% * S_uint8 = {
% * NodeName = "S_uint8" // node of the tree node
% * Type = "uint8" //Can be any of the node supported types
% * NumberOfElements = 32
% * DataManagement = 0 //could be 0, 1 or 2
% * HoleManagement = 1 //could be 0 or 1
% * }
function expentries = genMARTe2entryexpanded(obj, shot)
%entrystring=obj.genMARTe2entrycommon(shot);
expentries='';
for ii=obj.srcstartidx:obj.srcstopidx
expandedtdi = sprintf(obj.tdiexpr, ii);
martename=expandedtdi;
sigentry=sprintf(' %s={ NodeName=%s Type=float32 NumberOfElements=%d DataManagement=0 HoleManagement=1 }\n',martename, expandedtdi);
expentries=[expentries sigentry];
end
end
function autopopulatemds(obj, shot)
baseparam=strrep(obj.wavegenbasestruct,'SCDsimdata','SCDrefdata'); % name of base workspace structure
structparam=obj.wavegentarget; % name of target field
wgentryval = evalin('base',baseparam); % structure of wavegen in base workspace
sourceidxs=obj.srcstartidx:obj.srcstopidx;
destidxs=obj.deststartidx:obj.deststopidx;
assert(numel(sourceidxs)==numel(destidxs), 'SCDclass_mdswgsigarray1: destination channel count is different w.r.t. source');
for ii = obj.deststartidx:obj.deststopidx
data = wgentryval.(structparam).Data(:,ii);
dim = wgentryval.(structparam).Time;
units = wgentryval.(structparam).DataInfo.Units;
mdschannel=sprintf(obj.tdiexpr, sourceidxs(ii));
obj.autopopulatemdscommon(shot, mdschannel, dim, data, units, [baseparam '.' structparam '[' num2str(ii) ']']);
end
end
end
end