cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Check out the JMP® Marketplace featured Capability Explorer add-in
Choose Language Hide Translation Bar
Jony
Level I

Semiconductor WAT contour

How to achieve multi-group X batch drawing when drawing WAT contour:

    The contour platform stipulates that X only can be selected two columns, but I have multiple sets of X that need to match one Y

1 ACCEPTED SOLUTION

Accepted Solutions
txnelson
Super User

Re: Semiconductor WAT contour

Here is an attempt to get the contour maps displayed.  The complexity is in finding the matching columns.  The column names are inconsistent.  The below script illustrates the kind of things that you will need to do,  to do a better job of matching the columns.  The script has been annotated to allow better understanding of what is being used to attempt the matching

txnelson_0-1625140150462.png

Names Default To Here( 1 );
dt = Data Table( "WAT_Contour" );

// Build list of columns to be graphed
headerTypeList = {};
colNameList = {}; // The full name of the column
deviceTypeList = {}; // The P or N
commonNameList = {}; // The items that are common between P and N columns

// Loop across all columns to find target columns
// The code here is a best guess on determining the items needed to be able
// to match up the columns.  There are inconsistancies in the column names,
// between VTSAT and VTHSAT etc. and also within a single type like VTSAT
// This section will need to be worked out to get all of the matches
For( i = 1, i <= N Col( dt ), i++,
	colName = Trim( Column( dt, i ) << get name );
	If(
		Word( 1, colName, "_" ) == "VTSAT",
			Insert Into( headerTypeList, "VTSAT" );
			Insert Into( colNameList, colName );
			If( Word( 2, colName, "_" ) == "N" | Word( 2, colName, "_" ) == "P",
				Insert Into( deviceTypeList, Word( 2, colName, "_" ) );
				Insert Into(
					commonNameList,
					Substr(
						colName,
						Length( Word( 1, colNameList[N Items( colNameList )], "_" ) )
						+Length( Word( 2, deviceTypeList[N Items( deviceTypeList )], "_" ) ) + 4
					)
				);
			,
				Insert Into( deviceTypeList, Substr( Word( 3, colName, "_" ), 1, 1 ) );
				Insert Into(
					commonNameList,
					Substr(
						colName,
						Length( Word( 1, colName, "_" ) ) + Length( Word( 2, colName, "_" ) )
						+Length( Word( 3, colName, "_" ) ) + 4
					)
				);
			);,
		Word( 1, colName, "_" ) == "VTHSAT",
			Insert Into( headerTypeList, "VTHSAT" );
			Insert Into( colNameList, colName );
			Insert Into( deviceTypeList, Substr( Word( 3, colName, "_" ), 1, 1 ) );
			Insert Into(
				commonNameList,
				Substr(
					colName,
					Length( Word( 1, colName, "_" ) ) + Length( Word( 2, colName, "_" ) )
					+Length( Word( 3, colName, "_" ) ) + 4
				)
			);
	);
);

dtNames = New Table( "Names",
	New Column( "Header", character, values( headerTypeList ) ),
	New Column( "Column Name", character, values( colNameList ) ),
	New Column( "Device Type", character, values( deviceTypeList ) ),
	New Column( "Common", character, values( commonNameList ) )
);

// Split data table to get columns that match
dtSplit = dtNames << Split(
	Split By( :Device Type ),
	Split( :Column Name ),
	Group( :Header, :Common ),
	Sort by Column Property
);

// Delete non matching rows
dtSplit << select where(:P == "" | :N == "" );
dtSplit << delete rows;

// Create the Contour Maps
New Window( "Contour Maps", lub = Lineup Box( N Col( 3 ) ) );
// Loop across matches
For( i = 1, i <= N Rows( dtSplit ), i++,
	lub << append(
		dt << Contour Plot(
			X( Column( dt, dtSplit:N[i] ), Column( dt, dtSplit:P[i] ) ),
			Y( :"W/C BSCAN VMIN YIELD"n ),
			Show Data Points( 0 ),
			Fill Areas( 0 ),
			Label Contours( 0 ),
			Transform( "Range Normalized" ),
			Specify Contours( Min( 0.5 ), Max( 0.9 ), N( 5 ) )
		)
	)
);

