MET08ANLYSDIFAAST230 - v4.43.0 - Use EDA multiple

This commit is contained in:
2022-05-16 15:34:24 -07:00
parent 9c042d3871
commit 2685dd79d5
178 changed files with 13498 additions and 11875 deletions

View File

@ -1 +0,0 @@


View File

@ -1,20 +0,0 @@
namespace Adaptation.Shared.Deposition
{
public class DEP08EGANAIXG5
{
public enum Test
{
GRATXTCenter = Deposition.Test.GRATXTCenter,
GRATXTEdge = Deposition.Test.GRATXTEdge,
GRAXMLCenter = Deposition.Test.GRAXMLCenter,
GRAXMLEdgeN = Deposition.Test.GRAXMLEdgeN,
Health = Deposition.Test.Health,
Temps = Deposition.Test.Temps,
ToolTime = Deposition.Test.ToolTime
}
}
}

View File

@ -1,16 +0,0 @@
namespace Adaptation.Shared.Deposition
{
public enum Test
{
AFMRoughness = -1,
GRATXTCenter = 0,
GRATXTEdge = 1,
GRAXMLCenter = 2,
GRAXMLEdgeN = 3,
Health = 4,
Temps = 5,
ToolTime = 6
}
}

View File

@ -1,182 +0,0 @@
using Adaptation.Eaf.Core;
using Adaptation.Eaf.EquipmentCore.Control;
using Adaptation.Eaf.EquipmentCore.DataCollection.Reporting;
using Adaptation.Eaf.EquipmentCore.SelfDescription.ElementDescription;
using Adaptation.Eaf.EquipmentCore.SelfDescription.ParameterTypes;
using Adaptation.Ifx.Eaf.EquipmentConnector.File.SelfDescription;
using Adaptation.Shared.Metrology;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
namespace Adaptation.Shared
{
public class Description
{
public enum RowColumn
{
Test = 1000,
Count,
Index
}
public enum LogisticsColumn
{
EventName = 2000,
NullData,
JobID,
Sequence,
MesEntity,
ReportFullPath,
ProcessJobID,
MID
}
public enum Param
{
String = 0,
Integer = 2,
Double = 3,
Boolean = 4,
StructuredType = 5
}
internal const string FileFound = "FileFound";
public List<EquipmentParameter> EquipmentParameters { get; private set; }
public List<ParameterTypeDefinition> ParameterTypeDefinitions { get; private set; }
private readonly bool _UseCyclical;
private readonly List<string> _HeaderNames;
private readonly Dictionary<string, int> _KeyIndexPairs;
private readonly ParameterTypeDefinition _StructuredType;
private readonly FileConnectorParameterTypeDefinitionProvider _FileConnectorParameterTypeDefinitionProvider;
public Description(ILogic logic, ConfigDataBase configDataBase, IEquipmentControl equipmentControl)
{
_KeyIndexPairs = new Dictionary<string, int>();
_HeaderNames = configDataBase.GetHeaderNames(logic);
_UseCyclical = configDataBase.UseCyclicalForDescription;
_StructuredType = new StructuredType(nameof(StructuredType), string.Empty, new List<Field>());
_FileConnectorParameterTypeDefinitionProvider = new FileConnectorParameterTypeDefinitionProvider();
EquipmentParameters = new List<EquipmentParameter>();
ParameterTypeDefinitions = new List<ParameterTypeDefinition> { _StructuredType };
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection = configDataBase.GetParameterInfo(logic, allowNull: false);
List<ParameterValue> results = GetParameterValues(equipmentControl, keyValuePairsCollection);
}
private List<ParameterValue> GetParameterValues(IEquipmentControl equipmentControl, Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection)
{
List<ParameterValue> results = new List<ParameterValue>();
Enum param;
object value;
Enum[] @params;
string description;
List<object[]> list;
EquipmentParameter equipmentParameter;
ParameterTypeDefinition parameterTypeDefinition;
bool addToEquipmentParameters = !EquipmentParameters.Any();
foreach (KeyValuePair<string, List<Tuple<Enum, string, string, object>>> keyValuePair in keyValuePairsCollection)
{
if (!addToEquipmentParameters && !_KeyIndexPairs.ContainsKey(keyValuePair.Key))
continue;
@params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray();
if (@params.Length != 1)
throw new Exception();
if (keyValuePair.Value[0].Item2 != keyValuePair.Key)
throw new Exception();
param = @params[0];
if (!addToEquipmentParameters)
equipmentParameter = EquipmentParameters[_KeyIndexPairs[keyValuePair.Key]];
else
{
description = keyValuePair.Value[0].Item3;
_KeyIndexPairs.Add(keyValuePair.Key, EquipmentParameters.Count());
if (param is Param.StructuredType || (_UseCyclical && !_HeaderNames.Contains(keyValuePair.Key)))
parameterTypeDefinition = _StructuredType;
else
parameterTypeDefinition = _FileConnectorParameterTypeDefinitionProvider.GetParameterTypeDefinition(param.ToString());
equipmentParameter = new EquipmentParameter(keyValuePair.Key, parameterTypeDefinition, description);
EquipmentParameters.Add(equipmentParameter);
}
if (!_UseCyclical || _HeaderNames.Contains(keyValuePair.Key))
value = keyValuePair.Value[0].Item4;
else
{
list = new List<object[]>();
for (int i = 0; i < keyValuePair.Value.Count; i++)
list.Add(new object[] { i, keyValuePair.Value[i].Item4 });
value = list;
}
if (equipmentControl is null || !(param is Param.StructuredType))
results.Add(new ParameterValue(equipmentParameter, value, DateTime.Now));
else
results.Add(equipmentControl.DataCollection.CreateParameterValue(equipmentParameter, value));
}
return results;
}
public List<ParameterValue> GetParameterValues(ILogic logic, IEquipmentControl equipmentControl, JsonElement jsonElement, int? i = null, Dictionary<string, object> keyValuePairs = null)
{
List<ParameterValue> results = new List<ParameterValue>();
if (_UseCyclical && (i is null || i.Value > 0))
throw new Exception();
if (jsonElement.ValueKind != JsonValueKind.Array)
throw new Exception();
Enum param;
Tuple<Enum, string, string, object> tuple;
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairsCollection = new Dictionary<string, List<Tuple<Enum, string, string, object>>>();
for (int r = i.Value; r < jsonElements.Length; r++)
{
foreach (JsonProperty jsonProperty in jsonElement[r].EnumerateObject())
{
if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array)
{
param = Param.StructuredType;
//jValue = jObject.Value<JValue>("Item1");
throw new NotImplementedException("Item1");
}
else
{
switch (jsonProperty.Value.ValueKind)
{
case JsonValueKind.String: param = Param.String; break;
case JsonValueKind.Number: param = Param.Double; break;
case JsonValueKind.True:
case JsonValueKind.False: param = Param.Boolean; break;
case JsonValueKind.Null: param = Param.String; break;
default: param = Param.StructuredType; break;
}
}
tuple = new Tuple<Enum, string, string, object>(param, jsonProperty.Name, string.Empty, jsonProperty.Value.ToString());
if (!keyValuePairsCollection.ContainsKey(jsonProperty.Name))
keyValuePairsCollection.Add(jsonProperty.Name, new List<Tuple<Enum, string, string, object>>());
keyValuePairsCollection[jsonProperty.Name].Add(tuple);
}
if (!_UseCyclical)
break;
}
results = GetParameterValues(equipmentControl, keyValuePairsCollection);
return results;
}
public static string GetCellName()
{
string result;
if (Backbone.Instance?.CellName is null)
result = string.Empty;
else
result = Backbone.Instance.CellName;
if (result.Contains("-IO"))
result = result.Replace("-IO", string.Empty);
return result;
}
}
}

View File

@ -0,0 +1,142 @@
using Adaptation.Shared.Methods;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
namespace Adaptation.Shared.Duplicator;
public class Description : IDescription, Properties.IDescription
{
public int Test { get; set; }
public int Count { get; set; }
public int Index { get; set; }
//
public string EventName { get; set; }
public string NullData { get; set; }
public string JobID { get; set; }
public string Sequence { get; set; }
public string MesEntity { get; set; }
public string ReportFullPath { get; set; }
public string ProcessJobID { get; set; }
public string MID { get; set; }
public string Date { get; set; } //2021-10-23
string IDescription.GetEventDescription() => "File Has been read and parsed";
List<string> IDescription.GetNames(IFileRead fileRead, Logistics logistics)
{
List<string> results = new();
IDescription description = GetDefault(fileRead, logistics);
string json = JsonSerializer.Serialize(description, description.GetType());
object @object = JsonSerializer.Deserialize<object>(json);
if (@object is not JsonElement jsonElement)
throw new Exception();
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
results.Add(jsonProperty.Name);
return results;
}
List<string> IDescription.GetDetailNames()
{
List<string> results = new();
return results;
}
List<string> IDescription.GetHeaderNames()
{
List<string> results = new();
return results;
}
IDescription IDescription.GetDisplayNames()
{
Description result = GetDisplayNames();
return result;
}
List<string> IDescription.GetParameterNames()
{
List<string> results = new();
return results;
}
JsonProperty[] IDescription.GetDefault(IFileRead fileRead, Logistics logistics)
{
JsonProperty[] results;
IDescription description = GetDefault(fileRead, logistics);
string json = JsonSerializer.Serialize(description, description.GetType());
object @object = JsonSerializer.Deserialize<object>(json);
results = ((JsonElement)@object).EnumerateObject().ToArray();
return results;
}
List<string> IDescription.GetPairedParameterNames()
{
List<string> results = new();
return results;
}
List<string> IDescription.GetIgnoreParameterNames(Test test)
{
List<string> results = new();
return results;
}
IDescription IDescription.GetDefaultDescription(IFileRead fileRead, Logistics logistics)
{
Description result = GetDefault(fileRead, logistics);
return result;
}
Dictionary<string, string> IDescription.GetDisplayNamesJsonElement(IFileRead fileRead)
{
Dictionary<string, string> results = new();
IDescription description = GetDisplayNames();
string json = JsonSerializer.Serialize(description, description.GetType());
JsonElement jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
{
if (!results.ContainsKey(jsonProperty.Name))
results.Add(jsonProperty.Name, string.Empty);
if (jsonProperty.Value is JsonElement jsonPropertyValue)
results[jsonProperty.Name] = jsonPropertyValue.ToString();
}
return results;
}
List<IDescription> IDescription.GetDescriptions(IFileRead fileRead, Logistics logistics, List<Test> tests, IProcessData iProcessData)
{
List<IDescription> results = new();
return results;
}
private static Description GetDisplayNames()
{
Description result = new();
return result;
}
private static Description GetDefault(IFileRead fileRead, Logistics logistics)
{
Description result = new()
{
Test = -1,
Count = 0,
Index = -1,
//
EventName = fileRead.EventName,
NullData = fileRead.NullData,
JobID = fileRead.CellInstanceName,
Sequence = logistics.Sequence.ToString(),
MesEntity = fileRead.MesEntity,
ReportFullPath = logistics.ReportFullPath,
ProcessJobID = logistics.ProcessJobID,
MID = logistics.MID,
Date = logistics.DateTimeFromSequence.ToUniversalTime().ToString("MM/dd/yyyy HH:mm:ss")
};
return result;
}
}

View File

@ -1,53 +0,0 @@
namespace Adaptation.Shared
{
public enum EquipmentType
{
FileEquipment,
SemiEquipment,
//
DEP08EGANAIXG5,
//
MET08ANLYSDIFAAST230_Semi,
MET08DDUPSFS6420,
MET08DDUPSP1TBI,
MET08RESIHGCV,
MET08RESIMAPCDE,
MET08THFTIRQS408M,
MET08THFTIRSTRATUS,
//
MET08AFMD3100,
MET08BVHGPROBE,
MET08CVHGPROBE802B150,
MET08CVHGPROBE802B150_Monthly,
MET08CVHGPROBE802B150_Weekly,
MET08DDINCAN8620,
MET08DDINCAN8620_Daily,
MET08EBEAMINTEGRITY26,
MET08HALLHL5580,
MET08HALLHL5580_Monthly,
MET08HALLHL5580_Weekly,
MET08MESMICROSCOPE,
MET08NDFRESIMAP151C,
MET08NDFRESIMAP151C_Verification,
MET08PLMAPRPM,
MET08PLMAPRPM_Daily,
MET08PLMAPRPM_Verification,
MET08PLMPPLATO,
MET08PRFUSB4000,
MET08PRFUSB4000_Daily,
MET08PRFUSB4000_Monthly,
MET08PRFUSB4000_Weekly,
MET08PRFUSB4000_Verification,
MET08PRFUSB4000_Villach,
MET08UVH44GS100M,
MET08VPDSUBCON,
MET08WGEOMX203641Q,
MET08WGEOMX203641Q_Verification,
MET08XRDXPERTPROMRDXL,
MET08XRDXPERTPROMRDXL_Monthly,
MET08XRDXPERTPROMRDXL_Weekly,
METBRXRAYJV7300L
}
}

View File

@ -1,178 +0,0 @@
using Adaptation.Shared.Metrology;
using System;
using System.Collections.Generic;
namespace Adaptation.Shared
{
public class ExtendedParameter
{
public string DiplayName { get; set; }
public string ControlPlanName { get; set; }
public bool? CriticalToShip { get; set; }
public string Unit { get; set; }
public double? LSL { get; set; }
public double? TSL { get; set; }
public double? USL { get; set; }
public string Value { get; set; }
public bool? Ignore { get; set; }
//public class ExtractorKeys
public string Lot { get; set; } //1
public string ToolID { get; set; } //2
public string Process { get; set; } //3
public string WaferID { get; set; } //4
public string Part { get; set; } //5
public string Recipe { get; set; } //6
public string ProcessFlow { get; set; } //7
//public class DataKeys
public string Employee { get; set; } //1
public string SID { get; set; } //2
public string WaferRegion { get; set; } //3
public string WaferScribe { get; set; } //4
public string WaferPosition { get; set; } //5
public string X { get; set; } //6
public string Y { get; set; } //7
public string EAFCellInstance { get; set; } //8
public string EAFReference { get; set; } //9
public string IQSReference { get; set; } //10
public ExtendedParameter(Logistics logistics, string diplayName, string controlPlanName)
{
DiplayName = diplayName;
ControlPlanName = controlPlanName;
CriticalToShip = null;
Unit = string.Empty;
LSL = null;
TSL = null;
USL = null;
Ignore = null;
Value = string.Empty;
//public class ExtractorKeys
Lot = string.Empty; //1
ToolID = string.Empty; //2
Process = string.Empty; //3
WaferID = string.Empty; //4
Part = string.Empty; //5
Recipe = string.Empty; //6
ProcessFlow = string.Empty; //7
//public class DataKeys
Employee = string.Empty; //1
SID = string.Empty; //2
WaferRegion = string.Empty; //3
WaferScribe = string.Empty; //4
WaferPosition = string.Empty; //5
X = string.Empty; //6
Y = string.Empty; //7
EAFCellInstance = string.Empty; //8
EAFReference = string.Empty; //9
IQSReference = string.Empty; //10
//
Lot = "-";
SID = "-";
Part = "-";
if (!(logistics is null))
{
ToolID = logistics.MesEntity;
EAFCellInstance = logistics.JobID;
}
}
public override string ToString()
{
return Value;
}
internal void Set(EquipmentType equipmentConnection, string queryFilter, Dictionary<Enum, string> allColumnCollection)
{
Column key;
EAFReference = equipmentConnection.ToString();
if (string.IsNullOrEmpty(queryFilter))
IQSReference = null;
else
IQSReference = queryFilter;
//
key = Column.SID;
if (!allColumnCollection.ContainsKey(key))
SID = "-";
else
SID = allColumnCollection[key];
key = Column.Employee;
if (!allColumnCollection.ContainsKey(key))
Employee = "AUTO";
else
Employee = allColumnCollection[key];
//
key = Column.Lot;
if (allColumnCollection.ContainsKey(key))
Lot = allColumnCollection[key];
//
key = Column.Part;
if (allColumnCollection.ContainsKey(key))
Part = allColumnCollection[key];
//
key = Column.Process;
if (allColumnCollection.ContainsKey(key))
Process = allColumnCollection[key];
//
key = Column.Recipe;
if (allColumnCollection.ContainsKey(key))
Recipe = allColumnCollection[key];
//
key = Column.Wafer_ID;
if (allColumnCollection.ContainsKey(key))
WaferID = allColumnCollection[key];
key = Column.Denton_Gun_Pocket;
if (allColumnCollection.ContainsKey(key))
WaferID = allColumnCollection[key];
key = Column.WaferPocket_Candela;
if (allColumnCollection.ContainsKey(key))
WaferID = allColumnCollection[key];
key = Column.WaferPocket_Warp;
if (allColumnCollection.ContainsKey(key))
WaferID = allColumnCollection[key];
//
key = Column.Wafer_ID;
if (allColumnCollection.ContainsKey(key))
WaferID = allColumnCollection[key];
key = Column.Denton_Gun_Pocket;
if (allColumnCollection.ContainsKey(key))
WaferID = allColumnCollection[key];
key = Column.WaferPocket_Candela;
if (allColumnCollection.ContainsKey(key))
WaferID = allColumnCollection[key];
key = Column.WaferPocket_Warp;
if (allColumnCollection.ContainsKey(key))
WaferID = allColumnCollection[key];
//
key = Column.Wafer_Region;
if (allColumnCollection.ContainsKey(key))
WaferRegion = allColumnCollection[key];
key = Column.Wafer_Scribe;
if (allColumnCollection.ContainsKey(key))
WaferScribe = allColumnCollection[key];
key = Column.WaferPosition_BV;
if (allColumnCollection.ContainsKey(key))
WaferPosition = allColumnCollection[key];
key = Column.WaferPosition_CV;
if (allColumnCollection.ContainsKey(key))
WaferPosition = allColumnCollection[key];
key = Column.WaferPosition_Hall;
if (allColumnCollection.ContainsKey(key))
WaferPosition = allColumnCollection[key];
key = Column.WaferPosition_PR;
if (allColumnCollection.ContainsKey(key))
WaferPosition = allColumnCollection[key];
key = Column.X_Coord;
if (allColumnCollection.ContainsKey(key))
X = allColumnCollection[key];
key = Column.Y_Coord;
if (allColumnCollection.ContainsKey(key))
Y = allColumnCollection[key];
}
}
}

View File

@ -1,613 +0,0 @@
using Adaptation.Shared.Metrology;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Adaptation.Shared
{
public class ExtractResult
{
public object ProcessData { get; internal set; }
public long LastTicksDuration { get; private set; }
public long BreakAfterSeconds { get; private set; }
public Enum[] EnumColumns { get; protected set; }
public List<string> SourceFiles { get; private set; }
public Column[] PairedColumns { get; protected set; }
public Dictionary<Enum, List<string>> Headers { get; protected set; }
public Dictionary<Enum, List<string>> Details { get; protected set; }
public Dictionary<Enum, List<string>> Parameters { get; protected set; }
public Dictionary<Enum, List<ExtendedParameter>> ExtendedParameters { get; protected set; }
public Dictionary<Enum, List<string>> DatabaseHeaders { get; protected set; }
public Dictionary<Enum, List<string>> DatabaseDetails { get; protected set; }
public Dictionary<Description.RowColumn, List<int>> RowColumns { get; protected set; }
public Dictionary<Test, Dictionary<Enum, List<int>>> IgnoreIndeices { get; protected set; }
public Dictionary<Description.LogisticsColumn, List<string>> LogisticsColumns { get; protected set; }
public ExtractResult(ExtractResult extractResult, long breakAfterSeconds, Enum[] enumColumns, Column[] pairedColumns)
{
if (enumColumns is null)
enumColumns = new Enum[] { };
if (pairedColumns is null)
pairedColumns = new Column[] { };
ProcessData = null;
EnumColumns = enumColumns;
PairedColumns = pairedColumns;
SourceFiles = new List<string>();
if (!(extractResult is null) && !(extractResult.SourceFiles is null))
SourceFiles.AddRange(extractResult.SourceFiles);
BreakAfterSeconds = breakAfterSeconds;
List<Enum> headers = new List<Enum>();
List<Enum> details = new List<Enum>();
List<Enum> parameters = new List<Enum>();
List<Enum> databaseHeaders = new List<Enum>();
List<Enum> databaseDetails = new List<Enum>();
UpdateLastTicksDuration(breakAfterSeconds * 10000000);
Common(headers, details, parameters, databaseHeaders, databaseDetails);
}
private void Common(List<Enum> headers, List<Enum> details, List<Enum> parameters, List<Enum> databaseHeaders, List<Enum> databaseDetails)
{
Headers = new Dictionary<Enum, List<string>>();
Details = new Dictionary<Enum, List<string>>();
Parameters = new Dictionary<Enum, List<string>>();
ExtendedParameters = new Dictionary<Enum, List<ExtendedParameter>>();
DatabaseHeaders = new Dictionary<Enum, List<string>>();
DatabaseDetails = new Dictionary<Enum, List<string>>();
IgnoreIndeices = new Dictionary<Test, Dictionary<Enum, List<int>>>();
LogisticsColumns = new Dictionary<Description.LogisticsColumn, List<string>>();
foreach (Enum item in headers)
Headers.Add(item, new List<string>());
foreach (Enum item in details)
Details.Add(item, new List<string>());
foreach (Enum item in parameters)
Parameters.Add(item, new List<string>());
foreach (Enum item in parameters)
ExtendedParameters.Add(item, new List<ExtendedParameter>());
foreach (Enum item in databaseHeaders)
DatabaseHeaders.Add(item, new List<string>());
foreach (Enum item in databaseDetails)
DatabaseDetails.Add(item, new List<string>());
Array array;
array = Enum.GetValues(typeof(Description.RowColumn));
RowColumns = new Dictionary<Description.RowColumn, List<int>>();
foreach (Description.RowColumn item in array)
RowColumns.Add(item, new List<int>());
array = Enum.GetValues(typeof(Description.LogisticsColumn));
foreach (Description.LogisticsColumn item in array)
LogisticsColumns.Add(item, new List<string>());
}
internal void Reset()
{
ProcessData = null;
SourceFiles.Clear();
List<Enum> headers = new List<Enum>();
List<Enum> details = new List<Enum>();
List<Enum> parameters = new List<Enum>();
List<Enum> databaseHeaders = new List<Enum>();
List<Enum> databaseDetails = new List<Enum>();
foreach (KeyValuePair<Enum, List<string>> item in Headers)
headers.Add(item.Key);
foreach (KeyValuePair<Enum, List<string>> item in Details)
details.Add(item.Key);
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
parameters.Add(item.Key);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
databaseHeaders.Add(item.Key);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
databaseDetails.Add(item.Key);
Common(headers, details, parameters, databaseHeaders, databaseDetails);
}
public ExtractResult ShallowCopy()
{
return (ExtractResult)this.MemberwiseClone();
}
internal void HeadersAddRange(Enum column)
{
Headers.Add(column, new List<string>());
}
internal void HeadersAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
Headers.Add(item, new List<string>());
}
internal void HeadersAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
Headers.Add(item, new List<string>());
}
internal void DetailsAddRange(Enum column)
{
Details.Add(column, new List<string>());
}
internal void DetailsAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
Details.Add(item, new List<string>());
}
internal void DetailsAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
Details.Add(item, new List<string>());
}
internal void ParametersAddRange(Enum column)
{
Parameters.Add(column, new List<string>());
}
internal void ParametersAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
Parameters.Add(item, new List<string>());
}
internal void ParametersAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
Parameters.Add(item, new List<string>());
}
internal void DatabaseHeadersAddRange(Enum column)
{
DatabaseHeaders.Add(column, new List<string>());
}
internal void DatabaseHeadersAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
DatabaseHeaders.Add(item, new List<string>());
}
internal void DatabaseHeadersAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
DatabaseHeaders.Add(item, new List<string>());
}
internal void DatabaseDetailsAddRange(Enum column)
{
DatabaseDetails.Add(column, new List<string>());
}
internal void DatabaseDetailsAddRange(params Enum[] columns)
{
foreach (Enum item in columns)
DatabaseDetails.Add(item, new List<string>());
}
internal void DatabaseDetailsAddRange(List<Enum> columns)
{
foreach (Enum item in columns)
DatabaseDetails.Add(item, new List<string>());
}
internal int GetCount()
{
int result;
List<int> counts = new List<int>
{
RowColumns[Description.RowColumn.Test].Count()
};
foreach (KeyValuePair<Enum, List<string>> item in Headers)
counts.Add(item.Value.Count());
foreach (KeyValuePair<Enum, List<string>> item in Details)
counts.Add(item.Value.Count());
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
counts.Add(item.Value.Count());
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
counts.Add(item.Value.Count());
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
counts.Add(item.Value.Count());
result = counts.Max();
if (counts.Distinct().Count() != 1)
throw new Exception();
return result;
}
private Dictionary<Enum, List<string>> Merge(List<KeyValuePair<Enum, List<string>>> keyValuePairs)
{
Dictionary<Enum, List<string>> results = new Dictionary<Enum, List<string>>();
foreach (KeyValuePair<Enum, List<string>> element in keyValuePairs)
results.Add(element.Key, element.Value);
return results;
}
private List<KeyValuePair<Enum, List<string>>> GetAllColumnKeyValuePairs()
{
List<KeyValuePair<Enum, List<string>>> results = new List<KeyValuePair<Enum, List<string>>>();
foreach (KeyValuePair<Enum, List<string>> item in Headers)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in Details)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
return results;
}
internal Dictionary<Enum, List<string>> GetAllColumnCollection()
{
Dictionary<Enum, List<string>> results;
if (!EnumColumns.Any())
{
List<KeyValuePair<Enum, List<string>>> keyValuePairs = GetAllColumnKeyValuePairs();
results = Merge(keyValuePairs);
}
else
{
results = new Dictionary<Enum, List<string>>();
foreach (Enum item in EnumColumns)
results.Add(item, new List<string>());
foreach (Column item in PairedColumns)
results.Add(item, new List<string>());
foreach (KeyValuePair<Enum, List<string>> item in Headers)
results[item.Key].AddRange(item.Value);
foreach (KeyValuePair<Enum, List<string>> item in Details)
results[item.Key].AddRange(item.Value);
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
results[item.Key].AddRange(item.Value);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
results[item.Key].AddRange(item.Value);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
results[item.Key].AddRange(item.Value);
int count = GetCount();
foreach (KeyValuePair<Enum, List<string>> keyValuePair in results)
{
for (int i = keyValuePair.Value.Count; i < count; i++)
results[keyValuePair.Key].Add(string.Empty);
}
}
return results;
}
private Dictionary<Enum, string> Merge(List<KeyValuePair<Enum, string>> keyValuePairs)
{
Dictionary<Enum, string> results = new Dictionary<Enum, string>();
foreach (KeyValuePair<Enum, string> element in keyValuePairs)
results.Add(element.Key, element.Value);
return results;
}
private List<KeyValuePair<Enum, string>> GetAllColumnKeyValuePairs(int? i)
{
List<KeyValuePair<Enum, string>> results = new List<KeyValuePair<Enum, string>>();
if (i.HasValue)
{
foreach (KeyValuePair<Enum, List<string>> item in Headers)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
foreach (KeyValuePair<Enum, List<string>> item in Details)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
results.Add(new KeyValuePair<Enum, string>(item.Key, item.Value[i.Value]));
}
return results;
}
internal Dictionary<Enum, string> GetAllColumnCollection(int? i)
{
Dictionary<Enum, string> results;
List<KeyValuePair<Enum, string>> keyValuePairs = GetAllColumnKeyValuePairs(i);
results = Merge(keyValuePairs);
return results;
}
private List<KeyValuePair<Enum, List<string>>> GetToolHeadersAndDatabaseHeadersColumnKeyValuePairs()
{
List<KeyValuePair<Enum, List<string>>> results = new List<KeyValuePair<Enum, List<string>>>();
foreach (KeyValuePair<Enum, List<string>> item in Headers)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
return results;
}
internal Dictionary<Enum, List<string>> GetToolHeadersAndDatabaseHeadersCollection()
{
Dictionary<Enum, List<string>> results;
List<KeyValuePair<Enum, List<string>>> keyValuePairs = GetToolHeadersAndDatabaseHeadersColumnKeyValuePairs();
results = Merge(keyValuePairs);
return results;
}
private List<KeyValuePair<Enum, List<string>>> GetToolDetailsAndDatabaseDetailsColumnKeyValuePairs()
{
List<KeyValuePair<Enum, List<string>>> results = new List<KeyValuePair<Enum, List<string>>>();
foreach (KeyValuePair<Enum, List<string>> item in Details)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
results.Add(new KeyValuePair<Enum, List<string>>(item.Key, item.Value));
return results;
}
internal Dictionary<Enum, List<string>> GetToolDetailsAndDatabaseDetailsCollection()
{
Dictionary<Enum, List<string>> results;
List<KeyValuePair<Enum, List<string>>> keyValuePairs = GetToolDetailsAndDatabaseDetailsColumnKeyValuePairs();
results = Merge(keyValuePairs);
return results;
}
internal Dictionary<Test, List<int>> GetTests()
{
Dictionary<Test, List<int>> results = new Dictionary<Test, List<int>>();
Test test;
for (int i = 0; i < RowColumns[Description.RowColumn.Test].Count; i++)
{
test = (Test)RowColumns[Description.RowColumn.Test][i];
if (!results.ContainsKey(test))
results.Add(test, new List<int>());
results[test].Add(i);
}
return results;
}
internal void FillIn(string nullData, int count, Enum[] currentColumns)
{
foreach (Enum column in Headers.Keys)
{
for (int i = Headers[column].Count(); i < count; i++)
Headers[column].Add(nullData);
}
foreach (Enum column in Details.Keys)
{
for (int i = Details[column].Count(); i < count; i++)
Details[column].Add(nullData);
}
if (!(currentColumns is null))
{
foreach (Enum column in currentColumns)
{
for (int i = Parameters[column].Count(); i < count; i++)
Parameters[column].Add(nullData);
}
}
foreach (Enum column in Parameters.Keys)
{
for (int i = Parameters[column].Count(); i < count; i++)
Parameters[column].Add(string.Empty);
}
foreach (Enum column in DatabaseHeaders.Keys)
{
for (int i = DatabaseHeaders[column].Count(); i < count; i++)
DatabaseHeaders[column].Add(string.Empty);
}
foreach (Enum column in DatabaseDetails.Keys)
{
for (int i = DatabaseDetails[column].Count(); i < count; i++)
DatabaseDetails[column].Add(string.Empty);
}
if (RowColumns[Description.RowColumn.Count].Count() != RowColumns[Description.RowColumn.Test].Count())
{
count = RowColumns[Description.RowColumn.Test].Count();
RowColumns[Description.RowColumn.Count].Clear();
for (int i = 0; i < count; i++)
RowColumns[Description.RowColumn.Count].Add(count);
}
}
internal void SetCollections(Logistics logistics, Dictionary<Test, Dictionary<string, List<string>>> rawData)
{
Array array;
Column? column;
bool recordStartPresent = false;
Description.RowColumn? rowColumn;
Description.LogisticsColumn? logisticsColumn;
array = Enum.GetValues(typeof(Description.RowColumn));
Dictionary<string, Enum> headers = new Dictionary<string, Enum>();
Dictionary<string, Enum> details = new Dictionary<string, Enum>();
Dictionary<string, Enum> parameters = new Dictionary<string, Enum>();
Dictionary<string, Enum> databaseHeaders = new Dictionary<string, Enum>();
Dictionary<string, Enum> databaseDetails = new Dictionary<string, Enum>();
Dictionary<Description.RowColumn, List<string>> rowColumns = new Dictionary<Description.RowColumn, List<string>>();
foreach (KeyValuePair<Enum, List<string>> item in Headers)
headers.Add(item.Key.ToString(), item.Key);
foreach (KeyValuePair<Enum, List<string>> item in Details)
details.Add(item.Key.ToString(), item.Key);
foreach (KeyValuePair<Enum, List<string>> item in Parameters)
parameters.Add(item.Key.ToString(), item.Key);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseHeaders)
databaseHeaders.Add(item.Key.ToString(), item.Key);
foreach (KeyValuePair<Enum, List<string>> item in DatabaseDetails)
databaseDetails.Add(item.Key.ToString(), item.Key);
foreach (Description.RowColumn item in array)
rowColumns.Add(item, new List<string>());
foreach (KeyValuePair<Test, Dictionary<string, List<string>>> element in rawData)
{
foreach (KeyValuePair<string, List<string>> item in element.Value)
{
column = null;
rowColumn = null;
logisticsColumn = null;
if (item.Key == "Time")
continue;
else if (item.Key == "A_LOGISTICS")
continue;
else if (item.Key == "B_LOGISTICS")
continue;
else if (item.Key == "EventId")
continue;
else if (item.Key == ProcessDataStandardFormat.RecordStart)
{
recordStartPresent = true;
continue;
}
if (Enum.TryParse(item.Key, out Column columnTry))
column = columnTry;
else
{
if (Enum.TryParse(item.Key, out Description.LogisticsColumn logisticsColumnTry))
logisticsColumn = logisticsColumnTry;
else
{
if (Enum.TryParse(item.Key, out Description.RowColumn rowColumnTry))
rowColumn = rowColumnTry;
}
}
if (rowColumn.HasValue)
rowColumns[rowColumn.Value].AddRange(item.Value);
else if (logisticsColumn.HasValue)
LogisticsColumns[logisticsColumn.Value].AddRange(item.Value);
else if (column.HasValue)
{
if (Headers.ContainsKey(column.Value))
Headers[column.Value].AddRange(item.Value);
else if (Details.ContainsKey(column.Value))
Details[column.Value].AddRange(item.Value);
else if (Parameters.ContainsKey(column.Value))
Parameters[column.Value].AddRange(item.Value);
else if (DatabaseHeaders.ContainsKey(column.Value))
DatabaseHeaders[column.Value].AddRange(item.Value);
else if (DatabaseDetails.ContainsKey(column.Value))
DatabaseDetails[column.Value].AddRange(item.Value);
else
{
if (!recordStartPresent)
throw new Exception();
}
}
else
{
if (headers.ContainsKey(item.Key))
Headers[headers[item.Key]].AddRange(item.Value);
else if (details.ContainsKey(item.Key))
Details[details[item.Key]].AddRange(item.Value);
else if (parameters.ContainsKey(item.Key))
Parameters[parameters[item.Key]].AddRange(item.Value);
else if (databaseHeaders.ContainsKey(item.Key))
DatabaseHeaders[databaseHeaders[item.Key]].AddRange(item.Value);
else if (databaseDetails.ContainsKey(item.Key))
DatabaseDetails[databaseDetails[item.Key]].AddRange(item.Value);
else
{
if (!recordStartPresent)
throw new Exception();
}
}
}
}
foreach (KeyValuePair<Description.RowColumn, List<string>> element in rowColumns)
{
for (int i = 0; i < element.Value.Count(); i++)
{
int.TryParse(element.Value[i], out int rowColumnTry);
RowColumns[element.Key].Add(rowColumnTry);
}
}
array = Enum.GetValues(typeof(Description.RowColumn));
foreach (Description.RowColumn item in array)
{
if (!RowColumns.ContainsKey(item))
throw new Exception();
}
array = Enum.GetValues(typeof(Description.LogisticsColumn));
foreach (Description.LogisticsColumn item in array)
{
if (!LogisticsColumns.ContainsKey(item))
throw new Exception();
}
int count = rowColumns[Description.RowColumn.Test].Count();
foreach (KeyValuePair<Enum, List<string>> element in DatabaseHeaders)
{
for (int i = element.Value.Count(); i < count; i++)
element.Value.Add(string.Empty);
}
foreach (KeyValuePair<Enum, List<string>> element in DatabaseDetails)
{
for (int i = element.Value.Count(); i < count; i++)
element.Value.Add(string.Empty);
}
string nullData;
if (logistics.NullData is null)
nullData = string.Empty;
else
nullData = logistics.NullData.ToString();
Dictionary<Enum, List<string>> keyValuePairs;
foreach (Test key in rawData.Keys)
{
IgnoreIndeices.Add(key, new Dictionary<Enum, List<int>>());
for (int g = 1; g < 4; g++)
{
switch (g)
{
case 1: keyValuePairs = Details; break;
case 2: keyValuePairs = Parameters; break;
case 3: keyValuePairs = DatabaseDetails; break;
default: throw new Exception();
}
foreach (KeyValuePair<Enum, List<string>> element in keyValuePairs)
{
IgnoreIndeices[key].Add(element.Key, new List<int>());
if (!element.Value.Any())
{
for (int i = 0; i < RowColumns[Description.RowColumn.Test].Count(); i++)
{
IgnoreIndeices[key][element.Key].Add(i);
element.Value.Add(string.Empty);
}
}
else
{
for (int i = 0; i < element.Value.Count(); i++)
{
if (RowColumns[Description.RowColumn.Test][i] == (int)key)
{
if (string.IsNullOrEmpty(element.Value[i]))
IgnoreIndeices[key][element.Key].Add(i);
else if (!(logistics.NullData is null) && element.Value[i] == nullData)
IgnoreIndeices[key][element.Key].Add(i);
}
}
}
}
}
}
if (recordStartPresent)
FillIn(string.Empty, RowColumns[Description.RowColumn.Test].Count(), currentColumns: null);
GetCount();
}
internal void UpdateLastTicksDuration(long ticksDuration)
{
if (ticksDuration < 50000000)
ticksDuration = 50000000;
LastTicksDuration = (long)Math.Ceiling(ticksDuration * .667);
}
internal void AutoAdd(Enum key, string value)
{
if (Headers.ContainsKey(key))
Headers[key].Add(value);
else if (Details.ContainsKey(key))
Details[key].Add(value);
else if (Parameters.ContainsKey(key))
Parameters[key].Add(value);
else if (DatabaseHeaders.ContainsKey(key))
DatabaseHeaders[key].Add(value);
else if (DatabaseDetails.ContainsKey(key))
DatabaseDetails[key].Add(value);
else
throw new Exception();
}
}
}

