Hi Emmanuel,<br><br>I used your suggestions; I hadn't realized that the x, y, z names referred to local coordinates, which is exactly what I needed.<br><br>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.<br>
<br>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.<br><br>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.<br>
<br>Here are the source, sample and detector components:<br><br>COMPONENT source = Virtual_input(<br>    file = file, type = "text", verbose = 0, repeat_count = repeat,<br>    smooth = 1)<br>  AT (0, 0, 0) RELATIVE origin<br>
EXTEND<br>%{<br>flag=0;<br>%}<br><br>COMPONENT sample = PowderN(<br>    reflections = "Ni.laz", format = Lazy, d_phi = 8,<br>    radius = 0.006, yheight = 0.06, pack = 1, sigma_abs = 0,<br>    sigma_inc = 0, Delta_d = 0, frac = 0, tfrac = 0, DW = 0,<br>
    concentric = 0, barns = 1)<br>  AT (0, 0, 0) RELATIVE sample_arm<br>EXTEND<br>%{<br>flag=0;<br>if(SCATTERED)<br>    {<br>    xp = x;<br>    yp = y;<br>    zp = z;    <br>    flag = 1;<br>    }<br>%}<br><br>COMPONENT monitor = Monitor_nD(<br>
    yheight = 0.133, xwidth = 2.794,<br>    options = "banana, theta limits=[10, 170], bins = 32")<br>  AT (0, 0, 0) RELATIVE sample_arm<br>  ROTATED (0, 0, 0) RELATIVE origin<br>EXTEND<br>%{<br>if(flag==1 && SCATTERED)<br>
    {<br>    printf("%g,%g,%g\n", xp,yp,zp);<br>    }<br>%}<br><br><br><div class="gmail_quote">On Thu, Mar 27, 2008 at 5:00 PM, Emmanuel FARHI <<a href="mailto:farhi@ill.fr">farhi@ill.fr</a>> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi Aaron,<br>
