3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * Green Red Orange Magenta Azure Cyan Skyblue
58 #include "gmx_fatal.h"
63 gmx_bool *bPhobics(int nres,char *resnm[])
69 nb=get_strings("phbres.dat",&cb);
72 for(i=0; (i<nres); i++) {
73 if (search_str(nb,cb,resnm[i]) != -1)
79 void wheel(const char *fn,int nres,char *resnm[],int r0,real rot0,char *title)
81 const real fontsize = 16;
82 const real gray = 0.9;
83 const real fontasp = 0.6;
84 const real fontwidth = fontsize*fontasp;
88 real ring,inner,outer;
97 for(i=0; (i<nres); i++) {
101 if ((sign == '+') || (sign == '-'))
102 resnm[i][sl-1] = '\0';
103 sprintf(rnms[i],"%s-%d",resnm[i],i+r0);
104 if ((sign == '+') || (sign == '-')) {
110 slen=max(slen,(int)strlen(rnms[i]));
112 ring=(2+slen)*fontwidth;
114 box=inner*1.5+(1+(nres / 18))*ring;
116 bPh=bPhobics(nres,resnm);
118 out=ps_open(fn,0,0,2.0*box,2.0*box);
122 ps_font(out,efontHELV,1.5*fontsize);
123 ps_translate(out,xc,yc);
125 ps_ctext(out,0,-fontsize*1.5/2.0,title,eXCenter);
126 ps_font(out,efontHELV,fontsize);
128 for(i=0; (i<nres); ) {
130 ps_color(out,gray,gray,gray);
131 ps_fillarcslice(out,0,0,inner,outer,-10,10);
134 ps_arcslice(out,0,0,inner,outer,-10,10);
136 ps_ctext(out,inner+fontwidth,-fontsize/2.0,rnms[i],eXLeft);
148 void wheel2(const char *fn,int nres,char *resnm[],int r0,real rot0,char *title)
150 const real fontsize = 14;
151 const real gray = 0.9;
152 const real fontasp = 0.45;
154 const real fontwidth = fontsize*fontasp;
158 real ring,inner,outer;
163 for(i=0; (i<nres); i++) {
164 slen=max(slen,(int)strlen(resnm[i]));
166 fprintf(stderr,"slen = %d\n",slen);
167 ring=(slen)*fontwidth;
169 box=(1+(nres / (2*angle)))*outer;
171 out=ps_open(fn,0,0,2.0*box,2.0*box);
175 ps_font(out,efontHELV,1.5*fontsize);
176 ps_translate(out,xc,yc);
179 ps_ctext(out,0,-fontsize*1.5/2.0,title,eXCenter);
180 ps_font(out,efontHELV,fontsize);
183 for(i=0; (i<nres); ) {
185 ps_color(out,gray,gray,1.0);
186 ps_fillarcslice(out,0,0,inner,outer,-angle,angle);
189 ps_arcslice(out,0,0,inner,outer,-angle,angle);
191 ps_ctext(out,inner+fontwidth,-fontsize/2.0,resnm[i],eXLeft);
192 ps_rotate(out,-2*angle);
195 if ((i % (2*angle)) == 0) {
203 int gmx_wheel(int argc,char *argv[])
205 const char *desc[] = {
206 "[TT]g_wheel[tt] plots a helical wheel representation of your sequence.",
207 "The input sequence is in the [TT].dat[tt] file where the first line contains",
208 "the number of residues and each consecutive line contains a residue "
213 static gmx_bool bNum=TRUE;
214 static char *title=NULL;
217 { "-r0", FALSE, etINT, {&r0},
218 "The first residue number in the sequence" },
219 { "-rot0",FALSE, etREAL,{&rot0},
220 "Rotate around an angle initially (90 degrees makes sense)" },
221 { "-T", FALSE, etSTR, {&title},
222 "Plot a title in the center of the wheel (must be shorter than 10 characters, or it will overwrite the wheel)" },
223 { "-nn", FALSE, etBOOL,{&bNum},
227 { efDAT, "-f", NULL, ffREAD },
228 { efEPS, "-o", NULL, ffWRITE }
230 #define NFILE asize(fnm)
235 CopyRight(stderr,argv[0]);
236 parse_common_args(&argc,argv,PCA_BE_NICE,NFILE,fnm,asize(pa),pa,
237 asize(desc),desc,0,NULL,&oenv);
239 for(i=1; (i<argc); i++) {
240 if (strcmp(argv[i],"-r0") == 0) {
241 r0=strtol(argv[++i],NULL,10);
242 fprintf(stderr,"First residue is %d\n",r0);
244 else if (strcmp(argv[i],"-rot0") == 0) {
245 rot0=strtod(argv[++i],NULL);
246 fprintf(stderr,"Initial rotation is %g\n",rot0);
248 else if (strcmp(argv[i],"-T") == 0) {
249 title=strdup(argv[++i]);
250 fprintf(stderr,"Title will be '%s'\n",title);
252 else if (strcmp(argv[i],"-nn") == 0) {
254 fprintf(stderr,"No residue numbers\n");
257 gmx_fatal(FARGS,"Incorrect usage of option %s",argv[i]);
260 nres=get_lines(ftp2fn(efDAT,NFILE,fnm),&resnm);
262 wheel(ftp2fn(efEPS,NFILE,fnm),nres,resnm,r0,rot0,title);
264 wheel2(ftp2fn(efEPS,NFILE,fnm),nres,resnm,r0,rot0,title);