View File

@ -0,0 +1,815 @@
using Adaptation.Eaf.Management.ConfigurationData.CellAutomation;
using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration;
using Adaptation.Shared.Methods;
using log4net;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading;
namespace Adaptation.Shared;
public class FileRead : Properties.IFileRead
{
protected string _NullData;
protected readonly ILog _Log;
protected long _MinFileLength;
protected Logistics _Logistics;
protected readonly ISMTP _SMTP;
protected readonly int _Hyphens;
protected readonly bool _IsEvent;
protected string _ReportFullPath;
protected long _LastTicksDuration;
protected readonly bool _IsEAFHosted;
protected readonly string _EventName;
protected readonly string _MesEntity;
protected readonly string _TracePath;
protected readonly bool _IsDuplicator;
protected readonly Calendar _Calendar;
protected readonly bool _IsSourceTimer;
protected readonly string _VillachPath;
protected readonly string _ProgressPath;
protected readonly string _EquipmentType;
protected readonly long _BreakAfterSeconds;
protected readonly string _ExceptionSubject;
protected readonly string _CellInstanceName;
protected readonly string _EventNameFileRead;
protected readonly IDescription _Description;
protected readonly bool _UseCyclicalForDescription;
protected readonly string _CellInstanceConnectionName;
protected readonly string _CellInstanceConnectionNameBase;
protected readonly Dictionary<string, List<long>> _DummyRuns;
protected readonly Dictionary<string, string> _FileParameter;
protected readonly string _ParameterizedModelObjectDefinitionType;
protected readonly FileConnectorConfiguration _FileConnectorConfiguration;
protected readonly IList<ModelObjectParameterDefinition> _ModelObjectParameterDefinitions;
bool Properties.IFileRead.IsEvent => _IsEvent;
string Properties.IFileRead.NullData => _NullData;
string Properties.IFileRead.EventName => _EventName;
string Properties.IFileRead.MesEntity => _MesEntity;
bool Properties.IFileRead.IsEAFHosted => _IsEAFHosted;
string Properties.IFileRead.EquipmentType => _EquipmentType;
string Properties.IFileRead.ReportFullPath => _ReportFullPath;
string Properties.IFileRead.CellInstanceName => _CellInstanceName;
string Properties.IFileRead.ExceptionSubject => _ExceptionSubject;
bool Properties.IFileRead.UseCyclicalForDescription => _UseCyclicalForDescription;
string Properties.IFileRead.CellInstanceConnectionName => _CellInstanceConnectionName;
string Properties.IFileRead.ParameterizedModelObjectDefinitionType => _ParameterizedModelObjectDefinitionType;
public FileRead(IDescription description, bool isEvent, ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, bool useCyclicalForDescription, bool isEAFHosted)
{
_SMTP = smtp;
_IsEvent = isEvent;
_DummyRuns = dummyRuns;
_LastTicksDuration = 0;
_IsEAFHosted = isEAFHosted;
_Description = description;
_FileParameter = fileParameter;
_ReportFullPath = string.Empty;
_CellInstanceName = cellInstanceName;
_Calendar = new CultureInfo("en-US").Calendar;
_Log = LogManager.GetLogger(typeof(FileRead));
_UseCyclicalForDescription = useCyclicalForDescription;
_CellInstanceConnectionName = cellInstanceConnectionName;
_ModelObjectParameterDefinitions = modelObjectParameters;
_FileConnectorConfiguration = fileConnectorConfiguration;
_ParameterizedModelObjectDefinitionType = parameterizedModelObjectDefinitionType;
_IsSourceTimer = fileConnectorConfiguration.SourceFileFilter.StartsWith("*Timer.txt");
string cellInstanceConnectionNameBase = cellInstanceConnectionName.Replace("-", string.Empty);
_Hyphens = cellInstanceConnectionName.Length - cellInstanceConnectionNameBase.Length;
_ExceptionSubject = string.Concat("Exception:", _CellInstanceConnectionName, _FileConnectorConfiguration?.SourceDirectoryCloaking);
string suffix;
string[] segments = _ParameterizedModelObjectDefinitionType.Split('.');
string @namespace = segments[0];
string eventNameFileRead = "FileRead";
string eventName = segments[segments.Length - 1];
bool isDuplicator = segments[0] == cellInstanceName;
_IsDuplicator = isDuplicator;
_CellInstanceConnectionNameBase = cellInstanceConnectionNameBase;
if (eventName == eventNameFileRead)
suffix = string.Empty;
else
suffix = string.Concat('_', eventName.Split(new string[] { eventNameFileRead }, StringSplitOptions.RemoveEmptyEntries)[1]);
string parameterizedModelObjectDefinitionTypeAppended = string.Concat(@namespace, suffix);
if (!isEAFHosted)
{
// if (string.IsNullOrEmpty(equipmentTypeName) || equipmentTypeName != parameterizedModelObjectDefinitionTypeAppended)
// throw new Exception(cellInstanceConnectionName);
// if (string.IsNullOrEmpty(equipmentDictionaryName) && isEvent)
// throw new Exception(cellInstanceConnectionName);
// if (!string.IsNullOrEmpty(equipmentDictionaryName) && !isEvent)
// throw new Exception(cellInstanceConnectionName);
// if (string.IsNullOrEmpty(equipmentDictionaryName) && !isEvent)
// throw new Exception(cellInstanceConnectionName);
// if (!string.IsNullOrEmpty(equipmentDictionaryName) && isEvent)
// throw new Exception(cellInstanceConnectionName);
}
ModelObjectParameterDefinition[] paths = GetProperties(cellInstanceConnectionName, modelObjectParameters, "Path.");
if (paths.Length < 4)
throw new Exception(cellInstanceConnectionName);
if (isDuplicator)
_MesEntity = string.Empty;
else
_MesEntity = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, string.Concat("CellInstance.", cellInstanceName, ".Alias"));
_TracePath = (from l in paths where l.Name.EndsWith("Trace") select l.Value).FirstOrDefault();
_VillachPath = (from l in paths where l.Name.EndsWith("Villach") select l.Value).FirstOrDefault();
_ProgressPath = (from l in paths where l.Name.EndsWith("Progress") select l.Value).FirstOrDefault();
_EventName = eventName;
_EventNameFileRead = eventNameFileRead;
_EquipmentType = parameterizedModelObjectDefinitionTypeAppended;
long breakAfterSeconds;
if (_FileConnectorConfiguration is null)
breakAfterSeconds = 360;
else
{
if (_FileConnectorConfiguration.FileScanningOption == FileConnectorConfiguration.FileScanningOptionEnum.TimeBased)
breakAfterSeconds = Math.Abs(_FileConnectorConfiguration.FileHandleTimeout.Value);
else if (_FileConnectorConfiguration.FileScanningOption == FileConnectorConfiguration.FileScanningOptionEnum.FileWatcher)
breakAfterSeconds = Math.Abs(_FileConnectorConfiguration.FileScanningIntervalInSeconds.Value);
else
throw new Exception();
}
_BreakAfterSeconds = breakAfterSeconds;
UpdateLastTicksDuration(breakAfterSeconds * 10000000);
if (_IsDuplicator)
{
if (string.IsNullOrEmpty(_FileConnectorConfiguration.TargetFileLocation) || string.IsNullOrEmpty(_FileConnectorConfiguration.ErrorTargetFileLocation))
throw new Exception("_Configuration is empty?");
if (_FileConnectorConfiguration.TargetFileLocation.Contains('%') || _FileConnectorConfiguration.ErrorTargetFileLocation.Contains('%'))
throw new Exception("_Configuration is incorrect for a duplicator!");
// if (_FileConnectorConfiguration is not null)
// {
// if (string.IsNullOrEmpty(_FileConnectorConfiguration.SourceDirectoryCloaking))
// throw new Exception("SourceDirectoryCloaking is empty?");
// if (!_FileConnectorConfiguration.SourceDirectoryCloaking.StartsWith("~"))
// throw new Exception("SourceDirectoryCloaking is incorrect for a duplicator!");
// }
}
}
protected static string GetPropertyValue(string cellInstanceConnectionName, IList<ModelObjectParameterDefinition> modelObjectParameters, string propertyName)
{
string result;
List<string> results = (from l in modelObjectParameters where l.Name == propertyName select l.Value).ToList();
if (results.Count != 1)
throw new Exception(cellInstanceConnectionName);
result = results[0];
return result;
}
protected static ModelObjectParameterDefinition[] GetProperties(string cellInstanceConnectionName, IList<ModelObjectParameterDefinition> modelObjectParameters, string propertyNamePrefix)
{
ModelObjectParameterDefinition[] results = (from l in modelObjectParameters where l.Name.StartsWith(propertyNamePrefix) select l).ToArray();
if (!results.Any())
throw new Exception(cellInstanceConnectionName);
return results;
}
protected static ModelObjectParameterDefinition[] GetProperties(string cellInstanceConnectionName, IList<ModelObjectParameterDefinition> modelObjectParameters, string propertyNamePrefix, string propertyNameSuffix)
{
ModelObjectParameterDefinition[] results = (from l in modelObjectParameters where l.Name.StartsWith(propertyNamePrefix) && l.Name.EndsWith(propertyNameSuffix) select l).ToArray();
if (!results.Any())
throw new Exception(cellInstanceConnectionName);
return results;
}
protected void UpdateLastTicksDuration(long ticksDuration)
{
if (ticksDuration < 50000000)
ticksDuration = 50000000;
_LastTicksDuration = (long)Math.Ceiling(ticksDuration * .667);
}
protected void WaitForThread(Thread thread, List<Exception> threadExceptions)
{
if (thread is not null)
{
ThreadState threadState;
for (short i = 0; i < short.MaxValue; i++)
{
if (thread is null)
break;
else
{
threadState = thread.ThreadState;
if (threadState is not ThreadState.Running and not ThreadState.WaitSleepJoin)
break;
}
Thread.Sleep(500);
}
lock (threadExceptions)
{
if (threadExceptions.Any())
{
foreach (Exception item in threadExceptions)
_Log.Error(string.Concat(item.Message, Environment.NewLine, Environment.NewLine, item.StackTrace));
Exception exception = threadExceptions[0];
threadExceptions.Clear();
throw exception;
}
}
}
}
protected void CreateProgressDirectory(string[] exceptionLines)
{
string progressDirectory;
StringBuilder stringBuilder = new();
if (_Hyphens == 0)
progressDirectory = Path.Combine(_ProgressPath, _CellInstanceConnectionName);
else
{
_ = stringBuilder.Clear();
for (int i = 0; i < _Hyphens; i++)
{
if (i > 0 && (i % 2) == 0)
_ = stringBuilder.Append(' ');
_ = stringBuilder.Append('-');
}
progressDirectory = string.Concat(_ProgressPath, @"\", (_Hyphens + 1).ToString().PadLeft(2, '0'), " ", stringBuilder).Trim();
}
DateTime dateTime = DateTime.Now;
string weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
progressDirectory = string.Concat(progressDirectory, @"\", dateTime.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.MID, "_", _Logistics.Sequence, "_", DateTime.Now.Ticks - _Logistics.Sequence);
if (!Directory.Exists(progressDirectory))
_ = Directory.CreateDirectory(progressDirectory);
if (exceptionLines is not null)
{
string fileName = string.Concat(progressDirectory, @"\readme.txt");
try
{ File.WriteAllLines(fileName, exceptionLines); }
catch (Exception) { }
}
}
protected string[] Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, string to, string from, string resolvedFileLocation, Exception exception)
{
string[] results;
bool isErrorFile = exception is not null;
if (!to.EndsWith(@"\"))
_ = string.Concat(to, @"\");
if (!isErrorFile)
results = Array.Empty<string>();
else
{
results = new string[] { _Logistics.Sequence.ToString(), _Logistics.ReportFullPath, from, resolvedFileLocation, to, string.Empty, string.Empty, exception.Message, string.Empty, string.Empty, exception.StackTrace };
Shared0449(to, results);
}
if (extractResults is not null && extractResults.Item4 is not null && extractResults.Item4.Any())
{
string itemFile;
List<string> directories = new();
foreach (FileInfo sourceFile in extractResults.Item4)
{
if (sourceFile.FullName != _Logistics.ReportFullPath)
{
itemFile = sourceFile.FullName.Replace(from, to);
Shared1880(itemFile, directories, sourceFile, isErrorFile);
}
else if (!isErrorFile && _Logistics is not null)
Shared1811(to, sourceFile);
}
Shared0231(directories);
}
return results;
}
protected static IEnumerable<string> GetDirectoriesRecursively(string path, string directoryNameSegment = null)
{
Queue<string> queue = new();
queue.Enqueue(path);
while (queue.Count > 0)
{
path = queue.Dequeue();
foreach (string subDirectory in Directory.GetDirectories(path))
{
queue.Enqueue(subDirectory);
if (string.IsNullOrEmpty(directoryNameSegment) || Path.GetFileName(subDirectory).Contains(directoryNameSegment))
yield return subDirectory;
}
}
}
protected string GetProcessedDirectory(string progressPath, Logistics logistics, DateTime dateTime, string duplicateDirectory)
{
string result = duplicateDirectory;
string logisticsSequence = logistics.Sequence.ToString();
string[] matchDirectories;
if (!_IsEAFHosted)
matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(logistics.ReportFullPath)) };
else
matchDirectories = new string[] { GetDirectoriesRecursively(Path.GetDirectoryName(progressPath), logisticsSequence).FirstOrDefault() };
if (matchDirectories.Length == 0 || string.IsNullOrEmpty(matchDirectories[0]))
matchDirectories = Directory.GetDirectories(duplicateDirectory, string.Concat('*', logisticsSequence, '*'), SearchOption.AllDirectories);
if ((matchDirectories is null) || matchDirectories.Length != 1)
throw new Exception("Didn't find directory by logistics sequence");
if (!matchDirectories[0].Contains("_processed"))
{
result = string.Concat(matchDirectories[0].Split(new string[] { logisticsSequence }, StringSplitOptions.None)[0], logistics.DateTimeFromSequence.ToString("yyyy-MM-dd_hh;mm_tt_"), dateTime.Ticks - logistics.Sequence, "_processed");
Directory.Move(matchDirectories[0], result);
result = string.Concat(result, @"\", logistics.Sequence);
if (!Directory.Exists(result))
_ = Directory.CreateDirectory(result);
}
return result;
}
protected string WriteScopeInfo(string progressPath, Logistics logistics, DateTime dateTime, string duplicateDirectory, List<Tuple<Properties.IScopeInfo, string>> tuples)
{
string result = GetProcessedDirectory(progressPath, logistics, dateTime, duplicateDirectory);
string tupleFile;
string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath);
string duplicateFile = string.Concat(result, @"\", fileName, ".pdsf");
foreach (Tuple<Properties.IScopeInfo, string> tuple in tuples)
{
if (tuple.Item1.FileName.StartsWith(@"\"))
tupleFile = tuple.Item1.FileName;
else
tupleFile = string.Concat(result, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc");
File.WriteAllText(tupleFile, tuple.Item2);
}
File.Copy(logistics.ReportFullPath, duplicateFile, overwrite: true);
return result;
}
protected static string GetTupleFile(Logistics logistics, Properties.IScopeInfo scopeInfo, string duplicateDirectory)
{
string result;
string rds;
string dateValue;
string datePlaceholder;
string[] segments = logistics.MID.Split('-');
if (segments.Length < 2)
rds = "%RDS%";
else
rds = segments[1];
segments = scopeInfo.FileName.Split(new string[] { "DateTime:" }, StringSplitOptions.RemoveEmptyEntries);
if (segments.Length == 0)
result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileNameWithoutExtension.Replace("%RDS%", rds));
else
{
datePlaceholder = "%DateTime%";
segments = segments[1].Split('%');
dateValue = logistics.DateTimeFromSequence.ToString(segments[0]);
foreach (string segment in scopeInfo.FileName.Split('%'))
{
if (!segment.Contains(segments[0]))
continue;
datePlaceholder = string.Concat('%', segment, '%');
}
result = string.Concat(duplicateDirectory, @"\", scopeInfo.FileName.Replace("%RDS%", rds).Replace(datePlaceholder, dateValue));
}
if (result.Contains('%'))
throw new Exception("Placeholder exists!");
return result;
}
protected void WaitForFileConsumption(string sourceDirectoryCloaking, Logistics logistics, DateTime dateTime, string successDirectory, string duplicateDirectory, string duplicateFile, List<Tuple<Properties.IScopeInfo, string>> tuples)
{
bool check;
long preWait;
string tupleFile;
List<string> duplicateFiles = new();
StringBuilder stringBuilder = new();
List<int> consumedFileIndices = new();
bool moreThanAnHour = _BreakAfterSeconds > 3600;
long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks;
if (moreThanAnHour)
preWait = dateTime.AddSeconds(30).Ticks;
else
preWait = dateTime.AddTicks(_LastTicksDuration).Ticks;
if (!tuples.Any())
duplicateFiles.Add(duplicateFile);
string fileName = Path.GetFileNameWithoutExtension(logistics.ReportFullPath);
string successFile = string.Concat(successDirectory, @"\", Path.GetFileName(logistics.ReportFullPath));
foreach (Tuple<Properties.IScopeInfo, string> tuple in tuples)
{
if (tuple.Item1.FileName.StartsWith(@"\"))
tupleFile = tuple.Item1.FileName;
else if (!tuple.Item1.FileName.Contains('%'))
tupleFile = string.Concat(duplicateDirectory, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc");
else
tupleFile = GetTupleFile(logistics, tuple.Item1, duplicateDirectory);
duplicateFiles.Add(tupleFile);
File.WriteAllText(tupleFile, tuple.Item2);
}
for (short i = 0; i < short.MaxValue; i++)
{
if (DateTime.Now.Ticks > preWait)
break;
Thread.Sleep(500);
}
if (!moreThanAnHour)
{
for (short z = 0; z < short.MaxValue; z++)
{
try
{
check = string.IsNullOrEmpty(successDirectory) || File.Exists(successFile);
if (check)
{
consumedFileIndices.Clear();
for (int i = 0; i < duplicateFiles.Count; i++)
{
if (!File.Exists(duplicateFiles[i]))
consumedFileIndices.Add(i);
}
if (consumedFileIndices.Count == duplicateFiles.Count)
break;
}
}
catch (Exception) { }
if (DateTime.Now.Ticks > breakAfter)
{
for (int i = 0; i < duplicateFiles.Count; i++)
{
if (File.Exists(duplicateFiles[i]))
{
try
{ File.Delete(duplicateFiles[i]); }
catch (Exception) { }
_ = stringBuilder.Append('<').Append(duplicateFiles[i]).Append("> ");
}
}
throw new Exception(string.Concat("After {", _BreakAfterSeconds, "} seconds, right side of {", sourceDirectoryCloaking, "} didn't consume file(s) ", stringBuilder));
}
Thread.Sleep(500);
}
}
}
protected void SetFileParameter(string key, string value)
{
if (_FileConnectorConfiguration is null || _FileConnectorConfiguration.TargetFileLocation.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.ErrorTargetFileLocation.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.TargetFileName.Contains(string.Concat("%", key, "%")) || _FileConnectorConfiguration.ErrorTargetFileName.Contains(string.Concat("%", key, "%")))
{
if (_FileParameter.ContainsKey(key))
_FileParameter[key] = value;
else
_FileParameter.Add(key, value);
}
}
protected void SetFileParameterLotIDToLogisticsMID(bool includeLogisticsSequence = true)
{
string key;
if (!includeLogisticsSequence)
key = "LotID";
else
key = "LotIDWithLogisticsSequence";
string value = string.Concat(_Logistics.MID, "_", _Logistics.Sequence, "_", DateTime.Now.Ticks - _Logistics.Sequence);
SetFileParameter(key, value);
}
protected void SetFileParameterLotID(string value, bool includeLogisticsSequence = true)
{
string key;
if (!includeLogisticsSequence)
key = "LotID";
else
{
key = "LotIDWithLogisticsSequence";
value = string.Concat(value, "_", _Logistics.Sequence, "_", DateTime.Now.Ticks - _Logistics.Sequence);
}
SetFileParameter(key, value);
}
protected void WritePDSF(IFileRead fileRead, JsonElement[] jsonElements)
{
string directory;
if (!_CellInstanceConnectionName.StartsWith(_CellInstanceName) && _CellInstanceConnectionNameBase == _EquipmentType)
directory = Path.Combine(_VillachPath, _EquipmentType, "Target");
else
directory = Path.Combine(_TracePath, _EquipmentType, "Source", _CellInstanceName, _CellInstanceConnectionName);
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
string file = Path.Combine(directory, string.Concat(_Logistics.MesEntity, "_", _Logistics.Sequence, ".ipdsf"));
string lines = ProcessDataStandardFormat.GetPDSFText(fileRead, _Logistics, jsonElements, logisticsText: string.Empty);
File.WriteAllText(file, lines);
if (_Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600)
{
try
{ File.SetLastWriteTime(file, _Logistics.DateTimeFromSequence); }
catch (Exception) { }
}
}
protected void Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception)
{
bool isErrorFile = exception is not null;
if (!isErrorFile && _IsDuplicator)
{
if (_IsEAFHosted && !string.IsNullOrEmpty(_ProgressPath))
CreateProgressDirectory(exceptionLines: null);
}
if (!_IsEAFHosted)
{
string to;
if (!_FileConnectorConfiguration.TargetFileLocation.EndsWith(Path.DirectorySeparatorChar.ToString()))
to = _FileConnectorConfiguration.TargetFileLocation;
else
to = Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation);
foreach (KeyValuePair<string, string> keyValuePair in _FileParameter)
to = to.Replace(string.Concat('%', keyValuePair.Key, '%'), keyValuePair.Value);
if (to.Contains('%'))
_Log.Debug("Can't debug without EAF Hosting");
else
_ = Move(extractResults, to, _FileConnectorConfiguration.SourceFileLocation, resolvedFileLocation: string.Empty, exception: null);
}
}
protected void TriggerEvents(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, List<string> headerNames, Dictionary<string, string> keyValuePairs)
{
object value;
string description;
List<object[]> list;
for (int i = 0; i < extractResults.Item3.Length; i++)
{
_Log.Debug(string.Concat("TriggerEvent - {", _Logistics.ReportFullPath, "} ", i, " of ", extractResults.Item3.Length));
foreach (JsonProperty jsonProperty in extractResults.Item3[i].EnumerateObject())
{
if (jsonProperty.Value.ValueKind != JsonValueKind.String || !keyValuePairs.ContainsKey(jsonProperty.Name))
description = string.Empty;
else
description = keyValuePairs[jsonProperty.Name].Split('|')[0];
if (!_UseCyclicalForDescription || headerNames.Contains(jsonProperty.Name))
value = jsonProperty.Value.ToString();
else
{
list = new List<object[]>();
for (int z = 0; z < extractResults.Item3.Length; z++)
list.Add(new object[] { z, extractResults.Item3[z].GetProperty(jsonProperty.Name).ToString() });
value = list;
}
}
if (_UseCyclicalForDescription)
break;
}
}
protected Tuple<string, Test[], JsonElement[], List<FileInfo>> ReExtract(IFileRead fileRead, List<string> headerNames, Dictionary<string, string> keyValuePairs)
{
Tuple<string, Test[], JsonElement[], List<FileInfo>> results;
if (!Directory.Exists(_FileConnectorConfiguration.SourceFileLocation))
results = null;
else
{
string[] segments;
string[] matches = null;
foreach (string subSourceFileFilter in _FileConnectorConfiguration.SourceFileFilters)
{
segments = subSourceFileFilter.Split('\\');
if (_FileConnectorConfiguration.IncludeSubDirectories.Value)
matches = Directory.GetFiles(_FileConnectorConfiguration.SourceFileLocation, segments.Last(), SearchOption.AllDirectories);
else
matches = Directory.GetFiles(_FileConnectorConfiguration.SourceFileLocation, segments.Last(), SearchOption.TopDirectoryOnly);
if (matches.Any())
break;
}
if (matches is null || !matches.Any())
results = null;
else
{
_ReportFullPath = matches[0];
results = fileRead.GetExtractResult(_ReportFullPath, _EventName);
if (!_IsEAFHosted)
TriggerEvents(results, headerNames, keyValuePairs);
}
}
return results;
}
protected static Dictionary<Test, List<Properties.IDescription>> GetKeyValuePairs(List<Properties.IDescription> descriptions)
{
Dictionary<Test, List<Properties.IDescription>> results = new();
Test testKey;
for (int i = 0; i < descriptions.Count; i++)
{
testKey = (Test)descriptions[i].Test;
if (!results.ContainsKey(testKey))
results.Add(testKey, new List<Properties.IDescription>());
results[testKey].Add(descriptions[i]);
}
return results;
}
protected static List<Properties.IDescription> GetDuplicatorDescriptions(JsonElement[] jsonElements)
{
List<Properties.IDescription> results = new();
Duplicator.Description description;
JsonSerializerOptions jsonSerializerOptions = new() { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString };
foreach (JsonElement jsonElement in jsonElements)
{
if (jsonElement.ValueKind != JsonValueKind.Object)
throw new Exception();
description = JsonSerializer.Deserialize<Duplicator.Description>(jsonElement.ToString(), jsonSerializerOptions);
results.Add(description);
}
return results;
}
protected static Tuple<Test[], Dictionary<Test, List<Properties.IDescription>>> GetTuple(IFileRead fileRead, IEnumerable<Properties.IDescription> descriptions, bool extra = false)
{
Tuple<Test[], Dictionary<Test, List<Properties.IDescription>>> result;
Dictionary<Test, List<Properties.IDescription>> keyValuePairs = GetKeyValuePairs(descriptions.ToList());
Test[] tests = (from l in keyValuePairs select l.Key).ToArray();
fileRead.CheckTests(tests, extra);
result = new Tuple<Test[], Dictionary<Test, List<Properties.IDescription>>>(tests, keyValuePairs);
return result;
}
protected void Shared0449(string to, string[] exceptionLines)
{
if (_IsDuplicator)
CreateProgressDirectory(exceptionLines: null);
else
{
string fileName = string.Concat(to, @"\readme.txt");
try
{
if (!Directory.Exists(to))
_ = Directory.CreateDirectory(to);
File.WriteAllLines(fileName, exceptionLines);
}
catch (Exception ex) { _Log.Error(ex.Message); }
}
}
protected void Shared1880(string itemFile, List<string> directories, FileInfo sourceFile, bool isErrorFile)
{
string itemDirectory;
directories.Add(Path.GetDirectoryName(sourceFile.FullName));
itemDirectory = Path.GetDirectoryName(itemFile);
FileConnectorConfiguration.PostProcessingModeEnum processingModeEnum;
if (!isErrorFile)
processingModeEnum = _FileConnectorConfiguration.PostProcessingMode.Value;
else
processingModeEnum = _FileConnectorConfiguration.ErrorPostProcessingMode.Value;
if (processingModeEnum != FileConnectorConfiguration.PostProcessingModeEnum.Delete && !Directory.Exists(itemDirectory))
{
_ = Directory.CreateDirectory(itemDirectory);
FileInfo fileInfo = new(_Logistics.ReportFullPath);
Directory.SetCreationTime(itemDirectory, fileInfo.LastWriteTime);
}
if (_IsEAFHosted)
{
switch (processingModeEnum)
{
case FileConnectorConfiguration.PostProcessingModeEnum.Move:
File.Move(sourceFile.FullName, itemFile);
break;
case FileConnectorConfiguration.PostProcessingModeEnum.Copy:
File.Copy(sourceFile.FullName, itemFile);
break;
case FileConnectorConfiguration.PostProcessingModeEnum.Delete:
File.Delete(sourceFile.FullName);
break;
default:
throw new Exception();
}
}
}
protected void Shared1811(string to, FileInfo sourceFile)
{
if (!_IsDuplicator && _FileConnectorConfiguration.SourceFileFilter != "*" && sourceFile.Exists && sourceFile.Length < _MinFileLength)
{
string directoryName = Path.GetFileName(to);
string jobIdDirectory = Path.GetDirectoryName(to);
DateTime dateTime = DateTime.Now.AddMinutes(-15);
string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00");
string weekDirectory = string.Concat(_Logistics.DateTimeFromSequence.ToString("yyyy"), "_Week_", weekOfYear, @"\", _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd"));
string destinationDirectory = string.Concat(jobIdDirectory, @"\_ Ignore 100 bytes\", weekDirectory, @"\", directoryName);
if (!Directory.Exists(destinationDirectory))
_ = Directory.CreateDirectory(destinationDirectory);
File.Move(sourceFile.FullName, string.Concat(destinationDirectory, @"\", sourceFile.Name));
try
{
string[] checkDirectories = Directory.GetDirectories(jobIdDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string checkDirectory in checkDirectories)
{
if (!checkDirectory.Contains('_'))
continue;
if (Directory.GetDirectories(checkDirectory, "*", SearchOption.TopDirectoryOnly).Any())
continue;
if (Directory.GetFiles(checkDirectory, "*", SearchOption.TopDirectoryOnly).Any())
continue;
if (Directory.GetDirectories(checkDirectory, "*", SearchOption.AllDirectories).Any())
continue;
if (Directory.GetFiles(checkDirectory, "*", SearchOption.AllDirectories).Any())
continue;
if (new DirectoryInfo(checkDirectory).CreationTime > dateTime)
continue;
Directory.Delete(checkDirectory, recursive: false);
}
}
catch (Exception) { throw; }
}
}
protected void Shared0231(List<string> directories)
{
if (_FileConnectorConfiguration.PostProcessingMode != FileConnectorConfiguration.PostProcessingModeEnum.Copy)
{
foreach (string directory in (from l in directories orderby l.Split('\\').Length descending select l).Distinct())
{
if (Directory.Exists(directory) && !Directory.GetFiles(directory).Any())
Directory.Delete(directory);
}
}
}
protected void Shared0413(DateTime dateTime, bool isDummyRun, string successDirectory, string duplicateDirectory, List<Tuple<Properties.IScopeInfo, string>> tuples, string duplicateFile)
{
if (!isDummyRun && _IsEAFHosted)
WaitForFileConsumption(_FileConnectorConfiguration.SourceDirectoryCloaking, _Logistics, dateTime, successDirectory, duplicateDirectory, duplicateFile, tuples);
else
{
long breakAfter = DateTime.Now.AddSeconds(_FileConnectorConfiguration.ConnectionRetryInterval.Value).Ticks;
for (short i = 0; i < short.MaxValue; i++)
{
if (!_IsEAFHosted || DateTime.Now.Ticks > breakAfter)
break;
Thread.Sleep(500);
}
}
}
protected static void Shared0607(string reportFullPath, string duplicateDirectory, string logisticsSequence, string destinationDirectory)
{
if (destinationDirectory == duplicateDirectory)
throw new Exception("Check Target File Folder for %LotIDWithLogisticsSequence%_in process on CI (not Duplicator)");
if (destinationDirectory.EndsWith(logisticsSequence))
destinationDirectory = Path.GetDirectoryName(destinationDirectory);
string[] deleteFiles = Directory.GetFiles(destinationDirectory, "*", SearchOption.AllDirectories);
if (deleteFiles.Length > 250)
throw new Exception("Safety net!");
foreach (string file in deleteFiles)
File.Delete(file);
Directory.Delete(destinationDirectory, recursive: true);
File.Delete(reportFullPath);
}
protected string[] Shared1567(string reportFullPath, List<Tuple<Properties.IScopeInfo, string>> tuples)
{
string[] results;
string historicalText;
string logisticsSequence = _Logistics.Sequence.ToString();
string jobIdDirectory = string.Concat(Path.GetDirectoryName(Path.GetDirectoryName(_FileConnectorConfiguration.TargetFileLocation)), @"\", _Logistics.JobID);
if (!Directory.Exists(jobIdDirectory))
_ = Directory.CreateDirectory(jobIdDirectory);
string[] matchDirectories;
if (!_IsEAFHosted)
matchDirectories = new string[] { Path.GetDirectoryName(Path.GetDirectoryName(reportFullPath)) };
else
matchDirectories = Directory.GetDirectories(jobIdDirectory, string.Concat(_Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly);
if ((matchDirectories is null) || matchDirectories.Length != 1)
throw new Exception("Didn't find directory by logistics sequence");
string fileName = Path.GetFileNameWithoutExtension(reportFullPath);
string sequenceDirectory = string.Concat(matchDirectories[0], @"\", logisticsSequence);
if (!Directory.Exists(sequenceDirectory))
_ = Directory.CreateDirectory(sequenceDirectory);
foreach (Tuple<Properties.IScopeInfo, string> tuple in tuples)
{
fileName = string.Concat(sequenceDirectory, @"\", fileName, "_", tuple.Item1.FileNameWithoutExtension, ".pdsfc");
if (_IsEAFHosted)
File.WriteAllText(fileName, tuple.Item2);
else
{
if (File.Exists(fileName))
{
historicalText = File.ReadAllText(fileName);
if (tuple.Item2 != historicalText)
throw new Exception("File doesn't match historical!");
}
}
}
results = matchDirectories;
return results;
}
protected void Shared1277(string reportFullPath, string destinationDirectory, string logisticsSequence, string jobIdDirectory, string json)
{
string ecCharacterizationSi = Path.GetDirectoryName(Path.GetDirectoryName(jobIdDirectory));
string destinationJobIdDirectory = string.Concat(ecCharacterizationSi, @"\Processed\", _Logistics.JobID);
if (!Directory.Exists(destinationJobIdDirectory))
_ = Directory.CreateDirectory(destinationJobIdDirectory);
destinationJobIdDirectory = string.Concat(destinationJobIdDirectory, @"\", Path.GetFileName(destinationDirectory).Split(new string[] { logisticsSequence }, StringSplitOptions.None)[0], _Logistics.DateTimeFromSequence.ToString("yyyy-MM-dd_hh;mm_tt_"), DateTime.Now.Ticks - _Logistics.Sequence);
string sequenceDirectory = string.Concat(destinationJobIdDirectory, @"\", logisticsSequence);
string jsonFileName = string.Concat(sequenceDirectory, @"\", Path.GetFileNameWithoutExtension(reportFullPath), ".json");
Directory.Move(destinationDirectory, destinationJobIdDirectory);
if (!Directory.Exists(sequenceDirectory))
_ = Directory.CreateDirectory(sequenceDirectory);
File.Copy(reportFullPath, string.Concat(sequenceDirectory, @"\", Path.GetFileName(reportFullPath)), overwrite: true);
File.WriteAllText(jsonFileName, json);
}
}
// 2022-05-13 -> Shared - FileRead

View File

@ -1,16 +0,0 @@
using Adaptation.Shared.Metrology;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
namespace Adaptation.Shared
{
public interface IProcessData
{
Tuple<string, JsonElement?, List<FileInfo>> GetResults(ILogic logic, ConfigDataBase configData, List<FileInfo> fileInfoCollection);
}
}

View File

@ -1,26 +0,0 @@
using Adaptation.Shared.Metrology;
using System.Collections.Generic;
namespace Adaptation.Shared
{
public interface IProcessDataDescription
{
int Test { get; set; }
int Count { get; set; }
int Index { get; set; }
IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase);
IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase);
List<IProcessDataDescription> GetDescription(ILogic logic, ConfigDataBase configDataBase, List<Test> tests, IProcessData iProcessData);
List<string> GetDetailNames(ILogic logic, ConfigDataBase configDataBase);
List<string> GetHeaderNames(ILogic logic, ConfigDataBase configDataBase);
List<string> GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test);
List<string> GetNames(ILogic logic, ConfigDataBase configDataBase);
List<string> GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase);
List<string> GetParameterNames(ILogic logic, ConfigDataBase configDataBase);
string GetEventDescription();
}
}

View File

@ -1,239 +0,0 @@
using Adaptation.Shared.Metrology;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Adaptation.Shared
{
internal class IQSRecord
{
public string SID { get; protected set; }
public string Part { get; protected set; }
public string Process { get; protected set; }
public string Lot { get; protected set; }
public string SampleSize { get; protected set; }
public string ParameterName { get; protected set; }
public string TestNumber { get; protected set; }
public string ParameterValue { get; protected set; }
public string WaferID { get; protected set; }
public string WaferScribe { get; protected set; }
public string Pocket { get; protected set; }
public string EpiThicknessMean { get; protected set; }
public string WaferRegion { get; protected set; }
public string ToolID { get; protected set; }
public string EmployeeID { get; protected set; }
public string EmployeeName { get; protected set; }
public string Date { get; protected set; }
public Column Column { get; protected set; }
public IQSRecord(object sID, object part, object process, object lot, object sampleSize, object parameterName, object testNumber, object parameterValue, object waferID, object waferScribe, object pocket, object epiThicknessMean, object waferRegion, object toolID, object employeeID, object employeeName, object date, Dictionary<string, Column> keyValuePairs)
{
if (sID is null)
SID = string.Empty;
else
SID = sID.ToString();
if (part is null)
Part = string.Empty;
else
Part = part.ToString();
if (process is null)
Process = string.Empty;
else
Process = process.ToString();
if (lot is null)
Lot = string.Empty;
else
Lot = lot.ToString();
if (sampleSize is null)
SampleSize = string.Empty;
else
SampleSize = sampleSize.ToString();
if (parameterName is null)
ParameterName = string.Empty;
else
ParameterName = parameterName.ToString();
if (testNumber is null)
TestNumber = string.Empty;
else
TestNumber = testNumber.ToString();
if (parameterValue is null)
ParameterValue = string.Empty;
else
ParameterValue = parameterValue.ToString();
if (waferID is null)
WaferID = string.Empty;
else
WaferID = waferID.ToString();
if (waferScribe is null)
WaferScribe = string.Empty;
else
WaferScribe = waferScribe.ToString();
if (pocket is null)
Pocket = string.Empty;
else
Pocket = pocket.ToString();
if (epiThicknessMean is null)
EpiThicknessMean = string.Empty;
else
EpiThicknessMean = epiThicknessMean.ToString();
if (waferRegion is null)
WaferRegion = string.Empty;
else
WaferRegion = waferRegion.ToString();
if (toolID is null)
ToolID = string.Empty;
else
ToolID = toolID.ToString();
if (employeeID is null)
EmployeeID = string.Empty;
else
EmployeeID = employeeID.ToString();
if (employeeName is null)
EmployeeName = string.Empty;
else
EmployeeName = employeeName.ToString();
if (date is null)
Date = string.Empty;
else
Date = date.ToString();
if (parameterName is null || !keyValuePairs.ContainsKey(parameterName.ToString()))
Column = Column.AFM_Roughness;
else
Column = keyValuePairs[parameterName.ToString()];
}
private static string GetBaseTableJoins()
{
StringBuilder result = new StringBuilder();
result.Append(" from [irmnspc].[dbo].sgrp_ext se ").
Append(" join [irmnspc].[dbo].test_dat td on se.f_test = td.f_test ").
Append(" join [irmnspc].[dbo].part_dat pd on se.f_part = pd.f_part ").
Append(" join [irmnspc].[dbo].part_lot pl on se.f_lot = pl.f_lot ").
Append(" join [irmnspc].[dbo].prcs_dat pr on se.f_prcs = pr.f_prcs ").
Append(" join [irmnspc].[dbo].empl_inf em on se.f_empl = em.f_empl ");
return result.ToString();
}
internal static StringBuilder GetIqsRecordsSinceSql()
{
StringBuilder result = new StringBuilder();
result.Append(" select ").
Append(" se.f_sgrp [sid], concat(se.f_sgrp, ', ', td.f_name, ', ', pd.f_name, ', ', pl.f_name, ', ', pr.f_name, ', ', em.f_name, ', ', se.f_sgtm) [csv] ").
Append(GetBaseTableJoins()).
Append(" where se.f_sgrp >= 1543459064 ").
Append(" and se.f_sgrp > ( @lastSID - 20 ) ").
Append(" /* and dateadd(hh, -7, (dateadd(ss, convert(bigint, se.f_sgtm), '19700101'))) >= '2019-08-25 00:00:00.000' */ ").
Append(" and td.f_name = @key ").
Append(" group by se.f_sgrp, td.f_name, pd.f_name, pl.f_name, pr.f_name, em.f_name, se.f_sgtm ").
Append(" order by se.f_sgrp, pd.f_name, td.f_name ");
return result;
}
internal static StringBuilder GetIqsRecordsSql()
{
StringBuilder result = new StringBuilder();
result.Append(" select ").
Append(" ta.id [SID], ").
Append(" ta.ms [Part], ").
Append(" ta.pr [Process], ").
Append(" ta.lt [Lot], ").
Append(" ta.sz [Sample Size], ").
Append(" ta.pn [Parameter Name], ").
Append(" ta.tn [Test Number], ").
Append(" ta.pv [Parameter Value], ").
Append(" tb.v1337859646 [Wafer ID], ").
Append(" tb.v1337859592 [Wafer Scribe], ").
Append(" tb.v1342510661 [Pocket], ").
Append(" tb.v1340294286 [Epi Thickness Mean], ").
Append(" tb.v1345566180 [Wafer Region], ").
Append(" tb.v1363881711 [Tool ID], ").
Append(" ta.em [Employee ID], ").
Append(" ta.en [Employee Name], ").
Append(" ta.dt [Date] ").
Append(" from ( ").
Append(" select ").
Append(" se.f_sgrp id, ").
Append(" se.f_sgsz sz, ").
Append(" concat(se.f_tsno, '.', se.f_sbno) tn, ").
Append(" se.f_val pv, ").
Append(" se.f_empl em, ").
Append(" dateadd(hh, -7, (dateadd(ss, convert(bigint, se.f_sgtm), '19700101'))) dt, ").
Append(" td.f_name pn, ").
Append(" pd.f_name as ms, ").
Append(" pl.f_name lt, ").
Append(" pr.f_name pr, ").
Append(" em.f_name en ").
Append(GetBaseTableJoins()).
Append(" where se.f_sgrp = @sid ").
Append(" ) as ta ").
Append(" join ( ").
Append(" select ").
Append(" se.f_sgrp id, ").
Append(" max(case when dd.f_dsgp = 1337859646 then dd.f_name end) as v1337859646, ").
Append(" max(case when dd.f_dsgp = 1337859592 then dd.f_name end) as v1337859592, ").
Append(" max(case when dd.f_dsgp = 1342510661 then dd.f_name end) as v1342510661, ").
Append(" max(case when dd.f_dsgp = 1340294286 then dd.f_name end) as v1340294286, ").
Append(" max(case when dd.f_dsgp = 1345566180 then dd.f_name end) as v1345566180, ").
Append(" max(case when dd.f_dsgp = 1363881711 then dd.f_name end) as v1363881711 ").
Append(" from [irmnspc].[dbo].sgrp_ext se ").
Append(" join [irmnspc].[dbo].test_dat td on se.f_test = td.f_test ").
Append(" join [irmnspc].[dbo].sgrp_dsc sd on se.f_sgrp = sd.f_sgrp ").
Append(" join [irmnspc].[dbo].desc_dat dd on sd.f_desc = dd.f_desc ").
Append(" and isnull(dd.f_name, '') <> '' ").
Append(" where se.f_sgrp = @sid ").
Append(" and dd.f_dsgp in (1337859646 /* Wafer ID */, 1337859592 /* Wafer Scribe */, 1342510661 /* Pocket */, 1340294286 /* Epi Thickness Mean */, 1345566180 /* Wafer Region */, 1363881711 /* Tool ID */) ").
Append(" group by se.f_sgrp ").
Append(" ) tb on ta.id = tb.id ").
Append(" order by ta.id desc, ta.ms, ta.pr, ta.lt, ta.sz, ta.tn, ta.dt, ta.pn ");
return result;
}
internal static List<IQSRecord> GetIqsRecords(Dictionary<int, List<object>> rawData, int count)
{
List<IQSRecord> results = new List<IQSRecord>();
IQSRecord iqsRecord;
List<object> c0 = rawData[0];
List<object> c1 = rawData[1];
List<object> c2 = rawData[2];
List<object> c3 = rawData[3];
List<object> c4 = rawData[4];
List<object> c5 = rawData[5];
List<object> c6 = rawData[6];
List<object> c7 = rawData[7];
List<object> c8 = rawData[8];
List<object> c9 = rawData[9];
List<object> cA = rawData[10];
List<object> cB = rawData[11];
List<object> cC = rawData[12];
List<object> cD = rawData[13];
List<object> cE = rawData[14];
List<object> cF = rawData[15];
List<object> cG = rawData[16];
if (c0.Any())
{
Array array = Enum.GetValues(typeof(Column));
Dictionary<string, Column> keyValuePairs = new Dictionary<string, Column>();
foreach (Column column in array)
keyValuePairs.Add(column.GetDiplayName(), column);
for (int i = 0; i < c0.Count; i++)
{
iqsRecord = new IQSRecord(c0[i], c1[i], c2[i], c3[i], c4[i], c5[i], c6[i], c7[i], c8[i], c9[i], cA[i], cB[i], cC[i], cD[i], cE[i], cF[i], cG[i], keyValuePairs);
results.Add(iqsRecord);
}
}
return results;
}
public override string ToString()
{
//(1337859646 /* Wafer ID */, 1337859592 /* Wafer Scribe */, 1342510661 /* Pocket */, 1340294286 /* Epi Thickness Mean */, 1345566180 /* Wafer Region */, 1363881711 /* Tool ID */) ").
//return string.Concat(SID, Part, Process, Lot, SampleSize, TestNumber, WaferID, WaferScribe, Pocket, EpiThicknessMean, WaferRegion, ToolID, EmployeeID, EmployeeName, Date);
return string.Concat(SID, Part, Process, Lot, SampleSize, TestNumber, EmployeeID, EmployeeName, Date);
}
}
}

View File

@ -1,21 +0,0 @@
using System;
namespace Adaptation.Shared
{
public interface IScopeInfo
{
Enum Enum { get; }
string HTML { get; }
string Title { get; }
string FileName { get; }
int TestValue { get; }
string Header { get; }
string QueryFilter { get; }
string FileNameWithoutExtension { get; }
EquipmentType EquipmentType { get; }
}
}

View File

@ -1,171 +0,0 @@
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Shared
{
public class IsEnvironment
{
public enum Name
{
LinuxDevelopment,
LinuxProduction,
LinuxStaging,
OSXDevelopment,
OSXProduction,
OSXStaging,
WindowsDevelopment,
WindowsProduction,
WindowsStaging
}
public bool DebuggerWasAttachedDuringConstructor { get; private set; }
public bool Development { get; private set; }
public bool Linux { get; private set; }
public bool OSX { get; private set; }
public bool Production { get; private set; }
public bool Staging { get; private set; }
public bool Windows { get; private set; }
public string Profile { get; private set; }
public string AppSettingsFileName { get; private set; }
public string ASPNetCoreEnvironment { get; private set; }
public IsEnvironment(string testCategory)
{
if (testCategory.EndsWith(".json"))
{
Production = testCategory == "appsettings.json";
Staging = testCategory.EndsWith(nameof(Staging));
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
Development = testCategory.EndsWith(nameof(Development));
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
}
else
{
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
OSX = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(OSX));
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Linux = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Linux));
Staging = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Staging));
Windows = !string.IsNullOrEmpty(testCategory) && testCategory.StartsWith(nameof(Windows));
Production = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Production));
Development = !string.IsNullOrEmpty(testCategory) && testCategory.EndsWith(nameof(Development));
}
Profile = GetProfile();
AppSettingsFileName = GetAppSettingsFileName(processesCount: null);
}
public IsEnvironment(bool isDevelopment, bool isStaging, bool isProduction)
{
Staging = isStaging;
Production = isProduction;
Development = isDevelopment;
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Profile = GetProfile();
AppSettingsFileName = GetAppSettingsFileName(processesCount: null);
}
public IsEnvironment(int? processesCount, bool nullASPNetCoreEnvironmentIsDevelopment, bool nullASPNetCoreEnvironmentIsProduction)
{
OSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
Linux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
DebuggerWasAttachedDuringConstructor = Debugger.IsAttached;
Windows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
ASPNetCoreEnvironment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (nullASPNetCoreEnvironmentIsDevelopment && nullASPNetCoreEnvironmentIsProduction)
throw new Exception();
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsProduction)
Production = true;
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && nullASPNetCoreEnvironmentIsDevelopment)
Development = true;
else if (string.IsNullOrEmpty(ASPNetCoreEnvironment) && !nullASPNetCoreEnvironmentIsDevelopment && !nullASPNetCoreEnvironmentIsProduction)
throw new Exception();
else
{
Staging = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Staging));
Production = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Production));
Development = ASPNetCoreEnvironment is not null && ASPNetCoreEnvironment.EndsWith(nameof(Development));
}
Profile = GetProfile();
AppSettingsFileName = GetAppSettingsFileName(processesCount);
}
private string GetProfile()
{
string result;
if (Windows && Production)
result = nameof(Production);
else if (Windows && Staging)
result = nameof(Staging);
else if (Windows && Development)
result = nameof(Development);
else if (Linux && Production)
result = nameof(Name.LinuxProduction);
else if (Linux && Staging)
result = nameof(Name.LinuxStaging);
else if (Linux && Development)
result = nameof(Name.LinuxDevelopment);
else if (OSX && Production)
result = nameof(Name.OSXProduction);
else if (OSX && Staging)
result = nameof(Name.OSXStaging);
else if (OSX && Development)
result = nameof(Name.OSXDevelopment);
else
throw new Exception();
return result;
}
private string GetAppSettingsFileName(int? processesCount)
{
string result;
if (Production)
{
if (processesCount is null)
result = "appsettings.json";
else
result = $"appsettings.{processesCount}.json";
}
else
{
string environment;
if (Staging)
environment = nameof(Staging);
else if (Development)
environment = nameof(Development);
else
throw new Exception();
if (processesCount is null)
result = $"appsettings.{environment}.json";
else
result = $"appsettings.{environment}.{processesCount}.json";
}
return result;
}
public static string GetEnvironmentName(IsEnvironment isEnvironment)
{
string result;
if (isEnvironment.Windows)
result = nameof(IsEnvironment.Windows);
else if (isEnvironment.Linux)
result = nameof(IsEnvironment.Linux);
else if (isEnvironment.OSX)
result = nameof(IsEnvironment.OSX);
else
throw new Exception();
return result;
}
}
}

View File

@ -1,242 +1,208 @@
using System;
using Adaptation.Shared.Methods;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Adaptation.Shared
namespace Adaptation.Shared;
public class Logistics : ILogistics
{
public class Logistics
public object NullData { get; private set; }
public string JobID { get; private set; } //CellName
public long Sequence { get; private set; } //Ticks
public DateTime DateTimeFromSequence { get; private set; }
public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; }
public string MesEntity { get; private set; } //SPC
public string ReportFullPath { get; private set; } //Extract file
public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics)
public string MID { get; set; } //Lot & Pocket || Lot
public List<string> Tags { get; set; }
public List<string> Logistics1 { get; set; }
public List<Logistics2> Logistics2 { get; set; }
public Logistics(IFileRead fileRead)
{
DateTime dateTime = DateTime.Now;
NullData = null;
Sequence = dateTime.Ticks;
DateTimeFromSequence = dateTime;
JobID = fileRead.CellInstanceName;
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
MesEntity = DefaultMesEntity(dateTime);
ReportFullPath = string.Empty;
ProcessJobID = nameof(ProcessJobID);
MID = nameof(MID);
Tags = new List<string>();
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
Logistics2 = new List<Logistics2>();
}
public object NullData { get; private set; }
public string JobID { get; private set; } //CellName
public long Sequence { get; private set; } //Ticks
public DateTime DateTimeFromSequence { get; private set; }
public double TotalSecondsSinceLastWriteTimeFromSequence { get; private set; }
public string MesEntity { get; private set; } //SPC
public string ReportFullPath { get; private set; } //Extract file
public string ProcessJobID { get; internal set; } //Reactor (duplicate but I want it in the logistics)
public string MID { get; internal set; } //Lot & Pocket || Lot
public List<string> Tags { get; internal set; }
public List<string> Logistics1 { get; internal set; }
public List<Logistics2> Logistics2 { get; internal set; }
public Logistics()
public Logistics(IFileRead fileRead, string reportFullPath, bool useSplitForMID, int? fileInfoLength = null)
{
if (string.IsNullOrEmpty(fileRead.CellInstanceName))
throw new Exception();
if (string.IsNullOrEmpty(fileRead.MesEntity))
throw new Exception();
NullData = fileRead.NullData;
FileInfo fileInfo = new(reportFullPath);
DateTime dateTime = fileInfo.LastWriteTime;
if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value)
dateTime = dateTime.AddTicks(-1);
JobID = fileRead.CellInstanceName;
Sequence = dateTime.Ticks;
DateTimeFromSequence = dateTime;
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
MesEntity = fileRead.MesEntity;
ReportFullPath = fileInfo.FullName;
ProcessJobID = nameof(ProcessJobID);
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
if (useSplitForMID)
{
if (fileNameWithoutExtension.IndexOf(".") > -1)
fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim();
if (fileNameWithoutExtension.IndexOf("_") > -1)
fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim();
if (fileNameWithoutExtension.IndexOf("-") > -1)
fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim();
}
MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower());
Tags = new List<string>();
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
Logistics2 = new List<Logistics2>();
}
public Logistics(string reportFullPath, string logistics)
{
string key;
DateTime dateTime;
string[] segments;
Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1"))
{
DateTime dateTime = DateTime.Now;
NullData = null;
JobID = Description.GetCellName();
JobID = "null";
dateTime = new FileInfo(reportFullPath).LastWriteTime;
Sequence = dateTime.Ticks;
DateTimeFromSequence = dateTime;
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
MesEntity = DefaultMesEntity(dateTime);
ReportFullPath = string.Empty;
ProcessJobID = nameof(ProcessJobID);
MID = nameof(MID);
ReportFullPath = reportFullPath;
ProcessJobID = "R##";
MID = "null";
Tags = new List<string>();
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
Logistics2 = new List<Logistics2>();
}
public Logistics(object nullData, Dictionary<string, string> cellNames, Dictionary<string, string> mesEntities, FileInfo fileInfo, bool useSplitForMID, int? fileInfoLength = null)
else
{
NullData = nullData;
string mesEntity = string.Empty;
string jobID = Description.GetCellName();
DateTime dateTime = fileInfo.LastWriteTime;
if (fileInfoLength.HasValue && fileInfo.Length < fileInfoLength.Value)
dateTime = dateTime.AddTicks(-1);
if (string.IsNullOrEmpty(jobID))
string logistics1Line1 = Logistics1[0];
key = "NULL_DATA=";
if (!logistics1Line1.Contains(key))
NullData = null;
else
{
if (cellNames.Count == 1)
jobID = cellNames.ElementAt(0).Key;
else
{
foreach (var element in cellNames)
{
if (fileInfo.FullName.IndexOf(element.Key, StringComparison.OrdinalIgnoreCase) > -1 || fileInfo.FullName.IndexOf(element.Value, StringComparison.OrdinalIgnoreCase) > -1)
{
jobID = element.Key;
break;
}
}
}
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
NullData = segments[1].Split(';')[0];
}
key = "JOBID=";
if (!logistics1Line1.Contains(key))
JobID = "null";
else
{
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
JobID = segments[1].Split(';')[0];
}
key = "SEQUENCE=";
if (!logistics1Line1.Contains(key))
dateTime = new FileInfo(reportFullPath).LastWriteTime;
else
{
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks)
dateTime = new FileInfo(reportFullPath).LastWriteTime;
else
dateTime = new DateTime(sequence);
}
if (string.IsNullOrEmpty(jobID))
throw new Exception();
if (mesEntities.ContainsKey(jobID))
mesEntity = mesEntities[jobID];
else if (mesEntities.Count == 1)
mesEntity = mesEntities.ElementAt(0).Value;
//
if (string.IsNullOrEmpty(mesEntity))
throw new Exception();
JobID = jobID;
Sequence = dateTime.Ticks;
DateTimeFromSequence = dateTime;
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
MesEntity = mesEntity;
ReportFullPath = fileInfo.FullName;
ProcessJobID = nameof(ProcessJobID);
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileInfo.FullName);
if (useSplitForMID)
DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime;
if (TotalSecondsSinceLastWriteTimeFromSequence > 600)
{
if (fileNameWithoutExtension.IndexOf(".") > -1)
fileNameWithoutExtension = fileNameWithoutExtension.Split('.')[0].Trim();
if (fileNameWithoutExtension.IndexOf("_") > -1)
fileNameWithoutExtension = fileNameWithoutExtension.Split('_')[0].Trim();
if (fileNameWithoutExtension.IndexOf("-") > -1)
fileNameWithoutExtension = fileNameWithoutExtension.Split('-')[0].Trim();
if (lastWriteTime != dateTime)
try
{ File.SetLastWriteTime(reportFullPath, dateTime); }
catch (Exception) { }
}
MID = string.Concat(fileNameWithoutExtension.Substring(0, 1).ToUpper(), fileNameWithoutExtension.Substring(1).ToLower());
Tags = new List<string>();
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
Logistics2 = new List<Logistics2>();
}
public Logistics(string reportFullPath, string logistics)
{
string key;
DateTime dateTime;
string[] segments;
Logistics1 = logistics.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (!Logistics1.Any() || !Logistics1[0].StartsWith("LOGISTICS_1"))
{
NullData = null;
JobID = "null";
dateTime = new FileInfo(reportFullPath).LastWriteTime;
Sequence = dateTime.Ticks;
DateTimeFromSequence = dateTime;
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
key = "MES_ENTITY=";
if (!logistics1Line1.Contains(key))
MesEntity = DefaultMesEntity(dateTime);
ReportFullPath = reportFullPath;
ProcessJobID = "R##";
MID = "null";
Tags = new List<string>();
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
Logistics2 = new List<Logistics2>();
}
else
{
string logistics1Line1 = Logistics1[0];
key = "NULL_DATA=";
if (!logistics1Line1.Contains(key))
NullData = null;
else
{
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
NullData = segments[1].Split(';')[0];
}
key = "JOBID=";
if (!logistics1Line1.Contains(key))
JobID = "null";
else
{
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
JobID = segments[1].Split(';')[0];
}
key = "SEQUENCE=";
if (!logistics1Line1.Contains(key))
dateTime = new FileInfo(reportFullPath).LastWriteTime;
else
{
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
if (!long.TryParse(segments[1].Split(';')[0].Split('.')[0], out long sequence) || sequence < new DateTime(1999, 1, 1).Ticks)
dateTime = new FileInfo(reportFullPath).LastWriteTime;
else
dateTime = new DateTime(sequence);
}
Sequence = dateTime.Ticks;
DateTimeFromSequence = dateTime;
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTime).TotalSeconds;
DateTime lastWriteTime = new FileInfo(reportFullPath).LastWriteTime;
if (TotalSecondsSinceLastWriteTimeFromSequence > 600)
{
if (lastWriteTime != dateTime)
try { File.SetLastWriteTime(reportFullPath, dateTime); } catch (Exception) { }
}
key = "MES_ENTITY=";
if (!logistics1Line1.Contains(key))
MesEntity = DefaultMesEntity(dateTime);
else
{
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
MesEntity = segments[1].Split(';')[0];
}
ReportFullPath = reportFullPath;
key = "PROCESS_JOBID=";
if (!logistics1Line1.Contains(key))
ProcessJobID = "R##";
else
{
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
ProcessJobID = segments[1].Split(';')[0];
}
key = "MID=";
if (!logistics1Line1.Contains(key))
MID = "null";
else
{
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
MID = segments[1].Split(';')[0];
}
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
MesEntity = segments[1].Split(';')[0];
}
Logistics2 logistics2;
Tags = new List<string>();
Logistics2 = new List<Logistics2>();
for (int i = 1; i < Logistics1.Count(); i++)
ReportFullPath = reportFullPath;
key = "PROCESS_JOBID=";
if (!logistics1Line1.Contains(key))
ProcessJobID = "R##";
else
{
if (Logistics1[i].StartsWith("LOGISTICS_2"))
{
logistics2 = new Logistics2(Logistics1[i]);
Logistics2.Add(logistics2);
}
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
ProcessJobID = segments[1].Split(';')[0];
}
for (int i = Logistics1.Count() - 1; i > -1; i--)
key = "MID=";
if (!logistics1Line1.Contains(key))
MID = "null";
else
{
if (Logistics1[i].StartsWith("LOGISTICS_2"))
Logistics1.RemoveAt(i);
segments = logistics1Line1.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
MID = segments[1].Split(';')[0];
}
}
public Logistics ShallowCopy()
Logistics2 logistics2;
Tags = new List<string>();
Logistics2 = new List<Logistics2>();
for (int i = 1; i < Logistics1.Count; i++)
{
return (Logistics)this.MemberwiseClone();
if (Logistics1[i].StartsWith("LOGISTICS_2"))
{
logistics2 = new Logistics2(Logistics1[i]);
Logistics2.Add(logistics2);
}
}
private string DefaultMesEntity(DateTime dateTime)
for (int i = Logistics1.Count - 1; i > -1; i--)
{
return string.Concat(dateTime.Ticks, "_MES_ENTITY");
}
internal string GetLotViaMostCommonMethod()
{
return MID.Substring(0, MID.Length - 2);
}
internal string GetPocketNumberViaMostCommonMethod()
{
return MID.Substring(MID.Length - 2);
}
internal void Update(string dateTime, string processJobID, string mid)
{
if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted))
dateTimeCasted = DateTime.Now;
NullData = null;
//JobID = Description.GetCellName();
Sequence = dateTimeCasted.Ticks;
DateTimeFromSequence = dateTimeCasted;
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds;
//MesEntity = DefaultMesEntity(dateTime);
//ReportFullPath = string.Empty;
ProcessJobID = processJobID;
MID = mid;
Tags = new List<string>();
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
Logistics2 = new List<Logistics2>();
if (Logistics1[i].StartsWith("LOGISTICS_2"))
Logistics1.RemoveAt(i);
}
}
public Logistics ShallowCopy() => (Logistics)MemberwiseClone();
private static string DefaultMesEntity(DateTime dateTime) => string.Concat(dateTime.Ticks, "_MES_ENTITY");
internal string GetLotViaMostCommonMethod() => MID.Substring(0, MID.Length - 2);
internal string GetPocketNumberViaMostCommonMethod() => MID.Substring(MID.Length - 2);
internal void Update(string dateTime, string processJobID, string mid)
{
if (!DateTime.TryParse(dateTime, out DateTime dateTimeCasted))
dateTimeCasted = DateTime.Now;
NullData = null;
//JobID = Description.GetCellName();
Sequence = dateTimeCasted.Ticks;
DateTimeFromSequence = dateTimeCasted;
TotalSecondsSinceLastWriteTimeFromSequence = (DateTime.Now - dateTimeCasted).TotalSeconds;
//MesEntity = DefaultMesEntity(dateTime);
//ReportFullPath = string.Empty;
ProcessJobID = processJobID;
MID = mid;
Tags = new List<string>();
Logistics1 = new string[] { string.Concat("LOGISTICS_1", '\t', "A_JOBID=", JobID, ";A_MES_ENTITY=", MesEntity, ";") }.ToList();
Logistics2 = new List<Logistics2>();
}
}

