#include #include #include #include #include #include #include #include #include "xincludes.h" #include "xgobitypes.h" #include "xgobivars.h" #include "xgobiexterns.h" #include "xgvis.h" extern void update_plot(xgobidata *); extern void configure_pos_data(void); extern void mds_once(Boolean, Boolean, FILE *, FILE *); extern void set_vgroups(void); extern void set_dist_matrix_from_edges(struct array *, struct array *, int); extern void set_dist_matrix_from_pos(struct array *, struct array *, double); extern void set_dist_matrix_from_pos_dot(struct array *, struct array *, int); extern void reset_data(void); extern void reinit_stress(void); extern void scramble_data(void); extern void set_distance_factor(void); static void reset_dims_label(void) { char str[32]; extern Widget mds_dims_label; sprintf(str, "Dim (k): %d", mds_dims); XtVaSetValues(mds_dims_label, XtNstring, (String) str, NULL); } /* ARGSUSED */ XtCallbackProc mds_dimsleft_cback(Widget w, XtPointer client_data, XtPointer callback_data) { if (mds_dims > 1) { mds_dims--; reset_dims_label(); configure_pos_data(); set_vgroups(); update_plot(&xgobi); plot_once(&xgobi); mds_once(False, False, NULL, NULL); } } /* ARGSUSED */ XtCallbackProc mds_dimsright_cback(Widget w, XtPointer client_data, XtPointer callback_data) { if (mds_dims < xgobi.ncols_used) { mds_dims++; reset_dims_label(); configure_pos_data(); set_vgroups(); update_plot(&xgobi); plot_once(&xgobi); mds_once(False, False, NULL, NULL); } } /* ARGSUSED */ XtCallbackProc PopUpDistMenu(Widget w, XtPointer client_data, XtPointer callback_data) /* * Pop up the distance matrix menu. */ { Dimension width, height; Position x, y; static int initd = 0; if (!initd) { XtVaGetValues(w, XtNwidth, &width, XtNheight, &height, NULL); XtTranslateCoords(w, (Position) (width/2), (Position) (height/2), &x, &y); XtVaSetValues(dist_popup, XtNx, x, XtNy, y, NULL); initd = 1; } XtPopup(dist_popup, XtGrabNone); } /* ARGSUSED */ XtCallbackProc PopDownDistMenu(Widget w, XtPointer client_data, XtPointer callback_data) /* * Close the distance matrix menu. */ { XtPopdown(dist_popup); } /* ARGSUSED */ XtCallbackProc choose_dist_cback(Widget w, XtPointer client_data, XtPointer callback_data) /* * Close the distance matrix menu. */ { int i; Arg args[1]; Boolean selected = False; for (i=0; i NDISTTYPES-1) { fprintf(stderr, "Sorry, that's not a valid dist_type.\n"); } else { /* dist_type has been set, let's call the right routine. */ switch (dist_type) { case LINK: set_dist_matrix_from_edges(&dist, &edges, pos.nrows); break; case EUCLIDIAN: set_dist_matrix_from_pos(&dist, &pos, 2.0); break; case MANHATTAN: set_dist_matrix_from_pos(&dist, &pos, 1.0); break; case DOTPROD: case COSDIST: set_dist_matrix_from_pos_dot(&dist, &pos, dist_type); break; case USER_SUPPLIED: case ADJACENCY: case MAHALANOBIS: fprintf(stderr, "Not implemented yet.\n"); } } } /* ARGSUSED */ XtCallbackProc reset_cback(Widget w, XtPointer client_data, XtPointer callback_data) { reset_data(); configure_pos_data(); update_plot(&xgobi); plot_once(&xgobi); reinit_stress(); } /* ARGSUSED */ XtCallbackProc scramble_cback(Widget w, XtPointer client_data, XtPointer callback_data) { scramble_data(); configure_pos_data(); update_plot(&xgobi); plot_once(&xgobi); reinit_stress(); } /* ARGSUSED */ XtCallbackProc run_cback(Widget w, XtPointer client_data, XtPointer callback_data) /* * This callback defines the actions associated with the run button. */ { xgv_is_running = !xgv_is_running; if (xgv_is_running) { /* * In case points have been moved in xgobi, we'd better * copy in the current values in raw_data. */ int i, j; for (i=0; i 0) { sprintf(xgobi_exec, "%s/bin/xgobi", xgobidir); /* If no luck there, then just try 'xgobi' without a path name */ if (stat(xgobi_exec, &buf) != 0) sprintf(xgobi_exec, "xgobi"); } else sprintf(xgobi_exec, "xgobi"); if (mono) strcat(xgobi_exec, " -mono"); sprintf(command, "%s -subset %d %s &", xgobi_exec, subset_size, config_basename); fprintf(stderr, "%s\n", command); system (command); iter++; }