2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team,
6 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
61 #include "gmx_fatal.h"
66 static gmx_bool *bPhobics(int nres,char *resnm[])
72 nb=get_strings("phbres.dat",&cb);
75 for(i=0; (i<nres); i++) {
76 if (search_str(nb,cb,resnm[i]) != -1)
82 void wheel(const char *fn,int nres,char *resnm[],int r0,real rot0,char *title)
84 const real fontsize = 16;
85 const real gray = 0.9;
86 const real fontasp = 0.6;
87 const real fontwidth = fontsize*fontasp;
91 real ring,inner,outer;
100 for(i=0; (i<nres); i++) {
104 if ((sign == '+') || (sign == '-'))
105 resnm[i][sl-1] = '\0';
106 sprintf(rnms[i],"%s-%d",resnm[i],i+r0);
107 if ((sign == '+') || (sign == '-')) {
113 slen=max(slen,(int)strlen(rnms[i]));
115 ring=(2+slen)*fontwidth;
117 box=inner*1.5+(1+(nres / 18))*ring;
119 bPh=bPhobics(nres,resnm);
121 out=ps_open(fn,0,0,2.0*box,2.0*box);
125 ps_font(out,efontHELV,1.5*fontsize);
126 ps_translate(out,xc,yc);
128 ps_ctext(out,0,-fontsize*1.5/2.0,title,eXCenter);
129 ps_font(out,efontHELV,fontsize);
131 for(i=0; (i<nres); ) {
133 ps_color(out,gray,gray,gray);
134 ps_fillarcslice(out,0,0,inner,outer,-10,10);
137 ps_arcslice(out,0,0,inner,outer,-10,10);
139 ps_ctext(out,inner+fontwidth,-fontsize/2.0,rnms[i],eXLeft);
151 void wheel2(const char *fn,int nres,char *resnm[],int r0,real rot0,char *title)
153 const real fontsize = 14;
154 const real gray = 0.9;
155 const real fontasp = 0.45;
157 const real fontwidth = fontsize*fontasp;
161 real ring,inner,outer;
166 for(i=0; (i<nres); i++) {
167 slen=max(slen,(int)strlen(resnm[i]));
169 fprintf(stderr,"slen = %d\n",slen);
170 ring=(slen)*fontwidth;
172 box=(1+(nres / (2*angle)))*outer;
174 out=ps_open(fn,0,0,2.0*box,2.0*box);
178 ps_font(out,efontHELV,1.5*fontsize);
179 ps_translate(out,xc,yc);
182 ps_ctext(out,0,-fontsize*1.5/2.0,title,eXCenter);
183 ps_font(out,efontHELV,fontsize);
186 for(i=0; (i<nres); ) {
188 ps_color(out,gray,gray,1.0);
189 ps_fillarcslice(out,0,0,inner,outer,-angle,angle);
192 ps_arcslice(out,0,0,inner,outer,-angle,angle);
194 ps_ctext(out,inner+fontwidth,-fontsize/2.0,resnm[i],eXLeft);
195 ps_rotate(out,-2*angle);
198 if ((i % (2*angle)) == 0) {
206 int gmx_wheel(int argc,char *argv[])
208 const char *desc[] = {
209 "[TT]g_wheel[tt] plots a helical wheel representation of your sequence.",
210 "The input sequence is in the [TT].dat[tt] file where the first line contains",
211 "the number of residues and each consecutive line contains a residue "
216 static gmx_bool bNum=TRUE;
217 static char *title=NULL;
220 { "-r0", FALSE, etINT, {&r0},
221 "The first residue number in the sequence" },
222 { "-rot0",FALSE, etREAL,{&rot0},
223 "Rotate around an angle initially (90 degrees makes sense)" },
224 { "-T", FALSE, etSTR, {&title},
225 "Plot a title in the center of the wheel (must be shorter than 10 characters, or it will overwrite the wheel)" },
226 { "-nn", FALSE, etBOOL,{&bNum},
230 { efDAT, "-f", NULL, ffREAD },
231 { efEPS, "-o", NULL, ffWRITE }
233 #define NFILE asize(fnm)
238 CopyRight(stderr,argv[0]);
239 parse_common_args(&argc,argv,PCA_BE_NICE,NFILE,fnm,asize(pa),pa,
240 asize(desc),desc,0,NULL,&oenv);
242 for(i=1; (i<argc); i++) {
243 if (strcmp(argv[i],"-r0") == 0) {
244 r0=strtol(argv[++i],NULL,10);
245 fprintf(stderr,"First residue is %d\n",r0);
247 else if (strcmp(argv[i],"-rot0") == 0) {
248 rot0=strtod(argv[++i],NULL);
249 fprintf(stderr,"Initial rotation is %g\n",rot0);
251 else if (strcmp(argv[i],"-T") == 0) {
252 title=strdup(argv[++i]);
253 fprintf(stderr,"Title will be '%s'\n",title);
255 else if (strcmp(argv[i],"-nn") == 0) {
257 fprintf(stderr,"No residue numbers\n");
260 gmx_fatal(FARGS,"Incorrect usage of option %s",argv[i]);
263 nres=get_lines(ftp2fn(efDAT,NFILE,fnm),&resnm);
265 wheel(ftp2fn(efEPS,NFILE,fnm),nres,resnm,r0,rot0,title);
267 wheel2(ftp2fn(efEPS,NFILE,fnm),nres,resnm,r0,rot0,title);