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
);