1136 lines
28 KiB
C
Executable file
1136 lines
28 KiB
C
Executable file
/********************************
|
|
*
|
|
* To compile:
|
|
*
|
|
* cc -o DotPlotTool plot.c HGLfuncs.c Alloc.c ChooseFile.c
|
|
* -lxview -lolgx -lX11
|
|
*
|
|
* Notes: Set canvas width and height to fit the max_width when
|
|
* loading a dataset. Change the viewable size by changing
|
|
* the viewable_length of the scrollbars.
|
|
*
|
|
********************************/
|
|
|
|
#ifndef _GLOBAL_DEFS_H
|
|
#include "global_defs.h"
|
|
#define _GLOBAL_DEFS_H
|
|
#endif
|
|
|
|
#include <X11/X.h>
|
|
#include <X11/Xlib.h>
|
|
#include <X11/keysymdef.h>
|
|
#include <X11/keysym.h>
|
|
#include <xview/xview.h>
|
|
#include <xview/canvas.h>
|
|
#include <xview/panel.h>
|
|
#include <xview/scrollbar.h>
|
|
#include <xview/xv_xrect.h>
|
|
#include <xview/rect.h>
|
|
#include <xview/cms.h>
|
|
#include <sys/types.h>
|
|
#include <xview/icon.h>
|
|
#include <xview/svrimage.h>
|
|
|
|
#define POS2(array, i, j) (array[2*(i)+(j)])
|
|
|
|
#define WHITE 0
|
|
#define BLACK 8
|
|
#define RED 7
|
|
|
|
#define min_size 1
|
|
#define max_size 4
|
|
#define min_width 1
|
|
#define min_filter 1
|
|
#define max_filter 100
|
|
#define min_cutoff -7
|
|
#define max_cutoff 17
|
|
|
|
#define mmscore 0 /* WHITE */
|
|
#define pmscore 9 /* GREY */
|
|
#define mscore 8 /* BLACK */
|
|
#define window_size 2
|
|
#define margin 50
|
|
|
|
Frame frame=(Frame)NULL, prop_subframe;
|
|
Panel panel_1; /* panel_1 width should change with the size of the
|
|
* dataset.
|
|
*/
|
|
Panel width_panel=(Panel)NULL; /* There is a limitation on the max size of a
|
|
* canvas. When loading a large dataset,
|
|
* max_width may have to be reduced to fit into
|
|
* the canvas. So, width_panel has to be saved
|
|
* to allow changes.
|
|
*/
|
|
Canvas canvas;
|
|
Xv_Window paint_win;
|
|
Display *display;
|
|
GC gc;
|
|
Window xwin;
|
|
Cms cms;
|
|
Scrollbar h_scrollbar, v_scrollbar;
|
|
int Xaxis, Yaxis;
|
|
|
|
int size = 2;
|
|
int max_width, width;
|
|
int cutoff = 1;
|
|
int filter = 1;
|
|
int direction = 0; /* both / and \. */
|
|
/* 1: \ or direct
|
|
-1: / or reversed */
|
|
char footnote[256], heading[128];
|
|
|
|
int drawarea_min_y, drawarea_max_y;
|
|
unsigned long *colors;
|
|
char clear_mark = 'F', compd = 'N';
|
|
Sequence *tSeq;
|
|
|
|
int tmp_direction, tmp_size,tmp_width,tmp_filter, tmp_cutoff;
|
|
char tmp_compd;
|
|
int mark_x=0; /* record the x,y of the paint window, */
|
|
int mark_y=0; /* not the canvas or the view window. */
|
|
int set_offset;/* The offset of the sequences being displayed. */
|
|
int AAmatr[256][256];
|
|
|
|
short plot_bits[] = {
|
|
#include "plot.icon"
|
|
};
|
|
|
|
main(argc, argv)
|
|
int argc;
|
|
char *argv[];
|
|
{
|
|
int LoadHGLData();
|
|
extern exit_proc();
|
|
extern size_proc();
|
|
extern width_proc();
|
|
extern footer_proc();
|
|
extern canvas_repaint_proc();
|
|
extern Frame load_file();
|
|
extern Load();
|
|
extern show_prop_frame();
|
|
extern dir_proc();
|
|
extern compd_proc();
|
|
extern ok_proc();
|
|
extern filter_proc();
|
|
extern cutoff_proc();
|
|
extern ToDisplay();
|
|
int i, layer, ii, jj, kk, ll;
|
|
char GetBase();
|
|
Icon icon;
|
|
Server_image image;
|
|
|
|
static Xv_singlecolor cms_colors[] = {
|
|
{255, 255, 255}, /* WHITE */
|
|
{128, 0, 255}, /* purple */
|
|
{0, 0, 128}, /* navy blue */
|
|
{0, 0, 255 }, /* blue */
|
|
{0, 255, 0}, /* green */
|
|
{255, 255, 0}, /* yellow */
|
|
{255, 165, 0}, /* orange */
|
|
{225, 0, 0}, /* RED */
|
|
{0, 0, 0}, /* black */
|
|
{192, 192, 192}, /* GREY */
|
|
{240, 240, 240},
|
|
{210, 210, 210},
|
|
{180, 180, 180},
|
|
{150, 150, 150},
|
|
{120, 120, 120},
|
|
{90, 90, 90},
|
|
{60,60,60},
|
|
{30, 30, 30},
|
|
{0, 0, 0}
|
|
};
|
|
|
|
FILE *fp;
|
|
Rect *rect;
|
|
Panel panel;
|
|
int pam;
|
|
static char aa[] = {"arndcqeghilkmfpstwyvbzx*"};
|
|
static pam120[24][24] = {
|
|
/*a r n d c q e g h i l k m f p s t w y v b z x * */
|
|
/*a*/ 3,-3,-1, 0,-3,-1, 0, 1,-3,-1,-3,-2,-2,-4, 1, 1, 1,-7,-4, 0, 1, 0,-1,-8,
|
|
/*r*/ -3, 6,-1,-3,-4, 1,-3,-4, 1,-2,-4, 2,-1,-5,-1,-1,-2, 1,-5,-3,-1, 0,-2,-8,
|
|
/*n*/ -1,-1, 4, 2,-5, 0, 1, 0, 2,-2,-4, 1,-3,-4,-2, 1, 0,-4,-2,-3, 4, 1,-1,-8,
|
|
/*d*/ 0,-3, 2, 5,-7, 1, 3, 0, 0,-3,-5,-1,-4,-7,-3, 0,-1,-8,-5,-3, 5, 3,-2,-8,
|
|
/*c*/ -3,-4,-5,-7, 9,-7,-7,-4,-4,-3,-7,-7,-6,-6,-4, 0,-3,-8,-1,-3,-4,-6,-4,-8,
|
|
/*q*/ -1, 1, 0, 1,-7, 6, 2,-3, 3,-3,-2, 0,-1,-6, 0,-2,-2,-6,-5,-3, 1, 5,-1,-8,
|
|
/*e*/ 0,-3, 1, 3,-7, 2, 5,-1,-1,-3,-4,-1,-3,-7,-2,-1,-2,-8,-5,-3, 3, 5,-1,-8,
|
|
/*g*/ 1,-4, 0, 0,-4,-3,-1, 5,-4,-4,-5,-3,-4,-5,-2, 1,-1,-8,-6,-2, 1,-1,-2,-8,
|
|
/*h*/ -3, 1, 2, 0,-4, 3,-1,-4, 7,-4,-3,-2,-4,-3,-1,-2,-3,-3,-1,-3, 2, 2,-2,-8,
|
|
/*i*/ -1,-2,-2,-3,-3,-3,-3,-4,-4, 6, 1,-3, 1, 0,-3,-2, 0,-6,-2, 3,-2,-2,-1,-8,
|
|
/*l*/ -3,-4,-4,-5,-7,-2,-4,-5,-3, 1, 5,-4, 3, 0,-3,-4,-3,-3,-2, 1,-3,-2,-2,-8,
|
|
/*k*/ -2, 2, 1,-1,-7, 0,-1,-3,-2,-3,-4, 5, 0,-7,-2,-1,-1,-5,-5,-4, 1, 0,-2,-8,
|
|
/*m*/ -2,-1,-3,-4,-6,-1,-3,-4,-4, 1, 3, 0, 8,-1,-3,-2,-1,-6,-4, 1,-3,-1,-2,-8,
|
|
/*f*/ -4,-5,-4,-7,-6,-6,-7,-5,-3, 0, 0,-7,-1, 8,-5,-3,-4,-1, 4,-3,-4,-5,-3,-8,
|
|
/*p*/ 1,-1,-2,-3,-4, 0,-2,-2,-1,-3,-3,-2,-3,-5, 6, 1,-1,-7,-6,-2,-1, 0,-2,-8,
|
|
/*s*/ 1,-1, 1, 0, 0,-2,-1, 1,-2,-2,-4,-1,-2,-3, 1, 3, 2,-2,-3,-2, 1, 0,-1,-8,
|
|
/*t*/ 1,-2, 0,-1,-3,-2,-2,-1,-3, 0,-3,-1,-1,-4,-1, 2, 4,-6,-3, 0, 1,-1,-1,-8,
|
|
/*w*/ -7, 1,-4,-8,-8,-6,-8,-8,-3,-6,-3,-5,-6,-1,-7,-2,-6,12,-2,-8,-5,-6,-5,-8,
|
|
/*y*/ -4,-5,-2,-5,-1,-5,-5,-6,-1,-2,-2,-5,-4, 4,-6,-3,-3,-2, 8,-3,-2,-4,-3,-8,
|
|
/*v*/ 0,-3,-3,-3,-3,-3,-3,-2,-3, 3, 1,-4, 1,-3,-2,-2, 0,-8,-3, 5,-2,-2,-1,-8,
|
|
/*b*/ 1,-1, 4, 5,-4, 1, 3, 1, 2,-2,-3, 1,-3,-4,-1, 1, 1,-5,-2,-2, 6, 4,-1,-8,
|
|
/*z*/ 0, 0, 1, 3,-6, 5, 5,-1, 2,-2,-2, 0,-1,-5, 0, 0,-1,-6,-4,-2, 4, 6, 0,-8,
|
|
/*x*/ -1,-2,-1,-2,-4,-1,-1,-2,-2,-1,-2,-2,-2,-3,-2,-1,-1,-5,-3,-1,-1, 0,-2,-8,
|
|
/***/ -8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8, 1};
|
|
|
|
static pam250[24][24] = {
|
|
/*a r n d c q e g h i l k m f p s t w y v b z x * */
|
|
2,-2, 0, 0,-2, 0, 0, 1,-1,-1,-2,-1,-1,-3, 1, 1, 1,-6,-3, 0, 2, 1, 0,-8,
|
|
-2, 6, 0,-1,-4, 1,-1,-3, 2,-2,-3, 3, 0,-4, 0, 0,-1, 2,-4,-2, 1, 2,-1,-8,
|
|
0, 0, 2, 2,-4, 1, 1, 0, 2,-2,-3, 1,-2,-3, 0, 1, 0,-4,-2,-2, 4, 3, 0,-8,
|
|
0,-1, 2, 4,-5, 2, 3, 1, 1,-2,-4, 0,-3,-6,-1, 0, 0,-7,-4,-2, 5, 4,-1,-8,
|
|
-2,-4,-4,-5,12,-5,-5,-3,-3,-2,-6,-5,-5,-4,-3, 0,-2,-8, 0,-2,-3,-4,-3,-8,
|
|
0, 1, 1, 2,-5, 4, 2,-1, 3,-2,-2, 1,-1,-5, 0,-1,-1,-5,-4,-2, 3, 5,-1,-8,
|
|
0,-1, 1, 3,-5, 2, 4, 0, 1,-2,-3, 0,-2,-5,-1, 0, 0,-7,-4,-2, 4, 5,-1,-8,
|
|
1,-3, 0, 1,-3,-1, 0, 5,-2,-3,-4,-2,-3,-5, 0, 1, 0,-7,-5,-1, 2, 1,-1,-8,
|
|
-1, 2, 2, 1,-3, 3, 1,-2, 6,-2,-2, 0,-2,-2, 0,-1,-1,-3, 0,-2, 3, 3,-1,-8,
|
|
-1,-2,-2,-2,-2,-2,-2,-3,-2, 5, 2,-2, 2, 1,-2,-1, 0,-5,-1, 4,-1,-1,-1,-8,
|
|
-2,-3,-3,-4,-6,-2,-3,-4,-2, 2, 6,-3, 4, 2,-3,-3,-2,-2,-1, 2,-2,-1,-1,-8,
|
|
-1, 3, 1, 0,-5, 1, 0,-2, 0,-2,-3, 5, 0,-5,-1, 0, 0,-3,-4,-2, 2, 2,-1,-8,
|
|
-1, 0,-2,-3,-5,-1,-2,-3,-2, 2, 4, 0, 6, 0,-2,-2,-1,-4,-2, 2,-1, 0,-1,-8,
|
|
-3,-4,-3,-6,-4,-5,-5,-5,-2, 1, 2,-5, 0, 9,-5,-3,-3, 0, 7,-1,-3,-4,-2,-8,
|
|
1, 0, 0,-1,-3, 0,-1, 0, 0,-2,-3,-1,-2,-5, 6, 1, 0,-6,-5,-1, 1, 1,-1,-8,
|
|
1, 0, 1, 0, 0,-1, 0, 1,-1,-1,-3, 0,-2,-3, 1, 2, 1,-2,-3,-1, 2, 1, 0,-8,
|
|
1,-1, 0, 0,-2,-1, 0, 0,-1, 0,-2, 0,-1,-3, 0, 1, 3,-5,-3, 0, 2, 1, 0,-8,
|
|
-6, 2,-4,-7,-8,-5,-7,-7,-3,-5,-2,-3,-4, 0,-6,-2,-5,17, 0,-6,-4,-4,-4,-8,
|
|
-3,-4,-2,-4, 0,-4,-4,-5, 0,-1,-1,-4,-2, 7,-5,-3,-3, 0,10,-2,-2,-3,-2,-8,
|
|
0,-2,-2,-2,-2,-2,-2,-1,-2, 4, 2,-2, 2,-1,-1,-1, 0,-6,-2, 4, 0, 0,-1,-8,
|
|
2, 1, 4, 5,-3, 3, 4, 2, 3,-1,-2, 2,-1,-3, 1, 2, 2,-4,-2, 0, 6, 5,-1,-8,
|
|
1, 2, 3, 4,-4, 5, 5, 1, 3,-1,-1, 2, 0,-4, 1, 1, 1,-4,-3, 0, 5, 6, 0,-8,
|
|
0,-1, 0,-1,-3,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1, 0, 0,-4,-2,-1,-1, 0,-1,-8,
|
|
-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8, 1};
|
|
|
|
/* malloc_debug(2); */
|
|
|
|
if(argc == 1)
|
|
{
|
|
fprintf(stderr, "An input file is required.\n");
|
|
fprintf(stderr, "Usage: %s filename [pam120|pam250(If AA seqs)]\n",
|
|
argv[0]);
|
|
exit(0);
|
|
}
|
|
|
|
set_offset = LoadHGLData(argv[1]);
|
|
|
|
/* setup comparison AAmatrix. */
|
|
|
|
for(ii = 0; ii < 256; ii++)
|
|
for(jj = 0; jj < 256; jj++)
|
|
AAmatr[ii][jj] = -100;
|
|
|
|
pam = 250;
|
|
if(argc > 2)
|
|
{
|
|
if(strcmp(argv[2], "pam120") == 0)
|
|
pam = 120;
|
|
else if(strcmp(argv[2], "pam250") != 0)
|
|
{
|
|
fprintf(stderr, "Incorrect pam name: %s\n", argv[2]);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
for(ii = 0; ii < strlen(aa); ii++)
|
|
for(jj = 0; jj < strlen(aa); jj++)
|
|
{
|
|
AAmatr[aa[ii]][aa[jj]] =
|
|
AAmatr[aa[ii]-32][aa[jj]-32] =
|
|
AAmatr[aa[ii]][aa[jj]-32] =
|
|
AAmatr[aa[ii]-32][aa[jj]] =
|
|
(pam==250)?pam250[ii][jj]:pam120[ii][jj];
|
|
}
|
|
|
|
tmp_cutoff = cutoff;
|
|
tmp_width = width;
|
|
tmp_direction = direction;
|
|
tmp_size = size;
|
|
tmp_filter = filter;
|
|
tmp_compd = compd;
|
|
|
|
xv_init(XV_INIT_ARGS, argc, argv, NULL);
|
|
|
|
frame = xv_create(XV_NULL, FRAME,
|
|
FRAME_LABEL, heading,
|
|
FRAME_SHOW_FOOTER, TRUE,
|
|
FRAME_LEFT_FOOTER, "Mouse Location:",
|
|
FRAME_RIGHT_FOOTER, footnote,
|
|
NULL);
|
|
|
|
panel_1 = (Panel) xv_create(frame, PANEL,
|
|
NULL);
|
|
|
|
(void) xv_create(panel_1,PANEL_BUTTON,
|
|
PANEL_LABEL_STRING, "Properties...",
|
|
PANEL_NOTIFY_PROC, show_prop_frame,
|
|
NULL);
|
|
|
|
(void) xv_create(panel_1,PANEL_BUTTON,
|
|
PANEL_LABEL_STRING, "Load",
|
|
PANEL_NOTIFY_PROC, Load,
|
|
NULL);
|
|
|
|
(void) xv_create(panel_1,PANEL_BUTTON,
|
|
PANEL_LABEL_STRING, "Exit",
|
|
PANEL_NOTIFY_PROC, exit_proc,
|
|
NULL);
|
|
|
|
window_fit_height(panel_1);
|
|
|
|
canvas = (Canvas) xv_create(frame, CANVAS,
|
|
CANVAS_X_PAINT_WINDOW, TRUE,
|
|
CANVAS_REPAINT_PROC, canvas_repaint_proc,
|
|
CANVAS_AUTO_CLEAR, FALSE,
|
|
CANVAS_AUTO_SHRINK, FALSE,
|
|
CANVAS_AUTO_EXPAND, FALSE,
|
|
CANVAS_WIDTH, Xaxis*max_width+margin,
|
|
CANVAS_HEIGHT,Yaxis*max_width+margin,
|
|
XV_WIDTH, MIN(600, Xaxis*width)+margin,
|
|
XV_HEIGHT,MIN(400, Yaxis*width)+margin,
|
|
WIN_BELOW, panel_1,
|
|
CANVAS_RETAINED, FALSE,
|
|
NULL);
|
|
/*
|
|
printf("Canvas_WIDTH=%d _HEIGHT=%d\n",
|
|
(int)xv_get(canvas, CANVAS_WIDTH),
|
|
(int)xv_get(canvas, CANVAS_HEIGHT));
|
|
*/
|
|
paint_win = (Xv_Window) canvas_paint_window(canvas);
|
|
xv_set(paint_win,
|
|
WIN_BIT_GRAVITY, ForgetGravity,
|
|
WIN_CONSUME_EVENTS,
|
|
MS_LEFT,
|
|
NULL,
|
|
WIN_EVENT_PROC, footer_proc,
|
|
NULL);
|
|
|
|
h_scrollbar = (Scrollbar) xv_create(canvas, SCROLLBAR,
|
|
SCROLLBAR_DIRECTION, SCROLLBAR_HORIZONTAL,
|
|
SCROLLBAR_OBJECT_LENGTH, Xaxis*width+margin,
|
|
SCROLLBAR_VIEW_START, 0,
|
|
NULL);
|
|
|
|
v_scrollbar = (Scrollbar) xv_create(canvas, SCROLLBAR,
|
|
SCROLLBAR_DIRECTION, SCROLLBAR_VERTICAL,
|
|
SCROLLBAR_OBJECT_LENGTH, Yaxis*width+margin,
|
|
SCROLLBAR_VIEW_START, 0,
|
|
NULL);
|
|
|
|
cms = xv_create((Cms)NULL, CMS,
|
|
CMS_SIZE, 19,
|
|
CMS_TYPE, XV_DYNAMIC_CMS,
|
|
CMS_COLORS, cms_colors,
|
|
NULL);
|
|
|
|
xv_set(canvas, WIN_CMS, cms,
|
|
WIN_INHERIT_COLORS, FALSE,
|
|
WIN_BACKGROUND_COLOR, WHITE,
|
|
NULL);
|
|
|
|
window_fit(canvas);
|
|
|
|
prop_subframe = (Frame)xv_create(frame, FRAME_CMD,
|
|
FRAME_LABEL, "Properties",
|
|
NULL);
|
|
|
|
panel = (Panel)xv_get(prop_subframe, FRAME_CMD_PANEL);
|
|
(void) xv_set(panel, PANEL_LAYOUT, PANEL_VERTICAL,NULL);
|
|
|
|
(void) xv_create(panel, PANEL_SLIDER,
|
|
PANEL_LABEL_STRING, "Dot Size: ",
|
|
PANEL_VALUE, size,
|
|
PANEL_MIN_VALUE, min_size,
|
|
PANEL_MAX_VALUE, max_size,
|
|
PANEL_SLIDER_WIDTH, 100,
|
|
PANEL_TICKS, 4,
|
|
PANEL_NOTIFY_PROC, size_proc,
|
|
NULL);
|
|
|
|
width_panel = xv_create(panel, PANEL_SLIDER,
|
|
PANEL_LABEL_STRING, "Dot Width: ",
|
|
PANEL_VALUE, width,
|
|
PANEL_MIN_VALUE, min_width,
|
|
PANEL_MAX_VALUE, max_width,
|
|
PANEL_SLIDER_WIDTH, 100,
|
|
PANEL_TICKS, 5,
|
|
PANEL_NOTIFY_PROC, width_proc,
|
|
NULL);
|
|
|
|
(void) xv_create(panel, PANEL_SLIDER,
|
|
PANEL_LABEL_STRING, "Min Match Length: ",
|
|
PANEL_VALUE, filter,
|
|
PANEL_MIN_VALUE, min_filter,
|
|
PANEL_MAX_VALUE, max_filter,
|
|
PANEL_SLIDER_WIDTH, 100,
|
|
PANEL_TICKS, 5,
|
|
PANEL_NOTIFY_PROC, filter_proc,
|
|
NULL);
|
|
|
|
(void)xv_create(panel, PANEL_CHOICE,
|
|
PANEL_LABEL_STRING, "Match Direction",
|
|
PANEL_CHOICE_STRINGS,
|
|
"Direct",
|
|
"Reversed",
|
|
"Both",
|
|
NULL,
|
|
PANEL_NOTIFY_PROC, dir_proc,
|
|
PANEL_VALUE, 0,
|
|
NULL);
|
|
|
|
(void)xv_create(panel, PANEL_CHOICE,
|
|
PANEL_LABEL_STRING, "Complemented(for NN only):",
|
|
PANEL_CHOICE_STRINGS, "No", "Yes", NULL,
|
|
PANEL_NOTIFY_PROC, compd_proc,
|
|
PANEL_VALUE, 0,
|
|
NULL);
|
|
|
|
(void) xv_create(panel, PANEL_SLIDER,
|
|
PANEL_LABEL_STRING, "Cutoff PAM250 score(for AA only):",
|
|
PANEL_VALUE, cutoff,
|
|
PANEL_MIN_VALUE, min_cutoff,
|
|
PANEL_MAX_VALUE, max_cutoff,
|
|
PANEL_SLIDER_WIDTH, 100,
|
|
PANEL_TICKS, 5,
|
|
PANEL_NOTIFY_PROC, cutoff_proc,
|
|
NULL);
|
|
|
|
(void)xv_create(panel, PANEL_BUTTON,
|
|
PANEL_LABEL_STRING, "OK",
|
|
PANEL_NOTIFY_PROC, ok_proc,
|
|
NULL);
|
|
|
|
window_fit(panel);
|
|
window_fit(prop_subframe);
|
|
|
|
colors = (unsigned long *)xv_get(canvas, WIN_X_COLOR_INDICES);
|
|
|
|
display = (Display *)xv_get(paint_win, XV_DISPLAY);
|
|
xwin = (Window)xv_get(paint_win, XV_XID);
|
|
gc = DefaultGC(display, DefaultScreen(display));
|
|
|
|
xv_set(panel_1,XV_WIDTH,MIN(600, Xaxis*width)+margin,NULL);
|
|
window_fit(frame);
|
|
|
|
rect = (Rect *)xv_get(canvas,CANVAS_VIEWABLE_RECT,paint_win);
|
|
XClearArea(display, xwin,
|
|
rect->r_left, rect->r_top,
|
|
rect->r_width, rect->r_height,
|
|
0);
|
|
|
|
image = (Server_image)xv_create((Cms)NULL, SERVER_IMAGE,
|
|
XV_WIDTH, 64,
|
|
XV_HEIGHT, 64,
|
|
SERVER_IMAGE_BITS, plot_bits,
|
|
NULL);
|
|
|
|
icon = (Icon)xv_create(frame, ICON,
|
|
ICON_IMAGE, image,
|
|
/* ICON_TRANSPARENT, TRUE,*/
|
|
WIN_FOREGROUND_COLOR, WHITE,
|
|
WIN_BACKGROUND_COLOR, BLACK,
|
|
XV_LABEL, "DotPlotTool",
|
|
NULL);
|
|
|
|
xv_set(frame, FRAME_ICON, icon, NULL);
|
|
|
|
xv_main_loop(frame);
|
|
}
|
|
|
|
|
|
|
|
int LoadHGLData(name_str)
|
|
char *name_str;
|
|
{
|
|
int iSeq, ii, jj, kk, YY, tmp, cnt_match;
|
|
FILE *fp;
|
|
|
|
if(strcmp(name_str, "") == 0)
|
|
return -1;
|
|
|
|
if((fp = fopen(name_str, "r")) == NULL)
|
|
{
|
|
fprintf(stderr, "Can't open file %s.\n", name_str);
|
|
exit(1);
|
|
}
|
|
|
|
iSeq = 0;
|
|
tSeq = (Sequence *)Calloc(2, sizeof(Sequence));
|
|
|
|
while(iSeq<2 && (ReadRecord(fp, &(tSeq[iSeq]))) != -1)
|
|
{
|
|
SeqNormal(&(tSeq[iSeq++]));
|
|
};
|
|
if(iSeq == 1)
|
|
{
|
|
CopyRecord(&(tSeq[1]), &(tSeq[0]));
|
|
iSeq++;
|
|
}
|
|
|
|
fclose(fp);
|
|
|
|
Xaxis = strlen(tSeq[0].c_elem);
|
|
Yaxis = strlen(tSeq[1].c_elem);
|
|
max_width = MIN(6, MAX(1, MIN(28000/Xaxis, 28000/Yaxis)));
|
|
width = MAX(1, max_width/2);
|
|
if(width_panel != (Panel)NULL)
|
|
xv_set(width_panel, PANEL_MAX_VALUE, max_width, NULL);
|
|
|
|
sprintf(heading, "PLOT : %s", name_str);
|
|
sprintf(footnote, "X-axis: %s Y-axis: %s ",
|
|
(tSeq[0].name[0]!='\0')?tSeq[0].name:tSeq[0].sequence_ID,
|
|
(tSeq[1].name[0]!='\0')?tSeq[1].name:tSeq[1].sequence_ID);
|
|
|
|
if(frame != (Frame)NULL)
|
|
{
|
|
XClearWindow(display, xwin);
|
|
|
|
(void)xv_set(canvas,
|
|
XV_WIDTH, MIN(600, Xaxis*width)+margin,
|
|
XV_HEIGHT,MIN(400, Yaxis*width)+margin,
|
|
CANVAS_WIDTH, Xaxis*max_width+margin,
|
|
CANVAS_HEIGHT,Yaxis*max_width+margin,
|
|
NULL);
|
|
|
|
xv_set(panel_1,XV_WIDTH,(int)xv_get(canvas,XV_WIDTH),NULL);
|
|
window_fit(frame);
|
|
|
|
xv_set(frame,FRAME_RIGHT_FOOTER, footnote, NULL);
|
|
|
|
(void)xv_set(h_scrollbar,
|
|
SCROLLBAR_OBJECT_LENGTH, Xaxis*width+margin,
|
|
SCROLLBAR_VIEW_START, 0,
|
|
NULL);
|
|
|
|
(void)xv_set(v_scrollbar,
|
|
SCROLLBAR_OBJECT_LENGTH, Yaxis*width+margin,
|
|
SCROLLBAR_VIEW_START, 0,
|
|
NULL);
|
|
|
|
mark_x = mark_y = 0;
|
|
canvas_repaint_proc(canvas,paint_win,display, xwin, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
DrawDot(display, xwin, gc, x, y, size)
|
|
Display *display;
|
|
Window xwin;
|
|
GC gc;
|
|
int x, y, size;
|
|
{
|
|
int ii, jj;
|
|
|
|
switch(size)
|
|
{
|
|
case 1:
|
|
XDrawPoint(display, xwin, gc, x, y);
|
|
break;
|
|
case 2:
|
|
XDrawLine(display, xwin, gc, x,y+1, x+2,y+1);
|
|
XDrawLine(display, xwin, gc, x+1,y, x+1,y+2);
|
|
break;
|
|
case 3:
|
|
XDrawLine(display, xwin, gc, x,y+1, x+3,y+1);
|
|
XDrawLine(display, xwin, gc, x,y+2, x+3,y+2);
|
|
XDrawLine(display, xwin, gc, x+1,y, x+1,y+3);
|
|
XDrawLine(display, xwin, gc, x+2,y, x+2,y+3);
|
|
break;
|
|
case 4:
|
|
XDrawLine(display, xwin, gc, x,y+1, x+4,y+1);
|
|
XDrawLine(display, xwin, gc, x,y+2, x+4,y+2);
|
|
XDrawLine(display, xwin, gc, x,y+3, x+4,y+3);
|
|
XDrawLine(display, xwin, gc, x+1,y, x+1,y+4);
|
|
XDrawLine(display, xwin, gc, x+2,y, x+2,y+4);
|
|
XDrawLine(display, xwin, gc, x+3,y, x+3,y+4);
|
|
break;
|
|
default:
|
|
fprintf(stderr,
|
|
"Dot size %d is not implemented. 2 is used.\n",size);
|
|
XDrawLine(display, xwin, gc, x,y+1, x+2,y+1);
|
|
XDrawLine(display, xwin, gc, x+1,y, x+1,y+2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
canvas_repaint_proc(canvas,pw,display, xwin, xrects )
|
|
Canvas canvas;
|
|
Xv_Window pw;
|
|
Display *display;
|
|
Window xwin;
|
|
Xv_xrectlist *xrects;
|
|
{
|
|
int y, iSeq, iSeg, i, cnt, head, tail;
|
|
XGCValues gc_val;
|
|
Rect *rect;
|
|
int drawarea_min_x = INT_MAX;
|
|
int drawarea_max_x = 0;
|
|
int ii, jj, prev_color = -99, tmp_color;
|
|
|
|
if(xrects == NULL)
|
|
{
|
|
if(clear_mark == 'F')
|
|
{
|
|
rect=(Rect *)xv_get(canvas,CANVAS_VIEWABLE_RECT,paint_win);
|
|
drawarea_min_y = rect->r_top;
|
|
drawarea_max_y = drawarea_min_y + rect->r_height;
|
|
}
|
|
|
|
rect=(Rect *)xv_get(canvas,CANVAS_VIEWABLE_RECT,paint_win);
|
|
drawarea_min_x = MAX(0, rect->r_left -1);
|
|
drawarea_max_x = rect->r_left + rect->r_width;
|
|
|
|
/*
|
|
printf("min_x=%d max_x=%d min_y=%d max_y=%d\n",
|
|
drawarea_min_x,drawarea_max_x,
|
|
drawarea_min_y,drawarea_max_y);
|
|
*/
|
|
|
|
for(ii=MAX(drawarea_min_y/width, 0);
|
|
ii<MIN(drawarea_max_y/width+1, Yaxis);
|
|
ii++)
|
|
{
|
|
for(jj = MAX(drawarea_min_x/width, 0);
|
|
jj<MIN(drawarea_max_x/width+1, Xaxis);
|
|
jj++)
|
|
{
|
|
if((tmp_color=ToDisplay(tSeq, jj, ii)) == WHITE)
|
|
continue;
|
|
|
|
if(tmp_color != prev_color)
|
|
{
|
|
XSetForeground(display,gc,colors[tmp_color]);
|
|
prev_color = tmp_color;
|
|
}
|
|
DrawDot(display, xwin, gc,
|
|
jj * width,
|
|
ii * width,
|
|
size);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(cnt=xrects->count-1; cnt>=0; cnt--)
|
|
{
|
|
drawarea_min_y = xrects->rect_array[cnt].y;
|
|
drawarea_max_y = xrects->rect_array[cnt].y +
|
|
xrects->rect_array[cnt].height;
|
|
|
|
drawarea_min_x = xrects->rect_array[cnt].x;
|
|
drawarea_max_x = xrects->rect_array[cnt].x +
|
|
xrects->rect_array[cnt].width;
|
|
|
|
/*
|
|
printf("else: min_x=%d max_x=%d min_y=%d max_y=%d\n",
|
|
drawarea_min_x,drawarea_max_x,
|
|
drawarea_min_y,drawarea_max_y);
|
|
*/
|
|
|
|
for(ii=MAX(drawarea_min_y/width, 0);
|
|
ii<MIN(drawarea_max_y/width+1, Yaxis);
|
|
ii++)
|
|
{
|
|
for(jj = MAX(drawarea_min_x/width, 0);
|
|
jj<MIN(drawarea_max_x/width+1, Xaxis);
|
|
jj++)
|
|
{
|
|
|
|
if((tmp_color=ToDisplay(tSeq, jj, ii)) == WHITE)
|
|
continue;
|
|
|
|
if(tmp_color != prev_color)
|
|
{
|
|
XSetForeground(display,gc,colors[tmp_color]);
|
|
prev_color = tmp_color;
|
|
}
|
|
DrawDot(display, xwin, gc,
|
|
jj * width,
|
|
ii * width,
|
|
size);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Draw marker if (mark_x, mark_y) is not the one
|
|
* just being deleted.
|
|
*/
|
|
if(clear_mark == 'F')
|
|
{
|
|
XSetForeground(display, gc, colors[RED]);
|
|
cross(size, mark_x, mark_y);
|
|
}
|
|
else
|
|
clear_mark = 'F';
|
|
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
|
|
/* Find the location of the mouse and print the
|
|
* results in the footer of the frame.
|
|
*/
|
|
|
|
footer_proc ( paint_win, event, arg )
|
|
Xv_Window paint_win;
|
|
Event *event;
|
|
Notify_arg arg;
|
|
{
|
|
char buf[125];
|
|
int save_line, i, ii, iSeq, iSeg;
|
|
int return_len=10;
|
|
char return_str[10];
|
|
KeySym keysym;
|
|
XEvent *xevent;
|
|
int save_mark_x = mark_x;
|
|
int save_mark_y = mark_y;
|
|
char need_to_paint = 'F';
|
|
char loc_name[32];
|
|
int loc_col = INT_MAX, ii1, ii2;
|
|
char cc1, cc2;
|
|
Rect *rect;
|
|
|
|
if (event_id(event) == LOC_WINENTER)
|
|
{
|
|
win_set_kbd_focus(canvas, xwin);
|
|
}
|
|
else if(event_id(event) == LOC_WINEXIT)
|
|
{
|
|
win_refuse_kbd_focus(canvas);
|
|
}
|
|
|
|
/* else if(event_id(event) == LOC_MOVE) */
|
|
if (event_is_down(event) &&
|
|
event_action(event)==ACTION_SELECT)
|
|
{
|
|
mark_x = event_x(event);
|
|
mark_y = event_y(event);
|
|
need_to_paint = 'T';
|
|
|
|
if((ii1 = mark_x/width) >= Xaxis)
|
|
{
|
|
ii1 = Xaxis;
|
|
cc1 = ' ';
|
|
}
|
|
else
|
|
cc1 = tSeq[0].c_elem[ii1];
|
|
|
|
if((ii2 = mark_y/width) >= Yaxis)
|
|
{
|
|
ii2 = Yaxis;
|
|
cc2 = ' ';
|
|
}
|
|
else
|
|
cc2 = tSeq[1].c_elem[ii2];
|
|
|
|
sprintf(buf,
|
|
"Mouse location: X=(%c, %d) Y=(%c, %d) ",
|
|
cc1, ii1, cc2, ii2);
|
|
|
|
xv_set(frame,FRAME_LEFT_FOOTER, buf, NULL);
|
|
}
|
|
|
|
if(need_to_paint == 'T')
|
|
{
|
|
/**
|
|
** clear the old mark.
|
|
**/
|
|
|
|
XSetForeground(display, gc, colors[WHITE]);
|
|
cross(size, save_mark_x, save_mark_y);
|
|
|
|
drawarea_min_y = save_mark_y - 10;
|
|
drawarea_max_y = save_mark_y + 15;
|
|
|
|
clear_mark = 'T';
|
|
|
|
canvas_repaint_proc(canvas,paint_win,display, xwin, NULL);
|
|
|
|
/**
|
|
** put a new mark.
|
|
**/
|
|
|
|
XSetForeground(display, gc, colors[RED]);
|
|
cross(size, mark_x, mark_y);
|
|
}
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
|
|
Load(item,event)
|
|
Panel_item item;
|
|
Event *event;
|
|
{
|
|
extern Frame load_file();
|
|
(void)load_file(frame,300,150,NULL);
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
size_proc(item, i_sz, event)
|
|
Panel_item item;
|
|
int i_sz;
|
|
Event *event;
|
|
{
|
|
tmp_size = i_sz;
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
width_proc(item, i_wd, event)
|
|
Panel_item item;
|
|
int i_wd;
|
|
Event *event;
|
|
{
|
|
tmp_width = i_wd;
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
filter_proc(item, i_fl, event)
|
|
Panel_item item;
|
|
int i_fl;
|
|
Event *event;
|
|
{
|
|
tmp_filter = i_fl;
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
cutoff_proc(item, i_ct, event)
|
|
Panel_item item;
|
|
int i_ct;
|
|
Event *event;
|
|
{
|
|
tmp_cutoff = i_ct;
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
exit_proc(item, event)
|
|
Panel_item item;
|
|
Event *event;
|
|
{
|
|
if (event_action(event) == ACTION_SELECT)
|
|
{
|
|
xv_destroy_safe(frame);
|
|
return(XV_OK);
|
|
}
|
|
else
|
|
return(XV_ERROR);
|
|
}
|
|
|
|
|
|
show_prop_frame(item, event)
|
|
Frame item;
|
|
Event *event;
|
|
{
|
|
xv_set(prop_subframe, XV_SHOW, TRUE, NULL);
|
|
}
|
|
|
|
|
|
cross(size, loc_x, loc_y)
|
|
int size, loc_x, loc_y;
|
|
{
|
|
int ii;
|
|
|
|
if(size == 1)
|
|
{
|
|
XDrawLine(display,xwin,gc, loc_x-2,loc_y, loc_x+2,loc_y);
|
|
XDrawLine(display,xwin,gc, loc_x, loc_y-2,loc_x, loc_y+2);
|
|
}
|
|
else if(size == 2)
|
|
{
|
|
for(ii=0; ii<2; ii++)
|
|
{
|
|
XDrawLine(display,xwin,gc,loc_x-2,loc_y+ii,loc_x+3,loc_y+ii);
|
|
XDrawLine(display,xwin,gc,loc_x+ii,loc_y-2,loc_x+ii,loc_y+3);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(ii= -1; ii<2; ii++)
|
|
{
|
|
XDrawLine(display,xwin,gc,loc_x-4,loc_y+ii,loc_x+4,loc_y+ii);
|
|
XDrawLine(display,xwin,gc,loc_x+ii,loc_y-4,loc_x+ii,loc_y+4);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int ScoreMatch(a,b)
|
|
char a,b;
|
|
{
|
|
int i, intc;
|
|
char c;
|
|
static int tmatr[16] = {'-','a','c','m','g','r','s','v',
|
|
't','w','y','h','k','d','b','n'};
|
|
|
|
static int matr[128] = {
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00,
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0x01,0xe,0x02,0x0d,0,0,0x04,0x0b,0,0,0x0c,0,0x03,0x0f,0,0x05,0,0x05,0x06,
|
|
0x08,0x08,0x07,0x09,0x00,0xa,0,0,0,0,0,0,0,0x01,0x0e,0x02,0x0d,0,0,0x04,
|
|
0x0b,0,0,0x0c,0,0x03,0x0f,0,0x05,0,0x05,0x06,0x08,0x08,0x07,0x09,0x00,0x0a,
|
|
0,0,0,0,0x00,0
|
|
};
|
|
|
|
if(a == '-' || b == '-') return(mscore);
|
|
|
|
if(matr[a] == matr[b]) return(mscore);
|
|
|
|
intc = matr[a] & matr[b];
|
|
|
|
if((intc==matr[a]) || (intc==matr[b])) return(pmscore);
|
|
|
|
return(mmscore);
|
|
}
|
|
|
|
|
|
int ToDisplay(tSeq, x, y)
|
|
Sequence *tSeq; /* 0 and 1 sequences. */
|
|
int x, y; /* axes. */
|
|
/* return the color to draw. */
|
|
{
|
|
int ii, jj, kk, cnt;
|
|
char this_score;
|
|
char GetBase();
|
|
|
|
if(strcmp(tSeq[0].type, "PROTEIN") == 0 &&
|
|
strcmp(tSeq[1].type, "PROTEIN") == 0)
|
|
{
|
|
if((this_score=AAmatr[tSeq[0].c_elem[x]][tSeq[1].c_elem[y]])
|
|
< cutoff)
|
|
return WHITE;
|
|
|
|
if(direction == 0 || direction == 1)
|
|
{
|
|
cnt = 1;
|
|
for(kk = 1;
|
|
cnt < filter &&
|
|
kk < filter &&
|
|
x - kk >= 0 && y - kk >= 0 &&
|
|
AAmatr[tSeq[0].c_elem[x-kk]][tSeq[1].c_elem[y-kk]] >= cutoff;
|
|
kk++, cnt++);
|
|
|
|
for(kk = 1;
|
|
cnt < filter &&
|
|
kk < filter &&
|
|
x + kk < Xaxis && y + kk < Yaxis &&
|
|
AAmatr[tSeq[0].c_elem[x+kk]][tSeq[1].c_elem[y+kk]] >= cutoff;
|
|
kk++, cnt++);
|
|
|
|
if(cnt >= filter)
|
|
return ((this_score+9)/4+1 +11);
|
|
|
|
if(direction == 1)
|
|
return WHITE;
|
|
}
|
|
|
|
if(direction == 0 || direction == -1)
|
|
{
|
|
cnt = 1;
|
|
for(kk = 1;
|
|
cnt < filter &&
|
|
kk < filter &&
|
|
y + kk < Yaxis && x - kk >= 0 &&
|
|
AAmatr[tSeq[0].c_elem[x-kk]][tSeq[1].c_elem[y+kk]] >= cutoff;
|
|
kk++, cnt++);
|
|
|
|
for(kk = 1;
|
|
cnt < filter &&
|
|
kk < filter &&
|
|
y - kk >= 0 && x + kk < Xaxis &&
|
|
AAmatr[tSeq[0].c_elem[x+kk]][tSeq[1].c_elem[y-kk]] >= cutoff;
|
|
kk++, cnt++);
|
|
|
|
if(cnt >= filter)
|
|
return ((this_score+9)/4+1 +11); /* +11 to use grey scale.*/
|
|
return WHITE;
|
|
}
|
|
}
|
|
else if((strcmp(tSeq[0].type, "DNA") == 0 || strcmp(tSeq[0].type, "RNA") == 0) &&
|
|
(strcmp(tSeq[1].type, "DNA") == 0 || strcmp(tSeq[1].type, "RNA") == 0))
|
|
{
|
|
if((this_score=ScoreMatch(tSeq[0].c_elem[x],GetBase(tSeq[1],y)))
|
|
== mmscore)
|
|
return WHITE;
|
|
|
|
if(direction == 0 || direction == 1)
|
|
{
|
|
cnt = 1;
|
|
for(kk = 1;
|
|
cnt < filter &&
|
|
kk < filter &&
|
|
x - kk >= 0 && y - kk >= 0 &&
|
|
ScoreMatch(tSeq[0].c_elem[x-kk],GetBase(tSeq[1],y-kk))
|
|
!= mmscore;
|
|
kk++, cnt++);
|
|
|
|
for(kk = 1;
|
|
cnt < filter &&
|
|
kk < filter &&
|
|
x + kk < Xaxis && y + kk < Yaxis &&
|
|
ScoreMatch(tSeq[0].c_elem[x+kk],GetBase(tSeq[1],y+kk))
|
|
!= mmscore;
|
|
kk++, cnt++);
|
|
|
|
if(cnt >= filter)
|
|
return this_score;
|
|
|
|
if(direction == 1)
|
|
return WHITE;
|
|
}
|
|
|
|
if(direction == 0 || direction == -1)
|
|
{
|
|
cnt = 1;
|
|
for(kk = 1;
|
|
cnt < filter &&
|
|
kk < filter &&
|
|
y + kk < Yaxis && x - kk >= 0 &&
|
|
ScoreMatch(tSeq[0].c_elem[x-kk],GetBase(tSeq[1],y+kk))
|
|
!= mmscore;
|
|
kk++, cnt++);
|
|
|
|
for(kk = 1;
|
|
cnt < filter &&
|
|
kk < filter &&
|
|
y - kk >= 0 && x + kk < Xaxis &&
|
|
ScoreMatch(tSeq[0].c_elem[x+kk],GetBase(tSeq[1],y-kk))
|
|
!= mmscore;
|
|
kk++, cnt++);
|
|
|
|
if(cnt >= filter)
|
|
return this_score;
|
|
return WHITE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr, "%cCan't plot sequences with types %s vs. %s.\n",
|
|
7, tSeq[0].type, tSeq[1].type);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
dir_proc(item, ii, event)
|
|
Panel_item item;
|
|
int ii;
|
|
Event *event;
|
|
{
|
|
if(ii == 0)
|
|
tmp_direction = 1;
|
|
else if(ii == 1)
|
|
tmp_direction = -1;
|
|
else
|
|
tmp_direction = 0;
|
|
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
|
|
compd_proc(item, ii, event)
|
|
Panel_item item;
|
|
int ii;
|
|
Event *event;
|
|
{
|
|
if(ii == 0)
|
|
tmp_compd = 'N';
|
|
else
|
|
tmp_compd = 'Y';
|
|
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
ok_proc(item, event)
|
|
Panel_item item;
|
|
Event *event;
|
|
{
|
|
direction = tmp_direction;
|
|
compd = tmp_compd;
|
|
size = tmp_size;
|
|
filter = tmp_filter;
|
|
cutoff = tmp_cutoff;
|
|
|
|
XClearWindow(display, xwin);
|
|
|
|
if(tmp_width != width)
|
|
{
|
|
mark_y = mark_y/width * tmp_width;
|
|
mark_x = mark_x/width * tmp_width;
|
|
width = tmp_width;
|
|
|
|
(void)xv_set(h_scrollbar,
|
|
SCROLLBAR_OBJECT_LENGTH, Xaxis*width+margin,
|
|
SCROLLBAR_VIEW_START,
|
|
MIN(MAX(0,mark_x - 100),
|
|
MAX(0,Xaxis*width+margin-(int)xv_get(canvas,XV_WIDTH))),
|
|
NULL);
|
|
|
|
(void)xv_set(v_scrollbar,
|
|
SCROLLBAR_OBJECT_LENGTH, Yaxis*width+margin,
|
|
SCROLLBAR_VIEW_START,
|
|
MIN(MAX(0,mark_y - 100),
|
|
MAX(0,Yaxis*width+margin-(int)xv_get(canvas, XV_HEIGHT))),
|
|
NULL);
|
|
}
|
|
|
|
canvas_repaint_proc(canvas,paint_win,display, xwin, NULL);
|
|
return XV_OK;
|
|
}
|
|
|
|
|
|
char BaseComp(c)
|
|
char c;
|
|
{
|
|
unsigned char in,out, case_bit;
|
|
static int tmatr[16] = {'-','a','c','m','g','r','s','v',
|
|
't','w','y','h','k','d','b','n'};
|
|
|
|
static int matr[128] = {
|
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0x00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
|
0,0,0,0,0,0,0,0,0,0,0x01,0x0e,0x02,0x0d,0,0,0x04,0x0b,0,
|
|
0,0x0c,0,0x03,0x0f,0,0x05,0,0x05,0x06,0x08,0x08,0x07,0x09,
|
|
0x00,0x0a,0,0,0,0,0,0,0,0x01,0x0e,0x02,0x0d,0,0,0x04,0x0b,
|
|
0,0,0x0c,0,0x03,0x0f,0,0x05,0,0x05,0x06,0x08,0x08,0x07,
|
|
0x09,0x00,0x0a,0,0,0,0,0x00,0
|
|
};
|
|
|
|
/*
|
|
* Save Case bit...
|
|
*/
|
|
case_bit = c & 32;
|
|
out = 0;
|
|
in = matr[c];
|
|
if(in&1)
|
|
out|=8;
|
|
if(in&2)
|
|
out|=4;
|
|
if(in&4)
|
|
out|=2;
|
|
if(in&8)
|
|
out|=1;
|
|
|
|
c = tmatr[out] | case_bit;
|
|
|
|
return c;
|
|
}
|
|
|
|
|
|
char GetBase(tSeq, y)
|
|
Sequence tSeq;
|
|
int y;
|
|
{
|
|
if(compd == 'N')
|
|
return tSeq.c_elem[y];
|
|
if(compd == 'Y')
|
|
return BaseComp(tSeq.c_elem[y]);
|
|
}
|