Пример #1
0
def test_StorageToPieceWiseLinearFunction():

    sto = osim.Storage(os.path.join(this_file_dir, 'storage.sto'))
    column_name = 'column1'
    scale_factor = 2.5

    time = osim.ArrayDouble()
    sto.getTimeColumn(time)

    state_index = sto.getStateIndex(column_name)

    if type(scale_factor) == float:
        sto.multiplyColumn(state_index, scale_factor)
    elif scale_factor == None:
        pass
    else:
        raise Exception('scale_factor, if specified, must be a float.')

    ordinate = osim.ArrayDouble()
    sto.getDataColumn(state_index, ordinate)

    fcn = osim.PiecewiseLinearFunction()
    for idx in range(time.getSize()):
        fcn.addPoint(time.get(idx), ordinate.get(idx))

    fcnName = os.path.join(this_file_dir, 'piecewiseLinearFunction.xml')
    fcn.printToXML(fcnName)

    assert (open(fcnName).readlines() ==
            open(fcnName.replace('.xml', '_desired.xml')).readlines())

    os.remove(fcnName)
Пример #2
0
def read_from_storage(file_name, to_filter=False):
    """Read OpenSim.Storage files.

    Parameters
    ----------
    file_name: (string) path to file

    Returns
    -------
    tuple: (labels, time, data)
    """
    sto = opensim.Storage(file_name)
    sto.resampleLinear(0.01)
    if to_filter:
        sto.lowpassFIR(4, 6)

    labels = osim_array_to_list(sto.getColumnLabels())
    time = opensim.ArrayDouble()
    sto.getTimeColumn(time)
    time = np.round(osim_array_to_list(time), 3)
    data = []
    for i in range(sto.getSize()):
        temp = osim_array_to_list(sto.getStateVector(i).getData())
        temp.insert(0, time[i])
        data.append(temp)

    df = pd.DataFrame(data, columns=labels)
    df.index = df.time
    return df
Пример #3
0
def read_from_storage(model_file, file_name):
    """Read OpenSim.Storage files.
    Parameters
    ----------
    file_name: (string) path to file
    Returns
    -------
    tuple: (labels, time, data)
    """
    sto = opensim.Storage(file_name)
    if sto.isInDegrees():
        model = opensim.Model(model_file)
        model.initSystem()
        model.getSimbodyEngine().convertDegreesToRadians(sto)

    # sto.resampleLinear(sampling_interval)

    labels = osim_array_to_list(sto.getColumnLabels())
    time = opensim.ArrayDouble()
    sto.getTimeColumn(time)
    time = osim_array_to_list(time)
    data = []
    for i in range(sto.getSize()):
        temp = osim_array_to_list(sto.getStateVector(i).getData())
        temp.insert(0, time[i])
        data.append(temp)

    df = pd.DataFrame(data, columns=labels)
    df.index = df.time
    return df
Пример #4
0
def read_from_storage(file_name, sampling_interval=0.01, to_filter=False):
    """Read OpenSim.Storage files.

    Parameters
    ----------
    file_name: (string) path to file

    sampling_interval: resample the data with a given interval (0.01)

    to_filter: use low pass 4th order FIR filter with 6Hz cut off
    frequency

    Returns
    -------
    df: pandas data frame

    """
    sto = opensim.Storage(file_name)
    sto.resampleLinear(sampling_interval)
    if to_filter:
        sto.lowpassFIR(4, 6)

    labels = osim_array_to_list(sto.getColumnLabels())
    time = opensim.ArrayDouble()
    sto.getTimeColumn(time)
    time = osim_array_to_list(time)
    data = []
    for i in range(sto.getSize()):
        temp = osim_array_to_list(sto.getStateVector(i).getData())
        temp.insert(0, time[i])
        data.append(temp)

    df = pd.DataFrame(data, columns=labels)
    df.index = df.time
    return df
