[neutron-mc] Neutron parameters and EXTEND
Emmanuel FARHI
farhi at ill.fr
Fri Mar 28 21:12:43 CET 2008
Hi Aaron,
I guess what you think of is quite close from what PreMonitor_nD can do.
It stores neutron state at some point, and this can be used in any further
instance of Monitor_nD. It thus makes a correlation between neutron state
at some position, and the detection somewhere else, just as what you did
with your EXTENDs. The Monitor_nD may store that state as well as a source
with e.g. options="source" or "list all, x y z vx vy vz t sx sy sz", which
is indeed a Virtual_output.
Emmanuel.
> Hello again,
>
> Excellent. Glad the source of the problem was found.
>
> I would like to extend this ability one step further. What I would like
> to
> do is somehow "pass" the x, y, z variables of interaction position with
> the
> PowderN through a virtual_output component. I can immediately think of
> two
> ways to do this:
>
> 1) Write x,y,z as a list in a file (much like the virtual_output output
> file). Then when the virtual_input is used, add and EXTEND and make use
> of
> the read_table-lib to read from the x,y,z data file and once again attach
> these variables to each neutron.
>
> This would only work if the virtual_input picks neutrons from the
> virtual_output file sequentially. Moreover, the virtual_out must also
> store
> the neutron data sequentially (but I think this is the case).
>
> 2) Append the x,y,z variables to each neutron stored by the virtual_out
> (giving each line in the . Then read these as neutron states are read by
> the virtual_input.
>
> I would be inclined to say that option 1 might be the easiest, but it
> requires that neutron state are store and the read sequentially. Option 2
> would make the output file larger and might not be as easy to employ.
>
> Any insight?
>
> Aaron
>
> On Fri, Mar 28, 2008 at 3:26 AM, Emmanuel FARHI <farhi at ill.fr> wrote:
>
>> Hi Aaron,
>>
>> you are right, the intersection test is with the whole cylinder, and so
>> does the SCATTERED flag. I may fix that today in the CVS
>>
>> E.
>>
>>
>> > 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
>> > *************************************************
>> > _______________________________________________
>> > 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
> *************************************************
> _______________________________________________
> 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