Skip to content
Snippets Groups Projects
SCDclass_mdsobjcontainer.m 14.30 KiB
classdef SCDclass_mdsobjcontainer
    % This class is a container class
    % for all MDS objects required for handling
    % a no-nocompile Simulink SCD model
    %
    % Presently it implements methods for handling
    % objects of the following classes:
    % SCDclass_mdsparam (and childrens)
    % SCDclass_mdswavegen (and childrens)
    
    properties
        numparams           % number of configured params objects
        mdsparams           % params objects array
        numwavegens           % number od configured wavegens objects
        mdswavegens         % wavegens objects array
        simstructlist       % list of names of simstructs to be transferred to
                            % base workspace upon expcode setup
        modeltoactualize    % model name to actualize ('all' for all)
        modeltogenerate     % model name to generate conf script ('all' for all)
    end
    
    methods
        function obj = SCDclass_mdsobjcontainer()
            % contructor, empty container
            obj.numparams=0;
            obj.numwavegens=0;
            
            obj.simstructlist= [ ...
                {'SCDnode01simdata'},...
                {'SCDnode02simdata'},...
                {'SCDnode03simdata'},...
                {'SCDnode06simdata'},...
                {'SCDnode07simdata'},...
                {'SCDnode08simdata'},...
                {'SCDnode0201_simdata'},...
                {'SCDnode0202_simdata'},...
                {'SCDnode0203_simdata'},...
                {'SCDnode0204_simdata'},...
                {'SCDnode0301_simdata'},...
                {'SCDnode0302_simdata'},...
                {'SCDnode0303_simdata'},...
                {'SCDnode0304_simdata'},...
                {'SCDnode0601_simdata'},...
                {'SCDnode0602_simdata'},...
                {'SCDnode0603_simdata'},...
                {'SCDnode0604_simdata'},...
                {'SCDnode0701_simdata'},...
                {'SCDnode0702_simdata'},...
                {'SCDnode0703_simdata'},...
                {'SCDnode0704_simdata'},...
                {'SCDnode0801_simdata'}...
                ];
                        
        end
        
        function obj = addparameter(obj, param)
            % Adds a parameter object
            if obj.numparams==0
                obj.mdsparams=param;
            else
                obj.mdsparams=[obj.mdsparams; param];
            end 
            obj.numparams=obj.numparams+1;
        end
        
        function obj = printparameters(obj)
            % prints the parameters object list
            if obj.numparams>0
               for ii=1:obj.numparams
                  obj.mdsparams(ii).printinfo();
               end
            end
        end
        
        function obj = actualizeparameters(obj, shot)
            % actualize the parameters on the gove data dictionary,
            % naive version with a mds acces for every parameter
            if obj.numparams>0
               for ii=1:obj.numparams
                  if(strcmp(obj.modeltoactualize,'all'))
                    obj.mdsparams(ii).actualizedata(shot);
                  else
                    if(strcmp(obj.modeltoactualize,obj.mdsparams(ii).getmodelname))
                       obj.mdsparams(ii).actualizedata(shot);
                    end
                  end
               end
            end
        end

        function obj = bindparameters(obj, modelname, datadictionary, exportedtps)
            if obj.numparams>0   
                for ii=1:obj.numparams
                    obj.mdsparams(ii)=obj.mdsparams(ii).setmodelname(modelname);
                    obj.mdsparams(ii)=obj.mdsparams(ii).setdatadictionary(datadictionary);
                end
                if numel(exportedtps)>0
                    for ii=1:obj.numparams
                        obj.mdsparams(ii)=obj.mdsparams(ii).setparamstructure(exportedtps{end});
                    end
                end        
            end
        end
        
        function obj = bindlastparameter(obj, modelname, datadictionary, exportedtps)
            if obj.numparams>0   
                obj.mdsparams(end)=obj.mdsparams(end).setmodelname(modelname);
                obj.mdsparams(end)=obj.mdsparams(end).setdatadictionary(datadictionary);
                if numel(exportedtps)>0
                    obj.mdsparams(end)=obj.mdsparams(end).setparamstructure(exportedtps{end});
                end        
            end
            
        end
        
        function obj = addwavegen(obj, wavegen)
            % adds a wavegen object
            if obj.numwavegens==0
                obj.mdswavegens=wavegen;
            else
                obj.mdswavegens=[obj.mdswavegens; wavegen];
            end 
            obj.numwavegens=obj.numwavegens+1;
        end
        
        function obj = bindlastwavegen(obj, modelname, datadictionary, timingsrc)
            if obj.numwavegens>0
                obj.mdswavegens(end)=obj.mdswavegens(end).setmodelname(modelname);
                obj.mdswavegens(end)=obj.mdswavegens(end).setdatadictionary(datadictionary);
                obj.mdswavegens(end)=obj.mdswavegens(end).settiminginfo(timingsrc);                
            end    
        end
        
        function obj = setwavegenbasestruct(obj, basestruct)
            if obj.numwavegens>0
                for ii=1:obj.numwavegens
                    obj.mdswavegens(ii)=obj.mdswavegens(ii).setbasestruct(basestruct);
                end
            end    
        end
        
        function obj = printwavegens(obj)
            % prints the wavegen list
            if obj.numwavegens>0
               for ii=1:obj.numwavegens
                  obj.mdswavegens(ii).printinfo();
               end
            end
        end
        
        function obj = actualizewavegens(obj, shot)
            % actualize the wavegen waves timeseries
            % naive version, a mds connection is called for every object
            if obj.numwavegens>0
               for ii=1:obj.numwavegens
                  if(strcmp(obj.modeltoactualize,'all'))
                    obj.mdswavegens(ii).actualizedata(shot);
                  else
                    if(strcmp(obj.modeltoactualize,obj.mdswavegens(ii).getmodelname)) 
                        obj.mdswavegens(ii).actualizedata(shot);
                    end
                  end
               end
            end
        end
                
        function obj = cleanwavegens(obj)
            % clean wavegens leaving a consistent (with model buses)
            % empty timeseries data structure
            if obj.numwavegens>0
               for ii=1:obj.numwavegens
                  obj.mdswavegens(ii).cleandata;
               end
            end
        end

        function obj = buildworkspacesimstruct(obj)
            % this funtion builds a workspace structure containing
            % a replica of all simulation structures in the data
            % dictionaries, this structure is the one actually used 
            % for loading simulation wavegen data
            % It is better not to use directly data dictionaries structures
            % to avoid flooding dds with big sim data sets (and
            % conseguently the SCD SVN itself
           
            dd=SCDconf_getdatadict('tcv.sldd');
            evalin('base','SCDsimdata=struct();');
            
            for ii=1:numel(obj.simstructlist)
                simstructname=char(obj.simstructlist(ii));
                simstruct=dd.getEntry(simstructname).getValue;
                assignstr=sprintf('SCDsimdata.%s=temp;',simstructname);
                assignin('base','temp',simstruct);
                evalin('base',assignstr);
            end
            
            evalin('base','clear temp;'); 
        end    
            
        function obj = importmdsobjects(obj, source)
            % parameters import

            destparamtargets={};
            if obj.numparams>0             
                for ii=1:obj.numparams
                    destparamtargets{end+1}=obj.mdsparams(ii).gettargetparam;
                end
            end
                           
            numparamstoimport = source.numparams;
            paramstoimport = source.mdsparams;
            
            if numparamstoimport>0
                for ii=1:numparamstoimport
                    if ~ismember(paramstoimport(ii).gettargetparam, destparamtargets)
                        obj=obj.addparameter(paramstoimport(ii));
                    else
                        warning('SCDclass_mdsobjcontainer:importmdsobjects','A mds object driving ''%s'' is already present in the dest. expcode, skipping!',paramstoimport(ii).gettargetparam);
                    end
                end
            end
            
            % wavegens import     
            destwavegentargets={};
            if obj.numwavegens>0             
                for ii=1:obj.numwavegens
                    destwavegentargets{end+1}=obj.mdswavegens(ii).gettargetwavegen;
                end
            end
                           
            numwavegenstoimport = source.numwavegens;
            wavegenstoimport = source.mdswavegens;
            
            if numwavegenstoimport>0
                for ii=1:numwavegenstoimport
                    if ~ismember(wavegenstoimport(ii).gettargetwavegen, destwavegentargets)
                        obj=obj.addwavegen(wavegenstoimport(ii));
                    else
                        warning('SCDclass_mdsobjcontainer:importmdsobjects','A mds object driving ''%s'' is already present in the dest. expcode, skipping!',wavegenstoimport(ii).gettargetwavegen);
                    end
                end
            end
         
        end
        
        function printMARTe2parconfig(obj, shot)
          switch obj.modeltogenerate
            case 'all'
              iorder = getParamsServerTreeOrder(obj);  % order entries following mdsserver, mdstree order
              prevServer = ''; % init 
              
              % Header for MDS for loader
              loaderStr = sprintf('\n\n+MDSParameters = {\n Class=MDSObjLoader\n Shot=%d\n',shot);
              fprintf("%s",loaderStr);
         
              for ii=1:obj.numparams
                mymdsparam = obj.mdsparams(iorder(ii));

                currentServer = mymdsparam.getMDSserver;

                % generate header for MDSsource if necessary
                if ~strcmp(currentServer,prevServer) %if a new server needs to be opened
                  if ii~=1, fprintf(' }\n'), end % close bracket for previous one
                  % print new source header
                  fprintf("%s\n",mymdsparam.genMARTe2MDSsourcestr); 
                end
                prevServer = currentServer;
                
                % generate data source entry
                str = mymdsparam.genMARTe2entry(shot);
                fprintf("  %s\n",str);
              end
              fprintf(" }\n}\n\n");

            otherwise
              for ii=1:obj.numparams
                if(strcmp(obj.modeltogenerate,obj.mdsparams(ii).getmodelname))
                  str=obj.mdsparams(ii).genMARTe2entry(shot);
                  fprintf("  %s\n",str);
                end
              end
          end
        end
        
        function iorder = getParamsServerTreeOrder(obj)
          % find server-tree order of parameters
          mdsservertree = cell(numel(obj.mdsparams),2);
          for ii=1:numel(obj.mdsparams)
            mdsservertree{ii,1} = obj.mdsparams(ii).getMDSserver;
            mdsservertree{ii,2} = obj.mdsparams(ii).getMDStree;
          end
          [~,iorder] = sortrows(mdsservertree);
        end
        
        function printMARTe2wgconfig(obj, shot)
          for ii=1:obj.numwavegens
            if(strcmp(obj.modeltogenerate,'all'))
              str=obj.mdswavegens(ii).genMARTe2entry(shot);
              fprintf("   %s\n",str);
            else
              if(strcmp(obj.modeltogenerate,obj.mdswavegens(ii).getmodelname))
                str=obj.mdswavegens(ii).genMARTe2entry(shot);
                fprintf("   %s\n",str);
              end
            end
          end
        end
                
        function overalldim = printMARTe2wgbusconfig(obj, shot, ddname, busname)
            dd=SCDconf_getdatadict(ddname);
            bus=dd.getEntry(busname).getValue;
            nelems=numel(bus.Elements);
            server='';
            tree='';
            dimension=0;
            
            for elem=1:nelems
                signame=bus.Elements(elem).Name;
                found=false;
                for wgs=1:obj.numwavegens
                    %signame
                    %obj.mdswavegens(wgs).gettarget
                    if(strcmp(obj.mdswavegens(wgs).gettarget,signame))
                        found=true;
                        break;
                    end
                end
                if(~found)
                    error('SCDclass_mdsobjcontainer:wgnotfound','Signal %s not found in configured wavegens objects', signame);
                else
                    actserver=obj.mdswavegens(wgs).getMDSserver;
                    acttree=obj.mdswavegens(wgs).getMDStree;
                    
                    if(~strcmp(actserver,server) || ~strcmp(acttree,tree))
                        if(~strcmp(server,'') || ~strcmp(tree,''))
                            error('SCDclass_mdsobjcontainer:multipleconnections','multiple MDS+ connections/trees not supported within the same wavegen generator');
                        else
                            server=actserver;
                            tree=acttree;
                            fprintf(' Server=%s\n', server);
                            fprintf(' Tree=%s\n', tree)
                        end
                    end
                    
                    entrystring=obj.mdswavegens(wgs).genMARTe2entry(shot);
                    fprintf(' %s\n', entrystring);
                    dimension=dimension+bus.Elements(elem).Dimensions;
                    
                end
            end
        
            overalldim=dimension;
        
        end
        
        function iorder = getWavegensServerTreeOrder(obj)
          % find server-tree order of wavegens
          mdsservertree = cell(numel(obj.mdswavegens),2);
          for ii=1:numel(obj.mdswavegens)
            mdsservertree{ii,1} = obj.mdswavegens(ii).getMDSserver;
            mdsservertree{ii,2} = obj.mdswavegens(ii).getMDStree;
          end
          [~,iorder] = sortrows(mdsservertree);
        end
    end
end