Пример #5
0
def create_opensim_storage(time, data, column_names):
    """Creates a OpenSim::Storage.

    Parameters
    ----------
    time: SimTK::Vector

    data: SimTK::Matrix

    column_names: list of strings

    Returns
    -------
    sto: OpenSim::Storage

    """
    sto = opensim.Storage()
    sto.setColumnLabels(list_to_osim_array_str(['time'] + column_names))
    for i in range(data.nrow()):
        row = opensim.ArrayDouble()
        for j in range(data.ncol()):
            row.append(data.getElt(i, j))

        sto.append(time[i], row)

    return sto
Пример #6
0
 def time_range_from_static(self):
     static = osim.MarkerData(self.static_path)
     initial_time = static.getStartFrameTime()
     final_time = static.getLastFrameTime()
     range_time = osim.ArrayDouble()
     range_time.set(0, initial_time)
     range_time.set(1, final_time)
     return range_time
Пример #7
0
    def test_StorageToPieceWiseLinearFunction(self):

        sto = osim.Storage(os.path.join(test_dir, 'storage.sto'))
        column_name = 'column1'
        scale_factor = 2.5

        time = osim.ArrayDouble()
        sto.getTimeColumn(time)

        state_index = sto.getStateIndex(column_name)

        if type(scale_factor) == float:
            sto.multiplyColumn(state_index, scale_factor)
        elif scale_factor == None:
            pass
        else:
            raise Exception('scale_factor, if specified, must be a float.')

        ordinate = osim.ArrayDouble()
        sto.getDataColumn(state_index, ordinate)

        fcn = osim.PiecewiseLinearFunction()
        for idx in range(time.getSize()):
            fcn.addPoint(time.get(idx), ordinate.get(idx))

        fcnName = os.path.join(test_dir, 'piecewiseLinearFunction.xml')
        fcn.printToXML(fcnName)

        assert fcn.getX(0) == 0
        assert_almost_equal(fcn.getX(1), 0.01)
        assert_almost_equal(fcn.getX(2), 0.02)
        assert_almost_equal(fcn.getX(3), 0.03)
        assert_almost_equal(fcn.getX(4), 0.04)
        assert_almost_equal(fcn.getY(0), 3.75)
        assert_almost_equal(fcn.getY(1), 23.025)
        assert_almost_equal(fcn.getY(2), 13.5575)

        os.remove(fcnName)
Пример #8
0
def read_from_storage(file_name):
    """Read OpenSim.Storage files. """
    sto = opensim.Storage(file_name)

    labels = osim_array_to_list(sto.getColumnLabels())
    time = opensim.ArrayDouble()
    sto.getTimeColumn(time)
    time = osim_array_to_list(time)
    data = []
    for i in range(sto.getSize()):
        temp = osim_array_to_list(sto.getStateVector(i).getData())
        temp.insert(0, time[i])
        data.append(temp)

    df = pd.DataFrame(data, columns=labels)
    df.index = df.time
    return df
Пример #9
0
def stoToDF(fileName, sampleInterval=None, filterFreq=None):
    """
    
    Parameters
    ----------
    fileName: filename of opensim .mot or .sto file

    Returns
    -------
    df: pandas data frame
    
    """

    #Load file
    osimSto = osim.Storage(fileName)

    #Resample
    if sampleInterval != None:
        osimSto.resampleLinear(sampleInterval)

    #Filter
    if filterFreq != None:
        osimSto.lowpassFIR(4, int(filterFreq))

    #Get column labels
    labels = osimToList(osimSto.getColumnLabels())

    #Set time values
    time = osim.ArrayDouble()
    osimSto.getTimeColumn(time)
    time = osimToList(time)

    #Allocate space for data
    data = []
    #Loop through columns and get data
    for i in range(osimSto.getSize()):
        temp = osimToList(osimSto.getStateVector(i).getData())
        temp.insert(0, time[i])
        data.append(temp)

    #Convert to dataframe
    df = pd.DataFrame(data, columns=labels)

    return df
