private static bool WriteLineLog(ref HelixSoloSensor sensor, HelixImage image, string resultFolder)
        {
            List <string> logLines = new List <string>();

            logLines.AddRange(new string[] { $"{sensor.SerialNumber}\t{sensor.PartNumber}\t{sensor.Date}", image.Name,
                                             "CG_Row\tCG_Col\tWidth\tPeak_Intensity\tFocus_Score" });
            if (image.CGs.Count > 0)
            {
                foreach (CGInfo cg in image.CGs)
                {
                    logLines.Add(cg.ToString());
                }
                logLines.AddRange(new string[] {
                    $"\nCG Count:\t{image.CGs.Count}\n",
                    $"CG Avg:\t{image.CgAverages.Item2}",
                    $"CG Avg Left:\t{image.CgAverages.Item1}",
                    $"CG Avg Right:\t{image.CgAverages.Item3}\n",
                    $"Width Avg:\t{image.WidthAverages.Item2}",
                    $"Width Avg Left:\t{image.WidthAverages.Item1}",
                    $"Width Avg Right:\t{image.WidthAverages.Item3}\n",
                    $"Line Angle Degrees:\t{image.LineAngle}\n",
                    $"Line Focus Score:\t{image.FocusScore}"
                });
            }
            else
            {
                logLines.Add("\nNo laser line found");
            }

            string path = Path.Join(resultFolder, $"{Path.GetFileNameWithoutExtension(image.Name)}.txt");

            File.WriteAllLines(path, logLines);
            return(true);
        }
        static public HelixSoloSensor SingleSoloAccuracyFromLog(HelixSoloSensor sensor, bool first = false)
        {
            List <string[]> resultSplit = GetResultsLogSplit();

            foreach (string[] lineSplit in resultSplit)
            {
                if (lineSplit[0] == sensor.SerialNumber)
                {
                    if (lineSplit.Length < 190)
                    {
                        continue;
                    }
                    //Check "Test Accuracy Status" and "0 Deg. 2 RMS error"
                    if ((lineSplit[187] == "Finished") & float.TryParse(lineSplit[45], out float rms2))
                    {
                        if (rms2 ! < 0)
                        {
                            continue;
                        }
                        if (sensor.AccuracyResult.UpdateFromLog(lineSplit))
                        {
                            if (first)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            return(sensor);
        }
 static public HelixSoloSensor AllSoloDataSingle(HelixSoloSensor sensor)
 {
     if (sensor.SerialNumber != "")
     {
         return(SingleSoloAccuracyFromLog(
                    SingleSensorSoloFocus(
                        SingleSensorSoloLaser(sensor
                                              ))));
     }
     else
     {
         return(sensor);
     }
 }
        private static bool WriteSummaryLog(ref HelixSoloSensor sensor, List <HelixImage> images, string resultFolder)
        {
            List <string> logLines = new List <string>();

            logLines.AddRange(new string[] { $"{sensor.SerialNumber}\t{sensor.PartNumber}\t{sensor.Date}\n", "Z_Values\t Focus_Score" });
            foreach (HelixImage image in images)
            {
                logLines.Add($"{image.ZValue}\t{image.FocusScore}");
            }
            string path = Path.Join(resultFolder, "Focus_Summary.txt");

            File.WriteAllLines(path, logLines);

            return(true);
        }
 static public HelixSoloSensor SingleSensorSoloFocus(HelixSoloSensor sensor)
 {
     foreach (string line in File.ReadAllLines(Config.SoloFocusLog))
     {
         string[] split = line.Split("\t");
         if (split.Length < 20)
         {
             continue;
         }
         if (split[4] == sensor.SerialNumber)
         {
             sensor.FocusData = new SoloFocusData(line);
         }
     }
     return(sensor);
 }
        public static void LineAnalysis(string rectFolder)
        {
            if (!Directory.Exists(rectFolder)) //If folder doesn't exist
            {
                MessageBox.Show("The specified directory doesn't exist.", "Directory Not Found", MessageBoxButton.OK, MessageBoxImage.Error); return;
            }

            HelixSoloSensor   sensor = new HelixSoloSensor(rectFolder);
            List <HelixImage> images = GetSoloLineImages(rectFolder);

            if (images.Count == 0) //If no images
            {
                MessageBox.Show("No unfiltered laser images found", "No Laser Images", MessageBoxButton.OK, MessageBoxImage.Error); return;
            }

            //Create results folder
            string resultFolder = Path.Join(rectFolder, @"\Line Analysis");

            Directory.CreateDirectory(resultFolder);

            if (!GetCgs(ref images))
            {
                return;
            }
            ProgressBar pb = new ProgressBar()
            {
                Title      = "Writing Logs",
                Visibility = Visibility.Visible
            };

            pb.SetProgressTick(images.Count + 1);
            pb.SetLabel($"Writing log (1/{images.Count+1}): Focus_Summary.txt");
            WriteSummaryLog(ref sensor, images, resultFolder);
            foreach (HelixImage image in images)
            {
                if (pb.Canceled)
                {
                    pb.Close(); break;
                }
                pb.SetLabel($"Writing log ({images.IndexOf(image)+2}/{images.Count+1}): {Path.GetFileNameWithoutExtension(image.Name)}.txt");
                pb.TickProgress();
                WriteLineLog(ref sensor, image, resultFolder);
            }
            pb.SetValueComplete();
            pb.Close();
            MessageBox.Show("Line analysis complete.", "Done", MessageBoxButton.OK, MessageBoxImage.Information);
        }
 static public HelixSoloSensor SingleSensorSoloLaser(HelixSoloSensor sensor)
 {
     foreach (string line in File.ReadAllLines(Config.SoloLaserAlignLog))
     {
         string[] split = line.Split("\t");
         if (split.Length < 30)
         {
             continue;
         }
         if (sensor.SerialNumber == split[4])
         {
             sensor.PartNumber = split[5];
             sensor.LaserAlign = new SoloLaserAlign(line);
         }
     }
     return(sensor);
 }