Diff of /RBDSpipelineV3D.v3s [000000] .. [dea202]

Switch to side-by-side view

--- a
+++ b/RBDSpipelineV3D.v3s
@@ -0,0 +1,622 @@
+! This sample v3s pipeline file examplifies how to analyze data from RBDS study for one subject
+! The model mdh file and the c3d files have to be located in the same directory.
+
+File_New
+;
+
+! Choosing the file directory
+Set_Pipeline_Parameter_To_Folder_Path
+/PARAMETER_NAME=FOLDER
+/PARAMETER_VALUE=
+! /PARAMETER_VALUE_SEARCH_FOR=
+! /PARAMETER_VALUE_REPLACE_WITH=
+! /PARAMETER_VALUE_APPEND=
+;
+
+Create_Hybrid_Model
+/CALIBRATION_FILE=::FOLDER&RBDS001static.c3d
+! /RANGE=ALL_FRAMES
+;
+
+Apply_Model_Template
+/MODEL_TEMPLATE=::FOLDER&RBDSmodelV3D.mdh
+/CALIBRATION_FILE=::FOLDER&RBDS001static.c3d
+;
+
+Set_Subject_Mass
+/CALIBRATION_FILE=::FOLDER&RBDS001static.c3d
+/WEIGHT=62
+;
+
+Set_Subject_Height
+/CALIBRATION_FILE=::FOLDER&RBDS001static.c3d
+/HEIGHT=181
+;
+
+! Update the model
+Build_Model
+/CALIBRATION_FILE=::FOLDER&RBDS001static.c3d
+! /REBUILD_ALL_MODELS=FALSE 
+;
+
+File_Open
+/FILE_NAME=::FOLDER&RBDS001runT*.c3d
+;
+
+Assign_Model_File
+/CALIBRATION_FILE=::FOLDER&RBDS001static.c3d
+/MOTION_FILE_NAMES=::FOLDER&RBDS001runT*.c3d
+! /REMOVE_EXISTING_ASSIGNMENTS=FALSE
+;
+
+Assign_Tags_To_Files
+/MOTION_FILE_NAMES=::FOLDER&RBDS001runT25.c3d
+/TAGS=RUN25
+;
+
+Assign_Tags_To_Files
+/MOTION_FILE_NAMES=::FOLDER&RBDS001runT35.c3d
+/TAGS=RUN35
+;
+
+Assign_Tags_To_Files
+/MOTION_FILE_NAMES=::FOLDER&RBDS001runT45.c3d
+/TAGS=RUN45
+;
+
+Event_Delete
+/EVENT_NAME=LHS+LON+LOFF+LTO+RON+RHS+ROFF+RTO
+! /EVENT_SEQUENCE=
+! /EXCLUDE_EVENTS=
+! /TIME=
+;
+
+Interpolate
+/SIGNAL_TYPES=TARGET
+! /SIGNAL_NAMES=
+! /SIGNAL_FOLDER=ORIGINAL
+! /RESULT_SUFFIX=
+! /RESULT_FOLDER=PROCESSED
+/MAXIMUM_GAP=20
+! /NUM_FIT=3
+! /POLYNOMIAL_ORDER=3
+;
+
+Lowpass_Filter
+/SIGNAL_TYPES=ANALOG
+! /SIGNAL_NAMES=
+/SIGNAL_FOLDER=ORIGINAL
+! /RESULT_SUFFIX=
+/RESULT_FOLDER=PROCESSED
+! /FILTER_CLASS=BUTTERWORTH
+/FREQUENCY_CUTOFF=10
+! /NUM_REFLECTED=0
+! /TOTAL_BUFFER_SIZE=0
+! /NUM_BIDIRECTIONAL_PASSES=1
+;
+
+Set_Force_Platform_Threshold
+/THRESHOLD=20
+! /SET_AS_DEFAULT=FALSE
+;
+
+Set_Use_Processed_Analog
+/USE_PROCESSED=TRUE
+;
+
+Lowpass_Filter
+/SIGNAL_TYPES=TARGET
+! /SIGNAL_NAMES=
+/SIGNAL_FOLDER=PROCESSED
+! /RESULT_SUFFIX=
+/RESULT_FOLDER=PROCESSED
+! /FILTER_CLASS=BUTTERWORTH
+/FREQUENCY_CUTOFF=10
+! /NUM_REFLECTED=6
+! /TOTAL_BUFFER_SIZE=6
+! /NUM_BIDIRECTIONAL_PASSES=1
+;
+
+Recalc
+;
+
+Automatic_Gait_Events
+! /SELECT_X=FALSE
+! /SELECT_Y=FALSE
+/SELECT_Z=TRUE
+! /FRAME_WINDOW=8
+/USE_TPR=TRUE
+;
+
+! Calculate Angular Kinematics
+Compute_Model_Based_Data
+/RESULT_NAME=R Hip Angle
+/FUNCTION=JOINT_ANGLE
+/SEGMENT=RTH
+/REFERENCE_SEGMENT=RPV
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+! /NORMALIZATION=FALSE
+! /NORMALIZATION_METHOD=FALSE
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=L Hip Angle
+/FUNCTION=JOINT_ANGLE
+/SEGMENT=LTH
+/REFERENCE_SEGMENT=RPV
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+! /NORMALIZATION=FALSE
+! /NORMALIZATION_METHOD=FALSE
+! /NORMALIZATION_METRIC=
+/NEGATEX=TRUE
+/NEGATEY=TRUE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=R Knee Angle
+/FUNCTION=JOINT_ANGLE
+/SEGMENT=RSK
+/REFERENCE_SEGMENT=RTH
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+! /NORMALIZATION=FALSE
+! /NORMALIZATION_METHOD=FALSE
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+/NEGATEZ=TRUE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=L Knee Angle
+/FUNCTION=JOINT_ANGLE
+/SEGMENT=LSK
+/REFERENCE_SEGMENT=LTH
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+! /NORMALIZATION=FALSE
+! /NORMALIZATION_METHOD=FALSE
+! /NORMALIZATION_METRIC=
+/NEGATEX=TRUE
+/NEGATEY=TRUE
+/NEGATEZ=TRUE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Right Ankle Angle
+/FUNCTION=JOINT_ANGLE
+/SEGMENT=Right Virtual Foot
+/REFERENCE_SEGMENT=RSK
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+! /NORMALIZATION=FALSE
+! /NORMALIZATION_METHOD=FALSE
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+! To measure INV/EV of the ankle
+Compute_Model_Based_Data
+/RESULT_NAME=Right Ankle Angle 2
+/FUNCTION=JOINT_ANGLE
+/SEGMENT=Right Foot InvEv
+/REFERENCE_SEGMENT=RSK
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+! /NORMALIZATION=FALSE
+! /NORMALIZATION_METHOD=FALSE
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Left Ankle Angle
+/FUNCTION=JOINT_ANGLE
+/SEGMENT=Left Virtual Foot
+/REFERENCE_SEGMENT=LSK
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+! /NORMALIZATION=FALSE
+! /NORMALIZATION_METHOD=FALSE
+! /NORMALIZATION_METRIC=
+/NEGATEX=TRUE
+/NEGATEY=TRUE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+! To measure INV/EV of the ankle
+Compute_Model_Based_Data
+/RESULT_NAME=Left Ankle Angle 2
+/FUNCTION=JOINT_ANGLE
+/SEGMENT=left Foot InvEv
+/REFERENCE_SEGMENT=LSK
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+! /NORMALIZATION=FALSE
+! /NORMALIZATION_METHOD=FALSE
+! /NORMALIZATION_METRIC=
+/NEGATEX=TRUE
+/NEGATEY=TRUE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=RGRF
+/FUNCTION=GRF_DATA
+/SEGMENT=RFT
+/REFERENCE_SEGMENT=
+! /RESOLUTION_COORDINATE_SYSTEM=LAB
+! /USE_CARDAN_SEQUENCE=FALSE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=NORMALIZE_TO_LOCAL_METRIC
+/NORMALIZATION_METRIC=MASS
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+/NEGATEZ=TRUE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=LGRF
+/FUNCTION=GRF_DATA
+/SEGMENT=LFT
+/REFERENCE_SEGMENT=
+! /RESOLUTION_COORDINATE_SYSTEM=LAB
+! /USE_CARDAN_SEQUENCE=FALSE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=NORMALIZE_TO_LOCAL_METRIC
+/NORMALIZATION_METRIC=MASS
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Right Hip Moment
+/FUNCTION=JOINT_MOMENT
+/SEGMENT=RTH
+/REFERENCE_SEGMENT=RPV
+/RESOLUTION_COORDINATE_SYSTEM=RPV
+/USE_CARDAN_SEQUENCE=TRUE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+/NEGATEX=TRUE
+/NEGATEY=TRUE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Left Hip Moment
+/FUNCTION=JOINT_MOMENT
+/SEGMENT=LTH
+/REFERENCE_SEGMENT=RPV
+/RESOLUTION_COORDINATE_SYSTEM=RPV
+/USE_CARDAN_SEQUENCE=TRUE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Right Knee Moment
+/FUNCTION=JOINT_MOMENT
+/SEGMENT=RSK
+/REFERENCE_SEGMENT=RTH
+/RESOLUTION_COORDINATE_SYSTEM=RTH
+/USE_CARDAN_SEQUENCE=TRUE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+/NEGATEX=TRUE
+/NEGATEY=TRUE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Left Knee Moment
+/FUNCTION=JOINT_MOMENT
+/SEGMENT=LSK
+/REFERENCE_SEGMENT=LTH
+/RESOLUTION_COORDINATE_SYSTEM=LTH
+/USE_CARDAN_SEQUENCE=TRUE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Right Ankle Moment
+/FUNCTION=JOINT_MOMENT
+/SEGMENT=RFT
+/REFERENCE_SEGMENT=RSK
+/RESOLUTION_COORDINATE_SYSTEM=RSK
+/USE_CARDAN_SEQUENCE=TRUE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+/NEGATEX=TRUE
+/NEGATEY=TRUE
+/NEGATEZ=TRUE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+! /TREADMILL_DATA=FALSE 
+! /TREADMILL_DIRECTION=UNIT_VECTOR(0,1,0)
+! /TREADMILL_SPEEED=
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Left Ankle Moment
+/FUNCTION=JOINT_MOMENT
+/SEGMENT=LFT
+/REFERENCE_SEGMENT=LSK
+/RESOLUTION_COORDINATE_SYSTEM=LSK
+/USE_CARDAN_SEQUENCE=TRUE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+/NEGATEZ=TRUE
+/AXIS1=Z
+/AXIS2=X
+/AXIS3=Y
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Right Ankle Power
+/FUNCTION=JOINT_POWER_SCALAR
+/SEGMENT=RFT
+/REFERENCE_SEGMENT=
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+! /AXIS1=X
+! /AXIS2=Y
+! /AXIS3=Z
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Right Knee Power
+/FUNCTION=JOINT_POWER_SCALAR
+/SEGMENT=RSK
+/REFERENCE_SEGMENT=
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+! /AXIS1=X
+! /AXIS2=Y
+! /AXIS3=Z
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Right Hip Power
+/FUNCTION=JOINT_POWER_SCALAR
+/SEGMENT=RTH
+/REFERENCE_SEGMENT=
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+! /AXIS1=X
+! /AXIS2=Y
+! /AXIS3=Z
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Left Ankle Power
+/FUNCTION=JOINT_POWER_SCALAR
+/SEGMENT=LFT
+/REFERENCE_SEGMENT=
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+! /AXIS1=X
+! /AXIS2=Y
+! /AXIS3=Z
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Left Knee Power
+/FUNCTION=JOINT_POWER_SCALAR
+/SEGMENT=LSK
+/REFERENCE_SEGMENT=
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+! /AXIS1=X
+! /AXIS2=Y
+! /AXIS3=Z
+;
+
+Compute_Model_Based_Data
+/RESULT_NAME=Left Hip Power
+/FUNCTION=JOINT_POWER_SCALAR
+/SEGMENT=LTH
+/REFERENCE_SEGMENT=
+/RESOLUTION_COORDINATE_SYSTEM=
+! /USE_CARDAN_SEQUENCE=FALSE
+/NORMALIZATION=TRUE
+/NORMALIZATION_METHOD=DEFAULT_NORMALIZATION
+! /NORMALIZATION_METRIC=
+! /NEGATEX=FALSE
+! /NEGATEY=FALSE
+! /NEGATEZ=FALSE
+! /AXIS1=X
+! /AXIS2=Y
+! /AXIS3=Z
+;
+
+For_Each
+/Iteration_Parameter_Name=TAG_NAMES
+/Items=RUN25+RUN35+RUN45
+;
+
+Select_Active_File
+/FILE_NAME=::TAG_NAMES
+;
+
+Metric_Compute_Temporal_Distance
+/GLOBAL_RESULT_METRIC_FOLDER=GLOBAL_RESULT_METRIC_FOLDER_&::TAG_NAMES
+! /CALCULATE_PER_FILE=FALSE
+! /CALCULATE_PER_ALL_CMO_GLOBALS=FALSE
+! /CREATE_ALL_INSTANCES=FALSE
+! /RIGHT_FOOT_LOCATION=KINETIC_KINEMATIC::RFT::ProxEndPos
+! /LEFT_FOOT_LOCATION=KINETIC_KINEMATIC::LFT::ProxEndPos
+! /HEIGHT=METRIC::PROCESSED::HEIGHT
+/RHS_EVENT=RON
+/LHS_EVENT=LON
+/RTO_EVENT=ROFF
+/LTO_EVENT=LOFF
+/STRICT_EVENT_SEQUENCE_VALIDATION=TRUE
+! /INCLUDE_EVENTS=
+! /EXCLUDE_EVENTS=
+! /EVENT_INSTANCE=0
+! /COMPUTE_SPEED=TRUE
+! /COMPUTE_STATURES_PER_SECOND=TRUE
+! /COMPUTE_STRIDE_WIDTH=TRUE
+! /COMPUTE_STRIDE_LENGTH=TRUE
+! /COMPUTE_CYCLE_TIME=TRUE
+! /COMPUTE_STEP_LENGTH=TRUE
+! /COMPUTE_STEP_TIME=TRUE
+! /COMPUTE_STANCE_TIME=TRUE
+! /COMPUTE_SWING_TIME=TRUE
+! /COMPUTE_STEPS_PER_MINUTE=TRUE
+! /COMPUTE_STRIDES_PER_MINUTE=TRUE
+! /COMPUTE_DOUBLE_LIMB_SUPPORT_TIME=FALSE
+! /COMPUTE_RIGHT_INITIAL_DOUBLE_LIMB_SUPPORT_TIME=FALSE
+! /COMPUTE_RIGHT_TERMINAL_DOUBLE_LIMB_SUPPORT_TIME=TRUE
+/TREADMILL_SPEED=2.5
+! /LEFT_TREADMILL_SPEED=
+/TREADMILL_DIRECTION=UNIT_VECTOR(1,0,0)
+;
+
+End_For_Each
+/Iteration_Parameter_Name=TAG_NAMES
+;
+
+File_Save_As
+/FILE_NAME=::FOLDER&RBDS001.cmo
+;
+
+Exit_Workspace
+;
\ No newline at end of file