/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2002, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Component: PreMonitor_nD
*
* %Identification
* Written by: <a href="mailto:farhi@ill.fr">Emmanuel Farhi</a>
* Date: 01st Feb 2001.
* Origin: <a href="http://www.ill.fr">ILL (France)</a>
*
* Neutron parameters spatial cross-correlation monitor.
*
* %Description
* Neutron parameters are stored when entering in the PreMonitor.
* If this neutron then reaches the associated Monitor_nD, this latter
* component measures the previously stored parameters. This enables to study
* correlations between a given parameter in one place of the instrument
* and an other detection position in the instrument.
*
* The  neutron state is monitored at the previous component location.
*
* <b>EXAMPLES:</b>
* Here follows a Phase-Space correlation diagram detector
* (used for guides for instance)
*
*  MyPreMonitor = PreMonitor_nD(
*   monitor_comp = MyMonitor)
*
* (... for instance a Guide ...)
*
* MyMonitor = Monitor_nD(
*   xmin = -0.1, xmax = 0.1,
*   ymin = -0.1, ymax = 0.1,
*   options = "hdiv x, auto, use premonitor");
*
* %Parameters
* INPUT PARAMETERS:
*
* monitor_comp: [no quotes]  name of the associated Monitor_nD where the detection should take place
*
* OUTPUT PARAMETERS:
*
* %Link
* <a href="Monitor_nD.html">Monitor_nD</a>
*
* %End
*******************************************************************************/

DEFINE COMPONENT PreMonitor_nD
SETTING PARAMETERS (string monitor_comp)
/* Neutron parameters: (x,y,z,vx,vy,vz,t,sx,sy,sz,p) */

/* Flag will be set to 1 automatically */
/* unset by user in Monitor_nD if required (with 'not') */
/* Monitor_nD with premonitor should check that a PreMonitor exists */
/* if Flag==0 in option parsing -> no pre monitor -> warning, normal monitor */

INITIALIZE
%{
  struct MonitornD_Variables *Vars = COMP_GETPAR3(Monitor_nD, monitor_comp, Vars);
  Vars->Flag_UsePreMonitor = 1;
  strncpy(Vars->UserName1, NAME_CURRENT_COMP, 64);
%}

TRACE
%{
    struct MonitornD_Variables *Vars = COMP_GETPAR3(Monitor_nD, monitor_comp, Vars);
    /* directly act on MonitornD_Variables pointer, do not need to update */
    if (Vars->Flag_UsePreMonitor == 1)
    {
/*        Vars->cp = p;
        Vars->cx = x;
        Vars->cvx = vx;
        Vars->csx = sx;
        Vars->cy = y;
        Vars->cvy = vy;
        Vars->csy = sy;
        Vars->cz = z;
        Vars->cvz = vz;
        Vars->csz = sz;
        Vars->ct = t; */
        SCATTER;
    }
%}

MCDISPLAY
%{
  /* A bit ugly; hard-coded dimensions. 0.1 m */

  line(0,0,0,0.1,0,0);
  line(0,0,0,0,0.1,0);
  line(0,0,0,0,0,0.1);
%}

END
