[neutron-mc] Neutron parameters and EXTEND

Emmanuel FARHI farhi at ill.fr
Thu Mar 27 22:00:11 CET 2008


Hi Aaron,

I can see a few comments to improve and understand the possible problems
you face.

1- to extract the neutron stte parameters, you can not indeed refer
explicitely to the 'x','y' and 'z' names as these are only defined in the
TRACE of each component. However, they should also be defined in the
EXTEND, and they are already in the local component coordinate frame.

2- if you want to extract coordinates from e.g. POS_A_CURRENT_COMP (which
is a Coord structure), use the coords_get function (see Appendix at the
end of   the User Manual). the 'A' in the name indicates this is in the
absolute coordinate frame. Better use the 'R' label, POS_R_CURRENT_COMP.
The 'x' 'y' 'z' fields of the structure can not be accessed as the names
xyz are redefined to point to the real name of the neutron coordinate
which is e.g. 'mcnlx'.

3- I would rather write your code as follow.
At the source level (or virtual output), make an EXTEND that sets the flag
to 0. Suppose you have first a neutron that interacts with the PowderN. It
sets the flag. But now, let's say a second neutron misses the sample. The
extend block is NOT evaluated as the component is skipped (e.g. no
intersection with volume), and the flag value is the one from the previous
neutron. You use a wrong flag value if that neutron reaches the detector!

Source=blah( ... )
EXTEND %{
  flag=0;
%}

Then you can have you sample extension, and use directly the xyz values.
COMPONENT sample = PowderN( ... ) AT (0, 0, 0) RELATIVE sample_arm
EXTEND
%{
  flag=0;  // make sure we always define it when reaching sample
  if(SCATTERED) {
    xp = x; // local coords
    yp = y;
    zp = z;
    flag = 1;
  }
%}

Try these modifications, and tell me. Using global variables in EXTEND may
get tricky as you are not sure to pass there. So, better make sure you
control all variables, and this should be done at least at some position
were all neutrons pass. There is a similar difficulty with the SPLIT
keyword.

Emmanuel.


> Hi all,
>
> I've been working on a way to essentially visualize the gauge volume in a
> sample.  I'll give a brief summary of my instrument and then the problems
> that I've found:
>
> It's a simple 2-axis instrument, with such components as: a
> Source_Maxwell_3, a Monochromator_flat, a PowderN and a Monitor_nD.  I've
> used a virtual_input/virtual_output to save neutron histories at the
> sample
> incident slit.  I can then continue these histories through diffraction
> from
> the sample and to the detector.
>
> In order to visualize the gauge volume, I thought I could do the
> following:
>
> 1) Use EXTEND and if(SCATTERED) in the sample component to save the x, y,
> z
> position of the scattering event in the sample and also create a flag if
> the
> neutron was scattered at the sample (example flag = 1 if SCATTERED, ELSE
> flag = 0)
>
> 2) Use EXTEND and if(flag==1 && SCATTERED) at the detector.  Then printf
> the
> saved x, y, z positions of the scattering events in the sample from above.
> (here I am using printf for debugging, eventually I would like to use the
> DETECTOR OUT 3D(...) macro).
>
> The problems that I'm having:
>
> 1) I cannot seem to find a variable(s) that define the location of the
> scattering event in the PowderN component.  I have been using simple the
> global variables 'x' 'y' 'z', but I don't think this is working correctly.
>
> 2) The printf is outputting many more neutron x,y,z than actually hit the
> detector.  My speculation is that the SCATTERED macro does not work in
> detectors?
>
> 3) A smaller problem.  What I would like is the local x-y-z of the
> scattered
> neutron in the sample.  To do this, I've tried using the
> POS_A_CURRENT_COMP,
> but I can't seem to isolate the x,y,z components of this vector.  I've
> tried
> using POS_A_CURRENT_COMP.x to get the x-component, but this does not seem
> to
> work as I get the following error:
>
> In function `mcraytrace':
> 87: error: structure has no member named `mcnlx'
>
> Here is a sample of the EXTEND sections.  ** indicates a comment that I've
> added for clarity:
>
> COMPONENT sample = PowderN(
>     reflections = "Ni.laz", format = Lazy, d_phi = 8,
>     radius = 0.006, yheight = 0.06, pack = 1, sigma_abs = 0,
>     sigma_inc = 0, Delta_d = 0, frac = 0, tfrac = 0, DW = 0,
>     concentric = 0, barns = 1)
>   AT (0, 0, 0) RELATIVE sample_arm
> EXTEND
> %{
> if(SCATTERED)
>     {
> **here I'm trying to get the location of the scattering event (using the
> state parameters x, y, z) and then put that into the local coordinates of
> the sample using the POS_A_CURRENT_COMP ***
>     xp = x - POS_A_CURRENT_COMP.x;
>     yp = y - POS_A_CURRENT_COMP.y;
>     zp = z - POS_A_CURRENT_COMP.z;
>
> **the flag is later used in the detector to indicate that the neutron was
> scattered from the sample**
>     flag = 1;
>     }
> else
>     {
>     flag = 0;
>     }
> %}
>
> COMPONENT monitor = Monitor_nD(
>     yheight = 0.133, xwidth = 2.794,
>     options = "banana, theta limits=[88.75, 91.25], bins = 32")
>   AT (0, 0, 0) RELATIVE sample_arm
>   ROTATED (0, 0, 0) RELATIVE origin
> EXTEND
> %{
>
> **Here the xp, yp, zp from above should only be printed if the neutron was
> scattered from the sample and intersected the detector
> if(flag==1 && SCATTERED)
>     {
>        printf("%g,%g,%g\n", xp,yp,zp);
>     }
> %}
> --
> *************************************************
> Aaron M. Percival
> M.Sc. Candidate
> Dept. of Physics, Engineering Physics & Astronomy
> Queen's University
> Kingston, Ontario, Canada, K7L 3N6
> Office: 613-533-6000 ext. 74789
> Fax: 613-533-6463
> *************************************************
> _______________________________________________
> neutron-mc mailing list
> neutron-mc at risoe.dk
> http://mailman.risoe.dk/mailman/listinfo/neutron-mc
>


-- 
FARHI Emmanuel <farhi at ill.fr>
Groupe DS/CS, ILL4/156, Tel 04 76 20 71 35
ILL, Grenoble




More information about the mcstas-users mailing list