def applyDecorators_CGM1(smc, model,acqStatic,optional_mp,markerDiameter): # native but thighRotation altered in mp if smc["left"] == enums.CgmStaticMarkerConfig.Native and optional_mp["LeftThighRotation"] !=0: logging.warning("CASE FOUND ===> Left Side = NATIVE CGM1 + manual Thigh ") modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"left",optional_mp["LeftThighRotation"], markerDiameter, optional_mp["LeftTibialTorsion"], optional_mp["LeftShankRotation"]) if smc["right"] == enums.CgmStaticMarkerConfig.Native and optional_mp["RightThighRotation"] !=0: logging.warning("CASE FOUND ===> Right Side = NATIVE CGM1 + manual Thigh ") modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"right",optional_mp["RightThighRotation"], markerDiameter,optional_mp["RightTibialTorsion"],optional_mp["RightShankRotation"]) # KAD if smc["left"] == enums.CgmStaticMarkerConfig.KAD: logging.warning("CASE FOUND ===> Left Side = KAD") modelDecorator.Kad(model,acqStatic).compute(markerDiameter=markerDiameter, side="left") if smc["right"] == enums.CgmStaticMarkerConfig.KAD: logging.warning("CASE FOUND ===> Right Side = KAD") modelDecorator.Kad(model,acqStatic).compute(markerDiameter=markerDiameter, side="right") # KADmed if smc["left"] == enums.CgmStaticMarkerConfig.KADmed: logging.warning("CASE FOUND ===> Left Side = KAD+med") modelDecorator.Kad(model,acqStatic).compute(markerDiameter=markerDiameter, side="left") modelDecorator.AnkleCalibrationDecorator(model).midMaleolus(acqStatic, markerDiameter=markerDiameter, side="left") if smc["right"] == enums.CgmStaticMarkerConfig.KADmed: logging.warning("CASE FOUND ===> Right Side = KAD+med") modelDecorator.Kad(model,acqStatic).compute(markerDiameter=markerDiameter, side="right") modelDecorator.AnkleCalibrationDecorator(model).midMaleolus(acqStatic, markerDiameter=markerDiameter, side="right")
def basicCGM1_manualOffset_thighRotationOFF_shankRotationON_tibialTorsionON(cls): """ CGM1 manual offset behaviour : => - Manual Thigh Rotation must modify ShankRotation. - If zero TibialTorsion inputs -> flag RightTibialTorsion must be off and TibialTorsion keep zero value """ MAIN_PATH = pyCGM2.TEST_DATA_PATH + "CGM1\\CGM1-TESTS\\basic-manualOffsets-thiOFF_shaON_torsionON\\" staticFilename = "MRI-US-01, 2008-08-08, 3DGA 02.c3d" acqStatic = btkTools.smartReader(str(MAIN_PATH + staticFilename)) model=cgm.CGM1 model.configure() markerDiameter=14 mp={ 'Bodymass' : 71.0, 'LeftLegLength' : 860.0, 'RightLegLength' : 865.0 , 'LeftKneeWidth' : 102.0, 'RightKneeWidth' : 103.4, 'LeftAnkleWidth' : 75.3, 'RightAnkleWidth' : 72.9, 'LeftSoleDelta' : 0, 'RightSoleDelta' : 0, } optional_mp={ 'InterAsisDistance' : 0, 'LeftAsisTrocanterDistance' : 0, 'LeftThighRotation' : 0, 'LeftShankRotation' : -10, 'LeftTibialTorsion' : -30, 'RightAsisTrocanterDistance' : 0, 'RightThighRotation' : 0, 'RightShankRotation' : -10, 'RightTibialTorsion' : -30 } model.addAnthropoInputParameters(mp,optional=optional_mp) # -----------CGM STATIC CALIBRATION-------------------- scp=modelFilters.StaticCalibrationProcedure(model) modelFilters.ModelCalibrationFilter(scp,acqStatic,model).compute() # decorators modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"left",model.mp["LeftThighRotation"],markerDiameter,model.mp["LeftTibialTorsion"],model.mp["LeftShankRotation"]) modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"right",model.mp["RightThighRotation"],markerDiameter,model.mp["RightTibialTorsion"],model.mp["RightShankRotation"]) # finql calibration modelFilters.ModelCalibrationFilter(scp,acqStatic,model ).compute() # TESTS np.testing.assert_equal(model.m_useRightTibialTorsion,True ) np.testing.assert_equal(model.m_useLeftTibialTorsion,True ) np.testing.assert_almost_equal(model.mp_computed["LeftShankRotationOffset"] ,0, decimal = 3) np.testing.assert_almost_equal(model.mp_computed["RightShankRotationOffset"] ,0, decimal = 3)
def applyBasicDecorators(dcm, model,acqStatic,optional_mp,markerDiameter,cgm1only=False): # native but thighRotation altered in mp if dcm["Left Knee"] == enums.JointCalibrationMethod.Basic and dcm["Left Ankle"] == enums.JointCalibrationMethod.Basic and optional_mp["LeftThighRotation"] !=0: logging.warning("CASE FOUND ===> Left Side = NATIVE CGM1 + manual Thigh ") modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"left",optional_mp["LeftThighRotation"], markerDiameter, optional_mp["LeftTibialTorsion"], optional_mp["LeftShankRotation"]) if dcm["Right Knee"] == enums.JointCalibrationMethod.Basic and dcm["Right Ankle"] == enums.JointCalibrationMethod.Basic and optional_mp["RightThighRotation"] !=0: logging.warning("CASE FOUND ===> Right Side = NATIVE CGM1 + manual Thigh ") modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"right",optional_mp["RightThighRotation"], markerDiameter,optional_mp["RightTibialTorsion"],optional_mp["RightShankRotation"]) # KAD - and Kadmed if dcm["Left Knee"] == enums.JointCalibrationMethod.KAD: logging.warning("CASE FOUND ===> Left Side = KAD") modelDecorator.Kad(model,acqStatic).compute(markerDiameter=markerDiameter, side="left") if dcm["Left Ankle"] == enums.JointCalibrationMethod.Medial: modelDecorator.AnkleCalibrationDecorator(model).midMaleolus(acqStatic, markerDiameter=markerDiameter, side="left") if dcm["Right Knee"] == enums.JointCalibrationMethod.KAD: logging.warning("CASE FOUND ===> Right Side = KAD") modelDecorator.Kad(model,acqStatic).compute(markerDiameter=markerDiameter, side="right") if dcm["Right Ankle"] == enums.JointCalibrationMethod.Medial: modelDecorator.AnkleCalibrationDecorator(model).midMaleolus(acqStatic, markerDiameter=markerDiameter, side="right") if not cgm1only: #Kad-like (KneeMed) if dcm["Left Knee"] == enums.JointCalibrationMethod.Medial and dcm["Left Ankle"] == enums.JointCalibrationMethod.Basic: modelDecorator.KneeCalibrationDecorator(model).midCondyles_KAD(acqStatic, markerDiameter=markerDiameter, side="left") if dcm["Right Knee"] == enums.JointCalibrationMethod.Medial and dcm["Right Ankle"] == enums.JointCalibrationMethod.Basic: modelDecorator.KneeCalibrationDecorator(model).midCondyles_KAD(acqStatic, markerDiameter=markerDiameter, side="right") #knee and ankle Med if dcm["Left Knee"] == enums.JointCalibrationMethod.Medial and dcm["Left Ankle"] == enums.JointCalibrationMethod.Medial: modelDecorator.KneeCalibrationDecorator(model).midCondyles(acqStatic, markerDiameter=markerDiameter, side="left") modelDecorator.AnkleCalibrationDecorator(model).midMaleolus(acqStatic, markerDiameter=markerDiameter, side="left") if dcm["Right Knee"] == enums.JointCalibrationMethod.Medial and dcm["Right Ankle"] == enums.JointCalibrationMethod.Medial: modelDecorator.KneeCalibrationDecorator(model).midCondyles(acqStatic, markerDiameter=markerDiameter, side="right") modelDecorator.AnkleCalibrationDecorator(model).midMaleolus(acqStatic, markerDiameter=markerDiameter, side="right")
def basicCGM1_manualOffset_thighRotationON_shankRotationOFF_tibialTorsionON(cls): """ CGM1 manual offset behaviour : => - Manual Thigh Rotation must modify ShankRotation. - If zero TibialTorsion inputs -> flag RightTibialTorsion must be off and TibialTorsion keep zero value """ MAIN_PATH = pyCGM2.TEST_DATA_PATH + "CGM1\\CGM1-TESTS\\basic-manualOffsets-thiON_shaOFF_torsionON\\" staticFilename = "MRI-US-01, 2008-08-08, 3DGA 02.c3d" acqStatic = btkTools.smartReader(str(MAIN_PATH + staticFilename)) model=cgm.CGM1 model.configure() markerDiameter=14 mp={ 'Bodymass' : 71.0, 'LeftLegLength' : 860.0, 'RightLegLength' : 865.0 , 'LeftKneeWidth' : 102.0, 'RightKneeWidth' : 103.4, 'LeftAnkleWidth' : 75.3, 'RightAnkleWidth' : 72.9, 'LeftSoleDelta' : 0, 'RightSoleDelta' : 0, } optional_mp={ 'InterAsisDistance' : 0, 'LeftAsisTrocanterDistance' : 0, 'LeftThighRotation' : 10, 'LeftShankRotation' : 0, 'LeftTibialTorsion' : -30.0, 'RightAsisTrocanterDistance' : 0, 'RightThighRotation' : 10, 'RightShankRotation' : 0, 'RightTibialTorsion' : -30.0 } model.addAnthropoInputParameters(mp,optional=optional_mp) # -----------CGM STATIC CALIBRATION-------------------- scp=modelFilters.StaticCalibrationProcedure(model) modelFilters.ModelCalibrationFilter(scp,acqStatic,model).compute() # decorators modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"left",model.mp["LeftThighRotation"],markerDiameter,model.mp["LeftTibialTorsion"],model.mp["LeftShankRotation"]) modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"right",model.mp["RightThighRotation"],markerDiameter,model.mp["RightTibialTorsion"],model.mp["RightShankRotation"]) # finql calibration modelFilters.ModelCalibrationFilter(scp,acqStatic,model,viconCGM1compatible=True ).compute() # TESTS # offset testing offsetTesting(acqStatic,model,display = True, unitTesting=True) np.testing.assert_equal(model.getSegment("Left Thigh").getReferential("TF").static.getNode_byLabel("LKJC").m_desc ,"manual ThighOffset") np.testing.assert_equal(model.getSegment("Right Thigh").getReferential("TF").static.getNode_byLabel("RKJC").m_desc ,"manual ThighOffset") np.testing.assert_equal(model.getSegment("Left Shank").getReferential("TF").static.getNode_byLabel("LKJC").m_desc ,"manual ThighOffset") np.testing.assert_equal(model.getSegment("Right Shank").getReferential("TF").static.getNode_byLabel("RKJC").m_desc ,"manual ThighOffset") np.testing.assert_equal(model.getSegment("Left Shank").getReferential("TF").static.getNode_byLabel("LAJC").m_desc ,"manualTHIoffset-manualTT") np.testing.assert_equal(model.getSegment("Right Shank").getReferential("TF").static.getNode_byLabel("RAJC").m_desc ,"manualTHIoffset-manualTT") np.testing.assert_equal(model.getSegment("Left Foot").getReferential("TF").static.getNode_byLabel("LAJC").m_desc ,"manualTHIoffset-manualTT") np.testing.assert_equal(model.getSegment("Right Foot").getReferential("TF").static.getNode_byLabel("RAJC").m_desc ,"manualTHIoffset-manualTT") np.testing.assert_equal(model.m_useRightTibialTorsion,True ) np.testing.assert_equal(model.m_useLeftTibialTorsion,True )
def basicCGM1_manualTibialTorsion_withDecorator(cls): MAIN_PATH = pyCGM2.TEST_DATA_PATH + "CGM1\\CGM1-TESTS\\basic-tibialTorsion\\" staticFilename = "MRI-US-01, 2008-08-08, 3DGA 02.c3d" acqStatic = btkTools.smartReader(str(MAIN_PATH + staticFilename)) model=cgm.CGM1 model.configure() markerDiameter=14 mp={ 'Bodymass' : 71.0, 'LeftLegLength' : 860.0, 'RightLegLength' : 865.0 , 'LeftKneeWidth' : 102.0, 'RightKneeWidth' : 103.4, 'LeftAnkleWidth' : 75.3, 'RightAnkleWidth' : 72.9, 'LeftSoleDelta' : 0, 'RightSoleDelta' : 0, } optional_mp={ 'InterAsisDistance' : 0, 'LeftAsisTrocanterDistance' : 0, 'LeftThighRotation' : 0, 'LeftShankRotation' : 0, 'LeftTibialTorsion' : -30.0, 'RightAsisTrocanterDistance' : 0, 'RightThighRotation' : 0, 'RightShankRotation' : 0, 'RightTibialTorsion' : -30.0 } model.addAnthropoInputParameters(mp,optional=optional_mp) # -----------CGM STATIC CALIBRATION-------------------- scp=modelFilters.StaticCalibrationProcedure(model) modelFilters.ModelCalibrationFilter(scp,acqStatic,model, viconCGM1compatible=True).compute() # decorators modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"left",model.mp["LeftThighRotation"],markerDiameter,model.mp["LeftTibialTorsion"],model.mp["LeftShankRotation"]) modelDecorator.Cgm1ManualOffsets(model).compute(acqStatic,"right",model.mp["RightThighRotation"],markerDiameter,model.mp["RightTibialTorsion"],model.mp["RightShankRotation"]) modelFilters.ModelCalibrationFilter(scp,acqStatic,model, viconCGM1compatible=True).compute() # TESTS ------------------------------------------------ # offset testing offsetTesting(acqStatic,model,display = True, unitTesting=True) # nodes # np.testing.assert_equal(model.getSegment("Left Thigh").getReferential("TF").static.getNode_byLabel("LKJC").m_desc ,"Chord") # np.testing.assert_equal(model.getSegment("Right Thigh").getReferential("TF").static.getNode_byLabel("RKJC").m_desc ,"Chord") # # np.testing.assert_equal(model.getSegment("Left Shank").getReferential("TF").static.getNode_byLabel("LKJC").m_desc ,"Chord") # np.testing.assert_equal(model.getSegment("Right Shank").getReferential("TF").static.getNode_byLabel("RKJC").m_desc ,"Chord") np.testing.assert_equal(model.m_useRightTibialTorsion,True ) np.testing.assert_equal(model.m_useLeftTibialTorsion,True ) # joint centres np.testing.assert_almost_equal(acqStatic.GetPoint("LFEP").GetValues().mean(axis=0),acqStatic.GetPoint("LHJC").GetValues().mean(axis=0),decimal = 3) np.testing.assert_almost_equal(acqStatic.GetPoint("RFEP").GetValues().mean(axis=0),acqStatic.GetPoint("RHJC").GetValues().mean(axis=0),decimal = 3) np.testing.assert_almost_equal(acqStatic.GetPoint("LFEO").GetValues().mean(axis=0),acqStatic.GetPoint("LKJC").GetValues().mean(axis=0),decimal = 3) np.testing.assert_almost_equal(acqStatic.GetPoint("RFEO").GetValues().mean(axis=0),acqStatic.GetPoint("RKJC").GetValues().mean(axis=0),decimal = 3) np.testing.assert_almost_equal(acqStatic.GetPoint("LTIO").GetValues().mean(axis=0),acqStatic.GetPoint("LAJC").GetValues().mean(axis=0),decimal = 3) np.testing.assert_almost_equal(acqStatic.GetPoint("RTIO").GetValues().mean(axis=0),acqStatic.GetPoint("RAJC").GetValues().mean(axis=0),decimal = 3) btkTools.smartWriter(acqStatic, "outStatic_advancedCGM1_kad_manualTibial.c3d")
def applyBasicDecorators(dcm, model, acqStatic, optional_mp, markerDiameter, cgm1only=False): if model.getBodyPart() != enums.BodyPart.UpperLimb: # native but thighRotation altered in mp if dcm["Left Knee"] == enums.JointCalibrationMethod.Basic and dcm[ "Left Ankle"] == enums.JointCalibrationMethod.Basic and optional_mp[ "LeftThighRotation"] != 0: LOGGER.logger.debug( "CASE FOUND ===> Left Side = NATIVE CGM1 + manual Thigh ") modelDecorator.Cgm1ManualOffsets(model).compute( acqStatic, "left", optional_mp["LeftThighRotation"], markerDiameter, optional_mp["LeftTibialTorsion"], optional_mp["LeftShankRotation"]) if dcm["Right Knee"] == enums.JointCalibrationMethod.Basic and dcm[ "Right Ankle"] == enums.JointCalibrationMethod.Basic and optional_mp[ "RightThighRotation"] != 0: LOGGER.logger.debug( "CASE FOUND ===> Right Side = NATIVE CGM1 + manual Thigh ") modelDecorator.Cgm1ManualOffsets(model).compute( acqStatic, "right", optional_mp["RightThighRotation"], markerDiameter, optional_mp["RightTibialTorsion"], optional_mp["RightShankRotation"]) # KAD - and Kadmed if dcm["Left Knee"] == enums.JointCalibrationMethod.KAD: LOGGER.logger.debug("CASE FOUND ===> Left Side = Knee-KAD") modelDecorator.Kad(model, acqStatic).compute( markerDiameter=markerDiameter, side="left") if dcm["Left Ankle"] == enums.JointCalibrationMethod.Medial: LOGGER.logger.debug("CASE FOUND ===> Left Side = Ankle-Med") modelDecorator.AnkleCalibrationDecorator(model).midMaleolus( acqStatic, markerDiameter=markerDiameter, side="left") if dcm["Right Knee"] == enums.JointCalibrationMethod.KAD: LOGGER.logger.debug("CASE FOUND ===> Right Side = Knee-KAD") modelDecorator.Kad(model, acqStatic).compute( markerDiameter=markerDiameter, side="right") if dcm["Right Ankle"] == enums.JointCalibrationMethod.Medial: LOGGER.logger.debug("CASE FOUND ===> Right Side = Ankle-Med") modelDecorator.AnkleCalibrationDecorator(model).midMaleolus( acqStatic, markerDiameter=markerDiameter, side="right") if not cgm1only: if model.getBodyPart() != enums.BodyPart.UpperLimb: #Kad-like (KneeMed) if dcm["Left Knee"] == enums.JointCalibrationMethod.Medial and dcm[ "Left Ankle"] == enums.JointCalibrationMethod.Basic: modelDecorator.KneeCalibrationDecorator(model).midCondyles_KAD( acqStatic, markerDiameter=markerDiameter, side="left") if dcm["Right Knee"] == enums.JointCalibrationMethod.Medial and dcm[ "Right Ankle"] == enums.JointCalibrationMethod.Basic: modelDecorator.KneeCalibrationDecorator(model).midCondyles_KAD( acqStatic, markerDiameter=markerDiameter, side="right") #knee and ankle Med if dcm["Left Knee"] == enums.JointCalibrationMethod.Medial and dcm[ "Left Ankle"] == enums.JointCalibrationMethod.Medial: LOGGER.logger.info( "[pyCGM2] Left Knee : Medial - Left Ankle : Medial") modelDecorator.KneeCalibrationDecorator(model).midCondyles( acqStatic, markerDiameter=markerDiameter, side="left") modelDecorator.AnkleCalibrationDecorator(model).midMaleolus( acqStatic, markerDiameter=markerDiameter, side="left") if dcm["Right Knee"] == enums.JointCalibrationMethod.Medial and dcm[ "Right Ankle"] == enums.JointCalibrationMethod.Medial: LOGGER.logger.info( "[pyCGM2] Right Knee : Medial - Right Ankle : Medial") modelDecorator.KneeCalibrationDecorator(model).midCondyles( acqStatic, markerDiameter=markerDiameter, side="right") modelDecorator.AnkleCalibrationDecorator(model).midMaleolus( acqStatic, markerDiameter=markerDiameter, side="right")