From 6f03b36075312c14ae641eb631f08a2dd295dfb5 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Tue, 27 May 2025 15:42:15 -0700 Subject: [PATCH] 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 | 3341 +++++++++++++++++ .vscode/settings.json | 6 + LSL2/STPROC/METROLOGY_SERVICES.txt | 1600 ++++---- 24 files changed, 7879 insertions(+), 789 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..a47f86d --- /dev/null +++ b/.vscode/METROLOGY_SERVICES.vba @@ -0,0 +1,3341 @@ +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 = '*.pdsf'; + DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSFS6420\Source\MET08DDUPSFS6420\' + Case Machine _EQC 'HgCV' + SearchPattern = '*.pdsf'; + 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> + Metrology_Services('ImportStratusData', RunData, ResourceID, PSN) + 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 + Metrology_Services('ImportHgCVQualData', RunData, ResourceID, PSN) + END ELSE + 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 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..60feddf 100644 --- a/LSL2/STPROC/METROLOGY_SERVICES.txt +++ b/LSL2/STPROC/METROLOGY_SERVICES.txt @@ -398,10 +398,10 @@ Service ImportMetrologyFiles(Machine) Begin Case Case Machine _EQC 'Tencor' - SearchPattern = '*.txt'; + SearchPattern = '*.pdsf'; DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSFS6420\Source\MET08DDUPSFS6420\' Case Machine _EQC 'HgCV' - SearchPattern = '*.txt'; + SearchPattern = '*.pdsf'; DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESIHGCV\Source\MET08RESIHGCV\' Case Machine _EQC 'CDE' SearchPattern = '*.pdsf'; @@ -647,21 +647,42 @@ 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> + Metrology_Services('ImportStratusData', RunData, ResourceID, PSN) 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 + Metrology_Services('ImportHgCVQualData', RunData, ResourceID, PSN) + END ELSE + Metrology_Services('ImportHgCVData', RunData, ResourceID, IsViewerFile, PSN) + END MachineType@ = 'HgProbe' Case Machine _EQC 'SP1' @@ -692,7 +713,7 @@ Service ImportMetrologyRunData(Machine, DataPath, FileName, RunData) end service -Service ImportStratusData(RunData) +Service ImportStratusData(RunData, ResourceID, PSN) Machine = 'Stratus' ParseArray = '' @@ -707,7 +728,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 +886,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 +932,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 +964,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 +973,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 +986,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 +1015,8 @@ Service ImportCDEData(RunData, FileName) end If Error_Services('NoError') then - Positions = '' - DataPoints = '' + Positions = '' + DataPoints = '' Loop Position = Trim(RunData) DataPoint = Trim(RunData) @@ -1352,15 +1025,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 +1062,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 +1252,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 +1545,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