From 3cf265bb194147846ad6be9f7b870802185e5bbc Mon Sep 17 00:00:00 2001 From: hackbard <hackbard> Date: Tue, 14 Sep 2004 14:06:01 +0000 Subject: [PATCH] added trim collision file parser --- .cvsignore | 2 + parse_trim_collision.c | 131 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 parse_trim_collision.c diff --git a/.cvsignore b/.cvsignore index 0d8585c..209faf8 100644 --- a/.cvsignore +++ b/.cvsignore @@ -5,3 +5,5 @@ nlsop.* conv_fg_tif Makefile nlsop-* +parse_trim_collision +ft diff --git a/parse_trim_collision.c b/parse_trim_collision.c new file mode 100644 index 0000000..ea59d6b --- /dev/null +++ b/parse_trim_collision.c @@ -0,0 +1,131 @@ +/* + * parse srim 2003.26 collision data + * + * author: hackbard@hackdaworld.dyndns.org + * + * this may just work with srim 2003.26 and 180keV c+ -> si, + * not quite sure though! :) + * + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#define MAXION 5000 +#define MAXZ 233 + +typedef struct s_z { + int cell_hits_from_ions; + int total_hits; + double energy; +} t_z; + +int main(int argc,char **argv) { + + int fd,ion,i,j; + int z,skipped; + float en; + t_z Z[MAXZ]; + unsigned char hit[MAXZ]; + char buf[256],*p,value[6],value2[10]; + + i=0; + + if(argc!=2) return 0; + + printf("opening file %s ...\n",argv[1]); + if((fd=open(argv[1],O_RDONLY))<0) { + printf("unable to open file %s\n",argv[1]); + return 0; + } + + ion=1; + skipped=0; + for(i=0;i<MAXZ;i++) { + Z[i].cell_hits_from_ions=0; + Z[i].total_hits=0; + Z[i].energy=0; + } + memset(hit,0,MAXZ); + + while(1) { + + /* read line */ + i=0; + memset(buf,0,256); + while(1) { + j=read(fd,&buf[i],1); + if(j<=0) { + close(fd); + for(i=0;i<MAXZ;i++) + printf("%d %d %f %d\n",i*3,Z[i].total_hits, + Z[i].energy, + Z[i].cell_hits_from_ions); + printf("skipped = %d\n",skipped); + return 1; + } + if(buf[i]=='\n') break; + i++; + } + + /* parse line */ + if((buf[0]=='³')&&(buf[1]!='=')) { + p=strtok(buf,"³"); + value[0]=p[0]; + value[1]=p[1]; + value[2]=p[2]; + value[3]=p[3]; + value[4]=p[4]; + value[5]='\0'; + p=strtok(NULL,"³"); + value2[0]=p[0]; + value2[1]=p[1]; + value2[2]='.'; + value2[3]=p[3]; + value2[4]=p[4]; + value2[5]=p[5]; + value2[6]=p[6]; + value2[7]=p[7]; + value2[8]=p[8]; + value2[9]='\0'; + en=atof(value2); + p=strtok(NULL,"³"); + value2[0]=p[0]; + value2[1]=p[1]; + value2[2]=p[2]; + value2[3]=p[3]; + value2[4]=p[4]; + value2[5]='.'; + value2[6]=p[6]; + value2[7]=p[7]; + value2[8]=p[8]; + value2[9]=p[9]; + value2[10]='\0'; + z=(int)(atof(value2)/30.); + if(z>232) skipped+=1; + else { + Z[z].energy+=en; + Z[z].total_hits+=1; + hit[z]=1; + } + if(ion!=atoi(value)) { + /* new ion */ + for(i=0;i<MAXZ;i++) Z[i].cell_hits_from_ions+=hit[i]; + memset(hit,0,MAXZ); + ion=atoi(value); + } + // printf("%d %d %f %d\n",z*3,Z[z].total_hits, + // Z[z].energy,Z[z].cell_hits_from_ions); + // return 0; + } + + + } + return 0; +} -- 2.39.5