slmetric.metric.MetaInformation class

Package: slmetric.metric

Set metadata for custom metrics

Description

The slmetric.metric.MetaInformation class properties contain metric metadata. On the Metrics Dashboard, when you click the widget for an individual metric, this metadata is in the table. For custom metrics, when you create a custom metric class, you specify the slmetric.metric.MetaInformation the applicable properties.

Construction

Create an slmetric.Engine object. Use the getMetricMetaInformation property to return an slmetric.metric.MetaInformation object.

Properties

expand all

For custom metrics, when you define the custom metric class, specify this property. For shipped metrics, this property is already set.

Example: 'Model Advisor standards check compliance for High Integrity'

Data Types: char

For custom metrics, when you define the custom metric class, specify this property. For shipped metrics, this property is already set.

Example: 'Metric that counts the percentage of checks that passed for the High Integrity Model Advisor standards check grouping.'

Data Types: char

For custom metrics, when you define the custom metric class, if applicable, specify this property. For shipped metrics, this property is already set.

Example: {'Passed Checks'} {'Total Checks'}

Data Types: char

For custom metrics, when you define the custom metric class, if applicable, specify this property. For shipped metrics, this property is already set.

Example: {'Passed Checks (incl. Descendants'} {'Total Checks'}

Data Types: char

For custom metrics, when you define the custom metric class, specify this property. For shipped metrics, this property is already set.

Example: 'Passed Checks'

Data Types: char

For custom metrics, when you define the custom metric class, specify this property. For shipped metrics, this property is already set.

Example: {'Passed Checks (incl. Descendants'} {'Total Checks'}

Data Types: char

Examples

collapse all

Create a custom metric that counts nonvirtual blocks. Specify a widget to display this metric on the Metrics Dashboard. Add it to the Size Group.

Create a custom metric class.

className = 'nonvirtualblockcount';
slmetric.metric.createNewMetricClass(className);

Create the nonvirtual block count metric by adding this code to the nonvirtualblockcount.m file. The this = nonvirtualblockcount function sets the slmetric.metric.MetaInformation properties.