// Clean up the data tables no longer needed.  
// Uncomment the below lines when having the interium tables
// no longer need to be displayed
// close( dtNames, nosave );
// close( dtSplit, nosave );

 

 

 

Jim

View solution in original post

5 REPLIES 5
Thierry_S
Super User

Re: Semiconductor WAT contour

Hi,
Have you considered Stacking your X columns? This should yield a single column for Xs and a single column for Ys.
Let us know if that works for you.
Best,
TS
Thierry R. Sornasse
Jony
Level I

Re: Semiconductor WAT contour

Thank you for your response, I have tried to take this approach,but I have so many X columns,as below table,I can't stack it by N-device match P-device,such as VTHSAT_PCM09A_NULVT_P63_D0715_D011_(V)_MEDIAN  to  VTHSAT_PCM10D_PULVT_P63_SDB_D0715_D011_(V)_MEDIAN,

because I want to find which device correlation with my yield,I need to draw contour by device,So I want to quickly draw all device contour.Can be achieved by created or edited contour script?

 

VTHSAT_PCM06F_PULVT_P63_D0715_D242_(V)_MEDIAN
VTHSAT_PCM06G_PULVT_P63_D607_D242_(V)_MEDIAN
VTHSAT_PCM06H_PULVT_P63_SDB_D04_D009_(V)_MEDIAN
VTHSAT_PCM09A_NULVT_P63_D0715_D011_(V)_MEDIAN
VTHSAT_PCM09B_NLVT_P63_D0715_D011_(V)_MEDIAN
VTHSAT_PCM09C_NSVT_P63_D0715_D011_(V)_MEDIAN
VTHSAT_PCM09D_PULVT_P63_D0715_D011_(V)_MEDIAN
VTHSAT_PCM09E_PLVT_P63_D0715_D011_(V)_MEDIAN
VTHSAT_PCM09F_PSVT_P63_D0715_D011_(V)_MEDIAN
VTHSAT_PCM09G_NLVT_P63_SDB_D04_D011_(V)_MEDIAN
VTHSAT_PCM09H_PLVT_P63_SDB_D04_D011_(V)_MEDIAN
VTHSAT_PCM10A_NSVT_P63_SDB_D04_D011_(V)_MEDIAN
VTHSAT_PCM10B_NULVT_P63_SDB_D0715_D011_(V)_MEDIAN
VTHSAT_PCM10C_PSVT_P63_SDB_D04_D011_(V)_MEDIAN
VTHSAT_PCM10D_PULVT_P63_SDB_D0715_D011_(V)_MEDIAN
VTHSAT_PCM10E_NSVT_P63_D04_D011_(V)_MEDIAN
VTHSAT_PCM10F_NULVT_P63_D04_D011_(V)_MEDIAN
VTHSAT_PCM10G_PSVT_P63_D04_D011_(V)_MEDIAN
VTHSAT_PCM10H_PULVT_P63_D04_D011_(V)_MEDIAN
VTHSAT_PCM15A_NLVT_P79_D04_D009_(V)_MEDIAN
VTHSAT_PCM15B_NLVT_P79_D0715_D009_(V)_MEDIAN
txnelson
Super User

Re: Semiconductor WAT contour

If the issue is matching the N vs. P columns, a script can produce that.  Here are the matches I found.

txnelson_0-1625056472586.png

I have attached the data table with the complete list I came up with.

If I am on the right track, can you provide what the graphic you are looking for would be for one of these pairs?

Jim
Jony
Level I

Re: Semiconductor WAT contour

Thank you for your reply,The attachment is my raw data, main include yield column,and many X columns,I need to draw contour graphic,that is X axis is N-device,Y axis is P-device,and Yield as Z, for single device I can easy to draw contour map,But I can only draw one map at a time,I want to draw all countor maps at once.

Jony_1-1625127399598.png

 

 