View File

@ -1,80 +1,78 @@
using System;
namespace Adaptation.Shared
namespace Adaptation.Shared;
public class Logistics2 : Methods.ILogistics2
{
public class Logistics2
public string MID { get; private set; }
public string RunNumber { get; private set; }
public string SatelliteGroup { get; private set; }
public string PartNumber { get; private set; }
public string PocketNumber { get; private set; }
public string WaferLot { get; private set; }
public string Recipe { get; private set; }
public Logistics2(string logistics2)
{
public string MID { get; private set; }
public string RunNumber { get; private set; }
public string SatelliteGroup { get; private set; }
public string PartNumber { get; private set; }
public string PocketNumber { get; private set; }
public string WaferLot { get; private set; }
public string Recipe { get; private set; }
public Logistics2(string logistics2)
string key;
string[] segments;
key = "JOBID=";
if (!logistics2.Contains(key))
MID = "null";
else
{
string key;
string[] segments;
key = "JOBID=";
if (!logistics2.Contains(key))
MID = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
MID = segments[1].Split(';')[0];
}
key = "MID=";
if (!logistics2.Contains(key))
RunNumber = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
RunNumber = segments[1].Split(';')[0];
}
key = "INFO=";
if (!logistics2.Contains(key))
SatelliteGroup = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
SatelliteGroup = segments[1].Split(';')[0];
}
key = "PRODUCT=";
if (!logistics2.Contains(key))
PartNumber = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
PartNumber = segments[1].Split(';')[0];
}
key = "CHAMBER=";
if (!logistics2.Contains(key))
PocketNumber = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
PocketNumber = segments[1].Split(';')[0];
}
key = "WAFER_ID=";
if (!logistics2.Contains(key))
WaferLot = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
WaferLot = segments[1].Split(';')[0];
}
key = "PPID=";
if (!logistics2.Contains(key))
Recipe = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
Recipe = segments[1].Split(';')[0];
}
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
MID = segments[1].Split(';')[0];
}
key = "MID=";
if (!logistics2.Contains(key))
RunNumber = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
RunNumber = segments[1].Split(';')[0];
}
key = "INFO=";
if (!logistics2.Contains(key))
SatelliteGroup = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
SatelliteGroup = segments[1].Split(';')[0];
}
key = "PRODUCT=";
if (!logistics2.Contains(key))
PartNumber = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
PartNumber = segments[1].Split(';')[0];
}
key = "CHAMBER=";
if (!logistics2.Contains(key))
PocketNumber = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
PocketNumber = segments[1].Split(';')[0];
}
key = "WAFER_ID=";
if (!logistics2.Contains(key))
WaferLot = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
WaferLot = segments[1].Split(';')[0];
}
key = "PPID=";
if (!logistics2.Contains(key))
Recipe = "null";
else
{
segments = logistics2.Split(new string[] { key }, StringSplitOptions.RemoveEmptyEntries);
Recipe = segments[1].Split(';')[0];
}
}
}

