Boucler les emplacements x,y dans le tempsBonjour,
Je suis assez nouveau sur jmp (j'utilise actuellement jmp 16) et j'ai une question sur le scénario suivant. J'ai un fichier csv qui contient les colonnes suivantes pour chaque imperfection :
- Horodatage, identifiant de série, emplacement x, emplacement y, taille de l'imperfection (en mm)
Je travaille avec un processus de nettoyage et l'outil d'inspection donne des informations sur chaque imperfection de la journée. Il y a plusieurs choses que je dois suivre :
1) nombre de fois qu'un identifiant de série particulier a été traité et savoir si c'est la première fois qu'il a été nettoyé, ou deuxième, troisième, etc.
2) si l'ID de série a été nettoyé plus d'une fois, j'ai besoin de savoir si l'une des combinaisons des emplacements (x, y) est toujours au même endroit après chaque nettoyage
En traçant les emplacements x et y, puis en filtrant par temps, j'ai pu répondre 2), mais c'est une étape très manuelle. J'espère trouver une solution utilisant jsl qui pourrait automatiser les informations que j'ai besoin de suivre.
les fenêtresRe: Boucler les emplacements x,y au fil du tempsQuelle sorte de résolution les emplacements x,y ont-ils ? Par exemple, il peut toujours s'agir de nombres entiers de 1 à 100, de valeurs à virgule flottante de 0 à 100 arrondies au 0,01 le plus proche ou de valeurs flottantes sans limite apparente de résolution. À quelle distance la paire x,y devrait-elle être pour être une répétition ? La taille de l'imperfection a-t-elle quelque chose à voir avec le chevauchement x,y ? Ou la taille est-elle toujours plus petite que la grille x,y et ignorée ?
S'il n'y a que 100 valeurs x et 100 y, et si la taille n'est pas intéressante, alors je combinerais les valeurs x et y en une seule clé, x*100+y peut-être, cela pourrait faciliter le test des répétitions . Peut-être la même chose pour les flottants arrondis, jusqu'à environ 6 chiffres significatifs.
Mais si la taille est importante ou si les distances doivent être testées, je peux utiliser un KDTable.
Aussi, combien de lignes ? moins de quelques milliers n'auront probablement pas besoin d'optimisation particulière. Plus d'un million auront probablement besoin d'un algorithme bien pensé. (Avec moins de mille lignes, chaque ligne peut penser à toutes les autres lignes et il n'y a que 1 000 000 de comparaisons, mais double la taille et les comparaisons quadruplent.)
Re: Boucler les emplacements x,y au fil du tempssalut @SEG
1 : essayez d'utiliser la plate-forme Table << sommaire. là, il suffit de mettre l'ID de série, l'emplacement x et l'emplacement y dans le groupe.
cela vous donnera une ligne distincte pour chaque combinaison unique des trois.
représenter graphiquement ce nouveau tableau récapitulatif serait utile, utilisez simplement la colonne N comme couleur ou taille
2: une fois que vous avez produit un graphique une fois, sous le triangle rouge en haut à gauche, vous pouvez choisir d'enregistrer le script dans la table de données ou la fenêtre de script. jmp vient d'écrire le script pour vous.
si vous utilisez jmp 16, cliquez sur view>>log et vous obtiendrez un script de tout ce que vous avez fait dans la session en cours.
faites-nous savoir si cela aide.
ron
Re: Boucler les emplacements x,y au fil du tempsSalut,
Pourriez-vous nous aider à mieux comprendre votre structure de données en partageant un exemple (des données fictives fonctionneraient bien) ? Sur la base de votre description, je suppose que chaque événement de nettoyage est identifiable par une combinaison unique d'horodatage et d'ID de série. De plus, vos données incluent-elles des informations de réplication (c'est-à-dire des lignes avec une combinaison identique d'horodatage et d'ID de série ? Si c'est le cas, cela rendra le processus plus exigeant. Enfin, après avoir identifié plusieurs événements de nettoyage pour un identifiant de série, souhaitez-vous uniquement capturer si les emplacements sont identiques pour tous les événements, identiques entre deux événements ou autre ?
Meilleur,
ST
Re: Boucler les emplacements x,y au fil du temps
Bonjour Craig
Les emplacements x et y sortent 3 chiffres après la virgule. Tant qu'ils se trouvent à moins de 3% du même emplacement, cela serait considéré comme une imperfection répétée. La taille n'a rien à voir avec le chevauchement. Ce qui a été fait dans le passé est qu'une fois son tracé graphique, les premières boucles sont désignées comme un cercle dans une couleur et les secondes boucles reçoivent un "x" dans une autre couleur. Une fois qu'ils se chevauchent, il est visuellement facile de voir s'il se trouve au même endroit.
En termes de lignes, il pourrait atteindre plusieurs milliers en fonction de la quantité exécutée par jour. ce n'est jamais passé en millions bien que ce soit une possibilité si nous regardons sur une très longue période à la fois.
Re: Boucler les emplacements x,y au fil du tempsBonjour Thierry,
J'ai joint une capture d'écran des données fictives. comme vous pouvez le voir, chaque ID obtiendra plusieurs résultats en même temps car toutes les imperfections sont écrites en même temps, la principale différence serait l'emplacement x, y et la taille. Notez également que cet exemple n'est qu'un premier nettoyage. La deuxième fois, le même identifiant pourrait apparaître avec plus ou moins de lignes et c'est à ce moment-là que j'aimerais savoir si cela se répète et également pouvoir identifier qu'il s'agit d'une deuxième, troisième, etc. boucles de nettoyage.
Après plusieurs nettoyages pour un numéro de série, j'aimerais savoir si les emplacements sont identiques pour tous les événements
Re: Boucler les emplacements x,y au fil du tempsVoici un code de démarrage. Vous devrez l'étudier pour vous assurer qu'il fait ce que vous attendez. La sortie est dans la fenêtre Journal. (Je vais joindre un fichier. Le code ci-dessous est peut-être erroné car le site Web a supprimé du "html invalide". )
// synthesize some data
radius = 1;
dt = New Table( "Untitled",
Add Rows( 1000 ), // <<<<<<<<<<<<<< change number of rows here
New Column( "time", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "waferID", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "xLocation", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "yLocation", Numeric, "Continuous", Format( "Best", 12 ) )
);
here:time = 0; // for this synth data, time just increments by 1
here:waferID = 0; // and the waferID is random 0-9
For( row = 1, row <= N Rows( dt ), row += 1,
If( Random Uniform() > .8, // determines how many points in a cleaning, before time changes and wafer re-randomizes
here:time += 1;
here:waferID = Random Integer( 0, 9 );
);
dt:time[row] = here:time;
dt:waferID[row] = here:waferID;
dt:xLocation[row] = Round( Random Uniform( -radius, radius ), 2 );
dt:yLocation[row] = Round( Random Uniform( -radius, radius ), 2 );
);
// find the unique waferIDs using summary
dtWafer = dt << Summary( Group( :waferID ), Link to original data table( 1 ) );
dtWaferTime = dt << Summary( Group( :waferID, :time ) );
dtNWafer = dtWaferTime << Summary( Group( :waferID ) ); //number of distinct times for this wafer is number of cleanings
close = .03; // <<< this determines how close makes a hit
// produce a report for each waferID that shows up in the cleaning data...
For( iWafer = 1, iWafer <= N Rows( dtWafer ), iWafer += 1,
dtWafer << clear select << selectrows( iWafer ); // dtWafer selection also selects rows in dt because linked
rows = dt << get selected rows; // all the rows for this wafer, across all times
// rows is a 1-column matrix of row numbers in dt for this wafer. the argument to KDTable
// is all the locations over all cleanings for this wafer.
kdt = KDTable( dt[rows, {xLocation, yLocation}] );
// report header for each waferID... the report might have no lines below the header, or a bunch... Not indented.
Write( Eval Insert( "\!n\!nprocessing waferID=^dtWafer:waferID[iWafer]^, ^nrows(rows)^ points during ^dtNWafer:nrows[iWafer]^ cleanings" ) );
For( irow = 1, irow <= N Rows( rows ), irow += 1, // the rows should be ascending time
row = rows[irow]; // row (singular) is an index to dt
// find rows {up to this many,up to this far} near irow
{index, distance} = kdt << kNearestRows( {dtWafer:NRows[iWafer], close}, irow );
// above, index is into the 1-column matrix of row numbers. below, it becomes index into dt
index = rows[index];
printedHeader = 0; // don't print this header unless there are duplicates to go with it
// distance[] and index[] have same number of rows; index is indexes to near neighbors and distance is to the neighbor
For( idistance = 1, idistance <= N Items( distance ), idistance += 1,
If( dt:waferID[index[idistance]] != dt:waferID[row] | dt:waferID[row] != dtWafer:waferID[iWafer],
Throw( "wafer mismatch" )
);// sanity check
If( distance[idistance] <= close, // typically there is one item with a bigger distance than we care about, must be ignored by else-break below.
If( !printedHeader, // a little indented...
Write(
Eval Insert(
"\!n matches for row ^row^ time ^dt:time[row]^ loc [^char(dt:xLocation[row],7,3)^,^char(dt:yLocation[row],7,3)^]"
)
);
printedHeader = 1;
);
// there can be more than one subsequent cleaning, indented more...
Write( Eval Insert( "\!n row ^index[idistance]^ time ^dt:time[index[idistance]]^ " ) );
Write( Eval Insert( "[^char(dt:xLocation[index[idistance]],7,3)^,^char(dt:yLocation[index[idistance]],7,3)^]) " ) );
Write( Eval Insert( "dist(^distance[idistance]^)" ) );
, //else
Break()
);
);
kdt << removerows( irow ); // never look back at this row from future rows
);
);
// a graph to examine the rows found to be close.
dt << Graph Builder(
Size( 867, 787 ),
Show Control Panel( 0 ),
Variables( X( :xLocation ), Y( :yLocation ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
Local Data Filter( Add Filter( columns( :waferID ), Modeling Type( :waferID, Nominal ), Display( :waferID, N Items( 14 ) ) ) )
);