====== Mathematical Operators ======
The [[visual3d:documentation:pipeline:expressions:expressions_overview|Evaluate_Expression]] command can be used to evaluate arbitrary mathematical expressions. Use the following characters for your mathematical operators.
**Arithmetic Operators**
* [[#Plus|Plus ]]
* [[#Minus|Minus]]
* [[#Multiply|Multiply]]
* [[#Divide|Divide]]
* [[#Power|Power]]
**Boolean Operators**
* [[#Logical_Or|Logical OR]]
* [[#Logical_And|Logical AND]]
* [[#Using_the_Adjective_NOT|The Adjective NOT]]
**Comparison Operators**
* [[#Equals|Equals]]
* [[#Not_Equals|Not Equals]]
* [[#Less_Than|Less Than]]
* [[#Less_Than_Or_Equals|Less Than Or Equals]]
* [[#Greater_Than|Greater Than]]
* [[#Greater_Than_Or_Equals|Greater Than Or Equals]]
Note: Visual3D parses the mathematical operators before it parses the signal names. If you have a signal name that contains a mathematical operator (e.g. R-Foot1), Visual3D will probably not be able to parse the equation expression properly.
===== Arithmetic Operators =====
Arithmetic operations can generally be performed using syntax that is similar to that found in a variety of programming and scripting languages.
==== Plus ====
Addition is accomplished using the + character. An alternative syntax is **add(a,b)** where a and b are expressions that evaluate to numbers.
NOTE: Pipeline command parameters use the + character as a delimiter. If the user wants to use an expression containing a + in a command parameter that allows multiple signals, then Visual3D will likely interpret this plus sign incorrectly. In this case the **add(a,b)** syntax should be used.
2 + 3 = 5
add(2,3) = 5
==== Minus ====
Subtraction is accomplished using the - character.
3 - 2 = 1
==== Multiply ====
Multiplication is accomplished using the * character.
3 * 2 = 6
==== Divide ====
Division is accomplished using the / character.
6 / 3 = 2
==== Power ====
Exponentiation is accomplished using the ^ character.
2^3 = 8
===== Boolean Operators =====
Boolean operators deal with boolean values, such as TRUE and FALSE. These are represented numerically as 1 (TRUE) and 0 (FALSE).
==== Logical OR ====
The Logical OR operator is signified by the | character. It takes two boolean values as input and returns TRUE if either of the input values is TRUE.
FALSE | FALSE = FALSE
FALSE | TRUE = TRUE
TRUE | FALSE = TRUE
TRUE | TRUE = FALSE
==== Logical AND ====
The Logical AND operator is signified by the & character. It takes two boolean values as input and returns TRUE when both input values are TRUE.
FALSE | FALSE = FALSE
FALSE | TRUE = FALSE
TRUE | FALSE = FALSE
TRUE | TRUE = FALSE
==== The Adjective NOT ====
The logical adjective NOT can be used with both the logical AND and logical OR operators. It takes one boolean value as input and negates that boolean value.
NOT(FALSE) = TRUE
NOT(TRUE) = FALSE
===Example===
Given a workspace containing 3 trials (*trial1.c3d, *trial2.c3d, and *trial3.c3d).
* All trials are assigned a TAG labeled WALK
* trial1.c3d is also assigned a TAG labeled BAD
Select_Active_File
/FILE_NAME=WALK
/QUERY=BAD
;
This command results in *trial1.c3d being active
Select_Active_File
/FILE_NAME=WALK
/QUERY=NOT(BAD)
;
This command results in *trial2.c3d and *trial3.c3d being active.
===== Comparison Operators =====
Comparison operators take two inputs of the same type and return a boolean value.
==== Equals ====
Equality is tested using either = or ==. It returns TRUE if the two inputs have the same value and FALSE if they do not.
===Example===
Consider a model metric that is defined as a string and compare it to an explicitly defined string.
Set_Model_Metric
! /CALIBRATION_FILE=
/METRIC_NAME=TEST
/METRIC_VALUE="TTT"
;
Evaluate_Expression**
/EXPRESSION=MODEL::METRIC::TEST="TTT"
/RESULT_NAME=SCOTT
/RESULT_TYPE=METRIC
! /RESULT_FOLDER=PROCESSED
;
The text strings are equal, so the resulting signal contains a 1 (indicating TRUE).
==== Not Equals ====
Non-equality is tested using either <> or ><. Its behaviour is opposite that of equality.
If (a==b) is TRUE then (a<>b) is FALSE. Similarly, if (a==b) is FALSE, then (a<>b) is TRUE.
==== Less Than ====
We can test is one value is less than another using the < character.
===Example===
Given two signals TARGET::ORIGINAL::RFT1 and TARGET::ORIGINAL::LFT1, use the Boolean operator < to identify when the Z component of RFT1 is less than the Z component of LFT1.
Evaluate_Expression
/EXPRESSION= TARGET::ORIGINAL::RFT1::Z < TARGET::ORIGINAL::LFT1::Z
/RESULT_NAME=RFT1_GREATER
/RESULT_TYPE=DERIVED
/RESULT_FOLDER=PROCESSED
;
The output signal will be 1 when RFT1::Z is less than LFT1::Z and 0 otherwise
===Example - Foot Clearance===
Heel and toe clearance are defined by two paths. It is possible to model "foot clearance" as the lower value of the heel and toe clearance values at each frame.
{{:heel_toe_clearance.jpg}}
Here is a simplified test of this. First, make the Global Workspace Active. Then, create 2 toy signals and calculate a third signal containing the lower value of the two toy signals.
Evaluate_Expression
/EXPRESSION=LIST(1,2,3,4,5)
! /SIGNAL_TYPES=
! /SIGNAL_FOLDER=ORIGINAL
! /SIGNAL_NAMES=
! /SIGNAL_COMPONENTS=
/RESULT_TYPES=DERIVED
/RESULT_FOLDERS=PROCESSED
/RESULT_NAME=SIGNAL1
! /APPLY_AS_SUFFIX_TO_SIGNAL_NAME=FALSE
;
Evaluate_Expression
/EXPRESSION=LIST(5,4,3,2,1)
! /SIGNAL_TYPES=
! /SIGNAL_FOLDER=ORIGINAL
! /SIGNAL_NAMES=
! /SIGNAL_COMPONENTS=
/RESULT_TYPES=DERIVED
/RESULT_FOLDERS=PROCESSED
/RESULT_NAME=SIGNAL2
! /APPLY_AS_SUFFIX_TO_SIGNAL_NAME=FALSE
;
!create a new signal that is the lower value of the two signals
Evaluate_Expression
/EXPRESSION=(DERIVED::PROCESSED::SIGNAL1<=DERIVED::PROCESSED::SIGNAL2)*DERIVED::PROCESSED::SIGNAL1
+(DERIVED::PROCESSED::SIGNAL2
{{:heel_toe_clearance2.jpg}}
==== Less Than Or Equals ====
This boolean operator uses one of the following syntaxes: <= or =<.
The expression (a <= b) is equivalent logically to ((a < b) | (a == b)).
===Example===
Given two signals TARGET::ORIGINAL::RFT1 and TARGET::ORIGINAL::LFT1, use the Boolean operator <= or the boolean operative =< to identify when the Z component of RFT1 is less than or equal to the Z component of LFT1.
Evaluate_Expression
/EXPRESSION= TARGET::ORIGINAL::RFT1::Z <= TARGET::ORIGINAL::LFT1::Z
/RESULT_NAME=RFT1_GREATER
/RESULT_TYPE=DERIVED
/RESULT_FOLDER=PROCESSED
;
The output signal will be 1 (indicating TRUE) when RFT1::Z is less than or equal to LFT1::Z and 0 (indicating FALSE) otherwise.
==== Greater Than ====
We can test is one value is less than another using the > character.
===Example===
Given two signals TARGET::ORIGINAL::RFT1 and TARGET::ORIGINAL::LFT1, use the Boolean operator > to identify when the Y component of RFT1 is greater than the Y component of LFT1.
Evaluate_Expression
/EXPRESSION= TARGET::ORIGINAL::RFT1::Y > TARGET::ORIGINAL::LFT1::Y
/RESULT_NAME=RFT1_GREATER
/RESULT_TYPE=DERIVED
/RESULT_FOLDER=PROCESSED
;
The output signal will be 1 (indicating TRUE) when RFT1::Y is greater than LFT1::Y and 0 (indicating FALSE) otherwise.
==== Greater Than Or Equals ====
This boolean operator uses one of the following syntaxes: >= or =>.
The expression (a >= b) is equivalent logically to ((a > b) | (a == b)).