View File

@ -0,0 +1,22 @@
using System.Collections.Generic;
using System.Text.Json;
namespace Adaptation.Shared.Methods;
public interface IDescription
{
string GetEventDescription();
List<string> GetDetailNames();
List<string> GetHeaderNames();
IDescription GetDisplayNames();
List<string> GetParameterNames();
List<string> GetPairedParameterNames();
List<string> GetIgnoreParameterNames(Test test);
List<string> GetNames(IFileRead fileRead, Logistics logistics);
JsonProperty[] GetDefault(IFileRead fileRead, Logistics logistics);
Dictionary<string, string> GetDisplayNamesJsonElement(IFileRead fileRead);
IDescription GetDefaultDescription(IFileRead fileRead, Logistics logistics);
List<IDescription> GetDescriptions(IFileRead fileRead, Logistics logistics, List<Test> tests, IProcessData iProcessData);
}

View File

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
namespace Adaptation.Shared.Methods;
public interface IFileRead : Properties.IFileRead
{
void WaitForThread();
JsonProperty[] GetDefault();
string GetEventDescription();
List<string> GetHeaderNames();
void CheckTests(Test[] tests, bool extra);
Dictionary<string, string> GetDisplayNamesJsonElement();
Tuple<string, Test[], JsonElement[], List<FileInfo>> ReExtract();
List<IDescription> GetDescriptions(IFileRead fileRead, List<Test> tests, IProcessData processData);
void Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception = null);
Tuple<string, Test[], JsonElement[], List<FileInfo>> GetExtractResult(string reportFullPath, string eventName);
string[] Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, string to, string from, string resolvedFileLocation, Exception exception);
}

View File

@ -0,0 +1,5 @@
namespace Adaptation.Shared.Methods;
public interface ILogistics : Properties.ILogistics
{
}

View File

