[neutron-mc] Neutron parameters and EXTEND
Aaron M. Percival
percival at physics.queensu.ca
Thu Mar 27 23:34:38 CET 2008
Hi Emmanuel,
I used your suggestions; I hadn't realized that the x, y, z names referred
to local coordinates, which is exactly what I needed.
Still, for some reason I am getting many more printf neutron x,y,z
parameters than are recorded in the detector. In a recent run I had 785
printf parameters and "monitor_N=202" output on similation end. I'm not
clear as to why this might be happening. It seems as though both conditions
in the IF statement in the EXTEND of the detector should only allow printf
for neutrons that are scattered and intersect the detector. On second
thought, this might not be the case. I recall seeing "intersect" as a flag
in the component definition for Monitor_nD. However, could it be possible
that SCATTERED is allowing any rays that intersect the entire cylindrical
shell of the detector (i.e. as if on theta: limits = [0, 360])? I changed
the limits to [10, 170] to see if this would change the results. This
worked! The number of neutrons intersected in the detector now matches the
number give by the printf.
So it appears that SCATTERED it TRUE when a neutron intersects any part of
the cylinder and not just the part defined by limits on theta.
As a side note, the gauge volume that I am seeing looks strange. However,
it is arranged in such a way that might explain the problems I've been
having with divergences from the PowderN component. I won't be entirely
confident on this until we fix the above problem and see what the proper
gauge volume is.
Here are the source, sample and detector components:
COMPONENT source = Virtual_input(
file = file, type = "text", verbose = 0, repeat_count = repeat,
smooth = 1)
AT (0, 0, 0) RELATIVE origin
EXTEND
%{
flag=0;
%}
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
%{
flag=0;
if(SCATTERED)
{
xp = x;
yp = y;
zp = z;
flag = 1;
}
%}
COMPONENT monitor = Monitor_nD(
yheight = 0.133, xwidth = 2.794,
options = "banana, theta limits=[10, 170], bins = 32")
AT (0, 0, 0) RELATIVE sample_arm
ROTATED (0, 0, 0) RELATIVE origin
EXTEND
%{
if(flag==1 && SCATTERED)
{
printf("%g,%g,%g\n", xp,yp,zp);
}
%}
On Thu, Mar 27, 2008 at 5:00 PM, Emmanuel FARHI <farhi at ill.fr> wrote:
> 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
>
> _______________________________________________
> neutron-mc mailing list
> neutron-mc at risoe.dk
> http://mailman.risoe.dk/mailman/listinfo/neutron-mc
>
--
*************************************************
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
*************************************************
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman2.mcstas.org/pipermail/mcstas-users/attachments/20080327/3b42c6d1/attachment.html>
More information about the mcstas-users
mailing list