<br>
I can see a few comments to improve and understand the possible problems<br>
you face.<br>
<br>
1- to extract the neutron stte parameters, you can not indeed refer<br>
explicitely to the 'x','y' and 'z' names as these are only defined in the<br>
TRACE of each component. However, they should also be defined in the<br>
EXTEND, and they are already in the local component coordinate frame.<br>
<br>
2- if you want to extract coordinates from e.g. POS_A_CURRENT_COMP (which<br>
is a Coord structure), use the coords_get function (see Appendix at the<br>
end of   the User Manual). the 'A' in the name indicates this is in the<br>
absolute coordinate frame. Better use the 'R' label, POS_R_CURRENT_COMP.<br>
The 'x' 'y' 'z' fields of the structure can not be accessed as the names<br>
xyz are redefined to point to the real name of the neutron coordinate<br>
which is e.g. 'mcnlx'.<br>
<br>
3- I would rather write your code as follow.<br>
At the source level (or virtual output), make an EXTEND that sets the flag<br>
to 0. Suppose you have first a neutron that interacts with the PowderN. It<br>
sets the flag. But now, let's say a second neutron misses the sample. The<br>
extend block is NOT evaluated as the component is skipped (e.g. no<br>
intersection with volume), and the flag value is the one from the previous<br>
neutron. You use a wrong flag value if that neutron reaches the detector!<br>
<br>
Source=blah( ... )<br>
EXTEND %{<br>
  flag=0;<br>
%}<br>
<br>
Then you can have you sample extension, and use directly the xyz values.<br>
COMPONENT sample = PowderN( ... ) AT (0, 0, 0) RELATIVE sample_arm<br>
EXTEND<br>
%{<br>
  flag=0;  // make sure we always define it when reaching sample<br>
  if(SCATTERED) {<br>
    xp = x; // local coords<br>
    yp = y;<br>
    zp = z;<br>
    flag = 1;<br>
  }<br>
%}<br>
<br>
Try these modifications, and tell me. Using global variables in EXTEND may<br>
get tricky as you are not sure to pass there. So, better make sure you<br>
control all variables, and this should be done at least at some position<br>
were all neutrons pass. There is a similar difficulty with the SPLIT<br>
keyword.<br>
<br>
Emmanuel.<br>
<div><div></div><div class="Wj3C7c"><br>
<br>
> Hi all,<br>
><br>
> I've been working on a way to essentially visualize the gauge volume in a<br>
> sample.  I'll give a brief summary of my instrument and then the problems<br>
> that I've found:<br>
><br>
> It's a simple 2-axis instrument, with such components as: a<br>
> Source_Maxwell_3, a Monochromator_flat, a PowderN and a Monitor_nD.  I've<br>
> used a virtual_input/virtual_output to save neutron histories at the<br>
> sample<br>
> incident slit.  I can then continue these histories through diffraction<br>
> from<br>
> the sample and to the detector.<br>
><br>
> In order to visualize the gauge volume, I thought I could do the<br>
> following:<br>
><br>
> 1) Use EXTEND and if(SCATTERED) in the sample component to save the x, y,<br>
> z<br>
> position of the scattering event in the sample and also create a flag if<br>
> the<br>
> neutron was scattered at the sample (example flag = 1 if SCATTERED, ELSE<br>
> flag = 0)<br>
><br>
> 2) Use EXTEND and if(flag==1 && SCATTERED) at the detector.  Then printf<br>
> the<br>
> saved x, y, z positions of the scattering events in the sample from above.<br>
> (here I am using printf for debugging, eventually I would like to use the<br>
> DETECTOR OUT 3D(...) macro).<br>
><br>
> The problems that I'm having:<br>
><br>
> 1) I cannot seem to find a variable(s) that define the location of the<br>
> scattering event in the PowderN component.  I have been using simple the<br>
> global variables 'x' 'y' 'z', but I don't think this is working correctly.<br>
><br>
> 2) The printf is outputting many more neutron x,y,z than actually hit the<br>
> detector.  My speculation is that the SCATTERED macro does not work in<br>
> detectors?<br>
><br>
> 3) A smaller problem.  What I would like is the local x-y-z of the<br>
> scattered<br>
> neutron in the sample.  To do this, I've tried using the<br>
> POS_A_CURRENT_COMP,<br>
> but I can't seem to isolate the x,y,z components of this vector.  I've<br>
> tried<br>
> using POS_A_CURRENT_COMP.x to get the x-component, but this does not seem<br>
> to<br>
> work as I get the following error:<br>
><br>
> In function `mcraytrace':<br>
> 87: error: structure has no member named `mcnlx'<br>
><br>
> Here is a sample of the EXTEND sections.  ** indicates a comment that I've<br>
> added for clarity:<br>
><br>
> COMPONENT sample = PowderN(<br>
>     reflections = "Ni.laz", format = Lazy, d_phi = 8,<br>
>     radius = 0.006, yheight = 0.06, pack = 1, sigma_abs = 0,<br>
>     sigma_inc = 0, Delta_d = 0, frac = 0, tfrac = 0, DW = 0,<br>
>     concentric = 0, barns = 1)<br>
>   AT (0, 0, 0) RELATIVE sample_arm<br>
> EXTEND<br>
> %{<br>
> if(SCATTERED)<br>
>     {<br>
> **here I'm trying to get the location of the scattering event (using the<br>
> state parameters x, y, z) and then put that into the local coordinates of<br>
> the sample using the POS_A_CURRENT_COMP ***<br>
>     xp = x - POS_A_CURRENT_COMP.x;<br>
>     yp = y - POS_A_CURRENT_COMP.y;<br>
>     zp = z - POS_A_CURRENT_COMP.z;<br>
><br>
> **the flag is later used in the detector to indicate that the neutron was<br>
> scattered from the sample**<br>
>     flag = 1;<br>
>     }<br>
> else<br>
>     {<br>
>     flag = 0;<br>
>     }<br>
> %}<br>
><br>
> COMPONENT monitor = Monitor_nD(<br>
>     yheight = 0.133, xwidth = 2.794,<br>
>     options = "banana, theta limits=[88.75, 91.25], bins = 32")<br>
>   AT (0, 0, 0) RELATIVE sample_arm<br>
>   ROTATED (0, 0, 0) RELATIVE origin<br>
> EXTEND<br>
> %{<br>
><br>
> **Here the xp, yp, zp from above should only be printed if the neutron was<br>
> scattered from the sample and intersected the detector<br>
> if(flag==1 && SCATTERED)<br>
>     {<br>
>        printf("%g,%g,%g\n", xp,yp,zp);<br>
>     }<br>
> %}<br>
> --<br>
> *************************************************<br>
> Aaron M. Percival<br>
> M.Sc. Candidate<br>
> Dept. of Physics, Engineering Physics & Astronomy<br>
> Queen's University<br>
> Kingston, Ontario, Canada, K7L 3N6<br>
> Office: 613-533-6000 ext. 74789<br>
> Fax: 613-533-6463<br>
> *************************************************<br>
</div></div>> _______________________________________________<br>
> neutron-mc mailing list<br>
> <a href="mailto:neutron-mc@risoe.dk">neutron-mc@risoe.dk</a><br>
> <a href="http://mailman.risoe.dk/mailman/listinfo/neutron-mc" target="_blank">http://mailman.risoe.dk/mailman/listinfo/neutron-mc</a><br>
><br>
<br>
<br>
--<br>
FARHI Emmanuel <<a href="mailto:farhi@ill.fr">farhi@ill.fr</a>><br>
Groupe DS/CS, ILL4/156, Tel 04 76 20 71 35<br>
ILL, Grenoble<br>
<br>
_______________________________________________<br>
neutron-mc mailing list<br>
<a href="mailto:neutron-mc@risoe.dk">neutron-mc@risoe.dk</a><br>
<a href="http://mailman.risoe.dk/mailman/listinfo/neutron-mc" target="_blank">http://mailman.risoe.dk/mailman/listinfo/neutron-mc</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>*************************************************<br>Aaron M. Percival<br>M.Sc. Candidate<br>Dept. of Physics, Engineering Physics & Astronomy<br>Queen's University<br>
Kingston, Ontario, Canada, K7L 3N6<br>Office: 613-533-6000 ext. 74789<br>Fax: 613-533-6463<br>*************************************************