@ -0,0 +1,5 @@
namespace Adaptation.Shared.Methods;
public interface ILogistics2 : Properties.ILogistics2
{
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
namespace Adaptation.Shared.Methods;
public interface IProcessData : Properties.IProcessData
{
string GetCurrentReactor(IFileRead fileRead, Logistics logistics, Dictionary<string, string> reactors);
Tuple<string, Test[], JsonElement[], List<FileInfo>> GetResults(IFileRead fileRead, Logistics logistics, List<FileInfo> fileInfoCollection);
}

View File

@ -0,0 +1,8 @@
namespace Adaptation.Shared.Methods;
public interface ISMTP
{
void SendLowPriorityEmailMessage(string subject, string body);
void SendHighPriorityEmailMessage(string subject, string body);
void SendNormalPriorityEmailMessage(string subject, string body);
}

View File

@ -1,803 +0,0 @@
using System;
namespace Adaptation.Shared.Metrology
{
public static class ColumnGet
{
public static string GetDiplayName(this Column column)
{
string results;
switch (column)
{
//case Column._8in_Total_Warp_Verification: results = "8in Total Warp Verification"; break;
//case Column.AFM_Monthly_Y: results = "AFM-Monthly Y"; break;
//case Column.AFM_Monthly: results = "AFM_Monthly"; break;
case Column.AFM_Pit_Count: results = "AFM Pit Count"; break;
case Column.AFM_Roughness: results = "AFM Roughness"; break;
//case Column.Adder_Bin_1: results = "Adder Bin 1"; break;
//case Column.Adder_Bin_2: results = "Adder Bin 2"; break;
//case Column.Adder_Bin_3: results = "Adder Bin 3"; break;
//case Column.Adder_Bin_4: results = "Adder Bin 4"; break;
//case Column.Adder_Bin_5: results = "Adder Bin 5"; break;
//case Column.Adder_Bin_6: results = "Adder Bin 6"; break;
//case Column.Adder_Bin_9: results = "Adder Bin 9"; break;
case Column.Al_B_B_WTAVG: results = "Al% B.B. WTAVG"; break;
case Column.Al_B_B_: results = "Al% B.B."; break;
case Column.Al_Barrier_WTAVG: results = "Al% Barrier WTAVG"; break;
case Column.Al_Barrier: results = "Al% Barrier"; break;
case Column.Al_SLS_WTAVG: results = "Al% SLS WTAVG"; break;
case Column.Al_SLS: results = "Al% SLS"; break;
case Column.Al_TL1_WTAVG: results = "Al% TL1 WTAVG"; break;
case Column.Al_TL1: results = "Al% TL1"; break;
case Column.Al_TL2_WTAVG: results = "Al% TL2 WTAVG"; break;
//case Column.BV_Resistance: results = "BV Resistance"; break; //BV Monthly Verification
case Column.BandEdge_V: results = "BandEdge_V"; break;
case Column.BandEdge_V_XY: results = "BandEdge_V_XY"; break;
case Column.BandEdge_nm: results = "BandEdge_nm"; break;
case Column.Barrier_Composition_RPM_XY: results = "Barrier_Composition_RPM_XY"; break;
case Column.Bow_Calibration: results = "Bow Calibration"; break;
case Column.Bow_Range: results = "Bow Range"; break;
case Column.Bow: results = "Bow"; break;
case Column.BowCenter: results = "BowCenter"; break;
case Column.BowX: results = "BowX"; break;
case Column.BowY: results = "BowY"; break;
case Column.Breakdown_Voltage_Edge: results = "Breakdown Voltage - Edge"; break;
case Column.Breakdown_VoltageMiddle: results = "Breakdown Voltage - Middle"; break;
case Column.Breakdown_Voltage: results = "Breakdown Voltage"; break;
case Column.CV_C_at_10V: results = "CV C at -10V"; break;
case Column.CV_Nd_Min: results = "CV Nd Min"; break;
//case Column.Candela_Large_LPD_Quarterly: results = "Candela Large LPD Quarterly"; break;
//case Column.Candela_Medium_LPD_Quarterly: results = "Candela Medium LPD Quarterly"; break;
//case Column.Candela_Small_LPD_Quarterly: results = "Candela Small LPD Quarterly"; break;
//case Column.Candela_Total_Quarterly: results = "Candela Total Quarterly"; break;
case Column.Candela_102_83nm: results = "102-83nm"; break;
case Column.Candela_1_1um: results = "1.1um"; break;
case Column.Candela_496nm: results = "496nm"; break;
case Column.Candela_600nm: results = "600nm"; break;
case Column.Candela_8620_Small: results = "Candela 8620 Small"; break;
case Column.Candela_Crack_Verification: results = "Crack Verification"; break;
case Column.Candela_Cracking: results = "Candela Cracking"; break;
case Column.Candela_Cracking_Acceptable: results = "Candela Cracking Acceptable"; break;
case Column.Candela_Crater: results = "Candela Crater"; break;
case Column.Candela_Crater_Verification: results = "Crater verification"; break;
case Column.Candela_Haze: results = "Candela Haze"; break;
case Column.Candela_LPD_Large: results = "Candela LPD Large"; break;
case Column.Candela_LPD_Medium: results = "Candela LPD Medium"; break;
case Column.Candela_LPD_Small: results = "Candela LPD Small"; break;
case Column.Candela_Large_Verification: results = "Large Verification"; break;
case Column.Candela_Medium_Verification: results = "Medium Verification"; break;
case Column.Candela_Pits: results = "Candela Pits"; break;
case Column.Candela_Pits_Verification: results = "Pits verification"; break;
case Column.Candela_SPE: results = "Candela SPE"; break;
case Column.Candela_SPE_Verification: results = "SPE verification"; break;
case Column.Candela_Slip: results = "Candela Slip"; break;
case Column.Candela_Small_Verification: results = "Small Verification"; break;
case Column.Candela_Spirals: results = "Candela Spirals"; break;
case Column.Candela_Spirals_Verification: results = "Candela Spirals Verification"; break;
case Column.Candela_Total_Defects: results = "Candela Total Defects"; break;
case Column.Candela_Total_PSL: results = "Candela Total PSL"; break;
case Column.Candela__1_1um: results = ">1.1um"; break;
//case Column.Comment: results = "Comment"; break;
//case Column.Conductivity: results = "Conductivity"; break;
case Column.Contact_Symmetry: results = "Contact Symmetry"; break;
//case Column.Cracking_verification: results = "Cracking verification"; break;
//case Column.Crater_verification: results = "Crater verification"; break;
case Column.Date: results = "Date"; break;
case Column.Denton_Crystal_Life: results = "Denton_Crystal_Life"; break;
case Column.Denton_Current_AVG: results = "Denton_Current_AVG"; break;
case Column.Denton_Current_STDEV: results = "Denton_Current_STDEV"; break;
case Column.Denton_Deposition_Power_AVG: results = "Denton_Deposition_Power_AVG"; break;
case Column.Denton_Deposition_Power_STDEV: results = "Denton_Deposition_Power_STDEV"; break;
case Column.Denton_Deposition_Rate_AVG: results = "Denton_Deposition_Rate_AVG"; break;
case Column.Denton_Deposition_Rate_STDEV: results = "Denton_Deposition_Rate_STDEV"; break;
case Column.Denton_Gun_Pocket: results = "Denton_Gun_Pocket"; break;
case Column.Denton_Pumpdown_Time: results = "Denton_Pumpdown_Time"; break;
case Column.Denton_Voltage_AVG: results = "Denton_Voltage_AVG"; break;
case Column.Denton_Voltage_STDEV: results = "Denton_Voltage_STDEV"; break;
case Column.Employee: results = "Employee"; break;
case Column.Epi_Thickness_Mean: results = "Epi Thickness Mean"; break;
case Column.Epi_Thickness_Mean_XY: results = "Epi Thickness Mean_XY"; break;
case Column.Epi_Thickness_Std_Dev_: results = "Epi Thickness Std Dev %"; break;
case Column.FWHM_006_WTAVG: results = "FWHM 006 WTAVG"; break;
case Column.FWHM_006: results = "FWHM 006"; break;
case Column.FWHM_105_WTAVG: results = "FWHM 105 WTAVG"; break;
case Column.FWHM_105: results = "FWHM 105"; break;
case Column.Hall_Rs: results = "Hall Rs"; break;
case Column.Hall_Mobility_verif_sample: results = "Hall_Mobility_verif_sample"; break;
case Column.Hall_Ns_verif_sample: results = "Hall_Ns_verif_sample"; break;
case Column.Hall_Rs_verif_sample: results = "Hall_Rs_verif_sample"; break;
case Column.Job: results = "Job"; break;
case Column.LEI_RS_Average_value: results = "LEI RS Average value"; break;
case Column.LEI_RS_Maximum_value: results = "LEI RS Maximum value"; break;
case Column.LEI_RS_Minimum_value: results = "LEI RS Minimum value"; break;
case Column.LEI_RS_STDEV: results = "LEI RS STDEV"; break;
case Column.LEI_RS_STDEV_: results = "LEI RS STDEV%"; break;
//case Column.Large_Adder_Sum: results = "Large Adder Sum"; break;
case Column.Lot: results = "Lot"; break;
//case Column.Medium_Adder_Sum: results = "Medium Adder Sum"; break;
case Column.Microscope_Center_5x: results = "Microscope Center 5x"; break;
case Column.Microscope_Center_50x: results = "Microscope Center 50x"; break;
case Column.Microscope_Middle_5x: results = "Microscope Middle 5x"; break;
case Column.Microscope_Middle_50x: results = "Microscope Middle 50x"; break;
case Column.Microscope_Edge_5x: results = "Microscope Edge 5x"; break;
case Column.Microscope_Edge_50x: results = "Microscope Edge 50x"; break;
case Column.Mobility_Verification: results = "Mobility Verification"; break;
case Column.Mobility: results = "Mobility"; break;
case Column.Ns_Verification: results = "Ns Verification"; break;
case Column.PL_Edge_Wavelength: results = "PL Edge Wavelength"; break;
case Column.PL_Ratio: results = "PL Ratio"; break;
case Column.PR_Barrier_Composition: results = "PR Barrier Composition"; break;
case Column.PR_Peak: results = "PR Peak"; break;
case Column.Part: results = "Part"; break;
//case Column.Particles_verification: results = "Particles verification"; break;
//case Column.Pits_verification: results = "Pits verification"; break;
//case Column.Pocket: results = "Pocket"; break;
//case Column.Post_Bin_1: results = "Post Bin 1"; break;
//case Column.Post_Bin_2: results = "Post Bin 2"; break;
//case Column.Post_Bin_3: results = "Post Bin 3"; break;
//case Column.Post_Bin_4: results = "Post Bin 4"; break;
//case Column.Post_Bin_5: results = "Post Bin 5"; break;
//case Column.Post_Bin_6: results = "Post Bin 6"; break;
//case Column.Post_Bin_9: results = "Post Bin 9"; break;
//case Column.Pre_Bin_1: results = "Pre Bin 1"; break;
//case Column.Pre_Bin_2: results = "Pre Bin 2"; break;
//case Column.Pre_Bin_3: results = "Pre Bin 3"; break;
//case Column.Pre_Bin_4: results = "Pre Bin 4"; break;
//case Column.Pre_Bin_5: results = "Pre Bin 5"; break;
//case Column.Pre_Bin_6: results = "Pre Bin 6"; break;
//case Column.Pre_Bin_9: results = "Pre Bin 9"; break;
case Column.Process: results = "Process"; break;
//case Column.RPM_verif_Thickness_1: results = "RPM_verif_Thickness_1"; break;
//case Column.RPM_verif_Thickness_2: results = "RPM_verif_Thickness_2"; break;
//case Column.RPM_verif_Thickness_3: results = "RPM_verif_Thickness_3"; break;
//case Column.RPM_verif_Thickness_Average: results = "RPM_verif_Thickness_Average"; break;
//case Column.RTA_oxide_Thk_Change: results = "RTA oxide Thk Change"; break;
//case Column.RTA_oxide_post_anneal_Thk: results = "RTA oxide post-anneal Thk"; break;
//case Column.RTA_oxide_pre_anneal_Thk: results = "RTA oxide pre-anneal Thk"; break;
case Column.Recipe: results = "Recipe"; break;
//case Column.Resistivity_2_ohm_cm: results = "Resistivity 2 ohm cm"; break; //LEI Weekly Verification
//case Column.Resistivity_600_ohm_cm: results = "Resistivity 600 ohm cm"; break; //LEI Weekly Verification
case Column.Rs_verification: results = "Rs verification"; break;
case Column.Rs_verif_100kohm: results = "Rs_verif_100kohm"; break;
case Column.Rs_verif_10ohm: results = "Rs_verif_10ohm"; break;
case Column.Rs_verif_1kohm: results = "Rs_verif_1kohm"; break;
case Column.SID: results = "SID"; break;
case Column.SL_Period_WTAVG: results = "SL Period WTAVG"; break;
case Column.SL_Period: results = "SL Period"; break;
//case Column.SPE_verification: results = "SPE verification"; break;
//case Column.Sample_ID: results = "Sample ID"; break;
case Column.Sheet_Concentration: results = "Sheet Concentration"; break;
//case Column.Size: results = "Size"; break;
//case Column.Small_Adder_Sum: results = "Small Adder Sum"; break;
//case Column.Spirals_verification: results = "Spirals verification"; break;
case Column.Time: results = "Time"; break;
case Column.Tool_ID: results = "Tool ID"; break;
//case Column.Total_LPD_Adder: results = "Total LPD Adder"; break;
//case Column.Total_Verification: results = "Total Verification"; break;
case Column.Total_Warp_Calibration: results = "Total Warp Calibration"; break;
case Column.UV_Broken: results = "UV Broken"; break;
case Column.UV_Chipping: results = "UV Chipping"; break;
case Column.UV_Cracking_0_3mm_: results = "UV Cracking (0-3mm)"; break;
case Column.UV_Cracking_3_7mm_: results = "UV Cracking (3-7mm)"; break;
case Column.UV_Cracking_7mm_: results = "UV Cracking (>7mm)"; break;
case Column.UV_Crazing: results = "UV Crazing"; break;
case Column.UV_Crazing_Acceptable: results = "UV Crazing Acceptable"; break;
case Column.UV_FULL_Characterization_Wafer: results = "UV FULL Characterization Wafer"; break;
case Column.UV_Haze_count_: results = "UV Haze (count)"; break;
case Column.UV_LIGHT_Characterization_Wafer: results = "UV LIGHT Characterization Wafer"; break;
case Column.UV_Non_rotation: results = "UV Non-rotation"; break;
case Column.UV_Other: results = "UV Other"; break;
case Column.UV_Scratch_count_: results = "UV Scratch (count)"; break;
case Column.UV_Slip_count_: results = "UV Slip (count)"; break;
case Column.UV_True_Haze: results = "UV True Haze"; break;
case Column.UV_True_Haze_Acceptable: results = "UV True Haze Acceptable"; break;
case Column.UV_SPE_1mm_count: results = "UV-SPE (>1mm) count"; break;
case Column.UV_SPE_count_: results = "UV-SPE (count)"; break;
case Column.Verification_Contact_Symmetry: results = "Verification Contact Symmetry"; break;
case Column.Vp_Pinch_Off_Voltage: results = "Vp Pinch Off Voltage"; break;
case Column.Wafer_ID: results = "Wafer ID"; break;
//case Column.Wafer_Pocket: results = "Wafer Pocket"; break;
case Column.Wafer_Region: results = "Wafer Region"; break;
case Column.Wafer_Scribe: results = "Wafer Scribe"; break;
case Column.WaferPocket_Candela: results = "WaferPocket_Candela"; break;
case Column.WaferPocket_Warp: results = "WaferPocket_Warp"; break;
case Column.WaferPosition_CV: results = "WaferPosition_CV"; break;
case Column.WaferPosition_BV: results = "WaferPosition_BV"; break;
case Column.WaferPosition_Hall: results = "WaferPosition_Hall"; break;
case Column.WaferPosition_PR: results = "WaferPosition_PR"; break;
case Column.Warp: results = "Warp"; break;
case Column.X_Coord: results = "X-Coord"; break;
case Column.XRD_2_Theta_Peak_002: results = "XRD 2 Theta Peak 002"; break;
case Column.XRD_2_Theta_Peak_101: results = "XRD 2 Theta Peak 101"; break;
case Column.XRD_2_Theta_Position: results = "XRD 2-Theta Position"; break;
case Column.XRD_2_Theta_Position_Si_1: results = "XRD 2-Theta Position Si 1"; break;
case Column.XRD_2_Theta_Position_Si_2: results = "XRD 2-Theta Position Si 2"; break;
case Column.XRD_2_Theta_Position_Si_3: results = "XRD 2-Theta Position Si 3"; break;
case Column.XRD_Peak_002_Intensity: results = "XRD Peak 002 Intensity"; break;
case Column.XRD_Peak_101_Intensity: results = "XRD Peak 101 Intensity"; break;
case Column.XRD_Weekly_AL_Center: results = "XRD Weekly AL% Center"; break;
case Column.XRD_Weekly_Back_Barrier_Al_: results = "Back Barrier Al%"; break;
case Column.XRD_Weekly_Barrier_Al_: results = "Barrier Al%"; break;
case Column.XRD_Weekly_FWHM_002: results = "XRD Weekly FWHM 002"; break;
case Column.XRD_Weekly_FWHM_101: results = "XRD Weekly FWHM 101"; break;
case Column.XRD_Weekly_FWHM_105: results = "XRD Weekly FWHM 105"; break;
case Column.XRD_Weekly_Fringe_thick_0_0_: results = "XRD Weekly Fringe thick (0,0)"; break;
case Column.XRD_Weekly_Fringe_thick_48_48_: results = "XRD Weekly Fringe thick (48,48)"; break;
case Column.XRD_Weekly_Intensity: results = "XRD Weekly Intensity"; break;
case Column.XRD_Weekly_Super_Lattice_Al_: results = "Super Lattice Al%"; break;
case Column.XRD_Weekly_Super_Lattice_period: results = "Super Lattice period"; break;
case Column.XRD_Weekly_Super_Lattice_tks: results = "Super Lattice tks"; break;
case Column.XRR_Thickness_nm_WTAVG: results = "XRR Thickness (nm) WTAVG"; break;
case Column.XRR_Thickness_nm_: results = "XRR Thickness (nm)"; break;
case Column.Y_Coord: results = "Y-Coord"; break;
case Column.YellowBand_Power_mW_: results = "YellowBand_Power (mW)"; break;
case Column.YellowBand_V: results = "YellowBand_V"; break;
case Column.YellowBand_V_XY: results = "YellowBand_V_XY"; break;
case Column.YellowBand_nm: results = "YellowBand_nm"; break;
//case Column.pH: results = "pH"; break;
case Column.Ag: results = "Ag"; break;
case Column.Al: results = "Al"; break;
case Column.As: results = "As"; break;
case Column.Au: results = "Au"; break;
case Column.B: results = "B"; break;
case Column.Ba: results = "Ba"; break;
case Column.Ca: results = "Ca"; break;
case Column.Ce: results = "Ce"; break;
case Column.Co: results = "Co"; break;
case Column.Cr: results = "Cr"; break;
case Column.Cu: results = "Cu"; break;
case Column.Fe: results = "Fe"; break;
case Column.Ga: results = "Ga"; break;
case Column.Ge: results = "Ge"; break;
case Column.Hf: results = "Hf"; break;
case Column.K: results = "K"; break;
case Column.Li: results = "Li"; break;
case Column.Mg: results = "Mg"; break;
case Column.Mn: results = "Mn"; break;
case Column.Mo: results = "Mo"; break;
case Column.Na: results = "Na"; break;
case Column.Ni: results = "Ni"; break;
case Column.P: results = "P"; break;
case Column.Pb: results = "Pb"; break;
case Column.Sn: results = "Sn"; break;
case Column.Ta: results = "Ta"; break;
case Column.Ti: results = "Ti"; break;
case Column.W: results = "W"; break;
case Column.Y: results = "Y"; break;
case Column.Zn: results = "Zn"; break;
default: throw new Exception();
}
return results;
}
public static Description.Param GetParam(this Column column)
{
Description.Param results;
switch (column)
{
//case Column._8in_Total_Warp_Verification: results = Description.Param.String; break;
//case Column.AFM_Monthly_Y: results = Description.Param.String; break;
//case Column.AFM_Monthly: results = Description.Param.String; break;
case Column.AFM_Pit_Count: results = Description.Param.String; break;
case Column.AFM_Roughness: results = Description.Param.String; break;
//case Column.Adder_Bin_1: results = Description.Param.String; break;
//case Column.Adder_Bin_2: results = Description.Param.String; break;
//case Column.Adder_Bin_3: results = Description.Param.String; break;
//case Column.Adder_Bin_4: results = Description.Param.String; break;
//case Column.Adder_Bin_5: results = Description.Param.String; break;
//case Column.Adder_Bin_6: results = Description.Param.String; break;
//case Column.Adder_Bin_9: results = Description.Param.String; break;
case Column.Al_B_B_WTAVG: results = Description.Param.String; break;
case Column.Al_B_B_: results = Description.Param.String; break;
case Column.Al_Barrier_WTAVG: results = Description.Param.String; break;
case Column.Al_Barrier: results = Description.Param.String; break;
case Column.Al_SLS_WTAVG: results = Description.Param.String; break;
case Column.Al_SLS: results = Description.Param.String; break;
case Column.Al_TL1_WTAVG: results = Description.Param.String; break;
case Column.Al_TL1: results = Description.Param.String; break;
case Column.Al_TL2_WTAVG: results = Description.Param.String; break;
//case Column.BV_Resistance: results = Description.Param.String; break;
case Column.BandEdge_V: results = Description.Param.String; break;
case Column.BandEdge_V_XY: results = Description.Param.String; break;
case Column.BandEdge_nm: results = Description.Param.String; break;
case Column.Barrier_Composition_RPM_XY: results = Description.Param.String; break;
case Column.Bow_Calibration: results = Description.Param.String; break;
case Column.Bow_Range: results = Description.Param.String; break;
case Column.Bow: results = Description.Param.String; break;
case Column.BowCenter: results = Description.Param.String; break;
case Column.BowX: results = Description.Param.String; break;
case Column.BowY: results = Description.Param.String; break;
case Column.Breakdown_Voltage_Edge: results = Description.Param.String; break;
case Column.Breakdown_VoltageMiddle: results = Description.Param.String; break;
case Column.Breakdown_Voltage: results = Description.Param.String; break;
case Column.CV_C_at_10V: results = Description.Param.String; break;
case Column.CV_Nd_Min: results = Description.Param.String; break;
//case Column.Candela_Large_LPD_Quarterly: results = Description.Param.String; break;
//case Column.Candela_Medium_LPD_Quarterly: results = Description.Param.String; break;
//case Column.Candela_Small_LPD_Quarterly: results = Description.Param.String; break;
//case Column.Candela_Total_Quarterly: results = Description.Param.String; break;
case Column.Candela_102_83nm: results = Description.Param.String; break;
case Column.Candela_1_1um: results = Description.Param.String; break;
case Column.Candela_496nm: results = Description.Param.String; break;
case Column.Candela_600nm: results = Description.Param.String; break;
case Column.Candela_8620_Small: results = Description.Param.String; break;
case Column.Candela_Crack_Verification: results = Description.Param.String; break;
case Column.Candela_Cracking: results = Description.Param.String; break;
case Column.Candela_Cracking_Acceptable: results = Description.Param.String; break;
case Column.Candela_Crater: results = Description.Param.String; break;
case Column.Candela_Crater_Verification: results = Description.Param.String; break;
case Column.Candela_Haze: results = Description.Param.String; break;
case Column.Candela_LPD_Large: results = Description.Param.String; break;
case Column.Candela_LPD_Medium: results = Description.Param.String; break;
case Column.Candela_LPD_Small: results = Description.Param.String; break;
case Column.Candela_Large_Verification: results = Description.Param.String; break;
case Column.Candela_Medium_Verification: results = Description.Param.String; break;
case Column.Candela_Pits: results = Description.Param.String; break;
case Column.Candela_Pits_Verification: results = Description.Param.String; break;
case Column.Candela_SPE: results = Description.Param.String; break;
case Column.Candela_SPE_Verification: results = Description.Param.String; break;
case Column.Candela_Slip: results = Description.Param.String; break;
case Column.Candela_Small_Verification: results = Description.Param.String; break;
case Column.Candela_Spirals: results = Description.Param.String; break;
case Column.Candela_Spirals_Verification: results = Description.Param.String; break;
case Column.Candela_Total_Defects: results = Description.Param.String; break;
case Column.Candela_Total_PSL: results = Description.Param.String; break;
case Column.Candela__1_1um: results = Description.Param.String; break;
//case Column.Comment: results = Description.Param.String; break;
//case Column.Conductivity: results = Description.Param.String; break;
case Column.Contact_Symmetry: results = Description.Param.String; break;
//case Column.Cracking_verification: results = Description.Param.String; break;
//case Column.Crater_verification: results = Description.Param.String; break;
case Column.Date: results = Description.Param.String; break;
case Column.Denton_Crystal_Life: results = Description.Param.String; break;
case Column.Denton_Current_AVG: results = Description.Param.String; break;
case Column.Denton_Current_STDEV: results = Description.Param.String; break;
case Column.Denton_Deposition_Power_AVG: results = Description.Param.String; break;
case Column.Denton_Deposition_Power_STDEV: results = Description.Param.String; break;
case Column.Denton_Deposition_Rate_AVG: results = Description.Param.String; break;
case Column.Denton_Deposition_Rate_STDEV: results = Description.Param.String; break;
case Column.Denton_Gun_Pocket: results = Description.Param.String; break;
case Column.Denton_Pumpdown_Time: results = Description.Param.String; break;
case Column.Denton_Voltage_AVG: results = Description.Param.String; break;
case Column.Denton_Voltage_STDEV: results = Description.Param.String; break;
case Column.Employee: results = Description.Param.String; break;
case Column.Epi_Thickness_Mean: results = Description.Param.String; break;
case Column.Epi_Thickness_Mean_XY: results = Description.Param.String; break;
case Column.Epi_Thickness_Std_Dev_: results = Description.Param.String; break;
case Column.FWHM_006_WTAVG: results = Description.Param.String; break;
case Column.FWHM_006: results = Description.Param.String; break;
case Column.FWHM_105_WTAVG: results = Description.Param.String; break;
case Column.FWHM_105: results = Description.Param.String; break;
case Column.Hall_Rs: results = Description.Param.String; break;
case Column.Hall_Mobility_verif_sample: results = Description.Param.String; break;
case Column.Hall_Ns_verif_sample: results = Description.Param.String; break;
case Column.Hall_Rs_verif_sample: results = Description.Param.String; break;
case Column.Job: results = Description.Param.String; break;
case Column.LEI_RS_Average_value: results = Description.Param.String; break;
case Column.LEI_RS_Maximum_value: results = Description.Param.String; break;
case Column.LEI_RS_Minimum_value: results = Description.Param.String; break;
case Column.LEI_RS_STDEV: results = Description.Param.String; break;
case Column.LEI_RS_STDEV_: results = Description.Param.String; break;
//case Column.Large_Adder_Sum: results = Description.Param.String; break;
case Column.Lot: results = Description.Param.String; break;
//case Column.Medium_Adder_Sum: results = Description.Param.String; break;
case Column.Microscope_Center_5x: results = Description.Param.String; break;
case Column.Microscope_Center_50x: results = Description.Param.String; break;
case Column.Microscope_Middle_5x: results = Description.Param.String; break;
case Column.Microscope_Middle_50x: results = Description.Param.String; break;
case Column.Microscope_Edge_5x: results = Description.Param.String; break;
case Column.Microscope_Edge_50x: results = Description.Param.String; break;
case Column.Mobility_Verification: results = Description.Param.String; break;
case Column.Mobility: results = Description.Param.String; break;
case Column.Ns_Verification: results = Description.Param.String; break;
case Column.PL_Edge_Wavelength: results = Description.Param.String; break;
case Column.PL_Ratio: results = Description.Param.String; break;
case Column.PR_Barrier_Composition: results = Description.Param.String; break;
case Column.PR_Peak: results = Description.Param.String; break;
case Column.Part: results = Description.Param.String; break;
//case Column.Particles_verification: results = Description.Param.String; break;
//case Column.Pits_verification: results = Description.Param.String; break;
//case Column.Pocket: results = Description.Param.String; break;
//case Column.Post_Bin_1: results = Description.Param.String; break;
//case Column.Post_Bin_2: results = Description.Param.String; break;
//case Column.Post_Bin_3: results = Description.Param.String; break;
//case Column.Post_Bin_4: results = Description.Param.String; break;
//case Column.Post_Bin_5: results = Description.Param.String; break;
//case Column.Post_Bin_6: results = Description.Param.String; break;
//case Column.Post_Bin_9: results = Description.Param.String; break;
//case Column.Pre_Bin_1: results = Description.Param.String; break;
//case Column.Pre_Bin_2: results = Description.Param.String; break;
//case Column.Pre_Bin_3: results = Description.Param.String; break;
//case Column.Pre_Bin_4: results = Description.Param.String; break;
//case Column.Pre_Bin_5: results = Description.Param.String; break;
//case Column.Pre_Bin_6: results = Description.Param.String; break;
//case Column.Pre_Bin_9: results = Description.Param.String; break;
case Column.Process: results = Description.Param.String; break;
//case Column.RPM_verif_Thickness_1: results = Description.Param.String; break;
//case Column.RPM_verif_Thickness_2: results = Description.Param.String; break;
//case Column.RPM_verif_Thickness_3: results = Description.Param.String; break;
//case Column.RPM_verif_Thickness_Average: results = Description.Param.String; break;
//case Column.RTA_oxide_Thk_Change: results = Description.Param.String; break;
//case Column.RTA_oxide_post_anneal_Thk: results = Description.Param.String; break;
//case Column.RTA_oxide_pre_anneal_Thk: results = Description.Param.String; break;
case Column.Recipe: results = Description.Param.String; break;
//case Column.Resistivity_2_ohm_cm: results = Description.Param.String; break;
//case Column.Resistivity_600_ohm_cm: results = Description.Param.String; break;
case Column.Rs_verification: results = Description.Param.String; break;
case Column.Rs_verif_100kohm: results = Description.Param.String; break;
case Column.Rs_verif_10ohm: results = Description.Param.String; break;
case Column.Rs_verif_1kohm: results = Description.Param.String; break;
case Column.SID: results = Description.Param.String; break;
case Column.SL_Period_WTAVG: results = Description.Param.String; break;
case Column.SL_Period: results = Description.Param.String; break;
//case Column.SPE_verification: results = Description.Param.String; break;
//case Column.Sample_ID: results = Description.Param.String; break;
case Column.Sheet_Concentration: results = Description.Param.String; break;
//case Column.Size: results = Description.Param.String; break;
//case Column.Small_Adder_Sum: results = Description.Param.String; break;
//case Column.Spirals_verification: results = Description.Param.String; break;
case Column.Time: results = Description.Param.String; break;
case Column.Tool_ID: results = Description.Param.String; break;
//case Column.Total_LPD_Adder: results = Description.Param.String; break;
//case Column.Total_Verification: results = Description.Param.String; break;
case Column.Total_Warp_Calibration: results = Description.Param.String; break;
case Column.UV_Broken: results = Description.Param.String; break;
case Column.UV_Chipping: results = Description.Param.String; break;
case Column.UV_Cracking_0_3mm_: results = Description.Param.String; break;
case Column.UV_Cracking_3_7mm_: results = Description.Param.String; break;
case Column.UV_Cracking_7mm_: results = Description.Param.String; break;
case Column.UV_Crazing: results = Description.Param.String; break;
case Column.UV_Crazing_Acceptable: results = Description.Param.String; break;
case Column.UV_FULL_Characterization_Wafer: results = Description.Param.String; break;
case Column.UV_Haze_count_: results = Description.Param.String; break;
case Column.UV_LIGHT_Characterization_Wafer: results = Description.Param.String; break;
case Column.UV_Non_rotation: results = Description.Param.String; break;
case Column.UV_Other: results = Description.Param.String; break;
case Column.UV_Scratch_count_: results = Description.Param.String; break;
case Column.UV_Slip_count_: results = Description.Param.String; break;
case Column.UV_True_Haze: results = Description.Param.String; break;
case Column.UV_True_Haze_Acceptable: results = Description.Param.String; break;
case Column.UV_SPE_1mm_count: results = Description.Param.String; break;
case Column.UV_SPE_count_: results = Description.Param.String; break;
case Column.Verification_Contact_Symmetry: results = Description.Param.String; break;
case Column.Vp_Pinch_Off_Voltage: results = Description.Param.String; break;
case Column.Wafer_ID: results = Description.Param.String; break;
//case Column.Wafer_Pocket: results = Description.Param.String; break;
case Column.Wafer_Region: results = Description.Param.String; break;
case Column.Wafer_Scribe: results = Description.Param.String; break;
case Column.WaferPocket_Candela: results = Description.Param.String; break;
case Column.WaferPocket_Warp: results = Description.Param.String; break;
case Column.WaferPosition_CV: results = Description.Param.String; break;
case Column.WaferPosition_BV: results = Description.Param.String; break;
case Column.WaferPosition_Hall: results = Description.Param.String; break;
case Column.WaferPosition_PR: results = Description.Param.String; break;
case Column.Warp: results = Description.Param.String; break;
case Column.X_Coord: results = Description.Param.String; break;
case Column.XRD_2_Theta_Peak_002: results = Description.Param.String; break;
case Column.XRD_2_Theta_Peak_101: results = Description.Param.String; break;
case Column.XRD_2_Theta_Position: results = Description.Param.String; break;
case Column.XRD_2_Theta_Position_Si_1: results = Description.Param.String; break;
case Column.XRD_2_Theta_Position_Si_2: results = Description.Param.String; break;
case Column.XRD_2_Theta_Position_Si_3: results = Description.Param.String; break;
case Column.XRD_Peak_002_Intensity: results = Description.Param.String; break;
case Column.XRD_Peak_101_Intensity: results = Description.Param.String; break;
case Column.XRD_Weekly_AL_Center: results = Description.Param.String; break;
case Column.XRD_Weekly_Back_Barrier_Al_: results = Description.Param.String; break;
case Column.XRD_Weekly_Barrier_Al_: results = Description.Param.String; break;
case Column.XRD_Weekly_FWHM_002: results = Description.Param.String; break;
case Column.XRD_Weekly_FWHM_101: results = Description.Param.String; break;
case Column.XRD_Weekly_FWHM_105: results = Description.Param.String; break;
case Column.XRD_Weekly_Fringe_thick_0_0_: results = Description.Param.String; break;
case Column.XRD_Weekly_Fringe_thick_48_48_: results = Description.Param.String; break;
case Column.XRD_Weekly_Intensity: results = Description.Param.String; break;
case Column.XRD_Weekly_Super_Lattice_Al_: results = Description.Param.String; break;
case Column.XRD_Weekly_Super_Lattice_period: results = Description.Param.String; break;
case Column.XRD_Weekly_Super_Lattice_tks: results = Description.Param.String; break;
case Column.XRR_Thickness_nm_WTAVG: results = Description.Param.String; break;
case Column.XRR_Thickness_nm_: results = Description.Param.String; break;
case Column.Y_Coord: results = Description.Param.String; break;
case Column.YellowBand_Power_mW_: results = Description.Param.String; break;
case Column.YellowBand_V: results = Description.Param.String; break;
case Column.YellowBand_V_XY: results = Description.Param.String; break;
case Column.YellowBand_nm: results = Description.Param.String; break;
//case Column.pH: results = Description.Param.String; break;
case Column.Ag: results = Description.Param.String; break;
case Column.Al: results = Description.Param.String; break;
case Column.As: results = Description.Param.String; break;
case Column.Au: results = Description.Param.String; break;
case Column.B: results = Description.Param.String; break;
case Column.Ba: results = Description.Param.String; break;
case Column.Ca: results = Description.Param.String; break;
case Column.Ce: results = Description.Param.String; break;
case Column.Co: results = Description.Param.String; break;
case Column.Cr: results = Description.Param.String; break;
case Column.Cu: results = Description.Param.String; break;
case Column.Fe: results = Description.Param.String; break;
case Column.Ga: results = Description.Param.String; break;
case Column.Ge: results = Description.Param.String; break;
case Column.Hf: results = Description.Param.String; break;
case Column.K: results = Description.Param.String; break;
case Column.Li: results = Description.Param.String; break;
case Column.Mg: results = Description.Param.String; break;
case Column.Mn: results = Description.Param.String; break;
case Column.Mo: results = Description.Param.String; break;
case Column.Na: results = Description.Param.String; break;
case Column.Ni: results = Description.Param.String; break;
case Column.P: results = Description.Param.String; break;
case Column.Pb: results = Description.Param.String; break;
case Column.Sn: results = Description.Param.String; break;
case Column.Ta: results = Description.Param.String; break;
case Column.Ti: results = Description.Param.String; break;
case Column.W: results = Description.Param.String; break;
case Column.Y: results = Description.Param.String; break;
case Column.Zn: results = Description.Param.String; break;
default: throw new Exception();
}
return results;
}
}
public enum Column
{
//_8in_Total_Warp_Verification,
//AFM_Monthly_Y,
//AFM_Monthly,
AFM_Pit_Count,
AFM_Roughness,
//Adder_Bin_1,
//Adder_Bin_2,
//Adder_Bin_3,
//Adder_Bin_4,
//Adder_Bin_5,
//Adder_Bin_6,
//Adder_Bin_9,
Al_B_B_WTAVG,
Al_B_B_,
Al_Barrier_WTAVG,
Al_Barrier,
Al_SLS_WTAVG,
Al_SLS,
Al_TL1_WTAVG,
Al_TL1,
Al_TL2_WTAVG,
//BV_Resistance,
BandEdge_V,
BandEdge_V_XY,
BandEdge_nm,
Barrier_Composition_RPM_XY,
Bow_Calibration,
Bow_Range,
Bow,
BowCenter,
BowX,
BowY,
Breakdown_Voltage_Edge,
Breakdown_VoltageMiddle,
Breakdown_Voltage,
CV_C_at_10V,
CV_Nd_Min,
//Candela_Large_LPD_Quarterly,
//Candela_Medium_LPD_Quarterly,
//Candela_Small_LPD_Quarterly,
//Candela_Total_Quarterly,
Candela_102_83nm,
Candela_1_1um,
Candela_496nm,
Candela_600nm,
Candela_8620_Small,
Candela_Crack_Verification,
Candela_Cracking,
Candela_Cracking_Acceptable,
Candela_Crater,
Candela_Crater_Verification,
Candela_Haze,
Candela_LPD_Large,
Candela_LPD_Medium,
Candela_LPD_Small,
Candela_Large_Verification,
Candela_Medium_Verification,
Candela_Pits,
Candela_Pits_Verification,
Candela_SPE,
Candela_SPE_Verification,
Candela_Slip,
Candela_Small_Verification,
Candela_Spirals,
Candela_Spirals_Verification,
Candela_Total_Defects,
Candela_Total_PSL,
Candela__1_1um,
//Comment,
//Conductivity,
Contact_Symmetry,
//Cracking_verification,
//Crater_verification,
Date,
Denton_Crystal_Life,
Denton_Current_AVG,
Denton_Current_STDEV,
Denton_Deposition_Power_AVG,
Denton_Deposition_Power_STDEV,
Denton_Deposition_Rate_AVG,
Denton_Deposition_Rate_STDEV,
Denton_Gun_Pocket,
Denton_Pumpdown_Time,
Denton_Voltage_AVG,
Denton_Voltage_STDEV,
Employee,
Epi_Thickness_Mean,
Epi_Thickness_Mean_XY,
Epi_Thickness_Std_Dev_,
FWHM_006_WTAVG,
FWHM_006,
FWHM_105_WTAVG,
FWHM_105,
Hall_Rs,
Hall_Mobility_verif_sample,
Hall_Ns_verif_sample,
Hall_Rs_verif_sample,
Job,
LEI_RS_Average_value,
LEI_RS_Maximum_value,
LEI_RS_Minimum_value,
LEI_RS_STDEV,
LEI_RS_STDEV_,
//Large_Adder_Sum,
Lot,
//Medium_Adder_Sum,
Microscope_Center_50x,
Microscope_Center_5x,
Microscope_Edge_50x,
Microscope_Edge_5x,
Microscope_Middle_50x,
Microscope_Middle_5x,
Mobility_Verification,
Mobility,
Ns_Verification,
PL_Edge_Wavelength,
PL_Ratio,
PR_Barrier_Composition,
PR_Peak,
Part,
//Particles_verification,
//Pits_verification,
//Pocket,
//Post_Bin_1,
//Post_Bin_2,
//Post_Bin_3,
//Post_Bin_4,
//Post_Bin_5,
//Post_Bin_6,
//Post_Bin_9,
//Pre_Bin_1,
//Pre_Bin_2,
//Pre_Bin_3,
//Pre_Bin_4,
//Pre_Bin_5,
//Pre_Bin_6,
//Pre_Bin_9,
Process,
//RPM_verif_Thickness_1,
//RPM_verif_Thickness_2,
//RPM_verif_Thickness_3,
//RPM_verif_Thickness_Average,
//RTA_oxide_Thk_Change,
//RTA_oxide_post_anneal_Thk,
//RTA_oxide_pre_anneal_Thk,
Recipe,
//Resistivity_2_ohm_cm,
//Resistivity_600_ohm_cm,
Rs_verification,
Rs_verif_100kohm,
Rs_verif_10ohm,
Rs_verif_1kohm,
SID,
SL_Period_WTAVG,
SL_Period,
//SPE_verification,
//Sample_ID,
Sheet_Concentration,
//Size,
//Small_Adder_Sum,
//Spirals_verification,
Time,
Tool_ID,
//Total_LPD_Adder,
//Total_Verification,
Total_Warp_Calibration,
UV_Broken,
UV_Chipping,
UV_Cracking_0_3mm_,
UV_Cracking_3_7mm_,
UV_Cracking_7mm_,
UV_Crazing,
UV_Crazing_Acceptable,
UV_FULL_Characterization_Wafer,
UV_Haze_count_,
UV_LIGHT_Characterization_Wafer,
UV_Non_rotation,
UV_Other,
UV_Scratch_count_,
UV_Slip_count_,
UV_True_Haze,
UV_True_Haze_Acceptable,
UV_SPE_1mm_count,
UV_SPE_count_,
Verification_Contact_Symmetry,
Vp_Pinch_Off_Voltage,
Wafer_ID,
//Wafer_Pocket,
Wafer_Region,
Wafer_Scribe,
WaferPocket_Candela,
WaferPocket_Warp,
WaferPosition_CV,
WaferPosition_BV,
WaferPosition_Hall,
WaferPosition_PR,
Warp,
X_Coord,
XRD_2_Theta_Peak_002,
XRD_2_Theta_Peak_101,
XRD_2_Theta_Position,
XRD_2_Theta_Position_Si_1,
XRD_2_Theta_Position_Si_2,
XRD_2_Theta_Position_Si_3,
XRD_Peak_002_Intensity,
XRD_Peak_101_Intensity,
XRD_Weekly_AL_Center,
XRD_Weekly_Back_Barrier_Al_,
XRD_Weekly_Barrier_Al_,
XRD_Weekly_FWHM_002,
XRD_Weekly_FWHM_101,
XRD_Weekly_FWHM_105,
XRD_Weekly_Fringe_thick_0_0_,
XRD_Weekly_Fringe_thick_48_48_,
XRD_Weekly_Intensity,
XRD_Weekly_Super_Lattice_Al_,
XRD_Weekly_Super_Lattice_period,
XRD_Weekly_Super_Lattice_tks,
XRR_Thickness_nm_,
XRR_Thickness_nm_WTAVG,
Y_Coord,
YellowBand_Power_mW_,
YellowBand_V,
YellowBand_V_XY,
YellowBand_nm,
//pH,
Ag,
Al,
As,
Au,
B,
Ba,
Ca,
Ce,
Co,
Cr,
Cu,
Fe,
Ga,
Ge,
Hf,
K,
Li,
Mg,
Mn,
Mo,
Na,
Ni,
P,
Pb,
Sn,
Ta,
Ti,
W,
Y,
Zn
}
}

View File

@ -1,398 +0,0 @@
using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Adaptation.Shared.Metrology
{
public class ConfigDataBase
{
public bool UseCyclicalForDescription { get; protected set; }
public Dictionary<string, string> CellNames { get; protected set; }
public Dictionary<string, string> MesEntities { get; protected set; }
public IProcessDataDescription ProcessDataDescription { get; protected set; }
public bool IsEvent { get; private set; }
public bool EafHosted { get; private set; }
public string CellName { get; private set; }
public bool IsSourceTimer { get; private set; }
public EquipmentType EquipmentType => _EquipmentType;
public string EquipmentElementName { get; private set; }
public bool IsDatabaseExportToIPDSF { get; private set; }
public EquipmentType? EquipmentConnection => _EquipmentConnection;
public FileConnectorConfiguration FileConnectorConfiguration { get; private set; }
protected readonly EventName _EventName;
protected readonly EquipmentType _EquipmentType;
protected readonly EquipmentType? _EquipmentConnection;
protected readonly Dictionary<string, string> _Reactors;
public ConfigDataBase(string cellName, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, bool isEAFHosted)
{
CellName = cellName;
EafHosted = isEAFHosted;
EquipmentType equipmentTypeValue;
_Reactors = new Dictionary<string, string>();
CellNames = new Dictionary<string, string>();
MesEntities = new Dictionary<string, string>();
EquipmentElementName = cellInstanceConnectionName;
FileConnectorConfiguration = fileConnectorConfiguration;
string[] segments = parameterizedModelObjectDefinitionType.Split('.');
IsSourceTimer = (fileConnectorConfiguration.SourceFileFilter.StartsWith("*Timer.txt"));
string cellInstanceConnectionNameBase = cellInstanceConnectionName.Replace("-", string.Empty);
IsDatabaseExportToIPDSF = (fileConnectorConfiguration.SourceFileLocation.Contains("DatabaseExport"));
if (!Enum.TryParse(segments[segments.Length - 1], out EventName eventNameValue))
throw new Exception(cellInstanceConnectionName);
if (!Enum.TryParse(cellInstanceConnectionNameBase, out equipmentTypeValue))
_EquipmentConnection = null;
else
_EquipmentConnection = equipmentTypeValue;
string suffix;
switch (eventNameValue)
{
case EventName.FileRead: suffix = string.Empty; break;
case EventName.FileReadDaily: suffix = "_Daily"; break;
case EventName.FileReadWeekly: suffix = "_Weekly"; break;
case EventName.FileReadMonthly: suffix = "_Monthly"; break;
case EventName.FileReadVerification: suffix = "_Verification"; break;
default: throw new Exception(cellInstanceConnectionName);
}
string parameterizedModelObjectDefinitionTypeAppended = string.Concat(segments[0], suffix);
IsEvent = cellInstanceConnectionNameBase != parameterizedModelObjectDefinitionTypeAppended;
_EventName = eventNameValue;
if (!Enum.TryParse(parameterizedModelObjectDefinitionTypeAppended, out equipmentTypeValue))
throw new Exception(cellInstanceConnectionName);
_EquipmentType = equipmentTypeValue;
if (!isEAFHosted && equipmentTypeName != parameterizedModelObjectDefinitionTypeAppended)
throw new Exception(cellInstanceConnectionName);
}
public string GetEventName()
{
string result = _EventName.ToString();
return result;
}
public EventName GetEventNameValue()
{
EventName result = _EventName;
return result;
}
public string GetEquipmentType()
{
string result;
if (_EquipmentConnection is null)
result = _EquipmentType.ToString();
else
result = _EquipmentConnection.Value.ToString();
return result;
}
public string GetEventDescription()
{
string result = ProcessDataDescription.GetEventDescription();
return result;
}
public IProcessDataDescription GetDefault(ILogic logic)
{
IProcessDataDescription result = ProcessDataDescription.GetDefault(logic, this);
return result;
}
public IProcessDataDescription GetDisplayNames(ILogic logic)
{
IProcessDataDescription result = ProcessDataDescription.GetDisplayNames(logic, this);
return result;
}
public List<string> GetDetailNames(ILogic logic)
{
List<string> results = ProcessDataDescription.GetDetailNames(logic, this);
return results;
}
public List<string> GetHeaderNames(ILogic logic)
{
List<string> results = ProcessDataDescription.GetHeaderNames(logic, this);
return results;
}
public List<string> GetNames(ILogic logic)
{
List<string> results = ProcessDataDescription.GetNames(logic, this);
return results;
}
public List<string> GetPairedParameterNames(ILogic logic)
{
List<string> results = ProcessDataDescription.GetPairedParameterNames(logic, this);
return results;
}
public List<string> GetParameterNames(ILogic logic)
{
List<string> results = ProcessDataDescription.GetParameterNames(logic, this);
return results;
}
public List<IProcessDataDescription> GetDescription(ILogic logic, List<Test> tests, IProcessData iProcessData)
{
List<IProcessDataDescription> results = ProcessDataDescription.GetDescription(logic, this, tests, iProcessData);
return results;
}
public string GetCurrentReactor(ILogic logic)
{
string result = string.Empty;
foreach (KeyValuePair<string, string> keyValuePair in _Reactors)
{
foreach (string filePrefix in keyValuePair.Value.Split('|'))
{
if (logic.Logistics.MID.StartsWith(filePrefix) || (_EventName != EventName.FileRead && MesEntities.ContainsKey(logic.Logistics.JobID) && keyValuePair.Value == MesEntities[logic.Logistics.JobID]))
{
result = keyValuePair.Key;
break;
}
}
}
if (string.IsNullOrEmpty(result) && _Reactors.Count == 1)
result = _Reactors.ElementAt(0).Key;
return result;
}
protected JsonElement GetDefaultJsonElement(ILogic logic)
{
JsonElement result;
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDefault(logic, this);
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
object @object = JsonSerializer.Deserialize<object>(json);
result = (JsonElement)@object;
return result;
}
public Dictionary<string, List<Tuple<Enum, string, string, object>>> GetParameterInfo(ILogic logic, bool allowNull)
{
Dictionary<string, List<Tuple<Enum, string, string, object>>> results = new Dictionary<string, List<Tuple<Enum, string, string, object>>>();
string description;
Enum param;
Tuple<Enum, string, string, object> tuple;
JsonElement defaultJsonElement = GetDefaultJsonElement(logic);
Dictionary<string, string> keyValuePairs = GetDisplayNamesJsonElement(logic);
foreach (JsonProperty jsonProperty in defaultJsonElement.EnumerateObject())
{
if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull)
throw new Exception();
if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array)
{
description = string.Empty;
param = Description.Param.StructuredType;
//jValue = jObject.Value<JValue>("Item1");
throw new NotImplementedException("Item1");
}
else
{
switch (jsonProperty.Value.ValueKind)
{
case JsonValueKind.String: param = Description.Param.String; break;
case JsonValueKind.Number: param = Description.Param.Double; break;
case JsonValueKind.True:
case JsonValueKind.False: param = Description.Param.Boolean; break;
case JsonValueKind.Null: param = Description.Param.String; break;
default: param = Description.Param.StructuredType; break;
}
}
if (!keyValuePairs.ContainsKey(jsonProperty.Name))
description = string.Empty;
else
description = keyValuePairs[jsonProperty.Name];
tuple = new Tuple<Enum, string, string, object>(param, jsonProperty.Name, description, jsonProperty.Value.ToString());
if (!results.ContainsKey(jsonProperty.Name))
results.Add(jsonProperty.Name, new List<Tuple<Enum, string, string, object>>());
results[jsonProperty.Name].Add(tuple);
}
return results;
}
protected void WriteExportAliases(ILogic logic, string cellName, string equipmentElementName)
{
int i = 0;
Enum param;
object value;
Enum[] @params;
string description;
StringBuilder stringBuilder = new StringBuilder();
string shareRoot = @"\\messv02ecc1.ec.local\EC_EDA";
string shareDirectory = string.Concat(shareRoot, @"\Staging\Pdsf\", cellName, @"\ExportAliases\", equipmentElementName);
Dictionary<string, List<Tuple<Enum, string, string, object>>> keyValuePairs;
if (!(logic is null))
keyValuePairs = GetParameterInfo(logic, allowNull: false);
else
keyValuePairs = new Dictionary<string, List<Tuple<Enum, string, string, object>>>();
stringBuilder.AppendLine("\"AliasName\";\"Condition\";\"EventId\";\"ExceptionId\";\"Formula\";\"HardwareId\";\"OrderId\";\"ParameterName\";\"Remark\";\"ReportName\";\"SourceId\";\"Use\"");
if (!Directory.Exists(shareRoot))
return;
if (!Directory.Exists(shareDirectory))
Directory.CreateDirectory(shareDirectory);
string shareFile = string.Concat(shareDirectory, @"\", DateTime.Now.Ticks, ".csv");
foreach (KeyValuePair<string, List<Tuple<Enum, string, string, object>>> keyValuePair in keyValuePairs)
{
i += 1;
@params = (from l in keyValuePair.Value select l.Item1).Distinct().ToArray();
if (@params.Length != 1)
throw new Exception();
if (keyValuePair.Value[0].Item2 != keyValuePair.Key)
throw new Exception();
param = @params[0];
if (!(param is Description.Param.String))
stringBuilder.AppendLine($"\"{keyValuePair.Key}\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{keyValuePair.Key}\";\"\";\"{cellName}/{EquipmentElementName}/{_EventName}\";\"\";\"True\"");
else
{
description = keyValuePair.Value[0].Item3.Split('|')[0];
if (string.IsNullOrEmpty(description))
continue;
value = keyValuePair.Value[0].Item4;
stringBuilder.AppendLine($"\"'{description}'\";\"\";\"\";\"\";\"\";\"\";\"{i}\";\"{cellName}/{EquipmentElementName}/{value}\";\"\";\"{cellName}/{EquipmentElementName}/{_EventName}\";\"\";\"True\"");
}
}
if (keyValuePairs.Any())
File.WriteAllText(shareFile, stringBuilder.ToString());
}
public Dictionary<string, string> GetDisplayNamesJsonElement(ILogic logic)
{
Dictionary<string, string> results = new Dictionary<string, string>();
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDisplayNames(logic, this);
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
JsonElement jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
{
if (!results.ContainsKey(jsonProperty.Name))
results.Add(jsonProperty.Name, string.Empty);
if (jsonProperty.Value is JsonElement jsonPropertyValue)
results[jsonProperty.Name] = jsonPropertyValue.ToString();
}
return results;
}
public List<string> GetIgnoreParameterNames(ILogic logic, Test test, bool includePairedParameterNames)
{
List<string> results = ProcessDataDescription.GetIgnoreParameterNames(logic, this, test);
if (includePairedParameterNames)
{
string value;
List<string> pairedParameterNames = ProcessDataDescription.GetPairedParameterNames(logic, this);
IProcessDataDescription processDataDescription = ProcessDataDescription.GetDisplayNames(logic, this);
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
object @object = JsonSerializer.Deserialize<object>(json);
if (!(@object is JsonElement jsonElement))
throw new Exception();
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
{
if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array)
throw new Exception();
value = jsonProperty.Value.ToString();
if (!results.Contains(jsonProperty.Name) && pairedParameterNames.Contains(jsonProperty.Name) && (string.IsNullOrEmpty(value) || value[0] == '|'))
results.Add(jsonProperty.Name);
}
}
return results;
}
public List<Duplicator.Description> GetProcessDataDescriptions(JsonElement jsonElement)
{
List<Duplicator.Description> results;
if (jsonElement.ValueKind != JsonValueKind.Array)
throw new Exception();
JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString };
results = JsonSerializer.Deserialize<List<Duplicator.Description>>(jsonElement.ToString(), jsonSerializerOptions);
return results;
}
public Dictionary<Test, List<Duplicator.Description>> GetKeyValuePairs(List<Duplicator.Description> processDataDescriptions)
{
Dictionary<Test, List<Duplicator.Description>> results = new Dictionary<Test, List<Duplicator.Description>>();
Test testKey;
for (int i = 0; i < processDataDescriptions.Count; i++)
{
testKey = (Test)processDataDescriptions[i].Test;
if (!results.ContainsKey(testKey))
results.Add(testKey, new List<Duplicator.Description>());
results[testKey].Add(processDataDescriptions[i]);
}
return results;
}
public Dictionary<string, List<string>> GetKeyValuePairs(JsonElement jsonElement, List<Duplicator.Description> processDataDescriptions, Test test)
{
Dictionary<string, List<string>> results = new Dictionary<string, List<string>>();
Test testKey;
if (jsonElement.ValueKind != JsonValueKind.Array)
throw new Exception();
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
if (processDataDescriptions.Count != jsonElements.Length)
throw new Exception();
for (int i = 0; i < processDataDescriptions.Count; i++)
{
testKey = (Test)processDataDescriptions[i].Test;
if (testKey != test)
continue;
foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject())
{
if (jsonProperty.Value.ValueKind == JsonValueKind.Object || jsonProperty.Value.ValueKind == JsonValueKind.Array)
throw new Exception();
if (!results.ContainsKey(jsonProperty.Name))
results.Add(jsonProperty.Name, new List<string>());
results[jsonProperty.Name].Add(jsonProperty.Value.ToString());
}
}
return results;
}
protected void VerifyProcessDataDescription(ILogic logic)
{
string description;
bool allowNull = false;
JsonElement defaultJsonElement = GetDefaultJsonElement(logic);
Dictionary<string, string> keyValuePairs = GetDisplayNamesJsonElement(logic);
JsonProperty[] jsonProperties = defaultJsonElement.EnumerateObject().ToArray();
foreach (JsonProperty jsonProperty in jsonProperties)
{
if (jsonProperty.Value.ValueKind == JsonValueKind.Null && !allowNull)
throw new Exception();
if (!(jsonProperty.Value.ValueKind is JsonValueKind.String) || !keyValuePairs.ContainsKey(jsonProperty.Name))
description = string.Empty;
else
description = keyValuePairs[jsonProperty.Name].Split('|')[0];
}
}
public List<IProcessDataDescription> GetIProcessDataDescriptions(JsonElement jsonElement)
{
List<IProcessDataDescription> results = new List<IProcessDataDescription>();
if (jsonElement.ValueKind != JsonValueKind.Array)
throw new Exception();
object @object;
Type type = ProcessDataDescription.GetType();
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString };
for (int i = 0; i < jsonElements.Length; i++)
{
@object = JsonSerializer.Deserialize(jsonElements[i].ToString(), type, jsonSerializerOptions);
if (!(@object is IProcessDataDescription processDataDescription))
continue;
results.Add(processDataDescription);
}
return results;
}
}
}