txnelson
Super User

Re: Semiconductor WAT contour

Here is an attempt to get the contour maps displayed.  The complexity is in finding the matching columns.  The column names are inconsistent.  The below script illustrates the kind of things that you will need to do,  to do a better job of matching the columns.  The script has been annotated to allow better understanding of what is being used to attempt the matching

txnelson_0-1625140150462.png

Names Default To Here( 1 );
dt = Data Table( "WAT_Contour" );

// Build list of columns to be graphed
headerTypeList = {};
colNameList = {}; // The full name of the column
deviceTypeList = {}; // The P or N
commonNameList = {}; // The items that are common between P and N columns

// Loop across all columns to find target columns
// The code here is a best guess on determining the items needed to be able
// to match up the columns.  There are inconsistancies in the column names,
// between VTSAT and VTHSAT etc. and also within a single type like VTSAT
// This section will need to be worked out to get all of the matches
For( i = 1, i <= N Col( dt ), i++,
	colName = Trim( Column( dt, i ) << get name );
	If(
		Word( 1, colName, "_" ) == "VTSAT",
			Insert Into( headerTypeList, "VTSAT" );
			Insert Into( colNameList, colName );
			If( Word( 2, colName, "_" ) == "N" | Word( 2, colName, "_" ) == "P",
				Insert Into( deviceTypeList, Word( 2, colName, "_" ) );
				Insert Into(
					commonNameList,
					Substr(
						colName,
						Length( Word( 1, colNameList[N Items( colNameList )], "_" ) )
						+Length( Word( 2, deviceTypeList[N Items( deviceTypeList )], "_" ) ) + 4
					)
				);
			,
				Insert Into( deviceTypeList, Substr( Word( 3, colName, "_" ), 1, 1 ) );
				Insert Into(
					commonNameList,
					Substr(
						colName,
						Length( Word( 1, colName, "_" ) ) + Length( Word( 2, colName, "_" ) )
						+Length( Word( 3, colName, "_" ) ) + 4
					)
				);
			);,
		Word( 1, colName, "_" ) == "VTHSAT",
			Insert Into( headerTypeList, "VTHSAT" );
			Insert Into( colNameList, colName );
			Insert Into( deviceTypeList, Substr( Word( 3, colName, "_" ), 1, 1 ) );
			Insert Into(
				commonNameList,
				Substr(
					colName,
					Length( Word( 1, colName, "_" ) ) + Length( Word( 2, colName, "_" ) )
					+Length( Word( 3, colName, "_" ) ) + 4
				)
			);
	);
);

dtNames = New Table( "Names",
	New Column( "Header", character, values( headerTypeList ) ),
	New Column( "Column Name", character, values( colNameList ) ),
	New Column( "Device Type", character, values( deviceTypeList ) ),
	New Column( "Common", character, values( commonNameList ) )
);

// Split data table to get columns that match
dtSplit = dtNames << Split(
	Split By( :Device Type ),
	Split( :Column Name ),
	Group( :Header, :Common ),
	Sort by Column Property
);

// Delete non matching rows
dtSplit << select where(:P == "" | :N == "" );
dtSplit << delete rows;

// Create the Contour Maps
New Window( "Contour Maps", lub = Lineup Box( N Col( 3 ) ) );
// Loop across matches
For( i = 1, i <= N Rows( dtSplit ), i++,
	lub << append(
		dt << Contour Plot(
			X( Column( dt, dtSplit:N[i] ), Column( dt, dtSplit:P[i] ) ),
			Y( :"W/C BSCAN VMIN YIELD"n ),
			Show Data Points( 0 ),
			Fill Areas( 0 ),
			Label Contours( 0 ),
			Transform( "Range Normalized" ),
			Specify Contours( Min( 0.5 ), Max( 0.9 ), N( 5 ) )
		)
	)
);

// Clean up the data tables no longer needed.  
// Uncomment the below lines when having the interium tables
// no longer need to be displayed
// close( dtNames, nosave );
// close( dtSplit, nosave );

 

 

 

Jim