int main() { int d; int x[N]; int y[N]; int c[N]; int i,t; d=g2_open_win32(W, H, "simple_animation", 0); g2_set_auto_flush(d,0); for (i=0;i<N;i++) { x[i] = rand()%(W/4)+H/2; y[i] = rand()%(H/4)+W/2; c[i] = rand()%16; } for (t=0; t<1000; t++) { g2_clear(d); for (i=0; i<N; i++) { g2_filled_circle(d,(double)x[i],(double)y[i],(double)5); g2_pen(d,c[i]); x[i] += (rand()%2) * 2 - 1; y[i] += (rand()%2) * 2 - 1; } g2_flush(d); } getchar(); return 0; }
/** * * Set pen color for all following operations, see also g2_ink(). * * \param dev device * \param color pen (either one of default pens 0-26, or a pen returned by g2_ink() ) * * \ingroup color */ void g2_pen(int dev, int color) { g2_device *devp; int i; if((devp=g2_get_device_pointer(dev))==NULL) { fprintf(stderr, "g2_pen: No such device: %d\n", dev); return; } switch(devp->t) { case g2_PD: g2_pen_pd(devp->d.pd, color); break; case g2_VD: for(i=0;i<devp->d.vd->N;i++) g2_pen(devp->d.vd->dix[i], color); break; case g2_ILLEGAL: break; case g2_NDEV: break; } __g2_last_device=dev; }
/* * * Attach PS device * */ int g2_open_PS(const char *file_name, enum g2_PS_paper paper, enum g2_PS_orientation orientation) { g2_PS_device *psout=NULL; int pid=-1, i; int vid; FILE *fp; if((fp=fopen(file_name, "w"))==NULL) { fprintf(stderr, "g2_attach_PS: Error! Can not open file '%s'\n", file_name); return -1; } if(g2_PS_dev==NULL) { g2_PS_dev=g2_malloc(sizeof(g2_PS_device)); N_PS=1; /* first PS device */ psout=&g2_PS_dev[N_PS-1]; pid=0; } else { for(i=0; i<N_PS; i++) /* find free place */ if(g2_PS_dev[i].fp==NULL) { psout=&g2_PS_dev[i]; pid=i; break; } if(i==N_PS) { /* free place not avail. */ N_PS++; g2_PS_dev=g2_realloc(g2_PS_dev, sizeof(g2_PS_device)*N_PS); psout=&g2_PS_dev[N_PS-1]; pid=N_PS-1; } } vid = g2_register_physical_device(pid, NULL, g2_DoubleCoor, g2_PS_funix, 1.0, 1.0, 0.0, 0.0); psout->fp=fp; /* init PostScript structures */ psout->paper=paper; psout->orient=orientation; psout->inks=NULL; psout->N_ink=0; psout->pen=0; psout->page_counter=0; g2_PS_write_file_header(psout); g2_PS_set_line_width(pid, NULL, 0.0); g2_PS_set_font_size(pid, NULL, 12.0); /* g2 settings */ g2_allocate_basic_colors(vid); g2_pen(vid, 1); return vid; }
void RNAProfileAlignment::drawBaseCircles(int device_id,const BaseProbs &bp,double center_x,double center_y) const { const double box_size=6.0; const double max_radius=3.0; double xpos,ypos; int color; // double dashes=0.5; // draw the base probabilities as circles on the edges of the square and the gap probability // as the center square // upper left corner = a xpos=center_x-box_size/2.0; ypos=center_y+box_size/2.0; color=g2_ink(device_id,1,0,0); g2_pen(device_id,color); g2_filled_circle(device_id,xpos,ypos,max_radius*bp.a); // upper right corner = c xpos=center_x+box_size/2.0; ypos=center_y+box_size/2.0; color=g2_ink(device_id,0,1,0); g2_pen(device_id,color); g2_filled_circle(device_id,xpos,ypos,max_radius*bp.c); // lower right corner = g xpos=center_x+box_size/2.0; ypos=center_y-box_size/2.0; color=g2_ink(device_id,0,0,1); g2_pen(device_id,color); g2_filled_circle(device_id,xpos,ypos,max_radius*bp.g); // lower right corner = u xpos=center_x-box_size/2.0; ypos=center_y-box_size/2.0; color=g2_ink(device_id,1,0,1); g2_pen(device_id,color); g2_filled_circle(device_id,xpos,ypos,max_radius*bp.u); // gap in the center color=g2_ink(device_id,0,0,0); g2_pen(device_id,color); g2_filled_circle(device_id,center_x,center_y,max_radius*bp.gap); // draw rectangle for orientation //g2_set_dash(device_id,1,&dashes); color=g2_ink(device_id,0.75,0.75,0.75); g2_pen(device_id,color); g2_rectangle(device_id,center_x-box_size/2,center_y-box_size/2,center_x+box_size/2,center_y+box_size/2); }
void RNAFuncs::drawRNAAlignment(const string &structure, const string &altStructure, const string &seq1, const string &seq2, const string &strname1, const string &strname2, const string &filename_prefix, const bool atX, const SquigglePlotOptions &options) { const double base_fontsize=12; string base,structname; float *X, *Y,min_X=0,max_X=0,min_Y=0,max_Y=0; Uint i; short *pair_table,*alt_pair_table; int id_PS,id; int ps_color_black,ps_color_red,ps_color_blue,ps_color_green; Uint basenr_x=0, basenr_y=0; double xpos,ypos; char buf[10]; bool isDel,isIns; string filename; #ifdef HAVE_LIBGD int id_PNG=0,id_JPG=0; int png_color_black,png_color_red,png_color_blue,png_color_green; int jpg_color_black,jpg_color_red,jpg_color_blue,jpg_color_green; #endif X = new float[structure.size()]; Y = new float[structure.size()]; assert(seq1.size() == seq2.size()); assert(seq1.size() == structure.size()); assert(seq1.size() == altStructure.size()); pair_table = make_pair_table(structure.c_str()); alt_pair_table = make_pair_table(altStructure.c_str()); i = naview_xy_coordinates(pair_table, X, Y); if(i!=structure.size()) cerr << "strange things happening in squigglePlot ..." << endl; // scale image for(i=0;i<structure.size();i++) { X[i]*=static_cast<float>(options.scale); Y[i]*=static_cast<float>(options.scale); } // calculate image dimensions for(i=0;i<structure.size();i++) { min_X=min(min_X,X[i]); max_X=max(max_X,X[i]); min_Y=min(min_Y,Y[i]); max_Y=max(max_Y,Y[i]); } // add a border to image size min_X-=10; max_X+=10; min_Y-=10; max_Y+=10; //id_PS = g2_open_PS("ali.ps", g2_A4, g2_PS_port); filename=filename_prefix + ".ps"; id_PS = g2_open_EPSF((char*)filename.c_str()); g2_set_coordinate_system(id_PS,-min_X,-min_Y,1,1); #ifdef HAVE_LIBGD if(options.generatePNG) { filename=filename_prefix + ".png"; id_PNG=g2_open_gd((char*)filename.c_str(),(int)(max_X-min_X),(int)(max_Y-min_Y),g2_gd_png); g2_set_coordinate_system(id_PNG,-min_X,-min_Y,1,1); } if(options.generateJPG) { filename=filename_prefix + ".jpg"; id_JPG=g2_open_gd((char*)filename.c_str(),(int)(max_X-min_X),(int)(max_Y-min_Y),g2_gd_jpeg); g2_set_coordinate_system(id_PS,-min_X,-min_Y,1,1); } #endif id = g2_open_vd(); g2_attach(id,id_PS); #ifdef HAVE_LIBGD if(options.generatePNG) g2_attach(id,id_PNG); if(options.generateJPG) g2_attach(id,id_JPG); #endif // cout << "min_X: " << min_X <<",max_X: " << max_X << ",min_Y: " << min_Y << "max_Y: " << max_Y << endl; // g2_set_coordinate_system(id_PS,595/2.0,842/2.0,0.5,0.5); g2_set_line_width(id,0.2); // mark 5' end g2_string(id,X[0]-20,Y[0],"5'"); // define colors if(options.greyColors) { ps_color_black=g2_ink(id_PS,0,0,0); ps_color_red=g2_ink(id_PS,0,0,0); ps_color_blue=g2_ink(id_PS,0.7,0.7,0.7); ps_color_green=g2_ink(id_PS,0.4,0.4,0.4); #ifdef HAVE_LIBGD if(options.generatePNG) { png_color_black=g2_ink(id_PNG,0,0,0); png_color_red=g2_ink(id_PNG,0,0,0); png_color_blue=g2_ink(id_PNG,0.7,0.7,0.7); png_color_green=g2_ink(id_PNG,0.4,0.4,0.4); } if(options.generateJPG) { jpg_color_black=g2_ink(id_JPG,0,0,0); jpg_color_red=g2_ink(id_JPG,0,0,0); jpg_color_blue=g2_ink(id_JPG,0.7,0.7,0.7); jpg_color_green=g2_ink(id_JPG,0.4,0.4,0.4); } #endif } else { ps_color_black=g2_ink(id_PS,0,0,0); ps_color_red=g2_ink(id_PS,1,0,0); ps_color_blue=g2_ink(id_PS,0,0,0.5); ps_color_green=g2_ink(id_PS,0,0.5,0); #ifdef HAVE_LIBGD if(options.generatePNG) { png_color_black=g2_ink(id_PNG,0,0,0); png_color_red=g2_ink(id_PNG,1,0,0); png_color_blue=g2_ink(id_PNG,0,0,0.5); png_color_green=g2_ink(id_PNG,0,0.5,0); } if(options.generateJPG) { jpg_color_black=g2_ink(id_JPG,0,0,0); jpg_color_red=g2_ink(id_JPG,1,0,0); jpg_color_blue=g2_ink(id_JPG,0,0,0.5); jpg_color_green=g2_ink(id_JPG,0,0.5,0); } #endif } // draw sequence g2_set_font_size(id,base_fontsize*options.scale); for(i=0;i<structure.size();i++) { isDel = false; isIns = false; //base g2_pen(id,ps_color_black); // match base = ""; if(seq1[i]!='-') { base += seq1[i]; basenr_x++; } else { g2_pen(id,ps_color_green); // insertion isIns=true; } if(seq2[i]!='-') { base += seq2[i]; basenr_y++; } else { g2_pen(id,ps_color_blue); // deletion isDel=true; } if(base.size()==2 && base[0]!=base[1]) g2_pen(id,ps_color_red); // mismatch else base = base[0]; // show duplicate base only once xpos=X[i]-base.length()*(base_fontsize*options.scale)/2; ypos=Y[i]-4; g2_string(id,xpos,ypos,(char*)base.c_str()); if(!options.hideBaseNumbers) { // draw base number if(!isIns && basenr_x % options.baseNumInterval == 0) { g2_pen(id,ps_color_blue); sprintf(buf,"%d",basenr_x); g2_string(id,xpos-20,ypos,buf); } if(!isDel && basenr_y % options.baseNumInterval == 0) { g2_pen(id,ps_color_green); sprintf(buf,"%d",basenr_y); g2_string(id,xpos+20,ypos,buf); } } // connection to next base if(i<structure.size()-1) { // if the connected bases are only in one of the structures // use the appropriate color if(seq1[i]=='-' && seq1[i+1]=='-') g2_pen(id,ps_color_green); else if(seq2[i]=='-' && seq2[i+1]=='-') g2_pen(id,ps_color_blue); else g2_pen(id,ps_color_black); g2_line(id,X[i],Y[i],X[i+1],Y[i+1]); // draw circles at line endpoints if(seq1[i]=='-') g2_pen(id,ps_color_green); else if(seq2[i]=='-') g2_pen(id,ps_color_blue); else g2_pen(id,ps_color_black); g2_filled_circle(id,X[i],Y[i],0.7*options.scale); // circles are drawn twice, but thats ok ... if(seq1[i+1]=='-') g2_pen(id,ps_color_green); else if(seq2[i+1]=='-') g2_pen(id,ps_color_blue); else g2_pen(id,ps_color_black); g2_filled_circle(id,X[i+1],Y[i+1],0.7*options.scale); } } // draw pairings // !!! pair_table indexing begins at 1 !!! for(i=0;i<structure.size();i++) { if((unsigned short)pair_table[i+1]>i+1 && (unsigned short)alt_pair_table[i+1]>i+1) { // pairs in both structures g2_pen(id,ps_color_black); g2_line(id,X[i],Y[i],X[pair_table[i+1]-1],Y[pair_table[i+1]-1]); } else { if((unsigned short)pair_table[i+1]>i+1 && (unsigned short)alt_pair_table[i+1]<=i+1) { // pairs only in first structure if(atX) g2_pen(id,ps_color_blue); else g2_pen(id,ps_color_green); g2_line(id,X[i],Y[i],X[pair_table[i+1]-1],Y[pair_table[i+1]-1]); } else { if((unsigned short)pair_table[i+1]<=i+1 && (unsigned short)alt_pair_table[i+1]>i+1) { // pairs only in second structure if(atX) g2_pen(id,ps_color_green); else g2_pen(id,ps_color_blue); double dashes=2.0; g2_set_dash(id,1,&dashes); g2_line(id,X[i],Y[i],X[alt_pair_table[i+1]-1],Y[alt_pair_table[i+1]-1]); dashes=0; g2_set_dash(id,1,&dashes); } } } } // draw structure names // x-at-y or y-at-x if(atX) { g2_pen(id,ps_color_green); g2_string(id,min_X,max_Y-10,(char*)strname2.c_str()); g2_pen(id,ps_color_black); g2_string(id,min_X,max_Y-20,"at"); g2_pen(id,ps_color_blue); g2_string(id,min_X,max_Y-30,(char*)strname1.c_str()); } else { g2_pen(id,ps_color_blue); g2_string(id,min_X,max_Y-10,(char*)strname1.c_str()); g2_pen(id,ps_color_black); g2_string(id,min_X,max_Y-20,"at"); g2_pen(id,ps_color_green); g2_string(id,min_X,max_Y-30,(char*)strname2.c_str()); } g2_flush(id); g2_close(id); free(pair_table); free(alt_pair_table); DELETE(X); DELETE(Y); }
void RNAFuncs::drawRNAStructure(const string &seq, const string &structure, const string &filename_prefix, const string &structname, const list<pair<Uint,Uint> > ®ions, const SquigglePlotOptions &options) { const double base_fontsize=12; float *X, *Y,min_X=0,max_X=0,min_Y=0,max_Y=0; Uint i; short *pair_table; int id_PS,id_FIG=0,id; int color_black, *colors; double xpos,ypos; char buf[10]; string filename; double *points; int numPoints; #ifdef HAVE_LIBGD int id_PNG=0,id_JPG=0; #endif X = new float[structure.size()]; Y = new float[structure.size()]; points=new double[2*structure.size()]; colors=new int[NUM_COLORS]; assert(seq.size() == structure.size()); pair_table = make_pair_table(structure.c_str()); i = naview_xy_coordinates(pair_table, X, Y); if(i!=structure.size()) cerr << "strange things happening in squigglePlot ..." << endl; // scale image for(i=0;i<structure.size();i++) { X[i]*=static_cast<float>(options.scale); Y[i]*=static_cast<float>(options.scale); } // calculate image dimensions for(i=0;i<structure.size();i++) { min_X=min(min_X,X[i]); max_X=max(max_X,X[i]); min_Y=min(min_Y,Y[i]); max_Y=max(max_Y,Y[i]); } // add a border to image size min_X-=10; max_X+=10; min_Y-=10; max_Y+=10; //id_PS = g2_open_PS("ali.ps", g2_A4, g2_PS_port); filename=filename_prefix + ".ps"; id_PS = g2_open_EPSF((char*)filename.c_str()); g2_set_coordinate_system(id_PS,-min_X,-min_Y,1,1); if(options.generateFIG) { filename=filename_prefix + ".fig"; id_FIG=g2_open_FIG((char*)filename.c_str()); g2_set_coordinate_system(id_FIG,-min_X,-min_Y,1,1); } #ifdef HAVE_LIBGD if(options.generatePNG) { filename=filename_prefix + ".png"; id_PNG=g2_open_gd((char*)filename.c_str(),(int)(max_X-min_X),(int)(max_Y-min_Y),g2_gd_png); g2_set_coordinate_system(id_PNG,-min_X,-min_Y,1,1); } if(options.generateJPG) { filename=filename_prefix + ".jpg"; id_JPG=g2_open_gd((char*)filename.c_str(),(int)(max_X-min_X),(int)(max_Y-min_Y),g2_gd_jpeg); g2_set_coordinate_system(id_PS,-min_X,-min_Y,1,1); } #endif id = g2_open_vd(); g2_attach(id,id_PS); if(options.generateFIG) { g2_attach(id,id_FIG); } #ifdef HAVE_LIBGD if(options.generatePNG) g2_attach(id,id_PNG); if(options.generateJPG) g2_attach(id,id_JPG); #endif // cout << "min_X: " << min_X <<",max_X: " << max_X << ",min_Y: " << min_Y << "max_Y: " << max_Y << endl; // g2_set_coordinate_system(id_PS,595/2.0,842/2.0,0.5,0.5); // define colors if(options.greyColors) { color_black=g2_ink(id_PS,0,0,0); for(i=0;i<NUM_COLORS;i++) colors[i]=g2_ink(id_PS,0,0,0); if(options.generateFIG) { color_black=g2_ink(id_FIG,0,0,0); for(i=0;i<NUM_COLORS;i++) colors[i]=g2_ink(id_FIG,0,0,0); } #ifdef HAVE_LIBGD if(options.generatePNG) { color_black=g2_ink(id_PNG,0,0,0); for(i=0;i<NUM_COLORS;i++) colors[i]=g2_ink(id_PNG,0,0,0); } if(options.generateJPG) { color_black=g2_ink(id_JPG,0,0,0); for(i=0;i<NUM_COLORS;i++) colors[i]=g2_ink(id_JPG,0,0,0); } #endif } else { color_black=g2_ink(id,0,0,0); colors[COLOR_RED]=g2_ink(id_PS,COLOR_DEF_RED); colors[COLOR_GREEN]=g2_ink(id_PS,COLOR_DEF_GREEN); colors[COLOR_BLUE]=g2_ink(id_PS,COLOR_DEF_BLUE); colors[COLOR_YELLOW]=g2_ink(id_PS,COLOR_DEF_YELLOW); colors[COLOR_MAGENTA]=g2_ink(id_PS,COLOR_DEF_MAGENTA); colors[COLOR_TURKIS]=g2_ink(id_PS,COLOR_DEF_TURKIS); if(options.generateFIG) { color_black=g2_ink(id_FIG,0,0,0); colors[COLOR_RED]=g2_ink(id_FIG,COLOR_DEF_RED); colors[COLOR_GREEN]=g2_ink(id_FIG,COLOR_DEF_GREEN); colors[COLOR_BLUE]=g2_ink(id_FIG,COLOR_DEF_BLUE); colors[COLOR_YELLOW]=g2_ink(id_FIG,COLOR_DEF_YELLOW); colors[COLOR_MAGENTA]=g2_ink(id_FIG,COLOR_DEF_MAGENTA); colors[COLOR_TURKIS]=g2_ink(id_FIG,COLOR_DEF_TURKIS); } #ifdef HAVE_LIBGD if(options.generatePNG) { color_black=g2_ink(id_PNG,0,0,0); colors[COLOR_RED]=g2_ink(id_PNG,COLOR_DEF_RED); colors[COLOR_GREEN]=g2_ink(id_PNG,COLOR_DEF_GREEN); colors[COLOR_BLUE]=g2_ink(id_PNG,COLOR_DEF_BLUE); colors[COLOR_YELLOW]=g2_ink(id_PNG,COLOR_DEF_YELLOW); colors[COLOR_MAGENTA]=g2_ink(id_PNG,COLOR_DEF_MAGENTA); colors[COLOR_TURKIS]=g2_ink(id_PNG,COLOR_DEF_TURKIS); } if(options.generateJPG) { color_black=g2_ink(id_JPG,0,0,0); colors[COLOR_RED]=g2_ink(id_JPG,COLOR_DEF_RED); colors[COLOR_GREEN]=g2_ink(id_JPG,COLOR_DEF_GREEN); colors[COLOR_BLUE]=g2_ink(id_JPG,COLOR_DEF_BLUE); colors[COLOR_YELLOW]=g2_ink(id_JPG,COLOR_DEF_YELLOW); colors[COLOR_MAGENTA]=g2_ink(id_JPG,COLOR_DEF_MAGENTA); colors[COLOR_TURKIS]=g2_ink(id_JPG,COLOR_DEF_TURKIS); } #endif } for(i=0;i<structure.size();i++) { // connection to next base if(i<structure.size()-1) { // if the connected bases are only in one of the structures // use the appropriate color g2_line(id,X[i],Y[i],X[i+1],Y[i+1]); // draw circles at line endpoints g2_filled_circle(id,X[i],Y[i],0.7*options.scale); // circles are drawn twice, but thats ok ... } } // draw pairings // !!! pair_table indexing begins at 1 !!! for(i=0;i<structure.size();i++) { if((unsigned short)pair_table[i+1]>i+1) { // pairs in both structures g2_line(id,X[i],Y[i],X[pair_table[i+1]-1],Y[pair_table[i+1]-1]); } } // draw regions g2_set_line_width(id,0.4); list<pair<Uint,Uint> >::const_iterator it; Uint regionNr=0; for(it=regions.begin();it!=regions.end();it++) { double center_x=0,center_y=0; // fill coordinate list for(i=0;i < it->second;i++) { points[2*i]=X[it->first+i]; points[2*i+1]=Y[it->first+i]; center_x+=X[it->first+i]; center_y+=Y[it->first+i]; } numPoints=it->second-1; center_x/=numPoints; // center of gravity center_y/=numPoints; g2_pen(id,colors[regionNr % NUM_COLORS]); g2_poly_line(id,numPoints,points); sprintf(buf,"%d",regionNr+1); g2_string(id,center_x,center_y,buf); // draw region number regionNr++; } // mark 5' end g2_pen(id,color_black); g2_string(id,X[0]-20,Y[0],"5'"); g2_set_font_size(id,base_fontsize*options.scale); g2_set_line_width(id,0.2); // draw sequence for(i=0;i<structure.size();i++) { g2_pen(id,color_black); // match xpos=X[i]-(base_fontsize*options.scale)/2; ypos=Y[i]-4; sprintf(buf,"%c",seq[i]); g2_string(id,xpos,ypos,buf); /* if(!options.hideBaseNumbers) { // draw base number if(basenr % options.baseNumInterval == 0) { sprintf(buf,"%d",basenr); g2_string(id,xpos-20,ypos,buf); } }*/ } // draw structure name g2_string(id,min_X,max_Y-10,(char*)structname.c_str()); g2_flush(id); g2_close(id); free(pair_table); DELETE(X); DELETE(Y); DELETE(points); DELETE(colors); }
void FIF(g2_pen)(F_REAL *dev, F_REAL *color) { g2_pen(dtoi(*dev), dtoi(*color)); }
void RNAProfileAlignment::squigglePlot(const string &filename, SquigglePlotOptions &options) const { const double base_fontsize=8; const Uint num_grey_colors=100; const double min_grey_color=1.0; string seq,structure; string base,structname; float *X,*Y,min_X=0,max_X=0,min_Y=0,max_Y=0; Uint i; short *pair_table; int id_PS,id; int ps_grey_colors[num_grey_colors]; int ps_color_red; int ps_color_black; double xpos,ypos; deque<double> pairprob; deque<BaseProbs> baseprobs; getStructureAlignment(options.minPairProb,structure,pairprob); getSequenceAlignment(baseprobs); // filterConsensus(structure,pairprob,baseprobs,0.5); //assert(baseprobs.size() == structure.size()); if(baseprobs.size() != structure.size()) cerr << "Error in resolving consensus structure!" << endl; X = new float[structure.size()]; Y = new float[structure.size()]; pair_table = make_pair_table(structure.c_str()); i = naview_xy_coordinates(pair_table, X, Y); if(i!=structure.size()) cerr << "strange things happening in squigglePlot ..." << endl; // calculate image dimesions for(i=0;i<structure.size();i++) { min_X=min(min_X,X[i]); max_X=max(max_X,X[i]); min_Y=min(min_Y,Y[i]); max_Y=max(max_Y,Y[i]); } // id_PS = g2_open_PS("ali.ps", g2_A4, g2_PS_port); id_PS = g2_open_EPSF((char*)filename.c_str()); id = g2_open_vd(); g2_attach(id,id_PS); // cout << "min_X: " << min_X <<",max_X: " << max_X << ",min_Y: " << min_Y << "max_Y: " << max_Y << endl; g2_set_coordinate_system(id_PS,595/2.0,842/2.0,0.5,0.5); g2_set_line_width(id,0.2); // set colors double intv=min_grey_color/(double)num_grey_colors; for(i=0;i<num_grey_colors;i++) { double grey_color=min_grey_color-i*intv; ps_grey_colors[i]=g2_ink(id_PS,grey_color,grey_color,grey_color); } ps_color_black=g2_ink(id_PS,0,0,0); if(options.greyColors) ps_color_red=g2_ink(id_PS,0,0,0); else ps_color_red=g2_ink(id_PS,1,0,0); // draw sequence g2_set_font_size(id,base_fontsize); for(i=0;i<structure.size();i++) { if(options.mostLikelySequence) { double p=getMlBaseFreq(baseprobs[i]); //base color if(p==1) g2_pen(id,ps_color_red); else g2_pen(id,ps_grey_colors[(int)floor(p*num_grey_colors-1)]); base=getMlBase(baseprobs[i]); xpos=X[i]-base.length()*base_fontsize/2.0; ypos=Y[i]-4; g2_string(id,xpos,ypos,(char*)base.c_str()); } else { drawBaseCircles(id_PS,baseprobs[i],X[i],Y[i]); } // connection to next base if(i<structure.size()-1) { if((1-baseprobs[i].gap)*(1-baseprobs[i+1].gap)==1) g2_pen(id,ps_color_red); else g2_pen(id,ps_grey_colors[(int)floor((1-baseprobs[i].gap)*(1-baseprobs[i+1].gap)*num_grey_colors-1)]); g2_line(id,X[i],Y[i],X[i+1],Y[i+1]); } } // draw pairings // !!! pair_table indexing begins at 1 !!! for(i=0;i<structure.size();i++) { if((unsigned short)pair_table[i+1]>i+1) { // pairs in both structures if(pairprob[i]==1) g2_pen(id,ps_color_red); else g2_pen(id,ps_grey_colors[(int)floor(pairprob[i]*num_grey_colors-1)]); g2_line(id,X[i],Y[i],X[pair_table[i+1]-1],Y[pair_table[i+1]-1]); } } g2_flush(id); g2_close(id); free(pair_table); DELETE(X); DELETE(Y); }