View File

@ -1,13 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public enum EventName
{
FileRead,
FileReadDaily,
FileReadMonthly,
FileReadVerification,
FileReadWeekly
}
}

View File

@ -1,45 +0,0 @@
using Adaptation.Eaf.Management.ConfigurationData.CellAutomation;
using Adaptation.Ifx.Eaf.EquipmentConnector.File.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text.Json;
namespace Adaptation.Shared.Metrology
{
public interface ILogic
{
ILogic ShallowCopy();
Logistics Logistics { get; }
void ConfigurationRestore();
string GetConfigurationErrorTargetFileLocation();
string GetConfigurationSourceFileLocation();
string GetConfigurationTarget2FileLocation();
string GetConfigurationTargetFileLocation();
string GetConfigurationTargetFileName();
Tuple<string, JsonElement?, List<FileInfo>> GetExtractResult(string reportFullPath, string eventName);
object GetFilePathGeneratorInfo(string reportFullPath, bool isErrorFile);
string GetReportFullPath(Dictionary<string, object> keyValuePairs);
string GetTarget2FileLocation();
void Move(string reportFullPath, Tuple<string, JsonElement?, List<FileInfo>> extractResults, Exception exception = null);
Tuple<string, JsonElement?, List<FileInfo>> ReExtract(string searchDirectory, string sourceFileFilter);
void ReflectionCreateSelfDescription(string equipmentElementName, int? input, string cellName, string debugConfig, string[] strings, bool[] booleans, long[] numbers, string[] enums);
ConfigDataBase ReflectionCreateSelfDescriptionV2(string json);
string ResolveErrorTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
string ResolveSourcePlaceHolders(string reportFullPath, bool createDirectory = true);
string ResolveTarget2PlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
string ResolveTargetPlaceHolders(string reportFullPath, bool createDirectory = true, string fileFoundPath = "");
void SetFileParameter(string key, string value);
void SetFileParameterLotID(string value, bool includeLogisticsSequence = false);
void SetFileParameterLotIDToLogisticsMID(bool includeLogisticsSequence = true);
void SetFileParameterSystemDateTimeToLogisticsSequence();
void SetPlaceHolder(string reportFullPath, string key, string value);
void SetTarget2FileLocation(string value);
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08AFMD3100
{
public enum Test
{
AFMRoughness = Metrology.Test.AFMRoughness
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08ANLYSDIFAAST230
{
public enum Test
{
DiffusionLength = Metrology.Test.DiffusionLength
}
}
}

View File

@ -1,16 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08BVHGPROBE
{
public enum Test
{
BreakdownVoltageCenter = Metrology.Test.BreakdownVoltageCenter,
BreakdownVoltageEdge = Metrology.Test.BreakdownVoltageEdge,
BreakdownVoltageMiddle8in = Metrology.Test.BreakdownVoltageMiddle8in
}
}
}

View File

@ -1,16 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08CVHGPROBE802B150
{
public enum Test
{
CV = Metrology.Test.CV,
MonthlyCV = Metrology.Test.MonthlyCV,
WeeklyCV = Metrology.Test.WeeklyCV
}
}
}

View File

@ -1,18 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08DDINCAN8620
{
public enum Test
{
CandelaKlarfDC = Metrology.Test.CandelaKlarfDC,
CandelaLaser = Metrology.Test.CandelaLaser,
CandelaVerify = Metrology.Test.CandelaVerify,
CandelaPSL = Metrology.Test.CandelaPSL,
CandelaProdU = Metrology.Test.CandelaProdU
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08DDUPSFS6420
{
public enum Test
{
Tencor = Metrology.Test.Tencor
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08DDUPSP1TBI
{
public enum Test
{
SP1 = Metrology.Test.SP1
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08EBEAMINTEGRITY26
{
public enum Test
{
Denton = Metrology.Test.Denton
}
}
}

View File

@ -1,16 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08HALLHL5580
{
public enum Test
{
Hall = Metrology.Test.Hall,
MonthlyHall = Metrology.Test.MonthlyHall,
WeeklyHall = Metrology.Test.WeeklyHall
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08MESMICROSCOPE
{
public enum Test
{
Microscope = Metrology.Test.Microscope
}
}
}

View File

@ -1,15 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08NDFRESIMAP151C
{
public enum Test
{
Lehighton = Metrology.Test.Lehighton,
VerificationLehighton = Metrology.Test.VerificationLehighton
}
}
}

View File

@ -1,20 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08PLMAPRPM
{
public enum Test
{
RPMXY = Metrology.Test.RPMXY,
RPMAverage = Metrology.Test.RPMAverage,
RPMPLRatio = Metrology.Test.RPMPLRatio,
DailyRPMXY = Metrology.Test.DailyRPMXY,
DailyRPMAverage = Metrology.Test.DailyRPMAverage,
DailyRPMPLRatio = Metrology.Test.DailyRPMPLRatio,
VerificationRPM = Metrology.Test.VerificationRPM
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08PRFUSB4000
{
public enum Test
{
Photoreflectance = Metrology.Test.Photoreflectance
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08RESIHGCV
{
public enum Test
{
HgCV = Metrology.Test.HgCV
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08RESIMAPCDE
{
public enum Test
{
CDE = Metrology.Test.CDE
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08THFTIRQS408M
{
public enum Test
{
BioRadQS408M = Metrology.Test.BioRadQS408M
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08THFTIRSTRATUS
{
public enum Test
{
BioRadStratus = Metrology.Test.BioRadStratus
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08UVH44GS100M
{
public enum Test
{
UV = Metrology.Test.UV
}
}
}

View File

@ -1,14 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08VPDSUBCON
{
public enum Test
{
VpdIcpmsAnalyte = Metrology.Test.VpdIcpmsAnalyte
}
}
}

View File

@ -1,15 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08WGEOMX203641Q
{
public enum Test
{
WarpAndBow = Metrology.Test.WarpAndBow,
VerificationWarpAndBow = Metrology.Test.VerificationWarpAndBow
}
}
}

View File

@ -1,23 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public class MET08XRDXPERTPROMRDXL
{
public enum Test
{
XRDXY = Metrology.Test.XRDXY,
XRDWeightedAverage = Metrology.Test.XRDWeightedAverage,
MonthlyXRD = Metrology.Test.MonthlyXRD,
WeeklyXRD = Metrology.Test.WeeklyXRD,
WeeklyXRDAIcomp = Metrology.Test.WeeklyXRDAIcomp,
WeeklyXRDFWHM002 = Metrology.Test.WeeklyXRDFWHM002,
WeeklyXRDFWHM105 = Metrology.Test.WeeklyXRDFWHM105,
WeeklyXRDSLStks = Metrology.Test.WeeklyXRDSLStks,
WeeklyXRDXRR = Metrology.Test.WeeklyXRDXRR,
XRDXRAY = Metrology.Test.XRDXRAY
}
}
}

View File

@ -1,36 +0,0 @@
using System;
namespace Adaptation.Shared.Metrology
{
internal class OIGaNViewer
{
private static System.Net.WebClient _WebClient;
internal static string WebClientDownloadString(string baseAddress, ConfigDataBase configDataBase, string reportFullPath, bool isErrorFile, string target)
{
string result = string.Empty;
if (System.Diagnostics.Debugger.IsAttached)
result = DateTime.Now.ToString();
else
{
if (string.IsNullOrEmpty(baseAddress) || !baseAddress.Contains(":") || !baseAddress.Contains("."))
throw new Exception("Invalid URL");
try
{
if (_WebClient is null)
_WebClient = new System.Net.WebClient();
string address = string.Concat(baseAddress, "/Home/ExtractMove/?equipment_connection=", configDataBase.GetEquipmentType(), "&is_error_file=", isErrorFile);
_WebClient.OpenRead(address);
result = _WebClient.ResponseHeaders["Date"];
_WebClient.CancelAsync();
}
catch (Exception) { }
}
return result;
}
}
}

View File

@ -1,110 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text.Json;
namespace Adaptation.Shared.Metrology
{
public class Duplicator
{
public class Description : IProcessDataDescription
{
public int Test { get; set; }
public int Count { get; set; }
public int Index { get; set; }
//
public string EventName { get; set; }
public string NullData { get; set; }
public string JobID { get; set; }
public string Sequence { get; set; }
public string MesEntity { get; set; }
public string ReportFullPath { get; set; }
public string ProcessJobID { get; set; }
public string MID { get; set; }
public string Date { get; set; } //2021-02-22
public string GetEventDescription() { return "File Has been read and parsed"; }
public List<string> GetHeaderNames(ILogic logic, ConfigDataBase configDataBase)
{
List<string> results = new List<string>();
return results;
}
public List<string> GetDetailNames(ILogic logic, ConfigDataBase configDataBase)
{
List<string> results = new List<string>();
return results;
}
public List<string> GetParameterNames(ILogic logic, ConfigDataBase configDataBase)
{
List<string> results = new List<string>();
return results;
}
public List<string> GetPairedParameterNames(ILogic logic, ConfigDataBase configDataBase)
{
List<string> results = new List<string>();
return results;
}
public List<string> GetIgnoreParameterNames(ILogic logic, ConfigDataBase configDataBase, Test test)
{
List<string> results = new List<string>();
return results;
}
public List<string> GetNames(ILogic logic, ConfigDataBase configDataBase)
{
List<string> results = new List<string>();
IProcessDataDescription processDataDescription = GetDefault(logic, configDataBase);
string json = JsonSerializer.Serialize(processDataDescription, processDataDescription.GetType());
object @object = JsonSerializer.Deserialize<object>(json);
if (!(@object is JsonElement jsonElement))
throw new Exception();
foreach (JsonProperty jsonProperty in jsonElement.EnumerateObject())
results.Add(jsonProperty.Name);
return results;
}
public IProcessDataDescription GetDisplayNames(ILogic logic, ConfigDataBase configDataBase)
{
Description result = new Description();
return result;
}
public IProcessDataDescription GetDefault(ILogic logic, ConfigDataBase configDataBase)
{
Description result = new Description
{
Test = -1,
Count = 0,
Index = -1,
//
EventName = configDataBase.GetEventName(),
NullData = string.Empty,
JobID = logic.Logistics.JobID,
Sequence = logic.Logistics.Sequence.ToString(),
MesEntity = logic.Logistics.MesEntity,
ReportFullPath = logic.Logistics.ReportFullPath,
ProcessJobID = logic.Logistics.ProcessJobID,
MID = logic.Logistics.MID,
Date = logic.Logistics.DateTimeFromSequence.ToUniversalTime().ToString("MM/dd/yyyy HH:mm:ss"),
};
return result;
}
public List<IProcessDataDescription> GetDescription(ILogic logic, ConfigDataBase configDataBase, List<Test> tests, IProcessData iProcessData)
{
List<IProcessDataDescription> results = new List<IProcessDataDescription>();
return results;
}
}
}
}

View File

@ -1,527 +0,0 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
namespace Adaptation.Shared.Metrology
{
public class ProcessDataStandardFormat
{
public const string RecordStart = "RECORD_START";
public enum SearchFor
{
EquipmentIntegration = 1,
BusinessIntegration = 2,
SystemExport = 3,
Archive = 4
}
public static string GetPDSFText(ILogic logic, string eventName, string equipmentType, JsonElement jsonElement, string logisticsText)
{
string result;
if (jsonElement.ValueKind != JsonValueKind.Array)
result = string.Empty;
else
{
int columns = 0;
List<string> lines;
string endOffset = "E#######T";
string dataOffset = "D#######T";
string headerOffset = "H#######T";
string format = "MM/dd/yyyy HH:mm:ss";
StringBuilder stringBuilder = new StringBuilder();
lines = new string[] { "HEADER_TAG\tHEADER_VALUE", "FORMAT\t2.00", "NUMBER_PASSES\t0001", string.Concat("HEADER_OFFSET\t", headerOffset), string.Concat("DATA_OFFSET\t", dataOffset), string.Concat("END_OFFSET\t", endOffset) }.ToList();
stringBuilder.Append("\"Time\"").Append('\t');
stringBuilder.Append("\"A_LOGISTICS\"").Append('\t');
stringBuilder.Append("\"B_LOGISTICS\"").Append('\t');
JsonElement[] jsonElements = jsonElement.EnumerateArray().ToArray();
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;
}
stringBuilder.Remove(stringBuilder.Length - 1, 1);
lines.Add(stringBuilder.ToString());
for (int i = 0; i < jsonElements.Length; i++)
{
stringBuilder.Clear();
stringBuilder.Append("0.1").Append('\t');
stringBuilder.Append("1").Append('\t');
stringBuilder.Append("2").Append('\t');
foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject())
stringBuilder.Append(jsonProperty.Value).Append('\t');
stringBuilder.Remove(stringBuilder.Length - 1, 1);
lines.Add(stringBuilder.ToString());
}
lines.Add(string.Concat("NUM_DATA_ROWS ", jsonElements.Length.ToString().PadLeft(9, '0')));
lines.Add(string.Concat("NUM_DATA_COLUMNS ", (columns + 3).ToString().PadLeft(9, '0')));
lines.Add("DELIMITER ;");
lines.Add(string.Concat("START_TIME_FORMAT ", format));
lines.Add(string.Concat("START_TIME ", logic.Logistics.DateTimeFromSequence.ToString(format))); //12/26/2019 15:22:44
lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "A_LOGISTICS"));
lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "B_LOGISTICS"));
if (!string.IsNullOrEmpty(logisticsText))
lines.Add(logisticsText);
else
{
lines.Add(string.Concat("LOGISTICS_1", '\t', "A_CHAMBER=;A_INFO=", eventName, ";A_INFO2=", equipmentType, ";A_JOBID=", logic.Logistics.JobID, ";A_MES_ENTITY=", logic.Logistics.MesEntity, ";A_MID=", logic.Logistics.MID, ";A_NULL_DATA=", logic.Logistics.NullData, ";A_PPID=NO_PPID;A_PROCESS_JOBID=", logic.Logistics.ProcessJobID, ";A_PRODUCT=;A_SEQUENCE=", logic.Logistics.Sequence, ";A_WAFER_ID=;"));
lines.Add(string.Concat("LOGISTICS_2", '\t', "B_CHAMBER=;B_INFO=", eventName, ";B_INFO2=", equipmentType, ";B_JOBID=", logic.Logistics.JobID, ";B_MES_ENTITY=", logic.Logistics.MesEntity, ";B_MID=", logic.Logistics.MID, ";B_NULL_DATA=", logic.Logistics.NullData, ";B_PPID=NO_PPID;B_PROCESS_JOBID=", logic.Logistics.ProcessJobID, ";B_PRODUCT=;B_SEQUENCE=", logic.Logistics.Sequence, ";B_WAFER_ID=;"));
lines.Add("END_HEADER");
}
stringBuilder.Clear();
foreach (string line in lines)
stringBuilder.AppendLine(line);
result = stringBuilder.ToString();
result = result.Replace(headerOffset, result.IndexOf("NUM_DATA_ROWS").ToString().PadLeft(9, '0')).
Replace(dataOffset, result.IndexOf('"').ToString().PadLeft(9, '0')).
Replace(endOffset, result.Length.ToString().PadLeft(9, '0'));
}
return result;
}
public static Tuple<string, string[], string[]> GetLogisticsColumnsAndBody(string reportFullPath, string[] lines = null)
{
string segment;
List<string> body = new List<string>();
StringBuilder logistics = new StringBuilder();
if (lines is null)
lines = File.ReadAllLines(reportFullPath);
string[] segments;
if (lines.Length < 7)
segments = new string[] { };
else
segments = lines[6].Trim().Split('\t');
List<string> columns = new List<string>();
for (int c = 0; c < segments.Length; c++)
{
segment = segments[c].Substring(1, segments[c].Length - 2);
if (!columns.Contains(segment))
columns.Add(segment);
else
{
for (short i = 1; i < short.MaxValue; i++)
{
segment = string.Concat(segment, "_", i);
if (!columns.Contains(segment))
{
columns.Add(segment);
break;
}
}
}
}
bool lookForLogistics = false;
for (int r = 7; r < lines.Count(); r++)
{
if (lines[r].StartsWith("NUM_DATA_ROWS"))
lookForLogistics = true;
if (!lookForLogistics)
{
body.Add(lines[r]);
continue;
}
if (lines[r].StartsWith("LOGISTICS_1"))
{
for (int i = r; i < lines.Count(); i++)
{
if (lines[r].StartsWith("END_HEADER"))
break;
logistics.AppendLine(lines[i]);
}
break;
}
}
return new Tuple<string, string[], string[]>(logistics.ToString(), columns.ToArray(), body.ToArray());
}
public static JsonElement GetArray(Tuple<string, string[], string[]> pdsf, bool lookForNumbers = false)
{
JsonElement result;
string logistics = pdsf.Item1;
string[] columns = pdsf.Item2;
string[] bodyLines = pdsf.Item3;
if (!bodyLines.Any() || !bodyLines[0].Contains('\t'))
result = JsonSerializer.Deserialize<JsonElement>("[]");
else
{
string value;
string[] segments;
StringBuilder stringBuilder = new StringBuilder();
foreach (string bodyLine in bodyLines)
{
stringBuilder.Append('{');
segments = bodyLine.Trim().Split('\t');
if (!lookForNumbers)
{
for (int c = 1; c < segments.Length; c++)
{
value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\",");
}
}
else
{
for (int c = 1; c < segments.Length; c++)
{
value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
if (string.IsNullOrEmpty(value))
stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append("null,");
else if (value.All(char.IsDigit))
stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append(",");
else
stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\",");
}
}
stringBuilder.Remove(stringBuilder.Length - 1, 1);
stringBuilder.AppendLine("},");
}
stringBuilder.Remove(stringBuilder.Length - 3, 3);
result = JsonSerializer.Deserialize<JsonElement>(string.Concat("[", stringBuilder, "]"));
}
return result;
}
public static Dictionary<string, List<string>> GetDictionary(Tuple<string, string[], string[]> pdsf)
{
Dictionary<string, List<string>> results = new Dictionary<string, List<string>>();
string[] segments;
string[] columns = pdsf.Item2;
string[] bodyLines = pdsf.Item3;
foreach (string column in columns)
results.Add(column, new List<string>());
foreach (string bodyLine in bodyLines)
{
segments = bodyLine.Split('\t');
for (int c = 1; c < segments.Length; c++)
{
if (c >= columns.Length)
continue;
results[columns[c]].Add(segments[c]);
}
}
return results;
}
public static Tuple<string, Dictionary<Test, Dictionary<string, List<string>>>> GetTestDictionary(Tuple<string, string[], string[]> pdsf)
{
Dictionary<Test, Dictionary<string, List<string>>> results = new Dictionary<Test, Dictionary<string, List<string>>>();
string testColumn = Description.RowColumn.Test.ToString();
Dictionary<string, List<string>> keyValuePairs = GetDictionary(pdsf);
if (!keyValuePairs.ContainsKey(testColumn))
throw new Exception();
int min;
int max;
Test testKey;
List<string> vs;
string columnKey;
Dictionary<Test, List<int>> tests = new Dictionary<Test, List<int>>();
for (int i = 0; i < keyValuePairs[testColumn].Count; i++)
{
if (Enum.TryParse(keyValuePairs[testColumn][i], out Test test))
{
if (!results.ContainsKey(test))
{
tests.Add(test, new List<int>());
results.Add(test, new Dictionary<string, List<string>>());
}
tests[test].Add(i);
}
}
foreach (KeyValuePair<Test, List<int>> testKeyValuePair in tests)
{
testKey = testKeyValuePair.Key;
min = testKeyValuePair.Value.Min();
max = testKeyValuePair.Value.Max() + 1;
foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs)
results[testKey].Add(keyValuePair.Key, new List<string>());
foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs)
{
vs = keyValuePair.Value;
columnKey = keyValuePair.Key;
for (int i = min; i < max; i++)
{
if (vs.Count > i)
results[testKey][columnKey].Add(vs[i]);
else
results[testKey][columnKey].Add(string.Empty);
}
}
}
return new Tuple<string, Dictionary<Test, Dictionary<string, List<string>>>>(pdsf.Item1, results);
}
private static string GetString(SearchFor searchFor, bool addSpaces, char separator = ' ')
{
if (!addSpaces)
return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), searchFor);
else
return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), separator, searchFor.ToString().Replace("In", string.Concat(separator, "In")).Replace("Ex", string.Concat(separator, "Ex")));
}
public static string EquipmentIntegration(bool addSpaces = true, char separator = ' ')
{
return GetString(SearchFor.EquipmentIntegration, addSpaces, separator);
}
public static string BusinessIntegration(bool addSpaces = true, char separator = ' ')
{
return GetString(SearchFor.BusinessIntegration, addSpaces, separator);
}
public static string SystemExport(bool addSpaces = true, char separator = ' ')
{
return GetString(SearchFor.SystemExport, addSpaces, separator);
}
public static string Archive(bool addSpaces = true, char separator = ' ')
{
return GetString(SearchFor.Archive, addSpaces, separator);
}
public static string GetLines(Logistics logistics, IScopeInfo scopeInfo, Dictionary<string, List<string>> keyValuePairs, Enum[] enumColumns, string dateFormat, string timeFormat, Column[] pairedColumns, bool useDateTimeFromSequence = true, string format = "", Dictionary<Column, string> alternateDisplayName = null, Enum[] ignoreColumns = null)
{
StringBuilder result = new StringBuilder();
if (useDateTimeFromSequence && !string.IsNullOrEmpty(format))
throw new Exception();
else if (!useDateTimeFromSequence && string.IsNullOrEmpty(format))
throw new Exception();
int start;
string ckey;
string pKey;
int pairedColumnsCount;
string firstDuplicate = "_1";
if (ignoreColumns is null)
ignoreColumns = new Enum[] { };
if (alternateDisplayName is null)
alternateDisplayName = new Dictionary<Column, string>();
string columnDate = Column.Date.ToString();
string columnTime = Column.Time.ToString();
List<string> columnKeys = new List<string>();
foreach (Enum item in enumColumns)
{
if (ignoreColumns.Contains(item))
continue;
columnKeys.Add(item.ToString());
}
result.AppendLine(scopeInfo.Header);
StringBuilder line = new StringBuilder();
int count = keyValuePairs[Description.RowColumn.Count.ToString()].Count();
string nullData;
if (logistics.NullData is null)
nullData = string.Empty;
else
nullData = logistics.NullData.ToString();
if (pairedColumns is null)
{
start = -1;
pairedColumnsCount = 0;
}
else
{
start = 0;
pairedColumnsCount = pairedColumns.Length;
}
for (int r = 0; r < count; r++)
{
for (int p = start; p < pairedColumnsCount; p++)
{
if (pairedColumnsCount == 0)
pKey = string.Empty;
else if (!(ignoreColumns is null) && ignoreColumns.Contains(pairedColumns[p]))
continue;
else
{
pKey = pairedColumns[p].ToString();
if (!keyValuePairs.ContainsKey(pKey))
continue;
else if (keyValuePairs[pKey][r] == nullData)
continue;
}
if (pairedColumnsCount == 0 || !string.IsNullOrEmpty(pKey))
{
line.Clear();
line.Append("!");
for (int i = 0; i < columnKeys.Count; i++)
{
ckey = columnKeys[i];
if (!keyValuePairs.ContainsKey(ckey))
line.Append(string.Empty);
else
{
if (useDateTimeFromSequence && ckey == columnDate)
line.Append(logistics.DateTimeFromSequence.ToString(dateFormat));
else if (useDateTimeFromSequence && ckey == columnTime)
line.Append(logistics.DateTimeFromSequence.ToString(timeFormat));
else if (!useDateTimeFromSequence && ckey == columnDate && keyValuePairs[ckey][r].Length == format.Length)
line.Append(DateTime.ParseExact(keyValuePairs[ckey][r], format, CultureInfo.InvariantCulture).ToString(dateFormat));
else if (!useDateTimeFromSequence && ckey == columnTime && keyValuePairs.ContainsKey(string.Concat(ckey, firstDuplicate)) && keyValuePairs[string.Concat(ckey, firstDuplicate)][r].Length == format.Length)
line.Append(DateTime.ParseExact(keyValuePairs[string.Concat(ckey, firstDuplicate)][r], format, CultureInfo.InvariantCulture).ToString(timeFormat));
else
line.Append(keyValuePairs[ckey][r]);
}
line.Append(';');
}
if (pairedColumnsCount > 0)
{
if (!alternateDisplayName.ContainsKey(pairedColumns[p]))
line.Append(pairedColumns[p].GetDiplayName());
else
line.Append(alternateDisplayName[pairedColumns[p]]);
line.Append(';');
line.Append(keyValuePairs[pKey][r]);
line.Append(';');
}
line.Remove(line.Length - 1, 1);
result.AppendLine(line.ToString());
}
}
}
return result.ToString();
}
public static string GetLines(Logistics logistics, IScopeInfo scopeInfo, List<string> names, Dictionary<string, List<string>> keyValuePairs, string dateFormat, string timeFormat, List<string> pairedParameterNames, bool useDateTimeFromSequence = true, string format = "", List<string> ignoreParameterNames = null)
{
StringBuilder result = new StringBuilder();
if (ignoreParameterNames is null)
ignoreParameterNames = new List<string>();
if (useDateTimeFromSequence && !string.IsNullOrEmpty(format))
throw new Exception();
else if (!useDateTimeFromSequence && string.IsNullOrEmpty(format))
throw new Exception();
string nullData;
const string columnDate = "Date";
const string columnTime = "Time";
const string firstDuplicate = "_1";
result.AppendLine(scopeInfo.Header);
StringBuilder line = new StringBuilder();
if (logistics.NullData is null)
nullData = string.Empty;
else
nullData = logistics.NullData.ToString();
int count = (from l in keyValuePairs select l.Value.Count).Min();
for (int r = 0; r < count; r++)
{
line.Clear();
line.Append("!");
foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs)
{
if (!names.Contains(keyValuePair.Key))
continue;
if (ignoreParameterNames.Contains(keyValuePair.Key))
continue;
if (pairedParameterNames.Contains(keyValuePair.Key))
{
if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData)
continue;
else
result.Append(line).Append(keyValuePair.Key).Append(';').AppendLine(keyValuePair.Value[r]);
}
else
{
if (useDateTimeFromSequence && keyValuePair.Key == columnDate)
line.Append(logistics.DateTimeFromSequence.ToString(dateFormat));
else if (useDateTimeFromSequence && keyValuePair.Key == columnTime)
line.Append(logistics.DateTimeFromSequence.ToString(timeFormat));
else if (!useDateTimeFromSequence && keyValuePair.Key == columnDate && keyValuePair.Value[r].Length == format.Length)
line.Append(DateTime.ParseExact(keyValuePair.Value[r], format, CultureInfo.InvariantCulture).ToString(dateFormat));
else if (!useDateTimeFromSequence && keyValuePair.Key == columnTime && keyValuePairs.ContainsKey(string.Concat(keyValuePair.Key, firstDuplicate)) && keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r].Length == format.Length)
line.Append(DateTime.ParseExact(keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r], format, CultureInfo.InvariantCulture).ToString(timeFormat));
else if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData)
line.Append(nullData);
else
line.Append(keyValuePair.Value[r]);
line.Append(';');
}
}
if (!pairedParameterNames.Any())
{
line.Remove(line.Length - 1, 1);
result.AppendLine(line.ToString());
}
}
return result.ToString();
}
public static List<string> PDSFToFixedWidth(string reportFullPath)
{
List<string> results = new List<string>();
if (!File.Exists(reportFullPath))
throw new Exception();
int[] group;
string line;
int startsAt = 0;
string[] segments;
int? currentGroup = null;
char inputSeperator = '\t';
char outputSeperator = '\t';
List<int> vs = new List<int>();
List<int[]> groups = new List<int[]>();
string[] lines = File.ReadAllLines(reportFullPath);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < lines.Length; i++)
{
if (string.IsNullOrEmpty(lines[i]))
continue;
segments = lines[i].Split(inputSeperator);
if (currentGroup is null)
currentGroup = segments.Length;
if (segments.Length != currentGroup)
{
currentGroup = segments.Length;
groups.Add(new int[] { startsAt, i - 1 });
startsAt = i;
}
}
if (startsAt == lines.Length - 1 && lines[0].Split(inputSeperator).Length != currentGroup)
groups.Add(new int[] { lines.Length - 1, lines.Length - 1 });
for (int g = 0; g < groups.Count; g++)
{
vs.Clear();
group = groups[g];
line = lines[group[0]];
segments = line.Split(inputSeperator);
for (int s = 0; s < segments.Length; s++)
vs.Add(segments[s].Length);
for (int i = group[0]; i <= group[1]; i++)
{
line = lines[i];
segments = line.Split(inputSeperator);
for (int s = 0; s < segments.Length; s++)
{
if (vs[s] < segments[s].Length)
vs[s] = segments[s].Length;
}
}
stringBuilder.Clear();
for (int s = 0; s < segments.Length; s++)
stringBuilder.Append((s + 1).ToString().PadLeft(vs[s], ' ')).Append(outputSeperator);
stringBuilder.Remove(stringBuilder.Length - 1, 1);
results.Add(stringBuilder.ToString());
for (int i = group[0]; i <= group[1]; i++)
{
line = lines[i];
stringBuilder.Clear();
segments = line.Split(inputSeperator);
for (int s = 0; s < segments.Length; s++)
stringBuilder.Append(segments[s].PadLeft(vs[s], ' ')).Append(outputSeperator);
stringBuilder.Remove(stringBuilder.Length - 1, 1);
results.Add(stringBuilder.ToString());
}
results.Add(string.Empty);
}
return results;
}
}
}

