Re: Seleziona 2 righe dal dado fallitoForse qualcosa del genere
dtt = Open( "/Z:/failures.jmp" );// 109 inner rows
expand = 2;// how far to look for a failure
// these are paired, keep them in a Nx2 matrix...
fail = (dtt:X coord << get values) || (dtt:Y coord << get values);
// get min and max of the matrix columns
failmin = V Min( fail );
failmax = V Max( fail );
// find the +/- 2 area of interest
colmin = failmin[1] - expand;
colmax = failmax[1] + expand;
rowmin = failmin[2] - expand;
rowmax = failmax[2] + expand;
// turn the failure list back into a rectangular matrix, mark the actual failures
unmarked = 0; // points that have not been marked yet
interior = 1; // the failures are interior points
border = 2; // the border points are near the failures
bigpatch = J( rowmax + 1, colmax + 1, unmarked );
For Each( {{r, c}}, across( fail[0, 2], fail[0, 1] ), bigpatch[r, c] = interior );
// helper to check near r,c
nearFailure = Function( {r0, c0}, //parameters
{rlow, rhigh, clow, chigh, r, c}, // locals
// low..high is expanded without going beyond the edge of bigpatch
rlow = Max( 1, r0 - expand );
rhigh = Min( N Rows( bigpatch ), r0 + expand );
clow = Max( 1, c0 - expand );
chigh = Min( N Cols( bigpatch ), c0 + expand );
// rlow..chigh is a slightly expanded search area
For( r = rlow, r <= rhigh, r += 1,
For( c = clow, c <= chigh, c += 1,
// any interior point (1) nearby?
If(
bigpatch[r, c] == interior// uncomment for "rounder"
// & Sqrt( (r - r0) ^ 2 + (c - c0) ^ 2 ) <= expand// the diagonal distance of the corners is expand*1.414...nearly 3...
,
Return( 1 ) // found an interior point nearby
)
)
);
/*return*/ 0; // no interior point found nearby
);
For( r = rowmin, r <= rowmax, r += 1,
For( c = colmin, c <= colmax, c += 1,
If( bigpatch[r, c] == unmarked & nearFailure( r, c ),
bigpatch[r, c] = border// add a border to the bigpatch
)
)
);
// view a cellplot
dtcp = As Table( bigpatch[rowmin - 1 :: rowmax + 1, colmin - 1 :: colmax + 1] );
dtcp[1 :: N Rows( dtcp ), 0] = dtcp[N Rows( dtcp ) :: 1, 0];// flip to make the same as graph builder
dtcp << Cell Plot( Scale Uniformly( 0 ), Center at zero( 0 ), Y( dtcp << getcolumnnames ) );
dt = Open( "/Z:/Summary Bins.jmp" );// all rows
//Clear values
dt:Highlight[1 :: N Rows( dt )] = "";
//Loop to highlight 2 dies
dt << Begin Data Update;
For( i = 1, i <= N Rows( dt ), i++,
c = dt:X coord[i];
r = dt:Y coord[i];
If( r < N Rows( bigpatch ) & c < N Cols( bigpatch ) & bigpatch[r, c] == border,
dt:Highlight[i] = "1"
);
);
dt << End Data Update;
dt << select where( :Highlight == "1" & :Bins == "1" );
dt << Graph Builder( Size( 528, 454 ), Show Control Panel( 0 ), Variables( X( :X coord ), Y( :Y coord ) ), Elements( Points( X, Y, Legend( 7 ) ) ) );
Potresti volere questo

o questo, vedere la riga commentata per il calcolo della distanza. Dipende da come vuoi trattare la distanza diagonale.

