public BodyData(MarkersNames m)
 {
     this.m = m;
     Height = 175; // cm
     Mass = 75; //kg
     ShoulderWidth = 400; //mm
 }
 /// <summary>
 /// Constructor sets the markers name in the MarkesName class used for joint localization
 /// </summary>
 /// <param name="labelMarkers">The list of labelmarkets</param>
 /// <param name="markerNames">A reference to the markers names</param>
 /// <param name="bodyPrefix">Any possible prefix of the markersname</param>
 public MarkersPreprocessor(List<Marker> labelMarkers, out MarkersNames markerNames, string bodyPrefix = "")
 {
     this.prefix = bodyPrefix;
     markers = new Dictionary<string, Vector3>();
     //Converting markers
     for (int i = 0; i < labelMarkers.Count; i++)
     {
         markers.Add(labelMarkers[i].Label, labelMarkers[i].Position);
     }
     //Finding the markers aliases
     markerNames  = NameSet(markers.Keys);
     //foreach (var n in markerNames) UnityEngine.Debug.Log(n);
     m = markerNames;
     // adding non existing markers
     markersLastFrame = new Dictionary<string, Vector3>();
     foreach (var mark in m)
     {
         markersLastFrame.Add(mark, Vector3Helper.NaN);
         if (!markers.ContainsKey(mark))
         {
             markers.Add(mark, Vector3Helper.NaN);
         }
     }
     // setting arbitrary hip makres positions
     markersLastFrame[m.bodyBase] = lastSACRUMknown;
     markersLastFrame[m.leftHip] = lastLIASknown;
     markersLastFrame[m.rightHip] = lastRIASknown;
 }
 /// <summary>
 /// Setting up for joint localization
 /// </summary>
 /// <param name="markers">The aliases of the marker names</param>
 public JointLocalization(MarkersNames markers)
 {
     this.m = markers;
     bd = new BodyData(m);
     jcFuncs = new List<Action<Bone>>() {
             (b) => Plevis(b),
             (b) => SpineRoot(b),
             (b) => MidSpine(b),
             (b) => SpineEnd(b),
             (b) => Neck(b),
             (b) => GetHead(b),
             (b) => GetHeadTop(b),
             (b) => GetShoulderLeft(b),
             (b) => GetUpperArmLeft(b),
             (b) => GetLowerArmLeft(b),
             (b) => GetWristLeft(b),
             (b) => GetHandLeft(b),
             (b) => GetIndexLeft(b),
             (b) => GetTrapLeft(b),
             (b) => GetThumbLeft(b),
             (b) => GetShoulderRight(b),
             (b) => GetUpperArmRight(b),
             (b) => GetLowerArmRight(b),
             (b) => GetWristRight(b),
             (b) => GetHandRight(b),
             (b) => GetIndexRight(b),
             (b) => GetTrapRight(b),
             (b) => GetThumbRight(b),
             (b) => UpperLegLeft(b),
             (b) => LowerLegLeft(b),
             (b) => GetAnkleLeft(b),
             (b) => GetFootBaseLeft(b),
             (b) => GetFootLeft(b),
             (b) => UpperLegRight(b),
             (b) => LowerLegRight(b),
             (b) => GetAnkleRight(b),
             (b) => GetFootBaseRight(b),
             (b) => GetFootRight(b),
         };
 }
        /// <summary>
        /// Finds aliases of different markers and replaces the names
        /// </summary>
        /// <param name="markersNames">A collection of the names of the markers</param>
        /// <returns>The set marker names</returns>
        private MarkersNames NameSet(ICollection<string> markersNames)
        {
            MarkersNames m = new MarkersNames();
            #region hip
            var quary = MarkerNames.bodyBaseAKA.FirstOrDefault(n => markersNames.Contains(prefix + n));
            if (quary == null)
            {
                var q2 = MarkerNames.bodyBasebetween.FirstOrDefault(n => markersNames.Contains(prefix + n[0]) && markersNames.Contains(prefix + n[1]));
                if (q2 != null)
                {
                    sacrumBetween = true;
                    sacrumBetweenMarkers = new string[2];
                    sacrumBetweenMarkers[0] = prefix + q2[0];
                    sacrumBetweenMarkers[1] = prefix + q2[1];

                }
            }
            else
            {
                m.bodyBase = prefix + quary;
            }
            SetName(markersNames, MarkerNames.leftHipAKA, ref m.leftHip, prefix);
            SetName(markersNames, MarkerNames.rightHipAKA, ref m.rightHip, prefix);
            #endregion

            #region upperbody
            SetName(markersNames, MarkerNames.spineAKA, ref m.spine, prefix);
            SetName(markersNames, MarkerNames.neckAKA, ref m.neck, prefix);
            SetName(markersNames, MarkerNames.chestAKA, ref m.chest, prefix);
            SetName(markersNames, MarkerNames.leftShoulderAKA, ref m.leftShoulder, prefix);
            SetName(markersNames, MarkerNames.rightShoulderAKA, ref m.rightShoulder, prefix);
            #endregion

            #region head
            quary = MarkerNames.headAKA.FirstOrDefault(n => markersNames.Contains(prefix + n));
            if (quary == null)
            {
                var q2 = MarkerNames.headBetween.FirstOrDefault(n => markersNames.Contains(prefix + n[0]) && markersNames.Contains(prefix + n[1]));
                if (q2 != null)
                {
                    frontHeadBetween = true;
                    frontHeadBetweenMarkers = new string[2];;
                    frontHeadBetweenMarkers[0] = prefix + q2[0];
                    frontHeadBetweenMarkers[1] = prefix + q2[1];
                }
            } else m.head = prefix + quary;

            SetName(markersNames, MarkerNames.leftHeadAKA, ref m.leftHead, prefix);

            SetName(markersNames, MarkerNames.rightHeadAKA, ref m.rightHead, prefix);
            #endregion

            #region legs

            SetName(markersNames, MarkerNames.leftUpperKneeAKA, ref m.leftUpperKnee, prefix);
            SetName(markersNames, MarkerNames.rightUpperKneeAKA, ref m.rightUpperKnee, prefix);
            SetName(markersNames, MarkerNames.leftOuterKneeAKA, ref m.leftOuterKnee, prefix);
            SetName(markersNames, MarkerNames.rightOuterKneeAKA, ref m.rightOuterKnee, prefix);
            SetName(markersNames, MarkerNames.leftInnerKneeAKA, ref m.leftInnerKnee, prefix);
            SetName(markersNames, MarkerNames.rightInnerKneeAKA, ref m.rightInnerKnee, prefix);
            SetName(markersNames, MarkerNames.leftLowerKneeAKA, ref m.leftLowerKnee, prefix);
            SetName(markersNames, MarkerNames.rightLowerKneeAKA, ref m.rightLowerKnee, prefix);
            #endregion

            #region foot
            SetName(markersNames, MarkerNames.leftOuterAnkleAKA, ref m.leftOuterAnkle, prefix);
            SetName(markersNames, MarkerNames.rightOuterAnkleAKA, ref m.rightOuterAnkle, prefix);
            SetName(markersNames, MarkerNames.rightInnerAnkleAKA, ref m.rightInnerAnkle, prefix);
            SetName(markersNames, MarkerNames.leftInnerAnkleAKA, ref m.leftInnerAnkle, prefix);

            SetName(markersNames, MarkerNames.leftHeelAKA, ref m.leftHeel, prefix);
            SetName(markersNames, MarkerNames.rightHeelAKA, ref m.rightHeel, prefix);

            quary = MarkerNames.leftToe2AKA.FirstOrDefault(n => markersNames.Contains(prefix + n));
            if (quary == null)
            {
                quary = MarkerNames.leftToe1AKA.FirstOrDefault(n => markersNames.Contains(prefix + n));
            }
            m.leftToe2 = ((quary == null) ? m.leftToe2 :prefix + quary);

            quary = MarkerNames.rightToe2AKA.FirstOrDefault(n => markersNames.Contains(prefix + n));
            if (quary == null)
            {
                quary = MarkerNames.rightToe1AKA.FirstOrDefault(n => markersNames.Contains(prefix + n));
            }
            m.rightToe2 = ((quary == null) ? m.rightToe2 :prefix + quary);
            #endregion

            #region arms
            SetName(markersNames, MarkerNames.leftElbowAKA, ref m.leftElbow, prefix);
            SetName(markersNames, MarkerNames.rightElbowAKA, ref m.rightElbow, prefix);
            SetName(markersNames, MarkerNames.leftInnerElbowAKA, ref m.leftInnerElbow, prefix);
            SetName(markersNames, MarkerNames.rightInnerElbowAKA, ref m.rightInnerElbow, prefix);
            SetName(markersNames, MarkerNames.leftOuterElbowAKA, ref m.leftOuterElbow, prefix);
            SetName(markersNames, MarkerNames.rightOuterElbowAKA, ref m.rightOuterElbow, prefix);
            SetName(markersNames, MarkerNames.leftWristAKA, ref m.leftWrist, prefix);
            SetName(markersNames, MarkerNames.rightWristAKA, ref m.rightWrist, prefix);
            SetName(markersNames, MarkerNames.leftWristRadiusAKA, ref m.leftWristRadius, prefix);
            SetName(markersNames, MarkerNames.rightWristRadiusAKA, ref m.rightWristRadius, prefix);
            #endregion

            #region hands
            SetName(markersNames, MarkerNames.leftHandAKA, ref m.leftHand, prefix);
            SetName(markersNames, MarkerNames.rightHandAKA, ref m.rightHand, prefix);
            SetName(markersNames, MarkerNames.rightIndexAKA, ref m.rightIndex, prefix);
            SetName(markersNames, MarkerNames.leftIndexAKA, ref m.leftIndex, prefix);
            SetName(markersNames, MarkerNames.rightThumbAKA, ref m.rightThumb, prefix);
            SetName(markersNames, MarkerNames.leftThumbAKA, ref m.leftThumb, prefix);
            #endregion
            return m;
        }