changed reading hint
[gromacs/adressmacs.git] / src / gmxlib / rdgroup.c
blob8984b47720f6bbd338bce35ab3bb24cccbbb8977
1 /*
2 * $Id$
3 *
4 * This source code is part of
5 *
6 * G R O M A C S
7 *
8 * GROningen MAchine for Chemical Simulations
9 *
10 * VERSION 2.0
12 * Copyright (c) 1991-1999
13 * BIOSON Research Institute, Dept. of Biophysical Chemistry
14 * University of Groningen, The Netherlands
16 * Please refer to:
17 * GROMACS: A message-passing parallel molecular dynamics implementation
18 * H.J.C. Berendsen, D. van der Spoel and R. van Drunen
19 * Comp. Phys. Comm. 91, 43-56 (1995)
21 * Also check out our WWW page:
22 * http://md.chem.rug.nl/~gmx
23 * or e-mail to:
24 * gromacs@chem.rug.nl
26 * And Hey:
27 * Green Red Orange Magenta Azure Cyan Skyblue
29 static char *SRCID_rdgroup_c = "$Id$";
31 #include "sysstuff.h"
32 #include "smalloc.h"
33 #include "typedefs.h"
34 #include "string2.h"
35 #include "strdb.h"
36 #include "rdgroup.h"
37 #include "futil.h"
38 #include "fatal.h"
39 #include "index.h"
41 t_block *init_index(char *gfile, char ***grpname)
43 FILE *in;
44 t_block *b;
45 int a,maxentries;
46 int i,j,ng;
47 char line[STRLEN],*pt,str[STRLEN];
49 in=ffopen(gfile,"r");
50 snew(b,1);
51 get_a_line(in,line,STRLEN);
52 if ( line[0]=='[' ) {
53 /* new format */
54 b->nr=0;
55 b->index=NULL;
56 b->nra=0;
57 b->a=NULL;
58 *grpname=NULL;
59 maxentries=0;
60 do {
61 if (get_header(line,str)) {
62 b->nr++;
63 srenew(b->index,b->nr+1);
64 srenew(*grpname,b->nr);
65 if (b->nr==1)
66 b->index[0]=0;
67 b->index[b->nr]=b->index[b->nr-1];
68 (*grpname)[b->nr-1]=strdup(str);
69 } else {
70 pt=line;
71 while ((i=sscanf(pt,"%s",str)) == 1) {
72 i=b->index[b->nr];
73 if (i>=maxentries) {
74 maxentries+=100;
75 srenew(b->a,maxentries);
77 b->a[i]=atoi(str)-1;
78 b->index[b->nr]++;
79 (b->nra)++;
80 pt=strstr(pt,str)+strlen(str);
83 } while (get_a_line(in,line,STRLEN));
85 else {
86 /* old format */
87 sscanf(line,"%d%d",&b->nr,&b->nra);
88 snew(b->index,b->nr+1);
89 snew(*grpname,b->nr);
90 b->index[0]=0;
91 snew(b->a,b->nra);
92 for (i=0; (i<b->nr); i++) {
93 fscanf(in,"%s%d",str,&ng);
94 (*grpname)[i]=strdup(str);
95 b->index[i+1]=b->index[i]+ng;
96 if (b->index[i+1] > b->nra)
97 fatal_error(0,"Something wrong in your indexfile at group %s",str);
98 for(j=0; (j<ng); j++) {
99 fscanf(in,"%d",&a);
100 b->a[b->index[i]+j]=a;
102 /* while (fgetc(in)!='\n'); */
105 ffclose(in);
107 return b;
110 static int qgroup(int *a)
112 printf("Select a group: ");
113 scanf("%d",a);
114 return *a;
117 static int rd_pascal_set(int **set)
119 char buf[STRLEN+1];
120 char *bb[STRLEN],*ptr;
121 int i,j,nb,ns,ne;
123 printf("Give a set of numbers (eg.: 1..8,13,17..21)\n");
124 fgets(buf,STRLEN,stdin);
126 nb=0;
127 bb[nb++]=buf;
128 for(i=0; (i<(int)strlen(buf)); i++)
129 if (buf[i] == ',') {
130 buf[i] = '\0';
131 if (buf[i+1] != '\0')
132 bb[nb++] = &(buf[i+1]);
134 ns=0;
135 for(i=0; (i<nb); i++) {
136 if ((ptr=strstr(bb[i],"..")) != NULL) {
137 ptr[0]=' ', ptr[1]=' ';
138 sscanf(bb[i],"%d %d",&nb,&ne);
139 for(j=nb; (j<=ne); j++)
140 (*set)[ns++]=j;
142 else {
143 sscanf(bb[i],"%d",&nb);
144 (*set)[ns++]=nb;
147 printf("\nI found the following set:\n");
148 for(i=0; (i<ns); i++)
149 printf("%4d ",(*set)[i]);
150 printf("\n\n");
152 return ns;
155 static void rd_groups(t_block *grps,char **grpname,char *gnames[],
156 int ngrps,int isize[],atom_id *index[],int grpnr[])
158 int i,j,gnr1;
160 if (grps->nr==0)
161 fatal_error(0,"Error: no groups in indexfile");
162 for(i=0; (i<grps->nr); i++)
163 printf("Group %5d (%12s) has %5u elements\n",i,grpname[i],
164 grps->index[i+1]-grps->index[i]);
165 for(i=0; (i<ngrps); i++) {
166 if (grps->nr > 1)
167 do {
168 gnr1=qgroup(&grpnr[i]);
169 if ((gnr1<0) || (gnr1>=grps->nr))
170 printf("Select between %d and %d.\n",0,grps->nr-1);
171 } while ((gnr1<0) || (gnr1>=grps->nr));
172 else {
173 printf("There is one group in the index\n");
174 gnr1=0;
176 gnames[i]=strdup(grpname[gnr1]);
177 isize[i]=grps->index[gnr1+1]-grps->index[gnr1];
178 snew(index[i],isize[i]);
179 for(j=0; (j<isize[i]); j++)
180 index[i][j]=grps->a[grps->index[gnr1]+j];
184 void rd_index(char *statfile,int ngrps,int isize[],
185 atom_id *index[],char *grpnames[])
187 char **gnames;
188 t_block *grps;
189 int *grpnr;
191 snew(grpnr,ngrps);
192 if (!statfile)
193 fatal_error(0,"No index file specified");
194 grps=init_index(statfile,&gnames);
195 rd_groups(grps,gnames,grpnames,ngrps,isize,index,grpnr);
198 void rd_index_nrs(char *statfile,int ngrps,int isize[],
199 atom_id *index[],char *grpnames[],int grpnr[])
201 char **gnames;
202 t_block *grps;
204 if (!statfile)
205 fatal_error(0,"No index file specified");
206 grps=init_index(statfile,&gnames);
208 rd_groups(grps,gnames,grpnames,ngrps,isize,index,grpnr);
211 void get_index(t_atoms *atoms, char *fnm, int ngrps,
212 int isize[], atom_id *index[],char *grpnames[])
214 char ***gnames;
215 t_block *grps;
216 int *grpnr;
218 snew(grpnr,ngrps);
219 snew(gnames,1);
220 if (fnm != NULL) {
221 grps=init_index(fnm,gnames);
223 else {
224 snew(grps,1);
225 snew(grps->index,1);
226 analyse(atoms,grps,gnames,FALSE,FALSE);
228 rd_groups(grps,*gnames,grpnames,ngrps,isize,index,grpnr);