From c43ee84dac1e776f8a263401f17f956de7577a06 Mon Sep 17 00:00:00 2001 From: mads-bertelsen Date: Wed, 29 Apr 2026 11:28:18 +0200 Subject: [PATCH 1/5] Fixing lack of rotation for logger components. Logger components had coordinate transformation from master to local in their code, and didn't take rotation into account. Abs_loggers on the other hand had the transformation done in master, this was moved into the abs_loggers to be more consistent with loggers. It was decided to have transformation in the loggers, abs_loggers instead of master for performance reasons, a logger may look on just the time, and then there is no need to transform position and wavevector. --- mcstas-comps/share/union-lib.c | 5 -- .../union/Union_abs_logger_1D_space.comp | 25 ++++++--- .../Union_abs_logger_1D_space_event.comp | 25 ++++++--- .../union/Union_abs_logger_1D_space_tof.comp | 23 +++++--- ...ion_abs_logger_1D_space_tof_to_lambda.comp | 20 ++++--- .../union/Union_abs_logger_1D_time.comp | 16 ------ .../union/Union_abs_logger_2D_space.comp | 56 +++++++++---------- .../union/Union_abs_logger_event.comp | 38 ++++++++----- mcstas-comps/union/Union_abs_logger_nD.comp | 48 +++++++++------- mcstas-comps/union/Union_logger_2DQ.comp | 32 +++++++++-- mcstas-comps/union/Union_logger_2D_kf.comp | 34 ++++++++--- .../union/Union_logger_2D_kf_time.comp | 36 +++++++++--- mcstas-comps/union/Union_logger_2D_space.comp | 48 ++++++++-------- .../union/Union_logger_2D_space_time.comp | 46 ++++++++------- mcstas-comps/union/Union_logger_3D_space.comp | 52 +++++++++-------- mcstas-comps/union/Union_master.comp | 13 +---- 16 files changed, 295 insertions(+), 222 deletions(-) diff --git a/mcstas-comps/share/union-lib.c b/mcstas-comps/share/union-lib.c index 755352aef..2bf1d4515 100755 --- a/mcstas-comps/share/union-lib.c +++ b/mcstas-comps/share/union-lib.c @@ -355,11 +355,6 @@ struct abs_logger_struct { // Contains hard copy of logger_data_union since the size is the same as a pointer. union abs_logger_data_union data_union; - // Position and rotation of the abs_logger - Coords position; - Rotation rotation; - Rotation t_rotation; - int abs_logger_extend_index; // Contain index conditional_extend_array defined in master that can be acsessed from extend section. struct conditional_list_struct conditional_list; diff --git a/mcstas-comps/union/Union_abs_logger_1D_space.comp b/mcstas-comps/union/Union_abs_logger_1D_space.comp index 2a92299d0..ec4c6d07f 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space.comp @@ -142,12 +142,16 @@ SHARE } if (add_point == 1) { + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); int i; double value, dummy1, dummy2; // value = position.y; // define makes this not work - coords_get (*position, &dummy1, &value, &dummy2); + coords_get (*transformed_ray_position, &dummy1, &value, &dummy2); // Find bin in histogram if (value > storage->Detector_1D.min && value < storage->Detector_1D.max) { @@ -234,13 +238,16 @@ SHARE } if (add_point == 1) { - // printf("storage was set \n"); + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); int i; double value, dummy1, dummy2; // value = position.y; // define makes this not work - coords_get (*position, &dummy1, &value, &dummy2); + coords_get (*transformed_ray_position, &dummy1, &value, &dummy2); // Find bin in histogram if (value > storage->Detector_1D.min && value < storage->Detector_1D.max) { @@ -429,14 +436,14 @@ INITIALIZE struct global_positions_to_transform_list_struct* global_positions_to_transform_list = COMP_GETPAR3 (Union_init, init, global_positions_to_transform_list); struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_logger.position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_logger.position); + this_abs_storage.position = POS_A_CURRENT_COMP; + add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.position); - rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.rotation); + rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.t_rotation); + rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); // printf("past direction choices sanitation \n"); diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_event.comp b/mcstas-comps/union/Union_abs_logger_1D_space_event.comp index a099ad614..d075e0b15 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_event.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_event.comp @@ -168,10 +168,14 @@ SHARE } if (add_point == 1) { + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); int i; double given_x_pos, given_y_pos, given_z_pos; - coords_get (*position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); given_x_pos = 0.0; // 1D monitor, always in center x bin double given_x_vel, given_y_vel, given_z_vel; @@ -293,10 +297,13 @@ SHARE } if (add_point == 1) { - // printf("storage was set \n"); + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + int i; double given_x_pos, given_y_pos, given_z_pos; - coords_get (*position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); given_x_pos = 0.0; // 1D monitor, always in center x bin double given_x_vel, given_y_vel, given_z_vel; @@ -522,14 +529,14 @@ INITIALIZE struct global_positions_to_transform_list_struct* global_positions_to_transform_list = COMP_GETPAR3 (Union_init, init, global_positions_to_transform_list); struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_logger.position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_logger.position); + this_abs_storage.position = POS_A_CURRENT_COMP; + add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.position); - rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.rotation); + rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.t_rotation); + rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); // Adding fake event to combat MPI writing bug if (fake_event) { diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp b/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp index a2dcb4afd..413036b37 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp @@ -141,13 +141,16 @@ SHARE } if (add_point == 1) { + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); double p1, p2; double dummy1, dummy2; // value = position.y; // define makes this not work - coords_get (*position, &dummy1, &p1, &dummy2); + coords_get (*transformed_ray_position, &dummy1, &p1, &dummy2); p2 = time; int i, j; @@ -243,13 +246,15 @@ SHARE } if (add_point == 1) { - // printf("storage was set \n"); + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + double p1, p2; double dummy1, dummy2; // value = position.y; // define makes this not work - coords_get (*position, &dummy1, &p1, &dummy2); + coords_get (*transformed_ray_position, &dummy1, &p1, &dummy2); p2 = time; int i, j; @@ -490,14 +495,14 @@ INITIALIZE struct global_positions_to_transform_list_struct* global_positions_to_transform_list = COMP_GETPAR3 (Union_init, init, global_positions_to_transform_list); struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_logger.position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_logger.position); + this_abs_storage.position = POS_A_CURRENT_COMP; + add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.position); - rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.rotation); + rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.t_rotation); + rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); // printf("past direction choices sanitation \n"); diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp b/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp index 25082cff5..e726f7255 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp @@ -183,11 +183,15 @@ SHARE else add_point = 0; } + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); // Bin y_position int y_bin; double dummy1, y_pos, dummy2; - coords_get (*position, &dummy1, &y_pos, &dummy2); + coords_get (*transformed_ray_position, &dummy1, &y_pos, &dummy2); if (y_pos > storage->y_min && y_pos < storage->y_max) { add_point = 1; @@ -198,7 +202,7 @@ SHARE } if (add_point == 1) { - + double p1, p2; // Wavelength from velocity @@ -315,6 +319,10 @@ SHARE else add_point = 0; } + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); // Bin y_position int y_bin; @@ -693,17 +701,15 @@ INITIALIZE struct global_positions_to_transform_list_struct* global_positions_to_transform_list = COMP_GETPAR3 (Union_init, init, global_positions_to_transform_list); struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_logger.position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_logger.position); + this_abs_storage.logger_position = POS_A_CURRENT_COMP; add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.logger_position); rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.rotation); - this_abs_storage.logger_rotation = &this_abs_logger.rotation; + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.t_rotation); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); // Get the position from a component instance this_abs_storage.sample_pos = POS_A_COMP_INDEX (INDEX_CURRENT_COMP + ref_component); diff --git a/mcstas-comps/union/Union_abs_logger_1D_time.comp b/mcstas-comps/union/Union_abs_logger_1D_time.comp index fe1cd22cd..06915a5c2 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_time.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_time.comp @@ -114,10 +114,6 @@ SHARE int order; int order_in_this_volume; int order_process_in_this_volume; - - Coords position; - Rotation rotation; - Rotation t_rotation; }; // record_to_temp @@ -429,18 +425,6 @@ INITIALIZE exit (-1); } - struct global_positions_to_transform_list_struct* global_positions_to_transform_list = COMP_GETPAR3 (Union_init, init, global_positions_to_transform_list); - struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); - // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_logger.position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_logger.position); - - rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.rotation); - - rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.t_rotation); - // printf("past direction choices sanitation \n"); // Book keeping diff --git a/mcstas-comps/union/Union_abs_logger_2D_space.comp b/mcstas-comps/union/Union_abs_logger_2D_space.comp index 74ce4c19f..5e04a9e79 100644 --- a/mcstas-comps/union/Union_abs_logger_2D_space.comp +++ b/mcstas-comps/union/Union_abs_logger_2D_space.comp @@ -156,29 +156,26 @@ SHARE } if (add_point == 1) { + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); double p1, p2; // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". if (storage->dim_1_choice == 0) - // p1 = position->x - storage->position.x; - p1 = position->x; + p1 = transformed_ray_position.x; else if (storage->dim_1_choice == 1) - // p1 = position->y; - p1 = position->y - storage->position.y; + p1 = transformed_ray_position.y; else if (storage->dim_1_choice == 2) - // p1 = position->z - storage->position.z; - p1 = position->z; + p1 = transformed_ray_position.z; if (storage->dim_2_choice == 0) - // p2 = position->x - storage->position.x; - p2 = position->x; + p2 = transformed_ray_position.x; else if (storage->dim_2_choice == 1) - // p2 = position->y - storage->position.y; - p2 = position->y; + p2 = transformed_ray_position.y; else if (storage->dim_2_choice == 2) - // p2 = position->z - storage->position.z; - p2 = position->z; + p2 = transformed_ray_position.z; int i, j; @@ -272,29 +269,26 @@ SHARE } if (add_point == 1) { - // printf("storage was set \n"); + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + double p1, p2; // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". if (storage->dim_1_choice == 0) - // p1 = position->x - storage->position.x; - p1 = position->x; + p1 = transformed_ray_position.x; else if (storage->dim_1_choice == 1) - // p1 = position->y; - p1 = position->y - storage->position.y; + p1 = transformed_ray_position.y; else if (storage->dim_1_choice == 2) - // p1 = position->z - storage->position.z; - p1 = position->z; + p1 = transformed_ray_position.z; if (storage->dim_2_choice == 0) - // p2 = position->x - storage->position.x; - p2 = position->x; + p2 = transformed_ray_position.x; else if (storage->dim_2_choice == 1) - // p2 = position->y - storage->position.y; - p2 = position->y; + p2 = transformed_ray_position.y; else if (storage->dim_2_choice == 2) - // p2 = position->z - storage->position.z; - p2 = position->z; + p2 = transformed_ray_position.z; int i, j; @@ -567,14 +561,14 @@ INITIALIZE struct global_positions_to_transform_list_struct* global_positions_to_transform_list = COMP_GETPAR3 (Union_init, init, global_positions_to_transform_list); struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_logger.position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_logger.position); + this_abs_storage.position = POS_A_CURRENT_COMP; + add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.position); - rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.rotation); + rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.t_rotation); + rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); // printf("past direction choices sanitation \n"); diff --git a/mcstas-comps/union/Union_abs_logger_event.comp b/mcstas-comps/union/Union_abs_logger_event.comp index e75ac3e63..10334d0a5 100644 --- a/mcstas-comps/union/Union_abs_logger_event.comp +++ b/mcstas-comps/union/Union_abs_logger_event.comp @@ -185,23 +185,27 @@ SHARE else add_point = 0; } + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); if (storage->stored_xwidth != 0) { - if (position->x < 0.5 * storage->stored_xwidth && position->x > -0.5 * storage->stored_xwidth) + if (transformed_ray_position.x < 0.5 * storage->stored_xwidth && transformed_ray_position.x > -0.5 * storage->stored_xwidth) add_point = 1; else add_point = 0; } if (storage->stored_yheight != 0) { - if (position->y < 0.5 * storage->stored_yheight && position->y > -0.5 * storage->stored_yheight) + if (transformed_ray_position.y < 0.5 * storage->stored_yheight && position->y > -0.5 * transformed_ray_position.stored_yheight) add_point = 1; else add_point = 0; } if (storage->stored_zdepth != 0) { - if (position->z < 0.5 * storage->stored_zdepth && position->z > -0.5 * storage->stored_xwidth) + if (transformed_ray_position.z < 0.5 * storage->stored_zdepth && transformed_ray_position.z > -0.5 * storage->stored_xwidth) add_point = 1; else add_point = 0; @@ -212,7 +216,7 @@ SHARE int i; double given_x_pos, given_y_pos, given_z_pos; double used_x_pos, used_y_pos, used_z_pos; - coords_get (*position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); if (storage->stored_xbins != 0) { used_x_pos = round_to_nearest_bin (given_x_pos, storage->stored_xwidth, storage->stored_xbins); @@ -349,33 +353,37 @@ SHARE add_point = 0; } + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + if (storage->stored_xwidth != 0) { - if (position->x < 0.5 * storage->stored_xwidth && position->x > -0.5 * storage->stored_xwidth) + if (transformed_ray_position.x < 0.5 * storage->stored_xwidth && transformed_ray_position.x > -0.5 * storage->stored_xwidth) add_point = 1; else add_point = 0; } if (storage->stored_yheight != 0) { - if (position->y < 0.5 * storage->stored_yheight && position->y > -0.5 * storage->stored_yheight) + if (transformed_ray_position.y < 0.5 * storage->stored_yheight && position->y > -0.5 * transformed_ray_position.stored_yheight) add_point = 1; else add_point = 0; } if (storage->stored_zdepth != 0) { - if (position->z < 0.5 * storage->stored_zdepth && position->z > -0.5 * storage->stored_xwidth) + if (transformed_ray_position.z < 0.5 * storage->stored_zdepth && transformed_ray_position.z > -0.5 * storage->stored_xwidth) add_point = 1; else add_point = 0; } if (add_point == 1) { - // printf("storage was set \n"); + int i; double given_x_pos, given_y_pos, given_z_pos; double used_x_pos, used_y_pos, used_z_pos; - coords_get (*position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); if (storage->stored_xbins != 0) { used_x_pos = round_to_nearest_bin (given_x_pos, storage->stored_xwidth, storage->stored_xbins); @@ -622,14 +630,14 @@ INITIALIZE struct global_positions_to_transform_list_struct* global_positions_to_transform_list = COMP_GETPAR3 (Union_init, init, global_positions_to_transform_list); struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_logger.position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_logger.position); + this_abs_storage.position = POS_A_CURRENT_COMP; + add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.position); - rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.rotation); + rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.t_rotation); + rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); // Book keeping this_abs_logger.abs_logger_extend_index = logger_conditional_extend_index; diff --git a/mcstas-comps/union/Union_abs_logger_nD.comp b/mcstas-comps/union/Union_abs_logger_nD.comp index acdec0e39..8bd67e038 100644 --- a/mcstas-comps/union/Union_abs_logger_nD.comp +++ b/mcstas-comps/union/Union_abs_logger_nD.comp @@ -189,15 +189,20 @@ SHARE } if (add_point == 1) { + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); int i; double given_x_pos, given_y_pos, given_z_pos; - coords_get (*position, &given_x_pos, &given_y_pos, &given_z_pos); - - double given_x_vel, given_y_vel, given_z_vel; - given_x_vel = k[0] * K2V; - given_y_vel = k[1] * K2V; - given_z_vel = k[2] * K2V; + coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); + + Coords k_coords = make_position(k); + Coords transformed_k_coords = rot_apply (storage->rotation, k_coords); + + double given_x_vel, given_y_vel, given_z_vel; + coords_get(coords_scalar_mult (transformed_k_coords, K2V), &given_x_vel, &given_y_vel, &given_z_vel); if (storage->temp_abs_nD_data.num_elements < storage->temp_abs_nD_data.allocated_elements) { @@ -312,15 +317,20 @@ SHARE } if (add_point == 1) { + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + int i; double given_x_pos, given_y_pos, given_z_pos; - coords_get (*position, &given_x_pos, &given_y_pos, &given_z_pos); - - double given_x_vel, given_y_vel, given_z_vel; - given_x_vel = k[0] * K2V; - given_y_vel = k[1] * K2V; - given_z_vel = k[2] * K2V; - + coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); + + Coords k_coords = make_position(k); + Coords transformed_k_coords = rot_apply (storage->rotation, k_coords); + + double given_x_vel, given_y_vel, given_z_vel; + coords_get(coords_scalar_mult (transformed_k_coords, K2V), &given_x_vel, &given_y_vel, &given_z_vel); + _class_particle _localparticle; _localparticle.x = given_x_pos; @@ -511,14 +521,14 @@ INITIALIZE INHERIT Monitor_nD EXTEND struct global_positions_to_transform_list_struct* global_positions_to_transform_list = COMP_GETPAR3 (Union_init, init, global_positions_to_transform_list); struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_logger.position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_logger.position); + this_abs_storage.position = POS_A_CURRENT_COMP; + add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.position); - rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.rotation); + rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_logger.t_rotation); + rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); // Book keeping this_abs_logger.abs_logger_extend_index = logger_conditional_extend_index; diff --git a/mcstas-comps/union/Union_logger_2DQ.comp b/mcstas-comps/union/Union_logger_2DQ.comp index 0641e44ee..a70082181 100644 --- a/mcstas-comps/union/Union_logger_2DQ.comp +++ b/mcstas-comps/union/Union_logger_2DQ.comp @@ -107,6 +107,8 @@ SHARE int order; int order_in_this_volume; int order_process_in_this_volume; + + Rotation rotation; }; // record_to_temp @@ -143,12 +145,19 @@ SHARE } if (add_point == 1) { + + // k_new given in master coordinates, transform to local + // Done here instead of master to save performance, avoid unecessary transforms + Coords q_master = coords_sub(make_position(k_old), make_position(k_new)); + Coords q_local_coords = rot_apply(storage->rotation, q_master); + double q_local_double[3]; + coords_get(q_local_coords, &q_local_double[0], &q_local_double[1], &q_local_double[2]); double q1, q2; // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". - q1 = k_old[storage->dim_1_choice] - k_new[storage->dim_1_choice]; - q2 = k_old[storage->dim_2_choice] - k_new[storage->dim_2_choice]; + q1 = q_local_double[storage->dim_1_choice]; + q2 = q_local_double[storage->dim_2_choice]; int i, j; @@ -250,12 +259,19 @@ SHARE } if (add_point == 1) { - // printf("storage was set \n"); + + // k_new given in master coordinates, transform to local + // Done here instead of master to save performance, avoid unecessary transforms + Coords q_master = coords_sub(make_position(k_old), make_position(k_new)); + Coords q_local_coords = rot_apply(storage->rotation, q_master); + double q_local_double[3]; + coords_get(q_local_coords, &q_local_double[0], &q_local_double[1], &q_local_double[2]); + double q1, q2; // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input "x" "y" "z". - q1 = k_old[storage->dim_1_choice] - k_new[storage->dim_1_choice]; - q2 = k_old[storage->dim_2_choice] - k_new[storage->dim_2_choice]; + q1 = q_local_double[storage->dim_1_choice]; + q2 = q_local_double[storage->dim_2_choice]; int i, j; @@ -590,6 +606,12 @@ INITIALIZE fprintf (stderr, "Union_logger_2DQ:%s: Error identifying Union_init component, %s is not a known component name.\n", NAME_CURRENT_COMP, init); exit (-1); } + + // Global variables retrieved from init component + struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); + + rot_copy (this_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.rotation); // In order to run the logger at the right times, pointers to this logger is stored in each volume it logs, // and additionally for each avaiable process. If a process is not logged, the pointer is simply not stored. diff --git a/mcstas-comps/union/Union_logger_2D_kf.comp b/mcstas-comps/union/Union_logger_2D_kf.comp index b6be29e97..71dbd5691 100644 --- a/mcstas-comps/union/Union_logger_2D_kf.comp +++ b/mcstas-comps/union/Union_logger_2D_kf.comp @@ -104,6 +104,8 @@ SHARE int order; int order_in_this_volume; int order_process_in_this_volume; + + Rotation rotation; }; // record_to_temp @@ -139,13 +141,19 @@ SHARE add_point = 0; } - if (add_point == 1) { + if (add_point == 1) { + // k_new given in master coordinates, transform to local + // Done here instead of master to save performance, avoid unecessary transforms + Coords k_new_master = make_position(k_new); + Coords k_new_local = rot_apply(storage->rotation, k_new_master); + double k_new_local_double[3]; + coords_get(k_new_local, &k_new_local_double[0], &k_new_local_double[1], &k_new_local_double[2]); double q1, q2; // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". - q1 = k_new[storage->dim_1_choice]; - q2 = k_new[storage->dim_2_choice]; + q1 = k_new_local_double[storage->dim_1_choice]; + q2 = k_new_local_double[storage->dim_2_choice]; int i, j; @@ -247,12 +255,18 @@ SHARE } if (add_point == 1) { - // printf("storage was set \n"); + // k_new given in master coordinates, transform to local + // Done here instead of master to save performance, avoid unecessary transforms + Coords k_new_master = make_position(k_new); + Coords k_new_local = rot_apply(storage->rotation, k_new_master); + double k_new_local_double[3]; + coords_get(k_new_local, &k_new_local_double[0], &k_new_local_double[1], &k_new_local_double[2]); + double q1, q2; - // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input "x" "y" "z". - q1 = k_new[storage->dim_1_choice]; - q2 = k_new[storage->dim_2_choice]; + // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". + q1 = k_new_local_double[storage->dim_1_choice]; + q2 = k_new_local_double[storage->dim_2_choice]; int i, j; @@ -587,6 +601,12 @@ INITIALIZE fprintf (stderr, "Union_logger_2D_kf:%s: Error identifying Union_init component, %s is not a known component name.\n", NAME_CURRENT_COMP, init); exit (-1); } + + // Global variables retrieved from init component + struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); + + rot_copy (this_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.rotation); // In order to run the logger at the right times, pointers to this logger is stored in each volume it logs, // and additionally for each avaiable process. If a process is not logged, the pointer is simply not stored. diff --git a/mcstas-comps/union/Union_logger_2D_kf_time.comp b/mcstas-comps/union/Union_logger_2D_kf_time.comp index e3d370374..86c844a92 100644 --- a/mcstas-comps/union/Union_logger_2D_kf_time.comp +++ b/mcstas-comps/union/Union_logger_2D_kf_time.comp @@ -110,6 +110,8 @@ SHARE int order; int order_in_this_volume; int order_process_in_this_volume; + + Rotation rotation; }; // record_to_temp @@ -147,11 +149,18 @@ SHARE if (add_point == 1) { - double p1, p2; + // k_new given in master coordinates, transform to local + // Done here instead of master to save performance, avoid unecessary transforms + Coords k_new_master = make_position(k_new); + Coords k_new_local = rot_apply(storage->rotation, k_new_master); + double k_new_local_double[3]; + coords_get(k_new_local, &k_new_local_double[0], &k_new_local_double[1], &k_new_local_double[2]); + + double p1, p2; // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". - p1 = k_new[storage->dim_1_choice]; - p2 = k_new[storage->dim_2_choice]; + p1 = k_new_local_double[storage->dim_1_choice]; + p2 = k_new_local_double[storage->dim_2_choice]; int i, j, k; @@ -259,12 +268,18 @@ SHARE } if (add_point == 1) { - // printf("storage was set \n"); - double p1, p2; + // k_new given in master coordinates, transform to local + // Done here instead of master to save performance, avoid unecessary transforms + Coords k_new_master = make_position(k_new); + Coords k_new_local = rot_apply(storage->rotation, k_new_master); + double k_new_local_double[3]; + coords_get(k_new_local, &k_new_local_double[0], &k_new_local_double[1], &k_new_local_double[2]); + + double p1, p2; // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". - p1 = k_new[storage->dim_1_choice]; - p2 = k_new[storage->dim_2_choice]; + p1 = k_new_local_double[storage->dim_1_choice]; + p2 = k_new_local_double[storage->dim_2_choice]; int i, j, k; @@ -655,6 +670,13 @@ INITIALIZE exit (-1); } + // Global variables retrieved from init component + struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); + + rot_copy (this_storage.rotation, ROT_A_CURRENT_COMP); + add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.rotation); + + // In order to run the logger at the right times, pointers to this logger is stored in each volume it logs, // and additionally for each avaiable process. If a process is not logged, the pointer is simply not stored. struct pointer_to_global_geometry_list* global_geometry_list = COMP_GETPAR3 (Union_init, init, global_geometry_list); diff --git a/mcstas-comps/union/Union_logger_2D_space.comp b/mcstas-comps/union/Union_logger_2D_space.comp index eabd95406..3c724ec2a 100644 --- a/mcstas-comps/union/Union_logger_2D_space.comp +++ b/mcstas-comps/union/Union_logger_2D_space.comp @@ -111,7 +111,6 @@ SHARE Coords position; Rotation rotation; - Rotation t_rotation; }; // record_to_temp @@ -151,21 +150,25 @@ SHARE double p1, p2; p1 = p2 = 0; - - // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + + // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input "x" "y" "z". if (storage->dim_1_choice == 0) - p1 = position->x - storage->position.x; + p1 = transformed_ray_position.x; else if (storage->dim_1_choice == 1) - p1 = position->y - storage->position.y; + p1 = transformed_ray_position.y; else if (storage->dim_1_choice == 2) - p1 = position->z - storage->position.z; + p1 = transformed_ray_position.z; if (storage->dim_2_choice == 0) - p2 = position->x - storage->position.x; + p2 = transformed_ray_position.x; else if (storage->dim_2_choice == 1) - p2 = position->y - storage->position.y; + p2 = transformed_ray_position.y; else if (storage->dim_2_choice == 2) - p2 = position->z - storage->position.z; + p2 = transformed_ray_position.z; int i, j; @@ -270,27 +273,25 @@ SHARE // printf("storage was set \n"); double p1, p2; p1 = p2 = 0; - + + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input "x" "y" "z". if (storage->dim_1_choice == 0) - p1 = position->x - storage->position.x; - // p1 = position->x; + p1 = transformed_ray_position.x; else if (storage->dim_1_choice == 1) - p1 = position->y - storage->position.y; - // p1 = position->y; + p1 = transformed_ray_position.y; else if (storage->dim_1_choice == 2) - p1 = position->z - storage->position.z; - // p1 = position->z; + p1 = transformed_ray_position.z; if (storage->dim_2_choice == 0) - p2 = position->x - storage->position.x; - // p2 = position->x; + p2 = transformed_ray_position.x; else if (storage->dim_2_choice == 1) - p2 = position->y - storage->position.y; - // p2 = position->y; + p2 = transformed_ray_position.y; else if (storage->dim_2_choice == 2) - p2 = position->z - storage->position.z; - // p2 = position->z; + p2 = transformed_ray_position.z; int i, j; @@ -616,9 +617,6 @@ INITIALIZE rot_copy (this_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.t_rotation); - // printf("past direction choices sanitation \n"); // Book keeping diff --git a/mcstas-comps/union/Union_logger_2D_space_time.comp b/mcstas-comps/union/Union_logger_2D_space_time.comp index a206d578b..17155ef6b 100644 --- a/mcstas-comps/union/Union_logger_2D_space_time.comp +++ b/mcstas-comps/union/Union_logger_2D_space_time.comp @@ -113,7 +113,6 @@ SHARE Coords position; Rotation rotation; - Rotation t_rotation; }; // record_to_temp @@ -154,20 +153,24 @@ SHARE double p1, p2; p1 = p2 = 0; - // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + + // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input "x" "y" "z". if (storage->dim_1_choice == 0) - p1 = position->x - storage->position.x; + p1 = transformed_ray_position.x; else if (storage->dim_1_choice == 1) - p1 = position->y - storage->position.y; + p1 = transformed_ray_position.y; else if (storage->dim_1_choice == 2) - p1 = position->z - storage->position.z; + p1 = transformed_ray_position.z; if (storage->dim_2_choice == 0) - p2 = position->x - storage->position.x; + p2 = transformed_ray_position.x; else if (storage->dim_2_choice == 1) - p2 = position->y - storage->position.y; + p2 = transformed_ray_position.y; else if (storage->dim_2_choice == 2) - p2 = position->z - storage->position.z; + p2 = transformed_ray_position.z; int i, j, k; @@ -279,26 +282,24 @@ SHARE double p1, p2; p1 = p2 = 0; - // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + + // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input "x" "y" "z". if (storage->dim_1_choice == 0) - p1 = position->x - storage->position.x; - // p1 = position->x; + p1 = transformed_ray_position.x; else if (storage->dim_1_choice == 1) - p1 = position->y - storage->position.y; - // p1 = position->y; + p1 = transformed_ray_position.y; else if (storage->dim_1_choice == 2) - p1 = position->z - storage->position.z; - // p1 = position->z; + p1 = transformed_ray_position.z; if (storage->dim_2_choice == 0) - p2 = position->x - storage->position.x; - // p2 = position->x; + p2 = transformed_ray_position.x; else if (storage->dim_2_choice == 1) - p2 = position->y - storage->position.y; - // p2 = position->y; + p2 = transformed_ray_position.y; else if (storage->dim_2_choice == 2) - p2 = position->z - storage->position.z; - // p2 = position->z; + p2 = transformed_ray_position.z; int i, j, k; @@ -669,9 +670,6 @@ INITIALIZE rot_copy (this_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.t_rotation); - // printf("past direction choices sanitation \n"); // Book keeping diff --git a/mcstas-comps/union/Union_logger_3D_space.comp b/mcstas-comps/union/Union_logger_3D_space.comp index e71df0ace..0dc024c8e 100644 --- a/mcstas-comps/union/Union_logger_3D_space.comp +++ b/mcstas-comps/union/Union_logger_3D_space.comp @@ -115,7 +115,6 @@ SHARE Coords position; Rotation rotation; - Rotation t_rotation; }; // record_to_temp @@ -156,27 +155,31 @@ SHARE double p1, p2, p3; p1 = p2 = p3 = 0; - // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + + // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input "x" "y" "z". if (storage->dim_1_choice == 0) - p1 = position->x - storage->position.x; + p1 = transformed_ray_position.x; else if (storage->dim_1_choice == 1) - p1 = position->y - storage->position.y; + p1 = transformed_ray_position.y; else if (storage->dim_1_choice == 2) - p1 = position->z - storage->position.z; + p1 = transformed_ray_position.z; if (storage->dim_2_choice == 0) - p2 = position->x - storage->position.x; + p2 = transformed_ray_position.x; else if (storage->dim_2_choice == 1) - p2 = position->y - storage->position.y; + p2 = transformed_ray_position.y; else if (storage->dim_2_choice == 2) - p2 = position->z - storage->position.z; + p2 = transformed_ray_position.z; if (storage->dim_3_choice == 0) - p2 = position->x - storage->position.x; + p3 = transformed_ray_position.x; else if (storage->dim_3_choice == 1) - p2 = position->y - storage->position.y; + p3 = transformed_ray_position.y; else if (storage->dim_3_choice == 2) - p2 = position->z - storage->position.z; + p3 = transformed_ray_position.z; int i, j, k; @@ -288,27 +291,31 @@ SHARE double p1, p2, p3; p1 = p2 = p3 = 0; - // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input. "x" "y" "z". + Coords transformed_ray_position; + transformed_ray_position = coords_sub (*position, storage->position); + transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); + + // dim_1_choice = 0 for x, 1 for y, 2 for z. Done in initialize from input "x" "y" "z". if (storage->dim_1_choice == 0) - p1 = position->x - storage->position.x; + p1 = transformed_ray_position.x; else if (storage->dim_1_choice == 1) - p1 = position->y - storage->position.y; + p1 = transformed_ray_position.y; else if (storage->dim_1_choice == 2) - p1 = position->z - storage->position.z; + p1 = transformed_ray_position.z; if (storage->dim_2_choice == 0) - p2 = position->x - storage->position.x; + p2 = transformed_ray_position.x; else if (storage->dim_2_choice == 1) - p2 = position->y - storage->position.y; + p2 = transformed_ray_position.y; else if (storage->dim_2_choice == 2) - p2 = position->z - storage->position.z; + p2 = transformed_ray_position.z; if (storage->dim_3_choice == 0) - p3 = position->x - storage->position.x; + p3 = transformed_ray_position.x; else if (storage->dim_3_choice == 1) - p3 = position->y - storage->position.y; + p3 = transformed_ray_position.y; else if (storage->dim_3_choice == 2) - p3 = position->z - storage->position.z; + p3 = transformed_ray_position.z; int i, j, k; @@ -724,9 +731,6 @@ INITIALIZE rot_copy (this_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_storage.t_rotation); - // printf("past direction choices sanitation \n"); // Book keeping diff --git a/mcstas-comps/union/Union_master.comp b/mcstas-comps/union/Union_master.comp index ae0f31345..bb1b007b1 100755 --- a/mcstas-comps/union/Union_master.comp +++ b/mcstas-comps/union/Union_master.comp @@ -1948,13 +1948,10 @@ TRACE // Logging for detector components assosiated with this volume for (log_index = 0; log_index < Volumes[current_volume]->abs_loggers.num_elements; log_index++) { - // Make transformation according to the individual position of the abs_logger? This would require position / rotation for all abs_loggers - transformed_abs_position = coords_sub (abs_position, Volumes[current_volume]->abs_loggers.p_abs_logger[log_index]->position); - transformed_abs_position = rot_apply (Volumes[current_volume]->abs_loggers.p_abs_logger[log_index]->rotation, transformed_abs_position); - // This function calls a logger function which in turn stores some data among the passed, and possibly performs some basic data analysis + // Position and k_new given in master coordinates, the abs_logger must transform to its coordnate system if required Volumes[current_volume]->abs_loggers.p_abs_logger[log_index]->function_pointers.active_record_function ( - &transformed_abs_position, k_new, initial_weight * (1.0 - abs_weight_factor), t + t_abs_propagation, scattered_flag[current_volume], + &abs_position, k_new, initial_weight * (1.0 - abs_weight_factor), t + t_abs_propagation, scattered_flag[current_volume], number_of_scattering_events, Volumes[current_volume]->abs_loggers.p_abs_logger[log_index], &abs_loggers_with_data_array); // If the logging component have a conditional attatched, the collected data will be written to a temporary place // At the end of the rays life, it will be checked if the condition is met @@ -1972,13 +1969,9 @@ TRACE // general. Could be interesting to have a monitor that just globally measurres the second scattering event in any volume (must be two in the same). // Weird but not meaningless. - // Make transformation according to the individual position of the abs_logger? This would require position / rotation for all abs_loggers - transformed_abs_position = coords_sub (abs_position, global_all_volume_abs_logger_list_master->elements[log_index].abs_logger->position); - transformed_abs_position = rot_apply (global_all_volume_abs_logger_list_master->elements[log_index].abs_logger->rotation, transformed_abs_position); - // Above version includes scattered_flag_VP, but selected_process may be undefined at this point. global_all_volume_abs_logger_list_master->elements[log_index].abs_logger->function_pointers.active_record_function ( - &transformed_abs_position, k_new, initial_weight * (1.0 - abs_weight_factor), t + t_abs_propagation, scattered_flag[current_volume], + &abs_position, k_new, initial_weight * (1.0 - abs_weight_factor), t + t_abs_propagation, scattered_flag[current_volume], number_of_scattering_events, global_all_volume_abs_logger_list_master->elements[log_index].abs_logger, &abs_loggers_with_data_array); } } From eb0b341b7642b18890b21fd65594ee278c5f834c Mon Sep 17 00:00:00 2001 From: mads-bertelsen Date: Wed, 29 Apr 2026 13:32:38 +0200 Subject: [PATCH 2/5] Fixed errors caught by compiler. --- mcstas-comps/union/Union_abs_logger_1D_space.comp | 4 ++-- mcstas-comps/union/Union_abs_logger_1D_space_event.comp | 4 ++-- mcstas-comps/union/Union_abs_logger_1D_space_tof.comp | 4 ++-- .../union/Union_abs_logger_1D_space_tof_to_lambda.comp | 4 ++-- mcstas-comps/union/Union_abs_logger_event.comp | 4 ++-- mcstas-comps/union/Union_abs_logger_nD.comp | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mcstas-comps/union/Union_abs_logger_1D_space.comp b/mcstas-comps/union/Union_abs_logger_1D_space.comp index ec4c6d07f..fd4529c1c 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space.comp @@ -151,7 +151,7 @@ SHARE double value, dummy1, dummy2; // value = position.y; // define makes this not work - coords_get (*transformed_ray_position, &dummy1, &value, &dummy2); + coords_get (transformed_ray_position, &dummy1, &value, &dummy2); // Find bin in histogram if (value > storage->Detector_1D.min && value < storage->Detector_1D.max) { @@ -247,7 +247,7 @@ SHARE double value, dummy1, dummy2; // value = position.y; // define makes this not work - coords_get (*transformed_ray_position, &dummy1, &value, &dummy2); + coords_get (transformed_ray_position, &dummy1, &value, &dummy2); // Find bin in histogram if (value > storage->Detector_1D.min && value < storage->Detector_1D.max) { diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_event.comp b/mcstas-comps/union/Union_abs_logger_1D_space_event.comp index d075e0b15..b5b742392 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_event.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_event.comp @@ -175,7 +175,7 @@ SHARE int i; double given_x_pos, given_y_pos, given_z_pos; - coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); given_x_pos = 0.0; // 1D monitor, always in center x bin double given_x_vel, given_y_vel, given_z_vel; @@ -303,7 +303,7 @@ SHARE int i; double given_x_pos, given_y_pos, given_z_pos; - coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); given_x_pos = 0.0; // 1D monitor, always in center x bin double given_x_vel, given_y_vel, given_z_vel; diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp b/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp index 413036b37..d4d4eddd4 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp @@ -150,7 +150,7 @@ SHARE double dummy1, dummy2; // value = position.y; // define makes this not work - coords_get (*transformed_ray_position, &dummy1, &p1, &dummy2); + coords_get (transformed_ray_position, &dummy1, &p1, &dummy2); p2 = time; int i, j; @@ -254,7 +254,7 @@ SHARE double dummy1, dummy2; // value = position.y; // define makes this not work - coords_get (*transformed_ray_position, &dummy1, &p1, &dummy2); + coords_get (transformed_ray_position, &dummy1, &p1, &dummy2); p2 = time; int i, j; diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp b/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp index e726f7255..451f28681 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp @@ -191,7 +191,7 @@ SHARE // Bin y_position int y_bin; double dummy1, y_pos, dummy2; - coords_get (*transformed_ray_position, &dummy1, &y_pos, &dummy2); + coords_get (transformed_ray_position, &dummy1, &y_pos, &dummy2); if (y_pos > storage->y_min && y_pos < storage->y_max) { add_point = 1; @@ -327,7 +327,7 @@ SHARE // Bin y_position int y_bin; double dummy1, y_pos, dummy2; - coords_get (*position, &dummy1, &y_pos, &dummy2); + coords_get (transformed_ray_position, &dummy1, &y_pos, &dummy2); if (y_pos > storage->y_min && y_pos < storage->y_max) { add_point = 1; diff --git a/mcstas-comps/union/Union_abs_logger_event.comp b/mcstas-comps/union/Union_abs_logger_event.comp index 10334d0a5..d9a95748d 100644 --- a/mcstas-comps/union/Union_abs_logger_event.comp +++ b/mcstas-comps/union/Union_abs_logger_event.comp @@ -216,7 +216,7 @@ SHARE int i; double given_x_pos, given_y_pos, given_z_pos; double used_x_pos, used_y_pos, used_z_pos; - coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); if (storage->stored_xbins != 0) { used_x_pos = round_to_nearest_bin (given_x_pos, storage->stored_xwidth, storage->stored_xbins); @@ -383,7 +383,7 @@ SHARE int i; double given_x_pos, given_y_pos, given_z_pos; double used_x_pos, used_y_pos, used_z_pos; - coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); if (storage->stored_xbins != 0) { used_x_pos = round_to_nearest_bin (given_x_pos, storage->stored_xwidth, storage->stored_xbins); diff --git a/mcstas-comps/union/Union_abs_logger_nD.comp b/mcstas-comps/union/Union_abs_logger_nD.comp index 8bd67e038..18dd95a1d 100644 --- a/mcstas-comps/union/Union_abs_logger_nD.comp +++ b/mcstas-comps/union/Union_abs_logger_nD.comp @@ -196,7 +196,7 @@ SHARE int i; double given_x_pos, given_y_pos, given_z_pos; - coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); Coords k_coords = make_position(k); Coords transformed_k_coords = rot_apply (storage->rotation, k_coords); @@ -323,7 +323,7 @@ SHARE int i; double given_x_pos, given_y_pos, given_z_pos; - coords_get (*transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); + coords_get (transformed_ray_position, &given_x_pos, &given_y_pos, &given_z_pos); Coords k_coords = make_position(k); Coords transformed_k_coords = rot_apply (storage->rotation, k_coords); From 201f73aec89872e987cd4be0dc7c40d3acc61461 Mon Sep 17 00:00:00 2001 From: mads-bertelsen Date: Wed, 29 Apr 2026 14:46:56 +0200 Subject: [PATCH 3/5] Further fixe, now all existing tests runs successfully. Additional tests are needed and will be added to the branch. --- .../union/Union_abs_logger_1D_space.comp | 4 --- .../Union_abs_logger_1D_space_event.comp | 4 --- .../union/Union_abs_logger_1D_space_tof.comp | 7 +++-- ...ion_abs_logger_1D_space_tof_to_lambda.comp | 29 +++++++++---------- .../union/Union_abs_logger_2D_space.comp | 4 --- .../union/Union_abs_logger_event.comp | 8 ++--- mcstas-comps/union/Union_abs_logger_nD.comp | 4 --- 7 files changed, 20 insertions(+), 40 deletions(-) diff --git a/mcstas-comps/union/Union_abs_logger_1D_space.comp b/mcstas-comps/union/Union_abs_logger_1D_space.comp index fd4529c1c..a19672f30 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space.comp @@ -113,7 +113,6 @@ SHARE Coords position; Rotation rotation; - Rotation t_rotation; }; // record_to_temp @@ -442,9 +441,6 @@ INITIALIZE rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); - // printf("past direction choices sanitation \n"); // Book keeping diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_event.comp b/mcstas-comps/union/Union_abs_logger_1D_space_event.comp index b5b742392..588275f1b 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_event.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_event.comp @@ -139,7 +139,6 @@ SHARE Coords position; Rotation rotation; - Rotation t_rotation; }; // record_to_temp @@ -535,9 +534,6 @@ INITIALIZE rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); - // Adding fake event to combat MPI writing bug if (fake_event) { _class_particle _localparticle; diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp b/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp index d4d4eddd4..2608fd65e 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_tof.comp @@ -113,6 +113,9 @@ SHARE struct temp_1D_time_abs_data_struct temp_1D_time_abs_data; int order; int order_in_this_volume; + + Coords position; + Rotation rotation; }; // record_to_temp @@ -246,6 +249,7 @@ SHARE } if (add_point == 1) { + Coords transformed_ray_position; transformed_ray_position = coords_sub (*position, storage->position); transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); @@ -501,9 +505,6 @@ INITIALIZE rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); - // printf("past direction choices sanitation \n"); // Book keeping diff --git a/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp b/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp index 451f28681..8c21250c2 100644 --- a/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp +++ b/mcstas-comps/union/Union_abs_logger_1D_space_tof_to_lambda.comp @@ -153,10 +153,13 @@ SHARE Coords sample_pos; int transformed; // Coords *logger_position; - Coords logger_position; - Rotation* logger_rotation; + //Coords logger_position; + //Rotation* logger_rotation; double source_to_sample_dist; int relative; + + Coords position; + Rotation rotation; }; // record_to_temp @@ -184,6 +187,7 @@ SHARE add_point = 0; } + // From master to local coordinate system Coords transformed_ray_position; transformed_ray_position = coords_sub (*position, storage->position); transformed_ray_position = rot_apply (storage->rotation, transformed_ray_position); @@ -208,12 +212,11 @@ SHARE // Wavelength from velocity double k_length = sqrt (k[0] * k[0] + k[1] * k[1] + k[2] * k[2]); p1 = 2.0 * PI / k_length; - + // Transform sample_pos to logger coordinate system if (storage->transformed == 0) { - // storage->sample_pos = coords_sub(storage->sample_pos, *(storage->logger_position)); - storage->sample_pos = coords_sub (storage->sample_pos, storage->logger_position); - storage->sample_pos = rot_apply (*(storage->logger_rotation), storage->sample_pos); + storage->sample_pos = coords_sub (storage->sample_pos, storage->position); + storage->sample_pos = rot_apply (storage->rotation, storage->sample_pos); storage->transformed = 1; } @@ -347,9 +350,8 @@ SHARE // Transform sample_pos to logger coordinate system if (storage->transformed == 0) { - // storage->sample_pos = coords_sub(storage->sample_pos, *(storage->logger_position)); - storage->sample_pos = coords_sub (storage->sample_pos, storage->logger_position); - storage->sample_pos = rot_apply (*(storage->logger_rotation), storage->sample_pos); + storage->sample_pos = coords_sub (storage->sample_pos, storage->position); + storage->sample_pos = rot_apply (storage->rotation, storage->sample_pos); storage->transformed = 1; } @@ -702,15 +704,12 @@ INITIALIZE struct global_rotations_to_transform_list_struct* global_rotations_to_transform_list = COMP_GETPAR3 (Union_init, init, global_rotations_to_transform_list); // Test position and rotation stored in a data storage, and pointers assigned to transform lists - this_abs_storage.logger_position = POS_A_CURRENT_COMP; - add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.logger_position); + this_abs_storage.position = POS_A_CURRENT_COMP; + add_position_pointer_to_list (global_positions_to_transform_list, &this_abs_storage.position); - rot_copy (this_abs_logger.rotation, ROT_A_CURRENT_COMP); + rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_logger.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); - // Get the position from a component instance this_abs_storage.sample_pos = POS_A_COMP_INDEX (INDEX_CURRENT_COMP + ref_component); this_abs_storage.transformed = 0; // Set to 1 when sample_pos is transformed diff --git a/mcstas-comps/union/Union_abs_logger_2D_space.comp b/mcstas-comps/union/Union_abs_logger_2D_space.comp index 5e04a9e79..d48e8d418 100644 --- a/mcstas-comps/union/Union_abs_logger_2D_space.comp +++ b/mcstas-comps/union/Union_abs_logger_2D_space.comp @@ -127,7 +127,6 @@ SHARE Coords position; Rotation rotation; - Rotation t_rotation; }; // record_to_temp @@ -567,9 +566,6 @@ INITIALIZE rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); - // printf("past direction choices sanitation \n"); // Book keeping diff --git a/mcstas-comps/union/Union_abs_logger_event.comp b/mcstas-comps/union/Union_abs_logger_event.comp index d9a95748d..974e2c333 100644 --- a/mcstas-comps/union/Union_abs_logger_event.comp +++ b/mcstas-comps/union/Union_abs_logger_event.comp @@ -144,7 +144,6 @@ SHARE Coords position; Rotation rotation; - Rotation t_rotation; }; double @@ -198,7 +197,7 @@ SHARE } if (storage->stored_yheight != 0) { - if (transformed_ray_position.y < 0.5 * storage->stored_yheight && position->y > -0.5 * transformed_ray_position.stored_yheight) + if (transformed_ray_position.y < 0.5 * storage->stored_yheight && transformed_ray_position.y > -0.5 * storage->stored_yheight) add_point = 1; else add_point = 0; @@ -365,7 +364,7 @@ SHARE } if (storage->stored_yheight != 0) { - if (transformed_ray_position.y < 0.5 * storage->stored_yheight && position->y > -0.5 * transformed_ray_position.stored_yheight) + if (transformed_ray_position.y < 0.5 * storage->stored_yheight && transformed_ray_position.y > -0.5 * storage->stored_yheight) add_point = 1; else add_point = 0; @@ -636,9 +635,6 @@ INITIALIZE rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); - // Book keeping this_abs_logger.abs_logger_extend_index = logger_conditional_extend_index; this_abs_logger.function_pointers.active_record_function = &record_to_perm_abs_event; // Assume no conditional diff --git a/mcstas-comps/union/Union_abs_logger_nD.comp b/mcstas-comps/union/Union_abs_logger_nD.comp index 18dd95a1d..4653b340a 100644 --- a/mcstas-comps/union/Union_abs_logger_nD.comp +++ b/mcstas-comps/union/Union_abs_logger_nD.comp @@ -160,7 +160,6 @@ SHARE Coords position; Rotation rotation; - Rotation t_rotation; }; // record_to_temp @@ -527,9 +526,6 @@ INITIALIZE INHERIT Monitor_nD EXTEND rot_copy (this_abs_storage.rotation, ROT_A_CURRENT_COMP); add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.rotation); - rot_transpose (ROT_A_CURRENT_COMP, this_abs_storage.t_rotation); - add_rotation_pointer_to_list (global_rotations_to_transform_list, &this_abs_storage.t_rotation); - // Book keeping this_abs_logger.abs_logger_extend_index = logger_conditional_extend_index; this_abs_logger.function_pointers.active_record_function = &record_to_perm_abs_nD; // Assume no conditional From 6a12f14ccd12d24f02f00bbcc9ca7c41ee5513e6 Mon Sep 17 00:00:00 2001 From: mads-bertelsen Date: Wed, 29 Apr 2026 16:42:36 +0200 Subject: [PATCH 4/5] Update of tests to include: - Union_master at weird position, requires loggers to correct with their transformation, harder test - Added conditional component to all abs_logger and logger tests, testing a significantly different code path for each Found issue in conditionals as relating to absorption loggers with speicifc target, fixed that. --- .../Unit_test_abs_logger_1D_space.instr | 17 ++- .../Unit_test_abs_logger_1D_space_event.instr | 17 ++- .../Unit_test_abs_logger_1D_space_tof.instr | 35 ++++-- ...st_abs_logger_1D_space_tof_to_lambda.instr | 33 +++++- .../Unit_test_abs_logger_1D_time.instr | 106 ++++++++++++++++++ .../Unit_test_abs_logger_2D_space.instr | 17 ++- .../Unit_test_abs_logger_event.instr | 13 ++- .../Unit_test_abs_logger_nD.instr | 21 +++- .../Unit_test_logger_1D.instr | 18 ++- .../Unit_test_logger_2DQ.instr | 20 +++- .../Unit_test_logger_2D_kf.instr | 18 ++- .../Unit_test_logger_2D_kf_time.instr | 21 +++- .../Unit_test_logger_2D_space.instr | 18 ++- .../Unit_test_logger_2D_space_time.instr | 19 +++- .../Unit_test_logger_3D_space.instr | 22 +++- .../Unit_test_loggers_base.instr | 3 +- mcstas-comps/share/union-lib.c | 2 +- mcstas-comps/union/Union_conditional_PSD.comp | 2 +- .../union/Union_conditional_standard.comp | 2 +- 19 files changed, 365 insertions(+), 39 deletions(-) create mode 100644 mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_time/Unit_test_abs_logger_1D_time.instr diff --git a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space/Unit_test_abs_logger_1D_space.instr b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space/Unit_test_abs_logger_1D_space.instr index 9e20200e1..d0fac2b8f 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space/Unit_test_abs_logger_1D_space.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space/Unit_test_abs_logger_1D_space.instr @@ -21,6 +21,7 @@ * Often used for detectors. * * %Example: Detector: abs_logger_1D_I=1.12609e-09 +* %Example: Detector: abs_logger_1D_con_I=4.95914e-13 * * %End *******************************************************************************/ @@ -79,9 +80,23 @@ COMPONENT abs_logger_1D = Union_abs_logger_1D_space( yheight=0.2, n=100, filename="Union_abs_logger_1D_space.dat") AT (0,0,0) RELATIVE geometry_center + +// This logger will be affected by a conditional, impacts code path +COMPONENT abs_logger_1D_con = Union_abs_logger_1D_space( + yheight=0.2, n=100, + filename="Union_abs_logger_1D_space_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="abs_logger_1D_con") +AT (-0.05,0,1.0) RELATIVE geometry_center +// Master at odd position to ensure that does not impact results COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT(3, 0, -1) RELATIVE geometry_center +ROTATED(20, -5, 8) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_event/Unit_test_abs_logger_1D_space_event.instr b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_event/Unit_test_abs_logger_1D_space_event.instr index bbe08d283..5bb1605c2 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_event/Unit_test_abs_logger_1D_space_event.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_event/Unit_test_abs_logger_1D_space_event.instr @@ -70,13 +70,26 @@ AT (-0.03,0,0.02) RELATIVE geometry_center COMPONENT cone = Union_cone(radius_top=0.02, radius_bottom=0.055, yheight=0.09, priority=8, material_string="material") AT (0.03,0,0.07) RELATIVE geometry_center -COMPONENT abs_logger_1D = Union_abs_logger_1D_space_event( +COMPONENT abs_logger_1D_space_event = Union_abs_logger_1D_space_event( yheight=0.2, n=100, fake_event=1, filename="Union_abs_logger_1D_space_event.dat") AT (0,0,0) RELATIVE geometry_center + +COMPONENT abs_logger_1D_space_event_con = Union_abs_logger_1D_space_event( + yheight=0.2, n=100, fake_event=1, + filename="Union_abs_logger_1D_space_event_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="abs_logger_1D_space_event_con") +AT (-0.05,0,1.0) RELATIVE geometry_center +// Master at odd position to ensure that does not impact results COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (3, 0, -1) RELATIVE geometry_center +ROTATED (20, -5, 8) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_tof/Unit_test_abs_logger_1D_space_tof.instr b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_tof/Unit_test_abs_logger_1D_space_tof.instr index ef5394dd2..130784a6c 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_tof/Unit_test_abs_logger_1D_space_tof.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_tof/Unit_test_abs_logger_1D_space_tof.instr @@ -20,6 +20,7 @@ * time of absorption in a histogram. * * %Example: Detector: abs_logger_1D_space_tof_I=1.12682e-09 +* %Example: Detector: abs_logger_1D_space_tof_con_I=5.38067e-13 * * %End *******************************************************************************/ @@ -53,9 +54,9 @@ COMPONENT Origin = Progress_bar() AT (0,0,0) ABSOLUTE COMPONENT source = Source_div( - xwidth=0.02, yheight=0.002, - focus_aw=0.01, focus_ah=0.01, - E0=10, dE=0.1) + xwidth=0.02, yheight=0.002, + focus_aw=0.01, focus_ah=0.01, + E0=10, dE=0.1) AT (0,0,0) RELATIVE Origin COMPONENT geometry_center = Arm() @@ -74,17 +75,31 @@ COMPONENT cone = Union_cone(radius_top=0.02, radius_bottom=0.055, yheight=0.09, AT (0.03,0,0.07) RELATIVE geometry_center COMPONENT abs_logger_1D_space_tof = Union_abs_logger_1D_space_tof( - yheight=0.2, n=100, - time_min=0.0013, time_max=0.0022, time_bins=1000, - filename="Union_abs_logger_1D_space_tof.dat") + yheight=0.2, n=100, + time_min=0.0013, time_max=0.0022, time_bins=1000, + filename="Union_abs_logger_1D_space_tof.dat") AT (0,0,0) RELATIVE geometry_center - + +COMPONENT abs_logger_1D_space_tof_con = Union_abs_logger_1D_space_tof( + yheight=0.2, n=100, + time_min=0.0013, time_max=0.0022, time_bins=1000, + filename="Union_abs_logger_1D_space_tof_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="abs_logger_1D_space_tof_con") +AT (-0.05,0,1.0) RELATIVE geometry_center + +// Master at odd position to ensure that does not impact results COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (3, 0, -1) RELATIVE geometry_center +ROTATED (20, -5, 8) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( - xwidth=0.1, yheight=0.08, nx=200, ny=200, - filename="PSD.dat", restore_neutron=1) + xwidth=0.1, yheight=0.08, nx=200, ny=200, + filename="PSD.dat", restore_neutron=1) AT (0,0,1) RELATIVE geometry_center COMPONENT stop = Union_stop() diff --git a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_tof_to_lambda/Unit_test_abs_logger_1D_space_tof_to_lambda.instr b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_tof_to_lambda/Unit_test_abs_logger_1D_space_tof_to_lambda.instr index d6b736ffc..d7be0ff7f 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_tof_to_lambda/Unit_test_abs_logger_1D_space_tof_to_lambda.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_space_tof_to_lambda/Unit_test_abs_logger_1D_space_tof_to_lambda.instr @@ -26,8 +26,9 @@ * both the standard view with measured and true wavelength on each axis, and the * relative where they have been normalized and a value of 1 is expected. * -* %Example: Detector: abs_logger_1D_space_tof_to_lambda_I=9.82157e-12 -* %Example: Detector: abs_logger_1D_space_tof_to_lambda_relative_I=1.02297e-11 +* %Example: Detector: abs_logger_1D_space_tof_to_lambda_I=6.67576e-11 +* %Example: Detector: abs_logger_1D_space_tof_to_lambda_relative_I=6.6763e-11 +* %Example: Detector: abs_logger_1D_space_tof_to_lambda_con_I=5.07195e-12 * * %End *******************************************************************************/ @@ -78,8 +79,8 @@ AT (-0.03,0,-0.01) RELATIVE geometry_center COMPONENT cone = Union_cone(radius_top=0.02, radius_bottom=0.055, yheight=0.09, priority=8, material_string="material") AT (0.03,0,0.02) RELATIVE geometry_center -COMPONENT cylinder = Union_cylinder(radius=0.02, yheight=0.8, priority=7, material_string="material") -AT (-1.0,0,0.0) RELATIVE geometry_center +COMPONENT cylinder = Union_cylinder(radius=0.03, yheight=0.8, priority=7, material_string="material") +AT (-0.5,0,0.0) RELATIVE geometry_center COMPONENT abs_logger_1D_space_tof_to_lambda = Union_abs_logger_1D_space_tof_to_lambda( yheight=0.8, yn=100, @@ -99,16 +100,36 @@ COMPONENT abs_logger_1D_space_tof_to_lambda_relative = Union_abs_logger_1D_space filename="Union_abs_logger_1D_space_tof_to_lambda_relative.dat", relative_measured=1, relative_min=0.95, relative_max=1.05, relative_bins=100) AT (0,0,0) RELATIVE cylinder + +COMPONENT abs_logger_1D_space_tof_to_lambda_con = Union_abs_logger_1D_space_tof_to_lambda( + yheight=0.8, yn=100, + target_geometry="cylinder", + ref_component=-7, + source_sample_dist=10.0, + lambda_min=2.0, lambda_max=8.0, lambda_bins=200, + filename="Union_abs_logger_1D_space_tof_to_lambda_con.dat") +AT (0,0,0) RELATIVE cylinder + +COMPONENT conditional_direction = Arm() +AT (0,0,0) RELATIVE geometry_center +ROTATED (0,-90,0) RELATIVE geometry_center +// Conditional in direction of cylinder +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=1.0, + target_loggers="abs_logger_1D_space_tof_to_lambda_con") +AT (0,0,0.6) RELATIVE conditional_direction + +// Master at odd position to ensure that does not impact results COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT(3,0,-1) RELATIVE geometry_center +ROTATED(20,-5,8) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, filename="PSD.dat", restore_neutron=1) AT (0,0,1) RELATIVE geometry_center - COMPONENT stop = Union_stop() AT (0,0,0) ABSOLUTE diff --git a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_time/Unit_test_abs_logger_1D_time.instr b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_time/Unit_test_abs_logger_1D_time.instr new file mode 100644 index 000000000..2431d737c --- /dev/null +++ b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_1D_time/Unit_test_abs_logger_1D_time.instr @@ -0,0 +1,106 @@ +/******************************************************************************* +* +* McStas, neutron ray-tracing package +* Copyright (C) 1997-2008, All rights reserved +* Risoe National Laboratory, Roskilde, Denmark +* Institut Laue Langevin, Grenoble, France +* +* Instrument: Unit_test_abs_logger_1D_time +* +* %Identification +* Written by: Mads Bertelsen +* Date: April 2026 +* Origin: ESS +* %INSTRUMENT_SITE: Tests_union +* +* Test of Union 1D time absorption logger +* +* %Description +* Test instrument for the Union 1D absorption logger component that can log +* absorbed intensity as a function of time. +* +* %Example: Detector: Union_abs_logger_1D_time_I=5.66453e-09 +* %Example: Detector: Union_abs_logger_1D_time_con_I=2.80778e-12 +* +* %End +*******************************************************************************/ + +DEFINE INSTRUMENT Unit_test_abs_logger_1D_time() + +DECLARE +%{ +%} + +INITIALIZE +%{ +%} + +TRACE + +COMPONENT init = Union_init() +AT (0,0,0) ABSOLUTE + +COMPONENT incoherent = Incoherent_process(sigma=0.2, packing_factor=1, unit_cell_volume=66.4) +AT (0,0,0) ABSOLUTE + +COMPONENT powder = Powder_process(reflections="Cu2MnAl.laz") +AT (0,0,0) ABSOLUTE + +COMPONENT material = Union_make_material(my_absorption=4.0, + process_string="incoherent,powder") +AT (0,0,0) ABSOLUTE + +COMPONENT Origin = Progress_bar() + AT (0,0,0) ABSOLUTE + +COMPONENT source = Source_div( + xwidth=0.02, yheight=0.002, + focus_aw=0.01, focus_ah=0.01, + E0=10, dE=0.1) +AT (0,0,0) RELATIVE Origin + +COMPONENT geometry_center = Arm() +AT (0,0,2.0) RELATIVE source + +COMPONENT box = Union_box(xwidth=0.10, yheight=0.15, zdepth=0.03, priority=5, material_string="material") +AT (-0.03,0,-0.05) RELATIVE geometry_center + +COMPONENT sphere = Union_sphere(radius=0.05, priority=6, material_string="material") +AT (0.03,0,-0.04) RELATIVE geometry_center + +COMPONENT cylinder = Union_cylinder(radius=0.045, yheight=0.1, priority=7, material_string="material") +AT (-0.03,0,0.02) RELATIVE geometry_center + +COMPONENT cone = Union_cone(radius_top=0.02, radius_bottom=0.055, yheight=0.09, priority=8, material_string="material") +AT (0.03,0,0.07) RELATIVE geometry_center + +COMPONENT Union_abs_logger_1D_time = Union_logger_1D( + min_value=0.0013, max_value=0.0022, n1=200, + filename="Union_abs_logger_1D_time.dat") +AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_abs_logger_1D_time_con = Union_logger_1D( + min_value=0.0013, max_value=0.0022, n1=200, + filename="Union_abs_logger_1D_time_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_abs_logger_1D_time_con") +AT (-0.05,0,1.0) RELATIVE geometry_center + +// Master at odd position to ensure that does not impact results +COMPONENT master = Union_master() +AT (3, 0, -1) RELATIVE geometry_center +ROTATED (20, -5, 8) RELATIVE geometry_center + +COMPONENT transmission = PSD_monitor( + xwidth=0.1, yheight=0.08, nx=200, ny=200, + filename="PSD.dat", restore_neutron=1) +AT (0,0,1) RELATIVE geometry_center + +COMPONENT stop = Union_stop() +AT (0,0,0) ABSOLUTE + +END diff --git a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_2D_space/Unit_test_abs_logger_2D_space.instr b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_2D_space/Unit_test_abs_logger_2D_space.instr index 44049ea3f..7009028b4 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_2D_space/Unit_test_abs_logger_2D_space.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_2D_space/Unit_test_abs_logger_2D_space.instr @@ -19,6 +19,7 @@ * Test of absorption logger with basic geometry from Unit_test_loggers_base. * * %Example: Detector: Union_abs_logger_2D_space_zx_I=1.1258e-09 +* %Example: Detector: Union_abs_logger_2D_space_zx_con_I=5.22667e-13 * * %End *******************************************************************************/ @@ -83,9 +84,23 @@ COMPONENT Union_abs_logger_2D_space_zy = Union_abs_logger_2D_space( D_direction_2="y", D2_min=-0.1, D2_max=0.1, n2=200, filename="Union_abs_logger_2D_space_zy.dat") AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_abs_logger_2D_space_zx_con = Union_abs_logger_2D_space( + D_direction_1="z", D1_min=-0.15, D1_max=0.15, n1=200, + D_direction_2="x", D2_min=-0.1, D2_max=0.1, n2=200, + filename="Union_abs_logger_2D_space_zx_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_abs_logger_2D_space_zx_con") +AT (-0.05,0,1.0) RELATIVE geometry_center +// Master at odd position to ensure that does not impact results COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (3, 0, -1) RELATIVE geometry_center +ROTATED (20, -5, 8) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_event/Unit_test_abs_logger_event.instr b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_event/Unit_test_abs_logger_event.instr index 9984185fe..ae6e6a384 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_event/Unit_test_abs_logger_event.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_event/Unit_test_abs_logger_event.instr @@ -73,9 +73,20 @@ AT (0.03,0,0.07) RELATIVE geometry_center COMPONENT Union_abs_logger_event = Union_abs_logger_event(filename="Union_abs_logger_event") AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_abs_logger_event_con = Union_abs_logger_event(filename="Union_abs_logger_event_con") +AT (0,0,0) RELATIVE geometry_center +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_abs_logger_event_con") +AT (-0.05,0,1.0) RELATIVE geometry_center + +// Master at odd position to ensure that does not impact results COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (3, 0, -1) RELATIVE geometry_center +ROTATED (20, -5, 8) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_nD/Unit_test_abs_logger_nD.instr b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_nD/Unit_test_abs_logger_nD.instr index 4c3bb3352..923031b81 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_nD/Unit_test_abs_logger_nD.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_abs_logger_nD/Unit_test_abs_logger_nD.instr @@ -21,6 +21,7 @@ * geometry, leaving the ray positions where they were. * * %Example: Detector: abs_logger_nD_I=1.58102e-09 +* %Example: Detector: abs_logger_nD_con_I=2.11523e-12 * * %End *******************************************************************************/ @@ -76,9 +77,23 @@ COMPONENT abs_logger_nD = Union_abs_logger_nD( options="preivous, y limits=[-0.1 0.1] bins=100", filename="Union_abs_logger_nD.dat") AT (0,0,0) RELATIVE geometry_center - -COMPONENT master = Union_master(verbal=0) -AT(0,0,0) RELATIVE geometry_center + +COMPONENT abs_logger_nD_con = Union_abs_logger_nD( + xwidth=0.1, yheight=0.02, + options="preivous, y limits=[-0.1 0.1] bins=100", + filename="Union_abs_logger_nD_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="abs_logger_nD_con") +AT (-0.05,0,1.0) RELATIVE geometry_center + +// Master at odd position to ensure that does not impact results +COMPONENT master = Union_master() +AT (3,0,-1) RELATIVE geometry_center +ROTATED (20,-5,8) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_logger_1D/Unit_test_logger_1D.instr b/mcstas-comps/examples/Tests_union/Unit_test_logger_1D/Unit_test_logger_1D.instr index c0eb0a240..895575146 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_logger_1D/Unit_test_logger_1D.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_logger_1D/Unit_test_logger_1D.instr @@ -19,6 +19,9 @@ * Test instrument for the Union 1D logger component that can log scattering * intensity as a function of one of several quantities, here time. * +* %Example: Detector: Union_logger_1D_I=5.65843e-09 +* %Example: Detector: Union_logger_1D_con_I=2.73754e-12 +* * %End *******************************************************************************/ @@ -75,9 +78,22 @@ COMPONENT Union_logger_1D = Union_logger_1D( variable="time", min_value=0.0013, max_value=0.0022, n1=200, filename="Union_logger_1D.dat") AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_logger_1D_con = Union_logger_1D( + variable="time", min_value=0.0013, max_value=0.0022, n1=200, + filename="Union_logger_1D_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_logger_1D_con") +AT (-0.05,0,1.0) RELATIVE geometry_center COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (12,-2,4) RELATIVE geometry_center +ROTATED (22, -47, 7) RELATIVE geometry_center + COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_logger_2DQ/Unit_test_logger_2DQ.instr b/mcstas-comps/examples/Tests_union/Unit_test_logger_2DQ/Unit_test_logger_2DQ.instr index aae533534..5d795b364 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_logger_2DQ/Unit_test_logger_2DQ.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_logger_2DQ/Unit_test_logger_2DQ.instr @@ -20,6 +20,9 @@ * using the 2DQ logger that histograms occurances of the scattering vectors for * scattering events in the Union system projected onto a chosen 2D plane. * +* %Example: Detector: Detector: Union_logger_2DQ_I=5.66139e-09 +* %Example: Detector: Union_logger_2DQ_con_I=2.77306e-12 +* * %End *******************************************************************************/ @@ -72,15 +75,28 @@ AT (-0.03,0,0.02) RELATIVE geometry_center COMPONENT cone = Union_cone(radius_top=0.02, radius_bottom=0.055, yheight=0.09, priority=8, material_string="material") AT (0.03,0,0.07) RELATIVE geometry_center -// Insert loggers to be tested here COMPONENT Union_logger_2DQ = Union_logger_2DQ( Q_direction_1="z", Q1_min=-5.0, Q1_max=5.0, n1=200, Q_direction_2="x", Q2_min=-5.0, Q2_max=5.0, n2=200, filename="Union_logger_2DQ.dat") AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_logger_2DQ_con = Union_logger_2DQ( + Q_direction_1="z", Q1_min=-5.0, Q1_max=5.0, n1=200, + Q_direction_2="x", Q2_min=-5.0, Q2_max=5.0, n2=200, + filename="Union_logger_2DQ_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_logger_2DQ_con") +AT (-0.05,0,1.0) RELATIVE geometry_center COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (12,-2,4) RELATIVE geometry_center +ROTATED (22, -47, 7) RELATIVE geometry_center + COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_kf/Unit_test_logger_2D_kf.instr b/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_kf/Unit_test_logger_2D_kf.instr index 8bdf41dd4..4bdeaefde 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_kf/Unit_test_logger_2D_kf.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_kf/Unit_test_logger_2D_kf.instr @@ -20,6 +20,9 @@ * wavevector after each scattering event, projects it onto a specified 2D plane * and histograms these using the scattered intensity. * +* %Example: Detector: Union_logger_2D_kf_I=5.65899e-09 +* %Example: Detector: Union_logger_2D_kf_con_I=2.52412e-12 +* * %End *******************************************************************************/ @@ -77,9 +80,22 @@ COMPONENT Union_logger_2D_kf = Union_logger_2D_kf( Q_direction_2="x", Q2_min=-3.0, Q2_max=3.0, n2=200, filename="Union_logger_2D_kf.dat") AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_logger_2D_kf_con = Union_logger_2D_kf( + Q_direction_1="z", Q1_min=-3.0, Q1_max=3.0, n1=200, + Q_direction_2="x", Q2_min=-3.0, Q2_max=3.0, n2=200, + filename="Union_logger_2D_kf_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_logger_2D_kf_con") +AT (-0.05,0,1.0) RELATIVE geometry_center COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (12,-2,4) RELATIVE geometry_center +ROTATED (22, -47, 7) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_kf_time/Unit_test_logger_2D_kf_time.instr b/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_kf_time/Unit_test_logger_2D_kf_time.instr index 14c9b0363..bbe264df4 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_kf_time/Unit_test_logger_2D_kf_time.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_kf_time/Unit_test_logger_2D_kf_time.instr @@ -20,6 +20,9 @@ * scattering event in a 2D plane, and these are further distributed into a number * of time bins so the time evolution of final wavevectors can be monitored. * +* %Example: Detector: Union_logger_2D_kf_time_I=3.82325e-09 +* %Example: Detector: Union_logger_2D_kf_time_con_I=1.82363e-12 +* * %End *******************************************************************************/ @@ -72,16 +75,30 @@ AT (-0.03,0,0.02) RELATIVE geometry_center COMPONENT cone = Union_cone(radius_top=0.02, radius_bottom=0.055, yheight=0.09, priority=8, material_string="material") AT (0.03,0,0.07) RELATIVE geometry_center -// Insert loggers to be tested here COMPONENT Union_logger_2D_kf_time = Union_logger_2D_kf_time( Q_direction_1="z", Q1_min=-3.0, Q1_max=3.0, n1=200, Q_direction_2="x", Q2_min=-3.0, Q2_max=3.0, n2=200, time_bins=5, time_min=0.0014, time_max=0.0018, filename="Union_logger_2D_kf_time.dat") AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_logger_2D_kf_time_con = Union_logger_2D_kf_time( + Q_direction_1="z", Q1_min=-3.0, Q1_max=3.0, n1=200, + Q_direction_2="x", Q2_min=-3.0, Q2_max=3.0, n2=200, + time_bins=5, time_min=0.0014, time_max=0.0018, + filename="Union_logger_2D_kf_time_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_logger_2D_kf_time_con") +AT (-0.05,0,1.0) RELATIVE geometry_center COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (12,-2,4) RELATIVE geometry_center +ROTATED (22, -47, 7) RELATIVE geometry_center + COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_space/Unit_test_logger_2D_space.instr b/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_space/Unit_test_logger_2D_space.instr index a5272795a..5b23f0d22 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_space/Unit_test_logger_2D_space.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_space/Unit_test_logger_2D_space.instr @@ -20,7 +20,8 @@ * projected onto a plane spanned by two of the coordinate axis, for * example z and x. * -* %Example: Detector: Union_logger_2D_space_zx_I=5.6604e-09 +* %Example: Detector: Union_logger_2D_space_zx_I=5.66106e-09 +* %Example: Detector: Union_logger_2D_space_zy_con_I=2.59083e-12 * * %End *******************************************************************************/ @@ -85,9 +86,22 @@ COMPONENT Union_logger_2D_space_zy = Union_logger_2D_space( D_direction_2="y", D2_min=-0.1, D2_max=0.1, n2=200, filename="Union_logger_2D_space_zy.dat") AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_logger_2D_space_zy_con = Union_logger_2D_space( + D_direction_1="z", D1_min=-0.15, D1_max=0.15, n1=200, + D_direction_2="y", D2_min=-0.1, D2_max=0.1, n2=200, + filename="Union_logger_2D_space_zy_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_logger_2D_space_zy_con") +AT (-0.05,0,1.0) RELATIVE geometry_center COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (12,-2,4) RELATIVE geometry_center +ROTATED (22, -47, 7) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_space_time/Unit_test_logger_2D_space_time.instr b/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_space_time/Unit_test_logger_2D_space_time.instr index 63e4dca22..efc5cc61f 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_space_time/Unit_test_logger_2D_space_time.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_logger_2D_space_time/Unit_test_logger_2D_space_time.instr @@ -21,6 +21,9 @@ * chosen by the user. This is furthermore split into several timesteps so * the time dependency of scattering in the Union system can be monitored. * +* %Example: Detector: Union_logger_2D_space_time_I=3.33764e-09 +* %Example: Detector: Union_logger_2D_space_time_con_I=1.36393e-12 +* * %End *******************************************************************************/ @@ -79,9 +82,23 @@ COMPONENT Union_logger_2D_space_time = Union_logger_2D_space_time( time_bins=10, time_min=0.0014, time_max=0.0020, filename="Union_logger_2D_space_time.dat") AT (0,0,0) RELATIVE geometry_center + +COMPONENT Union_logger_2D_space_time_con = Union_logger_2D_space_time( + D_direction_1="z", D1_min=-0.15, D1_max=0.15, n1=200, + D_direction_2="x", D2_min=-0.1, D2_max=0.1, n2=200, + time_bins=10, time_min=0.0014, time_max=0.0020, + filename="Union_logger_2D_space_time_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_logger_2D_space_time_con") +AT (-0.05,0,1.0) RELATIVE geometry_center COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (12,-2,4) RELATIVE geometry_center +ROTATED (22, -47, 7) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr b/mcstas-comps/examples/Tests_union/Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr index d14227739..10e7e1aea 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr @@ -19,6 +19,9 @@ * Tests the 3D space logger that makes a number of 2D slices, integrating over * some thickness depending on the number of bins in the 3rd dimension. * +* %Example: Detector: Union_logger_3D_space_I=1.3301e-09 +* %Example: Detector: Union_logger_3D_space_con_I=1.68735e-1 +* * %End *******************************************************************************/ @@ -75,12 +78,27 @@ AT (0.03,0,0.07) RELATIVE geometry_center COMPONENT Union_logger_3D_space = Union_logger_3D_space( D_direction_1="x", D1_min=-0.10, D1_max=0.10, n1=200, D_direction_2="y", D2_min=-0.10, D2_max=0.10, n2=200, - D_direction_3="z", D3_min=-0.09, D3_max=0.14, n2=200, + D_direction_3="z", D3_min=-0.09, D3_max=0.14, n2=10, filename="Union_logger_3D_space.dat") AT (0,0,0) RELATIVE geometry_center + +// Insert loggers to be tested here +COMPONENT Union_logger_3D_space_con = Union_logger_3D_space( + D_direction_1="x", D1_min=-0.10, D1_max=0.10, n1=200, + D_direction_2="y", D2_min=-0.10, D2_max=0.10, n2=200, + D_direction_3="z", D3_min=-0.09, D3_max=0.14, n2=5, + filename="Union_logger_3D_space_con.dat") +AT (0,0,0) RELATIVE geometry_center + +// Conditional that takes right part of transmitted beam +COMPONENT PSD_conditional = Union_conditional_PSD( + xwidth=0.1, yheight=0.2, + target_loggers="Union_logger_3D_space_con") +AT (-0.05,0,1.0) RELATIVE geometry_center COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (12,-2,4) RELATIVE geometry_center +ROTATED (22, -47, 7) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/examples/Tests_union/Unit_test_loggers_base/Unit_test_loggers_base.instr b/mcstas-comps/examples/Tests_union/Unit_test_loggers_base/Unit_test_loggers_base.instr index ef355d76a..cdf1fd57d 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_loggers_base/Unit_test_loggers_base.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_loggers_base/Unit_test_loggers_base.instr @@ -76,7 +76,8 @@ AT (0.03,0,0.07) RELATIVE geometry_center // Insert loggers to be tested here COMPONENT master = Union_master() -AT(0,0,0) RELATIVE geometry_center +AT (12,-2,4) RELATIVE geometry_center +ROTATED (22, -47, 7) RELATIVE geometry_center COMPONENT transmission = PSD_monitor( xwidth=0.1, yheight=0.08, nx=200, ny=200, diff --git a/mcstas-comps/share/union-lib.c b/mcstas-comps/share/union-lib.c index 2bf1d4515..2cf6cd45e 100755 --- a/mcstas-comps/share/union-lib.c +++ b/mcstas-comps/share/union-lib.c @@ -5931,7 +5931,7 @@ int cone_overlaps_cylinder(struct geometry_struct *geometry_cone,struct geometry if (dist_spheres > sphere_1_radius + sphere_2_radius){ - printf("\nSpherical method determined that cones are too far away for intersection to be relevant\n"); + //printf("\nSpherical method determined that cones are too far away for intersection to be relevant\n"); return 0; } diff --git a/mcstas-comps/union/Union_conditional_PSD.comp b/mcstas-comps/union/Union_conditional_PSD.comp index f52d57478..04a3429a7 100644 --- a/mcstas-comps/union/Union_conditional_PSD.comp +++ b/mcstas-comps/union/Union_conditional_PSD.comp @@ -425,7 +425,7 @@ INITIALIZE } // Add a pointer to this conditional function to the list of conditionals for this logger - add_function_to_conditional_list (&found_logger->conditional_list, &conditional_function_PSD, &this_data_union); + add_function_to_conditional_list (&found_abs_logger->conditional_list, &conditional_function_PSD, &this_data_union); } } else { diff --git a/mcstas-comps/union/Union_conditional_standard.comp b/mcstas-comps/union/Union_conditional_standard.comp index 109cbb81e..c7754562b 100644 --- a/mcstas-comps/union/Union_conditional_standard.comp +++ b/mcstas-comps/union/Union_conditional_standard.comp @@ -477,7 +477,7 @@ INITIALIZE } // Add a pointer to this conditional function to the list of conditionals for this logger - add_function_to_conditional_list (&found_logger->conditional_list, &conditional_function_standard, &this_data_union); + add_function_to_conditional_list (&found_abs_logger->conditional_list, &conditional_function_standard, &this_data_union); } /* for (loop_index=0;loop_index Date: Thu, 30 Apr 2026 10:36:28 +0200 Subject: [PATCH 5/5] Fixed typo in expected intensity --- .../Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcstas-comps/examples/Tests_union/Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr b/mcstas-comps/examples/Tests_union/Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr index 10e7e1aea..c565946c4 100644 --- a/mcstas-comps/examples/Tests_union/Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr +++ b/mcstas-comps/examples/Tests_union/Unit_test_logger_3D_space/Unit_test_logger_3D_space.instr @@ -20,7 +20,7 @@ * some thickness depending on the number of bins in the 3rd dimension. * * %Example: Detector: Union_logger_3D_space_I=1.3301e-09 -* %Example: Detector: Union_logger_3D_space_con_I=1.68735e-1 +* %Example: Detector: Union_logger_3D_space_con_I=1.68735e-13 * * %End *******************************************************************************/