Re: Seleziona 2 righe dal dado fallitoGrazie mille Craig
Seleziona 2 righeCiao comunità JMP,
Voglio evidenziare due punti dati da ciascuna coordinata X e Y del contenitore dei guasti "2". Ho provato a scrivere un codice jsl, ma i risultati non sono corretti.
Il codice seguente evidenzia più di due punti dati dalle coordinate X e Y del contenitore errori "2". Eventuali suggerimenti?
Ecco il codice
Names Default To Here( 1 );
dtt = Data Table( "failures" );
dt = Data Table( "Summary Bins" );
//Clear values
dt:Highlight[1 :: N Rows( dt )] = "";
//define list for storing +/-2 X and Y coord in the list
xList = [];
yList = [];
//get X and Y coord of the failing dies
fail_xcoord = dtt:X coord << get values;
fail_ycoord = dtt:Y coord << get values;
// Add and subtract 2 from X and Y using a loop
For( j = 1, j <= N Rows( dtt ), j++,
For( i = -2, i <= 2, i++,
newX = dtt:X coord[j] + i;
newY = dtt:Y coord[j] + i;
If( newX != dtt:X coord[j],
Insert Into( xList, newX )
);
If( newY != dtt:Y coord[j],
Insert Into( yList, newY )
);
)
);
//Loop to highlight 2 dies
dt << Begin Data Update;
For( i = 1, i <= N Rows( dt ), i++,
If( Contains( xlist, dt:X coord[i] ) & Contains( fail_ycoord, dt:Y coord[i] ),
dt:Highlight[i] = "1";
);
If( Contains( ylist, dt:Y coord[i] ) & Contains( fail_xcoord, dt:X coord[i] ),
dt:Highlight[i] = "1";
);
);
dt << End Data Update;
dt << select where( :Highlight == "1" & :Bins == "1" );
Grazie,
Jackie
Automazione e scriptingRi: Seleziona 2 righe dal dado fallito non capisco cosa intendi con la selezione di 2 dadi dalla regione in fallimento - Voglio un bordo più spesso.
Quindi, ad esempio, se seleziono "40" nella legenda (vedi sotto), voglio aggiungere un bordo spesso di +2 dadi che circonda quella regione. Questa particolare mappa wafer ha le coordinate X e Y in negativo e funziona con la funzione NearFailure()

Ingrandito un po':
Qualcosa come questo. Ho selezionato manualmente 2 punti dalla regione selezionata, che in questo caso sono i punti dati rossi Bin "40". Quindi l'intenzione di farlo è applicare un'esclusione di +2 matrici (un bordo spesso) che circonda la regione della riga selezionata.

Qualcosa di simile a quello che hai menzionato, nel caso seguente, c'è un bordo spesso (rosso)

