ea59d6b669ec59d97e6d2260e25232a7109759f0
[physik/nlsop.git] / parse_trim_collision.c
1 /*
2  * parse srim 2003.26 collision data 
3  *
4  * author: hackbard@hackdaworld.dyndns.org
5  *
6  * this may just work with srim 2003.26 and 180keV c+ -> si,
7  * not quite sure though! :)
8  *
9  */
10
11 #define _GNU_SOURCE
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <unistd.h>
16 #include <sys/types.h>
17 #include <sys/stat.h>
18 #include <fcntl.h>
19
20 #define MAXION 5000
21 #define MAXZ 233
22
23 typedef struct s_z {
24         int cell_hits_from_ions;
25         int total_hits;
26         double energy;
27 } t_z;
28
29 int main(int argc,char **argv) {
30
31         int fd,ion,i,j;
32         int z,skipped;
33         float en;
34         t_z Z[MAXZ];
35         unsigned char hit[MAXZ];
36         char buf[256],*p,value[6],value2[10];
37
38         i=0;
39
40         if(argc!=2) return 0;
41         
42         printf("opening file %s ...\n",argv[1]);
43         if((fd=open(argv[1],O_RDONLY))<0) {
44                 printf("unable to open file %s\n",argv[1]);
45                 return 0;
46         }
47
48         ion=1;
49         skipped=0;
50         for(i=0;i<MAXZ;i++) {
51                 Z[i].cell_hits_from_ions=0;
52                 Z[i].total_hits=0;
53                 Z[i].energy=0;
54         }
55         memset(hit,0,MAXZ);
56
57         while(1) {
58
59                 /* read line */
60                 i=0;
61                 memset(buf,0,256);
62                 while(1) {
63                         j=read(fd,&buf[i],1);
64                         if(j<=0) {
65                                 close(fd);
66                                 for(i=0;i<MAXZ;i++) 
67                                         printf("%d %d %f %d\n",i*3,Z[i].total_hits,
68                                                                 Z[i].energy,
69                                                                 Z[i].cell_hits_from_ions);
70                                 printf("skipped = %d\n",skipped);
71                                 return 1;
72                         }
73                         if(buf[i]=='\n') break;
74                         i++;
75                 }
76
77                 /* parse line */
78                 if((buf[0]=='³')&&(buf[1]!='=')) {
79                         p=strtok(buf,"³");
80                         value[0]=p[0];
81                         value[1]=p[1];
82                         value[2]=p[2];
83                         value[3]=p[3];
84                         value[4]=p[4];
85                         value[5]='\0';
86                         p=strtok(NULL,"³");
87                         value2[0]=p[0];
88                         value2[1]=p[1];
89                         value2[2]='.';
90                         value2[3]=p[3];
91                         value2[4]=p[4];
92                         value2[5]=p[5];
93                         value2[6]=p[6];
94                         value2[7]=p[7];
95                         value2[8]=p[8];
96                         value2[9]='\0';
97                         en=atof(value2);
98                         p=strtok(NULL,"³");
99                         value2[0]=p[0];
100                         value2[1]=p[1];
101                         value2[2]=p[2];
102                         value2[3]=p[3];
103                         value2[4]=p[4];
104                         value2[5]='.';
105                         value2[6]=p[6];
106                         value2[7]=p[7];
107                         value2[8]=p[8];
108                         value2[9]=p[9];
109                         value2[10]='\0';
110                         z=(int)(atof(value2)/30.);
111                         if(z>232) skipped+=1;
112                         else {
113                                 Z[z].energy+=en;
114                                 Z[z].total_hits+=1;
115                                 hit[z]=1;
116                         }
117                         if(ion!=atoi(value)) {
118                                 /* new ion */
119                                 for(i=0;i<MAXZ;i++) Z[i].cell_hits_from_ions+=hit[i];
120                                 memset(hit,0,MAXZ);
121                                 ion=atoi(value);
122                         }
123                         // printf("%d %d %f %d\n",z*3,Z[z].total_hits,
124                         //      Z[z].energy,Z[z].cell_hits_from_ions);
125                         // return 0;
126                 }
127
128
129         }
130         return 0;
131 }