Пример #10
0
def setup_scale_xml(scale_filename: str, trial: str, model: str,
                    output_directory: str, input_directory: str):
    '''
	Rewrites the scale setup xml file for a new trial

	Inputs:	scale_filename: full filename for the template inverse kinematics setup xml file
			trial: trial name, e.g.,  "_12Mar_ss_12ms_01"
			model: model name, e.g., "AB08"
			directory: output directory name

	References: Megan Schroeder, 11/01/2014

	'''

    # Static trc filename
    static_trc = input_directory + "\\" + model + trial + "_Static.trc"

    # Create marker_data object to read starting and ending times from trc file
    marker_data = osim.MarkerData(static_trc)

    time_range = osim.ArrayDouble()
    time_range.setitem(0, marker_data.getStartFrameTime())
    time_range.setitem(1, marker_data.getLastFrameTime())

    # Create scale_tool object
    scale_tool = osim.ScaleTool(scale_filename)
    scale_tool.setName(model)

    # Modify top-level properties

    # TODO, get height (optional), age (optional) and mass (required) of subject
    scale_tool.setPathToSubject(model)
    #scale_tool.setSubjectMass()
    #scale_tool.setSubjectHeight()
    #scale_tool.setSubjectAge

    # Update generic_model_maker
    generic_model_marker = scale_tool.getGenericModelMaker()
    generic_model_marker.setModelFileName(model + ".osim")
    generic_model_marker.setMarkerSetFileName(model + '_Scale_MarkerSet.xml')

    # Update model_scaler
    model_scaler = scale_tool.getModelScaler()
    model_scaler.setApply(True)

    scale_order = osim.ArrayStr()
    scale_order.setitem(0, 'Measurements')

    model_scaler.setScalingOrder(scale_order)
    measurements_set = model_scaler.getMeasurementSet()
    measurements_set.assign(
        osim.MeasurementSet().makeObjectFromFile(model +
                                                 '_Scale_MarkerSet.xml'))
    model_scaler.setMarkerFileName(static_trc)
    model_scaler.setTimeRange(time_range)
    model_scaler.setPreserveMassDist(True)

    output_filename = trial + 'TempScaled.osim'
    model_scaler.setOutputModelFileName(output_filename)

    ouput_scale_filename = trial + '_ScaleSet.xml'
    model_scaler.setOutputScaleFileName(ouput_scale_filename)
