From c85792ef22c77cd7d0cacee01d0099cfbfc8f073 Mon Sep 17 00:00:00 2001 From: Artur Glavic Date: Fri, 24 Oct 2025 14:48:27 +0200 Subject: [PATCH] Update model from DMSC version for McStas 3.x --- simulation/Estia_baseline.instr | 64 +++++++++++++++++++++++++-------- simulation/Estia_feeder.instr | 34 +++++++++--------- simulation/Estia_mf.instr | 10 +++--- 3 files changed, 70 insertions(+), 38 deletions(-) diff --git a/simulation/Estia_baseline.instr b/simulation/Estia_baseline.instr index 51b8392..0b3d32a 100644 --- a/simulation/Estia_baseline.instr +++ b/simulation/Estia_baseline.instr @@ -79,8 +79,6 @@ double selene1_center; double selene1_shift; double selene1_rot; -int p_int=0; // a flag that gets incremented if a polarizer mirror scatters - // Selene 2 @@ -107,14 +105,22 @@ double velocity_max ; // m/s neutron velocity of lambda_min double analyzer_max_height = 0.01; // Maximum sample height to be covered by te polarization analyzers +double analyzer_flipper_start = 0.4; // Distance from sample to analyzer flipper + + double analyzer1_start = 0.65; // Distance to sample to start the first analyzer double analyzer1_length = 1.3; // length of first analyzer double analyzer2_start = 0.7; // Distance to sample to start the first analyzer double analyzer2_length = 1.6; // length of first analyzer + double Theta1_analyzer1, Theta1_analyzer2, Theta2_analyzer1, Theta2_analyzer2, dist_ana_vfocus; // quantities calculated out of values above and 1.5 degree covered divergence %} +USERVARS %{ + int p_int; // a flag that gets incremented if a polarizer mirror scatters +%} + INITIALIZE %{ // chopper coupling together @@ -237,17 +243,15 @@ COMPONENT chopper = DiskChopper(radius=chopper_diameter/2.0, yheight=0.02, AT (0, 0, chopper_pos-2*NBOA_c) RELATIVE arm_virtual_source_beam -COMPONENT vs_divergence_h = DivPos_monitor(nh=21, ndiv=41, filename="vs_hordiv", - xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02, maxdiv_h=2.0, +COMPONENT vs_divergence_h = DivPos_monitor(nb=21, ndiv=41, filename="vs_hordiv", + xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02, maxdiv=2.0, restore_neutron=1) AT (0, 0, -0.5*sample_length-0.001) RELATIVE arm_selene1 -COMPONENT vs_divergence_v = DivPos_monitor(nh=21, ndiv=41, filename="vs_verdiv", - xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02, maxdiv_h=2.0, - restore_neutron=1) +COMPONENT vs_divergence_v = DivPos_monitor(nb=21, ndiv=41, filename="vs_verdiv", + xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02, maxdiv=2.0, + restore_neutron=1, vertical=1) AT (0, 0, -0.5*sample_length-0.001) RELATIVE arm_selene1 - ROTATED (0,0,90) RELATIVE arm_selene1 - /* The actual virtual source mask, two L-shaped absorbers (first top-right) */ COMPONENT virtual_source_TR = Slit( @@ -345,13 +349,43 @@ COMPONENT si_sample = Mirror( ROTATED (0, 90, 0) RELATIVE arm_sample -COMPONENT arm_analyzer = Arm() + + + +/* Rotate spin 90 degrees*/ +COMPONENT arm_hack = Arm() + AT (0, 0, 0) RELATIVE arm_sample + EXTEND %{ + double tmp = sy; + sy = sx; + sx = -tmp; + %} + + + + +/* flipped arm detector to position analyzer correctly for beam path 1*/ +COMPONENT arm_detector2 = Arm() AT (0, 0, 0) RELATIVE arm_detector - ROTATED (-selene_theta+(Theta1_analyzer1-Theta2_analyzer1)/2.0, 0, 0) RELATIVE arm_detector + ROTATED (0,0,180) RELATIVE arm_detector + + + +COMPONENT arm_analyzer = Arm() + AT (0, 0, 0) RELATIVE arm_detector2 + ROTATED (-selene_theta+(Theta1_analyzer1-Theta2_analyzer1)/2.0, 0, 0) RELATIVE arm_detector2 + +COMPONENT virtual_analyzer_flipper = Arm() // Gone -> Pol_SF_ideal(ny=1, xwidth=1, yheight=1, zdepth=0.001) + WHEN (enable_analyzer>2) + AT (0, 0, analyzer_flipper_start) RELATIVE arm_analyzer + ROTATED (0,0,0.0) RELATIVE arm_analyzer + EXTEND %{ + if(INSTRUMENT_GETPAR(enable_analyzer)>2) sx *=-1; + %} COMPONENT arm_analyzer2 = Arm() - AT (0, 0, 0) RELATIVE arm_detector - ROTATED (-selene_theta+(Theta1_analyzer2-Theta2_analyzer2)/2.0, 0, 0) RELATIVE arm_detector + AT (0, 0, 0) RELATIVE arm_detector2 + ROTATED (-selene_theta+(Theta1_analyzer2-Theta2_analyzer2)/2.0, 0, 0) RELATIVE arm_detector2 /* polarization analyser */ COMPONENT analyzer1 = Polariser(enable_ref=1, d_substrate = 5e-4, reflect_d=0, reflect_u=0, lin=analyzer1_start, length=analyzer1_length, @@ -365,8 +399,8 @@ COMPONENT analyzer2 = Polariser(enable_ref=1, d_substrate = 5e-4, reflect_d=0, r delta_theta=(Theta1_analyzer2+Theta2_analyzer2+0.05)*PI/180.0, h2=0.2, h1=0.05, abs_out=0, m_u=5.0, m_d=0.65, both_coated=1, alpha=2.3, W = 0.0014) WHEN enable_analyzer==2 - AT (0, 0.0, analyzer2_start) RELATIVE arm_analyzer - ROTATED (0,0,0.0) RELATIVE arm_analyzer + AT (0, 0.0, analyzer2_start) RELATIVE arm_analyzer2 + ROTATED (0,0,0.0) RELATIVE arm_analyzer2 /* detector */ COMPONENT tof_detector = Monitor_nD( diff --git a/simulation/Estia_feeder.instr b/simulation/Estia_feeder.instr index db8995e..ffc1112 100644 --- a/simulation/Estia_feeder.instr +++ b/simulation/Estia_feeder.instr @@ -144,7 +144,7 @@ COMPONENT NBOA_window=Al_window(thickness=NBOA_Al_entrance_length) AT (0,0,NBOA_Al_entrance_start) RELATIVE ISCS -COMPONENT NBOA_side = AbsorberFixed(xmin=NBOA_side_x, xmax=NBOA_side_x+0.012, +COMPONENT NBOA_side = Absorber(xmin=NBOA_side_x, xmax=NBOA_side_x+0.012, ymin=-0.2, ymax=0.2, zmin=0.0, zmax=E02_01_01_Cu_length+E02_01_01_length+E02_01_02_length+E02_01_03_length) AT (0, 0, E02_01_01_Cu_start) RELATIVE ISCS @@ -181,7 +181,7 @@ COMPONENT NBOA_Cu_collimator=Guide_gravity( * feeder neutron guide * ************************/ -COMPONENT E02_01_011_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_01_011_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_01_011_wh/2.0, ymax=E02_01_011_wh/2.0, zmin=0.0, zmax=E02_01_01_length-0.5) AT (0, 0, E02_01_01_start) RELATIVE ISCS @@ -190,7 +190,7 @@ COMPONENT E02_01_011_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT E02_01_012_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_01_012_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_01_012_wh/2.0, ymax=E02_01_012_wh/2.0, zmin=0.5-E02_01_01_Cu_length, zmax=E02_01_01_length) AT (0, 0, E02_01_01_start) RELATIVE ISCS @@ -210,7 +210,7 @@ COMPONENT E02_01_01 = Elliptic_guide_gravity( enableGravity=enable_gravity) AT (0, 0, E02_01_01_start) RELATIVE ISCS -COMPONENT E02_01_021_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_01_021_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_01_021_wh/2.0, ymax=E02_01_021_wh/2.0, zmin=0.0, zmax=E02_01_02_length/2.0) AT (0, 0, E02_01_02_start) RELATIVE ISCS @@ -219,7 +219,7 @@ COMPONENT E02_01_021_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT E02_01_022_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_01_022_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_01_022_wh/2.0, ymax=E02_01_022_wh/2.0, zmin=E02_01_02_length/2.0, zmax=E02_01_02_length) AT (0, 0, E02_01_02_start) RELATIVE ISCS @@ -238,7 +238,7 @@ COMPONENT E02_01_02 = Elliptic_guide_gravity( enableGravity=enable_gravity) AT (0, 0, E02_01_02_start) RELATIVE ISCS -COMPONENT E02_01_031_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_01_031_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_01_031_wh/2.0, ymax=E02_01_031_wh/2.0, zmin=0.0, zmax=0.5) AT (0, 0, E02_01_03_start) RELATIVE ISCS @@ -247,7 +247,7 @@ COMPONENT E02_01_031_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT E02_01_032_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_01_032_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_01_032_wh/2.0, ymax=E02_01_032_wh/2.0, zmin=0.5, zmax=1.0) AT (0, 0, E02_01_03_start) RELATIVE ISCS @@ -256,7 +256,7 @@ COMPONENT E02_01_032_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT E02_01_033_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_01_033_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_01_033_wh/2.0, ymax=E02_01_033_wh/2.0, zmin=1.0, zmax=E02_01_03_length) AT (0, 0, E02_01_03_start) RELATIVE ISCS @@ -299,7 +299,7 @@ COMPONENT NFGA_Al_window_in=Al_window( WHEN enable_windows AT (0,0,NFGA_Al_start) RELATIVE ISCS -COMPONENT NFGA_side1 = AbsorberFixed(xmin=NFGA_side_x1, xmax=NFGA_side_x1+0.008, +COMPONENT NFGA_side1 = Absorber(xmin=NFGA_side_x1, xmax=NFGA_side_x1+0.008, ymin=-0.2, ymax=0.2, zmin=0.002, zmax=0.502) AT (0, 0, E02_02_01_start-0.002) RELATIVE ISCS @@ -309,7 +309,7 @@ COMPONENT NFGA_side1 = AbsorberFixed(xmin=NFGA_side_x1, xmax=NFGA_side_x1+0.008, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT NFGA_side2 = AbsorberFixed(xmin=NFGA_side_x2, xmax=NFGA_side_x2+0.008, +COMPONENT NFGA_side2 = Absorber(xmin=NFGA_side_x2, xmax=NFGA_side_x2+0.008, ymin=-0.2, ymax=0.2, zmin=0.502, zmax=E02_02_01_length+E02_02_02_length+E02_02_03_length+0.002) AT (0, 0, E02_02_01_start-0.002) RELATIVE ISCS @@ -321,7 +321,7 @@ COMPONENT NFGA_side2 = AbsorberFixed(xmin=NFGA_side_x2, xmax=NFGA_side_x2+0.008, %} // in-bunker feeder segments -COMPONENT E02_02_011_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_02_011_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_02_011_wh/2.0, ymax=E02_02_011_wh/2.0, zmin=0.0, zmax=E02_02_01_length/2.0) AT (0, 0, E02_02_01_start) RELATIVE ISCS @@ -330,7 +330,7 @@ COMPONENT E02_02_011_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT E02_02_012_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_02_012_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_02_012_wh/2.0, ymax=E02_02_012_wh/2.0, zmin=E02_02_01_length/2.0, zmax=E02_02_01_length) AT (0, 0, E02_02_01_start) RELATIVE ISCS @@ -349,7 +349,7 @@ COMPONENT E02_02_01 = Elliptic_guide_gravity( enableGravity=enable_gravity) AT (0, 0, E02_02_01_start) RELATIVE ISCS -COMPONENT E02_02_021_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_02_021_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_02_021_wh/2.0, ymax=E02_02_021_wh/2.0, zmin=0.0, zmax=E02_02_02_length/2.0) AT (0, 0, E02_02_02_start) RELATIVE ISCS @@ -358,7 +358,7 @@ COMPONENT E02_02_021_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT E02_02_022_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_02_022_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_02_022_wh/2.0, ymax=E02_02_022_wh/2.0, zmin=E02_02_02_length/2.0, zmax=E02_02_02_length) AT (0, 0, E02_02_02_start) RELATIVE ISCS @@ -377,7 +377,7 @@ COMPONENT E02_02_02 = Elliptic_guide_gravity( enableGravity=enable_gravity) AT (0, 0, E02_02_02_start) RELATIVE ISCS -COMPONENT E02_02_031_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_02_031_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_02_031_wh/2.0, ymax=E02_02_031_wh/2.0, zmin=0.0, zmax=0.5) AT (0, 0, E02_02_03_start) RELATIVE ISCS @@ -386,7 +386,7 @@ COMPONENT E02_02_031_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT E02_02_032_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_02_032_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_02_032_wh/2.0, ymax=E02_02_032_wh/2.0, zmin=0.5, zmax=1.0) AT (0, 0, E02_02_03_start) RELATIVE ISCS @@ -395,7 +395,7 @@ COMPONENT E02_02_032_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, ALLOW_BACKPROP; PROP_Z0; %} -COMPONENT E02_02_033_wedge = AbsorberFixed(xmin=-0.1, xmax=0.0, +COMPONENT E02_02_033_wedge = Absorber(xmin=-0.1, xmax=0.0, ymin=-E02_02_033_wh/2.0, ymax=E02_02_033_wh/2.0, zmin=1.0, zmax=E02_02_03_length) AT (0, 0, E02_02_03_start) RELATIVE ISCS diff --git a/simulation/Estia_mf.instr b/simulation/Estia_mf.instr index c029936..ed79b28 100644 --- a/simulation/Estia_mf.instr +++ b/simulation/Estia_mf.instr @@ -153,7 +153,6 @@ COMPONENT polarizer2_lin = Pol_mirror(zwidth = pol2_lin_length, yheight = pol_hf GROUP polarizer2_set EXTEND %{ - p_int=0; // reset for each trace if (SCATTERED==2) { p_int +=2; } @@ -223,14 +222,13 @@ COMPONENT replacement_pol1_set = Slit(xwidth=0.2, yheight=0.2) -COMPONENT mf_divergence_h = DivPos_monitor(nh=21, ndiv=41, filename="mf_hordiv", - xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02, maxdiv_h=2.0) +COMPONENT mf_divergence_h = DivPos_monitor(nb=21, ndiv=41, filename="mf_hordiv", + xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02, maxdiv=2.0) AT (0, 0, 0) RELATIVE arm_polarizer -COMPONENT mf_divergence_v = DivPos_monitor(nh=21, ndiv=41, filename="mf_verdiv", - xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02, maxdiv_h=2.0) +COMPONENT mf_divergence_v = DivPos_monitor(nb=21, ndiv=41, filename="mf_verdiv", + xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02, maxdiv=2.0, vertical=1) AT (0, 0, 0) RELATIVE arm_polarizer - ROTATED (0,0,90) RELATIVE arm_polarizer