예제 #1
0
"""

if __name__ == '__main__':
    if __package__ is None:
        print('Use -m option to run this library module as a script.')

    import os
    from pathlib import Path
    import psutil
    import time
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_kine.misc.file_utils import pretty_size
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import ViconCsvSubject
    from biplane_kine.misc.json_utils import Params

    config_dir = Path(
        mod_arg_parser('Time database creation', __package__, __file__))

    process = psutil.Process(os.getpid())
    print(pretty_size(process.memory_info().rss))
    params = Params.get_params(config_dir / 'parameters.json')

    start = time.time()
    db = create_db(params.biplane_vicon_db_dir, ViconCsvSubject)
    end = time.time()

    print(end - start)

    print(pretty_size(process.memory_info().rss))
    from pathlib import Path
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_pdf import PdfPages
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubject
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from biplane_kine.graphing.kine_plotters import MarkerClusterAvailPlotter
    from biplane_kine.misc.arg_parser import mod_arg_parser
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(mod_arg_parser('Batch plot availability of torso marker cluster', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    def trial_plotter(trial, marker_names):
        marker_data = np.stack([trial.smoothed[marker_name] for marker_name in marker_names], 0)
        return MarkerClusterAvailPlotter(marker_data, marker_names, trial.vicon_endpts, trial.trial_name)

    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, BiplaneViconSubject)
    marker_names = ['T10', 'T5', 'STRN', 'C7', 'CLAV']
    db['Plotter'] = db['Trial'].apply(trial_plotter, args=[marker_names])
        print('Use -m option to run this library module as a script.')

    from pathlib import Path
    import json
    import shutil
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubject
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_tasks.export.export_threejs_torso_scap_hum import no_static_dir, trial_exporter
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(mod_arg_parser('Export torso, scapula, and humerus kinematics and Vicon marker trajectories '
                                     'for three.js',
                                     __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, BiplaneViconSubject)
    json_export = {}

    # export
    for subject_name, subject_df in db.groupby('Subject_Name'):
        log.info('Outputting torso, scapula, humerus kinematics for subject %s', subject_name)
    import sys
    import distutils.util
    import matplotlib.pyplot as plt
    from biplane_tasks.parameters import smoothing_exceptions_for_marker
    from biplane_kine.database import create_db
    from biplane_kine.database.vicon_accuracy import BiplaneMarkerSubjectEndpts
    from biplane_kine.graphing.vicon_accuracy_plotters import ViconAccuracySmoothingPlotter
    from biplane_kine.smoothing.kf_filtering_helpers import InsufficientDataError, DoNotUseMarkerError
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from biplane_kine.misc.arg_parser import mod_arg_parser
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(mod_arg_parser('Demonstrates the effect of smoothing for a specified trial/marker', __package__,
                                     __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    db = create_db(params.accuracy_db_dir, BiplaneMarkerSubjectEndpts)
    add_c3d_helper(db, params.labeled_c3d_dir, params.filled_c3d_dir)

    # select trial
    trial_row = db.loc[params.trial_name]
    marker_exceptions = smoothing_exceptions_for_marker(params.smoothing_exceptions, params.trial_name,
                                                        params.marker_name)
    from pathlib import Path
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_pdf import PdfPages
    from biokinepy.euler_angles import st_isb, ht_isb
    from biokinepy.trajectory import smooth_trajectory
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubject, trajectories_from_trial
    from biplane_kine.graphing.kine_plotters import RawSmoothSegmentPlotter
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from biplane_kine.misc.arg_parser import mod_arg_parser
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(mod_arg_parser('Batch plot scapula/humerus smoothed kinematics', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    def trial_plotter(trial, dt, num_frames_avg, torso_def):
        torso, scap_raw, hum_raw = trajectories_from_trial(trial, dt, base_cs='vicon', torso_def=torso_def)

        # smooth
        scap_smooth = smooth_trajectory(scap_raw, num_frames_avg)
        hum_smooth = smooth_trajectory(hum_raw, num_frames_avg)

        # express in the first torso frame (I don't want to express in torso because that will add noise)
        scap_raw_torso = scap_raw.in_frame(torso.ht[0])
if __name__ == '__main__':
    if __package__ is None:
        print('Use -m option to run this library module as a script.')

    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import ViconCsvSubject
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from ..parameters import read_smoothing_exceptions
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser('Batch smooth Vicon marker data using Kalman smoothing',
                       __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, ViconCsvSubject)
    init_graphing()
    all_exceptions = read_smoothing_exceptions(params.smoothing_exceptions)

    # create plots
    for subject_name, subject_df in db.groupby('Subject_Name'):
        log.info('Smoothing subject %s', subject_name)
        'ERa90': 'External Rotation at 90° of Abduction',
        'ERaR': 'External Rotation at Rest',
        'WCA': 'Weighted Coronal Plane Abduction',
        'WSA': 'Weighted Scapular Plane Abduction',
        'WFE': 'Weighted Forward Elevation'
    }

    friendly_names_keys = list(friendly_names.keys())

    sorterIndex = dict(
        zip(friendly_names_keys, range(len(friendly_names_keys))))

    # initialize
    config_dir = Path(
        mod_arg_parser(
            'Export torso, scapula, and humerus kinematics for three.js',
            __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, BiplaneViconSubject)
    json_export = {}

    # export
    for subject_name, subject_df in db.groupby('Subject_Name'):
        log.info(
if __name__ == '__main__':
    if __package__ is None:
        print('Use -m option to run this library module as a script.')

    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import ViconCsvSubject
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser(
            'Batch create PDF records of raw (labeled) vs filled Vicon marker data',
            __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, ViconCsvSubject)
    init_graphing()

    # create plots
    for subject_name, subject_df in db.groupby('Subject_Name'):
        log.info('Outputting subject %s', subject_name)
예제 #9
0
    import quaternion
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_kine.graphing.common_graph_utils import init_graphing, make_interactive
    from biokinepy.vec_ops import extended_dot
    from biokinepy.cs import change_cs
    from biplane_kine.kinematics.segments import StaticTorsoSegment
    from biokinepy.absor import compute_trajectory
    from biplane_kine.database import create_db, anthro_db
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubjectV3D
    from biplane_kine.misc.json_utils import Params
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser('Compare Python vs Matlab torso kinematics',
                       __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    root_path = Path(params.output_dir)
    anthro = anthro_db(params.biplane_vicon_db_dir)

    def armpit_thickness(subject_name):
        return anthro.loc[subject_name, 'Armpit_Thickness']

    db = create_db(params.biplane_vicon_db_dir,
                   BiplaneViconSubjectV3D,
    import distutils.util
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import ViconCsvSubject
    from biplane_kine.smoothing.kf_filtering_helpers import InsufficientDataError, DoNotUseMarkerError
    from biplane_tasks.parameters import smoothing_exceptions_for_marker
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from .smooth_marker import marker_plotter
    from biplane_kine.misc.arg_parser import mod_arg_parser
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser(
            'Smooth Vicon marker data using Kalman smoothing and optionally creates a debug '
            'PDF record', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, ViconCsvSubject)

    # select trial
    trial_row = db.loc[params.trial_name]
    sel_trial = trial_row.Trial
    log.info('Filtering trial %s marker %s', params.trial_name,
    from matplotlib.backends.backend_pdf import PdfPages
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubject
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from biplane_kine.graphing.kine_plotters import MarkerClusterFillPlotter
    from biokinepy.filling import fill_gaps_rb
    from biplane_kine.smoothing.kf_filtering_helpers import piecewise_filter_with_exception
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from ..parameters import read_filling_directives, trial_filling_directives
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser('Batch plot filled torso marker cluster', __package__,
                       __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    def trial_plotter(trial, marker_nms, filling_direct_all):
        log.info('Processing trial %s', trial.trial_name)
        markers_to_fill = trial_filling_directives(filling_direct_all,
                                                   trial.trial_name)
        gaps_filled = {}
        filled_data = {}
        sfs_data = {}

        if not markers_to_fill:
    from pathlib import Path
    import pandas as pd
    import numpy as np
    import quaternion
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_kine.database import create_db, anthro_db
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubject
    from biplane_kine.kinematics.joint_cs import torso_cs_isb, torso_cs_v3d
    from biplane_kine.misc.json_utils import Params
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser('Compare torso CS as defined via Visual3D and ISB',
                       __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, BiplaneViconSubject)
    anthro = anthro_db(params.biplane_vicon_db_dir)

    # create a dataframe of just the subjects
    subjects = pd.Series(db['Subject'].unique())
    subject_df = pd.DataFrame({
        'Subject_Name':
    import numpy as np
    import quaternion
    from biplane_kine.database import create_db, anthro_db
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubjectV3D
    from biplane_kine.misc.json_utils import Params
    from biokinepy.filling import fill_gaps_rb
    from biplane_kine.smoothing.kf_filtering_helpers import piecewise_filter_with_exception
    from biplane_kine.kinematics.segments import StaticTorsoSegment
    from biokinepy.absor import compute_trajectory_continuous
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_tasks.parameters import read_filling_directives, trial_filling_directives
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(mod_arg_parser('Export V3D torso kinematics', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    def trial_exporter(trial, marker_names, filling_directives_all, dt, subject_folder):
        log.info('Exporting trial %s', trial.trial_name)
        markers_to_fill = trial_filling_directives(filling_directives_all, trial.trial_name)

        smooth_marker_pos = np.stack([trial.smoothed[marker_name] for marker_name in marker_names], 0)
        sfs_marker_pos = smooth_marker_pos.copy()

        # fill then smooth again
        for (marker_name, fill_from) in markers_to_fill.items():
    from scipy.stats import ttest_rel
    from matplotlib.backends.backend_pdf import PdfPages
    from biplane_tasks.parameters import read_smoothing_exceptions, marker_smoothing_exceptions
    from biplane_kine.database import create_db
    from biplane_kine.database.vicon_accuracy import BiplaneMarkerSubjectEndpts
    from biplane_kine.graphing.vicon_accuracy_plotters import ViconAccuracySmoothingPlotter
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from biplane_kine.smoothing.kf_filtering_helpers import InsufficientDataError, DoNotUseMarkerError
    from biplane_kine.misc.json_utils import Params
    from .smoothing_effect_marker import add_c3d_helper, marker_accuracy_diff
    from biplane_kine.misc.arg_parser import mod_arg_parser
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(mod_arg_parser('Demonstrates the effect of smoothing for all Vicon markers tracked via biplane '
                                     'fluoroscopy', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    all_exceptions = read_smoothing_exceptions(params.smoothing_exceptions)
    db = create_db(params.accuracy_db_dir, BiplaneMarkerSubjectEndpts)
    add_c3d_helper(db, params.labeled_c3d_dir, params.filled_c3d_dir)

    # create summary database
    summary_db = []
    for (subject_name, trial_name, biplane_trial, c3d_trial) in zip(db['Subject_Name'], db['Trial_Name'],
                                                                    db['Biplane_Marker_Trial'], db['C3D_Trial']):
예제 #15
0

if __name__ == '__main__':
    if __package__ is None:
        print('Use -m option to run this library module as a script.')

    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import ViconCsvSubject
    from biplane_kine.misc.json_utils import Params
    from biplane_tasks.parameters import read_smoothing_exceptions
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser('Export smoothed marker data', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, ViconCsvSubject)
    all_exceptions = read_smoothing_exceptions(params.smoothing_exceptions)

    # create plots
    for subject_name, subject_df in db.groupby('Subject_Name'):
        log.info('Smoothing subject %s', subject_name)
        subject_dir = (root_path / subject_name)
예제 #16
0
    from pathlib import Path
    import multiprocessing as mp
    from functools import partial
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import ViconCsvSubject
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from ..parameters import read_smoothing_exceptions
    from .batch_kf_smoothing import trial_plotter

    # initialize
    config_dir = Path(
        mod_arg_parser(
            'Batch smooth Vicon marker data using Kalman smoothing (multi-threaded)',
            __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # ready db
    root_path = Path(params.output_dir)
    db = create_db(params.biplane_vicon_db_dir, ViconCsvSubject)
    init_graphing()
    all_exceptions = read_smoothing_exceptions(params.smoothing_exceptions)

    # create plots
    for subject_name, subject_df in db.groupby('Subject_Name'):
        print('Smoothing subject {}'.format(subject_name))
        subject_dir = (root_path / subject_name)
        subject_dir.mkdir(parents=True, exist_ok=True)
        subject_trial_plotter = partial(trial_plotter,
    if __package__ is None:
        print('Use -m option to run this library module as a script.')

    from pathlib import Path
    import numpy as np
    from biplane_kine.database import create_db
    from biokinepy.mean_smoother import smooth_quat_traj, smooth_pos_traj
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubject
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.misc.arg_parser import mod_arg_parser
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser('Export smoothed scapula and humerus kinematics',
                       __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    def export_to_csv(file_name, frame, pos_data, quat_data):
        header_line = [
            'frame', 'pos_x', 'pos_y', 'pos_z', 'quat_w', 'quat_x', 'quat_y',
            'quat_z'
        ]
        header_line_str = ','.join(header_line)
        np.savetxt(file_name,
                   np.concatenate(
                       (frame[..., np.newaxis], pos_data, quat_data), axis=1),
    import distutils.util
    from typing import Union
    from biplane_kine.database import create_db
    from biplane_kine.graphing.smoothing_plotters import SmoothingOutputPlotter
    from biplane_tasks.parameters import smoothing_exceptions_for_marker
    from biplane_kine.misc.json_utils import Params
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from biplane_kine.database.c3d_helper import C3DSubjectEndpts
    from biplane_kine.smoothing.kf_filtering_helpers import InsufficientDataError, DoNotUseMarkerError
    from .smooth_marker import marker_plotter
    from biplane_kine.misc.arg_parser import mod_arg_parser
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(mod_arg_parser('Smooth Vicon marker data (from C3D file) using Kalman smoothing and optionally '
                                     'creates a PDF record', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    # ready db
    class C3DSubjectEndptsPrePop(C3DSubjectEndpts):
        """Proxy for C3DSubjectEndpts where the labeled_base_dir and filled_base_dir are pre-populated."""
        def __init__(self, subj_dir: Union[str, Path]):
            super().__init__(subj_dir, labeled_base_dir=params.labeled_c3d_dir, filled_base_dir=params.filled_c3d_dir,
                             c3d_trial_cls=C3DTrialEndptsNonHom)


    root_path = Path(params.output_dir)
예제 #19
0
    from biokinepy.filling import fill_gaps_rb
    from biplane_kine.smoothing.kf_filtering_helpers import piecewise_filter_with_exception
    from biplane_kine.kinematics.segments import StaticTorsoSegment
    from biokinepy.cs import ht_inv, change_cs
    from biokinepy.euler_angles import zxy_intrinsic
    from biokinepy.absor import compute_trajectory, compute_trajectory_continuous
    from biplane_kine.graphing.common_graph_utils import init_graphing
    from biplane_kine.graphing.kine_plotters import TorsoTrajComparisonPlotter
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from ..parameters import read_filling_directives, trial_filling_directives
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser('Batch plot torso kinematics', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    def trial_plotter(trial, marker_names, filling_directives_all, dt):
        log.info('Processing trial %s', trial.trial_name)
        markers_to_fill = trial_filling_directives(filling_directives_all,
                                                   trial.trial_name)

        smooth_marker_pos = np.stack(
            [trial.smoothed[marker_name] for marker_name in marker_names], 0)
        prev_filled_marker_pos = np.stack(
            [trial.filled[marker_name] for marker_name in marker_names], 0)
예제 #20
0
    import quaternion
    from biplane_kine.database import create_db
    from biplane_kine.database.biplane_vicon_db import BiplaneViconSubject
    from biplane_kine.misc.json_utils import Params
    from biokinepy.filling import fill_gaps_rb
    from biplane_kine.smoothing.kf_filtering_helpers import piecewise_filter_with_exception
    from biplane_kine.kinematics.segments import StaticTorsoSegment
    from biokinepy.absor import compute_trajectory_continuous
    from biplane_kine.misc.arg_parser import mod_arg_parser
    from biplane_tasks.parameters import read_filling_directives, trial_filling_directives
    import logging
    from logging.config import fileConfig

    # initialize
    config_dir = Path(
        mod_arg_parser('Export ISB torso kinematics', __package__, __file__))
    params = Params.get_params(config_dir / 'parameters.json')

    # logging
    fileConfig(config_dir / 'logging.ini', disable_existing_loggers=False)
    log = logging.getLogger(params.logger_name)

    def trial_exporter(trial, marker_names, filling_directives_all, dt,
                       subject_folder):
        log.info('Exporting trial %s', trial.trial_name)
        markers_to_fill = trial_filling_directives(filling_directives_all,
                                                   trial.trial_name)

        smooth_marker_pos = np.stack(
            [trial.smoothed[marker_name] for marker_name in marker_names], 0)
        sfs_marker_pos = smooth_marker_pos.copy()