Пример #11
0
def scale():
    import os
    import opensim as osim
    import shutil
    import directories

    # Global Directories
    allDir = list(directories.main(directories))
    parentDir = allDir[0]
    paramsDir = allDir[1]
    genericDir = allDir[2]
    subID = allDir[4]
    subResultsDir = allDir[5]

    # Get generic Model
    genericModel = "gait2354_LockedJoints.osim"
    genericModelFile = genericDir + "/" + genericModel

    if not os.path.exists(subResultsDir):
        os.mkdir(subResultsDir)

    # generic input XML files
    scaleSetupFull = paramsDir + "/setupScale.xml"
    markerSetFull = paramsDir + "/markerSet.xml"
    # Make scale directory if non-existent
    scaleResultsDir = subResultsDir + "/scale"
    if os.path.exists(scaleResultsDir):
        shutil.rmtree(scaleResultsDir, ignore_errors=True)
    if not os.path.exists(scaleResultsDir):
        os.mkdir(scaleResultsDir)
    # Output XML Files
    outputScaleFile = subID + "_scaleFactors.xml"
    adjustedMarkerSet = subID + "_movedMarkers.xml"
    # Output Model Files
    outputModelFile = subID + ".osim"
    # Input Data Files
    dataFiles = parentDir + "/data/osDemo"
    staticMarkerFile = "subject01_static.trc"
    staticMarkerFull = dataFiles + "/" + staticMarkerFile
    shutil.copy(staticMarkerFull, scaleResultsDir + "/" + staticMarkerFile)

    # Output Data Files
    staticCoordinates = subID + "_staticCoordinates.mot"
    # Subject Measurements
    subjectMass = 72.60000000

    # Load Model
    aModel = osim.Model(genericModelFile)

    aModel.setName(subID)
    # Initialize System
    aModel.initSystem()
    aState = aModel.initSystem()

    # Add Marker Set
    newMarkers = osim.MarkerSet(markerSetFull)
    aModel.replaceMarkerSet(aState, newMarkers)
    # Re-initialize State
    aState = aModel.initSystem()
    # Get Time Array for .trc file
    markerData = osim.MarkerData(staticMarkerFull)
    # Get Initial and Final Time
    initial_time = markerData.getStartFrameTime()
    final_time = markerData.getLastFrameTime()
    # Create an array double and apply the time range
    TimeArray = osim.ArrayDouble()
    TimeArray.set(0, initial_time)
    TimeArray.set(1, final_time)
    # Scale Tool
    scaleTool = osim.ScaleTool(scaleSetupFull)
    scaleTool.setSubjectMass(subjectMass)

    # GenericModelMaker-
    # Tell scale tool to use the loaded model
    scaleTool.getGenericModelMaker().setModelFileName(genericDir + "/" +
                                                      genericModel)
    # # Set the Marker Set file (incase a markerset isnt attached to the model)
    scaleTool.getGenericModelMaker().setMarkerSetFileName(markerSetFull)

    # ModelScaler-
    # Whether or not to use the model scaler during scale
    scaleTool.getModelScaler().setApply(1)
    # Set the marker file (.trc) to be used for scaling
    scaleTool.getModelScaler().setMarkerFileName("/" + staticMarkerFile)
    # set a time range
    scaleTool.getModelScaler().setTimeRange(TimeArray)
    # Indicating whether or not to preserve relative mass between segments
    scaleTool.getModelScaler().setPreserveMassDist(1)
    # Name of OpenSim model file (.osim) to write when done scaling.
    scaleTool.getModelScaler().setOutputModelFileName("")
    # Filename to write scale factors that were applied to the unscaled model (optional)
    scaleTool.getModelScaler().setOutputScaleFileName(outputScaleFile)

    # Run model scaler Tool
    scaleTool.getModelScaler().processModel(aState, aModel, scaleResultsDir,
                                            subjectMass)

    # initialize
    aState = aModel.initSystem()

    # # Marker Placer
    # # Whether or not to use the model scaler during scale
    scaleTool.getMarkerPlacer().setApply(1)
    # # Set the marker placer time range
    scaleTool.getMarkerPlacer().setTimeRange(TimeArray)
    # # Set the marker file (.trc) to be used for scaling
    scaleTool.getMarkerPlacer().setStaticPoseFileName("/" + staticMarkerFile)
    # # Return name to a variable for future use in functions
    scaledAdjustedModel = scaleTool.getMarkerPlacer().setOutputModelFileName(
        "/" + outputModelFile)
    # # Set the output motion filename
    scaleTool.getMarkerPlacer().setOutputMotionFileName("/" +
                                                        staticCoordinates)
    # # Set the output xml of the marker adjustments
    scaleTool.getMarkerPlacer().setOutputMarkerFileName("/" +
                                                        adjustedMarkerSet)
    # # Maximum amount of movement allowed in marker data when averaging
    scaleTool.getMarkerPlacer().setMaxMarkerMovement(-1)
    # # Run Marker Placer
    scaleTool.getMarkerPlacer().processModel(aState, aModel, scaleResultsDir)
    scaleTool.printToXML(scaleResultsDir + "/" + subID + "_setupScale.xml")
    # Clear Terminal
    os.system('cls' if os.name == 'nt' else 'clear')

    shutil.copy(scaleResultsDir + "/" + outputModelFile, subResultsDir)
    return ()