Ri: Seleziona 2 righe dal dado fallitoPenso che l’opzione 2 avrebbe più senso. Apprezzerei se potessi condividere la logica della matrice modificata per la grande patch. Non sono esattamente sicuro di come risolvere questo problema
Ri: Seleziona 2 righe dal dado fallitoPotresti provare qualcosa del genere. È un approccio migliore, penso, ma probabilmente avrà una serie di problemi, quindi provalo attentamente.
// all new code, all new bugs, check carefully to see if this does what you want
dtt = Open( "/Z:/failures(2).jmp" );
dtS = Open( "/Z:/Summary Bins(2).jmp" );
// the X-Y die coordinates are expected to be integers between -9,999,996 and +9,999,996
encodeLimit = 1e7; // pack/unpack two signed 7-digit integers in one 14-digit number
// a "key" is an X-Y pair packed into a single number. It is called a key
// because it is used as a key in an associative array. These next two
// routines convert between the two representations
keysToXY = Function( {keys},
{x, y},
x = Round( keys / encodeLimit );
y = keys - x * encodeLimit;
x || y;
);
XYtoKeys = Function( {xy},
xy[0, 1] * encodeLimit + xy[0, 2]
);
// load the X-Y pairs that describe failure positions
failXY = dtt[0, {x coord, y coord}];
// elementary sanity checks
If( Any( failXY <= -encodeLimit + 4 ) | Any( failXY >= encodeLimit - 4 ),
Throw( "data range" )
);
If( Any( failXY != Floor( failXY ) ),
Throw( "integer coords" )
);
// convert X-Y failure locations to keys, verify they convert back again
failkeys = XYtoKeys( failXY );
If( !All( keysToXY( failkeys ) == failXY ),
Throw( "encode/decode 1" )
);
// template for nearby points. THIS TABLE ENCODES THE 2 PIXEL BORDER.
// you might, or might not, want the corners included; the corners are
// commented out because I like the rounded appearance better.
template = [
//-2 -2, // corner
-2 -1,
-2 0,
-2 1,
//-2 2, // corner
-1 -2,
-1 -1,
-1 0,
-1 1,
-1 2,
0 -2,
0 -1,
0 0, // center
0 1,
0 2,
1 -2,
1 -1,
1 0,
1 1,
1 2,
// 2 -2, // corner
2 -1,
2 0,
2 1
//, 2 2 // corner
];
// convert the template X-Y pairs into keys, verify they convert back again
templatekeys = XYtoKeys( template );
If( !All( keysToXY( templatekeys ) == template ),
Throw( "encode/decode 2" )
);
// somthing very cool is going to happen next: template keys will be added to a failure
// key to get a set of keys around the failure key. The template, above, represents a
// square (with rounded corners) about an origin. Adding a failure key moves the
// origin to the X-Y failure point. All the nearby locations are then inserted into a
// collection (associative array) of points that are within 2 of a failure point.
// When done, the actual failure points are removed from the collection, leaving the
// collection as the 2-wide border.
// use AssociativeArray as a set to hold the key values;
// the nearbyPoint set gets populated with both the failure
// points AND the points that are nearby as identified by the template.
nearbyPoints = Associative Array();
For Each( {failkey}, failkeys,
nearbykeys = failkey + templatekeys; // nearby is the same shape as template, but at failkey, not 0,0
nearbyPoints << Insert( Associative Array( nearbykeys ) );
);
// now remove the set of points formed from all the failures...after this,
// nearbypoints is the 2-cell boundary without the interior.
nearbyPoints << Remove( Associative Array( failkeys ) );
// now make a table for a plot. red are from the failures table, blue are the border.
border = keysToXY( Matrix( nearbypoints << getkeys ) ) || J( N Items( nearbypoints ), 1, 1 );
center = failXY || J( N Rows( failXY ), 1, 2 );
dtg = As Table( border |/ center, <<COLUMNNAMES></COLUMNNAMES>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="capture.png" style="width: 921px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><span class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 921px;"><img src="https://us.v-cdn.net/6038925/uploads/images/61399i00F1D5DEBF613925/capture.png" role="button" title="capture.png" alt="capture.png" /></span></SPAN></SPAN></SPAN></P>Ri: Seleziona 2 righe dal dado fallito@Craige_Hales
Mi hai reso la vita più facile. Grazie mille, Craige!
Un'ultima domanda.
È possibile regolare dinamicamente le dimensioni del modello? Sto cercando di creare una finestra con una casella di modifica del numero in cui l'utente inserirà il numero di bordi dei pixel. Se il bordo del pixel è 3, la matrice sarà n+1

// template for nearby points. THIS TABLE ENCODES THE 2 PIXEL BORDER.
// you might, or might not, want the corners included; the corners are
// commented out because I like the rounded appearance better.
template = [-2 -2, // corner
-2 -1, -2 0, -2 1, -2 2, // corner
-1 -2, -1 -1, -1 0, -1 1, -1 2, 0 -2, 0 -1, 0 0, // center
0 1, 0 2, 1 -2, 1 -1, 1 0, 1 1, 1 2, 2 -2, // corner
2 -1, 2 0, 2 1, 2 2 // corner
]
Ri: Seleziona 2 righe dal dado fallitoquesto potrebbe funzionare:
templatesize=15;
templateround = 1; // 0: square corners 1: round corners 2: diamond corners
templatelist = {};
for(x=-templatesize, x<=templatesize, x+=1,
for(y=-templatesize, y<=templatesize, y+=1,
if(templateround==0 // use all neighbor points
| (templateround==1 & round(sqrt(x^2+y^2))<=templatesize) // use neighbors near or inside the circle
| (templateround==2 & sqrt(x^2+y^2)<=templatesize) // use neighbors inside the circle
,//
templatelist[nitems(templatelist)+1] = evallist({x,y});
)
)
);
show(templatelist);
template = matrix(templatelist);
//astable(template)<<GRAPH builder=""></GRAPH>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="capture.png" style="width: 999px;"><span class="lia-inline-image-display-wrapper" image-alt="capture.png" style="width: 999px;"><img src="https://us.v-cdn.net/6038925/uploads/images/61445i7D643065AD650CD1/capture.png" role="button" title="capture.png" alt="capture.png" /></span></SPAN></P>
<P> </P>