def main(): plt.close("all") parser = argparse.ArgumentParser(description='CGM plot temporal Kinetics') parser.add_argument('-ps', '--pointSuffix', type=str, help='suffix of model outputs') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: pointSuffix = args.pointSuffix # --------------------------INPUTS ------------------------------------ DATA_PATH, modelledFilenameNoExt = NEXUS.GetTrialName() modelledFilename = modelledFilenameNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("file: " + modelledFilename) # ----- Subject ----- # need subject to find input files subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) logging.info("Subject name : " + subject) # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH, subject) modelVersion = model.version # ----- construction of the openMA root instance ----- trialConstructorFilter = nexusFilters.NexusConstructTrialFilter( DATA_PATH, modelledFilenameNoExt, subject) openmaTrial = trialConstructorFilter.build() # --------------------pyCGM2 MODEL ------------------------------ if model.m_bodypart in [ enums.BodyPart.LowerLimb, enums.BodyPart.LowerLimbTrunk, enums.BodyPart.FullBody ]: plot.plotTemporalKinetic(DATA_PATH, modelledFilename, "LowerLimb", pointLabelSuffix=pointSuffix, exportPdf=True, openmaTrial=openmaTrial) # if model.m_bodypart in [enums.BodyPart.LowerLimbTrunk, enums.BodyPart.FullBody]: # plot.plotTemporalKinetic(DATA_PATH, modelledFilename,"Trunk", pointLabelSuffix=pointSuffix,exportPdf=True) # if model.m_bodypart in [enums.BodyPart.UpperLimb, enums.BodyPart.FullBody]: # pass # TODO plot upperlimb panel else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(): parser = argparse.ArgumentParser(description='ZeniDetector') parser.add_argument('-fso','--footStrikeOffset', type=int, help='systenatic foot strike offset on both side') parser.add_argument('-foo','--footOffOffset', type=int, help='systenatic foot off offset on both side') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # ----------------------INPUTS------------------------------------------- # --- acquisition file and path---- DATA_PATH, reconstructFilenameLabelledNoExt = NEXUS.GetTrialName() reconstructFilenameLabelled = reconstructFilenameLabelledNoExt+".c3d" logging.info( "data Path: "+ DATA_PATH ) logging.info( "calibration file: "+ reconstructFilenameLabelled) #acqGait = btkTools.smartReader(str(DATA_PATH + reconstructFilenameLabelled)) # --------------------------SUBJECT ----------------------------------- # Notice : Work with ONE subject by session subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS,subjects) logging.info( "Subject name : " + subject ) # --- btk acquisition ---- nacf = nexusFilters.NexusConstructAcquisitionFilter(DATA_PATH,reconstructFilenameLabelledNoExt,subject) acqGait = nacf.build() # ----------------------EVENT DETECTOR------------------------------- evp = events.ZeniProcedure() if args.footStrikeOffset is not None: evp.setFootStrikeOffset(args.footStrikeOffset) if args.footOffOffset is not None: evp.setFootOffOffset(args.footOffOffset) evf = events.EventFilter(evp,acqGait) evf.detect() state = evf.getState() # ----------------------DISPLAY ON VICON------------------------------- nexusTools.createEvents(NEXUS,subject,acqGait,["Foot Strike","Foot Off"]) # ========END of the nexus OPERATION if run from Nexus ========= else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(): plt.close("all") parser = argparse.ArgumentParser(description='CGM plot stp') parser.add_argument('-ps', '--pointSuffix', type=str, help='suffix added to pyCGM2 outputs') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: pointSuffix = args.pointSuffix # --------------------------INPUTS ------------------------------------ DATA_PATH, modelledFilenameNoExt = NEXUS.GetTrialName() modelledFilename = modelledFilenameNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("file: " + modelledFilename) # ----- Subject ----- # need subject to find input files subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) logging.info("Subject name : " + subject) # ----- construction of the openMA root instance ----- trialConstructorFilter = nexusFilters.NexusConstructTrialFilter( DATA_PATH, modelledFilenameNoExt, subject) openmaTrial = trialConstructorFilter.build() # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH, subject) modelVersion = model.version # --------------------------PROCESSING -------------------------------- analysisInstance = analysis.makeAnalysis( DATA_PATH, [modelledFilename], pointLabelSuffix=pointSuffix, openmaTrials=[openmaTrial] ) # analysis structure gathering Time-normalized Kinematic and kinetic CGM outputs plot.plot_spatioTemporal(DATA_PATH, analysisInstance, exportPdf=True, outputName=modelledFilename) else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(): parser = argparse.ArgumentParser(description='CGM2.4 Calibration') parser.add_argument('-l', '--leftFlatFoot', type=int, help='left flat foot option') parser.add_argument('-r', '--rightFlatFoot', type=int, help='right flat foot option') parser.add_argument('-hf', '--headFlat', type=int, help='head flat option') parser.add_argument('-md', '--markerDiameter', type=float, help='marker diameter') parser.add_argument('-ps', '--pointSuffix', type=str, help='suffix of model outputs') parser.add_argument('--check', action='store_true', help='force model output suffix') parser.add_argument('--noIk', action='store_true', help='cancel inverse kinematic') parser.add_argument('--resetMP', action='store_true', help='reset optional mass parameters') parser.add_argument('--forceLHJC', nargs='+') parser.add_argument('--forceRHJC', nargs='+') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --------------------GLOBAL SETTINGS ------------------------------ # ( in user/AppData) if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_4-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH, "CGM2_4-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER, "CGM2_4-pyCGM2.settings") argsManager = CgmArgsManager.argsManager_cgm(settings, args) leftFlatFoot = argsManager.getLeftFlatFoot() rightFlatFoot = argsManager.getRightFlatFoot() headFlat = argsManager.getHeadFlat() markerDiameter = argsManager.getMarkerDiameter() pointSuffix = argsManager.getPointSuffix("cgm2.4") ik_flag = argsManager.enableIKflag() hjcMethod = settings["Calibration"]["HJC"] lhjc = argsManager.forceHjc("left") rhjc = argsManager.forceHjc("right") if lhjc is not None: hjcMethod["Left"] = lhjc if rhjc is not None: hjcMethod["Right"] = rhjc # --------------------------LOADING------------------------------ DATA_PATH, calibrateFilenameLabelledNoExt = NEXUS.GetTrialName() calibrateFilenameLabelled = calibrateFilenameLabelledNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("calibration file: " + calibrateFilenameLabelled) # --------------------------SUBJECT ----------------------------------- # Notice : Work with ONE subject by session subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) Parameters = NEXUS.GetSubjectParamNames(subject) required_mp, optional_mp = nexusUtils.getNexusSubjectMp( NEXUS, subject, resetFlag=args.resetMP) # --------------------------SESSION INFOS ----------------------------- # --------------------------SESSIONS INFOS ----------------------------------- mpInfo, mpFilename = files.getMpFileContent(DATA_PATH, "mp.pyCGM2", subject) # translators management translators = files.getTranslators(DATA_PATH, "CGM2_4.translators") if not translators: translators = settings["Translators"] # btkAcq builder nacf = nexusFilters.NexusConstructAcquisitionFilter( DATA_PATH, calibrateFilenameLabelledNoExt, subject) acq = nacf.build() # --------------------------CONFIG ------------------------------------ model, finalAcqStatic = cgm2_4.calibrate(DATA_PATH, calibrateFilenameLabelled, translators, settings, required_mp, optional_mp, ik_flag, leftFlatFoot, rightFlatFoot, headFlat, markerDiameter, hjcMethod, pointSuffix, forceBtkAcq=acq) # ----------------------SAVE------------------------------------------- files.saveModel(model, DATA_PATH, subject) # save mp files.saveMp(mpInfo, model, DATA_PATH, mpFilename) # ----------------------DISPLAY ON VICON------------------------------- nexusUtils.updateNexusSubjectMp(NEXUS, model, subject) nexusFilters.NexusModelFilter(NEXUS, model, finalAcqStatic, subject, pointSuffix, staticProcessing=True).run() # ========END of the nexus OPERATION if run from Nexus ========= else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(args): NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: #-----------------------SETTINGS--------------------------------------- pointSuffix = args.pointSuffix normativeData = { "Author": args.normativeData, "Modality": args.normativeDataModality } if normativeData["Author"] == "Schwartz2008": chosenModality = normativeData["Modality"] nds = normativeDatasets.Schwartz2008( chosenModality ) # modalites : "Very Slow" ,"Slow", "Free", "Fast", "Very Fast" elif normativeData["Author"] == "Pinzone2014": chosenModality = normativeData["Modality"] nds = normativeDatasets.Pinzone2014( chosenModality) # modalites : "Center One" ,"Center Two" consistencyFlag = True if args.consistency else False # --------------------------INPUTS ------------------------------------ DATA_PATH, modelledFilenameNoExt = NEXUS.GetTrialName() modelledFilename = modelledFilenameNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("file: " + modelledFilename) # ----- Subject ----- # need subject to find input files subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) logging.info("Subject name : " + subject) # ----- construction of the openMA root instance ----- trialConstructorFilter = nexusFilters.NexusConstructTrialFilter( DATA_PATH, modelledFilenameNoExt, subject) openmaTrial = trialConstructorFilter.build() # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH, subject) modelVersion = model.version # --------------------------PROCESSING -------------------------------- analysisInstance = analysis.makeAnalysis( DATA_PATH, [modelledFilename], pointLabelSuffix=pointSuffix, openmaTrials=[openmaTrial] ) # analysis structure gathering Time-normalized Kinematic and kinetic CGM outputs if not consistencyFlag: if model.m_bodypart in [ enums.BodyPart.LowerLimb, enums.BodyPart.LowerLimbTrunk, enums.BodyPart.FullBody ]: plot.plot_DescriptiveKinetic(DATA_PATH, analysisInstance, "LowerLimb", nds, pointLabelSuffix=pointSuffix, exportPdf=True, outputName=modelledFilename) else: if model.m_bodypart in [ enums.BodyPart.LowerLimb, enums.BodyPart.LowerLimbTrunk, enums.BodyPart.FullBody ]: plot.plot_ConsistencyKinetic(DATA_PATH, analysisInstance, "LowerLimb", nds, pointLabelSuffix=pointSuffix, exportPdf=True, outputName=modelledFilename) else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(): parser = argparse.ArgumentParser(description='CGM2-1 Fitting') parser.add_argument( '--proj', type=str, help='Moment Projection. Choice : Distal, Proximal, Global') parser.add_argument('-md', '--markerDiameter', type=float, help='marker diameter') parser.add_argument('-ps', '--pointSuffix', type=str, help='suffix of model outputs') parser.add_argument('--check', action='store_true', help='force model output suffix') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --------------------------GLOBAL SETTINGS ------------------------------------ # global setting ( in user/AppData) if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_1-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH, "CGM2_1-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER, "CGM2_1-pyCGM2.settings") # --------------------------CONFIG ------------------------------------ argsManager = CgmArgsManager.argsManager_cgm(settings, args) markerDiameter = argsManager.getMarkerDiameter() pointSuffix = argsManager.getPointSuffix("cgm2.1") momentProjection = argsManager.getMomentProjection() # --------------------------LOADING ------------------------------------ DATA_PATH, reconstructFilenameLabelledNoExt = NEXUS.GetTrialName() reconstructFilenameLabelled = reconstructFilenameLabelledNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("calibration file: " + reconstructFilenameLabelled) # --------------------------SUBJECT ------------------------------------ subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) logging.info("Subject name : " + subject) # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH, subject) # check model logging.info("loaded model : %s" % (model.version)) if model.version != "CGM2.1": raise Exception( "%s-pyCGM2.model file was not calibrated from the CGM2.1 calibration pipeline" % subject) # --------------------------SESSION INFOS ------------------------------------ # translators management translators = files.getTranslators(DATA_PATH, "CGM2_1.translators") if not translators: translators = settings["Translators"] #force plate assignement from Nexus mfpa = nexusTools.getForcePlateAssignment(NEXUS) # btkAcq builder nacf = nexusFilters.NexusConstructAcquisitionFilter( DATA_PATH, reconstructFilenameLabelledNoExt, subject) acq = nacf.build() # --------------------------MODELLING PROCESSING ----------------------- acqGait = cgm2_1.fitting(model, DATA_PATH, reconstructFilenameLabelled, translators, markerDiameter, pointSuffix, mfpa, momentProjection, forceBtkAcq=acq) # ----------------------DISPLAY ON VICON------------------------------- nexusFilters.NexusModelFilter(NEXUS, model, acqGait, subject, pointSuffix).run() nexusTools.createGeneralEvents(NEXUS, subject, acqGait, ["Left-FP", "Right-FP"]) # ========END of the nexus OPERATION if run from Nexus ========= else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(args): NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --- acquisition file and path---- DATA_PATH, inputFileNoExt = NEXUS.GetTrialName() inputFile = inputFileNoExt+".c3d" #--------------------------settings------------------------------------- if os.path.isfile(DATA_PATH + "emg.settings"): emgSettings = files.openFile(DATA_PATH,"emg.settings") logging.warning("[pyCGM2]: emg.settings detected in the data folder") else: emgSettings = None manager = EmgManager.EmgConfigManager(None,localInternalSettings=emgSettings) manager.contruct() # ----------------------INPUTS------------------------------------------- bandPassFilterFrequencies = manager.BandpassFrequencies#emgSettings["Processing"]["BandpassFrequencies"] if args.BandpassFrequencies is not None: if len(args.BandpassFrequencies) != 2: raise Exception("[pyCGM2] - bad configuration of the bandpass frequencies ... set 2 frequencies only") else: bandPassFilterFrequencies = [float(args.BandpassFrequencies[0]),float(args.BandpassFrequencies[1])] logging.info("Band pass frequency set to %i - %i instead of 20-200Hz",bandPassFilterFrequencies[0],bandPassFilterFrequencies[1]) envelopCutOffFrequency = manager.EnvelopLowpassFrequency#emgSettings["Processing"]["EnvelopLowpassFrequency"] if args.EnvelopLowpassFrequency is not None: envelopCutOffFrequency = args.EnvelopLowpassFrequency logging.info("Cut-off frequency set to %i instead of 6Hz ",envelopCutOffFrequency) consistencyFlag = True if args.consistency else False # --------------------------SUBJECT ------------------------------------ subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS,subjects) # btkAcq builder nacf = nexusFilters.NexusConstructAcquisitionFilter(DATA_PATH,inputFileNoExt,subject) acq = nacf.build() # --------------emg Processing-------------- EMG_LABELS,EMG_MUSCLES,EMG_CONTEXT,NORMAL_ACTIVITIES = manager.getEmgConfiguration() analysis.processEMG_fromBtkAcq(acq, EMG_LABELS, highPassFrequencies=bandPassFilterFrequencies, envelopFrequency=envelopCutOffFrequency) # high pass then low pass for all c3ds openmaTrial = trialTools.convertBtkAcquisition(acq) emgAnalysis = analysis.makeEmgAnalysis(DATA_PATH, [inputFile], EMG_LABELS,openmaTrials = [openmaTrial]) if not consistencyFlag: plot.plotDescriptiveEnvelopEMGpanel(DATA_PATH,emgAnalysis, EMG_LABELS,EMG_MUSCLES,EMG_CONTEXT, NORMAL_ACTIVITIES, normalized=False,exportPdf=True,outputName=inputFile) else: plot.plotConsistencyEnvelopEMGpanel(DATA_PATH,emgAnalysis, EMG_LABELS,EMG_MUSCLES,EMG_CONTEXT, NORMAL_ACTIVITIES, normalized=False,exportPdf=True,outputName=inputFile) else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(args): NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --------------------------GLOBAL SETTINGS ------------------------------------ # global setting ( in user/AppData) if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM1_1-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH, "CGM1_1-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER, "CGM1_1-pyCGM2.settings") # --------------------------CONFIG ------------------------------------ argsManager = CgmArgsManager.argsManager_cgm(settings, args) markerDiameter = argsManager.getMarkerDiameter() pointSuffix = argsManager.getPointSuffix("cgm1_1") momentProjection = argsManager.getMomentProjection() DATA_PATH, reconstructFilenameLabelledNoExt = NEXUS.GetTrialName() reconstructFilenameLabelled = reconstructFilenameLabelledNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("calibration file: " + reconstructFilenameLabelled) # --------------------------SUBJECT ------------------------------------ # Notice : Work with ONE subject by session subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) logging.info("Subject name : " + subject) # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH, subject) # --------------------------CHECKING ----------------------------------- # check model is the CGM1 logging.info("loaded model : %s" % (model.version)) if model.version != "CGM1.1": raise Exception( "%s-pyCGM2.model file was not calibrated from the CGM1.1 calibration pipeline" % model.version) # --------------------------SESSION INFOS ------------------------------------ # translators management translators = files.getTranslators(DATA_PATH, "CGM1_1.translators") if not translators: translators = settings["Translators"] # btkAcq builder nacf = nexusFilters.NexusConstructAcquisitionFilter( DATA_PATH, reconstructFilenameLabelledNoExt, subject) acq = nacf.build() #force plate assignement from Nexus mfpa = nexusTools.getForcePlateAssignment(NEXUS) # --------------------------MODELLING PROCESSING ----------------------- acqGait = cgm1_1.fitting(model, DATA_PATH, reconstructFilenameLabelled, translators, markerDiameter, pointSuffix, mfpa, momentProjection, forceBtkAcq=acq) # ----------------------SAVE------------------------------------------- # Todo: pyCGM2 model : cpickle doesn t work. Incompatibility with Swig. ( see about BTK wrench) # ----------------------DISPLAY ON VICON------------------------------- nexusFilters.NexusModelFilter(NEXUS, model, acqGait, subject, pointSuffix).run() nexusTools.createGeneralEvents(NEXUS, subject, acqGait, ["Left-FP", "Right-FP"]) # ========END of the nexus OPERATION if run from Nexus ========= else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(args): NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --------------------------GLOBAL SETTINGS ------------------------------------ # global setting ( in user/AppData) if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_1-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH, "CGM2_1-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER, "CGM2_1-pyCGM2.settings") settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH, "CGM2_1-pyCGM2.settings") # --------------------------CONFIG ------------------------------------ argsManager = CgmArgsManager.argsManager_cgm(settings, args) leftFlatFoot = argsManager.getLeftFlatFoot() rightFlatFoot = argsManager.getRightFlatFoot() headFlat = argsManager.getHeadFlat() markerDiameter = argsManager.getMarkerDiameter() pointSuffix = argsManager.getPointSuffix("cgm2.1") hjcMethod = settings["Calibration"]["HJC"] lhjc = argsManager.forceHjc("left") rhjc = argsManager.forceHjc("right") if lhjc is not None: hjcMethod["Left"] = lhjc if rhjc is not None: hjcMethod["Right"] = rhjc # --------------------------LOADING ------------------------------------ DATA_PATH, calibrateFilenameLabelledNoExt = NEXUS.GetTrialName() calibrateFilenameLabelled = calibrateFilenameLabelledNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("calibration file: " + calibrateFilenameLabelled) # --------------------------SUBJECT ------------------------------------ # Notice : Work with ONE subject by session subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) Parameters = NEXUS.GetSubjectParamNames(subject) required_mp, optional_mp = nexusUtils.getNexusSubjectMp( NEXUS, subject, resetFlag=args.resetMP) # -------------------------- INFOS ------------------------------------ mpInfo, mpFilename = files.getMpFileContent(DATA_PATH, "mp.pyCGM2", subject) # translators management translators = files.getTranslators(DATA_PATH, "CGM2_1.translators") if not translators: translators = settings["Translators"] # btkAcq builder nacf = nexusFilters.NexusConstructAcquisitionFilter( DATA_PATH, calibrateFilenameLabelledNoExt, subject) acq = nacf.build() # --------------------------MODELLING PROCESSING ----------------------- model, acqStatic = cgm2_1.calibrate(DATA_PATH, calibrateFilenameLabelled, translators, required_mp, optional_mp, leftFlatFoot, rightFlatFoot, headFlat, markerDiameter, hjcMethod, pointSuffix, forceBtkAcq=acq) # ----------------------SAVE------------------------------------------- #pyCGM2.model files.saveModel(model, DATA_PATH, subject) # save mp files.saveMp(mpInfo, model, DATA_PATH, mpFilename) # ----------------------DISPLAY ON VICON------------------------------- nexusUtils.updateNexusSubjectMp(NEXUS, model, subject) nexusFilters.NexusModelFilter(NEXUS, model, acqStatic, subject, pointSuffix, staticProcessing=True).run() # ========END of the nexus OPERATION if run from Nexus ========= else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(): parser = argparse.ArgumentParser(description='CGM1 Calibration') parser.add_argument('-l','--leftFlatFoot', type=int, help='left flat foot option') parser.add_argument('-r','--rightFlatFoot',type=int, help='right flat foot option') parser.add_argument('-hf','--headFlat',type=int, help='head flat option') parser.add_argument('-md','--markerDiameter', type=float, help='marker diameter') parser.add_argument('-ps','--pointSuffix', type=str, help='suffix of model outputs') parser.add_argument('--check', action='store_true', help='force model output suffix' ) parser.add_argument('--resetMP', action='store_true', help='reset optional mass parameters') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --------------------------GLOBAL SETTINGS ------------------------------------ # global setting ( in user/AppData) if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM1-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM1-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM1-pyCGM2.settings") # --------------------------CONFIG ------------------------------------ argsManager = CgmArgsManager.argsManager_cgm1(settings,args) leftFlatFoot = argsManager.getLeftFlatFoot() rightFlatFoot = argsManager.getRightFlatFoot() headFlat = argsManager.getHeadFlat() markerDiameter = argsManager.getMarkerDiameter() pointSuffix = argsManager.getPointSuffix("cgm1") DATA_PATH, calibrateFilenameLabelledNoExt = NEXUS.GetTrialName() calibrateFilenameLabelled = calibrateFilenameLabelledNoExt+".c3d" logging.info( "data Path: "+ DATA_PATH ) logging.info( "calibration file: "+ calibrateFilenameLabelled) # --------------------------SUBJECT ------------------------------------ subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS,subjects) Parameters = NEXUS.GetSubjectParamNames(subject) required_mp,optional_mp = nexusUtils.getNexusSubjectMp(NEXUS,subject,resetFlag=args.resetMP) # -------------------------- INFOS ------------------------------------ mpInfo,mpFilename = files.getMpFileContent(DATA_PATH,"mp.pyCGM2",subject) # translators management translators = files.getTranslators(DATA_PATH,"CGM1.translators") if not translators: translators = settings["Translators"] # btkAcq builder nacf = nexusFilters.NexusConstructAcquisitionFilter(DATA_PATH,calibrateFilenameLabelledNoExt,subject) acq = nacf.build() # --------------------------MODELLING PROCESSING ----------------------- model,acqStatic = cgm1.calibrate(DATA_PATH,calibrateFilenameLabelled,translators, required_mp,optional_mp, leftFlatFoot,rightFlatFoot,headFlat,markerDiameter, pointSuffix,forceBtkAcq=acq) # ----------------------SAVE------------------------------------------- #pyCGM2.model files.saveModel(model,DATA_PATH,subject) # save mp files.saveMp(mpInfo,model,DATA_PATH,mpFilename) # ----------------------DISPLAY ON VICON------------------------------- nexusUtils.updateNexusSubjectMp(NEXUS,model,subject) nexusFilters.NexusModelFilter(NEXUS, model,acqStatic,subject, pointSuffix, staticProcessing=True).run()
def main(): plt.close("all") parser = argparse.ArgumentParser(description='CGM plotMAP') parser.add_argument( '-nd', '--normativeData', type=str, help='normative Data set (Schwartz2008 or Pinzone2014)', default="Schwartz2008") parser.add_argument( '-ndm', '--normativeDataModality', type=str, help= "if Schwartz2008 [VerySlow,SlowFree,Fast,VeryFast] - if Pinzone2014 [CentreOne,CentreTwo]", default="Free") parser.add_argument('-ps', '--pointSuffix', type=str, help='suffix of model outputs') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: #-----------------------SETTINGS--------------------------------------- pointSuffix = args.pointSuffix normativeData = { "Author": args.normativeData, "Modality": args.normativeDataModality } if normativeData["Author"] == "Schwartz2008": chosenModality = normativeData["Modality"] nds = normativeDatasets.Schwartz2008( chosenModality ) # modalites : "Very Slow" ,"Slow", "Free", "Fast", "Very Fast" elif normativeData["Author"] == "Pinzone2014": chosenModality = normativeData["Modality"] nds = normativeDatasets.Pinzone2014( chosenModality) # modalites : "Center One" ,"Center Two" # --------------------------INPUTS ------------------------------------ DATA_PATH, modelledFilenameNoExt = NEXUS.GetTrialName() modelledFilename = modelledFilenameNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("file: " + modelledFilename) # ----- Subject ----- # need subject to find input files subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) logging.info("Subject name : " + subject) # ----- construction of the openMA root instance ----- trialConstructorFilter = nexusFilters.NexusConstructTrialFilter( DATA_PATH, modelledFilenameNoExt, subject) openmaTrial = trialConstructorFilter.build() # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH, subject) modelVersion = model.version # --------------------------PROCESSING -------------------------------- analysisInstance = analysis.makeAnalysis( DATA_PATH, [modelledFilename], None, None, None, pointLabelSuffix=pointSuffix, openmaTrials=[openmaTrial] ) # analysis structure gathering Time-normalized Kinematic and kinetic CGM outputs plot.plot_MAP(DATA_PATH, analysisInstance, nds, exportPdf=True, outputName=modelledFilename, pointLabelSuffix=pointSuffix) else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(): plt.close("all") parser = argparse.ArgumentParser( description='CGM plot Normalized Kinematics') parser.add_argument( '-nd', '--normativeData', type=str, help='normative Data set (Schwartz2008 or Pinzone2014)', default="Schwartz2008") parser.add_argument( '-ndm', '--normativeDataModality', type=str, help= "if Schwartz2008 [VerySlow,SlowFree,Fast,VeryFast] - if Pinzone2014 [CentreOne,CentreTwo]", default="Free") parser.add_argument('-ps', '--pointSuffix', type=str, help='suffix of model outputs') parser.add_argument('-c', '--consistency', action='store_true', help='consistency plots') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: #-----------------------SETTINGS--------------------------------------- normativeData = { "Author": args.normativeData, "Modality": args.normativeDataModality } if normativeData["Author"] == "Schwartz2008": chosenModality = normativeData["Modality"] nds = normativeDatasets.Schwartz2008( chosenModality ) # modalites : "Very Slow" ,"Slow", "Free", "Fast", "Very Fast" elif normativeData["Author"] == "Pinzone2014": chosenModality = normativeData["Modality"] nds = normativeDatasets.Pinzone2014( chosenModality) # modalites : "Center One" ,"Center Two" consistencyFlag = True if args.consistency else False pointSuffix = args.pointSuffix # --------------------------INPUTS ------------------------------------ DATA_PATH, modelledFilenameNoExt = NEXUS.GetTrialName() modelledFilename = modelledFilenameNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("file: " + modelledFilename) # ----- Subject ----- # need subject to find input files subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) logging.info("Subject name : " + subject) # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH, subject) modelVersion = model.version # ----- construction of the openMA root instance ----- trialConstructorFilter = nexusFilters.NexusConstructTrialFilter( DATA_PATH, modelledFilenameNoExt, subject) openmaTrial = trialConstructorFilter.build() # --------------------------PROCESSING -------------------------------- analysisInstance = analysis.makeAnalysis(DATA_PATH, [modelledFilename], pointLabelSuffix=pointSuffix, openmaTrials=[openmaTrial]) if not consistencyFlag: if model.m_bodypart in [ enums.BodyPart.LowerLimb, enums.BodyPart.LowerLimbTrunk, enums.BodyPart.FullBody ]: plot.plot_DescriptiveKinematic(DATA_PATH, analysisInstance, "LowerLimb", nds, pointLabelSuffix=pointSuffix, exportPdf=True, outputName=modelledFilename) #plot_DescriptiveKinematic(DATA_PATH,analysis,bodyPart,normativeDataset,pointLabelSuffix=None,type="Gait",exportPdf=False,outputName=None): if model.m_bodypart in [ enums.BodyPart.LowerLimbTrunk, enums.BodyPart.FullBody ]: plot.plot_DescriptiveKinematic(DATA_PATH, analysisInstance, "Trunk", nds, pointLabelSuffix=pointSuffix, exportPdf=True, outputName=modelledFilename) if model.m_bodypart in [ enums.BodyPart.UpperLimb, enums.BodyPart.FullBody ]: pass # TODO plot upperlimb panel else: if model.m_bodypart in [ enums.BodyPart.LowerLimb, enums.BodyPart.LowerLimbTrunk, enums.BodyPart.FullBody ]: plot.plot_ConsistencyKinematic(DATA_PATH, analysisInstance, "LowerLimb", nds, pointLabelSuffix=pointSuffix, exportPdf=True, outputName=modelledFilename) if model.m_bodypart in [ enums.BodyPart.LowerLimbTrunk, enums.BodyPart.FullBody ]: plot.plot_ConsistencyKinematic(DATA_PATH, analysisInstance, "Trunk", nds, pointLabelSuffix=pointSuffix, exportPdf=True, outputName=modelledFilename) if model.m_bodypart in [ enums.BodyPart.UpperLimb, enums.BodyPart.FullBody ]: pass # TODO plot upperlimb panel else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(args): NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --------------------------GLOBAL SETTINGS ------------------------------------ # global setting ( in user/AppData) if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_2-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM2_2-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM2_2-pyCGM2.settings") # --------------------------CONFIG ------------------------------------ argsManager = CgmArgsManager.argsManager_cgm(settings,args) markerDiameter = argsManager.getMarkerDiameter() pointSuffix = argsManager.getPointSuffix("cgm2.2") momentProjection = argsManager.getMomentProjection() # --------------------------LOADING ------------------------------------ DATA_PATH, reconstructFilenameLabelledNoExt = NEXUS.GetTrialName() reconstructFilenameLabelled = reconstructFilenameLabelledNoExt+".c3d" logging.info( "data Path: "+ DATA_PATH ) logging.info( "calibration file: "+ reconstructFilenameLabelled) # --------------------------SUBJECT ------------------------------------ subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS,subjects) logging.info( "Subject name : " + subject ) # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH,subject) # check model logging.info("loaded model : %s" %(model.version)) if model.version != "CGM2.2": raise Exception ("%s-pyCGM2.model file was not calibrated from the CGM2.2 calibration pipeline"%subject) # --------------------------SESSION INFOS ------------------------------------ translators = files.getTranslators(DATA_PATH,"CGM2_2.translators") if not translators: translators = settings["Translators"] # ikweight ikWeight = files.getIKweightSet(DATA_PATH,"CGM2_2.ikw") if not ikWeight: ikWeight = settings["Fitting"]["Weight"] #force plate assignement from Nexus mfpa = nexusTools.getForcePlateAssignment(NEXUS) nacf = nexusFilters.NexusConstructAcquisitionFilter(DATA_PATH,reconstructFilenameLabelledNoExt,subject) acq = nacf.build() # --------------------------MODELLING PROCESSING ----------------------- acqIK = cgm2_2.fitting(model,DATA_PATH, reconstructFilenameLabelled, translators,settings, markerDiameter, pointSuffix, mfpa, momentProjection, forceBtkAcq=acq) # ----------------------DISPLAY ON VICON------------------------------- nexusFilters.NexusModelFilter(NEXUS,model,acqIK,subject,pointSuffix).run() nexusTools.createGeneralEvents(NEXUS,subject,acqIK,["Left-FP","Right-FP"]) # ========END of the nexus OPERATION if run from Nexus ========= else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(args): NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation DATA_PATH, reconstructedFilenameLabelledNoExt = NEXUS.GetTrialName() reconstructFilenameLabelled = reconstructedFilenameLabelledNoExt+".c3d" logging.info( "data Path: "+ DATA_PATH ) logging.info( "reconstructed file: "+ reconstructFilenameLabelled) # --------------------------SUBJECT ----------------------------------- # Notice : Work with ONE subject by session subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS,subjects) logging.info( "Subject name : " + subject ) # --------------------pyCGM2 MODEL - INIT ------------------------------ model = files.loadModel(DATA_PATH,subject) logging.info("loaded model : %s" %(model.version )) if model.version == "CGM1.0": if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM1-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM1-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM1-pyCGM2.settings") elif model.version == "CGM1.1": if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM1_1-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM1_1-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM1_1-pyCGM2.settings") elif model.version == "CGM2.1": if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_1-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM2_1-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM2_1-pyCGM2.settings") elif model.version == "CGM2.2": if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_2-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM2_2-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM2_2-pyCGM2.settings") elif model.version == "CGM2.3": if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_3-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM2_3-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM2_3-pyCGM2.settings") elif model.version in ["CGM2.4"]: if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_4-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM2_4-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM2_4-pyCGM2.settings") elif model.version in ["CGM2.5"]: if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_5-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH,"CGM2_5-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER,"CGM2_5-pyCGM2.settings") else: raise Exception ("model version not found [contact admin]") # --------------------------SESSION INFOS ------------------------------------ mpInfo,mpFilename = files.getMpFileContent(DATA_PATH,"mp.pyCGM2",subject) # translators management if model.version in ["CGM1.0"]: translators = files.getTranslators(DATA_PATH,"CGM1.translators") elif model.version in ["CGM1.1"]: translators = files.getTranslators(DATA_PATH,"CGM1_1.translators") elif model.version in ["CGM2.1"]: translators = files.getTranslators(DATA_PATH,"CGM2_1.translators") elif model.version in ["CGM2.2"]: translators = files.getTranslators(DATA_PATH,"CGM2_2.translators") elif model.version in ["CGM2.3"]: translators = files.getTranslators(DATA_PATH,"CGM2_3.translators") elif model.version in ["CGM2.4"]: translators = files.getTranslators(DATA_PATH,"CGM2_4.translators") elif model.version in ["CGM2.5"]: translators = files.getTranslators(DATA_PATH,"CGM2_5.translators") if not translators: translators = settings["Translators"] # btkAcq builder nacf = nexusFilters.NexusConstructAcquisitionFilter(DATA_PATH,reconstructedFilenameLabelledNoExt,subject) acq = nacf.build() # --------------------------MODEL PROCESSING---------------------------- model,acqFunc,side = kneeCalibration.calibration2Dof(model, DATA_PATH,reconstructFilenameLabelled,translators, args.side,args.beginFrame,args.endFrame,None,forceBtkAcq=acq) # ----------------------SAVE------------------------------------------- files.saveModel(model,DATA_PATH,subject) logging.warning("model updated with a %s knee calibrated with 2Dof method" %(side)) # save mp files.saveMp(mpInfo,model,DATA_PATH,mpFilename) # ----------------------VICON INTERFACE------------------------------------------- #--- update mp nexusUtils.updateNexusSubjectMp(NEXUS,model,subject) if side == "Left": nexusTools.appendBones(NEXUS,subject,acqFunc,"LFE0", model.getSegment("Left Thigh"),OriginValues = acqFunc.GetPoint("LKJC").GetValues() ) elif side == "Right": nexusTools.appendBones(NEXUS,subject,acqFunc,"RFE0", model.getSegment("Right Thigh"),OriginValues = acqFunc.GetPoint("RKJC").GetValues() ) # --------------------------NEW MOTION FILTER - DISPLAY BONES--------- scp=modelFilters.StaticCalibrationProcedure(model) if model.version in ["CGM1.0","CGM1.1","CGM2.1","CGM2.2"]: modMotion=modelFilters.ModelMotionFilter(scp,acqFunc,model,enums.motionMethod.Determinist) modMotion.compute() elif model.version in ["CGM2.3","CGM2.4"]: proximalSegmentLabel=str(side+" Thigh") distalSegmentLabel=str(side+" Shank") # Motion modMotion=modelFilters.ModelMotionFilter(scp,acqFunc,model,enums.motionMethod.Sodervisk) modMotion.segmentalCompute([proximalSegmentLabel,distalSegmentLabel]) # -- add nexus Bones if side == "Left": nexusTools.appendBones(NEXUS,subject,acqFunc,"LFE1", model.getSegment("Left Thigh"),OriginValues = acqFunc.GetPoint("LKJC").GetValues() ) logging.warning("offset %s" %(str(model.mp_computed["LeftKneeFuncCalibrationOffset"] ))) elif side == "Right": nexusTools.appendBones(NEXUS,subject,acqFunc,"RFE1", model.getSegment("Right Thigh"),OriginValues = acqFunc.GetPoint("RKJC").GetValues() ) logging.warning("offset %s" %(str(model.mp_computed["RightKneeFuncCalibrationOffset"] ))) else: raise Exception("NO Nexus connection. Turn on Nexus")
calibrateFilenameLabelledNoExt = "static" NEXUS.OpenTrial(str(DATA_PATH + calibrateFilenameLabelledNoExt), 30) else: DATA_PATH, calibrateFilenameLabelledNoExt = NEXUS.GetTrialName() calibrateFilenameLabelled = calibrateFilenameLabelledNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("calibration file: " + calibrateFilenameLabelled) # --------------------------SUBJECT ------------------------------------ # Notice : Work with ONE subject by session subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) Parameters = NEXUS.GetSubjectParamNames(subject) required_mp, optional_mp = nexusUtils.getNexusSubjectMp( NEXUS, subject, resetFlag=args.resetMP) # -------------------------- INFOS ------------------------------------ mpInfo, mpFilename = files.getJsonFileContent(DATA_PATH, "mp.pyCGM2", subject) # translators management translators = files.getTranslators(DATA_PATH, "CGM2_1.translators") if not translators: translators = settings["Translators"] # --------------------------MODELLING PROCESSING ----------------------- model, acqStatic = cgm2_1.calibrate(DATA_PATH,
def main(args): NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --------------------------PATH + FILE ------------------------------------ DATA_PATH, reconstructedFilenameLabelledNoExt = NEXUS.GetTrialName() reconstructFilenameLabelled = reconstructedFilenameLabelledNoExt + ".c3d" logging.info("data Path: " + DATA_PATH) logging.info("reconstructed file: " + reconstructFilenameLabelled) # --------------------------SUBJECT ----------------------------------- # Notice : Work with ONE subject by session subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS, subjects) logging.info("Subject name : " + subject) # --------------------pyCGM2 MODEL ------------------------------ model = files.loadModel(DATA_PATH, subject) logging.info("loaded model : %s" % (model.version)) # --------------------------CONFIG ------------------------------------ # --------------------CHECKING ------------------------------ if model.version in ["CGM1.0", "CGM1.1", "CGM2.1", "CGM2.2"]: raise Exception( "Can t use SARA method with your model %s [minimal version : CGM2.3]" % (model.version)) elif model.version == "CGM2.3": if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_3-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH, "CGM2_3-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER, "CGM2_3-pyCGM2.settings") elif model.version in ["CGM2.4"]: if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_4-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH, "CGM2_4-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER, "CGM2_4-pyCGM2.settings") elif model.version in ["CGM2.5"]: if os.path.isfile(pyCGM2.PYCGM2_APPDATA_PATH + "CGM2_5-pyCGM2.settings"): settings = files.openFile(pyCGM2.PYCGM2_APPDATA_PATH, "CGM2_5-pyCGM2.settings") else: settings = files.openFile(pyCGM2.PYCGM2_SETTINGS_FOLDER, "CGM2_5-pyCGM2.settings") else: raise Exception("model version not found [contact admin]") # --------------------------SESSION INFOS ------------------------------------ mpInfo, mpFilename = files.getMpFileContent(DATA_PATH, "mp.pyCGM2", subject) # translators management if model.version in ["CGM2.3"]: translators = files.getTranslators(DATA_PATH, "CGM2-3.translators") elif model.version in ["CGM2.4"]: translators = files.getTranslators(DATA_PATH, "CGM2-4.translators") elif model.version in ["CGM2.5"]: translators = files.getTranslators(DATA_PATH, "CGM2-5.translators") if not translators: translators = settings["Translators"] # btkAcq builder nacf = nexusFilters.NexusConstructAcquisitionFilter( DATA_PATH, reconstructedFilenameLabelledNoExt, subject) acq = nacf.build() # --------------------------MODEL PROCESSING---------------------------- model, acqFunc, side = kneeCalibration.sara( model, DATA_PATH, reconstructFilenameLabelled, translators, args.side, args.beginFrame, args.endFrame, forceBtkAcq=acq) # ----------------------SAVE------------------------------------------- files.saveModel(model, DATA_PATH, subject) logging.warning( "model updated with a %s knee calibrated with SARA method" % (side)) # save mp files.saveMp(mpInfo, model, DATA_PATH, mpFilename) # ----------------------VICON INTERFACE------------------------------------------- #--- update mp nexusUtils.updateNexusSubjectMp(NEXUS, model, subject) # -- add nexus Bones if side == "Left": nexusTools.appendBones( NEXUS, subject, acqFunc, "LFE0", model.getSegment("Left Thigh"), OriginValues=acqFunc.GetPoint("LKJC").GetValues()) elif side == "Right": nexusTools.appendBones( NEXUS, subject, acqFunc, "RFE0", model.getSegment("Right Thigh"), OriginValues=acqFunc.GetPoint("RKJC").GetValues()) proximalSegmentLabel = str(side + " Thigh") distalSegmentLabel = str(side + " Shank") # add modelled markers meanOr_inThigh = model.getSegment(proximalSegmentLabel).getReferential( "TF").getNodeTrajectory("KJC_Sara") meanAxis_inThigh = model.getSegment( proximalSegmentLabel).getReferential("TF").getNodeTrajectory( "KJC_SaraAxis") btkTools.smartAppendPoint(acqFunc, side + "_KJC_Sara", meanOr_inThigh) btkTools.smartAppendPoint(acqFunc, side + "_KJC_SaraAxis", meanAxis_inThigh) nexusTools.appendModelledMarkerFromAcq(NEXUS, subject, side + "_KJC_Sara", acqFunc) nexusTools.appendModelledMarkerFromAcq(NEXUS, subject, side + "_KJC_SaraAxis", acqFunc) #---Second model motion filter # consider new anatomical frame scp = modelFilters.StaticCalibrationProcedure(model) modMotion = modelFilters.ModelMotionFilter( scp, acqFunc, model, enums.motionMethod.Sodervisk) modMotion.segmentalCompute([proximalSegmentLabel, distalSegmentLabel]) # projection of the Sara axis in the transversale plane # -- add nexus Bones if side == "Left": nexusTools.appendBones( NEXUS, subject, acqFunc, "LFE1", model.getSegment("Left Thigh"), OriginValues=acqFunc.GetPoint("LKJC").GetValues()) print model.mp_computed["LeftKneeFuncCalibrationOffset"] logging.warning( "offset %s" % (str(model.mp_computed["LeftKneeFuncCalibrationOffset"]))) elif side == "Right": nexusTools.appendBones( NEXUS, subject, acqFunc, "RFE1", model.getSegment("Right Thigh"), OriginValues=acqFunc.GetPoint("RKJC").GetValues()) logging.warning( "offset %s" % (str(model.mp_computed["RightKneeFuncCalibrationOffset"]))) print model.mp_computed["RightKneeFuncCalibrationOffset"] else: raise Exception("NO Nexus connection. Turn on Nexus")
def main(): parser = argparse.ArgumentParser(description='EMG-plot_temporalEMG') parser.add_argument('-bpf', '--BandpassFrequencies', nargs='+',help='bandpass filter') parser.add_argument('-ecf','--EnvelopLowpassFrequency', type=int, help='cutoff frequency for emg envelops') parser.add_argument('-r','--raw', action='store_true', help='rectified data') args = parser.parse_args() NEXUS = ViconNexus.ViconNexus() NEXUS_PYTHON_CONNECTED = NEXUS.Client.IsConnected() if NEXUS_PYTHON_CONNECTED: # run Operation # --- acquisition file and path---- DATA_PATH, inputFileNoExt = NEXUS.GetTrialName() inputFile = inputFileNoExt+".c3d" #--------------------------settings------------------------------------- if os.path.isfile(DATA_PATH + "emg.settings"): emgSettings = files.openFile(DATA_PATH,"emg.settings") logging.warning("[pyCGM2]: emg.settings detected in the data folder") else: emgSettings = None manager = EmgManager.EmgConfigManager(None,localInternalSettings=emgSettings) manager.contruct() # ----------------------INPUTS------------------------------------------- bandPassFilterFrequencies = manager.BandpassFrequencies#emgSettings["Processing"]["BandpassFrequencies"] if args.BandpassFrequencies is not None: if len(args.BandpassFrequencies) != 2: raise Exception("[pyCGM2] - bad configuration of the bandpass frequencies ... set 2 frequencies only") else: bandPassFilterFrequencies = [float(args.BandpassFrequencies[0]),float(args.BandpassFrequencies[1])] logging.info("Band pass frequency set to %i - %i instead of 20-200Hz",bandPassFilterFrequencies[0],bandPassFilterFrequencies[1]) envelopCutOffFrequency = manager.EnvelopLowpassFrequency#emgSettings["Processing"]["EnvelopLowpassFrequency"] if args.EnvelopLowpassFrequency is not None: envelopCutOffFrequency = args.EnvelopLowpassFrequency logging.info("Cut-off frequency set to %i instead of 6Hz ",envelopCutOffFrequency) rectifyBool = False if args.raw else True # --------------------------SUBJECT ------------------------------------ subjects = NEXUS.GetSubjectNames() subject = nexusTools.checkActivatedSubject(NEXUS,subjects) # btk Acquisition nacf = nexusFilters.NexusConstructAcquisitionFilter(DATA_PATH,inputFileNoExt,subject) acq = nacf.build() # --------------emg Processing-------------- EMG_LABELS,EMG_MUSCLES,EMG_CONTEXT,NORMAL_ACTIVITIES = manager.getEmgConfiguration() analysis.processEMG_fromBtkAcq(acq, EMG_LABELS, highPassFrequencies=bandPassFilterFrequencies, envelopFrequency=envelopCutOffFrequency) # high pass then low pass for all c3ds openmaTrial = trialTools.convertBtkAcquisition(acq) plot.plotTemporalEMG(DATA_PATH,inputFile, EMG_LABELS,EMG_MUSCLES, EMG_CONTEXT, NORMAL_ACTIVITIES,exportPdf=True,rectify=rectifyBool, openmaTrial=openmaTrial) else: raise Exception("NO Nexus connection. Turn on Nexus")