Пример #12
0
def write(filename):

    import opensim as osim
    import csv
    import numpy as np
    import directories

    allDir = list(directories.main(directories))
    idResultsDir = allDir[7]
    soResultsDir = allDir[8]
    cmcResultsDir = allDir[10]

    storage = osim.Storage(filename)
    labels = storage.getColumnLabels()
    labelSize = labels.getSize()
    header = []

    for i in range(labelSize):
        header.append(labels.getitem(i))

    nrows = storage.getSize()

    data = []
    dataArray = []

    if header[0] == 'time':
        st = 1
        dataArray.append(osim.ArrayDouble())
        storage.getTimeColumn(dataArray[0])
        column = []
        for j in range(nrows):
            column.append(dataArray[0].getitem(j))

        data.append(column)
    else:
        st = 0

    for i in range(st, labelSize):
        dataArray.append(osim.ArrayDouble())
        storage.getDataColumn(header[i], dataArray[i])
        column = []
        for j in range(nrows):
            column.append(dataArray[i].getitem(j))

        data.append(column)
    dataFixed = np.transpose(data)
    headerFixed = []
    headerFixed.append(header)

    # Writing excel file for plotting
    if filename == idResultsDir + "/" + "subject01_walk1_id.sto":
        with open((idResultsDir + "/" + "idData.csv"), "wb") as fid:
            csvWriter = csv.writer(fid, dialect='excel')
            csvWriter.writerows(headerFixed)
            csvWriter.writerows(dataFixed)

    if filename == soResultsDir + "/" + "subject01_walk1_StaticOptimization_force.sto":
        with open((soResultsDir + "/" + "soData.csv"), "wb") as fid:
            csvWriter = csv.writer(fid, dialect='excel')
            csvWriter.writerows(headerFixed)
            csvWriter.writerows(dataFixed)

    if filename == soResultsDir + "/" + "_Gait2354 Joint RXN_ReactionLoads.sto":
        with open((soResultsDir + "/" + "soJrData.csv"), "wb") as fid:
            csvWriter = csv.writer(fid, dialect='excel')
            csvWriter.writerows(headerFixed)
            csvWriter.writerows(dataFixed)

    if filename == cmcResultsDir + "/" + "_Gait2354 Joint RXN_ReactionLoads.sto":
        with open((cmcResultsDir + "/" + "cmcJrData.csv"), "wb") as fid:
            csvWriter = csv.writer(fid, dialect='excel')
            csvWriter.writerows(headerFixed)
            csvWriter.writerows(dataFixed)
    return ()
Пример #13
0
    def create_scale_setup(self, file_dep, target):

        # EDIT THESE FIELDS IN PARTICULAR.
        # --------------------------------
        time_range = osm.ArrayDouble()
        time_range.append(self.init_time)
        time_range.append(self.final_time)

        tool = osm.ScaleTool()
        tool.setName('%s_%s' % (self.study.name, self.subject.name))
        tool.setSubjectMass(self.subject.mass)

        # GenericModelMaker
        # =================
        gmm = tool.getGenericModelMaker()
        gmm.setModelFileName(os.path.relpath(file_dep['generic_model'],
            self.results_scale_path))
        gmm.setMarkerSetFileName(os.path.relpath(self.prescale_markerset_fname))

        # ModelScaler
        # ===========
        scaler = tool.getModelScaler()
        scaler.setPreserveMassDist(True)
        marker_traj_rel_fpath = os.path.relpath(file_dep['marker_traj'],
            self.results_scale_path)
        scaler.setMarkerFileName(marker_traj_rel_fpath)

        scale_order_str = osm.ArrayStr()
        scale_order_str.append('manualScale')
        scale_order_str.append('measurements')
        scaler.setScalingOrder(scale_order_str)

        scaler.setTimeRange(time_range)

        mset = scaler.getMeasurementSet()

        # Manual scalings
        # ---------------
        sset = scaler.getScaleSet()

        # MarkerPlacer
        # ============
        placer = tool.getMarkerPlacer()
        placer.setStaticPoseFileName(marker_traj_rel_fpath)
        placer.setTimeRange(time_range)
        placer.setOutputModelFileName(os.path.relpath(
            self.output_model_fpath, self.results_scale_path))
        placer.setOutputMotionFileName(os.path.relpath(
            self.output_motion_fpath, self.results_scale_path))
        placer.setOutputMarkerFileName(os.path.relpath(
            self.output_markerset_fpath, self.results_scale_path))
        ikts = util.IKTaskSet(placer.getIKTaskSet())

        self.edit_setup_function(util, mset, sset, ikts)

        # Validate Scales
        # ===============
        model = osm.Model(file_dep['generic_model'])
        bset = model.getBodySet()
        for iscale in range(sset.getSize()):
            segment_name = sset.get(iscale).getSegmentName()
            if not bset.contains(segment_name):
                raise Exception("You specified a Scale for "
                        "body %s but it's not in the model." % segment_name)

        if not os.path.exists(self.results_scale_path):
            os.makedirs(self.results_scale_path)
        tool.printToXML(target['setup'])
