list-particles-2.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
3 
4 #include <math.h>
5 
6 #include "corsika-tape.h"
7 #include "corsika-particle.h"
8 
9 #ifdef QUIET
10 # define Q 0
11 #else
12 # define Q 1
13 #endif
14 
15 typedef struct {
16  RWORD r, m, e;
18 
19 int main(int argc, char **argv) {
20  corsika_file *tape;
21  sub_block *sb;
22  particle_data *pd;
23  particle_extra pe;
24  int i, j;
25  RWORD desc, A, Z;
26  double w = 0;
27  int p = 0;
28 
29  struct {
30  long n;
31  double w, rmax;
32  } rb[] = {
33  {0, 0, 10.e2},
34  {0, 0, 31.6e2},
35  {0, 0, 100.e2},
36  {0, 0, 316.e2},
37  {0, 0, 1000.e2},
38  {0, 0, 3160.e2},
39  {0, 0, 10000.e2},
40  {0, 0, 31600.e2},
41  {0, 0, 0.e0}
42  };
43  RWORD rmin, rmax;
44 
45  if ((tape = corsika_fopen(argv[1], "r")) == NULL) {
46  fprintf(stderr, "Cannot open file %s. Aborting...\n", argv[1]);
47  exit(1);
48  }
49 
50  while ((sb = corsika_get(tape)) != NULL) {
51  if (is_control(sb->rh.id)) {
52  Q && printf("%4.4s\n", sb->rh.id);
53  } else {
54  for(i=0; i<PARTICLES_IN_SUB_BLOCK; i++) {
55  pd = sb->pb.particle + i;
56  desc = pd->description;
57  Q && printf("%8g: ",desc);
58  if (is_particle_r(desc)) {
59  Q && printf("%-10s",
60  particle[(int)desc/1000].name);
61  } else if(is_nucleus_r(desc)) {
62  A = (int)desc / 100000;
63  Z = (int)desc / 1000 - 100*A;
64  Q && printf("N, Z=%g, A=%g", Z, A);
65  } else {
66  Q && printf("OTHER: %g\n", desc);
67  }
68 
69  if (desc != 0) {
70  pe.r = sqrt(pd->x * pd->x + pd->y* pd->y);
71  for (j=0; ; j++) {
72  if (pe.r < rb[j].rmax || rb[j].rmax == 0.) {
73  rb[j].n++;
74 #ifdef THINNING
75  rb[j].w += pd->weight;
76 #else
77  rb[j].w += 1;
78 #endif
79  break;
80  }
81  }
82  Q && printf(", Distance %7.2f (m)", pe.r / 100.);
83 #ifdef THINNING
84  Q && printf(", Weight: %g", pd->weight);
85 #endif
86  Q && printf("\n");
87 
88  p++;
89 #ifdef THINNING
90  w += pd->weight;
91 #endif
92  }
93  }
94  }
95  }
96  printf("Total particles: %i", p);
97 #ifdef THINNING
98  printf(", weighted: %g, average weight %g", w, w/p);
99 #endif
100  printf(".\n\n");
101 
102  w = 0;
103  rmin = 0;
104  for (j=0; ; j++) {
105  rmax = rb[j].rmax;
106 
107  printf("Bin %2i (r < ", j);
108  if (rmax != 0) printf("%8.0f", rmax / 100.);
109  else printf("infinity");
110  printf(" m): %8e particles, %i hits,\n", rb[j].w, rb[j].n);
111  printf(" avg. weight %g",
112  rb[j].n ? rb[j].w / rb[j].n : 0.0) ;
113 
114  if (rmax != 0)
115  printf(", density %8.3e m^(-2)",
116  rb[j].w / (rmax*rmax - rmin*rmin) / 3.14159e-4);
117 
118  printf(".\n");
119 
120  w += rb[j].w;
121 
122  if (rmax == 0) break;
123  rmin = rmax;
124 
125  }
126  printf("\nSum of all bins: %g\n", w);
127 }
#define is_nucleus_r(p)
Definition: corsika-tape.h:239
run_header rh
Definition: corsika-tape.h:276
int exit
Definition: dump1090.h:237
#define is_particle_r(p)
Definition: corsika-tape.h:238
int main(int argc, char *argv[])
Definition: DBSync.cc:58
char id[4]
Definition: corsika-tape.h:31
particle_sub_block pb
Definition: corsika-tape.h:280
#define RWORD
Definition: corsika-tape.h:15
particle_data particle[39]
Definition: corsika-tape.h:255
#define Q
#define is_control(r)
Definition: corsika-tape.h:233
corsika_file * corsika_fopen(char *name, char *mode)
Definition: corsika-tape.c:7
#define PARTICLES_IN_SUB_BLOCK
Definition: corsika-tape.h:26
struct particle_info particle[80]
constexpr double m
Definition: AugerUnits.h:121
sub_block * corsika_get(corsika_file *file)
Definition: corsika-tape.c:29

, generated on Tue Sep 26 2023.