74
74
DEFINE COMPONENT Union_abs_logger_event
75
75
76
76
SETTING PARAMETERS(string target_geometry="NULL", string filename="NULL",
77
+ xwidth=0, xbins=0, yheight=0, ybins=0, zdepth=0, zbins=0,
77
78
order_total=-1, order_volume=-1, logger_conditional_extend_index=-1, string init="init")
78
79
79
80
@@ -120,19 +121,40 @@ struct a_event_abs_storage_struct {
120
121
int order;
121
122
int order_in_this_volume;
122
123
int order_process_in_this_volume;
124
+
125
+ double stored_xwidth;
126
+ double stored_yheight;
127
+ double stored_zdepth;
128
+
129
+ int stored_xbins;
130
+ int stored_ybins;
131
+ int stored_zbins;
123
132
124
133
Coords position;
125
134
Rotation rotation;
126
135
Rotation t_rotation;
127
136
};
128
137
138
+ double round_to_nearest_bin(double value, double w, int N) {
139
+ // Calculate the width of each bin
140
+ double bin_width = w / N;
141
+
142
+ // Calculate the index of the nearest bin
143
+ int bin_index = round((value + w / 2) / bin_width);
144
+
145
+ // Calculate the center of the nearest bin
146
+ double bin_center = (bin_index * bin_width) - (w / 2) + (bin_width / 2);
147
+
148
+ return bin_center;
149
+ }
150
+
129
151
// record_to_temp
130
152
// Would be nice if x y z, k_new and k_old were all coords
131
153
void record_to_temp_abs_event(Coords *position, double *k, double p, double time, int scattered_in_this_volume, int total_number_of_scattering_events, struct abs_logger_struct *abs_logger, struct abs_logger_with_data_struct *abs_logger_with_data_array) {
132
154
133
155
struct a_event_abs_storage_struct *storage;
134
156
storage = abs_logger->data_union.p_event_abs_storage;
135
-
157
+
136
158
int add_point = 1;
137
159
138
160
if (storage->order != -1) {
@@ -141,19 +163,59 @@ void record_to_temp_abs_event(Coords *position, double *k, double p, double time
141
163
else
142
164
add_point = 0;
143
165
}
144
-
166
+
145
167
if (storage->order_in_this_volume != -1) {
146
168
if (storage->order_in_this_volume == scattered_in_this_volume)
147
169
add_point = 1;
148
170
else
149
171
add_point = 0;
150
172
}
151
173
174
+ if (storage->stored_xwidth != 0) {
175
+ if (position->x < 0.5*storage->stored_xwidth && position->x > -0.5*storage->stored_xwidth)
176
+ add_point = 1;
177
+ else
178
+ add_point = 0;
179
+ }
180
+
181
+ if (storage->stored_yheight != 0) {
182
+ if (position->y < 0.5*storage->stored_yheight && position->y > -0.5*storage->stored_yheight)
183
+ add_point = 1;
184
+ else
185
+ add_point = 0;
186
+ }
187
+
188
+ if (storage->stored_zdepth != 0) {
189
+ if (position->z < 0.5*storage->stored_zdepth && position->z > -0.5*storage->stored_xwidth)
190
+ add_point = 1;
191
+ else
192
+ add_point = 0;
193
+ }
194
+
152
195
if (add_point == 1) {
153
196
154
197
int i;
155
198
double given_x_pos, given_y_pos, given_z_pos;
199
+ double used_x_pos, used_y_pos, used_z_pos;
156
200
coords_get(*position, &given_x_pos, &given_y_pos, &given_z_pos);
201
+
202
+ if (storage->stored_xbins != 0) {
203
+ used_x_pos = round_to_nearest_bin(given_x_pos, storage->stored_xwidth, storage->stored_xbins);
204
+ } else {
205
+ used_x_pos = given_x_pos;
206
+ }
207
+
208
+ if (storage->stored_ybins != 0) {
209
+ used_y_pos = round_to_nearest_bin(given_y_pos, storage->stored_yheight, storage->stored_ybins);
210
+ } else {
211
+ used_y_pos = given_y_pos;
212
+ }
213
+
214
+ if (storage->stored_zbins != 0) {
215
+ used_z_pos = round_to_nearest_bin(given_z_pos, storage->stored_zdepth, storage->stored_zbins);
216
+ } else {
217
+ used_z_pos = given_z_pos;
218
+ }
157
219
158
220
double given_x_vel, given_y_vel, given_z_vel;
159
221
given_x_vel = k[0]*K2V;
@@ -162,9 +224,9 @@ void record_to_temp_abs_event(Coords *position, double *k, double p, double time
162
224
163
225
if (storage->temp_abs_event_data.num_elements < storage->temp_abs_event_data.allocated_elements) {
164
226
165
- storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].x_pos = given_x_pos ;
166
- storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].y_pos = given_y_pos ;
167
- storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].z_pos = given_z_pos ;
227
+ storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].x_pos = used_x_pos ;
228
+ storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].y_pos = used_y_pos ;
229
+ storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].z_pos = used_z_pos ;
168
230
storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].x_vel = given_x_vel;
169
231
storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].y_vel = given_y_vel;
170
232
storage->temp_abs_event_data.elements[storage->temp_abs_event_data.num_elements].z_vel = given_z_vel;
@@ -270,22 +332,62 @@ void record_to_perm_abs_event(Coords *position, double *k, double p, double time
270
332
add_point = 0;
271
333
}
272
334
335
+ if (storage->stored_xwidth != 0) {
336
+ if (position->x < 0.5*storage->stored_xwidth && position->x > -0.5*storage->stored_xwidth)
337
+ add_point = 1;
338
+ else
339
+ add_point = 0;
340
+ }
341
+
342
+ if (storage->stored_yheight != 0) {
343
+ if (position->y < 0.5*storage->stored_yheight && position->y > -0.5*storage->stored_yheight)
344
+ add_point = 1;
345
+ else
346
+ add_point = 0;
347
+ }
348
+
349
+ if (storage->stored_zdepth != 0) {
350
+ if (position->z < 0.5*storage->stored_zdepth && position->z > -0.5*storage->stored_xwidth)
351
+ add_point = 1;
352
+ else
353
+ add_point = 0;
354
+ }
355
+
273
356
if (add_point == 1) {
274
357
//printf("storage was set \n");
275
358
276
359
double given_x_pos, given_y_pos, given_z_pos;
360
+ double used_x_pos, used_y_pos, used_z_pos;
277
361
coords_get(*position, &given_x_pos, &given_y_pos, &given_z_pos);
278
-
362
+
363
+ if (storage->stored_xbins != 0) {
364
+ used_x_pos = round_to_nearest_bin(given_x_pos, storage->stored_xwidth, storage->stored_xbins);
365
+ } else {
366
+ used_x_pos = given_x_pos;
367
+ }
368
+
369
+ if (storage->stored_ybins != 0) {
370
+ used_y_pos = round_to_nearest_bin(given_y_pos, storage->stored_yheight, storage->stored_ybins);
371
+ } else {
372
+ used_y_pos = given_y_pos;
373
+ }
374
+
375
+ if (storage->stored_zbins != 0) {
376
+ used_z_pos = round_to_nearest_bin(given_z_pos, storage->stored_zdepth, storage->stored_zbins);
377
+ } else {
378
+ used_z_pos = given_z_pos;
379
+ }
380
+
279
381
double given_x_vel, given_y_vel, given_z_vel;
280
382
given_x_vel = k[0]*K2V;
281
383
given_y_vel = k[1]*K2V;
282
384
given_z_vel = k[2]*K2V;
283
385
284
386
_class_particle _localparticle;
285
387
286
- _localparticle.x = given_x_pos ;
287
- _localparticle.y = given_y_pos ;
288
- _localparticle.z = given_z_pos ;
388
+ _localparticle.x = used_x_pos ;
389
+ _localparticle.y = used_y_pos ;
390
+ _localparticle.z = used_z_pos ;
289
391
290
392
_localparticle.vx = given_x_vel;
291
393
_localparticle.vy = given_y_vel;
@@ -478,8 +580,17 @@ INITIALIZE
478
580
this_abs_storage.order = order_total;
479
581
this_abs_storage.order_in_this_volume = order_volume;
480
582
583
+ this_abs_storage.stored_xwidth = xwidth;
584
+ this_abs_storage.stored_xbins = (int) xbins;
585
+
586
+ this_abs_storage.stored_yheight = yheight;
587
+ this_abs_storage.stored_ybins = (int) ybins;
588
+
589
+ this_abs_storage.stored_zdepth = zdepth;
590
+ this_abs_storage.stored_zbins = (int) zbins;
591
+
481
592
this_abs_storage.temp_abs_event_data.num_elements=0;
482
-
593
+
483
594
this_abs_storage.temp_abs_event_data.allocated_elements = 10;
484
595
this_abs_storage.temp_abs_event_data.elements = malloc(this_abs_storage.temp_abs_event_data.allocated_elements*sizeof(struct temp_abs_event_data_element_struct));
485
596
0 commit comments