Page 1 of 1

Enable Metabolic Probe in Model?

Posted: Fri Feb 14, 2020 8:11 am
by rickypimentel
Hey Moderators,

I'm scripting CMCs from Matlab. Prior to scake/IK/RRA, I saved a generic model with metabolic probes (UMB2010). However, when I get to CMC, the probes are disabled for some reason. I have found ways to addProbes and I can load the UMB Probeset, but I'm wondering if there's a way to simply enable the probes already present and update the model.

I noticed there are "isEnabled" and "set_enabled" functions & properties for the Probe in the API, but I can't seem to call the function correctly when referencing the model. I'm wondering if there is a difference between "Probe" and "ProbeSet"
https://simtk.org/api_docs/opensim/api_ ... Probe.html

I have an override by opening the model in OpenSim and manually enabling the probe, but it would be amazing to automate it.

Thank you!

Re: Enable Metabolic Probe in Model?

Posted: Fri Feb 14, 2020 9:11 am
by tkuchida
I noticed there are "isEnabled" and "set_enabled" functions & properties for the Probe in the API, but I can't seem to call the function correctly when referencing the model.
It would be helpful to see what you're doing now. I think you should be using the setEnabled() method (https://simtk.org/api_docs/opensim/api_ ... 962f28529f).
I'm wondering if there is a difference between "Probe" and "ProbeSet"
Yes, a Probe is an object that calculates something as a function of the State (https://simtk.org/api_docs/opensim/api_ ... Probe.html). A ProbeSet is a Set (collection) of such objects (https://simtk.org/api_docs/opensim/api_ ... beSet.html).

Re: Enable Metabolic Probe in Model?

Posted: Fri Feb 14, 2020 10:55 am
by rickypimentel
Thanks Thomas,

My failed attempts to update or enable the current probe in the model are below. When I do this, CMC will run, but it will not export any muscle metabolic costs (attached picture).

As I already have the UMB2010 probe set up in the model, I'm trying to enable it. I could alternatively add the probe all over again, but I was wondering if simply enabling the current probe was possible before I attempt to re-create the "addMetabolicProbes.py" script in Matlab.

Code: Select all

  CMCmodel = Model(RRAUpdatedModel);
    CMCmodel.initSystem(); 
    
    %     % cant make a call to the current probe, no function getProbe?
    %     Probe = CMCmodel.getProbe()
    

    %  % adding a probe adds as metabolics_0, but does not add probes to
    %  each muscle that the previous model already contains. 
%     activationMaintenanceRateOn = 'True';
%     shorteningRateOn = 'True';
%     basalRateOn = 'False';
%     mechanicalWorkRateOn = 'True';
%     reportTotalMetabolicsOnly = 'False';
    wholeBodyProbe = Umberger2010MuscleMetabolicsProbe(); %activationMaintenanceRateOn, shorteningRateOn, basalRateOn, mechanicalWorkRateOn);
    wholeBodyProbe.set_enabled(1)
    wholeBodyProbe.isEnabled() % prints enable status in command window
    wholeBodyProbe.setName("metabolics");
    CMCmodel.addProbe(wholeBodyProbe)
    
    % save model
    CMCModel = strcat(CMCFolder, '\', Subjects(subj).name, '_', Subjects(subj).Trials(trial).name, '_CMC.osim');
    CMCmodel.print(CMCModel);

Re: Enable Metabolic Probe in Model?

Posted: Fri Feb 14, 2020 12:00 pm
by tkuchida
The "metabolics_0_TOTAL" column is the computed metabolic cost. The probe is enabled. My guess is that you wish to see a value for each muscle. To do that, you need to set "report_total_metabolics_only" to false (one of the lines you have commented out). Please see the documentation here: https://simtk.org/api_docs/opensim/api_ ... dd686dce8a.

Re: Enable Metabolic Probe in Model?

Posted: Fri Feb 14, 2020 1:47 pm
by rickypimentel
Thanks, that is what I am trying to do. I have tried calling the function by:

activationMaintenanceRateOn = "True";
shorteningRateOn = "True";
basalRateOn = "False";
mechanicalWorkRateOn = "True";
reportTotalMetabolicsOnly = "False";
wholeBodyProbe = Umberger2010MuscleMetabolicsProbe(activationMaintenanceRateOn, shorteningRateOn, basalRateOn, mechanicalWorkRateOn);

as described in the documentation and example files (I also tried "modeling.Umberger2010... "), but I get the error:

Code: Select all

No constructor 'org.opensim.modeling.Umberger2010MuscleMetabolicsProbe' with matching signature found.

Error in ABL_Batch_OpenSim (line 498)
    wholeBodyProbe = Umberger2010MuscleMetabolicsProbe(activationMaintenanceRateOn, shorteningRateOn,
    basalRateOn, mechanicalWorkRateOn);
or as an empty "wholeBodyProbe = Umberger2010MuscleMetabolicsProbe()" and then defining "wholeBodyProbe.set_report_total_metabolics_only(reportTotalMetabolicsOnly)" later on and the error reads.

Code: Select all

No method 'set_report_total_metabolics_only' with matching signature found for class
'org.opensim.modeling.Umberger2010MuscleMetabolicsProbe'.

Error in ABL_Batch_OpenSim (line 504)
    wholeBodyProbe.set_report_total_metabolics_only(reportTotalMetabolicsOnly)
That is why I am just trying to enable the current probe in the first place, rather than adding a new one. Any ideas on those errors or how to just enable the pre-loaded probe? Thanks for all the help

Re: Enable Metabolic Probe in Model?

Posted: Fri Feb 14, 2020 2:04 pm
by tkuchida
I think this should work:

Code: Select all

wholeBodyProbe.set_report_total_metabolics_only(false);

Re: Enable Metabolic Probe in Model?

Posted: Tue Feb 18, 2020 9:48 am
by rickypimentel
Gah, the capitalization and lack of ' ' got me. Hooray for working in multiple programming languages at once.

On that note, I translated the python addMetabolicProbes script into matlab.

Thank you for the help!

Hopefully this can be useful for someone:

Code: Select all

 clc;
        import org.opensim.modeling.*
        import java.io.*
        
        % define model for CMC
        CMCmodel = Model(RRAUpdatedModel);
        CMCmodel.initSystem();
        
        % get slow twitch data from text file
        fn = 'C:\Users\richa\Documents\OpenSim 4.0\Metabolix\Scripts\metabolicsSlowTwitchRatios_Gait2392.txt';
        fdata = importdata(fn);
        muscleName = fdata.textdata;
        twitchRatio = fdata.data;
        
        % The following booleans are constructor arguments for the Umberger probe.
        % These settings are used for all probes.
        activationMaintenanceRateOn = true;
        shorteningRateOn = true;
        basalRateOn = false;
        mechanicalWorkRateOn = true;
        reportTotalMetabolicsOnly = false;
        
        % The mass of each muscle will be calculated using data from the model:
        % muscleMass = (maxIsometricForce / sigma) * rho * optimalFiberLength
        % where sigma = 0.25e6 is the specific tension of mammalian muscle (in
        % Pascals) and rho = 1059.7 is the density of mammalian muscle (in kg/m^3).
        
        % The slow-twitch ratio used for muscles that either do not appear in the
        % file, or appear but whose proportion of slow-twitch fibers is unknown.
        defaultTwitchRatio = 0.5;
        % Get the slow-twitch ratio as the default value.
        slowTwitchRatio = ones(1,length(twitchRatio)) * defaultTwitchRatio;
        
        % Define a whole-body probe that will report the total metabolic energy
        % consumption over the simulation.
        wholeBodyProbe = Umberger2010MuscleMetabolicsProbe(...
            activationMaintenanceRateOn,...
            shorteningRateOn,...
            basalRateOn,...
            mechanicalWorkRateOn);
        wholeBodyProbe.setOperation("value");
        wholeBodyProbe.set_report_total_metabolics_only(reportTotalMetabolicsOnly);
        
        % Add the probe to the model and provide a name.
        CMCmodel.addProbe(wholeBodyProbe);
        wholeBodyProbe.setName("metabolics");
        
        % Loop through all muscles, adding parameters for each into the whole-body probe.
        for j = 1:CMCmodel.getMuscles().getSize()
            
            % offset for python/C++ looping
            iMuscle = j -1;
            % save muscle name in text file via diary function
            diary('temp.txt');
            thisMuscle = CMCmodel.getMuscles().get(iMuscle)
            diary off
            
            % get muscle name and save
            FID = fopen('temp.txt');
            TXT = textscan(FID, '%s');
            if strcmp(TXT{1}(end), 'off')
                TXT{1}(end) = [];
            end
            if strcmp(TXT{1}(end), 'diary')
                TXT{1}(end) = [];
            end
            txt = TXT{1}(end);
            Muscle = txt{1}(1:end-2);
            
            % Set the slow-twitch ratio to the physiological value, if it is known.
            %     for i = 1:length(twitchRatio) % in twitchRatios.items():
            ind = find(contains({muscleName{:}}, Muscle));
            if strcmp(Muscle, muscleName{ind}) && twitchRatio(ind) ~= -1
                slowTwitchRatio(ind) = twitchRatio(ind);
            end
            
            % Add this muscle to the whole-body probe. The arguments are muscle
            % name, slow-twitch ratio, and muscle mass. Note that the muscle mass
            % is ignored unless we set useProvidedMass to True.
            wholeBodyProbe.addMuscle(thisMuscle.getName(),...
                slowTwitchRatio(ind));
            
        end
        
        % Save the new model to a file      
        CMCModelPath = strcat(CMCFolder, '\', Subjects(subj).name, '_', Subjects(subj).Trials(trial).name, '_CMC.osim');
        CMCmodel.print(CMCModelPath);