CSV like PDSF ready to test

This commit is contained in:
Mike Phares 2025-01-13 09:45:27 -07:00
parent 0d6b77f0ee
commit f64a62671f
8 changed files with 397 additions and 117 deletions

View File

@ -86,6 +86,18 @@
],
"problemMatcher": "$msCompile"
},
{
"label": "Project",
"type": "shell",
"command": "code ../MET08RESIHGCV.csproj",
"problemMatcher": []
},
{
"label": "Git Config",
"type": "shell",
"command": "code ../.git/config",
"problemMatcher": []
},
{
"label": "Kanbn Console",
"type": "npm",

View File

@ -1,84 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Adaptation.FileHandlers.pcl;
#nullable enable
internal class Complete
{
public Complete(Header header, Summary summary, ReadOnlyCollection<Point> points)
{
Header = header;
Summary = summary;
Points = points;
}
public Header Header { get; }
public Summary Summary { get; }
public ReadOnlyCollection<Point> Points { get; }
private static ReadOnlyCollection<string> FilterLines(ReadOnlyCollection<string> collection)
{
List<string> results = new();
foreach (string line in collection)
{
if (string.IsNullOrEmpty(line) || line is "*" or "@")
continue;
if (line.Length < 3 || line[0] is not '*' and not '@' || line[1] != ' ')
results.Add(line);
else
results.Add(line.Substring(2));
}
return new(results);
}
public static Complete? Get(Shared.Logistics logistics, List<FileInfo> fileInfoCollection, ReadOnlyCollection<string> collection)
{
Complete? result;
Constant constant = new();
ReadOnlyCollection<string> lines = FilterLines(collection);
if (collection.Count <= constant.Take)
result = null;
else
{
Header? header = Header.Get(constant, lines);
if (header is null)
result = null;
else
{
Summary? summary = SummarySegment.Get(constant, lines);
if (summary is null)
result = null;
else
{
ReadOnlyCollection<Point> points = Point.GetCollection(constant, lines) ?? throw new NullReferenceException(nameof(summary));
if (points.Count == 0)
result = null;
else
{
result = new(header, summary, points);
FileInfo fileInfo = new($"{logistics.ReportFullPath}.json");
string json = JsonSerializer.Serialize(result, CompleteSourceGenerationContext.Default.Complete);
File.WriteAllText(fileInfo.FullName, json);
File.SetLastWriteTime(fileInfo.FullName, logistics.DateTimeFromSequence);
fileInfoCollection.Add(fileInfo);
}
}
}
}
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Complete))]
internal partial class CompleteSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -118,8 +118,8 @@ public class FileRead : Shared.FileRead, IFileRead
else
{
ReadOnlyCollection<string> lines = Convert.PDF(_Logistics, _GhostPCLFileName, _PDFTextStripperFileName, results.Item4);
Complete? complete = Complete.Get(_Logistics, results.Item4, lines);
if (complete is null)
Run? run = Run.Get(_Logistics, results.Item4, lines);
if (run is null)
throw new Exception(string.Concat("A) No Data - ", dateTime.Ticks));
IProcessData iProcessData = new ProcessData(this, _Logistics, results.Item4, lines);
if (iProcessData is not ProcessData processData)

View File

@ -13,7 +13,7 @@ using System.Text.RegularExpressions;
namespace Adaptation.FileHandlers.pcl;
public class ProcessData : IProcessData
internal class ProcessData : IProcessData
{
private int _I;

View File

@ -0,0 +1,192 @@
using System.Text.Json.Serialization;
namespace Adaptation.FileHandlers.pcl;
#nullable enable
internal class Row
{
public Row(Run run, int i)
{
Operator = run.Header.Operator;
StartVoltage = run.Header.StartVoltage;
Wafer = run.Header.Wafer;
StopVoltage = run.Header.StopVoltage;
Lot = run.Header.Lot;
RampRate = run.Header.RampRate;
Plan = run.Header.Plan;
GLimit = run.Header.GLimit;
Date = run.Header.Date;
Time = run.Header.Time;
SetupFile = run.Header.SetupFile;
WaferSize = run.Header.WaferSize;
Folder = run.Header.Folder;
Ccomp = run.Header.Ccomp;
Pattern = run.Header.Pattern;
Area = run.Header.Area;
CondType = run.Header.CondType;
RhoMethod = run.Header.RhoMethod;
Model = run.Header.Model;
if (run.Summary.Mean is null)
{
MeanNAvg = string.Empty;
MeanNsl = string.Empty;
MeanVd = string.Empty;
MeanFlatZ = string.Empty;
MeanRhoAvg = string.Empty;
MeanRhosl = string.Empty;
MeanPhase = string.Empty;
MeanGrade = string.Empty;
MeanRs = string.Empty;
}
else
{
MeanNAvg = run.Summary.Mean.NAvg;
MeanNsl = run.Summary.Mean.Nsl;
MeanVd = run.Summary.Mean.Vd;
MeanFlatZ = run.Summary.Mean.FlatZ;
MeanRhoAvg = run.Summary.Mean.RhoAvg;
MeanRhosl = run.Summary.Mean.Rhosl;
MeanPhase = run.Summary.Mean.Phase;
MeanGrade = run.Summary.Mean.Grade;
MeanRs = run.Summary.Mean.Rs;
}
if (run.Summary.StandardDeviationPercentage is null)
{
StandardDeviationPercentageNAvg = string.Empty;
StandardDeviationPercentageNsl = string.Empty;
StandardDeviationPercentageVd = string.Empty;
StandardDeviationPercentageFlatZ = string.Empty;
StandardDeviationPercentageRhoAvg = string.Empty;
StandardDeviationPercentageRhosl = string.Empty;
StandardDeviationPercentagePhase = string.Empty;
StandardDeviationPercentageGrade = string.Empty;
StandardDeviationPercentageRs = string.Empty;
}
else
{
StandardDeviationPercentageNAvg = run.Summary.StandardDeviationPercentage.NAvg;
StandardDeviationPercentageNsl = run.Summary.StandardDeviationPercentage.Nsl;
StandardDeviationPercentageVd = run.Summary.StandardDeviationPercentage.Vd;
StandardDeviationPercentageFlatZ = run.Summary.StandardDeviationPercentage.FlatZ;
StandardDeviationPercentageRhoAvg = run.Summary.StandardDeviationPercentage.RhoAvg;
StandardDeviationPercentageRhosl = run.Summary.StandardDeviationPercentage.Rhosl;
StandardDeviationPercentagePhase = run.Summary.StandardDeviationPercentage.Phase;
StandardDeviationPercentageGrade = run.Summary.StandardDeviationPercentage.Grade;
StandardDeviationPercentageRs = run.Summary.StandardDeviationPercentage.Rs;
}
if (run.Summary.RadialGradient is null)
{
RadialGradientNAvg = string.Empty;
RadialGradientNsl = string.Empty;
RadialGradientVd = string.Empty;
RadialGradientFlatZ = string.Empty;
RadialGradientRhoAvg = string.Empty;
RadialGradientRhosl = string.Empty;
RadialGradientPhase = string.Empty;
RadialGradientGrade = string.Empty;
RadialGradientRs = string.Empty;
}
else
{
RadialGradientNAvg = run.Summary.RadialGradient.NAvg;
RadialGradientNsl = run.Summary.RadialGradient.Nsl;
RadialGradientVd = run.Summary.RadialGradient.Vd;
RadialGradientFlatZ = run.Summary.RadialGradient.FlatZ;
RadialGradientRhoAvg = run.Summary.RadialGradient.RhoAvg;
RadialGradientRhosl = run.Summary.RadialGradient.Rhosl;
RadialGradientPhase = run.Summary.RadialGradient.Phase;
RadialGradientGrade = run.Summary.RadialGradient.Grade;
RadialGradientRs = run.Summary.RadialGradient.Rs;
}
Site = run.Points[i].Site;
X = run.Points[i].X;
Y = run.Points[i].Y;
NAvg = run.Points[i].NAvg;
RhoAvg = run.Points[i].RhoAvg;
Nsl = run.Points[i].Nsl;
Rhosl = run.Points[i].Rhosl;
Vd = run.Points[i].Vd;
Phase = run.Points[i].Phase;
FlatZ = run.Points[i].FlatZ;
Grade = run.Points[i].Grade;
XLeft = run.Points[i].XLeft;
XRight = run.Points[i].XRight;
BottomY = run.Points[i].BottomY;
TopY = run.Points[i].TopY;
}
public string Operator { get; }
public string StartVoltage { get; }
public string Wafer { get; }
public string StopVoltage { get; }
public string Lot { get; }
public string RampRate { get; }
public string Plan { get; }
public string GLimit { get; }
public string Date { get; }
public string Time { get; }
public string SetupFile { get; }
public string WaferSize { get; }
public string Folder { get; }
public string Ccomp { get; }
public string Pattern { get; }
public string Area { get; }
public string CondType { get; }
public string RhoMethod { get; }
public string Model { get; }
//
public string MeanNAvg { get; }
public string MeanNsl { get; }
public string MeanVd { get; }
public string MeanFlatZ { get; }
public string MeanRhoAvg { get; }
public string MeanRhosl { get; }
public string MeanPhase { get; }
public string MeanGrade { get; }
public string MeanRs { get; }
//
public string StandardDeviationPercentageNAvg { get; }
public string StandardDeviationPercentageNsl { get; }
public string StandardDeviationPercentageVd { get; }
public string StandardDeviationPercentageFlatZ { get; }
public string StandardDeviationPercentageRhoAvg { get; }
public string StandardDeviationPercentageRhosl { get; }
public string StandardDeviationPercentagePhase { get; }
public string StandardDeviationPercentageGrade { get; }
public string StandardDeviationPercentageRs { get; }
//
public string RadialGradientNAvg { get; }
public string RadialGradientNsl { get; }
public string RadialGradientVd { get; }
public string RadialGradientFlatZ { get; }
public string RadialGradientRhoAvg { get; }
public string RadialGradientRhosl { get; }
public string RadialGradientPhase { get; }
public string RadialGradientGrade { get; }
public string RadialGradientRs { get; }
//
public string Site { get; }
public string X { get; }
public string Y { get; }
public string NAvg { get; }
public string RhoAvg { get; }
public string Nsl { get; }
public string Rhosl { get; }
public string Vd { get; }
public string Phase { get; }
public string FlatZ { get; }
public string Grade { get; }
public string XLeft { get; }
public string XRight { get; }
public string BottomY { get; }
public string TopY { get; }
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Row))]
internal partial class RowSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -0,0 +1,161 @@
using Adaptation.Shared;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Adaptation.FileHandlers.pcl;
#nullable enable
internal class Run
{
public Run(Header header, Summary summary, ReadOnlyCollection<Point> points)
{
Header = header;
Summary = summary;
Points = points;
}
public Header Header { get; }
public Summary Summary { get; }
public ReadOnlyCollection<Point> Points { get; }
private static ReadOnlyCollection<string> FilterLines(ReadOnlyCollection<string> collection)
{
List<string> results = new();
foreach (string line in collection)
{
if (string.IsNullOrEmpty(line) || line is "*" or "@")
continue;
if (line.Length < 3 || line[0] is not '*' and not '@' || line[1] != ' ')
results.Add(line);
else
results.Add(line.Substring(2));
}
return new(results);
}
private static void WriteJson(Logistics logistics, List<FileInfo> fileInfoCollection, Run? result)
{
FileInfo fileInfo = new($"{logistics.ReportFullPath}.json");
string json = JsonSerializer.Serialize(result, RunSourceGenerationContext.Default.Run);
File.WriteAllText(fileInfo.FullName, json);
File.SetLastWriteTime(fileInfo.FullName, logistics.DateTimeFromSequence);
fileInfoCollection.Add(fileInfo);
}
private static ReadOnlyCollection<string> GetLines(JsonElement[]? jsonElements)
{
List<string> results = new();
int columns = 0;
StringBuilder stringBuilder = new();
for (int i = 0; i < jsonElements?.Length;)
{
foreach (JsonProperty jsonProperty in jsonElements[0].EnumerateObject())
{
columns += 1;
_ = stringBuilder.Append('"').Append(jsonProperty.Name).Append('"').Append('\t');
}
break;
}
if (jsonElements?.Length != 0)
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
results.Add(stringBuilder.ToString());
for (int i = 0; i < jsonElements?.Length; i++)
{
_ = stringBuilder.Clear();
foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject())
{
if (jsonProperty.Value.ValueKind == JsonValueKind.Object)
_ = stringBuilder.Append('\t');
else if (jsonProperty.Value.ValueKind != JsonValueKind.String)
_ = stringBuilder.Append(jsonProperty.Value).Append('\t');
else
_ = stringBuilder.Append('"').Append(jsonProperty.Value).Append('"').Append('\t');
}
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
results.Add(stringBuilder.ToString());
}
return results.AsReadOnly();
}
private static ReadOnlyCollection<string> GetLines(JsonElement jsonElement) =>
GetLines(new JsonElement[] { jsonElement });
private static void WriteTabSeparatedValues(Logistics logistics, List<FileInfo> fileInfoCollection, Run run)
{
List<Row> results = new();
Row row;
FileInfo fileInfo = new($"{logistics.ReportFullPath}.tsv");
for (int i = 0; i < run.Points.Count; i++)
{
row = new(run, i);
results.Add(row);
}
string json = JsonSerializer.Serialize(results);
JsonElement[]? jsonElements = JsonSerializer.Deserialize<JsonElement[]>(json);
ReadOnlyCollection<string> lines = GetLines(jsonElements);
File.WriteAllText(fileInfo.FullName, string.Join(Environment.NewLine, lines));
File.SetLastWriteTime(fileInfo.FullName, logistics.DateTimeFromSequence);
fileInfoCollection.Add(fileInfo);
}
private static void WriteException(Logistics logistics, Exception ex)
{
FileInfo fileInfo = new($"{logistics.ReportFullPath}.{nameof(Exception)}.txt");
File.WriteAllText(fileInfo.FullName, $"{ex.Message}{Environment.NewLine}{ex.StackTrace}");
}
public static Run? Get(Logistics logistics, List<FileInfo> fileInfoCollection, ReadOnlyCollection<string> collection)
{
Run? result;
Constant constant = new();
ReadOnlyCollection<string> lines = FilterLines(collection);
if (collection.Count <= constant.Take)
result = null;
else
{
Header? header = Header.Get(constant, lines);
if (header is null)
result = null;
else
{
Summary? summary = SummarySegment.Get(constant, lines);
if (summary is null)
result = null;
else
{
ReadOnlyCollection<Point> points = Point.GetCollection(constant, lines) ?? throw new NullReferenceException(nameof(summary));
if (points.Count == 0)
result = null;
else
{
result = new(header, summary, points);
WriteJson(logistics, fileInfoCollection, result);
try
{
WriteTabSeparatedValues(logistics, fileInfoCollection, result);
}
catch (Exception ex)
{
WriteException(logistics, ex);
}
}
}
}
}
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(Run))]
internal partial class RunSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -35,7 +35,7 @@
<RuntimeHostConfigurationOption Include="AssemblyName" Value="MET08RESIHGCV" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="coverlet.collector" Version="6.0.3" />
<PackageReference Include="FFMpegCore" Version="5.1.0" />
<PackageReference Include="IKVM.AWT.WinForms" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="IKVM.OpenJDK.Core" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference>
@ -44,41 +44,39 @@
<PackageReference Include="IKVM.OpenJDK.Util" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="IKVM.OpenJDK.XML.API" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="IKVM.Runtime" Version="7.2.4630.5"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="Instances" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.json" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="Microsoft.Win32.SystemEvents" Version="8.0.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.6.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.6.1" />
<PackageReference Include="Instances" Version="3.0.1" />
<PackageReference Include="log4net" Version="3.0.3"></PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.json" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="Microsoft.Win32.SystemEvents" Version="9.0.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
<PackageReference Include="Pdfbox" Version="1.1.1"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="RoboSharp" Version="1.5.3" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.1" />
<PackageReference Include="System.Data.OleDb" Version="8.0.1" />
<PackageReference Include="RoboSharp" Version="1.6.0" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="9.0.0" />
<PackageReference Include="System.Data.OleDb" Version="9.0.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
<PackageReference Include="System.Drawing.Common" Version="8.0.10" />
<PackageReference Include="System.Text.Json" Version="8.0.5" />
<PackageReference Include="Tesseract" Version="5.2.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Tibco.Rendezvous.DotNetCore" Version="8.5.0" />
<PackageReference Include="Infineon.Yoda.DotNetCore" Version="5.4.1" />
<PackageReference Include="System.Drawing.Common" Version="9.0.0" />
<PackageReference Include="System.Text.Json" Version="9.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Infineon.Mesa.PDF.Text.Stripper" Version="4.8.0.1"><NoWarn>NU1701</NoWarn></PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="External.Common.Logging.Core" Version="3.3.1"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="External.Common.Logging" Version="3.3.1"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="External.log4net" Version="2.0.8"><NoWarn>NU1701</NoWarn></PackageReference>
<PackageReference Include="Infineon.Yoda.DotNetCore" Version="5.4.3" />
<PackageReference Include="Tibco.Rendezvous.DotNetCore" Version="8.5.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Tesseract" Version="5.2.0" />
</ItemGroup>
<ItemGroup>
<None Include="appsettings.json">

View File

@ -116,7 +116,6 @@
<Compile Include="Adaptation\FileHandlers\OpenInsightMetrologyViewer\FileRead.cs" />
<Compile Include="Adaptation\FileHandlers\OpenInsightMetrologyViewer\WSRequest.cs" />
<Compile Include="Adaptation\FileHandlers\OpenInsightMetrologyViewerAttachments\FileRead.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\Complete.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\Constant.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\Convert.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\Description.cs" />
@ -126,6 +125,8 @@
<Compile Include="Adaptation\FileHandlers\pcl\Header.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\Point.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\ProcessData.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\Row.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\Run.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\Summary.cs" />
<Compile Include="Adaptation\FileHandlers\pcl\SummarySegment.cs" />
<Compile Include="Adaptation\FileHandlers\Processed\FileRead.cs" />