From 88816d9a74894a5853fc0e5cccd261e9cc5d2e12 Mon Sep 17 00:00:00 2001
From: Mike Phares
Date: Tue, 27 May 2025 15:29:14 -0700
Subject: [PATCH] Stratus own Qual
Common ResourceID and IsViewerFile
Test data and vba
---
.gitignore | 1 +
.vscode/.txt | 234 ++
.vscode/.vba | 280 ++
...85161 SP101 666335 2025-04-24 01-56-23.txt | 50 +
.../SP101_250424015623000.json | 1982 ++++++++++
.../SP101_250424015623000.pdsf | 87 +
...421 TENCOR1 667227 2025-04-24 16-46-29.txt | 49 +
.../TENCOR1_250424164629000.json | 176 +
.../TENCOR1_250424164629000.pdsf | 43 +
...540084 CDE5 666765 2025-04-24 17-14-32.txt | 78 +
.../CDE5_250424171432000.json | 122 +
.../CDE5_250424171432000.pdsf | 57 +
...491 BIORAD2 667740 2025-04-24 18-11-07.txt | 36 +
.../BIORAD2_250424181107000.json | 80 +
.../BIORAD2_250424181107000.pdsf | 55 +
...064 BIORAD5 667283 2025-04-24 19-44-08.txt | 22 +
.../BIORAD5_250424194408000.json | 59 +
.../BIORAD5_250424194408000.pdsf | 41 +
...95622 HGCV2 667776 2025-04-25 08-40-01.txt | 103 +
.../HGCV2_250425084001000.json | 119 +
.../HGCV2_250425084001000.pdsf | 47 +
.vscode/METROLOGY_SERVICES.vba | 3383 +++++++++++++++++
.vscode/settings.json | 6 +
LSL2/STPROC/METROLOGY_SERVICES.txt | 1638 ++++----
24 files changed, 7961 insertions(+), 787 deletions(-)
create mode 100644 .vscode/.txt
create mode 100644 .vscode/.vba
create mode 100644 .vscode/638810565835457504/1745485161 SP101 666335 2025-04-24 01-56-23.txt
create mode 100644 .vscode/638810565835457504/SP101_250424015623000.json
create mode 100644 .vscode/638810565835457504/SP101_250424015623000.pdsf
create mode 100644 .vscode/638811099895374259/1745538421 TENCOR1 667227 2025-04-24 16-46-29.txt
create mode 100644 .vscode/638811099895374259/TENCOR1_250424164629000.json
create mode 100644 .vscode/638811099895374259/TENCOR1_250424164629000.pdsf
create mode 100644 .vscode/638811116720000000/1745540084 CDE5 666765 2025-04-24 17-14-32.txt
create mode 100644 .vscode/638811116720000000/CDE5_250424171432000.json
create mode 100644 .vscode/638811116720000000/CDE5_250424171432000.pdsf
create mode 100644 .vscode/638811150679527382/1745543491 BIORAD2 667740 2025-04-24 18-11-07.txt
create mode 100644 .vscode/638811150679527382/BIORAD2_250424181107000.json
create mode 100644 .vscode/638811150679527382/BIORAD2_250424181107000.pdsf
create mode 100644 .vscode/638811206483711430/1745549064 BIORAD5 667283 2025-04-24 19-44-08.txt
create mode 100644 .vscode/638811206483711430/BIORAD5_250424194408000.json
create mode 100644 .vscode/638811206483711430/BIORAD5_250424194408000.pdsf
create mode 100644 .vscode/638811672019538124/1745595622 HGCV2 667776 2025-04-25 08-40-01.txt
create mode 100644 .vscode/638811672019538124/HGCV2_250425084001000.json
create mode 100644 .vscode/638811672019538124/HGCV2_250425084001000.pdsf
create mode 100644 .vscode/METROLOGY_SERVICES.vba
create mode 100644 .vscode/settings.json
diff --git a/.gitignore b/.gitignore
index e1c03b0..8a84e2c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
LSL2/STPROC/TEST_DANIEL*.txt
LSL2/STPROC/TEST_DAKOTA.txt
LSL2/STPROC/JONATHAN_SERVICES.txt
+.vscode/**/*.png
\ No newline at end of file
diff --git a/.vscode/.txt b/.vscode/.txt
new file mode 100644
index 0000000..083d2d4
--- /dev/null
+++ b/.vscode/.txt
@@ -0,0 +1,234 @@
+
+// T:\met08resisrp2100\06_SourceCode\met08resisrp2100\Adaptation\FileHandlers\OpenInsight\FileRead.cs
+// x.Date // 001
+// x.Employee // 002
+// x.Recipe // 003
+// x.Reactor // 004
+// x.RDS // 005
+// x.PSN // 006
+// x.Layer // 007
+// x.Zone // 008
+
+// T:\met08anlysdifaast230\06_SourceCode\met08anlysdifaast230\Adaptation\FileHandlers\OpenInsight\FileRead.cs
+// x.PSN // 001
+// x.Reactor // 002
+// logistics.MesEntity // 003
+// x.RDS // 004
+// x.Recipe // 005
+// x.Employee // 006
+// x.SlotNumber // 007
+
+// T:\met08thftirstratus\06_SourceCode\met08thftirstratus\Adaptation\FileHandlers\OpenInsight\FileRead.cs
+// "Stratus_" // 001
+// x.Date // 002
+// logistics.JobID // 003
+// "FQA Thickness" // 004
+// x.Employee // 005
+// x.Recipe // 006
+// x.Reactor // 007
+// x.RDS // 008
+// x.PSN // 009
+// x.Lot // 010
+// x.Cassette // 011
+// x.MeanThickness // 012
+// descriptions[i].Slot // 013
+// descriptions[i].Mean // 014
+
+// T:\met08thftirqs408m\06_SourceCode\met08thftirqs408m\Adaptation\FileHandlers\OpenInsight\FileRead.cs
+// Bio-Rad UniqueId // 001
+// Date // 002
+// ThicknessFourteenCriticalPointsAverage // 003
+// Recipe // 004
+// Reactor // 005
+// RDS // 006
+// PSN // 007
+// Layer // 008
+// Zone // 009
+// Cassette // 010
+// Wafer // 011
+// RVThickness // 012
+// Position // 013
+// Thickness // 014
+
+// T:\met08resimapcde\06_SourceCode\met08resimapcde\Adaptation\FileHandlers\OpenInsight\FileRead.cs
+// x.UniqueId // 001
+// x.Run // 002
+// x.Date // 003
+// x.Lot // 004
+// x.Recipe // 005
+// x.Reactor // 006
+// x.RDS // 007
+// x.PSN // 008
+// x.Layer // 009
+// x.Zone // 010
+// logistics.MesEntity // 011
+// x.Employee // 012
+// x.Engineer // 013
+// x.DLRatio // 014
+// x.Temp // 015
+// x.AutoOptimizeGain // 016
+// x.AutoProbeHeightSet // 017
+// x.DataReject // 018
+// x.FileName // 019
+// x.Avg // 020
+// x.StdDev // 021
+// x.SemiRadial // 022
+// description.Pt // 023
+// description.R // 024
+// description.T // 025
+// description.Rs // 026
+// description.Merit // 027
+
+// T:\met08resihgcv\06_SourceCode\met08resihgcv\Adaptation\FileHandlers\OpenInsight\FileRead.cs
+// x.UniqueId // 001
+// logistics.MesEntity // 002
+// x.Reactor // 003
+// x.RDS // 004
+// x.PSN // 005
+// x.Layer // 006
+// x.Zone // 007
+// x.Wafer // 008
+// x.Lot // 009
+// x.Plan // 010
+// x.Date // 011
+// x.WaferSize // 012
+// x.Ccomp // 013
+// x.Area // 014
+// x.CondType // 015
+// x.Model // 016
+// x.StartVoltage // 017
+// x.StopVoltage // 018
+// x.RampRate // 019
+// x.GLimit // 020
+// x.SetupFile // 021
+// x.SetupFile // 022
+// x.Folder // 023
+// x.Pattern // 024
+// x.RhoMethod // 025
+// x.NAvgMean // 026
+// x.NAvgStdDev // 027
+// x.NAvgRadialGradient // 028
+// x.NslMean // 029
+// x.NslStdDev // 030
+// x.NslRadialGradient // 031
+// x.VdMean // 032
+// x.VdStdDev // 033
+// x.VdRadialGradient // 034
+// x.FlatZMean // 035
+// x.FlatZStdDev // 036
+// x.FlatZRadialGradient // 037
+// x.RhoAvgMean // 038
+// x.RhoAvgStdDev // 039
+// x.RhoAvgRadialGradient // 040
+// x.RhoslMean // 041
+// x.RhoslStdDev // 042
+// x.RhoslRadialGradient // 043
+// x.PhaseMean // 044
+// x.PhaseStdDev // 045
+// x.PhaseRadialGradient // 046
+// x.GradeMean // 047
+// x.GradeStdDev // 048
+// x.GradeRadialGradient // 049
+// x.RsMean // 050
+// x.RsStdDev // 051
+// x.RsRadialGradient // 052
+// description.Index // 053
+// description.NAvg // 054
+// description.Nsl // 055
+// description.Vd // 056
+// description.FlatZ // 057
+// description.RhoAvg // 058
+// description.Rhosl // 059
+// description.Phase // 060
+// description.Grade // 061
+
+// T:\met08ddupsfs6420\06_SourceCode\met08ddupsfs6420\Adaptation\FileHandlers\OpenInsight\FileRead.cs
+// x.AreaCountAvg // 001 - AreaCountAvg
+// x.AreaCountMax // 002 - AreaCountMax
+// x.AreaCountMin // 003 - AreaCountMin
+// x.AreaCountStdDev // 004 - AreaCountStdDev
+// x.AreaTotalAvg // 005 - AreaTotalAvg
+// x.AreaTotalMax // 006 - AreaTotalMax
+// x.AreaTotalMin // 007 - AreaTotalMin
+// x.AreaTotalStdDev // 008 - AreaTotalStdDev
+// x.Date // 009 -
+// x.HazeAverageAvg // 010 - Haze Average
+// x.HazeAverageMax // 011 -
+// x.HazeAverageMin // 012 -
+// x.HazeAverageStdDev // 013 -
+// x.HazeRegionAvg // 014 -
+// x.HazeRegionMax // 015 -
+// x.HazeRegionMin // 016 -
+// x.HazeRegionStdDev // 017 -
+// x.Lot // 018 -
+// x.LPDCM2Avg // 019 -
+// x.LPDCM2Max // 020 -
+// x.LPDCM2Min // 021 -
+// x.LPDCM2StdDev // 022 -
+// x.LPDCountAvg // 023 -
+// x.LPDCountMax // 024 -
+// x.LPDCM2Min // 025 -
+// x.LPDCountStdDev // 026 -
+// x.Employee // 027 -
+// x.RDS // 028 - Lot
+// x.Reactor // 029 - Process
+// x.Recipe // 030 - Part
+// x.ScratchCountAvg // 031 - Scratch Count
+// x.ScratchCountMax // 032 -
+// x.ScratchCountMin // 033 -
+// x.ScratchTotalStdDev // 034 -
+// x.ScratchTotalAvg // 035 - Scratch Length
+// x.ScratchTotalMax // 036 -
+// x.ScratchTotalMin // 037 -
+// x.ScratchTotalStdDev // 038 -
+// x.SumOfDefectsAvg // 039 - Average Sum of Defects
+// x.SumOfDefectsMax // 040 - Max Sum of Defects
+// x.SumOfDefectsMin // 041 - Min Sum of Defects
+// x.SumOfDefectsStdDev // 042 - SumOfDefectsStdDev
+// logistics.MesEntity // 043 -
+
+// T:\met08ddupsp1tbi\06_SourceCode\met08ddupsp1tbi\Adaptation\FileHandlers\OpenInsight\FileRead.cs
+// x.DcnLpdMin // 001 -
+// x.DcnLpdMax // 002 -
+// x.DcnLpdMean // 003 - DCN LPD
+// x.DcnAreaCountMin // 004 -
+// x.DcnAreaCountMax // 005 -
+// x.DcnAreaCountMean // 006 - DCN Area
+// x.DcnAreaMin // 007 -
+// x.DcnAreaMax // 008 -
+// x.Date // 009 -
+// x.DcnHazeAvgMean // 010 - Haze Average
+// string.Empty // 011 -
+// string.Empty // 012 -
+// string.Empty // 013 -
+// string.Empty // 014 -
+// string.Empty // 015 -
+// string.Empty // 016 -
+// string.Empty // 017 -
+// string.Empty // 018 -
+// string.Empty // 019 -
+// string.Empty // 020 -
+// string.Empty // 021 -
+// string.Empty // 022 -
+// string.Empty // 023 -
+// string.Empty // 024 -
+// string.Empty // 025 -
+// string.Empty // 026 -
+// string.Empty // 027 -
+// x.RDS // 028 - Lot
+// x.Reactor // 029 - Process
+// x.Recipe // 030 - Part
+// x.DcnScrMean // 031 - Scratch Count
+// string.Empty // 032 -
+// string.Empty // 033 -
+// string.Empty // 034 -
+// x.DcnMicroScrMean // 035 - Scratch Length
+// string.Empty // 036 -
+// string.Empty // 037 -
+// string.Empty // 038 -
+// x.DcnAllMean // 039 - Average Sum of Defects
+// x.DcnAllMax // 040 - Max Sum of defects
+// x.DcnAllMin // 041 - Min Sum of Defects
+// string.Empty // 042 -
+// logistics.MesEntity // 043 -
+// x.DcnAreaMean // 044 - DCN MM2
diff --git a/.vscode/.vba b/.vscode/.vba
new file mode 100644
index 0000000..8222f45
--- /dev/null
+++ b/.vscode/.vba
@@ -0,0 +1,280 @@
+
+
+
+Service SetJsonFromProcessDataStandardFormat(DataPath, FileName)
+ OSREAD Text FROM DataPath:FileName THEN
+ Records = 0;
+ Sequence = -1;
+ HeaderId = -1;
+ SubgroupId = -1;
+ ColumnTitlesLine = 0;
+ FoundEndOfFile = False$;
+ json = '{ "Records": [':@FM;
+ SWAP '|' WITH @VM IN Text;
+ SWAP CRLF$ WITH @FM IN Text;
+ ColumnTitlesIndexCount = 0;
+ LineCount = DCOUNT(Text, @FM);
+ FOR LineLoopIndex = 1 TO LineCount
+ Line = Text;
+ IF FoundEndOfFile = True$ THEN
+ IF Line<1, 1> = 'END_OFFSET' THEN
+ ColumnTitlesLine = LineLoopIndex + 2;
+ END
+ IF ColumnTitlesLine GT 0 THEN
+ Row = '{';
+ SegmentsCount = DCOUNT(Line, @VM);
+ IF ColumnTitlesIndexCount EQ 0 THEN
+ FOR SegmentLoopIndex = 1 TO SegmentsCount
+ IF SegmentLoopIndex = ColumnTitlesLine THEN
+ ColumnTitlesIndexCount = SegmentsCount - 2;
+ END
+ NEXT SegmentLoopIndex
+ END
+ IF ColumnTitlesIndexCount GT 0 AND SegmentsCount = ColumnTitlesIndexCount THEN
+ FOR SegmentLoopIndex = 1 TO SegmentsCount
+ Value = SRP_String('Trim', Line<1,SegmentLoopIndex>, 'FB');
+ swap '"' with '\"' in Value;
+ swap '\' with '\\' in Value;
+ Column = Text;
+ IF Column[1,1] = '"' AND Column[-1,1] = '"' THEN
+ Column = Column[2,LEN(Column) - 2];
+ END
+ Row = Row:'"':Column:'":"':Value:'",';
+ NEXT SegmentLoopIndex
+ Row = SRP_String('Trim', Row, 'B', ','):'},':@FM;
+ json = json:Row;
+ Records = Records + 1;
+ END
+ END
+ END
+ IF Line = 'EOF' THEN
+ FoundEndOfFile = True$;
+ Line = Text;
+ Convert Tab$ to @FM IN Line
+ SWAP '=' WITH @VM IN Line;
+ SWAP ';' WITH @FM IN Line;
+ IF Line<2, 1> = 'B_HeaderId' THEN
+ HeaderId = Line<2, 2>
+ END
+ IF Line<3, 1> = 'B_SubgroupId' THEN
+ SubgroupId = Line<3, 2>
+ END
+ IF Line<14, 1> = 'B_SEQUENCE' THEN
+ Sequence = Line<14, 2>
+ END
+ END
+ NEXT LineLoopIndex
+ IF ColumnTitlesLine GT 0 AND ColumnTitlesIndexCount GT 0 THEN
+ json = SRP_String('Trim', json, 'B', @FM);
+ json = SRP_String('Trim', json, 'B', ',');
+ json = json:@FM:']':@FM:',"Sequence":':Sequence:',"HeaderId":':HeaderId:',"SubgroupId":':SubgroupId:',"Count":':Records:'}';
+ SWAP @FM WITH CRLF$ IN json;
+ END
+ IF LEN(json) GT 0 THEN
+ set_status(0);
+ OSWRITE json to DataPath:FileName:'.json'
+ StatusCode = '';
+ If Get_Status(StatusCode) THEN
+ ErrorMessage = 'Error writing run data file to repository: StatusCode = ' : StatusCode;
+ Metrology_Services('LogResults', '', Machine, 'UID001', Service : ' : ' : ErrorMessage);
+ Set_Status(0);
+ END
+ END
+ END ELSE
+ json = '';
+ END
+ Response = json;
+end service
+
+
+Service GetStratus(Handle)
+ Result = ''; // Service ImportStratusData(
+ Offset = 1
+ FieldPosition = 13
+ FieldPositionIncrement = 2
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex = 1 THEN
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DateTime'); // Timestamp
+ Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']MesEntity'); // Tool
+ Result<4> = 'FQA Thickness'; // DataType
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Employee'); // Operator
+ Result<6> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Recipe'); // Recipe
+ Result<7> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Reactor'); // Reactor
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RDS'); // RDSNo
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']PSN'); // PSN
+ Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Batch'); // BatchID
+ Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Cassette'); // Cassette
+ Result<12> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']GradeMean'); // ThickAvg
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Slot'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Mean'); // DataPoint
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetBioRadEPPFQA(Handle)
+ Result = ''; // Service ImportBioRadEPPFQAData(
+ Offset = 1
+ FieldPosition = 13
+ FieldPositionIncrement = 1
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex = 1 THEN
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DateTime'); // Timestamp
+ Result<4> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Recipe'); // ScanRecipe
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Reactor'); // ReactorID
+ Result<6> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RDS'); // WMOKeyID
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Layer'); // RunDataLayer
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Position'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Thickness'); // DataPoint
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetBioRad(Handle)
+ Result = ''; // Service ImportBioRadData(
+ Offset = 1
+ FieldPosition = 13
+ FieldPositionIncrement = 2
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex = 1 THEN
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DateTime'); // TimeStamp
+ Result<4> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Recipe'); // ScanRecipe
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Reactor'); // ReactorID
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Reactor'); // ToolID
+ Result<6> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RDS'); // RDSKeyID
+ Result<7> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']PSN'); // PSN
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Layer'); // RunDataLayer
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Zone'); // RunDataZone
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Position'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Thickness'); // DataPoint
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetCDE(Handle)
+ Result = ''; // Service ImportCDEData(
+ Offset = 3
+ FieldPosition = 23
+ FieldPositionIncrement = 5
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex = 1 THEN
+ Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Date'); // Timestamp
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RecipeName'); // ScanRecip
+ Result<6> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Reactor'); // ReactorID
+ Result<7> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RDS'); // RDSKeyID
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']PSN'); // PSN
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Layer'); // RunDataLayer
+ Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Zone'); // RunDataZo
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']InferredPoint'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Data'); // DataPoint
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']MeritGOF'); // N/A
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetHgCV(Handle)
+ Result = ''; // Service ImportHgCVData(
+ Offset = 5
+ PhaseOffset = 7
+ FieldPosition = 53
+ FieldPositionIncrement = 9
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex = 1 THEN
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']MesEntity'); // ToolID
+ Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Reactor'); // ReactorID
+ Result<4> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RDS'); // RDSKeyID
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']PSN'); // PSN
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Wafer'); // LayerZonePair
+ Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Date'); // Timestamp
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Site'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RhoAvg'); // HgCVDataPoint
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Phase'); // PhaseDataPoint
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Grade'); // N/A
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetTencor(Handle)
+ Result = ''; // Service ImportTencorData(
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex = 1 THEN
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Date'); // Timestamp
+ Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']HazeAverageAvg'); // HazeAvg
+ Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RDS'); // RDSKeyID
+ Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']WaferRecipe'); // ScanRecipe
+ Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']SumOfDefectsAvg'); // SoDAvg
+ Result<40> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']SumOfDefectsMax'); // SoDMax
+ Result<41> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']SumOfDefectsMin'); // SoDMin
+ Result<43> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']MesEntity'); // ScanTool
+ END
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetSP1(Handle)
+ Result = ''; // Service ImportSP1Data(
+ Result<5, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<5, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<5, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<5, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<5, 1>
+ IF RecordIndex = 1 THEN
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Date'); // Timestamp
+ Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DcnHazeAvgMean'); // HazeAvg
+ Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']RDS'); // RDSKeyID
+ Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']Session'); // ScanRecipe
+ IsMisfit = IndexC(Result<30>, 'MISFIT', 1)
+ IF IsMisfit THEN
+ Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DcnAllMean'); // SoDAvg
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DcnAllMax'); // SoDMax
+ Result<1> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DcnAllMin'); // SoDMin
+ END ELSE
+ Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DcnAllMean'); // SoDAvg
+ Result<40> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DcnAllMax'); // SoDMax
+ Result<41> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DcnAllMin'); // SoDMin
+ END
+ Result<43> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']MesEntity'); // ScanTool
+ Result<44> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:']DcnAreaMean'); // DCNMM2
+ END
+ NEXT RecordIndex
+ Response = Result;
+end service
\ No newline at end of file
diff --git a/.vscode/638810565835457504/1745485161 SP101 666335 2025-04-24 01-56-23.txt b/.vscode/638810565835457504/1745485161 SP101 666335 2025-04-24 01-56-23.txt
new file mode 100644
index 0000000..e00b31b
--- /dev/null
+++ b/.vscode/638810565835457504/1745485161 SP101 666335 2025-04-24 01-56-23.txt
@@ -0,0 +1,50 @@
+0 0 0.000 1 12 4.320 0.064 1.176 4/24/2025 1:56:23 AM 0.622 666335 55 6IN_SLIP 0.000 NA 4.440 12 1 SP101 0.357
+
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
+|---|---|---|---|----|------|-------|-------|----------------------|-------|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|--------|----|----------|----|----|----|----|----|----|----|----|------|----|----|----|-------|-------|
+| 0 | 0 | 0 | 1 | 12 | 4.32 | 0.064 | 1.176 | 4/24/2025 1:56:23 AM | 0.622 | | | | | | | | | | | | | | | | | | 666335 | 55 | 6IN_SLIP | 0 | | | | NA | | | | 4.44 | 12 | 1 | | SP101 | 0.357 |
+
+<1>:0
+<2>:0
+<3>:0
+<4>:1
+<5>:12
+<6>:4.32
+<7>:0.064
+<8>:1.176
+<9>:4/24/2025 1:56:23 AM
+<10>:0.622
+<11>:
+<12>:
+<13>:
+<14>:
+<15>:
+<16>:
+<17>:
+<18>:
+<19>:
+<20>:
+<21>:
+<22>:
+<23>:
+<24>:
+<25>:
+<26>:
+<27>:
+<28>:666335
+<29>:55
+<30>:6IN_SLIP
+<31>:0
+<32>:
+<33>:
+<34>:
+<35>:NA
+<36>:
+<37>:
+<38>:
+<39>:4.44
+<40>:12
+<41>:1
+<42>:
+<43>:SP101
+<44>:0.357
diff --git a/.vscode/638810565835457504/SP101_250424015623000.json b/.vscode/638810565835457504/SP101_250424015623000.json
new file mode 100644
index 0000000..7a1e44c
--- /dev/null
+++ b/.vscode/638810565835457504/SP101_250424015623000.json
@@ -0,0 +1,1982 @@
+{
+ "SentToMetrology": false,
+ "SentToSPC": false,
+ "Id": -1,
+ "CellName": "SP101",
+ "Date": "4/24/2025 1:56:23 AM",
+ "LotID": "666335",
+ "Operator": "",
+ "PSN": "5113",
+ "RDS": "666335",
+ "Reactor": "55",
+ "Recipe": "6IN_SLIP",
+ "Session": "6IN_SLIP",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457",
+ "DcnAllMax": "12",
+ "DcnAllMean": "4.440",
+ "DcnAllMin": "1",
+ "DcnAllStDev": "2.238",
+ "DcnAreaCntMax": "12",
+ "DcnAreaCntMean": "4.320",
+ "DcnAreaCntMin": "1",
+ "DcnAreaCntStDev": "2.249",
+ "DcnAreaMax": "1.176",
+ "DcnAreaMean": "0.357",
+ "DcnAreaMin": "0.064",
+ "DcnAreaStDev": "0.243",
+ "DcnBin1Max": "0",
+ "DcnBin1Mean": "0.000",
+ "DcnBin1Min": "0",
+ "DcnBin1StDev": "0.000",
+ "DcnBin2Max": "0",
+ "DcnBin2Mean": "0.000",
+ "DcnBin2Min": "0",
+ "DcnBin2StDev": "0.000",
+ "DcnBin3Max": "0",
+ "DcnBin3Mean": "0.000",
+ "DcnBin3Min": "0",
+ "DcnBin3StDev": "0.000",
+ "DcnBin4Max": "0",
+ "DcnBin4Mean": "0.000",
+ "DcnBin4Min": "0",
+ "DcnBin4StDev": "0.000",
+ "DcnBin5Max": "0",
+ "DcnBin5Mean": "0.000",
+ "DcnBin5Min": "0",
+ "DcnBin5StDev": "0.000",
+ "DcnBin6Max": "0",
+ "DcnBin6Mean": "0.000",
+ "DcnBin6Min": "0",
+ "DcnBin6StDev": "0.000",
+ "DcnBin7Max": "0",
+ "DcnBin7Mean": "0.000",
+ "DcnBin7Min": "0",
+ "DcnBin7StDev": "0.000",
+ "DcnBin8Max": "0",
+ "DcnBin8Mean": "0.000",
+ "DcnBin8Min": "0",
+ "DcnBin8StDev": "0.000",
+ "DcnHazeAvgMax": "0.660",
+ "DcnHazeAvgMean": "0.622",
+ "DcnHazeAvgMin": "0.589",
+ "DcnHazeAvgStDev": "0.016",
+ "DcnHazeMedMax": "0.645",
+ "DcnHazeMedMean": "0.615",
+ "DcnHazeMedMin": "0.584",
+ "DcnHazeMedStDev": "0.016",
+ "DcnHazeStDevMax": "0.278",
+ "DcnHazeStDevMean": "0.070",
+ "DcnHazeStDevMin": "0.048",
+ "DcnHazeStDevStDev": "0.044",
+ "DcnLpdESMax": "NA",
+ "DcnLpdESMean": "NA",
+ "DcnLpdESMin": "NA",
+ "DcnLpdESStDev": "NA",
+ "DcnLpdMax": "0",
+ "DcnLpdMean": "0.000",
+ "DcnLpdMin": "0",
+ "DcnLpdNMax": "NA",
+ "DcnLpdNMean": "NA",
+ "DcnLpdNMin": "NA",
+ "DcnLpdNStDev": "NA",
+ "DcnLpdStDev": "0.000",
+ "DcnMicroScrMax": "NA",
+ "DcnMicroScrMean": "NA",
+ "DcnMicroScrMin": "NA",
+ "DcnMicroScrStDev": "NA",
+ "DcnScrMax": "0",
+ "DcnScrMean": "0.000",
+ "DcnScrMin": "0",
+ "DcnScrStDev": "0.000",
+ "DcnSlipMax": "1.732",
+ "DcnSlipMean": "0.093",
+ "DcnSlipMin": "0.000",
+ "DcnSlipStDev": "0.361",
+ "DnnAllMax": "14",
+ "DnnAllMean": "4.840",
+ "DnnAllMin": "1",
+ "DnnAllStDev": "2.577",
+ "DnnAreaCntMax": "14",
+ "DnnAreaCntMean": "4.840",
+ "DnnAreaCntMin": "1",
+ "DnnAreaCntStDev": "2.577",
+ "DnnAreaMax": "0.786",
+ "DnnAreaMean": "0.250",
+ "DnnAreaMin": "0.073",
+ "DnnAreaStDev": "0.154",
+ "DnnBin1Max": "0",
+ "DnnBin1Mean": "0.000",
+ "DnnBin1Min": "0",
+ "DnnBin1StDev": "0.000",
+ "DnnBin2Max": "0",
+ "DnnBin2Mean": "0.000",
+ "DnnBin2Min": "0",
+ "DnnBin2StDev": "0.000",
+ "DnnBin3Max": "0",
+ "DnnBin3Mean": "0.000",
+ "DnnBin3Min": "0",
+ "DnnBin3StDev": "0.000",
+ "DnnBin4Max": "0",
+ "DnnBin4Mean": "0.000",
+ "DnnBin4Min": "0",
+ "DnnBin4StDev": "0.000",
+ "DnnBin5Max": "0",
+ "DnnBin5Mean": "0.000",
+ "DnnBin5Min": "0",
+ "DnnBin5StDev": "0.000",
+ "DnnBin6Max": "0",
+ "DnnBin6Mean": "0.000",
+ "DnnBin6Min": "0",
+ "DnnBin6StDev": "0.000",
+ "DnnBin7Max": "0",
+ "DnnBin7Mean": "0.000",
+ "DnnBin7Min": "0",
+ "DnnBin7StDev": "0.000",
+ "DnnBin8Max": "0",
+ "DnnBin8Mean": "0.000",
+ "DnnBin8Min": "0",
+ "DnnBin8StDev": "0.000",
+ "DnnHazeAvgMax": "0.477",
+ "DnnHazeAvgMean": "0.440",
+ "DnnHazeAvgMin": "0.411",
+ "DnnHazeAvgStDev": "0.019",
+ "DnnHazeMedMax": "0.476",
+ "DnnHazeMedMean": "0.437",
+ "DnnHazeMedMin": "0.408",
+ "DnnHazeMedStDev": "0.019",
+ "DnnHazeStDevMax": "0.187",
+ "DnnHazeStDevMean": "0.032",
+ "DnnHazeStDevMin": "0.017",
+ "DnnHazeStDevStDev": "0.033",
+ "DnnLpdESMax": "NA",
+ "DnnLpdESMean": "NA",
+ "DnnLpdESMin": "NA",
+ "DnnLpdESStDev": "NA",
+ "DnnLpdMax": "0",
+ "DnnLpdMean": "0.000",
+ "DnnLpdMin": "0",
+ "DnnLpdNMax": "NA",
+ "DnnLpdNMean": "NA",
+ "DnnLpdNMin": "NA",
+ "DnnLpdNStDev": "NA",
+ "DnnLpdStDev": "0.000",
+ "DnnMicroScrMax": "NA",
+ "DnnMicroScrMean": "NA",
+ "DnnMicroScrMin": "NA",
+ "DnnMicroScrStDev": "NA",
+ "DnnScrMax": "NA",
+ "DnnScrMean": "NA",
+ "DnnScrMin": "NA",
+ "DnnScrStDev": "NA",
+ "DnnSlipMax": "NA",
+ "DnnSlipMean": "NA",
+ "DnnSlipMin": "NA",
+ "DnnSlipStDev": "NA",
+ "DwnAllMax": "4",
+ "DwnAllMean": "1.560",
+ "DwnAllMin": "0",
+ "DwnAllStDev": "1.083",
+ "DwnAreaCntMax": "4",
+ "DwnAreaCntMean": "1.560",
+ "DwnAreaCntMin": "0",
+ "DwnAreaCntStDev": "1.083",
+ "DwnAreaMax": "0.042",
+ "DwnAreaMean": "0.007",
+ "DwnAreaMin": "0.000",
+ "DwnAreaStDev": "0.012",
+ "DwnBin1Max": "0",
+ "DwnBin1Mean": "0.000",
+ "DwnBin1Min": "0",
+ "DwnBin1StDev": "0.000",
+ "DwnBin2Max": "0",
+ "DwnBin2Mean": "0.000",
+ "DwnBin2Min": "0",
+ "DwnBin2StDev": "0.000",
+ "DwnBin3Max": "0",
+ "DwnBin3Mean": "0.000",
+ "DwnBin3Min": "0",
+ "DwnBin3StDev": "0.000",
+ "DwnBin4Max": "0",
+ "DwnBin4Mean": "0.000",
+ "DwnBin4Min": "0",
+ "DwnBin4StDev": "0.000",
+ "DwnBin5Max": "0",
+ "DwnBin5Mean": "0.000",
+ "DwnBin5Min": "0",
+ "DwnBin5StDev": "0.000",
+ "DwnBin6Max": "0",
+ "DwnBin6Mean": "0.000",
+ "DwnBin6Min": "0",
+ "DwnBin6StDev": "0.000",
+ "DwnBin7Max": "0",
+ "DwnBin7Mean": "0.000",
+ "DwnBin7Min": "0",
+ "DwnBin7StDev": "0.000",
+ "DwnBin8Max": "0",
+ "DwnBin8Mean": "0.000",
+ "DwnBin8Min": "0",
+ "DwnBin8StDev": "0.000",
+ "DwnHazeAvgMax": "0.218",
+ "DwnHazeAvgMean": "0.182",
+ "DwnHazeAvgMin": "0.151",
+ "DwnHazeAvgStDev": "0.016",
+ "DwnHazeMedMax": "0.200",
+ "DwnHazeMedMean": "0.168",
+ "DwnHazeMedMin": "0.137",
+ "DwnHazeMedStDev": "0.017",
+ "DwnHazeStDevMax": "0.108",
+ "DwnHazeStDevMean": "0.065",
+ "DwnHazeStDevMin": "0.053",
+ "DwnHazeStDevStDev": "0.010",
+ "DwnLpdESMax": "NA",
+ "DwnLpdESMean": "NA",
+ "DwnLpdESMin": "NA",
+ "DwnLpdESStDev": "NA",
+ "DwnLpdMax": "0",
+ "DwnLpdMean": "0.000",
+ "DwnLpdMin": "0",
+ "DwnLpdNMax": "NA",
+ "DwnLpdNMean": "NA",
+ "DwnLpdNMin": "NA",
+ "DwnLpdNStDev": "NA",
+ "DwnLpdStDev": "0.000",
+ "DwnMicroScrMax": "NA",
+ "DwnMicroScrMean": "NA",
+ "DwnMicroScrMin": "NA",
+ "DwnMicroScrStDev": "NA",
+ "DwnScrMax": "NA",
+ "DwnScrMean": "NA",
+ "DwnScrMin": "NA",
+ "DwnScrStDev": "NA",
+ "DwnSlipMax": "NA",
+ "DwnSlipMean": "NA",
+ "DwnSlipMin": "NA",
+ "DwnSlipStDev": "NA",
+ "Details": [
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/1-2/1",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-1",
+ "WaferID": "1",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.230",
+ "DcnAreaCount": "2",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.640",
+ "DcnHazeMedian": "0.636",
+ "DcnHazeStdDev": "0.061",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.155",
+ "DnnAreaCount": "4",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.448",
+ "DnnHazeMedian": "0.443",
+ "DnnHazeStdDev": "0.028",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "0",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.192",
+ "DwnHazeMedian": "0.179",
+ "DwnHazeStdDev": "0.066",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/2-2/2",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-2",
+ "WaferID": "2",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.064",
+ "DcnAreaCount": "2",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.644",
+ "DcnHazeMedian": "0.636",
+ "DcnHazeStdDev": "0.058",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.581",
+ "DnnAll": "",
+ "DnnArea": "0.073",
+ "DnnAreaCount": "4",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.459",
+ "DnnHazeMedian": "0.456",
+ "DnnHazeStdDev": "0.024",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "0",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.185",
+ "DwnHazeMedian": "0.169",
+ "DwnHazeStdDev": "0.062",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/3-2/3",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-3",
+ "WaferID": "3",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.345",
+ "DcnAreaCount": "7",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.615",
+ "DcnHazeMedian": "0.601",
+ "DcnHazeStdDev": "0.070",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.284",
+ "DnnAreaCount": "9",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.449",
+ "DnnHazeMedian": "0.447",
+ "DnnHazeStdDev": "0.017",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "4",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.165",
+ "DwnHazeMedian": "0.145",
+ "DwnHazeStdDev": "0.068",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/4-2/4",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-4",
+ "WaferID": "4",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.284",
+ "DcnAreaCount": "4",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.631",
+ "DcnHazeMedian": "0.625",
+ "DcnHazeStdDev": "0.065",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.192",
+ "DnnAreaCount": "4",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.450",
+ "DnnHazeMedian": "0.448",
+ "DnnHazeStdDev": "0.026",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.181",
+ "DwnHazeMedian": "0.166",
+ "DwnHazeStdDev": "0.062",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/5-2/5",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-5",
+ "WaferID": "5",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.298",
+ "DcnAreaCount": "2",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.624",
+ "DcnHazeMedian": "0.612",
+ "DcnHazeStdDev": "0.065",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.202",
+ "DnnAreaCount": "2",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.453",
+ "DnnHazeMedian": "0.452",
+ "DnnHazeStdDev": "0.026",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.028",
+ "DwnAreaCount": "2",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.170",
+ "DwnHazeMedian": "0.153",
+ "DwnHazeStdDev": "0.061",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/6-2/6",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-6",
+ "WaferID": "6",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.119",
+ "DcnAreaCount": "1",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.650",
+ "DcnHazeMedian": "0.641",
+ "DcnHazeStdDev": "0.060",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.083",
+ "DnnAreaCount": "1",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.468",
+ "DnnHazeMedian": "0.467",
+ "DnnHazeStdDev": "0.027",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.182",
+ "DwnHazeMedian": "0.166",
+ "DwnHazeStdDev": "0.066",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/7-2/7",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-7",
+ "WaferID": "7",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.293",
+ "DcnAreaCount": "5",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.660",
+ "DcnHazeMedian": "0.645",
+ "DcnHazeStdDev": "0.072",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.222",
+ "DnnAreaCount": "5",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.477",
+ "DnnHazeMedian": "0.476",
+ "DnnHazeStdDev": "0.018",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.182",
+ "DwnHazeMedian": "0.164",
+ "DwnHazeStdDev": "0.072",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/8-2/8",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-8",
+ "WaferID": "8",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.530",
+ "DcnAreaCount": "5",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.608",
+ "DcnHazeMedian": "0.596",
+ "DcnHazeStdDev": "0.059",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.309",
+ "DnnAreaCount": "7",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.442",
+ "DnnHazeMedian": "0.437",
+ "DnnHazeStdDev": "0.030",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.024",
+ "DwnAreaCount": "3",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.167",
+ "DwnHazeMedian": "0.145",
+ "DwnHazeStdDev": "0.065",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/9-2/9",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-9",
+ "WaferID": "9",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.138",
+ "DcnAreaCount": "3",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.607",
+ "DcnHazeMedian": "0.598",
+ "DcnHazeStdDev": "0.086",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.113",
+ "DnnAreaCount": "3",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.448",
+ "DnnHazeMedian": "0.444",
+ "DnnHazeStdDev": "0.043",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "0",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.160",
+ "DwnHazeMedian": "0.147",
+ "DwnHazeStdDev": "0.065",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/10-2/10",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-10",
+ "WaferID": "10",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.501",
+ "DcnAreaCount": "5",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.627",
+ "DcnHazeMedian": "0.618",
+ "DcnHazeStdDev": "0.060",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.347",
+ "DnnAreaCount": "5",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.459",
+ "DnnHazeMedian": "0.453",
+ "DnnHazeStdDev": "0.027",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.021",
+ "DwnAreaCount": "2",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.169",
+ "DwnHazeMedian": "0.154",
+ "DwnHazeStdDev": "0.066",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/11-2/11",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-11",
+ "WaferID": "11",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.498",
+ "DcnAreaCount": "7",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.611",
+ "DcnHazeMedian": "0.604",
+ "DcnHazeStdDev": "0.057",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.342",
+ "DnnAreaCount": "7",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.461",
+ "DnnHazeMedian": "0.461",
+ "DnnHazeStdDev": "0.020",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.022",
+ "DwnAreaCount": "3",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.151",
+ "DwnHazeMedian": "0.137",
+ "DwnHazeStdDev": "0.061",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/12-2/12",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-12",
+ "WaferID": "12",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.311",
+ "DcnAreaCount": "3",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.617",
+ "DcnHazeMedian": "0.608",
+ "DcnHazeStdDev": "0.059",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.197",
+ "DnnAreaCount": "3",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.448",
+ "DnnHazeMedian": "0.444",
+ "DnnHazeStdDev": "0.022",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.169",
+ "DwnHazeMedian": "0.156",
+ "DwnHazeStdDev": "0.062",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/13-2/13",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-13",
+ "WaferID": "13",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.254",
+ "DcnAreaCount": "4",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.623",
+ "DcnHazeMedian": "0.619",
+ "DcnHazeStdDev": "0.059",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.191",
+ "DnnAreaCount": "4",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.461",
+ "DnnHazeMedian": "0.458",
+ "DnnHazeStdDev": "0.023",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.162",
+ "DwnHazeMedian": "0.153",
+ "DwnHazeStdDev": "0.057",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/14-2/14",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-14",
+ "WaferID": "14",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.445",
+ "DcnAreaCount": "5",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.622",
+ "DcnHazeMedian": "0.615",
+ "DcnHazeStdDev": "0.057",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.316",
+ "DnnAreaCount": "5",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.444",
+ "DnnHazeMedian": "0.440",
+ "DnnHazeStdDev": "0.025",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "2",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.178",
+ "DwnHazeMedian": "0.168",
+ "DwnHazeStdDev": "0.064",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/15-2/15",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-15",
+ "WaferID": "15",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.285",
+ "DcnAreaCount": "2",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.609",
+ "DcnHazeMedian": "0.602",
+ "DcnHazeStdDev": "0.058",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.190",
+ "DnnAreaCount": "3",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.425",
+ "DnnHazeMedian": "0.418",
+ "DnnHazeStdDev": "0.027",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.184",
+ "DwnHazeMedian": "0.172",
+ "DwnHazeStdDev": "0.062",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/16-2/16",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-16",
+ "WaferID": "16",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.845",
+ "DcnAreaCount": "6",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.604",
+ "DcnHazeMedian": "0.604",
+ "DcnHazeStdDev": "0.057",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.547",
+ "DnnAreaCount": "6",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.426",
+ "DnnHazeMedian": "0.423",
+ "DnnHazeStdDev": "0.024",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.026",
+ "DwnAreaCount": "3",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.178",
+ "DwnHazeMedian": "0.170",
+ "DwnHazeStdDev": "0.063",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/17-2/17",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-17",
+ "WaferID": "17",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.148",
+ "DcnAreaCount": "3",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.625",
+ "DcnHazeMedian": "0.623",
+ "DcnHazeStdDev": "0.053",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.111",
+ "DnnAreaCount": "3",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.432",
+ "DnnHazeMedian": "0.430",
+ "DnnHazeStdDev": "0.022",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.193",
+ "DwnHazeMedian": "0.188",
+ "DwnHazeStdDev": "0.060",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/18-2/18",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-18",
+ "WaferID": "18",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.467",
+ "DcnAreaCount": "5",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.638",
+ "DcnHazeMedian": "0.635",
+ "DcnHazeStdDev": "0.048",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.308",
+ "DnnAreaCount": "5",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.439",
+ "DnnHazeMedian": "0.436",
+ "DnnHazeStdDev": "0.021",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "3",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.199",
+ "DwnHazeMedian": "0.191",
+ "DwnHazeStdDev": "0.053",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/19-2/19",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-19",
+ "WaferID": "19",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.282",
+ "DcnAreaCount": "6",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.624",
+ "DcnHazeMedian": "0.622",
+ "DcnHazeStdDev": "0.050",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.247",
+ "DnnAreaCount": "6",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.423",
+ "DnnHazeMedian": "0.416",
+ "DnnHazeStdDev": "0.027",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.201",
+ "DwnHazeMedian": "0.193",
+ "DwnHazeStdDev": "0.058",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/20-2/20",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-20",
+ "WaferID": "20",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "1.176",
+ "DcnAreaCount": "12",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.619",
+ "DcnHazeMedian": "0.617",
+ "DcnHazeStdDev": "0.054",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.786",
+ "DnnAreaCount": "14",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.411",
+ "DnnHazeMedian": "0.408",
+ "DnnHazeStdDev": "0.026",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "3",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.208",
+ "DwnHazeMedian": "0.198",
+ "DwnHazeStdDev": "0.061",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/21-2/21",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-21",
+ "WaferID": "21",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.170",
+ "DcnAreaCount": "3",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.589",
+ "DcnHazeMedian": "0.584",
+ "DcnHazeStdDev": "0.064",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.135",
+ "DnnAreaCount": "3",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.416",
+ "DnnHazeMedian": "0.416",
+ "DnnHazeStdDev": "0.023",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.173",
+ "DwnHazeMedian": "0.165",
+ "DwnHazeStdDev": "0.067",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/22-2/22",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-22",
+ "WaferID": "22",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.407",
+ "DcnAreaCount": "4",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.602",
+ "DcnHazeMedian": "0.596",
+ "DcnHazeStdDev": "0.058",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.269",
+ "DnnAreaCount": "4",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.422",
+ "DnnHazeMedian": "0.418",
+ "DnnHazeStdDev": "0.027",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.181",
+ "DwnHazeMedian": "0.167",
+ "DwnHazeStdDev": "0.066",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/23-2/23",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-23",
+ "WaferID": "23",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.516",
+ "DcnAreaCount": "4",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.609",
+ "DcnHazeMedian": "0.603",
+ "DcnHazeStdDev": "0.063",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.319",
+ "DnnAreaCount": "4",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.415",
+ "DnnHazeMedian": "0.413",
+ "DnnHazeStdDev": "0.024",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.194",
+ "DwnHazeMedian": "0.181",
+ "DwnHazeStdDev": "0.058",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/24-2/24",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-24",
+ "WaferID": "24",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.180",
+ "DcnAreaCount": "4",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.614",
+ "DcnHazeMedian": "0.606",
+ "DcnHazeStdDev": "0.067",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "1.732",
+ "DnnAll": "",
+ "DnnArea": "0.178",
+ "DnnAreaCount": "6",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.418",
+ "DnnHazeMedian": "0.415",
+ "DnnHazeStdDev": "0.023",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.000",
+ "DwnAreaCount": "2",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.196",
+ "DwnHazeMedian": "0.179",
+ "DwnHazeStdDev": "0.060",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ },
+ {
+ "Grade": "Grade1",
+ "HeaderUniqueID": "SP101_55-666335-5113_202504240156235457",
+ "Side": "F",
+ "SrcDest": "2/25-2/25",
+ "UniqueID": "SP101_55-666335-5113_202504240156235457_Item-25",
+ "WaferID": "25",
+ "Data": "*Data*",
+ "DcnAll": "",
+ "DcnArea": "0.152",
+ "DcnAreaCount": "4",
+ "DcnBin1": "0",
+ "DcnBin2": "0",
+ "DcnBin3": "0",
+ "DcnBin4": "0",
+ "DcnBin5": "0",
+ "DcnBin6": "0",
+ "DcnBin7": "0",
+ "DcnBin8": "0",
+ "DcnHazeAvg": "0.633",
+ "DcnHazeMedian": "0.622",
+ "DcnHazeStdDev": "0.278",
+ "DcnLpd": "0",
+ "DcnLpdES": "NA",
+ "DcnLpdN": "NA",
+ "DcnMicroScr": "NA",
+ "DcnScr": "0",
+ "DcnSlip": "0.000",
+ "DnnAll": "",
+ "DnnArea": "0.128",
+ "DnnAreaCount": "4",
+ "DnnBin1": "0",
+ "DnnBin2": "0",
+ "DnnBin3": "0",
+ "DnnBin4": "0",
+ "DnnBin5": "0",
+ "DnnBin6": "0",
+ "DnnBin7": "0",
+ "DnnBin8": "0",
+ "DnnHazeAvg": "0.415",
+ "DnnHazeMedian": "0.414",
+ "DnnHazeStdDev": "0.187",
+ "DnnLpd": "0",
+ "DnnLpdES": "NA",
+ "DnnLpdN": "NA",
+ "DnnMicroScr": "NA",
+ "DnnScr": "NA",
+ "DnnSlip": "NA",
+ "DwnAll": "",
+ "DwnArea": "0.042",
+ "DwnAreaCount": "1",
+ "DwnBin1": "0",
+ "DwnBin2": "0",
+ "DwnBin3": "0",
+ "DwnBin4": "0",
+ "DwnBin5": "0",
+ "DwnBin6": "0",
+ "DwnBin7": "0",
+ "DwnBin8": "0",
+ "DwnHazeAvg": "0.218",
+ "DwnHazeMedian": "0.200",
+ "DwnHazeStdDev": "0.108",
+ "DwnLpd": "0",
+ "DwnLpdES": "NA",
+ "DwnLpdN": "NA",
+ "DwnMicroScr": "NA",
+ "DwnScr": "NA",
+ "DwnSlip": "NA"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/638810565835457504/SP101_250424015623000.pdsf b/.vscode/638810565835457504/SP101_250424015623000.pdsf
new file mode 100644
index 0000000..b7a472d
--- /dev/null
+++ b/.vscode/638810565835457504/SP101_250424015623000.pdsf
@@ -0,0 +1,87 @@
+HEADER_TAG HEADER_VALUE
+FORMAT 2.00
+NUMBER_PASSES 0001
+HEADER_OFFSET H#######T
+DATA_OFFSET D#######T
+END_OFFSET E#######T
+"Time" "A_LOGISTICS" "B_LOGISTICS" "Test" "Count" "Index" "MesEntity" "Date" "Employee" "Lot" "PSN" "Reactor" "Recipe" "Grade" "HeaderUniqueId" "RDS" "Session" "Side" "SrcDest" "UniqueId" "WaferID" "DcnAllMax" "DcnAllMean" "DcnAllMin" "DcnAllStdDev" "DcnAreaCountMax" "DcnAreaCountMean" "DcnAreaCountMin" "DcnAreaCountStdDev" "DcnAreaMax" "DcnAreaMean" "DcnAreaMin" "DcnAreaStdDev" "DcnBin1Max" "DcnBin1Mean" "DcnBin1Min" "DcnBin1StdDev" "DcnBin2Max" "DcnBin2Mean" "DcnBin2Min" "DcnBin2StdDev" "DcnBin3Max" "DcnBin3Mean" "DcnBin3Min" "DcnBin3StdDev" "DcnBin4Max" "DcnBin4Mean" "DcnBin4Min" "DcnBin4StdDev" "DcnBin5Max" "DcnBin5Mean" "DcnBin5Min" "DcnBin5StdDev" "DcnBin6Max" "DcnBin6Mean" "DcnBin6Min" "DcnBin6StdDev" "DcnBin7Max" "DcnBin7Mean" "DcnBin7Min" "DcnBin7StdDev" "DcnBin8Max" "DcnBin8Mean" "DcnBin8Min" "DcnBin8StdDev" "DcnHazeAvgMax" "DcnHazeAvgMean" "DcnHazeAvgMin" "DcnHazeAvgStdDev" "DcnHazeMedianMax" "DcnHazeMedianMean" "DcnHazeMedianMin" "DcnHazeMedianStdDev" "DcnHazeStdDevMax" "DcnHazeStdDevMean" "DcnHazeStdDevMin" "DcnHazeStdDevStdDev" "DcnLpdESMax" "DcnLpdESMean" "DcnLpdESMin" "DcnLpdESStdDev" "DcnLpdMax" "DcnLpdMean" "DcnLpdMin" "DcnLpdNMax" "DcnLpdNMean" "DcnLpdNMin" "DcnLpdNStdDev" "DcnLpdStdDev" "DcnMicroScrMax" "DcnMicroScrMean" "DcnMicroScrMin" "DcnMicroScrStdDev" "DcnScrMax" "DcnScrMean" "DcnScrMin" "DcnScrStdDev" "DcnSlipMax" "DcnSlipMean" "DcnSlipMin" "DcnSlipStdDev" "DnnAllMax" "DnnAllMean" "DnnAllMin" "DnnAllStdDev" "DnnAreaCountMax" "DnnAreaCountMean" "DnnAreaCountMin" "DnnAreaCountStdDev" "DnnAreaMax" "DnnAreaMean" "DnnAreaMin" "DnnAreaStdDev" "DnnBin1Max" "DnnBin1Mean" "DnnBin1Min" "DnnBin1StdDev" "DnnBin2Max" "DnnBin2Mean" "DnnBin2Min" "DnnBin2StdDev" "DnnBin3Max" "DnnBin3Mean" "DnnBin3Min" "DnnBin3StdDev" "DnnBin4Max" "DnnBin4Mean" "DnnBin4Min" "DnnBin4StdDev" "DnnBin5Max" "DnnBin5Mean" "DnnBin5Min" "DnnBin5StdDev" "DnnBin6Max" "DnnBin6Mean" "DnnBin6Min" "DnnBin6StdDev" "DnnBin7Max" "DnnBin7Mean" "DnnBin7Min" "DnnBin7StdDev" "DnnBin8Max" "DnnBin8Mean" "DnnBin8Min" "DnnBin8StdDev" "DnnHazeAvgMax" "DnnHazeAvgMean" "DnnHazeAvgMin" "DnnHazeAvgStdDev" "DnnHazeMedianMax" "DnnHazeMedianMean" "DnnHazeMedianMin" "DnnHazeMedianStdDev" "DnnHazeStdDevMax" "DnnHazeStdDevMean" "DnnHazeStdDevMin" "DnnHazeStdDevStdDev" "DnnLpdESMax" "DnnLpdESMean" "DnnLpdESMin" "DnnLpdESStdDev" "DnnLpdMax" "DnnLpdMean" "DnnLpdMin" "DnnLpdNMax" "DnnLpdNMean" "DnnLpdNMin" "DnnLpdNStdDev" "DnnLpdStdDev" "DnnMicroScrMax" "DnnMicroScrMean" "DnnMicroScrMin" "DnnMicroScrStdDev" "DnnScrMax" "DnnScrMean" "DnnScrMin" "DnnScrStdDev" "DnnSlipMax" "DnnSlipMean" "DnnSlipMin" "DnnSlipStdDev" "DwnAllMax" "DwnAllMean" "DwnAllMin" "DwnAllStdDev" "DwnAreaCountMax" "DwnAreaCountMean" "DwnAreaCountMin" "DwnAreaCountStdDev" "DwnAreaMax" "DwnAreaMean" "DwnAreaMin" "DwnAreaStdDev" "DwnBin1Max" "DwnBin1Mean" "DwnBin1Min" "DwnBin1StdDev" "DwnBin2Max" "DwnBin2Mean" "DwnBin2Min" "DwnBin2StdDev" "DwnBin3Max" "DwnBin3Mean" "DwnBin3Min" "DwnBin3StdDev" "DwnBin4Max" "DwnBin4Mean" "DwnBin4Min" "DwnBin4StdDev" "DwnBin5Max" "DwnBin5Mean" "DwnBin5Min" "DwnBin5StdDev" "DwnBin6Max" "DwnBin6Mean" "DwnBin6Min" "DwnBin6StdDev" "DwnBin7Max" "DwnBin7Mean" "DwnBin7Min" "DwnBin7StdDev" "DwnBin8Max" "DwnBin8Mean" "DwnBin8Min" "DwnBin8StdDev" "DwnHazeAvgMax" "DwnHazeAvgMean" "DwnHazeAvgMin" "DwnHazeAvgStdDev" "DwnHazeMedianMax" "DwnHazeMedianMean" "DwnHazeMedianMin" "DwnHazeMedianStdDev" "DwnHazeStdDevMax" "DwnHazeStdDevMean" "DwnHazeStdDevMin" "DwnHazeStdDevStdDev" "DwnLpdESMax" "DwnLpdESMean" "DwnLpdESMin" "DwnLpdESStdDev" "DwnLpdMax" "DwnLpdMean" "DwnLpdMin" "DwnLpdNMax" "DwnLpdNMean" "DwnLpdNMin" "DwnLpdNStdDev" "DwnLpdStdDev" "DwnMicroScrMax" "DwnMicroScrMean" "DwnMicroScrMin" "DwnMicroScrStdDev" "DwnScrMax" "DwnScrMean" "DwnScrMin" "DwnScrStdDev" "DwnSlipMax" "DwnSlipMean" "DwnSlipMin" "DwnSlipStdDev" "DcnAll" "DcnArea" "DcnAreaCount" "DcnBin1" "DcnBin2" "DcnBin3" "DcnBin4" "DcnBin5" "DcnBin6" "DcnBin7" "DcnBin8" "DcnHazeAvg" "DcnHazeMedian" "DcnHazeStdDev" "DcnLpd" "DcnLpdES" "DcnLpdN" "DcnMicroScr" "DcnScr" "DcnSlip" "DnnAll" "DnnArea" "DnnAreaCount" "DnnBin1" "DnnBin2" "DnnBin3" "DnnBin4" "DnnBin5" "DnnBin6" "DnnBin7" "DnnBin8" "DnnHazeAvg" "DnnHazeMedian" "DnnHazeStdDev" "DnnLpd" "DnnLpdES" "DnnLpdN" "DnnMicroScr" "DnnScr" "DnnSlip" "DwnAll" "DwnArea" "DwnAreaCount" "DwnBin1" "DwnBin2" "DwnBin3" "DwnBin4" "DwnBin5" "DwnBin6" "DwnBin7" "DwnBin8" "DwnHazeAvg" "DwnHazeMedian" "DwnHazeStdDev" "DwnLpd" "DwnLpdES" "DwnLpdN" "DwnMicroScr" "DwnScr" "DwnSlip"
+0.00 1 2 8 25 0 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/1-2/1 UniqueId 1 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.230 2 0 0 0 0 0 0 0 0 0.640 0.636 0.061 0 NA NA NA 0 0.000 0.155 4 0 0 0 0 0 0 0 0 0.448 0.443 0.028 0 NA NA NA NA NA 0.000 0 0 0 0 0 0 0 0 0 0.192 0.179 0.066 0 NA NA NA NA NA
+0.00 1 2 8 25 1 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/2-2/2 UniqueId 2 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.064 2 0 0 0 0 0 0 0 0 0.644 0.636 0.058 0 NA NA NA 0 0.581 0.073 4 0 0 0 0 0 0 0 0 0.459 0.456 0.024 0 NA NA NA NA NA 0.000 0 0 0 0 0 0 0 0 0 0.185 0.169 0.062 0 NA NA NA NA NA
+0.00 1 2 8 25 2 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/3-2/3 UniqueId 3 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.345 7 0 0 0 0 0 0 0 0 0.615 0.601 0.070 0 NA NA NA 0 0.000 0.284 9 0 0 0 0 0 0 0 0 0.449 0.447 0.017 0 NA NA NA NA NA 0.000 4 0 0 0 0 0 0 0 0 0.165 0.145 0.068 0 NA NA NA NA NA
+0.00 1 2 8 25 3 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/4-2/4 UniqueId 4 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.284 4 0 0 0 0 0 0 0 0 0.631 0.625 0.065 0 NA NA NA 0 0.000 0.192 4 0 0 0 0 0 0 0 0 0.450 0.448 0.026 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.181 0.166 0.062 0 NA NA NA NA NA
+0.00 1 2 8 25 4 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/5-2/5 UniqueId 5 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.298 2 0 0 0 0 0 0 0 0 0.624 0.612 0.065 0 NA NA NA 0 0.000 0.202 2 0 0 0 0 0 0 0 0 0.453 0.452 0.026 0 NA NA NA NA NA 0.028 2 0 0 0 0 0 0 0 0 0.170 0.153 0.061 0 NA NA NA NA NA
+0.00 1 2 8 25 5 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/6-2/6 UniqueId 6 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.119 1 0 0 0 0 0 0 0 0 0.650 0.641 0.060 0 NA NA NA 0 0.000 0.083 1 0 0 0 0 0 0 0 0 0.468 0.467 0.027 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.182 0.166 0.066 0 NA NA NA NA NA
+0.00 1 2 8 25 6 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/7-2/7 UniqueId 7 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.293 5 0 0 0 0 0 0 0 0 0.660 0.645 0.072 0 NA NA NA 0 0.000 0.222 5 0 0 0 0 0 0 0 0 0.477 0.476 0.018 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.182 0.164 0.072 0 NA NA NA NA NA
+0.00 1 2 8 25 7 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/8-2/8 UniqueId 8 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.530 5 0 0 0 0 0 0 0 0 0.608 0.596 0.059 0 NA NA NA 0 0.000 0.309 7 0 0 0 0 0 0 0 0 0.442 0.437 0.030 0 NA NA NA NA NA 0.024 3 0 0 0 0 0 0 0 0 0.167 0.145 0.065 0 NA NA NA NA NA
+0.00 1 2 8 25 8 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/9-2/9 UniqueId 9 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.138 3 0 0 0 0 0 0 0 0 0.607 0.598 0.086 0 NA NA NA 0 0.000 0.113 3 0 0 0 0 0 0 0 0 0.448 0.444 0.043 0 NA NA NA NA NA 0.000 0 0 0 0 0 0 0 0 0 0.160 0.147 0.065 0 NA NA NA NA NA
+0.00 1 2 8 25 9 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/10-2/10 UniqueId 10 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.501 5 0 0 0 0 0 0 0 0 0.627 0.618 0.060 0 NA NA NA 0 0.000 0.347 5 0 0 0 0 0 0 0 0 0.459 0.453 0.027 0 NA NA NA NA NA 0.021 2 0 0 0 0 0 0 0 0 0.169 0.154 0.066 0 NA NA NA NA NA
+0.00 1 2 8 25 10 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/11-2/11 UniqueId 11 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.498 7 0 0 0 0 0 0 0 0 0.611 0.604 0.057 0 NA NA NA 0 0.000 0.342 7 0 0 0 0 0 0 0 0 0.461 0.461 0.020 0 NA NA NA NA NA 0.022 3 0 0 0 0 0 0 0 0 0.151 0.137 0.061 0 NA NA NA NA NA
+0.00 1 2 8 25 11 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/12-2/12 UniqueId 12 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.311 3 0 0 0 0 0 0 0 0 0.617 0.608 0.059 0 NA NA NA 0 0.000 0.197 3 0 0 0 0 0 0 0 0 0.448 0.444 0.022 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.169 0.156 0.062 0 NA NA NA NA NA
+0.00 1 2 8 25 12 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/13-2/13 UniqueId 13 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.254 4 0 0 0 0 0 0 0 0 0.623 0.619 0.059 0 NA NA NA 0 0.000 0.191 4 0 0 0 0 0 0 0 0 0.461 0.458 0.023 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.162 0.153 0.057 0 NA NA NA NA NA
+0.00 1 2 8 25 13 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/14-2/14 UniqueId 14 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.445 5 0 0 0 0 0 0 0 0 0.622 0.615 0.057 0 NA NA NA 0 0.000 0.316 5 0 0 0 0 0 0 0 0 0.444 0.440 0.025 0 NA NA NA NA NA 0.000 2 0 0 0 0 0 0 0 0 0.178 0.168 0.064 0 NA NA NA NA NA
+0.00 1 2 8 25 14 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/15-2/15 UniqueId 15 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.285 2 0 0 0 0 0 0 0 0 0.609 0.602 0.058 0 NA NA NA 0 0.000 0.190 3 0 0 0 0 0 0 0 0 0.425 0.418 0.027 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.184 0.172 0.062 0 NA NA NA NA NA
+0.00 1 2 8 25 15 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/16-2/16 UniqueId 16 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.845 6 0 0 0 0 0 0 0 0 0.604 0.604 0.057 0 NA NA NA 0 0.000 0.547 6 0 0 0 0 0 0 0 0 0.426 0.423 0.024 0 NA NA NA NA NA 0.026 3 0 0 0 0 0 0 0 0 0.178 0.170 0.063 0 NA NA NA NA NA
+0.00 1 2 8 25 16 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/17-2/17 UniqueId 17 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.148 3 0 0 0 0 0 0 0 0 0.625 0.623 0.053 0 NA NA NA 0 0.000 0.111 3 0 0 0 0 0 0 0 0 0.432 0.430 0.022 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.193 0.188 0.060 0 NA NA NA NA NA
+0.00 1 2 8 25 17 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/18-2/18 UniqueId 18 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.467 5 0 0 0 0 0 0 0 0 0.638 0.635 0.048 0 NA NA NA 0 0.000 0.308 5 0 0 0 0 0 0 0 0 0.439 0.436 0.021 0 NA NA NA NA NA 0.000 3 0 0 0 0 0 0 0 0 0.199 0.191 0.053 0 NA NA NA NA NA
+0.00 1 2 8 25 18 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/19-2/19 UniqueId 19 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.282 6 0 0 0 0 0 0 0 0 0.624 0.622 0.050 0 NA NA NA 0 0.000 0.247 6 0 0 0 0 0 0 0 0 0.423 0.416 0.027 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.201 0.193 0.058 0 NA NA NA NA NA
+0.00 1 2 8 25 19 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/20-2/20 UniqueId 20 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 1.176 12 0 0 0 0 0 0 0 0 0.619 0.617 0.054 0 NA NA NA 0 0.000 0.786 14 0 0 0 0 0 0 0 0 0.411 0.408 0.026 0 NA NA NA NA NA 0.000 3 0 0 0 0 0 0 0 0 0.208 0.198 0.061 0 NA NA NA NA NA
+0.00 1 2 8 25 20 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/21-2/21 UniqueId 21 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.170 3 0 0 0 0 0 0 0 0 0.589 0.584 0.064 0 NA NA NA 0 0.000 0.135 3 0 0 0 0 0 0 0 0 0.416 0.416 0.023 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.173 0.165 0.067 0 NA NA NA NA NA
+0.00 1 2 8 25 21 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/22-2/22 UniqueId 22 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.407 4 0 0 0 0 0 0 0 0 0.602 0.596 0.058 0 NA NA NA 0 0.000 0.269 4 0 0 0 0 0 0 0 0 0.422 0.418 0.027 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.181 0.167 0.066 0 NA NA NA NA NA
+0.00 1 2 8 25 22 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/23-2/23 UniqueId 23 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.516 4 0 0 0 0 0 0 0 0 0.609 0.603 0.063 0 NA NA NA 0 0.000 0.319 4 0 0 0 0 0 0 0 0 0.415 0.413 0.024 0 NA NA NA NA NA 0.000 1 0 0 0 0 0 0 0 0 0.194 0.181 0.058 0 NA NA NA NA NA
+0.00 1 2 8 25 23 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/24-2/24 UniqueId 24 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.180 4 0 0 0 0 0 0 0 0 0.614 0.606 0.067 0 NA NA NA 0 1.732 0.178 6 0 0 0 0 0 0 0 0 0.418 0.415 0.023 0 NA NA NA NA NA 0.000 2 0 0 0 0 0 0 0 0 0.196 0.179 0.060 0 NA NA NA NA NA
+0.00 1 2 8 25 24 SP101 4/24/2025 1:56:23 AM 666335 5113 55 6IN_SLIP Grade1 HeaderUniqueId 666335 6IN_SLIP F 2/25-2/25 UniqueId 25 12 4.440 1 2.238 12 4.320 1 2.249 1.176 0.357 0.064 0.243 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.660 0.622 0.589 0.016 0.645 0.615 0.584 0.016 0.278 0.070 0.048 0.044 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA 0 0.000 0 0.000 1.732 0.093 0.000 0.361 14 4.840 1 2.577 14 4.840 1 2.577 0.786 0.250 0.073 0.154 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.477 0.440 0.411 0.019 0.476 0.437 0.408 0.019 0.187 0.032 0.017 0.033 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 4 1.560 0 1.083 4 1.560 0 1.083 0.042 0.007 0.000 0.012 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0 0.000 0.218 0.182 0.151 0.016 0.200 0.168 0.137 0.017 0.108 0.065 0.053 0.010 NA NA NA NA 0 0.000 0 NA NA NA NA 0.000 NA NA NA NA NA NA NA NA NA NA NA NA 0.152 4 0 0 0 0 0 0 0 0 0.633 0.622 0.278 0 NA NA NA 0 0.000 0.128 4 0 0 0 0 0 0 0 0 0.415 0.414 0.187 0 NA NA NA NA NA 0.042 1 0 0 0 0 0 0 0 0 0.218 0.200 0.108 0 NA NA NA NA NA
+NUM_DATA_ROWS 000000025
+NUM_DATA_COLUMNS 000000321
+DELIMITER ;
+START_TIME_FORMAT MM/dd/yyyy HH:mm:ss
+START_TIME 04/24/2025 01:56:23
+LOGISTICS_COLUMN A_LOGISTICS
+LOGISTICS_COLUMN B_LOGISTICS
+LOGISTICS_1 A_BASIC_TYPE=;A_INFO=6IN_SLIP_20250424_0127_2025-04-24_01;56;37;581.txt.csv;A_INFO2=25;A_JOBID=SP101;A_MES_ENTITY=SP101;A_MID=55-666335-5113;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638810565835457504;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2 B_BASIC_TYPE=Left - High Thruput;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=666335;B_NULL_DATA=;B_PPID=6IN_SLIP;B_PROCESS_JOBID=55;B_PRODUCT=5113;B_SEQUENCE=638810565835457504;B_WAFER_ID=-;B_WAFER_POS=-;
+EOF
+HEADER_TAG|HEADER_VALUE
+FORMAT|2.00
+NUMBER_PASSES|0001
+HEADER_OFFSET|000037963
+DATA_OFFSET|000000128
+END_OFFSET|000038659
+
+|Time|A_LOGISTICS|B_LOGISTICS|Count|Sequence|MesEntity|Index|Lot|Session|DcnAllMin|DcnLpdMin|DcnLpdNMin|DcnLpdESMin|DcnMicroScrMin|DcnScrMin|DcnSlipMin|DcnAreaCountMin|DcnAreaMin|DcnHazeAvgMin|DcnHazeMedianMin|DcnHazeStdDevMin|DcnBin1Min|DcnBin2Min|DcnBin3Min|DcnBin4Min|DcnBin5Min|DcnBin6Min|DcnBin7Min|DcnBin8Min|DcnAllMax|DcnLpdMax|DcnLpdNMax|DcnLpdESMax|DcnMicroScrMax|DcnScrMax|DcnSlipMax|DcnAreaCountMax|DcnAreaMax|DcnHazeAvgMax|DcnHazeMedianMax|DcnHazeStdDevMax|DcnBin1Max|DcnBin2Max|DcnBin3Max|DcnBin4Max|DcnBin5Max|DcnBin6Max|DcnBin7Max|DcnBin8Max|DcnAllMean|DcnLpdMean|DcnLpdNMean|DcnLpdESMean|DcnMicroScrMean|DcnScrMean|DcnSlipMean|DcnAreaCountMean|DcnAreaMean|DcnHazeAvgMean|DcnHazeMedianMean|DcnHazeStdDevMean|DcnBin1Mean|DcnBin2Mean|DcnBin3Mean|DcnBin4Mean|DcnBin5Mean|DcnBin6Mean|DcnBin7Mean|DcnBin8Mean|DcnAllStdDev|DcnLpdStdDev|DcnLpdNStdDev|DcnLpdESStdDev|DcnMicroScrStdDev|DcnScrStdDev|DcnSlipStdDev|DcnAreaCountStdDev|DcnAreaStdDev|DcnHazeAvgStdDev|DcnHazeMedianStdDev|DcnHazeStdDevStdDev|DcnBin1StdDev|DcnBin2StdDev|DcnBin3StdDev|DcnBin4StdDev|DcnBin5StdDev|DcnBin6StdDev|DcnBin7StdDev|DcnBin8StdDev|DwnAllMin|DwnLpdMin|DwnLpdNMin|DwnLpdESMin|DwnMicroScrMin|DwnScrMin|DwnSlipMin|DwnAreaCountMin|DwnAreaMin|DwnHazeAvgMin|DwnHazeMedianMin|DwnHazeStdDevMin|DwnBin1Min|DwnBin2Min|DwnBin3Min|DwnBin4Min|DwnBin5Min|DwnBin6Min|DwnBin7Min|DwnBin8Min|DwnAllMax|DwnLpdMax|DwnLpdNMax|DwnLpdESMax|DwnMicroScrMax|DwnScrMax|DwnSlipMax|DwnAreaCountMax|DwnAreaMax|DwnHazeAvgMax|DwnHazeMedianMax|DwnHazeStdDevMax|DwnBin1Max|DwnBin2Max|DwnBin3Max|DwnBin4Max|DwnBin5Max|DwnBin6Max|DwnBin7Max|DwnBin8Max|DwnAllMean|DwnLpdMean|DwnLpdNMean|DwnLpdESMean|DwnMicroScrMean|DwnScrMean|DwnSlipMean|DwnAreaCountMean|DwnAreaMean|DwnHazeAvgMean|DwnHazeMedianMean|DwnHazeStdDevMean|DwnBin1Mean|DwnBin2Mean|DwnBin3Mean|DwnBin4Mean|DwnBin5Mean|DwnBin6Mean|DwnBin7Mean|DwnBin8Mean|DwnAllStdDev|DwnLpdStdDev|DwnLpdNStdDev|DwnLpdESStdDev|DwnMicroScrStdDev|DwnScrStdDev|DwnSlipStdDev|DwnAreaCountStdDev|DwnAreaStdDev|DwnHazeAvgStdDev|DwnHazeMedianStdDev|DwnHazeStdDevStdDev|DwnBin1StdDev|DwnBin2StdDev|DwnBin3StdDev|DwnBin4StdDev|DwnBin5StdDev|DwnBin6StdDev|DwnBin7StdDev|DwnBin8StdDev|DnnAllMin|DnnLpdMin|DnnLpdNMin|DnnLpdESMin|DnnMicroScrMin|DnnScrMin|DnnSlipMin|DnnAreaCountMin|DnnAreaMin|DnnHazeAvgMin|DnnHazeMedianMin|DnnHazeStdDevMin|DnnBin1Min|DnnBin2Min|DnnBin3Min|DnnBin4Min|DnnBin5Min|DnnBin6Min|DnnBin7Min|DnnBin8Min|DnnAllMax|DnnLpdMax|DnnLpdNMax|DnnLpdESMax|DnnMicroScrMax|DnnScrMax|DnnSlipMax|DnnAreaCountMax|DnnAreaMax|DnnHazeAvgMax|DnnHazeMedianMax|DnnHazeStdDevMax|DnnBin1Max|DnnBin2Max|DnnBin3Max|DnnBin4Max|DnnBin5Max|DnnBin6Max|DnnBin7Max|DnnBin8Max|DnnAllMean|DnnLpdMean|DnnLpdNMean|DnnLpdESMean|DnnMicroScrMean|DnnScrMean|DnnSlipMean|DnnAreaCountMean|DnnAreaMean|DnnHazeAvgMean|DnnHazeMedianMean|DnnHazeStdDevMean|DnnBin1Mean|DnnBin2Mean|DnnBin3Mean|DnnBin4Mean|DnnBin5Mean|DnnBin6Mean|DnnBin7Mean|DnnBin8Mean|DnnAllStdDev|DnnLpdStdDev|DnnLpdNStdDev|DnnLpdESStdDev|DnnMicroScrStdDev|DnnScrStdDev|DnnSlipStdDev|DnnAreaCountStdDev|DnnAreaStdDev|DnnHazeAvgStdDev|DnnHazeMedianStdDev|DnnHazeStdDevStdDev|DnnBin1StdDev|DnnBin2StdDev|DnnBin3StdDev|DnnBin4StdDev|DnnBin5StdDev|DnnBin6StdDev|DnnBin7StdDev|DnnBin8StdDev|Side|WaferID|Grade|SrcDest|DcnAll|DcnLpd|DcnLpdN|DcnLpdES|DcnMicroScr|DcnScr|DcnSlip|DcnAreaCount|DcnArea|DcnHazeAvg|DcnHazeMedian|DcnHazeStdDev|DcnBin1|DcnBin2|DcnBin3|DcnBin4|DcnBin5|DcnBin6|DcnBin7|DcnBin8|DwnAll|DwnLpd|DwnLpdN|DwnLpdES|DwnMicroScr|DwnScr|DwnSlip|DwnAreaCount|DwnArea|DwnHazeAvg|DwnHazeMedian|DwnHazeStdDev|DwnBin1|DwnBin2|DwnBin3|DwnBin4|DwnBin5|DwnBin6|DwnBin7|DwnBin8|DnnAll|DnnLpd|DnnLpdN|DnnLpdES|DnnMicroScr|DnnScr|DnnSlip|DnnAreaCount|DnnArea|DnnHazeAvg|DnnHazeMedian|DnnHazeStdDev|DnnBin1|DnnBin2|DnnBin3|DnnBin4|DnnBin5|DnnBin6|DnnBin7|DnnBin8|RDS|PSN|Reactor|Layer|Zone|Employee|InferredLot|Date|EventId|
+|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
+0.00|1|2|25|638810565835457504|SP101|0|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|1|Grade1|2/1-2/1||0|NA|NA|NA|0|0.000|2|0.230|0.640|0.636|0.061|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|0|0.000|0.192|0.179|0.066|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|4|0.155|0.448|0.443|0.028|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|1|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|2|Grade1|2/2-2/2||0|NA|NA|NA|0|0.581|2|0.064|0.644|0.636|0.058|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|0|0.000|0.185|0.169|0.062|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|4|0.073|0.459|0.456|0.024|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|2|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|3|Grade1|2/3-2/3||0|NA|NA|NA|0|0.000|7|0.345|0.615|0.601|0.070|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|4|0.000|0.165|0.145|0.068|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|9|0.284|0.449|0.447|0.017|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|3|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|4|Grade1|2/4-2/4||0|NA|NA|NA|0|0.000|4|0.284|0.631|0.625|0.065|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.181|0.166|0.062|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|4|0.192|0.450|0.448|0.026|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|4|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|5|Grade1|2/5-2/5||0|NA|NA|NA|0|0.000|2|0.298|0.624|0.612|0.065|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|2|0.028|0.170|0.153|0.061|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|2|0.202|0.453|0.452|0.026|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|5|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|6|Grade1|2/6-2/6||0|NA|NA|NA|0|0.000|1|0.119|0.650|0.641|0.060|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.182|0.166|0.066|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.083|0.468|0.467|0.027|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|6|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|7|Grade1|2/7-2/7||0|NA|NA|NA|0|0.000|5|0.293|0.660|0.645|0.072|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.182|0.164|0.072|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|5|0.222|0.477|0.476|0.018|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|7|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|8|Grade1|2/8-2/8||0|NA|NA|NA|0|0.000|5|0.530|0.608|0.596|0.059|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.024|0.167|0.145|0.065|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|7|0.309|0.442|0.437|0.030|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|8|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|9|Grade1|2/9-2/9||0|NA|NA|NA|0|0.000|3|0.138|0.607|0.598|0.086|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|0|0.000|0.160|0.147|0.065|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.113|0.448|0.444|0.043|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|9|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|10|Grade1|2/10-2/10||0|NA|NA|NA|0|0.000|5|0.501|0.627|0.618|0.060|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|2|0.021|0.169|0.154|0.066|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|5|0.347|0.459|0.453|0.027|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|10|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|11|Grade1|2/11-2/11||0|NA|NA|NA|0|0.000|7|0.498|0.611|0.604|0.057|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.022|0.151|0.137|0.061|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|7|0.342|0.461|0.461|0.020|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|11|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|12|Grade1|2/12-2/12||0|NA|NA|NA|0|0.000|3|0.311|0.617|0.608|0.059|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.169|0.156|0.062|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.197|0.448|0.444|0.022|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|12|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|13|Grade1|2/13-2/13||0|NA|NA|NA|0|0.000|4|0.254|0.623|0.619|0.059|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.162|0.153|0.057|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|4|0.191|0.461|0.458|0.023|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|13|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|14|Grade1|2/14-2/14||0|NA|NA|NA|0|0.000|5|0.445|0.622|0.615|0.057|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|2|0.000|0.178|0.168|0.064|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|5|0.316|0.444|0.440|0.025|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|14|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|15|Grade1|2/15-2/15||0|NA|NA|NA|0|0.000|2|0.285|0.609|0.602|0.058|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.184|0.172|0.062|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.190|0.425|0.418|0.027|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|15|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|16|Grade1|2/16-2/16||0|NA|NA|NA|0|0.000|6|0.845|0.604|0.604|0.057|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.026|0.178|0.170|0.063|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|6|0.547|0.426|0.423|0.024|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|16|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|17|Grade1|2/17-2/17||0|NA|NA|NA|0|0.000|3|0.148|0.625|0.623|0.053|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.193|0.188|0.060|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.111|0.432|0.430|0.022|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|17|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|18|Grade1|2/18-2/18||0|NA|NA|NA|0|0.000|5|0.467|0.638|0.635|0.048|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.000|0.199|0.191|0.053|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|5|0.308|0.439|0.436|0.021|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|18|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|19|Grade1|2/19-2/19||0|NA|NA|NA|0|0.000|6|0.282|0.624|0.622|0.050|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.201|0.193|0.058|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|6|0.247|0.423|0.416|0.027|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|19|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|20|Grade1|2/20-2/20||0|NA|NA|NA|0|0.000|12|1.176|0.619|0.617|0.054|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.000|0.208|0.198|0.061|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|14|0.786|0.411|0.408|0.026|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|20|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|21|Grade1|2/21-2/21||0|NA|NA|NA|0|0.000|3|0.170|0.589|0.584|0.064|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.173|0.165|0.067|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|3|0.135|0.416|0.416|0.023|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|21|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|22|Grade1|2/22-2/22||0|NA|NA|NA|0|0.000|4|0.407|0.602|0.596|0.058|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.181|0.167|0.066|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|4|0.269|0.422|0.418|0.027|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|22|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|23|Grade1|2/23-2/23||0|NA|NA|NA|0|0.000|4|0.516|0.609|0.603|0.063|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.000|0.194|0.181|0.058|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|4|0.319|0.415|0.413|0.024|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|23|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|24|Grade1|2/24-2/24||0|NA|NA|NA|0|1.732|4|0.180|0.614|0.606|0.067|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|2|0.000|0.196|0.179|0.060|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|6|0.178|0.418|0.415|0.023|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+0.00|1|2|25|638810565835457504|SP101|24|666335|6IN_SLIP|1|0|NA|NA|NA|0|0.000|1|0.064|0.589|0.584|0.048|0|0|0|0|0|0|0|0|12|0|NA|NA|NA|0|1.732|12|1.176|0.660|0.645|0.278|0|0|0|0|0|0|0|0|4.440|0.000|NA|NA|NA|0.000|0.093|4.320|0.357|0.622|0.615|0.070|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.238|0.000|NA|NA|NA|0.000|0.361|2.249|0.243|0.016|0.016|0.044|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0|0|NA|NA|NA|NA|NA|0|0.000|0.151|0.137|0.053|0|0|0|0|0|0|0|0|4|0|NA|NA|NA|NA|NA|4|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0|1.560|0.000|NA|NA|NA|NA|NA|1.560|0.007|0.182|0.168|0.065|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1.083|0.000|NA|NA|NA|NA|NA|1.083|0.012|0.016|0.017|0.010|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|1|0|NA|NA|NA|NA|NA|1|0.073|0.411|0.408|0.017|0|0|0|0|0|0|0|0|14|0|NA|NA|NA|NA|NA|14|0.786|0.477|0.476|0.187|0|0|0|0|0|0|0|0|4.840|0.000|NA|NA|NA|NA|NA|4.840|0.250|0.440|0.437|0.032|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|2.577|0.000|NA|NA|NA|NA|NA|2.577|0.154|0.019|0.019|0.033|0.000|0.000|0.000|0.000|0.000|0.000|0.000|0.000|F|25|Grade1|2/25-2/25||0|NA|NA|NA|0|0.000|4|0.152|0.633|0.622|0.278|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|1|0.042|0.218|0.200|0.108|0|0|0|0|0|0|0|0||0|NA|NA|NA|NA|NA|4|0.128|0.415|0.414|0.187|0|0|0|0|0|0|0|0|666335|5113|55|-|-||55-666335-5113|4/24/2025 1:56:23 AM|8
+
+NUM_DATA_ROWS|000000025
+NUM_DATA_COLUMNS|000000322
+DELIMITER|;
+START_TIME_FORMAT|MM/dd/yyyy HH:mm:ss
+START_TIME|04/24/2025 01:56:23
+LOGISTICS_COLUMN|A_LOGISTICS
+LOGISTICS_COLUMN|B_LOGISTICS
+LOGISTICS_1|A_BASIC_TYPE=;A_INFO=6IN_SLIP_20250424_0127_2025-04-24_01;56;37;581.txt.csv;A_INFO2=25;A_JOBID=SP101;A_MES_ENTITY=SP101;A_MID=55-666335-5113;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638810565835457504;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2|B_BASIC_TYPE=Left - High Thruput;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=666335;B_NULL_DATA=;B_PPID=6IN_SLIP;B_PROCESS_JOBID=55;B_PRODUCT=5113;B_SEQUENCE=638810565835457504;B_WAFER_ID=-;B_WAFER_POS=-;
+END_HEADER
\ No newline at end of file
diff --git a/.vscode/638811099895374259/1745538421 TENCOR1 667227 2025-04-24 16-46-29.txt b/.vscode/638811099895374259/1745538421 TENCOR1 667227 2025-04-24 16-46-29.txt
new file mode 100644
index 0000000..d5dc9d2
--- /dev/null
+++ b/.vscode/638811099895374259/1745538421 TENCOR1 667227 2025-04-24 16-46-29.txt
@@ -0,0 +1,49 @@
+1 1 1 0 0.10 0.21 0.019 0.10 4/24/2025 4:46:29 PM 1.15 1.18 1.12 0.0291 100 100 100 0 667227 0.013 0.019 0.006 0.006 2 3 0.006 1 667227 36 6IN_THIN ROTR 0.3 1 0 0.59 0.34 1.02 0 0.59 3 4 2 1 TENCOR1
+
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |
+|---|---|---|---|-----|------|-------|-----|----------------------|------|------|------|--------|-----|-----|-----|----|--------|-------|-------|-------|-------|----|----|-------|----|----|--------|----|---------------|-----|----|----|------|------|------|----|------|----|----|----|----|---------|
+| 1 | 1 | 1 | 0 | 0.1 | 0.21 | 0.019 | 0.1 | 4/24/2025 4:46:29 PM | 1.15 | 1.18 | 1.12 | 0.0291 | 100 | 100 | 100 | 0 | 667227 | 0.013 | 0.019 | 0.006 | 0.006 | 2 | 3 | 0.006 | 1 | | 667227 | 36 | 6IN_THIN ROTR | 0.3 | 1 | 0 | 0.59 | 0.34 | 1.02 | 0 | 0.59 | 3 | 4 | 2 | 1 | TENCOR1 |
+
+<1>:1
+<2>:1
+<3>:1
+<4>:0
+<5>:0.1
+<6>:0.21
+<7>:0.019
+<8>:0.1
+<9>:4/24/2025 4:46:29 PM
+<10>:1.15
+<11>:1.18
+<12>:1.12
+<13>:0.0291
+<14>:100
+<15>:100
+<16>:100
+<17>:0
+<18>:667227
+<19>:0.013
+<20>:0.019
+<21>:0.006
+<22>:0.006
+<23>:2
+<24>:3
+<25>:0.006
+<26>:1
+<27>:
+<28>:667227
+<29>:36
+<30>:6IN_THIN ROTR
+<31>:0.3
+<32>:1
+<33>:0
+<34>:0.59
+<35>:0.34
+<36>:1.02
+<37>:0
+<38>:0.59
+<39>:3
+<40>:4
+<41>:2
+<42>:1
+<43>:TENCOR1
diff --git a/.vscode/638811099895374259/TENCOR1_250424164629000.json b/.vscode/638811099895374259/TENCOR1_250424164629000.json
new file mode 100644
index 0000000..9a7e73b
--- /dev/null
+++ b/.vscode/638811099895374259/TENCOR1_250424164629000.json
@@ -0,0 +1,176 @@
+{
+ "Id": -1,
+ "AreaCountAvg": "1",
+ "AreaCountMax": "1",
+ "AreaCountMin": "1",
+ "AreaCountStdDev": "0",
+ "AreaTotalAvg": "0.10",
+ "AreaTotalMax": "0.21",
+ "AreaTotalMin": "0.019",
+ "AreaTotalStdDev": "0.10",
+ "Date": "4/24/2025 4:46:29 PM",
+ "HazeAverageAvg": "1.15",
+ "HazeAverageMax": "1.18",
+ "HazeAverageMin": "1.12",
+ "HazeAverageStdDev": "0.0291",
+ "HazeRegionAvg": "100",
+ "HazeRegionMax": "100",
+ "HazeRegionMin": "100",
+ "HazeRegionStdDev": "0",
+ "Layer": null,
+ "LotID": "667227",
+ "LPDCM2Avg": "0.013",
+ "LPDCM2Max": "0.019",
+ "LPDCM2Min": "0.006",
+ "LPDCM2StdDev": "0.006",
+ "LPDCountAvg": "2",
+ "LPDCountMax": "3",
+ "LPDCountMin": "1",
+ "LPDCountStdDev": "1",
+ "Operator": "",
+ "ParseErrorText": "ParseErrorText",
+ "PSN": "5142",
+ "RDS": "667227",
+ "Reactor": "36",
+ "Recipe": "6IN_THIN ROTR",
+ "ScratchCountAvg": "0.3",
+ "ScratchCountMax": "1",
+ "ScratchCountMin": "0",
+ "ScratchCountStdDev": "0.6",
+ "ScratchTotalAvg": "0.34",
+ "ScratchTotalMax": "1.02",
+ "ScratchTotalMin": "0",
+ "ScratchTotalStdDev": "0.59",
+ "SumOfDefectsAvg": "3",
+ "SumOfDefectsMax": "4",
+ "SumOfDefectsMin": "2",
+ "SumOfDefectsStdDev": "1",
+ "Title": null,
+ "UniqueId": "TENCOR1_1T667227_202504241646295374",
+ "Zone": null,
+ "CellName": "TENCOR1",
+ "Data": "*Data*",
+ "i": -1,
+ "Details": [
+ {
+ "Id": 0,
+ "AreaCount": "1",
+ "AreaTotal": "0.0716mm2",
+ "Bin1": "2",
+ "Bin2": "1",
+ "Bin3": "0",
+ "Bin4": "0",
+ "Bin5": "0",
+ "Bin6": "0",
+ "Bin7": null,
+ "Bin8": null,
+ "Comments": "- High Thruput",
+ "Date": "4/24/2025 4:46:29 PM",
+ "Diameter": "150 mm",
+ "Exclusion": "4mm",
+ "Gain": "4",
+ "HazeAverage": "1.16ppm",
+ "HazePeak": "25.5ppm",
+ "HazeRegion": "100%",
+ "HazeRng": "500ppm",
+ "HeaderUniqueId": "TENCOR1_1T667227_202504241646295374",
+ "LPDCM2": "0.019",
+ "LPDCount": "3",
+ "Laser": "488nm",
+ "Mean": "0.252",
+ "Recipe": "6IN_THIN ROTR",
+ "ScratchCount": "1",
+ "ScratchTotal": "1.02mm",
+ "Slot": "01",
+ "Sort": "PASS",
+ "StdDev": "0.043",
+ "SumOfDefects": "4",
+ "Thresh": "0.200um",
+ "Thruput": "Normal",
+ "Title": null,
+ "UniqueId": "TENCOR1_1T667227_202504241646295374_Item-1",
+ "Data": "*Data*",
+ "i": -1
+ },
+ {
+ "Id": 0,
+ "AreaCount": "1",
+ "AreaTotal": "0.0195mm2",
+ "Bin1": "1",
+ "Bin2": "0",
+ "Bin3": "0",
+ "Bin4": "0",
+ "Bin5": "1",
+ "Bin6": "0",
+ "Bin7": null,
+ "Bin8": null,
+ "Comments": "- High Thruput",
+ "Date": "4/24/2025 4:46:29 PM",
+ "Diameter": "150 mm",
+ "Exclusion": "4mm",
+ "Gain": "4",
+ "HazeAverage": "1.18ppm",
+ "HazePeak": "25.0ppm",
+ "HazeRegion": "100%",
+ "HazeRng": "500ppm",
+ "HeaderUniqueId": "TENCOR1_1T667227_202504241646295374",
+ "LPDCM2": "0.013",
+ "LPDCount": "2",
+ "Laser": "488nm",
+ "Mean": "1.32",
+ "Recipe": "6IN_THIN ROTR",
+ "ScratchCount": "0",
+ "ScratchTotal": "0mm",
+ "Slot": "15",
+ "Sort": "PASS",
+ "StdDev": "1.54",
+ "SumOfDefects": "3",
+ "Thresh": "0.200um",
+ "Thruput": "Normal",
+ "Title": null,
+ "UniqueId": "TENCOR1_1T667227_202504241646295374_Item-2",
+ "Data": "*Data*",
+ "i": -1
+ },
+ {
+ "Id": 0,
+ "AreaCount": "1",
+ "AreaTotal": "0.213mm2",
+ "Bin1": "0",
+ "Bin2": "1",
+ "Bin3": "0",
+ "Bin4": "0",
+ "Bin5": "0",
+ "Bin6": "0",
+ "Bin7": null,
+ "Bin8": null,
+ "Comments": "- High Thruput",
+ "Date": "4/24/2025 4:46:29 PM",
+ "Diameter": "150 mm",
+ "Exclusion": "4mm",
+ "Gain": "4",
+ "HazeAverage": "1.12ppm",
+ "HazePeak": "22.5ppm",
+ "HazeRegion": "100%",
+ "HazeRng": "500ppm",
+ "HeaderUniqueId": "TENCOR1_1T667227_202504241646295374",
+ "LPDCM2": "0.006",
+ "LPDCount": "1",
+ "Laser": "488nm",
+ "Mean": "0.307",
+ "Recipe": "6IN_THIN ROTR",
+ "ScratchCount": "0",
+ "ScratchTotal": "0mm",
+ "Slot": "25",
+ "Sort": "PASS",
+ "StdDev": "0.000",
+ "SumOfDefects": "2",
+ "Thresh": "0.200um",
+ "Thruput": "Normal",
+ "Title": null,
+ "UniqueId": "TENCOR1_1T667227_202504241646295374_Item-3",
+ "Data": "*Data*",
+ "i": -1
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/638811099895374259/TENCOR1_250424164629000.pdsf b/.vscode/638811099895374259/TENCOR1_250424164629000.pdsf
new file mode 100644
index 0000000..b49f849
--- /dev/null
+++ b/.vscode/638811099895374259/TENCOR1_250424164629000.pdsf
@@ -0,0 +1,43 @@
+HEADER_TAG HEADER_VALUE
+FORMAT 2.00
+NUMBER_PASSES 0001
+HEADER_OFFSET H#######T
+DATA_OFFSET D#######T
+END_OFFSET E#######T
+"Time" "A_LOGISTICS" "B_LOGISTICS" "Test" "Count" "Index" "MesEntity" "Date" "Employee" "Lot" "PSN" "Reactor" "Recipe" "Comments" "Diameter" "Exclusion" "Gain" "HeaderUniqueId" "Laser" "ParseErrorText" "RDS" "Slot" "UniqueId" "AreaCount" "AreaCountAvg" "AreaCountMax" "AreaCountMin" "AreaCountStdDev" "AreaTotal" "AreaTotalAvg" "AreaTotalMax" "AreaTotalMin" "AreaTotalStdDev" "Bin1" "Bin2" "Bin3" "Bin4" "Bin5" "Bin6" "Bin7" "Bin8" "HazeAverage" "HazeAverageAvg" "HazeAverageMax" "HazeAverageMin" "HazeAverageStdDev" "HazePeak" "HazeRegion" "HazeRegionAvg" "HazeRegionMax" "HazeRegionMin" "HazeRegionStdDev" "HazeRng" "LPDCM2" "LPDCM2Avg" "LPDCM2Max" "LPDCM2Min" "LPDCM2StdDev" "LPDCount" "LPDCountAvg" "LPDCountMax" "LPDCountMin" "LPDCountStdDev" "Mean" "ScratchCount" "ScratchCountAvg" "ScratchCountMax" "ScratchCountMin" "ScratchCountStdDev" "ScratchTotal" "ScratchTotalAvg" "ScratchTotalMax" "ScratchTotalMin" "ScratchTotalStdDev" "Sort" "StdDev" "SumOfDefects" "SumOfDefectsAvg" "SumOfDefectsMax" "SumOfDefectsMin" "SumOfDefectsStdDev" "Thresh" "Thruput"
+0.00 1 2 7 3 0 TENCOR1 4/24/2025 4:46:29 PM 667227 5142 36 6IN_THIN ROTR - High Thruput 150 mm 4mm 4 HeaderUniqueId 488nm ParseErrorText 667227 01 UniqueId 1 1 1 1 0 0.0716mm2 0.10 0.21 0.019 0.10 2 1 0 0 0 0 1.16ppm 1.15 1.18 1.12 0.0291 25.5ppm 100% 100 100 100 0 500ppm 0.019 0.013 0.019 0.006 0.006 3 2 3 1 1 0.252 1 0.3 1 0 0.6 1.02mm 0.34 1.02 0 0.59 PASS 0.043 4 3 4 2 1 0.200um Normal
+0.00 1 2 7 3 1 TENCOR1 4/24/2025 4:46:29 PM 667227 5142 36 6IN_THIN ROTR - High Thruput 150 mm 4mm 4 HeaderUniqueId 488nm ParseErrorText 667227 15 UniqueId 1 1 1 1 0 0.0195mm2 0.10 0.21 0.019 0.10 1 0 0 0 1 0 1.18ppm 1.15 1.18 1.12 0.0291 25.0ppm 100% 100 100 100 0 500ppm 0.013 0.013 0.019 0.006 0.006 2 2 3 1 1 1.32 0 0.3 1 0 0.6 0mm 0.34 1.02 0 0.59 PASS 1.54 3 3 4 2 1 0.200um Normal
+0.00 1 2 7 3 2 TENCOR1 4/24/2025 4:46:29 PM 667227 5142 36 6IN_THIN ROTR - High Thruput 150 mm 4mm 4 HeaderUniqueId 488nm ParseErrorText 667227 25 UniqueId 1 1 1 1 0 0.213mm2 0.10 0.21 0.019 0.10 0 1 0 0 0 0 1.12ppm 1.15 1.18 1.12 0.0291 22.5ppm 100% 100 100 100 0 500ppm 0.006 0.013 0.019 0.006 0.006 1 2 3 1 1 0.307 0 0.3 1 0 0.6 0mm 0.34 1.02 0 0.59 PASS 0.000 2 3 4 2 1 0.200um Normal
+NUM_DATA_ROWS 000000003
+NUM_DATA_COLUMNS 000000083
+DELIMITER ;
+START_TIME_FORMAT MM/dd/yyyy HH:mm:ss
+START_TIME 04/24/2025 16:46:29
+LOGISTICS_COLUMN A_LOGISTICS
+LOGISTICS_COLUMN B_LOGISTICS
+LOGISTICS_1 A_HeaderId=524300;A_SubgroupId=1745538421;A_BASIC_TYPE=;A_INFO=202504241646295374.pcl.csv;A_INFO2=3;A_JOBID=TENCOR1;A_MES_ENTITY=TENCOR1;A_MID=1T667227;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811099895374259;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2 B_HeaderId=524300;B_SubgroupId=1745538421;B_BASIC_TYPE=- High Thruput;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=667227;B_NULL_DATA=;B_PPID=6IN_THIN ROTR;B_PROCESS_JOBID=36;B_PRODUCT=5142;B_SEQUENCE=638811099895374259;B_WAFER_ID=-;B_WAFER_POS=-;
+EOF
+HEADER_TAG|HEADER_VALUE
+FORMAT|2.00
+NUMBER_PASSES|0001
+HEADER_OFFSET|000002772
+DATA_OFFSET|000000128
+END_OFFSET|000003437
+
+|Time|A_LOGISTICS|B_LOGISTICS|Count|Sequence|MesEntity|Index|Date|Recipe|Id|WaferId|LPDCount|LPDCM2|AreaCount|AreaTotal|ScratchCount|ScratchTotal|SumOfDefects|HazeRegion|HazeAverage|Grade|LPDCountMin|LPDCM2Min|AreaCountMin|AreaTotalMin|ScratchCountMin|ScratchTotalMin|SumOfDefectsMin|HazeRegionMin|HazeAverageMin|LPDCountMax|LPDCM2Max|AreaCountMax|AreaTotalMax|ScratchCountMax|ScratchTotalMax|SumOfDefectsMax|HazeRegionMax|HazeAverageMax|LPDCountAvg|LPDCM2Avg|AreaCountAvg|AreaTotalAvg|ScratchCountAvg|ScratchTotalAvg|SumOfDefectsAvg|HazeRegionAvg|HazeAverageAvg|LPDCountStdDev|LPDCM2StdDev|AreaCountStdDev|AreaTotalStdDev|ScratchCountStdDev|ScratchTotalStdDev|SumOfDefectsStdDev|HazeRegionStdDev|HazeAverageStdDev|WaferDate|Comments|Sort|WaferLPDCount|WaferLPDCM2|Bin1|Bin2|Bin3|Bin4|Bin5|Bin6|Bin7|Bin8|Mean|StdDev|WaferAreaCount|WaferAreaTotal|WaferScratchCount|WaferScratchTotal|WaferSumOfDefects|WaferHazeRegion|WaferHazeAverage|HazePeak|Laser|Gain|Diameter|Thresh|Exclusion|HazeRng|Thruput|WaferRecipe|RDS|PSN|Reactor|Layer|Zone|Employee|InferredLot|EventId|
+|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
+0.00|1|2|3|638811099895374259|TENCOR1|0|4/24/2025 4:46:29 PM|6IN_THIN ROTR|667227|01|3|0.019|1|0.072|1|1.02|4|100|1.16|P|1|0.006|1|0.019|0|0|2|100|1.12|3|0.019|1|0.21|1|1.02|4|100|1.18|2|0.013|1|0.10|0.3|0.34|3|100|1.15|1|0.006|0|0.10|0.6|0.59|1|0|0.0291|Wed, Apr 23, 2025 08:34:51 AM|- High Thruput|PASS|3|0.019|2|1|0|0|0|0|||0.252|0.043|1|0.0716mm2|1|1.02mm|4|100%|1.16ppm|25.5ppm|488nm|4|150 mm|0.200um|4mm|500ppm|Normal|6IN_THIN ROTR|667227|5142|36|-|-||667227|7
+0.00|1|2|3|638811099895374259|TENCOR1|1|4/24/2025 4:46:29 PM|6IN_THIN ROTR|667227|15|2|0.013|1|0.019|0|0|3|100|1.18|P|1|0.006|1|0.019|0|0|2|100|1.12|3|0.019|1|0.21|1|1.02|4|100|1.18|2|0.013|1|0.10|0.3|0.34|3|100|1.15|1|0.006|0|0.10|0.6|0.59|1|0|0.0291|Wed, Apr 23, 2025 08:35:39 AM|- High Thruput|PASS|2|0.013|1|0|0|0|1|0|||1.32|1.54|1|0.0195mm2|0|0mm|3|100%|1.18ppm|25.0ppm|488nm|4|150 mm|0.200um|4mm|500ppm|Normal|6IN_THIN ROTR|667227|5142|36|-|-||667227|7
+0.00|1|2|3|638811099895374259|TENCOR1|2|4/24/2025 4:46:29 PM|6IN_THIN ROTR|667227|25|1|0.006|1|0.21|0|0|2|100|1.12|P|1|0.006|1|0.019|0|0|2|100|1.12|3|0.019|1|0.21|1|1.02|4|100|1.18|2|0.013|1|0.10|0.3|0.34|3|100|1.15|1|0.006|0|0.10|0.6|0.59|1|0|0.0291|Wed, Apr 23, 2025 08:36:22 AM|- High Thruput|PASS|1|0.006|0|1|0|0|0|0|||0.307|0.000|1|0.213mm2|0|0mm|2|100%|1.12ppm|22.5ppm|488nm|4|150 mm|0.200um|4mm|500ppm|Normal|6IN_THIN ROTR|667227|5142|36|-|-||667227|7
+
+NUM_DATA_ROWS|000000003
+NUM_DATA_COLUMNS|000000096
+DELIMITER|;
+START_TIME_FORMAT|MM/dd/yyyy HH:mm:ss
+START_TIME|04/24/2025 16:46:29
+LOGISTICS_COLUMN|A_LOGISTICS
+LOGISTICS_COLUMN|B_LOGISTICS
+LOGISTICS_1|A_BASIC_TYPE=;A_INFO=202504241646295374.pcl.csv;A_INFO2=3;A_JOBID=TENCOR1;A_MES_ENTITY=TENCOR1;A_MID=1T667227;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811099895374259;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2|B_BASIC_TYPE=- High Thruput;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=667227;B_NULL_DATA=;B_PPID=6IN_THIN ROTR;B_PROCESS_JOBID=36;B_PRODUCT=5142;B_SEQUENCE=638811099895374259;B_WAFER_ID=-;B_WAFER_POS=-;
+END_HEADER
\ No newline at end of file
diff --git a/.vscode/638811116720000000/1745540084 CDE5 666765 2025-04-24 17-14-32.txt b/.vscode/638811116720000000/1745540084 CDE5 666765 2025-04-24 17-14-32.txt
new file mode 100644
index 0000000..5679985
--- /dev/null
+++ b/.vscode/638811116720000000/1745540084 CDE5 666765 2025-04-24 17-14-32.txt
@@ -0,0 +1,78 @@
+UniqueId 666765 4/24/2025 5:14:32 PM Lot LSL8IN \ 10PT_5mm 57 666765 4626 1 - CDE5 Operator Engineer DLRatio 18.55 AutoOptimizeGain AutoProbeHeightSet 3.00 915.190 0.0069647 SemiRadial 1 95.00 270.000 913.9620971680 1.3236315 2 71.00 270.000 923.2605590820 1.2676778 3 47.00 270.000 921.4100952148 1.3205365 4 23.00 270.000 913.6674194336 1.2704575 5 0.00 0.000 908.1397705078 1.3234487 6 11.00 90.000 908.0071411133 1.2582344 7 35.00 90.000 916.3591918945 1.5512319 8 59.00 90.000 920.1303100586 1.7320848 9 83.00 90.000 921.3920288086 1.6781629 10 95.00 90.000 905.5722656250 1.7448909
+
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
+|----------|--------|----------------------|-----|-------------------|----|--------|------|---|----|------|----------|----------|---------|-------|------------------|--------------------|------|----|---------|-----------|------------|----|-------|---------|----------------|-----------|----|-------|---------|----------------|-----------|----|-------|---------|----------------|-----------|----|-------|---------|----------------|-----------|----|------|-------|----------------|-----------|----|-------|--------|----------------|-----------|----|-------|--------|----------------|-----------|----|-------|--------|----------------|-----------|----|-------|--------|----------------|-----------|----|-------|--------|----------------|-----------|
+| UniqueId | 666765 | 4/24/2025 5:14:32 PM | Lot | LSL8IN \ 10PT_5mm | 57 | 666765 | 4626 | 1 | - | CDE5 | Operator | Engineer | DLRatio | 18.55 | AutoOptimizeGain | AutoProbeHeightSet | 3.00 | | 915.190 | 0.0069647 | SemiRadial | 1 | 95.00 | 270.000 | 913.9620971680 | 1.3236315 | 2 | 71.00 | 270.000 | 923.2605590820 | 1.2676778 | 3 | 47.00 | 270.000 | 921.4100952148 | 1.3205365 | 4 | 23.00 | 270.000 | 913.6674194336 | 1.2704575 | 5 | 0.00 | 0.000 | 908.1397705078 | 1.3234487 | 6 | 11.00 | 90.000 | 908.0071411133 | 1.2582344 | 7 | 35.00 | 90.000 | 916.3591918945 | 1.5512319 | 8 | 59.00 | 90.000 | 920.1303100586 | 1.7320848 | 9 | 83.00 | 90.000 | 921.3920288086 | 1.6781629 | 10 | 95.00 | 90.000 | 905.5722656250 | 1.7448909 |
+
+<1>:UniqueId
+<2>:666765
+<3>:4/24/2025 5:14:32 PM
+<4>:Lot
+<5>:LSL8IN \ 10PT_5mm
+<6>:57
+<7>:666765
+<8>:4626
+<9>:1
+<10>:-
+<11>:CDE5
+<12>:Operator
+<13>:Engineer
+<14>:DLRatio
+<15>:18.55
+<16>:AutoOptimizeGain
+<17>:AutoProbeHeightSet
+<18>:3
+<19>:
+<20>:915.19
+<21>:0.0069647
+<22>:SemiRadial
+<23>:1
+<24>:95
+<25>:270
+<26>:913.9620972
+<27>:1.3236315
+<28>:2
+<29>:71
+<30>:270
+<31>:923.2605591
+<32>:1.2676778
+<33>:3
+<34>:47
+<35>:270
+<36>:921.4100952
+<37>:1.3205365
+<38>:4
+<39>:23
+<40>:270
+<41>:913.6674194
+<42>:1.2704575
+<43>:5
+<44>:0
+<45>:0
+<46>:908.1397705
+<47>:1.3234487
+<48>:6
+<49>:11
+<50>:90
+<51>:908.0071411
+<52>:1.2582344
+<53>:7
+<54>:35
+<55>:90
+<56>:916.3591919
+<57>:1.5512319
+<58>:8
+<59>:59
+<60>:90
+<61>:920.1303101
+<62>:1.7320848
+<63>:9
+<64>:83
+<65>:90
+<66>:921.3920288
+<67>:1.6781629
+<68>:10
+<69>:95
+<70>:90
+<71>:905.5722656
+<72>:1.7448909
diff --git a/.vscode/638811116720000000/CDE5_250424171432000.json b/.vscode/638811116720000000/CDE5_250424171432000.json
new file mode 100644
index 0000000..92ca14e
--- /dev/null
+++ b/.vscode/638811116720000000/CDE5_250424171432000.json
@@ -0,0 +1,122 @@
+{
+ "SentToMetrology": false,
+ "SentToSPC": false,
+ "AutoOptimizeGain": "AutoOptimizeGain",
+ "AutoProbeHeightSet": "AutoProbeHeightSet",
+ "Avg": "915.190",
+ "CellName": "CDE5",
+ "DLRatio": "DLRatio",
+ "DataReject": "3.00",
+ "Date": "4/24/2025 5:14:32 PM",
+ "Engineer": "Engineer",
+ "EquipId": "CDE5",
+ "FileName": "",
+ "FilePath": "",
+ "Id": -1,
+ "Layer": "1",
+ "LotId": "Lot",
+ "Op": "Operator",
+ "PSN": "4626",
+ "RDS": "666765",
+ "Reactor": "57",
+ "Recipe": "LSL8IN \\ 10PT_5mm",
+ "ResistivitySpec": "ResistivitySpec",
+ "Run": "666765",
+ "SemiRadial": "SemiRadial",
+ "StDev": "0.0069647",
+ "Temp": "18.55",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Zone": "-",
+ "Details": [
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.3236315",
+ "Pt": "1",
+ "R": "95.00",
+ "Rs": "913.9620971680",
+ "T": "270.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-1"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.2676778",
+ "Pt": "2",
+ "R": "71.00",
+ "Rs": "923.2605590820",
+ "T": "270.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-2"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.3205365",
+ "Pt": "3",
+ "R": "47.00",
+ "Rs": "921.4100952148",
+ "T": "270.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-3"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.2704575",
+ "Pt": "4",
+ "R": "23.00",
+ "Rs": "913.6674194336",
+ "T": "270.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-4"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.3234487",
+ "Pt": "5",
+ "R": "0.00",
+ "Rs": "908.1397705078",
+ "T": "0.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-5"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.2582344",
+ "Pt": "6",
+ "R": "11.00",
+ "Rs": "908.0071411133",
+ "T": "90.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-6"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.5512319",
+ "Pt": "7",
+ "R": "35.00",
+ "Rs": "916.3591918945",
+ "T": "90.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-7"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.7320848",
+ "Pt": "8",
+ "R": "59.00",
+ "Rs": "920.1303100586",
+ "T": "90.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-8"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.6781629",
+ "Pt": "9",
+ "R": "83.00",
+ "Rs": "921.3920288086",
+ "T": "90.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-9"
+ },
+ {
+ "HeaderUniqueId": "CDE5_57-666765-4626.1_202504241714320000",
+ "Merit": "1.7448909",
+ "Pt": "10",
+ "R": "95.00",
+ "Rs": "905.5722656250",
+ "T": "90.000",
+ "UniqueId": "CDE5_57-666765-4626.1_202504241714320000_Item-10"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/638811116720000000/CDE5_250424171432000.pdsf b/.vscode/638811116720000000/CDE5_250424171432000.pdsf
new file mode 100644
index 0000000..d829145
--- /dev/null
+++ b/.vscode/638811116720000000/CDE5_250424171432000.pdsf
@@ -0,0 +1,57 @@
+HEADER_TAG HEADER_VALUE
+FORMAT 2.00
+NUMBER_PASSES 0001
+HEADER_OFFSET H#######T
+DATA_OFFSET D#######T
+END_OFFSET E#######T
+"Time" "A_LOGISTICS" "B_LOGISTICS" "Test" "Count" "Index" "MesEntity" "Date" "Employee" "Lot" "PSN" "Reactor" "Recipe" "AutoOptimizeGain" "AutoProbeHeightSet" "Avg" "DataReject" "DLRatio" "Merit" "Pt" "R" "ResistivitySpec" "Rs" "SemiRadial" "StdDev" "T" "Temp" "Engineer" "EquipId" "FileName" "HeaderUniqueId" "Id" "Layer" "RDS" "Run" "UniqueId" "Zone" "SheetRhoVariation"
+0.00 1 2 24 10 0 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.3236315 1 95.00 ResistivitySpec 913.9620971680 SemiRadial 0.0069647 270.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 1 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.2676778 2 71.00 ResistivitySpec 923.2605590820 SemiRadial 0.0069647 270.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 2 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.3205365 3 47.00 ResistivitySpec 921.4100952148 SemiRadial 0.0069647 270.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 3 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.2704575 4 23.00 ResistivitySpec 913.6674194336 SemiRadial 0.0069647 270.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 4 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.3234487 5 0.00 ResistivitySpec 908.1397705078 SemiRadial 0.0069647 0.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 5 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.2582344 6 11.00 ResistivitySpec 908.0071411133 SemiRadial 0.0069647 90.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 6 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.5512319 7 35.00 ResistivitySpec 916.3591918945 SemiRadial 0.0069647 90.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 7 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.7320848 8 59.00 ResistivitySpec 920.1303100586 SemiRadial 0.0069647 90.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 8 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.6781629 9 83.00 ResistivitySpec 921.3920288086 SemiRadial 0.0069647 90.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+0.00 1 2 24 10 9 CDE5 4/24/2025 5:14:32 PM Operator Lot 4626 57 LSL8IN \ 10PT_5mm AutoOptimizeGain AutoProbeHeightSet 915.190 3.00 DLRatio 1.7448909 10 95.00 ResistivitySpec 905.5722656250 SemiRadial 0.0069647 90.000 18.55 Engineer ResMap5 HeaderUniqueId Id 1 666765 666765 UniqueId -
+NUM_DATA_ROWS 000000010
+NUM_DATA_COLUMNS 000000038
+DELIMITER ;
+START_TIME_FORMAT MM/dd/yyyy HH:mm:ss
+START_TIME 04/24/2025 17:14:32
+LOGISTICS_COLUMN A_LOGISTICS
+LOGISTICS_COLUMN B_LOGISTICS
+LOGISTICS_1 A_HeaderId=309148;A_SubgroupId=1745540084;A_BASIC_TYPE=;A_INFO=5424R116.RsM.csv;A_INFO2=10;A_JOBID=CDE5;A_MES_ENTITY=CDE5;A_MID=57-666765-4626.1;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811116720000000;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2 B_HeaderId=309148;B_SubgroupId=1745540084;B_BASIC_TYPE=-;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=666765;B_NULL_DATA=;B_PPID=10PT_5mm;B_PROCESS_JOBID=57;B_PRODUCT=4626;B_SEQUENCE=638811116720000000;B_WAFER_ID=-;B_WAFER_POS=-;
+EOF
+HEADER_TAG|HEADER_VALUE
+FORMAT|2.00
+NUMBER_PASSES|0001
+HEADER_OFFSET|000007317
+DATA_OFFSET|000000128
+END_OFFSET|000007957
+
+|Time|A_LOGISTICS|B_LOGISTICS|Count|Sequence|MesEntity|Index|Title|TheFileName|Project|RecipeName|LotID|WfrID|Is_TF_DataFile|Directory|Time|Date|Temp|TCRPercent|NOrP|Avg|Dev|Min|Max|Operator|Equipment|Engineer|AreaOrDiamScan|WaferShape|BNBand|TemplateFile|XSize|YSize|CalibrationFactor|MsmtMode|DataType|DataUnit|NumProbePoints|SingleOrDualProbeConfig|NumberActPrbPts|Rsens|IdrvMx|VinGain|DataRejectSigma|MeritThreshold|PrbChgNumber|PrbName|WaferSize|EdgeEx|Xll|Yll|Xur|Yur|X|Y|CutCorners|DiamThScan|DiamStart|DiamEnd|DiamStep|FlatOrNotch|FollowMajorFlat|AutoOrManualLoad|RangeOrIndividual|PauseAfterEveryRun|AutoPrint|Plot|BulkSampleThk|Unit|RangeFrom|RangeTo|CassetteSlotSelected|R|Th|Data|Rs|RsA|RsB|NumberSample|PointX|PointY|Irng|Vrng|ChiSq|MeritGOF|DataIntegrity|RDS|PSN|Reactor|Layer|Zone|Employee|InferredLot|InferredPoint|StandardDeviationPercentage|SheetRhoVariation|EventId|
+|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
+0.00|1|2|10|638811116720000000|CDE5|0|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|95.00|270.000|913.9620971680|913.9620971680|914.08798462|731.11854485|1184|-95.00|-0.00|3051|1102|1.4E+02|1.3236315|0|666765|4626|57|1|-||57-666765-4626.1|1|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|1|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|71.00|270.000|923.2605590820|923.2605590820|923.56932267|738.79669064|1184|-71.00|-0.00|3051|1057|1.3E+02|1.2676778|0|666765|4626|57|1|-||57-666765-4626.1|2|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|2|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|47.00|270.000|921.4100952148|921.4100952148|909.70358100|721.40113210|1184|-47.00|-0.00|3054|1046|1.2E+02|1.3205365|0|666765|4626|57|1|-||57-666765-4626.1|3|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|3|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|23.00|270.000|913.6674194336|913.6674194336|896.28473107|707.65557259|1184|-23.00|-0.00|3055|1042|1.2E+02|1.2704575|0|666765|4626|57|1|-||57-666765-4626.1|4|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|4|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|0.00|0.000|908.1397705078|908.1397705078|898.61367587|713.68271830|1184|0.00|0.00|3052|1033|1.0E+02|1.3234487|0|666765|4626|57|1|-||57-666765-4626.1|5|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|5|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|11.00|90.000|908.0071411133|908.0071411133|900.37349147|716.08698414|1184|11.00|0.00|3052|1027|1.2E+02|1.2582344|0|666765|4626|57|1|-||57-666765-4626.1|6|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|6|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|35.00|90.000|916.3591918945|916.3591918945|903.86156023|716.31006062|1184|35.00|0.00|3052|1020|8.3E+01|1.5512319|0|666765|4626|57|1|-||57-666765-4626.1|7|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|7|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|59.00|90.000|920.1303100586|920.1303100586|914.46298514|728.38862138|1184|59.00|0.00|3050|1047|7.1E+01|1.7320848|0|666765|4626|57|1|-||57-666765-4626.1|8|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|8|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|83.00|90.000|921.3920288086|921.3920288086|913.59693033|726.57794711|1184|83.00|0.00|3051|1029|7.6E+01|1.6781629|0|666765|4626|57|1|-||57-666765-4626.1|9|0.0069647||24
+0.00|1|2|10|638811116720000000|CDE5|9|666765||LSL8IN|LSL8IN \ 10PT_5mm|MyCarrierID|WaferID|0||17:14|4/24/2025 5:14:32 PM|18.55|0.300|?|915.190|6.374|905.57|923.26|Operator|ResMap5|Engineer|TC|8|10PT_5mm.TPL|125.00|125.00|1.00000|0|Rs|Ohms/sq||10|2|10|99348.000|0.0000750007|0.01287|3.00|0.10|1|MyFavoriteProbe|200.00|10.00|-55.00|-55.00|55.00|55.00|5|5|89|0.00|-50.00|50.00|2.0000|N|Y|M|I|N|Y|N|500.000000|U|25|25|NNNNNNNNNNNNNNNNNNNNNNNNNN|95.00|90.000|905.5722656250|905.5722656250|917.53049853|739.99994302|1184|95.00|0.00|3052|1055|6.7E+01|1.7448909|0|666765|4626|57|1|-||57-666765-4626.1|10|0.0069647||24
+
+NUM_DATA_ROWS|000000010
+NUM_DATA_COLUMNS|000000097
+DELIMITER|;
+START_TIME_FORMAT|MM/dd/yyyy HH:mm:ss
+START_TIME|04/24/2025 17:14:32
+LOGISTICS_COLUMN|A_LOGISTICS
+LOGISTICS_COLUMN|B_LOGISTICS
+LOGISTICS_1|A_BASIC_TYPE=;A_INFO=5424R116.RsM.csv;A_INFO2=10;A_JOBID=CDE5;A_MES_ENTITY=CDE5;A_MID=57-666765-4626.1;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811116720000000;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2|B_BASIC_TYPE=-;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=666765;B_NULL_DATA=;B_PPID=10PT_5mm;B_PROCESS_JOBID=57;B_PRODUCT=4626;B_SEQUENCE=638811116720000000;B_WAFER_ID=-;B_WAFER_POS=-;
+END_HEADER
\ No newline at end of file
diff --git a/.vscode/638811150679527382/1745543491 BIORAD2 667740 2025-04-24 18-11-07.txt b/.vscode/638811150679527382/1745543491 BIORAD2 667740 2025-04-24 18-11-07.txt
new file mode 100644
index 0000000..a8c4b08
--- /dev/null
+++ b/.vscode/638811150679527382/1745543491 BIORAD2 667740 2025-04-24 18-11-07.txt
@@ -0,0 +1,36 @@
+Bio-Rad UniqueId 4/24/2025 6:11:07 PM 6inTHICK 40 667740 5159 1 1 667740 2.520 1 119.11 2 0.00 3 118.87 4 0.00 5 0.00 6 0.00 7 117.12 8 116.95 9 116.18
+
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
+|------------------|----------------------|---|----------|----|--------|------|---|---|----|--------|------|----|--------|----|----|----|--------|----|----|----|----|----|----|----|--------|----|--------|----|--------|
+| Bio-Rad UniqueId | 4/24/2025 6:11:07 PM | | 6inTHICK | 40 | 667740 | 5159 | 1 | 1 | | 667740 | 2.52 | 1 | 119.11 | 2 | 0 | 3 | 118.87 | 4 | 0 | 5 | 0 | 6 | 0 | 7 | 117.12 | 8 | 116.95 | 9 | 116.18 |
+
+<1>:Bio-Rad UniqueId
+<2>:4/24/2025 6:11:07 PM
+<3>:
+<4>:6inTHICK
+<5>:40
+<6>:667740
+<7>:5159
+<8>:1
+<9>:1
+<10>:
+<11>:667740
+<12>:2.52
+<13>:1
+<14>:119.11
+<15>:2
+<16>:0
+<17>:3
+<18>:118.87
+<19>:4
+<20>:0
+<21>:5
+<22>:0
+<23>:6
+<24>:0
+<25>:7
+<26>:117.12
+<27>:8
+<28>:116.95
+<29>:9
+<30>:116.18
diff --git a/.vscode/638811150679527382/BIORAD2_250424181107000.json b/.vscode/638811150679527382/BIORAD2_250424181107000.json
new file mode 100644
index 0000000..15cdabc
--- /dev/null
+++ b/.vscode/638811150679527382/BIORAD2_250424181107000.json
@@ -0,0 +1,80 @@
+{
+ "SentToMetrology": false,
+ "SentToSPC": false,
+ "Id": -1,
+ "Batch": "667740",
+ "Cassette": "",
+ "CellName": "BIORAD2",
+ "Date": "4/24/2025 6:11:07 PM",
+ "FilePath": "",
+ "Layer": "1",
+ "MeanThickness": "117.645",
+ "Op": "CL",
+ "PSN": "5159",
+ "PassFail": "FAIL",
+ "RDS": "667740",
+ "RVThickness": "2.520",
+ "Reactor": "40",
+ "Recipe": "6inTHICK",
+ "StdDev": "1.279",
+ "Title": "Bio-Rad QS400MEPI",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Wafer": "667740",
+ "Zone": "1",
+ "Details": [
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "1",
+ "Thickness": "119.11",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-1"
+ },
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "2",
+ "Thickness": "0.00",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-2"
+ },
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "3",
+ "Thickness": "118.87",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-3"
+ },
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "4",
+ "Thickness": "0.00",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-4"
+ },
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "5",
+ "Thickness": "0.00",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-5"
+ },
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "6",
+ "Thickness": "0.00",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-6"
+ },
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "7",
+ "Thickness": "117.12",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-7"
+ },
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "8",
+ "Thickness": "116.95",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-8"
+ },
+ {
+ "HeaderUniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527",
+ "Position": "9",
+ "Thickness": "116.18",
+ "UniqueId": "BIORAD2_40-667740-5159.1-1_202504241811079527_Item-9"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/638811150679527382/BIORAD2_250424181107000.pdsf b/.vscode/638811150679527382/BIORAD2_250424181107000.pdsf
new file mode 100644
index 0000000..b008c45
--- /dev/null
+++ b/.vscode/638811150679527382/BIORAD2_250424181107000.pdsf
@@ -0,0 +1,55 @@
+HEADER_TAG HEADER_VALUE
+FORMAT 2.00
+NUMBER_PASSES 0001
+HEADER_OFFSET H#######T
+DATA_OFFSET D#######T
+END_OFFSET E#######T
+"Time" "A_LOGISTICS" "B_LOGISTICS" "Test" "Count" "Index" "MesEntity" "Date" "Employee" "Lot" "PSN" "Reactor" "Recipe" "Cassette" "HeaderUniqueId" "Layer" "PassFail" "Position" "RDS" "Title" "UniqueId" "Wafer" "Zone" "MeanThickness" "RVThickness" "StdDev" "Thickness" "Slot" "ThicknessFourteen3mmEdgeMean" "ThicknessFourteen3mmEdgePercent" "ThicknessFourteen5mmEdgeMean" "ThicknessFourteen5mmEdgePercent" "ThicknessFourteenCenterMean" "ThicknessFourteenCriticalPointsAverage" "ThicknessFourteenCriticalPointsStdDev" "ThicknessFourteenMeanFrom" "Thickness01" "Thickness02" "Thickness03" "Thickness04" "Thickness05" "Thickness06" "Thickness07" "Thickness08" "Thickness09" "Thickness10" "Thickness11" "Thickness12" "Thickness13" "Thickness14"
+0.00 1 2 25 9 0 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 1 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 119.11 00 119.11
+0.00 1 2 25 9 1 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 2 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 0.00 00 0.00
+0.00 1 2 25 9 2 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 3 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 118.87 00 118.87
+0.00 1 2 25 9 3 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 4 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 0.00 00 0.00
+0.00 1 2 25 9 4 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 5 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 0.00 00 0.00
+0.00 1 2 25 9 5 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 6 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 0.00 00 0.00
+0.00 1 2 25 9 6 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 7 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 117.12 00 117.12
+0.00 1 2 25 9 7 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 8 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 116.95 00 116.95
+0.00 1 2 25 9 8 BIORAD2 4/24/2025 6:11:07 PM CL 667740 5159 40 6inTHICK HeaderUniqueId 1 FAIL 9 667740 Bio-Rad QS400MEPI UniqueId 667740 1 117.645 2.520 1.279 116.18 00 116.18
+NUM_DATA_ROWS 000000009
+NUM_DATA_COLUMNS 000000050
+DELIMITER ;
+START_TIME_FORMAT MM/dd/yyyy HH:mm:ss
+START_TIME 04/24/2025 18:11:07
+LOGISTICS_COLUMN A_LOGISTICS
+LOGISTICS_COLUMN B_LOGISTICS
+LOGISTICS_1 A_HeaderId=514141;A_SubgroupId=1745543491;A_BASIC_TYPE=;A_INFO=202504241811079527.TXT.csv;A_INFO2=9;A_JOBID=BIORAD2;A_MES_ENTITY=BIORAD2;A_MID=40-667740-5159.1-1;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811150679527382;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2 B_HeaderId=514141;B_SubgroupId=1745543491;B_BASIC_TYPE=- EpiPro 5000;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=667740;B_NULL_DATA=;B_PPID=6inTHICK;B_PROCESS_JOBID=40;B_PRODUCT=5159;B_SEQUENCE=638811150679527382;B_WAFER_ID=-;B_WAFER_POS=1;
+EOF
+HEADER_TAG|HEADER_VALUE
+FORMAT|2.00
+NUMBER_PASSES|0001
+HEADER_OFFSET|000003202
+DATA_OFFSET|000000128
+END_OFFSET|000003871
+
+|Time|A_LOGISTICS|B_LOGISTICS|Count|Sequence|MesEntity|Index|Title|Recipe|DateTime|Operator|Batch|Cassette|UsedLast|Wafer|Position|Thickness|WaferMeanThickness|StdDev|PassFail|Line|RadialVariationThickness|Slot|RDS|PSN|Reactor|Layer|Zone|Employee|InferredLot|Thickness 14 3mm Edge Mean|Thickness 14 3mm Edge % from R/2|Thickness 14 5mm Edge Mean|Thickness 14 5mm Edge % from R/2|Thickness 14 Center Mean|Thickness 14 Average|Thickness 14 Std Dev|Thickness 14 R 2/Mean|Thickness01|Thickness02|Thickness03|Thickness04|Thickness05|Thickness06|Thickness07|Thickness08|Thickness09|Thickness10|Thickness11|Thickness12|Thickness13|Thickness14|EventId|
+|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
+0.00|1|2|9|638811150679527382|BIORAD2|0|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|1|119.11|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1|||||||||119.11||||||||||||||25
+0.00|1|2|9|638811150679527382|BIORAD2|1|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|2|0.00|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1||||||||||0.00|||||||||||||25
+0.00|1|2|9|638811150679527382|BIORAD2|2|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|3|118.87|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1|||||||||||118.87||||||||||||25
+0.00|1|2|9|638811150679527382|BIORAD2|3|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|4|0.00|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1||||||||||||0.00|||||||||||25
+0.00|1|2|9|638811150679527382|BIORAD2|4|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|5|0.00|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1|||||||||||||0.00||||||||||25
+0.00|1|2|9|638811150679527382|BIORAD2|5|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|6|0.00|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1||||||||||||||0.00|||||||||25
+0.00|1|2|9|638811150679527382|BIORAD2|6|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|7|117.12|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1|||||||||||||||117.12||||||||25
+0.00|1|2|9|638811150679527382|BIORAD2|7|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|8|116.95|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1||||||||||||||||116.95|||||||25
+0.00|1|2|9|638811150679527382|BIORAD2|8|Bio-Rad QS400MEPI|6inTHICK|4/24/2025 6:11:07 PM|CL|BIORAD#2||True|667740|9|116.18|117.645|1.279|FAIL|Radial variation (computation B) PASS:|2.520|00|667740|5159|40|1|1||40-667740-5159.1-1|||||||||||||||||116.18||||||25
+
+NUM_DATA_ROWS|000000009
+NUM_DATA_COLUMNS|000000053
+DELIMITER|;
+START_TIME_FORMAT|MM/dd/yyyy HH:mm:ss
+START_TIME|04/24/2025 18:11:07
+LOGISTICS_COLUMN|A_LOGISTICS
+LOGISTICS_COLUMN|B_LOGISTICS
+LOGISTICS_1|A_BASIC_TYPE=;A_INFO=202504241811079527.TXT.csv;A_INFO2=9;A_JOBID=BIORAD2;A_MES_ENTITY=BIORAD2;A_MID=40-667740-5159.1-1;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811150679527382;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2|B_BASIC_TYPE=- EpiPro 5000;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=667740;B_NULL_DATA=;B_PPID=6inTHICK;B_PROCESS_JOBID=40;B_PRODUCT=5159;B_SEQUENCE=638811150679527382;B_WAFER_ID=-;B_WAFER_POS=1;
+END_HEADER
\ No newline at end of file
diff --git a/.vscode/638811206483711430/1745549064 BIORAD5 667283 2025-04-24 19-44-08.txt b/.vscode/638811206483711430/1745549064 BIORAD5 667283 2025-04-24 19-44-08.txt
new file mode 100644
index 0000000..17ed0bc
--- /dev/null
+++ b/.vscode/638811206483711430/1745549064 BIORAD5 667283 2025-04-24 19-44-08.txt
@@ -0,0 +1,22 @@
+Stratus_32-667283-5095_20250424074408371 4/24/2025 7:44:08 PM BIORAD5 FQA Thickness 6in_CENTERPOINT 32 667283 5095 _24_19_41 667283 6.971 1 6.963 25 6.980
+
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
+|------------------------------------------|----------------------|---------|---------------|---|-----------------|----|--------|------|-----------|--------|-------|----|-------|----|------|
+| Stratus_32-667283-5095_20250424074408371 | 4/24/2025 7:44:08 PM | BIORAD5 | FQA Thickness | | 6in_CENTERPOINT | 32 | 667283 | 5095 | _24_19_41 | 667283 | 6.971 | 1 | 6.963 | 25 | 6.98 |
+
+<1>:Stratus_32-667283-5095_20250424074408371
+<2>:4/24/2025 7:44:08 PM
+<3>:BIORAD5
+<4>:FQA Thickness
+<5>:
+<6>:6in_CENTERPOINT
+<7>:32
+<8>:667283
+<9>:5095
+<10>:_24_19_41
+<11>:667283
+<12>:6.971
+<13>:1
+<14>:6.963
+<15>:25
+<16>:6.98
diff --git a/.vscode/638811206483711430/BIORAD5_250424194408000.json b/.vscode/638811206483711430/BIORAD5_250424194408000.json
new file mode 100644
index 0000000..2a65241
--- /dev/null
+++ b/.vscode/638811206483711430/BIORAD5_250424194408000.json
@@ -0,0 +1,59 @@
+{
+ "Id": -1,
+ "Batch": "_24_19_41",
+ "Cassette": "667283",
+ "CellName": "BIORAD5",
+ "Date": "4/24/2025 7:44:08 PM",
+ "FilePath": "",
+ "MeanThickness": "6.971",
+ "Operator": "",
+ "PSN": "5095",
+ "RDS": "667283",
+ "Reactor": "32",
+ "Recipe": "6in_CENTERPOINT",
+ "StdDev": "0.0115",
+ "Title": "_24_19_41",
+ "UniqueId": "BIORAD5_32-667283-5095_202504241944083711",
+ "Details": [
+ {
+ "HeaderUniqueId": "BIORAD5_32-667283-5095_202504241944083711",
+ "Mean": "6.963",
+ "PassFail": "PASS",
+ "Position": "1",
+ "Recipe": "6in_CENTERPOINT",
+ "Slot": "1",
+ "StdDev": "0",
+ "UniqueId": "BIORAD5_32-667283-5095_202504241944083711_Item-1",
+ "Thickness": "6.963",
+ "Wafer": "Wafer 1",
+ "Points": [
+ {
+ "HeaderUniqueId": "HeaderUniqueId",
+ "Position": "1",
+ "Thickness": "6.963",
+ "UniqueId": "UniqueId"
+ }
+ ]
+ },
+ {
+ "HeaderUniqueId": "BIORAD5_32-667283-5095_202504241944083711",
+ "Mean": "6.980",
+ "PassFail": "PASS",
+ "Position": "25",
+ "Recipe": "6in_CENTERPOINT",
+ "Slot": "25",
+ "StdDev": "0",
+ "UniqueId": "BIORAD5_32-667283-5095_202504241944083711_Item-2",
+ "Thickness": "6.980",
+ "Wafer": "Wafer 25",
+ "Points": [
+ {
+ "HeaderUniqueId": "HeaderUniqueId",
+ "Position": "25",
+ "Thickness": "6.980",
+ "UniqueId": "UniqueId"
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/638811206483711430/BIORAD5_250424194408000.pdsf b/.vscode/638811206483711430/BIORAD5_250424194408000.pdsf
new file mode 100644
index 0000000..d8d330b
--- /dev/null
+++ b/.vscode/638811206483711430/BIORAD5_250424194408000.pdsf
@@ -0,0 +1,41 @@
+HEADER_TAG HEADER_VALUE
+FORMAT 2.00
+NUMBER_PASSES 0001
+HEADER_OFFSET H#######T
+DATA_OFFSET D#######T
+END_OFFSET E#######T
+"Time" "A_LOGISTICS" "B_LOGISTICS" "Test" "Count" "Index" "MesEntity" "MID" "Date" "Employee" "Lot" "PSN" "Reactor" "Recipe" "Cassette" "GradeStdDev" "HeaderUniqueId" "Layer" "MeanThickness" "PassFail" "RDS" "Slot" "Title" "UniqueId" "Wafer" "Zone" "Mean" "Position" "StdDev" "Thickness" "ThicknessSlotOne" "ThicknessSlotTwentyFive" "DeltaThicknessSlotsOneAndTwentyFive" "PercentDeltaThicknessSlotsOneAndTwentyFive"
+0.00 1 2 26 2 0 BIORAD5 667283 4/24/2025 7:44:08 PM _24_19_41 5095 32 6in_CENTERPOINT 667283 0.0115 HeaderUniqueId - 6.971 PASS 667283 1 _24_19_41 UniqueId Wafer 1 - 6.963 1 0 6.963 ThicknessSlotOne ThicknessSlotTwentyFive
+0.00 1 2 26 2 1 BIORAD5 667283 4/24/2025 7:44:08 PM _24_19_41 5095 32 6in_CENTERPOINT 667283 0.0115 HeaderUniqueId - 6.971 PASS 667283 25 _24_19_41 UniqueId Wafer 25 - 6.980 25 0 6.980 ThicknessSlotOne ThicknessSlotTwentyFive
+NUM_DATA_ROWS 000000002
+NUM_DATA_COLUMNS 000000034
+DELIMITER ;
+START_TIME_FORMAT MM/dd/yyyy HH:mm:ss
+START_TIME 04/24/2025 19:44:08
+LOGISTICS_COLUMN A_LOGISTICS
+LOGISTICS_COLUMN B_LOGISTICS
+LOGISTICS_1 A_HeaderId=348729;A_SubgroupId=1745549064;A_BASIC_TYPE=;A_INFO=DataBiorad.txt-0.csv;A_INFO2=2;A_JOBID=BIORAD5;A_MES_ENTITY=BIORAD5;A_MID=32-667283-5095;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811206483711430;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2 B_HeaderId=348729;B_SubgroupId=1745549064;B_BASIC_TYPE=Left - High Thruput;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=667283;B_NULL_DATA=;B_PPID=6in_CENTERPOINT;B_PROCESS_JOBID=32;B_PRODUCT=5095;B_SEQUENCE=638811206483711430;B_WAFER_ID=-;B_WAFER_POS=-;
+EOF
+HEADER_TAG|HEADER_VALUE
+FORMAT|2.00
+NUMBER_PASSES|0001
+HEADER_OFFSET|000000838
+DATA_OFFSET|000000128
+END_OFFSET|000001510
+
+|Time|A_LOGISTICS|B_LOGISTICS|Count|Sequence|MesEntity|Index|Batch|Cassette|DateTime|Destination|Mean|PassFail|Recipe|Reference|Site|Slot|Source|StdDev|Text|GradeMean|GradeStdDev|RDS|PSN|Reactor|Layer|Zone|Employee|InferredLot|Actual Delta Thick Pts 1 and 25|% Delta Thick Pts 1 and 25|EventId|
+|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
+0.00|1|2|2|638811206483711430|BIORAD5|0|_24_19_41|667283|4/24/2025 7:44:08 PM||6.963|PASS|6in_CENTERPOINT||6.963|1||0|Wafer 1|6.971|0.0115|667283|5095|32|-|-||_24_19_41|||26
+0.00|1|2|2|638811206483711430|BIORAD5|1|_24_19_41|667283|4/24/2025 7:44:08 PM||6.980|PASS|6in_CENTERPOINT||6.980|25||0|Wafer 25|6.971|0.0115|667283|5095|32|-|-||_24_19_41|||26
+
+NUM_DATA_ROWS|000000002
+NUM_DATA_COLUMNS|000000032
+DELIMITER|;
+START_TIME_FORMAT|MM/dd/yyyy HH:mm:ss
+START_TIME|04/24/2025 19:44:08
+LOGISTICS_COLUMN|A_LOGISTICS
+LOGISTICS_COLUMN|B_LOGISTICS
+LOGISTICS_1|A_BASIC_TYPE=;A_INFO=DataBiorad.txt-0.csv;A_INFO2=2;A_JOBID=BIORAD5;A_MES_ENTITY=BIORAD5;A_MID=32-667283-5095;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811206483711430;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2|B_BASIC_TYPE=Left - High Thruput;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=667283;B_NULL_DATA=;B_PPID=6in_CENTERPOINT;B_PROCESS_JOBID=32;B_PRODUCT=5095;B_SEQUENCE=638811206483711430;B_WAFER_ID=-;B_WAFER_POS=-;
+END_HEADER
\ No newline at end of file
diff --git a/.vscode/638811672019538124/1745595622 HGCV2 667776 2025-04-25 08-40-01.txt b/.vscode/638811672019538124/1745595622 HGCV2 667776 2025-04-25 08-40-01.txt
new file mode 100644
index 0000000..4eadc49
--- /dev/null
+++ b/.vscode/638811672019538124/1745595622 HGCV2 667776 2025-04-25 08-40-01.txt
@@ -0,0 +1,103 @@
+UniqueId HGCV2 46 667776 5159 - - ZONE2 667776 5PT MES 4/25/2025 8:40:01 AM 150.00 1.02 2.130E-002 N PARALLEL -5.00 -20.00 2500 2000.00 6IN5PT 6IN5PT SSMDATA 6_5PT10M.PAT ASTM: F723 - 82 7.599e+013 2.352e+000 2.799e+000 7.634e+013 2.352e+000 2.766e+000 3.342e-001 4.365e+001 4.605e+001 1.713e+001 2.053e+000 2.563e+000 5.632e+001 2.315e+000 2.779e+000 5.607e+001 2.321e+000 2.746e+000 9.000e+001 -1.000e+000 0.000e+000 2.251e+000 2.931e+001 3.713e+001 -1.000e+000 -1.000e+000 0.000e+000 1 7.854E+013 7.882E+013 0.294 17.109 54.482 54.286 90.000 2.193 2 7.447E+013 7.472E+013 0.216 17.428 57.431 57.247 90.000 1.898 3 7.426E+013 7.458E+013 0.250 17.496 57.596 57.352 90.000 2.414 4 7.695E+013 7.733E+013 0.327 16.621 55.595 55.324 90.000 1.493 5 7.571E+013 7.623E+013 0.584 17.015 56.500 56.121 90.000 3.257
+
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 |
+|----------|-------|----|--------|------|---|---|-------|--------|---------|----------------------|-----|------|----------|----|----------|----|-----|------|------|--------|--------|---------|--------------|-----------------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|----------|-----------|----------|----------|----------|----------|-----------|-----------|----------|----|----------|----------|-------|--------|--------|--------|----|-------|----|----------|----------|-------|--------|--------|--------|----|-------|----|----------|----------|------|--------|--------|--------|----|-------|----|----------|----------|-------|--------|--------|--------|----|-------|----|----------|----------|-------|--------|------|--------|----|-------|
+| UniqueId | HGCV2 | 46 | 667776 | 5159 | - | - | ZONE2 | 667776 | 5PT MES | 4/25/2025 8:40:01 AM | 150 | 1.02 | 2.13E-02 | N | PARALLEL | -5 | -20 | 2500 | 2000 | 6IN5PT | 6IN5PT | SSMDATA | 6_5PT10M.PAT | ASTM: F723 - 82 | 7.60E+13 | 2.35E+00 | 2.80E+00 | 7.63E+13 | 2.35E+00 | 2.77E+00 | 3.34E-01 | 4.37E+01 | 4.61E+01 | 1.71E+01 | 2.05E+00 | 2.56E+00 | 5.63E+01 | 2.32E+00 | 2.78E+00 | 5.61E+01 | 2.32E+00 | 2.75E+00 | 9.00E+01 | -1.00E+00 | 0.00E+00 | 2.25E+00 | 2.93E+01 | 3.71E+01 | -1.00E+00 | -1.00E+00 | 0.00E+00 | 1 | 7.85E+13 | 7.88E+13 | 0.294 | 17.109 | 54.482 | 54.286 | 90 | 2.193 | 2 | 7.45E+13 | 7.47E+13 | 0.216 | 17.428 | 57.431 | 57.247 | 90 | 1.898 | 3 | 7.43E+13 | 7.46E+13 | 0.25 | 17.496 | 57.596 | 57.352 | 90 | 2.414 | 4 | 7.70E+13 | 7.73E+13 | 0.327 | 16.621 | 55.595 | 55.324 | 90 | 1.493 | 5 | 7.57E+13 | 7.62E+13 | 0.584 | 17.015 | 56.5 | 56.121 | 90 | 3.257 |
+
+<1>:UniqueId
+<2>:HGCV2
+<3>:46
+<4>:667776
+<5>:5159
+<6>:-
+<7>:-
+<8>:ZONE2
+<9>:667776
+<10>:5PT MES
+<11>:4/25/2025 8:40:01 AM
+<12>:150
+<13>:1.02
+<14>:0.0213
+<15>:N
+<16>:PARALLEL
+<17>:-5
+<18>:-20
+<19>:2500
+<20>:2000
+<21>:6IN5PT
+<22>:6IN5PT
+<23>:SSMDATA
+<24>:6_5PT10M.PAT
+<25>:ASTM: F723 - 82
+<26>:7.599E+13
+<27>:2.352
+<28>:2.799
+<29>:7.634E+13
+<30>:2.352
+<31>:2.766
+<32>:0.3342
+<33>:43.65
+<34>:46.05
+<35>:17.13
+<36>:2.053
+<37>:2.563
+<38>:56.32
+<39>:2.315
+<40>:2.779
+<41>:56.07
+<42>:2.321
+<43>:2.746
+<44>:90
+<45>:-1
+<46>:0
+<47>:2.251
+<48>:29.31
+<49>:37.13
+<50>:-1
+<51>:-1
+<52>:0
+<53>:1
+<54>:7.854E+13
+<55>:7.882E+13
+<56>:0.294
+<57>:17.109
+<58>:54.482
+<59>:54.286
+<60>:90
+<61>:2.193
+<62>:2
+<63>:7.447E+13
+<64>:7.472E+13
+<65>:0.216
+<66>:17.428
+<67>:57.431
+<68>:57.247
+<69>:90
+<70>:1.898
+<71>:3
+<72>:7.426E+13
+<73>:7.458E+13
+<74>:0.25
+<75>:17.496
+<76>:57.596
+<77>:57.352
+<78>:90
+<79>:2.414
+<80>:4
+<81>:7.695E+13
+<82>:7.733E+13
+<83>:0.327
+<84>:16.621
+<85>:55.595
+<86>:55.324
+<87>:90
+<88>:1.493
+<89>:5
+<90>:7.571E+13
+<91>:7.623E+13
+<92>:0.584
+<93>:17.015
+<94>:56.5
+<95>:56.121
+<96>:90
+<97>:3.257
diff --git a/.vscode/638811672019538124/HGCV2_250425084001000.json b/.vscode/638811672019538124/HGCV2_250425084001000.json
new file mode 100644
index 0000000..0500323
--- /dev/null
+++ b/.vscode/638811672019538124/HGCV2_250425084001000.json
@@ -0,0 +1,119 @@
+{
+ "SentToMetrology": false,
+ "SentToSPC": false,
+ "Area": "2.130E-002",
+ "Ccomp": "1.02",
+ "CellName": "HGCV2",
+ "CondType": "N",
+ "Date": "4/25/2025 8:40:01 AM",
+ "FlatZMean": "1.713e\u002B001",
+ "FlatZRadialGradient": "2.563e\u002B000",
+ "FlatZStdDev": "2.053e\u002B000",
+ "Folder": "SSMDATA",
+ "GLimit": "2000.00",
+ "GradeMean": "2.251e\u002B000",
+ "GradeRadialGradient": "3.713e\u002B001",
+ "GradeStdDev": "2.931e\u002B001",
+ "Id": -1,
+ "Layer": "-",
+ "Lot": "667776",
+ "Model": "PARALLEL",
+ "NAvgMean": "7.599e\u002B013",
+ "NAvgRadialGradient": "2.799e\u002B000",
+ "NAvgStdDev": "2.352e\u002B000",
+ "NslMean": "7.634e\u002B013",
+ "NslRadialGradient": "2.766e\u002B000",
+ "NslStdDev": "2.352e\u002B000",
+ "Operator": "HGCV2",
+ "PSN": "5159",
+ "Pattern": "6_5PT10M.PAT",
+ "PhaseMean": "9.000e\u002B001",
+ "PhaseRadialGradient": "0.000e\u002B000",
+ "PhaseStdDev": "-1.000e\u002B000",
+ "Plan": "5PT MES",
+ "RDS": "667776",
+ "RampRate": "2500",
+ "Reactor": "46",
+ "RhoAvgMean": "5.632e\u002B001",
+ "RhoAvgRadialGradient": "2.779e\u002B000",
+ "RhoAvgStdDev": "2.315e\u002B000",
+ "RhoMethod": "ASTM: F723 - 82",
+ "RhoslMean": "5.607e\u002B001",
+ "RhoslRadialGradient": "2.746e\u002B000",
+ "RhoslStdDev": "2.321e\u002B000",
+ "RsMean": "-1.000e\u002B000",
+ "RsRadialGradient": "0.000e\u002B000",
+ "RsStdDev": "-1.000e\u002B000",
+ "SetupFile": "6IN5PT",
+ "StartVoltage": "-5.00",
+ "StopVoltage": "-20.00",
+ "UniqueId": "HGCV2_46-667776-5159_202504250840019538",
+ "VdMean": "3.342e-001",
+ "VdRadialGradient": "4.605e\u002B001",
+ "VdStdDev": "4.365e\u002B001",
+ "Wafer": "ZONE2",
+ "WaferSize": "150.00",
+ "Zone": "-",
+ "Details": [
+ {
+ "FlatZ": "17.109",
+ "Grade": "2.193",
+ "HeaderUniqueId": "HGCV2_46-667776-5159_202504250840019538",
+ "NAvg": "7.854E\u002B013",
+ "Nsl": "7.882E\u002B013",
+ "Phase": "90.000",
+ "RhoAvg": "54.482",
+ "Rhosl": "54.286",
+ "UniqueId": "HGCV2_46-667776-5159_202504250840019538_Item-1",
+ "Vd": "0.294"
+ },
+ {
+ "FlatZ": "17.428",
+ "Grade": "1.898",
+ "HeaderUniqueId": "HGCV2_46-667776-5159_202504250840019538",
+ "NAvg": "7.447E\u002B013",
+ "Nsl": "7.472E\u002B013",
+ "Phase": "90.000",
+ "RhoAvg": "57.431",
+ "Rhosl": "57.247",
+ "UniqueId": "HGCV2_46-667776-5159_202504250840019538_Item-2",
+ "Vd": "0.216"
+ },
+ {
+ "FlatZ": "17.496",
+ "Grade": "2.414",
+ "HeaderUniqueId": "HGCV2_46-667776-5159_202504250840019538",
+ "NAvg": "7.426E\u002B013",
+ "Nsl": "7.458E\u002B013",
+ "Phase": "90.000",
+ "RhoAvg": "57.596",
+ "Rhosl": "57.352",
+ "UniqueId": "HGCV2_46-667776-5159_202504250840019538_Item-3",
+ "Vd": "0.250"
+ },
+ {
+ "FlatZ": "16.621",
+ "Grade": "1.493",
+ "HeaderUniqueId": "HGCV2_46-667776-5159_202504250840019538",
+ "NAvg": "7.695E\u002B013",
+ "Nsl": "7.733E\u002B013",
+ "Phase": "90.000",
+ "RhoAvg": "55.595",
+ "Rhosl": "55.324",
+ "UniqueId": "HGCV2_46-667776-5159_202504250840019538_Item-4",
+ "Vd": "0.327"
+ },
+ {
+ "FlatZ": "17.015",
+ "Grade": "3.257",
+ "HeaderUniqueId": "HGCV2_46-667776-5159_202504250840019538",
+ "NAvg": "7.571E\u002B013",
+ "Nsl": "7.623E\u002B013",
+ "Phase": "90.000",
+ "RhoAvg": "56.500",
+ "Rhosl": "56.121",
+ "UniqueId": "HGCV2_46-667776-5159_202504250840019538_Item-5",
+ "Vd": "0.584"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/638811672019538124/HGCV2_250425084001000.pdsf b/.vscode/638811672019538124/HGCV2_250425084001000.pdsf
new file mode 100644
index 0000000..b026034
--- /dev/null
+++ b/.vscode/638811672019538124/HGCV2_250425084001000.pdsf
@@ -0,0 +1,47 @@
+HEADER_TAG HEADER_VALUE
+FORMAT 2.00
+NUMBER_PASSES 0001
+HEADER_OFFSET H#######T
+DATA_OFFSET D#######T
+END_OFFSET E#######T
+"Time" "A_LOGISTICS" "B_LOGISTICS" "Test" "Count" "Index" "MesEntity" "Date" "Employee" "Lot" "PSN" "Reactor" "Recipe" "Area" "Folder" "HeaderUniqueId" "Id" "Layer" "Model" "Pattern" "Phase" "Plan" "RampRate" "RDS" "SetupFile" "StartVoltage" "StopVoltage" "UniqueId" "Wafer" "WaferSize" "Zone" "Ccomp" "CondType" "FlatZ" "FlatZMean" "FlatZRadialGradient" "FlatZStdDev" "GLimit" "Grade" "GradeMean" "GradeRadialGradient" "GradeStdDev" "NAvg" "NAvgMean" "NAvgRadialGradient" "NAvgStdDev" "Nsl" "NslMean" "NslRadialGradient" "NslStdDev" "PhaseMean" "PhaseRadialGradient" "PhaseStdDev" "RhoAvg" "RhoAvgMean" "RhoAvgRadialGradient" "RhoAvgStdDev" "RhoMethod" "Rhosl" "RhoslMean" "RhoslRadialGradient" "RhoslStdDev" "RsMean" "RsRadialGradient" "RsStdDev" "Vd" "VdMean" "VdRadialGradient" "VdStdDev" "Variation" "AreaDeltaFromLastRun" "Nine10mmEdgeMean" "Nine4mmEdgeMean" "NineCriticalPointsAverage" "NineCriticalPointsPhaseAngleAverage" "NineCriticalPointsStdDev" "NineEdgeMeanDelta" "NineMean" "NineResRangePercent" "RhoAvg01" "RhoAvg02" "RhoAvg03" "RhoAvg04" "RhoAvg05" "RhoAvg06" "RhoAvg07" "RhoAvg08" "RhoAvg09"
+0.00 1 2 23 5 0 HGCV2 4/25/2025 8:40:01 AM 667776 5159 46 Recipe 2.130E-002 SSMDATA HeaderUniqueId Id - PARALLEL 6_5PT10M.PAT 90.000 5PT MES 2500 667776 6IN5PT -5.00 -20.00 UniqueId ZONE2 150.00 - 1.02 N 17.109 1.713e+001 2.563e+000 2.053e+000 2000.00 2.193 2.251e+000 3.713e+001 2.931e+001 7.854E+013 7.599e+013 2.799e+000 2.352e+000 7.882E+013 7.634e+013 2.766e+000 2.352e+000 9.000e+001 0.000e+000 -1.000e+000 54.482 5.632e+001 2.779e+000 2.315e+000 ASTM: F723 - 82 54.286 5.607e+001 2.746e+000 2.321e+000 -1.000e+000 0.000e+000 -1.000e+000 0.294 3.342e-001 4.605e+001 4.365e+001 54.482
+0.00 1 2 23 5 1 HGCV2 4/25/2025 8:40:01 AM 667776 5159 46 Recipe 2.130E-002 SSMDATA HeaderUniqueId Id - PARALLEL 6_5PT10M.PAT 90.000 5PT MES 2500 667776 6IN5PT -5.00 -20.00 UniqueId ZONE2 150.00 - 1.02 N 17.428 1.713e+001 2.563e+000 2.053e+000 2000.00 1.898 2.251e+000 3.713e+001 2.931e+001 7.447E+013 7.599e+013 2.799e+000 2.352e+000 7.472E+013 7.634e+013 2.766e+000 2.352e+000 9.000e+001 0.000e+000 -1.000e+000 57.431 5.632e+001 2.779e+000 2.315e+000 ASTM: F723 - 82 57.247 5.607e+001 2.746e+000 2.321e+000 -1.000e+000 0.000e+000 -1.000e+000 0.216 3.342e-001 4.605e+001 4.365e+001 57.431
+0.00 1 2 23 5 2 HGCV2 4/25/2025 8:40:01 AM 667776 5159 46 Recipe 2.130E-002 SSMDATA HeaderUniqueId Id - PARALLEL 6_5PT10M.PAT 90.000 5PT MES 2500 667776 6IN5PT -5.00 -20.00 UniqueId ZONE2 150.00 - 1.02 N 17.496 1.713e+001 2.563e+000 2.053e+000 2000.00 2.414 2.251e+000 3.713e+001 2.931e+001 7.426E+013 7.599e+013 2.799e+000 2.352e+000 7.458E+013 7.634e+013 2.766e+000 2.352e+000 9.000e+001 0.000e+000 -1.000e+000 57.596 5.632e+001 2.779e+000 2.315e+000 ASTM: F723 - 82 57.352 5.607e+001 2.746e+000 2.321e+000 -1.000e+000 0.000e+000 -1.000e+000 0.250 3.342e-001 4.605e+001 4.365e+001 57.596
+0.00 1 2 23 5 3 HGCV2 4/25/2025 8:40:01 AM 667776 5159 46 Recipe 2.130E-002 SSMDATA HeaderUniqueId Id - PARALLEL 6_5PT10M.PAT 90.000 5PT MES 2500 667776 6IN5PT -5.00 -20.00 UniqueId ZONE2 150.00 - 1.02 N 16.621 1.713e+001 2.563e+000 2.053e+000 2000.00 1.493 2.251e+000 3.713e+001 2.931e+001 7.695E+013 7.599e+013 2.799e+000 2.352e+000 7.733E+013 7.634e+013 2.766e+000 2.352e+000 9.000e+001 0.000e+000 -1.000e+000 55.595 5.632e+001 2.779e+000 2.315e+000 ASTM: F723 - 82 55.324 5.607e+001 2.746e+000 2.321e+000 -1.000e+000 0.000e+000 -1.000e+000 0.327 3.342e-001 4.605e+001 4.365e+001 55.595
+0.00 1 2 23 5 4 HGCV2 4/25/2025 8:40:01 AM 667776 5159 46 Recipe 2.130E-002 SSMDATA HeaderUniqueId Id - PARALLEL 6_5PT10M.PAT 90.000 5PT MES 2500 667776 6IN5PT -5.00 -20.00 UniqueId ZONE2 150.00 - 1.02 N 17.015 1.713e+001 2.563e+000 2.053e+000 2000.00 3.257 2.251e+000 3.713e+001 2.931e+001 7.571E+013 7.599e+013 2.799e+000 2.352e+000 7.623E+013 7.634e+013 2.766e+000 2.352e+000 9.000e+001 0.000e+000 -1.000e+000 56.500 5.632e+001 2.779e+000 2.315e+000 ASTM: F723 - 82 56.121 5.607e+001 2.746e+000 2.321e+000 -1.000e+000 0.000e+000 -1.000e+000 0.584 3.342e-001 4.605e+001 4.365e+001 56.500
+NUM_DATA_ROWS 000000005
+NUM_DATA_COLUMNS 000000088
+DELIMITER ;
+START_TIME_FORMAT MM/dd/yyyy HH:mm:ss
+START_TIME 04/25/2025 08:40:01
+LOGISTICS_COLUMN A_LOGISTICS
+LOGISTICS_COLUMN B_LOGISTICS
+LOGISTICS_1 A_HeaderId=241989;A_SubgroupId=1745595622;A_BASIC_TYPE=;A_INFO=202504250840019538.pcl.csv;A_INFO2=5;A_JOBID=HGCV2;A_MES_ENTITY=HGCV2;A_MID=46-667776-5159;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811672019538124;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2 B_HeaderId=241989;B_SubgroupId=1745595622;B_BASIC_TYPE=- EpiPro 5000;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=667776;B_NULL_DATA=;B_PPID=6_5PT10M.PAT;B_PROCESS_JOBID=46;B_PRODUCT=5159;B_SEQUENCE=638811672019538124;B_WAFER_ID=-;B_WAFER_POS=-;
+EOF
+HEADER_TAG|HEADER_VALUE
+FORMAT|2.00
+NUMBER_PASSES|0001
+HEADER_OFFSET|000004856
+DATA_OFFSET|000000128
+END_OFFSET|000005521
+
+|Time|A_LOGISTICS|B_LOGISTICS|Count|Sequence|MesEntity|Index|Operator|StartVoltage|Wafer|StopVoltage|Lot|RampRate|Plan|GLimit|Date|Time|SetupFile|WaferSize|Folder|Ccomp|Pattern|Area|CondType|RhoMethod|Model|MeanNAvg|MeanNsl|MeanVd|MeanFlatZ|MeanRhoAvg|MeanRhosl|MeanPhase|MeanGrade|MeanRs|StandardDeviationPercentageNAvg|StandardDeviationPercentageNsl|StandardDeviationPercentageVd|StandardDeviationPercentageFlatZ|StandardDeviationPercentageRhoAvg|StandardDeviationPercentageRhosl|StandardDeviationPercentagePhase|StandardDeviationPercentageGrade|StandardDeviationPercentageRs|RadialGradientNAvg|RadialGradientNsl|RadialGradientVd|RadialGradientFlatZ|RadialGradientRhoAvg|RadialGradientRhosl|RadialGradientPhase|RadialGradientGrade|RadialGradientRs|Site|X|Y|NAvg|RhoAvg|Nsl|Rhosl|Vd|Phase|FlatZ|Grade|XLeft|XRight|BottomY|TopY|RDS|PSN|Reactor|Layer|Zone|Employee|InferredLot|Nine10mmEdgeMean|Nine4mmEdgeMean|NineCriticalPointsAverage|NineCriticalPointsPhaseAngleAverage|NineCriticalPointsStdDev|NineEdgeMeanDelta|NineMean|NineResRangePercent|AreaDeltaFromLastRun|Variation|Percentage HgCV 4PP Delta|RhoAvg01|RhoAvg02|RhoAvg03|RhoAvg04|RhoAvg05|RhoAvg06|RhoAvg07|RhoAvg08|RhoAvg09|EventId|
+|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
+0.00|1|2|5|638811672019538124|HGCV2|0|PROBE 2|-5.00|ZONE2|-20.00|667776|2500|5PT MES|2000.00|4/25/2025 8:40:01 AM|11:57:16 AM|6IN5PT|150.00|SSMDATA|1.02|6_5PT10M.PAT|2.130E-002|N|ASTM: F723 - 82|PARALLEL|7.599e+013|7.634e+013|3.342e-001|1.713e+001|5.632e+001|5.607e+001|9.000e+001|2.251e+000|-1.000e+000|2.352e+000|2.352e+000|4.365e+001|2.053e+000|2.315e+000|2.321e+000|-1.000e+000|2.931e+001|-1.000e+000|2.799e+000|2.766e+000|4.605e+001|2.563e+000|2.779e+000|2.746e+000|0.000e+000|3.713e+001|0.000e+000|1|0.0|0.0|7.854E+013|54.482|7.882E+013|54.286|0.294|90.000|17.109|2.193|9.00E+000|1.80E+001|13|14|667776|5159|46|-|-||46-667776-5159||||||||||||54.482|||||||||23
+0.00|1|2|5|638811672019538124|HGCV2|1|PROBE 2|-5.00|ZONE2|-20.00|667776|2500|5PT MES|2000.00|4/25/2025 8:40:01 AM|11:57:16 AM|6IN5PT|150.00|SSMDATA|1.02|6_5PT10M.PAT|2.130E-002|N|ASTM: F723 - 82|PARALLEL|7.599e+013|7.634e+013|3.342e-001|1.713e+001|5.632e+001|5.607e+001|9.000e+001|2.251e+000|-1.000e+000|2.352e+000|2.352e+000|4.365e+001|2.053e+000|2.315e+000|2.321e+000|-1.000e+000|2.931e+001|-1.000e+000|2.799e+000|2.766e+000|4.605e+001|2.563e+000|2.779e+000|2.746e+000|0.000e+000|3.713e+001|0.000e+000|2|56.3|32.5|7.447E+013|57.431|7.472E+013|57.247|0.216|90.000|17.428|1.898|9.00E+000|1.80E+001|13|14|667776|5159|46|-|-||46-667776-5159|||||||||||||57.431||||||||23
+0.00|1|2|5|638811672019538124|HGCV2|2|PROBE 2|-5.00|ZONE2|-20.00|667776|2500|5PT MES|2000.00|4/25/2025 8:40:01 AM|11:57:16 AM|6IN5PT|150.00|SSMDATA|1.02|6_5PT10M.PAT|2.130E-002|N|ASTM: F723 - 82|PARALLEL|7.599e+013|7.634e+013|3.342e-001|1.713e+001|5.632e+001|5.607e+001|9.000e+001|2.251e+000|-1.000e+000|2.352e+000|2.352e+000|4.365e+001|2.053e+000|2.315e+000|2.321e+000|-1.000e+000|2.931e+001|-1.000e+000|2.799e+000|2.766e+000|4.605e+001|2.563e+000|2.779e+000|2.746e+000|0.000e+000|3.713e+001|0.000e+000|3|-32.5|56.3|7.426E+013|57.596|7.458E+013|57.352|0.250|90.000|17.496|2.414|9.00E+000|1.80E+001|13|14|667776|5159|46|-|-||46-667776-5159||||||||||||||57.596|||||||23
+0.00|1|2|5|638811672019538124|HGCV2|3|PROBE 2|-5.00|ZONE2|-20.00|667776|2500|5PT MES|2000.00|4/25/2025 8:40:01 AM|11:57:16 AM|6IN5PT|150.00|SSMDATA|1.02|6_5PT10M.PAT|2.130E-002|N|ASTM: F723 - 82|PARALLEL|7.599e+013|7.634e+013|3.342e-001|1.713e+001|5.632e+001|5.607e+001|9.000e+001|2.251e+000|-1.000e+000|2.352e+000|2.352e+000|4.365e+001|2.053e+000|2.315e+000|2.321e+000|-1.000e+000|2.931e+001|-1.000e+000|2.799e+000|2.766e+000|4.605e+001|2.563e+000|2.779e+000|2.746e+000|0.000e+000|3.713e+001|0.000e+000|4|-56.3|-32.5|7.695E+013|55.595|7.733E+013|55.324|0.327|90.000|16.621|1.493|9.00E+000|1.80E+001|13|14|667776|5159|46|-|-||46-667776-5159|||||||||||||||55.595||||||23
+0.00|1|2|5|638811672019538124|HGCV2|4|PROBE 2|-5.00|ZONE2|-20.00|667776|2500|5PT MES|2000.00|4/25/2025 8:40:01 AM|11:57:16 AM|6IN5PT|150.00|SSMDATA|1.02|6_5PT10M.PAT|2.130E-002|N|ASTM: F723 - 82|PARALLEL|7.599e+013|7.634e+013|3.342e-001|1.713e+001|5.632e+001|5.607e+001|9.000e+001|2.251e+000|-1.000e+000|2.352e+000|2.352e+000|4.365e+001|2.053e+000|2.315e+000|2.321e+000|-1.000e+000|2.931e+001|-1.000e+000|2.799e+000|2.766e+000|4.605e+001|2.563e+000|2.779e+000|2.746e+000|0.000e+000|3.713e+001|0.000e+000|5|32.5|-56.3|7.571E+013|56.500|7.623E+013|56.121|0.584|90.000|17.015|3.257|9.00E+000|1.80E+001|13|14|667776|5159|46|-|-||46-667776-5159||||||||||||||||56.500|||||23
+
+NUM_DATA_ROWS|000000005
+NUM_DATA_COLUMNS|000000096
+DELIMITER|;
+START_TIME_FORMAT|MM/dd/yyyy HH:mm:ss
+START_TIME|04/25/2025 08:40:01
+LOGISTICS_COLUMN|A_LOGISTICS
+LOGISTICS_COLUMN|B_LOGISTICS
+LOGISTICS_1|A_BASIC_TYPE=;A_INFO=202504250840019538.pcl.csv;A_INFO2=5;A_JOBID=HGCV2;A_MES_ENTITY=HGCV2;A_MID=46-667776-5159;A_NULL_DATA=;A_PPID=NO_PPID;A_PROCESS_JOBID=;A_PRODUCT=;A_SEQUENCE=638811672019538124;A_WAFER_ID=;A_WAFER_POS=;
+LOGISTICS_2|B_BASIC_TYPE=- EpiPro 5000;B_INFO=-;B_INFO2=;B_JOBID=;B_MES_ENTITY=;B_MID=667776;B_NULL_DATA=;B_PPID=6_5PT10M.PAT;B_PROCESS_JOBID=46;B_PRODUCT=5159;B_SEQUENCE=638811672019538124;B_WAFER_ID=-;B_WAFER_POS=-;
+END_HEADER
\ No newline at end of file
diff --git a/.vscode/METROLOGY_SERVICES.vba b/.vscode/METROLOGY_SERVICES.vba
new file mode 100644
index 0000000..3f471c2
--- /dev/null
+++ b/.vscode/METROLOGY_SERVICES.vba
@@ -0,0 +1,3383 @@
+a_data_path = Environment_Services('GetApplicationRootPath') : '\Metrology\TestFiles\';
+ a_search_pattern = '*.pdsf';
+ If Error_Services('NoError') THEN
+ InitDir a_data_path:a_search_pattern;
+ a_file_list = DirList();
+ a_file_names = '';
+ LOOP
+ a_file_name = a_file_list[1, @FM];
+ a_file_list[1,Col2()] = '';
+ LOCATE a_file_name IN a_file_names BY 'AR' USING @FM SETTING Pos ELSE
+ a_file_names = INSERT(a_file_names, Pos, 0, 0, a_file_name);
+ END
+ UNTIL a_file_list = ''
+ REPEAT
+ IF a_file_names[-1, 1] = @FM THEN
+ a_file_names[-1, 1] = '';
+ END
+ a_file_count = DCOUNT(a_file_names, @FM) + (a_file_names NE '');
+ FOR a_file_loop_index = 1 TO a_file_count
+ a_file_name = a_file_names;
+ a_file_info = Dir(a_data_path:a_file_name);
+ a_file_size = a_file_info<1>;
+ Metrology_Services('LogResults', '', Machine, 'UID000', 'Read : ' : a_file_name : ', Size : ' : a_file_size);
+ a_json = JONATHAN_Services('GetJsonFromProcessDataStandardFormat', a_data_path, a_file_name);
+ IF LEN(a_json) GT 0 THEN
+ Handle = '';
+ If Assigned(Handle) else Handle = 0
+ If Handle LE 0 then
+ a_parse_error = SRP_JSON(Handle, 'PARSE', a_json);
+ IF a_parse_error EQ '' THEN
+ BEGIN CASE
+ CASE a_file_name _EQC 'BIORAD4_250519112453000.pdsf'
+ RunData = JONATHAN_Services('GetStratus', Handle);
+ CASE a_file_name _EQC 'N/A'
+ RunData = JONATHAN_Services('GetBioRadEPPFQA', Handle);
+ CASE a_file_name _EQC 'BIORAD2_250519080832000.pdsf'
+ RunData = JONATHAN_Services('GetBioRad', Handle);
+ CASE a_file_name _EQC 'CDE5_250516142018000.pdsf'
+ RunData = JONATHAN_Services('GetCDE', Handle);
+ CASE a_file_name _EQC 'HGCV2_250516152647000.pdsf'
+ RunData = JONATHAN_Services('GetHgCV', Handle);
+ CASE a_file_name _EQC 'TENCOR2_250516152839000.pdsf'
+ RunData = JONATHAN_Services('GetTencor', Handle);
+ CASE a_file_name _EQC 'x-SP101_250424015623000.pdsf'
+ RunData = JONATHAN_Services('GetSP1', Handle);
+ CASE Otherwise$
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Not mapped!');
+ END CASE
+ SRP_JSON(Handle, 'RELEASE');
+ END ELSE
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse PDSF json');
+ END
+ END
+ END ELSE
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to get PDSF json');
+ END
+ NEXT a_file_loop_index
+ END ELSE
+ Metrology_Services('LogResults', '', '', 'UID001', Error_Services('GetMessage'));
+ END
+
+
+Function Metrology_Services(@Service, @Params)
+/***********************************************************************************************************************
+
+ This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
+ permission from SRP Computer Solutions, Inc.
+
+ Name : Metrology_Services
+
+ Description : Handler program for all module related services.
+
+ Notes : The generic parameters should contain all the necessary information to process the services. Often
+ this will be information like the data Record and Key ID.
+
+ Parameters :
+ Service [in] -- Name of the service being requested
+ Param1-10 [in/out] -- Additional request parameter holders
+ Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
+
+ Metadata :
+ UID000 - 'Success'
+ UID001 - Failure. See the description in the log for further details.
+
+ History : (Date, Initials, Notes)
+ 09/04/16 dmb Original programmer. - [EPIOI-8]
+ 01/03/18 dmb Fix logic for Tencor and SP1 imports to correctly identify the value index for imported
+ data.
+ 02/23/18 dmb Add support for the special 14 point thickness reading.
+ 03/16/18 dmb Change logic to perform recipe matching for SP1.
+ 04/26/18 djs Added logic within ImportTencorData to ensure Tencor recipe matches SurfScan list.
+ 06/06/18 djs Added logic within LoadRunDataToDatabase to store the 14 point QA THICK_ONLY data points.
+ Previously only the average of these points was being stored. Also added logic within
+ ImportHgCVData to store the HgCV QA data points.
+ 06/08/18 djs Added logic within LoadRunDataToDatabase to store the Min and Max of the data points.
+ 06/12/18 djs Added logic within ImportedHgCVData to store the HgCV phase angle data points
+ 06/19/18 djs Added logic within ImportHgCVData to store additional QA Metrology Data.
+ Previously only the average of the imported data points was being stored.
+ Now, in addition to the average, the min, max, edge mean delta, and range percent
+ of the QA data points are being calculated and stored in the WO_MAT_QA table.
+ Finally, the data points themselves are also now being stored in the WO_MAT_QA table.
+ 07/23/18 djs Added logic with the ImportBioRadData service to differentiate 6 inch THICK_ONLY QA
+ metrology tests from traditional RDS tests. Also added code to store this data within the
+ WO_MAT_QA database table.
+ 09/18/18 djs Added code within the ImportTencorData service to post wafer image pdfs to a staging table
+ where they will be stored locally on the App server.
+ 09/11/19 fdr Add new service "ImportStratusData"
+ 12/05/24 djs Updated GetIQSViolations service to store reactor violations in the respective reactor record.
+
+***********************************************************************************************************************/
+
+#pragma precomp SRP_PreCompiler
+
+$insert LOGICAL
+$insert SERVICE_SETUP
+$insert RDS_EQUATES
+$insert PROD_SPEC_EQUATES
+$insert RDS_LAYER_EQUATES
+$insert PRS_LAYER_EQUATES
+$insert RDS_TEST_EQUATES
+$insert TOOL_CLASS_EQUATES
+$insert TEST_POINT_MAP_EQUATES
+$insert CLEAN_INSP_EQUATES
+$insert REACT_RUN_EQUATES
+$insert REACTOR_EQUATES
+$insert WO_MAT_QA_EQUATES
+$insert PRS_STAGE_EQUATES
+$insert SRPMail_Inserts
+$insert WO_MAT_EQUATES
+$Insert NOTIFICATION_EQUATES
+$Insert RLIST_EQUATES
+$Insert WM_OUT_EQUATES
+$Insert IQS_VIOL_DATA_EQUATES
+
+Common /MetrologyServices/ MachineType@, RDSNo@
+
+Equ RETRY_ATTEMPTS$ TO 3
+Equ MINUTES_UNTIL_RETRY$ TO 3
+
+Equ ORP$THICK_READS TO 1
+Equ ORP$SHEET_RHO_READS TO 2
+Equ ORP$HGCV1_READS TO 3
+
+Equ EPI_READS$READ_NO TO 1
+Equ EPI_READS$THICKNESS TO 2
+Equ EPI_READS$SHEET_RHO TO 3
+Equ EPI_READS$HGCV1 TO 4
+Equ EPI_READS$HGCV2 TO 5
+
+Equ Tab$ to \09\
+Equ CRLF$ to \0D0A\
+Equ LF$ to \0A\
+Equ Comma$ to ','
+
+Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON
+Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Set_Status, QA_Services, obj_Notes
+Declare subroutine Logging_Services, SRP_Send_Mail, SRP_Run_Command, PM_Services, Httpclient_Services
+Declare subroutine Tool_Services, Mona_Services, Reactor_Services
+Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services, UCase
+Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Min, Max
+Declare function QA_Services, SRP_Join_Arrays, Get_Status, Obj_Clean_Insp, Datetime, SRP_Datetime
+Declare function Httpclient_Services, PM_Services, Signature_Services, SRP_Array, Math_Services
+Declare function Tool_Class_Services, obj_wo_mat
+Declare function SRP_String
+
+LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Metrology'
+LogDate = Oconv(Date(), 'D4/')
+LogTime = Oconv(Time(), 'MTS')
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Tencor Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objTencorLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' HgCV Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objHgCVLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' CDE Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objCDELog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Biorad Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objBioradLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Stratus Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objStratusLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SP1 Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objSP1Log = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SPV Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objSPVLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SRP Metrology Log.csv'
+Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Type' : @FM : 'UID' : @FM : 'Notes'
+objSRPLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Metrology Performance Log.csv'
+Headers = 'Logging DTM' : @FM : 'Machine Type' : @FM : 'RDS Key ID': @FM : 'Notes'
+objPerfLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\SOD'
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SOD Performance Log.csv'
+Headers = 'Logging DTM' : @FM : 'Machine Type' : @FM : 'RDS Key ID': @FM : 'Notes'
+objSODPerfLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\POST'
+LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' POST Performance Log.csv'
+Headers = 'Logging DTM' : @FM : 'Machine Type' : @FM : 'RDS Key ID': @FM : 'Notes'
+objPOSTPerfLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
+
+LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
+
+GoToService else
+ Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
+end
+
+Return Response else ''
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Services
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+//----------------------------------------------------------------------------------------------------------------------
+// LaunchMetrologyViewer
+//
+// Launches the metrology viewer URL with the client's default browser.
+//----------------------------------------------------------------------------------------------------------------------
+Service LaunchMetrologyViewer
+
+ MetrologyURL = Environment_Services('GetMetrologyViewerURL')
+ Command = 'start ':MetrologyURL
+ SRP_Run_Command(Command)
+
+end service
+
+
+Service GetJsonFromProcessDataStandardFormat(Text)
+ json = '';
+ HeaderId = -1;
+ SubgroupId = -1;
+ FoundEndOfFile = False$;
+ SWAP '|' WITH @VM IN Text;
+ SWAP CRLF$ WITH @FM IN Text;
+ LineCount = DCOUNT(Text, @FM);
+ FOR LineLoopIndex = 1 TO LineCount
+ Line = Text;
+ IF FoundEndOfFile EQ True$ THEN
+ json = json:Line;
+ END
+ IF Line EQ 'EOF' THEN
+ FoundEndOfFile = True$;
+ Line = Text;
+ Convert Tab$ to @FM IN Line
+ SWAP '=' WITH @VM IN Line;
+ SWAP ';' WITH @FM IN Line;
+ IF Line<2, 1> EQ 'B_HeaderId' THEN
+ HeaderId = Line<2, 2>
+ END
+ IF Line<3, 1> EQ 'B_SubgroupId' THEN
+ SubgroupId = Line<3, 2>
+ END
+ END
+ NEXT LineLoopIndex
+ Response = json;
+end service
+
+
+Service GetStratus(Handle)
+ Result = ''; // Service ImportStratusData(
+ Offset = 1
+ FieldPosition = 13
+ FieldPositionIncrement = 2
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex EQ 1 THEN
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DateTime'); // Timestamp
+ Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].MesEntity'); // Tool
+ Result<4> = 'FQA Thickness'; // DataType
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Employee'); // Operator
+ Result<6> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Recipe'); // Recipe
+ Result<7> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Reactor'); // Reactor
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSNo
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
+ Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Batch'); // BatchID
+ Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Cassette'); // Cassette
+ Result<12> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].GradeMean'); // ThickAvg
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Slot'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Mean'); // DataPoint
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetBioRad(Handle)
+ Result = ''; // Service ImportBioRadData(
+ Offset = 1
+ FieldPosition = 13
+ FieldPositionIncrement = 2
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex EQ 1 THEN
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DateTime'); // TimeStamp
+ Result<4> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Recipe'); // ScanRecipe
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Reactor'); // ReactorID
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Reactor'); // ToolID
+ Result<6> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
+ Result<7> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZone
+ Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // DataSlotId
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Position'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Thickness'); // DataPoint
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetCDE(Handle)
+ Result = ''; // Service ImportCDEData(
+ Offset = 3
+ FieldPosition = 23
+ FieldPositionIncrement = 5
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex EQ 1 THEN
+ Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RecipeName'); // ScanRecip
+ Result<6> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Reactor'); // ReactorID
+ Result<7> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Layer'); // RunDataLayer
+ Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Zone'); // RunDataZo
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].InferredPoint'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Data'); // DataPoint
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].MeritGOF'); // N/A
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetHgCV(Handle)
+ Result = ''; // Service ImportHgCVData(
+ Offset = 5
+ PhaseOffset = 7
+ FieldPosition = 53
+ FieldPositionIncrement = 9
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex EQ 1 THEN
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].MesEntity'); // ToolID
+ Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Reactor'); // ReactorID
+ Result<4> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
+ Result<5> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].PSN'); // PSN
+ Result<8> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Wafer'); // LayerZonePair
+ Result<11> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
+ END
+ ForOffset = (RecordIndex - 1) * FieldPositionIncrement;
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Site'); // Position
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RhoAvg'); // HgCVDataPoint
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Phase'); // PhaseDataPoint
+ Result = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Grade'); // N/A
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetTencor(Handle)
+ Result = ''; // Service ImportTencorData(
+ Result<1, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<1, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<1, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<1, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<1, 1>
+ IF RecordIndex EQ 1 THEN
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
+ Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].HazeAverageAvg'); // HazeAvg
+ Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
+ Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].WaferRecipe'); // ScanRecipe
+ Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].SumOfDefectsAvg'); // SoDAvg
+ Result<40> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].SumOfDefectsMax'); // SoDMax
+ Result<41> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].SumOfDefectsMin'); // SoDMin
+ Result<43> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].MesEntity'); // ScanTool
+ END
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+Service GetSP1(Handle)
+ Result = ''; // Service ImportSP1Data(
+ Result<5, 1> = SRP_JSON(Handle, 'GETVALUE', 'Count');
+ Result<5, 2> = SRP_JSON(Handle, 'GETVALUE', 'Sequence');
+ Result<5, 3> = SRP_JSON(Handle, 'GETVALUE', 'HeaderId');
+ Result<5, 4> = SRP_JSON(Handle, 'GETVALUE', 'SubgroupId');
+ FOR RecordIndex = 1 TO Result<5, 1>
+ IF RecordIndex EQ 1 THEN
+ Result<9> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Date'); // Timestamp
+ Result<10> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnHazeAvgMean'); // HazeAvg
+ Result<28> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].RDS'); // RDSKeyID
+ Result<30> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].Session'); // ScanRecipe
+ IsMisfit = IndexC(Result<30>, 'MISFIT', 1)
+ IF IsMisfit THEN
+ Result<3> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMean'); // SoDAvg
+ Result<2> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMax'); // SoDMax
+ Result<1> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMin'); // SoDMin
+ END ELSE
+ Result<39> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMean'); // SoDAvg
+ Result<40> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMax'); // SoDMax
+ Result<41> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAllMin'); // SoDMin
+ END
+ Result<43> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].MesEntity'); // ScanTool
+ Result<44> = SRP_JSON(Handle, 'GETVALUE', 'Records[':RecordIndex:'].DcnAreaMean'); // DCNMM2
+ END
+ NEXT RecordIndex
+ Response = Result;
+end service
+
+
+//----------------------------------------------------------------------------------------------------------------------
+// ImportMetrologyFiles
+//
+// Looks for available Metrology files that are ready to be imported into the MES system.
+//----------------------------------------------------------------------------------------------------------------------
+Service ImportMetrologyFiles(Machine)
+ If Machine NE '' then
+ hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
+ Lock hSysLists, ServiceKeyID:'*':Machine then
+
+ ********************************
+ * Verify Metrology data folder *
+ ********************************
+
+ Begin Case
+ Case Machine _EQC 'Tencor'
+ SearchPattern = '*.txt';
+ DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSFS6420\Source\MET08DDUPSFS6420\'
+ Case Machine _EQC 'HgCV'
+ SearchPattern = '*.txt';
+ DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESIHGCV\Source\MET08RESIHGCV\'
+ Case Machine _EQC 'CDE'
+ SearchPattern = '*.pdsf';
+ DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESIMAPCDE\Source\MET08RESIMAPCDE\'
+ Case Machine _EQC 'Biorad'
+ SearchPattern = '*.txt';
+ DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08THFTIRQS408M\Source\MET08THFTIRQS408M\'
+ Case Machine _EQC 'Stratus'
+ SearchPattern = '*.txt';
+ DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08THFTIRSTRATUS\Source\MET08THFTIRSTRATUS\'
+ Case Machine _EQC 'SP1'
+ SearchPattern = '*.txt';
+ DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSP1TBI\Source\MET08DDUPSP1TBI\'
+ Case Machine _EQC 'SPV'
+ SearchPattern = '*.txt';
+ DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESISRP2100\Source\MET08RESISRP2100\'
+ Case Machine _EQC 'SRP'
+ SearchPattern = '*.txt';
+ DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08ANLYSDIFAAST230\Source\MET08ANLYSDIFAAST230\'
+ Case Otherwise$
+ SearchPattern = '*.txt';
+ Error_Services('Add', 'Error in ':Service:' service. Unsupported Machine "':Machine:'" passed into service')
+ End Case
+
+ If Error_Services('NoError') then
+
+ InitDir DataPath:SearchPattern
+ FileList = DirList()
+ FileNames = ''
+ LOOP
+ FileName = FileList[1,@FM]
+ FileList[1,Col2()] = ""
+
+ LOCATE FileName IN FileNames BY 'AR' USING @FM SETTING Pos ELSE
+ FileNames = INSERT(FileNames,Pos,0,0,FileName)
+ END
+ UNTIL FileList = ""
+ REPEAT
+ IF FileNames[-1,1] = @FM THEN
+ FileNames[-1,1] = ''
+ END
+
+ FileCnt = COUNT(FileNames,@FM) + (FileNames NE '')
+ FOR FileLoopIndex = 1 TO FileCnt
+
+ ***********************
+ * Read metrology file *
+ ***********************
+ ProcessNow = True$
+ FileName = FileNames
+ ImportFileList = Database_Services('ReadDataRow', 'APP_INFO', UCase(Machine):'_FILE_LIST')
+ ImportAttemptCounts = Database_Services('ReadDataRow', 'APP_INFO', UCase(Machine):'_ATTEMPT_COUNTS')
+ ImportAttemptDTMs = Database_Services('ReadDataRow', 'APP_INFO', UCase(Machine):'_ATTEMPT_DTMS')
+ CurrDTM = Datetime()
+ Locate FileName in ImportFileList using @FM setting FilePos then
+ LastAttemptDTM = ImportAttemptDTMs
+ MinutesSince = SRP_Datetime('MinuteSpan', LastAttemptDTM, CurrDTM)
+ If MinutesSince GE MINUTES_UNTIL_RETRY$ then
+ ImportAttempts = ImportAttemptCounts
+ ImportAttempts += 1
+ ImportAttemptCounts = ImportAttempts
+ ImportAttemptDTMs = CurrDTM
+ end else
+ ProcessNow = False$
+ end
+ end else
+ ImportFileList = FileName
+ ImportAttempts = 1
+ ImportAttemptCounts = ImportAttempts
+ ImportAttemptDTMs = CurrDTM
+ end
+
+ If ProcessNow then
+
+ FileInfo = Dir(DataPath:FileName)
+ FileSize = FileInfo<1>
+ Metrology_Services('LogResults', '', Machine, 'UID000', 'Dir : ' : FileName : ', Size : ' : FileSize)
+
+ ImportStartTime = Time()
+
+ Metrology_Services('LogResults', '', Machine, 'UID000', 'Read : ' : FileName : ', Size : ' : FileSize)
+
+ // Copy Run Data files to repository for troubleshooting purposes
+ Begin Case
+ Case Machine _EQC 'Tencor'
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08DDUPSFS6420\Source\MET08DDUPSFS6420\'
+ Case Machine _EQC 'HgCV'
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08RESIHGCV\Source\MET08RESIHGCV\'
+ Case Machine _EQC 'CDE'
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08RESIMAPCDE\Source\MET08RESIMAPCDE\'
+ Case Machine _EQC 'Biorad'
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08THFTIRQS408M\Source\MET08THFTIRQS408M\'
+ Case Machine _EQC 'Stratus'
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08THFTIRSTRATUS\Source\MET08THFTIRSTRATUS\'
+ Case Machine _EQC 'SP1'
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08DDUPSP1TBI\Source\MET08DDUPSP1TBI\'
+ Case Machine _EQC 'SPV'
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08RESISRP2100\Source\MET08RESISRP2100\'
+ Case Machine _EQC 'SRP'
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08ANLYSDIFAAST230\Source\MET08ANLYSDIFAAST230\'
+ End Case
+
+ IF SearchPattern = '*.pdsf' THEN
+ OSREAD Text FROM DataPath:FileName THEN
+ json = Metrology_Services('GetJsonFromProcessDataStandardFormat', Text);
+ END ELSE
+ json = '';
+ END
+ IF LEN(json) GT 0 THEN
+ RunData = Metrology_Services('GetRunData', Machine, json);
+ END ELSE
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to get PDSF json');
+ END
+ END ELSE
+
+ OSREAD RunData FROM DataPath:FileName THEN
+ SWAP '|' WITH @VM IN RunData
+ SWAP CRLF$ WITH @FM IN RunData
+
+ LOOP
+ LastChar = RunData[-1,1]
+ UNTIL LastChar NE @FM
+ RunData[-1,1] = ''
+ REPEAT
+ Convert Tab$ to @FM in RunData
+ END else
+ Metrology_Services('LogResults', '', Machine, 'UID001', 'Read : ' : FileName : ', Size : ' : FileSize)
+ end
+ END
+
+ *************************
+ * Import metrology data *
+ *************************
+
+ IF RunData NE '' then
+ Metrology_Services('ImportMetrologyRunData', Machine, DataPath, FileName, RunData)
+ END ELSE
+ Error_Services('Add', 'RunData argument was missing')
+ Metrology_Services('LogResults', '', '', 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ END
+
+ If Error_Services('NoError') then
+ Continue = True$
+ end else
+ ErrorMessage = Error_Services('GetMessage')
+ FQAError = IndexC(ErrorMessage, 'FQA has already been signed', 1)
+ If ( Index(ErrorMessage, 'UID002', 1) and (ImportAttempts LE RETRY_ATTEMPTS$) and Not(FQAError) ) then
+ Continue = False$
+ end else
+ Continue = True$
+ end
+ end
+
+ ******************************
+ * Delete metrology data file *
+ ******************************
+ If (Continue) then
+ Status() = 0
+ OSDELETE DataPath:FileName ;* Deletes local copy of data file
+ ImportFileList = Delete(ImportFileList, FilePos, 0, 0)
+ ImportAttemptCounts = Delete(ImportAttemptCounts, FilePos, 0, 0)
+ ImportAttemptDTMs = Delete(ImportAttemptDTMs, FilePos, 0, 0)
+ ErrCode = Status()
+ If ErrCode EQ 0 then
+ Metrology_Services('LogResults', '', Machine, 'UID000', 'Delete : ' : FileName : ', Size : ' : FileSize)
+ end else
+ Metrology_Services('LogResults', '', Machine, 'UID001', 'Delete : ' : FileName : ', Size : ' : FileSize : ', Error : ' : ErrCode)
+ end
+ END else
+
+ ErrorMessage = Error_Services('GetMessage')
+ MetrologyLog = Database_Services('ReadDataRow', 'SYSLISTS', UCase(Machine):'_METROLOGY_LOG')
+ MetrologyLog := ErrorMessage : @FM
+ Database_Services('WriteDataRow', 'SYSLISTS', UCase(Machine):'_METROLOGY_LOG', MetrologyLog, True$)
+ end
+
+ Database_Services('WriteDataRow', 'APP_INFO', UCase(Machine):'_FILE_LIST', ImportFileList)
+ Database_Services('WriteDataRow', 'APP_INFO', UCase(Machine):'_ATTEMPT_COUNTS', ImportAttemptCounts)
+ Database_Services('WriteDataRow', 'APP_INFO', UCase(Machine):'_ATTEMPT_DTMS', ImportAttemptDTMs)
+
+ end
+
+ NEXT FileLoopIndex
+
+ end else
+ Metrology_Services('LogResults', '', '', 'UID001', Error_Services('GetMessage'))
+ end
+ Unlock hSysLists, ServiceKeyID:'*':Machine else Null
+ end
+ end else
+ Metrology_Services('LogResults', '', '', 'UID001', 'Null Machine passed into service')
+ end
+
+end service
+
+
+Service GetRunData(Machine, json)
+
+ Result = '';
+ Handle = '';
+ If Assigned(Handle) else Handle = 0
+ If Handle LE 0 then
+ ParseError = SRP_JSON(Handle, 'PARSE', json);
+ IF ParseError EQ '' THEN
+ Begin Case
+ Case Machine _EQC 'Stratus'
+ Result = Metrology_Services('GetStratus', Handle);
+
+ Case Machine _EQC 'Biorad'
+ Result = Metrology_Services('GetBiorad', Handle);
+
+ Case Machine _EQC 'CDE'
+ Result = Metrology_Services('GetCDE', Handle);
+
+ Case Machine _EQC 'HgCV'
+ Result = Metrology_Services('GetHgCV', Handle);
+
+ Case Machine _EQC 'SP1'
+ Result = Metrology_Services('GetSP1', Handle);
+
+ Case Machine _EQC 'Tencor'
+ Result = Metrology_Services('GetTencor', Handle);
+
+ End Case
+ SRP_JSON(Handle, 'RELEASE');
+ END ELSE
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse PDSF json');
+ END
+ END
+ Response = Result;
+end service
+
+
+//----------------------------------------------------------------------------------------------------------------------
+// ImportMetrologyRunData
+//
+// RunData. - [Required]
+//
+// Imports the metrology run data into the RDS_TEST database table. Returns True$ if successful and False$ if
+// unsuccessful.
+//----------------------------------------------------------------------------------------------------------------------
+Service ImportMetrologyRunData(Machine, DataPath, FileName, RunData)
+
+ // Scan the run data for machine specific information. Then call the relevant update service for the specific
+ // machine.
+ ResourceID = Field(FileName, ' ', 1, 1)
+ IsViewerFile = Index(FileName, 'Viewer', 1)
+ Begin Case
+ Case Machine _EQC 'Stratus'
+ PSN = RunData<9>
+ QualFile = ( (PSN EQ 'T-Low') or (PSN EQ 'T-Mid') or (PSN EQ 'T-High') or (PSN EQ 'T_LOW') or (PSN EQ 'T_MID') or (PSN EQ 'T_HIGH') )
+ IF QualFile THEN
+ Metrology_Services('ImportStratusQualData', RunData, ResourceID, PSN)
+ END ELSE
+ Metrology_Services('ImportStratusData', RunData, ResourceID, PSN)
+ END
+ MachineType@ = 'Stratus'
+
+ Case Machine _EQC 'Biorad'
+ PSN = RunData<7>
+ QualFile = ( (PSN EQ 'T-Low') or (PSN EQ 'T-Mid') or (PSN EQ 'T-High') or (PSN EQ 'T_LOW') or (PSN EQ 'T_MID') or (PSN EQ 'T_HIGH') )
+ IF QualFile THEN
+ Metrology_Services('ImportBioRadQualData', RunData, ResourceID, PSN)
+ END ELSE
+ Metrology_Services('ImportBioRadData', RunData, ResourceID, IsViewerFile, PSN, FileName)
+ END
+ MachineType@ = 'Bio-Rad'
+
+ Case Machine _EQC 'CDE'
+ PSN = RunData<8>
+ QualFile = ( (PSN EQ 'RLOW_STD') or (PSN EQ 'RMID_STD') or (PSN EQ 'RHI_STD') or (PSN EQ 'THINSPC') )
+ IF QualFile THEN
+ Metrology_Services('ImportCDEQualData', RunData, ResourceID, PSN)
+ END ELSE
+ Metrology_Services('ImportCDEData', RunData, ResourceID, IsViewerFile, PSN)
+ END
+ MachineType@ = 'CDE'
+
+ Case Machine _EQC 'HgCV'
+ PSN = RunData<5>
+ QualFile = ( (PSN EQ 'Low') or (PSN EQ 'Mid') or (PSN EQ 'High') or (PSN EQ 'Thin') )
+ IF QualFile THEN
+ END ELSE
+ Metrology_Services('ImportHgCVQualData', RunData, ResourceID, PSN)
+ Metrology_Services('ImportHgCVData', RunData, ResourceID, IsViewerFile, PSN)
+ END
+ MachineType@ = 'HgProbe'
+
+ Case Machine _EQC 'SP1'
+ Metrology_Services('ImportSP1Data', RunData)
+ MachineType@ = 'SP1'
+
+ Case Machine _EQC 'Tencor'
+ Metrology_Services('ImportTencorData', RunData)
+ MachineType@ = 'TENCOR'
+
+ Case Machine _EQC 'SRP'
+ Error_Services('Add', 'SRP data import is currently disabled.')
+ Metrology_Services('LogResults', '', '', 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ MachineType@ = 'SRP'
+
+ Case Machine _EQC 'SPV'
+ Error_Services('Add', 'SPV data import is currently disabled.')
+ Metrology_Services('LogResults', '', '', 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ MachineType@ = 'SPV'
+
+ Case Otherwise$
+ Error_Services('Add', 'Unrecognized machine used to create metrology run data')
+ Metrology_Services('LogResults', '', '', 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ MachineType@ = 'Unrecognized'
+
+ End Case
+
+end service
+
+
+Service ImportStratusQualData(RunData, ResourceID, PSN)
+
+ Machine = 'Stratus'
+ URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ If Response NE '' then
+ objJSON = ''
+ If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
+ SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
+ ToolID = RunData<3>
+ TimeStamp = RunData<2>
+ If SumOOS NE '' then
+ Swap 'T_LOW' with 'T-Low' in PSN
+ Swap 'T_MID' with 'T-Mid' in PSN
+ Swap 'T_HIGH' with 'T-High' in PSN
+ Pass = (SumOOS EQ 0)
+ QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
+ StatusCode = QualResponse<1>
+ Message = QualResponse<2>
+ Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
+ end else
+ LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
+ end
+ SRP_JSON(objJSON, 'Release')
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
+ end
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
+ end
+
+end service
+
+
+Service ImportStratusData(RunData, ResourceID, PSN)
+
+ Machine = 'Stratus'
+ ParseArray = ''
+ FieldPos = 13
+ FieldPosIncrement = 2
+ Offset = 1
+ Decimals = 2
+ Timestamp = RunData<2>
+ Tool = RunData<3>
+ DataType = RunData<4>
+ Operator = RunData<5>
+ Recipe = RunData<6>
+ Reactor = RunData<7>
+ RDSNo = RunData<8> ; // If Non-EpiPro this will be an RDS Key, otherwise it will be a work order key.
+ BatchID = RunData<10>
+ Cassette = RunData<11>
+ ThickAvg = RunData<12>
+ Positions = ''
+ DataPoints = ''
+
+ Loop
+ Position = Trim(RunData)
+ DataPoint = Trim(RunData)
+ Until Position EQ ''
+ Positions := Position : @VM
+ DataPoints := DataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ Positions[-1, 1] = '' ; // Strip final @VM
+ DataPoints[-1, 1] = '' ; // Strip final @VM
+
+ // Clean the cassette user input.
+ Swap '.' with '*' in Cassette
+ Swap 'o' with '' in Cassette
+ Swap 'O' with '' in Cassette
+
+ // Determine if the key ID is an RDS or WM_OUT key
+ IsEpiPro = false$
+ Begin Case
+ // Check for WM_OUT first because a work order key may also be an RDS key.
+ Case RowExists('WM_OUT', Cassette)
+ WorkOrderNo = Field(Cassette, '*', 1)
+ CassNo = Field(Cassette, '*', 3)
+ RDSNo@ = Cassette ; // This is used for logging purposes.
+ IsEpiPro = true$
+ Case RowExists('RDS', RDSNo)
+ WorkOrderNo = Xlate('RDS', RDSNo, 'WO', 'X')
+ CassNo = Xlate('RDS', RDSNo, 'CASS_NO', 'X')
+ RDSNo@ = RDSNo ; // This is used for logging purposes.
+ Case Otherwise$
+ Error_Services('Add', 'Unrecognized cassette ID ':Cassette:'.')
+ End Case
+
+ If Error_Services('NoError') then
+
+ // Update WO_MAT record
+ StdDev = ''
+ WOMatKey = WorkOrderNo : '*' : CassNo
+ WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
+ If Error_Services('NoError') then
+ NumVals = 0
+ For each Position in Positions using @VM setting vPos
+ If Position NE '' then
+ WOMatRec = DataPoints<0, vPos>
+ NumVals += 1
+ end
+ Next Position
+ If NumVals EQ 25 then
+ StdDevType = 'POPULATION'
+ end else
+ StdDevType = 'SAMPLE'
+ end
+ If NumVals GT 0 then
+ Vals = WOMatRec
+ Vals = SRP_Array('Clean', Vals, 'Trim', @VM)
+ StdDev = Math_Services('GetStdDev', Vals, StdDevType)
+ StdDev = OConv(IConv(StdDev, 'MD3'), 'MD3')
+ end
+ Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
+ If Error_Services('HasError') then
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ // Update the WM_OUT record for EpiPro
+ If IsEpiPro then
+ NumVals = 0
+ WMORec = Database_Services('ReadDataRow', 'WM_OUT', RDSNo@)
+ For each Wafer in Positions using @VM setting dPos
+ If Wafer NE '' then
+ WMORec = DataPoints<0, dPos>
+ NumVals += 1
+ end
+ Next Wafer
+ If NumVals EQ 25 then
+ StdDevType = 'POPULATION'
+ end else
+ StdDevType = 'SAMPLE'
+ end
+ If NumVals GT 0 then
+ Vals = WMORec
+ Vals = SRP_Array('Clean', Vals, 'Trim', @VM)
+ StdDev = Math_Services('GetStdDev', Vals, StdDevType)
+ StdDev = OConv(IConv(StdDev, 'MD3'), 'MD3')
+ end
+ Database_Services('WriteDataRow', 'WM_OUT', RDSNo@, WMORec, True$, False$, True$)
+ end
+
+ // Update WO_MAT_QA record
+ StdDevMax = ''
+ WOMatQAID = WorkOrderNo : '*' : CassNo
+ WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
+ If Error_Services('NoError') then
+ SpecRecipes = WOMatQARec
+ ProfSteps = ''
+ Profiles = WOMatQARec
+ ProfileCnt = DCount(WOMatQARec, @VM)
+ Stages = WOMatQARec
+ Slots = WOMatQARec
+ SpecQty = WOMatQARec
+ pPos = ''
+ WOMatSlotProfile = obj_WO_Mat('SlotWaferIDs',WOMatKey:@RM:WOMatRec)
+ For each Profile in Profiles using @VM setting pPos
+ Stage = Stages<0, pPos>
+ If ( (Profile EQ '1ADE') and ( (Stage EQ 'QA') or (Stage EQ 'MO_QA') ) ) then
+ Slot = Slots<0, pPos>
+ If ( (Slot EQ 'A') or (SpecQty EQ 'A') or (SpecQty GT 5) ) then
+ MetMin = WOMatQARec
+ MetMax = WOMatQARec
+ StdDevMax = ((MetMin + MetMax) / 2) * (0.02)
+ StdDevMax = IConv(StdDevMax,'MD3')
+ WOMatQARec = StdDev
+ WOMatQARec = StdDevMax
+ end
+ Begin Case
+ Case Slot EQ '1'
+ For WaferIndex = 1 to 25
+ SlotIsEmpty = WOMatSlotProfile<1, WaferIndex> EQ ''
+ Until SlotIsEmpty EQ False$
+ Next WaferIndex
+ Case Slot EQ 'L'
+ For WaferIndex = 25 to 1 Step -1
+ SlotIsEmpty = WOMatSlotProfile<1, WaferIndex> EQ ''
+ Until SlotIsEmpty EQ False$
+ Next WaferIndex
+ Case Slot EQ 'A'
+ WaferIndex = 1
+ Case Otherwise$
+ WaferIndex = Slot
+ End Case
+ Locate WaferIndex in Positions using @VM setting dPos then
+ WOMatQARec = DataPoints<0, dPos>
+ end
+ end
+ Next Profile
+ Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID000', Service : ' : Success.')
+ end else
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+end service
+
+
+Service ImportBioRadQualData(RunData, ResourceID, PSN)
+
+ Machine = 'BioRad'
+ URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ If Response NE '' then
+ objJSON = ''
+ If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
+ SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
+ ToolID = RunData<5>
+ TimeStamp = RunData<2>
+ If SumOOS NE '' then
+ Swap 'T_LOW' with 'T-Low' in PSN
+ Swap 'T_MID' with 'T-Mid' in PSN
+ Swap 'T_HIGH' with 'T-High' in PSN
+ Pass = (SumOOS EQ 0)
+ QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
+ StatusCode = QualResponse<1>
+ Message = QualResponse<2>
+ Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
+ end else
+ LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
+ end
+ SRP_JSON(objJSON, 'Release')
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
+ end
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
+ end
+
+end service
+
+
+Service ImportBioRadData(RunData, ResourceID, IsViewerFile, PSN, FileName)
+
+ Machine = 'BioRad'
+ IsProdTest = False$
+ ParseArray = ''
+ FieldPos = 13
+ FieldPosIncrement = 2
+ Offset = 1
+ Decimals = 2
+ // RDS Biorad metrology file
+ Timestamp = RunData<2>
+ RDSKeyID = RunData<6>
+ RunDataLayer = RunData<8>
+ RunDataZone = RunData<9>
+ ReactorID = RunData<5>
+ ScanRecipe = RunData<4>
+ ToolClassID = 'FTIR'
+ PatternNameIndex = RDS_TEST_SPEC_THICK_MPATTERN$
+ ToolClassIndex = RDS_TEST_SPEC_THICK_MTOOL$
+ DataIndex = RDS_TEST_READ_THICK$
+ DTMIndex = RDS_TEST_TEST_RUN_THICKNESS_DTM$
+ // Clean the cassette user input.
+ Cassette = RDSKeyID
+ Swap '.' with '*' in Cassette
+ Swap 'o' with '' in Cassette
+ Swap 'O' with '' in Cassette
+ if RowExists('WM_OUT', Cassette) then
+ //Redirect to EPP FQA Import
+ Metrology_Services('ImportBioRadEPPFQAData', RunData, FileName)
+ end else
+ RDSNo@ = RDSKeyID
+ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
+ If Error_Services('NoError') then
+ WorkOrderNo = RDSRec
+
+ // HgCV Project Development Code -------------------------------------------------------------------------------
+ DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
+ If (DevelopmentFlag EQ True$) then
+ IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
+ If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
+ end
+ // -------------------------------------------------------------------------------------------------------------
+ CassNo = RDSRec
+ WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
+ GoSub ParseWorkOrder
+ IsEpiPro = (WOReactorType _EQC 'EpiPro') OR (WOReactorType _EQC 'EPP')
+
+ RunDataZone = Metrology_Services('FormatZoneKeyID', RunDataZone) ; // 1, 2
+ RunDataLayer = Metrology_Services('FormatLayerKeyID', RunDataLayer) ; // L1, L2, 2
+
+ ZoneForValidation = RunDataZone
+ LayerForValidation = RunDataLayer
+ If LayerForValidation EQ '' then
+ LayerForValidation = 'L1'
+ end
+
+ CalculatedZone = Metrology_Services('GetCalculatedZone', RDSKeyID, IsEpiPro, RunDataZone)
+ If RunDataZone NE CalculatedZone then
+ Error_Services('Add', 'Entered Zone [' : RunDataZone : '] and calculated Zone [' : CalculatedZone : '] do not match.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedZone to RunDataZone
+
+ CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone, IsEpiPro, RunDataLayer)
+ If (RunDataLayer NE CalculatedLayer) then
+ Error_Services('Add', 'Entered Layer [' : RunDataLayer : '] and calculated Layer [' : CalculatedLayer : '] do not match for the Zone [' : RunDataZone : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedLayer to RunDataLayer
+
+ ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
+ If Error_Services('NoError') then
+ ReactorType = ReactorRec
+ If ReactorType _EQC 'EpiPro' OR ReactorType _EQC 'EPP' OR ReactorType _EQC 'P' then
+ TestPointMapping = True$
+ If RunDataLayer EQ '' OR RunDataZone EQ '' then
+ Message = 'Layer and Zone are required for EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end else
+ TestPointMapping = False$
+ If RunDataLayer NE '' then
+ RunDataZone = ''
+ end else
+ Message = 'Layer is required for non-EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end
+
+ If Error_Services('NoError') then
+ Positions = ''
+ DataPoints = ''
+ Loop
+ Position = Trim(RunData)
+ DataPoint = Trim(RunData)
+ Until Position EQ ''
+ Positions := Position : @VM
+ DataPoints := DataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ Positions[-1, 1] = '' ; // Strip final @VM
+ DataPoints[-1, 1] = '' ; // Strip final @VM
+ RawDataPoints = DataPoints
+ DataPoints = Iconv(DataPoints, 'MD' : Decimals)
+
+ Swap ' AM' with 'AM' in Timestamp
+ Swap ' PM' with 'PM' in Timestamp
+ Timestamp = IConv(Timestamp,'DT')
+ RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
+ NumDataPoints = DCount(DataPoints, @VM)
+ RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
+ If Error_Services('NoError') then
+ RDSTestKeyIDs = RDSLayerRec
+ Found = False$
+ If RDSTestKeyIDs NE '' then
+ For Each RDSTestKeyID in RDSTestKeyIDs using @VM setting mkPos
+ RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ RDSTestZoneID = RDSTestRec
+ // First test - Look for a Zone ID match.
+ If (RDSTestZoneID EQ RunDataZone) then
+ // A match has been found. No need to continue searching.
+ Found = True$
+ end
+ end
+ Until Found
+ Next RDSTestKeyID
+ end else
+ Error_Services('Add', 'Unable to obtain a valid Metrology Test Key ID.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ // If not found this is because there was no zone. However, if this is not EpiPro, this is still a valid
+ // test so set the found flag to true.
+ If Not(Found) AND Not(IsEpiPro) then Found = True$
+
+ If (Found EQ True$) then
+ // Check if QA Metrology run or conventional RDS Metrology run.
+ // Recipe name match requirement has been turned off per Tom Tillery. djs 10/03/18
+ Begin Case
+ Case IsProdTest
+ // WO_MAT_QA THICK_ONLY test -> import and send to SPC
+ LogPath = Environment_Services('GetSpcFilesharePath')
+ LogPath2 = Environment_Services('GetApplicationRootPath') : '\Metrology'
+ SendToSPC = False$
+ Begin Case
+ Case NumDataPoints EQ 5
+ // Create 5 point SPC file
+ objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_5Points.txt', CRLF$, Comma$, '', '', False$, True$)
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_5Points.txt', CRLF$, Comma$, '', '', False$, False$)
+ SendToSPC = True$
+ Case NumDataPoints EQ 9
+ // Create 9 point SPC file
+ objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, True$)
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, False$)
+ SendToSPC = True$
+ Case NumDataPoints EQ 10
+ objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_10Points.txt', CRLF$, Comma$, '', '', False$, True$)
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_10Points.txt', CRLF$, Comma$, '', '', False$, False$)
+ SendToSPC = True$
+ Case NumDataPoints EQ 14
+ objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, True$)
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, False$)
+ SendToSPC = True$
+ Case Otherwise$
+ // Log this as it is unexpected
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_Points_Error.txt', CRLF$, Comma$, '', '', False$, False$)
+ End Case
+
+ LogData = ''
+ LogData<1> = Oconv(Timestamp, 'DT/^HS') ; // Metrology date/time stamp
+ LogData<2> = ReactorID ; // Reactor
+ LogData<3> = RDSKeyID ; // RDS No
+ LogData<4> = RunData<7> ; // PSN
+ // Log data positions 5 through 10, 14, or 18 will be populated with data point measurements.
+ Convert @VM to @FM in RawDataPoints
+ Min = RawDataPoints<1>
+ Max = RawDataPoints<1>
+ For each DataPoint in RawDataPoints using @FM Setting DataPos
+ Min = Min(Min, DataPoint)
+ Max = Max(Max, DataPoint)
+ LogData = DataPoint
+ Next DataPoint
+ LogData := @RM : ' '
+ If SendToSPC then Logging_Services('AppendLog', objSPC, LogData, @RM, @FM, True$)
+ Logging_Services('AppendLog', NotesLog, LogData, @RM, @FM, True$)
+ Average = Sum(RawDataPoints) / NumDataPoints
+ Average = Iconv(Average, 'MD3')
+ Average = Oconv(Average, 'MD3')
+ WOMatKey = Xlate('RDS', RDSKeyID, 'WO_MAT_KEY', 'X')
+ WOMatQAID = WorkOrderNo : '*' : CassNo
+ WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
+ SpecRecipes = WOMatQARec
+
+ WOStepNo = RDSRec[-1, 'B*']
+ ProfSteps = ''
+ ProfileCnt = DCount(WOMatQARec, @VM)
+ For vPos = 1 to ProfileCnt
+ ProfSteps<1, vPos> = WOMatQARec : '*' : WOMatQARec
+ Next vPos
+ LastProfSig = WOMatQARec
+ SigProfKeys = 'THICK_ONLY'
+ SigCnt = DCount(SigProfKeys, @VM)
+ Stages = 'UNLOAD'
+ SigProfFound = False$
+ For Each SigProfKey in SigProfKeys using @VM setting vPos
+ Stage = Stages<1, vPos>
+ If Num(SigProfKey[1, 1]) else
+ SigProfKey = WOStepNo : SigProfKey
+ end
+ ProfStep = SigProfKey : '*' : Stage
+ Locate ProfStep in ProfSteps using @VM setting Pos then
+ SigProfFound = True$
+ UnloadSigned = Signature_Services('GetStageSummary', WoMatKey, 'UNLOAD')<2>
+ IF (Stage EQ 'UNLOAD' AND UnloadSigned EQ True$) OR Stage NE 'UNLOAD' then
+ // verify recipe is correct
+ WoMatQaRecipe = WOMatQARec
+ WoMatQaRecipeMatchesScanRecipe = ScanRecipe _EQC WoMatQaRecipe
+ If WoMatQaRecipeMatchesScanRecipe EQ False$ then
+ ErrMsg = 'Scan recipe [ ' : ScanRecipe : ' ] does not match WoMatQa recipe [ ' : WoMatQaRecipe : ' ] for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ].'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ // verify number of points is correct
+ WoMatQaToolClass = WOMatQARec
+ WoMatQaRecipePattern = WOMatQARec
+ NumDataPointsInSpec = Tool_Class_Services('GetNumberOfPointsForPattern', WoMatQaToolClass, WoMatQaRecipePattern)
+ WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints = NumDataPointsInSpec EQ NumDataPoints
+
+ If WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints EQ False$ then
+ ErrMsg = 'Scan data point count [ ' : NumDataPoints : ' ] does not match WoMatQa recipe pattern data point count [ ' : NumDataPointsInSpec : ' ] for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ].'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ If (WOMatQARec EQ '' OR IsViewerFile) then
+ If WoMatQaRecipeMatchesScanRecipe and WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints then
+ WOMatQARec = Average
+ WOMatQARec = Oconv(Iconv(Min, 'MD3'), 'MD3')
+ WOMatQARec = Oconv(Iconv(Max, 'MD3'), 'MD3')
+ SpecMin = WOMatQARec
+ SpecMax = WOMatQARec
+ For each DataPoint in RawDataPoints using @FM setting SubValuePos
+ FormatedData = Oconv(Iconv(DataPoint, 'MD3'), 'MD3')
+ If NumDataPoints LT 14 then
+ If ( ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) and (SubValuePos LT 10) ) then
+ WOMatQARec = True$
+ end
+ end else
+ If ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) then
+ WOMatQARec = True$
+ end
+ end
+ WOMatQARec = FormatedData
+ Next DataPoint
+ WOMatQARec = ''
+ WOMatQARec = ''
+ Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Unload signature must first be signed for this data to be uploaded.')
+ end
+ end
+ Until SigProfFound
+ Next SigProfKey
+ If SigProfFound EQ True$ then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Sig Prof. Found')
+ end else
+ Error_Services('Add', 'Unable to locate the signature profile [' : ProfStep : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Case Otherwise$
+ // If not an above case, then the run is a conventional THICK_ONLY RDS metrology test.
+
+ RDSLayerKeyID = RDSKeyID : '*' : LayerForValidation
+ RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
+ If Error_Services('NoError') then
+ RDSTestKeyIDs = RDSLayerRec
+
+ // Verify the scan recipe matches the spec recipe
+ RecipeMatches = Metrology_Services('ScanRecipeMatchesRdsTestSpecThickMrecipe', RDSKeyID, LayerForValidation, ScanRecipe, RDSTestKeyIDs, ZoneForValidation)
+ If RecipeMatches EQ False$ then
+ ErrMsg = 'Scan recipe [ ' : ScanRecipe : ' ] does not match RDS Test recipe for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ] zone [ ' : CalculatedZone : ' ].'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ // Verfiy the scan number of points matches the spec number of points
+ NumPointsMatches = Metrology_Services('ScanNumDataPointsMatchesRdsTestSpecThickMPattern', RDSKeyID, LayerForValidation, NumDataPoints, RDSTestKeyIDs, 'FTIR', ZoneForValidation)
+ If NumPointsMatches EQ False$ then
+ ErrMsg = 'Scan data point count [ ' : NumDataPoints : ' ] does not match RDS Test recipe pattern data point count for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ] zone [ ' : CalculatedZone : ' ].'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ If RecipeMatches and NumPointsMatches then
+ GoSub LoadRunDataToDatabase
+ end
+ end else
+ ErrMsg = 'RDS Test scan failed for RDS [' : RDSKeyID : '] layer [' : LayerForValidation : '], because unable to get RDS_LAYER record [' : RDSLayerKeyID : ']'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ End Case
+ end else
+ Error_Services('Add', 'Data type / Spec not found for Layer [' : RunDataLayer : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end
+
+end service
+
+
+Service ImportCDEQualData(RunData, ResourceID, PSN)
+
+ Machine = 'CDE'
+ ResourceID = Field(FileName, ' ', 1, 1)
+ URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ If Response NE '' then
+ If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
+ SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
+ ToolID = RunData<6>
+ TimeStamp = RunData<3>
+ If SumOOS NE '' then
+ Pass = (SumOOS EQ 0)
+ QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
+ StatusCode = QualResponse<1>
+ Message = QualResponse<2>
+ Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
+ end else
+ LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
+ end
+ SRP_JSON(objJSON, 'Release')
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
+ end
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
+ end
+
+end service
+
+
+Service ImportCDEData(RunData, ResourceID, IsViewerFile)
+
+ Machine = 'CDE'
+ ParseArray = ''
+ FieldPos = 23
+ FieldPosIncrement = 5
+ Offset = 3
+ Decimals = 3
+ Timestamp = RunData<3>
+ RDSKeyID = RunData<7>
+ RunDataLayer = RunData<9>
+ RunDataZone = RunData<10>
+ ReactorID = RunData<6>
+ ScanRecipe = RunData<5>
+ PSN = RunData<8>
+ // Regular metrology file
+ ToolClassID = '4PP'
+ PatternNameIndex = RDS_TEST_SPEC_RES_MPATTERN$
+ ToolClassIndex = RDS_TEST_SPEC_RES_MTOOL$
+ DataIndex = RDS_TEST_READ_SHEET_RHO$
+ DTMIndex = RDS_TEST_TEST_RUN_SHEET_RHO_DTM$
+ IsProdTest = False$
+ RDSNo@ = RDSKeyID
+ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
+ If Error_Services('NoError') then
+
+ // HgCV Project Development Code -------------------------------------------------------------------------------
+ DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
+ If (DevelopmentFlag EQ True$) then
+ IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
+ If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
+ end
+ // -------------------------------------------------------------------------------------------------------------
+
+ WorkOrderNo = RDSRec
+ CassNo = RDSRec
+ WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
+ GoSub ParseWorkOrder
+ IsEpiPro = (WOReactorType _EQC 'EpiPro') OR (WOReactorType _EQC 'EPP')
+
+ RunDataZone = Metrology_Services('FormatZoneKeyID', RunDataZone) ; // 1, 2
+ RunDataLayer = Metrology_Services('FormatLayerKeyID', RunDataLayer) ; // L1, L2, 2
+
+ CalculatedZone = Metrology_Services('GetCalculatedZone', RDSKeyID, IsEpiPro, RunDataZone)
+ If RunDataZone NE CalculatedZone then
+ Error_Services('Add', 'Entered Zone [' : RunDataZone : '] and calculated Zone [' : CalculatedZone : '] do not match.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedZone to RunDataZone
+
+ CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone)
+ If RunDataLayer NE CalculatedLayer then
+ Error_Services('Add', 'Entered Layer [' : RunDataLayer : '] and calculated Layer [' : CalculatedLayer : '] do not match for the Zone [' : RunDataZone : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedLayer to RunDataLayer
+
+ ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
+ If Error_Services('NoError') then
+ ReactorType = ReactorRec
+ If ReactorType _EQC 'EpiPro' OR ReactorType _EQC 'EPP' OR ReactorType _EQC 'P' then
+ TestPointMapping = True$
+ If RunDataLayer EQ '' OR RunDataZone EQ '' then
+ Message = 'Layer and Zone are required for EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end else
+ TestPointMapping = False$
+ If RunDataLayer NE '' then
+ RunDataZone = ''
+ end else
+ Message = 'Layer is required for non-EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end
+
+ If Error_Services('NoError') then
+ Positions = ''
+ DataPoints = ''
+ Loop
+ Position = Trim(RunData)
+ DataPoint = Trim(RunData)
+ Until Position EQ ''
+ Positions := Position : @VM
+ DataPoints := DataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ RawDataPoints = DataPoints
+ Positions[-1, 1] = '' ; // Strip final @VM
+ DataPoints[-1, 1] = '' ; // Strip final @VM
+ DataPoints = Iconv(DataPoints, 'MD' : Decimals)
+
+ Swap ' AM' with 'AM' in Timestamp
+ Swap ' PM' with 'PM' in Timestamp
+ Timestamp = IConv(Timestamp,'DT')
+
+ RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
+ NumDataPoints = DCount(DataPoints, @VM)
+ RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
+ If Error_Services('NoError') then
+ RDSTestKeyIDs = RDSLayerRec
+ Found = False$
+ If RDSTestKeyIDs NE '' then
+ For Each RDSTestKeyID in RDSTestKeyIDs using @VM setting mkPos
+ RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ RDSTestZoneID = RDSTestRec
+ // First test - Look for a Zone ID match.
+ If (RDSTestZoneID EQ RunDataZone) then
+ // A match has been found. No need to continue searching.
+ Found = True$
+ end
+ end
+ Until Found
+ Next RDSTestKeyID
+ end else
+ Error_Services('Add', 'Unable to obtain a valid Metrology Test Key ID.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ // If not found this is because there was no zone. However, if this is not EpiPro, this is still a valid
+ // test so set the found flag to true.
+ If Not(Found) AND Not(IsEpiPro) then Found = True$
+
+ If (Found EQ True$) then
+ If (IsProdTest EQ True$) then
+ // QA Metrology test (i.e. not RDS Metrology test)
+ Convert @VM to @FM in RawDataPoints
+ Min = RawDataPoints<1>
+ Max = RawDataPoints<1>
+ For each DataPoint in RawDataPoints using @FM Setting DataPos
+ Min = Min(Min, DataPoint)
+ Max = Max(Max, DataPoint)
+ Next DataPoint
+ Average = Sum(RawDataPoints) / NumDataPoints
+ Average = Iconv(Average, 'MD3')
+ Average = Oconv(Average, 'MD3')
+ WOMatQAID = WorkOrderNo : '*' : CassNo
+ WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
+ SpecRecipes = WOMatQARec
+ WOStepNo = RDSRec[-1, 'B*']
+ ProfStep = ''
+ ProfSteps = ''
+ ProfileCnt = DCount(WOMatQARec, @VM)
+ For vPos = 1 to ProfileCnt
+ ProfSteps<1, vPos> = WOMatQARec : '*' : WOMatQARec
+ Next vPos
+ LastProfSig = WOMatQARec
+ SigProfKeys = '1LW_RHO'
+ SigCnt = DCount(SigProfKeys, @VM)
+ Stages = 'UNLOAD'
+ SigProfFound = False$
+ UnloadSigned = Signature_Services('GetStageSummary', WOMatQAID, 'UNLOAD')<2>
+ For Each SigProfKey in SigProfKeys using @VM setting vPos
+ Stage = Stages<1, vPos>
+ if (Stage EQ 'UNLOAD' AND UnloadSigned EQ True$) OR Stage NE 'UNLOAD' then
+ If Num(SigProfKey[1, 1]) else
+ SigProfKey = WOStepNo : SigProfKey
+ end
+ ProfStep = SigProfKey : '*' : Stage
+ Locate ProfStep in ProfSteps using @VM setting Pos then
+ SigProfFound = True$
+ IF IsViewerFile OR WOMatQARec = '' then
+ WOMatQARec = Average
+ WOMatQARec = Oconv(Iconv(Min, 'MD3'), 'MD3')
+ WOMatQARec = Oconv(Iconv(Max, 'MD3'), 'MD3')
+ SpecMin = WOMatQARec
+ SpecMax = WOMatQARec
+ For each DataPoint in RawDataPoints using @FM setting SubValuePos
+ FormatedData = Oconv(Iconv(DataPoint, 'MD3'), 'MD3')
+ If ( ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) and (SubValuePos LT 10) ) then
+ WOMatQARec = True$
+ end
+ WOMatQARec = FormatedData
+ Next DataPoint
+ Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
+ end
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Unload signature must first be signed for this data to be uploaded.')
+ end
+ Until SigProfFound
+ Next SigProfKey
+ If SigProfFound EQ True$ then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success.')
+ end else
+ Error_Services('Add', 'Unable to locate the signature profile [' : ProfStep : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ GoSub LoadRunDataToDatabase
+ end
+ end else
+ Error_Services('Add', 'Data type / Spec not found for Layer [' : RunDataLayer : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+end service
+
+
+Service ImportHgCVQualData(RunData, ResourceID, PSN)
+
+ Machine = 'HgCV' /* Resistivity */
+ URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ If Response NE '' then
+ If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
+ SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
+ ToolID = RunData<2>
+ TimeStamp = RunData<11>
+ If SumOOS NE '' then
+ Pass = (SumOOS EQ 0)
+ QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
+ StatusCode = QualResponse<1>
+ Message = QualResponse<2>
+ Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
+ end else
+ LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
+ end
+ SRP_JSON(objJSON, 'Release')
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
+ end
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
+ end
+
+end service
+
+
+Service ImportHgCVData(RunData, PSN)
+
+ Machine = 'HgCV' /* Resistivity */
+ FieldPos = 53
+ FieldPosIncrement = 9
+ Offset = 5
+ PhaseOffset = 7
+ Decimals = 3
+ Timestamp = RunData<11>
+ RDSKeyID = RunData<4>
+ LayerZonePair = RunData<8>
+ ReactorID = RunData<3>
+ // Regular metrology file
+ ToolClassID = 'HGCV'
+ PatternNameIndex = RDS_TEST_SPEC_RES_MPATTERN$
+ ToolClassIndex = RDS_TEST_SPEC_RES_MTOOL$
+ DataIndex = RDS_TEST_READ_HGCV1_RES$
+ DTMIndex = RDS_TEST_TEST_RUN_HGCV_DTM$
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : ' : 'Beginning ImportHgCVData')
+ RDSNo@ = RDSKeyID
+ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
+ If Error_Services('NoError') then
+ WorkOrderNo = RDSRec
+ CassNo = RDSRec
+ WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
+ GoSub ParseWorkOrder
+ IsEpiPro = (WOReactorType _EQC 'EpiPro') OR (WOReactorType _EQC 'EPP')
+
+ Convert @Lower_Case to @Upper_Case in LayerZonePair
+ Convert 'Z' to '-' in LayerZonePair
+ Swap '--' with '-' in LayerZonePair
+ RunDataLayer = Field(LayerZonePair, '-', 1)
+ RunDataZone = Field(LayerZonePair, '-', 2)
+ RunDataZone = Metrology_Services('FormatZoneKeyID', RunDataZone) ; // 1, 2
+ RunDataLayer = Metrology_Services('FormatLayerKeyID', RunDataLayer) ; // L1, L2, 2
+
+ CalculatedZone = Metrology_Services('GetCalculatedZone', RDSKeyID, IsEpiPro, RunDataZone)
+ If RunDataZone NE CalculatedZone then
+ Error_Services('Add', 'Entered Zone [' : RunDataZone : '] and calculated Zone [' : CalculatedZone : '] do not match.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedZone to RunDataZone
+
+ CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone)
+ If RunDataLayer NE CalculatedLayer then
+ Error_Services('Add', 'Entered Layer [' : RunDataLayer : '] and calculated Layer [' : CalculatedLayer : '] do not match for the Zone [' : RunDataZone : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedLayer to RunDataLayer
+
+ ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
+ If Error_Services('NoError') then
+ ReactorType = ReactorRec
+ If ReactorType _EQC 'EpiPro' OR ReactorType _EQC 'EPP' OR ReactorType _EQC 'P' then
+ TestPointMapping = True$
+ If RunDataLayer EQ '' OR RunDataZone EQ '' then
+ Message = 'Layer and Zone are required for EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end else
+ TestPointMapping = False$
+ If RunDataLayer NE '' then
+ RunDataZone = ''
+ end else
+ Message = 'Layer is required for non-EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end
+
+ If Error_Services('NoError') then
+ Position = ''
+ Positions = ''
+ DataPoints = ''
+ HgCVDataPoints = ''
+ Loop
+ Position = Trim(RunData)
+ HgCVDataPoint = Trim(RunData)
+ Until Position EQ ''
+ Positions := Position : @VM
+ HgCVDataPoints := HgCVDataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ Positions[-1, 1] = '' ; // Strip final @VM
+ HgCVDataPoints[-1, 1] = '' ; // Strip final @VM
+
+ HgCVDataPoints = Iconv(HgCVDataPoints, 'MD' : Decimals)
+
+ Swap ' AM' with 'AM' in Timestamp
+ Swap ' PM' with 'PM' in Timestamp
+ Timestamp = IConv(Timestamp,'DT')
+
+ RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
+ NumDataPoints = DCount(HgCVDataPoints, @VM)
+ RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
+ If Error_Services('NoError') then
+ RDSTestKeyIDs = RDSLayerRec
+ Found = False$
+ If RDSTestKeyIDs NE '' then
+ For Each RDSTestKeyID in RDSTestKeyIDs using @VM setting mkPos
+ RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ RDSTestZoneID = RDSTestRec
+ // Determine if this is Hg Concentration Resistivity.
+ IsHgCvCRes = RDSTestRec _EQC 'HGCV'
+ // First test - Look for a Zone ID match.
+ If (RDSTestZoneID EQ RunDataZone) then
+ // A match has been found. No need to continue searching.
+ Found = True$
+ end
+ end
+ Until Found
+ Next RDSTestKeyID
+ If (Found EQ True$) then
+ // Only continue checking if there are data points. Otherwise, there is no data by which
+ // the code can calculate values to store.
+ If NumDataPoints GT 0 then
+ // Second test - If HgCv Res, dig deeper to see if this is a possible CRES entry..
+ If IsHgCvCRes then
+ WOMatQAID = WorkOrderNo : '*' : CassNo
+ WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
+ If Error_Services('NoError') then
+ Locate 'CRES' in WOMatQARec using @VM setting vPos then
+ Stage = WOMatQARec
+ RequireUnload = False$
+ IF (WOMatQARec EQ '' OR IsViewerFile) then
+ PhaseDataPoints = ''
+ Positions = ''
+ Position = ''
+ FieldPos = 53
+ Loop
+ Position = Trim(RunData)
+ PhaseDataPoint = Trim(RunData)
+ Until Position EQ ''
+ Positions := Position : @VM
+ PhaseDataPoints := PhaseDataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ Positions[-1, 1] = '' ; // Strip final @VM
+ PhaseDataPoints[-1, 1] = '' ; // Strip final @VM
+ PhaseDataPoints = Iconv(PhaseDataPoints, 'MD' : Decimals)
+ DataPoints = HgCVDataPoints
+ * GoSub CalculateQAData
+ Response = QA_Services('CalculateHgCVData', Datapoints)
+ HgCVMin = Response<0, 2>
+ HgCVMax = Response<0, 3>
+ HgCVAvg = Response<0, 1>
+ HgCVEdgeMean = Response<0, 4>
+ HgCVRangePct = Response<0, 5>
+ EdgeMean4mm = Response<0, 6>
+ Avg9Point = Response<0, 7>
+ EdgeMean10mm = Response<0, 8>
+ ResStdDev = Response<0, 9>
+
+ DataPoints = PhaseDataPoints
+ Response = QA_Services('CalculateHgCVData', Datapoints)
+ * GoSub CalculateQAData
+ PhaseMin = Response<0, 2>
+ PhaseMax = Response<0, 3>
+ PhaseAvg = Response<0, 1>
+ PhaseEdgeMean = Response<0, 4>
+ PhaseRangePct = Response<0, 5>
+ // Format data. Round to significant digits.
+ * HgCVAvg = Oconv(Iconv(Oconv(HgCVAvg, 'MD3L'), 'MD3L'), 'MD3L')
+ * PhaseAvg = Oconv(Iconv(Oconv(PhaseAvg, 'MD3L'), 'MD3L'), 'MD3L')
+ * HgCVMin = Oconv(Iconv(Oconv(HgCVMin, 'MD3L'), 'MD3L'), 'MD3L')
+ * HgCVMax = Oconv(Iconv(Oconv(HgCVMax, 'MD3L'), 'MD3L'), 'MD3L')
+ * PhaseMin = Oconv(Iconv(Oconv(PhaseMin, 'MD3L'), 'MD3L'), 'MD3L')
+ * PhaseMax = Oconv(Iconv(Oconv(PhaseMax, 'MD3L'), 'MD3L'), 'MD3L')
+ * HgCVEdgeMean = OConv(IConv(HgCVEdgeMean, 'MD3L'), 'MD3L')
+ * PhaseEdgeMean = Oconv(IConv(PhaseEdgeMean, 'MD3L'), 'MD3L')
+ * HgCVRangePct = Oconv(Iconv(HgCVRangePct, 'MD3L'), 'MD3L')
+ * PhaseRangePct = Oconv(Iconv(PhaseRangePct, 'MD3L'), 'MD3L')
+ WOMatQARec = HgCVAvg : @SVM : PhaseAvg
+ WOMatQARec = HgCVMin : @SVM : PhaseMin
+ WOMatQARec = HgCVMax : @SVM : PhaseMax
+ WOMatQARec = HgCVRangePct : @SVM : PhaseRangePct
+ WOMatQARec = HgCVEdgeMean : @SVM : PhaseEdgeMean
+ SpecMin = WOMatQARec
+ SpecMax = WOMatQARec
+ SpecPhaseMin = WOMatQARec
+ If SpecPhaseMin EQ '' then
+ // Phase Min Spec was not added to WO_MAT_QA record when it should have been.
+ // This bug should be fixed now, but in the meantime current records in production
+ // may not have a phase min specification value. We need to add it here. - djs - 10/15/18
+ PSN = Xlate('RDS', RDSKeyID, 'PROD_SPEC_ID', 'X')
+ If PSN NE '' then
+ PRSStageKey = PSN:'*UNLOAD'
+ Database_Services('ActivateRecord', 'PRS_STAGE', PRSStageKey)
+ MetProps = {MET_PROP}
+ Locate 'CRES' in MetProps using @VM setting PropPos then
+ SpecPhaseMinCol = {MET_PHASE_MIN}
+ SpecPhaseMin = SpecPhaseMinCol<1, PropPos>
+ WOMatQARec = SpecPhaseMin
+ end
+ end
+ end
+ CriticalPoints = '1,2,5,6,9'
+ // Store data points for HgCV Data Table Project --------------------------------------------------------------
+ For Index = 1 to NumDataPoints
+ CriticalPoint = Index(CriticalPoints, Index, 1)
+ HgCVData = Oconv(Iconv(Oconv(HgCVDataPoints<0,Index>, 'MD3L'), 'MD3L'), 'MD3L')
+ PhaseData = Oconv(Iconv(Oconv(PhaseDataPoints<0,Index>, 'MD3L'), 'MD3L'), 'MD3L')
+ If ( (HgCVData LT SpecMin) OR (HgCVData GT SpecMax) OR (PhaseData LT SpecPhaseMin) ) and CriticalPoint then
+ // Data point out of spec
+ WOMatQARec = True$
+ end
+ DataRow = HgCVData : @TM : PhaseData
+ WOMatQARec = DataRow
+ Next Index
+ // ------------------------------------------------------------------------------------------------------------
+
+ // Send data to SPC -------------------------------------------------------------------------------------------
+ LogPath = Environment_Services('GetSpcFilesharePath')
+ SpcFileDtm = OConv(Datetime(), 'DT2^HS ')
+ Convert ' ' to '_' in SpcFileDtm
+ SpcLogFilename = 'HgCV_Unload_Res_9Points_':SpcFileDtm:'.txt'
+ objSPC = Logging_Services('NewLog', LogPath, SpcLogFilename, CRLF$, Comma$, '', '', False$, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Successfully created blank SPC file.')
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Failed to create blank SPC file. Error message: ':Error_Services('GetMessage'))
+ end
+ LogData = ''
+ LogData<1> = Oconv(Timestamp, 'DT/^HS') ; // Metrology date/time stamp
+ LogData<2> = ReactorID ; // Reactor
+ LogData<3> = RDSKeyID ; // RDS No
+ LogData<4> = Xlate('RDS', RDSKeyID, 'PROD_SPEC_ID', 'X'); // PSN
+ WaferSize = Xlate('RDS', RDSKeyID, 'WAFER_SIZE', 'X')
+ WaferSize = Field(WaferSize, ' ', 3)
+ LogData<5> = WaferSize:' Inch' ; // Wafer Size
+ FormattedData = Oconv(HgCVDataPoints, 'MD3L')
+ Swap @VM with ',' in FormattedData
+ LogData<6> = FormattedData
+ LogData<7> = OConv(PhaseAvg, 'MD43L')
+ LogData<8> = OConv(HgCVAvg, 'MD43L') ; // HgCV Res Avg
+ LogData<9> = OConv(ResStdDev, 'MD83L') ; // HgCV Res Std Dev
+ LogData<10> = HgCVRangePct ; // HgCV Res Range %
+ LogData<11> = OConv(EdgeMean4mm, 'MD43L') ; // HgCV 4mm Edge Mean
+ LogData<12> = OConv(Avg9Point, 'MD83L') ; // HgCV 9 Point Mean
+ LogData<13> = OConv(EdgeMean10mm, 'MD43L') ; // HgCV 10mm Edge Mean
+ LogData<14> = HgCVEdgeMean ; // HgCV Edge Mean Delta %
+ LogData := @RM : ' '
+ Logging_Services('AppendLog', objSPC, LogData, @RM, @FM, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Successfully updated SPC file with metrology data.')
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Failed to update SPC file with metrology data. Error message: ':Error_Services('GetMessage'))
+ end
+ // ------------------------------------------------------------------------------------------------------------
+
+ WOMatQARec = ''
+ WOMatQARec = ''
+ Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
+ If Error_Services('NoError') then
+ RDSTestRec = Timestamp
+ // Save results
+ Database_Services('WriteDataRow', 'RDS_TEST', RDSTestKeyID, RDSTestRec, True$, False$, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success - Hg CRes.')
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID002', Service : ' : UID002 - ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ // We know it is a CRES test, so we can now safely import the Phase Angle data
+
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
+ end
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ // The correct RDSTestKeyID was found. If this is a HgCv measurement and HgConcentration RDS test,
+ // the data has already been written to the database in the above logic. In all other cases, the
+ // data needs to be written to the database using the following logic that works off of the test
+ // point map.
+ DataPoints = HgCVDataPoints
+ GoSub LoadRunDataToDatabase
+ end
+ end else
+ Error_Services('Add', 'No data points found.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Error_Services('Add', 'Data type / Spec not found for Layer [' : RunDataLayer : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Error_Services('Add', 'Unable to obtain a valid Metrology Test Key ID.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+end service
+
+
+Service ImportTencorData(RunData)
+
+ ErrorMessage = ''
+ Machine = 'Tencor'
+ Timestamp = RunData<9>
+ HazeAvg = RunData<10>
+ RDSKeyID = RunData<28>
+ ScanRecipe = RunData<30>
+ SoDAvg = RunData<39>
+ SoDMax = RunData<40>
+ SoDMin = RunData<41>
+ ScanTool = RunData<43>
+ Swap '%' with ' ' in ScanTool
+ RDSNo@ = RDSKeyID
+ Convert @Lower_Case to @Upper_Case in ScanTool
+
+ Swap ' AM' with 'AM' in Timestamp
+ Swap ' PM' with 'PM' in Timestamp
+ Timestamp = IConv(Timestamp,'DT')
+
+ If RowExists('RDS', RDSKeyID) then
+ // Try to read the CleanInsp datarow. Use this to identify the RDSKeyID.
+ ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSKeyID)
+ If Error_Services('NoError') then
+ // Get the PSN to determine if this recipe is part of the LWI stage or the POST stage.
+ PSN = Xlate('RDS', RDSKeyID, 'PROD_SPEC_ID', 'X')
+ PRSStageKeys = Xlate('PROD_SPEC', PSN, 'PRS_STAGE_KEY', 'X')
+ StageFound = False$
+ Stage = ''
+ For each PRSStageKey in PRSStageKeys using @VM setting kPos
+ SSRecipes = Xlate('PRS_STAGE', PRSStageKey, 'SURFSCAN_RECIPE', 'X')
+ Locate ScanRecipe in SSRecipes using @VM setting rPos then
+ StageFound = True$
+ Stage = Field(PRSStageKey, '*', 2, 1)
+ end
+ Next PRSStageKey
+ CIKeyStages = ReactRunRec
+ CIKeyIDs = ReactRunRec
+ Locate Stage in CIKeyStages using @VM setting vPos then
+ // Stage is prescribed or user created the record from the UI.
+ CIKeyID = CIKeyIDs<0, vPos>
+ If (CIKeyID NE '') then
+ HaveLock = Database_Services('GetKeyIDLock', 'CLEAN_INSP', CIKeyID)
+ If HaveLock EQ True$ then
+ If ScanRecipe NE '' then
+ CleanInspRec = Database_Services('ReadDataRow', 'CLEAN_INSP', CIKeyID)
+ NumRecipes = DCount(CleanInspRec, @VM)
+ ScanIndex = NumRecipes + 1
+ NumTools = DCount(CleanInspRec, @VM)
+ SpecRecipeList = CleanInspRec
+ NumWfrs = 0
+ Locate ScanRecipe In SpecRecipeList Using @VM Setting RecipeIndex then
+ // Recipe found in spec list
+ SpecSampleQty = CleanInspRec
+ SODWaferArray = ''
+ SODStartTime = Time()
+ SODWaferArray = QA_Services('GetSODPerWafer', RDSKeyID, ScanRecipe, Timestamp)
+ SODStopTime = Time()
+ TimeTaken = SODStopTime - SODStartTime
+ LogData = ''
+ LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
+ LogData<2> = MachineType@
+ LogData<3> = RDSNo@
+ LogData<4> = 'Time taken to import SOD data: ':TimeTaken:' seconds.'
+ Logging_Services('AppendLog', objSODPerfLog, LogData, @RM, @FM)
+ If SODWaferArray NE '' then
+ WaferNos = SODWaferArray<1>
+ SODVals = SODWaferArray<2>
+ SortVals = SODWaferArray<3>
+ For each Wfr in SODVals using @VM setting vPos
+ NumWfrs += (Wfr NE '')
+ Next Wfr
+ For each WaferNo in WaferNos using @VM
+ If WaferNo NE '' then
+ CleanInspRec = SODVals<1,WaferNo>
+ CleanInspRec = SortVals<1,WaferNo>
+ QA_Services('PostWaferImageRequest', RDSKeyID, WaferNo, ScanRecipe)
+ end
+ Next Wafer
+ end
+ // Since a matching recipe was found, clear the recipe mismatch field in case it was
+ // previously set by a user attempting to load rundata with the wrong recipe name.
+ CleanInspRec = ''
+ If NumTools GT NumRecipes then
+ NumRecipes = NumTools
+ end
+ NumRecipes += 1
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_RECIPE$, NumRecipes, 0, ScanRecipe)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_TOOL$, NumRecipes, 0, ScanTool)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$, NumRecipes, 0, SoDMin)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, NumRecipes, 0, SoDMax)
+ SoDAvg = Iconv(SoDAvg, 'MD3')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, NumRecipes, 0, SoDAvg)
+ HazeAvg = Iconv(HazeAvg, 'MD3')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_HAZE_AVG_AVG$, NumRecipes, 0, HazeAvg)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SIG$, NumRecipes, 0, '')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SIG_DTM$, NumRecipes, 0, '')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_INSP_TEST_RUN_DTM$, NumRecipes, 0, Timestamp)
+ // Save results (this will trigger an ROTR_REQUEST via CLEAN_INSP_ACTIONS)
+ Database_Services('WriteDataRow', 'CLEAN_INSP', CIKeyID, CleanInspRec, True$, False$, True$)
+ end else
+ ErrorMessage = 'Tencor recipe ' : ScanRecipe : ' not found in SurfScan recipe list.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : ErrorMessage)
+ // Set recipe mismatch flag for MFS purposes
+ CleanInspRec = ScanRecipe
+ Database_Services('WriteDataRow', 'CLEAN_INSP', CIKeyID, CleanInspRec, True$, False$, True$)
+ end
+ end else
+ ErrorMessage = 'Scan Recipe is missing.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : ErrorMessage)
+ end
+ Database_Services('ReleaseKeyIDLock', 'CLEAN_INSP', CIKeyID)
+ end else
+ // 01/31/23 - djs - Modified error message to use UID002 instead of UID001 to ensure the
+ // metrology file is not deleted so that the service can try to import it
+ // again once the lock is released.
+ ErrorMessage = 'Error in service ':Service:'. Failed to lock CLEAN_INSP record: ':CIKeyID:'.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID002', Service : ' : ' : ErrorMessage)
+ end
+ end else
+ ErrorMessage = 'CI Key ID is missing.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : ErrorMessage)
+ end
+ end else
+ // Added 8/13/2020 JRO
+ // We can enter in some conditional logic here for Production UAT
+ // If statement to gate from production below
+ PostStartTime = Time()
+ if Indexc(ScanRecipe, 'POST', 1) then
+ //Locate 'POST' in ScanRecipe Using "" setting pPos then
+ ReactRunRec = Xlate('REACT_RUN',RDSKeyID, '', 'X')
+ WONo = ReactRunRec;//WONo
+ WOStep = ReactRunRec;//WOStep
+ CassNo = ReactRunRec;//CassNo
+ Stage = 'POST';//Stages
+ PSNo = XLATE('RDS',RDSKeyID,RDS_PROD_SPEC_ID$,'X');//PSNo
+ DefectSpec = Xlate('PRS_STAGE', PSNo : '*LWI', PRS_STAGE_SURF_DEFECTS$, 'X');//Since there is no set spec for a non-existent stage we need to take one from the unloading step.
+ HazeSpec = Xlate('PRS_STAGE', PSNo : '*LWI', PRS_STAGE_SURF_HAZE$, 'X');//Since there is no set spec for a non-existent stage we need to take one from the unloading step.
+ //Check if CI was created already(usually during cleans) JRO-9-28
+ CIStages = ReactRunRec
+ Locate 'POST' in CIStages using @VM setting sPos then
+ //Existing POST CI record found, fetch it.
+ CINo = ReactRunRec
+ CleanInspRec = Xlate('CLEAN_INSP', CINo,'','X')
+ IF CleanInspRec NE '' THEN
+ //Append a value mark to the end of the field so that we can add another set of data
+ CleanInspRec = CleanInspRec : @VM
+ END
+ exists = True$
+ end else
+ //No Exisiting POST CI record found, Create new CI record
+ exists = False$
+ oCIParms = ''
+ oCIParms = WONo:@RM
+ oCIParms := WOStep:@RM
+ oCIParms := CassNo:@RM
+ oCIParms := Stage:@RM
+ oCIParms := RDSKeyID:@RM
+ oCIParms := PSNo:@RM
+ CleanInspRec = ''
+ CleanInspRec = WONo
+ CleanInspRec = WOStep
+ CleanInspRec = CassNo
+ CleanInspRec = Stage
+ CleanInspRec = RDSKeyID
+ end
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_RECIPE$, -1, 0, ScanRecipe)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_TOOL$, -1, 0, ScanTool)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$, -1, 0, SoDMin)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, -1, 0, SoDMax)
+ SoDAvg = Iconv(SoDAvg, 'MD3')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, -1, 0, SoDAvg)
+ HazeAvg = Iconv(HazeAvg, 'MD3')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_HAZE_AVG_AVG$, -1, 0, HazeAvg)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SIG$, -1, 0, '')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SIG_DTM$, -1, 0, '')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_INSP_TEST_RUN_DTM$, -1, 0, Timestamp)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SPEC_SURFSCAN_RECIPE$, -1, 0, ScanRecipe)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SPEC_SURF_DEFECTS$, -1, 0, DefectSpec)
+ //Here I am attempting to create the scan details.
+ SODWaferArray = ''
+ SODWaferArray = QA_Services('GetSODPerWafer', RDSKeyID, ScanRecipe, Timestamp)
+
+ If SODWaferArray NE '' then
+ WaferNos = SODWaferArray<1>
+ SODVals = SODWaferArray<2>
+ SortVals = SODWaferArray<3>
+ NumRecipes = DCount(CleanInspRec, @VM)
+ NumWfrs = ''
+ For each Wfr in SODVals using @VM setting vPos
+ NumWfrs += (Wfr NE '')
+ Next Wfr
+ For each WaferNo in WaferNos using @VM
+ If WaferNo NE '' then
+ CleanInspRec = SODVals<1,WaferNo>
+ CleanInspRec = SortVals<1,WaferNo>
+ QA_Services('PostWaferImageRequest', RDSKeyID, WaferNo, ScanRecipe)
+ end
+ Next Wafer
+ end
+ if exists Eq False$ then
+ oCIParms := CleanInspRec ;
+ CINo = obj_Clean_Insp('Create',oCIParms)
+ If Error_Services('NoError') then
+ ReactRunRec = INSERT(ReactRunRec,REACT_RUN_CI_NO$,-1,0,CINo)
+ ReactRunRec = INSERT(ReactRunRec,REACT_RUN_CI_STAGE$,-1,0,Stage)
+ obj_Tables('WriteRec','REACT_RUN':@RM:RDSKeyID:@RM:@RM:ReactRunRec)
+ obj_Tables('WriteRec','CLEAN_INSP':@RM:CINo:@RM:@RM:CleanInspRec)
+ PostStopTime = Time()
+ TimeTaken = PostStopTime - PostStartTime
+ LogData = ''
+ LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
+ LogData<2> = MachineType@
+ LogData<3> = RDSNo@
+ LogData<4> = 'Time taken to import POST data: ':TimeTaken:' seconds.'
+ Logging_Services('AppendLog', objPOSTPerfLog, LogData, @RM, @FM)
+ end else
+ // Record error. Ensure metrology run data file is not deleted by including UID002 in the
+ // error message that is placed onto error stack in Error_Services.
+ ErrorMessage = 'Failed to create CLEAN_INSP record. Error UID002.'
+ end
+ end else
+ //write to existing CI rec.
+ obj_Tables('WriteRec','CLEAN_INSP':@RM:CINo:@RM:@RM:CleanInspRec)
+ end
+ end else
+ // Unexpected recipe -> notify users if not a QUAL scan
+ QualScan = (Indexc(ScanRecipe, 'QUAL', 1) GT 0)
+ If QualScan EQ False$ then
+ Recipients = XLATE('NOTIFICATION','TENCOR_NOTIFICATIONS',NOTIFICATION_USER_ID$,'X')
+ SentFrom = 'OI Admin'
+ Subject = 'Tencor SurfScan Import Failure for RDS ':RDSKeyID:'.'
+ Message = 'Scanned recipe ':ScanRecipe:' not found in PSN ':PSN:' for RDS ':RDSKeyID:'.'
+ AttachWindow = ''
+ AttachKey = ''
+ SendToGroup = ''
+ Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
+ obj_Notes('Create',Parms)
+ end
+ end
+ end
+ end else
+ ErrorMessage = Error_Services('GetMessage')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : ErrorMessage)
+ end
+ end else
+ ErrorMessage = 'Invalid RDS Key ID.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : ErrorMessage)
+ end
+ If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
+
+end service
+
+
+Service ImportSP1Data(RunData)
+
+ Machine = 'SP1'
+
+ Timestamp = RunData<9>
+ HazeAvg = RunData<10>
+ RDSKeyID = RunData<28>
+ ScanRecipe = RunData<30>
+ CompareScanRecipe = ScanRecipe
+ IsMisfit = IndexC(ScanRecipe, 'MISFIT', 1)
+ If IsMisfit then
+ // Sum of Defects coming from LPD.
+ SoDAvg = RunData<3>
+ SoDMax = RunData<2>
+ SoDMin = RunData<1>
+ end else
+ // Sum of Defects coming from All.
+ SoDAvg = RunData<39>
+ SoDMax = RunData<40>
+ SoDMin = RunData<41>
+ end
+ ScanTool = RunData<43>
+ DCNMM2 = RunData<44>
+ * Swap '%' with ' ' in ScanTool
+ // The 4th character can be 0 or %, but needs to be ' ' in OpenInsight
+ ScanTool[4,1] = ' '
+ Convert @Lower_Case to @Upper_Case in ScanTool
+ Convert @Lower_Case to @Upper_Case in CompareScanRecipe
+ * Convert ' ' to '' in CompareScanRecipe
+
+ Swap ' AM' with 'AM' in Timestamp
+ Swap ' PM' with 'PM' in Timestamp
+ Timestamp = IConv(Timestamp,'DT')
+ RDSNo@ = RDSKeyID
+ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
+ If Error_Services('NoError') then
+ WorkOrderNo = RDSRec
+ CassNo = RDSRec
+ WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, True$)
+ GoSub ParseWorkOrder
+
+ If RowExists('RDS', RDSKeyID) then
+ // Try to read the CleanInsp datarow. Use this to identify the RDSKeyID.
+ ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSKeyID)
+ // Check to confirm that the LWI stage has a recipe. If so, then update the UNLOAD stage.
+ If PSN NE '' then
+ PRSStageRow = Database_Services('ReadDataRow', 'PRS_STAGE', PSN : '*LWI')
+ PRSSurfscanRecipe = PRSStageRow
+ Convert @Lower_Case to @Upper_Case in PRSSurfscanRecipe
+ TrimPRSRecipes = SRP_Trim(PRSSurfscanRecipe, 'FMB')
+ TrimScanRecipe = SRP_Trim(CompareScanRecipe, 'FMB')
+ Locate TrimScanRecipe in TrimPRSRecipes using @VM setting vPos then
+ * If SRP_Trim(PRSSurfscanRecipe, 'FMB') EQ SRP_Trim(CompareScanRecipe, 'FMB') then
+ Stage = 'LWI' ; // Viewed in the Unloading form.
+ end else
+ // LWI does not have a recipe. Check the POST stage. If so, then update the POST stage.
+ Transfer PRSSurfscanRecipe to LWIPRSSurfscanRecipe
+ PRSStageRow = Database_Services('ReadDataRow', 'PRS_STAGE', PSN : '*POST')
+ PRSSurfscanRecipe = PRSStageRow
+ Convert @Lower_Case to @Upper_Case in PRSSurfscanRecipe
+ TrimPRSRecipes = SRP_Trim(PRSSurfscanRecipe, 'FMB')
+ TrimScanRecipe = SRP_Trim(CompareScanRecipe, 'FMB')
+ Locate TrimScanRecipe in TrimPRSRecipes using @VM setting vPos then
+ * If SRP_Trim(PRSSurfscanRecipe, 'FMB') EQ SRP_Trim(CompareScanRecipe, 'FMB') then
+ Stage = 'POST' ; // Viewed in the Post EPI form.
+ end else
+ // No recipe was found. Set an error and skip.
+ Stage = ''
+ Error_Services('Set', 'No matching recipe was found. PSN=' : PSN : ', Scan Recipe=' : ScanRecipe : ', LWI Recipe=' : LWIPRSSurfscanRecipe : ', POST Recipe=' : PRSSurfscanRecipe)
+ end
+ end
+ end else
+ // No PRN was found. Set an error and skip.
+ Stage = ''
+ Error_Services('Set', 'No PRN was found.')
+ end
+ If Error_Services('NoError') then
+ CIKeyStages = ReactRunRec
+ CIKeyIDs = ReactRunRec
+ Locate Stage in CIKeyStages using @VM setting vPos then
+ CIKeyID = CIKeyIDs<0, vPos>
+ If (CIKeyID NE '') then
+ If ScanRecipe NE '' then
+ CleanInspRec = Database_Services('ReadDataRow', 'CLEAN_INSP', CIKeyID)
+ NumRecipes = DCount(CleanInspRec, @VM)
+ NumTools = DCount(CleanInspRec, @VM)
+ If NumTools GT NumRecipes then
+ NumRecipes = NumTools
+ end
+ NumRecipes += 1
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_RECIPE$, NumRecipes, 0, ScanRecipe)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_TOOL$, NumRecipes, 0, ScanTool)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_MIN$, NumRecipes, 0, SoDMin)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_MAX$, NumRecipes, 0, SoDMax)
+ SoDAvg = Iconv(SoDAvg, 'MD3')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SUM_OF_DEF_AVG$, NumRecipes, 0, SoDAvg)
+ HazeAvg = Iconv(HazeAvg, 'MD3')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_HAZE_AVG_AVG$, NumRecipes, 0, HazeAvg)
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SIG$, NumRecipes, 0, '')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_SCAN_SIG_DTM$, NumRecipes, 0, '')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_INSP_TEST_RUN_DTM$, NumRecipes, 0, Timestamp)
+ DCNMM2 = Iconv(DCNMM2, 'MD3')
+ CleanInspRec = Insert(CleanInspRec, CLEAN_INSP_DCN_MM2$, NumRecipes, 0, DCNMM2)
+ Database_Services('WriteDataRow', 'CLEAN_INSP', CIKeyID, CleanInspRec, True$, False$, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success.')
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Error_Services('Add', 'Scan Recipe is missing.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Error_Services('Add', 'CI Key ID is missing.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Error_Services('Add', 'Invalid RDS Key ID.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+end service
+
+
+Service FormatLayerKeyID(RunDataLayer)
+
+ If RunDataLayer NE '' then
+
+ // Development code
+ OriginalRunDataLayer = RunDataLayer
+ CONVERT @LOWER_CASE TO @UPPER_CASE IN RunDataLayer
+ // Allow for 'P', which represents a Product (ie. QA) Test - Solution abandoned 08/14/18 per Francois
+ Convert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ- ' to '' in RunDataLayer
+ Begin Case
+ Case (RunDataLayer = '1')
+ RunDataLayer = 'L1'
+ Case (RunDataLayer = '2')
+ RunDataLayer = 'L2'
+ Case (RunDataLayer = '3')
+ RunDataLayer = '2'
+ * Case (RunDataLayer = 'P')
+ * Null ; // Leave it be.
+ Case Otherwise$
+ Error_Services('Add', 'Invalid RunDataLayer [' : OriginalRunDataLayer : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ End Case
+
+ end
+
+ Response = RunDataLayer
+
+end service
+
+
+Service FormatZoneKeyID(RunDataZone)
+
+ If RunDataZone NE '' then
+
+ CONVERT @LOWER_CASE TO @UPPER_CASE IN RunDataZone
+ Convert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ- ' to '' in RunDataZone
+
+ End
+
+ Response = RunDataZone
+
+end service
+
+
+Service GetCalculatedZone(RDSKeyID, IsEpiPro, RunDataZone)
+
+ CalculatedZone = ''
+
+ If (RDSKeyID NE '') AND (IsEpiPro NE '') then
+ If IsEpiPro then
+ // This is Epi Pro, so there must be a zone. If a zone is specified then verify that there are RDS_TEST Keys
+ // IDs associated with this zone. If so, then accept the zone. If not, check to see if the other zone has
+ // RDS_TEST Key IDs. If so, then use that zone. If neither zone has RDS_TEST Key IDs then set an error. If
+ // no zone is specified then verify if one and only one zone has RDS_TEST KeyIDS. If so, use the zone found.
+ // If not, set an error.
+
+ // Check for the RDS_TEST Key IDS for both zones first.
+ Zone2RDSTestKeyIDs = XLATE('REACT_RUN', RDSKeyID, 'MET_KEYS_Z2', 'X')
+ Zone1RDSTestKeyIDs = XLATE('REACT_RUN', RDSKeyID, 'MET_KEYS_Z1', 'X')
+
+ // Run the tests.
+ Begin Case
+ Case (RunDataZone EQ 1) AND (Zone1RDSTestKeyIDs NE '')
+ CalculatedZone = 1
+ Case (RunDataZone EQ 2) AND (Zone2RDSTestKeyIDs NE '')
+ CalculatedZone = 2
+ Case (Zone1RDSTestKeyIDs NE '') AND (Zone2RDSTestKeyIDs EQ '')
+ CalculatedZone = 1
+ Case (Zone1RDSTestKeyIDs EQ '') AND (Zone2RDSTestKeyIDs NE '')
+ CalculatedZone = 2
+ Case (Zone1RDSTestKeyIDs EQ '') AND (Zone2RDSTestKeyIDs EQ '')
+ Error_Services('Add', 'RDS Key ID [' : RDSKeyID : '] has no RDS_TEST Keys for any zone.')
+ Case (Zone1RDSTestKeyIDs NE '') AND (Zone2RDSTestKeyIDs NE '')
+ Error_Services('Add', 'No zone was entered for RDS Key ID [' : RDSKeyID : '] and both zones have RDS_TEST Keys.')
+ End Case
+ end else
+ // Non-Epi Pro, so there is never a Zone.
+ CalculatedZone = ''
+ end
+ end else
+ Error_Services('Add', 'The RDSKeyID or IsEpiPro argument is missing.')
+ end
+
+ Response = CalculatedZone
+
+end service
+
+
+Service GetCalculatedLayer(RDSKeyID, Machine, RunDataZone, WoIsEpiPro, ScannedLayer)
+
+ CalculatedLayer = ''
+
+ If (RDSKeyID NE '') AND (Machine NE '') then
+ Begin Case
+ Case RunDataZone EQ 2
+ RDSTestKeyIDs = XLATE('REACT_RUN', RDSKeyID, 'MET_KEYS_Z2', 'X')
+ Case RunDataZone EQ 1
+ RDSTestKeyIDs = XLATE('REACT_RUN', RDSKeyID, 'MET_KEYS_Z1', 'X')
+ Case RunDataZone EQ ''
+ RDSTestKeyIDs = XLATE('REACT_RUN', RDSKeyID, 'MET_KEYS', 'X')
+ Case Otherwise$
+ Error_Services('Add', 'Unrecognized RunDataZone [' : RunDataZone : '] in the [' : Service : '] service.')
+ End Case
+ If Error_Services('NoError') then
+ If RDSTestKeyIDs NE '' then
+ Begin Case
+ Case Machine _EQC 'BioRad'
+ // Just get the last RDS Test Key ID whether there is one or multiple Key IDs.
+ RDSTestKeyID = RDSTestKeyIDs[-1, 'B' : @VM]
+
+ RDSTestRow = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ CalculatedLayer = RDSTestRow
+ end
+
+ If Dcount(RDSTestKeyIDs, @VM) GT 1 and WoIsEpiPro = False$ and (ScannedLayer _EQC 'L1' or ScannedLayer _EQC 'L2' or ScannedLayer _EQC '2') then
+ CalculatedLayer = ScannedLayer
+ end
+
+ Case Machine _EQC 'CDE'
+ ToolClassID = Metrology_Services('GetToolClassID', Machine)
+ ToolMatch = False$ ; // Assume no match for now.
+ For Each RDSTestKeyID in RDSTestKeyIDs using @VM
+ RDSTestRow = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ If RDSTestRow _EQC ToolClassID then ToolMatch = True$
+ end
+ Until ToolMatch
+ Next RDSTestKeyID
+ If ToolMatch then
+ CalculatedLayer = RDSTestRow
+ end else
+ Error_Services('Add', 'Unable to find the RDS Key ID [' : RDSKeyID : '] layer that has this Tool Class ID [' : ToolClassID : '].')
+ end
+
+ Case Machine _EQC 'HgCV'
+ ToolClassID = Metrology_Services('GetToolClassID', Machine)
+ ToolMatch = False$ ; // Assume no match for now.
+ For Each RDSTestKeyID in RDSTestKeyIDs using @VM
+ RDSTestRow = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ If (RDSTestRow _EQC ToolClassID) OR (RDSTestRow _EQC ToolClassID) then ToolMatch = True$
+ end
+ Until ToolMatch
+ Next RDSTestKeyID
+ If ToolMatch then
+ CalculatedLayer = RDSTestRow
+ end else
+ Error_Services('Add', 'Unable to find the RDS Key ID [' : RDSKeyID : '] layer that has this Tool Class ID [' : ToolClassID : '].')
+ end
+
+ End Case
+ end else
+ Error_Services('Add', 'No RDS Test Key IDS were found for RDS Key ID [' : RDSKeyID : '] and Zone Key ID [' : RunDataZone : '] in the [' : Service : '] service.')
+ end
+ end
+ end else
+ Error_Services('Add', 'The RDSKeyID or Machine argument is missing in the [' : Service : '] service.')
+ end
+
+ Response = CalculatedLayer
+
+end service
+
+
+Service GetToolClassID(Machine)
+
+ ToolClassID = ''
+
+ If Machine NE '' then
+ Begin Case
+ Case Machine _EQC 'BioRad' ; ToolClassID = 'FTIR'
+ Case Machine _EQC 'CDE' ; ToolClassID = '4PP'
+ Case Machine _EQC 'HgCV' ; ToolClassID = 'HGCV'
+ Case Otherwise$ ; Error_Services('Add', 'Unrecognized Machine in the [' : Service : '] service.')
+ End Case
+ end else
+ Error_Services('Add', 'The Machine argument is missing in the [' : Service : '] service.')
+ end
+
+ Response = ToolClassID
+
+end service
+
+
+Service LogResults(RDSKeyID, Machine, UID, Results)
+
+ Begin Case
+ Case Machine _EQC 'Tencor'
+ LogHandle = objTencorLog
+ Case Machine _EQC 'HgCV'
+ LogHandle = objHgCVLog
+ Case Machine _EQC 'CDE'
+ LogHandle = objCDELog
+ Case Machine _EQC 'Biorad'
+ LogHandle = objBioradLog
+ Case Machine _EQC 'Stratus'
+ LogHandle = objStratusLog
+ Case Machine _EQC 'SP1'
+ LogHandle = objSP1Log
+ Case Machine _EQC 'SPV'
+ LogHandle = objSPVLog
+ Case Machine _EQC 'SRP'
+ LogHandle = objSRPLog
+ Case Otherwise$
+ LogHandle = objLog
+ End Case
+
+ LogData = ''
+ LogData<1> = LoggingDTM
+ LogData<2> = RDSKeyID ; // RDS Key ID
+ LogData<3> = Machine ; // Type (i.e., Machine)
+ LogData<4> = UID ; // UID000=Success, UID001=Failure
+ LogData<5> = Results
+ Logging_Services('AppendLog', LogHandle, LogData, @RM, @FM)
+
+ If UID NE 'UID000' then
+ Error_Services('Add', UID:' ':Results)
+ end
+
+end service
+
+//----------------------------------------------------------------------------------------------------------------------
+// RemoveOldMetrology
+//
+// Runs a database query logic to find pre-existing metrology data already linked to future RDS Key IDs and then removes
+// them from the database to avoid appearing in RDS rows when they get created. This service will only remove metrology
+// data related to 300 future RDS Key IDs at a time. This allow the system to always stay ahead of the operators but
+// leaves as much history as possible in the system for as long as possible.
+//----------------------------------------------------------------------------------------------------------------------
+Service RemoveOldMetrology()
+
+ NextRDSNo = Database_Services('ReadDataRow', 'DICT.RDS', '%SK%')
+ If Error_Services('NoError') then
+ Flag = ''
+ LastRDSNo = NextRDSNo + 600
+ // Remove old RDS_LAYER records
+ Open 'RDS_LAYER' to RLHandle then
+ For CurrRDS = NextRDSNo to LastRDSNo
+ Delete RLHandle, CurrRDS:'*L1' else Null
+ Delete RLHandle, CurrRDS:'*L2' else Null
+ Delete RLHandle, CurrRDS:'*2' else Null
+ Next CurrRDS
+ end
+ hDictRDSTest = Database_Services('GetTableHandle', 'DICT.RDS_TEST')
+ SearchString = 'RDS_NO' : @VM : (NextRDSNo - 1) : '~' : (LastRDSNo + 1) : @FM
+ Btree.Extract(SearchString, 'RDS_TEST', hDictRDSTest, RDSTestKeyIDs, '', Flag)
+ If Flag EQ 0 then
+ If RDSTestKeyIDs NE '' then
+ LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RemoveMetrology'
+ LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '.log'
+ Headers = 'Logging DTM' : @FM : 'Results'
+ ColumnWidths = 20 : @FM : 50
+ objLog2 = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
+ For Each RDSTestKeyID in RDSTestKeyIDs using @VM
+ If Len(RDSTestKeyID) LT 7 then
+ Database_Services('DeleteDataRow', 'RDS_TEST', RDSTestKeyID, True$)
+ If Error_Services('NoError') then
+ Results = RDSTestKeyID : ' deleted'
+ end else
+ Results = RDSTestKeyID : ' not deleted. Error : ' : Error_Services('GetMessage')
+ end
+ LogData = ''
+ LogData<1> = LoggingDTM
+ LogData<2> = Results
+ Logging_Services('AppendLog', objLog2, LogData, @RM, @FM)
+ end
+ Next RDSTestKeyID
+ end
+ end
+ end
+
+end service
+
+/*
+ImportBioRadEPPFQAData
+Modified and annotated by JRO 4/18/2025
+Written to import data specifically for EpiPro QA/FQA Thickness.
+Note: Due to the nature of the forms used to validate EpiPro FQA, we currently only support single value data import.
+If we wish to extend this to multi value data import than we need to write the values with Sub Value Marks at the Value Mark position of the test profile.
+Then we also need to modify the form usage to support parsing those multi-values.
+I am leaving the iterating methods in here with the possibility that we can extend this to support multi valued data should the business need it.
+This service requires the following parameters:
+1. RunData, The internal delimited run data from the parent calling routine ImportBioRadData.
+The service does the following actions:
+1. Parses through the run data to extract the WMO Lot id, reactor id, recipe id, and slot id.
+2. Writes the data point to the slot position in the WM_OUT record - > MU_WAFER_THK_RESULT field, for all wafers whether they are MU wafers or not.
+ This allows us to detect that Any and all MU wafers have thickness data.
+3. Reads the WO_MAT_QA record.
+4. Iterates through WO_MAT_QA record -> PROFILE fields @VM values, IF the profile is 1ADE, or QA, or MO_QA then
+5. Determines the spec slot by reading the WO_MAT_QA record -> SLOT field
+6. If the detected RunDataSlot matches the spec slot, writes the datapoint to the WO_MAT_QA record - > RESULT field in the same @VM that the iterator is currently set to.
+*/
+Service ImportBioRadEPPFQAData(RunData, FileName)
+
+ Timestamp = RunData<2>
+ WMOKeyID = RunData<6>
+ Swap '.' with '*' in WMOKeyID
+ Swap 'o' with '' in WMOKeyID
+ Swap 'O' with '' in WMOKeyID
+ RunDataLayer = RunData<8>
+ ReactorID = RunData<5>
+ ScanRecipe = RunData<4>
+ DataSlotId = RunData<11>
+ DataSlotId = SRP_Trim(DataSlotId, 'F', 0)
+ FieldPos = 13
+ FieldPosIncrement = 2
+ Offset = 1
+ Decimals = 2
+ Positions = ''
+ DataPoints = ''
+
+ WMORec = Database_Services('ReadDataRow', 'WM_OUT', WMOKeyID)
+ WOMatQAKey = Field(WMOKeyID, '*', 1) : '*' : Field(WMOKeyID, '*', 3)
+ Loop
+ Position = Trim(RunData)
+ DataPoint = Trim(RunData)
+ Until Position EQ ''
+ Position = SRP_Trim(Position, 'F', '0')
+ Positions := Position : @VM
+ DataPoints := DataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ Positions[-1, 1] = '' ; // Strip final @VM
+ DataPoints[-1, 1] = '' ; // Strip final @VM
+
+ If Error_Services('NoError') then
+ If Error_Services('HasError') then
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ //Update the WM_OUT record for EpiPro
+ WMORec = DataPoints
+ Database_Services('WriteDataRow', 'WM_OUT', WMOKeyID, WMORec, True$, False$, True$)
+ end else
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ // Update WO_MAT_QA record
+ WOMatQAID = Field(WMOKeyID, '*', 1) : '*' : Field(WMOKeyID, '*', 3)
+ WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
+ If Error_Services('NoError') then
+ SpecRecipes = WOMatQARec
+ ProfSteps = ''
+ Profiles = WOMatQARec
+ ProfileCnt = DCount(WOMatQARec, @VM)
+ Stages = WOMatQARec
+ Slots = WOMatQARec
+ pPos = ''
+ For each Profile in Profiles using @VM setting pPos
+ Stage = Stages<0, pPos>
+ If ( (Profile EQ '1ADE') and ( (Stage EQ 'QA') or (Stage EQ 'MO_QA') ) ) then
+ Slot = Slots<0, pPos>
+ //There is a specific scenario where when the spec wafers are 1 and L, and there is a makeup wafer in each of the first and last slots, they would then want to
+ //measure the next open slot, either incremented down from the last wafer position or incremented up from the first wafer position.
+ //We may need to add that in when the definition becomes clearer.
+ Begin Case
+ Case Slot EQ '1'
+ For WaferIndex = 1 to 25
+ SlotIsEmpty = Database_Services('ReadDataColumn', 'WM_OUT', WMOKeyID, WM_OUT_RDS$, True$, 0, False$)<1, WaferIndex> EQ ''
+ Until SlotIsEmpty EQ False$
+ Next WaferIndex
+ Case Slot EQ 'L'
+ For WaferIndex = 25 to 1 Step -1
+ SlotIsEmpty = Database_Services('ReadDataColumn', 'WM_OUT', WMOKeyID, WM_OUT_RDS$, True$, 0, False$)<1, WaferIndex> EQ ''
+ Until SlotIsEmpty EQ False$
+ Next WaferIndex
+ Case Slot EQ 'A'
+ WaferIndex = 1
+ Case Otherwise$
+ WaferIndex = Slot
+ End Case
+ If DataSlotId EQ WaferIndex then
+ WOMatQARec = DataPoints
+ end
+ end
+ Next Profile
+ Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID000', Service : ' : Success.')
+ end else
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSNo@, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+end service
+
+
+//----------------------------------------------------------------------------------------------------------------------
+// CleanRepository
+//
+// Input: NumDays - The number of days which determines whether or not a file will be deleted.
+//
+// Removes rundata files from the Run Data Repository folder that are more than the desired number of days old.
+//----------------------------------------------------------------------------------------------------------------------
+Service CleanRepository(NumDays)
+
+ RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\'
+ InitDir RepoPath:'*.txt'
+ FileList = DirList()
+ Today = Date()
+ For each Filename in FileList
+ FileInfo = Dir(RepoPath:Filename)
+ LastWriteDate = FileInfo<2>
+ FileAge = Today - LastWriteDate
+ If FileAge GT NumDays then
+ OSDelete RepoPath:Filename
+ end
+ Next Filename
+
+end service
+
+
+//----------------------------------------------------------------------------------------------------------------------
+// MonitorQueue
+//
+// Input: NumFiles - The number of files at which manual data entry for ROTR will be allowed by all users.
+//
+// Monitors the Metrology run data import queue. If the number of files exceed the NumFiles variable, then
+// the restriction of manual data entry of ROTR data by LEADS, SUPERVISORS, ENGINEERING, and FINAL_QA will be lifted.
+// Once the queue drops back down below the NumFiles variable, then the restriction will be put back into place.
+//----------------------------------------------------------------------------------------------------------------------
+Service MonitorQueue(NumFiles)
+
+ RunDataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Data\'
+ InitDir RunDataPath:'*.txt'
+ FileList = DirList()
+ CurrFileCount = DCount(FileList, @FM)
+ If CurrFileCount LT NumFiles then
+ // Enable manual entry restriction - check current status to avoid unnecessary writes.
+ CurrLockStatus = Database_Services('ReadDataRow', 'APP_INFO', 'ROTR_DATA_ENTRY_LOCK')
+ If CurrLockStatus EQ False$ then
+ Database_Services('WriteDataRow', 'APP_INFO', 'ROTR_DATA_ENTRY_LOCK', True$)
+ end
+ end else
+ // Lift manual entry restriction - check current status to avoid unnecessary writes.
+ CurrLockStatus = Database_Services('ReadDataRow', 'APP_INFO', 'ROTR_DATA_ENTRY_LOCK')
+ If CurrLockStatus EQ True$ then
+ Database_Services('WriteDataRow', 'APP_INFO', 'ROTR_DATA_ENTRY_LOCK', False$)
+ end
+ end
+
+end service
+
+
+Service GetIQSViolations()
+
+ hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
+ Lock hSysLists, ServiceKeyID then
+ Response = 0
+ ParsedIQSData = ''
+ Pass = 1
+ URL = "https://messa04ec.infineon.com/product-thick-and-res-health-reduced-web.html"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ IQSResponse = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ swap CRLF$ with '' in IQSResponse
+ PublishDateStart = Indexc(IQSResponse, 'Published: ', 1) + 11
+ PublishDateCnt = Indexc(IQSResponse, '
', 1) - PublishDateStart
+ PublishDate = IQSResponse[PublishDateStart, PublishDateCnt]
+
+ swap ' AM' with 'AM' in PublishDate
+ swap ' PM' with 'PM' in PublishDate
+
+ ConvDateTime = IConv(PublishDate, 'DT')
+ DataTableBegin = Indexc(IQSResponse, '', 1) + 7
+ DataTable = IQSResponse[DataTableBegin, DataTableEnd]
+ swap '' with @FM in DataTable
+ swap '' with '' in DataTable
+ swap '' with '' in DataTable
+ DataTable = Delete(DataTable, 1,0,0)
+ DataTable = Delete(DataTable, 1,0,0)
+
+ FilteredData = ''
+ for i = 1 to DCount(DataTable, @FM)
+ if Indexc(DataTable, ' | ', 1) then
+ FilteredData<-1> = DataTable
+ end
+ Next i
+ swap ' | ' with @VM in FilteredData
+ for i = 1 to DCount(FilteredData, @FM)
+ //Delete blank empty value
+ FilteredData = Delete(FilteredData, i,1,0)
+ //Delete useuless Entire Database column
+ FilteredData = Delete(FilteredData, i,1,0)
+
+ ParsedIQSData = FilteredData
+ ParsedIQSData = FilteredData
+ ParsedIQSData = FilteredData
+ ParsedIQSData = FilteredData
+ ParsedIQSData = FilteredData
+ ParsedIQSData = FilteredData
+ ParsedIQSData = FilteredData
+ swap '>' with '>' in FilteredData
+ swap '<' with '<' in FilteredData
+ ParsedIQSData = FilteredData
+ ParsedIQSData = FilteredData
+ ParsedIQSData = FilteredData
+ Next i
+ LastWriteTime = IConv(PublishDate, 'DT')
+ ParsedIQSData = LastWriteTime
+
+ Database_Services('WriteDataRow', 'CONFIG', 'IQS_VIOL_DATA', ParsedIQSData, True$, False$, True$)
+ //Send status of last write time
+ If SRP_Datetime('MinuteSpan', LastWriteTime, SRP_Datetime('Now')) GT 10 then
+ Mona_Services('SendBufferedStatus', 'IQS_VIOLATION_DATA', 'LastDataTimestamp', 'CRITICAL')
+ end else
+ Mona_Services('SendBufferedStatus', 'IQS_VIOLATION_DATA', 'LastDataTimestamp', 'OK')
+ end
+
+ Reactor_Services('UpdateReactorIQSViolations')
+
+ Unlock hSysLists, ServiceKeyID else Null
+ end
+
+end service
+
+Service ScanRecipeMatchesRdsTestSpecThickMrecipe(RdsNo, RecipeLayer, RecipeInScan, RdsTestKeysFromRdsLayer, Zone='')
+ If Unassigned(RecipeLayer) or RecipeLayer EQ '' then
+ RecipeLayer = 'L1'
+ end
+
+ MatchFound = False$
+ ValidArgs = Assigned(RdsNo) and RdsNo NE '' and Assigned(RecipeInScan) and RecipeInScan NE ''
+ ValidArgs = ValidArgs and Assigned(RdsTestKeysFromRdsLayer) and Dcount(RdsTestKeysFromRdsLayer, @VM) GT 0
+ If ValidArgs then
+ For Each RDSTestKeyID in RdsTestKeysFromRdsLayer using @VM setting mkPos
+ RdsTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ RdsTestRdsNo = RdsTestRec
+ If RdsNo EQ RdsTestRdsNo then
+ RdsTestRecLayer = RdsTestRec
+ If RecipeLayer EQ RdsTestRecLayer then
+ Continue = True$
+ If Zone NE '' then
+ RdsTestRecZone = RdsTestRec
+ If RdsTestRecZone NE Zone then
+ Continue = False$
+ end
+ end
+ If Continue then
+ SpecThickMrecipe = RdsTestRec
+ If RecipeInScan _EQC SpecThickMrecipe then
+ MatchFound = True$
+ end
+ end
+ end
+ end
+ end
+ Until MatchFound
+ Next RDSTestKeyID
+ end
+
+ Response = MatchFound
+end service
+
+Service ScanNumDataPointsMatchesRdsTestSpecThickMPattern(RdsNo, RecipeLayer, ScanNumDataPoints, RdsTestKeysFromRdsLayer, ToolClass, Zone='')
+ If Unassigned(RecipeLayer) or RecipeLayer EQ '' then
+ RecipeLayer = 'L1'
+ end
+
+ MatchFound = False$
+
+ ValidArgs = Assigned(RdsNo) and RdsNo NE '' and Assigned(ScanNumDataPoints) and Num(ScanNumDataPoints)
+ ValidArgs = ValidArgs and Assigned(RdsTestKeysFromRdsLayer) and Dcount(RdsTestKeysFromRdsLayer, @VM) GT 0
+ ValidArgs = ValidArgs and Assigned(ToolClass) and ToolClass NE ''
+
+ If ValidArgs then
+ For Each RDSTestKeyID in RdsTestKeysFromRdsLayer using @VM setting mkPos
+ RdsTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ RdsTestRdsNo = RdsTestRec
+ If RdsNo EQ RdsTestRdsNo then
+ RdsTestRecLayer = RdsTestRec
+ If RecipeLayer EQ RdsTestRecLayer then
+ Continue = True$
+ If Zone NE '' then
+ RdsTestRecZone = RdsTestRec
+ If RdsTestRecZone NE Zone then
+ Continue = False$
+ end
+ end
+ If Continue then
+ SpecPatternName = RdsTestRec
+ SpecNumDataPoints = Tool_Class_Services('GetNumberOfPointsForPattern', ToolClass, SpecPatternName)
+ If ScanNumDataPoints EQ SpecNumDataPoints then
+ MatchFound = True$
+ end
+ end
+ end
+ end
+ end
+ Until MatchFound
+ Next RDSTestKeyID
+ end
+
+ Response = MatchFound
+end service
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Internal GoSubs
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+ClearCursors:
+
+ For Cursor = 1 to 8
+ ClearSelect Cursor
+ Next Cursor
+
+return
+
+
+CalculateQAData:
+
+ // Find the Min, Max, Average, Edge Mean Delta, and Range % values
+ Sum = 0
+ Min = DataPoints<0,1>
+ Max = DataPoints<0,1>
+ Delta1 = 0
+ Delta2 = 0
+ RangeMin = DataPoints<0,1>
+ RangeMax = DataPoints<0,1>
+ RangeAvg = 0
+ RangePoints = '1,2,5,6,9'
+ For each DataPoint in DataPoints using @VM setting Index
+ Sum = Sum + DataPoint
+ // Min & Max
+ Min = Min(Min, DataPoint)
+ Max = Max(Max, DataPoint)
+ // Edge Mean Delta
+ If Index GE 6 AND Index LE 9 then
+ Delta1 = Delta1 + DataPoint
+ end
+ If Index GE 2 AND Index LE 5 then
+ Delta2 = Delta2 + DataPoint
+ end
+ // Range %
+ Locate Index in RangePoints using ',' setting unusedIndex then
+ RangeMin = Min(RangeMin, DataPoint)
+ RangeMax = Max(RangeMax, DataPoint)
+ RangeAvg = RangeAvg + DataPoint
+ end
+ Next DataPoint
+ // Edge Mean Delta
+ EdgeMeanDelta = ''
+ If ( (Delta1 NE 0) and (Delta2 NE 0) ) then
+ Delta1Avg = Delta1/4
+ Delta2Avg = Delta2/4
+ EdgeMeanDelta = ( (Delta1Avg - Delta2Avg) / Delta1Avg) * 100
+ end
+ // Range %
+ Range = RangeMax - RangeMin
+ NumRangePoints = DCount(RangePoints, ',')
+ RangeAvg = RangeAvg / NumRangePoints
+ RangePct = (Range / RangeAvg) * 100
+ // Average
+ NumDataPoints = DCount(DataPoints, @VM)
+ Average = Sum / NumDataPoints
+
+return
+
+
+CalculateResults:
+
+ If IsEpiPro then
+ // Using logic adapted from COMM_DIALOG_EPI_PRO_MET > Done event handler.
+
+ MetRec = RDSTestRec
+ TestPointMap = BaseMapID
+ MetNo = RDSTestKeyID
+ RDSNo = MetRec
+ LSId = MetRec
+ Zone = MetRec
+ TestPointMap = MetRec
+
+ IF Zone = '' THEN MetKeys = XLATE('REACT_RUN',RDSNo,'MET_KEYS','X')
+ IF Zone = 1 THEN MetKeys = XLATE('REACT_RUN',RDSNo,'MET_KEYS_Z1','X')
+ IF Zone = 2 THEN MetKeys = XLATE('REACT_RUN',RDSNo,'MET_KEYS_Z2','X')
+
+ RdsLSKeys = XLATE('RDS',RDSNo,RDS_RDS_LAYER_KEYS$,'X')
+ ReactorNo = XLATE('REACT_RUN',RDSNo,REACT_RUN_REACTOR$,'X')
+ ReactType = XLATE('REACTOR',ReactorNo,REACTOR_REACT_TYPE$,'X')
+
+ Continue = True$ ; // Assue we will continue for now.
+
+ IF INDEX(RdsLSKeys,@VM,1) THEN
+ * Multiple layers
+
+ DepTimeTargets = ''
+ LSCnt = COUNT(RdsLSKeys,@VM) + (RdsLSKeys NE '')
+
+ DepTimeTargets = XLATE('RDS_LAYER',RdsLSKeys,RDS_LAYER_EPI_TIME$,'X')
+ DepTimeTargets = OCONV(DepTimeTargets,'MD1')
+
+ LS1DepTime = ''
+ LS2DepTime = ''
+
+ FOR I = 1 TO LSCnt
+ RdsLSKey = RdsLSKeys<1,I>
+ IF INDEX(RdsLSKey,'L1',1) THEN LS1DepTime = DepTimeTargets<1,I>
+ IF INDEX(RdsLSKey,'L2',1) THEN LS2DepTime = DepTimeTargets<1,I>
+ NEXT I
+
+ IF LS1DepTime NE '' AND LS2DepTime NE '' THEN
+
+ TotDepTime = LS1DepTime + LS2DepTime
+ LS1Ratio = LS1DepTime/TotDepTime
+ MetReadings = ''
+
+ FOR I = 1 TO COUNT(MetKeys,@VM) + (MetKeys NE '')
+ MetKey = MetKeys<1,I>
+ LMetReadings = obj_RDS_Test('GetReadSet',MetKey)
+
+ IF I = 1 THEN
+ MetReadings<1> = LMetReadings<1> ;* Line Numbers
+ MetReadings<3> = LMetReadings<3> ;* SheetRho
+ MetReadings<4> = LMetReadings<4> ;* Hgcv
+ END
+
+ IF I = 2 THEN
+ MetReadings<5> = LMetReadings<4> ;* Hgcv
+ END
+
+ IF I = 3 THEN
+ MetReadings<2> = LMetReadings<2> ;* Thickness readings
+ END
+
+ NEXT I
+
+ end else
+ Continue = False$
+ end
+
+ END ELSE
+ LS1Ratio = 1
+ MetReadings = obj_RDS_Test('GetReadSet',MetNo)
+ END
+
+ if Continue then
+
+ CONVERT @FM TO @RM IN MetReadings
+ oTPM_Parms = TestPointMap:@RM:MetReadings
+ Results = obj_Test_Point_Map('PointToResult',oTPM_Parms)
+ ThicknessArray = FIELD(Results,@FM,2,4)
+ ThickReads = ThicknessArray<1>
+ SheetRhoReads = ThicknessArray<2>
+ HgCV1ResReads = ThicknessArray<3>
+ HgCV2ResReads = ThicknessArray<4>
+ L1Ratio = LS1Ratio
+
+ ReadingNos = ''
+
+ FOR I = 1 TO 9
+ ReadingNos<1,I> = I
+ NEXT I
+
+ oTPM_Parms = TestPointMap:@RM:ReadingNos:@RM:ThickReads:@RM:SheetRhoReads:@RM:HgCV1ResReads:@RM:HgCV2ResReads
+
+ EpiReads = obj_Test_Point_Map('ResultToPoint',oTPM_Parms)
+
+ BEGIN CASE
+ CASE Zone = '1' ; MetKeys = XLATE('REACT_RUN',RDSNo,'MET_KEYS_Z1','X')
+ CASE Zone = '2' ; MetKeys = XLATE('REACT_RUN',RDSNo,'MET_KEYS_Z2','X')
+ CASE 1 ; MetKeys = XLATE('REACT_RUN',RDSNo,'MET_KEYS','X')
+ END CASE
+
+
+ IF INDEX(MetKeys,@VM,1) THEN
+ // MetNo might be from a layer other than the last one. Get the last layer and assign it to the MetNo
+ // variable.
+ MetNo = MetKeys[-1, 'B' : @VM]
+ LOCATE MetNo IN MetKeys USING @VM SETTING Pos THEN
+ MetKeys = DELETE(MetKeys,1,Pos,0)
+ END
+ oRTParms_L1 = ''
+ oRTParms_L2 = ''
+
+ FOR J = 1 TO COUNT(EpiReads<1>,@VM) + (EpiReads<1> NE '')
+ oRTParms_L1 = OCONV(ICONV(EpiReads * L1Ratio, 'MD2'),'MD2')
+ oRTParms_L2 = EpiReads - oRTParms_L1
+
+ IF EpiReads NE '' THEN
+
+ oRTParms_L1 = EpiReads
+ oRTParms_L2 = ''
+ EpiReads = ''
+
+ END ELSE
+ oRTParms_L1 = ''
+ oRTParms_L2 = ''
+ END
+
+ IF EpiReads NE '' THEN
+ oRTParms_L1 = EpiReads
+ END
+
+ IF EpiReads NE '' THEN
+ oRTParms_L2 = EpiReads
+ END
+
+ NEXT J
+
+ CONVERT @FM TO @RM IN oRTParms_L1
+ CONVERT @FM TO @RM IN oRTParms_L2
+
+ obj_RDS_Test('SetReadSet',MetKeys<1,1>:@RM:oRTParms_L1)
+
+ obj_RDS_Test('SetReadSet',MetKeys<1,2>:@RM:oRTParms_L2)
+
+ END
+
+ oRTParms = ''
+ oRTParms = EpiReads
+ oRTParms = EpiReads
+ oRTParms = EpiReads
+
+ CONVERT @FM TO @RM IN oRTParms
+
+ obj_RDS_Test('SetReadSet',MetNo:@RM:oRTParms)
+
+ end
+ end else
+ // Non-Epi Pro calculations. Using logic from adapted from COMM_RDS_TEST > ReadingsPC method.
+ Readings = RDSTestRec
+ Conversion = 'MD' : Decimals
+ Readings = Oconv(Readings, Conversion)
+ rv = Set_Status(0)
+ Stats = obj_RDS_Test('CalcStats', Readings : @RM : Conversion)
+ ErrorCode = ''
+ If Get_Status(ErrorCode) EQ 0 then
+ Convert @RM to @FM in Stats
+ Stats<1> = Iconv(Stats<1>, Conversion)
+ Stats<2> = Iconv(Stats<2>, 'MD4')
+ Stats<3> = Iconv(Stats<3>, 'MD2')
+ Stats<4> = Iconv(Stats<4>, Conversion)
+ Stats<5> = Iconv(Stats<5>, Conversion)
+ Stats<6> = Iconv(Stats<6>, Conversion)
+ Stats<7> = Iconv(Stats<7>, 'MD4')
+
+ Begin Case
+ Case Machine _EQC 'BioRad'
+ RDSTestRec = Stats<1>
+ RDSTestRec = Stats<2>
+ RDSTestRec = Stats<6>
+ RDSTestRec = Stats<7>
+ RDSTestRec = Stats<3>
+ RDSTestRec = Stats<4>
+ RDSTestRec = Stats<5>
+ Case Machine _EQC 'CDE'
+ RDSTestRec = Stats<1>
+ RDSTestRec = Stats<2>
+ RDSTestRec = Stats<6>
+ RDSTestRec = Stats<7>
+ RDSTestRec = Stats<3>
+ RDSTestRec = Stats<4>
+ RDSTestRec = Stats<5>
+ Case Machine _EQC 'HgCV'
+ RDSTestRec = Stats<1>
+ RDSTestRec = Stats<2>
+ RDSTestRec = Stats<6>
+ RDSTestRec = Stats<7>
+ RDSTestRec = Stats<3>
+ RDSTestRec = Stats<4>
+ RDSTestRec = Stats<5>
+ End Case
+ //Log returned Data for the specific tool:
+ Metrology_Services('LogResults', RDSKeyID, Machine, '', Service : ' : Stats for ': Machine :' : ' : Stats)
+ Readings = obj_RDS_Test('Resistivity', RDSTestKeyID : @RM : RDSTestRec : @RM : 1)
+ Metrology_Services('LogResults', RDSKeyID, Machine, '', Service : ' : Readings: ' : Readings)
+ Conversion = 'MD4'
+ Readings = Oconv(Readings, Conversion)
+ rv = Set_Status(0)
+ Stats = obj_RDS_Test('CalcStats', Readings : @RM : Conversion)
+
+ //JRO Logging
+ StatsToLog = Stats
+ swap @RM with @FM in StatsToLog
+ Metrology_Services('LogResults', RDSKeyID, Machine, '', Service : ' : Stats: ' : StatsToLog)
+
+ If Get_Status(ErrorCode) EQ 0 then
+ Convert @RM to @FM in Stats
+ Stats<1> = Iconv(Stats<1>, Conversion)
+ Stats<2> = Iconv(Stats<2>, 'MD4')
+ Stats<3> = Iconv(Stats<3>, 'MD2')
+ Stats<4> = Iconv(Stats<4>, Conversion)
+ Stats<5> = Iconv(Stats<5>, Conversion)
+ Stats<6> = Iconv(Stats<6>, Conversion)
+ Stats<7> = Iconv(Stats<7>, 'MD4')
+ RDSTestRec = Stats<1>
+ RDSTestRec = Stats<2>
+ RDSTestRec = Stats<6>
+ RDSTestRec = Stats<7>
+ RDSTestRec = Stats<3>
+ RDSTestRec = Stats<4>
+ RDSTestRec = Stats<5>
+ //JRO Logging
+ Metrology_Services('LogResults', RDSKeyID, Machine, '', Service : ' : Stats To Write: ' : Stats)
+ end
+
+ Database_Services('WriteDataRow', 'RDS_TEST', RDSTestKeyID, RDSTestRec, True$, False$, True$)
+
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success - Calculated Results.')
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID002', Service : ' : UID002 - ' : Error_Services('GetMessage'))
+ end
+ end
+ end
+
+return
+
+
+ParseWorkOrder:
+
+ If Assigned(objWorkOrder) else objWorkOrder = 0
+ If objWorkOrder LE 0 then
+ SRP_JSON(objWorkOrder, 'PARSE', WorkOrder)
+ end
+ If objWorkOrder GT 0 then
+ WorkOrderNo = SRP_JSON(objWorkOrder, 'GETVALUE', 'WorkOrderNumber')
+ EpiPartNo = SRP_JSON(objWorkOrder, 'GETVALUE', 'EpiPartNumber')
+ WOReactorType = SRP_JSON(objWorkOrder, 'GETVALUE', 'ReactorType')
+ PSN = SRP_JSON(objWorkOrder, 'GETVALUE', 'PSN')
+ Recipe = SRP_JSON(objWorkOrder, 'GETVALUE', 'Recipe')
+ HotLot = Iconv(SRP_JSON(objWorkOrder, 'GETVALUE', 'HotLot'), 'BYes,No')
+ Closed = Iconv(SRP_JSON(objWorkOrder, 'GETVALUE', 'Closed'), 'BYes,No')
+ TotalWafers = SRP_JSON(objWorkOrder, 'GETVALUE', 'TotalWafers')
+ WafersRemaining = SRP_JSON(objWorkOrder, 'GETVALUE', 'WafersRemaining')
+ PercentComplete = SRP_JSON(objWorkOrder, 'GETVALUE', 'PercentComplete')
+ CustNameShort = SRP_JSON(objWorkOrder, 'GETVALUE', 'Company.NameShort')
+ SRP_JSON(objWorkOrder, 'RELEASE')
+ end else
+ EpiPartNo = ''
+ WOReactorType = ''
+ PSN = ''
+ Recipe = ''
+ HotLot = ''
+ Closed = ''
+ TotalWafers = ''
+ WafersRemaining = ''
+ PercentComplete = ''
+ CustNameShort = ''
+ end
+
+return
+
+
+LoadRunDataToDatabase:
+
+ // Thickness OR Resistivity OR Hg Resistivity Section Read the tool class base map
+ BaseMapID = RDSTestRec
+ Convert @Lower_Case to @Upper_Case in BaseMapID
+ TestPointMapRec = Database_Services('ReadDataRow', 'TEST_POINT_MAP', BaseMapID)
+ If Error_Services('NoError') then
+ BaseMapResults = TestPointMapRec
+ BaseMapPoints = TestPointMapRec
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ // Read the metrology tool map
+ PatternName = Trim(RDSTestRec)
+ Convert @Lower_Case to @Upper_Case in PatternName
+ ToolMapID = RDSTestRec
+ Convert @Lower_Case to @Upper_Case in ToolMapID
+ TestPointMapRec = Database_Services('ReadDataRow', 'TEST_POINT_MAP', ToolMapID)
+ If Error_Services('NoError') then
+ ToolMapResults = TestPointMapRec
+ ToolMapPoints = TestPointMapRec
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ ToolClassRow = Database_Services('ReadDataRow', 'TOOL_CLASS', ToolClassID)
+ If Error_Services('NoError') then
+ PatternNames = ToolClassRow
+ Convert @Lower_Case to @Upper_Case in PatternNames
+ Locate PatternName in PatternNames using @VM setting fPos then
+ PatternSize = ToolClassRow
+ If (NumDataPoints = PatternSize) then
+ ExistingData = false$
+ // Calculate the array offset for the thickness measurements.
+ If IsEpiPro then
+ // Perform test point mapping.
+ VirtualSize = DCount(BaseMapResults, @VM)
+ end else
+ VirtualSize = PatternSize
+ end
+ Offset = 17 - VirtualSize
+ If Offset LT 0 then Offset = 0
+ Offset = Int((Offset / 2) + 0.5)
+ // Clear the read values before populating with the new ones.
+ RDSTestRecPrev = RDSTestRec
+ RDSTestRec = ''
+ For ReadingCnt = 1 to NumDataPoints
+ If IsEpiPro then
+ // Perform test point mapping.
+ Locate Positions<0, ReadingCnt> in ToolMapResults using @VM setting tmPos then
+ ToolMapPoint = ToolMapPoints<0, tmPos>
+ Locate ToolMapPoint in BaseMapPoints using @VM setting bmPos then
+ Position = bmPos
+ end
+ end
+ end else
+ Position = Positions<0, ReadingCnt>
+ end
+ DataPoint = DataPoints<0, ReadingCnt>
+ IF RDSTestRecPrev NE '' then
+ ExistingData = true$
+ end
+ RDSTestRec = DataPoint
+ Next ReadingCnt
+ RDSTestRec = Timestamp
+
+ // Save results
+ if Not(ExistingData) OR IsViewerFile then
+ Database_Services('WriteDataRow', 'RDS_TEST', RDSTestKeyID, RDSTestRec, True$, False$, True$)
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
+ end
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success.')
+ GoSub CalculateResults
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - ' : Error_Services('GetMessage'))
+ end
+ end else
+ Error_Services('Add', 'Number of data points does not match the pattern size [' : PatternSize : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Error_Services('Add', 'Unable to locate the pattern name [' : PatternName : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+return
+
+
+
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..a668c68
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,6 @@
+{
+ "files.associations": {
+ "*.txt": "vba"
+ },
+ "cSpell.words": []
+}
\ No newline at end of file
diff --git a/LSL2/STPROC/METROLOGY_SERVICES.txt b/LSL2/STPROC/METROLOGY_SERVICES.txt
index 43d5adf..2f4241d 100644
--- a/LSL2/STPROC/METROLOGY_SERVICES.txt
+++ b/LSL2/STPROC/METROLOGY_SERVICES.txt
@@ -647,21 +647,47 @@ Service ImportMetrologyRunData(Machine, DataPath, FileName, RunData)
// Scan the run data for machine specific information. Then call the relevant update service for the specific
// machine.
+ ResourceID = Field(FileName, ' ', 1, 1)
+ IsViewerFile = Index(FileName, 'Viewer', 1)
Begin Case
Case Machine _EQC 'Stratus'
- Metrology_Services('ImportStratusData', RunData)
+ PSN = RunData<9>
+ QualFile = ( (PSN EQ 'T-Low') or (PSN EQ 'T-Mid') or (PSN EQ 'T-High') or (PSN EQ 'T_LOW') or (PSN EQ 'T_MID') or (PSN EQ 'T_HIGH') )
+ IF QualFile THEN
+ Metrology_Services('ImportStratusQualData', RunData, ResourceID, PSN)
+ END ELSE
+ Metrology_Services('ImportStratusData', RunData, ResourceID, PSN)
+ END
MachineType@ = 'Stratus'
Case Machine _EQC 'Biorad'
- Metrology_Services('ImportBioRadData', RunData, FileName)
+ PSN = RunData<7>
+ QualFile = ( (PSN EQ 'T-Low') or (PSN EQ 'T-Mid') or (PSN EQ 'T-High') or (PSN EQ 'T_LOW') or (PSN EQ 'T_MID') or (PSN EQ 'T_HIGH') )
+ IF QualFile THEN
+ Metrology_Services('ImportBioRadQualData', RunData, ResourceID, PSN)
+ END ELSE
+ Metrology_Services('ImportBioRadData', RunData, ResourceID, IsViewerFile, PSN, FileName)
+ END
MachineType@ = 'Bio-Rad'
Case Machine _EQC 'CDE'
- Metrology_Services('ImportCDEData', RunData, FileName)
+ PSN = RunData<8>
+ QualFile = ( (PSN EQ 'RLOW_STD') or (PSN EQ 'RMID_STD') or (PSN EQ 'RHI_STD') or (PSN EQ 'THINSPC') )
+ IF QualFile THEN
+ Metrology_Services('ImportCDEQualData', RunData, ResourceID, PSN)
+ END ELSE
+ Metrology_Services('ImportCDEData', RunData, ResourceID, IsViewerFile, PSN)
+ END
MachineType@ = 'CDE'
Case Machine _EQC 'HgCV'
- Metrology_Services('ImportHgCVData', RunData, FileName)
+ PSN = RunData<5>
+ QualFile = ( (PSN EQ 'Low') or (PSN EQ 'Mid') or (PSN EQ 'High') or (PSN EQ 'Thin') )
+ IF QualFile THEN
+ END ELSE
+ Metrology_Services('ImportHgCVQualData', RunData, ResourceID, PSN)
+ Metrology_Services('ImportHgCVData', RunData, ResourceID, IsViewerFile, PSN)
+ END
MachineType@ = 'HgProbe'
Case Machine _EQC 'SP1'
@@ -692,7 +718,44 @@ Service ImportMetrologyRunData(Machine, DataPath, FileName, RunData)
end service
-Service ImportStratusData(RunData)
+Service ImportStratusQualData(RunData, ResourceID, PSN)
+
+ Machine = 'Stratus'
+ URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ If Response NE '' then
+ objJSON = ''
+ If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
+ SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
+ ToolID = RunData<3>
+ TimeStamp = RunData<2>
+ If SumOOS NE '' then
+ Swap 'T_LOW' with 'T-Low' in PSN
+ Swap 'T_MID' with 'T-Mid' in PSN
+ Swap 'T_HIGH' with 'T-High' in PSN
+ Pass = (SumOOS EQ 0)
+ QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
+ StatusCode = QualResponse<1>
+ Message = QualResponse<2>
+ Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
+ end else
+ LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
+ end
+ SRP_JSON(objJSON, 'Release')
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
+ end
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
+ end
+
+end service
+
+
+Service ImportStratusData(RunData, ResourceID, PSN)
Machine = 'Stratus'
ParseArray = ''
@@ -707,7 +770,6 @@ Service ImportStratusData(RunData)
Recipe = RunData<6>
Reactor = RunData<7>
RDSNo = RunData<8> ; // If Non-EpiPro this will be an RDS Key, otherwise it will be a work order key.
- PSN = RunData<9>
BatchID = RunData<10>
Cassette = RunData<11>
ThickAvg = RunData<12>
@@ -866,7 +928,45 @@ Service ImportStratusData(RunData)
end service
-Service ImportBioRadData(RunData, FileName)
+Service ImportBioRadQualData(RunData, ResourceID, PSN)
+
+ Machine = 'BioRad'
+ URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ If Response NE '' then
+ objJSON = ''
+ If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
+ SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
+ ToolID = RunData<5>
+ TimeStamp = RunData<2>
+ If SumOOS NE '' then
+ Swap 'T_LOW' with 'T-Low' in PSN
+ Swap 'T_MID' with 'T-Mid' in PSN
+ Swap 'T_HIGH' with 'T-High' in PSN
+ Pass = (SumOOS EQ 0)
+ QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
+ StatusCode = QualResponse<1>
+ Message = QualResponse<2>
+ Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
+ end else
+ LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
+ end
+ SRP_JSON(objJSON, 'Release')
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
+ end
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
+ end
+
+end service
+
+
+Service ImportBioRadData(RunData, ResourceID, IsViewerFile, PSN, FileName)
+
Machine = 'BioRad'
IsProdTest = False$
ParseArray = ''
@@ -874,420 +974,31 @@ Service ImportBioRadData(RunData, FileName)
FieldPosIncrement = 2
Offset = 1
Decimals = 2
- PSN = RunData<7>
- QualFile = ( (PSN EQ 'T-Low') or (PSN EQ 'T-Mid') or (PSN EQ 'T-High') or (PSN EQ 'T_LOW') or (PSN EQ 'T_MID') or (PSN EQ 'T_HIGH') )
- If QualFile then
- ResourceID = Field(FileName, ' ', 1, 1)
- URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
- TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
- If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
- Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
- If Response NE '' then
- objJSON = ''
- If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
- SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
- ToolID = RunData<5>
- TimeStamp = RunData<2>
- If SumOOS NE '' then
- Swap 'T_LOW' with 'T-Low' in PSN
- Swap 'T_MID' with 'T-Mid' in PSN
- Swap 'T_HIGH' with 'T-High' in PSN
- Pass = (SumOOS EQ 0)
- QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
- StatusCode = QualResponse<1>
- Message = QualResponse<2>
- Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
- end else
- LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
- end
- SRP_JSON(objJSON, 'Release')
- end else
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
- end
- end else
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
- end
+ // RDS Biorad metrology file
+ Timestamp = RunData<2>
+ RDSKeyID = RunData<6>
+ RunDataLayer = RunData<8>
+ RunDataZone = RunData<9>
+ ReactorID = RunData<5>
+ ScanRecipe = RunData<4>
+ ToolClassID = 'FTIR'
+ PatternNameIndex = RDS_TEST_SPEC_THICK_MPATTERN$
+ ToolClassIndex = RDS_TEST_SPEC_THICK_MTOOL$
+ DataIndex = RDS_TEST_READ_THICK$
+ DTMIndex = RDS_TEST_TEST_RUN_THICKNESS_DTM$
+ // Clean the cassette user input.
+ Cassette = RDSKeyID
+ Swap '.' with '*' in Cassette
+ Swap 'o' with '' in Cassette
+ Swap 'O' with '' in Cassette
+ if RowExists('WM_OUT', Cassette) then
+ //Redirect to EPP FQA Import
+ Metrology_Services('ImportBioRadEPPFQAData', RunData, FileName)
end else
- // RDS Biorad metrology file
- IsViewerFile = Index(FileName, 'Viewer', 1)
- Timestamp = RunData<2>
- RDSKeyID = RunData<6>
- RunDataLayer = RunData<8>
- RunDataZone = RunData<9>
- ReactorID = RunData<5>
- ScanRecipe = RunData<4>
- ToolClassID = 'FTIR'
- PatternNameIndex = RDS_TEST_SPEC_THICK_MPATTERN$
- ToolClassIndex = RDS_TEST_SPEC_THICK_MTOOL$
- DataIndex = RDS_TEST_READ_THICK$
- DTMIndex = RDS_TEST_TEST_RUN_THICKNESS_DTM$
- // Clean the cassette user input.
- Cassette = RDSKeyID
- Swap '.' with '*' in Cassette
- Swap 'o' with '' in Cassette
- Swap 'O' with '' in Cassette
- if RowExists('WM_OUT', Cassette) then
- //Redirect to EPP FQA Import
- Metrology_Services('ImportBioRadEPPFQAData', RunData, FileName)
- end else
- RDSNo@ = RDSKeyID
- RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
- If Error_Services('NoError') then
- WorkOrderNo = RDSRec
-
- // HgCV Project Development Code -------------------------------------------------------------------------------
- DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
- If (DevelopmentFlag EQ True$) then
- IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
- If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
- end
- // -------------------------------------------------------------------------------------------------------------
- CassNo = RDSRec
- WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
- GoSub ParseWorkOrder
- IsEpiPro = (WOReactorType _EQC 'EpiPro') OR (WOReactorType _EQC 'EPP')
-
- RunDataZone = Metrology_Services('FormatZoneKeyID', RunDataZone) ; // 1, 2
- RunDataLayer = Metrology_Services('FormatLayerKeyID', RunDataLayer) ; // L1, L2, 2
-
- ZoneForValidation = RunDataZone
- LayerForValidation = RunDataLayer
- If LayerForValidation EQ '' then
- LayerForValidation = 'L1'
- end
-
- CalculatedZone = Metrology_Services('GetCalculatedZone', RDSKeyID, IsEpiPro, RunDataZone)
- If RunDataZone NE CalculatedZone then
- Error_Services('Add', 'Entered Zone [' : RunDataZone : '] and calculated Zone [' : CalculatedZone : '] do not match.')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- Transfer CalculatedZone to RunDataZone
-
- CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone, IsEpiPro, RunDataLayer)
- If (RunDataLayer NE CalculatedLayer) then
- Error_Services('Add', 'Entered Layer [' : RunDataLayer : '] and calculated Layer [' : CalculatedLayer : '] do not match for the Zone [' : RunDataZone : '].')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- Transfer CalculatedLayer to RunDataLayer
-
- ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
- If Error_Services('NoError') then
- ReactorType = ReactorRec
- If ReactorType _EQC 'EpiPro' OR ReactorType _EQC 'EPP' OR ReactorType _EQC 'P' then
- TestPointMapping = True$
- If RunDataLayer EQ '' OR RunDataZone EQ '' then
- Message = 'Layer and Zone are required for EpiPro.'
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
- Error_Services('Add', Message)
- end
- end else
- TestPointMapping = False$
- If RunDataLayer NE '' then
- RunDataZone = ''
- end else
- Message = 'Layer is required for non-EpiPro.'
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
- Error_Services('Add', Message)
- end
- end
-
- If Error_Services('NoError') then
- Positions = ''
- DataPoints = ''
- Loop
- Position = Trim(RunData)
- DataPoint = Trim(RunData)
- Until Position EQ ''
- Positions := Position : @VM
- DataPoints := DataPoint : @VM
- FieldPos += FieldPosIncrement
- Repeat
- Positions[-1, 1] = '' ; // Strip final @VM
- DataPoints[-1, 1] = '' ; // Strip final @VM
- RawDataPoints = DataPoints
- DataPoints = Iconv(DataPoints, 'MD' : Decimals)
-
- Swap ' AM' with 'AM' in Timestamp
- Swap ' PM' with 'PM' in Timestamp
- Timestamp = IConv(Timestamp,'DT')
- RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
- NumDataPoints = DCount(DataPoints, @VM)
- RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
- If Error_Services('NoError') then
- RDSTestKeyIDs = RDSLayerRec
- Found = False$
- If RDSTestKeyIDs NE '' then
- For Each RDSTestKeyID in RDSTestKeyIDs using @VM setting mkPos
- RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
- If Error_Services('NoError') then
- RDSTestZoneID = RDSTestRec
- // First test - Look for a Zone ID match.
- If (RDSTestZoneID EQ RunDataZone) then
- // A match has been found. No need to continue searching.
- Found = True$
- end
- end
- Until Found
- Next RDSTestKeyID
- end else
- Error_Services('Add', 'Unable to obtain a valid Metrology Test Key ID.')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
-
- // If not found this is because there was no zone. However, if this is not EpiPro, this is still a valid
- // test so set the found flag to true.
- If Not(Found) AND Not(IsEpiPro) then Found = True$
-
- If (Found EQ True$) then
- // Check if QA Metrology run or conventional RDS Metrology run.
- // Recipe name match requirement has been turned off per Tom Tillery. djs 10/03/18
- Begin Case
- Case IsProdTest
- // WO_MAT_QA THICK_ONLY test -> import and send to SPC
- LogPath = Environment_Services('GetSpcFilesharePath')
- LogPath2 = Environment_Services('GetApplicationRootPath') : '\Metrology'
- SendToSPC = False$
- Begin Case
- Case NumDataPoints EQ 5
- // Create 5 point SPC file
- objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_5Points.txt', CRLF$, Comma$, '', '', False$, True$)
- NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_5Points.txt', CRLF$, Comma$, '', '', False$, False$)
- SendToSPC = True$
- Case NumDataPoints EQ 9
- // Create 9 point SPC file
- objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, True$)
- NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, False$)
- SendToSPC = True$
- Case NumDataPoints EQ 10
- objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_10Points.txt', CRLF$, Comma$, '', '', False$, True$)
- NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_10Points.txt', CRLF$, Comma$, '', '', False$, False$)
- SendToSPC = True$
- Case NumDataPoints EQ 14
- objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, True$)
- NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, False$)
- SendToSPC = True$
- Case Otherwise$
- // Log this as it is unexpected
- NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_Points_Error.txt', CRLF$, Comma$, '', '', False$, False$)
- End Case
-
- LogData = ''
- LogData<1> = Oconv(Timestamp, 'DT/^HS') ; // Metrology date/time stamp
- LogData<2> = ReactorID ; // Reactor
- LogData<3> = RDSKeyID ; // RDS No
- LogData<4> = RunData<7> ; // PSN
- // Log data positions 5 through 10, 14, or 18 will be populated with data point measurements.
- Convert @VM to @FM in RawDataPoints
- Min = RawDataPoints<1>
- Max = RawDataPoints<1>
- For each DataPoint in RawDataPoints using @FM Setting DataPos
- Min = Min(Min, DataPoint)
- Max = Max(Max, DataPoint)
- LogData = DataPoint
- Next DataPoint
- LogData := @RM : ' '
- If SendToSPC then Logging_Services('AppendLog', objSPC, LogData, @RM, @FM, True$)
- Logging_Services('AppendLog', NotesLog, LogData, @RM, @FM, True$)
- Average = Sum(RawDataPoints) / NumDataPoints
- Average = Iconv(Average, 'MD3')
- Average = Oconv(Average, 'MD3')
- WOMatKey = Xlate('RDS', RDSKeyID, 'WO_MAT_KEY', 'X')
- WOMatQAID = WorkOrderNo : '*' : CassNo
- WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
- SpecRecipes = WOMatQARec
-
- WOStepNo = RDSRec[-1, 'B*']
- ProfSteps = ''
- ProfileCnt = DCount(WOMatQARec, @VM)
- For vPos = 1 to ProfileCnt
- ProfSteps<1, vPos> = WOMatQARec : '*' : WOMatQARec
- Next vPos
- LastProfSig = WOMatQARec
- SigProfKeys = 'THICK_ONLY'
- SigCnt = DCount(SigProfKeys, @VM)
- Stages = 'UNLOAD'
- SigProfFound = False$
- For Each SigProfKey in SigProfKeys using @VM setting vPos
- Stage = Stages<1, vPos>
- If Num(SigProfKey[1, 1]) else
- SigProfKey = WOStepNo : SigProfKey
- end
- ProfStep = SigProfKey : '*' : Stage
- Locate ProfStep in ProfSteps using @VM setting Pos then
- SigProfFound = True$
- UnloadSigned = Signature_Services('GetStageSummary', WoMatKey, 'UNLOAD')<2>
- IF (Stage EQ 'UNLOAD' AND UnloadSigned EQ True$) OR Stage NE 'UNLOAD' then
- // verify recipe is correct
- WoMatQaRecipe = WOMatQARec
- WoMatQaRecipeMatchesScanRecipe = ScanRecipe _EQC WoMatQaRecipe
- If WoMatQaRecipeMatchesScanRecipe EQ False$ then
- ErrMsg = 'Scan recipe [ ' : ScanRecipe : ' ] does not match WoMatQa recipe [ ' : WoMatQaRecipe : ' ] for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ].'
- Error_Services('Add', ErrMsg)
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
-
- // verify number of points is correct
- WoMatQaToolClass = WOMatQARec
- WoMatQaRecipePattern = WOMatQARec
- NumDataPointsInSpec = Tool_Class_Services('GetNumberOfPointsForPattern', WoMatQaToolClass, WoMatQaRecipePattern)
- WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints = NumDataPointsInSpec EQ NumDataPoints
-
- If WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints EQ False$ then
- ErrMsg = 'Scan data point count [ ' : NumDataPoints : ' ] does not match WoMatQa recipe pattern data point count [ ' : NumDataPointsInSpec : ' ] for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ].'
- Error_Services('Add', ErrMsg)
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
-
- If (WOMatQARec EQ '' OR IsViewerFile) then
- If WoMatQaRecipeMatchesScanRecipe and WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints then
- WOMatQARec = Average
- WOMatQARec = Oconv(Iconv(Min, 'MD3'), 'MD3')
- WOMatQARec = Oconv(Iconv(Max, 'MD3'), 'MD3')
- SpecMin = WOMatQARec
- SpecMax = WOMatQARec
- For each DataPoint in RawDataPoints using @FM setting SubValuePos
- FormatedData = Oconv(Iconv(DataPoint, 'MD3'), 'MD3')
- If NumDataPoints LT 14 then
- If ( ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) and (SubValuePos LT 10) ) then
- WOMatQARec = True$
- end
- end else
- If ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) then
- WOMatQARec = True$
- end
- end
- WOMatQARec = FormatedData
- Next DataPoint
- WOMatQARec = ''
- WOMatQARec = ''
- Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
- end
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
- end
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Unload signature must first be signed for this data to be uploaded.')
- end
- end
- Until SigProfFound
- Next SigProfKey
- If SigProfFound EQ True$ then
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Sig Prof. Found')
- end else
- Error_Services('Add', 'Unable to locate the signature profile [' : ProfStep : '].')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- Case Otherwise$
- // If not an above case, then the run is a conventional THICK_ONLY RDS metrology test.
-
- RDSLayerKeyID = RDSKeyID : '*' : LayerForValidation
- RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
- If Error_Services('NoError') then
- RDSTestKeyIDs = RDSLayerRec
-
- // Verify the scan recipe matches the spec recipe
- RecipeMatches = Metrology_Services('ScanRecipeMatchesRdsTestSpecThickMrecipe', RDSKeyID, LayerForValidation, ScanRecipe, RDSTestKeyIDs, ZoneForValidation)
- If RecipeMatches EQ False$ then
- ErrMsg = 'Scan recipe [ ' : ScanRecipe : ' ] does not match RDS Test recipe for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ] zone [ ' : CalculatedZone : ' ].'
- Error_Services('Add', ErrMsg)
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
-
- // Verfiy the scan number of points matches the spec number of points
- NumPointsMatches = Metrology_Services('ScanNumDataPointsMatchesRdsTestSpecThickMPattern', RDSKeyID, LayerForValidation, NumDataPoints, RDSTestKeyIDs, 'FTIR', ZoneForValidation)
- If NumPointsMatches EQ False$ then
- ErrMsg = 'Scan data point count [ ' : NumDataPoints : ' ] does not match RDS Test recipe pattern data point count for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ] zone [ ' : CalculatedZone : ' ].'
- Error_Services('Add', ErrMsg)
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
-
- If RecipeMatches and NumPointsMatches then
- GoSub LoadRunDataToDatabase
- end
- end else
- ErrMsg = 'RDS Test scan failed for RDS [' : RDSKeyID : '] layer [' : LayerForValidation : '], because unable to get RDS_LAYER record [' : RDSLayerKeyID : ']'
- Error_Services('Add', ErrMsg)
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- End Case
- end else
- Error_Services('Add', 'Data type / Spec not found for Layer [' : RunDataLayer : '].')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- end
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- end
- end
-
-end service
-
-
-Service ImportCDEData(RunData, FileName)
-
- Machine = 'CDE'
- ParseArray = ''
- FieldPos = 23
- FieldPosIncrement = 5
- Offset = 3
- Decimals = 3
- Timestamp = RunData<3>
- RDSKeyID = RunData<7>
- RunDataLayer = RunData<9>
- RunDataZone = RunData<10>
- ReactorID = RunData<6>
- ScanRecipe = RunData<5>
- PSN = RunData<8>
- QualFile = ( (PSN EQ 'RLOW_STD') or (PSN EQ 'RMID_STD') or (PSN EQ 'RHI_STD') or (PSN EQ 'THINSPC') )
- If QualFile then
- ResourceID = Field(FileName, ' ', 1, 1)
- URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
- TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
- If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
- Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
- If Response NE '' then
- If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
- SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
- ToolID = RunData<6>
- TimeStamp = RunData<3>
- If SumOOS NE '' then
- Pass = (SumOOS EQ 0)
- QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
- StatusCode = QualResponse<1>
- Message = QualResponse<2>
- Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
- end else
- LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
- end
- SRP_JSON(objJSON, 'Release')
- end else
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
- end
- end else
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
- end
-
- end else
- // Regular metrology file
- IsViewerFile = Index(FileName, 'Viewer', 1)
- ToolClassID = '4PP'
- PatternNameIndex = RDS_TEST_SPEC_RES_MPATTERN$
- ToolClassIndex = RDS_TEST_SPEC_RES_MTOOL$
- DataIndex = RDS_TEST_READ_SHEET_RHO$
- DTMIndex = RDS_TEST_TEST_RUN_SHEET_RHO_DTM$
- IsProdTest = False$
- RDSNo@ = RDSKeyID
- RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
+ RDSNo@ = RDSKeyID
+ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
If Error_Services('NoError') then
+ WorkOrderNo = RDSRec
// HgCV Project Development Code -------------------------------------------------------------------------------
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
@@ -1295,9 +1006,7 @@ Service ImportCDEData(RunData, FileName)
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
end
- // -------------------------------------------------------------------------------------------------------------
-
- WorkOrderNo = RDSRec
+ // -------------------------------------------------------------------------------------------------------------
CassNo = RDSRec
WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
GoSub ParseWorkOrder
@@ -1306,6 +1015,12 @@ Service ImportCDEData(RunData, FileName)
RunDataZone = Metrology_Services('FormatZoneKeyID', RunDataZone) ; // 1, 2
RunDataLayer = Metrology_Services('FormatLayerKeyID', RunDataLayer) ; // L1, L2, 2
+ ZoneForValidation = RunDataZone
+ LayerForValidation = RunDataLayer
+ If LayerForValidation EQ '' then
+ LayerForValidation = 'L1'
+ end
+
CalculatedZone = Metrology_Services('GetCalculatedZone', RDSKeyID, IsEpiPro, RunDataZone)
If RunDataZone NE CalculatedZone then
Error_Services('Add', 'Entered Zone [' : RunDataZone : '] and calculated Zone [' : CalculatedZone : '] do not match.')
@@ -1313,14 +1028,14 @@ Service ImportCDEData(RunData, FileName)
end
Transfer CalculatedZone to RunDataZone
- CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone)
- If RunDataLayer NE CalculatedLayer then
+ CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone, IsEpiPro, RunDataLayer)
+ If (RunDataLayer NE CalculatedLayer) then
Error_Services('Add', 'Entered Layer [' : RunDataLayer : '] and calculated Layer [' : CalculatedLayer : '] do not match for the Zone [' : RunDataZone : '].')
Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
Transfer CalculatedLayer to RunDataLayer
- ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
+ ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
If Error_Services('NoError') then
ReactorType = ReactorRec
If ReactorType _EQC 'EpiPro' OR ReactorType _EQC 'EPP' OR ReactorType _EQC 'P' then
@@ -1342,8 +1057,8 @@ Service ImportCDEData(RunData, FileName)
end
If Error_Services('NoError') then
- Positions = ''
- DataPoints = ''
+ Positions = ''
+ DataPoints = ''
Loop
Position = Trim(RunData)
DataPoint = Trim(RunData)
@@ -1352,15 +1067,14 @@ Service ImportCDEData(RunData, FileName)
DataPoints := DataPoint : @VM
FieldPos += FieldPosIncrement
Repeat
- RawDataPoints = DataPoints
Positions[-1, 1] = '' ; // Strip final @VM
DataPoints[-1, 1] = '' ; // Strip final @VM
+ RawDataPoints = DataPoints
DataPoints = Iconv(DataPoints, 'MD' : Decimals)
Swap ' AM' with 'AM' in Timestamp
Swap ' PM' with 'PM' in Timestamp
Timestamp = IConv(Timestamp,'DT')
-
RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
NumDataPoints = DCount(DataPoints, @VM)
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
@@ -1390,75 +1104,177 @@ Service ImportCDEData(RunData, FileName)
If Not(Found) AND Not(IsEpiPro) then Found = True$
If (Found EQ True$) then
- If (IsProdTest EQ True$) then
- // QA Metrology test (i.e. not RDS Metrology test)
- Convert @VM to @FM in RawDataPoints
- Min = RawDataPoints<1>
- Max = RawDataPoints<1>
- For each DataPoint in RawDataPoints using @FM Setting DataPos
- Min = Min(Min, DataPoint)
- Max = Max(Max, DataPoint)
- Next DataPoint
- Average = Sum(RawDataPoints) / NumDataPoints
- Average = Iconv(Average, 'MD3')
- Average = Oconv(Average, 'MD3')
- WOMatQAID = WorkOrderNo : '*' : CassNo
- WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
- SpecRecipes = WOMatQARec
- WOStepNo = RDSRec[-1, 'B*']
- ProfStep = ''
- ProfSteps = ''
- ProfileCnt = DCount(WOMatQARec, @VM)
- For vPos = 1 to ProfileCnt
- ProfSteps<1, vPos> = WOMatQARec : '*' : WOMatQARec
- Next vPos
- LastProfSig = WOMatQARec
- SigProfKeys = '1LW_RHO'
- SigCnt = DCount(SigProfKeys, @VM)
- Stages = 'UNLOAD'
- SigProfFound = False$
- UnloadSigned = Signature_Services('GetStageSummary', WOMatQAID, 'UNLOAD')<2>
- For Each SigProfKey in SigProfKeys using @VM setting vPos
- Stage = Stages<1, vPos>
- if (Stage EQ 'UNLOAD' AND UnloadSigned EQ True$) OR Stage NE 'UNLOAD' then
+ // Check if QA Metrology run or conventional RDS Metrology run.
+ // Recipe name match requirement has been turned off per Tom Tillery. djs 10/03/18
+ Begin Case
+ Case IsProdTest
+ // WO_MAT_QA THICK_ONLY test -> import and send to SPC
+ LogPath = Environment_Services('GetSpcFilesharePath')
+ LogPath2 = Environment_Services('GetApplicationRootPath') : '\Metrology'
+ SendToSPC = False$
+ Begin Case
+ Case NumDataPoints EQ 5
+ // Create 5 point SPC file
+ objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_5Points.txt', CRLF$, Comma$, '', '', False$, True$)
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_5Points.txt', CRLF$, Comma$, '', '', False$, False$)
+ SendToSPC = True$
+ Case NumDataPoints EQ 9
+ // Create 9 point SPC file
+ objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, True$)
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_9Points.txt', CRLF$, Comma$, '', '', False$, False$)
+ SendToSPC = True$
+ Case NumDataPoints EQ 10
+ objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_10Points.txt', CRLF$, Comma$, '', '', False$, True$)
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_10Points.txt', CRLF$, Comma$, '', '', False$, False$)
+ SendToSPC = True$
+ Case NumDataPoints EQ 14
+ objSPC = Logging_Services('NewLog', LogPath, OConv(Datetime(), 'DT_^1_HS_'):'_Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, True$)
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_14Points.txt', CRLF$, Comma$, '', '', False$, False$)
+ SendToSPC = True$
+ Case Otherwise$
+ // Log this as it is unexpected
+ NotesLog = Logging_Services('NewLog', LogPath2, 'Thickness_Points_Error.txt', CRLF$, Comma$, '', '', False$, False$)
+ End Case
+
+ LogData = ''
+ LogData<1> = Oconv(Timestamp, 'DT/^HS') ; // Metrology date/time stamp
+ LogData<2> = ReactorID ; // Reactor
+ LogData<3> = RDSKeyID ; // RDS No
+ LogData<4> = RunData<7> ; // PSN
+ // Log data positions 5 through 10, 14, or 18 will be populated with data point measurements.
+ Convert @VM to @FM in RawDataPoints
+ Min = RawDataPoints<1>
+ Max = RawDataPoints<1>
+ For each DataPoint in RawDataPoints using @FM Setting DataPos
+ Min = Min(Min, DataPoint)
+ Max = Max(Max, DataPoint)
+ LogData = DataPoint
+ Next DataPoint
+ LogData := @RM : ' '
+ If SendToSPC then Logging_Services('AppendLog', objSPC, LogData, @RM, @FM, True$)
+ Logging_Services('AppendLog', NotesLog, LogData, @RM, @FM, True$)
+ Average = Sum(RawDataPoints) / NumDataPoints
+ Average = Iconv(Average, 'MD3')
+ Average = Oconv(Average, 'MD3')
+ WOMatKey = Xlate('RDS', RDSKeyID, 'WO_MAT_KEY', 'X')
+ WOMatQAID = WorkOrderNo : '*' : CassNo
+ WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
+ SpecRecipes = WOMatQARec
+
+ WOStepNo = RDSRec[-1, 'B*']
+ ProfSteps = ''
+ ProfileCnt = DCount(WOMatQARec, @VM)
+ For vPos = 1 to ProfileCnt
+ ProfSteps<1, vPos> = WOMatQARec : '*' : WOMatQARec
+ Next vPos
+ LastProfSig = WOMatQARec
+ SigProfKeys = 'THICK_ONLY'
+ SigCnt = DCount(SigProfKeys, @VM)
+ Stages = 'UNLOAD'
+ SigProfFound = False$
+ For Each SigProfKey in SigProfKeys using @VM setting vPos
+ Stage = Stages<1, vPos>
If Num(SigProfKey[1, 1]) else
SigProfKey = WOStepNo : SigProfKey
end
ProfStep = SigProfKey : '*' : Stage
Locate ProfStep in ProfSteps using @VM setting Pos then
- SigProfFound = True$
- IF IsViewerFile OR WOMatQARec = '' then
- WOMatQARec = Average
- WOMatQARec = Oconv(Iconv(Min, 'MD3'), 'MD3')
- WOMatQARec = Oconv(Iconv(Max, 'MD3'), 'MD3')
- SpecMin = WOMatQARec
- SpecMax = WOMatQARec
- For each DataPoint in RawDataPoints using @FM setting SubValuePos
- FormatedData = Oconv(Iconv(DataPoint, 'MD3'), 'MD3')
- If ( ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) and (SubValuePos LT 10) ) then
- WOMatQARec = True$
+ SigProfFound = True$
+ UnloadSigned = Signature_Services('GetStageSummary', WoMatKey, 'UNLOAD')<2>
+ IF (Stage EQ 'UNLOAD' AND UnloadSigned EQ True$) OR Stage NE 'UNLOAD' then
+ // verify recipe is correct
+ WoMatQaRecipe = WOMatQARec
+ WoMatQaRecipeMatchesScanRecipe = ScanRecipe _EQC WoMatQaRecipe
+ If WoMatQaRecipeMatchesScanRecipe EQ False$ then
+ ErrMsg = 'Scan recipe [ ' : ScanRecipe : ' ] does not match WoMatQa recipe [ ' : WoMatQaRecipe : ' ] for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ].'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ // verify number of points is correct
+ WoMatQaToolClass = WOMatQARec
+ WoMatQaRecipePattern = WOMatQARec
+ NumDataPointsInSpec = Tool_Class_Services('GetNumberOfPointsForPattern', WoMatQaToolClass, WoMatQaRecipePattern)
+ WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints = NumDataPointsInSpec EQ NumDataPoints
+
+ If WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints EQ False$ then
+ ErrMsg = 'Scan data point count [ ' : NumDataPoints : ' ] does not match WoMatQa recipe pattern data point count [ ' : NumDataPointsInSpec : ' ] for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ].'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ If (WOMatQARec EQ '' OR IsViewerFile) then
+ If WoMatQaRecipeMatchesScanRecipe and WoMatQaRecipePatternNumPointsMatchesScanNumDataPoints then
+ WOMatQARec = Average
+ WOMatQARec = Oconv(Iconv(Min, 'MD3'), 'MD3')
+ WOMatQARec = Oconv(Iconv(Max, 'MD3'), 'MD3')
+ SpecMin = WOMatQARec
+ SpecMax = WOMatQARec
+ For each DataPoint in RawDataPoints using @FM setting SubValuePos
+ FormatedData = Oconv(Iconv(DataPoint, 'MD3'), 'MD3')
+ If NumDataPoints LT 14 then
+ If ( ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) and (SubValuePos LT 10) ) then
+ WOMatQARec = True$
+ end
+ end else
+ If ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) then
+ WOMatQARec = True$
+ end
+ end
+ WOMatQARec = FormatedData
+ Next DataPoint
+ WOMatQARec = ''
+ WOMatQARec = ''
+ Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
end
- WOMatQARec = FormatedData
- Next DataPoint
- Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
+ end
end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Unload signature must first be signed for this data to be uploaded.')
end
end
+ Until SigProfFound
+ Next SigProfKey
+ If SigProfFound EQ True$ then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Sig Prof. Found')
end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Unload signature must first be signed for this data to be uploaded.')
+ Error_Services('Add', 'Unable to locate the signature profile [' : ProfStep : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
- Until SigProfFound
- Next SigProfKey
- If SigProfFound EQ True$ then
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success.')
- end else
- Error_Services('Add', 'Unable to locate the signature profile [' : ProfStep : '].')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- end else
- GoSub LoadRunDataToDatabase
- end
+ Case Otherwise$
+ // If not an above case, then the run is a conventional THICK_ONLY RDS metrology test.
+
+ RDSLayerKeyID = RDSKeyID : '*' : LayerForValidation
+ RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
+ If Error_Services('NoError') then
+ RDSTestKeyIDs = RDSLayerRec
+
+ // Verify the scan recipe matches the spec recipe
+ RecipeMatches = Metrology_Services('ScanRecipeMatchesRdsTestSpecThickMrecipe', RDSKeyID, LayerForValidation, ScanRecipe, RDSTestKeyIDs, ZoneForValidation)
+ If RecipeMatches EQ False$ then
+ ErrMsg = 'Scan recipe [ ' : ScanRecipe : ' ] does not match RDS Test recipe for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ] zone [ ' : CalculatedZone : ' ].'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ // Verfiy the scan number of points matches the spec number of points
+ NumPointsMatches = Metrology_Services('ScanNumDataPointsMatchesRdsTestSpecThickMPattern', RDSKeyID, LayerForValidation, NumDataPoints, RDSTestKeyIDs, 'FTIR', ZoneForValidation)
+ If NumPointsMatches EQ False$ then
+ ErrMsg = 'Scan data point count [ ' : NumDataPoints : ' ] does not match RDS Test recipe pattern data point count for RDS [ ' : RDSKeyID : ' ] layer [ ' : CalculatedLayer : ' ] zone [ ' : CalculatedZone : ' ].'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ If RecipeMatches and NumPointsMatches then
+ GoSub LoadRunDataToDatabase
+ end
+ end else
+ ErrMsg = 'RDS Test scan failed for RDS [' : RDSKeyID : '] layer [' : LayerForValidation : '], because unable to get RDS_LAYER record [' : RDSLayerKeyID : ']'
+ Error_Services('Add', ErrMsg)
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ End Case
end else
Error_Services('Add', 'Data type / Spec not found for Layer [' : RunDataLayer : '].')
Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
@@ -1478,7 +1294,288 @@ Service ImportCDEData(RunData, FileName)
end service
-Service ImportHgCVData(RunData, FileName)
+Service ImportCDEQualData(RunData, ResourceID, PSN)
+
+ Machine = 'CDE'
+ ResourceID = Field(FileName, ' ', 1, 1)
+ URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ If Response NE '' then
+ If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
+ SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
+ ToolID = RunData<6>
+ TimeStamp = RunData<3>
+ If SumOOS NE '' then
+ Pass = (SumOOS EQ 0)
+ QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
+ StatusCode = QualResponse<1>
+ Message = QualResponse<2>
+ Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
+ end else
+ LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
+ end
+ SRP_JSON(objJSON, 'Release')
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
+ end
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
+ end
+
+end service
+
+
+Service ImportCDEData(RunData, ResourceID, IsViewerFile)
+
+ Machine = 'CDE'
+ ParseArray = ''
+ FieldPos = 23
+ FieldPosIncrement = 5
+ Offset = 3
+ Decimals = 3
+ Timestamp = RunData<3>
+ RDSKeyID = RunData<7>
+ RunDataLayer = RunData<9>
+ RunDataZone = RunData<10>
+ ReactorID = RunData<6>
+ ScanRecipe = RunData<5>
+ PSN = RunData<8>
+ // Regular metrology file
+ ToolClassID = '4PP'
+ PatternNameIndex = RDS_TEST_SPEC_RES_MPATTERN$
+ ToolClassIndex = RDS_TEST_SPEC_RES_MTOOL$
+ DataIndex = RDS_TEST_READ_SHEET_RHO$
+ DTMIndex = RDS_TEST_TEST_RUN_SHEET_RHO_DTM$
+ IsProdTest = False$
+ RDSNo@ = RDSKeyID
+ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
+ If Error_Services('NoError') then
+
+ // HgCV Project Development Code -------------------------------------------------------------------------------
+ DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
+ If (DevelopmentFlag EQ True$) then
+ IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
+ If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
+ end
+ // -------------------------------------------------------------------------------------------------------------
+
+ WorkOrderNo = RDSRec
+ CassNo = RDSRec
+ WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
+ GoSub ParseWorkOrder
+ IsEpiPro = (WOReactorType _EQC 'EpiPro') OR (WOReactorType _EQC 'EPP')
+
+ RunDataZone = Metrology_Services('FormatZoneKeyID', RunDataZone) ; // 1, 2
+ RunDataLayer = Metrology_Services('FormatLayerKeyID', RunDataLayer) ; // L1, L2, 2
+
+ CalculatedZone = Metrology_Services('GetCalculatedZone', RDSKeyID, IsEpiPro, RunDataZone)
+ If RunDataZone NE CalculatedZone then
+ Error_Services('Add', 'Entered Zone [' : RunDataZone : '] and calculated Zone [' : CalculatedZone : '] do not match.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedZone to RunDataZone
+
+ CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone)
+ If RunDataLayer NE CalculatedLayer then
+ Error_Services('Add', 'Entered Layer [' : RunDataLayer : '] and calculated Layer [' : CalculatedLayer : '] do not match for the Zone [' : RunDataZone : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedLayer to RunDataLayer
+
+ ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
+ If Error_Services('NoError') then
+ ReactorType = ReactorRec
+ If ReactorType _EQC 'EpiPro' OR ReactorType _EQC 'EPP' OR ReactorType _EQC 'P' then
+ TestPointMapping = True$
+ If RunDataLayer EQ '' OR RunDataZone EQ '' then
+ Message = 'Layer and Zone are required for EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end else
+ TestPointMapping = False$
+ If RunDataLayer NE '' then
+ RunDataZone = ''
+ end else
+ Message = 'Layer is required for non-EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end
+
+ If Error_Services('NoError') then
+ Positions = ''
+ DataPoints = ''
+ Loop
+ Position = Trim(RunData)
+ DataPoint = Trim(RunData)
+ Until Position EQ ''
+ Positions := Position : @VM
+ DataPoints := DataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ RawDataPoints = DataPoints
+ Positions[-1, 1] = '' ; // Strip final @VM
+ DataPoints[-1, 1] = '' ; // Strip final @VM
+ DataPoints = Iconv(DataPoints, 'MD' : Decimals)
+
+ Swap ' AM' with 'AM' in Timestamp
+ Swap ' PM' with 'PM' in Timestamp
+ Timestamp = IConv(Timestamp,'DT')
+
+ RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
+ NumDataPoints = DCount(DataPoints, @VM)
+ RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
+ If Error_Services('NoError') then
+ RDSTestKeyIDs = RDSLayerRec
+ Found = False$
+ If RDSTestKeyIDs NE '' then
+ For Each RDSTestKeyID in RDSTestKeyIDs using @VM setting mkPos
+ RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ RDSTestZoneID = RDSTestRec
+ // First test - Look for a Zone ID match.
+ If (RDSTestZoneID EQ RunDataZone) then
+ // A match has been found. No need to continue searching.
+ Found = True$
+ end
+ end
+ Until Found
+ Next RDSTestKeyID
+ end else
+ Error_Services('Add', 'Unable to obtain a valid Metrology Test Key ID.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+ // If not found this is because there was no zone. However, if this is not EpiPro, this is still a valid
+ // test so set the found flag to true.
+ If Not(Found) AND Not(IsEpiPro) then Found = True$
+
+ If (Found EQ True$) then
+ If (IsProdTest EQ True$) then
+ // QA Metrology test (i.e. not RDS Metrology test)
+ Convert @VM to @FM in RawDataPoints
+ Min = RawDataPoints<1>
+ Max = RawDataPoints<1>
+ For each DataPoint in RawDataPoints using @FM Setting DataPos
+ Min = Min(Min, DataPoint)
+ Max = Max(Max, DataPoint)
+ Next DataPoint
+ Average = Sum(RawDataPoints) / NumDataPoints
+ Average = Iconv(Average, 'MD3')
+ Average = Oconv(Average, 'MD3')
+ WOMatQAID = WorkOrderNo : '*' : CassNo
+ WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
+ SpecRecipes = WOMatQARec
+ WOStepNo = RDSRec[-1, 'B*']
+ ProfStep = ''
+ ProfSteps = ''
+ ProfileCnt = DCount(WOMatQARec, @VM)
+ For vPos = 1 to ProfileCnt
+ ProfSteps<1, vPos> = WOMatQARec : '*' : WOMatQARec
+ Next vPos
+ LastProfSig = WOMatQARec
+ SigProfKeys = '1LW_RHO'
+ SigCnt = DCount(SigProfKeys, @VM)
+ Stages = 'UNLOAD'
+ SigProfFound = False$
+ UnloadSigned = Signature_Services('GetStageSummary', WOMatQAID, 'UNLOAD')<2>
+ For Each SigProfKey in SigProfKeys using @VM setting vPos
+ Stage = Stages<1, vPos>
+ if (Stage EQ 'UNLOAD' AND UnloadSigned EQ True$) OR Stage NE 'UNLOAD' then
+ If Num(SigProfKey[1, 1]) else
+ SigProfKey = WOStepNo : SigProfKey
+ end
+ ProfStep = SigProfKey : '*' : Stage
+ Locate ProfStep in ProfSteps using @VM setting Pos then
+ SigProfFound = True$
+ IF IsViewerFile OR WOMatQARec = '' then
+ WOMatQARec = Average
+ WOMatQARec = Oconv(Iconv(Min, 'MD3'), 'MD3')
+ WOMatQARec = Oconv(Iconv(Max, 'MD3'), 'MD3')
+ SpecMin = WOMatQARec
+ SpecMax = WOMatQARec
+ For each DataPoint in RawDataPoints using @FM setting SubValuePos
+ FormatedData = Oconv(Iconv(DataPoint, 'MD3'), 'MD3')
+ If ( ( FormatedData LT SpecMin ) OR ( FormatedData GT SpecMax ) and (SubValuePos LT 10) ) then
+ WOMatQARec = True$
+ end
+ WOMatQARec = FormatedData
+ Next DataPoint
+ Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
+ end
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Unload signature must first be signed for this data to be uploaded.')
+ end
+ Until SigProfFound
+ Next SigProfKey
+ If SigProfFound EQ True$ then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success.')
+ end else
+ Error_Services('Add', 'Unable to locate the signature profile [' : ProfStep : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ GoSub LoadRunDataToDatabase
+ end
+ end else
+ Error_Services('Add', 'Data type / Spec not found for Layer [' : RunDataLayer : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+
+end service
+
+
+Service ImportHgCVQualData(RunData, ResourceID, PSN)
+
+ Machine = 'HgCV' /* Resistivity */
+ URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
+ TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
+ If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
+ Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
+ If Response NE '' then
+ If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
+ SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
+ ToolID = RunData<2>
+ TimeStamp = RunData<11>
+ If SumOOS NE '' then
+ Pass = (SumOOS EQ 0)
+ QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
+ StatusCode = QualResponse<1>
+ Message = QualResponse<2>
+ Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
+ end else
+ LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
+ end
+ SRP_JSON(objJSON, 'Release')
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
+ end
+ end else
+ Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
+ end
+
+end service
+
+
+Service ImportHgCVData(RunData, PSN)
Machine = 'HgCV' /* Resistivity */
FieldPos = 53
@@ -1490,332 +1587,299 @@ Service ImportHgCVData(RunData, FileName)
RDSKeyID = RunData<4>
LayerZonePair = RunData<8>
ReactorID = RunData<3>
- PSN = RunData<5>
- QualFile = ( (PSN EQ 'Low') or (PSN EQ 'Mid') or (PSN EQ 'High') or (PSN EQ 'Thin') )
- If QualFile then
- ResourceID = Field(FileName, ' ', 1, 1)
- URL = "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/":ResourceID:"/header"
- TimeoutDuration = HTTPClient_Services('GetTimeoutDuration')
- If TimeoutDuration NE 30 then Httpclient_Services('SetTimeoutDuration', 30)
- Response = Httpclient_Services('SendHTTPRequest', 'GET', URL, '', '', '', '', '', '', '')
- If Response NE '' then
- If SRP_JSON(objJSON, 'Parse', Response) EQ '' then
- SumOOS = SRP_JSON(objJSON, 'GetValue', 'Results[1].iq_sum')
- ToolID = RunData<2>
- TimeStamp = RunData<11>
- If SumOOS NE '' then
- Pass = (SumOOS EQ 0)
- QualResponse = PM_Services('ProcessQual', PSN, ToolID, TimeStamp, Pass)
- StatusCode = QualResponse<1>
- Message = QualResponse<2>
- Metrology_Services('LogResults', PSN, Machine, StatusCode, Service : ' : ' : Message)
- end else
- LogMessage = 'IQS response missing Results[1].iq_sum. Error message: ':SRP_JSON(objJSON, 'GetValue', 'message')
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : LogMessage)
- end
- SRP_JSON(objJSON, 'Release')
- end else
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to parse IQS JSON response')
- end
- end else
- Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Null response from IQS API.')
- end
- end else
- // Regular metrology file
- IsViewerFile = Index(FileName, 'Viewer', 1)
- ToolClassID = 'HGCV'
- PatternNameIndex = RDS_TEST_SPEC_RES_MPATTERN$
- ToolClassIndex = RDS_TEST_SPEC_RES_MTOOL$
- DataIndex = RDS_TEST_READ_HGCV1_RES$
- DTMIndex = RDS_TEST_TEST_RUN_HGCV_DTM$
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : ' : 'Beginning ImportHgCVData')
- RDSNo@ = RDSKeyID
- RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
+ // Regular metrology file
+ ToolClassID = 'HGCV'
+ PatternNameIndex = RDS_TEST_SPEC_RES_MPATTERN$
+ ToolClassIndex = RDS_TEST_SPEC_RES_MTOOL$
+ DataIndex = RDS_TEST_READ_HGCV1_RES$
+ DTMIndex = RDS_TEST_TEST_RUN_HGCV_DTM$
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : ' : 'Beginning ImportHgCVData')
+ RDSNo@ = RDSKeyID
+ RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
+ If Error_Services('NoError') then
+ WorkOrderNo = RDSRec
+ CassNo = RDSRec
+ WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
+ GoSub ParseWorkOrder
+ IsEpiPro = (WOReactorType _EQC 'EpiPro') OR (WOReactorType _EQC 'EPP')
+
+ Convert @Lower_Case to @Upper_Case in LayerZonePair
+ Convert 'Z' to '-' in LayerZonePair
+ Swap '--' with '-' in LayerZonePair
+ RunDataLayer = Field(LayerZonePair, '-', 1)
+ RunDataZone = Field(LayerZonePair, '-', 2)
+ RunDataZone = Metrology_Services('FormatZoneKeyID', RunDataZone) ; // 1, 2
+ RunDataLayer = Metrology_Services('FormatLayerKeyID', RunDataLayer) ; // L1, L2, 2
+
+ CalculatedZone = Metrology_Services('GetCalculatedZone', RDSKeyID, IsEpiPro, RunDataZone)
+ If RunDataZone NE CalculatedZone then
+ Error_Services('Add', 'Entered Zone [' : RunDataZone : '] and calculated Zone [' : CalculatedZone : '] do not match.')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedZone to RunDataZone
+
+ CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone)
+ If RunDataLayer NE CalculatedLayer then
+ Error_Services('Add', 'Entered Layer [' : RunDataLayer : '] and calculated Layer [' : CalculatedLayer : '] do not match for the Zone [' : RunDataZone : '].')
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ Transfer CalculatedLayer to RunDataLayer
+
+ ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
If Error_Services('NoError') then
- WorkOrderNo = RDSRec
- CassNo = RDSRec
- WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
- GoSub ParseWorkOrder
- IsEpiPro = (WOReactorType _EQC 'EpiPro') OR (WOReactorType _EQC 'EPP')
-
- Convert @Lower_Case to @Upper_Case in LayerZonePair
- Convert 'Z' to '-' in LayerZonePair
- Swap '--' with '-' in LayerZonePair
- RunDataLayer = Field(LayerZonePair, '-', 1)
- RunDataZone = Field(LayerZonePair, '-', 2)
- RunDataZone = Metrology_Services('FormatZoneKeyID', RunDataZone) ; // 1, 2
- RunDataLayer = Metrology_Services('FormatLayerKeyID', RunDataLayer) ; // L1, L2, 2
-
- CalculatedZone = Metrology_Services('GetCalculatedZone', RDSKeyID, IsEpiPro, RunDataZone)
- If RunDataZone NE CalculatedZone then
- Error_Services('Add', 'Entered Zone [' : RunDataZone : '] and calculated Zone [' : CalculatedZone : '] do not match.')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- Transfer CalculatedZone to RunDataZone
-
- CalculatedLayer = Metrology_Services('GetCalculatedLayer', RDSKeyID, Machine, RunDataZone)
- If RunDataLayer NE CalculatedLayer then
- Error_Services('Add', 'Entered Layer [' : RunDataLayer : '] and calculated Layer [' : CalculatedLayer : '] do not match for the Zone [' : RunDataZone : '].')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- Transfer CalculatedLayer to RunDataLayer
-
- ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorID)
- If Error_Services('NoError') then
- ReactorType = ReactorRec
- If ReactorType _EQC 'EpiPro' OR ReactorType _EQC 'EPP' OR ReactorType _EQC 'P' then
- TestPointMapping = True$
- If RunDataLayer EQ '' OR RunDataZone EQ '' then
- Message = 'Layer and Zone are required for EpiPro.'
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
- Error_Services('Add', Message)
- end
+ ReactorType = ReactorRec
+ If ReactorType _EQC 'EpiPro' OR ReactorType _EQC 'EPP' OR ReactorType _EQC 'P' then
+ TestPointMapping = True$
+ If RunDataLayer EQ '' OR RunDataZone EQ '' then
+ Message = 'Layer and Zone are required for EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end else
+ TestPointMapping = False$
+ If RunDataLayer NE '' then
+ RunDataZone = ''
end else
- TestPointMapping = False$
- If RunDataLayer NE '' then
- RunDataZone = ''
- end else
- Message = 'Layer is required for non-EpiPro.'
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
- Error_Services('Add', Message)
- end
- end
+ Message = 'Layer is required for non-EpiPro.'
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Message)
+ Error_Services('Add', Message)
+ end
+ end
+ If Error_Services('NoError') then
+ Position = ''
+ Positions = ''
+ DataPoints = ''
+ HgCVDataPoints = ''
+ Loop
+ Position = Trim(RunData)
+ HgCVDataPoint = Trim(RunData)
+ Until Position EQ ''
+ Positions := Position : @VM
+ HgCVDataPoints := HgCVDataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ Positions[-1, 1] = '' ; // Strip final @VM
+ HgCVDataPoints[-1, 1] = '' ; // Strip final @VM
+
+ HgCVDataPoints = Iconv(HgCVDataPoints, 'MD' : Decimals)
+
+ Swap ' AM' with 'AM' in Timestamp
+ Swap ' PM' with 'PM' in Timestamp
+ Timestamp = IConv(Timestamp,'DT')
+
+ RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
+ NumDataPoints = DCount(HgCVDataPoints, @VM)
+ RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
If Error_Services('NoError') then
- Position = ''
- Positions = ''
- DataPoints = ''
- HgCVDataPoints = ''
- Loop
- Position = Trim(RunData)
- HgCVDataPoint = Trim(RunData)
- Until Position EQ ''
- Positions := Position : @VM
- HgCVDataPoints := HgCVDataPoint : @VM
- FieldPos += FieldPosIncrement
- Repeat
- Positions[-1, 1] = '' ; // Strip final @VM
- HgCVDataPoints[-1, 1] = '' ; // Strip final @VM
-
- HgCVDataPoints = Iconv(HgCVDataPoints, 'MD' : Decimals)
-
- Swap ' AM' with 'AM' in Timestamp
- Swap ' PM' with 'PM' in Timestamp
- Timestamp = IConv(Timestamp,'DT')
-
- RDSLayerKeyID = RDSKeyID : '*' : RunDataLayer
- NumDataPoints = DCount(HgCVDataPoints, @VM)
- RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKeyID)
- If Error_Services('NoError') then
- RDSTestKeyIDs = RDSLayerRec
- Found = False$
- If RDSTestKeyIDs NE '' then
- For Each RDSTestKeyID in RDSTestKeyIDs using @VM setting mkPos
- RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
- If Error_Services('NoError') then
- RDSTestZoneID = RDSTestRec
- // Determine if this is Hg Concentration Resistivity.
- IsHgCvCRes = RDSTestRec _EQC 'HGCV'
- // First test - Look for a Zone ID match.
- If (RDSTestZoneID EQ RunDataZone) then
- // A match has been found. No need to continue searching.
- Found = True$
- end
+ RDSTestKeyIDs = RDSLayerRec
+ Found = False$
+ If RDSTestKeyIDs NE '' then
+ For Each RDSTestKeyID in RDSTestKeyIDs using @VM setting mkPos
+ RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKeyID)
+ If Error_Services('NoError') then
+ RDSTestZoneID = RDSTestRec
+ // Determine if this is Hg Concentration Resistivity.
+ IsHgCvCRes = RDSTestRec _EQC 'HGCV'
+ // First test - Look for a Zone ID match.
+ If (RDSTestZoneID EQ RunDataZone) then
+ // A match has been found. No need to continue searching.
+ Found = True$
end
- Until Found
- Next RDSTestKeyID
- If (Found EQ True$) then
- // Only continue checking if there are data points. Otherwise, there is no data by which
- // the code can calculate values to store.
- If NumDataPoints GT 0 then
- // Second test - If HgCv Res, dig deeper to see if this is a possible CRES entry..
- If IsHgCvCRes then
- WOMatQAID = WorkOrderNo : '*' : CassNo
- WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
- If Error_Services('NoError') then
- Locate 'CRES' in WOMatQARec using @VM setting vPos then
- Stage = WOMatQARec
- RequireUnload = False$
- IF (WOMatQARec EQ '' OR IsViewerFile) then
- PhaseDataPoints = ''
- Positions = ''
- Position = ''
- FieldPos = 53
- Loop
- Position = Trim(RunData)
- PhaseDataPoint = Trim(RunData)
- Until Position EQ ''
- Positions := Position : @VM
- PhaseDataPoints := PhaseDataPoint : @VM
- FieldPos += FieldPosIncrement
- Repeat
- Positions[-1, 1] = '' ; // Strip final @VM
- PhaseDataPoints[-1, 1] = '' ; // Strip final @VM
- PhaseDataPoints = Iconv(PhaseDataPoints, 'MD' : Decimals)
- DataPoints = HgCVDataPoints
- * GoSub CalculateQAData
- Response = QA_Services('CalculateHgCVData', Datapoints)
- HgCVMin = Response<0, 2>
- HgCVMax = Response<0, 3>
- HgCVAvg = Response<0, 1>
- HgCVEdgeMean = Response<0, 4>
- HgCVRangePct = Response<0, 5>
- EdgeMean4mm = Response<0, 6>
- Avg9Point = Response<0, 7>
- EdgeMean10mm = Response<0, 8>
- ResStdDev = Response<0, 9>
+ end
+ Until Found
+ Next RDSTestKeyID
+ If (Found EQ True$) then
+ // Only continue checking if there are data points. Otherwise, there is no data by which
+ // the code can calculate values to store.
+ If NumDataPoints GT 0 then
+ // Second test - If HgCv Res, dig deeper to see if this is a possible CRES entry..
+ If IsHgCvCRes then
+ WOMatQAID = WorkOrderNo : '*' : CassNo
+ WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAID)
+ If Error_Services('NoError') then
+ Locate 'CRES' in WOMatQARec using @VM setting vPos then
+ Stage = WOMatQARec
+ RequireUnload = False$
+ IF (WOMatQARec EQ '' OR IsViewerFile) then
+ PhaseDataPoints = ''
+ Positions = ''
+ Position = ''
+ FieldPos = 53
+ Loop
+ Position = Trim(RunData)
+ PhaseDataPoint = Trim(RunData)
+ Until Position EQ ''
+ Positions := Position : @VM
+ PhaseDataPoints := PhaseDataPoint : @VM
+ FieldPos += FieldPosIncrement
+ Repeat
+ Positions[-1, 1] = '' ; // Strip final @VM
+ PhaseDataPoints[-1, 1] = '' ; // Strip final @VM
+ PhaseDataPoints = Iconv(PhaseDataPoints, 'MD' : Decimals)
+ DataPoints = HgCVDataPoints
+ * GoSub CalculateQAData
+ Response = QA_Services('CalculateHgCVData', Datapoints)
+ HgCVMin = Response<0, 2>
+ HgCVMax = Response<0, 3>
+ HgCVAvg = Response<0, 1>
+ HgCVEdgeMean = Response<0, 4>
+ HgCVRangePct = Response<0, 5>
+ EdgeMean4mm = Response<0, 6>
+ Avg9Point = Response<0, 7>
+ EdgeMean10mm = Response<0, 8>
+ ResStdDev = Response<0, 9>
- DataPoints = PhaseDataPoints
- Response = QA_Services('CalculateHgCVData', Datapoints)
- * GoSub CalculateQAData
- PhaseMin = Response<0, 2>
- PhaseMax = Response<0, 3>
- PhaseAvg = Response<0, 1>
- PhaseEdgeMean = Response<0, 4>
- PhaseRangePct = Response<0, 5>
- // Format data. Round to significant digits.
- * HgCVAvg = Oconv(Iconv(Oconv(HgCVAvg, 'MD3L'), 'MD3L'), 'MD3L')
- * PhaseAvg = Oconv(Iconv(Oconv(PhaseAvg, 'MD3L'), 'MD3L'), 'MD3L')
- * HgCVMin = Oconv(Iconv(Oconv(HgCVMin, 'MD3L'), 'MD3L'), 'MD3L')
- * HgCVMax = Oconv(Iconv(Oconv(HgCVMax, 'MD3L'), 'MD3L'), 'MD3L')
- * PhaseMin = Oconv(Iconv(Oconv(PhaseMin, 'MD3L'), 'MD3L'), 'MD3L')
- * PhaseMax = Oconv(Iconv(Oconv(PhaseMax, 'MD3L'), 'MD3L'), 'MD3L')
- * HgCVEdgeMean = OConv(IConv(HgCVEdgeMean, 'MD3L'), 'MD3L')
- * PhaseEdgeMean = Oconv(IConv(PhaseEdgeMean, 'MD3L'), 'MD3L')
- * HgCVRangePct = Oconv(Iconv(HgCVRangePct, 'MD3L'), 'MD3L')
- * PhaseRangePct = Oconv(Iconv(PhaseRangePct, 'MD3L'), 'MD3L')
- WOMatQARec = HgCVAvg : @SVM : PhaseAvg
- WOMatQARec = HgCVMin : @SVM : PhaseMin
- WOMatQARec = HgCVMax : @SVM : PhaseMax
- WOMatQARec = HgCVRangePct : @SVM : PhaseRangePct
- WOMatQARec = HgCVEdgeMean : @SVM : PhaseEdgeMean
- SpecMin = WOMatQARec
- SpecMax = WOMatQARec
- SpecPhaseMin = WOMatQARec
- If SpecPhaseMin EQ '' then
- // Phase Min Spec was not added to WO_MAT_QA record when it should have been.
- // This bug should be fixed now, but in the meantime current records in production
- // may not have a phase min specification value. We need to add it here. - djs - 10/15/18
- PSN = Xlate('RDS', RDSKeyID, 'PROD_SPEC_ID', 'X')
- If PSN NE '' then
- PRSStageKey = PSN:'*UNLOAD'
- Database_Services('ActivateRecord', 'PRS_STAGE', PRSStageKey)
- MetProps = {MET_PROP}
- Locate 'CRES' in MetProps using @VM setting PropPos then
- SpecPhaseMinCol = {MET_PHASE_MIN}
- SpecPhaseMin = SpecPhaseMinCol<1, PropPos>
- WOMatQARec = SpecPhaseMin
- end
- end
- end
- CriticalPoints = '1,2,5,6,9'
- // Store data points for HgCV Data Table Project --------------------------------------------------------------
- For Index = 1 to NumDataPoints
- CriticalPoint = Index(CriticalPoints, Index, 1)
- HgCVData = Oconv(Iconv(Oconv(HgCVDataPoints<0,Index>, 'MD3L'), 'MD3L'), 'MD3L')
- PhaseData = Oconv(Iconv(Oconv(PhaseDataPoints<0,Index>, 'MD3L'), 'MD3L'), 'MD3L')
- If ( (HgCVData LT SpecMin) OR (HgCVData GT SpecMax) OR (PhaseData LT SpecPhaseMin) ) and CriticalPoint then
- // Data point out of spec
- WOMatQARec = True$
- end
- DataRow = HgCVData : @TM : PhaseData
- WOMatQARec = DataRow
- Next Index
- // ------------------------------------------------------------------------------------------------------------
-
- // Send data to SPC -------------------------------------------------------------------------------------------
- LogPath = Environment_Services('GetSpcFilesharePath')
- SpcFileDtm = OConv(Datetime(), 'DT2^HS ')
- Convert ' ' to '_' in SpcFileDtm
- SpcLogFilename = 'HgCV_Unload_Res_9Points_':SpcFileDtm:'.txt'
- objSPC = Logging_Services('NewLog', LogPath, SpcLogFilename, CRLF$, Comma$, '', '', False$, True$)
- If Error_Services('NoError') then
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Successfully created blank SPC file.')
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Failed to create blank SPC file. Error message: ':Error_Services('GetMessage'))
- end
- LogData = ''
- LogData<1> = Oconv(Timestamp, 'DT/^HS') ; // Metrology date/time stamp
- LogData<2> = ReactorID ; // Reactor
- LogData<3> = RDSKeyID ; // RDS No
- LogData<4> = Xlate('RDS', RDSKeyID, 'PROD_SPEC_ID', 'X'); // PSN
- WaferSize = Xlate('RDS', RDSKeyID, 'WAFER_SIZE', 'X')
- WaferSize = Field(WaferSize, ' ', 3)
- LogData<5> = WaferSize:' Inch' ; // Wafer Size
- FormattedData = Oconv(HgCVDataPoints, 'MD3L')
- Swap @VM with ',' in FormattedData
- LogData<6> = FormattedData
- LogData<7> = OConv(PhaseAvg, 'MD43L')
- LogData<8> = OConv(HgCVAvg, 'MD43L') ; // HgCV Res Avg
- LogData<9> = OConv(ResStdDev, 'MD83L') ; // HgCV Res Std Dev
- LogData<10> = HgCVRangePct ; // HgCV Res Range %
- LogData<11> = OConv(EdgeMean4mm, 'MD43L') ; // HgCV 4mm Edge Mean
- LogData<12> = OConv(Avg9Point, 'MD83L') ; // HgCV 9 Point Mean
- LogData<13> = OConv(EdgeMean10mm, 'MD43L') ; // HgCV 10mm Edge Mean
- LogData<14> = HgCVEdgeMean ; // HgCV Edge Mean Delta %
- LogData := @RM : ' '
- Logging_Services('AppendLog', objSPC, LogData, @RM, @FM, True$)
- If Error_Services('NoError') then
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Successfully updated SPC file with metrology data.')
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Failed to update SPC file with metrology data. Error message: ':Error_Services('GetMessage'))
- end
- // ------------------------------------------------------------------------------------------------------------
-
- WOMatQARec = ''
- WOMatQARec = ''
- Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
- If Error_Services('NoError') then
- RDSTestRec = Timestamp
- // Save results
- Database_Services('WriteDataRow', 'RDS_TEST', RDSTestKeyID, RDSTestRec, True$, False$, True$)
- If Error_Services('NoError') then
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success - Hg CRes.')
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID002', Service : ' : UID002 - ' : Error_Services('GetMessage'))
- end
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
- end
- // We know it is a CRES test, so we can now safely import the Phase Angle data
-
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
+ DataPoints = PhaseDataPoints
+ Response = QA_Services('CalculateHgCVData', Datapoints)
+ * GoSub CalculateQAData
+ PhaseMin = Response<0, 2>
+ PhaseMax = Response<0, 3>
+ PhaseAvg = Response<0, 1>
+ PhaseEdgeMean = Response<0, 4>
+ PhaseRangePct = Response<0, 5>
+ // Format data. Round to significant digits.
+ * HgCVAvg = Oconv(Iconv(Oconv(HgCVAvg, 'MD3L'), 'MD3L'), 'MD3L')
+ * PhaseAvg = Oconv(Iconv(Oconv(PhaseAvg, 'MD3L'), 'MD3L'), 'MD3L')
+ * HgCVMin = Oconv(Iconv(Oconv(HgCVMin, 'MD3L'), 'MD3L'), 'MD3L')
+ * HgCVMax = Oconv(Iconv(Oconv(HgCVMax, 'MD3L'), 'MD3L'), 'MD3L')
+ * PhaseMin = Oconv(Iconv(Oconv(PhaseMin, 'MD3L'), 'MD3L'), 'MD3L')
+ * PhaseMax = Oconv(Iconv(Oconv(PhaseMax, 'MD3L'), 'MD3L'), 'MD3L')
+ * HgCVEdgeMean = OConv(IConv(HgCVEdgeMean, 'MD3L'), 'MD3L')
+ * PhaseEdgeMean = Oconv(IConv(PhaseEdgeMean, 'MD3L'), 'MD3L')
+ * HgCVRangePct = Oconv(Iconv(HgCVRangePct, 'MD3L'), 'MD3L')
+ * PhaseRangePct = Oconv(Iconv(PhaseRangePct, 'MD3L'), 'MD3L')
+ WOMatQARec = HgCVAvg : @SVM : PhaseAvg
+ WOMatQARec = HgCVMin : @SVM : PhaseMin
+ WOMatQARec = HgCVMax : @SVM : PhaseMax
+ WOMatQARec = HgCVRangePct : @SVM : PhaseRangePct
+ WOMatQARec = HgCVEdgeMean : @SVM : PhaseEdgeMean
+ SpecMin = WOMatQARec
+ SpecMax = WOMatQARec
+ SpecPhaseMin = WOMatQARec
+ If SpecPhaseMin EQ '' then
+ // Phase Min Spec was not added to WO_MAT_QA record when it should have been.
+ // This bug should be fixed now, but in the meantime current records in production
+ // may not have a phase min specification value. We need to add it here. - djs - 10/15/18
+ PSN = Xlate('RDS', RDSKeyID, 'PROD_SPEC_ID', 'X')
+ If PSN NE '' then
+ PRSStageKey = PSN:'*UNLOAD'
+ Database_Services('ActivateRecord', 'PRS_STAGE', PRSStageKey)
+ MetProps = {MET_PROP}
+ Locate 'CRES' in MetProps using @VM setting PropPos then
+ SpecPhaseMinCol = {MET_PHASE_MIN}
+ SpecPhaseMin = SpecPhaseMinCol<1, PropPos>
+ WOMatQARec = SpecPhaseMin
+ end
+ end
end
+ CriticalPoints = '1,2,5,6,9'
+ // Store data points for HgCV Data Table Project --------------------------------------------------------------
+ For Index = 1 to NumDataPoints
+ CriticalPoint = Index(CriticalPoints, Index, 1)
+ HgCVData = Oconv(Iconv(Oconv(HgCVDataPoints<0,Index>, 'MD3L'), 'MD3L'), 'MD3L')
+ PhaseData = Oconv(Iconv(Oconv(PhaseDataPoints<0,Index>, 'MD3L'), 'MD3L'), 'MD3L')
+ If ( (HgCVData LT SpecMin) OR (HgCVData GT SpecMax) OR (PhaseData LT SpecPhaseMin) ) and CriticalPoint then
+ // Data point out of spec
+ WOMatQARec = True$
+ end
+ DataRow = HgCVData : @TM : PhaseData
+ WOMatQARec = DataRow
+ Next Index
+ // ------------------------------------------------------------------------------------------------------------
+
+ // Send data to SPC -------------------------------------------------------------------------------------------
+ LogPath = Environment_Services('GetSpcFilesharePath')
+ SpcFileDtm = OConv(Datetime(), 'DT2^HS ')
+ Convert ' ' to '_' in SpcFileDtm
+ SpcLogFilename = 'HgCV_Unload_Res_9Points_':SpcFileDtm:'.txt'
+ objSPC = Logging_Services('NewLog', LogPath, SpcLogFilename, CRLF$, Comma$, '', '', False$, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Successfully created blank SPC file.')
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Failed to create blank SPC file. Error message: ':Error_Services('GetMessage'))
+ end
+ LogData = ''
+ LogData<1> = Oconv(Timestamp, 'DT/^HS') ; // Metrology date/time stamp
+ LogData<2> = ReactorID ; // Reactor
+ LogData<3> = RDSKeyID ; // RDS No
+ LogData<4> = Xlate('RDS', RDSKeyID, 'PROD_SPEC_ID', 'X'); // PSN
+ WaferSize = Xlate('RDS', RDSKeyID, 'WAFER_SIZE', 'X')
+ WaferSize = Field(WaferSize, ' ', 3)
+ LogData<5> = WaferSize:' Inch' ; // Wafer Size
+ FormattedData = Oconv(HgCVDataPoints, 'MD3L')
+ Swap @VM with ',' in FormattedData
+ LogData<6> = FormattedData
+ LogData<7> = OConv(PhaseAvg, 'MD43L')
+ LogData<8> = OConv(HgCVAvg, 'MD43L') ; // HgCV Res Avg
+ LogData<9> = OConv(ResStdDev, 'MD83L') ; // HgCV Res Std Dev
+ LogData<10> = HgCVRangePct ; // HgCV Res Range %
+ LogData<11> = OConv(EdgeMean4mm, 'MD43L') ; // HgCV 4mm Edge Mean
+ LogData<12> = OConv(Avg9Point, 'MD83L') ; // HgCV 9 Point Mean
+ LogData<13> = OConv(EdgeMean10mm, 'MD43L') ; // HgCV 10mm Edge Mean
+ LogData<14> = HgCVEdgeMean ; // HgCV Edge Mean Delta %
+ LogData := @RM : ' '
+ Logging_Services('AppendLog', objSPC, LogData, @RM, @FM, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Successfully updated SPC file with metrology data.')
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Failed to update SPC file with metrology data. Error message: ':Error_Services('GetMessage'))
+ end
+ // ------------------------------------------------------------------------------------------------------------
+
+ WOMatQARec = ''
+ WOMatQARec = ''
+ Database_Services('WriteDataRow', 'WO_MAT_QA', WOMatQAID, WOMatQARec, True$, False$, True$)
+ If Error_Services('NoError') then
+ RDSTestRec = Timestamp
+ // Save results
+ Database_Services('WriteDataRow', 'RDS_TEST', RDSTestKeyID, RDSTestRec, True$, False$, True$)
+ If Error_Services('NoError') then
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID000', Service : ' : Success - Hg CRes.')
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID002', Service : ' : UID002 - ' : Error_Services('GetMessage'))
+ end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ end
+ // We know it is a CRES test, so we can now safely import the Phase Angle data
+
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : UID001 - Data for this metrology test already exists and is not from the metrology viewer.')
end
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
- // The correct RDSTestKeyID was found. If this is a HgCv measurement and HgConcentration RDS test,
- // the data has already been written to the database in the above logic. In all other cases, the
- // data needs to be written to the database using the following logic that works off of the test
- // point map.
- DataPoints = HgCVDataPoints
- GoSub LoadRunDataToDatabase
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
- Error_Services('Add', 'No data points found.')
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
+ // The correct RDSTestKeyID was found. If this is a HgCv measurement and HgConcentration RDS test,
+ // the data has already been written to the database in the above logic. In all other cases, the
+ // data needs to be written to the database using the following logic that works off of the test
+ // point map.
+ DataPoints = HgCVDataPoints
+ GoSub LoadRunDataToDatabase
end
end else
- Error_Services('Add', 'Data type / Spec not found for Layer [' : RunDataLayer : '].')
+ Error_Services('Add', 'No data points found.')
Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
- Error_Services('Add', 'Unable to obtain a valid Metrology Test Key ID.')
+ Error_Services('Add', 'Data type / Spec not found for Layer [' : RunDataLayer : '].')
Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
+ Error_Services('Add', 'Unable to obtain a valid Metrology Test Key ID.')
Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
- end else
- Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end else
Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
+ end else
+ Metrology_Services('LogResults', RDSKeyID, Machine, 'UID001', Service : ' : ' : Error_Services('GetMessage'))
end
end service
|