View File

@ -1,409 +1,300 @@
using System;
using System.IO;
namespace Adaptation.Shared.Metrology
namespace Adaptation.Shared.Metrology;
public class ScopeInfo : Properties.IScopeInfo
{
public class ScopeInfo : IScopeInfo
public Test Test { get; private set; }
public Enum Enum { get; private set; }
public string HTML { get; private set; }
public string Title { get; private set; }
public string FileName { get; private set; }
public int TestValue { get; private set; }
public string Header { get; private set; }
public string QueryFilter { get; private set; }
public string FileNameWithoutExtension { get; private set; }
public ScopeInfo(Test test, string fileName, string queryFilter = "", string title = "", string html = "")
{
public Test Test { get; private set; }
public Enum Enum { get; private set; }
public string HTML { get; private set; }
public string Title { get; private set; }
public string FileName { get; private set; }
public int TestValue { get; private set; }
public string Header { get; private set; }
public string QueryFilter { get; private set; }
public string FileNameWithoutExtension { get; private set; }
public EquipmentType EquipmentType { get; private set; }
public ScopeInfo(ILogic logic, ConfigDataBase configDataBase, Test test)
{
Enum = test;
Test = test;
TestValue = (int)test;
if (configDataBase.EquipmentConnection is null)
EquipmentType = configDataBase.EquipmentType;
else
EquipmentType = configDataBase.EquipmentConnection.Value;
string eventName = GetEventNameAndSetRemaining();
if (eventName != configDataBase.GetEventName())
{
File.Move(logic.Logistics.ReportFullPath, Path.ChangeExtension(logic.Logistics.ReportFullPath, eventName));
throw new Exception();
}
else if (EquipmentType != configDataBase.EquipmentType && EquipmentType != configDataBase.EquipmentConnection)
{
File.Move(logic.Logistics.ReportFullPath, Path.ChangeExtension(logic.Logistics.ReportFullPath, EquipmentType.ToString()));
throw new Exception();
}
}
public ScopeInfo(ILogic logic, ConfigDataBase configDataBase, Test test, string fileName, string queryFilter, string title = "", string html = "")
{
Enum = test;
Test = test;
TestValue = (int)test;
if (configDataBase.EquipmentConnection is null)
EquipmentType = configDataBase.EquipmentType;
else
EquipmentType = configDataBase.EquipmentConnection.Value;
FileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
Header = string.Empty;
QueryFilter = queryFilter;
Title = title;
HTML = html;
FileName = fileName;
}
public ScopeInfo ShallowCopy()
{
return (ScopeInfo)MemberwiseClone();
}
private string GetEventNameAndSetRemaining()
{
EventName eventName;
switch (Test)
{
case Test.AFMRoughness:
EquipmentType = EquipmentType.MET08AFMD3100;
eventName = EventName.FileRead;
FileNameWithoutExtension = "afm_iqs_01";
Header = string.Empty;
QueryFilter = "AFM Roughness";
Title = "AFM";
HTML = @"GaN Epi Data\10 - afm.html";
break;
case Test.BreakdownVoltageCenter:
EquipmentType = EquipmentType.MET08BVHGPROBE;
eventName = EventName.FileRead;
FileNameWithoutExtension = "bv_iqs_01";
Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool";
QueryFilter = "Breakdown Voltage";
Title = "Breakdown Voltage-Center";
HTML = @"GaN Epi Data\03 - bv-production.html";
break;
case Test.BreakdownVoltageEdge:
EquipmentType = EquipmentType.MET08BVHGPROBE;
eventName = EventName.FileRead;
FileNameWithoutExtension = "bv_iqs_01_Edge";
Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool";
QueryFilter = "Breakdown Voltage - Edge";
Title = "Breakdown Voltage-Edge";
HTML = @"GaN Epi Data\03 - bv-production.html";
break;
case Test.BreakdownVoltageMiddle8in:
EquipmentType = EquipmentType.MET08BVHGPROBE;
eventName = EventName.FileRead;
FileNameWithoutExtension = "bv_iqs_01_Middle";
Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool";
QueryFilter = "Breakdown Voltage - Middle";
Title = "Breakdown Voltage-Middle (8 in)";
HTML = @"GaN Epi Data\03 - bv-production.html";
break;
case Test.CV:
EquipmentType = EquipmentType.MET08CVHGPROBE802B150;
eventName = EventName.FileRead;
FileNameWithoutExtension = "cv_iqs_01";
Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap";
QueryFilter = "CV_Ns";
Title = "CV";
HTML = @"GaN Epi Data\05 - cv.html";
break;
case Test.MonthlyCV:
EquipmentType = EquipmentType.MET08CVHGPROBE802B150_Monthly;
eventName = EventName.FileReadMonthly;
FileNameWithoutExtension = "cv_iqs_01";
Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap";
QueryFilter = "CV_Ns";
Title = "CV Monthly Verification";
HTML = @"Metrology\07 - cv_verif_monthly.html";
break;
case Test.WeeklyCV:
EquipmentType = EquipmentType.MET08CVHGPROBE802B150_Weekly;
eventName = EventName.FileReadWeekly;
FileNameWithoutExtension = "cv_iqs_01";
Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap";
QueryFilter = "CV_Ns";
Title = "CV Weekly Verification";
HTML = @"Metrology\16 - cv_verif_weekly.html";
break;
case Test.CandelaKlarfDC:
EquipmentType = EquipmentType.MET08DDINCAN8620;
eventName = EventName.FileRead;
FileNameWithoutExtension = "candela_iqs_01";
Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count";
QueryFilter = "Candela Cracking";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.CandelaLaser:
EquipmentType = EquipmentType.MET08DDINCAN8620;
eventName = EventName.FileRead;
FileNameWithoutExtension = "candela_iqs_01";
Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;Pits;Tool ID;Defect Count";
QueryFilter = "Candela Cracking";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.CandelaVerify:
EquipmentType = EquipmentType.MET08DDINCAN8620;
eventName = EventName.FileRead;
FileNameWithoutExtension = "candela_iqs_01";
Header = string.Concat("LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;RunID;Reactor;", "Slip Lines;Cracks;Epi Def;Haze Spot;Small LPD;Medium LPD;Large LPD;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count");
QueryFilter = "Candela Cracking";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.CandelaPSL:
EquipmentType = EquipmentType.MET08DDINCAN8620_Daily;
eventName = EventName.FileReadDaily;
FileNameWithoutExtension = "candela_iqs_01";
Header = string.Empty;
QueryFilter = "102-83nm";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.CandelaProdU:
EquipmentType = EquipmentType.MET08DDINCAN8620_Daily;
eventName = EventName.FileReadDaily;
FileNameWithoutExtension = "candela_iqs_01";
Header = string.Empty;
QueryFilter = "SPE verification";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.Denton:
EquipmentType = EquipmentType.MET08EBEAMINTEGRITY26;
eventName = EventName.FileRead;
FileNameWithoutExtension = "denton_iqs_01";
Header = "Tool;fDate;Run;Recipe;Operator;Name;Value";
QueryFilter = "Denton_Voltage_AVG";
Title = "Denton Data";
HTML = @"Support Process\03 - ebeam02_denton_v1.html";
break;
case Test.Hall:
EquipmentType = EquipmentType.MET08HALLHL5580;
eventName = EventName.FileRead;
FileNameWithoutExtension = "hall_iqs_01";
Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value";
QueryFilter = "Hall Rs";
Title = "Hall Data";
HTML = @"GaN Epi Data\04 - hall.html";
break;
case Test.MonthlyHall:
EquipmentType = EquipmentType.MET08HALLHL5580_Monthly;
eventName = EventName.FileReadMonthly;
FileNameWithoutExtension = "hall_iqs_01";
Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value";
QueryFilter = "Hall Rs";
Title = "Hall Monthly Verification";
HTML = @"Metrology\06 - hall_verif_monthly.html";
break;
case Test.WeeklyHall:
EquipmentType = EquipmentType.MET08HALLHL5580_Weekly;
eventName = EventName.FileReadWeekly;
FileNameWithoutExtension = "hall_iqs_01";
Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value";
QueryFilter = "Hall Rs";
Title = "Hall Weekly Verification";
HTML = @"Metrology\15 - hall_verif_weekly.html";
break;
case Test.Lehighton:
EquipmentType = EquipmentType.MET08NDFRESIMAP151C;
eventName = EventName.FileRead;
FileNameWithoutExtension = "lei_iqs_01";
Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value";
QueryFilter = "LEI RS Average value";
Title = "Lehighton";
HTML = @"GaN Epi Data\13 - lehighton.html";
break;
case Test.VerificationLehighton:
EquipmentType = EquipmentType.MET08NDFRESIMAP151C_Verification;
eventName = EventName.FileRead;
FileNameWithoutExtension = "___";
Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value";
QueryFilter = "___";
Title = "LEI Weekly Verification 2 Ohm cm";
HTML = @"Metrology\14 - lei_verif_weekly.html.html";
break;
case Test.Microscope:
EquipmentType = EquipmentType.MET08MESMICROSCOPE;
eventName = EventName.FileRead;
FileNameWithoutExtension = string.Empty;
Header = string.Empty;
QueryFilter = "Microscope Center 5x";
Title = "Total Microscope Defects";
HTML = string.Empty;
break;
case Test.RPMXY:
EquipmentType = EquipmentType.MET08PLMAPRPM;
eventName = EventName.FileRead;
FileNameWithoutExtension = "RPM_Data";
Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value";
QueryFilter = "Barrier_Composition_RPM_XY";
Title = "RPM XY Data ***&*** View Data";
HTML = @"GaN Epi Data\09 - rpm --- 08 - photoluminescence.html";
break;
case Test.RPMAverage:
EquipmentType = EquipmentType.MET08PLMAPRPM;
eventName = EventName.FileRead;
FileNameWithoutExtension = "RPMdata-short";
Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File";
QueryFilter = "Epi Thickness Mean";
Title = "RPM Average Data";
HTML = @"GaN Epi Data\09 - rpm.html";
break;
case Test.RPMPLRatio:
EquipmentType = EquipmentType.MET08PLMAPRPM;
eventName = EventName.FileRead;
FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short";
Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID";
QueryFilter = "PL Ratio";
Title = "Photoluminescence: PL Ratio";
HTML = @"GaN Epi Data\08 - photoluminescence.html";
break;
case Test.DailyRPMXY:
EquipmentType = EquipmentType.MET08PLMAPRPM_Daily;
eventName = EventName.FileReadDaily;
FileNameWithoutExtension = "RPM_Data";
Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value";
QueryFilter = "Barrier_Composition_RPM_XY";
Title = "";
HTML = @"Metrology\?";
break;
case Test.DailyRPMAverage:
EquipmentType = EquipmentType.MET08PLMAPRPM_Daily;
eventName = EventName.FileReadDaily;
FileNameWithoutExtension = "RPMdata-short";
Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File";
QueryFilter = "Epi Thickness Mean";
Title = "";
HTML = @"Metrology\?";
break;
case Test.DailyRPMPLRatio:
EquipmentType = EquipmentType.MET08PLMAPRPM_Daily;
eventName = EventName.FileReadDaily;
FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short";
Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID";
QueryFilter = "PL Ratio";
Title = "RPM Daily Verification";
HTML = @"Metrology\17 - rpm_verif_daily.html";
break;
case Test.VerificationRPM:
EquipmentType = EquipmentType.MET08PLMAPRPM_Verification;
eventName = EventName.FileReadVerification;
FileNameWithoutExtension = "PhotoLuminescence_Ver";
Header = "Part;Process;Date;Test;Value";
QueryFilter = "PL Edge Wavelength";
Title = "PL Daily Verification - [PL Edge Wavelength]";
HTML = @"Metrology\18 - photoluminescence_verif_daily.html";
break;
case Test.Photoreflectance:
EquipmentType = EquipmentType.MET08PRFUSB4000;
eventName = EventName.FileRead;
FileNameWithoutExtension = "photoreflect_iqs_01";
Header = "Lot;Date;Part;Reactor;Scribe;Pocket;Tool;Point;WaferPosition_PR;PR_Peak";
QueryFilter = "PR Barrier Composition";
Title = "Photoreflectance 6 in, Photoreflectance 8 in";
HTML = @"GaN Epi Data\07 - photoreflectance.html";
break;
case Test.UV:
EquipmentType = EquipmentType.MET08UVH44GS100M;
eventName = EventName.FileRead;
FileNameWithoutExtension = "uv_iqs_01";
Header = string.Empty;
QueryFilter = "UV Broken";
Title = "UV";
HTML = @"GaN Epi Data\15 - uv 2.1.html";
break;
case Test.VpdIcpmsAnalyte:
EquipmentType = EquipmentType.MET08VPDSUBCON;
eventName = EventName.FileRead;
FileNameWithoutExtension = "VPD_iqs_01";
Header = "Reactor;RunID;RunDate;PartNumber;PocketNumber;WaferScribe;Analyte;Value";
QueryFilter = "Mg";
Title = "VpdIcpmsAnalyteData";
HTML = @"";
break;
case Test.WarpAndBow:
EquipmentType = EquipmentType.MET08WGEOMX203641Q;
eventName = EventName.FileRead;
FileNameWithoutExtension = "warp_iqs_01";
Header = "fDate;fRecipeName;fProductId;g4Scribe;warp;bow;tool;Reactor;Pocket ID;bow_range;BowX;BowY;CenterBow";
QueryFilter = "BowCenter";
Title = "Warp and Bow";
HTML = @"GaN Epi Data\14 - warp.html";
break;
case Test.VerificationWarpAndBow:
EquipmentType = EquipmentType.MET08WGEOMX203641Q_Verification;
eventName = EventName.FileReadVerification;
FileNameWithoutExtension = "warp_ver_iqs_01";
Header = "Part;Process;Date;WaferScribe;totWarp;bow";
QueryFilter = "Bow Calibration";
Title = "6 Inch Warp/Bow Daily Verification, 8 Inch Warp/Bow Daily Verification";
HTML = @"Metrology\19 - warp_cal_daily.html";
break;
case Test.XRDXY:
EquipmentType = EquipmentType.MET08XRDXPERTPROMRDXL;
eventName = EventName.FileRead;
FileNameWithoutExtension = "xrd_iqs_NEW_01";
Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group";
QueryFilter = "SL Period";
Title = "XRD XY Raw Data Viewer";
HTML = @"GaN Epi Data\11 - xrd.html";
break;
case Test.XRDWeightedAverage:
EquipmentType = EquipmentType.MET08XRDXPERTPROMRDXL;
eventName = EventName.FileRead;
FileNameWithoutExtension = "xrd_iqs_NEW_01_WtAVG";
Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;Name;Value;Group";
//QueryFilter = "Al% Barrier WTAVG";
QueryFilter = "SL Period WTAVG";
Title = "XRD Weighted Average Data";
HTML = @"GaN Epi Data\11 - xrd.html";
break;
case Test.MonthlyXRD:
EquipmentType = EquipmentType.MET08XRDXPERTPROMRDXL_Monthly;
eventName = EventName.FileReadMonthly;
FileNameWithoutExtension = "xrd_monthly_ver_iqs_01";
Header = "Part;Process;Date;TestName;Value";
QueryFilter = "XRD 2-Theta Position";
Title = "XRD Monthly Verification";
HTML = @"Metrology\03 - xrd_verif_monthly.html";
break;
case Test.WeeklyXRD:
EquipmentType = EquipmentType.MET08XRDXPERTPROMRDXL_Weekly;
eventName = EventName.FileReadWeekly;
FileNameWithoutExtension = "xrd_weekly_ver_iqs_01";
Header = "Part;Process;Lot;Date;TestName;Value";
QueryFilter = "XRD Weekly AL% Center";
Title = "XRD Weekly Verification";
HTML = @"Metrology\12 - xrd_verif_weekly.html";
break;
case Test.XRDXRAY:
EquipmentType = EquipmentType.METBRXRAYJV7300L;
eventName = EventName.FileRead;
FileNameWithoutExtension = "xrd_iqs_NEW_01";
Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group";
QueryFilter = "SL Period";
Title = "XRD XY Raw Data Viewer";
HTML = @"GaN Epi Data\11 - xrd.html";
break;
default:
throw new Exception();
}
FileName = string.Concat(FileNameWithoutExtension, ".txt");
return eventName.ToString();
}
public override string ToString()
{
return string.Concat(EquipmentType, " - (", Enum, "");
}
Enum = test;
Test = test;
HTML = html;
Title = title;
FileName = fileName;
TestValue = (int)test;
Header = string.Empty;
QueryFilter = queryFilter;
FileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
}
public ScopeInfo(Test test)
{
Enum = test;
Test = test;
TestValue = (int)test;
switch (Test)
{
case Test.AFMRoughness:
FileNameWithoutExtension = "afm_iqs_01";
Header = string.Empty;
QueryFilter = "AFM Roughness";
Title = "AFM";
HTML = @"GaN Epi Data\10 - afm.html";
break;
case Test.BreakdownVoltageCenter:
FileNameWithoutExtension = "bv_iqs_01";
Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool";
QueryFilter = "Breakdown Voltage";
Title = "Breakdown Voltage-Center";
HTML = @"GaN Epi Data\03 - bv-production.html";
break;
case Test.BreakdownVoltageEdge:
FileNameWithoutExtension = "bv_iqs_01_Edge";
Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool";
QueryFilter = "Breakdown Voltage - Edge";
Title = "Breakdown Voltage-Edge";
HTML = @"GaN Epi Data\03 - bv-production.html";
break;
case Test.BreakdownVoltageMiddle8in:
FileNameWithoutExtension = "bv_iqs_01_Middle";
Header = "Reactor;fDate;fRecipeName;Lot;fPocketNumber;g4Scribe;BV Position;BV Value;Tool";
QueryFilter = "Breakdown Voltage - Middle";
Title = "Breakdown Voltage-Middle (8 in)";
HTML = @"GaN Epi Data\03 - bv-production.html";
break;
case Test.CV:
FileNameWithoutExtension = "cv_iqs_01";
Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap";
QueryFilter = "CV_Ns";
Title = "CV";
HTML = @"GaN Epi Data\05 - cv.html";
break;
case Test.MonthlyCV:
FileNameWithoutExtension = "cv_iqs_01";
Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap";
QueryFilter = "CV_Ns";
Title = "CV Monthly Verification";
HTML = @"Metrology\07 - cv_verif_monthly.html";
break;
case Test.WeeklyCV:
FileNameWithoutExtension = "cv_iqs_01";
Header = "Reactor;fDate;fPart;Lot;pocketNumber;g4Scribe;Position;Vp;NdMin;Tool ID;CV Ns;CV Cap";
QueryFilter = "CV_Ns";
Title = "CV Weekly Verification";
HTML = @"Metrology\16 - cv_verif_weekly.html";
break;
case Test.CandelaKlarfDC:
FileNameWithoutExtension = "candela_iqs_01";
Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count";
QueryFilter = "Candela Cracking";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.CandelaLaser:
FileNameWithoutExtension = "candela_iqs_01";
Header = "LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;Epi;SlipLines;Cracks;EpiDef;HazeSpot;SmallLpd;MediumLpd;LargeLpd;Cracks_A;Spirals;Craters;Pits;Tool ID;Defect Count";
QueryFilter = "Candela Cracking";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.CandelaVerify:
FileNameWithoutExtension = "candela_iqs_01";
Header = string.Concat("LotID;OperatorID;RecipeName;CandelaRecipe;WaferID;PocketNumber;RunDate;RunID;Reactor;", "Slip Lines;Cracks;Epi Def;Haze Spot;Small LPD;Medium LPD;Large LPD;Cracks_A;Spirals;Craters;8620 Small;Pits;Tool ID;Defect Count");
QueryFilter = "Candela Cracking";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.CandelaPSL:
FileNameWithoutExtension = "candela_iqs_01";
Header = string.Empty;
QueryFilter = "102-83nm";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.CandelaProdU:
FileNameWithoutExtension = "candela_iqs_01";
Header = string.Empty;
QueryFilter = "SPE verification";
Title = "Candela";
HTML = @"GaN Epi Data\12 - candela.html";
break;
case Test.Denton:
FileNameWithoutExtension = "denton_iqs_01";
Header = "Tool;fDate;Run;Recipe;Operator;Name;Value";
QueryFilter = "Denton_Voltage_AVG";
Title = "Denton Data";
HTML = @"Support Process\03 - ebeam02_denton_v1.html";
break;
case Test.Hall:
FileNameWithoutExtension = "hall_iqs_01";
Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value";
QueryFilter = "Hall Rs";
Title = "Hall Data";
HTML = @"GaN Epi Data\04 - hall.html";
break;
case Test.MonthlyHall:
FileNameWithoutExtension = "hall_iqs_01";
Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value";
QueryFilter = "Hall Rs";
Title = "Hall Monthly Verification";
HTML = @"Metrology\06 - hall_verif_monthly.html";
break;
case Test.WeeklyHall:
FileNameWithoutExtension = "hall_iqs_01";
Header = "Lot;Tool;TimeDate;RunDate;RunID;Part;Reactor;Scribe;PocketNumber;Tool ID;Name;Value";
QueryFilter = "Hall Rs";
Title = "Hall Weekly Verification";
HTML = @"Metrology\15 - hall_verif_weekly.html";
break;
case Test.Lehighton:
FileNameWithoutExtension = "lei_iqs_01";
Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value";
QueryFilter = "LEI RS Average value";
Title = "Lehighton";
HTML = @"GaN Epi Data\13 - lehighton.html";
break;
case Test.VerificationLehighton:
FileNameWithoutExtension = "___";
Header = "Reactor;Date;Recipe;Lot;Pocket;Scribe;Tool;Name;Value";
QueryFilter = "___";
Title = "LEI Weekly Verification 2 Ohm cm";
HTML = @"Metrology\14 - lei_verif_weekly.html.html";
break;
case Test.Microscope:
FileNameWithoutExtension = string.Empty;
Header = string.Empty;
QueryFilter = "Microscope Center 5x";
Title = "Total Microscope Defects";
HTML = string.Empty;
break;
case Test.RPMXY:
FileNameWithoutExtension = "RPM_Data";
Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value";
QueryFilter = "Barrier_Composition_RPM_XY";
Title = "RPM XY Data ***&*** View Data";
HTML = @"GaN Epi Data\09 - rpm --- 08 - photoluminescence.html";
break;
case Test.RPMAverage:
FileNameWithoutExtension = "RPMdata-short";
Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File";
QueryFilter = "Epi Thickness Mean";
Title = "RPM Average Data";
HTML = @"GaN Epi Data\09 - rpm.html";
break;
case Test.RPMPLRatio:
FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short";
Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID";
QueryFilter = "PL Ratio";
Title = "Photoluminescence: PL Ratio";
HTML = @"GaN Epi Data\08 - photoluminescence.html";
break;
case Test.DailyRPMXY:
FileNameWithoutExtension = "RPM_Data";
Header = "Lot;Date;Recipe;Reactor;Scribe;Pocket;Tool;Name;Value";
QueryFilter = "Barrier_Composition_RPM_XY";
Title = "";
HTML = @"Metrology\?";
break;
case Test.DailyRPMAverage:
FileNameWithoutExtension = "RPMdata-short";
Header = "fProductId;fDate;average;stdDev;fRecipeName;Reactor;g4Scribe;Pocket Number;Tool ID;Recipe From Rpm File";
QueryFilter = "Epi Thickness Mean";
Title = "";
HTML = @"Metrology\?";
break;
case Test.DailyRPMPLRatio:
FileNameWithoutExtension = "PHOTOLUMINESCENCE_data-short";
Header = "fProductId;fDate;g4Scribe;fRecipeName;bandEdge_nm;bandEdge_V;yellowBand_Pmw;yellowBand_nm;yellowBand_V;Reactor;Pocket Number;Tool ID";
QueryFilter = "PL Ratio";
Title = "RPM Daily Verification";
HTML = @"Metrology\17 - rpm_verif_daily.html";
break;
case Test.VerificationRPM:
FileNameWithoutExtension = "PhotoLuminescence_Ver";
Header = "Part;Process;Date;Test;Value";
QueryFilter = "PL Edge Wavelength";
Title = "PL Daily Verification - [PL Edge Wavelength]";
HTML = @"Metrology\18 - photoluminescence_verif_daily.html";
break;
case Test.Photoreflectance:
FileNameWithoutExtension = "photoreflect_iqs_01";
Header = "Lot;Date;Part;Reactor;Scribe;Pocket;Tool;Point;WaferPosition_PR;PR_Peak";
QueryFilter = "PR Barrier Composition";
Title = "Photoreflectance 6 in, Photoreflectance 8 in";
HTML = @"GaN Epi Data\07 - photoreflectance.html";
break;
case Test.UV:
FileNameWithoutExtension = "uv_iqs_01";
Header = string.Empty;
QueryFilter = "UV Broken";
Title = "UV";
HTML = @"GaN Epi Data\15 - uv 2.1.html";
break;
case Test.VpdIcpmsAnalyte:
FileNameWithoutExtension = "VPD_iqs_01";
Header = "Reactor;RunID;RunDate;PartNumber;PocketNumber;WaferScribe;Analyte;Value";
QueryFilter = "Mg";
Title = "VpdIcpmsAnalyteData";
HTML = @"";
break;
case Test.WarpAndBow:
FileNameWithoutExtension = "warp_iqs_01";
Header = "fDate;fRecipeName;fProductId;g4Scribe;warp;bow;tool;Reactor;Pocket ID;bow_range;BowX;BowY;CenterBow";
QueryFilter = "BowCenter";
Title = "Warp and Bow";
HTML = @"GaN Epi Data\14 - warp.html";
break;
case Test.VerificationWarpAndBow:
FileNameWithoutExtension = "warp_ver_iqs_01";
Header = "Part;Process;Date;WaferScribe;totWarp;bow";
QueryFilter = "Bow Calibration";
Title = "6 Inch Warp/Bow Daily Verification, 8 Inch Warp/Bow Daily Verification";
HTML = @"Metrology\19 - warp_cal_daily.html";
break;
case Test.XRDXY:
FileNameWithoutExtension = "xrd_iqs_NEW_01";
Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group";
QueryFilter = "SL Period";
Title = "XRD XY Raw Data Viewer";
HTML = @"GaN Epi Data\11 - xrd.html";
break;
case Test.XRDWeightedAverage:
FileNameWithoutExtension = "xrd_iqs_NEW_01_WtAVG";
Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;Name;Value;Group";
//QueryFilter = "Al% Barrier WTAVG";
QueryFilter = "SL Period WTAVG";
Title = "XRD Weighted Average Data";
HTML = @"GaN Epi Data\11 - xrd.html";
break;
case Test.MonthlyXRD:
FileNameWithoutExtension = "xrd_monthly_ver_iqs_01";
Header = "Part;Process;Date;TestName;Value";
QueryFilter = "XRD 2-Theta Position";
Title = "XRD Monthly Verification";
HTML = @"Metrology\03 - xrd_verif_monthly.html";
break;
case Test.WeeklyXRD:
FileNameWithoutExtension = "xrd_weekly_ver_iqs_01";
Header = "Part;Process;Lot;Date;TestName;Value";
QueryFilter = "XRD Weekly AL% Center";
Title = "XRD Weekly Verification";
HTML = @"Metrology\12 - xrd_verif_weekly.html";
break;
case Test.JVXRD:
FileNameWithoutExtension = "xrd_iqs_NEW_01";
Header = "Reactor;fDate;fRecipeName;Lot;pocketNumber;g4Scribe;ToolID;Name;Value;Group";
QueryFilter = "SL Period";
Title = "XRD XY Raw Data Viewer";
HTML = @"GaN Epi Data\11 - xrd.html";
break;
default:
throw new Exception();
}
FileName = string.Concat(FileNameWithoutExtension, ".txt");
}
public ScopeInfo ShallowCopy() => (ScopeInfo)MemberwiseClone();
}

