private Trajectory readTrajectory(string inputFileName, out GaitFile file)
        {
            var input      = (EinputMode)Enum.Parse(typeof(EinputMode), ConfigurationManager.AppSettings["inputMode"], true);
            var projection = (EprojectionMode)Enum.Parse(typeof(EprojectionMode), ConfigurationManager.AppSettings["projectionMode"], true);

            file = new GaitFile();
            Trajectory trajectory = new Trajectory();
            Frame      fr;

            file.ReadFile(inputFileName);
            trajectory.points = new List <Point>();
            long frameNum = -1;

            while ((fr = file.GetNextFrame(frameNum)) != null)
            {
                trajectory.add(fr);
                frameNum = fr.FrameNumber;
            }
            if (projection == EprojectionMode.ground)
            {
                trajectory.rotateTrajectory();
            }
            trajectory.samplingRate = (input == EinputMode.wii) ? 100 : 30;
            return(trajectory);
        }
        private void RecordTimes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            detailsTable.Clear();
            timeLine.Points.Clear();
            trajectory.points.Clear();
            frames.Clear();
            if (e.AddedItems.Count == 0)
            {
                return;
            }
            string filename = ((AnalysisFile)e.AddedItems[0]).FullName;
            var    metrics  = Metrics.load(filename);

            foreach (Metric m in metrics)
            {
                var row = detailsTable.NewRow();
                row["Metric"]        = m.name;
                row["Value"]         = m.value.ToString(m.formatting);
                row["Typical Range"] = String.Format("{0} - {1}", m.lowerTypicalRange.ToString(m.formatting), m.higherTypicalRange.ToString(m.formatting));
                row["Preference"]    = Enum.GetName(typeof(Epreference), m.preferedRange);
                row["Description"]   = m.description;
                bool inRange = false;
                switch (m.preferedRange)
                {
                case Epreference.noPreference: inRange = true; break;

                case Epreference.higherIsBetter: if (m.value >= m.lowerTypicalRange)
                    {
                        inRange = true;
                    }
                    break;

                case Epreference.lowerIsBetter: if (m.value <= m.higherTypicalRange)
                    {
                        inRange = true;
                    }
                    break;

                case Epreference.inRange: if (m.value <= m.higherTypicalRange && m.value >= m.lowerTypicalRange)
                    {
                        inRange = true;
                    }
                    break;
                }
                row["In Range"] = inRange;
                detailsTable.Rows.Add(row);
            }

            string prefix = System.IO.Path.GetFileName(filename);

            if (!Tools.parseFileName(prefix, out string identifier, out string exercise, out DateTime dt))
            {
                return;
            }
            var fileName = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(filename), identifier) + "_" + dt.ToString(Tools.dateFormat) + "_" + exercise + "_kinect.xml";

            gaitFile = new GaitFile();
            gaitFile.ReadFile(fileName);
            long  frameNum = -1;
            Frame fr;

            while ((fr = gaitFile.GetNextFrame(frameNum)) != null)
            {
                if (trajectory.add(fr))
                {
                    frames.Add(fr);
                }
                frameNum = fr.FrameNumber;
            }
            trajectory.samplingRate = 30;
            if (applyLowPassFilterToTimeDomain)
            {
                trajectory.filter();
            }

            var analyzer       = Exercises.GetAnalyzer(exercise);
            var segments       = analyzer.segmentTrajectory(trajectory);
            int segmentCounter = 0;

            foreach (var segment in segments)
            {
                segmentCounter++;
                var name = Enum.GetName(typeof(Analyzer.ESegmentType), segment.Item2);
                var str  = String.Format("{0}) {1}", segmentCounter, name);
                foreach (var p in segment.Item1.points)
                {
                    frameToSegmentName[p.timeStamp] = str;
                }
            }



            frameSelector.Maximum       = trajectory.points.Count - 1;
            frameSelector.Value         = 0;
            frameSelector.TickFrequency = 300; // ten seconds
            DrawTimeDomainGraph();
        }