classdef nonvirtualblockcount < slmetric.metric.Metric
    %nonvirtualblockcount calculates number of nonvirtual blocks per level.
    % BusCreator, BusSelector and BusAssign are treated as nonvirtual.
    properties
        VirtualBlockTypes = {'Demux','From','Goto','Ground', ...
            'GotoTagVisiblity','Mux','SignalSpecification', ...
            'Terminator','Inport'};
    end
    
    methods
    function this = nonvirtualblockcount()
        this.ID = 'nonvirtualblockcount';
        this.Name = 'Nonvirtual Block Count';
        this.Version = 1;
        this.CompileContext = 'None';
        this.Description = 'Algorithm that counts nonvirtual blocks per level.';
        this.AggregatedValueName = 'Nonvirtual Blocks (incl. Descendants)'
        this.ValueName = 'Nonvirtual Blocks'
        this.ComponentScope = [Advisor.component.Types.Model, ...
            Advisor.component.Types.SubSystem];
        this.AggregationMode = slmetric.AggregationMode.Sum;
	    this.AggregateComponentDetails = true;
        this.ResultChecksumCoverage = true;
        this.SupportsResultDetails = true;
            
    end

    function res = algorithm(this, component)
        % create a result object for this component
        res = slmetric.metric.Result();	

        % set the component and metric ID
        res.ComponentID = component.ID;
        res.MetricID = this.ID;
        
        % Practice
        D1=slmetric.metric.ResultDetail('identifier 1','Name 1');
        D1.Value=0;
        D1.setGroup('Group1','Group1Name');
        D2=slmetric.metric.ResultDetail('identifier 2','Name 2');
        D2.Value=1;
        D2.setGroup('Group1','Group1Name');
        
        

        % use find_system to get blocks inside this component
        blocks = find_system(getPath(component), ...
            'SearchDepth', 1, ...
            'Type', 'Block');

        isNonVirtual = true(size(blocks));

        for n=1:length(blocks)
            blockType = get_param(blocks{n}, 'BlockType');

            if any(strcmp(this.VirtualBlockTypes, blockType))
                isNonVirtual(n) = false;
            else
                switch blockType
                    case 'SubSystem'
                        % Virtual unless the block is conditionally executed
                        % or the Treat as atomic unit check box is selected.
                        if strcmp(get_param(blocks{n}, 'IsSubSystemVirtual'), ...
                                'on')
                            isNonVirtual(n) = false;
                        end
                    case 'Outport'
                        % Outport: Virtual when the block resides within
                        % SubSystem block (conditional or not), and 
                        % does not reside in the root (top-level) Simulink window.
                        if component.Type ~= Advisor.component.Types.Model
                            isNonVirtual(n) = false;
                        end
                    case 'Selector'
                        % Virtual only when Number of input dimensions 
                        % specifies 1 and Index Option specifies Select 
                        % all, Index vector (dialog), or Starting index (dialog).
                        nod = get_param(blocks{n}, 'NumberOfDimensions');
                        ios = get_param(blocks{n}, 'IndexOptionArray');

                        ios_settings = {'Assign all', 'Index vector (dialog)', ...
                            'Starting index (dialog)'};

                        if nod == 1 && any(strcmp(ios_settings, ios))
                            isNonVirtual(n) = false;
                        end
                    case 'Trigger'
                        % Virtual when the output port is not present.
                        if strcmp(get_param(blocks{n}, 'ShowOutputPort'), 'off')
                            isNonVirtual(n) = false;
                        end
                    case 'Enable'
                        % Virtual unless connected directly to an Outport block.
                        isNonVirtual(n) = false;

                        if strcmp(get_param(blocks{n}, 'ShowOutputPort'), 'on')
                            pc = get_param(blocks{n}, 'PortConnectivity');

                            if ~isempty(pc.DstBlock) && ...
                                    strcmp(get_param(pc.DstBlock, 'BlockType'), ...
                                    'Outport')
                                isNonVirtual(n) = true;
                            end
                        end
                end
            end
        end

        blocks = blocks(isNonVirtual);

        res.Value = length(blocks);
    end
    end
end

Register the new metric in the metric repository.

[id_metric,err_msg] = slmetric.metric.registerMetric(className);

To begin, open the default configuration for the Metrics Dashboard layout.

conf = slmetric.dashboard.Configuration.open();

Obtain the slmetric.dashboard.Layout object from the slmetric.dashboard.Configuration object.

layout = getDashboardLayout(conf);

Obtain widget objects that are in the layout object.

layoutWidget=getWidgets(layout);

Remove the widget that represents the Simulink block count metric.

sizeGroup = layoutWidget(2); 
sizeGroupWidgets = sizeGroup.getWidgets(); 
sizeGroup.removeWidget(sizeGroupWidgets(1));

Add a widget that displays the nonvirtual block count metric. For custom widgets, the default visualization type is single value. If you want to use a different visualization technique, specify a different value for the VisualizationType property.

newWidget = sizeGroup.addWidget('Custom', 1);
newWidget.Title=('Nonvirtual Block Count'); 
newWidget.setMetricIDs('nonvirtualblockcount');
newWidget.setWidths(slmetric.dashboard.Width.Medium);
newWidget.setHeight(70);

Specify whether there are lines separating the custom widget from other widgets in the group. These commands specify that there is a line to the right of the widget.

s.top = false;
s.bottom = false;
s.left= false;
s.right= true;
newWidget.setSeparators([s, s, s, s]);

Save the configuration object. This command serializes the API information to an XML file.

save(conf,'Filename','DashboardConfig.xml');

Set the active configuration.

slmetric.dashboard.setActiveConfiguration(fullfile(pwd,'DashboardConfig.xml'));

For a model, open the Metrics Dashboard.

metricsdashboard sf_car

Click the play button and run all metrics.

Introduced in R2018b