View File

@ -1,57 +0,0 @@
namespace Adaptation.Shared.Metrology
{
public enum Test
{
AFMRoughness = 34,
BioRadQS408M = 25,
BioRadStratus = 26,
BreakdownVoltageCenter = 0,
BreakdownVoltageEdge = 1,
BreakdownVoltageMiddle8in = 2,
CandelaKlarfDC = 6,
CandelaLaser = 36,
CandelaProdU = 39,
CandelaPSL = 38,
CandelaVerify = 37,
CDE = 24,
CV = 3,
DailyRPMAverage = 19,
DailyRPMPLRatio = 20,
DailyRPMXY = 18,
Denton = 9,
DiffusionLength = 45,
Hall = 10,
HgCV = 23,
Lehighton = 13,
Microscope = 46,
MonthlyCV = 4,
MonthlyHall = 11,
MonthlyXRD = 32,
Photoreflectance = 22,
PlatoA = 48, //Largest
RPMAverage = 16,
RPMPLRatio = 17,
RPMXY = 15,
SP1 = 8,
Tencor = 7,
UV = 35,
VerificationLehighton = 14,
VerificationRPM = 21,
VerificationWarpAndBow = 29,
VpdIcpmsAnalyte = 27,
WarpAndBow = 28,
WeeklyCV = 5,
WeeklyHall = 12,
WeeklyXRD = 33,
WeeklyXRDAIcomp = 40,
WeeklyXRDFWHM002 = 41,
WeeklyXRDFWHM105 = 42,
WeeklyXRDSLStks = 43,
WeeklyXRDXRR = 44,
XRDWeightedAverage = 31,
JVXRD = 47,
XRDXY = 30
}
}

View File

@ -0,0 +1,21 @@
namespace Adaptation.Shared.Metrology;
public partial class WS
{
public class Attachment
{
public string UniqueId { get; set; }
public string DestinationFileName { get; set; }
public string SourceFileName { get; set; }
public Attachment(string uniqueId, string destinationFileName, string sourceFileName)
{
UniqueId = uniqueId;
DestinationFileName = destinationFileName;
SourceFileName = sourceFileName;
}
}
}

View File

@ -0,0 +1,27 @@
using System.Collections.Generic;
using System.Text.Json;
namespace Adaptation.Shared.Metrology;
public partial class WS
{
// this class represents the response from the Inbound API endpoint
public class Results
{
// true or false if data was written to the database
public bool Success { get; set; }
// if true, contains ID of the Header record in the database
public long HeaderID { get; set; }
// if false, this collection will contain a list of errors
public List<string> Errors { get; set; }
// this collection will contain a list of warnings, they will not prevent data from being saved
public List<string> Warnings { get; set; }
// this is just a helper function to make displaying the results easier
public override string ToString() => JsonSerializer.Serialize(this, GetType());
}
}

View File

@ -0,0 +1,124 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.Json;
namespace Adaptation.Shared.Metrology;
public partial class WS
{
public static Tuple<string, Results> SendData(string url, object payload, int timeoutSeconds = 120)
{
Results results = new();
string resultsJson = string.Empty;
try
{
string json = JsonSerializer.Serialize(payload, payload.GetType());
if (string.IsNullOrEmpty(url) || !url.Contains(':') || !url.Contains('.'))
throw new Exception("Invalid URL");
using (HttpClient httpClient = new())
{
httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0);
HttpRequestMessage httpRequestMessage = new()
{
RequestUri = new Uri(url),
Method = HttpMethod.Post,
Content = new StringContent(json, Encoding.UTF8, "application/json")
};
HttpResponseMessage httpResponseMessage = httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseContentRead).Result;
resultsJson = httpResponseMessage.Content.ReadAsStringAsync().Result;
results = JsonSerializer.Deserialize<Results>(resultsJson);
}
if (!results.Success)
results.Errors.Add(results.ToString());
}
catch (Exception e)
{
Exception exception = e;
StringBuilder stringBuilder = new();
while (exception is not null)
{
_ = stringBuilder.AppendLine(exception.Message);
exception = exception.InnerException;
}
if (results.Errors is null)
results.Errors = new List<string>();
results.Errors.Add(stringBuilder.ToString());
}
return new Tuple<string, Results>(resultsJson, results);
}
// this method is a wrapper for attaching a file to either a header or data record
// URL is the same URL used for SendData, ex: http://localhost/api/inbound/CDE
// attachToHeaderId is the ID returned by SendData
// attachToDataUniqueId is the string unique ID for the data record, aka the Title of the Sharepoint list entry
// fileContents is a byte array with the contents of the file
// fileName is which attachment this is, image.pdf, data.pdf, data.txt, header.pdf, etc
// timeoutSeconds is configured as the request timeout
// this method will either succeed or throw an exception
// also, this has been made synchronous
public static void AttachFile(string url, long attachToHeaderId, string attachToDataUniqueId, byte[] fileContents, string fileName, int timeoutSeconds = 60)
{
using HttpClient httpClient = new();
string requestUrl = url + "/attachment?headerid=" + attachToHeaderId.ToString();
if (!string.IsNullOrWhiteSpace(attachToDataUniqueId))
{
requestUrl += "&datauniqueid=";
requestUrl += System.Net.WebUtility.UrlEncode(attachToDataUniqueId);
}
requestUrl += "&filename="; // this is just so the web server log shows the filename
requestUrl += System.Net.WebUtility.UrlEncode(fileName);
httpClient.Timeout = new TimeSpan(0, 0, 0, timeoutSeconds, 0);
MultipartFormDataContent multipartFormDataContent = new();
ByteArrayContent byteArrayContent = new(fileContents);
byteArrayContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
multipartFormDataContent.Add(byteArrayContent, "attachment", fileName);
HttpResponseMessage httpResponseMessage = httpClient.PostAsync(requestUrl, multipartFormDataContent).Result;
if (httpResponseMessage.IsSuccessStatusCode)
return;
string resultBody = httpResponseMessage.Content.ReadAsStringAsync().Result;
throw new Exception("Attachment failed: " + resultBody);
}
public static void AttachFiles(string url, long headerID, List<Attachment> headerAttachments = null, List<Attachment> dataAttachments = null)
{
try
{
if (headerAttachments is not null)
{
foreach (Attachment attachment in headerAttachments)
AttachFile(url, headerID, "", File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName);
}
if (dataAttachments is not null)
{
foreach (Attachment attachment in dataAttachments)
AttachFile(url, headerID, attachment.UniqueId, File.ReadAllBytes(attachment.SourceFileName), attachment.DestinationFileName);
}
//MessageBox.Show(r.ToString());
}
catch (Exception e)
{
Exception exception = e;
StringBuilder stringBuilder = new();
while (exception is not null)
{
_ = stringBuilder.AppendLine(exception.Message);
exception = exception.InnerException;
}
//MessageBox.Show(msgs.ToString(), "Exception", //MessageBoxButtons.OK, //MessageBoxIcon.Error);
throw new Exception(stringBuilder.ToString());
}
}
}

View File

@ -0,0 +1,10 @@
namespace Adaptation.Shared;
public enum ParameterType
{
String = 0,
Integer = 2,
Double = 3,
Boolean = 4,
StructuredType = 5
}

View File

@ -0,0 +1,411 @@
using Adaptation.Shared.Methods;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
namespace Adaptation.Shared;
public class ProcessDataStandardFormat
{
public const string RecordStart = "RECORD_START";
public enum SearchFor
{
EquipmentIntegration = 1,
BusinessIntegration = 2,
SystemExport = 3,
Archive = 4
}
public static string GetPDSFText(IFileRead fileRead, Logistics logistics, JsonElement[] jsonElements, string logisticsText)
{
string result;
if (!jsonElements.Any())
result = string.Empty;
else
{
int columns = 0;
List<string> lines;
string endOffset = "E#######T";
string dataOffset = "D#######T";
string headerOffset = "H#######T";
string format = "MM/dd/yyyy HH:mm:ss";
StringBuilder stringBuilder = new();
lines = new string[] { "HEADER_TAG\tHEADER_VALUE", "FORMAT\t2.00", "NUMBER_PASSES\t0001", string.Concat("HEADER_OFFSET\t", headerOffset), string.Concat("DATA_OFFSET\t", dataOffset), string.Concat("END_OFFSET\t", endOffset) }.ToList();
_ = stringBuilder.Append("\"Time\"").Append('\t');
_ = stringBuilder.Append("\"A_LOGISTICS\"").Append('\t');
_ = stringBuilder.Append("\"B_LOGISTICS\"").Append('\t');
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;
}
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
lines.Add(stringBuilder.ToString());
for (int i = 0; i < jsonElements.Length; i++)
{
_ = stringBuilder.Clear();
_ = stringBuilder.Append("0.1").Append('\t');
_ = stringBuilder.Append('1').Append('\t');
_ = stringBuilder.Append('2').Append('\t');
foreach (JsonProperty jsonProperty in jsonElements[i].EnumerateObject())
_ = stringBuilder.Append(jsonProperty.Value).Append('\t');
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
lines.Add(stringBuilder.ToString());
}
lines.Add(string.Concat("NUM_DATA_ROWS ", jsonElements.Length.ToString().PadLeft(9, '0')));
lines.Add(string.Concat("NUM_DATA_COLUMNS ", (columns + 3).ToString().PadLeft(9, '0')));
lines.Add("DELIMITER ;");
lines.Add(string.Concat("START_TIME_FORMAT ", format));
lines.Add(string.Concat("START_TIME ", logistics.DateTimeFromSequence.ToString(format))); //12/26/2019 15:22:44
lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "A_LOGISTICS"));
lines.Add(string.Concat("LOGISTICS_COLUMN", '\t', "B_LOGISTICS"));
if (!string.IsNullOrEmpty(logisticsText))
lines.Add(logisticsText);
else
{
lines.Add(string.Concat("LOGISTICS_1", '\t', "A_CHAMBER=;A_INFO=", fileRead.EventName, ";A_INFO2=", fileRead.EquipmentType, ";A_JOBID=", fileRead.CellInstanceName, ";A_MES_ENTITY=", fileRead.MesEntity, ";A_MID=", logistics.MID, ";A_NULL_DATA=", fileRead.NullData, ";A_PPID=NO_PPID;A_PROCESS_JOBID=", logistics.ProcessJobID, ";A_PRODUCT=;A_SEQUENCE=", logistics.Sequence, ";A_WAFER_ID=;"));
lines.Add(string.Concat("LOGISTICS_2", '\t', "B_CHAMBER=;B_INFO=", fileRead.EventName, ";B_INFO2=", fileRead.EquipmentType, ";B_JOBID=", fileRead.CellInstanceName, ";B_MES_ENTITY=", fileRead.MesEntity, ";B_MID=", logistics.MID, ";B_NULL_DATA=", fileRead.NullData, ";B_PPID=NO_PPID;B_PROCESS_JOBID=", logistics.ProcessJobID, ";B_PRODUCT=;B_SEQUENCE=", logistics.Sequence, ";B_WAFER_ID=;"));
lines.Add("END_HEADER");
}
_ = stringBuilder.Clear();
foreach (string line in lines)
_ = stringBuilder.AppendLine(line);
result = stringBuilder.ToString();
result = result.Replace(headerOffset, result.IndexOf("NUM_DATA_ROWS").ToString().PadLeft(9, '0')).
Replace(dataOffset, result.IndexOf('"').ToString().PadLeft(9, '0')).
Replace(endOffset, result.Length.ToString().PadLeft(9, '0'));
}
return result;
}
public static Tuple<string, string[], string[]> GetLogisticsColumnsAndBody(string reportFullPath, string[] lines = null)
{
string segment;
List<string> body = new();
StringBuilder logistics = new();
if (lines is null)
lines = File.ReadAllLines(reportFullPath);
string[] segments;
if (lines.Length < 7)
segments = Array.Empty<string>();
else
segments = lines[6].Trim().Split('\t');
List<string> columns = new();
for (int c = 0; c < segments.Length; c++)
{
segment = segments[c].Substring(1, segments[c].Length - 2);
if (!columns.Contains(segment))
columns.Add(segment);
else
{
for (short i = 1; i < short.MaxValue; i++)
{
segment = string.Concat(segment, "_", i);
if (!columns.Contains(segment))
{
columns.Add(segment);
break;
}
}
}
}
bool lookForLogistics = false;
for (int r = 7; r < lines.Length; r++)
{
if (lines[r].StartsWith("NUM_DATA_ROWS"))
lookForLogistics = true;
if (!lookForLogistics)
{
body.Add(lines[r]);
continue;
}
if (lines[r].StartsWith("LOGISTICS_1"))
{
for (int i = r; i < lines.Length; i++)
{
if (lines[r].StartsWith("END_HEADER"))
break;
_ = logistics.AppendLine(lines[i]);
}
break;
}
}
return new Tuple<string, string[], string[]>(logistics.ToString(), columns.ToArray(), body.ToArray());
}
public static JsonElement[] GetArray(Tuple<string, string[], string[]> pdsf, bool lookForNumbers = false)
{
JsonElement[] results;
string logistics = pdsf.Item1;
string[] columns = pdsf.Item2;
string[] bodyLines = pdsf.Item3;
if (!bodyLines.Any() || !bodyLines[0].Contains('\t'))
results = JsonSerializer.Deserialize<JsonElement[]>("[]");
else
{
string value;
string[] segments;
StringBuilder stringBuilder = new();
foreach (string bodyLine in bodyLines)
{
_ = stringBuilder.Append('{');
segments = bodyLine.Trim().Split('\t');
if (!lookForNumbers)
{
for (int c = 1; c < segments.Length; c++)
{
value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
_ = stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\",");
}
}
else
{
for (int c = 1; c < segments.Length; c++)
{
value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
if (string.IsNullOrEmpty(value))
_ = stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append("null,");
else if (value.All(char.IsDigit))
_ = stringBuilder.Append('"').Append(columns[c]).Append("\":").Append(value).Append(',');
else
_ = stringBuilder.Append('"').Append(columns[c]).Append("\":\"").Append(value).Append("\",");
}
}
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
_ = stringBuilder.AppendLine("},");
}
_ = stringBuilder.Remove(stringBuilder.Length - 3, 3);
results = JsonSerializer.Deserialize<JsonElement[]>(string.Concat("[", stringBuilder, "]"));
}
return results;
}
public static Dictionary<string, List<string>> GetDictionary(Tuple<string, string[], string[]> pdsf)
{
Dictionary<string, List<string>> results = new();
string[] segments;
string[] columns = pdsf.Item2;
string[] bodyLines = pdsf.Item3;
foreach (string column in columns)
results.Add(column, new List<string>());
foreach (string bodyLine in bodyLines)
{
segments = bodyLine.Split('\t');
for (int c = 1; c < segments.Length; c++)
{
if (c >= columns.Length)
continue;
results[columns[c]].Add(segments[c]);
}
}
return results;
}
public static Tuple<string, Dictionary<Test, Dictionary<string, List<string>>>> GetTestDictionary(Tuple<string, string[], string[]> pdsf)
{
Dictionary<Test, Dictionary<string, List<string>>> results = new();
string testColumn = nameof(Test);
Dictionary<string, List<string>> keyValuePairs = GetDictionary(pdsf);
if (!keyValuePairs.ContainsKey(testColumn))
throw new Exception();
int min;
int max;
Test testKey;
List<string> vs;
string columnKey;
Dictionary<Test, List<int>> tests = new();
for (int i = 0; i < keyValuePairs[testColumn].Count; i++)
{
if (Enum.TryParse(keyValuePairs[testColumn][i], out Test test))
{
if (!results.ContainsKey(test))
{
tests.Add(test, new List<int>());
results.Add(test, new Dictionary<string, List<string>>());
}
tests[test].Add(i);
}
}
foreach (KeyValuePair<Test, List<int>> testKeyValuePair in tests)
{
testKey = testKeyValuePair.Key;
min = testKeyValuePair.Value.Min();
max = testKeyValuePair.Value.Max() + 1;
foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs)
results[testKey].Add(keyValuePair.Key, new List<string>());
foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs)
{
vs = keyValuePair.Value;
columnKey = keyValuePair.Key;
for (int i = min; i < max; i++)
{
if (vs.Count > i)
results[testKey][columnKey].Add(vs[i]);
else
results[testKey][columnKey].Add(string.Empty);
}
}
}
return new Tuple<string, Dictionary<Test, Dictionary<string, List<string>>>>(pdsf.Item1, results);
}
private static string GetString(SearchFor searchFor, bool addSpaces, char separator = ' ')
{
if (!addSpaces)
return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), searchFor);
else
return string.Concat(((int)searchFor).ToString().PadLeft(2, '0'), separator, searchFor.ToString().Replace("In", string.Concat(separator, "In")).Replace("Ex", string.Concat(separator, "Ex")));
}
public static string EquipmentIntegration(bool addSpaces = true, char separator = ' ') => GetString(SearchFor.EquipmentIntegration, addSpaces, separator);
public static string BusinessIntegration(bool addSpaces = true, char separator = ' ') => GetString(SearchFor.BusinessIntegration, addSpaces, separator);
public static string SystemExport(bool addSpaces = true, char separator = ' ') => GetString(SearchFor.SystemExport, addSpaces, separator);
public static string Archive(bool addSpaces = true, char separator = ' ') => GetString(SearchFor.Archive, addSpaces, separator);
public static string GetLines(Logistics logistics, Properties.IScopeInfo scopeInfo, List<string> names, Dictionary<string, List<string>> keyValuePairs, string dateFormat, string timeFormat, List<string> pairedParameterNames, bool useDateTimeFromSequence = true, string format = "", List<string> ignoreParameterNames = null)
{
StringBuilder result = new();
if (ignoreParameterNames is null)
ignoreParameterNames = new List<string>();
if (useDateTimeFromSequence && !string.IsNullOrEmpty(format))
throw new Exception();
else if (!useDateTimeFromSequence && string.IsNullOrEmpty(format))
throw new Exception();
string nullData;
const string columnDate = "Date";
const string columnTime = "Time";
const string firstDuplicate = "_1";
_ = result.AppendLine(scopeInfo.Header);
StringBuilder line = new();
if (logistics.NullData is null)
nullData = string.Empty;
else
nullData = logistics.NullData.ToString();
int count = (from l in keyValuePairs select l.Value.Count).Min();
for (int r = 0; r < count; r++)
{
_ = line.Clear();
_ = line.Append('!');
foreach (KeyValuePair<string, List<string>> keyValuePair in keyValuePairs)
{
if (!names.Contains(keyValuePair.Key))
continue;
if (ignoreParameterNames.Contains(keyValuePair.Key))
continue;
if (pairedParameterNames.Contains(keyValuePair.Key))
{
if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData)
continue;
else
_ = result.Append(line).Append(keyValuePair.Key).Append(';').AppendLine(keyValuePair.Value[r]);
}
else
{
if (useDateTimeFromSequence && keyValuePair.Key == columnDate)
_ = line.Append(logistics.DateTimeFromSequence.ToString(dateFormat));
else if (useDateTimeFromSequence && keyValuePair.Key == columnTime)
_ = line.Append(logistics.DateTimeFromSequence.ToString(timeFormat));
else if (!useDateTimeFromSequence && keyValuePair.Key == columnDate && keyValuePair.Value[r].Length == format.Length)
_ = line.Append(DateTime.ParseExact(keyValuePair.Value[r], format, CultureInfo.InvariantCulture).ToString(dateFormat));
else if (!useDateTimeFromSequence && keyValuePair.Key == columnTime && keyValuePairs.ContainsKey(string.Concat(keyValuePair.Key, firstDuplicate)) && keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r].Length == format.Length)
_ = line.Append(DateTime.ParseExact(keyValuePairs[string.Concat(keyValuePair.Key, firstDuplicate)][r], format, CultureInfo.InvariantCulture).ToString(timeFormat));
else if (string.IsNullOrEmpty(keyValuePair.Value[r]) || keyValuePair.Value[r] == nullData)
_ = line.Append(nullData);
else
_ = line.Append(keyValuePair.Value[r]);
_ = line.Append(';');
}
}
if (!pairedParameterNames.Any())
{
_ = line.Remove(line.Length - 1, 1);
_ = result.AppendLine(line.ToString());
}
}
return result.ToString();
}
public static List<string> PDSFToFixedWidth(string reportFullPath)
{
List<string> results = new();
if (!File.Exists(reportFullPath))
throw new Exception();
int[] group;
string line;
int startsAt = 0;
string[] segments;
int? currentGroup = null;
char inputSeperator = '\t';
char outputSeperator = '\t';
List<int> vs = new();
List<int[]> groups = new();
string[] lines = File.ReadAllLines(reportFullPath);
StringBuilder stringBuilder = new();
for (int i = 0; i < lines.Length; i++)
{
if (string.IsNullOrEmpty(lines[i]))
continue;
segments = lines[i].Split(inputSeperator);
if (currentGroup is null)
currentGroup = segments.Length;
if (segments.Length != currentGroup)
{
currentGroup = segments.Length;
groups.Add(new int[] { startsAt, i - 1 });
startsAt = i;
}
}
if (startsAt == lines.Length - 1 && lines[0].Split(inputSeperator).Length != currentGroup)
groups.Add(new int[] { lines.Length - 1, lines.Length - 1 });
for (int g = 0; g < groups.Count; g++)
{
vs.Clear();
group = groups[g];
line = lines[group[0]];
segments = line.Split(inputSeperator);
for (int s = 0; s < segments.Length; s++)
vs.Add(segments[s].Length);
for (int i = group[0]; i <= group[1]; i++)
{
line = lines[i];
segments = line.Split(inputSeperator);
for (int s = 0; s < segments.Length; s++)
{
if (vs[s] < segments[s].Length)
vs[s] = segments[s].Length;
}
}
_ = stringBuilder.Clear();
for (int s = 0; s < segments.Length; s++)
_ = stringBuilder.Append((s + 1).ToString().PadLeft(vs[s], ' ')).Append(outputSeperator);
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
results.Add(stringBuilder.ToString());
for (int i = group[0]; i <= group[1]; i++)
{
line = lines[i];
_ = stringBuilder.Clear();
segments = line.Split(inputSeperator);
for (int s = 0; s < segments.Length; s++)
_ = stringBuilder.Append(segments[s].PadLeft(vs[s], ' ')).Append(outputSeperator);
_ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
results.Add(stringBuilder.ToString());
}
results.Add(string.Empty);
}
return results;
}
}

View File

@ -0,0 +1,10 @@
namespace Adaptation.Shared.Properties;
public interface IDescription
{
int Test { get; }
int Count { get; }
int Index { get; }
}

View File

@ -0,0 +1,17 @@
namespace Adaptation.Shared.Properties;
public interface IFileRead
{
bool IsEvent { get; }
string NullData { get; }
string MesEntity { get; }
bool IsEAFHosted { get; }
string EventName { get; }
string EquipmentType { get; }
string ReportFullPath { get; }
string CellInstanceName { get; }
string ExceptionSubject { get; }
bool UseCyclicalForDescription { get; }
string CellInstanceConnectionName { get; }
string ParameterizedModelObjectDefinitionType { get; }
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
namespace Adaptation.Shared.Properties;
public interface ILogistics
{
public object NullData { get; }
public string JobID { get; } //CellName
public long Sequence { get; } //Ticks
public DateTime DateTimeFromSequence { get; }
public double TotalSecondsSinceLastWriteTimeFromSequence { get; }
public string MesEntity { get; } //SPC
public string ReportFullPath { get; } //Extract file
public string ProcessJobID { get; set; } //Reactor (duplicate but I want it in the logistics)
public string MID { get; set; } //Lot & Pocket || Lot
public List<string> Tags { get; set; }
public List<string> Logistics1 { get; set; }
public List<Logistics2> Logistics2 { get; set; }
}

View File

@ -0,0 +1,14 @@
namespace Adaptation.Shared.Properties;
public interface ILogistics2
{
public string MID { get; }
public string RunNumber { get; }
public string SatelliteGroup { get; }
public string PartNumber { get; }
public string PocketNumber { get; }
public string WaferLot { get; }
public string Recipe { get; }
}

View File

@ -0,0 +1,10 @@
using System.Collections.Generic;
namespace Adaptation.Shared.Properties;
public interface IProcessData
{
List<object> Details { get; }
}

View File

@ -0,0 +1,17 @@
using System;
namespace Adaptation.Shared.Properties;
public interface IScopeInfo
{
Enum Enum { get; }
string HTML { get; }
string Title { get; }
string FileName { get; }
int TestValue { get; }
string Header { get; }
string QueryFilter { get; }
string FileNameWithoutExtension { get; }
}

58
Adaptation/Shared/Test.cs Normal file
View File

@ -0,0 +1,58 @@
namespace Adaptation.Shared;
public enum Test
{
AFMRoughness = 34,
BioRadQS408M = 25,
BioRadStratus = 26,
BreakdownVoltageCenter = 0,
BreakdownVoltageEdge = 1,
BreakdownVoltageMiddle8in = 2,
CandelaKlarfDC = 6,
CandelaLaser = 36,
CandelaProdU = 39,
CandelaPSL = 38,
CandelaVerify = 37,
CDE = 24,
CV = 3,
DailyRPMAverage = 19,
DailyRPMPLRatio = 20,
DailyRPMXY = 18,
Denton = 9,
DiffusionLength = 45,
GRATXTCenter = 51,
GRATXTEdge = 52, //Largest
GrowthRateXML = 50,
Hall = 10,
HgCV = 23,
JVXRD = 47,
Lehighton = 13,
LogbookCAC = 49,
Microscope = 46,
MonthlyCV = 4,
MonthlyHall = 11,
MonthlyXRD = 32,
Photoreflectance = 22,
PlatoA = 48,
RPMAverage = 16,
RPMPLRatio = 17,
RPMXY = 15,
SP1 = 8,
Tencor = 7,
UV = 35,
VerificationLehighton = 14,
VerificationRPM = 21,
VerificationWarpAndBow = 29,
VpdIcpmsAnalyte = 27,
WarpAndBow = 28,
WeeklyCV = 5,
WeeklyHall = 12,
WeeklyXRD = 33,
WeeklyXRDAIcomp = 40,
WeeklyXRDFWHM002 = 41,
WeeklyXRDFWHM105 = 42,
WeeklyXRDSLStks = 43,
WeeklyXRDXRR = 44,
XRDWeightedAverage = 31,
XRDXY = 30,
}