Пример #14
0
 #Set-up data adapters
 c3d = osim.C3DFileAdapter()
 trc = osim.TRCFileAdapter()
 
 #Get markers
 static = c3d.read(staticFile[0])
 markersStatic = c3d.getMarkersTable(static)
 
 #Write static data to file
 trc.write(markersStatic, staticFile[0].split('.')[0]+'.trc')
 
 #Set variable for static trial trc
 staticTrial_trc = staticFile[0].split('.')[0]+'.trc'
 
 #Set scale time range
 scaleTimeRange = osim.ArrayDouble()
 scaleTimeRange.set(0,osim.Storage(staticTrial_trc).getFirstTime())
 scaleTimeRange.set(1,osim.Storage(staticTrial_trc).getFirstTime()+0.5)
 
 #Set-up scale tool    
 scaleTool.append(osim.ScaleTool())
 
 #Set mass in scale tool
 scaleTool[ii-startInd].setSubjectMass(mass)
 
 #Set generic model file
 scaleTool[ii-startInd].getGenericModelMaker().setModelFileName(genModelFileName)
 
 #Set the measurement set
 scaleTool[ii-startInd].getModelScaler().setMeasurementSet(measurementSet)
 
Пример #15
0
# The first step is to create an XML file with all the information used to scale the model

# Load the generic musculoskeletal model
osimModel = osim.Model(generic_MM_Path)
state = osimModel.initSystem()

# Add a marker set to the model
markerSet = osim.MarkerSet(XML_markers_path)
osimModel.replaceMarkerSet(state, markerSet)
state = osimModel.initSystem()

# Get the marker data from a .trc file
markerData = osim.MarkerData(TRC_file)
initial_time = markerData.getStartFrameTime()
final_time = markerData.getLastFrameTime()
TimeArray = osim.ArrayDouble()                                                 # Time range
TimeArray.set(0,initial_time)
TimeArray.set(1,final_time) 

# Scale Tool
scaleTool = osim.ScaleTool(XML_generic_ST_path)
scaleTool.setName('Subject')                                                   # Name of the subject
scaleTool.setSubjectMass(70)                                                   # Mass of the subject
scaleTool.setSubjectHeight(-1)                                                 # Only for information (not used by scaling)
scaleTool.setSubjectAge(-1)                                                    # Only for information (not used by scaling)

# Generic Model Maker
scaleTool.getGenericModelMaker().setModelFileName('Rajagopal2015.osim')
scaleTool.getGenericModelMaker().setMarkerSetFileName(XML_markers_path)

# Model Scaler
Пример #16
0
#Set marker file

#Add the virtual markers and create a new .trc file to use in scaling
osimHelper.addVirtualMarkersStatic('static.trc','staticVirtualMarkers.trc')

#Place in scale tool
scaleTool.getMarkerPlacer().setMarkerFileName('staticVirtualMarkers.trc')
scaleTool.getModelScaler().setMarkerFileName('staticVirtualMarkers.trc')

#Set options
scaleTool.getModelScaler().setPreserveMassDist(True)
scaleOrder = osim.ArrayStr(); scaleOrder.set(0,'measurements')
scaleTool.getModelScaler().setScalingOrder(scaleOrder)

#Set time ranges
timeRange = osim.ArrayDouble()
timeRange.set(0,0.5); timeRange.set(1,1.5)
scaleTool.getMarkerPlacer().setTimeRange(timeRange)
scaleTool.getModelScaler().setTimeRange(timeRange)

#Set output files
scaleTool.getModelScaler().setOutputModelFileName('scaledModel.osim')
scaleTool.getModelScaler().setOutputScaleFileName('scaleSet.xml')

#Set marker adjuster parameters
scaleTool.getMarkerPlacer().setOutputMotionFileName('static_motion.mot')
scaleTool.getMarkerPlacer().setOutputModelFileName('scaledModelAdjusted.osim')

#Save and run scale tool
scaleTool.printToXML('scaleSetup.xml')
scaleTool.run()